summaryrefslogtreecommitdiff
path: root/helpers/DATA/firefox
diff options
context:
space:
mode:
Diffstat (limited to 'helpers/DATA/firefox')
-rw-r--r--helpers/DATA/firefox/Changelog.IceCat786
-rw-r--r--helpers/DATA/firefox/README.IceCat89
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/aboutHome.css429
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/aboutHome.js502
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/aboutHome.xhtml113
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/addons.pngbin0 -> 1444 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/addons@2x.pngbin0 -> 3783 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/apps.pngbin0 -> 961 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/apps@2x.pngbin0 -> 2562 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/bookmarks.pngbin0 -> 1276 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/bookmarks@2x.pngbin0 -> 2946 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/downloads.pngbin0 -> 898 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/downloads@2x.pngbin0 -> 2018 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/history.pngbin0 -> 1654 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/history@2x.pngbin0 -> 4629 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/restore-large.pngbin0 -> 2841 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/restore-large@2x.pngbin0 -> 7267 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/restore.pngbin0 -> 1796 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/restore@2x.pngbin0 -> 4810 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/settings.pngbin0 -> 1557 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/settings@2x.pngbin0 -> 3836 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/snippet1.pngbin0 -> 1470 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/snippet1@2x.pngbin0 -> 3243 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/snippet2.pngbin0 -> 3287 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/snippet2@2x.pngbin0 -> 11027 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/sync.pngbin0 -> 1879 bytes
-rw-r--r--helpers/DATA/firefox/gnu/abouthome/sync@2x.pngbin0 -> 4615 bytes
-rw-r--r--helpers/DATA/firefox/gnu/bookmarks.html.in18
-rw-r--r--helpers/DATA/firefox/gnu/branding/Makefile.in67
-rw-r--r--helpers/DATA/firefox/gnu/branding/VisualElementsManifest.xml16
-rw-r--r--helpers/DATA/firefox/gnu/branding/appname.bmpbin0 -> 47490 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/background.pngbin0 -> 1143 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/bgintro.bmpbin0 -> 908606 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/bgplain.bmpbin0 -> 682144 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/branding.nsi50
-rw-r--r--helpers/DATA/firefox/gnu/branding/clock.bmpbin0 -> 124214 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/configure.sh5
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/Makefile.in13
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/VisualElements_logo.pngbin0 -> 24397 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/VisualElements_smalllogo.pngbin0 -> 2588 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/VisualElements_splashscreen.pngbin0 -> 75713 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/about-background.pngbin0 -> 122354 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/about-logo.pngbin0 -> 29465 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/about-logo@2x.pngbin0 -> 114832 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/about-wordmark.svg78
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/about.pngbin0 -> 22792 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/aboutDialog.css25
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/icon48.pngbin0 -> 5395 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/icon64.pngbin0 -> 7318 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/identity-icons-brand.pngbin0 -> 1601 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/identity-icons-brand@2x.pngbin0 -> 4114 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/jar.mn27
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/metro-about-footer.pngbin0 -> 93828 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/metro-about-wordmark.pngbin0 -> 4411 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/metro-about.css14
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/metro_firstrun_logo.pngbin0 -> 49057 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/metro_firstrun_logo@1.4x.pngbin0 -> 83476 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/metro_firstrun_logo@1.8x.pngbin0 -> 117482 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/content/moz.build7
-rw-r--r--helpers/DATA/firefox/gnu/branding/default16.pngbin0 -> 1409 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/default32.pngbin0 -> 5467 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/default48.pngbin0 -> 5395 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/disk.icnsbin0 -> 710029 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/document-os2.icobin0 -> 7824 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/document.icnsbin0 -> 746810 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/document.icobin0 -> 71636 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/dsstorebin0 -> 12292 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/icecat-os2.icobin0 -> 7824 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/icecat.icnsbin0 -> 648208 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/icecat.icobin0 -> 87290 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/locales/Makefile.in5
-rw-r--r--helpers/DATA/firefox/gnu/branding/locales/browserconfig.properties6
-rw-r--r--helpers/DATA/firefox/gnu/branding/locales/en-US/brand.dtd8
-rw-r--r--helpers/DATA/firefox/gnu/branding/locales/en-US/brand.properties15
-rw-r--r--helpers/DATA/firefox/gnu/branding/locales/jar.mn12
-rw-r--r--helpers/DATA/firefox/gnu/branding/locales/moz.build9
-rw-r--r--helpers/DATA/firefox/gnu/branding/moz.build10
-rw-r--r--helpers/DATA/firefox/gnu/branding/mozicon128.pngbin0 -> 25374 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/newtab.icobin0 -> 1150 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/newwindow.icobin0 -> 1150 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/particles.bmpbin0 -> 124216 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/pbmode.icobin0 -> 1150 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/pencil-rtl.bmpbin0 -> 124214 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/pencil.bmpbin0 -> 124214 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/pref/icecat-branding.js24
-rw-r--r--helpers/DATA/firefox/gnu/branding/wizHeader.bmpbin0 -> 34254 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/wizHeaderRTL.bmpbin0 -> 34254 bytes
-rw-r--r--helpers/DATA/firefox/gnu/branding/wizWatermark.bmpbin0 -> 206038 bytes
-rw-r--r--helpers/DATA/firefox/gnu/enable-js-options.patch310
-rw-r--r--helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/LICENSE24
-rw-r--r--helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/chrome.manifest8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/chrome/content/aboutIceCat/aboutIceCat.xhtml262
-rw-r--r--helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/chrome/locale/en/aboutIceCat.dtd1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/chrome/locale/es/aboutIceCat.dtd1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/components/aboutIceCat.js72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/defaults/preferences/preferences.js0
-rw-r--r--helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/install.rdf21
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/Changelog1426
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome.manifest53
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/about.xul72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/ApplicableList.js266
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/ChannelReplacement.js387
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/Cookie.js148
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/HTTPS.js296
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/HTTPSRules.js762
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/IOUtil.js263
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/NSS.js491
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/Root-CAs.js348
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/STS.js228
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/Thread.js100
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/X509ChainWhitelist.js1007
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/sha256.js249
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/fetch-source.js161
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/fetch-source.xul29
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/meta-preferences.xul30
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/observatory-popup.xul61
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/observatory-preferences.xul106
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/observatory-warning.xul49
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/observatory-xul.js194
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/preferences.css11
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/preferences.js269
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/preferences.xul62
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/rules/00README17
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.css14
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.js31
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.xul44
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests.js155
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/toolbar_button.js369
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/toolbar_button.xul71
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/toolbar_button_binding.xml33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ar/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ar/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ar/ssl-observatory.dtd97
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/bg/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/bg/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/bg/ssl-observatory.dtd93
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/cs/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/cs/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/cs/ssl-observatory.dtd94
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/da/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/da/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/da/ssl-observatory.dtd100
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/de/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/de/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/de/ssl-observatory.dtd91
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/el/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/el/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/el/ssl-observatory.dtd99
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/en/https-everywhere.dtd47
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/en/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/en/ssl-observatory.dtd95
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/es/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/es/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/es/ssl-observatory.dtd100
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/eu/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/eu/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/eu/ssl-observatory.dtd95
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fa/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fa/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fa/ssl-observatory.dtd91
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fi/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fi/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fi/ssl-observatory.dtd91
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fr/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fr/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fr/ssl-observatory.dtd90
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/he/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/he/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/he/ssl-observatory.dtd92
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hr/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hr/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hr/ssl-observatory.dtd98
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hu/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hu/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hu/ssl-observatory.dtd96
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/it/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/it/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/it/ssl-observatory.dtd98
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ja/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ja/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ja/ssl-observatory.dtd94
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ko/https-everywhere.dtd49
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ko/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ko/ssl-observatory.dtd92
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lt/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lt/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lt/ssl-observatory.dtd100
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lv/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lv/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lv/ssl-observatory.dtd99
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ms/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ms/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ms/ssl-observatory.dtd104
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nb/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nb/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nb/ssl-observatory.dtd100
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nl/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nl/https-everywhere.properties7
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nl/ssl-observatory.dtd99
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pl/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pl/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pl/ssl-observatory.dtd91
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pt/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pt/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pt/ssl-observatory.dtd94
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ru/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ru/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ru/ssl-observatory.dtd120
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/si/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/si/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/si/ssl-observatory.dtd100
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sk/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sk/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sk/ssl-observatory.dtd100
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sl/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sl/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sl/ssl-observatory.dtd97
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sv/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sv/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sv/ssl-observatory.dtd100
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/tr/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/tr/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/tr/ssl-observatory.dtd96
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/ssl-observatory.dtd98
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/https-everywhere.dtd49
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/ssl-observatory.dtd91
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/cross.pngbin0 -> 282 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-16-gray.pngbin0 -> 373 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-16.pngbin0 -> 615 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-24-gray.pngbin0 -> 638 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-24.pngbin0 -> 1084 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-banner.jpgbin0 -> 20216 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-half-24.pngbin0 -> 1084 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere.css72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere.pngbin0 -> 1761 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/loop.pngbin0 -> 364 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/ssl-observatory-messy.jpgbin0 -> 34968 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/tick-moot.pngbin0 -> 344 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/tick.pngbin0 -> 348 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/components/https-everywhere.js832
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/components/ssl-observatory.js1026
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/defaults/preferences/preferences.js45
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/defaults/rulesets.sqlitebin0 -> 4258816 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/install.rdf51
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/bootstrap.js350
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/defaults/preferences/prefs.js3
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/harness-options.json737
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/install.rdf29
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/locales.json1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/options.xul6
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/addon-tab/lib/addon-tab.js153
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/README2
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/css/style.css150
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/README21
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/complain-button3.pngbin0 -> 8958 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/info-title.pngbin0 -> 4310 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/separator.pngbin0 -> 279 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/torchy.pngbin0 -> 1364 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/torchy2.pngbin0 -> 273 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jsdefs.js751
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jslex.js719
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jsparse.js2042
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/narcissus_parse.js58
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/contact_finder.js465
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/contact_regex.js49
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/link_types.js42
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/pagemod_finder.js291
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/worker_finder.js35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/README21
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/background-panel.jpgbin0 -> 96427 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/display-panel.html56
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/librejs-title-old.pngbin0 -> 2673 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/librejs-title.pngbin0 -> 14123 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/panel-styles.css177
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/main_panel.js319
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon-white.icobin0 -> 4286 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon.icobin0 -> 4286 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon.pngbin0 -> 2667 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/librejs-settings.html23
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/Boost-1.0.txt23
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/ISC.txt12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/IntelACPI.txt116
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/agpl-3.0.txt661
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/apache-2.0.txt202
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/artistic-2.0.txt201
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/bsd-3-clause.txt27
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/cc0.txt118
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/clear-bsd.txt33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/cpal-1.0.txt105
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/create-magnets.sh28
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/expat.txt5
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/freebsd.txt25
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/gpl-2.0.txt339
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/gpl-3.0.txt674
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/illinois-NCSA.txt24
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/imlib2.txt31
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-2.0.txt481
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-2.1.txt502
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-3.0.txt165
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/magnet-links.txt26
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/mpl-2.0.txt373
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/public-domain.txt18
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/Boost-1.0.txt.torrent2
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/ISC.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/IntelACPI.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/agpl-3.0.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/apache-2.0.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/artistic-2.0.txt.torrentbin0 -> 200 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/bsd-3-clause.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/cc0.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/clear-bsd.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/cpal-1.0.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/expat.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/freebsd.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/gpl-2.0.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/gpl-3.0.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/illinois-NCSA.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/imlib2.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-2.0.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-2.1.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-3.0.txt.torrent2
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/magnet-links.txt.torrentbin0 -> 200 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/mpl-2.0.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/public-domain.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/unlicense.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/wtfpl.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/x11.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/xfree86.txt.torrent1
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/unlicense.txt25
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/wtfpl.txt11
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/x11.txt26
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/xfree86.txt43
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/loading/loader.gifbin0 -> 8787 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/loading/loading-panel.html31
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/preferences_panel/contentscript.js70
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/preferences_panel/preferences_panel.html71
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_detector/script_detector.js363
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_libraries/gethash.sh10
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_libraries/script-libraries.json1440
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/beta-ribbon-cropped.pngbin0 -> 7302 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/beta-ribbon.pngbin0 -> 8658 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/button-download.pngbin0 -> 3426 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/collapsed-nonfree.pngbin0 -> 468604 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/expanded-nonfree.pngbin0 -> 450090 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/libre.pngbin0 -> 19048 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/librejs-running-blocked-wikipedia.jpgbin0 -> 91736 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/logo-medium.pngbin0 -> 11050 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/index.html131
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/form-row.js110
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/form-types.js150
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/pagescript-emitter.js14
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/pagescript-listener.js59
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/permafrost-info-box.js21
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/1140.css130
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/form.css8
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/index.html277
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/styles.css135
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/block-ui/jquery.blockUI.js574
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/css/bootstrap-responsive.min.css9
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/css/bootstrap.min.css9
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/img/glyphicons-halflings-white.pngbin0 -> 8777 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/img/glyphicons-halflings.pngbin0 -> 12097 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/js/bootstrap.min.js6
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/CHANGELOG.txt103
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/LICENSE-MIT22
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/README.md71
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/css/bootstrap-editable.css434
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/css/img/loading.gifbin0 -> 1849 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/js/bootstrap-editable-inline.min.js5
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/no-theme/jquery-ui.min.css7
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/no-theme/jquery-ui.structure.min.css5
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.pngbin0 -> 205 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.pngbin0 -> 160 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.pngbin0 -> 71 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.pngbin0 -> 123 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.pngbin0 -> 193 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.pngbin0 -> 74 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.pngbin0 -> 4824 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.pngbin0 -> 125 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.pngbin0 -> 166 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_222222_256x240.pngbin0 -> 3887 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_228ef1_256x240.pngbin0 -> 3887 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.pngbin0 -> 3887 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.pngbin0 -> 3887 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ffffff_256x240.pngbin0 -> 3887 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/jquery-ui.theme.min.css5
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/js/jquery-ui.min.js13
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery/jquery.min.js9190
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/README14
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/jquery-src.js9190
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/jquery.easing.1.3.js205
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/README21
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/librejs-off.pngbin0 -> 498 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/librejs.pngbin0 -> 503 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/widget.js32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/addon_management/install_uninstall.js68
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/addon_management/prefchange.js118
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/bug_fix.js23
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler.js560
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/attributes.js137
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/dom_checker.js464
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/dom_gatherer.js301
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/request.js112
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/script_object.js198
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/script_properties.js43
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/html_parser.js158
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/url_seen_tester.js87
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/find_js_labels.js95
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/js_web_labels.js216
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/script_hash_worker.js58
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/allowed_referrers.js75
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/caching.js30
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/http_request_observer.js161
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/process_response.js408
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/stream_loader.js110
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/constant_types.js190
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/free_checker.js227
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/js_checker.js513
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/license_definitions.js196
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/nontrivial_checker.js389
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/pattern_utils.js40
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/privacy_checker.js48
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/privacy_threat_definitions.js40
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/relation_checker.js289
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/main.js212
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/narcissus_parser/narcissus_worker.js67
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/accepted_scripts.js67
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/all_scripts.js108
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/crypto.js60
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/dryrun_scripts.js76
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/free_libraries.js67
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/removed_scripts.js71
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/scripts_cache.js182
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/settings/settings_tab.js84
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/settings/storage.js164
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/notification.js77
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/script_panel.js73
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/ui_info.js232
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_punycode.js219
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_querystring.js187
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_url.js611
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/url_handler.js120
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/menuitems/lib/menuitems.js195
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/notification-box/lib/notification-box.js129
-rw-r--r--helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/vold-utils/lib/unload+.js80
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/bootstrap.js169
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome.manifest58
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/errors.html111
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/objtabs.css82
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/composer.js412
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/composer.xul118
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/fennecSettings.xul38
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-backup.js348
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-filteractions.js561
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-filterview.js849
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-search.js269
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-subscriptionactions.js606
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-subscriptionview.js330
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters.js226
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters.xul400
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/firstRun.html141
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/firstRun.js253
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/flasher.js108
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/i18n.js150
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/overlay.xul134
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/progressBar.js158
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/progressBar.xul29
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sendReport.js1571
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sendReport.xul259
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/settings.xul38
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebar.js1246
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebar.xul139
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebarDetached.xul50
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptionSelection.js308
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptionSelection.xul75
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptions.xml117
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/utils.js66
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/filters.dtd74
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/filters.dtd74
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/sendReport.dtd69
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/filters.dtd74
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/filters.dtd73
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/sendReport.dtd105
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/filters.dtd74
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/sendReport.dtd71
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/composer.dtd38
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/filters.dtd92
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/firstRun.properties24
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/global.properties58
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/overlay.dtd41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/sendReport.dtd181
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/sidebar.dtd41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/subscriptionSelection.dtd19
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/filters.dtd74
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/filters.dtd73
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/sendReport.dtd66
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/sendReport.dtd66
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/filters.dtd74
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/filters.dtd74
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/sendReport.dtd66
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/filters.dtd74
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/sendReport.dtd102
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/filters.dtd74
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/sendReport.dtd97
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/filters.dtd74
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/sendReport.dtd97
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/filters.dtd74
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/sendReport.dtd66
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/filters.dtd74
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/sendReport.dtd96
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/filters.dtd73
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/filters.dtd74
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/filters.dtd73
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/sendReport.dtd100
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/filters.dtd74
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/filters.dtd74
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/sendReport.dtd70
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/firstRun.properties24
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/sendReport.dtd71
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/filters.dtd73
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/sendReport.dtd66
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/filters.dtd74
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/sendReport.dtd70
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/filters.dtd73
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/sendReport.dtd78
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/composer.dtd33
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/filters.dtd72
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/global.properties41
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/sendReport.dtd66
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-icon-big.pngbin0 -> 15201 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status-16.pngbin0 -> 1304 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status-32.pngbin0 -> 3419 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status.pngbin0 -> 2433 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/ajax-loader.gifbin0 -> 3208 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background-main.pngbin0 -> 163 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background-share.pngbin0 -> 162 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background.pngbin0 -> 162 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/checkbox.pngbin0 -> 356 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/close.pngbin0 -> 1211 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/composer.css77
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/donate.pngbin0 -> 160 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/malware.pngbin0 -> 3335 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/social.pngbin0 -> 4260 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/tracking.pngbin0 -> 3562 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/filters.css221
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/firstRun.css588
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/fonts/CreteRound-Italic.otfbin0 -> 43152 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/fonts/CreteRound-Regular.otfbin0 -> 40968 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/item-state.pngbin0 -> 533 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/overlay.css226
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/sendReport.css129
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/sidebar.css112
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/slow.pngbin0 -> 718 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/facebook.pngbin0 -> 3861 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/googleplus.pngbin0 -> 4009 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/renren.pngbin0 -> 2619 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/twitter.pngbin0 -> 3944 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/weibo.pngbin0 -> 3497 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/subscriptionSelection.css69
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/defaults/prefs.js38
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/icon.pngbin0 -> 3387 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/icon64.pngbin0 -> 5727 bytes
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/install.rdf634
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/Public.jsm202
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/antiadblockInit.js78
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/appSupport.js948
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/contentPolicy.js779
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/customizableUI.js320
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/downloader.js381
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/elemHide.js419
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/elemHideHitRegistration.js160
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterClasses.js906
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterListener.js282
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterNotifier.js73
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterStorage.js897
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/io.js365
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/keySelector.js228
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/main.js73
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/matcher.js446
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/notification.js339
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/objectTabs.js492
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/prefs.js203
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/requestNotifier.js378
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/subscriptionClasses.js597
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/sync.js459
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/synchronizer.js330
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/timeline.js155
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/ui.js1973
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/utils.js787
-rw-r--r--helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/windowObserver.js112
-rw-r--r--helpers/DATA/firefox/gnu/searchplugins/duckduckgo.xml8
-rw-r--r--helpers/DATA/firefox/gnu/settings.js129
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/aboutHome.css429
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/aboutHome.js502
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/aboutHome.xhtml130
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/addons.pngbin0 -> 1444 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/addons@2x.pngbin0 -> 3783 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/apps.pngbin0 -> 961 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/apps@2x.pngbin0 -> 2562 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/bookmarks.pngbin0 -> 1276 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/bookmarks@2x.pngbin0 -> 2946 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/downloads.pngbin0 -> 898 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/downloads@2x.pngbin0 -> 2018 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/history.pngbin0 -> 1654 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/history@2x.pngbin0 -> 4629 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/restore-large.pngbin0 -> 2841 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/restore-large@2x.pngbin0 -> 7267 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/restore.pngbin0 -> 1796 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/restore@2x.pngbin0 -> 4810 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/settings.pngbin0 -> 1557 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/settings@2x.pngbin0 -> 3836 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/snippet1.pngbin0 -> 1470 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/snippet1@2x.pngbin0 -> 3243 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/snippet2.pngbin0 -> 3287 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/snippet2@2x.pngbin0 -> 11027 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/sync.pngbin0 -> 1879 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/abouthome/sync@2x.pngbin0 -> 4615 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/bookmarks.html.in23
-rw-r--r--helpers/DATA/firefox/trisquel/branding/Makefile.in67
-rw-r--r--helpers/DATA/firefox/trisquel/branding/VisualElementsManifest.xml16
-rw-r--r--helpers/DATA/firefox/trisquel/branding/appname.bmpbin0 -> 47490 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/background.pngbin0 -> 1143 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/bgintro.bmpbin0 -> 908606 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/bgplain.bmpbin0 -> 682144 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/branding.nsi50
-rw-r--r--helpers/DATA/firefox/trisquel/branding/clock.bmpbin0 -> 124214 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/configure.sh5
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/Makefile.in13
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/VisualElements_logo.pngbin0 -> 24397 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/VisualElements_smalllogo.pngbin0 -> 2588 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/VisualElements_splashscreen.pngbin0 -> 75713 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/about-background.pngbin0 -> 122354 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/about-logo.pngbin0 -> 29465 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/about-logo@2x.pngbin0 -> 114832 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/about-wordmark.svg78
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/about.pngbin0 -> 22792 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/aboutDialog.css25
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/icon48.pngbin0 -> 5395 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/icon64.pngbin0 -> 7318 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/identity-icons-brand.pngbin0 -> 1601 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/identity-icons-brand@2x.pngbin0 -> 4114 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/jar.mn27
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/metro-about-footer.pngbin0 -> 93828 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/metro-about-wordmark.pngbin0 -> 4411 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/metro-about.css14
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/metro_firstrun_logo.pngbin0 -> 49057 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/metro_firstrun_logo@1.4x.pngbin0 -> 83476 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/metro_firstrun_logo@1.8x.pngbin0 -> 117482 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/content/moz.build7
-rw-r--r--helpers/DATA/firefox/trisquel/branding/default16.pngbin0 -> 1409 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/default32.pngbin0 -> 5467 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/default48.pngbin0 -> 5395 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/disk.icnsbin0 -> 710029 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/document-os2.icobin0 -> 7824 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/document.icnsbin0 -> 746810 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/document.icobin0 -> 71636 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/dsstorebin0 -> 12292 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/icecat-os2.icobin0 -> 7824 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/icecat.icnsbin0 -> 648208 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/icecat.icobin0 -> 87290 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/locales/Makefile.in5
-rw-r--r--helpers/DATA/firefox/trisquel/branding/locales/browserconfig.properties6
-rw-r--r--helpers/DATA/firefox/trisquel/branding/locales/en-US/brand.dtd8
-rw-r--r--helpers/DATA/firefox/trisquel/branding/locales/en-US/brand.properties15
-rw-r--r--helpers/DATA/firefox/trisquel/branding/locales/jar.mn12
-rw-r--r--helpers/DATA/firefox/trisquel/branding/locales/moz.build9
-rw-r--r--helpers/DATA/firefox/trisquel/branding/moz.build10
-rw-r--r--helpers/DATA/firefox/trisquel/branding/mozicon128.pngbin0 -> 25374 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/newtab.icobin0 -> 1150 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/newwindow.icobin0 -> 1150 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/particles.bmpbin0 -> 124216 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/pbmode.icobin0 -> 1150 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/pencil-rtl.bmpbin0 -> 124214 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/pencil.bmpbin0 -> 124214 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/pref/icecat-branding.js24
-rw-r--r--helpers/DATA/firefox/trisquel/branding/wizHeader.bmpbin0 -> 34254 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/wizHeaderRTL.bmpbin0 -> 34254 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/branding/wizWatermark.bmpbin0 -> 206038 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/enable-js-options.patch310
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/LICENSE24
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/chrome.manifest8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/chrome/content/aboutIceCat/aboutIceCat.xhtml279
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/chrome/locale/en/aboutIceCat.dtd1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/chrome/locale/es/aboutIceCat.dtd1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/components/aboutIceCat.js72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/defaults/preferences/preferences.js0
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/install.rdf21
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/Changelog1426
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome.manifest53
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/about.xul72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/ApplicableList.js266
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/ChannelReplacement.js387
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/Cookie.js148
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/HTTPS.js296
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/HTTPSRules.js762
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/IOUtil.js263
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/NSS.js491
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/Root-CAs.js348
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/STS.js228
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/Thread.js100
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/X509ChainWhitelist.js1007
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/sha256.js249
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/fetch-source.js161
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/fetch-source.xul29
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/meta-preferences.xul30
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/observatory-popup.xul61
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/observatory-preferences.xul106
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/observatory-warning.xul49
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/observatory-xul.js194
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/preferences.css11
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/preferences.js269
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/preferences.xul62
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/rules/00README17
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.css14
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.js31
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.xul44
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests.js155
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/toolbar_button.js369
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/toolbar_button.xul71
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/toolbar_button_binding.xml33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ar/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ar/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ar/ssl-observatory.dtd97
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/bg/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/bg/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/bg/ssl-observatory.dtd93
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/cs/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/cs/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/cs/ssl-observatory.dtd94
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/da/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/da/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/da/ssl-observatory.dtd100
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/de/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/de/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/de/ssl-observatory.dtd91
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/el/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/el/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/el/ssl-observatory.dtd99
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/en/https-everywhere.dtd47
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/en/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/en/ssl-observatory.dtd95
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/es/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/es/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/es/ssl-observatory.dtd100
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/eu/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/eu/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/eu/ssl-observatory.dtd95
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fa/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fa/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fa/ssl-observatory.dtd91
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fi/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fi/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fi/ssl-observatory.dtd91
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fr/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fr/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fr/ssl-observatory.dtd90
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/he/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/he/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/he/ssl-observatory.dtd92
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hr/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hr/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hr/ssl-observatory.dtd98
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hu/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hu/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hu/ssl-observatory.dtd96
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/it/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/it/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/it/ssl-observatory.dtd98
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ja/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ja/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ja/ssl-observatory.dtd94
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ko/https-everywhere.dtd49
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ko/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ko/ssl-observatory.dtd92
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lt/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lt/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lt/ssl-observatory.dtd100
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lv/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lv/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lv/ssl-observatory.dtd99
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ms/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ms/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ms/ssl-observatory.dtd104
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nb/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nb/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nb/ssl-observatory.dtd100
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nl/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nl/https-everywhere.properties7
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nl/ssl-observatory.dtd99
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pl/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pl/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pl/ssl-observatory.dtd91
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pt/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pt/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pt/ssl-observatory.dtd94
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ru/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ru/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ru/ssl-observatory.dtd120
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/si/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/si/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/si/ssl-observatory.dtd100
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sk/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sk/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sk/ssl-observatory.dtd100
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sl/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sl/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sl/ssl-observatory.dtd97
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sv/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sv/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sv/ssl-observatory.dtd100
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/tr/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/tr/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/tr/ssl-observatory.dtd96
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/https-everywhere.dtd48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/ssl-observatory.dtd98
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/https-everywhere.dtd49
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/https-everywhere.properties8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/ssl-observatory.dtd91
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/cross.pngbin0 -> 282 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-16-gray.pngbin0 -> 373 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-16.pngbin0 -> 615 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-24-gray.pngbin0 -> 638 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-24.pngbin0 -> 1084 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-banner.jpgbin0 -> 20216 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-half-24.pngbin0 -> 1084 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere.css72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere.pngbin0 -> 1761 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/loop.pngbin0 -> 364 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/ssl-observatory-messy.jpgbin0 -> 34968 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/tick-moot.pngbin0 -> 344 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/tick.pngbin0 -> 348 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/components/https-everywhere.js832
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/components/ssl-observatory.js1026
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/defaults/preferences/preferences.js45
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/defaults/rulesets.sqlitebin0 -> 4258816 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/install.rdf51
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/bootstrap.js350
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/defaults/preferences/prefs.js3
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/harness-options.json737
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/install.rdf29
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/locales.json1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/options.xul6
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/addon-tab/lib/addon-tab.js153
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/README2
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/css/style.css150
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/README21
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/complain-button3.pngbin0 -> 8958 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/info-title.pngbin0 -> 4310 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/separator.pngbin0 -> 279 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/torchy.pngbin0 -> 1364 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/torchy2.pngbin0 -> 273 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jsdefs.js751
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jslex.js719
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jsparse.js2042
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/narcissus_parse.js58
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/contact_finder.js465
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/contact_regex.js49
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/link_types.js42
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/pagemod_finder.js291
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/worker_finder.js35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/README21
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/background-panel.jpgbin0 -> 96427 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/display-panel.html56
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/librejs-title-old.pngbin0 -> 2673 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/librejs-title.pngbin0 -> 14123 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/panel-styles.css177
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/main_panel.js319
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon-white.icobin0 -> 4286 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon.icobin0 -> 4286 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon.pngbin0 -> 2667 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/librejs-settings.html23
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/Boost-1.0.txt23
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/ISC.txt12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/IntelACPI.txt116
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/agpl-3.0.txt661
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/apache-2.0.txt202
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/artistic-2.0.txt201
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/bsd-3-clause.txt27
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/cc0.txt118
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/clear-bsd.txt33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/cpal-1.0.txt105
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/create-magnets.sh28
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/expat.txt5
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/freebsd.txt25
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/gpl-2.0.txt339
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/gpl-3.0.txt674
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/illinois-NCSA.txt24
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/imlib2.txt31
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-2.0.txt481
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-2.1.txt502
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-3.0.txt165
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/magnet-links.txt26
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/mpl-2.0.txt373
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/public-domain.txt18
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/Boost-1.0.txt.torrent2
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/ISC.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/IntelACPI.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/agpl-3.0.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/apache-2.0.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/artistic-2.0.txt.torrentbin0 -> 200 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/bsd-3-clause.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/cc0.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/clear-bsd.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/cpal-1.0.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/expat.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/freebsd.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/gpl-2.0.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/gpl-3.0.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/illinois-NCSA.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/imlib2.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-2.0.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-2.1.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-3.0.txt.torrent2
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/magnet-links.txt.torrentbin0 -> 200 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/mpl-2.0.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/public-domain.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/unlicense.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/wtfpl.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/x11.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/xfree86.txt.torrent1
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/unlicense.txt25
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/wtfpl.txt11
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/x11.txt26
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/xfree86.txt43
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/loading/loader.gifbin0 -> 8787 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/loading/loading-panel.html31
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/preferences_panel/contentscript.js70
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/preferences_panel/preferences_panel.html71
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_detector/script_detector.js363
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_libraries/gethash.sh10
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_libraries/script-libraries.json1440
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/beta-ribbon-cropped.pngbin0 -> 7302 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/beta-ribbon.pngbin0 -> 8658 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/button-download.pngbin0 -> 3426 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/collapsed-nonfree.pngbin0 -> 468604 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/expanded-nonfree.pngbin0 -> 450090 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/libre.pngbin0 -> 19048 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/librejs-running-blocked-wikipedia.jpgbin0 -> 91736 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/logo-medium.pngbin0 -> 11050 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/index.html131
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/form-row.js110
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/form-types.js150
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/pagescript-emitter.js14
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/pagescript-listener.js59
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/permafrost-info-box.js21
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/1140.css130
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/form.css8
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/index.html277
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/styles.css135
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/block-ui/jquery.blockUI.js574
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/css/bootstrap-responsive.min.css9
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/css/bootstrap.min.css9
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/img/glyphicons-halflings-white.pngbin0 -> 8777 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/img/glyphicons-halflings.pngbin0 -> 12097 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/js/bootstrap.min.js6
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/CHANGELOG.txt103
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/LICENSE-MIT22
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/README.md71
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/css/bootstrap-editable.css434
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/css/img/loading.gifbin0 -> 1849 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/js/bootstrap-editable-inline.min.js5
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/no-theme/jquery-ui.min.css7
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/no-theme/jquery-ui.structure.min.css5
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.pngbin0 -> 205 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.pngbin0 -> 160 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.pngbin0 -> 71 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.pngbin0 -> 123 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.pngbin0 -> 193 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.pngbin0 -> 74 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.pngbin0 -> 4824 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.pngbin0 -> 125 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.pngbin0 -> 166 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_222222_256x240.pngbin0 -> 3887 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_228ef1_256x240.pngbin0 -> 3887 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.pngbin0 -> 3887 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.pngbin0 -> 3887 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ffffff_256x240.pngbin0 -> 3887 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/jquery-ui.theme.min.css5
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/js/jquery-ui.min.js13
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery/jquery.min.js9190
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/README14
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/jquery-src.js9190
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/jquery.easing.1.3.js205
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/README21
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/librejs-off.pngbin0 -> 498 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/librejs.pngbin0 -> 503 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/widget.js32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/addon_management/install_uninstall.js68
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/addon_management/prefchange.js118
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/bug_fix.js23
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler.js560
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/attributes.js137
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/dom_checker.js464
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/dom_gatherer.js301
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/request.js112
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/script_object.js198
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/script_properties.js43
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/html_parser.js158
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/url_seen_tester.js87
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/find_js_labels.js95
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/js_web_labels.js216
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/script_hash_worker.js58
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/allowed_referrers.js75
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/caching.js30
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/http_request_observer.js161
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/process_response.js408
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/stream_loader.js110
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/constant_types.js190
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/free_checker.js227
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/js_checker.js513
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/license_definitions.js196
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/nontrivial_checker.js389
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/pattern_utils.js40
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/privacy_checker.js48
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/privacy_threat_definitions.js40
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/relation_checker.js289
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/main.js212
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/narcissus_parser/narcissus_worker.js67
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/accepted_scripts.js67
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/all_scripts.js108
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/crypto.js60
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/dryrun_scripts.js76
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/free_libraries.js67
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/removed_scripts.js71
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/scripts_cache.js182
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/settings/settings_tab.js84
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/settings/storage.js164
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/notification.js77
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/script_panel.js73
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/ui_info.js232
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_punycode.js219
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_querystring.js187
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_url.js611
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/url_handler.js120
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/menuitems/lib/menuitems.js195
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/notification-box/lib/notification-box.js129
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/vold-utils/lib/unload+.js80
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/bootstrap.js169
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome.manifest58
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/errors.html111
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/objtabs.css82
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/composer.js412
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/composer.xul118
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/fennecSettings.xul38
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-backup.js348
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-filteractions.js561
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-filterview.js849
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-search.js269
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-subscriptionactions.js606
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-subscriptionview.js330
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters.js226
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters.xul400
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/firstRun.html141
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/firstRun.js253
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/flasher.js108
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/i18n.js150
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/overlay.xul134
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/progressBar.js158
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/progressBar.xul29
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sendReport.js1571
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sendReport.xul259
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/settings.xul38
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebar.js1246
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebar.xul139
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebarDetached.xul50
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptionSelection.js308
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptionSelection.xul75
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptions.xml117
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/utils.js66
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/filters.dtd74
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/filters.dtd74
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/sendReport.dtd69
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/filters.dtd74
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/filters.dtd73
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/sendReport.dtd105
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/filters.dtd74
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/sendReport.dtd71
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/composer.dtd38
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/filters.dtd92
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/firstRun.properties24
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/global.properties58
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/overlay.dtd41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/sendReport.dtd181
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/sidebar.dtd41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/subscriptionSelection.dtd19
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/filters.dtd74
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/filters.dtd73
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/sendReport.dtd66
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/sendReport.dtd66
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/filters.dtd74
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/filters.dtd74
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/sendReport.dtd66
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/filters.dtd74
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/sendReport.dtd102
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/filters.dtd74
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/sendReport.dtd97
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/filters.dtd74
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/sendReport.dtd97
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/filters.dtd74
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/sendReport.dtd66
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/filters.dtd74
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/sendReport.dtd96
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/filters.dtd73
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/filters.dtd74
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/filters.dtd73
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/sendReport.dtd100
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/filters.dtd74
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/filters.dtd74
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/sendReport.dtd70
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/firstRun.properties24
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/sendReport.dtd71
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/filters.dtd73
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/sendReport.dtd66
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/filters.dtd74
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/sendReport.dtd70
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/sendReport.dtd65
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/filters.dtd73
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/sendReport.dtd78
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/composer.dtd33
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/filters.dtd72
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/firstRun.properties20
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/global.properties41
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/overlay.dtd32
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/sendReport.dtd66
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/sidebar.dtd35
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/subscriptionSelection.dtd12
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-icon-big.pngbin0 -> 15201 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status-16.pngbin0 -> 1304 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status-32.pngbin0 -> 3419 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status.pngbin0 -> 2433 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/ajax-loader.gifbin0 -> 3208 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background-main.pngbin0 -> 163 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background-share.pngbin0 -> 162 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background.pngbin0 -> 162 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/checkbox.pngbin0 -> 356 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/close.pngbin0 -> 1211 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/composer.css77
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/donate.pngbin0 -> 160 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/malware.pngbin0 -> 3335 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/social.pngbin0 -> 4260 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/tracking.pngbin0 -> 3562 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/filters.css221
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/firstRun.css588
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/fonts/CreteRound-Italic.otfbin0 -> 43152 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/fonts/CreteRound-Regular.otfbin0 -> 40968 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/item-state.pngbin0 -> 533 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/overlay.css226
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/sendReport.css129
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/sidebar.css112
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/slow.pngbin0 -> 718 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/facebook.pngbin0 -> 3861 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/googleplus.pngbin0 -> 4009 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/renren.pngbin0 -> 2619 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/twitter.pngbin0 -> 3944 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/weibo.pngbin0 -> 3497 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/subscriptionSelection.css69
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/defaults/prefs.js38
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/icon.pngbin0 -> 3387 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/icon64.pngbin0 -> 5727 bytes
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/install.rdf634
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/Public.jsm202
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/antiadblockInit.js78
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/appSupport.js948
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/contentPolicy.js779
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/customizableUI.js320
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/downloader.js381
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/elemHide.js419
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/elemHideHitRegistration.js160
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterClasses.js906
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterListener.js282
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterNotifier.js73
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterStorage.js897
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/io.js365
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/keySelector.js228
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/main.js73
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/matcher.js446
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/notification.js339
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/objectTabs.js492
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/prefs.js203
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/requestNotifier.js378
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/subscriptionClasses.js597
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/sync.js459
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/synchronizer.js330
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/timeline.js155
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/ui.js1973
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/utils.js787
-rw-r--r--helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/windowObserver.js112
-rw-r--r--helpers/DATA/firefox/trisquel/searchplugins/duckduckgo.xml8
-rw-r--r--helpers/DATA/firefox/trisquel/searchplugins/trisquel-packages.xml9
-rw-r--r--helpers/DATA/firefox/trisquel/searchplugins/trisquel.xml9
-rw-r--r--helpers/DATA/firefox/trisquel/settings.js129
1934 files changed, 201238 insertions, 0 deletions
diff --git a/helpers/DATA/firefox/Changelog.IceCat b/helpers/DATA/firefox/Changelog.IceCat
new file mode 100644
index 0000000..50da2cb
--- /dev/null
+++ b/helpers/DATA/firefox/Changelog.IceCat
@@ -0,0 +1,786 @@
+2014-09-11 Ruben Rodriguez <ruben@gnu.org>
+ * Moved to generation script based on Trisquel package helpers (http://trisquel.info/en/wiki/package-helpers)
+ * Updated to match v31ESR upstream release
+ * Improved fingerprinting countermeasures:
+ - Block third party cookies
+ - Spoof referrers
+ - Spoof useragent and related values for js (appname, oscpu...)
+ - Ask the user before running any plugin
+ - Do not list plugin info through js
+ - Disable prefetching
+ - Simplify font settings to use just the basic set
+ - Simplify requesting pages in english
+ * Extensions:
+ - LibreJS updated to version 6.0.1
+ - Added customized Adblockplus
+ - Removed requestpolicy
+ - Added about:icecat with list of features, links to documentation and checkbox to quick disabling
+ - Updated HTTPSeverywhere
+
+2013-10-16 Loic J. Duros <lduros@gnu.org>
+ * LibreJS has been updated to version 5.4
+ * Using a modified version of Gnome 24 theme released under MPL 2.0
+ * Added RequestPolicy to block cross-domain requests
+ * Created IceCat Tweak extension to make menu bar more compact
+ * Changed user agent from privacy addon to be more common (fingerprinting)
+ * Now using the FSF Directory for addon repository
+
+2012-12-01 Loic J. Duros <lduros@gnu.org>
+ * The JavaScript in about:home page has been fixed to provide Duck Duck Go as a search engine when dom.storage.enabled is disabled (the default.)
+ * Promotional GNU material was added as part of the IceCat branding package
+ * Due to privacy concerns (leaking urls), Safe Browsing has been disabled by default.
+ * Duck Duck is now the default search box. (see more about Duck Duck Go and privacy: http://duckduckgo.com/about.html.)
+ * Firefox 17 and 17.0.1 list of changes (IceCat 17 corresponds to Firefox 17.0.1):
+ http://www.mozilla.org/en-US/firefox/17.0/releasenotes/
+ http://www.mozilla.org/en-US/firefox/17.0.1/releasenotes/
+
+2012-08-21 Loic J. Duros <lduros@gnu.org>
+ * Uses MOZ_APP_PROFILE to force the ~/.mozilla/icecat directory over the ~/.gnuzilla/icecat one, which from release to release has had unreliable support.
+ * Updates to Makefiles for compliance with ftp.gnu.org check.
+ * Firefox 14 list of changes: http://www.mozilla.org/en-US/firefox/14.0.1/releasenotes/buglist.html
+
+2012-07-12 Loic J. Duros <lduros@gnu.org>
+ * Fixed extensions folder and package manifest.
+ * Put Firefox Sync back.
+ * Fixed couple strings (GNUzilla Foundation, ...)
+
+2012-06-01 Loic J. Duros <lduros@gnu.org>
+ * extensions: Removed the MafiaaFire Redirector extension because the license
+ makes it nonfree:
+ https://addons.mozilla.org/en-US/firefox/addon/mafiaafire-redirector/license/0.9d
+
+ * make.icecat: Rewrote part of make.icecat so that it is
+ compatible with latest versions of Firefox.
+
+ * .mozconfig: appdir is now default .mozilla rather than
+ .gnuzilla, since the appdir option is not well supported by
+ Firefox developers and may not be supported at all in the future.
+
+ * extensions: Added GNU LibreJS version 4.7 to IceCat.
+
+ * aboutDialog.xul: Update content.
+
+ * browser/confvars.sh: Disabled Firefox Sync.
+
+2012-02-07 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * make.icecat: Do not apply the locales-strings.patch patch. Use
+ sed instead.
+ * locales-strings.patch: Remove file.
+
+2011-11-26 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * make.icecat: Revert change of 2011-11-21. Do not bundle libjs, for now.
+
+2011-11-21 Giuseppe Scrivano <giuseppe@gnu.org>
+
+ * make.icecat: Add librejs extension.
+
+2011-09-30 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/app/Makefile.in: Upgrade from upstream.
+
+2011-09-28 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/app/Makefile.in (libs): Remove document.png.
+ * browser/branding/unofficial/Makefile.in (LINUX_BRANDING_FILES):
+ Likewise.
+
+2011-09-07 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * make.icecat: Document how include the CAcert root certificate.
+ * security/nss/lib/ckfw/builtins/certdata.c: Upgrade from upstream.
+
+2011-08-31 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * security/nss/lib/ckfw/builtins/certdata.c: Upgrade from upstream.
+
+2011-08-18 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * make.icecat: Use @gnuzilla.gnu.org for locales.
+ * browser/locales/Makefile.in: Remove file from the repository.
+
+2011-08-16 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/app/Makefile.in: Upgrade from Firefox 6.0.
+
+ * make.icecat: Upgrade MafiaaFire download link.
+
+ * browser/app/Makefile.in: Remove file.
+ * browser/app/application.ini: Upgrade from upstream.
+ * browser/app/profile/firefox.js: Likewise.
+
+2011-08-15 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * make.icecat: Fix build under GNU/Linux 3.0.
+ * canvas_notify.patch: Adapt for Firefox 6.0.
+
+2011-06-25 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/branding/unofficial/content/about-background.png: New file.
+ * browser/branding/unofficial/content/jar.mn: Include about-background.png.
+
+2011-06-21 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/branding/unofficial/locales/en-US/aboutDialog.dtd: Update from upstream.
+ * browser/app/Makefile.in: Likewise.
+
+2011-06-17 Hayawardh Vijayakumar <hayawardh@gmail.com> (tiny patch)
+
+ * browser/branding/unofficial/run-icecat.sh: Fix insecure LD_LIBRARY_PATH.
+
+2011-04-18 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * make.icecat: Include the Mafiaa addon by default.
+
+2011-04-03 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/installer/package-manifest.in: Use run-icecat.sh not
+ run-mozilla.sh
+ * browser/branding/unofficial/Makefile.in: Fix build under a VPATH.
+
+2011-04-01 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/branding/unofficial/locales/en-US/aboutDialog.dtd: Remove
+ links to "End User Right" and "Privacy Policy".
+ * browser/base/content/aboutHome.xhtml: New file.
+
+ * browser/branding/unofficial/locales/jar.mn: Remove file.
+
+2011-03-31 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/branding/unofficial/content/credits.xhtml: Remove file.
+
+2011-03-30 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * toolkit/mozapps/plugins/content/pluginInstallerWizard.js: New file.
+
+2011-03-24 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * make.icecat: Use the privacy extension from the 4.0 branch, not trunk.
+
+ * make.icecat: Don't attempt to copy files which are not used anymore.
+ * browser/installer/package-manifest.in: Include extensions.
+
+2011-03-23 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/app/mozilla.in: Update.
+ * browser/app/profile/firefox.js: Likewise.
+ * browser/branding/unofficial/content/jar.mn: Likewise.
+ * browser/branding/unofficial/pref/firefox-branding.js: Likewise.
+ * browser/branding/unofficial/locales/en-US/credits.dtd: Remove file.
+ * browser/branding/unofficial/content/credits.xhtml: Likewise.
+ * browser/branding/unofficial/license.r: Likewise.
+ * browser/branding/unofficial/brand.properties: Likewise.
+ * browser/branding/unofficial/content/icon48.png: Remove.
+ * browser/branding/unofficial/content/icon64.png: Convert to...
+ * browser/branding/unofficial/content/default.png: ...this.
+
+2011-03-22 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/branding/unofficial/locales/en-US/aboutDialog.dtd: Updated.
+ * browser/branding/unofficial/locales/en-US/brand.dtd: Updated.
+ * browser/branding/unofficial/Makefile.in: Updated.
+ * browser/branding/unofficial/brand.dtd: Remove file.
+ * browser/branding/unofficial/content/aboutCredits.png: Likewise.
+ * browser/branding/unofficial/content/aboutFooter.png: Likewise.
+ * browser/branding/unofficial/content/about.png: Likewise.
+ * browser/branding/unofficial/content/default.png: Likewise.
+ * browser/branding/unofficial/content/about-logo.png: New file.
+ * browser/branding/unofficial/content/about.png: Likewise.
+ * browser/branding/unofficial/content/about-wordmark.png: Likewise.
+ * browser/branding/unofficial/content/icon48.png: Likewise.
+ * browser/branding/unofficial/content/icon64.png: Likewise.
+
+ * security/nss/lib/ckfw/builtins/certdata.c: Regenerated.
+
+ * browser/installer/package-manifest.in: Update.
+ * configure.in: Remove file.
+
+ * make.icecat: Do not apply the `nullplugin.patch' patch.
+ * nullplugin.patch: Remove file.
+
+2011-03-02 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * make.icecat: Adjust directory names for extensions.
+
+2011-02-22 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * make.icecat: Install "HTTPS everywhere" by default.
+
+2011-01-27 Christophe Jarry <christophe.jarry@ouvaton.org>
+
+ * .mozconfig: Remove duplicate line.
+
+2011-01-23 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.in: New file. Apply "Work around FTBFS on mips by
+ disabling TLS support" patch by Mike Hommey <mh@glandium.org>.
+ Reported by: Christophe Jarry <christophe.jarry@ouvaton.org>.
+
+2011-01-19 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * README.ICECAT: Fix typo.
+ Reported by: Christophe Jarry <christophe.jarry@ouvaton.org>.
+
+2011-01-15 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * README.ICECAT: Remove reference to IceWeasel and BurningDog.
+ Reported by: Christophe Jarry <christophe.jarry@ouvaton.org>.
+
+2010-12-22 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * .mozconfig: Enable freetype2.
+ Suggested by: Bruno Miguel <brunoalexandremiguel@gmail.com>
+
+2010-12-21 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/branding/unofficial/configure.sh: Leave only one final
+ newline, not two.
+ * browser/locales/en-US/searchplugins/duck-duck-go.xml: Add final
+ newline.
+ * browser/branding/unofficial/locales/en-US/brand.dtd: Remove trailing
+ whitespaces.
+ * browser/branding/unofficial/run-icecat.sh: Likewise.
+ * browser/installer/package-manifest.in: Likewise.
+ Reported by: Christophe Jarry <christophe.jarry@ouvaton.org>
+
+2010-12-20 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/app/profile/firefox.js: Remove duplicate configuration values.
+ * browser/branding/unofficial/pref/firefox-branding.js: Likewise.
+ Remove definition for `pfs.datasource.url'.
+ Reported by: Christophe Jarry <christophe.jarry@ouvaton.org>.
+
+2010-12-15 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/installer/unix/packages-static: Copy anything under bin/extensions.
+ * browser/installer/package-manifest.in: Likewise.
+ * browser/installer/packages-static: Likewise.
+ * browser/branding/unofficial/Makefile.in (export): Copy any directory
+ under extensions/, not files.
+
+2010-12-13 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/installer/package-manifest: New file.
+
+2010-12-11 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * make.icecat: Automatically fetch the privacy extension.
+ * extensions: Move directory to...
+ * browser/branding/unofficial/extensions: ..here.
+
+2010-12-10 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/branding/unofficial/Makefile.in (export): Fix condition for
+ copying extensions/*.xpi.
+
+ * make.icecat: Fail immediately if patches can't be applied.
+
+2010-12-09 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/branding/unofficial/locales/en-US/brand.dtd: Remove "www."
+ from releaseBaseURL.
+ Reported by: Christophe Jarry <christophe.jarry@ouvaton.org>.
+
+2010-12-07 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * canvas_notify.patch: New file.
+ * make.icecat: Apply canvas_notify.patch.
+
+2010-11-25 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/branding/unofficial/Makefile.in (export): Copy
+ extensions/*.xpi to the dist directory.
+ * browser/installer/unix/packages-static: Include bin/extensions/*.xpi
+ in the package.
+
+2010-11-17 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/locales/en-US/searchplugins/duck-duck-go.xml: New file.
+
+2010-09-03 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * .mozconfig: Add --disable-ipc.
+
+2010-08-18 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * make.icecat: Fix Makefile.in's permissions. Fix CVE-2009-4029.
+
+2010-05-26 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/branding/unofficial/pref/firefox-branding.js: Change
+ the `app.support.baseURL' value to keep %VERSION%, %OS% and %LOCALE%
+ information.
+
+2010-05-18 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/locales/en-US/chrome/browser-region/region.properties: Remove
+ handlers for webcal and irc.
+
+ Remove "GMail" and "Yahoo Mail!" from the mailto protocol handlers.
+
+ * browser/locales/en-US/chrome/browser-region/region.properties: New
+ file.
+
+2010-05-12 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * make.icecat: Rewrite the usage string to have `icecat', not
+ `firefox'.
+
+2010-05-06 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * make.icecat: Remove a file that is not present upstream anymore.
+
+2010-04-03 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/config/version.txt: Remove.
+
+2010-03-23 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * make.icecat: Don't attempt to remove not existing files.
+ * browser/config/version.txt: Bump version to 3.6.2.
+
+2010-02-24 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * remove.nonfree: Renamed to...
+ * make.icecat: this.
+ * README.ICECAT: Use the new file name.
+
+2010-02-18 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/app/profile/firefox.js: The fixed user agent string is
+ moved into the privacy extension.
+
+2010-02-18 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * nullplugin.patch: Update to 3.6.
+
+2010-02-13 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * toolkit/content/plugins.html: Re-added.
+
+2010-02-12 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * toolkit/content: Remove.
+
+2010-02-02 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/app/profile/firefox.js: Use a reasonable fixed User-Agent
+ string. Only few web sites will be affected by this change.
+
+2010-02-02 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/app/profile/firefox.js: Revert last change. Specify the
+ original User-Agent. Some websites use this information.
+
+2010-01-31 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/app/profile/firefox.js: Do not specify additional
+ information in the User-Agent header.
+
+2010-01-30 Harald van Dijk <harald@gigawatt.nl>
+
+ * browser/app/profile/firefox.js: Synchronize with Firefox 3.6.
+
+2010-01-21 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * remove.nonfree,
+ * .mozconfig: Update to the 3.6 version.
+ * browser/config/version.txt: Bump version to 3.6.
+
+2010-01-06 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/config/version.txt: Bump version to 3.5.7.
+
+2009-12-16 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/config/version.txt: Bump version to 3.5.6.
+
+2009-11-19 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * nullplugin.patch: Redirect to a dynamic page to fetch plugins
+ information.
+
+2009-11-19 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * nullplugin.patch: New file.
+ * remove.nonfree: Apply nullplugin.patch.
+
+2009-11-19 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * browser/app/profile/firefox.js: Disable the default plugin.
+
+2009-11-18 Karl Goetz <karl@kgoetz.id.au>
+
+ * browser/app/profile/firefox.js: Include (like Firefox/version).
+ The idea here is that websites which sniff the UA string to decide
+ what to display will see Firefox and play nice. Ref. Debian
+ bug #399633 and "Iceweasel and Firefox compatibility" thread.
+
+2009-11-08 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/config/version.txt: Bump version number to 3.5.5.
+
+2009-10-28 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/config/version.txt: Bump version number to 3.5.4.
+
+2009-10-19 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/app/profile/firefox.js: Use the additional search engines
+ list present on the GNUzilla web site.
+ The themes and addons point to the right section in the page.
+
+2009-09-24 Giuseppe Scrivano <gscrivano@gnu.org>
+ Reported by: Karl Goetz <karl@kgoetz.id.au>
+ * ./browser/app/profile/firefox.js: Change some default configuration values.
+
+2009-09-10 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/config/version.txt: Bump version number to 3.5.3.
+
+2009-09-01 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./.mozconfig: Remove deprecated extensions.
+
+2009-08-05 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/config/version.txt: Bump version number to 3.5.2.
+
+2009-08-01 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/branding/unofficial/content/aboutCredits.png: Use a transparent
+ background.
+
+2009-07-30 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/base/content/overrides/app-license.html: New file.
+ * ./browser/branding/unofficial/locales/en-US/aboutDialog.dtd: Specify
+ better what we changed.
+
+2009-07-26 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./toolkit/mozapps/plugins/content/pluginInstallerWizard.xul: New file.
+
+2009-07-19 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./remove.nonfree: Do not remove useful files.
+
+2009-07-18 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/config/version.txt: Bump version number to 3.5.1.
+ * ./.mozconfig: Don't disable jsd.
+
+2009-07-11 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/config/version.txt: Changed versioning scheme.
+
+2009-07-10 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./remove.nonfree: Do not remove useful files.
+
+2009-07-04 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./remove.nonfree: Generate logo's.
+ * ./browser/app/application.ini: New file.
+ * ./browser/app/Makefile.in: Updated for 3.5-g1.
+ * ./browser/app/mozilla.in: Moved.
+ * ./browser/branding/unofficial/content/credits.xhtml: Reformatted.
+ * ./browser/branding/unofficial/content/jar.mn: Updated.
+ * ./browser/branding/unofficial/locales/en-US/aboutDialog.dtd: Updated.
+ * ./build/unix/mozilla.in: New file.
+ * ./security/nss/lib/ckfw/builtins/certdata.c: Regenerated.
+
+2009-07-02 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./.mozconfig: Changed default configuration.
+ * ./remove.nonfree: Don't remove ./js/src/liveconnect/jsj_nodl.c.
+
+2009-06-30 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/app/mozilla.in: Removed.
+ * ./browser/app/profile/firefox.js,
+ * ./browser/branding/unofficial/run-icecat.sh,
+ * ./browser/branding/unofficial/content/credits.xhtml,
+ * ./browser/config/version.txt,
+ * ./browser/installer/packages-static,
+ * ./browser/installer/unix/packages-static,
+ * ./browser/locales/Makefile.in,
+ * ./toolkit/content/plugins.html: Updated to 3.5-g1.
+ * ./security/nss/lib/ckfw/builtins/certdata.c: Updated root certificates.
+
+2009-06-23 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./toolkit/content/plugins.html: New file.
+
+2009-06-23 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./.mozconfig: Allow multiple profiles.
+
+2009-06-12 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/config/version.txt: Updated version to 3.0.11-g1.
+
+2009-05-12 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/branding/unofficial/content/credits.xhtml: Update credits.
+
+2009-04-29 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/config/version.txt: Updated version to 3.0.10-g1.
+
+2009-04-27 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./.mozconfig: Increased compiler optimization level.
+
+2009-04-22 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/config/version.txt: Updated version to 3.0.9-g1.
+
+2009-04-03 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/config/version.txt: Updated version to 3.0.8-g1.
+
+2009-03-14 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./remove.nonfree: Don't remove browser/branding/unofficial/.
+
+2009-03-14 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/config/version.txt: Updated version to 3.0.7-g1.
+
+2009-03-07 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/app/profile/firefox.js: Changed addons.html URL.
+
+2009-03-01 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/branding/unofficial/pref/firefox-branding.js: Addons location properties moved to firefox.js.
+ * ./browser/app/profile/firefox.js: Added.
+
+2009-02-28 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/branding/unofficial/pref/firefox-branding.js: Fixed problem with addons location properties.
+
+2009-02-28 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/branding/unofficial/content/credit.xhtml: Removed.
+ * ./browser/branding/unofficial/content/credit.xhtml: Added.
+ * ./remove.nonfree: File renamed.
+
+2009-02-28 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/branding/unofficial/content/credit.xhtml: Removed Firefox logos notice.
+
+2009-02-28 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./remove.nonfree,
+ * ./browser/branding/unofficial/locales/en-US/credits.dtd,
+ * ./browser/branding/unofficial/content/credits.xhtml: Added new files.
+
+2009-02-26 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/branding/unofficial/pref/firefox-branding.js: Changed addons location.
+
+2009-02-07 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./locales-strings.patch: New file.
+ * ./remove.nonfree: Patch locales.
+
+2009-02-04 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/config/version.txt: Updated version to 3.0.6-g1.
+ * ./configure.in: Removed.
+
+2008-12-23 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./remove.nonfree,
+ * ./configure.in: Don't apply X geometry patch.
+ * ./x_geometry_patch.diff: Removed.
+
+2008-12-23 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/config/version.txt,
+ * ./configure.in: Updated version to 3.0.5-g1.
+
+2008-12-01 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/app/Makefile.in: File restored.
+
+2008-12-01 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./config/autoconf.mk.in,
+ * ./browser/app/Makefile.in: File removed.
+ * ./x_geometry_patch.diff: Changed boolean test.
+ * ./configure.in: Changed libxcb test.
+ * ./.mozconfig: Changed default configuration.
+
+2008-11-30 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * configure.in,
+ * x_geometry_patch.diff,
+ * .mozconfig: Changed default configuration and XRM detection.
+
+2008-11-23 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * .mozconfig,
+ * ./configure.in: Changed default configuration.
+
+2008-11-14 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./configure.in: Added missing AC_SUBST statement.
+
+2008-11-14 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./remove.nonfree: Don't remove the browser/branding/unofficial directory.
+
+2008-11-14 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/config/version.txt: Updated version to 3.0.4-g1.
+ * ./configure.in: Updated version to 3.0.4-g1.
+
+2008-10-25 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/branding/unofficial/branding.nsi: Changed CompanyName.
+ * ./browser/branding/unofficial/pref/firefox-branding.js: Changed some configurations.
+
+2008-10-25 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/branding/unofficial/branding.nsi: Changed URL.
+ * ./Changelog: Renamed to ChangeLog.
+
+2008-10-03 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./.mozconfig: Generate optimized binaries.
+
+2008-10-02 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/branding/unofficial/brand.dtd,
+ * ./browser/branding/unofficial/brand.properties: Added new files.
+
+2008-10-02 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./config/autoconf.mk.in: Fixed problem introduced by last commit.
+
+2008-10-02 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./configure.in: Use XRM_LIBS.
+ * ./config/autoconf.mk.in: Fixed problem with locales.
+
+2008-09-29 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/branding/unofficial/content/jar.mn: Updated references.
+
+2008-09-29 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/locales/Makefile.in: Updated to the Firefox 3.0.3 version.
+
+2008-09-29 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/branding/unofficial/Makefile.in,
+ * ./browser/installer/packages-static,
+ * ./browser/installer/unix/packages-static: Install default.png.
+ * ./browser/branding/unofficial/icon48.png,
+ * ./browser/branding/unofficial/icon64.png: Removed.
+ * ./browser/branding/unofficial/default.png: Added.
+ * ./browser/config/version.txt: Updated version to 3.0.3-g1.
+
+2008-09-24 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * security/nss/lib/ckfw/builtins/certdata.c: New file.
+
+2008-09-24 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/config/version.txt: Updated version to 3.0.2-g1.
+
+2008-09-19 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/branding/unofficial/run-icecat.sh: Silent error when
+ `~/.gnuzilla/' doesn't exist.
+
+2008-08-06 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/locales/Makefile.in: New file, it renames locales .xpi.
+
+2008-08-05 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./remove.nonfree: Fixed shell comment.
+
+2008-08-03 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/app/Makefile.in,
+ * ./configure.in: Use XRM_LIBS.
+ * ./config/autoconf.mk.in: Added new file.
+
+2008-08-02 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/app/Makefile.in,
+ * ./configure.in,
+ * ./x_geometry_patch.diff: Look for libX11.a and XCB in XEXT_LIBS.
+
+2008-08-02 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./configure.in: Look for the XCB library.
+
+2008-08-01 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./configure.in: Look for the libX11.a file.
+
+2008-07-31 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./configure.in,
+ * x_geometry_patch.diff: Try to link against the XrmInitialize symbol.
+
+2008-07-29 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * x_geometry_patch.diff: Don't change size and position for dialogs.
+
+2008-07-27 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./configure.in: Look for the libX11.a file in /usr/lib too.
+
+2008-07-27 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./remove.nonfree,
+ * ./configure.in: Look for the libX11.a file.
+
+2008-07-27 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./browser/config/version.txt: Added new file.
+
+2008-07-26 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * remove.nonfree,
+ * x_geometry_patch.diff: Added X geometry patch.
+
+2008-07-23 Giuseppe Scrivano <gscrivano@gnu.org>
+
+ * ./.mozconfig,
+ * ./remove.nonfree,
+ * ./README.ICECAT,
+ * ./browser/app/Makefile.in,
+ * ./browser/app/mozilla.in,
+ * ./browser/app/application.ini,
+ * ./browser/branding/unofficial/Makefile.in,
+ * ./browser/branding/unofficial/pref/firefox-branding.js,
+ * ./browser/branding/unofficial/configure.sh,
+ * ./browser/branding/unofficial/license.r,
+ * ./browser/branding/unofficial/locales/jar.mn,
+ * ./browser/branding/unofficial/locales/en-US/aboutDialog.dtd,
+ * ./browser/branding/unofficial/locales/en-US/brand.properties,
+ * ./browser/branding/unofficial/locales/en-US/brand.dtd,
+ * ./browser/branding/unofficial/locales/Makefile.in,
+ * ./browser/branding/unofficial/locales/browserconfig.properties,
+ * ./browser/branding/unofficial/branding.nsi,
+ * ./browser/branding/unofficial/run-icecat.sh,
+ * ./browser/branding/unofficial/content/icon48.png,
+ * ./browser/branding/unofficial/content/aboutFooter.png,
+ * ./browser/branding/unofficial/content/about.png,
+ * ./browser/branding/unofficial/content/jar.mn,
+ * ./browser/branding/unofficial/content/icon64.png,
+ * ./browser/branding/unofficial/content/aboutCredits.png,
+ * ./browser/branding/unofficial/content/Makefile.in,
+ * ./browser/branding/unofficial/dsstore,
+ * ./browser/installer/unix/packages-static,
+ * ./browser/installer/packages-static: Initial import.
diff --git a/helpers/DATA/firefox/README.IceCat b/helpers/DATA/firefox/README.IceCat
new file mode 100644
index 0000000..7b6d248
--- /dev/null
+++ b/helpers/DATA/firefox/README.IceCat
@@ -0,0 +1,89 @@
+This is the README file for the GNU IceCat distribution.
+
+Copyright (C) 2014 Ruben Rodriguez <ruben@gnu.org>
+Copyright (C) 2006, 2007, 2008, 2010, 2011, 2012, 2014 Free Software Foundation, Inc.
+
+Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.
+
+The goal of the IceCat project is to provide a completely free version
+of the popular mozilla source code. It is part of Gnuzilla, the
+umbrella project analogous to Mozilla. The base Mozilla code is free
+but it supports and suggests using non-free plugins and other modules.
+GNU IceCat is completely free, and suggests only free plugins to
+users. If you aren't aware of the rationale and goals of the Free
+Software Movement, please take a look at this page:
+http://www.gnu.org/philosophy/
+
+To report problems, request changes, or other discussion, please use the
+public mailing list bug-gnuzilla@gnu.org. This is an open list, feel
+free to subscribe or view the archives at
+http://lists.gnu.org/mailman/listinfo/bug-gnuzilla.
+
+The Gnuzilla and IceCat home page: http://www.gnu.org/software/gnuzilla
+The sources are hosted on Savannah: http://savannah.gnu.org/projects/gnuzilla
+
+
+BUILD FROM TARBALL
+==================
+From the released IceCat source tarball, you can build in the
+standard way:
+./configure && make
+
+Be sure you have installed the needed libraries. If you want to tune
+the configuration process you can change the default setup using the
+file .mozconfig.
+
+The default configuration of IceCat uses the following libraries:
+libpango libpangoxft libpangoft2 libfreetype libxft libgtk2 libx11
+
+Refer to your distro help as needed if the configure script fails to
+find them.
+
+INSTALL
+=======
+When you have it built you can install it with:
+make install
+
+If you want to install in a staging directory, you can do this:
+make install DESTDIR=/foo/bar
+
+LICENSING
+=========
+Because we hope and want our privacy enhancements to be picked up by
+Mozilla itself, we are keeping the same tri-licensing scheme for
+Gnuzilla/IceCat as Mozilla uses: MPL/GPL/LGPL.
+
+EXTENSIONS INCLUDED IN ICECAT 31.0
+==================================
+
+* LibreJS
+ GNU LibreJS aims to address the JavaScript problem described in Richard
+ Stallman's article The JavaScript Trap.
+ http://www.gnu.org/philosophy/javascript-trap.html
+
+* Https-Everywhere
+ Extension that encrypts your communications with many major websites,
+ making your browsing more secure.
+
+* Adblockplus
+ Blocks privacy trackers while in normal browsing mode, and all third party
+ requests when in private browsing mode.
+
+* YouTube ALL HTML5
+ Allows to play videos at youtube.com without a flash player.
+
+* AboutIceCat
+ Adds a custom "about:icecat" homepage with links to information about the
+ free software and privacy features in IceCat, and checkboxes to enable
+ and disable the ones more prone to break websites.
+
+All the extensions are released under the GNU Public License.
+
+CONTRIBUTORS AND HELP
+=====================
+The maintainer of GNU IceCat is Ruben Rodriguez <ruben@gnu.org>.
+We thank the Hitflip team (http://www.hitflip.de/special/gnu) for the logos.
+
+Additional contributors are most welcome.
diff --git a/helpers/DATA/firefox/gnu/abouthome/aboutHome.css b/helpers/DATA/firefox/gnu/abouthome/aboutHome.css
new file mode 100644
index 0000000..8635239
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/aboutHome.css
@@ -0,0 +1,429 @@
+%if 0
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+%endif
+
+html {
+ font: message-box;
+ font-size: 100%;
+ background-color: hsl(0,0%,95%);
+ color: #000;
+ height: 100%;
+}
+
+body {
+ margin: 0;
+ display: -moz-box;
+ -moz-box-orient: vertical;
+ width: 100%;
+ height: 100%;
+}
+
+input,
+button {
+ font-size: inherit;
+ font-family: inherit;
+}
+
+a {
+ color: -moz-nativehyperlinktext;
+ text-decoration: none;
+}
+
+.spacer {
+ -moz-box-flex: 1;
+}
+
+#topSection {
+ text-align: center;
+}
+
+#brandLogo {
+ height: 420px;
+ width: 150px;
+ margin: 22px auto 31px;
+ background-image: url("chrome://branding/content/about-logo.png");
+ background-size: 420px 150px;
+ background-position: center center;
+ background-repeat: no-repeat;
+}
+
+#searchForm,
+#snippets {
+ width: 470px;
+}
+
+#searchForm {
+ display: -moz-box;
+}
+
+#searchLogoContainer {
+ display: -moz-box;
+ -moz-box-align: center;
+ padding-top: 2px;
+ -moz-padding-end: 8px;
+}
+
+#searchLogoContainer[hidden] {
+ display: none;
+}
+
+#searchEngineLogo {
+ display: inline-block;
+ height: 28px;
+ width: 70px;
+ min-width: 70px;
+}
+
+#searchText {
+ -moz-box-flex: 1;
+ padding: 6px 8px;
+ background: hsla(0,0%,100%,.9) padding-box;
+ border: 1px solid;
+ border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2);
+ box-shadow: 0 1px 0 hsla(210,65%,9%,.02) inset,
+ 0 0 2px hsla(210,65%,9%,.1) inset,
+ 0 1px 0 hsla(0,0%,100%,.2);
+ border-radius: 2.5px 0 0 2.5px;
+}
+
+#searchText:-moz-dir(rtl) {
+ border-radius: 0 2.5px 2.5px 0;
+}
+
+#searchText:focus,
+#searchText[autofocus] {
+ border-color: hsla(206,100%,60%,.6) hsla(206,76%,52%,.6) hsla(204,100%,40%,.6);
+}
+
+#searchSubmit {
+ -moz-margin-start: -1px;
+ background: linear-gradient(hsla(0,0%,100%,.8), hsla(0,0%,100%,.1)) padding-box;
+ padding: 0 9px;
+ border: 1px solid;
+ border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2);
+ -moz-border-start: 1px solid transparent;
+ border-radius: 0 2.5px 2.5px 0;
+ box-shadow: 0 0 2px hsla(0,0%,100%,.5) inset,
+ 0 1px 0 hsla(0,0%,100%,.2);
+ cursor: pointer;
+ transition-property: background-color, border-color, box-shadow;
+ transition-duration: 150ms;
+}
+
+#searchSubmit:-moz-dir(rtl) {
+ border-radius: 2.5px 0 0 2.5px;
+}
+
+#searchText:focus + #searchSubmit,
+#searchText + #searchSubmit:hover,
+#searchText[autofocus] + #searchSubmit {
+ border-color: #59b5fc #45a3e7 #3294d5;
+ color: white;
+}
+
+#searchText:focus + #searchSubmit,
+#searchText[autofocus] + #searchSubmit {
+ background-image: linear-gradient(#4cb1ff, #1793e5);
+ box-shadow: 0 1px 0 hsla(0,0%,100%,.2) inset,
+ 0 0 0 1px hsla(0,0%,100%,.1) inset,
+ 0 1px 0 hsla(210,54%,20%,.03);
+}
+
+#searchText + #searchSubmit:hover {
+ background-image: linear-gradient(#66bdff, #0d9eff);
+ box-shadow: 0 1px 0 hsla(0,0%,100%,.2) inset,
+ 0 0 0 1px hsla(0,0%,100%,.1) inset,
+ 0 1px 0 hsla(210,54%,20%,.03),
+ 0 0 4px hsla(206,100%,20%,.2);
+}
+
+#searchText + #searchSubmit:hover:active {
+ box-shadow: 0 1px 1px hsla(211,79%,6%,.1) inset,
+ 0 0 1px hsla(211,79%,6%,.2) inset;
+ 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;
+ -moz-box-pack: center;
+ width: 100%;
+ background-color: hsla(0,0%,0%,.03);
+ border-top: 1px solid hsla(0,0%,0%,.03);
+ box-shadow: 0 1px 2px hsla(0,0%,0%,.02) inset,
+ 0 -1px 0 hsla(0,0%,100%,.25);
+}
+
+#launcher:not([session]),
+body[narrow] #launcher[session] {
+ display: block; /* display separator and restore button on separate lines */
+ text-align: center;
+ white-space: nowrap; /* prevent navigational buttons from wrapping */
+}
+
+.launchButton {
+ display: -moz-box;
+ -moz-box-orient: vertical;
+ margin: 16px 1px;
+ padding: 14px 6px;
+ min-width: 88px;
+ max-width: 176px;
+ max-height: 85px;
+ vertical-align: top;
+ white-space: normal;
+ background: transparent padding-box;
+ border: 1px solid transparent;
+ border-radius: 2.5px;
+ color: #525c66;
+ font-size: 75%;
+ cursor: pointer;
+ transition-property: background-color, border-color, box-shadow;
+ transition-duration: 150ms;
+}
+
+body[narrow] #launcher[session] > .launchButton {
+ margin: 4px 1px;
+}
+
+.launchButton:hover {
+ background-color: hsla(211,79%,6%,.03);
+ border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2);
+}
+
+.launchButton:hover:active {
+ background-image: linear-gradient(hsla(211,79%,6%,.02), hsla(211,79%,6%,.05));
+ border-color: hsla(210,54%,20%,.2) hsla(210,54%,20%,.23) hsla(210,54%,20%,.25);
+ box-shadow: 0 1px 1px hsla(211,79%,6%,.05) inset,
+ 0 0 1px hsla(211,79%,6%,.1) inset;
+ transition-duration: 0ms;
+}
+
+.launchButton[hidden],
+#launcher:not([session]) > #restorePreviousSessionSeparator,
+#launcher:not([session]) > #restorePreviousSession {
+ display: none;
+}
+
+#restorePreviousSessionSeparator {
+ width: 3px;
+ height: 116px;
+ margin: 0 10px;
+ background-image: linear-gradient(hsla(0,0%,100%,0), hsla(0,0%,100%,.35), hsla(0,0%,100%,0)),
+ linear-gradient(hsla(211,79%,6%,0), hsla(211,79%,6%,.2), hsla(211,79%,6%,0)),
+ linear-gradient(hsla(0,0%,100%,0), hsla(0,0%,100%,.35), hsla(0,0%,100%,0));
+ background-position: left top, center, right bottom;
+ background-size: 1px auto;
+ background-repeat: no-repeat;
+}
+
+body[narrow] #restorePreviousSessionSeparator {
+ margin: 0 auto;
+ width: 512px;
+ height: 3px;
+ background-image: linear-gradient(to right, hsla(0,0%,100%,0), hsla(0,0%,100%,.35), hsla(0,0%,100%,0)),
+ linear-gradient(to right, hsla(211,79%,6%,0), hsla(211,79%,6%,.2), hsla(211,79%,6%,0)),
+ linear-gradient(to right, hsla(0,0%,100%,0), hsla(0,0%,100%,.35), hsla(0,0%,100%,0));
+ background-size: auto 1px;
+}
+
+#restorePreviousSession {
+ max-width: none;
+ font-size: 90%;
+}
+
+body[narrow] #restorePreviousSession {
+ font-size: 80%;
+}
+
+.launchButton::before {
+ display: block;
+ width: 32px;
+ height: 32px;
+ margin: 0 auto 6px;
+ line-height: 0; /* remove extra vertical space due to non-zero font-size */
+}
+
+#downloads::before {
+ content: url("chrome://browser/content/abouthome/downloads.png");
+}
+
+#bookmarks::before {
+ content: url("chrome://browser/content/abouthome/bookmarks.png");
+}
+
+#history::before {
+ content: url("chrome://browser/content/abouthome/history.png");
+}
+
+#apps::before {
+ content: url("chrome://browser/content/abouthome/apps.png");
+}
+
+#addons::before {
+ content: url("chrome://browser/content/abouthome/addons.png");
+}
+
+#sync::before {
+ content: url("chrome://browser/content/abouthome/sync.png");
+}
+
+#settings::before {
+ content: url("chrome://browser/content/abouthome/settings.png");
+}
+
+#restorePreviousSession::before {
+ content: url("chrome://browser/content/abouthome/restore-large.png");
+ height: 48px;
+ width: 48px;
+ display: inline-block; /* display on same line as text label */
+ vertical-align: middle;
+ margin-bottom: 0;
+ -moz-margin-end: 8px;
+}
+
+#restorePreviousSession:-moz-dir(rtl)::before {
+ transform: scaleX(-1);
+}
+
+body[narrow] #restorePreviousSession::before {
+ content: url("chrome://browser/content/abouthome/restore.png");
+ height: 32px;
+ width: 32px;
+}
+
+#aboutMozilla {
+ 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 {
+ opacity: 1;
+}
+
+#aboutMozilla::before {
+ content: url("chrome://browser/content/abouthome/mozilla.png");
+ display: block;
+ position: absolute;
+ top: 12px;
+ right: 12px;
+ width: 69px;
+ height: 19px;
+}
+
+/* [HiDPI]
+ * At resolutions above 1dppx, prefer downscaling the 2x Retina graphics
+ * rather than upscaling the original-size ones (bug 818940).
+ */
+@media not all and (max-resolution: 1dppx) {
+ #brandLogo {
+ 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");
+ }
+
+ #bookmarks::before {
+ content: url("chrome://browser/content/abouthome/bookmarks@2x.png");
+ }
+
+ #history::before {
+ content: url("chrome://browser/content/abouthome/history@2x.png");
+ }
+
+ #apps::before {
+ content: url("chrome://browser/content/abouthome/apps@2x.png");
+ }
+
+ #addons::before {
+ content: url("chrome://browser/content/abouthome/addons@2x.png");
+ }
+
+ #sync::before {
+ content: url("chrome://browser/content/abouthome/sync@2x.png");
+ }
+
+ #settings::before {
+ content: url("chrome://browser/content/abouthome/settings@2x.png");
+ }
+
+ #restorePreviousSession::before {
+ content: url("chrome://browser/content/abouthome/restore-large@2x.png");
+ }
+
+ 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/helpers/DATA/firefox/gnu/abouthome/aboutHome.js b/helpers/DATA/firefox/gnu/abouthome/aboutHome.js
new file mode 100644
index 0000000..d3b4aa9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/aboutHome.js
@@ -0,0 +1,502 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * 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.
+ image: "data:image/png;base64," +
+ "iVBORw0KGgoAAAANSUhEUgAAAIwAAAA4CAYAAAAvmxBdAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ" +
+ "bWFnZVJlYWR5ccllPAAAGrFJREFUeNrtfHt4VdW172+utZOASLJ5+BaIFrUeXkFsa0Fl++gDnznV" +
+ "VlvFxt7aqvUUarXtse3Bau35ak/rZ9XT26NtfOvV6wFET+FYCQEKWqsQIT5RCAgSXnlnrzXneNw/" +
+ "1lphJSSQ8BB7bub3zW+LO3uN+fiNMcf4jTEX0N/6W3/rb/2tv30smtnXB3zmRi2FQakxQNKX3WkW" +
+ "9S/tgW3HLpmQM543A0BWVSHMYGIwOTDxzxrOf3/RQQfMZ2/SLAvKhTFVBGUqKFONH2QAzwOMF38a" +
+ "wHhYZAxWAqhe/iszp3+b970d/sInc57vz/J8L2eMB2MAEYkBQ6DQ3dRw4dq7AUjcP3rAfPZmLWXC" +
+ "LHKoIAcQAUxaB5EaEfc6AEBhjDEwmcx43/fO9HxT4vkReBIAAZgjgodW3NcPnn1sHgD/iHknn+0d" +
+ "6s8XEUhsXXac/34WAAGw8afuT8GZ3X055YeSJcIsG+pMZwFn0UihezRofPt3G54f/0E8cNMN+Myo" +
+ "8jVTCgYd823PLzrPeIBnABiUQ1F+UoWsVOYb33mkoKp/7/dKyT0AGc47X4s0sjBEoLxbBqAQAMfW" +
+ "Rfe38B4BM+VHUkYOs8mi1FrABbK4dcvK73zwp1M3xYPOxANKBqbpCdXNGb0UwPKRF74xpfDQ0t+K" +
+ "54+IvlKoahmAhaO/mv/ZmicG3tqPgT61ZM2dZMQJOYhIdByRM/F3dCCOox4Bc3oEliqyyNoQCPPu" +
+ "sXceKZqRsigu7pwaWBowiRb46+f9Q1V2wl1nDx09/R7jF30x9adNlN8yPx4DHwht+B/cBIBoRqeI" +
+ "E4hE/oshTcB0wNbT6/o/zrhFyohR5ZxmrVWE+fDxdx4puhGAH4OkPe5B6pykeJAc/7cDEMZ/095Y" +
+ "870P339m+BXs2v4kbCFsm9u2vnpJ3bzR7wAo2B/R2v+PjSnyXcRxtOLUSXFxwAFz5i2SZUIVO82S" +
+ "BWye/vLOIwNvjL8OYqCEfXCmJAZPHkC7sK1REbj2+lmbq86qTVmmfuuyN2cTiREWKCvACgml9kDL" +
+ "7HQksehsZmSdA6yVpsa6P38v3swg7m4vN1dGXrThKGP8yS5fP33j/LEvxKDbl2f2A0YFCtkZQDOa" +
+ "PjLAnP4jrmBGjh1AVhG2ttxfX33++vjY2eeNXf/siLUAzgEwMJZrY2vF/Vu/t4BRqCqgCmj07wMV" +
+ "HXUCzJQfUlZE72ICnANcqNj21h8eiK1AX46gXh29KT9H+rd9XxBjYGCgig7QHOgjPgMAKigXQZYp" +
+ "si4uCOc3v35zY2wF9ufGSgxA7fdd9g8ho9ol4P4ojiQWnSUMMANECrJNy1NWYH8eGfsEvJbLv1IK" +
+ "1XIAUwEtA0xplJMwjcaYlTDeShg8dOgjj6/cJxNYfWIWkHJoh5yyjkSZ8RbB89YBZq4/pXafGeuz" +
+ "b9WciXJxo2B2houqgAjABJCLOwFMqFv57+bBxMIAJm1det3avnl1OYCLAeSgWhofaY1QXQSRuYc+" +
+ "/OiD3QLmUzNdqTBKhRVMADsF5beuToXJB90KtFz+lVIVniXOVUAUqjpXVB4WwPjGTPB8/0zjeTnj" +
+ "ezl43szmKy6vNkDF4MeeXNc3oJyUhfAMkJsJkSxUVrLos6o6z/O8Ucb3phrPzyHKeVTwkpPXseg3" +
+ "Cqe+1SfG+swfaw6KGTAoJ5eyGF3IBeEIJB2AcXxb0FI/L45uFQBMGiu6Z3ai9eqrclBUClFWVatV" +
+ "5GERNT5wEVQnQLUcIuVNX75kFjn60rA5c1d0AoywlkcxfdwZ2LSgbOmBZAv70povu7RcyFUqcZYd" +
+ "Pbxix44fnLv8pbYUOWh+P3ZM9uJRo34xoLDgq8b3YTxvqhqsaPzyJTdmn36msjdyqPqkMhWqBFGZ" +
+ "MtV8uDX4zMjp2zemyEoPgGn4zyOvGzy48A54GcD3Sz1jFrqqE+4uOOvdmb0ASlYEs5mQE9afUdhy" +
+ "0yv3lHzwya/8ZcjgI0+5yssU3QKYkgQ4Ivp60LL1n8kBQfOWuvdnj6uLldgHQKoKxU7HV/eg2y1X" +
+ "XXmXEs1U0ZVb29o//4k5c5P5eQB+s+68aVeUFBTcCxUoS6kRWfjhueecc9SfX3ytA9QTr7eVACqY" +
+ "FDYEwnbB2qcHHg6gLY6ODhpomi77coUyVaojhKH9+ZHzF/wqXiztEg34APxNX/jCvQOLCi83fpy8" +
+ "UsCJXHLYnGdn785S0uKTyyBUBXJZcW5x4bSN56ciyLQcD4Bf/+ThVwwbUvRb+JkoswqAWX5b9Lm1" +
+ "M3uSM/UnUiaCKiZk2blvvnxX0ePxuBNAmpMur51wyLBPzjVeBBoVwIXBk6vuP+SG+LkcuwkWAA96" +
+ "/JjZKnKxkACkkFb5Nztz220xX9bJlWi+6opKFalQlpqlmzZNu6B6SaJ0knKJ/DW5qd8p8TO3x6AB" +
+ "qza1EE06cdmy9wDAY5LjmBTMkQnUnZ42H0ywNF52aU6FK4UY5NySI+cv+E3MCnMM5HyqtwFoO3rB" +
+ "gmuDMFjGjiCOIEQwzH9c+7lzju+JTaYlJ2ehUqXMWWFqeurFxqsAFMVf25Ss9kTOEZdvebClJbxT" +
+ "yUGZoEzwlL/b9tzRX+pOztSfSBZApSqyIrL45buKnkaUJEzLCN5+csxr+ab6fyILkI2OIZYBlx9/" +
+ "2bYvpLgw2+EqKLKdwoceVKJp+tfuEpYKZcaW1tZbLqheEsbj3GV+oxdV3x0GwQZrHUIiWKIST3Vm" +
+ "DG54zFrKrBBWiGgSyx9Uv6Xh0n/MKlGlOII4h80trQ+kuJt8HGklZHg6FZF/Y/uOb7O1YOvAzkGt" +
+ "Kxmoehe6SYNEpkErwZIFC4I2fuLKf2tLtDOPzumPhA6wAPJDLt1yuzjaAEcAMUCMApXfvPP7IcO6" +
+ "gkYFs4RRpgy49qanUsAPu/T8W48e/YwL6S/kYtBYwM8U/yu6KVlQUShr9CkKyK7b1vDVy0qVeaYy" +
+ "gaxbdeK85/8a/z7sYR3zgXM1gXUInEPoCEw8PR6z8YQxaidQPh6RrgrPEOZS4chKjFuydEEKFD1x" +
+ "QgrAnfO3V98Jw/B5dhFgmByU+MK/nnrq6K6gcQtPyqlIubJAibCxPv/fsVVNgCI9yGEAQdBq71NH" +
+ "UEdQIoBo5PBBeklazuQfSpYFM0UAFsDmd2yMf9+1XkUT3otc8AiRwpFChCBCI0detGbSLtYr5uw6" +
+ "tk26XctZwgxhRt65ZSmr1t389M1Jk85wzKcHRAiJkCfasDnI/0sMGN+jlLMrAigMhp0+f+TBBIw4" +
+ "milEYOcQBHZZAoZeEIgKgIIgeJbD2MqEFhxaDAFmdAWMisxQFigzlAUnX9e4rA9yeHuTna3koBQB" +
+ "RogxwOPvxNbQAAA7VHQEFKSQKEFIu4lA5d3HiiuFNB4XQZlhUHBK11QO0oRdD7ouROVCkeJZG7ak" +
+ "/KBOYHlz4sTy1WVlVY5oYego2+bs82+3tFw6YcVrp01dteqpxNfyhKQuGlxCMSsKBh570ABT/8XP" +
+ "5dhRVpyDWAd2Ns0O9yrhWdfcMpvCEByEoNCCwhBgvgBdM+PM5TH5FPW+1ZLo8de2viehe12dhVoH" +
+ "OAtDPO61O4o+kYCTnE5wVuGsxlzKHul7BUDKdomKgwpB2QHAyNiP2Dl+0Z2WRXZ9YP0F55WJczvX" +
+ "0jp09U3fLiurWD1+/NqQaHZIVNbu3O1vt7aM+fSqVRWXvPvu0pRldwAkQ5brjO+NMh0kgMIvGjYZ" +
+ "wIKETPxIrYt1U5M8iThKJil9yZGc++ab298dP36Jb8wZohqhQHRErKEeAA6fG5FT5yIlYYI6tzfO" +
+ "vtiQni3MYDw0ChqEgUMyejyAdwGwDeW4ZI9FAGQOmwzgv/cERmZbDXhnKBNUGMJkUhGVduSSJJ1P" +
+ "6rw8HIalJo7ilBkchgCgL48fVzLceDc4kZnWUdap1AQi10x+660n4jXyk1M7ZXEZgHhMUkMO4Njp" +
+ "hQGMf8h56Fx++ZE1a+1xZC2Szjs3sk9uUEhUbSMvP3LeyOGZ0tKJiearo1J1DHVRPYmS7JUcG2g1" +
+ "pxxUsooBnpmQWAOb10YbKGygcKFCZOC0XqxrRKokCBQG5euX77In2k1P+2hhWEZBAAoCuCCEcW7E" +
+ "2xMn/m6oYo0jyjnmuc3Off6UN96YMvmtt5LILSmQ61r3xAA0I+xqPBiIejAd1f7e2MPPfvm4LQs/" +
+ "89a+bP6nZuSzfsaU+T7g+UBixYQVRFGS01kFO22srRy0EgA4CEvFRHS3MANMY/fGbybmlQqAFSBV" +
+ "sCp8kWwCGA5dqefFShnnRV77ecHYU37iXuqLoB0tsuIo34v3NfJR1GlJsrnOuiXGy1y8k+rwxh57" +
+ "3srSD/6rbLdra7yMqgjUCGAULR8uWr0LJPYAGApCeCbKNygLPKIxJ65YOSU+YpLUUCYGiqBzQVy3" +
+ "Ft1zbevnJl60UARqACgcVDo9ZZr63Mqua68QxlpmrWJC1FmrmLSKCFVktcpZrbKhzg4D26E5Lgjg" +
+ "8vnoMwwh1hU/dvTRo/qcDyJqcESw5Dp6o3XNHVrqLDSubAdFjuXwwWZcX+Wc9APboKxQUoiLurXa" +
+ "IYfCpjlCDsoxZ6OCouLRt+xpbY3nA8aDMR6E2+9vffOWxl02cQ+Bbdjevt7l83D5ABRaKNHYO484" +
+ "YmgMkoJ4jElCOL8Lz9NN87YumrRDxc2DElQZKgIVhZcZcO1hZ74wtK/H0thvtuXGXdM2S0S/ziQ1" +
+ "FPJiG7pHwvbgDhtKnQ0VNhCEeUHQLmiuf2fymieGvJGY8DCfX+yCEC5xWIlwtO+P6+s4VESJGS4+" +
+ "liwxKjZ/2FGRZvPhYgktxEZdHWOAr2P34ihWIQWTgJ2CnWJbo9Ymz1g/5+h1QsF9wgKJ19Z4hV87" +
+ "4fKNE3cnx8v4V8H4UOjqhvce+zW6qdWVlOvSjQsDlw/WUT4A5QNQGIJDizMPHXR+CiRBb4GSzlYr" +
+ "26Z7vYKSC42nUOPBqA9VU1I0ZOJPEYWj1NvVW/3AoEUAFgO4IzZ1hYk2jf9WUw7IjCIXHUVhXrFp" +
+ "/sQtKZPIoXXr/PjoSkZeoHo6gP/bFyeciECqcHG3IrXp37a2SF3xQNPxRAXgq5nS1bHsDWCYALYA" +
+ "u+h0W/impI8Pad9ec/vAoWVTjV84Nsn5FAwcvmDMN5rOqf1jyatdHzjuGjvThloKYH3b5qVXt775" +
+ "44ZuN1QEKknF3a6ImfDee4tWjBrV6R5Qoeq1AP6Avaxx8gDolhdPXAh2qzQmZFQ4ZhALrj/mvLpT" +
+ "+qhxya0BP5VVZQBkA6jNR0AJ2xUUcjKGjsx4k3PVYUwaJU6rJ3reLiHlHppjBjF3fLYSzU/noEZ8" +
+ "3611VusoVJBVsFWAdezim/3jemSFe+SNIsvCpAhCXf7TBZI+PnTr4nO2t2xcME3ZroYKIouEEqDo" +
+ "xfHfav/GxOttFgBOucGWll0XVqrqXYDWNLz3aG7bsovWp4i2TvkhScLqNBezq/M/zxLBxV2Yx/75" +
+ "yCPP6usc04CJ+B3bcLMwQTiK+0UIwgz1ip8+4pyaYX0x0SnWMkjnYGygkm9nBO0MGzoI2TTDyQBw" +
+ "7ubNawPmeZYZNt5wZhrxX8OHX9yXSTJzGcVgIWasbs8/hc7XRzXM670cg0Vs5H+MHm6u74ucrb/K" +
+ "lAlFPoySoqFFn+rm+OCGV762df2cYWe4fP0M5qDWhoowRIm1/h+s1YZx3wrVOV1LDhXMaGzfXntF" +
+ "46vXtMQRS/clsqRRT9SNd0GMBo6edRStZbKeg4D//ciQIcP2CTDbqsdVKQePq1JMFkXxv4qO9AaM" +
+ "fPGoaeuG9kXp0LkU0wGgMFC1gYAdAeyg0m3IrE3W3mtTvodjRpHq9X3xL4h5Qsq63P/z9ra6LqSc" +
+ "vvmBPkwOTex2lnf4wNee/47fa99NGGVJ8Zl1qP3UPfwkdr15mDDV+Y3Pf+Kh9c9kz9pee89J7dve" +
+ "vaRt+7qLbVv47y5UUKggp3BB/okNz0/aHI8332OaIgELxWDpptQtt6X+Qcu03nVYGQYxjxzl+7/e" +
+ "GyvjdYrCtv31JiW7QTjy6qWj83jF4AeP/MLaodiHRtZBXAihEEIWkq4eSgGmvKGhqpX5d1YEVhiW" +
+ "BaI6Zf6QITN7s5ELhw4tZZavkwhIZMOC1rZfo5s64nPv4+1NzXot2/hYiqKckglH4/7eRojCOosp" +
+ "St6u2ijfS1Hv3I0SdVy5aam9ecumBeOqN8w7aRkxSlMVdRDmRHa4m5xWPKPEusUA6maIrcy/cCKw" +
+ "InASKaCoXrlo2LAH+xpMpAEjLauu2ObaNnxVmZqUHaI8SaR+KnIhTPHCo6ZtOn6vk4qUPNNGnV2P" +
+ "J0ptENweMq92zHBMcMwwIrfMLS6etKdJEnMlCYOZm9YE4dUPkWvsIUckJ/+SZwd5PCEOEBc5rh7j" +
+ "grqf+VfvSc7mO/xZSihVAra3YMY/PqqrUhZVe7C8yRHTBqAVQJuQN5idgJ2ASQAz4PJjptWevKc0" +
+ "RZQ0TQATRWDd/dmFDQ2VeaLH0z4dRVTK9EXZ7IqFJSXH7W6eLw0blntp2NAydGOSqPGVs/5mW9Zc" +
+ "JGKbRSxELIRDCFuIuAmiBa8eMW37rcdc1JDtM+3PYdSp43k9/ulPgmDrsnz+vFBktRWBZYEVKSlU" +
+ "feH5wYPP7u5Hfy4uzi4oLq50IjkSaXrf2vIfBPnV6PlKiwKg0XfyNe2BPkmJ8+oUGeh/bLjNu7En" +
+ "0Gy+w5sppLcyKRra9IZJ98hTvciop9MPSSFUwGTnEjHICsgpyKHYHzjquWMvrJ+wewUENPFjCIAx" +
+ "k3uStyIMbw5FVieWJvJpBE5kgqq+X1VcPGdRcfHMxSUluSUlJbmlUZ+1tKRkLRGVnrZ9Rw12rSLt" +
+ "sDpFg8vmfbpw0HH3wcuMMSaiao2XAbwMjPFhPL/ReN6DfsY8tHHekN0WXR929vqsCpWruFshPEqF" +
+ "o3IyADuWTxgea1rYTbRVeEMmc+SnCwp+OcB4l3kmLq0D4BnzkA/MMUBjvDMXC1DBqlkCFr9N9E//" +
+ "HIZpPyDsQVuTFwsMfP273k8GFeLbvo9izwe8DGA8VMPgIc/D2piALlPFDGWUMqNuazOun/RbeQU7" +
+ "L/zl0cfC+SPOXjG84NBRawCvJNoSE7PiBgr5Xx/MKf7jLnzIbUPKlHVF5C11KgJfD9+shY8Vxjd3" +
+ "0780rEvP8bFDDvnVQGO+lU5MeTDwzM5aTbOzNyrw/XNbWx9JFLknk+sjqjobUHJq9XS/cNj3jZcZ" +
+ "Ac9PwBIDyAeMD2O8RhhvpTFYqYpGqMQOM2UhlFOhsvjfgNJ6ofxyoZaXbHPt8mDNjDU9ACYBbyGA" +
+ "AT/KZEZ/MpO5qciYyRlgROeJGSh0nQCL21Ufmx4EL8dMpqScRt4DFVAAYMCtORx+0Rhz7aFF+GJB" +
+ "BmNM/JKklGo1KlBtHZ474U79P9hZOZcQYb0unD/mwu05qADCZwE4C8Y7I3kTk4kFx+mUuzfMKf5e" +
+ "+rn+rUMq4PR4hFII0gw0xpdvGAWGoDqHf9m8IuV8m2Qtf1pQMPok37+50JhpHlC8EzwRcAzwOqs+" +
+ "Vkv06I+da04nInd3RvuxgCIAhcUTF5zvFQ79oucP+Cy8zIjE6qQnt5Pviu5IqAogVKNCNSrBUte6" +
+ "blnrqi/Vo3O9rI3Pc7cbP6sgGQcAf7rvl3zK908uBKjAGK5jrrmNKKHj/RS3E6L3V2USLUzkZAB4" +
+ "i75pTivwwQMyoKYQ685+QOtScvzUHPbIlJ54ZVsuDPTrZDmnQqUQggo1qkoNRDyFeJ6XGQfjF0fW" +
+ "3O9YWxW6adNzw36Dzm/JKEJ0k7QgtfiSygd1vSrkdZ3jlb6fneT7Y+MN1xrmVX9gbkw9q1MdsemF" +
+ "U5wkpwqSRSw49gfZAcPPHOsVlIww/sBjjPEVnqfGZEQlWKVCjWK31TW/dv56pCruU126TGxPl+US" +
+ "IrAgNQ7TQ+pNukQqfalLNimApvMt6CZMTvsiu3VOJ17XnrNWZ9m85oK8Qmz4sFB+CeXrF29dfOqG" +
+ "1PwKs6fOKyvKjrnb8wrHGD8TWfCOEoX85zb96dgXY9leN2NM+y3SJZG4u7XsSldIykFPz09NHxbR" +
+ "T2U3M11AsKf8aRqtnBqQoG91oWkGOS0/XaQo2Pf3u5mUDK9LukD7Mv5Tv9teSQ4VzipsINUtW9Zc" +
+ "t/mFiRu7WbcOuQNP+MXQ4hGX3mEKBl1mjB9bbwAqSz6cf+TZ8Qaabta/u6hM92ItpZs5dvyor5R/" +
+ "dwvp9QAa6eFzfxRlpVMk2mXh93czeyPn1Bn5ShWtYAJsyEve+OPgC7Hzmgx3USDtejQedlbtDX7h" +
+ "0Ns6HChV5LcvP7rpb1+qx/690dHrtewL05c2c7ZLtrM91fOpDGjXyvT9+WYBPQAg3NPcey1n4vVt" +
+ "FUJSIfGNjJZNy2ekkqzpazIJOefSoTaA9q1VY+5Wbvs9NAoYVBkFh5Sesi9lJ/u6lt5+WETpoi2M" +
+ "PpZU/k9szmKGtVGRWBjQ6g3zP78pxfSGKb+tJ4LPAsi31S/+uXCUlVZmCIc+DlI15L4Cpr/1FA1d" +
+ "0VLqAilzgcCGChdQc5eoTXqpkNS66hv1YLsUElURiG1sOZj7lunf3v3fwlBKjRfX9EjEHKcscV98" +
+ "D40zRKIqgEpz4yvTVnfjU/VbmL/r4yhwTTbPCNsZNi8g50/OnvbCsXu5wQqVURCBuOb7seu98n7A" +
+ "/L23Tc8NX8mW6pL73UoOhYPH/GJv/I7Dzlqbg5pRUG1q++A//+Ng+4f9gDlATVzLHfErZiHioKrn" +
+ "H37uhgeG597sdYnIYeeszypQqQawre9dHNbd0Yj9/5KnfsB8DJpuXXj8Q+ryj3dUZglD1Uz3MsWv" +
+ "HX7uh1fv6QGHn7upAmrWQpEV2zSt+bVptamw+6C9VaP/hcoHrvkABgydUjPLywy6Oboh6HW6PgLj" +
+ "LYqStqYRQHKDMQflMhXOQrnata27tvGvufrEn8ZBfmdPP2AO7NpmAAw85B8qTyjKlt1svAHTjPGL" +
+ "k4w0jAcTAyllnBoh9Kxw/tEdS8cuT0WyH4vX1PYD5qMBzQDE2eFDxz09zsscWuwVHX6a8YwaFAiM" +
+ "NAkHr4vdUdf82rQN6JwnSl4N4vAxeKdxP2A+mjXuKTvcXcY9TdOnyxPk4zKZ/vbRAqe75C3QfZZY" +
+ "0P/y6/7299z+H4QrdGsoib8JAAAAAElFTkSuQmCC"
+ }
+};
+
+// 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 = [ "" ];
+
+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) {
+ for (let mutation of mutations) {
+ if (mutation.attributeName == "searchEngineName") {
+ setupSearchEngine();
+ if (!gInitialized) {
+// ensureSnippetsMapThen(loadSnippets);
+ gInitialized = true;
+ }
+ return;
+ }
+ }
+});
+
+window.addEventListener("pageshow", function () {
+ // Delay search engine setup, cause browser.js::BrowserOnAboutPageLoad runs
+ // later and may use asynchronous getters.
+ window.gObserver.observe(document.documentElement, { attributes: true });
+ fitToWidth();
+ window.addEventListener("resize", fitToWidth);
+
+ // Ask chrome to update snippets.
+ var event = new CustomEvent("AboutHomeLoad", {bubbles:true});
+ document.dispatchEvent(event);
+});
+
+window.addEventListener("pagehide", function() {
+ window.gObserver.disconnect();
+ 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)
+{
+return;
+ 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;
+ let engineName = document.documentElement.getAttribute("searchEngineName");
+
+ if (engineName && searchTerms.length > 0) {
+ // Send an event that will perform a search and Firefox Health Report will
+ // record that a search from about:home has occurred.
+ let eventData = JSON.stringify({
+ engineName: engineName,
+ searchTerms: searchTerms
+ });
+ let event = new CustomEvent("AboutHomeSearchEvent", {detail: eventData});
+ document.dispatchEvent(event);
+ }
+
+ aEvent.preventDefault();
+}
+
+
+function setupSearchEngine()
+{
+ // The "autofocus" attribute doesn't focus the form element
+ // immediately when the element is first drawn, so the
+ // attribute is also used for styling when the page first loads.
+ let searchText = document.getElementById("searchText");
+ searchText.addEventListener("blur", function searchText_onBlur() {
+ searchText.removeEventListener("blur", searchText_onBlur);
+ searchText.removeAttribute("autofocus");
+ });
+
+ let searchEngineName = document.documentElement.getAttribute("searchEngineName");
+ let searchEngineInfo = SEARCH_ENGINES[searchEngineName];
+ let logoElt = document.getElementById("searchEngineLogo");
+
+ // Add search engine logo.
+ if (searchEngineInfo && searchEngineInfo.image) {
+ logoElt.parentNode.hidden = false;
+ logoElt.src = searchEngineInfo.image;
+ logoElt.alt = searchEngineName;
+ searchText.placeholder = "";
+ }
+ else {
+ logoElt.parentNode.hidden = true;
+ searchText.placeholder = searchEngineName;
+ }
+
+}
+
+/**
+ * Inform the test harness that we're done loading the page.
+ */
+function loadSucceeded()
+{
+ var event = new CustomEvent("AboutHomeLoadSnippetsSucceeded", {bubbles:true});
+ document.dispatchEvent(event);
+}
+
+/**
+ * Update the local snippets from the remote storage, then show them through
+ * showSnippets.
+ */
+function loadSnippets()
+{
+return;
+ 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()
+{
+return;
+ 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()
+{
+return;
+ // 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");
+ } else if (document.body.hasAttribute("narrow")) {
+ document.body.removeAttribute("narrow");
+ fitToWidth();
+ }
+}
diff --git a/helpers/DATA/firefox/gnu/abouthome/aboutHome.xhtml b/helpers/DATA/firefox/gnu/abouthome/aboutHome.xhtml
new file mode 100644
index 0000000..21e708f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/aboutHome.xhtml
@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE html [
+ <!ENTITY % htmlDTD
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "DTD/xhtml1-strict.dtd">
+ %htmlDTD;
+ <!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd">
+ %globalDTD;
+ <!ENTITY % aboutHomeDTD SYSTEM "chrome://browser/locale/aboutHome.dtd">
+ %aboutHomeDTD;
+ <!ENTITY % browserDTD SYSTEM "chrome://browser/locale/browser.dtd" >
+ %browserDTD;
+]>
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>&abouthome.pageTitle;</title>
+
+ <link rel="icon" type="image/png" id="favicon"
+ href="chrome://branding/content/icon32.png"/>
+ <link rel="stylesheet" type="text/css" media="all"
+ href="chrome://browser/content/abouthome/aboutHome.css"/>
+
+<style>
+
+label{
+position:relative;
+bottom:2px;
+left:2px;
+}
+
+#addonsform form{
+position:relative;
+left:10px;
+}
+
+em {
+color:#600
+}
+
+a{
+color:#004998
+}
+
+#addonsform{
+background-color:#fff;
+font-size:14px;
+padding:10px 30px 20px 30px;
+border-radius: 10px;
+box-shadow: 0px 0px 5px #888888;
+}
+
+.block-side-margin {
+ min-width: 16px;
+ -moz-box-flex: 1;
+}
+
+#block-horizontal-margin {
+ display: -moz-box;
+ -moz-box-flex: 1;
+}
+
+ul li {
+list-style:none;
+background:#ddd;
+border-radius:3px;
+padding:3px 5px 3px 5px;
+margin:5px;
+box-shadow: 0px 2px 0 #ccc ;
+float:left;
+}
+
+ul li a{
+font-weight:bold;
+color:#666;
+text-shadow:0px 1px 0px #fff;
+}
+
+#footer{
+min-height:100px;
+}
+
+</style>
+
+ </head>
+
+ <body dir="&locale.dir;" onload="prepare();">
+
+
+ <div class="spacer"/>
+ <div id="topSection">
+ <img src="chrome://branding/content/about-logo.png"/>
+
+ <div id="searchContainer">
+ <form name="searchForm" id="searchForm" action="https://duckduckgo.com/html/">
+ <input type="text" name="q" value="" id="searchText" maxlength="256"
+ autofocus="autofocus"/>
+ <input id="searchSubmit" type="submit" value="&abouthome.searchEngineButton.label;"/>
+ </form>
+ </div>
+
+ </div>
+
+ <div class="spacer"/>
+
+ </body>
+</html>
+
diff --git a/helpers/DATA/firefox/gnu/abouthome/addons.png b/helpers/DATA/firefox/gnu/abouthome/addons.png
new file mode 100644
index 0000000..41519ce
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/addons.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/addons@2x.png b/helpers/DATA/firefox/gnu/abouthome/addons@2x.png
new file mode 100644
index 0000000..d4d04ee
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/addons@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/apps.png b/helpers/DATA/firefox/gnu/abouthome/apps.png
new file mode 100644
index 0000000..79fc95d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/apps.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/apps@2x.png b/helpers/DATA/firefox/gnu/abouthome/apps@2x.png
new file mode 100644
index 0000000..cbe7a6d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/apps@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/bookmarks.png b/helpers/DATA/firefox/gnu/abouthome/bookmarks.png
new file mode 100644
index 0000000..5c7e194
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/bookmarks.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/bookmarks@2x.png b/helpers/DATA/firefox/gnu/abouthome/bookmarks@2x.png
new file mode 100644
index 0000000..7ede007
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/bookmarks@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/downloads.png b/helpers/DATA/firefox/gnu/abouthome/downloads.png
new file mode 100644
index 0000000..3d4d10e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/downloads.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/downloads@2x.png b/helpers/DATA/firefox/gnu/abouthome/downloads@2x.png
new file mode 100644
index 0000000..d384a22
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/downloads@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/history.png b/helpers/DATA/firefox/gnu/abouthome/history.png
new file mode 100644
index 0000000..ae742b1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/history.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/history@2x.png b/helpers/DATA/firefox/gnu/abouthome/history@2x.png
new file mode 100644
index 0000000..696902e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/history@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/restore-large.png b/helpers/DATA/firefox/gnu/abouthome/restore-large.png
new file mode 100644
index 0000000..ef593e6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/restore-large.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/restore-large@2x.png b/helpers/DATA/firefox/gnu/abouthome/restore-large@2x.png
new file mode 100644
index 0000000..d5c71d0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/restore-large@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/restore.png b/helpers/DATA/firefox/gnu/abouthome/restore.png
new file mode 100644
index 0000000..5c3d6f4
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/restore.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/restore@2x.png b/helpers/DATA/firefox/gnu/abouthome/restore@2x.png
new file mode 100644
index 0000000..5acb630
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/restore@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/settings.png b/helpers/DATA/firefox/gnu/abouthome/settings.png
new file mode 100644
index 0000000..4b0c309
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/settings.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/settings@2x.png b/helpers/DATA/firefox/gnu/abouthome/settings@2x.png
new file mode 100644
index 0000000..c77cb9a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/settings@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/snippet1.png b/helpers/DATA/firefox/gnu/abouthome/snippet1.png
new file mode 100644
index 0000000..ce2ec55
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/snippet1.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/snippet1@2x.png b/helpers/DATA/firefox/gnu/abouthome/snippet1@2x.png
new file mode 100644
index 0000000..f57cd0a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/snippet1@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/snippet2.png b/helpers/DATA/firefox/gnu/abouthome/snippet2.png
new file mode 100644
index 0000000..e0724fb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/snippet2.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/snippet2@2x.png b/helpers/DATA/firefox/gnu/abouthome/snippet2@2x.png
new file mode 100644
index 0000000..40577f5
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/snippet2@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/sync.png b/helpers/DATA/firefox/gnu/abouthome/sync.png
new file mode 100644
index 0000000..11e40cc
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/sync.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/abouthome/sync@2x.png b/helpers/DATA/firefox/gnu/abouthome/sync@2x.png
new file mode 100644
index 0000000..6354f5b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/abouthome/sync@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/bookmarks.html.in b/helpers/DATA/firefox/gnu/bookmarks.html.in
new file mode 100644
index 0000000..e8460a4
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/bookmarks.html.in
@@ -0,0 +1,18 @@
+<!DOCTYPE NETSCAPE-Bookmark-file-1>
+<!-- This is an automatically generated file.
+ It will be read and overwritten.
+ DO NOT EDIT! -->
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
+<TITLE>Bookmarks</TITLE>
+<H1>Bookmarks Menu</H1>
+
+<DL><p>
+ <DT><H3 ADD_DATE="1245542278" LAST_MODIFIED="1245543070" PERSONAL_TOOLBAR_FOLDER="true">Bookmarks Toolbar</H3>
+<DD>Add bookmarks to this folder to see them displayed on the Bookmarks Toolbar
+ <DL><p>
+ <HR>
+ <DT><A HREF="http://www.gnu.org/" ADD_DATE="1245542746" LAST_MODIFIED="1245542763" ICON_URI="http://www.gnu.org/graphics/gnu-head-mini.png" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAGFBMVEVFRUV+fn6mpqa/v7/Ozs7Y2Njg4OD8/Pwuhn+TAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAALEQAACxEBf2RfkQAAAAd0SU1FB9MBDhQ6Gd8s57cAAAEkSURBVHicXdFNc4JADAbgoP0Bi4d6dcGBMzp2z2rrnjulcsavnKuQ9+83K37vDAN5yIZsILws0uv3i7ugLTnAwpjBOsTLOE4VmmKQTFYBioGNKkI5drcCReRItmNAyinSCjianJo6A/aGRtRjtPadpB5CRkQRUaYPGbXW4UgKMfXQxDnJPIeJ0qyOrclrLXoqou8+5p7HM9EkT/JtyEsqB2QYnRv7sT2ArRPLf0kWOp1sA3hYPq3Oh/t0EAjjVIG703II9awr3l3BhxAf5foMLaaasPEZqm5A+0RzGCmuIKJbWi284csIJbzykBQ3aIADsL2CFtBWpovhA1Td7Q6NzqZ/B+38APG3HxU+sYO4B9Akt+AnqGbp/gmwTN6eAWt+gcv6B4rivVin0bWbAAAAAElFTkSuQmCC">GNU&#39;s not UNIX!</A>
+ <DT><A FEEDURL="http://planet.gnu.org/atom.xml" HREF="http://planet.gnu.org/">GNU Planet</A>
+ <DT><A HREF="http://www.fsf.org/" ADD_DATE="1245542771" LAST_MODIFIED="1245542780" ICON_URI="http://www.fsf.org/favicon.ico" 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>
+ </DL><p>
+</DL><p>
diff --git a/helpers/DATA/firefox/gnu/branding/Makefile.in b/helpers/DATA/firefox/gnu/branding/Makefile.in
new file mode 100644
index 0000000..9cc8935
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/Makefile.in
@@ -0,0 +1,67 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+include $(topsrcdir)/config/config.mk
+
+PREF_JS_EXPORTS = $(srcdir)/pref/icecat-branding.js
+
+# On Windows only do this step for browser, skip for metro.
+ifeq ($(MOZ_WIDGET_TOOLKIT) $(DIST_SUBDIR),windows browser)
+BRANDING_FILES := \
+ icecat.ico \
+ document.ico \
+ branding.nsi \
+ appname.bmp \
+ bgintro.bmp \
+ bgplain.bmp \
+ clock.bmp \
+ particles.bmp \
+ pencil.bmp \
+ pencil-rtl.bmp \
+ wizHeader.bmp \
+ wizHeaderRTL.bmp \
+ wizWatermark.bmp \
+ newwindow.ico \
+ newtab.ico \
+ pbmode.ico \
+ $(NULL)
+endif
+
+ifeq ($(MOZ_WIDGET_TOOLKIT),cocoa)
+BRANDING_FILES := \
+ background.png \
+ icecat.icns \
+ disk.icns \
+ document.icns \
+ dsstore \
+ $(NULL)
+endif
+
+ifdef MOZ_WIDGET_GTK
+BRANDING_FILES := \
+ default16.png \
+ default32.png \
+ default48.png \
+ mozicon128.png \
+ $(NULL)
+endif
+
+ifeq ($(OS_ARCH),OS2)
+BRANDING_FILES := \
+ icecat-os2.ico \
+ document-os2.ico \
+ $(NULL)
+endif
+
+BRANDING_DEST := $(DIST)/branding
+BRANDING_TARGET := export
+INSTALL_TARGETS += BRANDING
+
+ifeq ($(MOZ_WIDGET_TOOLKIT) $(DIST_SUBDIR),windows metro)
+VISUALMANIFEST := VisualElementsManifest.xml
+VISUALMANIFEST_FLAGS := -Fsubstitution -DMOZ_APP_DISPLAYNAME=${MOZ_APP_DISPLAYNAME}
+VISUALMANIFEST_PATH := $(DIST)/bin
+PP_TARGETS += VISUALMANIFEST
+endif
+
diff --git a/helpers/DATA/firefox/gnu/branding/VisualElementsManifest.xml b/helpers/DATA/firefox/gnu/branding/VisualElementsManifest.xml
new file mode 100644
index 0000000..f763409
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/VisualElementsManifest.xml
@@ -0,0 +1,16 @@
+<Application
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <VisualElements
+ DisplayName="@MOZ_APP_DISPLAYNAME@"
+ Logo="tileresources\VisualElements_logo.png"
+ SmallLogo="tileresources\VisualElements_smalllogo.png"
+ ForegroundText="light"
+ BackgroundColor="#0a1833">
+ <DefaultTile
+ ShortName="@MOZ_APP_DISPLAYNAME@"
+ ShowName="allLogos"
+ />
+ <SplashScreen
+ Image="tileresources\VisualElements_splashscreen.png" />
+ </VisualElements>
+</Application>
diff --git a/helpers/DATA/firefox/gnu/branding/appname.bmp b/helpers/DATA/firefox/gnu/branding/appname.bmp
new file mode 100644
index 0000000..69d9e0f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/appname.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/background.png b/helpers/DATA/firefox/gnu/branding/background.png
new file mode 100644
index 0000000..e52f31d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/background.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/bgintro.bmp b/helpers/DATA/firefox/gnu/branding/bgintro.bmp
new file mode 100644
index 0000000..14214ce
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/bgintro.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/bgplain.bmp b/helpers/DATA/firefox/gnu/branding/bgplain.bmp
new file mode 100644
index 0000000..c82f896
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/bgplain.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/branding.nsi b/helpers/DATA/firefox/gnu/branding/branding.nsi
new file mode 100644
index 0000000..9b6ab6a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/branding.nsi
@@ -0,0 +1,50 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# NSIS branding defines for official release builds.
+# The nightly build branding.nsi is located in browser/installer/windows/nsis/
+# The unofficial build branding.nsi is located in browser/branding/unofficial/
+
+# BrandFullNameInternal is used for some registry and file system values
+# instead of BrandFullName and typically should not be modified.
+!define BrandFullNameInternal "IceCat"
+!define CompanyName "GNU"
+!define URLInfoAbout "http://www.gnu.org/software/gnuzilla/"
+!define URLUpdateInfo "http://www.gnu.org/software/gnuzilla/"
+
+!define URLStubDownload "http://www.gnu.org/software/gnuzilla/"
+!define URLManualDownload "http://ftp.gnu.org/gnu/gnuzilla/"
+
+; The OFFICIAL define is a workaround to support different urls for Release and
+; Beta since they share the same branding when building with other branches that
+; set the update channel to beta.
+!define OFFICIAL
+!define Channel "release"
+
+# The installer's certificate name and issuer expected by the stub installer
+!define CertNameDownload "Mozilla Corporation"
+!define CertIssuerDownload "DigiCert Assured ID Code Signing CA-1"
+
+# Dialog units are used so the UI displays correctly with the system's DPI
+# settings.
+# The dialog units for the bitmap's dimensions should match exactly with the
+# bitmap's width and height in pixels.
+!define APPNAME_BMP_WIDTH_DU "134u"
+!define APPNAME_BMP_HEIGHT_DU "36u"
+!define INTRO_BLURB_WIDTH_DU "258u"
+!define INTRO_BLURB_EDGE_DU "170u"
+!define INTRO_BLURB_LTR_TOP_DU "20u"
+!define INTRO_BLURB_RTL_TOP_DU "12u"
+
+# UI Colors that can be customized for each channel
+!define FOOTER_CONTROL_TEXT_COLOR_NORMAL 0x000000
+!define FOOTER_CONTROL_TEXT_COLOR_FADED 0x666666
+!define FOOTER_BKGRD_COLOR 0xFFFFFF
+!define INTRO_BLURB_TEXT_COLOR 0x666666
+!define OPTIONS_TEXT_COLOR_NORMAL 0x000000
+!define OPTIONS_TEXT_COLOR_FADED 0x666666
+!define OPTIONS_BKGRD_COLOR 0xF0F0F0
+!define INSTALL_BLURB_TEXT_COLOR 0x666666
+!define INSTALL_PROGRESS_TEXT_COLOR_NORMAL 0x666666
+!define INSTALL_PROGRESS_TEXT_COLOR_FADED 0x999999
diff --git a/helpers/DATA/firefox/gnu/branding/clock.bmp b/helpers/DATA/firefox/gnu/branding/clock.bmp
new file mode 100644
index 0000000..c74398e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/clock.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/configure.sh b/helpers/DATA/firefox/gnu/branding/configure.sh
new file mode 100644
index 0000000..7481c2c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/configure.sh
@@ -0,0 +1,5 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+MOZ_APP_DISPLAYNAME=IceCat
diff --git a/helpers/DATA/firefox/gnu/branding/content/Makefile.in b/helpers/DATA/firefox/gnu/branding/content/Makefile.in
new file mode 100644
index 0000000..2d17f36
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/Makefile.in
@@ -0,0 +1,13 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Branding Makefile
+# - jars chrome artwork
+
+# resources needed for the metro tile interface
+ifeq ($(MOZ_WIDGET_TOOLKIT) $(DIST_SUBDIR),windows metro)
+TILE_FILES := $(wildcard $(srcdir)/VisualElements*)
+TILE_DEST := $(DIST)/bin/tileresources
+INSTALL_TARGETS += TILE
+endif
diff --git a/helpers/DATA/firefox/gnu/branding/content/VisualElements_logo.png b/helpers/DATA/firefox/gnu/branding/content/VisualElements_logo.png
new file mode 100644
index 0000000..0cbf367
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/VisualElements_logo.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/content/VisualElements_smalllogo.png b/helpers/DATA/firefox/gnu/branding/content/VisualElements_smalllogo.png
new file mode 100644
index 0000000..425f9fd
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/VisualElements_smalllogo.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/content/VisualElements_splashscreen.png b/helpers/DATA/firefox/gnu/branding/content/VisualElements_splashscreen.png
new file mode 100644
index 0000000..484ac2f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/VisualElements_splashscreen.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/content/about-background.png b/helpers/DATA/firefox/gnu/branding/content/about-background.png
new file mode 100644
index 0000000..f626f74
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/about-background.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/content/about-logo.png b/helpers/DATA/firefox/gnu/branding/content/about-logo.png
new file mode 100644
index 0000000..554a13d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/about-logo.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/content/about-logo@2x.png b/helpers/DATA/firefox/gnu/branding/content/about-logo@2x.png
new file mode 100644
index 0000000..1c4dea8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/about-logo@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/content/about-wordmark.svg b/helpers/DATA/firefox/gnu/branding/content/about-wordmark.svg
new file mode 100644
index 0000000..7c73566
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/about-wordmark.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="aboutWordmark"
+ x="0px"
+ y="0px"
+ width="130px"
+ height="38px"
+ viewBox="0 0 130 38"
+ xml:space="preserve"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="about-wordmark.svg"><metadata
+ id="metadata9"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs7" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1678"
+ inkscape:window-height="980"
+ id="namedview5"
+ showgrid="false"
+ inkscape:zoom="12.361033"
+ inkscape:cx="65.19257"
+ inkscape:cy="11.28883"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="aboutWordmark" />
+
+
+
+
+
+<g
+ style="font-size:29.90496063px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Montserrat;-inkscape-font-specification:Montserrat"
+ id="text2985-3"><path
+ d="m 7.5040834,20.952038 c 0.99797,1.6e-5 1.8577666,0.138197 2.5793926,0.414545 0.721604,0.276379 1.435542,0.706277 2.141816,1.289696 l -1.174544,1.220605 c -1.0594042,-0.84443 -2.2262709,-1.266651 -3.500604,-1.266666 -1.3050564,1.5e-5 -2.4105091,0.537388 -3.3163613,1.61212 -0.9058618,1.059405 -1.3587904,2.694554 -1.3587869,4.905451 -3.5e-6,4.375758 1.4969637,6.563634 4.4909059,6.563632 1.1822123,2e-6 2.2108974,-0.253331 3.0860583,-0.759999 l 0,-4.951512 -2.8787857,0 -0.2303029,-1.63515 5.0896936,0 0,7.623025 c -1.550718,0.921211 -3.2856642,1.381817 -5.204845,1.381817 -2.0113175,0 -3.592729,-0.698585 -4.7442391,-2.095756 C 1.3319647,33.856678 0.75620807,31.814661 0.75620941,29.127789 0.75620807,26.563761 1.416409,24.560128 2.7368141,23.116885 4.0572125,21.673669 5.6463007,20.952054 7.5040834,20.952038"
+ style="font-size:23.03028679px;font-weight:normal;fill:#ffffff;-inkscape-font-specification:Fira Sans"
+ id="path2987" /><path
+ d="m 27.21585,21.228401 0,15.844837 -2.671513,0 -6.678783,-13.65696 c 0.184238,2.026677 0.276359,4.03031 0.276363,6.010905 l 0,7.646055 -1.865453,0 0,-15.844837 2.602422,0 6.724844,13.67999 c -0.1689,-1.596762 -0.253345,-3.201204 -0.253333,-4.81333 l 0,-8.86666 1.865453,0"
+ style="font-size:23.03028679px;font-weight:normal;fill:#ffffff;-inkscape-font-specification:Fira Sans"
+ id="path2989" /><path
+ d="m 42.660895,21.228401 0,10.801205 c -1.3e-5,1.59677 -0.483648,2.886464 -1.450908,3.869088 -0.951929,0.967272 -2.295361,1.450908 -4.0303,1.450908 -1.750307,0 -3.093739,-0.483636 -4.0303,-1.450908 -0.936568,-0.96727 -1.40485,-2.256965 -1.404848,-3.869088 l 0,-10.801205 1.980605,0 0,10.639993 c -4e-6,2.51798 1.151509,3.776968 3.454543,3.776967 2.303019,10e-7 3.454532,-1.258987 3.454543,-3.776967 l 0,-10.639993 2.026665,0"
+ style="font-size:23.03028679px;font-weight:normal;fill:#ffffff;-inkscape-font-specification:Fira Sans"
+ id="path2991" /><path
+ d="m 51.654545,16.349101 0,20.724137 -4.904413,0 0,-20.724137 4.904413,0"
+ style="font-weight:bold;fill:#ffffff;font-family:Fira Sans;-inkscape-font-specification:Fira Sans Bold"
+ id="path2993" /><path
+ d="m 62.358188,20.68532 c 2.093336,1.6e-5 3.907568,0.647956 5.442702,1.943822 l -2.063442,2.840972 c -0.95697,-0.777517 -1.953801,-1.166281 -2.990496,-1.166294 -2.133227,1.3e-5 -3.199837,1.644784 -3.199831,4.934319 -6e-6,1.674684 0.269139,2.860913 0.807434,3.55869 0.538282,0.697786 1.31581,1.046677 2.332587,1.046674 0.956949,3e-6 1.943812,-0.388761 2.960591,-1.166294 l 2.153157,3.020401 c -1.575007,1.256009 -3.359334,1.884012 -5.352988,1.884013 -2.432276,-10e-7 -4.35616,-0.747624 -5.771657,-2.242872 -1.395566,-1.515182 -2.093348,-3.538749 -2.093347,-6.070707 -10e-7,-2.55188 0.707749,-4.61532 2.123252,-6.190327 1.415497,-1.594916 3.299508,-2.392381 5.652038,-2.392397"
+ style="font-weight:bold;fill:#ffffff;font-family:Fira Sans;-inkscape-font-specification:Fira Sans Bold"
+ id="path2995" /><path
+ d="m 76.017276,20.68532 c 2.292703,1.6e-5 4.086999,0.717735 5.382893,2.153157 1.295867,1.435451 1.943807,3.429113 1.943823,5.980992 -1.6e-5,0.657917 -0.02992,1.226111 -0.08971,1.704583 l -9.808827,0 c 0.13955,1.33576 0.508378,2.272781 1.106483,2.811066 0.598092,0.538293 1.425462,0.807437 2.482112,0.807434 1.176251,3e-6 2.442226,-0.468507 3.79793,-1.405533 l 1.943822,2.631637 c -1.854121,1.475311 -3.917561,2.212966 -6.190327,2.212967 -2.571833,-10e-7 -4.545558,-0.757592 -5.921182,-2.272777 -1.37563,-1.515182 -2.063443,-3.548717 -2.063442,-6.100612 -10e-7,-2.472133 0.647939,-4.505669 1.943822,-6.100612 1.315814,-1.614853 3.140015,-2.422286 5.472608,-2.422302 m -2.601731,6.997761 5.293178,0 0,-0.209335 c -0.03989,-2.432258 -0.897159,-3.648392 -2.571827,-3.648405 -0.81741,1.3e-5 -1.445413,0.299062 -1.884012,0.897149 -0.438613,0.578174 -0.717725,1.565037 -0.837339,2.960591"
+ style="font-weight:bold;fill:#ffffff;font-family:Fira Sans;-inkscape-font-specification:Fira Sans Bold"
+ id="path2997" /><path
+ d="m 94.549005,15.840716 c 2.47213,2.2e-5 4.605349,0.757613 6.399665,2.272777 l -2.392401,2.840972 c -1.156338,-0.996815 -2.392409,-1.495231 -3.708215,-1.495248 -1.375637,1.7e-5 -2.472151,0.598116 -3.289546,1.794297 -0.797472,1.176277 -1.196204,2.980541 -1.196198,5.412798 -6e-6,2.412342 0.398726,4.206637 1.196198,5.382893 0.817395,1.156329 1.943814,1.734491 3.379261,1.734488 1.196187,3e-6 2.541908,-0.578159 4.03717,-1.734488 l 2.212971,2.870876 c -1.734507,1.774362 -3.89763,2.661541 -6.489381,2.661542 -2.89082,-10e-7 -5.1935,-0.94699 -6.908046,-2.840972 -1.714552,-1.913913 -2.571827,-4.605357 -2.571826,-8.074339 -10e-7,-3.389215 0.867242,-6.040786 2.601731,-7.954719 1.734483,-1.913898 3.977353,-2.870855 6.728617,-2.870877"
+ style="font-weight:bold;fill:#ffffff;font-family:Fira Sans;-inkscape-font-specification:Fira Sans Bold"
+ id="path2999" /><path
+ d="m 109.29869,20.68532 c 2.27277,1.6e-5 3.93748,0.468527 4.99413,1.405533 1.05663,0.937036 1.58495,2.342568 1.58496,4.2166 l 0,6.160421 c -1e-5,0.598104 0.0797,1.036709 0.23924,1.315819 0.17942,0.279116 0.45853,0.48845 0.83734,0.628004 l -0.98686,3.080211 c -0.97691,-0.07975 -1.77438,-0.289082 -2.3924,-0.628004 -0.59811,-0.338923 -1.07659,-0.88718 -1.43544,-1.644773 -1.03671,1.574995 -2.63164,2.362491 -4.78479,2.362492 -1.575,-10e-7 -2.83101,-0.458543 -3.76803,-1.375628 -0.93702,-0.917084 -1.40553,-2.113281 -1.40553,-3.588596 0,-1.734481 0.63797,-3.060267 1.91392,-3.97736 1.27594,-0.917076 3.12008,-1.375618 5.53242,-1.375628 l 1.61486,0 0,-0.687814 c -10e-6,-0.93701 -0.19937,-1.574982 -0.59809,-1.913917 -0.39875,-0.358847 -1.09653,-0.538277 -2.09335,-0.53829 -1.1364,1.3e-5 -2.52199,0.279126 -4.15679,0.837339 l -1.07658,-3.110116 c 2.09334,-0.777513 4.08701,-1.166277 5.98099,-1.166293 m 1.94382,9.180823 -1.16629,0 c -2.13323,7e-6 -3.19984,0.777535 -3.19983,2.332587 -1e-5,0.637977 0.15949,1.136392 0.47848,1.495248 0.33892,0.338926 0.79746,0.508387 1.37563,0.508384 1.05663,3e-6 1.89397,-0.498412 2.51201,-1.495248 l 0,-2.840971"
+ style="font-weight:bold;fill:#ffffff;font-family:Fira Sans;-inkscape-font-specification:Fira Sans Bold"
+ id="path3001" /><path
+ d="m 124.84414,17.216345 0,3.977359 3.6484,0 -0.50838,3.289546 -3.14002,0 0,7.29681 c -10e-6,0.737661 0.11961,1.265981 0.35886,1.584963 0.23923,0.31899 0.61802,0.478483 1.13639,0.47848 0.55821,3e-6 1.12641,-0.179427 1.70458,-0.53829 l 1.58496,3.020401 c -1.19621,0.837339 -2.63164,1.256008 -4.30631,1.256009 -3.46898,-0.01994 -5.20347,-1.933853 -5.20347,-5.741753 l 0,-7.35662 -2.24287,0 0,-3.289546 2.24287,0 0,-3.43907 4.72499,-0.538289"
+ style="font-weight:bold;fill:#ffffff;font-family:Fira Sans;-inkscape-font-specification:Fira Sans Bold"
+ id="path3003" /></g>
+</svg> \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/branding/content/about.png b/helpers/DATA/firefox/gnu/branding/content/about.png
new file mode 100644
index 0000000..eaa1a31
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/about.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/content/aboutDialog.css b/helpers/DATA/firefox/gnu/branding/content/aboutDialog.css
new file mode 100644
index 0000000..4c2a7b6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/aboutDialog.css
@@ -0,0 +1,25 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#aboutDialogContainer {
+ background-image: url("chrome://branding/content/about-background.png");
+ background-repeat: no-repeat;
+ background-color: #000;
+ color: #fff;
+}
+
+.text-link {
+ color: #fff !important;
+ text-decoration: underline;
+}
+
+#rightBox {
+ /* this margin prevents text from overlapping the planet image */
+ margin-left: 280px;
+ margin-right: 20px;
+}
+
+#bottomBox {
+ background-color: rgba(0,0,0,.7);
+}
diff --git a/helpers/DATA/firefox/gnu/branding/content/icon48.png b/helpers/DATA/firefox/gnu/branding/content/icon48.png
new file mode 100644
index 0000000..2f18a7d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/icon48.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/content/icon64.png b/helpers/DATA/firefox/gnu/branding/content/icon64.png
new file mode 100644
index 0000000..16e1d6e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/icon64.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/content/identity-icons-brand.png b/helpers/DATA/firefox/gnu/branding/content/identity-icons-brand.png
new file mode 100644
index 0000000..b26b76d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/identity-icons-brand.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/content/identity-icons-brand@2x.png b/helpers/DATA/firefox/gnu/branding/content/identity-icons-brand@2x.png
new file mode 100644
index 0000000..41e9a1d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/identity-icons-brand@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/content/jar.mn b/helpers/DATA/firefox/gnu/branding/content/jar.mn
new file mode 100644
index 0000000..dc07b3d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/jar.mn
@@ -0,0 +1,27 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+browser.jar:
+% content branding %content/branding/ contentaccessible=yes
+ content/branding/about.png (about.png)
+ content/branding/about-background.png (about-background.png)
+ content/branding/about-logo.png (about-logo.png)
+ content/branding/about-logo@2x.png (about-logo@2x.png)
+ content/branding/about-wordmark.svg (about-wordmark.svg)
+ content/branding/icon48.png (icon48.png)
+ content/branding/icon64.png (icon64.png)
+ content/branding/icon16.png (../default16.png)
+ content/branding/icon32.png (../default32.png)
+ content/branding/icon128.png (../mozicon128.png)
+ content/branding/identity-icons-brand.png (identity-icons-brand.png)
+ content/branding/identity-icons-brand@2x.png (identity-icons-brand@2x.png)
+ content/branding/aboutDialog.css (aboutDialog.css)
+#ifdef MOZ_METRO
+ content/branding/metro-about.css (metro-about.css)
+ content/branding/metro-about-footer.png (metro-about-footer.png)
+ content/branding/metro-about-wordmark.png (metro-about-wordmark.png)
+ content/branding/metro_firstrun_logo.png (metro_firstrun_logo.png)
+ content/branding/metro_firstrun_logo@1.4x.png (metro_firstrun_logo@1.4x.png)
+ content/branding/metro_firstrun_logo@1.8x.png (metro_firstrun_logo@1.8x.png)
+#endif
diff --git a/helpers/DATA/firefox/gnu/branding/content/metro-about-footer.png b/helpers/DATA/firefox/gnu/branding/content/metro-about-footer.png
new file mode 100644
index 0000000..c81a520
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/metro-about-footer.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/content/metro-about-wordmark.png b/helpers/DATA/firefox/gnu/branding/content/metro-about-wordmark.png
new file mode 100644
index 0000000..58b1390
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/metro-about-wordmark.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/content/metro-about.css b/helpers/DATA/firefox/gnu/branding/content/metro-about.css
new file mode 100644
index 0000000..ae59ca7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/metro-about.css
@@ -0,0 +1,14 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#about-flyoutpanel {
+ background-color: #002147;
+ color: white;
+}
+
+#about-policy-label:hover,
+#about-policy-label:active {
+ background: #0a111c;
+}
+
diff --git a/helpers/DATA/firefox/gnu/branding/content/metro_firstrun_logo.png b/helpers/DATA/firefox/gnu/branding/content/metro_firstrun_logo.png
new file mode 100644
index 0000000..8ad7f27
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/metro_firstrun_logo.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/content/metro_firstrun_logo@1.4x.png b/helpers/DATA/firefox/gnu/branding/content/metro_firstrun_logo@1.4x.png
new file mode 100644
index 0000000..8a247a8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/metro_firstrun_logo@1.4x.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/content/metro_firstrun_logo@1.8x.png b/helpers/DATA/firefox/gnu/branding/content/metro_firstrun_logo@1.8x.png
new file mode 100644
index 0000000..a716c58
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/metro_firstrun_logo@1.8x.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/content/moz.build b/helpers/DATA/firefox/gnu/branding/content/moz.build
new file mode 100644
index 0000000..c97072b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/content/moz.build
@@ -0,0 +1,7 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+JAR_MANIFESTS += ['jar.mn'] \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/branding/default16.png b/helpers/DATA/firefox/gnu/branding/default16.png
new file mode 100644
index 0000000..d2728b4
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/default16.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/default32.png b/helpers/DATA/firefox/gnu/branding/default32.png
new file mode 100644
index 0000000..b485806
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/default32.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/default48.png b/helpers/DATA/firefox/gnu/branding/default48.png
new file mode 100644
index 0000000..2f18a7d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/default48.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/disk.icns b/helpers/DATA/firefox/gnu/branding/disk.icns
new file mode 100644
index 0000000..718f1a3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/disk.icns
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/document-os2.ico b/helpers/DATA/firefox/gnu/branding/document-os2.ico
new file mode 100644
index 0000000..214e92c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/document-os2.ico
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/document.icns b/helpers/DATA/firefox/gnu/branding/document.icns
new file mode 100644
index 0000000..ff419f2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/document.icns
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/document.ico b/helpers/DATA/firefox/gnu/branding/document.ico
new file mode 100644
index 0000000..3c8e283
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/document.ico
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/dsstore b/helpers/DATA/firefox/gnu/branding/dsstore
new file mode 100644
index 0000000..2d11482
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/dsstore
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/icecat-os2.ico b/helpers/DATA/firefox/gnu/branding/icecat-os2.ico
new file mode 100644
index 0000000..560d198
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/icecat-os2.ico
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/icecat.icns b/helpers/DATA/firefox/gnu/branding/icecat.icns
new file mode 100644
index 0000000..0c6941a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/icecat.icns
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/icecat.ico b/helpers/DATA/firefox/gnu/branding/icecat.ico
new file mode 100644
index 0000000..a6a7817
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/icecat.ico
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/locales/Makefile.in b/helpers/DATA/firefox/gnu/branding/locales/Makefile.in
new file mode 100644
index 0000000..82f614e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/locales/Makefile.in
@@ -0,0 +1,5 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DEFINES += -DAB_CD=$(AB_CD)
diff --git a/helpers/DATA/firefox/gnu/branding/locales/browserconfig.properties b/helpers/DATA/firefox/gnu/branding/locales/browserconfig.properties
new file mode 100644
index 0000000..72ab4be
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/locales/browserconfig.properties
@@ -0,0 +1,6 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Do NOT localize or otherwise change these values
+browser.startup.homepage=about:icecat
diff --git a/helpers/DATA/firefox/gnu/branding/locales/en-US/brand.dtd b/helpers/DATA/firefox/gnu/branding/locales/en-US/brand.dtd
new file mode 100644
index 0000000..519de9b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/locales/en-US/brand.dtd
@@ -0,0 +1,8 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!ENTITY brandShortName "IceCat">
+<!ENTITY brandFullName "IceCat">
+<!ENTITY vendorShortName "GNU">
+<!ENTITY trademarkInfo.part1 "">
diff --git a/helpers/DATA/firefox/gnu/branding/locales/en-US/brand.properties b/helpers/DATA/firefox/gnu/branding/locales/en-US/brand.properties
new file mode 100644
index 0000000..3120429
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/locales/en-US/brand.properties
@@ -0,0 +1,15 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+brandShortName=IceCat
+brandFullName=IceCat
+vendorShortName=GNU
+
+homePageSingleStartMain=IceCat Start, a fast home page with built-in search
+homePageImport=Import your home page from %S
+
+homePageMigrationPageTitle=Home Page Selection
+homePageMigrationDescription=Please select the home page you wish to use:
+
+syncBrandShortName=Sync
diff --git a/helpers/DATA/firefox/gnu/branding/locales/jar.mn b/helpers/DATA/firefox/gnu/branding/locales/jar.mn
new file mode 100644
index 0000000..ff4e055
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/locales/jar.mn
@@ -0,0 +1,12 @@
+#filter substitution
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+@AB_CD@.jar:
+% locale branding @AB_CD@ %locale/branding/
+# Unofficial branding only exists in en-US
+ locale/branding/brand.dtd (en-US/brand.dtd)
+ locale/branding/brand.properties (en-US/brand.properties)
+ locale/branding/browserconfig.properties (browserconfig.properties)
diff --git a/helpers/DATA/firefox/gnu/branding/locales/moz.build b/helpers/DATA/firefox/gnu/branding/locales/moz.build
new file mode 100644
index 0000000..3a54c0c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/locales/moz.build
@@ -0,0 +1,9 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DEFINES['MOZ_DISTRIBUTION_ID_UNQUOTED'] = CONFIG['MOZ_DISTRIBUTION_ID']
+
+JAR_MANIFESTS += ['jar.mn'] \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/branding/moz.build b/helpers/DATA/firefox/gnu/branding/moz.build
new file mode 100644
index 0000000..3e2f88f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/moz.build
@@ -0,0 +1,10 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += ['content', 'locales']
+
+DIST_SUBDIR = 'browser'
+export('DIST_SUBDIR')
diff --git a/helpers/DATA/firefox/gnu/branding/mozicon128.png b/helpers/DATA/firefox/gnu/branding/mozicon128.png
new file mode 100644
index 0000000..6d922fd
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/mozicon128.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/newtab.ico b/helpers/DATA/firefox/gnu/branding/newtab.ico
new file mode 100644
index 0000000..6e3fee6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/newtab.ico
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/newwindow.ico b/helpers/DATA/firefox/gnu/branding/newwindow.ico
new file mode 100644
index 0000000..a300935
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/newwindow.ico
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/particles.bmp b/helpers/DATA/firefox/gnu/branding/particles.bmp
new file mode 100644
index 0000000..ab74ce0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/particles.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/pbmode.ico b/helpers/DATA/firefox/gnu/branding/pbmode.ico
new file mode 100644
index 0000000..d217994
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/pbmode.ico
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/pencil-rtl.bmp b/helpers/DATA/firefox/gnu/branding/pencil-rtl.bmp
new file mode 100644
index 0000000..e50d92d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/pencil-rtl.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/pencil.bmp b/helpers/DATA/firefox/gnu/branding/pencil.bmp
new file mode 100644
index 0000000..252c10f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/pencil.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/pref/icecat-branding.js b/helpers/DATA/firefox/gnu/branding/pref/icecat-branding.js
new file mode 100644
index 0000000..58a869e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/pref/icecat-branding.js
@@ -0,0 +1,24 @@
+pref("startup.homepage_override_url","http://www.gnu.org");
+pref("startup.homepage_welcome_url","http://www.gnu.org/software/gnuzilla/");
+// The time interval between checks for a new version (in seconds)
+// nightly=8 hours, official=24 hours
+pref("app.update.interval", 86400);
+// The time interval between the downloading of mar file chunks in the
+// background (in seconds)
+pref("app.update.download.backgroundInterval", 60);
+// URL user can browse to manually if for some reason all update installation
+// attempts fail.
+pref("app.update.url.manual", "http://www.gnu.org/software/gnuzilla/");
+// A default value for the "More information about this update" link
+// supplied in the "An update is available" page of the update wizard.
+pref("app.update.url.details", "http://www.gnu.org/software/gnuzilla/");
+
+// Release notes and vendor URLs
+pref("app.releaseNotesURL", "http://www.gnu.org/software/gnuzilla/");
+pref("app.vendorURL", "http://www.gnu.org/");
+
+// Search codes belong only in builds with official branding
+pref("browser.search.param.yahoo-fr", "");
+pref("browser.search.param.yahoo-fr-cjkt", ""); // now unused
+pref("browser.search.param.yahoo-fr-ja", "");
+pref("browser.search.param.yahoo-f-CN", "");
diff --git a/helpers/DATA/firefox/gnu/branding/wizHeader.bmp b/helpers/DATA/firefox/gnu/branding/wizHeader.bmp
new file mode 100644
index 0000000..87e5b0e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/wizHeader.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/wizHeaderRTL.bmp b/helpers/DATA/firefox/gnu/branding/wizHeaderRTL.bmp
new file mode 100644
index 0000000..c7f98e7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/wizHeaderRTL.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/branding/wizWatermark.bmp b/helpers/DATA/firefox/gnu/branding/wizWatermark.bmp
new file mode 100644
index 0000000..971b8c0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/branding/wizWatermark.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/enable-js-options.patch b/helpers/DATA/firefox/gnu/enable-js-options.patch
new file mode 100644
index 0000000..9cca7a9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/enable-js-options.patch
@@ -0,0 +1,310 @@
+# HG changeset patch
+# User Gijs Kruitbosch <gijskruitbosch@gmail.com>
+# Date 1365155574 -7200
+# Node ID 444b9baa31d6065d37edbd61a2dcb892c989e0e2
+# Parent 99121d529b47ec285d61f64988335e60ac120cf7
+Bug 851702 - Remove JS load and advanced preferences from the UI
+
+diff --git a/browser/components/preferences/advanced-scripts.xul b/browser/components/preferences/advanced-scripts.xul
+deleted file mode 100644
+--- a/browser/components/preferences/advanced-scripts.xul
++++ /dev/null
+@@ -1,46 +0,0 @@
+-<?xml version="1.0"?>
+-
+-<!-- -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -->
+-<!-- This Source Code Form is subject to the terms of the Mozilla Public
+- - License, v. 2.0. If a copy of the MPL was not distributed with this
+- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+-
+-<!DOCTYPE prefwindow SYSTEM "chrome://browser/locale/preferences/advanced-scripts.dtd">
+-
+-<?xml-stylesheet href="chrome://global/skin/"?>
+-
+-<prefwindow id="AdvancedJSDialog" type="child"
+- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+- title="&advancedJSDialog.title;"
+- dlgbuttons="accept,cancel,help"
+- ondialoghelp="openPrefsHelp()">
+-
+- <script type="application/javascript" src="chrome://browser/content/utilityOverlay.js"/>
+-
+- <prefpane id="AdvancedJSDialogPane"
+- helpTopic="prefs-advanced-javascript">
+-
+- <preferences>
+- <preference id="dom.event.contextmenu.enabled" name="dom.event.contextmenu.enabled" type="bool"/>
+- <preference id="dom.disable_window_move_resize" name="dom.disable_window_move_resize" type="bool" inverted="true"/>
+- <preference id="dom.disable_window_flip" name="dom.disable_window_flip" type="bool" inverted="true"/>
+- </preferences>
+-
+- <script type="application/javascript" src="chrome://browser/content/preferences/advanced-scripts.js"/>
+-
+- <stringbundle id="preferencesBundle" src="chrome://browser/locale/preferences/preferences.properties"/>
+-
+- <description value="&allowScripts.label;"/>
+-
+- <checkbox id="moveResizePopupWindows" label="&moveResizePopupWindows.label;"
+- accesskey="&moveResizePopupWindows.accesskey;"
+- preference="dom.disable_window_move_resize"/>
+- <checkbox id="raiseLowerWindows" label="&raiseLowerWindows.label;"
+- accesskey="&raiseLowerWindows.accesskey;"
+- preference="dom.disable_window_flip"/>
+- <checkbox id="disableContextMenus" label="&disableContextMenus.label;"
+- accesskey="&disableContextMenus.accesskey;"
+- preference="dom.event.contextmenu.enabled"/>
+-
+- </prefpane>
+-</prefwindow>
+diff --git a/browser/components/preferences/content.xul b/browser/components/preferences/content.xul
+--- a/browser/components/preferences/content.xul
++++ b/browser/components/preferences/content.xul
+@@ -17,23 +17,18 @@
+
+ <prefpane id="paneContent"
+ onpaneload="gContentPane.init();"
+ helpTopic="prefs-content">
+
+ <preferences id="contentPreferences">
+ <!--XXX buttons prefs -->
+
+- <!-- POPUPS, JAVASCRIPT -->
++ <!-- POPUPS -->
+ <preference id="dom.disable_open_during_load" name="dom.disable_open_during_load" type="bool"/>
+- <preference id="javascript.enabled" name="javascript.enabled" type="bool"/>
+-
+- <preference id="pref.advanced.javascript.disable_button.advanced"
+- name="pref.advanced.javascript.disable_button.advanced"
+- type="bool"/>
+
+ <!-- FONTS -->
+ <preference id="font.language.group"
+ name="font.language.group"
+ type="wstring"
+ onchange="gContentPane._rebuildFonts();"/>
+ </preferences>
+
+@@ -56,30 +51,16 @@
+ label="&blockPopups.label;" accesskey="&blockPopups.accesskey;"
+ onsyncfrompreference="return gContentPane.updateButtons('popupPolicyButton',
+ 'dom.disable_open_during_load');"/>
+ </vbox>
+ <button id="popupPolicyButton" label="&popupExceptions.label;"
+ oncommand="gContentPane.showPopupExceptions();"
+ accesskey="&popupExceptions.accesskey;"/>
+ </row>
+- <row id="enableJavaScriptRow">
+- <vbox align="start">
+- <checkbox id="enableJavaScript" preference="javascript.enabled"
+- label="&enableJavaScript.label;" accesskey="&enableJavaScript.accesskey;"
+- onsyncfrompreference="return gContentPane.updateButtons('advancedJSButton',
+- 'javascript.enabled');"/>
+- </vbox>
+- <vbox>
+- <button id="advancedJSButton" label="&advancedJS.label;"
+- accesskey="&advancedJS.accesskey;"
+- oncommand="gContentPane.showAdvancedJS();"
+- preference="pref.advanced.javascript.disable_button.advanced"/>
+- </vbox>
+- </row>
+ </rows>
+ </grid>
+ </groupbox>
+
+ <!-- Fonts and Colors -->
+ <groupbox id="fontsGroup">
+ <caption label="&fontsAndColors.label;"/>
+
+diff --git a/browser/components/preferences/in-content/content.xul b/browser/components/preferences/in-content/content.xul
+--- a/browser/components/preferences/in-content/content.xul
++++ b/browser/components/preferences/in-content/content.xul
+@@ -1,24 +1,18 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ - You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+ <preferences id="contentPreferences">
+
+- <!-- Popups and JavaScript -->
++ <!-- Popups -->
+ <preference id="dom.disable_open_during_load"
+ name="dom.disable_open_during_load"
+ type="bool"/>
+- <preference id="javascript.enabled"
+- name="javascript.enabled"
+- type="bool"/>
+- <preference id="pref.advanced.javascript.disable_button.advanced"
+- name="pref.advanced.javascript.disable_button.advanced"
+- type="bool"/>
+
+ <!-- Fonts -->
+ <preference id="font.language.group"
+ name="font.language.group"
+ type="wstring"
+ onchange="gContentPane._rebuildFonts();"/>
+ </preferences>
+
+@@ -45,30 +39,16 @@
+ label="&blockPopups.label;" accesskey="&blockPopups.accesskey;"
+ onsyncfrompreference="return gContentPane.updateButtons('popupPolicyButton',
+ 'dom.disable_open_during_load');"/>
+ </vbox>
+ <button id="popupPolicyButton" label="&popupExceptions.label;"
+ oncommand="gContentPane.showPopupExceptions();"
+ accesskey="&popupExceptions.accesskey;"/>
+ </row>
+- <row id="enableJavaScriptRow">
+- <vbox align="start">
+- <checkbox id="enableJavaScript" preference="javascript.enabled"
+- label="&enableJavaScript.label;" accesskey="&enableJavaScript.accesskey;"
+- onsyncfrompreference="return gContentPane.updateButtons('advancedJSButton',
+- 'javascript.enabled');"/>
+- </vbox>
+- <vbox>
+- <button id="advancedJSButton" label="&advancedJS.label;"
+- accesskey="&advancedJS.accesskey;"
+- oncommand="gContentPane.showAdvancedJS();"
+- preference="pref.advanced.javascript.disable_button.advanced"/>
+- </vbox>
+- </row>
+ </rows>
+ </grid>
+ </groupbox>
+
+ <!-- Fonts and Colors -->
+ <groupbox id="fontsGroup" data-category="paneContent" hidden="true">
+ <caption label="&fontsAndColors.label;"/>
+
+diff --git a/browser/components/preferences/jar.mn b/browser/components/preferences/jar.mn
+--- a/browser/components/preferences/jar.mn
++++ b/browser/components/preferences/jar.mn
+@@ -4,17 +4,16 @@
+
+ browser.jar:
+ content/browser/preferences/aboutPermissions.xul
+ content/browser/preferences/aboutPermissions.js
+ content/browser/preferences/aboutPermissions.css
+ content/browser/preferences/aboutPermissions.xml
+ * content/browser/preferences/advanced.xul
+ * content/browser/preferences/advanced.js
+- content/browser/preferences/advanced-scripts.xul
+ content/browser/preferences/applications.xul
+ * content/browser/preferences/applications.js
+ content/browser/preferences/applicationManager.xul
+ * content/browser/preferences/applicationManager.js
+ * content/browser/preferences/colors.xul
+ * content/browser/preferences/cookies.xul
+ content/browser/preferences/cookies.js
+ content/browser/preferences/content.xul
+diff --git a/browser/locales/en-US/chrome/browser/preferences/advanced-scripts.dtd b/browser/locales/en-US/chrome/browser/preferences/advanced-scripts.dtd
+deleted file mode 100644
+--- a/browser/locales/en-US/chrome/browser/preferences/advanced-scripts.dtd
++++ /dev/null
+@@ -1,15 +0,0 @@
+-<!-- This Source Code Form is subject to the terms of the Mozilla Public
+- - License, v. 2.0. If a copy of the MPL was not distributed with this
+- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+-
+-<!ENTITY advancedJSDialog.title "Advanced JavaScript Settings">
+-<!ENTITY window.width "37em">
+-
+-<!ENTITY allowScripts.label "Allow scripts to:">
+-
+-<!ENTITY moveResizePopupWindows.label "Move or resize popup windows">
+-<!ENTITY moveResizePopupWindows.accesskey "M">
+-<!ENTITY raiseLowerWindows.label "Raise or lower windows">
+-<!ENTITY raiseLowerWindows.accesskey "R">
+-<!ENTITY disableContextMenus.label "Disable or replace context menus">
+-<!ENTITY disableContextMenus.accesskey "D">
+diff --git a/browser/locales/en-US/chrome/browser/preferences/content.dtd b/browser/locales/en-US/chrome/browser/preferences/content.dtd
+--- a/browser/locales/en-US/chrome/browser/preferences/content.dtd
++++ b/browser/locales/en-US/chrome/browser/preferences/content.dtd
+@@ -2,25 +2,16 @@
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+ <!ENTITY blockPopups.label "Block pop-up windows">
+ <!ENTITY blockPopups.accesskey "B">
+ <!ENTITY popupExceptions.label "Exceptions…">
+ <!ENTITY popupExceptions.accesskey "E">
+
+-<!ENTITY enableJavaScript.label "Enable JavaScript">
+-<!ENTITY enableJavaScript.accesskey "J">
+-<!ENTITY advancedJS.label "Advanced…">
+-<!ENTITY advancedJS.accesskey "v">
+-
+-<!ENTITY enableJava.label "Enable Java">
+-<!ENTITY enableJava.accesskey "n">
+-
+-
+ <!ENTITY fontsAndColors.label "Fonts &amp; Colors">
+
+ <!ENTITY defaultFont.label "Default font:">
+ <!ENTITY defaultFont.accesskey "D">
+ <!ENTITY defaultSize.label "Size:">
+ <!ENTITY defaultSize.accesskey "S">
+
+ <!ENTITY advancedFonts.label "Advanced…">
+diff --git a/browser/locales/jar.mn b/browser/locales/jar.mn
+--- a/browser/locales/jar.mn
++++ b/browser/locales/jar.mn
+@@ -81,17 +81,16 @@
+ #endif
+ locale/browser/feeds/subscribe.dtd (%chrome/browser/feeds/subscribe.dtd)
+ locale/browser/feeds/subscribe.properties (%chrome/browser/feeds/subscribe.properties)
+ locale/browser/migration/migration.dtd (%chrome/browser/migration/migration.dtd)
+ locale/browser/migration/migration.properties (%chrome/browser/migration/migration.properties)
+ locale/browser/preferences/aboutPermissions.dtd (%chrome/browser/preferences/aboutPermissions.dtd)
+ locale/browser/preferences/aboutPermissions.properties (%chrome/browser/preferences/aboutPermissions.properties)
+ locale/browser/preferences/advanced.dtd (%chrome/browser/preferences/advanced.dtd)
+- locale/browser/preferences/advanced-scripts.dtd (%chrome/browser/preferences/advanced-scripts.dtd)
+ locale/browser/preferences/applicationManager.dtd (%chrome/browser/preferences/applicationManager.dtd)
+ locale/browser/preferences/applicationManager.properties (%chrome/browser/preferences/applicationManager.properties)
+ locale/browser/preferences/colors.dtd (%chrome/browser/preferences/colors.dtd)
+ locale/browser/preferences/cookies.dtd (%chrome/browser/preferences/cookies.dtd)
+ locale/browser/preferences/content.dtd (%chrome/browser/preferences/content.dtd)
+ locale/browser/preferences/connection.dtd (%chrome/browser/preferences/connection.dtd)
+ locale/browser/preferences/applications.dtd (%chrome/browser/preferences/applications.dtd)
+ locale/browser/preferences/fonts.dtd (%chrome/browser/preferences/fonts.dtd)
+--- a/browser/components/preferences/content.js 2014-04-28 01:52:01.000000000 +0200
++++ b/browser/components/preferences/content.js 2014-05-07 17:02:34.000000000 +0200
+@@ -57,18 +57,7 @@
+ "chrome://browser/content/preferences/permissions.xul",
+ "", params);
+ },
+-
+- // JAVASCRIPT
+
+- /**
+- * Displays the advanced JavaScript preferences for enabling or disabling
+- * various annoying behaviors.
+- */
+- showAdvancedJS: function ()
+- {
+- openDialog("chrome://browser/content/preferences/advanced-scripts.xul",
+- "Browser:AdvancedScripts", null);
+- },
+
+ // FONTS
+
+--- a/browser/components/preferences/in-content/content.js 2014-05-07 17:01:48.000000000 +0200
++++ b/browser/components/preferences/in-content/content.js 2014-04-28 01:52:01.000000000 +0200
+@@ -58,18 +58,6 @@
+ "Browser:Permissions", "resizable=yes", params);
+ },
+
+- // JAVASCRIPT
+-
+- /**
+- * Displays the advanced JavaScript preferences for enabling or disabling
+- * various annoying behaviors.
+- */
+- showAdvancedJS: function ()
+- {
+- openDialog("chrome://browser/content/preferences/advanced-scripts.xul",
+- "Browser:AdvancedScripts", null);
+- },
+-
+ // FONTS
+
+ /**
diff --git a/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/LICENSE b/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/LICENSE
new file mode 100644
index 0000000..10d1ec6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/LICENSE
@@ -0,0 +1,24 @@
+Extension built by Ruben Rodriguez using pieces of torbutton as a template
+
+Copyright (c) 2014, Ruben Rodriguez <ruben@gnu.org>
+Copyright (c) 2013, The Tor Project, Inc.
+Copyright (c) 2006 Scott Squires, Oleg Ivanov
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
diff --git a/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/chrome.manifest b/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/chrome.manifest
new file mode 100644
index 0000000..d2eafb9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/chrome.manifest
@@ -0,0 +1,8 @@
+content icecathome chrome/content/
+
+locale icecathome af chrome/locale/es/
+locale icecathome ak chrome/locale/en/
+
+component {a364a9c0-2960-11e4-8c21-0800200c9a66} components/aboutIceCat.js
+contract @mozilla.org/network/protocol/about;1?what=icecat {a364a9c0-2960-11e4-8c21-0800200c9a66}
+
diff --git a/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/chrome/content/aboutIceCat/aboutIceCat.xhtml b/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/chrome/content/aboutIceCat/aboutIceCat.xhtml
new file mode 100644
index 0000000..65ca454
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/chrome/content/aboutIceCat/aboutIceCat.xhtml
@@ -0,0 +1,262 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE html [
+ <!ENTITY % htmlDTD
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "DTD/xhtml1-strict.dtd">
+ %htmlDTD;
+ <!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd">
+ %globalDTD;
+ <!ENTITY % aboutHomeDTD SYSTEM "chrome://browser/locale/aboutHome.dtd">
+ %aboutHomeDTD;
+ <!ENTITY % browserDTD SYSTEM "chrome://browser/locale/browser.dtd" >
+ %browserDTD;
+]>
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>&abouthome.pageTitle;</title>
+
+ <link rel="icon" type="image/png" id="favicon"
+ href="chrome://branding/content/icon32.png"/>
+ <link rel="stylesheet" type="text/css" media="all"
+ href="chrome://browser/content/abouthome/aboutHome.css"/>
+
+<style>
+
+label{
+position:relative;
+bottom:2px;
+left:2px;
+}
+
+#addonsform form{
+position:relative;
+left:10px;
+}
+
+em {
+color:#600
+}
+
+a{
+color:#004998
+}
+
+#addonsform{
+background-color:#fff;
+font-size:14px;
+padding:10px 30px 20px 30px;
+border-radius: 10px;
+box-shadow: 0px 0px 5px #888888;
+}
+
+.block-side-margin {
+ min-width: 16px;
+ -moz-box-flex: 1;
+}
+
+#block-horizontal-margin {
+ display: -moz-box;
+ -moz-box-flex: 1;
+}
+
+ul li {
+list-style:none;
+background:#ddd;
+border-radius:3px;
+padding:3px 5px 3px 5px;
+margin:5px;
+box-shadow: 0px 2px 0 #ccc ;
+float:left;
+}
+
+ul li a{
+font-weight:bold;
+color:#666;
+text-shadow:0px 1px 0px #fff;
+}
+
+#footer{
+min-height:100px;
+}
+
+</style>
+
+<script type="text/javascript">
+<![CDATA[
+
+Components.utils.import("resource://gre/modules/AddonManager.jsm");
+Components.utils.import("resource://gre/modules/Services.jsm");
+
+function flip(sel){
+ var id = sel.id;
+ var addonObj=-1;
+ AddonManager.getAddonByID(id, function(addon) {
+ addonObj=addon;
+ });
+ var thread = Components.classes["@mozilla.org/thread-manager;1"].getService().currentThread;
+ while (addonObj == null || addonObj == -1)
+ thread.processNextEvent(true);
+ addonObj.userDisabled = addonObj.isActive;
+ if ( addonObj.operationsRequiringRestart != 0)
+ alert("This change will be applied when you restart IceCat");
+}
+
+function languagesettings(sel){
+ if (sel.checked)
+ Services.prefs.setCharPref(sel.id,sel.value);
+ else
+ Services.prefs.clearUserPref(sel.id);
+}
+
+function fontsettings(sel){
+ if (sel.checked)
+ Services.prefs.setIntPref(sel.id,sel.value);
+ else
+ Services.prefs.clearUserPref(sel.id);
+}
+
+
+function prepare(){
+
+/*try {
+Services.prefs.getCharPref("extensions.icecathome.intl.accept_languages");
+}catch(err){
+Services.prefs.setCharPref("intl.accept_languages","en-US, en");
+Services.prefs.setCharPref("extensions.icecathome.intl.accept_languages","en-US, en");
+}
+
+try {
+Services.prefs.getIntPref("extensions.icecathome.browser.display.use_document_fonts");
+}catch(err){
+Services.prefs.setIntPref("browser.display.use_document_fonts",0);
+Services.prefs.setIntPref("extensions.icecathome.browser.display.use_document_fonts",0);
+}*/
+
+ var f = document.createElement("form");
+
+ var extensions=[
+["jid1-KtlZuoiikVfFew@jetpack","Block execution of non-free <a target=\"_blank\" href=\"http://www.gnu.org/software/librejs/\">JavaScript</a> <em>(experimental)</em>"],
+["{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}","Block privacy <a target=\"_blank\" href=\"https://easylist.adblockplus.org\">trackers</a>"],
+["torproxy@trisquel","Use <a target=\"_blank\" href=\"https://www.torproject.org/\">Tor</a> when in Private Mode"],
+["https-everywhere@eff.org","Get redirected to <a target=\"_blank\" href=\"https://www.eff.org/https-everywhere/faq\">HTTPS</a> when possible"],
+]
+
+ for (var i=0; i<extensions.length; ++i) {
+ var ex=extensions[i][0];
+
+ var tmp = document.createElement("input");
+ tmp.setAttribute('type',"checkbox");
+ tmp.setAttribute('id', ex);
+ tmp.setAttribute('onclick','flip(this);');
+
+ var label = document.createElement("label");
+ label.htmlFor = ex ;
+ label.id = ex+'label';
+ label.appendChild(document.createTextNode(''));
+
+ f.appendChild(tmp);
+ f.appendChild(label);
+ f.appendChild(document.createElement("br"));
+
+ document.getElementById("addonsform").appendChild(f);
+ }
+
+ var tmp = document.createElement("input");
+ tmp.setAttribute('type',"checkbox");
+ tmp.setAttribute('id', "intl.accept_languages");
+ tmp.setAttribute('value', "en-US, en");
+ tmp.setAttribute('onclick','languagesettings(this);');
+ value=Services.prefs.getCharPref("intl.accept_languages");
+ tmp.checked=(value=="en-US, en");
+ var label = document.createElement("label");
+ label.htmlFor = "intl.accept_languages" ;
+ label.id = "intl.accept_languageslabel";
+ label.appendChild(document.createTextNode("Request pages in English"));
+ f.appendChild(tmp);
+ f.appendChild(label);
+ f.appendChild(document.createElement("br"));
+ document.getElementById("addonsform").appendChild(f);
+
+ var tmp = document.createElement("input");
+ tmp.setAttribute('type',"checkbox");
+ tmp.setAttribute('id', "browser.display.use_document_fonts");
+ tmp.setAttribute('value', 0);
+ tmp.setAttribute('onclick','fontsettings(this);');
+ value=Services.prefs.getIntPref("browser.display.use_document_fonts");
+ tmp.checked=(value==0);
+ var label = document.createElement("label");
+ label.htmlFor = "browser.display.use_document_fonts" ;
+ label.id = "browser.display.use_document_fontslabel";
+ label.appendChild(document.createTextNode("Use system fonts"));
+ f.appendChild(tmp);
+ f.appendChild(label);
+ f.appendChild(document.createElement("br"));
+ document.getElementById("addonsform").appendChild(f);
+
+
+ for (var i=0; i<extensions.length; ++i) {
+ var ex=extensions[i][0];
+ var addonObj=-1;
+
+ AddonManager.getAddonByID(ex, function(addon) {
+ addonObj=addon;
+ });
+
+ var thread = Components.classes["@mozilla.org/thread-manager;1"].getService().currentThread;
+ while ( addonObj == -1)
+ thread.processNextEvent(true);
+ if ( addonObj != null){
+ document.getElementById(ex).checked = addonObj.isActive;
+ //document.getElementById(ex+'label').innerHTML = addonObj.name;
+ document.getElementById(ex+'label').innerHTML = extensions[i][1];
+ }else{
+ document.getElementById(ex).style.display='none';
+ document.getElementById(ex+'label').style.display='none';
+ }
+ }
+}
+
+
+]]>
+</script>
+
+ </head>
+
+ <body dir="&locale.dir;" onload="prepare();">
+
+ <div class="spacer"/>
+ <div id="topSection">
+ <img src="chrome://branding/content/about-logo.png"/>
+
+ <div id="searchContainer">
+ <form name="searchForm" id="searchForm" action="https://duckduckgo.com/html/">
+ <input type="text" name="q" value="" id="searchText" maxlength="256"
+ autofocus="autofocus"/>
+ <input id="searchSubmit" type="submit" value="&abouthome.searchEngineButton.label;"/>
+ </form>
+ </div>
+
+ </div>
+
+ <div class="spacer"/>
+
+<div id="block-horizontal-margin">
+<div class="block-side-margin"></div>
+<div id="addonsform">
+<h3>Enabled privacy features:</h3>
+<p>The <a target="_blank" href="http://www.gnu.org/software/gnuzilla/">GNU IceCat</a> web browser protects your <a target="_blank" href="http://www.gnu.org/philosophy/free-sw.html">freedom</a> and your privacy!</p>
+</div>
+<div class="block-side-margin"></div>
+</div>
+
+ <div class="spacer"/>
+
+ </body>
+</html>
+
diff --git a/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/chrome/locale/en/aboutIceCat.dtd b/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/chrome/locale/en/aboutIceCat.dtd
new file mode 100644
index 0000000..55efd56
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/chrome/locale/en/aboutIceCat.dtd
@@ -0,0 +1 @@
+<!ENTITY aboutIceCat.title "About IceCat">
diff --git a/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/chrome/locale/es/aboutIceCat.dtd b/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/chrome/locale/es/aboutIceCat.dtd
new file mode 100644
index 0000000..2412c09
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/chrome/locale/es/aboutIceCat.dtd
@@ -0,0 +1 @@
+<!ENTITY aboutIceCat.title "Acerca de IceCat">
diff --git a/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/components/aboutIceCat.js b/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/components/aboutIceCat.js
new file mode 100644
index 0000000..6b32cc1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/components/aboutIceCat.js
@@ -0,0 +1,72 @@
+/*
+
+Copyright (c) 2014, Ruben Rodriguez <ruben@gnu.org>
+Copyright (c) 2013, The Tor Project, Inc.
+Copyright (c) 2006 Scott Squires, Oleg Ivanov
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+// Module specific constants
+const kMODULE_NAME = "about:icecat";
+const kMODULE_CONTRACTID = "@mozilla.org/network/protocol/about;1?what=icecat";
+const kMODULE_CID = Components.ID("a364a9c0-2960-11e4-8c21-0800200c9a66");
+
+const kAboutIceCatURL = "chrome://icecathome/content/aboutIceCat/aboutIceCat.xhtml";
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cu = Components.utils;
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+function AboutIceCat()
+{
+}
+
+
+AboutIceCat.prototype =
+{
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIAboutModule]),
+
+ // nsIClassInfo implementation:
+ classDescription: kMODULE_NAME,
+ classID: kMODULE_CID,
+ contractID: kMODULE_CONTRACTID,
+
+ // nsIAboutModule implementation:
+ newChannel: function(aURI)
+ {
+ let ioSvc = Cc["@mozilla.org/network/io-service;1"]
+ .getService(Ci.nsIIOService);
+ let channel = ioSvc.newChannel(kAboutIceCatURL, null, null);
+ channel.originalURI = aURI;
+
+ return channel;
+ },
+
+ getURIFlags: function(aURI)
+ {
+ return Ci.nsIAboutModule.ALLOW_SCRIPT;
+ }
+};
+
+
+const NSGetFactory = XPCOMUtils.generateNSGetFactory([AboutIceCat]);
diff --git a/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/defaults/preferences/preferences.js b/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/defaults/preferences/preferences.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/defaults/preferences/preferences.js
diff --git a/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/install.rdf b/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/install.rdf
new file mode 100644
index 0000000..0f8065a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/abouticecat@gnu.org/install.rdf
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+
+ <Description about="urn:mozilla:install-manifest">
+ <em:name>IceCatHome</em:name>
+ <em:creator>Ruben Rodriguez</em:creator>
+ <em:id>abouticecat@gnu.org</em:id>
+ <em:version>1.0</em:version>
+ <em:updateURL>https://127.0.0.1/</em:updateURL>
+ <!-- <em:updateKey></em:updateKey> -->
+ <!-- firefox -->
+ <em:targetApplication>
+ <Description>
+ <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
+ <em:minVersion>30.0</em:minVersion>
+ <em:maxVersion>10000.0</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ </Description>
+</RDF>
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/Changelog b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/Changelog
new file mode 100644
index 0000000..c5f270b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/Changelog
@@ -0,0 +1,1426 @@
+3.5.1 (2014-04-25)
+ * Revert https://github.com/EFForg/https-everywhere/pull/134 due to YouTube
+ breakage.
+ * Re-enable ability to see all rulesets in enable/disable dialog.
+ * Added more Debian coverage.
+ * Fixes to Doubleclick, Guardian, Heroku, Home Depot, HypeMachine, IMDB,
+ Justin.tv, Kikatek, Mozilla, MyFitnessPal, Pinterest, XKCD, Reuters,
+ Technet, Tumblr, Wordpress, Yandex, Youtube, Flickr.
+ * Fix Australis icon positioning:
+ https://github.com/EFForg/https-everywhere/pull/216
+
+chrome-2014.4.25
+ * Ruleset fixes (same as 3.5.1)
+
+chrome-2014.4.16
+ * Make Chrome build script compatible with Chrome release scripts.
+ * Fix disappearing icon: https://github.com/EFForg/https-everywhere/pull/220
+ * Fix XKCD images
+
+chrome-2014.4.14.1
+ * Revert back to chrome-2014.1.3 because of bug in Chrome release script.
+
+chrome-2014.4.14
+ * Add SV localization
+ * Add persistent user-generated rules, thanks to Vijay P.:
+ https://github.com/EFForg/https-everywhere/pull/60
+ * Use onBeforeRedirect for redirect loop detection:
+ https://github.com/EFForg/https-everywhere/pull/199
+ * Remove unneeded onBeforeSendHeaders listener:
+ https://github.com/EFForg/https-everywhere/pull/172
+ * Fix host-only cookie bug:
+ https://github.com/EFForg/https-everywhere/pull/166
+ * Split incognito mode:
+ https://github.com/EFForg/https-everywhere/pull/165
+ * Cleanup pageAction icon code:
+ https://github.com/EFForg/https-everywhere/pull/173
+ * Add and modify some rulesets (same as 3.5)
+
+3.5 (2014-04-14)
+ * Merge all non-ruleset changes from 4.0development.16
+ * Merge all new/modified rulesets from 4.0development.16 that are
+ in the Alexa Top 1000 using utils/alexa-ruleset-checker.py. For a full list,
+ see utils/alexa-logs/07042014.log.
+
+4.0development.16 (2014-04-14)
+ * Restore code that loads custom rule files:
+ https://github.com/EFForg/https-everywhere/pull/156
+ * Use loadContext interface to get windows associated with requests
+ * Reduce annoying logging messages
+ * Report cert warning pages to SSL Observatory
+ * Remove SSL Observatory observers when disabled
+ * Don't set LOAD_REPLACE flag:
+ https://github.com/EFForg/https-everywhere/pull/134
+ * Add script to merge rulesets in Alexa Top 1M, thanks to Claudio MOretti:
+ https://github.com/EFForg/https-everywhere/pull/149
+ * 8 new rules
+ * 59 modified rules
+
+4.0development.15 (2014-02-05)
+ * Replace the single XML ruleset library with an sqlite database of rulesets
+ that are loaded on demand
+ - reduces startup time by a factor of 10-20:
+ https://trac.torproject.org/projects/tor/ticket/10174
+ - reduces RAM usage https://trac.torproject.org/projects/tor/ticket/4804
+ - Is scalable: https://trac.torproject.org/projects/tor/ticket/6118
+ Further analysis in this thread:
+ https://lists.eff.org/pipermail/https-everywhere/2014-January/001919.html
+ * Implement a cleanup case to recover from some Observatory UI code bugs that
+ would leave the Observatory off incorrectly.
+ https://trac.torproject.org/projects/tor/ticket/10728
+ * Fix observatory - private browsing mode interaction
+ https://trac.torproject.org/projects/tor/ticket/10208
+ * Ship 848 new rulesets
+ * Update cert whitelist
+
+3.5android.0 (2014-01-31)
+ * First Firefox for Android release! :D
+ * Major UI changes for mobile compatibility
+ * Android channel update URL set to
+ https://www.eff.org/files/https-everywhere-android-update-2048.rdf
+ * Updated rulesets: Freenode, Imgur
+
+3.4.5 (2014-01-03)
+ * Updated license
+ * Updated README.md
+ * Updated contributors list
+ * Fix a performance bug when re-enabling HTTPS-Everywhere from its menu
+ * Observatory cert whitelist update
+ * Updated rules: Atlassian, Brightcove, MIT, Pidgin, Microsoft, Whonix,
+ Skanetrafiken, Stack-Exchange, Stack-Exchange-mixedcontent
+
+chrome-2014.1.3
+ * Various ruleset fixes
+ * Various performance improvements, thanks to Nick Semenkovich and Jacob
+ Hoffman-Andrews!
+ * Add LRU caching for rules
+ * Refactor out unused code
+ * Reload page when rule is disabled
+ * Upgrade URI.js
+ * Add fi translation
+
+3.4.4tbb (2013-12-06)
+ * Pseudorelease, just for Tor Browser Bundle usage
+ * Tiny ruleset tweaks (XKCD is back)!
+ * Create an about:config setting that overrules mixedcontent ruleset disablement
+
+3.4.3 (2013-12-03)
+ * Fixes: Cloudfront / Amazon MP3 player, Cornell/Arxiv, FlickR,
+ AmazonAWS/spiegel.tv
+ * Disable broken: Barns and Noble, Behance, Boards.ie, Elsevier, Kohls,
+ OpenDNS, Spin.de, Svenskakyrkan
+ * Deprecate the ContentPolicy API, fixing a crash bug
+ lurking since Firefox 20:
+ https://bugzilla.mozilla.org/show_bug.cgi?id=939180
+ * Fix really silly Observatory UI bug that would leave the Observatory off
+ for non-Tor users after they turned it on
+ * Update Observatory blacklist
+ * Bump maxVersion from Firefox 25 to 28.
+
+4.0development.14 (2013-11-21)
+ * Deprecate the ContentPolicy API, fixing a crash bug
+ lurking since Firefox 20:
+ https://bugzilla.mozilla.org/show_bug.cgi?id=939180
+ * Fix really silly Observatory UI bug that would leave the Observatory off
+ for non-Tor users after they turned it on
+ * Ship 438 new rulesets
+ * Update Observatory blacklist
+
+4.0development.13 (2013-10-04)
+ * HTTPS Everywhere builds are now deterministic!
+ * Numerous new and updated rules
+
+3.4.2 (2013-10-04)
+ * HTTPS Everywhere builds are now deterministic!
+ * Global memory leak bug fixes
+ * Updated rules: Craigslist, Apple.com, Microsoft, CloudFront, UKLocalGov,
+ Bing, Cengage
+ * New rules from dev: IPTorrents.com, TvTorrents
+
+4.0development.12 (2013-09-12)
+ * Fix clients1.google.com OSCP meltdown
+ https://trac.torproject.org/projects/tor/ticket/9713
+ * Updated rules: ConnMan, Viddler.com, ISC, GNOME, Dozuki, Thingiverse, Box,
+ ComputerWorld, Makerbot, McClatchy Interactive.com, Mozilla, Ohio State
+ University, printrbot, Thingiverse, Tradedoubler, XiTi.com, Flameeyes, Open
+ Clipart Library, Musopen, CERN, FilZilla, Google Services, Linux Foundation,
+ Debian, Python.org, Ardour, Netmarble, Drexel University, Guifi.net,
+ net-security.org, University of California, WordPress blogs, Perl.org
+ * New rules: Akira.org, AntiPolygraph.org, Banu.com, break.com, Click and
+ Pledge.com, DataCoup.com, linux-sunxi.org, Lockbox.com, PSC.edu, University
+ of Greifswald, University of Rostock, WIMM.com, ZeusClicks.com,
+ gayorrents.net, Addison.com.hk, Auto Ad Manager.com, Blutmagie.de,
+ Brixwork.com, HDtracks.com, hostname.sk, iPXE.org, Linn Records.com,
+ Navigant Research.com, OpenLDAP.org, Quotes and Sayings.com, Solid-Run.com,
+ TU-Dresden.de, Tux.Org, Ultrasurf.us, Zamzar.com, chaox.net, digilinux.ru,
+ iNaturalist.org, IUCNredlist.org, jensge.org, Libre Graphics World.org,
+ NAB.org, PengPod.com, pythonhosted.org, randombit.net, factorable.net,
+ JoeyH.name, Acunetix.com, Alex Cabal.com, Altera.com, Commotionwireless.net,
+ CounterMail.com, dotplex.de, Dyne.org, finalrewind.net, Keelog.com,
+ Mailinator.com, My Shadow.com, OpenMailBox.org, PwdHash.com, Silent
+ Sender.com, Standard Ebooks.com, Tarasic.com.tw, Barracuda.com
+
+4.0development.11 (2013-08-30)
+ * Notify users who have been accidentally updated from stable to dev
+ https://trac.torproject.org/projects/tor/ticket/9600
+ * Added and updated numerous rules, including Craigslist
+ * Fixes toolbar button size
+ https://trac.torproject.org/projects/tor/ticket/9511
+ * Declare loop variables with var to avoid global memory leaks
+ * Updated localizations
+
+3.4.1
+ * Fix typo resulting in variable leak in get_prefs(), thanks to Jérémy
+ Bobbio
+
+3.4
+ * Do not upgrade stable users to the development branch!
+ * The previous release moved extension code from the development branch into
+ the stable branch, and changed many stable rules
+
+chrome-2013.8.17
+ * Urgent bugfix release for
+ https://trac.torproject.org/projects/tor/ticket/9507
+ - release from the stable / 3.0 branch, not master
+ - don't ship the development ruleset library, it's not ready for prime
+ time yet
+ - avoid performance hits from repeatedly re-testing rulesets
+ - other possible weirdness
+
+chrome-2013-8.16
+ * Includes all fixes from 3.3, 3.3.1, and 4.0development.10
+ * This will be the first Chromium release where the bulk of the rules that
+ are broken because of mixed content will be disabled by default
+
+4.0development.10
+ * Numerous rules added, modified, and deleted
+ * Added utils/find_rules.py, python script by Osama Khalid to apply HTTPS
+ Everywhere rules to URLs
+ * Updated readme to include more dependencies
+
+3.3.2
+ * We merged in a bunch of non-ruleset changes from 4.0development.9:
+ https://trac.torproject.org/projects/tor/ticket/9480
+ (Notable changes from this merge include a rewriting of fetch-source.js,
+ improvements to the CSS such that the icon changes color when disabled
+ and shows the number of applied rules when active, fixing bugs in
+ HTTPSRules.js and ApplicableList.js that led to undefined functions,
+ and rewriting makexpi.sh to accept a --fast flag.)
+ * The tickets described below were fixed by the merge from 4.0development.9:
+ https://trac.torproject.org/projects/tor/ticket/8998
+ https://trac.torproject.org/projects/tor/ticket/9374
+ * Add a script find_rules.py by Osama Khalid to utils/. It applies HTTPS
+ Everywhere rules to URLs.
+ * Add merge-rulesets.py from master to utils/.
+ * Removed default parameters for a js function that caused breakage
+ in older versions of FF.
+ * Changed mixed content blocking in FF to be based on the user's active
+ content blocking preferences rather than if the FF version is >=23.0.
+ * [Zurcher_Katonalbank] Add rule
+ * [LegitScript] www now supports SSL
+ * [DebianOwnCA] Debian self-signed cert rules
+ * [Debian] Update rule for non-self-signed domains
+ * [UKLocalGov] Add havering.gov.uk
+ * [aeriagames] Use CDN with valid cert
+ * [spu.ac.th] Disable (https site not found)
+ * Added rules from mishari for Loxinfo, SPU, Silkspan, Settrade,
+ Powerbuy, opengarden.com, Naiin, MyHappyOffice, Mirakar,
+ MarketingOops, Makewebeasy, m2fjob, LandandHouse, Jaymart,
+ Etravelway, Craigslist, Blognone, TrueCorp, dealfish, 3bbwifi,
+ thepiratebay, and priceza.
+ * [Ubuntu] Add rule for ubuntuforums.org
+ * [EuroBillTracker.xml] Add EuroBillTracker rule
+ * [wikidot] Exclusion for iframes
+ * [StockCharts] Add reason for disabling
+ * [9gag] Disable rule for breaking AJAX.
+ * [MayFirstPeopleLink] Updated rule
+ * [Derpiboo.ru] Add rule
+ * [Fedora Project] Split start
+ * [Lurkmore.to] Add rule
+ * [2ch.so] Add rule
+ * [FSF] Added the status and u subdomains
+ * [Reddit] Exclude blog
+ * [Desk.com] Fix
+ * [Cheezburger] Fix
+ * Updated debian dependencies in readme
+ * [Adtech.de] Add exclusion
+
+3.3.1
+ * [Wikimedia] removed mixedcontent
+
+4.0development.9
+ * Includes all fixes from 3.3
+
+3.3
+ * This major release fixed the following mixed content blocker (MCB)
+ related bugs in time for Firefox 23:
+ https://trac.torproject.org/projects/tor/ticket/9196
+ https://trac.torproject.org/projects/tor/ticket/8774
+ https://trac.torproject.org/projects/tor/ticket/8776
+ * In effect, this update disables rulesets that cause mixed content errors
+ by default, and adds platform="mixedcontent" to 950 new rules. This is
+ necessary to prevent a massive amount of websites from breaking by default
+ for our users when Firefox 23 comes out.
+ * [Internet Archive] Moved to stable
+ * [Linaro] Default off per webmaster request
+ * [Applicom] Default off per webmaster request
+
+chrome-2013.7.10
+ * In Chrome version, fixed css, "What is this?" link in popup, and added
+ favicons to popup (thanks to Jay Weisskopf)
+ * Includes all fixes from 3.2.4
+
+3.2.4 (2013-07-10)
+ * [Yandex] remove maps from exclusions
+ * [Amazon Web Services] Add exclusion
+ https://trac.torproject.org/projects/tor/ticket/8907
+ * [Hotmail / Live] Add exclusion
+ https://trac.torproject.org/projects/tor/ticket/9026
+ * [Mozilla] Point labs to mozillalabs.org
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2013-July/001636.html
+ * [Yandex] Exclude ll
+ * [Brightcove] Add exclusion
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2013-May/001587.html
+ * [NYTimes] Add exclusion, disabled
+ * [News Corporation] Exclude 2013 images
+ https://trac.torproject.org/projects/tor/ticket/9040
+ * [imgbox] Fix typo
+ https://trac.torproject.org/projects/tor/ticket/8690
+
+3.2.3 (2013-06-28)
+ * https://trac.torproject.org/projects/tor/query?group=status&milestone=HTTPS-E+3.2.3
+
+chrome-2012.6.4
+ * The "factors of 12" chromium beta
+ * Various ruleset fixes:
+ https://eff.org/r.5bSj
+ https://trac.torproject.org/projects/tor/ticket/8584
+ https://trac.torproject.org/projects/tor/ticket/8571
+ * Disable Myspace by default due to mixed content
+
+4.0development.8 (2013-06-04)
+ * Fix broken ruleset dialog in Firefox 22+
+ https://trac.torproject.org/projects/tor/ticket/8997
+ * The toolbar button chnages to indicate active rulesets:
+ https://trac.torproject.org/projects/tor/ticket/4886
+ * Ship 31 new rulesets
+ * New translations: Japanese and Sinhala
+ * Updated translations: Hungarian, Lithuanian, Slovenian
+ * Ruleset fixes from 3.2.2:
+ https://eff.org/r.5bSj
+ * Observatory cert whitelist update
+
+3.2.2 (2013-05-22)
+ * Quick turn-around release to unbreak support.apple.com
+ * Fixes for a number of other ruleset bugs:
+ https://eff.org/r.5bSj
+ * Incremental observatory cert whitelist update
+
+3.2.1 (2013-05-17)
+ * Implement XHR outstanding request limits to work around TCP connection
+ exhaustion if the SSL Observatory server is slow or down:
+ https://trac.torproject.org/projects/tor/ticket/8670
+ https://bugzilla.mozilla.org/show_bug.cgi?id=856748
+ * Overdue update to the Observatory cert whitelist
+ * Other known ruleset fixes: EA, Yandex, Apple
+ https://trac.torproject.org/projects/tor/ticket/8584
+ https://trac.torproject.org/projects/tor/ticket/8571
+
+4.0development.7 (2013-05-17)
+ * Implement XHR outstanding request limits to work around TCP connection
+ exhaustion if the SSL Observatory server is slow or down:
+ https://trac.torproject.org/projects/tor/ticket/8670
+ https://bugzilla.mozilla.org/show_bug.cgi?id=856748
+ * Add a note hinting users how to toggle rulesets (thanks to Pavel Kazakov)
+ https://trac.torproject.org/projects/tor/ticket/4967
+ * Ship all fixes from 3.2:
+ https://eff.org/r.b9Qc
+ * Other known ruleset fixes: EA, Yandex
+ https://trac.torproject.org/projects/tor/ticket/8571
+ * Ship 1308 new rulesets!
+ * Numerous new and updated translations
+
+chrome-2012.4.30
+ * The "May day somewhere" chromium beta
+ * Ship all ruleset bugfixes from the Firefox 3.2 release:
+ https://eff.org/r.b9Qc
+ * Flag/disable mixed content rulesets: Apple Support, BBC, Dell support,
+ FBI, Wordpress, Zend
+ https://eff.org/r.1bQt
+ * Disable VistaX64
+ https://trac.torproject.org/projects/tor/ticket/8801
+
+3.2 (2013-04-25)
+ * Related trac bugs for this release:
+ https://eff.org/r.b9Qc
+ * New: MoinMoin
+ * Fixes: Adobe, Bahn.de, Cloudfront, Dell, Droplr, FBI, Google Maps,
+ Joomla, Juno Download, Lenovo, New York Times, SEC, Soundcloud,
+ Tweakers.net, Univ Strasbourg, Vkontakte, Zend
+ * Disable broken: AirAsia, Netvibes, Newgrounds, Pirate Bay, Russia Today, SVT,
+ Wolfram Alpha
+ * Maybe fixed: Quantcast/Tumblr:
+ https://trac.torproject.org/projects/tor/ticket/8406 (maybe fixed)
+ * Sync languages and translations from the master branch.
+ * New languages: Finnish, Norwegian (Bokmål), Slovak, Bulgarian.
+ * All HTTPS Everywhere users will be now prompted about using the
+ SSL Observatory.
+
+chrome-2012.3.7
+ * The "cookies uncrumbled" chromium beta
+ * Ship all ruleset bugfixes from Firefox 3.1.4
+ * Stop securing HTTP (non-S) cookies in weird cases!!!
+ https://trac.torproject.org/projects/tor/ticket/7492
+
+4.0development.6 (2013-03-07)
+ * Disabled 26 broken or problematic rulesets
+ * Ship all ruleset fixes from 3.1.4
+ * Ship 232 new rulesets
+ * Numerous ruleset fixes
+ * Update cert whitelist
+
+3.1.4 (2013-03-07)
+ * The circles are stable releasee
+ * Fixes:
+ AmazonAWS/Atomsforpeace.info, Disqus, Eventbrite, ImageShack.us, MySQL,
+ NuGet, NYTimes, Ooyala, Opera, Scientific American, SourceForge,
+ University of Southampton, UserVoice, WebType, Zendesk
+ https://trac.torproject.org/projects/tor/ticket/8056
+ https://trac.torproject.org/projects/tor/ticket/8349
+ https://trac.torproject.org/projects/tor/ticket/7690
+ https://trac.torproject.org/projects/tor/ticket/8025
+ https://trac.torproject.org/projects/tor/ticket/8077
+ https://trac.torproject.org/projects/tor/ticket/8199
+ https://trac.torproject.org/projects/tor/ticket/8198
+ * Disable broken:
+ American Public Media (for real this time), Asymmetric Publications,
+ Salsa Labs, Vimeo
+ https://trac.torproject.org/projects/tor/ticket/7650
+ https://trac.torproject.org/projects/tor/ticket/8280
+ https://trac.torproject.org/projects/tor/ticket/7569
+ * Update cert whitelist
+
+chrome-2013.1.18
+ * "Internet Freedom" chromium beta
+ * Import all ruleset fixes from Firefox 3.1.3
+
+4.0development.5 (2013-1-18)
+ * Internet Freedom Day development release
+ * Fix the implementation of safeToSecureCookie
+ - Get https://trac.torproject.org/projects/tor/ticket/7491 right(er)
+ - Fix https://trac.torproject.org/projects/tor/ticket/7855
+ * Fix a ruleset processing bug, which would prevent <target host="*.z.com">
+ from matching x.y.z.com
+ * Ship all ruleset fixes from 3.1.2 and 3.1.3
+ - Except Etsy, where we're trying to fix rather than disable the ruleset
+ https://trac.torproject.org/projects/tor/ticket/7774
+ * Ship 354 new rulesets
+ * Update cert whitelist
+ * Update translations: Korean, Polish, French
+
+3.1.3 (2013-1-18)
+ * Internet Freedom Day stable bugfix release
+ * Fixes: CloudFront/Spotify, AmazonAWS (Amazon MP3s and product images), Libav,
+ Google Maps, UserEcho
+ https://trac.torproject.org/projects/tor/ticket/7931
+ https://trac.torproject.org/projects/tor/ticket/7888
+ https://trac.torproject.org/projects/tor/ticket/7594
+ https://trac.torproject.org/projects/tor/ticket/7539
+ https://trac.torproject.org/projects/tor/ticket/7698
+ * Disable broken: Coursera, EBay, Etsy, OpenOffice, Ping.fm, Pinterest :(
+ https://trac.torproject.org/projects/tor/ticket/7336
+ https://trac.torproject.org/projects/tor/ticket/7825
+ https://trac.torproject.org/projects/tor/ticket/7774
+ https://trac.torproject.org/projects/tor/ticket/7695
+ https://trac.torproject.org/projects/tor/ticket/7777
+ https://trac.torproject.org/projects/tor/ticket/7865
+ * Update cert whitelist
+
+3.1.2 (2013-1-2)
+ * Release 3.1.2, since 3.1.1 was accidentally mis-tagged
+ * Fixes for: AmazonAWS/Datawrapper, Cachefly, Cloudfront/C-SPAN, Hetzner.de
+ KeyDrive/Snapnames, QT, openDesktop, OpenTTD, WhiskeyMedia
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-December/001432.html
+ https://trac.torproject.org/projects/tor/ticket/7608
+ https://trac.torproject.org/projects/tor/ticket/7567
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-December/001432.html
+ https://trac.torproject.org/projects/tor/ticket/7560
+ https://trac.torproject.org/projects/tor/ticket/7796
+ * Disable broken: FlossManuals, Pastebin, Poste.it, Ustream, TED, AusGamers
+ https://trac.torproject.org/projects/tor/ticket/7731
+ https://trac.torproject.org/projects/tor/ticket/7850
+ https://trac.torproject.org/projects/tor/ticket/7840
+ https://trac.torproject.org/projects/tor/ticket/7548
+ * Increase Observatory deployment (65%->85%)
+ * Update cert whitelist
+
+chrome-2012.12.17
+ * The "overdue bugfixes" chromium beta
+ * Ship all ruleset bugfixes from Firefox 3.1 and 3.0.4
+ * Additional fixes for: AmazonAWS/Datawrapper, Cachefly, Cloudfront/C-SPAN,
+ Hetzner.de, KeyDrive/Snapnames, QT
+ * Additionally disable: Automattic
+
+4.0development.4 (2012-12-17)
+ * Fix nasty bug that prevented Firefox downloads from Mozilla's CDN
+ https://trac.torproject.org/projects/tor/ticket/7717
+ * Fix download from qt-project.org
+ * Ship 72 new rulesets
+ * Include all rulset fixes from 3.1
+
+3.1 (2012-12-12)
+ * Hacky solution to a very nasty bug in which <securecookie> directives
+ would cause cookies to be flagged as secure even if they were set from
+ HTTP origins!
+ https://trac.torproject.org/projects/tor/ticket/7491
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-November/001397.html
+ * Fixes: Akamai, Biomed central, BYU, Cachefly / Topix, DuckDuckGo, Focus.de,
+ Fortum, Mashable, Mail.ru, MayFirst/People Link, MIT, Rackspace,
+ Salsa Labs, SurveyMonkey, Tumblr
+ * Disable: Adtech.de, AllthingsD American Public Media, Dafont, MediaFire,
+ Verizon, vk.com, Wired, Conde Nast
+ * Observatory-only translations into Hebrew and Croatian
+ * Offer the SSL Observatory popup to a larger cohort of users
+
+4.0development.3 (2012-12-3)
+ * Hacky solution to a very nasty bug in which <securecookie> directives
+ would cause cookies to be flagged as secure even if they were set from
+ HTTP origins!
+ https://trac.torproject.org/projects/tor/ticket/7491
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-November/001397.html
+ * Ship 245 new rulesets
+ * Fixes include: Internet Archive, Rackspace
+ * Disable broken: American Public Media, Verizon, Nieuwsblad.be, MyOpenID
+ * (Plus fixes and rulesets disabled between 4.0dev2 and 3.0.4)
+ * Observatory-only translations: Croatian, Hebrew
+
+3.0.4 (2012-11-9)
+ * Fixes:
+ ACLU, Amazon, Barnes & Noble, CharityNavigator, Cloudfront/Turntable.fm,
+ Coursera, itella.fi, posti.fi, Uservoice
+ https://trac.torproject.org/projects/tor/ticket/7336
+ https://trac.torproject.org/projects/tor/ticket/7273
+ https://trac.torproject.org/projects/tor/ticket/7227
+ * Disable broken:
+ Asterisk, Boston Globe (separated out from NYTimes.com), Extabit, Gawker,
+ Google Services (Followers widget), NPR, SF.se, SonyMusic, Statcounter, WebType
+ https://trac.torproject.org/projects/tor/ticket/7270
+ https://trac.torproject.org/projects/tor/ticket/7243
+ https://trac.torproject.org/projects/tor/ticket/7361
+ https://trac.torproject.org/projects/tor/ticket/7120
+ https://trac.torproject.org/projects/tor/ticket/7278
+ https://trac.torproject.org/projects/tor/ticket/7363
+ https://trac.torproject.org/projects/tor/ticket/7294
+ * No longer cacert: lawblog.de
+ * Offer the SSL Observatory popup to a larger cohort of users
+ * Update translations: Spanish, Russian, Turkish, Swedish
+
+chrome-2012.10.31
+ * The "ghosts and goblins" chromium alpha
+ * Work around a nasty bug that was affecting some high-volume Live Youtube streams
+ (but not other live YouTube streams)
+ https://trac.torproject.org/projects/tor/ticket/7127
+ * Other Fixes:
+ AdaCore, Akamai/MTV3 Katsomo, Akamai/HP, Atlassian, Bahn.de, MySQL, NPR, PBS,
+ Phronoix Media/Openbenchmarking, SSRN, Spoki
+ https://trac.torproject.org/projects/tor/ticket/7219
+ https://trac.torproject.org/projects/tor/ticket/7180
+ https://trac.torproject.org/projects/tor/ticket/7135
+ https://trac.torproject.org/projects/tor/ticket/7206
+ https://trac.torproject.org/projects/tor/ticket/7198
+ * Disable broken/buggy:
+ CBS/Last.fm, Citibank Australia, Bytename, HP, NIFTY, Microchip, MyOpenID, NttDocomo
+ https://trac.torproject.org/projects/tor/ticket/6587
+ https://trac.torproject.org/projects/tor/ticket/7226
+ https://trac.torproject.org/projects/tor/ticket/7111
+ https://trac.torproject.org/projects/tor/ticket/7161
+ https://trac.torproject.org/projects/tor/ticket/7114
+ https://trac.torproject.org/projects/tor/ticket/7138
+ https://trac.torproject.org/projects/tor/ticket/7107
+
+3.0.3 (2012-10-29)
+ * Work around a nasty bug that was affecting some high-volume Live Youtube streams
+ (but not other live YouTube streams)
+ https://trac.torproject.org/projects/tor/ticket/7127
+ * Other Fixes:
+ AdaCore, Akamai/MTV3 Katsomo, Akamai/HP, Atlassian, Bahn.de, DemocracyNow, MySQL, NuGet,
+ PBS, Phronoix Media/Openbenchmarking, SSRN, Spoki
+ https://trac.torproject.org/projects/tor/ticket/7219
+ https://trac.torproject.org/projects/tor/ticket/7180
+ https://trac.torproject.org/projects/tor/ticket/7135
+ https://trac.torproject.org/projects/tor/ticket/7206
+ https://trac.torproject.org/projects/tor/ticket/7198
+ * Disable broken/buggy:
+ CBS/Last.fm, Citibank Australia, Bytename, HP, NIFTY, Microchip, MyOpenID, NttDocomo
+ https://trac.torproject.org/projects/tor/ticket/6587
+ https://trac.torproject.org/projects/tor/ticket/7226
+ https://trac.torproject.org/projects/tor/ticket/7111
+ https://trac.torproject.org/projects/tor/ticket/7161
+ https://trac.torproject.org/projects/tor/ticket/7114
+ https://trac.torproject.org/projects/tor/ticket/7138
+ https://trac.torproject.org/projects/tor/ticket/7107
+ * Updated translations:
+ Greek, Russian, Latvian
+ * New translation:
+ Turkish
+ * Offer the SSL Observatory popup to a larger cohort of users
+
+4.0development.2 (2012-10-25)
+ * Ship 67 new rulesets
+ * Fix broken logouts from non-US Google accounts:
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-October/001347.html
+ * Other fixes:
+ Microsoft (Bing login button), ZeniMax, Ubuntuone, TrueCrypt, Springer,
+ Optical Society, IMDB, Facebook, EzineArticles, Broadband Reports, Apache,
+ Akamai (exclude Zynga content to prevent breakage of some Zynga games),
+ Costco, Atlassian, Akamai/MTV3 Katsomo
+ * Disable broken/buggy:
+ HP, Bytename, NIFTY, Microchip, NttDocomo
+ * Updated translations:
+ Greek, Russian, Latvian
+ * New translation:
+ Turkish
+
+chrome-2012.10.18
+ * The "even more perfect" chromium alpha
+ * Fixes from the last two Firefox releases:
+ Microsoft (Bing login button), ZeniMax, Ubuntuone, TrueCrypt, Springer,
+ Optical Society, IMDB, Facebook, EzineArticles, Broadband Reports, Apache,
+ Akamai (exclude Zynga content to prevent breakage of some Zynga games),
+ Costco Akamai/SVTplay.se, Bahn.de, European Southern Observatory, IEEE,
+ Indeed, Java, Librivox, Pinterest, New York Times, Springer, Vimeo,
+ Shannon Health, O'Reilly Media
+ * Also fix: DemocracyNow, NuGet
+ * Disable: NIFTY
+
+3.0.2 (2012-10-16)
+ * Some fixes that should have shipped in 3.0.1, but actually didn't:
+ European Southern Observatory, Indeed, LibriVox
+ * New fixes:
+ Microsoft (Bing login button), ZeniMax, Ubuntuone, TrueCrypt, Springer
+ (fix / reenable), Optical Society, IMDB, Facebook, EzineArticles,
+ Broadband Reports, Apache, Akamai (exclude Zynga content to prevent
+ breakage of some Zynga games), Costco
+
+4.0development.1 (2012-10-11)
+ * Merge the 4.0 branch, which ships 884 new rulesets and expands
+ hundreds of others
+
+3.0.1 and 4.0development.1:
+ * Fixes: adition.com, Akamai/SVTplay.se, Bahn.de, European Southern Observatory,
+ IEEE, Indeed, Java, Librivox, Pinterest, New York Times, Springer, Vimeo,
+ Shannon Health, O'Reilly Media
+ https://trac.torproject.org/projects/tor/ticket/7080
+ https://mail1.eff.org/pipermail/https-everywhere/2012-October/001583.html
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-October/001339.html
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-October/001343.html
+ * Disable broken: Springer
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-October/001340.html
+ * Updated translations: Basque, Hungarian, Traditional Chinese
+
+chrome-2012.10.9
+ * The "prepare for liftoff" chromium alpha
+ * Add an experimental Spanish translation!
+ * Fixes:
+ Akamai/CNN, GO.com/ABC, AWS/Amazon Zeitgeist MP3 player, AWS/Spiegel.tv,
+ Technology Review, Cloudfront/Tunein, Akamai/Discovery Channel, Beyond
+ Security, OCaml, Gentoo, Nokia, Widgetbox.com, Squarespace, 1and1
+ Internet, American Physical Society, Baker and Taylor, Barnes and Noble,
+ Cloudfront, Trustguard, IEEE, Mozilla, Nrelate, OpenDNS, RFC Editor,
+ Symantec, Valve, Zenimax-Media
+ * Disable buggy: Web.de, AJC.com, Feross, Bestofmedia, Grooveshark, Gearhog
+
+3.0 (2012-10-04)
+ * Since version 2.x:
+ * 1,455 new active rulesets
+ * UI improvements:
+ - right-click to view ruleset source in the config window
+ - translate some untranslated menus
+ - better icons in a few places (breaking/redirecting rules,
+ context button)
+ * Numerous improvements to the SSL Observatory internals, including cached
+ submissions on hostile networks, better Tor and Convergence integration,
+ and a new setting to control self-signed cert submission
+ * New translations: Basque, Czech, Danish, French, Greek, Hungarian,
+ Italian, Korean, Malaysian, Polish, Slovak, Turkish,
+ Traditional Chinese
+ * Relative to 3.0development.8:
+ * Only promote the Decentralized SSL Observatory to 5% of non-Tor users
+ * Update the SSL Observatory whitelist of common cert chains
+ * Fixes, mostly in the CDN/media playback department:
+ Akamai/CNN, GO.com/ABC, AWS/Amazon Zeitgeist MP3 player,
+ AWS/Spiegel.tv, Technology Review, Cloudfront/Tunein,
+ Akamai/Discovery Channel, Beyond Security, OCaml, Gentoo,
+ Nokia, Widgetbox.com, Squarespace
+ https://trac.torproject.org/projects/tor/ticket/4199
+ https://trac.torproject.org/projects/tor/ticket/6871
+ https://trac.torproject.org/projects/tor/ticket/6992
+ https://trac.torproject.org/projects/tor/ticket/7000
+ https://trac.torproject.org/projects/tor/ticket/7020
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-October/001324.html
+ * Disable buggy: Web.de, AJC.com, Feross, Bestofmedia
+ * Remove a lot of off-by-default rulesets from the code, since they have
+ some costs in terms of startup speed and RAM usage
+
+3.0development.8 (2012-10-03)
+ * 3.0 stable release candidate 1
+ * Fixes: AOL, 1and1 Internet, American Physical Society, Antispam.de, BBC,
+ Baker and Taylor, Barnes and Noble, BitTorrent, CacheFly,
+ CheezBurger, Cleverbridge, Cloudfront, Facebook, Trustguard,
+ IEEE, Link Plus Catalog, Microsoft, Mozilla, News Corp, Nrelate,
+ OpenDNS, PassThePopcorn, Pidgin, Piriform, RFC Editor, Symantec,
+ Telegraph, Transmission, Valve, Zenimax-Media,
+ kirjoitusalusta.fi, uTorrent
+ * Reenable: CodingTeam
+ * Disable broken: GrooveShark, Gearhog, Paper.li, Soton.ac.uk, SVT.se
+ * Various translation improvements
+ * Support a new platform="mixedcontent" attribute
+ * Switch to the actual HTTPS Everywhere logo for the context menu button
+
+
+chrome-2012.9.21
+ * Workaround for breakage in Amazon Look Inside the Book (via Cloudfront)
+ https://trac.torproject.org/projects/tor/ticket/6848
+ * Replace jsURI with URI.js, fixing a number of bugs in the Chrome port
+ - https://trac.torproject.org/projects/tor/ticket/6197
+ - Also breakage on other random pages like
+ http://venturebeat.com/2012/09/13/how-do-not-track-could-destroy-the-internet-as-you-know-it/
+ * Fixes: AOL, Antispam.de, BBC, BitTorrent, Facebook, Gearhog, LinkPlus
+ Catalog, Microsoft, Mother Jones, Mozilla, Office.co.uk, OpenDNS,
+ PassThePopcorn, Piriform, WhatCD, uTorrent
+ * Disable broken: Paper.li, SVT.se, Soton.ac.uk
+ * Reenable: Referly
+
+chrome-2012.9.10
+ * The "just add eleven" chromium alpha
+ * Time to test the updating mechanism from direct -> Chrome Web Store
+ installs
+ * Ruleset changes in addition to those in FF 3.0dev7:
+ * Fixes: News Corp, Cheezburger, CacheFly, Cleverbridge, Nrelate,
+ Pidgin, Telegraph
+ * Improvements: Global Marketing Strategies
+
+
+3.0development.7 (2012-09-07)
+ * Add a cleanup routine for profiles affected by a 2.2 defaults bug:
+ https://mail1.eff.org/pipermail/https-everywhere/2012-August/001511.html
+ * Make Decentralized SSL Observatory-Tor interactions saner in the wake of
+ Torbutton transitioning to "always on" (we now detect a local Tor instance
+ on port 9050 and use it)
+ https://trac.torproject.org/projects/tor/ticket/6541
+ * Fix some other bugs in the Observatory proxy-wrangling code
+ * Disable broken/buggy rulesets: Voxel, Mapquest, Imgur, Justin.tv,
+ F-Secure, Valve, SpringFiles, openDesktop, syllabushare, Playboy, FAZ
+ * Fixes / Improvements: Eloqua, OpenDNS, Mashable, News Corp, Sony, Yahoo!,
+ Examiner.com, FBI, Adtechus, Mozilla, Dreamhost, Lenovo / Thinkpad, Pirate
+ Party, Scribd
+ * New Czech translation
+
+3.0development.6 (2012-08-16)
+ * Prevent ruleset bugs from crashing the UI
+ https://trac.torproject.org/projects/tor/ticket/6280
+ * Fix a lack-of-translation bug in the context menu
+ https://trac.torproject.org/projects/tor/ticket/6516
+ (although coverage will probably be patchy for a while)
+ * Add hooks to use our new Firefox internal rewrite API, if the browser
+ has it (this should address
+ https://trac.torproject.org/projects/tor/ticket/5477
+ https://trac.torproject.org/projects/tor/ticket/3190
+ )
+ * Fixes: OpenStreetMap, Okcupid, Yandex, Valve, Atlantic Media, AWS,
+ XDA developers, Tumblr, MetaPress, Mixpanel, VideoLAN, JBoss,
+ Yourhosting, Pypi, QT, Imgur, Scientific American,
+ Chronicle, ISOC, Wikimedia, Xmission, Tumblr, OpenDNS
+ Mobygames, Telegraph Media, Dailymotion, RFC-editor, US gov,
+ Discogs, Costco, Brightcove, PirateParty, BrownPaperTickets
+ * Improvements: Apple, MIT
+ * Disable buggy/broken: ZDNet, Globe and Mail, Malwarebytes, Plenty of Fish,
+ Raymond.CC, Blip.tv, Governo Portugês, adf.ly,
+ McAfee :( :( :(
+ * New translations: Italian, Turkish, Traditional Chinese, Korean
+ * Numerous updated translations
+
+chrome-2012.8.16
+ * The "exponential bifurcation" alpha
+ * Change the update URI to the specific one blessed by the Chrome Web Store
+ (they tell us that, despite appearances, the request will actually be
+ https)
+
+chrome-2012.8.15
+
+ * The "Happiness in the Cloud" Alpha
+ * We still suffer from the horrible Appcache bug, so this is still an alpha:
+ https://trac.torproject.org/projects/tor/ticket/5585
+ https://code.google.com/p/chromium/issues/detail?id=121325
+ * Enslave ourselves to the Chrome Web Store, because Google has made it
+ very tricky to install .crx files in Chrome version 21
+ https://code.google.com/p/chromium/issues/detail?id=133818
+ https://code.google.com/p/chromium/issues/detail?id=128748
+ * Do a better job of displaying the context menu, especially for error pages:
+ https://trac.torproject.org/projects/tor/ticket/6085
+ (should be fixed for real this time)
+ * Fancier Chrome context menus by Jay Weisskopf
+ * Fixes: OpenStreetMap, Okcupid, Yandex, Valve, Atlantic Media, AWS,
+ XDA developers, Tumblr, MetaPress, Mixpanel, VideoLAN, JBoss,
+ Yourhosting, Pypi, QT, Imgur, Scientific American,
+ Chronicle, ISOC, Wikimedia, Xmission, Tumblr, OpenDNS
+ Mobygames, Telegraph Media, Dailymotion, RFC-editor, US gov,
+ Discogs, Costco, Brightcove, PirateParty, BrownPaperTickets,
+ * Improvements: Apple, MIT
+ * Disable buggy/broken: ZDNet, Globe and Mail, Malwarebytes, Plenty of Fish,
+ Raymond.CC, Blip.tv, Governo Portugês, adf.ly
+ McAfee :( :( :(
+
+3.0development.5 (2012-06-26)
+ * Fix the enable/disable button in Firefox 15
+ https://trac.torproject.org/projects/tor/ticket/6212
+ * Fixes: GetFirebug, Gentoo, Ebay, Yandex (extensive), Maxmind, Blogger, HP,
+ Jottit
+ * Disable broken: Project Syndicate, Alton Towers, Network for Good
+ https://trac.torproject.org/projects/tor/ticket/6222
+ * The Decentralized SSL Observatory client now saves up some certificates if
+ the network blocks or MITMs attempts to submit them.
+
+chrome-2012.6.21
+ * The Autonomous Greenland Beta Release
+ * Allow rulesets to be toggled when the page breaks completely
+ https://trac.torproject.org/projects/tor/ticket/6085
+ * Fixes: Github, Gentoo, HP, Maxmind, Orange
+ * Disable broken: Alton Towers, Project Syndicate
+ * Only ship 1 new ruleset (we're in a freeze)
+
+3.0development.4 (2012-06-18)
+ * Fix compatibility bug with Firefox 15:
+ https://trac.torproject.org/projects/tor/ticket/5893
+ * Ship 217 new rulesets (frozen; new rulesets now have to wait until 4.0
+ development)
+ * Fixes: numerous, including: Boxee, CiteULike, MozillaMessaging,
+ Yandex, Demonoid, Pirate Party, Gentoo, NYTimes, Microsoft,
+ Wikipedia, Lenovo, MyWOT
+ https://trac.torproject.org/projects/tor/ticket/5912
+ https://trac.torproject.org/projects/tor/ticket/6091
+ https://trac.torproject.org/projects/tor/ticket/5703
+ https://trac.torproject.org/projects/tor/ticket/5931
+ https://trac.torproject.org/projects/tor/ticket/5958
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-June/001189.html
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-June/001190.html
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-May/001186.html
+ https://mail1.eff.org/pipermail/https-everywhere/2012-May/001433.html
+ * Disable broken: MarketWatch, Disqus, Magento, Lavasoft,
+ Typepad/Say Media, Thomas Cook, Thomson Reuters clients,
+ Science Daily, BinRev, Ikea, Interpol
+ https://trac.torproject.org/projects/tor/ticket/5899
+ https://trac.torproject.org/projects/tor/ticket/5496
+
+chrome-2012.6.18
+ * The Divisible By Six Chromium Beta Release
+ * Ship 444 new Rulesets
+ * Fixes: numerous, including: Boxee, omgubuntu, Microsoft
+ https://trac.torproject.org/projects/tor/ticket/5899
+ https://trac.torproject.org/projects/tor/ticket/5703
+ https://trac.torproject.org/projects/tor/ticket/5931
+ https://trac.torproject.org/projects/tor/ticket/5958
+ * Disable broken: Disqus, uTorrent, Thomas Cook, Thomson Reuters clients,
+ Science Daily, Say Media, BinRev, Ikea, Interpol
+ * Not fixed:
+ The horrible appcache / CSS bug:
+ https://trac.torproject.org/projects/tor/ticket/5585
+ Occasional extension compatibility glitches:
+ https://trac.torproject.org/projects/tor/ticket/5731
+
+3.0development.3 (2012-05-11)
+ * Ship 361 new rulesets
+ * Do a better job of disabling CACert rulesets by default on non-CAcert
+ platforms
+ * Fix for compatibility with some other Firefox extensions:
+ https://trac.torproject.org/projects/tor/ticket/5682
+ * Fixes: Wordpress stylesheets, USENIX, Mozilla, Opera, Valve, and many
+ others
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-April/001105.html
+ https://trac.torproject.org/projects/tor/ticket/5831
+ * Disable broken: Pandora, Miranda IM, Pastebin.ca
+ https://trac.torproject.org/projects/tor/ticket/5804
+ https://trac.torproject.org/projects/tor/ticket/5776
+ * Testing our new more automated release process
+
+chrome-2012.5.1
+ * The May Day Chromium Beta Release
+ * Ship 886 new rulesets (thanks mostly to Negres!)
+ * Fix two downgrade attacks that might allow attackers to deny HTTPS
+ Everywhere protection for cookies on some domains.
+ https://trac.torproject.org/projects/tor/ticket/5676
+ https://trac.torproject.org/projects/tor/ticket/2199
+ * More efficient ruleset storage shrinks the .crx download by a factor of
+ about 4 (thanks fauxfaux)
+ https://trac.torproject.org/projects/tor/ticket/5275
+ * Disable buggy rulesets: IBM, Scribd, Wunderground, ReadWriteWeb,
+ Pastebin.ca
+ https://trac.torproject.org/projects/tor/ticket/5344
+ https://trac.torproject.org/projects/tor/ticket/5435
+ https://trac.torproject.org/projects/tor/ticket/5630
+ * Ruleset fixes: Debian, Kohls, Malwarebytes, Yandex, Wikipedia, Mises.org,
+ OpenDNS, Wizards of the Coast, Lenovo, Barnes and Noble,
+ Pastebin.ca
+ https://trac.torproject.org/projects/tor/ticket/5509
+ https://trac.torproject.org/projects/tor/ticket/5491
+ https://trac.torproject.org/projects/tor/ticket/5303
+ * Numerous other improvements, fixes, and exciting new bugs :)
+
+
+3.0development.2 (2012-04-26)
+ * License change: the tree now includes some code from Convergence, which
+ is GPL v3+. Other code remains licensable as GPLv2+
+ * Ship 696 new rulesets (!!!), thanks to a lot of amazing work by Negres
+ * Fix a downgrade attack that might allow attackers to deny HTTPS
+ Everywhere protection for cookies on some domains.
+ https://trac.torproject.org/projects/tor/ticket/5676
+ * Fix a weird wrong DOM-origin bug that occurred while redirects were in
+ progress (this might have security implications, although we are unsure
+ if it was exploitable).
+ https://trac.torproject.org/projects/tor/ticket/5477
+ * Ruleset fixes: Debian, Kohls, Malwarebytes, Yandex, Wikipedia, Mises.org,
+ OpenDNS, Wizards of the Coast, Lenovo, Barnes and Noble
+ https://trac.torproject.org/projects/tor/ticket/5509
+ https://trac.torproject.org/projects/tor/ticket/5491
+ https://trac.torproject.org/projects/tor/ticket/5303
+ * Stumble across more horrible security holes in the Verizon website:
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-February/001003.html
+ * Disable the Gentoo ruleset on non-CAcert platforms
+ * Disable buggy rulesets: IBM, Scribd, Wunderground, ReadWriteWeb :( :( :(
+ https://trac.torproject.org/projects/tor/ticket/5344
+ https://trac.torproject.org/projects/tor/ticket/5435
+ https://trac.torproject.org/projects/tor/ticket/5630
+ * Better cohabitation between the Decentralized SSL Observatory and
+ Convergence
+ * Separate Observatory option to control self-signed cert submission
+ * Numerous other ruleset enhancements, fixes, and probably exciting new bugs
+ in Negres's ruleset changes
+
+3.0development.1 (2012-03-14)
+ * By default, use https://google.co.cctld instead of
+ encrypted.google.com
+ https://trac.torproject.org/projects/tor/ticket/5152
+ * Add an optional ruleset to use https://www.google.com
+ instead of encrypted.google.com, too
+ * Add a new context menu in the rulesets list:
+ - toggle a ruleset
+ - reset it to the default
+ https://trac.torproject.org/projects/tor/ticket/3762
+ - view the ruleset source
+ https://trac.torproject.org/projects/tor/ticket/5237
+ * Show the Observatory popup to all users once, not just TorButton users
+ * Four new translations: Basque, French, Polish, Slovak
+ * Ship 125 new rulesets
+
+chrome-2012.3.14
+ * Ship 109 new rulesets since the last Chromium release
+ * Add an optional ruleset to search on https://www.google.com
+ instead of encrypted.google.com
+ * Switch non-US google searches to country sites by default
+ * Better chrome context UI
+
+2.2.3 (2012-09-25)
+ * Workaround for breakage in Amazon Look Inside the Book (via Cloudfront)
+ https://trac.torproject.org/projects/tor/ticket/6848
+ * Fix logout for AOL users
+ * Other fixes: PassThePopcorn, WhatCD, Antispam.de, RFCeditor,
+ Weatherspark / GoogleMaps
+ * Disable broken: SVT.se
+
+2.2.1 (2012-08-17)
+ * Fix a configuration-parsing bug in 2.2 that would
+ ignore default_off rules if this was a first install
+ https://mail1.eff.org/pipermail/https-everywhere/2012-August/001511.html
+ * Add a cleanup routine for profiles affected by that bug.
+
+2.2 (2012-08-15)
+ * Prevent ruleset bugs from crashing the UI
+ https://trac.torproject.org/projects/tor/ticket/6280
+ * Fix the enable/disable button in Firefox 14
+ https://trac.torproject.org/projects/tor/ticket/6212
+ * Fix a nasty bug in the optional "Search www.google.com" ruleset:
+ https://gitweb.torproject.org/https-everywhere.git/commitdiff/50ca41a1e189ef8383781f803e51ec7a06688a3b
+ * Disable buggy/broken: ZDNet, Globe and Mail, Blip.tv, Governo Portugês,
+ Alton Towers, McAfee :( :( :(
+ * Fixes: Yandex, Wikipedia, PirateParty, JBoss, Gentoo
+ * Hopefully the last 2.x release before 3.0 stable
+
+2.1 (2012-06-18)
+ * Fix context menu breakage when URIs lack a host
+ * Fixes: CiteULike, MozillaMessaging, Yandex, Demonoid, Pirate Party,
+ Gentoo, NYTimes, Microsoft, Wikipedia, Lenovo
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-June/001189.html
+ https://trac.torproject.org/projects/tor/ticket/6091
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-June/001190.html
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-May/001186.html
+ https://mail1.eff.org/pipermail/https-everywhere/2012-May/001433.html
+ * Disable broken: MarketWatch, Disqus, Magento, Lavasoft, Project Syndicate,
+ Typepad/Say Media
+ https://trac.torproject.org/projects/tor/ticket/5899
+ https://trac.torproject.org/projects/tor/ticket/5496
+
+2.0.5 (2012-05-16)
+ * Rebuild 2.0.4 without a bug in the release scripts that prevented all the
+ rulesets from being absent
+
+2.0.4 (2012-05-16)
+ * Fix for compatibility with some other Firefox extensions:
+ https://trac.torproject.org/projects/tor/ticket/5682
+ * Fixes: Wordpress stylesheets, USENIX, Mozilla, Opera, Indymedia
+ https://trac.torproject.org/projects/tor/ticket/5905
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-April/001105.html
+ * Disable broken: Pandora, Miranda IM, Pastebin.ca, PaidContent
+ https://trac.torproject.org/projects/tor/ticket/5804
+ https://trac.torproject.org/projects/tor/ticket/5776
+
+
+2.0.3 (2012-04-26)
+
+ * Fix a downgrade attack that might allow attackers to deny HTTPS
+ Everywhere protection for cookies on some domains.
+ https://trac.torproject.org/projects/tor/ticket/5676
+ * Minor redirection mechanism fixes
+ * Fixes: WordPress, Yandex, OpenDNS, Via.me/AWS
+ * Improvements: Mozilla
+ * Disable broken: ReadWriteWeb
+
+2.0.2 (2012-04-19)
+
+ * Fix a weird wrong DOM-origin bug that occurred while redirects were in
+ progress (this might have security implications, although we are unsure
+ if it was exploitable).
+ https://trac.torproject.org/projects/tor/ticket/5477
+ * By default, use https://google.co.cctld instead of
+ encrypted.google.com
+ https://trac.torproject.org/projects/tor/ticket/5152
+ * Add an optional ruleset to use https://www.google.com
+ instead of encrypted.google.com, too
+ * Ruleset fixes: Debian, Kohls, Malwarebytes, Yandex, Wikipedia, Mises.org,
+ OpenDNS, Wizards of the Coast, Lenovo, Barnes and Noble
+ https://trac.torproject.org/projects/tor/ticket/5509
+ https://trac.torproject.org/projects/tor/ticket/5491
+ https://trac.torproject.org/projects/tor/ticket/5303
+ * Stumble across more horrible security holes in the Verizon website:
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-February/001003.html
+ * Disable the Gentoo ruleset on non-CAcert platforms
+ * Disable buggy rulesets: IBM, Scribd, Wunderground :( :( :(
+ https://trac.torproject.org/projects/tor/ticket/5344
+ https://trac.torproject.org/projects/tor/ticket/5435
+ https://trac.torproject.org/projects/tor/ticket/5630
+
+2.0.1 (2012-02-27)
+ * 2.0 is now Stable!
+ * Fix tiny settings window on some versions of Windows:
+ https://trac.torproject.org/projects/tor/ticket/5197
+ * Fix drop down menu bug for the non-English versions of the UI
+ * Added Farsi and Arabic translations
+ * Disable Netflix, which was demonstrating a lot of breakage
+ * Improvements: Wikipedia
+ * Fixes: Google, Samba
+ * Ship 4 new rulesets since 2.0development.6
+ (404 new rulesets since 1.2.2!)
+ * Check ruleset grammaticity with xmllint/RelaxNG
+
+chrome-2012.2.27
+ * Split Google Translate out of the Google APIs rule, and turn it off by
+ default on Chrome only:
+ Fixes https://trac.torproject.org/projects/tor/ticket/5196
+ * Ship 19 new rulesets since last Chromium release
+
+chrome-2012.2.9
+ * make <exclusion pattern> rulesets elements work in the Chrome version
+ https://trac.torproject.org/projects/tor/ticket/5042
+ (also disable the LinkedIn ruleset)
+ * Support for Google Sorry
+ * 6 new rulesets
+
+2.0development.6 (2012-02-08)
+ * Fix a nasty UI crash bug on Windows
+ https://trac.torproject.org/projects/tor/ticket/5020
+ * Ruleset fixes: Google Video, Yandex, LDS
+ https://trac.torproject.org/projects/tor/ticket/5026
+ https://trac.torproject.org/projects/tor/ticket/5042
+ * Disable problematic LinkedIn ruleset
+ * An experimental ruleset for the Google "Sorry" page
+ * Improved Nederlands translation
+ * Ship 6 new rulesets
+
+chrome-2012.02.06{,.01}
+ * First "Official" EFF alpha Chrome release
+ (Thanks to Mike Perry and Aaron Swartz for leading the porting effort!)
+ * Installable on Chrome|Chromium 18+
+ * Two point versions, to test the autoupdating mechanism
+
+2.0development.5 (2012-02-02)
+ * Fix some data structure inefficiencies that should reduce RAM consumption
+ by 25-75MB (!)
+ https://trac.torproject.org/projects/tor/ticket/4804
+ * Global enable / disable option
+ https://trac.torproject.org/projects/tor/ticket/4060
+ * Google Cache is back! :)
+ * Ship 126 new rulesets
+ * Fixes: Wikipedia, Identi.ca, Verizon, CCC.de, UserScripts, Yandex,
+ Hidemyass, Mozilla, Pogo, Google, Google Images, Google Video,
+ The Pirate Bay, AK Vorrat, JBoss
+ * Improvements: EFF, Flickr, RedHat, Diaspora, PrivatePaste, KDE,
+ Portugese Govt
+ * Disable broken: NSF.gov, WHO.int, Economist
+ * New experimental Yahoo! ruleset (off by default)
+ * New translations: Spanish, Nederlands
+
+2.0development.4 (2011-11-15)
+ * The translations actually work
+ * Add new translations: Chinese, Russian
+ * Ship 37 new rulesets
+ * Exclude Userscript paths as an insecure workaround for the Greasemonkey
+ and Scriptish instances of this bug:
+ https://trac.torproject.org/projects/tor/ticket/3190
+ * Fixes: Java.com, Yandex, Wordpress, Wikipedia, Bahn.de, UNSW, Apache,
+ DuckDuckGo, Google Images
+ * Improvements: Debian, Tumblr, Apple, Facebook, VeriSign, Google Services,
+ Flickr, Youtu.be
+ * Disable broken: Target, OpenUniversity, TV.com, Radio Shack,
+ Yahoo Mail :( :(,
+ Google Cache coverage in Google Services :( :( :(
+
+2.0development.3 (2011-10-19)
+ * Selectively reenable nsIContentPolicy::shouldLoad()
+ Fixes: https://trac.torproject.org/projects/tor/ticket/4194
+ Fixes: https://trac.torproject.org/projects/tor/ticket/4149
+ * Crazy experimental IOUtils hacks from NoScript
+ https://bugzilla.mozilla.org/show_bug.cgi?id=677643#c75
+ (Appears to fix
+ https://mail1.eff.org/pipermail/https-everywhere/2011-October/001208.html,
+ which is probably a general redirection bug)
+ * Secure cookies set by JavaScript as well as those set by HTTP
+ Fixes: https://trac.torproject.org/projects/tor/ticket/3766
+ * Perform initialisation synchronously, reducing races during startup
+ Fixes: https://trac.torproject.org/projects/tor/ticket/3533
+ * Ship 9 new rulesets
+ * Disable: MikeWest
+ * Improvements: YouTube, Google Images
+
+2.0development.2 (2011-10-05)
+ * Enable YouTube by default
+ (also closes https://trac.torproject.org/projects/tor/ticket/4032)
+ * Merge nsIContentPolicy disablement from stable
+ (closes https://trac.torproject.org/projects/tor/ticket/3882)
+ * Context menu should work on error pages
+ (https://trac.torproject.org/projects/tor/ticket/3815)
+ * Fix the ASN setting button in the observatory prefs
+ (https://trac.torproject.org/projects/tor/ticket/4170)
+ * Make the Observatory much more efficient
+ * Ship 46 new rulesets
+ * Update for new Wikipedia HTTPS deployment
+ * Ruleset Fixes and Enhancements: Yandex, Identica, SBB, Polldaddy, XKCD,
+ Statcounter, Caltech, UCSD, FlickR, Android
+ * Disable broken: LastPass, Avast, EPEAT, Bloglines
+ * Improve the state of our translations-in progress
+ * Fancy new Python build scripts
+
+2.0development.1 (2011-09-15)
+ * Begin alpha testing for the Decentralized SSL Observatory!
+ (currently opt-in, with a popup prompt if you have Tor Button installed)
+ * Ship 164 new rulesets
+ * Enable Google Maps by default
+ * Pending translations: Arabic, Dutch, German, Portugese, Latvian, Russian,
+ Swedish
+ * Fixes: OpenDNS, WordPress, Flickr
+ * Expansions & Improvements: Google Services, Twitter, Gowalla, Apple, Bit.ly
+ AdBlock Plus, KLM, Adobe, UCSD, Heroku, Wikipedia
+ * Disable broken rulesets: Deviantart, Bandcamp, Securityfocus
+ * Improved build scripts
+
+1.2.2 (2012-01-09)
+ * Google Cache is back!
+ * Fixes: Wikipedia, Identi.ca, Verizon, CCC.de, UserScripts,
+ Yandex
+ * Improvements: EFF
+ * Disable broken: NSF.gov, WHO.int
+
+1.2.1 (2011-10-15)
+ * Google Cache is broken, remove it from GoogleServices :( :( :(
+ * Fix for the Google Image Search homepage
+ * Exclude help.duckduckgo.com:
+ https://trac.torproject.org/projects/tor/ticket/4399
+ * Disable Yahoo! Mail:
+ https://trac.torproject.org/projects/tor/ticket/4441
+ * Installable on Firefox 10
+
+1.2 (2011-10-14)
+ * Fixes: WordPress, Statcounter, Java, Bahn.de, SICS.se
+ * Improvements: use fancy new HTTPS Wikipedia
+ * Disable broken: OpenUniversity, TV.com, Random.org, kb.CERT
+
+1.1 (2011-10-19)
+ * Further tweaks to internals, will hopefully fix a number of weird issues:
+ https://trac.torproject.org/projects/tor/ticket/4194
+ https://trac.torproject.org/projects/tor/ticket/4149
+ https://mail1.eff.org/pipermail/https-everywhere/2011-October/001208.html
+ * YouTube is enabled by default!
+ * Fixes: Yandex, Statcounter, Polldaddy, SBB.ch
+ * Improvements: Facebook+
+ * Disable broken: Bloglines, EPEAT
+
+1.0.3 (2011-09-26)
+ * Mozilla is about to release Firefox 7, the stable branch needs to be
+ installable there!
+ * Disabling nsIContentPolicy callbacks should fix this crash bug:
+ https://trac.torproject.org/projects/tor/ticket/3882
+ https://bugzilla.mozilla.org/show_bug.cgi?id=677643
+ It /might/ cause us to fail to rewrite requests in obscure corner cases.
+ We haven't found any in testing, but vigilance will be required.
+ * Support for Google Maps
+ * Fixes: WordPress, Lenovo, OpenDNS, Avast, Ripe.net, TV.com, 38.de
+ * Disable broken: Seagate
+
+1.0.2 (2011-09-20)
+ * Major improvements to the Wikipedia ruleset
+ * Disable broken/buggy rulesets: DeviantArt, eHow, About.me, Bandcamp,
+ StudiVZ, Securityfocus, BankofAmerica :( :( :(
+ * Small fixes: OpenDNS, WordPress, links in the "About" page
+ * Declare incompatibility with Firefox 7 & 8 until Mozilla fixes this:
+ https://bugzilla.mozilla.org/show_bug.cgi?id=677643
+
+1.0.1 (2011-08-10)
+ * Disable some rulesets with partial compatibility issues: Reddit,
+ StumbleUpon, Heroku
+ * Small Yandex fix
+ * Fix/improvement for Google Instant outside the US
+
+1.0.0 (2011-08-04)
+ * Release 1.0 into the stable branch!
+ * Improve toolbar UI for error pages somewhat (it still isn't perfect)
+ * Bugfixes: Microsoft, Dropbox, Netflix, MySQL
+ * Disable a couple of broken rules
+
+1.0.0development.5: (2011-07-13)
+ * Ship rulesets as a single "default.rulesets" file, shrinking the .xpi from
+ ~370 kB to ~120kB and speeding Firefox startup:
+ https://trac.torproject.org/projects/tor/ticket/3404
+ * Fix an ephemeral bug where disabled-by-default rules would be briefly
+ enabled when first installed
+ * Wikipedia shows up in the toolbar/context menu
+ * Fixes to netflix & netzpolitik
+ * Toolbar/context menu can be opened with left or right click
+
+1.0.0development.4: (2011-07-06)
+ * Fix a bug with Google Translate
+ * Unbreak the Netflix blog
+ * Toolbar button now looks OK in Seamonkey
+ * Declare compatibility with the next round of Firefox alphas
+
+1.0.0development.3: (2011-07-04)
+ * Do not show a bizarre popup when people click the HTTPS toolbar button on
+ error pages
+ * Fix a GoogleServices bug that broke logout from non-US google accounts :(
+
+1.0.0development.2: (2011-07-01)
+ * Fix bugs that arose when trying to move the toolbar menu icon:
+ https://trac.torproject.org/projects/tor/ticket/3497
+ * Handle usernames and passwords in URIs more explicitly
+ https://trac.torproject.org/projects/tor/ticket/2199
+ * By default, move context menu from toolbar to addons bar
+ * Ship 22 new rulesets
+ * Add support for Google Plus, Accounts and AdWdords
+ * Improvements to Microsoft, Twitter and Gitorious
+
+1.0.0development.1: (2011-06-27)
+ * Add a context menu to let users toggle rulesets that are/might be
+ applicable to the current page (we can now stabilise the dev branch!)
+ * Ship 42 new rulesets
+ * Support for Google Image Search (except the very first landing page :/)
+ * Fixes: Netflix, Plone
+ * Improvements: Google APIs, Google Services, Mediawiki
+ * Disable broken rules: OKCupid, Surveymonkey
+ * Declare compatibility with recent Seamonkey releases
+
+0.9.9.development.6:
+ * Optimistically declare compatibility with Firefoxes up to v 7.*
+ * Ship 193 new rulesets
+ * Fixes & Improvements: Wikipedia, AmazonAWS, Google Images, Microsoft,
+ Mozilla, Netflix, Google User Content, Twitter, Gitorious, AdBlock Plus,
+ Youtube, he.net, Bitcoin
+ * Remove broken rules: Match.com
+
+0.9.9.development.5:
+ * Compatible with Firefox 4.0.1+
+ * New ruleset management UI (thanks to katmagic and Stefan Tomanek)
+ * Ship 136 new rulesets
+ * Fixes: reCAPTCHA, Google Images, Gentoo, Gitorious
+ * Improvements: Bit.ly, Yahoo, Nokia
+ * Disable: WashingtonPost :(, Doubleclick, OpenSSL.org (!)
+
+0.9.9.development.4:
+ * Ship 117 new rulesets
+ * Fixes: MySQL, GroupOn, country-specific Google news sites,
+ * Improvements: mail.com, WordPress
+ * Leave WashingtonPost ruleset on in the hope that it gets fixed soon :/
+ * Disable broken rules: HTC, I2P ...
+
+0.9.9.development.3:
+
+ * In the settings dialogue, offer "Reset defaults" instead of "Enable all"
+ * Merge fixes from NoScript that avoid some torbutton bugs
+ * Ship 56 new rulesets
+ * Numerous tweaks + fixes, including NYTimes and AddThis
+
+0.9.9.development.2:
+
+ * Prevent the preferences window from swallowing the screen on OS X / Windows
+ * Stop the StartCom rule from breaking StartCom OCSP/CRLs (which can't be HTTPS)
+ * Attempt to do the same for for CAcert
+ * Fixes to: Reddit, Drupal.org
+ * Disable some problematic rulesets: Cisco, Opera
+ * Enable: Reddit
+ * Ship another 62 rulesets
+
+0.9.9.development.1:
+
+ * The efficient ruleset checking implementation should now hopefully be...
+ efficient
+ * Ship all the rulesets (!!!)
+ * Except the ones that cause cert warnings, which are there but off by default
+ * Build scripts attempt to validate rulesets before making a .xpi
+
+0.9.7:
+ * Support firefox 5 and 6 betas
+ * Numerous improvements and fixes to Google and GoogleServices support
+ * Fixes to AmazonAWS
+ * Secure j.mp via bit.ly
+ * Fix gentoo bugs
+
+0.9.6:
+ * Support firefox 4.0.1
+ * Unbreak recaptcha
+ * Disable google.com/jsapi (which was breaking some embedded maps, though
+ that bug *might* have been fixed)
+
+0.9.5:
+ * WashingtonPost is broken and seems to be staying that way; disable it :(
+ * Replace "Enable All" with "Reset Defaults"
+ * Fixes & Improvements to WordPress + Mozilla
+
+0.9.4:
+ * Significant performance improvements
+ * Disable Cisco by default
+ * Fixes & improvements to: NYTimes, WashingtonPost, Cisco, WordPress
+ * Support Google Code
+ * Disable Google Custom Search Engines (they don't work)
+ * Support global installation for OS distributions (thanks dm0)
+
+
+0.9.3:
+ * Significant performance improvements
+ * Disable Cisco by default
+ * Fixes & improvements to: NYTimes, WashingtonPost, Cisco, WordPress
+ * Support Google Code
+ * Disable Google Custom Search Engines (they don't work)
+ * Support global installation for OS distributions (thanks dm0)
+
+0.9.2:
+ * Fix a bug in our redirection loop detection that was causing touble with
+ some parts of NYTimes, Facebook, and other sites
+ (closes: https://trac.torproject.org/projects/tor/ticket/2217)
+
+0.9.1:
+ * Unbreak the "all x news articles" links in Google News
+ * Exclude nytimes.com/roomfordebate, since it's broken in https.
+
+0.9.0:
+ * This is our "Firesheep" release. It has numerous anti-firesheep
+ improvements!
+ * Split the stricter parts of the Facebook rule into a "Facebook+" rule.
+ It's what's required to protect Facebook from Firesheep and similar cookie
+ theft attacks, but it may break apps, because apps.facebook.com currently
+ has the wrong cert.
+ * Allow rulesets to specify that the secure flag should be set on some
+ cookies even if the site operator failed to do so
+ * Ship rules for:
+ - Amazon S3 (AWS)
+ - Github
+ - Bit.ly
+ - Dropbox
+ - Evernote
+ - Cisco
+ * Extensive improvements (including secure cookies) in the Twitter and
+ Facebook rules
+ * Support for full Live / Hotmail encryption
+ * Significant performance optimisation decreases CPU load
+ Fixes:
+ https://trac.torproject.org/projects/tor/ticket/1656
+ https://trac.torproject.org/projects/tor/ticket/2194
+ * Rearrange our Channel Replacement code!
+ Fixes https://trac.torproject.org/projects/tor/ticket/1684
+ https://bugzilla.mozilla.org/show_bug.cgi?id=548102
+ Thanks to Giorgio Maone and Boris Zbarsky!
+ * Add scrollbars if there are a lot of rules present in the Preferences
+ dialog (may still be somewhat buggy...)
+ * Optimise GoogleServices.xml and support Google code search
+ * Patch for future compatiability with Request Policy:
+ https://trac.torproject.org/projects/tor/ticket/1574
+ * Support for the Firefox 4 API
+ * The Amazon rule was causing a lot of glitches; it is now off by default
+ * Control log verbosity with an about:config variable
+ * Numerous minor rule improvements
+
+0.2.2:
+ * Fix a glitch in the Content Policy path that may or may not have been
+ responsible for these bugs:
+ https://trac.torproject.org/projects/tor/ticket/1700
+ https://trac.torproject.org/projects/tor/ticket/1672
+ https://trac.torproject.org/projects/tor/ticket/1673
+ The patch breaks toolbar search suggestions. And who knows what else?
+ * Don't send some country homepages to https://www.google.com/webhp?hl= ;
+ use https://encrypted.google.com instead
+ * Cleanup and refactor the URI replacement and rewriting code. Should
+ hopefully fix https://trac.torproject.org/projects/tor/ticket/1649
+ * Add a Google APIs rule
+ * Remove some Extremely Nasty code that would delete malformed rulesets (!)
+ (it was pasted from Torbutton's cookie handling logic...)
+ * Add code.google.com to Google Services
+ * The client=firefox* workaround is no longer necessary once we're sending
+ non-US users to encrypted.google.com rather than www.google.com
+ * Better coverage for GMX, Google services, Twitter
+ * Scroogle homepage in HTTPS
+ * Add rules for
+ - Mail.com logins
+ - Microsoft (limited coverage)
+ * Fix a nasty Google/Wikipedia bug within 0.2.2.development.{1,2}
+
+0.2.1:
+ * Although google said https://www.google.com would continue to work, that
+ wasn't absolutely true.
+ * The new encyrpted.google.com seems to require queries to be #q=thing
+ rather than search?q=thing, at least some of the time. So let's do that.
+
+0.2.0:
+ * Work around the fact that Google does not allow client=firefox* HTTPS
+ searches from outside the US, by rewriting those URIs
+ * Add rules for:
+ - Amazon
+ - GMX
+ - Live.com (Hotmail logins)
+ - Meebo
+ - the Netherlands Government
+ - Wordpress.com
+ - Zoho
+ * Remove the assumption that non-US searches would always start with an hl=
+ language parameter
+ * Handle searches to the google.com/firefox script better
+ * Remove accidental duplicates of a couple of rules!
+ * Bump maxVersion into the future so we're compatible with Firefox alphas
+ * Fix more legacy eff.org bugs
+
+0.1.2:
+ * Apparently, we are not actually compatible with Firefox 2.0.0.x, so don't
+ install with it!
+ * Further generalisation of Wikimedia rules
+ * Fix bugs in the handling of obscure parts of eff.org and torproject.org
+ * A bug in a user rules file should produce an error, rather than causing all
+ rules to fail to load
+
+0.1.1:
+ * Generalise the Wikipedia rules to other Wikimedia services
+ * In preferences window, add a link to instructions for writing one's own
+ rules
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome.manifest b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome.manifest
new file mode 100644
index 0000000..4869afe
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome.manifest
@@ -0,0 +1,53 @@
+content https-everywhere chrome/content/
+override chrome://https-everywhere/content/rulesets.sqlite defaults/rulesets.sqlite
+
+locale https-everywhere en chrome/locale/en/
+locale https-everywhere lt chrome/locale/lt/
+locale https-everywhere lv chrome/locale/lv/
+locale https-everywhere pt chrome/locale/pt/
+locale https-everywhere sv chrome/locale/sv/
+locale https-everywhere de chrome/locale/de/
+locale https-everywhere ru chrome/locale/ru/
+locale https-everywhere zh-CN chrome/locale/zh-CN/
+locale https-everywhere zh-TW chrome/locale/zh-TW/
+locale https-everywhere es chrome/locale/es/
+locale https-everywhere nl chrome/locale/nl/
+locale https-everywhere ar chrome/locale/ar/
+locale https-everywhere fa chrome/locale/fa/
+locale https-everywhere eu chrome/locale/eu/
+locale https-everywhere fr chrome/locale/fr/
+locale https-everywhere pl chrome/locale/pl/
+locale https-everywhere sk chrome/locale/sk/
+locale https-everywhere ms chrome/locale/ms/
+locale https-everywhere da chrome/locale/da/
+locale https-everywhere el chrome/locale/el/
+locale https-everywhere hu chrome/locale/hu/
+locale https-everywhere it chrome/locale/it/
+locale https-everywhere tr chrome/locale/tr/
+locale https-everywhere ko chrome/locale/ko/
+locale https-everywhere cs chrome/locale/cs/
+locale https-everywhere hr chrome/locale/hr/
+locale https-everywhere he chrome/locale/he/
+locale https-everywhere fi chrome/locale/fi/
+locale https-everywhere nb chrome/locale/nb/
+locale https-everywhere sl chrome/locale/sl/
+locale https-everywhere bg chrome/locale/bg/
+locale https-everywhere ja chrome/locale/ja/
+locale https-everywhere si chrome/locale/si/
+
+skin https-everywhere classic/1.0 chrome/skin/
+
+component {32c165b4-fe5e-4964-9250-603c410631b4} components/https-everywhere.js
+contract @eff.org/https-everywhere;1 {32c165b4-fe5e-4964-9250-603c410631b4}
+
+category profile-after-change HTTPSEverywhere @eff.org/https-everywhere;1
+category content-policy HTTPSEverywhere @eff.org/https-everywhere;1
+
+overlay chrome://browser/content/browser.xul chrome://https-everywhere/content/toolbar_button.xul
+overlay chrome://navigator/content/navigator.xul chrome://https-everywhere/content/toolbar_button.xul
+
+style chrome://global/content/customizeToolbar.xul chrome://https-everywhere/skin/https-everywhere.css
+component {0f9ab521-986d-4ad8-9c1f-6934e195c15c} components/ssl-observatory.js
+contract @eff.org/ssl-observatory;1 {0f9ab521-986d-4ad8-9c1f-6934e195c15c}
+
+category profile-after-change SSLObservatory @eff.org/ssl-observatory;1
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/about.xul b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/about.xul
new file mode 100644
index 0000000..cf57e9d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/about.xul
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://https-everywhere/content/preferences.css" type="text/css"?>
+
+<!DOCTYPE overlay SYSTEM "chrome://https-everywhere/locale/https-everywhere.dtd">
+
+<dialog id="https-everywhere-about"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ buttons="accept"
+ title="&https-everywhere.about.title;"
+ width="640"
+ height="480"
+ align="center">
+
+ <script type="application/x-javascript"
+ src="chrome://https-everywhere/content/preferences.js"/>
+ <vbox style="overflow:auto" flex="1">
+ <label style="text-align:center; font-weight:bold; font-size:22px;">&https-everywhere.about.ext_name;</label>
+ <label style="text-align:center; font-size:18px; margin-bottom:10px;">&https-everywhere.about.ext_description;</label>
+
+ <groupbox>
+ <caption label="&https-everywhere.about.version;" />
+ <label>3.5.1</label>
+ </groupbox>
+
+ <groupbox>
+ <caption label="&https-everywhere.about.created_by;" />
+ <label>Mike Perry and Peter Eckersley</label>
+ </groupbox>
+
+ <groupbox>
+ <caption label="&https-everywhere.about.librarians;" />
+ <label>Seth Schoen, MB and Andreas Jonsson</label>
+ </groupbox>
+
+ <groupbox>
+ <caption label="&https-everywhere.about.thanks;" />
+ <label>Many many contributors, including Aaron Swartz, Alec Moskvin,
+ Aleksey Kosterin, Alex Xu, Anas Qtiesh, Artyom Gavrichenkov, Brian
+ Carpenter, Chris Palmer, Christian Inci, Christopher Liu, Claudio
+ Moretti, Colonel Graff, Dan Auerbach, Daniel Kahn Gillmor, dm0, The
+ Doctor, Felix Geyer, Fruitless Creek, George Kargiotakis, haviah, Heiko
+ Adams, Jeroen van der Gun, Jay Weisskopf, Jacob Taylor, Jonathan Davies, Jorge Bernal,
+ katmagic, Kevin Jacobs, Korte, Liam K, Leonardo Brondani Schenkel, Marti Raudsepp, Micah Lee, Mike
+ Cardwell, Mangix, Matthias-Christian Ott, Mikko Harhanen, Mishari Muqbil, Neheb, Ori Avtalion, Osama Khalid,
+ nitrox, Pablo Castellano, Paul Wise, Pavel Kazakov, Phol Paucar, Richard
+ Green, Roan Kattouw, Rules Moore, Stefan Tomanek, Sam Reed, Steve
+ Milner, Sujit Rao, TK-999, Vendo, Victor Garin, Weiland Hoffmann, Whizz
+ Mo and Yan Zhu. Also, portions of HTTPS Everywhere are based on code
+ from NoScript, by Giorgio Maone and others. We are grateful for their
+ excellent work!</label>
+ </groupbox>
+
+ <label style="font-weight:bold; margin-top:10px;">
+ &https-everywhere.about.contribute;
+ <label id="donate link"
+ value="&https-everywhere.about.donate_tor;"
+ style="color: blue; cursor:hand; text-decoration:underline; font-style:bold"
+ onmouseover="event.target.style.cursor='pointer'"
+ onmouseout="event.target.style.cursor='default'"
+ onclick="window_opener('https://www.torproject.org/donate/donate.html.en')"/>
+ or
+ <label id="donate link2"
+ value="&https-everywhere.about.donate_eff;"
+ style="color: blue; cursor:hand; text-decoration:underline; font-style:bold"
+ onmouseover="event.target.style.cursor='pointer'"
+ onmouseout="event.target.style.cursor='default'"
+ onclick="window_opener('https://www.eff.org/donate')"/>
+ </label>
+ </vbox>
+</dialog>
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/ApplicableList.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/ApplicableList.js
new file mode 100644
index 0000000..6949167
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/ApplicableList.js
@@ -0,0 +1,266 @@
+// An ApplicableList is a structure used to keep track of which rulesets
+// were applied, and which ones weren't but might have been, to the contents
+// of a given page (top level nsIDOMWindow)
+
+serial_number = 0;
+
+function ApplicableList(logger, doc, domWin) {
+ this.domWin = domWin;
+ this.uri = doc.baseURIObject.clone();
+ if (!this.uri) {
+ this.log(WARN,"NULL CLONING URI " + doc);
+ if (doc)
+ this.log(WARN,"NULL CLONING URI " + doc.baseURIObject);
+ if (doc.baseURIObject)
+ this.log(WARN,"NULL CLONING URI " + doc.baseURIObject.spec);
+ }
+ this.home = doc.baseURIObject.spec; // what doc we're housekeeping for
+ this.log = logger;
+ this.active = {};
+ this.breaking = {}; // rulesets with redirection loops
+ this.inactive = {};
+ this.moot={}; // rulesets that might be applicable but uris are already https
+ this.all={}; // active + breaking + inactive + moot
+ serial_number += 1;
+ this.serial = serial_number;
+ this.log(DBUG,"Alist serial #" + this.serial + " for " + this.home);
+}
+
+ApplicableList.prototype = {
+
+ empty: function() {
+ // Empty everything, used when toggles occur in order to ensure that if
+ // the reload fails, the resulting list is not eroneous
+ this.active = {};
+ this.breaking = {};
+ this.inactive = {};
+ this.moot={};
+ this.all={};
+ },
+
+ active_rule: function(ruleset) {
+ this.log(INFO,"active rule " + ruleset.name +" in "+ this.home +" -> " +
+ this.domWin.document.baseURIObject.spec+ " serial " + this.serial);
+ this.active[ruleset.name] = ruleset;
+ this.all[ruleset.name] = ruleset;
+ },
+
+ breaking_rule: function(ruleset) {
+ this.log(NOTE,"breaking rule " + ruleset.name +" in "+ this.home +" -> " +
+ this.domWin.document.baseURIObject.spec+ " serial " + this.serial);
+ this.breaking[ruleset.name] = ruleset;
+ this.all[ruleset.name] = ruleset;
+ },
+
+ inactive_rule: function(ruleset) {
+
+ this.log(INFO,"inactive rule " + ruleset.name +" in "+ this.home +" -> " +
+ this.domWin.document.baseURIObject.spec+ " serial " + this.serial);
+ this.inactive[ruleset.name] = ruleset;
+ this.all[ruleset.name] = ruleset;
+ },
+
+ moot_rule: function(ruleset) {
+ this.log(INFO,"moot rule " + ruleset.name +" in "+ this.home + " serial " + this.serial);
+ this.moot[ruleset.name] = ruleset;
+ this.all[ruleset.name] = ruleset;
+ },
+
+ dom_handler: function(operation,key,data,src,dst) {
+ // See https://developer.mozilla.org/En/DOM/UserDataHandler
+ if (src && dst)
+ dst.setUserData(key, data, this.dom_handler);
+ },
+
+ populate_list: function() {
+ // The base URI of the dom tends to be loaded from some /other/
+ // ApplicableList, so pretend we're loading it from here.
+ HTTPSEverywhere.instance.https_rules.rewrittenURI(this, this.uri);
+ this.log(DBUG, "populating using alist #" + this.serial);
+ },
+
+ populate_menu: function(document, menupopup, weird) {
+ this.populate_list();
+ this.document = document;
+
+ var https_everywhere = CC["@eff.org/https-everywhere;1"].getService(Components.interfaces.nsISupports).wrappedJSObject;
+
+ // get the menu popup
+ this.menupopup = menupopup;
+
+ // empty it all of its menuitems
+ while(this.menupopup.firstChild.tagName != "menuseparator") {
+ this.menupopup.removeChild(this.menupopup.firstChild);
+ }
+
+ // add global enable/disable toggle button
+ var strings = document.getElementById("HttpsEverywhereStrings");
+
+ var enableLabel = document.createElement('menuitem');
+ var text = strings.getString("https-everywhere.menu.globalDisable");
+ if(!https_everywhere.prefs.getBoolPref("globalEnabled"))
+ text = strings.getString("https-everywhere.menu.globalEnable");
+
+ enableLabel.setAttribute('label', text);
+ enableLabel.setAttribute('command', 'https-everywhere-menuitem-globalEnableToggle');
+ this.prepend_child(enableLabel);
+
+ // add the label at the top
+ var any_rules = false;
+ for(var x in this.all) {
+ any_rules = true; // how did JavaScript get this ugly?
+ break;
+ }
+ var label = document.createElement('menuitem');
+ label.setAttribute('label', strings.getString('https-everywhere.menu.enableDisable'));
+ label.setAttribute('command', 'https-everywhere-menuitem-preferences');
+ var label2 = false;
+ if (!any_rules) {
+ label2 = document.createElement('menuitem');
+ if (!weird) text = strings.getString('https-everywhere.menu.noRules');
+ else text = strings.getString('https-everywhere.menu.unknownRules');
+ label2.setAttribute('label', text);
+ label2.setAttribute('command', 'https-everywhere-menuitem-preferences');
+ label2.setAttribute('style', 'color:#909090;');
+ }
+
+ // create a commandset if it doesn't already exist
+ this.commandset = document.getElementById('https-everywhere-commandset');
+ if(!this.commandset) {
+ this.commandset = document.createElement('commandset');
+ this.commandset.setAttribute('id', 'https-everywhere-commandset');
+ var win = document.getElementById('main-window');
+ win.appendChild(this.commandset);
+ } else {
+ // empty commandset
+ while(this.commandset.firstChild)
+ this.commandset.removeChild(this.commandset.firstChild);
+ }
+
+ var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
+ .getService(Components.interfaces.nsIWindowMediator);
+
+ var domWin = wm.getMostRecentWindow("navigator:browser").content.document.defaultView.top;
+ var location = domWin.document.baseURIObject.asciiSpec; //full url, including about:certerror details
+
+ if(location.substr(0, 6) == "about:"){
+ //"From" portion of the rule is retrieved from the location bar via document.getElementById("urlbar").value
+
+ var fromHost = document.getElementById("urlbar").value;
+
+ //scheme must be trimmed out to check for applicable rulesets
+ if(fromHost.indexOf("://") != -1)
+ fromHost = fromHost.substr(fromHost.indexOf("://") + 3, fromHost.length);
+
+ //trim off any page locations - we only want the host - e.g. domain.com
+ if(fromHost.indexOf("/") != -1)
+ fromHost = fromHost.substr(0, fromHost.indexOf("/"));
+
+ // Search for applicable rulesets for the host listed in the location bar
+ var plist = HTTPSRules.potentiallyApplicableRulesets(fromHost);
+ for (var i = 0 ; i < plist.length ; i++){
+ //For each applicable rulset, determine active/inactive, and append to proper list.
+ var ruleOn = false;
+ try {
+ if(https_everywhere.rule_toggle_prefs.getBoolPref(plist[i].name))
+ ruleOn = true;
+ } catch(e) {
+ if(https_everywhere.https_rules.rulesetsByName[plist[i].name].active)
+ ruleOn = true;
+ }
+ if(ruleOn)
+ this.active_rule(plist[i]);
+ else
+ this.inactive_rule(plist[i]);
+ }
+ }
+
+ // add all applicable commands
+ for(var x in this.breaking)
+ this.add_command(this.breaking[x]);
+ for(var x in this.active)
+ this.add_command(this.active[x]);
+ for(var x in this.moot)
+ this.add_command(this.moot[x]);
+ for(var x in this.inactive)
+ this.add_command(this.inactive[x]);
+
+ if(https_everywhere.prefs.getBoolPref("globalEnabled")){
+ // add all the menu items
+ for (var x in this.inactive)
+ this.add_menuitem(this.inactive[x], 'inactive');
+ // rules that are active for some uris are not really moot
+ for (var x in this.moot)
+ if (!(x in this.active))
+ this.add_menuitem(this.moot[x], 'moot');
+ // break once break everywhere
+ for (var x in this.active)
+ if (!(x in this.breaking))
+ this.add_menuitem(this.active[x], 'active');
+ for (var x in this.breaking)
+ this.add_menuitem(this.breaking[x], 'breaking');
+
+ if (label2) this.prepend_child(label2);
+ this.prepend_child(label);
+ }
+
+ },
+
+ prepend_child: function(node) {
+ this.menupopup.insertBefore(node, this.menupopup.firstChild);
+ },
+
+ add_command: function(rule) {
+ var command = this.document.createElement("command");
+ command.setAttribute('id', rule.id+'-command');
+ command.setAttribute('label', rule.name);
+ command.setAttribute('oncommand', 'toggle_rule("'+rule.id+'")');
+ this.commandset.appendChild(command);
+ },
+
+ // add a menu item for a rule -- type is "active", "inactive", "moot",
+ // or "breaking"
+
+ add_menuitem: function(rule, type) {
+ // create the menuitem
+ var item = this.document.createElement('menuitem');
+ item.setAttribute('command', rule.id+'-command');
+ item.setAttribute('class', type+'-item menuitem-iconic');
+ item.setAttribute('label', rule.name);
+
+ // we can get confused if rulesets have their state changed after the
+ // ApplicableList was constructed
+ if (!rule.active && (type == 'active' || type == 'moot'))
+ type = 'inactive';
+ if (rule.active && type == 'inactive')
+ type = 'moot';
+
+ // set the icon
+ var image_src;
+ if (type == 'active') image_src = 'tick.png';
+ else if (type == 'inactive') image_src = 'cross.png';
+ else if (type == 'moot') image_src = 'tick-moot.png';
+ else if (type == 'breaking') image_src = 'loop.png';
+ item.setAttribute('image', 'chrome://https-everywhere/skin/'+image_src);
+
+ // all done
+ this.prepend_child(item);
+ },
+
+ show_applicable: function() {
+ this.log(WARN, "Applicable list number " + this.serial);
+ for (var x in this.active)
+ this.log(WARN,"Active: " + this.active[x].name);
+
+ for (var x in this.breaking)
+ this.log(WARN,"Breaking: " + this.breaking[x].name);
+
+ for (x in this.inactive)
+ this.log(WARN,"Inactive: " + this.inactive[x].name);
+
+ for (x in this.moot)
+ this.log(WARN,"Moot: " + this.moot[x].name);
+
+ }
+};
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/ChannelReplacement.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/ChannelReplacement.js
new file mode 100644
index 0000000..551bcab
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/ChannelReplacement.js
@@ -0,0 +1,387 @@
+function CtxCapturingListener(tracingChannel, captureObserver) {
+ this.originalListener = tracingChannel.setNewListener(this);
+ this.captureObserver = captureObserver;
+}
+CtxCapturingListener.prototype = {
+ originalListener: null,
+ originalCtx: null,
+ onStartRequest: function(request, ctx) {
+ this.originalCtx = ctx;
+ if (this.captureObserver) {
+ this.captureObserver.observeCapture(request, this);
+ }
+ },
+ onDataAvailable: function(request, ctx, inputStream, offset, count) {},
+ onStopRequest: function(request, ctx, statusCode) {},
+ QueryInterface: xpcom_generateQI([Ci.nsIStreamListener])
+};
+
+function ChannelReplacement(chan, newURI, newMethod) {
+ return this._init(chan, newURI, newMethod);
+}
+
+ChannelReplacement.supported = "nsITraceableChannel" in Ci;
+
+ChannelReplacement.runWhenPending = function(channel, callback) {
+ if (channel.isPending()) {
+ callback();
+ return false;
+ } else {
+ new LoadGroupWrapper(channel, callback);
+ return true;
+ }
+};
+
+
+ChannelReplacement.prototype = {
+ listener: null,
+ context: null,
+ oldChannel: null,
+ channel: null,
+ window: null,
+ suspended: false,
+
+ get _unsupportedError() {
+ return new Error("Can't replace channels without nsITraceableChannel!");
+ },
+
+ get _classifierClass() {
+ delete this.__proto__._classifierClass;
+ return this.__proto__._classifierClass = Cc["@mozilla.org/channelclassifier"];
+ },
+
+ _autoHeadersRx: /^(?:Host|Cookie|Authorization)$|Cache|^If-/,
+ visitHeader: function(key, val) {
+ try {
+ // we skip authorization and cache-related fields which should be automatically set
+ if (!this._autoHeadersRx.test(key)) this.channel.setRequestHeader(key, val, false);
+ } catch (e) {
+ dump(e + "\n");
+ }
+ },
+
+ _init: function(chan, newURI, newMethod) {
+ if (!(ChannelReplacement.supported && chan instanceof Ci.nsITraceableChannel))
+ throw this._unsupportedError;
+
+ newURI = newURI || chan.URI;
+
+ var newChan = IOS.newChannelFromURI(newURI);
+
+ this.oldChannel = chan;
+ this.channel = newChan;
+
+ // porting of http://mxr.mozilla.org/mozilla-central/source/netwerk/protocol/http/src/nsHttpChannel.cpp#2750
+
+ var loadFlags = chan.loadFlags;
+
+ if (chan.URI.schemeIs("https"))
+ loadFlags &= ~chan.INHIBIT_PERSISTENT_CACHING;
+
+
+ newChan.loadGroup = chan.loadGroup;
+ newChan.notificationCallbacks = chan.notificationCallbacks;
+ newChan.loadFlags = loadFlags | newChan.LOAD_REPLACE;
+
+ if (!(newChan instanceof Ci.nsIHttpChannel))
+ return this;
+
+ // copy headers
+ chan.visitRequestHeaders(this);
+
+ if (!newMethod || newMethod === chan.requestMethod) {
+ if (newChan instanceof Ci.nsIUploadChannel && chan instanceof Ci.nsIUploadChannel && chan.uploadStream ) {
+ var stream = chan.uploadStream;
+ if (stream instanceof Ci.nsISeekableStream) {
+ stream.seek(stream.NS_SEEK_SET, 0);
+ }
+
+ try {
+ let ctype = chan.getRequestHeader("Content-type");
+ let clen = chan.getRequestHeader("Content-length");
+ if (ctype && clen) {
+ newChan.setUploadStream(stream, ctype, parseInt(clen, 10));
+ }
+ } catch(e) {
+ newChan.setUploadStream(stream, '', -1);
+ }
+
+ newChan.requestMethod = chan.requestMethod;
+ }
+ } else {
+ newChan.requestMethod = newMethod;
+ }
+
+ if (chan.referrer) newChan.referrer = chan.referrer;
+ newChan.allowPipelining = chan.allowPipelining;
+ newChan.redirectionLimit = chan.redirectionLimit - 1;
+ if (chan instanceof Ci.nsIHttpChannelInternal && newChan instanceof Ci.nsIHttpChannelInternal) {
+ if (chan.URI == chan.documentURI) {
+ newChan.documentURI = newURI;
+ } else {
+ newChan.documentURI = chan.documentURI;
+ }
+ }
+
+ if (chan instanceof Ci.nsIEncodedChannel && newChan instanceof Ci.nsIEncodedChannel) {
+ newChan.applyConversion = chan.applyConversion;
+ }
+
+ // we can't transfer resume information because we can't access mStartPos and mEntityID :(
+ // http://mxr.mozilla.org/mozilla-central/source/netwerk/protocol/http/src/nsHttpChannel.cpp#2826
+
+ if ("nsIApplicationCacheChannel" in Ci &&
+ chan instanceof Ci.nsIApplicationCacheChannel && newChan instanceof Ci.nsIApplicationCacheChannel) {
+ newChan.applicationCache = chan.applicationCache;
+ newChan.inheritApplicationCache = chan.inheritApplicationCache;
+ }
+
+ if (chan instanceof Ci.nsIPropertyBag && newChan instanceof Ci.nsIWritablePropertyBag)
+ for (var properties = chan.enumerator, p; properties.hasMoreElements();)
+ if ((p = properties.getNext()) instanceof Ci.nsIProperty)
+ newChan.setProperty(p.name, p.value);
+
+ if (chan.loadFlags & chan.LOAD_DOCUMENT_URI) {
+ this.window = IOUtil.findWindow(chan);
+ if (this.window) this.window._replacedChannel = chan;
+ }
+
+ return this;
+ },
+
+ _onChannelRedirect: function() {
+ var oldChan = this.oldChannel;
+ var newChan = this.channel;
+
+ if (this.realRedirect) {
+ if (oldChan.redirectionLimit === 0) {
+ oldChan.cancel(NS_ERROR_REDIRECT_LOOP);
+ throw NS_ERROR_REDIRECT_LOOP;
+ }
+ } else newChan.redirectionLimit += 1;
+
+
+
+ // nsHttpHandler::OnChannelRedirect()
+
+ const CES = Ci.nsIChannelEventSink;
+ const flags = CES.REDIRECT_INTERNAL;
+ this._callSink(
+ Cc["@mozilla.org/netwerk/global-channel-event-sink;1"].getService(CES),
+ oldChan, newChan, flags);
+ var sink;
+
+ for (let cess = Cc['@mozilla.org/categorymanager;1'].getService(CI.nsICategoryManager)
+ .enumerateCategory("net-channel-event-sinks");
+ cess.hasMoreElements();
+ ) {
+ sink = cess.getNext();
+ if (sink instanceof CES)
+ this._callSink(sink, oldChan, newChan, flags);
+ }
+ sink = IOUtil.queryNotificationCallbacks(oldChan, CES);
+ if (sink) this._callSink(sink, oldChan, newChan, flags);
+
+ // ----------------------------------
+
+ newChan.originalURI = oldChan.originalURI;
+
+ sink = IOUtil.queryNotificationCallbacks(oldChan, Ci.nsIHttpEventSink);
+ if (sink) sink.onRedirect(oldChan, newChan);
+ },
+
+ _callSink: function(sink, oldChan, newChan, flags) {
+ try {
+ if ("onChannelRedirect" in sink) sink.onChannelRedirect(oldChan, newChan, flags);
+ else sink.asyncOnChannelRedirect(oldChan, newChan, flags, this._redirectCallback);
+ } catch(e) {
+ if (e.toString().indexOf("(NS_ERROR_DOM_BAD_URI)") !== -1 && oldChan.URI.spec !== newChan.URI.spec) {
+ let oldURL = oldChan.URI.spec;
+ try {
+ oldChan.URI.spec = newChan.URI.spec;
+ this._callSink(sink, oldChan, newChan, flags);
+ } catch(e1) {
+ throw e;
+ } finally {
+ oldChan.URI.spec = oldURL;
+ }
+ } else if (e.message.indexOf("(NS_ERROR_NOT_AVAILABLE)") === -1) throw e;
+ }
+ },
+
+ _redirectCallback: ("nsIAsyncVerifyRedirectCallback" in Ci)
+ ? {
+ QueryInterface: xpcom_generateQI([Ci.nsIAsyncVerifyRedirectCallback]),
+ onRedirectVerifyCallback: function(result) {}
+ }
+ : null
+ ,
+
+ replace: function(realRedirect, callback) {
+ let self = this;
+ let oldChan = this.oldChannel;
+ this.realRedirect = !!realRedirect;
+ if (typeof(callback) !== "function") {
+ callback = this._defaultCallback;
+ }
+ ChannelReplacement.runWhenPending(oldChan, function() {
+ if (oldChan.status) return; // channel's doom had been already defined
+
+ let ccl = new CtxCapturingListener(oldChan, self);
+ self.loadGroup = oldChan.loadGroup;
+
+ oldChan.loadGroup = null; // prevents the wheel from stopping spinning
+
+
+ if (self._redirectCallback) { // Gecko >= 2
+ // this calls asyncAbort, which calls onStartRequest on our listener
+ oldChan.cancel(NS_BINDING_REDIRECTED);
+ self.suspend(); // believe it or not, this will defer asyncAbort() notifications until resume()
+ callback(self);
+ } else {
+ // legacy (Gecko < 2)
+ self.observeCapture = function(req, ccl) {
+ self.open = function() { self._redirect(ccl); };
+ callback(self);
+ };
+ oldChan.cancel(NS_BINDING_REDIRECTED);
+ }
+
+
+ });
+ },
+
+ observeCapture: function(req, ccl) {
+ this._redirect(ccl);
+ },
+
+ _defaultCallback: function(replacement) {
+ replacement.open();
+ },
+
+ open: function() {
+ this.resume(); // this triggers asyncAbort and the listeners in cascade
+ },
+ _redirect: function(ccl) {
+ let oldChan = this.oldChannel,
+ newChan = this.channel,
+ overlap;
+
+ if (!(this.window && (overlap = this.window._replacedChannel) !== oldChan)) {
+ try {
+ if (ABE.consoleDump && this.window) {
+ ABE.log("Opening delayed channel: " + oldChan.name + " - (current loading channel for this window " + (overlap && overlap.name) + ")");
+ }
+
+ oldChan.loadGroup = this.loadGroup;
+
+ this._onChannelRedirect();
+ newChan.asyncOpen(ccl.originalListener, ccl.originalCtx);
+
+ if (this.window && this.window != IOUtil.findWindow(newChan)) {
+ // late diverted load, unwanted artifact, abort
+ IOUtil.abort(newChan);
+ } else {
+ // safe browsing hook
+ if (this._classifierClass)
+ this._classifierClass.createInstance(Ci.nsIChannelClassifier).start(newChan, true);
+ }
+ } catch (e) {
+ ABE.log(e);
+ }
+ } else {
+ if (ABE.consoleDump) {
+ ABE.log("Detected double load on the same window: " + oldChan.name + " - " + (overlap && overlap.name));
+ }
+ }
+
+ this.dispose();
+ },
+
+ suspend: function() {
+ if (!this.suspended) {
+ this.oldChannel.suspend();
+ this.suspended = true;
+ }
+ },
+ resume: function() {
+ if (this.suspended) {
+ this.suspended = false;
+ try {
+ this.oldChannel.resume();
+ } catch (e) {}
+ }
+ },
+
+ dispose: function() {
+ this.resume();
+ if (this.loadGroup) {
+ try {
+ this.loadGroup.removeRequest(this.oldChannel, null, NS_BINDING_REDIRECTED);
+ } catch (e) {}
+ this.loadGroup = null;
+ }
+
+ }
+};
+
+function LoadGroupWrapper(channel, callback) {
+ this._channel = channel;
+ this._inner = channel.loadGroup;
+ this._callback = callback;
+ channel.loadGroup = this;
+}
+LoadGroupWrapper.prototype = {
+ QueryInterface: xpcom_generateQI([Ci.nsILoadGroup]),
+
+ get activeCount() {
+ return this._inner ? this._inner.activeCount : 0;
+ },
+ set defaultLoadRequest(v) {
+ return this._inner ? this._inner.defaultLoadRequest = v : v;
+ },
+ get defaultLoadRequest() {
+ return this._inner ? this._inner.defaultLoadRequest : null;
+ },
+ set groupObserver(v) {
+ return this._inner ? this._inner.groupObserver = v : v;
+ },
+ get groupObserver() {
+ return this._inner ? this._inner.groupObserver : null;
+ },
+ set notificationCallbacks(v) {
+ return this._inner ? this._inner.notificationCallbacks = v : v;
+ },
+ get notificationCallbacks() {
+ return this._inner ? this._inner.notificationCallbacks : null;
+ },
+ get requests() {
+ return this._inner ? this._inner.requests : this._emptyEnum;
+ },
+
+ addRequest: function(r, ctx) {
+ this.detach();
+ if (this._inner) try {
+ this._inner.addRequest(r, ctx);
+ } catch(e) {
+ // addRequest may have not been implemented
+ }
+ if (r === this._channel)
+ try {
+ this._callback(r, ctx);
+ } catch (e) {}
+ },
+ removeRequest: function(r, ctx, status) {
+ this.detach();
+ if (this._inner) this._inner.removeRequest(r, ctx, status);
+ },
+
+ detach: function() {
+ if (this._channel.loadGroup) this._channel.loadGroup = this._inner;
+ },
+ _emptyEnum: {
+ QueryInterface: xpcom_generateQI([Ci.nsISimpleEnumerator]),
+ getNext: function() { return null; },
+ hasMoreElements: function() { return false; }
+ }
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/Cookie.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/Cookie.js
new file mode 100644
index 0000000..9afe0a8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/Cookie.js
@@ -0,0 +1,148 @@
+function Cookie(s, host) {
+ this.parse(s, host);
+}
+Cookie.computeId = function(c) {
+ return c.name + ";" + c.host + "/" + c.path;
+};
+Cookie.find = function(f) {
+ var cc = Cookie.prototype.cookieManager.enumerator;
+ var c;
+ while (cc.hasMoreElements()) {
+ if (f(c = cc.getNext())) return c;
+ }
+ return null;
+};
+
+Cookie.attributes = { host: 'domain', path: 'path', expires: 'expires', isHttpOnly: 'HttpOnly', isSecure: 'Secure' };
+Cookie.prototype = {
+
+ name: '',
+ value: '',
+ source: '',
+ domain: '',
+ host: '',
+ rawHost: '',
+ path: '',
+ secure: false,
+ httponly: false,
+ session: true,
+ expires: 0,
+
+ id: '',
+
+
+ toString: function() {
+ var c = [this['name'] + "=" + this.value];
+ var v;
+ const aa = Cookie.attributes;
+ for (var k in aa) {
+ var p = aa[k];
+ v = this[k];
+ switch(typeof(v)) {
+ case "string":
+ if (v) c.push(p + "=" + v);
+ break;
+ case "boolean":
+ if (v) c.push(p);
+ break;
+ case "number":
+ if (!this.isSession) c.push(p + "=" + new Date(v * 1000).toUTCString());
+ break;
+ }
+ }
+ return c.join("; ");
+ },
+ parse: function(s, host) {
+ var p;
+ if (this.source) {
+ // cleanup for recycle
+ for (p in this) {
+ if (typeof (p) != "function") delete this[p];
+ }
+ }
+ this.source = s;
+ this.host = host;
+
+ var parts = s.split(/;\s*/);
+ var nv = parts.shift().split("=");
+
+ this.name = nv.shift() || '';
+ this.value = nv.join('=') || '';
+
+ var n, v;
+ for each (p in parts) {
+ nv = p.split("=");
+ switch (n = nv[0].toLowerCase()) {
+ case 'expires':
+ v = Math.round(Date.parse((nv[1] || '').replace(/\-/g, ' ')) / 1000);
+ break;
+ case 'domain':
+ case 'path':
+ v = nv[1] || '';
+ break;
+ case 'secure':
+ case 'httponly':
+ v = true;
+ break;
+ default:
+ n = 'unknown';
+ }
+ this[n] = v;
+ }
+ if (!this.expires) {
+ this.session = true;
+ this.expires = Math.round(new Date() / 1000) + 31536000;
+ }
+ if (this.domain) {
+ if (!this.isDomain) this.domain = "." + this.domain;
+ this.host = this.domain;
+ }
+ this.rawHost = this.host.replace(/^\./, '');
+
+ this.id = Cookie.computeId(this);
+ },
+
+
+ get cookieManager() {
+ delete Cookie.prototype.cookieManager;
+ var cman = Cc["@mozilla.org/cookiemanager;1"]
+ .getService(Ci.nsICookieManager2).QueryInterface(Ci.nsICookieManager);
+ return Cookie.prototype.cookieManager = cman;
+ },
+ belongsTo: function(host, path) {
+ if (path && this.path && path.indexOf(this.path) != 0) return false;
+ if (host == this.rawHost) return true;
+ var d = this.domain;
+ return d && (host == d || this.isDomain && host.slice(-d.length) == d);
+ },
+ save: function() {
+ this.save = ("cookieExists" in this.cookieManager)
+ ? function() { this.cookieManager.add(this.host, this.path, this.name, this.value, this.secure, this.httponly, this.session, this.expires); }
+ : function() { this.cookieManager.add(this.host, this.path, this.name, this.value, this.secure, this.session, this.expires);}
+ ;
+ return this.save();
+ },
+ exists: function() {
+ var cc = this.cookieManager.enumerator;
+ while(cc.hasMoreElements()) {
+ if (this.sameAs(cc.getNext())) return true;
+ }
+ return false;
+ },
+
+ sameAs: function(c) {
+ (c instanceof Ci.nsICookie) && (c instanceof Ci.nsICookie2);
+ return Cookie.computeId(c) == this.id;
+ },
+
+ // nsICookie2 interface extras
+ get isSecure() { return this.secure; },
+ get expiry() { return this.expires; },
+ get isSession() { return this.session; },
+ get isHttpOnly() { return this.httponly; },
+ get isDomain() { return this.domain && this.domain[0] == '.'; },
+ policy: 0,
+ status: 0,
+ QueryInterface: xpcom_generateQI([Ci.nsICookie, Ci.nsICookie2])
+
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/HTTPS.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/HTTPS.js
new file mode 100644
index 0000000..c39a0ef
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/HTTPS.js
@@ -0,0 +1,296 @@
+INCLUDE('Cookie');
+// XXX: Disable STS for now.
+var STS = {
+ isSTSURI : function(uri) {
+ return false;
+ }
+};
+
+// Hack. We only need the part of the policystate that tracks content
+// policy loading.
+const PolicyState = {
+ attach: function(channel) {
+ IOUtil.attachToChannel(channel, "httpseverywhere.policyLoaded", true);
+ },
+
+ extract: function(channel) {
+ var res = IOUtil.extractFromChannel(channel,
+ "httpseverywhere.policyLoaded", true);
+ return res;
+ },
+};
+
+const HTTPS = {
+ ready: false,
+
+ secureCookies: true,
+ secureCookiesExceptions: null,
+ secureCookiesForced: null,
+ httpsForced: null,
+ httpsForcedExceptions: null,
+ httpsRewrite: null,
+
+ replaceChannel: function(applicable_list, channel) {
+ var blob = HTTPSRules.rewrittenURI(applicable_list, channel.URI.clone());
+ if (null == blob) return false; // no rewrite
+ var uri = blob.newuri;
+ if (!uri) this.log(WARN, "OH NO BAD ARGH\nARGH");
+
+ var c2 = channel.QueryInterface(CI.nsIHttpChannel);
+ this.log(DBUG, channel.URI.spec+": Redirection limit is " + c2.redirectionLimit);
+ // XXX This used to be (c2.redirectionLimit == 1), but that's very
+ // inefficient in a case (eg amazon) where this may happen A LOT.
+ // Rather than number like 10, we should use the starting value
+ // in network.http.redirection-limit minus some counter
+ if (c2.redirectionLimit < 10) {
+ this.log(WARN, "Redirection loop trying to set HTTPS on:\n " +
+ channel.URI.spec +"\n(falling back to HTTP)");
+ if (!blob.applied_ruleset) {
+ this.log(WARN,"Blacklisting rule for: " + channel.URI.spec);
+ https_everywhere_blacklist[channel.URI.spec] = true;
+ }
+ https_everywhere_blacklist[channel.URI.spec] = blob.applied_ruleset;
+ var domain = null;
+ try { domain = channel.URI.host; } catch (e) {}
+ if (domain) https_blacklist_domains[domain] = true;
+ return false;
+ }
+
+ // Check for the new internal redirect API. If it exists, use it.
+ if (!"redirectTo" in channel) {
+ this.log(WARN, "nsIHTTPChannel.redirectTo API is missing. This version of HTTPS Everywhere is useless!!!!\n!!!\n");
+ return false;
+ }
+
+ this.log(INFO, "Using nsIHttpChannel.redirectTo: " + channel.URI.spec + " -> " + uri.spec);
+ try {
+ channel.redirectTo(uri);
+ return true;
+ } catch(e) {
+ // This should not happen. We should only get exceptions if
+ // the channel was already open.
+ this.log(WARN, "Exception on nsIHttpChannel.redirectTo: "+e);
+
+ // Don't return: Fallback to NoScript ChannelReplacement.js
+ }
+ this.log(WARN,"Aborting redirection " + channel.name + ", should be HTTPS!");
+ IOUtil.abort(channel);
+ return false;
+ },
+
+ // getApplicableListForContext was remove along with the nsIContentPolicy
+ // bindings and the and forceURI path that used them.
+
+ onCrossSiteRequest: function(channel, origin, browser, rw) {
+ try {
+ this.handleCrossSiteCookies(channel, origin, browser);
+ } catch(e) {
+ this.log(WARN, e + " --- " + e.stack);
+ }
+ },
+
+ registered: false,
+ handleSecureCookies: function(req) {
+
+ try {
+ req = req.QueryInterface(CI.nsIHttpChannel);
+ } catch(e) {
+ this.log(WARN, "Request is not an nsIHttpChannel: " + req);
+ return;
+ }
+ if (!this.secureCookies) return;
+ var uri = req.URI;
+ if (!uri) {
+ this.log(WARN,"No URI inside request " +req);
+ return;
+ }
+ //this.log(DBUG, "Cookie hunting in " + uri.spec);
+ var alist = HTTPSEverywhere.instance.getApplicableListForChannel(req);
+ if (!alist)
+ this.log(INFO, "No alist for cookies for "+(req.URI) ? req.URI.spec : "???");
+
+ if (uri.schemeIs("https")) {
+ var host = uri.host;
+ try {
+ var cookies = req.getResponseHeader("Set-Cookie");
+ } catch(mayHappen) {
+ //this.log(VERB,"Exception hunting Set-Cookie in headers: " + mayHappen);
+ return;
+ }
+ if (!cookies) return;
+ var c;
+ for each (var cs in cookies.split("\n")) {
+ this.log(DBUG, "Examining cookie: ");
+ c = new Cookie(cs, host);
+ if (!c.secure && HTTPSRules.shouldSecureCookie(alist, c, true)) {
+ this.log(INFO, "Securing cookie: " + c.domain + " " + c.name);
+ c.secure = true;
+ req.setResponseHeader("Set-Cookie", c.source + ";Secure", true);
+ }
+ }
+
+ }
+ },
+
+ handleInsecureCookie: function(c) {
+ if (HTTPSRules.shouldSecureCookie(null, c, false)) {
+ this.log(INFO, "Securing cookie from event: " + c.domain + " " + c.name);
+ var cookieManager = Components.classes["@mozilla.org/cookiemanager;1"]
+ .getService(Components.interfaces.nsICookieManager2);
+ //some braindead cookies apparently use umghzabilliontrabilions
+ var expiry = Math.min(c.expiry, Math.pow(2,31));
+ cookieManager.remove(c.host, c.name, c.path, false);
+ cookieManager.add(c.host, c.path, c.name, c.value, true, c.isHTTPOnly, c.isSession, expiry);
+ }
+ },
+
+ handleCrossSiteCookies: function(req, origin, browser) {
+
+ var unsafeCookies = this.getUnsafeCookies(browser);
+ if (!unsafeCookies) return;
+
+ var uri = req.URI;
+ var dscheme = uri.scheme;
+
+ var oparts = origin && origin.match(/^(https?):\/\/([^\/:]+).*?(\/.*)/);
+ if (!(oparts && /https?/.test(dscheme))) return;
+
+ var oscheme = oparts[1];
+ if (oscheme == dscheme) return; // we want to check only cross-scheme requests
+
+ var dsecure = dscheme == "https";
+
+ if (dsecure && !ns.getPref("secureCookies.recycle", false)) return;
+
+ var dhost = uri.host;
+ var dpath = uri.path;
+
+ var ohost = oparts[2];
+ var opath = oparts[3];
+
+ var ocookieCount = 0, totCount = 0;
+ var dcookies = [];
+ var c;
+
+ for (var k in unsafeCookies) {
+ c = unsafeCookies[k];
+ if (!c.exists()) {
+ delete unsafeCookies[k];
+ } else {
+ totCount++;
+ if (c.belongsTo(dhost, dpath) && c.secure != dsecure) { // either secure on http or not secure on https
+ dcookies.push(c);
+ }
+ if (c.belongsTo(ohost, opath)) {
+ ocookieCount++;
+ }
+ }
+ }
+
+ if (!totCount) {
+ this.setUnsafeCookies(browser, null);
+ return;
+ }
+
+ // We want to "desecurify" cookies only if cross-navigation to unsafe
+ // destination originates from a site sharing some secured cookies
+
+ if (ocookieCount == 0 && !dsecure || !dcookies.length) return;
+
+ if (dsecure) {
+ this.log(WARN,"Detected cross-site navigation with secured cookies: " + origin + " -> " + uri.spec);
+
+ } else {
+ this.log(WARN,"Detected unsafe navigation with NoScript-secured cookies: " + origin + " -> " + uri.spec);
+ this.log(WARN,uri.prePath + " cannot support secure cookies because it does not use HTTPS. Consider forcing HTTPS for " + uri.host + " in NoScript's Advanced HTTPS options panel.");
+ }
+
+ var cs = CC['@mozilla.org/cookieService;1'].getService(CI.nsICookieService).getCookieString(uri, req);
+
+ for each (c in dcookies) {
+ c.secure = dsecure;
+ c.save();
+ this.log(WARN,"Toggled secure flag on " + c);
+ }
+
+ if (cs) {
+ dcookies.push.apply(
+ dcookies, cs.split(/\s*;\s*/).map(function(cs) { var nv = cs.split("="); return { name: nv.shift(), value: nv.join("=") }; })
+ .filter(function(c) { return dcookies.every(function(x) { return x.name != c.name; }); })
+ );
+ }
+
+ cs = dcookies.map(function(c) { return c.name + "=" + c.value; }).join("; ");
+
+ this.log(WARN,"Sending Cookie for " + dhost + ": " + cs);
+ req.setRequestHeader("Cookie", cs, false); // "false" because merge syntax breaks Cookie header
+ },
+
+
+ cookiesCleanup: function(refCookie) {
+ var downgraded = [];
+
+ var ignored = this.secureCookiesExceptions;
+ var disabled = !this.secureCookies;
+ var bi = DOM.createBrowserIterator();
+ var unsafe, k, c, total, deleted;
+ for (var browser; browser = bi.next();) {
+ unsafe = this.getUnsafeCookies(browser);
+ if (!unsafe) continue;
+ total = deleted = 0;
+ for (k in unsafe) {
+ c = unsafe[k];
+ total++;
+ if (disabled || (refCookie ? c.belongsTo(refCookie.host) : ignored && ignored.test(c.rawHost))) {
+ if (c.exists()) {
+ this.log(WARN,"Cleaning Secure flag from " + c);
+ c.secure = false;
+ c.save();
+ }
+ delete unsafe[k];
+ deleted++;
+ }
+ }
+ if (total == deleted) this.setUnsafeCookies(browser, null);
+ if (!this.cookiesPerTab) break;
+ }
+ },
+
+ get cookiesPerTab() {
+ return ns.getPref("secureCookies.perTab", false);
+ },
+
+ _globalUnsafeCookies: {},
+ getUnsafeCookies: function(browser) {
+ return this.cookiesPerTab
+ ? browser && ns.getExpando(browser, "unsafeCookies")
+ : this._globalUnsafeCookies;
+ },
+ setUnsafeCookies: function(browser, value) {
+ return this.cookiesPerTab
+ ? browser && ns.setExpando(browser, "unsafeCookies", value)
+ : this._globalUnsafeCookies = value;
+ },
+
+ _getParent: function(req, w) {
+ return w && w.frameElement || DOM.findBrowserForNode(w || IOUtil.findWindow(req));
+ }
+
+};
+
+(function () {
+ ["secureCookies", "secureCookiesExceptions", "secureCookiesForced"].forEach(function(p) {
+ var v = HTTPS[p];
+ delete HTTPS[p];
+ HTTPS.__defineGetter__(p, function() {
+ return v;
+ });
+ HTTPS.__defineSetter__(p, function(n) {
+ v = n;
+ if (HTTPS.ready) HTTPS.cookiesCleanup();
+ return v;
+ });
+ });
+})();
+
+HTTPS.ready = true;
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/HTTPSRules.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/HTTPSRules.js
new file mode 100644
index 0000000..ecbaf76
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/HTTPSRules.js
@@ -0,0 +1,762 @@
+// Compilation of RegExps is now delayed until they are first used...
+
+function Rule(from, to) {
+ this.to = to;
+ this.from_c = from; // This will become a RegExp after compilation
+}
+
+function Exclusion(pattern) {
+ this.pattern_c = pattern; // Will become a RegExp after compilation
+}
+
+function CookieRule(host, cookiename) {
+ this.host = host;
+ this.name = cookiename;
+
+ // These will be made during compilation:
+
+ //this.host_c = new RegExp(host);
+ //this.name_c = new RegExp(cookiename);
+}
+
+function RuleSet(id, name, xmlName, match_rule, default_off, platform) {
+ if(xmlName == "WordPress.xml" || xmlName == "Github.xml") {
+ this.log(NOTE, "RuleSet( name="+name+", xmlName="+xmlName+", match_rule="+match_rule+", default_off="+default_off+", platform="+platform+" )");
+ }
+
+ this.id=id;
+ this.on_by_default = true;
+ this.compiled = false;
+ this.name = name;
+ this.xmlName = xmlName;
+ this.notes = "";
+ if (match_rule) this.ruleset_match_c = new RegExp(match_rule);
+ else this.ruleset_match_c = null;
+ if (default_off) {
+ // Perhaps problematically, this currently ignores the actual content of
+ // the default_off XML attribute. Ideally we'd like this attribute to be
+ // "valueless"
+ this.notes = default_off;
+ this.on_by_default = false;
+ }
+ if (platform)
+ if (platform.search(HTTPSRules.localPlatformRegexp) == -1) {
+ this.on_by_default = false;
+ this.notes = "Only for " + platform;
+ }
+
+ this.rules = [];
+ this.exclusions = [];
+ this.cookierules = [];
+
+ this.rule_toggle_prefs = HTTPSEverywhere.instance.rule_toggle_prefs;
+
+ try {
+ // if this pref exists, use it
+ this.active = this.rule_toggle_prefs.getBoolPref(name);
+ } catch(e) {
+ // if not, use the default
+ this.active = this.on_by_default;
+ }
+}
+
+var dom_parser = Cc["@mozilla.org/xmlextras/domparser;1"].createInstance(Ci.nsIDOMParser);
+
+RuleSet.prototype = {
+
+ ensureCompiled: function() {
+ // Postpone compilation of exclusions, rules and cookies until now, to accelerate
+ // browser load time.
+ if (this.compiled) return;
+ var i;
+
+ for (i = 0; i < this.exclusions.length; ++i) {
+ this.exclusions[i].pattern_c = new RegExp(this.exclusions[i].pattern_c);
+ }
+ for (i = 0; i < this.rules.length; ++i) {
+ this.rules[i].from_c = new RegExp(this.rules[i].from_c);
+ }
+
+ for (i = 0; i < this.cookierules.length; i++) {
+ var cr = this.cookierules[i];
+ cr.host_c = new RegExp(cr.host);
+ cr.name_c = new RegExp(cr.name);
+ }
+
+ this.compiled = true;
+ },
+
+ apply: function(urispec) {
+ // return null if it does not apply
+ // and the new url if it does apply
+ var i;
+ var returl = null;
+ this.ensureCompiled();
+ // If a rulset has a match_rule and it fails, go no further
+ if (this.ruleset_match_c && !this.ruleset_match_c.test(urispec)) {
+ this.log(VERB, "ruleset_match_c excluded " + urispec);
+ return null;
+ }
+ // Even so, if we're covered by an exclusion, go home
+ for (i = 0; i < this.exclusions.length; ++i) {
+ if (this.exclusions[i].pattern_c.test(urispec)) {
+ this.log(DBUG,"excluded uri " + urispec);
+ return null;
+ }
+ }
+ // Okay, now find the first rule that triggers
+ for (i = 0; i < this.rules.length; ++i) {
+ // This is just for displaying inactive rules
+ returl = urispec.replace(this.rules[i].from_c, this.rules[i].to);
+ if (returl != urispec) return returl;
+ }
+
+ return null;
+ },
+ log: function(level, msg) {
+ https_everywhereLog(level, msg);
+ },
+
+ wouldMatch: function(hypothetical_uri, alist) {
+ // return true if this ruleset would match the uri, assuming it were http
+ // used for judging moot / inactive rulesets
+ // alist is optional
+
+ // if the ruleset is already somewhere in this applicable list, we don't
+ // care about hypothetical wouldMatch questions
+ if (alist && (this.name in alist.all)) return false;
+
+ this.log(DBUG,"Would " +this.name + " match " +hypothetical_uri.spec +
+ "? serial " + (alist && alist.serial));
+
+ var uri = hypothetical_uri.clone();
+ if (uri.scheme == "https") uri.scheme = "http";
+ var urispec = uri.spec;
+
+ this.ensureCompiled();
+
+ if (this.ruleset_match_c && !this.ruleset_match_c.test(urispec))
+ return false;
+
+ for (var i = 0; i < this.exclusions.length; ++i)
+ if (this.exclusions[i].pattern_c.test(urispec)) return false;
+
+ for (var i = 0; i < this.rules.length; ++i)
+ if (this.rules[i].from_c.test(urispec)) return true;
+ return false;
+ },
+
+ transformURI: function(uri) {
+ // If no rule applies, return null; if a rule would have applied but was
+ // inactive, return 0; otherwise, return a fresh uri instance
+ // for the target
+ var newurl = this.apply(uri.spec);
+ if (null == newurl)
+ return null;
+ var newuri = Components.classes["@mozilla.org/network/standard-url;1"].
+ createInstance(CI.nsIStandardURL);
+ newuri.init(CI.nsIStandardURL.URLTYPE_STANDARD, 80,
+ newurl, uri.originCharset, null);
+ newuri = newuri.QueryInterface(CI.nsIURI);
+ return newuri;
+ },
+
+ enable: function() {
+ // Enable us.
+ this.rule_toggle_prefs.setBoolPref(this.name, true);
+ this.active = true;
+ },
+
+ disable: function() {
+ // Disable us.
+ this.rule_toggle_prefs.setBoolPref(this.name, false);
+ this.active = false;
+ },
+
+ toggle: function() {
+ this.active = !this.active;
+ this.rule_toggle_prefs.setBoolPref(this.name, this.active);
+ },
+
+ clear: function() {
+ try {
+ this.rule_toggle_prefs.clearUserPref(this.name);
+ } catch(e) {
+ // this ruleset has never been toggled
+ }
+ this.active = this.on_by_default;
+ }
+};
+
+const RuleWriter = {
+
+ getCustomRuleDir: function() {
+ var loc = "ProfD"; // profile directory
+ var file =
+ CC["@mozilla.org/file/directory_service;1"]
+ .getService(CI.nsIProperties)
+ .get(loc, CI.nsILocalFile)
+ .clone();
+ file.append("HTTPSEverywhereUserRules");
+ // Check for existence, if not, create.
+ if (!file.exists()) {
+ file.create(CI.nsIFile.DIRECTORY_TYPE, 0700);
+ }
+ if (!file.isDirectory()) {
+ // XXX: Arg, death!
+ }
+ return file;
+ },
+
+ chromeToPath: function (aPath) {
+ if (!aPath || !(/^chrome:/.test(aPath)))
+ return; //not a chrome url
+
+ var ios =
+ CC['@mozilla.org/network/io-service;1']
+ .getService(CI.nsIIOService);
+ var uri = ios.newURI(aPath, "UTF-8", null);
+ var cr =
+ CC['@mozilla.org/chrome/chrome-registry;1']
+ .getService(CI.nsIChromeRegistry);
+ var rv = cr.convertChromeURL(uri).spec;
+
+ if (/^file:/.test(rv))
+ rv = this.urlToPath(rv);
+ else
+ rv = this.urlToPath("file://"+rv);
+
+ return rv;
+ },
+
+ urlToPath: function (aPath) {
+ if (!aPath || !/^file:/.test(aPath))
+ return ;
+
+ var ph =
+ CC["@mozilla.org/network/protocol;1?name=file"]
+ .createInstance(CI.nsIFileProtocolHandler);
+ var rv = ph.getFileFromURLSpec(aPath).path;
+
+ return rv;
+ },
+
+ read: function(file, rule_store, ruleset_id) {
+ if (!file.exists())
+ return null;
+ if ((rule_store.targets == null) && (rule_store.targets != {}))
+ this.log(WARN, "TARGETS IS NULL");
+ var data = "";
+ var fstream = CC["@mozilla.org/network/file-input-stream;1"]
+ .createInstance(CI.nsIFileInputStream);
+ var sstream = CC["@mozilla.org/scriptableinputstream;1"]
+ .createInstance(CI.nsIScriptableInputStream);
+ fstream.init(file, -1, 0, 0);
+ sstream.init(fstream);
+
+ var str = sstream.read(4096);
+ while (str.length > 0) {
+ data += str;
+ str = sstream.read(4096);
+ }
+
+ sstream.close();
+ fstream.close();
+ return this.readFromString(data, rule_store, ruleset_id);
+ },
+
+ readFromString: function(data, rule_store, ruleset_id) {
+ try {
+ var xmlruleset = dom_parser.parseFromString(data, "text/xml");
+ } catch(e) { // file has been corrupted; XXX: handle error differently
+ this.log(WARN,"Error in XML data: " + e + "\n" + data);
+ return null;
+ }
+ this.parseOneRuleset(xmlruleset.documentElement, rule_store, ruleset_id);
+ },
+
+ parseOneRuleset: function(xmlruleset, rule_store, ruleset_id) {
+ // Extract an xmlruleset into the rulestore
+ if (!xmlruleset.getAttribute("name")) {
+ this.log(WARN, "This blob: '" + xmlruleset + "' is not a ruleset\n");
+ return null;
+ }
+
+ this.log(DBUG, "Parsing " + xmlruleset.getAttribute("name"));
+
+ var match_rl = xmlruleset.getAttribute("match_rule");
+ var dflt_off = xmlruleset.getAttribute("default_off");
+ var platform = xmlruleset.getAttribute("platform");
+ var rs = new RuleSet(ruleset_id, xmlruleset.getAttribute("name"), xmlruleset.getAttribute("f"), match_rl, dflt_off, platform);
+
+ // see if this ruleset has the same name as an existing ruleset;
+ // if so, this ruleset is ignored; DON'T add or return it.
+ if (rs.name in rule_store.rulesetsByName) {
+ this.log(WARN, "Error: found duplicate rule name " + rs.name);
+ return null;
+ }
+
+ // Add this ruleset id into HTTPSRules.targets if it's not already there.
+ // This should only happen for custom user rules. Built-in rules get
+ // their ids preloaded into the targets map, and have their <target>
+ // tags stripped when the sqlite database is built.
+ var targets = xmlruleset.getElementsByTagName("target");
+ for (var i = 0; i < targets.length; i++) {
+ var host = targets[i].getAttribute("host");
+ if (!host) {
+ this.log(WARN, "<target> missing host in " + xmlruleset.getAttribute("name"));
+ return null;
+ }
+ if (! rule_store.targets[host])
+ rule_store.targets[host] = [];
+ this.log(DBUG, "Adding " + host + " to targets, pointing at " + ruleset_id);
+ rule_store.targets[host].push(ruleset_id);
+ }
+
+ var exclusions = xmlruleset.getElementsByTagName("exclusion");
+ for (var i = 0; i < exclusions.length; i++) {
+ var exclusion = new Exclusion(exclusions[i].getAttribute("pattern"));
+ rs.exclusions.push(exclusion);
+ }
+
+ var rules = xmlruleset.getElementsByTagName("rule");
+ for (var i = 0; i < rules.length; i++) {
+ var rule = new Rule(rules[i].getAttribute("from"),
+ rules[i].getAttribute("to"));
+ rs.rules.push(rule);
+ }
+
+ var securecookies = xmlruleset.getElementsByTagName("securecookie");
+ for (var i = 0; i < securecookies.length; i++) {
+ var c_rule = new CookieRule(securecookies[i].getAttribute("host"),
+ securecookies[i].getAttribute("name"));
+ rs.cookierules.push(c_rule);
+ this.log(DBUG,"Cookie rule "+ c_rule.host+ " " +c_rule.name);
+ }
+
+ rule_store.rulesets.push(rs);
+ rule_store.rulesetsByID[rs.id] = rs;
+ rule_store.rulesetsByName[rs.name] = rs;
+ },
+
+ enumerate: function(dir) {
+ // file is the given directory (nsIFile)
+ var entries = dir.directoryEntries;
+ var ret = [];
+ while(entries.hasMoreElements()) {
+ var entry = entries.getNext();
+ entry.QueryInterface(Components.interfaces.nsIFile);
+ ret.push(entry);
+ }
+ return ret;
+ },
+};
+
+
+
+const HTTPSRules = {
+ init: function() {
+ try {
+ this.rulesets = [];
+ this.targets = {}; // dict mapping target host pattern -> list of
+ // applicable ruleset ids
+ this.rulesetsByID = {};
+ this.rulesetsByName = {};
+ var t1 = new Date().getTime();
+ this.checkMixedContentHandling();
+ var rulefiles = RuleWriter.enumerate(RuleWriter.getCustomRuleDir());
+ this.scanRulefiles(rulefiles);
+
+ // Initialize database connection.
+ var dbFile = new FileUtils.File(RuleWriter.chromeToPath("chrome://https-everywhere/content/rulesets.sqlite"));
+ var rulesetDBConn = Services.storage.openDatabase(dbFile);
+ this.queryForRuleset = rulesetDBConn.createStatement(
+ "select contents from rulesets where id = :id");
+
+ // Preload the mapping of hostname target -> ruleset ID from DB.
+ // This is a little slow (287 ms on a Core2 Duo @ 2.2GHz with SSD),
+ // but is faster than loading all of the rulesets. If this becomes a
+ // bottleneck, change it to load in a background webworker, or load
+ // a smaller bloom filter instead.
+ var targetsQuery = rulesetDBConn.createStatement("select host, ruleset_id from targets");
+ this.log(DBUG, "Loading targets...");
+ while (targetsQuery.executeStep()) {
+ var host = targetsQuery.row.host;
+ var id = targetsQuery.row.ruleset_id;
+ if (!this.targets[host]) {
+ this.targets[host] = [id];
+ } else {
+ this.targets[host].push(id);
+ }
+ }
+ this.log(DBUG, "Loading adding targets.");
+ } catch(e) {
+ this.log(DBUG,"Rules Failed: "+e);
+ }
+ var t2 = new Date().getTime();
+ this.log(NOTE,"Loading targets took " + (t2 - t1) / 1000.0 + " seconds");
+
+ var gitCommitQuery = rulesetDBConn.createStatement("select git_commit from git_commit");
+ if (gitCommitQuery.executeStep()) {
+ this.GITCommitID = gitCommitQuery.row.git_commit;
+ }
+
+ try {
+ if (HTTPSEverywhere.instance.prefs.getBoolPref("performance_tests")) {
+ this.testRulesetRetrievalPerformance();
+ }
+ } catch(e) {
+ this.log(WARN, "Exception during testing " + e);
+ }
+ return;
+ },
+
+ checkMixedContentHandling: function() {
+ // Firefox 23+ blocks mixed content by default, so rulesets that create
+ // mixed content situations should be disabled there
+ var appInfo = CC["@mozilla.org/xre/app-info;1"].getService(CI.nsIXULAppInfo);
+ var platformVer = appInfo.platformVersion;
+ var versionChecker = CC["@mozilla.org/xpcom/version-comparator;1"]
+ .getService(CI.nsIVersionComparator);
+ var prefs = Components.classes["@mozilla.org/preferences-service;1"]
+ .getService(Components.interfaces.nsIPrefService).getBranch("");
+
+
+ // If mixed content is present and enabled, and the user hasn't opted to enable
+ // mixed content triggering rules, leave them out. Otherwise add them in.
+ if(versionChecker.compare(appInfo.version, "23.0a1") >= 0
+ && prefs.getBoolPref("security.mixed_content.block_active_content")
+ && !prefs.getBoolPref("extensions.https_everywhere.enable_mixed_rulesets")) {
+ this.log(INFO, "Not activating rules that trigger mixed content errors.");
+ this.localPlatformRegexp = new RegExp("firefox");
+ } else {
+ this.log(INFO, "Activating rules that would normally trigger mixed content");
+ this.localPlatformRegexp = new RegExp("(firefox|mixedcontent)");
+ }
+ },
+
+ scanRulefiles: function(rulefiles) {
+ var i = 0;
+ var r = null;
+ for(i = 0; i < rulefiles.length; ++i) {
+ try {
+ this.log(DBUG,"Loading ruleset file: "+rulefiles[i].path);
+ var ruleset_id = "custom_" + i;
+ RuleWriter.read(rulefiles[i], this, ruleset_id);
+ } catch(e) {
+ this.log(WARN, "Error in ruleset file: " + e);
+ if (e.lineNumber)
+ this.log(WARN, "(line number: " + e.lineNumber + ")");
+ }
+ }
+ },
+
+ resetRulesetsToDefaults: function() {
+ // Callable from within the prefs UI and also for cleaning up buggy
+ // configurations...
+ for (var i in this.rulesets) {
+ this.rulesets[i].clear();
+ }
+ },
+
+ rewrittenURI: function(alist, input_uri) {
+ // This function oversees the task of working out if a uri should be
+ // rewritten, what it should be rewritten to, and recordkeeping of which
+ // applicable rulesets are and aren't active. Previously this returned
+ // the new uri if there was a rewrite. Now it returns a JS object with a
+ // newuri attribute and an applied_ruleset attribute (or null if there's
+ // no rewrite).
+ var i = 0;
+ userpass_present = false; // Global so that sanitiseURI can tweak it.
+ // Why does JS have no tuples, again?
+ var blob = {}; blob.newuri = null;
+ if (!alist) this.log(DBUG, "No applicable list rewriting " + input_uri.spec);
+ this.log(NOTE, "Processing " + input_uri.spec);
+
+ var uri = this.sanitiseURI(input_uri);
+
+ // Get the list of rulesets that target this host
+ try {
+ var rs = this.potentiallyApplicableRulesets(uri.host);
+ } catch(e) {
+ this.log(NOTE, 'Could not check applicable rules for '+uri.spec + '\n'+e);
+ return null;
+ }
+
+ // ponder each potentially applicable ruleset, working out if it applies
+ // and recording it as active/inactive/moot/breaking in the applicable list
+ for (i = 0; i < rs.length; ++i) {
+ if (!rs[i].active) {
+ if (alist && rs[i].wouldMatch(uri, alist))
+ alist.inactive_rule(rs[i]);
+ continue;
+ }
+ blob.newuri = rs[i].transformURI(uri);
+ if (blob.newuri) {
+ // we rewrote the uri
+ this.log(DBUG, "Rewrote "+input_uri.spec);
+ if (alist) {
+ if (uri.spec in https_everywhere_blacklist)
+ alist.breaking_rule(rs[i]);
+ else
+ alist.active_rule(rs[i]);
+ }
+ if (userpass_present) blob.newuri.userPass = input_uri.userPass;
+ blob.applied_ruleset = rs[i];
+ return blob;
+ }
+ if (uri.scheme == "https" && alist) {
+ // we didn't rewrite but the rule applies to this domain and the
+ // requests are going over https
+ if (rs[i].wouldMatch(uri, alist)) alist.moot_rule(rs[i]);
+ continue;
+ }
+ }
+ return null;
+ },
+
+ sanitiseURI: function(input_uri) {
+ // Rulesets shouldn't try to parse usernames and passwords. If we find
+ // those, apply the ruleset without them (and then add them back later).
+ // When .userPass is absent, sometimes it is false and sometimes trying
+ // to read it raises an exception (probably depending on the URI type).
+ var uri = input_uri;
+ try {
+ if (input_uri.userPass) {
+ uri = input_uri.clone();
+ userpass_present = true; // tweaking a global in our caller :(
+ uri.userPass = null;
+ }
+ } catch(e) {}
+
+ // example.com. is equivalent to example.com
+ // example.com.. is invalid, but firefox would load it anyway
+ try {
+ if (uri.host)
+ try {
+ var h = uri.host;
+ if (h.charAt(h.length - 1) == ".") {
+ while (h.charAt(h.length - 1) == ".")
+ h = h.slice(0,-1);
+ uri = uri.clone();
+ uri.host = h;
+ }
+ } catch(e) {
+ this.log(WARN, "Failed to normalise domain: ");
+ try {this.log(WARN, input_uri.host);}
+ catch(e2) {this.log(WARN, "bang" + e + " & " + e2 + " & "+ input_uri);}
+ }
+ } catch(e3) {
+ this.log(INFO, "uri.host is explosive!");
+ try { this.log(INFO, "(" + uri.spec + ")"); } // happens for about: uris and soforth
+ catch(e4) { this.log(WARN, "(and unprintable!!!!!!)"); }
+ }
+ return uri;
+ },
+
+ setInsert: function(intoList, fromList) {
+ // Insert any elements from fromList into intoList, if they are not
+ // already there. fromList may be null.
+ if (!fromList) return;
+ for (var i = 0; i < fromList.length; i++)
+ if (intoList.indexOf(fromList[i]) == -1)
+ intoList.push(fromList[i]);
+ },
+
+ loadAllRulesets: function() {
+ for (var host in this.targets) {
+ var ruleset_ids = this.targets[host];
+ for (var i = 0; i < ruleset_ids.length; i++) {
+ var id = ruleset_ids[i];
+ if (!this.rulesetsByID[id]) {
+ this.loadRulesetById(id);
+ }
+ }
+ }
+ },
+
+ // Load a ruleset by numeric id, e.g. 234
+ // NOTE: This call runs synchronously, which can lock up the browser UI. Is
+ // there any way to fix that, given that we need to run blocking in the request
+ // flow? Perhaps we can preload all targets from the DB into memory at startup
+ // so we only hit the DB when we know there is something to be had.
+ loadRulesetById: function(ruleset_id) {
+ this.log(DBUG, "Querying DB for ruleset id " + ruleset_id);
+ this.queryForRuleset.params.id = ruleset_id;
+
+ try {
+ if (this.queryForRuleset.executeStep()) {
+ this.log(INFO, "Found ruleset in DB for id " + ruleset_id);
+ RuleWriter.readFromString(this.queryForRuleset.row.contents, this, ruleset_id);
+ } else {
+ this.log(WARN,"Couldn't find ruleset for id " + ruleset_id);
+ }
+ } finally {
+ this.queryForRuleset.reset();
+ }
+ },
+
+ // Get all rulesets matching a given target, lazy-loading from DB as necessary.
+ rulesetsByTarget: function(target) {
+ var rulesetIds = this.targets[target];
+
+ var output = [];
+ if (rulesetIds) {
+ this.log(INFO, "For target " + target + ", found ids " + rulesetIds.toString());
+ for (var i = 0; i < rulesetIds.length; i++) {
+ var id = rulesetIds[i];
+ if (!this.rulesetsByID[id]) {
+ this.loadRulesetById(id);
+ }
+ if (this.rulesetsByID[id]) {
+ output.push(this.rulesetsByID[id]);
+ }
+ }
+ } else {
+ this.log(INFO, "For target " + target + ", found no ids in DB");
+ }
+ return output;
+ },
+
+ potentiallyApplicableRulesets: function(host) {
+ // Return a list of rulesets that declare targets matching this host
+ var i, tmp, t;
+ var results = [];
+
+ var attempt = function(target) {
+ this.setInsert(results, this.rulesetsByTarget(target));
+ }.bind(this);
+
+ attempt(host);
+
+ // replace each portion of the domain with a * in turn
+ var segmented = host.split(".");
+ for (i = 0; i < segmented.length; ++i) {
+ tmp = segmented[i];
+ segmented[i] = "*";
+ t = segmented.join(".");
+ segmented[i] = tmp;
+ attempt(t);
+ }
+ // now eat away from the left, with *, so that for x.y.z.google.com we
+ // check *.z.google.com and *.google.com (we did *.y.z.google.com above)
+ for (i = 2; i <= segmented.length - 2; ++i) {
+ t = "*." + segmented.slice(i,segmented.length).join(".");
+ attempt(t);
+ }
+ this.log(DBUG,"Potentially applicable rules for " + host + ":");
+ for (i = 0; i < results.length; ++i)
+ this.log(DBUG, " " + results[i].name);
+ return results;
+ },
+
+ testRulesetRetrievalPerformance: function() {
+ // We can use this function to measure the impact of changes in the ruleset
+ // storage architecture, potentiallyApplicableRulesets() caching
+ // implementations, etc.
+ var req = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
+ .createInstance(Ci.nsIXMLHttpRequest);
+ req.open("GET", "https://eff.org/files/alexa-top-10000-global.txt", false);
+ req.send();
+ var domains = req.response.split("\n");
+ var domains_l = domains.length - 1; // The last entry in this thing is bogus
+ var prefix = "";
+ this.log(WARN, "Calling potentiallyApplicableRulesets() with " + domains_l + " domains");
+ var count = 0;
+ var t1 = new Date().getTime();
+ for (var n = 0; n < domains_l; n++) {
+ if (this.potentiallyApplicableRulesets(prefix + domains[n]).length != 0)
+ count++;
+ }
+ var t2 = new Date().getTime();
+ this.log(NOTE, count + " hits: average call to potentiallyApplicableRulesets took " + (t2 - t1) / domains_l + " milliseconds");
+ count = 0;
+ t1 = new Date().getTime();
+ for (var n = 0; n < domains_l; n++) {
+ if (this.potentiallyApplicableRulesets(prefix + domains[n]).length != 0)
+ count++;
+ }
+ t2 = new Date().getTime();
+ this.log(NOTE, count + " hits: average subsequent call to potentiallyApplicableRulesets took " + (t2 - t1) / domains_l + " milliseconds");
+ },
+
+ shouldSecureCookie: function(applicable_list, c, known_https) {
+ // Check to see if the Cookie object c meets any of our cookierule citeria
+ // for being marked as secure.
+ // @applicable_list : an ApplicableList or record keeping
+ // @c : an nsICookie2
+ // @known_https : true if we know the page setting the cookie is https
+
+ this.log(DBUG," rawhost: " + c.rawHost + "\n name: " + c.name + "\n host" + c.host);
+ var i,j;
+ var rs = this.potentiallyApplicableRulesets(c.host);
+ for (i = 0; i < rs.length; ++i) {
+ var ruleset = rs[i];
+ if (ruleset.active) {
+ ruleset.ensureCompiled();
+ // Never secure a cookie if this page might be HTTP
+ if (!known_https && !this.safeToSecureCookie(c.rawHost))
+ continue;
+ for (j = 0; j < ruleset.cookierules.length; j++) {
+ var cr = ruleset.cookierules[j];
+ if (cr.host_c.test(c.host) && cr.name_c.test(c.name)) {
+ if (applicable_list) applicable_list.active_rule(ruleset);
+ this.log(INFO,"Active cookie rule " + ruleset.name);
+ return true;
+ }
+ }
+ if (ruleset.cookierules.length > 0)
+ if (applicable_list) applicable_list.moot_rule(ruleset);
+ } else if (ruleset.cookierules.length > 0) {
+ if (applicable_list) applicable_list.inactive_rule(ruleset);
+ this.log(INFO,"Inactive cookie rule " + ruleset.name);
+ }
+ }
+ return false;
+ },
+
+ safeToSecureCookie: function(domain) {
+ // Check if the domain might be being served over HTTP. If so, it isn't
+ // safe to secure a cookie! We can't always know this for sure because
+ // observing cookie-changed doesn't give us enough context to know the
+ // full origin URI.
+
+ // First, if there are any redirect loops on this domain, don't secure
+ // cookies. XXX This is not a very satisfactory heuristic. Sometimes we
+ // would want to secure the cookie anyway, because the URLs that loop are
+ // not authenticated or not important. Also by the time the loop has been
+ // observed and the domain blacklisted, a cookie might already have been
+ // flagged as secure.
+
+ if (domain in https_blacklist_domains) {
+ this.log(INFO, "cookies for " + domain + "blacklisted");
+ return false;
+ }
+
+ // If we passed that test, make up a random URL on the domain, and see if
+ // we would HTTPSify that.
+
+ try {
+ var nonce_path = "/" + Math.random().toString();
+ nonce_path = nonce_path + nonce_path;
+ var test_uri = "http://" + domain + nonce_path;
+ } catch (e) {
+ this.log(WARN, "explosion in safeToSecureCookie for " + domain + "\n"
+ + "(" + e + ")");
+ return false;
+ }
+
+ this.log(INFO, "Testing securecookie applicability with " + test_uri);
+ var rs = this.potentiallyApplicableRulesets(domain);
+ for (var i = 0; i < rs.length; ++i) {
+ if (!rs[i].active) continue;
+ var rewrite = rs[i].apply(test_uri);
+ if (rewrite) {
+ this.log(INFO, "Yes: " + rewrite);
+ return true;
+ }
+ }
+ this.log(INFO, "(NO)");
+ return false;
+ }
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/IOUtil.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/IOUtil.js
new file mode 100644
index 0000000..96c2500
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/IOUtil.js
@@ -0,0 +1,263 @@
+const IO = {
+ readFile: function(file, charset) {
+ var res;
+
+ const is = Cc["@mozilla.org/network/file-input-stream;1"]
+ .createInstance(Ci.nsIFileInputStream );
+ is.init(file ,0x01, 256 /*0400*/, null);
+ const sis = Cc["@mozilla.org/scriptableinputstream;1"]
+ .createInstance(Ci.nsIScriptableInputStream);
+ sis.init(is);
+
+ res = sis.read(sis.available());
+ is.close();
+
+ if (charset !== null) { // use "null" if you want uncoverted data...
+ const unicodeConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]
+ .createInstance(Ci.nsIScriptableUnicodeConverter);
+ try {
+ unicodeConverter.charset = charset || "UTF-8";
+ } catch(ex) {
+ unicodeConverter.charset = "UTF-8";
+ }
+ res = unicodeConverter.ConvertToUnicode(res);
+ }
+
+ return res;
+ },
+ writeFile: function(file, content, charset) {
+ const unicodeConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]
+ .createInstance(Ci.nsIScriptableUnicodeConverter);
+ try {
+ unicodeConverter.charset = charset || "UTF-8";
+ } catch(ex) {
+ unicodeConverter.charset = "UTF-8";
+ }
+
+ content = unicodeConverter.ConvertFromUnicode(content);
+ const os = Cc["@mozilla.org/network/file-output-stream;1"]
+ .createInstance(Ci.nsIFileOutputStream);
+ os.init(file, 0x02 | 0x08 | 0x20, 448 /*0700*/, 0);
+ os.write(content, content.length);
+ os.close();
+ },
+
+ safeWriteFile: function(file, content, charset) {
+ var tmp = file.clone();
+ var name = file.leafName;
+ tmp.leafName = name + ".tmp";
+ tmp.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, file.exists() ? file.permissions : 384 /*0600*/);
+ this.writeFile(tmp, content, charset);
+ tmp.moveTo(file.parent, name);
+ }
+};
+
+
+function nsISupportsWrapper(wrapped) {
+ this.wrappedJSObject = wrapped;
+}
+nsISupportsWrapper.prototype = {
+ QueryInterface: xpcom_generateQI([])
+};
+
+const IOUtil = {
+ asyncNetworking: true,
+ proxiedDNS: 0,
+
+ attachToChannel: function(channel, key, requestInfo) {
+ if (channel instanceof Ci.nsIWritablePropertyBag2)
+ channel.setPropertyAsInterface(key, requestInfo);
+ },
+ extractFromChannel: function(channel, key, preserve) {
+ if (channel instanceof Ci.nsIPropertyBag2) {
+ let p = channel.get(key);
+ if (p) {
+ if (!preserve && (channel instanceof Ci.nsIWritablePropertyBag)) channel.deleteProperty(key);
+ if (p.wrappedJSObject) return p.wrappedJSObject;
+ p instanceof Ci.nsIURL || p instanceof Ci.nsIURL;
+ return p;
+ }
+ }
+ return null;
+ },
+
+ extractInternalReferrer: function(channel) {
+ if (channel instanceof Ci.nsIPropertyBag2) {
+ const key = "docshell.internalReferrer";
+ if (channel.hasKey(key))
+ try {
+ return channel.getPropertyAsInterface(key, Ci.nsIURL);
+ } catch(e) {}
+ }
+ return null;
+ },
+ extractInternalReferrerSpec: function(channel) {
+ var ref = this.extractInternalReferrer(channel);
+ return ref && ref.spec || null;
+ },
+
+ getProxyInfo: function(channel) {
+ return Ci.nsIProxiedChannel && (channel instanceof Ci.nsIProxiedChannel)
+ ? channel.proxyInfo
+ : Components.classes["@mozilla.org/network/protocol-proxy-service;1"]
+ .getService(Components.interfaces.nsIProtocolProxyService)
+ .resolve(channel.URI, 0);
+ },
+
+
+ canDoDNS: function(channel) {
+ if (!channel || IOS.offline) return false;
+
+ var proxyInfo = this.getProxyInfo(channel);
+ switch(this.proxiedDNS) {
+ case 1:
+ return !(proxyInfo && (proxyInfo.flags & Ci.nsIProxyInfo.TRANSPARENT_PROXY_RESOLVES_HOST));
+ case 2:
+ return true;
+ default:
+ return !proxyInfo || proxyInfo.type == "direct";
+ }
+
+ },
+
+ abort: function(channel, noNetwork) {
+ channel.cancel(Cr.NS_ERROR_ABORT);
+ },
+
+ findWindow: function(channel) {
+ for each(var cb in [channel.notificationCallbacks,
+ channel.loadGroup && channel.loadGroup.notificationCallbacks]) {
+ if (cb instanceof Ci.nsIInterfaceRequestor) {
+ if (Ci.nsILoadContext) try {
+ // For Gecko 1.9.1
+ return cb.getInterface(Ci.nsILoadContext).associatedWindow;
+ } catch(e) {}
+
+ try {
+ // For Gecko 1.9.0
+ return cb.getInterface(Ci.nsIDOMWindow);
+ } catch(e) {}
+ }
+ }
+ return null;
+ },
+
+ readFile: IO.readFile,
+ writeFile: IO.writeFile,
+ safeWriteFIle: IO.safeWriteFile,
+
+ _protocols: {}, // caching them we gain a 33% speed boost in URI creation :)
+ newURI: function(url) {
+ try {
+ let scheme = url.substring(0, url.indexOf(':'));
+ return (this._protocols[scheme] ||
+ (this._protocols[scheme] =
+ Cc["@mozilla.org/network/protocol;1?name=" + scheme]
+ .getService(Ci.nsIProtocolHandler)))
+ .newURI(url, null, null);
+ } catch(e) {
+ return IOS.newURI(url, null, null);
+ }
+ },
+
+ unwrapURL: function(url) {
+ try {
+ if (!(url instanceof Ci.nsIURI))
+ url = this.newURI(url);
+
+ switch (url.scheme) {
+ case "view-source":
+ return this.unwrapURL(url.path);
+ case "feed":
+ let u = url.spec.substring(5);
+ if (u.substring(0, 2) == '//') u = "http:" + u;
+ return this.unwrapURL(u);
+ case "wyciwyg":
+ return this.unwrapURL(url.path.replace(/^\/\/\d+\//, ""));
+ case "jar":
+ if (url instanceof Ci.nsIJARURI)
+ return this.unwrapURL(url.JARFile);
+ }
+ }
+ catch (e) {}
+
+ return url;
+ },
+
+
+ get _channelFlags() {
+ delete this._channelFlags;
+ const constRx = /^[A-Z_]+$/;
+ const ff = {};
+ [Ci.nsIHttpChannel, Ci.nsICachingChannel].forEach(function(c) {
+ for (var p in c) {
+ if (constRx.test(p)) ff[p] = c[p];
+ }
+ });
+ return this._channelFlags = ff;
+ },
+ humanFlags: function(loadFlags) {
+ var hf = [];
+ var c = this._channelFlags;
+ for (var p in c) {
+ if (loadFlags & c[p]) hf.push(p + "=" + c[p]);
+ }
+ return hf.join("\n");
+ },
+
+ queryNotificationCallbacks: function(chan, iid) {
+ var cb;
+ try {
+ cb = chan.notificationCallbacks.getInterface(iid);
+ if (cb) return cb;
+ } catch(e) {}
+
+ try {
+ return chan.loadGroup && chan.loadGroup.notificationCallbacks.getInterface(iid);
+ } catch(e) {}
+
+ return null;
+ },
+
+
+ anonymizeURI: function(uri, cookie) {
+ if (uri instanceof Ci.nsIURL) {
+ uri.query = this.anonymizeQS(uri.query, cookie);
+ } else return this.anonymizeURL(uri, cookie);
+ return uri;
+ },
+ anonymizeURL: function(url, cookie) {
+ var parts = url.split("?");
+ if (parts.length < 2) return url;
+ parts[1] = this.anonymizeQS(parts[1], cookie);
+ return parts.join("?");
+ },
+
+ _splitName: function(nv) nv.split("=")[0],
+ _qsRx: /[&=]/,
+ _anonRx: /(?:auth|s\w+(?:id|key)$)/,
+ anonymizeQS: function(qs, cookie) {
+ if (!qs) return qs;
+ if (!this._qsRx.test(qs)) return '';
+
+ var cookieNames, hasCookies;
+ if ((hasCookies = !!cookie)) cookieNames = cookie.split(/\s*;\s*/).map(this._splitName);
+
+ let parms = qs.split("&");
+ for (j = parms.length; j-- > 0;) {
+ let nv = parms[j].split("=");
+ let name = nv[0];
+ if (this._anonRx.test(name) || cookie && cookieNames.indexOf(name) > -1)
+ parms.splice(j, 1);
+ }
+ return parms.join("&");
+ },
+
+ get TLDService() {
+ delete this.TLDService;
+ return this.TLDService = Cc["@mozilla.org/network/effective-tld-service;1"].getService(Ci.nsIEffectiveTLDService);
+ }
+
+};
+
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/NSS.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/NSS.js
new file mode 100644
index 0000000..97a7e78
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/NSS.js
@@ -0,0 +1,491 @@
+// Copyright (c) 2011 Moxie Marlinspike <moxie@thoughtcrime.org>
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 3 of the
+// License, or (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA
+
+
+/**
+ * This class manages the ctypes bridge to the NSS (crypto) libraries
+ * distributed with Mozilla.
+ *
+ **/
+
+function NSS() {
+
+}
+
+NSS.initialize = function(nssPath) {
+ var sharedLib;
+
+ try {
+ sharedLib = ctypes.open(nssPath);
+ } catch (e) {
+ dump("Failed to find nss3 in installed directory, checking system paths.\n");
+ sharedLib = ctypes.open(ctypes.libraryName("nss3"));
+ }
+
+ NSS.types = new Object();
+
+ NSS.types.CERTDistNames = ctypes.StructType("CERTDistNames");
+
+ NSS.types.SECItem = ctypes.StructType("SECItem",
+ [{'type' : ctypes.int},
+ {'data' : ctypes.unsigned_char.ptr},
+ {'len' : ctypes.uint32_t}]);
+
+ NSS.types.PLArenaPool = ctypes.StructType("PLArenaPool");
+
+ NSS.types.CERTCertificateList = ctypes.StructType("CERTCertificateList",
+ [{'certs' : NSS.types.SECItem.ptr},
+ {'len' : ctypes.int},
+ {'arena' : NSS.types.PLArenaPool.ptr}]),
+
+ NSS.types.CERTAVA = ctypes.StructType("CERTAVA",
+ [{'type' : NSS.types.SECItem},
+ {'value' : NSS.types.SECItem}]);
+
+ NSS.types.CERTRDN = ctypes.StructType("CERTRDN",
+ [{'avas' : NSS.types.CERTAVA.ptr.ptr}]);
+
+ NSS.types.SECAlgorithmID = ctypes.StructType("SECAlgorithmID",
+ [{'algorithm' : NSS.types.SECItem},
+ {'parameters' : NSS.types.SECItem}]);
+
+ NSS.types.CERTSignedData = ctypes.StructType("CERTSignedData",
+ [{'data' : NSS.types.SECItem},
+ {'signatureAlgorithm' : NSS.types.SECAlgorithmID},
+ {'signature' : NSS.types.SECItem}]);
+
+ NSS.types.CERTOKDomainName = ctypes.StructType("CERTOKDomainName");
+
+ NSS.types.NSSCertificateStr = ctypes.StructType("NSSCertificateStr");
+
+ NSS.types.CERTAuthKeyID = ctypes.StructType("CERTAuthKeyID");
+
+ NSS.types.CERTName = ctypes.StructType("CERTName",
+ [{'arena' : ctypes.voidptr_t},
+ {'rdns' : NSS.types.CERTRDN.ptr.ptr}]);
+
+ NSS.types.CERTValidity = ctypes.StructType("CERTValidity",
+ [{'arena' : ctypes.voidptr_t},
+ {'notBefore' : NSS.types.SECItem},
+ {'notAfter' : NSS.types.SECItem}]);
+
+ NSS.types.CERTCertExtension = ctypes.StructType("CERTCertExtension",
+ [{'id' : NSS.types.SECItem},
+ {'critical' : NSS.types.SECItem},
+ {'value' : NSS.types.SECItem}]);
+
+ NSS.types.CERTCertDBHandle = ctypes.StructType("CERTCertDBHandle");
+
+ NSS.types.PK11SlotInfo = ctypes.StructType("PK11SlotInfo");
+
+ NSS.types.PK11SlotListElement = ctypes.StructType("PK11SlotListElement",
+ [{'next' : ctypes.StructType("PK11SlotListElement").ptr},
+ {'prev' : ctypes.StructType("PK11SlotListElement").ptr},
+ {'slot' : NSS.types.PK11SlotInfo.ptr},
+ {'refCount' : ctypes.int}]),
+
+ NSS.types.PK11SlotList = ctypes.StructType("PK11SlotList",
+ [{'head' : NSS.types.PK11SlotListElement.ptr},
+ {'tail' : NSS.types.PK11SlotListElement.ptr},
+ {'lock' : ctypes.StructType("PZLock").ptr}]),
+
+ NSS.types.SECKEYPrivateKey = ctypes.StructType("SECKEYPrivateKey",
+ [{'arena' : NSS.types.PLArenaPool.ptr},
+ {'keyType' : ctypes.int},
+ {'pkcs11Slot' : NSS.types.PK11SlotInfo.ptr},
+ {'pkcs11ID' : ctypes.unsigned_long},
+ {'pkcs11IsTemp' : ctypes.int},
+ {'wincx' : ctypes.voidptr_t},
+ {'staticflags' : ctypes.int32_t}]);
+
+ NSS.types.SECKEYPublicKey = ctypes.StructType("SECKEYPublicKey");
+
+ NSS.types.CERTSubjectPublicKeyInfo = ctypes.StructType("CERTSubjectPublicKeyInfo",
+ [{'arena' : NSS.types.PLArenaPool.ptr},
+ {'algorithm' : NSS.types.SECAlgorithmID},
+ {'subjectPublicKey' : NSS.types.SECItem}]);
+
+ NSS.types.CERTCertificateRequest = ctypes.StructType("CERTCertificateRequest");
+
+ NSS.types.SEC_ASN1Template = ctypes.StructType("SEC_ASN1Template",
+ [{'kind' : ctypes.unsigned_long},
+ {'offset' : ctypes.unsigned_long},
+ {'sub' : ctypes.voidptr_t},
+ {'size' : ctypes.unsigned_int}]);
+
+ NSS.types.PK11RSAGenParams = ctypes.StructType("PK11RSAGenParams",
+ [{'keySizeInBits' : ctypes.int},
+ {'pe' : ctypes.unsigned_long}]);
+
+ NSS.types.CERTCertTrust = ctypes.StructType("CERTCertTrust",
+ [{'sslFlags' : ctypes.uint32_t},
+ {'emailFlags' : ctypes.uint32_t},
+ {'objectSigningFlags' : ctypes.uint32_t}]);
+
+ NSS.types.CERTSubjectList = ctypes.StructType("CERTSubjectList");
+
+ NSS.types.CERTGeneralName = ctypes.StructType("CERTGeneralName");
+
+ NSS.types.CERTCertificate = ctypes.StructType("CERTCertificate",
+ [{'arena' : NSS.types.PLArenaPool.ptr},
+ {'subjectName' : ctypes.char.ptr},
+ {'issuerName' : ctypes.char.ptr},
+ {'signatureWrap' : NSS.types.CERTSignedData},
+ {'derCert' : NSS.types.SECItem},
+ {'derIssuer' : NSS.types.SECItem},
+ {'derSubject' : NSS.types.SECItem},
+ {'derPublicKey' : NSS.types.SECItem},
+ {'certKey' : NSS.types.SECItem},
+ {'version' : NSS.types.SECItem},
+ {'serialNumber' : NSS.types.SECItem},
+ {'signature' : NSS.types.SECAlgorithmID},
+ {'issuer' : NSS.types.CERTName},
+ {'validity' : NSS.types.CERTValidity},
+ {'subject' : NSS.types.CERTName},
+ {'subjectPublicKeyInfo' : NSS.types.CERTSubjectPublicKeyInfo},
+ {'issuerID' : NSS.types.SECItem},
+ {'subjectID' : NSS.types.SECItem},
+ {'extensions' : NSS.types.CERTCertExtension.ptr.ptr},
+ {'emailAddr' : ctypes.char.ptr},
+ {'dbhandle' : NSS.types.CERTCertDBHandle.ptr},
+ {'subjectKeyID' : NSS.types.SECItem},
+ {'keyIDGenerated' : ctypes.int},
+ {'keyUsage' : ctypes.unsigned_int},
+ {'rawKeyUsage' : ctypes.unsigned_int},
+ {'keyUsagePresent' : ctypes.int},
+ {'nsCertType' : ctypes.uint32_t},
+ {'keepSession' : ctypes.int},
+ {'timeOK' : ctypes.int},
+ {'domainOK' : NSS.types.CERTOKDomainName.ptr},
+ {'isperm' : ctypes.int},
+ {'istemp' : ctypes.int},
+ {'nickname' : ctypes.char.ptr},
+ {'dbnickname' : ctypes.char.ptr},
+ {'nssCertificate' : NSS.types.NSSCertificateStr.ptr},
+ {'trust' : NSS.types.CERTCertTrust.ptr},
+ {'referenceCount' : ctypes.int},
+ {'subjectList' : NSS.types.CERTSubjectList.ptr},
+ {'authKeyID' : NSS.types.CERTAuthKeyID.ptr},
+ {'isRoot' : ctypes.int},
+ {'options' : ctypes.voidptr_t},
+ {'series' : ctypes.int},
+ {'slot' : NSS.types.PK11SlotInfo.ptr},
+ {'pkcs11ID' : ctypes.unsigned_long},
+ {'ownSlot' : ctypes.int}]);
+
+ NSS.types.CERTBasicConstraints = ctypes.StructType("CERTBasicConstraints",
+ [{'isCA': ctypes.int},
+ {'pathLenConstraint' : ctypes.int}]);
+
+
+ NSS.lib = {
+ SEC_OID_MD5 : 3,
+ SEC_OID_SHA1 : 4,
+ SEC_OID_X509_KEY_USAGE : 81,
+ SEC_OID_NS_CERT_EXT_COMMENT : 75,
+ CKM_RSA_PKCS_KEY_PAIR_GEN : 0,
+ buffer : ctypes.ArrayType(ctypes.char),
+ ubuffer : ctypes.ArrayType(ctypes.unsigned_char),
+
+ // CERT_CertificateTemplate : sharedLib.declare("CERT_CertificateTemplate",
+ // NSS.types.SEC_ASN1Template),
+
+ NSS_Get_CERT_CertificateTemplate : sharedLib.declare("NSS_Get_CERT_CertificateTemplate",
+ ctypes.default_abi,
+ NSS.types.SEC_ASN1Template.ptr),
+
+ PK11_HashBuf : sharedLib.declare("PK11_HashBuf",
+ ctypes.default_abi,
+ ctypes.int,
+ ctypes.int,
+ ctypes.unsigned_char.ptr,
+ ctypes.unsigned_char.ptr,
+ ctypes.int32_t),
+
+ CERT_GetDefaultCertDB : sharedLib.declare("CERT_GetDefaultCertDB",
+ ctypes.default_abi,
+ NSS.types.CERTCertDBHandle.ptr),
+
+ CERT_ChangeCertTrust : sharedLib.declare("CERT_ChangeCertTrust",
+ ctypes.default_abi,
+ ctypes.int32_t,
+ NSS.types.CERTCertDBHandle.ptr,
+ NSS.types.CERTCertificate.ptr,
+ NSS.types.CERTCertTrust.ptr),
+
+ CERT_FindCertByNickname : sharedLib.declare("CERT_FindCertByNickname",
+ ctypes.default_abi,
+ NSS.types.CERTCertificate.ptr,
+ NSS.types.CERTCertDBHandle.ptr,
+ ctypes.char.ptr),
+
+ CERT_FindCertByDERCert : sharedLib.declare("CERT_FindCertByDERCert",
+ ctypes.default_abi,
+ NSS.types.CERTCertificate.ptr,
+ NSS.types.CERTCertDBHandle.ptr,
+ NSS.types.SECItem.ptr),
+
+ CERT_VerifyCertNow : sharedLib.declare("CERT_VerifyCertNow",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.CERTCertDBHandle.ptr,
+ NSS.types.CERTCertificate.ptr,
+ ctypes.int,
+ ctypes.int,
+ ctypes.voidptr_t),
+
+ CERT_CertChainFromCert : sharedLib.declare("CERT_CertChainFromCert",
+ ctypes.default_abi,
+ NSS.types.CERTCertificateList.ptr,
+ NSS.types.CERTCertificate.ptr,
+ ctypes.int,
+ ctypes.int),
+
+ PK11_FindKeyByAnyCert : sharedLib.declare("PK11_FindKeyByAnyCert",
+ ctypes.default_abi,
+ NSS.types.SECKEYPrivateKey.ptr,
+ NSS.types.CERTCertificate.ptr,
+ ctypes.voidptr_t),
+
+ PK11_GetInternalKeySlot : sharedLib.declare("PK11_GetInternalKeySlot",
+ ctypes.default_abi,
+ NSS.types.PK11SlotInfo.ptr),
+
+ PK11_GetAllSlotsForCert : sharedLib.declare("PK11_GetAllSlotsForCert",
+ ctypes.default_abi,
+ NSS.types.PK11SlotList.ptr,
+ NSS.types.CERTCertificate.ptr,
+ ctypes.voidptr_t),
+
+ PK11_GetTokenName : sharedLib.declare("PK11_GetTokenName",
+ ctypes.default_abi,
+ ctypes.char.ptr,
+ NSS.types.PK11SlotInfo.ptr),
+
+ PK11_GenerateKeyPair : sharedLib.declare("PK11_GenerateKeyPair",
+ ctypes.default_abi,
+ NSS.types.SECKEYPrivateKey.ptr,
+ NSS.types.PK11SlotInfo.ptr,
+ ctypes.int,
+ NSS.types.PK11RSAGenParams.ptr,
+ NSS.types.SECKEYPublicKey.ptr.ptr,
+ ctypes.int,
+ ctypes.int,
+ ctypes.voidptr_t),
+
+ PK11_SetPrivateKeyNickname : sharedLib.declare("PK11_SetPrivateKeyNickname",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.SECKEYPrivateKey.ptr,
+ ctypes.char.ptr),
+
+ SEC_ASN1EncodeItem : sharedLib.declare("SEC_ASN1EncodeItem",
+ ctypes.default_abi,
+ NSS.types.SECItem.ptr,
+ NSS.types.PLArenaPool.ptr,
+ NSS.types.SECItem.ptr,
+ ctypes.voidptr_t,
+ NSS.types.SEC_ASN1Template.ptr),
+
+ SEC_DerSignData : sharedLib.declare("SEC_DerSignData",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.PLArenaPool.ptr,
+ NSS.types.SECItem.ptr,
+ ctypes.unsigned_char.ptr,
+ ctypes.int,
+ NSS.types.SECKEYPrivateKey.ptr,
+ ctypes.int),
+
+ SEC_GetSignatureAlgorithmOidTag : sharedLib.declare("SEC_GetSignatureAlgorithmOidTag",
+ ctypes.default_abi,
+ ctypes.int,
+ ctypes.int,
+ ctypes.int),
+
+ SECOID_SetAlgorithmID : sharedLib.declare("SECOID_SetAlgorithmID",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.PLArenaPool.ptr,
+ NSS.types.SECAlgorithmID.ptr,
+ ctypes.int,
+ NSS.types.SECItem.ptr),
+
+
+ CERT_Hexify : sharedLib.declare("CERT_Hexify",
+ ctypes.default_abi,
+ ctypes.char.ptr,
+ NSS.types.SECItem.ptr,
+ ctypes.int),
+
+ CERT_AsciiToName : sharedLib.declare("CERT_AsciiToName",
+ ctypes.default_abi,
+ NSS.types.CERTName.ptr,
+ ctypes.char.ptr),
+
+ SECKEY_CreateSubjectPublicKeyInfo : sharedLib.declare("SECKEY_CreateSubjectPublicKeyInfo",
+ ctypes.default_abi,
+ NSS.types.CERTSubjectPublicKeyInfo.ptr,
+ NSS.types.SECKEYPublicKey.ptr),
+
+ CERT_CreateCertificateRequest : sharedLib.declare("CERT_CreateCertificateRequest",
+ ctypes.default_abi,
+ NSS.types.CERTCertificateRequest.ptr,
+ NSS.types.CERTName.ptr,
+ NSS.types.CERTSubjectPublicKeyInfo.ptr,
+ NSS.types.SECItem.ptr.ptr),
+
+ CERT_CreateCertificate : sharedLib.declare("CERT_CreateCertificate",
+ ctypes.default_abi,
+ NSS.types.CERTCertificate.ptr,
+ ctypes.uint32_t,
+ NSS.types.CERTName.ptr,
+ NSS.types.CERTValidity.ptr,
+ NSS.types.CERTCertificateRequest.ptr),
+
+ CERT_DestroyCertificate : sharedLib.declare("CERT_DestroyCertificate",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.CERTCertificate.ptr),
+
+ CERT_DestroyCertificateList : sharedLib.declare("CERT_DestroyCertificateList",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.CERTCertificateList.ptr),
+
+ CERT_NewTempCertificate : sharedLib.declare("CERT_NewTempCertificate",
+ ctypes.default_abi,
+ NSS.types.CERTCertificate.ptr,
+ NSS.types.CERTCertDBHandle.ptr,
+ NSS.types.SECItem.ptr,
+ ctypes.char.ptr,
+ ctypes.int,
+ ctypes.int),
+
+ CERT_CreateValidity : sharedLib.declare("CERT_CreateValidity",
+ ctypes.default_abi,
+ NSS.types.CERTValidity.ptr,
+ ctypes.int64_t,
+ ctypes.int64_t),
+
+ CERT_CertListFromCert : sharedLib.declare("CERT_CertListFromCert",
+ ctypes.default_abi,
+ NSS.types.CERTCertificateList.ptr,
+ NSS.types.CERTCertificate.ptr),
+
+ CERT_StartCertExtensions : sharedLib.declare("CERT_StartCertExtensions",
+ ctypes.default_abi,
+ ctypes.voidptr_t,
+ NSS.types.CERTCertificate.ptr),
+
+ CERT_AddExtension : sharedLib.declare("CERT_AddExtension",
+ ctypes.default_abi,
+ ctypes.int,
+ ctypes.voidptr_t,
+ ctypes.int,
+ NSS.types.SECItem.ptr,
+ ctypes.int,
+ ctypes.int),
+
+
+ CERT_EncodeBasicConstraintValue : sharedLib.declare("CERT_EncodeBasicConstraintValue",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.PLArenaPool.ptr,
+ NSS.types.CERTBasicConstraints.ptr,
+ NSS.types.SECItem.ptr),
+
+ CERT_EncodeAndAddBitStrExtension : sharedLib.declare("CERT_EncodeAndAddBitStrExtension",
+ ctypes.default_abi,
+ ctypes.int,
+ ctypes.voidptr_t,
+ ctypes.int,
+ NSS.types.SECItem.ptr,
+ ctypes.int),
+
+ CERT_EncodeAltNameExtension : sharedLib.declare("CERT_EncodeAltNameExtension",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.PLArenaPool.ptr,
+ NSS.types.CERTGeneralName.ptr,
+ NSS.types.SECItem.ptr),
+
+ CERT_FinishExtensions : sharedLib.declare("CERT_FinishExtensions",
+ ctypes.default_abi,
+ ctypes.int,
+ ctypes.voidptr_t),
+
+ CERT_ImportCerts : sharedLib.declare("CERT_ImportCerts",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.CERTCertDBHandle.ptr,
+ ctypes.int,
+ ctypes.int,
+ NSS.types.SECItem.ptr.ptr,
+ NSS.types.CERTCertificate.ptr.ptr.ptr,
+ ctypes.int,
+ ctypes.int,
+ ctypes.char.ptr),
+
+ PORT_NewArena : sharedLib.declare("PORT_NewArena",
+ ctypes.default_abi,
+ NSS.types.PLArenaPool.ptr,
+ ctypes.uint32_t),
+
+ PORT_ArenaZAlloc : sharedLib.declare("PORT_ArenaZAlloc",
+ ctypes.default_abi,
+ ctypes.voidptr_t,
+ NSS.types.PLArenaPool.ptr,
+ ctypes.int),
+
+ PORT_FreeArena : sharedLib.declare("PORT_FreeArena",
+ ctypes.default_abi,
+ ctypes.void_t,
+ NSS.types.PLArenaPool.ptr,
+ ctypes.int),
+
+ CERT_GetCommonName : sharedLib.declare("CERT_GetCommonName",
+ ctypes.default_abi,
+ ctypes.char.ptr,
+ NSS.types.CERTName.ptr),
+
+ CERT_GetOrgUnitName : sharedLib.declare("CERT_GetOrgUnitName",
+ ctypes.default_abi,
+ ctypes.char.ptr,
+ NSS.types.CERTName.ptr),
+
+ CERT_GetCertificateNames : sharedLib.declare("CERT_GetCertificateNames",
+ ctypes.default_abi,
+ NSS.types.CERTGeneralName.ptr,
+ NSS.types.CERTCertificate.ptr,
+ NSS.types.PLArenaPool.ptr),
+
+ CERT_DecodeDERCertificate : sharedLib.declare("__CERT_DecodeDERCertificate",
+ ctypes.default_abi,
+ NSS.types.CERTCertificate.ptr,
+ NSS.types.SECItem.ptr,
+ ctypes.int,
+ ctypes.char.ptr),
+
+ CERT_FindCertExtension : sharedLib.declare("CERT_FindCertExtension",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.CERTCertificate.ptr,
+ ctypes.int,
+ NSS.types.SECItem.ptr),
+ };
+
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/Root-CAs.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/Root-CAs.js
new file mode 100644
index 0000000..49777fa
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/Root-CAs.js
@@ -0,0 +1,348 @@
+// These are concatenated md5 and sha1 fingerprints for the Firefox and
+// Microsoft root CAs as of Aug 2010
+
+root_ca_hashes = {
+ '00531D1D7201D423C820D00B6088C5D143DDB1FFF3B49B73831407F6BC8B975023D07C50' : true,
+ '015A99C3D64FA94B3C3BB1A3AB274CBFFC219A76112F76C1C508833C9A2FA2BA84AC087A' : true,
+ '019408DE857F8D806CE602CA89522848750251B2C632536F9D917279543C137CD721C6E0' : true,
+ '0208EE8CAAB8387A6824DCB4E26A52337E206939CC5FA883635F64C750EBF5FDA9AEE653' : true,
+ '0226C3015E08303743A9D07DCF37E6BF323C118E1BF7B8B65254E2E2100DD6029037F096' : true,
+ '034287D7C1167D18AFA4703CB8312C3E4EF2E6670AC9B5091FE06BE0E5483EAAD6BA32D9' : true,
+ '03DC08EEC4703FFA20E5E179E81AE7C59ED18028FB1E8A9701480A7890A59ACD73DFF871' : true,
+ '044BFDC96CDA2A32857C598461468A64BEB5A995746B9EDF738B56E6DF437A77BE106B81' : true,
+ '0468E9247E41CED76C441630703DDDB9AB16DD144ECDC0FC4BAAB62ECF0408896FDE52B7' : true,
+ '068690F2195471FDDD3DE6EEA161CAFF7030AABF8432A800666CCCC42A887E42B7553E2B' : true,
+ '069F6979166690021B8C8CA2C3076F3A627F8D7827656399D27D7F9044C9FEB3F33EFA9A' : true,
+ '06F0171EB1E961ED7A363CA594A1374AFAAA27B8CAF5FDF5CDA98AC3378572E04CE8F2E0' : true,
+ '06F9EBECCC569D88BA90F5BAB01AE00216D424FE9610E17519AF232BB68774E24144BE6E' : true,
+ '076192047EA6B9CD5E6B007AE3BF1D0434D499426F9FC2BB27B075BAB682AAE5EFFCBA74' : true,
+ '087C581F522B44B43B79CD01F8C5C3C995E6ADF8D77146024DD56A21B2E73FCDF23B35FF' : true,
+ '0B092C1CD721866F94376FE6A7F3224D0409565B77DA582E6495AC0060A72354E64B0192' : true,
+ '0C412F135BA054F596662D7ECD0E03F4DA79C1711150C23439AA2B0B0C62FD55B2F9F580' : true,
+ '0C5ADD5AAE29F7A77679FA4151FEF035B865130BEDCA38D27F69929420770BED86EFBC10' : true,
+ '0C7FDD6AF42AB9C89BBD207EA9DB5C3760D68974B5C2659E8A0FC1887C88D246691B182C' : true,
+ '0CF89E17FCD403BDE68D9B3C0587FE8433A335C23CE8034B04E13DE5C48E791AEB8C3204' : true,
+ '0E40A76CDE035D8FD10FE4D18DF96CA9A9E9780814375888F20519B06D2B0D2B6016907D' : true,
+ '0EFA4BF7D760CD65F7A7068857986239D29F6C98BEFC6D986521543EE8BE56CEBC288CF3' : true,
+ '0FA01300C3558AB7D37E2D04739EDE3C8B1A1106B8E26B232980FD652E6181376441FD11' : true,
+ '100EADF35C841D8E035F2DC93937F552742CDF1594049CBF17A2046CC639BB3888E02E33' : true,
+ '10FC635DF6263E0DF325BE5F79CD6767742C3192E607E424EB4549542BE1BBC53E6174E2' : true,
+ '119279403CB18340E5AB664A679280DFA9628F4B98A91B4835BAD2C1463286BB66646A8C' : true,
+ '14F108AD9DFA64E289E71CCFA8AD7D5E3921C115C15D0ECA5CCB5BC4F07D21D8050B566A' : true,
+ '155EF5117AA2C1150E927E66FE3B84C3B38FECEC0B148AA686C3D00F01ECC8848E8085EB' : true,
+ '15ACA5C2922D79BCE87FCB67ED02CF36E7B4F69D61EC9069DB7E90A7401A3CF47D4FE8EE' : true,
+ '15B298A354704048703A375582C45AFA0048F8D37B153F6EA2798C323EF4F318A5624A9E' : true,
+ '15EE9F5AA08528DF6BDD34A3A056D8307F8A77836BDC6D068F8B0737FCC5725413068CA4' : true,
+ '160A1613C17FF01D887EE3D9E71261CCF88015D3F98479E1DA553D24FD42BA3F43886AEF' : true,
+ '173574AF7B611CEBF4F93CE2EE40F9A2925A8F8D2C6D04E0665F596AFF22D863E8256F3F' : true,
+ '1802B00127036A191B323B83DE9AA985D6BF7994F42BE5FA29DA0BD7587B591F47A44F22' : true,
+ '1898C0D6E93AFCF9B0F50CF74B014417FAB7EE36972662FB2DB02AF6BF03FDE87C4B2F9B' : true,
+ '18AE695D15CAB917673267D597B260C04BA7B9DDD68788E12FF852E1A024204BF286A8F6' : true,
+ '1AD00CB9A6E68A3B6E95860C5B8CD8195A4D0E8B5FDCFDF64E7299A36C060DB222CA78E4' : true,
+ '1B2E00CA2606903DADFE6F1568D36BB367650DF17E8E7E5B8240A4F4564BCFE23D69C6F0' : true,
+ '1BD75F76734CC0DC98CA442BCC0F78DD31E2C52CE1089BEFFDDADB26DD7C782EBC4037BD' : true,
+ '1C4BE2C62DB9AC3114F4400769CB1F4011C5B5F75552B011669C2E9717DE6D9BFF5FA810' : true,
+ '1D3554048578B03F42424DBF20730A3F02FAF3E291435468607857694DF5E45B68851868' : true,
+ '1D6496AF2D821A300BA0620D76BC53AA7FBB6ACD7E0AB438DAAF6FD50210D007C6C0829C' : true,
+ '1E240EA0F876D785A3F5F8A1493D2EBAFD1ED1E2021B0B9F73E8EB75CE23436BBCC746EB' : true,
+ '1E42950233926BB95FC07FDAD6B24BFCCCAB0EA04C2301D6697BDD379FCD12EB24E3949D' : true,
+ '1E74C3863C0C35C53EC27FEF3CAA3CD9209900B63D955728140CD13622D8C687A4EB0085' : true,
+ '200B4A7A88A7A942868A5F74567B880593E6AB220303B52328DCDA569EBAE4D1D1CCFB65' : true,
+ '206BD68B4A8F48ABE488090DE5651A500CFD83DBAE44B9A0C8F676F3B570650B94B69DBF' : true,
+ '2124A681C1D8F219AF4998E39DFE0BF46A174570A916FBE84453EED3D070A1D8DA442829' : true,
+ '21BC82AB49C4133B4BB22B5C6B909C198BAF4C9B1DF02A92F7DA128EB91BACF498604B6F' : true,
+ '21D84C822B990933A2EB14248D8E5FE84054DA6F1C3F4074ACED0FECCDDB79D153FB901D' : true,
+ '21EFB85040393F756F27FEE3EA5870EBA59C9B10EC7357515ABB660C4D94F73B9E6E9272' : true,
+ '222DA601EA7C0AF7F06C56433F7776D3FEB8C432DCF9769ACEAE3DD8908FFD288665647D' : true,
+ '224D8F8AFCF735C2BB5734907B8B22163E2BF7F2031B96F38CE6C4D8A85D3E2D58476A0F' : true,
+ '246DABD2F2EA4A66AE5BBCAE50AD6E56F9DD19266B2043F1FE4B3DCB0190AFF11F31A69D' : true,
+ '2477D9A891D13BFA882DC2FFF8CD3393D8C5388AB7301B1B6ED47AE645253A6F9F1A2761' : true,
+ '252AC6C5896839F9557202165EA39ED23C71D70E35A5DAA8B2E3812DC3677417F5990DF3' : true,
+ '255BA669B87BF8780DC18FA6EAE47063FA0882595F9CA6A11ECCBEAF65C764C0CCC311D0' : true,
+ '257ABA832EB6A20BDAFEF5020F08D7AD81968B3AEF1CDC70F5FA3269C292A3635BD123D3' : true,
+ '259DCF5EB3259D95B93F00865F47943D43F9B110D5BAFD48225231B0D0082B372FEF9A54' : true,
+ '266D2C1998B6706838505419EC9034600B77BEBBCB7AA24705DECC0FBD6A02FC7ABD9B52' : true,
+ '27DE36FE72B70003009DF4F01E6C0424DE3F40BD5093D39B6C60F6DABC076201008976C9' : true,
+ '27EC3947CDDA5AAFE29A016521A94CBB4D2378EC919539B5007F758F033B211EC54D8BCF' : true,
+ '2A5D003739469475397B11A6F29341E13F85F2BB4A62B0B58BE1614ABB0D4631B4BEF8BA' : true,
+ '2A954ECA79B2874573D92D90BAF99FB6A43489159A520F0D93D032CCAF37E7FE20A8B419' : true,
+ '2B508718392D3BFFC3917F2D7DC08A97B19DD096DCD4E3E0FD676885505A672C438D4E9C' : true,
+ '2B7020568682A018C807531228702172F17F6FB631DC99E3A3C87FFE1CF1811088D96033' : true,
+ '2C20269DCB1A4A0085B5B75AAEC201378C96BAEBDD2B070748EE303266A0F3986E7CAE58' : true,
+ '2C6F17A39562012065D2076EFCB83F6DB1EAC3E5B82476E9D50B1EC67D2CC11E12E0B491' : true,
+ '2C8C175EB154AB9317B5365ADBD1C6F2A073E5C5BD43610D864C21130A855857CC9CEA46' : true,
+ '2C8F9F661D1890B147269D8E86828CA96252DC40F71143A22FDE9EF7348E064251B18118' : true,
+ '2CC2B0D5D622C52E901EF4633F0FBB324A058FDFD761DB21B0C2EE48579BE27F42A4DA1C' : true,
+ '2DBBE525D3D165823AB70EFAE6EBE2E1B3EAC44776C9C81CEAF29D95B6CCA0081B67EC9D' : true,
+ '2E03FDC5F5D72B9464C1BE8931F1169B96995C7711E8E52DF9E34BECEC67D3CBF1B6C4D2' : true,
+ '30C908DDD73E63A4092814C74EB97E2CCFE4313DBA05B8A7C30063995A9EB7C247AD8FD5' : true,
+ '30C9E71E6BE614EB65B216692031674D3BC0380B33C3F6A60C86152293D9DFF54B81C004' : true,
+ '31853C62949763B9AAFD894EAF6FE0CF1F4914F7D874951DDDAE02C0BEFD3A2D82755185' : true,
+ '324A4BBBC863699BBE749AC6DD1D4624AD7E1C28B064EF8F6003402014C3D0E3370EB58A' : true,
+ '3327D16CFC9185FC8C7E98FA854EF305E70715F6F728365B5190E271DEE4C65EBEEACAF3' : true,
+ '33B784F55F27D76827DE14DE122AED6F0747220199CE74B97CB03D79B264A2C855E933FF' : true,
+ '343339FC6D033A8FA25385443270DEC45E5A168867BFFF00987D0B1DC2AB466C4264F956' : true,
+ '34FCB8D036DB9E14B3C2F2DB8FE494C7379A197B418545350CA60369F33C2EAF474F2079' : true,
+ '354895364A545A72968EE064CCEF2C8CC90D1BEA883DA7D117BE3B79F4210E1A5894A72D' : true,
+ '370971C4AFEB7501AE636C3016BFD1E5A399F76F0CBF4C9DA55E4AC24E8960984B2905B6' : true,
+ '3741491B18569A26F5ADC266FB40A54C4313BB96F1D5869BC14E6A92F6CFF63469878237' : true,
+ '3785445332451F20F0F395E125C4434EF48B11BFDEABBE94542071E641DE6BBE882B40B9' : true,
+ '37A56ED4B1258497B7FD56157AF9A200B435D4E1119D1C6690A749EBB394BD637BA782B7' : true,
+ '3916AAB96A41E11469DF9E6C3B72DCB6879F4BEE05DF98583BE360D633E70D3FFE9871AF' : true,
+ '3AB2DE229A209349F9EDC8D28AE7680D36863563FD5128C7BEA6F005CFE9B43668086CCE' : true,
+ '3AE550B039BEC7463633A1FE823E8D943CBB5DE0FCD6397C0588E56697BD462ABDF95C76' : true,
+ '3B0AE4BB416A84B39D2C575E6542BE478E1032E9245944F84791983EC9E829CB1059B4D3' : true,
+ '3C4C25CC0A19CAEE6AEB55160086725F23E833233E7D0CC92B7C4279AC19C2F474D604CA' : true,
+ '3D4129CB1EAA1174CD5DB062AFB0435BDDE1D2A901802E1D875E84B3807E4BB1FD994134' : true,
+ '3E455215095192E1B75D379FB187298AB1BC968BD4F49D622AA89A81F2150152A41D829C' : true,
+ '3E80175BADD77C104BF941B0CF1642B000EA522C8A9C06AA3ECCE0B4FA6CDC21D92E8099' : true,
+ '3F459639E25087F7BBFE980C3C2098E62AC8D58B57CEBF2F49AFF2FC768F511462907A41' : true,
+ '400125068D21436A0E43009CE743F3D5F9CD0E2CDA7624C18FBDF0F0ABB645B8F7FED57A' : true,
+ '410352DC0FF7501B16F0028EBA6F45C5DAC9024F54D8F6DF94935FB1732638CA6AD77C13' : true,
+ '41B807F7A8D109EEB49A8E704DFC1B787A74410FB0CD5C972A364B71BF031D88A6510E9E' : true,
+ '4265CABE019A9A4CA98C4149CDC0D57F293621028B20ED02F566C532D1D6ED909F45002F' : true,
+ '42769768CFA6B43824AAA11BF267DECA4178AB4CBFCE7B4102ACDAC4933E6FF50DCF715C' : true,
+ '4281A0E21CE35510DE558942659622E6E0B4322EB2F6A568B654538448184A5036874384' : true,
+ '429BD669C6D445AD2E81511D355A89624F555CE20DCD3364E0DC7C41EFDD40F50356C122' : true,
+ '45E1A572C5A93664409EF5E45884678C6B2F34AD8958BE62FDB06B5CCEBB9DD94F4E39F3' : true,
+ '45F750114EC5ADBD53688663EC7B6AE1C09AB0C8AD7114714ED5E21A5A276ADCD5E7EFCB' : true,
+ '468C210EAB92214659DBA6DB0061DE265A5A4DAF7861267C4B1F1E67586BAE6ED4FEB93F' : true,
+ '48D11E627801C26E4369A42CEE130AB564902AD7277AF3E32CD8CC1DC79DE1FD7F8069EA' : true,
+ '4963AE27F4D5953DD8DB2486B89C0753D3C063F219ED073E34AD5D750B327629FFD59AF2' : true,
+ '497904B0EB8719AC47B0BC11519B74D0D1EB23A46D17D68FD92564C2F1F1601764D8E349' : true,
+ '49EFA6A1F0DE8EA76AEE5B7D1E5FC4463E42A18706BD0C9CCF594750D2E4D6AB0048FDC4' : true,
+ '4B1C568CA0E8C79E1EF5EE32939965FE4C95A9902ABE0777CED18D6ACCC3372D2748381E' : true,
+ '4B6771BE33B90DB64B3A400187F08B1F7AC5FFF8DCBC5583176877073BF751735E9BD358' : true,
+ '4B798DD41D0392AA51EE04E5906F474954F9C163759F19045121A319F64C2D0555B7E073' : true,
+ '4BE2C99196650CF40E5A9392A00AFEB28CF427FD790C3AD166068DE81E57EFBB932272D4' : true,
+ '4C5641E50DBB2BE8CAA3ED1808AD43390483ED3399AC3608058722EDBC5E4600E3BEF9D7' : true,
+ '4D56677ECCE6457259B74F511172E169C0DB578157E9EE82B5917DF0DD6D82EE9039C4E2' : true,
+ '4FEBF1F070C280635D589FDA123CA9C4E392512F0ACFF505DFF6DE067F7537E165EA574B' : true,
+ '50193E2FE8B6F4055449F3AEC98B3E1947AFB915CDA26D82467B97FA42914468726138DD' : true,
+ '5186E81FBCB1C371B51810DB5FDCF62078E9DD0650624DB9CB36B50767F209B843BE15B3' : true,
+ '556EBEF54C1D7C0360C43418BC9649C1245C97DF7514E7CF2DF8BE72AE957B9E04741E85' : true,
+ '565FAA80611217F66721E62B6D61568E8025EFF46E70C8D472246584FE403B8A8D6ADBF5' : true,
+ '58EB470764D62CBAE29B96552B9700B56A6F2A8B6E2615088DF59CD24C402418AE42A3F1' : true,
+ '59736628512B98B410FF7D06FA22D6C8A0F8DB3F0BF417693B282EB74A6AD86DF9D448A3' : true,
+ '5A11B922850289E1C3F22CE14EC101844B421F7515F6AE8A6ECEF97F6982A400A4D9224E' : true,
+ '5B6F532CBB8188FA6C042C325DA56B967CA04FD8064C1CAA32A37AA94375038E8DF8DDC0' : true,
+ '5B9EFD3B6035EA688E52FE1319144AA36B81446A5CDDF474A0F800FFBE69FD0DB6287516' : true,
+ '5C48DCF74272EC56946D1CCC713580756631BF9EF74F9EB6C9D5A60CBA6ABED1F7BDEF7B' : true,
+ '5E397BDDF8BAEC82E9AC62BA0C54002BCA3AFBCF1240364B44B216208880483919937CF7' : true,
+ '5E809E845A0E650B1702F355182A3ED7786A74AC76AB147F9C6A3050BA9EA87EFE9ACE3C' : true,
+ '5F944A7322B8F7D131EC5939F78EFE6E9FC796E8F8524F863AE1496D381242105F1B78F5' : true,
+ '60847C5ACEDB0CD4CBA7E9FE02C6A9C0101DFA3FD50BCBBB9BB5600C1955A41AF4733A04' : true,
+ '649CEF2E44FCC68F5207D051738FCB3DDA40188B9189A3EDEEAEDA97FE2F9DF5B7D18A41' : true,
+ '65295911BB8F5166890D47824002C5AFC4674DDC6CE2967FF9C92E072EF8E8A7FBD6A131' : true,
+ '6558AB15AD576C1EA8A7B569ACBFFFEBE5DF743CB601C49B9843DCAB8CE86A81109FE48E' : true,
+ '67AC0D773011DED143AE7B737190BCA9ED8DC8386C4886AEEE079158AAC3BFE658E394B4' : true,
+ '67CB9DC013248A829BB2171ED11BECD4D23209AD23D314232174E40D7F9D62139786633A' : true,
+ '689B17C654E0E0E099551642F75A86D8027268293E5F5D17AAA4B3C3E6361E1F92575EAA' : true,
+ '6960ECBE8C94D76E6F2EC4782F55F08397226AAE4A7A64A59BD16787F27F841C0A001FD0' : true,
+ '6C397DA40E5559B23FD641B11250DE435F3B8CF2F810B37D78B4CEEC1919C37334B9C774' : true,
+ '6CC9A76E47F10CE3533B784C4DC26AC5B72FFF92D2CE43DE0A8D4C548C503726A81E2B93' : true,
+ '6D38C49B22244CA3A8B3A09345E157FA89C32E6B524E4D65388B9ECEDC637134ED4193A3' : true,
+ '70B57C4881953E80DC289BBAEF1EE4854072BA31FEC351438480F62E6CB95508461EAB2F' : true,
+ '711F0E21E7AAEA323A6623D3AB50D66996974CD6B663A7184526B1D648AD815CF51E801A' : true,
+ '71AA6AAF1FA5C0D50E90D40BF6AADFCC55C86F7414AC8BDD6814F4D86AF15F3710E104D0' : true,
+ '71E265FBCD7B0B845BE3BCD76320C598CFF810FB2C4FFC0156BFE1E1FABCB418C68D31C5' : true,
+ '72E44A87E369408077EABCE3F4FFF0E15F43E5B1BFF8788CAC1CC7CA4A9AC6222BCC34C6' : true,
+ '733A747AECBBA396A6C2E4E2C89BC0C3AEC5FB3FC8E1BFC4E54F03075A9AE800B7F7B6FA' : true,
+ '739DD35FC63C95FEC6ED89E58208DD897FB9E2C995C97A939F9E81A07AEA9B4D70463496' : true,
+ '74014A91B108C458CE47CDF0DD11530885A408C09C193E5D51587DCDD61330FD8CDE37BF' : true,
+ '747B820343F0009E6BB3EC47BF85A5934463C531D7CCC1006794612BB656D3BF8257846F' : true,
+ '74A82C81432B35609B78056B58F36582CFF360F524CB20F1FEAD89006F7F586A285B2D5B' : true,
+ '770D19B121FD00429C3E0CA5DD0B028E25019019CFFBD9991CB76825748D945F30939542' : true,
+ '774AF42C9DB027B747B515E4C762F0FCDF646DCB7B0FD3A96AEE88C64E2D676711FF9D5F' : true,
+ '782A02DFDB2E14D5A75F0ADFB68E9C5D4F65566336DB6598581D584A596C87934D5F2AB4' : true,
+ '78A5FB104BE4632ED26BFBF2B6C24B8EEC0C3716EA9EDFADD35DFBD55608E60A05D3CBF3' : true,
+ '79E4A9840D7D3A96D7C04FE2434C892EA8985D3A65E5E5C4B2D7D66D40C6DD2FB19C5436' : true,
+ '7A79544D07923B5BFF41F00EC739A298C060ED44CBD881BD0EF86C0BA287DDCF8167478C' : true,
+ '7BB508999A8C18BF85277D0EAEDAB2AB24BA6D6C8A5B5837A48DB5FAE919EA675C94D217' : true,
+ '7C62FF749D31535E684AD578AA1EBF239F744E9F2B4DBAEC0F312C50B6563B8E2D93C311' : true,
+ '7CA50FF85B9A7D6D30AE545AE342A28A59AF82799186C7B47507CBCF035746EB04DDB716' : true,
+ '7D86908F5BF1F240C0F73D62B5A4A93B72997913EC9B0DAE65D1B6D7B24A76A3AEC2EE16' : true,
+ '7E234E5BA7A5B425E90007741162AED67F8AB0CFD051876A66F3360F47C88D8CD335FC74' : true,
+ '7F667A71D3EB6978209A51149D83DA20BE36A4562FB2EE05DBB3D32323ADF445084ED656' : true,
+ '803ABC22C1E6FB8D9B3B274A321B9A0147BEABC922EAE80E78783462A79F45C254FDE68B' : true,
+ '8135B9FBFB12CA186936EBAE6978A1F1DCBB9EB7194BC47205C111752986835B53CAE4F8' : true,
+ '81D6ED354F1F26D031D040DD8AE5810DE0925E18C7765E22DABD9427529DA6AF4E066428' : true,
+ '8212F789E10B9160A4B6229F9468119268ED18B309CD5291C0D3357C1D1141BF883866B1' : true,
+ '824AD493004D66B6A32CA77B3536CF0B687EC17E0602E3CD3F7DFBD7E28D57A0199A3F44' : true,
+ '8292BA5BEFCD8A6FA63D55F984F6D6B7F9B5B632455F9CBEEC575F80DCE96E2CC7B278B7' : true,
+ '84901D95304956FC4181F045D776C46B439E525F5A6A47C32CEBC45C63ED39317CE5F4DF' : true,
+ '852FF4764CD5426CCB5E7DF717E835BD4EFCED9C6BDD0C985CA3C7D253063C5BE6FC620C' : true,
+ '85CA765A1BD16822DCA22312CAC680345BCDCDCC66F6DCE4441FE37D5CC3134C46F47038' : true,
+ '86386D5E49636C855CDB6DDC94B7D0F7ACED5F6553FD25CE015F1F7A483B6A749F6178C6' : true,
+ '86420509BCA79DEC1DF32E0EBAD81DD01D8259CA2127C3CBC16CD932F62C65298CA88712' : true,
+ '86ACDE2BC56DC3D98C2888D38D16131ECE6A64A309E42FBBD9851C453E6409EAE87D60F1' : true,
+ '86EF8E319D9F8569A2A41A127168BA1B90DECE77F8C825340E62EBD635E1BE20CF7327DD' : true,
+ '8714AB83C4041BF193C750E2D721EBEF30779E9315022E94856A3FF8BCF815B082F9AEFD' : true,
+ '879055F2CE31153C33D927C876E37DE13070F8833E4AA6803E09A646AE3F7D8AE1FD1654' : true,
+ '87CE0B7B2A0E4900E158719B37A893720563B8630D62D75ABBC8AB1E4BDFB5A899B24D43' : true,
+ '882C8C52B8A23CF3F7BB03EAAEAC420B74207441729CDD92EC7931D823108DC28192E2BB' : true,
+ '8949548CC8689A8329ECDC067321AB97A60F34C8626C81F68BF77DA9F667588A903F7D36' : true,
+ '8956AA4D441E59D805A1886DEAC828B26372C49DA9FFF051B8B5C7D4E5AAE30384024B9C' : true,
+ '8BCA525F7553D02C6F630D8F882E1CD78EB03FC3CF7BB292866268B751223DB5103405CB' : true,
+ '8CCADC0B22CEF5BE72AC411A11A8D81291C6D6EE3E8AC86384E548C299295C756C817B81' : true,
+ '8CD79FEBC7B8144C5478A7903BA935671F55E8839BAC30728BE7108EDE7B0BB0D3298224' : true,
+ '8D26FF2F316D5929DDE636A7E2CE6425720FC15DDC27D456D098FABF3CDD78D31EF5A8DA' : true,
+ '8D639B56C114E4EE9A128586119082A3D2441AA8C203AECAA96E501F124D52B68FE4C375' : true,
+ '8D7251DBA03ACF2077DFF265065EDFEFC8C25F169EF85074D5BEE8CDA2D43CAEE75FD257' : true,
+ '8EADB501AA4D81E48C1DD1E1140095193679CA35668772304D30A5FB873B0FA77BB70D54' : true,
+ '8F5D770627C4983C5B9378E7D77D9BCC7E784A101C8265CC2DE1F16D47B440CAD90A1945' : true,
+ '8F91E7EEE3FCDA86CAFCDC70EDB7B70C8250BED5A214433A66377CBC10EF83F669DA3A67' : true,
+ '911B3F6ECD9EABEE07FE1F71D2B36127E19FE30E8B84609E809B170D72A8C5BA6E1409BD' : true,
+ '91DE0625ABDAFD32170CBB25172A84672796BAE63F1801E277261BA0D77770028F20EEE4' : true,
+ '91F4035520A1F8632C62DEACFB611C8E21FCBD8E7F6CAF051BD1B343ECA8E76147F20F8A' : true,
+ '9265588BA21A317273685CB4A57A0748E621F3354379059A4B68309D8A2F74221587EC79' : true,
+ '932A3EF6FD23690D7120D42B47992BA6CBA1C5F8B0E35EB8B94512D3F934A2E90610D336' : true,
+ '937F901CED846717A4655F9BCB3002978781C25A96BDC2FB4C65064FF9390B26048A0E01' : true,
+ '93C28E117BD4F30319BD2875134A454AAB48F333DB04ABB9C072DA5B0CC1D057F0369B46' : true,
+ '93EB36130BC154F13E7505E5E01CD4375F4E1FCF31B7913B850B54F6E5FF501A2B6FC6CF' : true,
+ '93F1AD340B2BE7A85460E2738CA49431705D2B4565C7047A540694A79AF7ABB842BDC161' : true,
+ '9414777E3E5EFD8F30BD41B0CFE7D03075E0ABB6138512271C04F85FDDDE38E4B7242EFE' : true,
+ '96897D61D1552B27E25A39B42A6C446F8EFDCABC93E61E925D4D1DED181A4320A467A139' : true,
+ '9760E8575FD35047E5430C94368AB06290AEA26985FF14804C434952ECE9608477AF556F' : true,
+ '978FC66B3B3E40857724750B76BB55F8B5D303BF8682E152919D83F184ED05F1DCE5370C' : true,
+ '9A771918ED96CFDF1BB70EF58DB9882ECF74BFFF9B86815B08335440363E87B6B6F0BF73' : true,
+ '9AAEF722F533FB4EEC0A249DC63D7D255E997CA5945AAB75FFD14804A974BF2AE1DFE7E1' : true,
+ '9B340D1A315B97462698BCA6136A71969E6CEB179185A29EC6060CA53E1974AF94AF59D4' : true,
+ '9D666ACCFFD5F543B4BF8C16D12BA8998939576E178DF705780FCC5EC84F84F6253A4893' : true,
+ '9DFBF9ACED893322F428488325235BE0A69A91FD057F136A42630BB1760D2D51120C1650' : true,
+ '9E80FF78010C2EC136BDFE96906E08F34ABDEEEC950D359C89AEC752A12C5B29F6D6AA0C' : true,
+ '9F6C1F0F07AC1921F915BBD5C72CD82AF5C27CF5FFF3029ACF1A1A4BEC7EE1964C77D784' : true,
+ '9FDDDBABFF8EFF45215FF06C9D8FFE2B9656CD7B57969895D0E141466806FBB8C6110687' : true,
+ 'A10B44B3CA10D8006E9D0FD80F920AD1B80186D1EB9C86A54104CF3054F34C52B7E558C6' : true,
+ 'A208E4B33EEFDE084B60D0BF7952498D8CC4307BC60755E7B22DD9F7FEA245936C7CF288' : true,
+ 'A2339B4C747873D46CE7C1F38DCB5CE985371CA6E550143DCE2803471BDE3A09E8F8770F' : true,
+ 'A26F53B7EE40DB4A68E7FA18D9104B7269BD8CF49CD300FB592E1793CA556AF3ECAA35FB' : true,
+ 'A33D88FE161BDDF95C9F1A7FD8C89008A3E31E20B2E46A328520472D0CDE9523E7260C6D' : true,
+ 'A37D2C27E4A7F3AA5F75D4C49264026AB6AF5BE5F878A00114C3D7FEF8C775C34CCD17B6' : true,
+ 'A3EC750F2E88DFFA48014E0B5C486FFB37F76DE6077C90C5B13E931AB74110B4F2E49A27' : true,
+ 'A66B6090239B3F2DBB986FD6A7190D46E0AB059420725493056062023670F7CD2EFC6666' : true,
+ 'A771FD26FC3CE540F19906EBC1936DE9E619D25B380B7B13FDA33E8A58CD82D8A88E0515' : true,
+ 'A7F2E41606411150306B9CE3B49CB0C9E12DFB4B41D7D9C32B30514BAC1D81D8385E2D46' : true,
+ 'A80D6F3978B9436D77426D985ACC23CAD6DAA8208D09D2154D24B52FCB346EB258B28A58' : true,
+ 'A8EDDEEB938866D82FC3BD1DBE45BE4D7639C71847E151B5C7EA01C758FBF12ABA298F7A' : true,
+ 'A923759BBA49366E31C2DBF2E766BA87317A2AD07F2B335EF5A1C34E4B57E8B7D8F1FCA6' : true,
+ 'A981C0B73A9250BC91A521FF3D47879FCB658264EA8CDA186E1752FB52C397367EA387BE' : true,
+ 'AA088FF6F97BB7F2B1A71E9BEAEABD79CF9E876DD3EBFC422697A3B5A37AA076A9062348' : true,
+ 'AA8E5DD9F8DB0A58B78D26876C823555409D4BD917B55C27B69B64CB9822440DCD09B889' : true,
+ 'AABFBF6497DA981D6FC6083A957033CA394FF6850B06BE52E51856CC10E180E882B385CC' : true,
+ 'AB57A65B7D428219B5D85826285EFDFFB12E13634586A46F1AB2606837582DC4ACFD9497' : true,
+ 'ABAB8D2DB740E5973D2FF2A63BDA6A05C18211328A92B3B23809B9B5E2740A07FB12EB5E' : true,
+ 'ABBFEAE36B29A6CCA6783599EFAD2B802F173F7DE99667AFA57AF80AA2D1B12FAC830338' : true,
+ 'ACB694A59C17E0D791529BB19706A6E4D4DE20D05E66FC53FE1A50882C78DB2852CAE474' : true,
+ 'AD8E0F9E016BA0C574D50CD368654F1ECFDEFE102FDA05BBE4C78D2E4423589005B2571D' : true,
+ 'AFB8336E7CDDC60264AD58FC0D4F7BCFBC7B3C6FEF26B9F7AB10D7A1F6B67C5ED2A12D3D' : true,
+ 'B001EE14D9AF291894768EF169332A846E3A55A4190C195C93843CC0DB722E313061F0B1' : true,
+ 'B147BC1857D118A0782DEC71E82A9573204285DCF7EB764195578E136BD4B7D1E98E46A5' : true,
+ 'B39C25B1C32E32538015309D4D02773E6782AAE0EDEEE21A5839D3C0CD14680A4F60142A' : true,
+ 'B3A53E77216DAC4AC0C9FBD5413DCA0658119F0E128287EA50FDD987456F4F78DCFAD6D4' : true,
+ 'B44ADBE85916461E5AD86EDA064352622964B686135B5DFDDD3253A89BBC24D74B08C64D' : true,
+ 'B465220A7CADDF41B7D544D5ADFA9A75BC9219DDC98E14BF1A781F6E280B04C27F902712' : true,
+ 'B4819E89AC1724FD2A4285271D0C2B5D20CB594FB4EDD895763FD5254E959A6674C6EEB2' : true,
+ 'B5E83436C910445848706D2E83D4B805039EEDB80BE7A03C6953893B20D2D9323A4C2AFD' : true,
+ 'B75274E292B48093F275E4CCD7F2EA263BC49F48F8F373A09C1EBDF85BB1C365C7D811B3' : true,
+ 'B774CD487C5F9A0D3BF3FE66F41B3DFA5B4E0EC28EBD8292A51782241281AD9FEEDD4E4C' : true,
+ 'B7B0D1EC1A033ECEA91511CCB16FB2AEE3D73606996CDFEF61FA04C335E98EA96104264A' : true,
+ 'B8089AF003CC1B0DC86C0B76A1756423A0A1AB90C9FC847B3B1261E8977D5FD32261D3CC' : true,
+ 'B816334C4C4CF2D8D34D06B4A65B4003838E30F77FDD14AA385ED145009C0E2236494FAA' : true,
+ 'B8D312034E8C0C5A47C9B6C59E5B97FD0560A2C738FF98D1172A94FE45FB8A47D665371E' : true,
+ 'BA21EA20D6DDDB8FC1578B40ADA1FCFC801D62D07B449D5C5C035C98EA61FA443C2A58FE' : true,
+ 'BA926442161FCBA116481AF6405C59870456F23D1E9C43AECB0D807F1C0647551A05F456' : true,
+ 'BC6C5133A7E9D366635415721B2192935922A1E15AEA163521F898396A4646B0441B0FA9' : true,
+ 'BD8ACE34A8AE6148E85EC87A1CE8CCBFD2EDF88B41B6FE01461D6E2834EC7C8F6C77721E' : true,
+ 'BDD6F58A7C3CC4A6F934CCC38961F6B2CABB51672400588E6419F1D40878D0403AA20264' : true,
+ 'BE395ABE078AB1121725CC1D46343CB2DE990CED99E0431F60EDC3937E7CD5BF0ED9E5FA' : true,
+ 'BF6059A35BBAF6A77642DA6F1A7B50CF5D989CDB159611365165641B560FDBEA2AC23EF1' : true,
+ 'BFB5E77D3DEA6F1DF08A50BC8C1CFA1DE4554333CA390E128B8BF81D90B70F4002D1D6E9' : true,
+ 'C1623E23C582739C03594B2BE977497F2AB628485E78FBF3AD9E7910DD6BDF99722C96E5' : true,
+ 'C1D43E07AEEBECFD7589E67EA84CEBCD76B76096DD145629AC7585D37063C1BC47861C8B' : true,
+ 'C1D951C084B86A75E82FD7D65F7EAC460B972C9EA6E7CC58D93B20BF71EC412E7209FABF' : true,
+ 'C22A59ABCF152F4CF7E631A316AE840C9158C5EF987301A8903CFDAB03D72DA1D88909C9' : true,
+ 'C2DBAB8E9652C5EEAEF25500896D55953913853E45C439A2DA718CDFB6F3E033E04FEE71' : true,
+ 'C45D0E48B6AC28304E0ABCF938168757D8A6332CE0036FB185F6634F7D6A066526322827' : true,
+ 'C463AB44201C36E437C05F279D0F6F6E97E2E99636A547554F838FBA38B82E74F89A830A' : true,
+ 'C4D7F0B2A3C57D6167F004CD43D3BA5890DEDE9E4C4E9F6FD88617579DD391BC65A68964' : true,
+ 'C570C4A2ED53780CC810538164CBD01D23E594945195F2414803B4D564D2A3A3F5D88B8C' : true,
+ 'C5A1B7FF73DDD6D7343218DFFC3CAD8806083F593F15A104A069A46BA903D006B7970991' : true,
+ 'C5DFB849CA051355EE2DBA1AC33EB028D69B561148F01C77C54578C10926DF5B856976AD' : true,
+ 'C5E67BBF06D04F43EDC47A658AFB6B19339B6B1450249B557A01877284D9E02FC3D2D8E9' : true,
+ 'C69F6D5CB379B00389CBF03FA4C09F8AEF2DACCBEABB682D32CE4ABD6CB90025236C07BC' : true,
+ 'C7BD11D6918A3582C53666017C6F4779634C3B0230CF1B78B4569FECF2C04A8652EFEF0E' : true,
+ 'C86E97F335A729144782892391A6BEC84A3F8D6BDC0E1ECFCD72E377DEF2D7FF92C19BC7' : true,
+ 'C91962D0DA7E1020FCA4CD0380872DF551A44C28F313E3F9CB5E7C0A1E0E0DD2843758AE' : true,
+ 'C9982777281E3D0E153C8400B88503E656E0FAC03B8F18235518E5D311CAE8C24331AB66' : true,
+ 'CA3DD368F1035CD032FAB82B59E85ADB97817950D81C9670CC34D809CF794431367EF474' : true,
+ 'CB17E431673EE209FE455793F30AFA1C4EB6D578499B1CCF5F581EAD56BE3D9B6744A5E5' : true,
+ 'CBBDC3682DB3CB1859D32952E8C66489C9321DE6B5A82666CF6971A18A56F2D3A8675602' : true,
+ 'CC4DAEFB306BD838FE50EB86614BD2269C615C4D4D85103A5326C24DBAEAE4A2D2D5CC97' : true,
+ 'CD3B3D625B09B80936879E122F7164BA67EB337B684CEB0EC2B0760AB488278CDD9597DD' : true,
+ 'CD68B6A7C7C4CE75E01D4F5744619209132D0D45534B6997CDB2D5C339E25576609B5CC6' : true,
+ 'CD996CDB2AC296155ABF879EAEA5EE93EE29D6EA98E632C6E527E0906F0280688BDF44DC' : true,
+ 'CDF439F3B51850D73EA4C591A03E214BE1A45B141A21DA1A79F41A42A961D669CD0634C1' : true,
+ 'CE78335C5978016E18EAB936A0B92E23AE5083ED7CF45CBC8F61C621FE685D794221156E' : true,
+ 'CF8F3B62A3CACA711BA3E1CB4857351F5D003860F002ED829DEAA41868F788186D62127F' : true,
+ 'CFF4270DD4EDDC6516496D3DDABF6EDE3A44735AE581901F248661461E3B9CC45FF53A1B' : true,
+ 'D2EDEE7992F78272180BFED98BEC13D8A7F8390BA57705096FD36941D42E7198C6D4D9D5' : true,
+ 'D35376E3CE58C5B0F29FF42A05F0A1F2211165CA379FBB5ED801E31C430A62AAC109BCB4' : true,
+ 'D3D9BDAE9FAC6724B3C81B52E1B9A9BD4A65D5F41DEF39B8B8904A4AD3648133CFC7A1D1' : true,
+ 'D3F3A616C0FA6B1D59B12D964D0E112E74F8A3C3EFE7B390064B83903C21646020E5DFCE' : true,
+ 'D474DE575C39B2D39C8583C5C065498A5FB7EE0633E259DBAD0C4C9AE6D38F1A61C7DC25' : true,
+ 'D480656824F9892228DBF5A49A178F14016897E1A0B8F2C3B134665C20A727B7A158E28F' : true,
+ 'D59788DA6416E71D664AA6EA37FC7ADCEC93DE083C93D933A986B3D5CDE25ACB2FEECF8E' : true,
+ 'D5BEFFB5EE826CF0E2578EA7E5346F03D904080A4929C838E9F185ECF7A22DEF99342407' : true,
+ 'D5E98140C51869FC462C8975620FAA7807E032E020B72C3F192F0628A2593A19A70F069E' : true,
+ 'D63981C6527E9669FCFCCA66ED05F296B51C067CEE2B0C3DF855AB2D92F4FE39D4E70F0E' : true,
+ 'D6A5C3ED5DDD3E00C13D87921F1D3FE4B31EB1B740E36C8402DADC37D44DF5D4674952F9' : true,
+ 'D6ED3CCAE2660FAF10430D779B0409BF85B5FF679B0C79961FC86E4422004613DB179284' : true,
+ 'D7343DEF1D270928E131025B132BDDF7B172B1A56D95F91FE50287E14D37EA6A4463768A' : true,
+ 'D87E32EF69F8BF72031D4082E8A775AF42EFDDE6BFF35ED0BAE6ACDD204C50AE86C4F4FA' : true,
+ 'DA26B6E6C7C2F7B79E4659B3577718653E84D3BCC544C0F6FA19435C851F3F2FCBA8E814' : true,
+ 'DB233DF969FA4BB9958044735E7D4183273EE12457FDC4F90C55E82B56167F62F532E547' : true,
+ 'DBC8F2272EB1EA6A29235DFE563E33DFC8EC8C879269CB4BAB39E98D7E5767F31495739D' : true,
+ 'DC32C3A76D2557C768099DEA2DA9A2D18782C6C304353BCFD29692D2593E7D44D934FF11' : true,
+ 'DC6D6FAF897CDD17332FB5BA9035E9CE7F88CD7223F3C813818C994614A89C99FA3B5247' : true,
+ 'DD753F56BFBBC5A17A1553C690F9FBCC24A40A1F573643A67F0A4B0749F6A22BF28ABB6B' : true,
+ 'DF0DBC7CC836B77699A1ABF0D20F896A342CD9D3062DA48C346965297F081EBC2EF68FDC' : true,
+ 'DF168A83EA83845DB96501C6A65D193EDBAC3C7AA4254DA1AA5CAAD68468CB88EEDDEEA8' : true,
+ 'DF3C735981E7395081044C34A2CBB37B61573A11DF0ED87ED5926522EAD056D744B32371' : true,
+ 'DFF28073CCF1E66173FCF542E9C57CEE99A69BE61AFE886B4D2B82007CB854FC317E1539' : true,
+ 'E006A1C97DCFC9FC0DC0567596D862139BAAE59F56EE21CB435ABE2593DFA7F040D11DCB' : true,
+ 'E14B5273D71BDB9330E5BDE4096EBEFB216B2A29E62A00CE820146D8244141B92511B279' : true,
+ 'E1C07EA0AABBD4B77B84C228117808A7CDD4EEAE6000AC7F40C3802C171E30148030C072' : true,
+ 'E2D52023ECEEB872E12B5D296FFA43DA9BACF3B664EAC5A17BED08437C72E4ACDA12F7E7' : true,
+ 'E2D8F867F4509435FC5E05FC822295C30446C8BB9A6983C95C8A2E5464687C1115AAB74A' : true,
+ 'E2F8E080D0083F1EC1E9D23F8069AE06C73026E325FE21916B55C4B53A56B13DCAF3D625' : true,
+ 'E60BD2C9CA2D88DB1A710E4B78EB024140E78C1D523D1CD9954FAC1A1AB3BD3CBAA15BFC' : true,
+ 'E77ADCB11F6E061F746C591627C34BC07454535C24A3A758207E3E3ED324F816FB211649' : true,
+ 'E8CC9FB09B40C51F4FBA7421F952857A688B6EB807E8EDA5C7B17C4393D0795F0FAE155F' : true,
+ 'EBB04F1D3A2E372F1DDA6E27D6B680FA18F7C1FCC3090203FD5BAA2F861A754976C8DD25' : true,
+ 'EBF59D290D61F9421F7CC2BA6DE3150928903A635B5280FAE6774C0B6DA7D6BAA64AF2E8' : true,
+ 'EC407D2B765267052CEAF23A4F65F0D8A5EC73D48C34FCBEF1005AEB85843524BBFAB727' : true,
+ 'ED41F58C50C52B9C73E6EE6CEBC2A8261B4B396126276B6491A2686DD70243212D1F1D96' : true,
+ 'EE2931BC327E9AE6E8B5F751B4347190503006091D97D4F5AE39F7CBE7927D7D652D3431' : true,
+ 'EE7A41E0CF757D889280A21A9A7BA157679A4F81FC705DDEC419778DD2EBD875F4C242C6' : true,
+ 'EEFE6169656EF89CC62AF4D72B63EFA29FAD91A6CE6AC6C50047C44EC9D4A50D92D84979' : true,
+ 'EF5AF133EFF1CDBB5102EE12144B96C4A1DB6393916F17E4185509400415C70240B0AE6B' : true,
+ 'F058C503826717AB8FDA0310278E19C2CB44A097857C45FA187ED952086CB9841F2D51B5' : true,
+ 'F096B62FC510D5678E832532E85E2EE52388C9D371CC9E963DFF7D3CA7CEFCD625EC190D' : true,
+ 'F09E639376A595BC1861F19BFBD364DD80BF3DE9A41D768D194B293C85632CDBC8EA8CF7' : true,
+ 'F16A2218C9CDDFCE821D1DB7785CA9A57998A308E14D6585E6C21E153A719FBA5AD34AD9' : true,
+ 'F1BC636A54E0B527F5CDE71AE34D6E4A36B12B49F9819ED74C9EBC380FC6568F5DACB2F7' : true,
+ 'F20598E5964BBE5D55181B55B388E3929078C5A28F9A4325C2A7C73813CDFE13C20F934E' : true,
+ 'F27DE954E4A3220D769FE70BBBB3242B049811056AFE9FD0F5BE01685AACE6A5D1C4454C' : true,
+ 'F37E3A13DC746306741A3C38328CFBA9253F775B0E7797AB645F15915597C39E263631D1' : true,
+ 'F3D752A875FD18ECE17D35B1706EA59C968338F113E36A7BABDD08F7776391A68736582E' : true,
+ 'F4FF97428070FE66168BBED35315819BF44095C238AC73FC4F77BF8F98DF70F8F091BC52' : true,
+ 'F520DA5203862B92768D5CB72D8B93ADA65CB4733D94A5C865A864647C2C01272C89B143' : true,
+ 'F775AB29FB514EB7775EFF053C998EF5DE28F4A4FFE5B92FA3C503D1A349A7F9962A8212' : true,
+ 'F7B661AB03C25C463E2D2CF4A124D854FAA7D9FB31B746F200A85E65797613D816E063B5' : true,
+ 'F8387C7788DF2C16682EC2E2524BB8F95F3AFC0A8B64F686673474DF7EA9A2FEF9FA7A51' : true,
+ 'F8BEC46322C9A846748BB81D1E4A2BF661EF43D77FCAD46151BC98E0C35912AF9FEB6311' : true,
+ 'FB1B5D438A94CD44C676F2434B47E731F18B538D1BE903B6A6F056435B171589CAF36BF2' : true,
+ 'FC11B8D8089330006D23F97EEB521E0270179B868C00A4FA609152223F9F3E32BDE00562' : true,
+ 'FD49BE5B185A25ECF9C354851040E8D4086418E906CEE89C2353B6E27FBD9E7439F76316' : true
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/STS.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/STS.js
new file mode 100644
index 0000000..17999aa
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/STS.js
@@ -0,0 +1,228 @@
+// http://lists.w3.org/Archives/Public/www-archive/2009Sep/att-0051/draft-hodges-strict-transport-sec-05.plain.html
+
+const STS = {
+
+ enabled: false,
+
+ get db() {
+ delete this.db;
+ return this.initPersistentDB();
+ },
+
+ initPersistentDB: function() {
+ return this.db = new STSDB(STSPersistence);
+ },
+
+ processRequest: function(chan) {
+ if (this.enabled) {
+ var uri = chan.URI;
+ if (uri.schemeIs("https")) {
+ try {
+ this.db.processHeader(uri.asciiHost, chan.getResponseHeader("Strict-Transport-Security"));
+ } catch (e) {}
+ }
+ }
+ },
+
+ isSTSURI: function(uri) {
+ return this.enabled && this.db.matches(uri.asciiHost);
+ },
+
+ enterPrivateBrowsing: function() {
+ try {
+ this.db.save();
+ } catch(e) {}
+
+ this.db = new STSDB(this.db);
+ },
+
+ exitPrivateBrowsing: function() {
+ this.initPersistentDB();
+ },
+
+ eraseDB: function() {
+ this.db.reset();
+ STSPersistence.save(this.db);
+ },
+
+ patchErrorPage: function(docShell, errorURI) {
+ // see #errors-in-secure-transport-establishment
+ if (!this.enabled) return;
+
+ if (!(/^about:certerror?/.test(errorURI.spec) &&
+ this.isSTSURI(docShell.currentURI))
+ ) return;
+
+ Thread.delay(function() {
+ docShell.document.getElementById("expertContent").style.display = "none";
+ }, 100);
+ },
+
+ dispose: function() {
+ this.db.save();
+ }
+};
+
+function STSDB(source) {
+ this._entries = {};
+ if (source && source._entries) { // clone
+ var entries = source._entries;
+ for (var p in entries) {
+ this._entries[p] = entries[p];
+ }
+ } else {
+ if (source && source.load) {
+ this._persistence = source;
+ this.load();
+ }
+ }
+}
+
+STSDB.prototype = {
+ _persistence: null,
+ _dirty: false,
+ _saveTimer: null,
+
+ processHeader: function(host, header) {
+ if (DNS.isIP(host)) return;
+
+ var m = header.match(/^\s*max-age\s*=\s*(\d+)\s*(;\s*includeSubDomains)?/i);
+ if (!m) return;
+ var maxAge = parseInt(m[1]);
+ var includeSubDomains = !!m[2];
+ var expiration = Math.round(Date.now() / 1000) + maxAge;
+ if (host in this._entries) {
+ var e = this._entries[host];
+ if (e.expiration == expiration && e.includeSubDomains == includeSubDomains)
+ return;
+
+ e.expiration = expiration;
+ e.includeSubDomains = includeSubDomains;
+ } else {
+ this.add(new STSEntry(host, expiration, includeSubDomains));
+ }
+ this.saveDeferred();
+ },
+
+ add: function(entry) {
+ this._entries[entry.host] = entry;
+ },
+
+ matches: function(host, asSuperDomain) {
+ if (host in this._entries) {
+ var e = this._entries[host];
+
+ if (e.expiration >= Date.now() / 1000) {
+ if ((!asSuperDomain || e.includeSubDomains))
+ return true;
+ } else {
+ delete this._entries[host];
+ }
+ }
+
+ var dotPos = host.indexOf(".");
+ var lastDotPos = host.lastIndexOf(".");
+
+ if (dotPos == lastDotPos)
+ return false;
+
+ return this.matches(host.substring(dotPos + 1), true);
+ },
+
+ serialize: function() {
+ var lines = [], ee = this._entries;
+ var e;
+ for (var h in ee) {
+ e = ee[h];
+ lines.push([e.host, e.expiration, e.includeSubDomains ? "*" : ""].join(";"));
+ }
+ return lines.join("\n");
+ },
+ restore: function(s) {
+ s.split(/\s+/).forEach(function(line) {
+ if (line) {
+ var args = line.split(";");
+ if (args.length > 1)
+ this.add(new STSEntry(args[0], parseInt(args[1]), !!args[2]));
+ }
+ }, this);
+ },
+
+ load: function() {
+ if (this._persistence) {
+ this._persistence.load(this);
+ this.purgeExpired();
+ }
+ },
+
+ save: function() {
+ if (this._dirty && this._persistence) {
+ this.purgeExpired();
+ this._persistence.save(this);
+ this._dirty = false;
+ }
+ },
+
+ saveDeferred: function() {
+ if (this._dirty || !this._persistence) return;
+ this._dirty = true;
+ if (!this._timer) this._timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ this._timer.initWithCallback(this, 10000, Ci.nsITimer.TYPE_ONE_SHOT);
+ },
+ notify: function(timer) {
+ this.save();
+ },
+
+ purgeExpired: function() {
+ var now = Math.round(Date.now() / 1000);
+ for (var h in this._entries) {
+ if (this._entries[h].expiration < now) delete this._entries[h];
+ }
+ },
+
+ reset: function() {
+ this._entries = {};
+ this._dirty = false;
+ }
+};
+
+function STSEntry(host, expiration, includeSubDomains) {
+ this.host = host;
+ this.expiration = expiration;
+ if (includeSubDomains) this.includeSubDomains = includeSubDomains;
+}
+
+STSEntry.prototype = {
+ includeSubDomains: false
+};
+
+
+const STSPersistence = {
+ get _file() {
+ delete this._file;
+ var f = Cc["@mozilla.org/file/directory_service;1"].getService(
+ Ci.nsIProperties).get("ProfD", Ci.nsIFile);
+ f.append("NoScriptSTS.db");
+ return this._file = f;
+ },
+ load: function(db) {
+ var f = this._file;
+ try {
+ if (f.exists()) db.restore(IO.readFile(f));
+ } catch (e) {
+ dump("STS: Error loading db from " + f.path + "!" + e + "\n");
+ return false;
+ }
+ return true;
+ },
+ save: function(db) {
+ var f = this._file;
+ try {
+ IO.safeWriteFile(f, db.serialize());
+ } catch(e) {
+ dump("STS: Error saving db to " + f.path + "!" + e + "\n");
+ return false;
+ }
+ return true;
+ }
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/Thread.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/Thread.js
new file mode 100644
index 0000000..8c9daf6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/Thread.js
@@ -0,0 +1,100 @@
+
+var Thread = {
+
+ hostRunning: true,
+ activeLoops: 0,
+ _timers: [],
+
+ spin: function(ctrl) {
+ ctrl.startTime = ctrl.startTime || Date.now();
+ ctrl.timeout = false;
+ this.activeLoops++;
+ this._spinInternal(ctrl);
+ this.activeLoops--;
+ ctrl.elapsed = Date.now() - ctrl.startTime;
+ return ctrl.timeout;
+ },
+
+ _spinInternal: function(ctrl) {
+ var t = ctrl.startTime;
+ var maxTime = parseInt(ctrl.maxTime);
+ if (maxTime) {
+ while(ctrl.running && this.hostRunning) {
+ this.yield();
+ if (Date.now() - t > maxTime) {
+ ctrl.timeout = true;
+ ctrl.running = false;
+ break;
+ }
+ }
+ } else while(ctrl.running && this.hostRunning) this.yield();
+ },
+
+ yield: function() {
+ this.current.processNextEvent(true);
+ },
+
+ yieldAll: function() {
+ var t = this.current;
+ while(t.hasPendingEvents()) t.processNextEvent(false);
+ },
+
+ get current() {
+ delete this.current;
+ var obj = "@mozilla.org/thread-manager;1" in Cc
+ ? Cc["@mozilla.org/thread-manager;1"].getService()
+ : Cc["@mozilla.org/thread;1"].createInstance(Ci.nsIThread);
+ this.__defineGetter__("current", function() { return obj.currentThread; });
+ return this.current;
+ },
+
+ get currentQueue() {
+ delete this.currentQueue;
+ var eqs = null;
+ const CTRID = "@mozilla.org/event-queue-service;1";
+ if (CTRID in Cc) {
+ const IFace = Ci.nsIEventQueueService;
+ eqs = Cc[CTRID].getService(IFace);
+ }
+ this.__defineGetter__("currentQueue", eqs
+ ? function() { return eqs.getSpecialEventQueue(IFace.CURRENT_THREAD_EVENT_QUEUE); }
+ : this.__lookupGetter__("current")
+ );
+ return this.currentQueue;
+ },
+
+ delay: function(callback, time, self, args) {
+ var timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ this._timers.push(timer);
+ timer.initWithCallback({
+ notify: this._delayRunner,
+ context: { callback: callback, args: args || DUMMY_ARRAY, self: self || null }
+ }, time || 1, 0);
+ },
+
+ dispatch: function(runnable) {
+ this.current.dispatch(runnable, Ci.nsIEventTarget.DISPATCH_NORMAL);
+ },
+
+ asap: function(callback, self, args) {
+ this.current.dispatch({
+ run: function() {
+ callback.apply(self, args || DUMMY_ARRAY);
+ }
+ }, Ci.nsIEventTarget.DISPATCH_NORMAL);
+ },
+
+ _delayRunner: function(timer) {
+ var ctx = this.context;
+ try {
+ ctx.callback.apply(ctx.self, ctx.args);
+ } finally {
+ this.context = null;
+ var tt = Thread._timers;
+ var pos = tt.indexOf(timer);
+ if (pos > -1) tt.splice(pos, 1);
+ timer.cancel();
+ }
+ }
+
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/X509ChainWhitelist.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/X509ChainWhitelist.js
new file mode 100644
index 0000000..b32b6e4
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/X509ChainWhitelist.js
@@ -0,0 +1,1007 @@
+
+// These are SHA256 fingerprints for the most common chains observed by the
+// Decentralized SSL Observatory. These should not be resubmitted.
+// This file is automatically generated by utils/mk_client_whitelist.py
+
+const X509ChainWhitelist = {
+ '000AA4E99FE86D84F762DFB2DC29323D0614B95AA335A270AF204EBA2F2240AF' : true,
+ '00487384DE9545F7F6D6709574920DB9743F0DDC4D5E1518EC00ACCCC6F9866F' : true,
+ '0077DFC8E3CFE0E4398F208CDCB1BC5A7A78BEEF101ED256315FCB9833283B58' : true,
+ '012AAE6B27B392684695FA22F87C8DD3F60CDAB564EE4D4D58DF98575D99153B' : true,
+ '01FC275FB7BB83082EA2C546876545030D74F68355AF2B0CCB1972993B393E58' : true,
+ '0261C3970364E15EC2BB646934FE28F8FCE6E1D5E0B99C7539DF636ED03A9DF0' : true,
+ '027017BAD8EC764424A5DB3B647AD769E78F1653A92F800FAF21212C4DB6CEF8' : true,
+ '034AA8D4F147FC9E93CC18EB5BC06F28FE3DF4923CA61A9CAE92F4E3E078C5F3' : true,
+ '03985CA59706D4A023A5CE0B2E4F870EA465A8E3803CEB2AD859FC86D3569852' : true,
+ '04376F22DBF0B17201EB6871797B1D31FC00EBC4743317793B9C5A5BEA8CECF4' : true,
+ '046C78CE6601C4D88EAC305EE65068225CED3988A6BEC42E50B57B1979742245' : true,
+ '04AEEFBC8685B2668E25C23D77C6D63B95C7C0BA1B8ABBF434F5EAA66BC3E7F4' : true,
+ '052592AA10AFA8D750861F47C540D3A0653A87138ED7427BFD02C9D197D3EF8B' : true,
+ '0544DC1E0D529429A1C86E848D1C78B8511CC1A2128405D276FD864B452890EF' : true,
+ '055C88BD28194042771FF813973E086A30710231DB219FF377B79FA075E7F2AD' : true,
+ '05CB56F00C8DA64EEF10F2305EF696AF839CF8DD541910D760772AC86811FDAB' : true,
+ '05CE45708C3882B0DB81A4504FBE064C1ACD7DABDD071A7F263744FAAF040CF5' : true,
+ '05F70EA23C890F1C382FB250E40DFFD3488C271006DB6B10DC96BF34B6F74420' : true,
+ '06808645F29D708E4C31AC40FA00000733238E10A56D2067AA62803C9736E923' : true,
+ '0699966F623E746BF97DB3B6BBBEB83BCF2E8CAE89D907A49A731951B158216A' : true,
+ '06B35EEE47D7E55F278C5DB13FF137B269B6EF91B58FEB4B2E70E7CC1DB757D2' : true,
+ '07CF2A06F1718D6E476B98C2B42E370A35FAFE4C1F41CF7A1DE115CDB6222FAC' : true,
+ '07E7123B20A807889C384460FFCE4A7F53593A5C872B0E8FD45795D71CD0F9FE' : true,
+ '07FC57E4C188422B53059AD4839F467B9269E4EABBF902C99B30E25DEC5EB1B7' : true,
+ '0834241C7C2B598E20698047C331B173BCA189B96E528FA1993AFAAE3F7D51F6' : true,
+ '087FAD2F33E4D28A13CCFDE11F270188E01AE0EED615D2F433DA4EF05CA6BD4C' : true,
+ '089979504BECAC25640130E65E562AA3E3B5D49EE148FEF6A2B77A2A1CF5FC06' : true,
+ '08BD4BE042F6DA7D627143ED6B2BACE65615683C3C272123AC55105DE4BD723A' : true,
+ '08E5080C1D69F2C11524050C9C0EFDAEBFE68A27FD30EC04AAF4DE2D590F22EB' : true,
+ '09250AF23BC74D92973DD48812D5ED28CE1F5C110EE5F7CA791D9CFDE04A131C' : true,
+ '096800FDAFA82029B3B5E3947E0EAB6FB1F1D6958DE04E9256969F99F7518C57' : true,
+ '0A122B87C038CAEA46E8944009B11C2168E47F4DACAA9D3BBFB92CB5F5E1BCDE' : true,
+ '0A36586C8EEE28E5ECA1F542691D12B3CE7815CDCF722CDF7074AA71413C2550' : true,
+ '0A6A1FECBADAF7F1B473305A71E454F6AA8C1B0F40941FF4660B814BFF4984B3' : true,
+ '0A903D7CCFBB18FFEC8E3AB05FC7E592C1E7509D0EC2DBD9A2C05236BA9FD7C9' : true,
+ '0A91A9CAC951DA1739ABB2F29D16A6F5FAA9F49AC87516AB59CA77150D282528' : true,
+ '0AA5730256323B66DBE88E3056AA3F45E52BE5E2B87C1C9DBC1986CEAF97B5D9' : true,
+ '0B2D2C539D3D922820B6D08E159E6763D22AE797B2C32F8202B632BB93588588' : true,
+ '0B39ADF22CBA98C15754A7A899C5B96871337D2178EB3EBF0B5D5F88332EA971' : true,
+ '0B901F548AE4E0F25EF38010E311945FB198E497F203A88FE7C44970F7ECDC40' : true,
+ '0C114EDF67FB7C09C532297D79A5743EE5F8576A8EBE3DF69A728B8CFC0A167C' : true,
+ '0C7E90EF8BCD379CB001FD07530718DCC0A33E9D7D1D333F505F0143BC6A8FD6' : true,
+ '0CA932C2E0929B9B6C0A8822D3F094F671522419835049CAEAC51755D1F44777' : true,
+ '0D4F42B386775FF404B84D58859BC5AB029F1F9CC6B7AFFF32B838F8B8C71F3E' : true,
+ '0D8FC5F202A5668F7F3EA7F6A73521E0C7FEB5DBF6E58BA68AB7C7E01F4C532C' : true,
+ '0D91DE20988EA155526570498A1A6289FEC55994A5BA888C9134765F2A0B0580' : true,
+ '0E3AE0C9BEDFCFB38239DC4214A3AF3E6386720E2E5F8A85EEB52BD152E4DF09' : true,
+ '0EEAAD4FE6818F1D723A5567CD0A6569D45E346E2DA2896222A7F3367F4AE8C7' : true,
+ '0EF8FA5AAD4BACDB842959378F18935855B027B0BADDCBDEADC9CC958C4C603B' : true,
+ '0F39AF5CA9615B05CBC12DE3C94A8C4FBA71CA8CEF541952315A9D0658DB5B28' : true,
+ '0F7DE9806919EBD5EE47188428BF7FE13495E4684ADBB5BA980BB15D4D0B0C22' : true,
+ '0F8F66953B0F42560CDD573A013D3FB809D9747210E58F28F4878CDA5A8B8AD2' : true,
+ '0F97235268233245499D6C1319DF1BCA3AAAFB13CF9B06EB294FCA328022E82C' : true,
+ '0F9E066578F4AFB0ACBDC408CB25B7D7200BC5CB7FC4DA6D32532D827EA5B232' : true,
+ '0FA392F6EABCE0F4DA14C7B5237B21BEEE6BDA55832A8A6090CAEBB53AC8D77B' : true,
+ '1049EFDE8BD0E7D94AE05D50D326ABCE41E79B0572F86FDF1F7387738262F09A' : true,
+ '10552D044AD79FBF1AF5357998DAB9B1FFD66D7B53C8107FC2280148D66475E3' : true,
+ '10E82776E55D0C2D58F6598E615CF38AA14161D1EAD97C4A09182FE1D44E695B' : true,
+ '10FD669D6DA882678AEAFB35A5F8A0963C2E2B3084883EA515C8956FEC4207ED' : true,
+ '114ED15D4B557A16DDE1D01CB4074215CE6773C180FEF60F08267CEAFB670D5E' : true,
+ '116A5D5F3E99CFE5F72A4AFAC8699CC225C130F4B8520CDB350A1262D9585973' : true,
+ '118FF53B6BEB35CBFE6592D45BE082BA1228D1817E46B2CC14B8855FCC5C9D59' : true,
+ '11EC553AB76EED159FE553B52E7475FA71A0FF3F4B3038CF91BC7138F50B0A7E' : true,
+ '11F7A939F33BDF6270E16C747C0B0918902CD4501AF1843D9EA4445A2E708C58' : true,
+ '1243C75D0F805DA54E780D0D9C55247B1ABB31FC09EB65A7017695945F2A0D4A' : true,
+ '124CE9CD70225896BB3C9DF372E0457CABCEE8585D1BCB8E16D0E6D95B94AF2F' : true,
+ '124E430E0E0B103B580A0436D7CF436F6ECE55908279FA8EBDF475AED08A9CE9' : true,
+ '12826065A034136FFC2258AA1A65F9E550A582B4017E396077917C775D42E553' : true,
+ '1363B86EDA0BFAF10F1141CBE7569647F2FFB370F539694288101128A38261B8' : true,
+ '137E64BF679E2CD24F034125EC926D48F34C7404CFD6B61B23BA9E91E55D3560' : true,
+ '13ECB3394571030912CDF82DDAFA05B242398929BD3ACE1598B79DBF28B701F8' : true,
+ '142A33AB96C13ED7C7B8782D764F374B5A8F9C4E33B4DFE9B7750E878E7C5D0D' : true,
+ '14587E25D8BF0150F429924144E88AC551C1F77CB5DC84F6CDDE7079014ED2EE' : true,
+ '14E443C709A20C11205371C5BC54C20CCD53AC434750EBC91C45B30DD0D8B53A' : true,
+ '14F5D6BA3842E708E3AADC26B8A9CD89FE9CF2BEF46398369521839733A4504F' : true,
+ '150F5BC3D839579BD7DD1254A6C3C3AFE3485D7DED21C3B8123BA6875886A91A' : true,
+ '154C4C43AAF5F838B7B9BE748FF671521BDF0ECF3D749EB85487F9C315239778' : true,
+ '15F46CDF488A5BAD54DBA0F2E2F825F956F8ECF9E3AF294551E88F62A8A0CECD' : true,
+ '16BE849F33D16B22C495B9793329BE704AD9C681C2A963C71FDB303D526E09B3' : true,
+ '17A0318A02B4E7EB14792644E1E28966257748F8162A53AF4E49697A4707C9F7' : true,
+ '17BE5D468B1EA071C36079A4843B8A1E69B9FCAFFA0565FB54B10A02D78B7FA8' : true,
+ '17D0A909CE750C728FBD0F33589A3EBFDA452D00C757A18557DB4697289287B6' : true,
+ '17E110287D04C595DAE0C73090051A1F30F165A37429CD78C1F8FC1754549D41' : true,
+ '17EC9E8F98C207F4CA7FD0680193A54DC33BC97CB364669442F5B7492D36839E' : true,
+ '17FD21D68D53F369EEC1E22EFCC3B79B255EB8E1031D147F6461291C4D980037' : true,
+ '183AE55CFEE1CAC5CCBC1C58D813DED429DF750E023362FB8BEDCB27A9F94559' : true,
+ '186DC5DF9C693C311857A94BF9B2810BDD02F22DAD527D2BFBC0CDF24BCE26FD' : true,
+ '1882C2D8D817DD1078933D244E379CFC5BA8EAAE302BCF9FA22636B08FAC86CE' : true,
+ '188F5D081FD0D98429D1747FFBFEAB39733EA7C2B61C8BF6B0ED62F71264C619' : true,
+ '1974EFA39EBF5C2D3B53D5089EF28F6545D5B4937DB660385AF579A28FD17A3F' : true,
+ '19778EECDA512FBEFDD9AD0507A1F828AE67C35594C20831D1D531B79F8B2F99' : true,
+ '19AD483D37D656F9D7844F14C53281FDD56683C0C8FB2A8F3F77DE7C810C1CFC' : true,
+ '19C76F18839C90F94AB9E4CD3ABC4C15E0A8DA9B8705E7DD872962CF8409DAF2' : true,
+ '1A5C89F300E3A9835759D6588CE3361993E336D76EF4B2F64F1DFC4D913BC6F3' : true,
+ '1AA7EB7CB182FF1BA09FCDFD088DE1F25F8551DAE53CE2C16D4D72D1B6091CA5' : true,
+ '1ADFE710199AE62734EAD27EEE6D6A4EC4D6FF19D6978A7CFBDCABA69C1617E1' : true,
+ '1B5827F9E4B66B4895AB47A0395BB1E135D15F7A23712147C5D382C1AD805ED5' : true,
+ '1B8AC4A31C75996D44252AED8CCF639282DF3A180900C660804483597238D8BF' : true,
+ '1BAF1A75711BC2EF2C4EB8C2BEA4B5B1B183E95ACCB247DB89B3098C324870C2' : true,
+ '1C1BD271327C7721AFDE3C5BE6FA98B132F2EE1911BDF05F0649121349A4537F' : true,
+ '1C1DAB84FAA0FC35AAA8A54760840F8A48EB449B338D7CF3902397514F4D1CD7' : true,
+ '1C363FBCE719D6567E55DE267E6662A454494FA085180F23FE84139E9E83527C' : true,
+ '1C573E491ECF04E3240144B2A63D8DDB457367055B90F5947CEFB55174A6B959' : true,
+ '1C923C0DC4E99E8F807E44A5499EAC4BC48022C63A3EB4CE819D556349FB57BA' : true,
+ '1D4D6D7E6B04F507E28EEA37367012166A6E4AFD02D2F325129A70F76894512E' : true,
+ '1D602FC8C0A6E38288593AF300D73F04B3A5AF89F5B08A0DAC3D935A9B69D7B9' : true,
+ '1E15FDE9774DDD452B000A3FD8118DAE63D16F8EAC19D26806BB08A70677F42F' : true,
+ '1E294231C72B07AAA6E2FE3B18BA14F1095F82718B42AF1DEE071D011740550E' : true,
+ '1E5D810BCB8DA3AF393761C59CC88D22669ECB7D4F926760BE1EC6CD83E60765' : true,
+ '1E5DD6CDAA3AAB8BB891B8D7B4E99AF2EBB7F08719F1D3B3C7B8694962EE8668' : true,
+ '1E84A8F15A3EB4B7921D7462C1FFF8DDC182E4E0682EB48C42FB3645BA43A6E2' : true,
+ '1EC6CF08000A6583160FEDE1C117794E75CA5533B666D04FAB138D8F12A4ABC1' : true,
+ '1F1A125828C6F4A21A9D035C28E5493FACE0F4D7DE6B6F2DD5B9FD5D426B6FC7' : true,
+ '1F3C4550EEA0B9B8F4608632610548B64126E8929450D285DBF906752241CEF3' : true,
+ '1F4C963A9BA39CE44E46F135EFEAD5B30D6A0A3A43545E18CBE59DE452A6468B' : true,
+ '1F6AF055216D53382D7D42AE6893552B4C04C0D6CE31A2A71B7FD24F7A607A67' : true,
+ '1FB6F7F8DD4B392D4BEAA5E707AAF882D2AA83C5E9720C58B616F8DDDFFA6F77' : true,
+ '206A33714BD518CEFF68A6904E19B0837230BCADEADEA6E056EE3745774BE3EB' : true,
+ '20714569334D93E90D2200B253E447A249EC53311A379538BFACDCEE457D9656' : true,
+ '20BE732FDB6D751C0991700E7C9D401093135652D25B1A29D3387E21D60B776B' : true,
+ '20F2E0109442ED3DB805D939B1FCC9F4C8E17414F748FDE98883C9EFA504397E' : true,
+ '20FD7A6E1659C35B1870F698D182820EADD8E02ABE97A9FCD691681B4A6493E6' : true,
+ '215C6D97B01A9EA11CDCB7D4D62EF74D31231F99CA59F3D21104097AD5D52868' : true,
+ '22BA6A5C28A505A68F7C025447822720E4772BC380FD9EA58EA71C32682CF0FC' : true,
+ '22DD516BE482B2A7F3C5EE268E8110EB9814E86E4102654C3CF5705743BCF870' : true,
+ '22E6BB3D9964F458D462BAF404323775B20EEF02F174CDBB442D4381DB98C61D' : true,
+ '23223C3601CC5682B21E4D4C236BB85C9098082EE3942070E33CC791CDFAD31A' : true,
+ '23980A7B935B10CA69315CDA05E61B4ABAE7876724C0E0C3CC7BE9748E41ACCC' : true,
+ '243D9193A5D38C9F2C21409EA470757D3903F8C418709E12C47F01C4EC08E5D5' : true,
+ '24540FC5876A301AF83E2494013ED0B4F7B1312D7238EDDFA1DB0E7736082856' : true,
+ '24789DF7D8F1D393F224621E436675778CAFD595AF6988D2995F28553F28B629' : true,
+ '24AEFDF5AA4C36F89987C960EA14B8A90CB2670CCCC66957652A21E0231D2E4E' : true,
+ '25531D59643B0F5E1CEE67B9CE42B0332FCF9688659F62D990C77CB8C1349E10' : true,
+ '258296CAC41A779D819E37CB4B120D2270F55AD8BDA24747C572165BE31849D2' : true,
+ '25B87ACDCD18628D9B64EB9F6366C970B2FE922B39EBB7E3DD1354899260B180' : true,
+ '2601092E7F1A7841A9E65C6D24D0BBC0CFE986404E6DAFF628E2C2D70667EB59' : true,
+ '2635178113FBBCC75EABC09C497D411C994AD0170CF9DF999A4FF5C16872CDBB' : true,
+ '2643995B1EC6D06457AB936E18B5A5721CEDDCC82F4E116C36EEC5096BB04DC4' : true,
+ '2677470F2FBD067904B7014B88988BB94F72403C014240B9843AE5A5FA21661D' : true,
+ '26B163AB60042EB690FF4549F6086019E19A99A3B69332AD1FE85D9C46491AA9' : true,
+ '26D184F574A19836878B10B209825413B48BB1C92195AB69F6B01D359FD4D07E' : true,
+ '2710EBB98F6790081E34A1961D7716533511A1746616DDBAB9A3D64ED32B1875' : true,
+ '271B4C5B8689BD69CCA837BC080C554DBEE0B20C5B1C505F68544AEC29588277' : true,
+ '2774F85336B9446490224280339F361F69E44891C5D8F078F03FEC5BC7C37437' : true,
+ '27C6EFE085FD0EF2DD467630B0A650BD3624BB4065F811F5F99CA976B4C0B871' : true,
+ '28002E2FB259DA7341B69C144F4EC6B5B12CB9A981C34387044926957CF9152C' : true,
+ '28082C3B3FB30995C3ED4D971AF00E3114C75B9FA47540DEA79E120E01C03562' : true,
+ '28445F7C648AB6025EB469E9C5FD10C6C8D0D21B6A20F078854EFF406C55D3F7' : true,
+ '287821696D43B83F1EA4A3AF5F6E5695F86D770148341106757B98DACB5C979F' : true,
+ '287AC69E23A84ED6C79668FD778A1C5F89D93D9E85B1F84110731B3EF007852D' : true,
+ '288B79B657E95C6E9FF6FF795A3E36528FDD26538925F67411B0F1F715DC9905' : true,
+ '2895D775D2F7F4D7BFF504B3C204939766B2C2734BC607B154CB1B2E52D76012' : true,
+ '28B2F8B5E2ED8681AE3D47EBB733718E32FF81FD736E97EEE68E12A6CFD3C9D6' : true,
+ '29AE4E3FA75E6A40E5C2D8BB9446BC39D672780F4CD6334CA2527FFEC0FBBFD3' : true,
+ '2A00C2E13F83FE2640D9DA1B802219AED52B811CCD54F7632622FB05531CB829' : true,
+ '2A227A780950EC49D49437E4FBD2306EC1D213A25343B752F116B3C4203C641A' : true,
+ '2A2EE56590084C2B144125731B45BDF927C357840E997888F52EF90AD6361EA5' : true,
+ '2AE917E3AB4B867883088BCFFED53EBEF9F87988C77AE47FE325547B181931A1' : true,
+ '2B372D2A09743CB535C71949D24612C108A95D542D5235B443C116426F4EC740' : true,
+ '2B5FC256FE24DB51001FBB200C80DEDE29EF2CCA290DEDA0EA7FA5627A8400E6' : true,
+ '2B804DA0656D06DB6CFF31AF9EE7A41E9621F5062C855A3FA3E69208C6BED1BB' : true,
+ '2B96B9494AB9EF09B7D4ACC0F7C7C8B27BB23772D8203F98A635285335B476FA' : true,
+ '2BB158B54FA26B5A7FDA92096D214B5AB548D13D4CD0D275B967703750B03097' : true,
+ '2BDDDA7C2F05123A014AFE1044AE6AD3B1AA14F0BEAE4FDE812BE52DA271F992' : true,
+ '2C27A3FBE2D833ED7FA00DE8A00EB1E16F40043D68C21C6FAA72A34DD839A5EB' : true,
+ '2C43EC0374BC603A1B191B88ADBCD5C1A0409120427995C2684A1590C7AB1432' : true,
+ '2C6E83BE981FD0EB0ECE7D8977D665C1B7665DFEE4C0F7DBDF5138FEC3974EBB' : true,
+ '2D75CD1232720CFFABA233953EB8CFD860C23034BD9CF969E8D104485B251ECE' : true,
+ '2D978BE3F44F069B366DB5D8E3B1FE4B02775498DE8D17EA68B423259B681FDD' : true,
+ '2DBAF94C053FCCFA1EC09CBB22F54DAFF2DB4ABE1B3C61CFF1BEBC31260F4821' : true,
+ '2E23B68E6E803E74BA36D9C9006F96D8BAC39DB4CAEEBF1C12C6CC01CFDFAD6D' : true,
+ '2E50DDF50FA4B9220202816F9B79405227BA4F803E61FD96D6BC95A0263E49EC' : true,
+ '2E6193577D9F6627E5D23883970975541C6807F1DD1F48971EECF07C204C16BD' : true,
+ '2E726E5D6C08B18944773DECBBBA88F95E25D586248B145354596BA8DB31DDC1' : true,
+ '2F0D2656CFB3D34F4775E89AD96E2AA7D3A1FCDE399BCB2E03AA2BA0A035946B' : true,
+ '2F36C6E796C7C4047152AD68B781475E3FA3AA785DE5CC277DA2DA20F35AD52C' : true,
+ '2FE442C9741D5351A016B9796E3021A01BAC6867A567ABBD1C7EB08DD359DF94' : true,
+ '30354519FFD4794257A7EBEDB0D47DEC9A547B4E7213199000F41EB65C233EF7' : true,
+ '304039981650BCAEA6BAC7B1FF2E03A9BFBC8AF4C37F37E66D59D327776EAE77' : true,
+ '305B4CDDF744AA543DA713E7E60C19ED5537D49ED2252330B46B7E664C4E588C' : true,
+ '30AF2F588C872B174436F3B68ED432C0495D651C84A04787CC8C13D6D61DF63B' : true,
+ '3102A33CF44D88924253BC149D22198D046E6571E79D0C6CFE106F8A725364FC' : true,
+ '3141118408E436FF8489E07BACF80B260A33E842C5BEC83C763B6AE73701A76A' : true,
+ '31C4E7F6630486BF42150967E951D3DA5ED8D382AA596FD571231CA96E0F352E' : true,
+ '31F411310C7FCAAF8CC265F557CF93BF32E5E277589E932442A3A840E141809D' : true,
+ '32CFE4F78C2B8737E9A31F4E0A2513535FE242D02F1DD83C04ADA77839CC4442' : true,
+ '32D398E73D053561EC78257EB01F0945C2A38D9F80674F6F2B4B10BA35A2B4E4' : true,
+ '32FA61C84B195BCADA9A65448CD3C8CA66B1DFE252CF97D46567ACEB59BD2D83' : true,
+ '330457913F88C2037F663003C36F0B6B2B3071AD972C9A4DA54998A7CEB8B148' : true,
+ '331C02F8B180F4E4F15DFAC71D1F03F3ACA9438FEE138AC2A60264BCA35DA54A' : true,
+ '3379517964657D6F875971C1ED6218D9F890BEFC7390CA654C79A666D1989A18' : true,
+ '3386FCF2133229E0BB6481DD2149E9D87540B5277E3FC3C3DFAE50A8D81D0653' : true,
+ '339C59871E132711D25988F0DDB86E0EE5D34B119972C0A5E3C3B556BC293D74' : true,
+ '33AD12326DC0DE4AD1CCDF7B3F1E0202B8476857E1C911B056F53CC6D4A60187' : true,
+ '34CADA62CE9D32857D65E868355E258447C0111D3F78CDCF4360F5B7B9F7E3E4' : true,
+ '34F904FEE6E8CF59E4FFE90F627D688210910D0176C9B5ACF7DAE8CABA722B63' : true,
+ '357E325CD50420D15B1E6779D32E62FB6029A9710017B14CC23AD41DE08A400B' : true,
+ '35931DC7CBFF8F707BEF6D02988B66FC79B77D05DA0A09F439040F4099A69883' : true,
+ '359D692646482C906B77BC217B7C262E81B6D80441DAC6FC2E317C5A0C1A72DF' : true,
+ '35A88292416784CF9D883274B422DDA092B8692CB98FCC788C9B926987854291' : true,
+ '35C8C522026971801A41CE23438829BBA27D3902953FE183E2E3B84415F6ECEC' : true,
+ '36267B2A60E0B5997DEEE17CDBE6AC7F7D54D279C6AB4F06CD469919F442E6AE' : true,
+ '362BF6E353729E4F8FDA7D87DD726C825E2661DA801BB75B857F4DA622BB9704' : true,
+ '363C229BA74BC61CAD1DEF35B5B808146FB5D1D34E5D37C02E1FE19B5EC6C37A' : true,
+ '366B123FA1EA2FF7FDBCA0422E504C8E0AB62334AC8941D307060F5ACDFB58AA' : true,
+ '3761FB4C3FDF80BD66FB31A506612BE2B98FAC57691A6125227B4787C35C32F6' : true,
+ '379F1BE4B67E89183FCD2AB1C0A3B930DE70D33CAE2C8629819DB4951600A398' : true,
+ '37A8C0FE01BCC73FA73F8A161566E23F12C22BAD0461D7CB9D9386EB7DD63800' : true,
+ '383BB79AFA098696BE4D3605F26A60FDD7C455D31FB03BE8553C3EA348F479F2' : true,
+ '386702317DA5549A08139017D14AC498D7DD4837E0E16F91BCAD37684AA6EB97' : true,
+ '388AF939697463B651AFF01141B625DC877D0FB31CBC5E234A5526BAAB68E660' : true,
+ '392080D12E0D8985A6C35526FCCF9CFF55219D7E62E92BF05863F7CFFC42596D' : true,
+ '39CA68E75049A34F875DEE1CD6929FA61DE4B250B5060D613BA9088810D60B9A' : true,
+ '39EC99D4093CF0A60A947685856F20DBF85966FBCAB4033890361A650294A8A8' : true,
+ '3A9480EEDF0D65938DD92A7FE7E9BE4D797CEB0662CADDA2321D47C04818A57D' : true,
+ '3AFA38F8367A45AAFBA949076A38537CBAE4A0774FC4CC40BE52F944F29F7F19' : true,
+ '3B00662EE3F01FFE2C40842F0F3B76C039ABB785962E371767E89E2AFA311A74' : true,
+ '3B1FDB5890A3C11F7149C13019F3EE43D3D3A8C174E485512E946EDCBBFFFE55' : true,
+ '3B3A1C7A8131E1E6A66039972C1AEF65797E783ACC2C645CF10EEAA5F20BD297' : true,
+ '3C40EF3135CB1E82D0E6518EF75EAEDAC43DE347CB74E2A09CBC0C5A56DB2636' : true,
+ '3C49B9DC9307C6B33E0DBE135836504ACB9F6204B7172A412C28E797E56CA02A' : true,
+ '3C91A39CC52452FB91463E511257D3BFCDCA3A149EBF39978F39E55F20FB061E' : true,
+ '3C96B0CE3855D125998B8DDA63F2A37AA1FC5967949393D7428C1FA97D2542B4' : true,
+ '3CFD92A9ACFC3B9D7BF81B2994D398500413E7B57C711D711F98DB009FD142D4' : true,
+ '3D04D60DD221BA390696E262A7B522815BAD5A03B79D1176931F2AD5435D494F' : true,
+ '3D7A71BB494A12E1F21A1EB9033CBEFCD1FE81F358B131016DAF92C1C06F1A38' : true,
+ '3D81B541D1B04B15AFEF518152CF8DDDB9300EE0A1BADC916FB366FA034120ED' : true,
+ '3D9910368BB2A01AF8277EA5E26F9CFCB045DC63CEC7397EEB2827B16C0344AE' : true,
+ '3DE5855D87575043D52CE7496F7486CBD8177FCB9F8C686B55F5F0EE761B2DFF' : true,
+ '3E09F448ED5A72584FA305F82A25706D2AE756083530B4E18665DA2AE46C1410' : true,
+ '3E18B028DAFB97BD9A036F1743316C8EC963C17066E362328FEA24D6FF8B2A7C' : true,
+ '3E486CEF660870234BD56B008730D8B318B7FBD047B55939D74545B98D8176DC' : true,
+ '3E5558CB92AEDC7E01DB0FBCD0825CC0F51AA7B683ABFD01D1E5E04C8A4D716B' : true,
+ '3E7FC707C590EECFA7E9DBBD270452366C0E2F0ABA7768B3F18E7DE34B3E15BD' : true,
+ '3EA82DE5DF72699D567B865AACE54C72AFF800647415E5E49D4260F422C26DA7' : true,
+ '3EFD44B1F0C8400130C35FE003FA304C2E47FD20612A4D1C83F88723B885CE66' : true,
+ '3FC8022D0C28EBFD45DC1D07E14F9E83F0CAD2E7ECEDBFDB991E01EBF2400F54' : true,
+ '3FC92874F07DB0DEE11CCB2CA7BDF187641DC78ECE4C76E71B2253FBBC17E3FE' : true,
+ '3FCBCC65096D7D731244167CCEAA21757E56D6EFC05A632AB3E062643E5B380F' : true,
+ '402FA5AD0E7932A07356FB849DCC1AEF11649D516ED1C5617C48F3E7F9B02356' : true,
+ '4093A7B65486890D2575D57070237C586DC489B3A68FA913DEF136370F2DDF9F' : true,
+ '40E66AA57071722F0B8E8B59A74998F82E8D5020BDDBB35D0E941851ED11921D' : true,
+ '4147C9CD6ECA16D7C6A8939E15E419220C822956FE754DCB2F08F2C78A99C3DC' : true,
+ '414CB8A3E4E86E2B4E03EB2FE71312CFE17B78945B41597F8E03AF04CFFAECC9' : true,
+ '4196DA17789961AAEB04CEBF7F1F77621F89102F48350D3B95E66E955FA8AA8D' : true,
+ '4247E57738776992C6640ACA48156C9DE580F0A739CAF0A353CDDFE3417F7C46' : true,
+ '4248F09AC0B07BCF41B413A2D8FF50AC42C6943D6F6D20F9C37502FDD2315171' : true,
+ '426334353C51D4E625F2DE937D9AD9FE6769E0F4E1425AF23D7802385103B583' : true,
+ '429DA945C771332087229D2822684175DC050F832EB9F0ED90F868E99B6FBFC1' : true,
+ '42D6DFA920BABBF7876416C3F5B30598040F6A748F22E3C3E0E2D32DEF098AD1' : true,
+ '431F835569D356C0C577FFCF90DDBF9B17E16D7FA9027888B708071B696E818F' : true,
+ '4321F690235447D71149C54E13896C885D07524C80CBA133428E1BD235123234' : true,
+ '43555C20820B179886354E63251A21247292B3B7BA46D8BEE860A0313258136A' : true,
+ '4373B2B85D4FEFE97E79B4C7935AD1762380D97FAE2C64FD61E58593F8BC8C4A' : true,
+ '43CFA30A34E75D16640693DF32B691B40219631AFFFC6A09DA97006AFD2811FC' : true,
+ '44338B3B7D1302BEC14439BFF723B5AF93DC549A7E1E417112C76C1455108EB3' : true,
+ '44CE10B295D3908C5CB40661F3F07EA13B27A31F32041B79D12AB7F5250B4227' : true,
+ '44CE6D5CE40E8F7BE79569A66792B181CA71DF0C80D3CEDA59A151F2E7CD32E3' : true,
+ '4533B5CC20DF3613F517118ED8D5AA328EDE18610AE99E16A5B6AF21EC0FFE17' : true,
+ '45CFA75EF370F3B3C2271E4AA0F99106B3339B6FEFDA5B335CC863F0C6F66323' : true,
+ '4603C35A8304F6057C253381D39404E8B40AE0958B4EB2CEAB7777CD85802C0C' : true,
+ '46236B9468DB40FAF467AFB0C35B517E514251530785695F54440E6730AAE44A' : true,
+ '46584E2D9BFE069862BC6449C85E904AF29A71887DCAEB14C191D75ED0AC1FCF' : true,
+ '46853D3090658137B446AC75E481E4593CFF61E22115C348521D70EF398C05F8' : true,
+ '46C05D7E95263B17CE368AAED872817DB0517CD9F388396CF42568DF88C96C67' : true,
+ '46E74AF8240C97D2E91E118761CA4F74371BF7D2266601BAF6084BB1924B62D6' : true,
+ '475971EE29368BC1FB6B66D497096A1ABA32C66A30C7D554CB11FE848345B46D' : true,
+ '47828F3C65E9FB0113793E5B60E19A44BC9775611C44ACB65481842FEE2FA819' : true,
+ '478D230215F850914D64BD43327923DEC9E52B4F14EF5E7E9122B16F40B2733D' : true,
+ '47A1BDC994354BC3EB242FFC12768EA8633719084BB5A159E30FC4388BED59B7' : true,
+ '47BE050E9E76AE62AED5EFF6EA9F2E0DF1FF0E7A3EE2B6B68D60B3C849E070EA' : true,
+ '47E134C83737EE674C6AC46306C325701EFF7B0A4C887B968593CC1F5FCAAF0D' : true,
+ '480ABF7202B5437D84FC1F475A30A19C18C7F598BDA1375E8AB84829B966D596' : true,
+ '4810562E0CC4EFD265AC19316F353D660806DC54231D65C906C6DB1E86EEDAC2' : true,
+ '486F62E8D5F6323416CF210DDBD26A256AF9AD33F70A2C1CF8915866F74C149D' : true,
+ '48DF42F374FDCD58EB650256F421F6C1A73F663DCB8DE0972DF9421205509F8C' : true,
+ '49AC28CE0DDCDA953E64E7D131DEA9EF57169FF3280EC9FC6DAA88C943EA9E76' : true,
+ '49B7DA13E82D9DEB867193B30E48CD1279A66A6FB44236E1B93AAF62F58EE077' : true,
+ '49CB0BC132E548E6D6A5BCC31C2254016BC2A181755B5B13D1D27218404D1C74' : true,
+ '4A12F9678B1A5B4677054BDA1CB6B41AD8A4F556A184E7E4C33669EDD31EA50D' : true,
+ '4A60AA57F2A0858D4A3A9696C5652432997B73BDDE06880BB3DE7879FE79B87B' : true,
+ '4AE41D7B98B74E61B0D6EED291348B881E5531B4ECEB9940631835EF6A8CC60F' : true,
+ '4AF1D354BDAA3AB076BB6A02BAA3E1BAA2503D21ABE54B54001BCF62C0982721' : true,
+ '4B2851A38CCC082ED3A24F9DCB8C917F572D9F064CEF218D2E07ECBAAF6EDAAB' : true,
+ '4B6B616E1EE80E17D1BB037A2831C3AAD7E6CDE3D89A205D1F7D6E0854F3C21A' : true,
+ '4BF10AC1958BCBEFA06944AC7866E3458EA70E6ED97DBDDF01A84A360C3B71CA' : true,
+ '4C1A5506EA02230980E66C1CA936B268A3C453E997733E44074640CF4653594C' : true,
+ '4C3F647343026A15ADA9E047A8B4527FF88F9D01A2B7AB7241947443F75D5E96' : true,
+ '4C6FC9852280F11829BD4066C38BE6C1FE4E4C053F6126EE03D15EC3D0BD5B15' : true,
+ '4CCB36D30DA2AD2DEFBFA838DE32AE64AC8F6AE138E0A1FA46D1E0CDB688974F' : true,
+ '4CE6DB77F8EF355DF6EC2ABA7A5989DD0F2D0BB228DB5DE69BE7C83E3603C69E' : true,
+ '4CE78AB01352DC6AD84A195DD333207A43CBA0372546FEDEC9E6803DA6375403' : true,
+ '4D26A014A4C4007564C743D9BBF9C2DC9A5A881C05E549DFFDAFCD3814F3966C' : true,
+ '4D53CEABA15DE7DACABA8689C96832B59F66AC55E9E94CB595405004A1A9AF29' : true,
+ '4DC47950ADC2B7FF5A9A57167E343AFDDB27155DE0D031F25149B622E608B8CB' : true,
+ '4DD59EC33898319B54EE610C9A4DA78A87504FB8631FCA5783223F306529FABF' : true,
+ '4DDCB0EAA387111F7C2E0355AFF2C3325514BD9D9A3812295F7506999838B7ED' : true,
+ '4E0E281DBED708FB0AF032A0233F134D3BD309224DD8BE9894E749D1AE9BA37D' : true,
+ '4E5AD8D52C37A505176F9BA95BAF43CB5FD5A7FC4654DC71178ABEA8188E7ED6' : true,
+ '4E88949F1AA84802EB493CA5C6CDA9C6DED49A4DBA0C8453139C89A9CEC2E041' : true,
+ '4ED3C78D58943651EDB04EDDCB696F91F7B33450831CB18ACE714720AF4523EA' : true,
+ '4F212E4C3A8E4EA8F7D258A988D5930F05A8E61E78D86DBF9478DA2DE8F01B54' : true,
+ '509A3662D987A2D5D9CE7943D1878A36DFC4A786CC185CC9DE1D58E15E2EE02A' : true,
+ '50C1358C5AA5556E967E2CCC1397BEA364DE2E7C6704B6950E423AD5D5BBE798' : true,
+ '50D5DCC8D0668D34E90722924EB28C37C803E34156DE8E61DAB296DBD37F5993' : true,
+ '5112E6A8D06852BA07669C1DF31EFA1BA2BE7894C3F0F7B7282FEEBB698F7F4F' : true,
+ '512EFAAE67E525C0DC3D7AF491ABA9FFA1B7439031207D293622E9286F0BB562' : true,
+ '51452CADA5B15129E04773A1BAFC3166F56C59B4CCF905060BA52EB6A877E1E9' : true,
+ '5184A3AD148B610511D8D02CFBCD2993AFC3BBD576721B617FE7CB1DF53C070D' : true,
+ '51ABE9BEDE2D96CA84110007FD6626F0ADF9881A3C74870C119CEDBFF2B4CE54' : true,
+ '51EE14CDF007AFBCE34D598602831B21661F6FD7B6C04B0D34817757B4D007D7' : true,
+ '52B8E665B8191D828F946C041ABC28AC6A5719A4AA21B1C403F7611F11A84F31' : true,
+ '52C584E4DA8D3FD6FD63E83B2EA0FD6D98DB0413776C26122FF0420A3F0F91A0' : true,
+ '52F208427F03726C6DE3F5308C776D690F580EA39DDB01595DFB54364C48377D' : true,
+ '5376577409E17E8F37B2CC6FD486FBD356FF2AD0B5EF520DB7CDAD06C6A6F3E0' : true,
+ '538735DC5CF27D0DACB0FBC4FC24E0598D8838682CBE3DA8C37CDA60F60BE64C' : true,
+ '53C57169154423529775809598828294B218B2D2AFBCD3F2561FD072376CA188' : true,
+ '552771717F5948A7FBF93067CF25E5D1D67A63C8A3DD09EF98603165874E3281' : true,
+ '5545F754EE0194995FACDF3F30F3E6A8B0749DD750B0B5964B16A5D9B21E9FAC' : true,
+ '55E0EF8E07B79720C78F3E2303981BAC4BE4FB417D858E3531716DEA81BB8D67' : true,
+ '56B5B8AD95FC9A853F180196FAF9BF2896A8D2E053474ECA3A19295B1D214AD1' : true,
+ '56B6BEB3100D40CAB0EA4E450188CDDA653F473F3F182578AAB314006E66FA5C' : true,
+ '56CC8586CAB1C99C3EA4C1D35E91FAA568DED02AA74364D08F480A0EEE4E4FF7' : true,
+ '57383F2DCB3A5959514A8C0CB208205EEF70D3A899BEA2AA7D1B6FD13BB23BD8' : true,
+ '57A0B57635F2D75EBC9C3B166E68E35E1CF91BD074AA9D5CBCB3359D93F02859' : true,
+ '585CCB444BDE628F6778320DE64727701AABA22F826C31063082CFC5835742BB' : true,
+ '597C180F976AF183984FD9B1D015D000C55AF0B873FE4A4F8E782D191285BAC1' : true,
+ '5999169B7C3C7ED6E94A194BF0DFF7D07EB7581BE8C82E77B83DE42263F6A673' : true,
+ '59E0DDB8377B568DA0FC1E2B7C482CC6331DA441F85E7F52FA8AE280DA90D051' : true,
+ '59FF0CC641EA56CD3670E81E4BD76A487163C70CCA729E0710D49AD1EAD70634' : true,
+ '5AA16CEF791C27E12F900F07D5FC9D0B3386A1FCCF2F547D08E94AD34BABB775' : true,
+ '5AA7341552FF047164227AEFB41437582F7116D76B854F54920A5D6A9B72271C' : true,
+ '5AEDDAC786E11B696A37E5506BF5CB702A3B803BC8506BBFF720788401D595A2' : true,
+ '5AFD1775AD2CAA741FCF1201AE206C4A1286C0DBF751AC035BAADE571F002927' : true,
+ '5B11479053C46A16C629C58DD5EB40529814B75A6BBDCD6BD6FC6BA9483D9669' : true,
+ '5B1D47E25C53FAFDB2894D342FB536794A99B4D0F4C0BB994DAC22CF9247F166' : true,
+ '5B67A7FC34D1885F7351DC949794160E0DB6E6C193286145DF8E483F21E90B80' : true,
+ '5B9F8603E75E06129C216E4A2DF6FB4EC184CE685F6C229BB85233DFFD2335A6' : true,
+ '5C07B9D0BC6C5C3634102DAF631A330FC02BF579A3421E1B8483E076953FCDF5' : true,
+ '5C2484F4DCA59EC5D77C5935BF71EC473995A9F7D39B0F26D2264A279C6DEC96' : true,
+ '5C25116119EA6FCA1D13D54D4870475E5B3D34B060605E02F9C7521D3EC47441' : true,
+ '5C34509E57E6B30A28891841EFB2A5F0D051493059DD80157C19B2822A97EAF4' : true,
+ '5C95EA9F41391B1D2609E3CBFEDDC0B9B865326B4526176D5305DF2EEF5AED52' : true,
+ '5CDF3C4C27BB3B1BBE8C6AB81EFF3FA995BBDFE662A0BCDED869E462BE748486' : true,
+ '5CE0E2F94DE7BFC370B5C429E1CE1A0635E4F38D55BAF122748D4307F1709DE9' : true,
+ '5CF08039C4F9AC5947E941DB6D681C0CD7971AD6E068262D919060C1A66D5FB2' : true,
+ '5D2112B7777AF1BBA029F1DB3D166086C0379669C01C03FCB1667645F32EAA35' : true,
+ '5D5F5FC12AC675264FB7F2783EF62458304D84B09BF62E19EC1B91243E3E5487' : true,
+ '5D77443F3FFBBAEAB8C88714A8EEE37196F7D9CE89517806EDBF897DE0215763' : true,
+ '5DB16AA171CA274D753222AA4EC17827814F5A69CFE72D092397F048CEEB2370' : true,
+ '5DFF17B36C6CED5E5607FC2A8B6559964A23AB8B08181E1CAC94E3B213767A1B' : true,
+ '5E579D296D274F9A01D1E1A7410A24029948FFA01595E64BD2E492EEFDD1F702' : true,
+ '5EC75158F235F80BBFC25F40D96AB89CC35D8578BAD11410B5D32CC33428A00E' : true,
+ '5F05ACF54EAA38008B650AAA2DBB3722805C793616B1A21B43E1879107254E38' : true,
+ '5F6795C104B707429A3E966D32F847FF1B18497C73A45F6EA5E47378EF1D3823' : true,
+ '5F98F1AC11CB74885CCC871AB7CB1B95989E9E3E7482BDFC32895A65A783AFE9' : true,
+ '5FB819ACDB4D470232F59DBE853A5BC55C3713062ED6F75AD35982304E14B32A' : true,
+ '5FCCA125301032F32C5C915A1AF5191FB7E0ADB6E36AB4210099490CF54C2C27' : true,
+ '5FEFA4F01BA5AA16F36E2A4125C2E0F808B9503355BF09B3189A623B8EA42E69' : true,
+ '5FFD23170DA2D4AF8278447F473A80F69D41889D6C91F3A598E41B4C1170E43E' : true,
+ '60234A884EF08293BDFED2AA0F7A12164317F1453966758A66FEA4AA422E9A14' : true,
+ '6085325DD4C19C14024B66E50D6FB600D161AE12B569A70B9C1EFFECBE9C2A3D' : true,
+ '60B1AE233D6CEE231FA2D0B3D5888FC9842087D2ABB3CBCC6E9C230D974F5D7E' : true,
+ '60B7233177358390EAA910658D1D063B57CC3D5B76F70E521CB81E39DB9AD50C' : true,
+ '60CC6E8C652D1CCBFFA42DAD8158217DFB7F42B9EEF9DBDB795ED372EB2AA728' : true,
+ '613E70A1BE3CA6314EDB7C00B2477990271E0C8DE8210EED56ACD391E8CFF28F' : true,
+ '6167E58071C283AEE1B24B692C593747D5FAD1B3A001B1CF11569E80FDA44152' : true,
+ '61F83ABFF7740C9144959145660E563D682A8D21E20B92AF581237F621A5187C' : true,
+ '623760585A2256D234ACE51A98E31B982EB5E5BA2D3CBD673C747FC832529F60' : true,
+ '624A2686ED8B75686FCCC3FD9DB8284E94981BF30BDD2453817BD653F3BD9CF2' : true,
+ '626042CAC6DE8C95C77C0E732144FCBD63418D72ED04CCB42FCBF260B38B21D5' : true,
+ '62C06D5EC111BEA1222B57F5BF5FA974B5025C3554BCFC2677048DF4A2EC0170' : true,
+ '62C4876E637B0361493822910A5FEBD70113B70407AEE4FDEBF249585FC4A069' : true,
+ '62C9A052080F8EBA5E8FEB9615B5CDDFFF1D74F8467653030CB1BA12337EB5D7' : true,
+ '63448627F20BDD4F11B278941D82DE56AD3A689CC06064D867FF060FCFE29A49' : true,
+ '634783AC64589BF61818D6D57D8C3628FBECF3354AE91725CC1CC3A6B62E4E0E' : true,
+ '63591FA550D322410D6B2617A3B70A23046032A8CB2F96F2CFFF9111D46489BB' : true,
+ '635B65E10638CE83AC12795BB42A235C6DF75DCE35AB6901255D4A3B0DE05FA0' : true,
+ '63C46A097FF0E3D00C6ACAC2029979168DC83ACF453ABD79E9502AEDFC9736A2' : true,
+ '63DBD2E32AFC1025D4AC5CABF8E6E61ED4DF6D0DE50533BFBD6E3918F40E6EEB' : true,
+ '63E6A22E453B17B4EA3E35C6E39EB315DBB77A237B1BBA9BFB2B3BCF675A63B9' : true,
+ '64261C63D988D7AD86D209177AEF7DB6EE3E62151B54C6FADF8F100C2750D0CB' : true,
+ '644E41BA23C44182CD1D12265833CF5D62553B2192496B051118DE945E0B5BBC' : true,
+ '64831454483CA9CA55859BBD324F492638DA8179EAAED19EA3CC8E16FCE7A83B' : true,
+ '65B9EA850436692D74A1A350E112A63BB4F2B9E4B10A602707ADBEFE76B247F2' : true,
+ '65E435C88F831D080BA50F37D0668230281DB9A679D705FBA84820A44D822540' : true,
+ '668B926F5EAA59F351B7ABFCBBE5FA17B547B01C5A7D4AE385736CE8FD13359E' : true,
+ '66E91987E1C56D61C6210022B93C24BBFA83C039C8C13E71A4E949A252792B77' : true,
+ '66E9E8A83F938165FE2D1F3E6669FD46132CFF7A2F99E5D23CC3CEEE0A07EFDA' : true,
+ '66F68579A292313FF975514DFBE38463C59215775C62323FD02302F539E3B252' : true,
+ '671DBED9969959A1ADA0F9DBAAFB7DD35CB71FB06D0337DB178E34BB5CAFA9C1' : true,
+ '676EC356B302BAC4392ABCD0702056E398C3092F6F3C66B61CA17171FB8196A5' : true,
+ '67E6D8DB673E4B9ADC12C134F94EFEBC055068A7B255AC721582D7AE3FCD3D6C' : true,
+ '68EE7C99FB1E2B8F0DA74C5339E58C6A1F7C2697CDE363B2A8A6D8E012D2C773' : true,
+ '692C08B2A888E8B373FCCDB491C531D58002CAC55188368BB037DDA1F2C829F5' : true,
+ '692C7B1D9E68C51DE61E300811DE5521D900BFBE44AA0E5211A4622C51A1193F' : true,
+ '6981222723F6C1FB0E7C14D8181D0799F0657E123C470C759F70A78D995B7102' : true,
+ '69A828B3AAE09B3F1EFBC53DB56353AF2444809A08F188668225B2A0EB520FC3' : true,
+ '69C135C5854B93D0B081254262DAFDB0FB3C0603D45EE6F5E91BD6678CF5A6E9' : true,
+ '69D7A817007EC6958CDE66700AE1372870F1AE4710026D3F93EE1A15E024C880' : true,
+ '69EEB2BDE9BE075A2C6927DCF5DB9E9427FBD153953D3843BE5151A6ECC3D560' : true,
+ '6A14524124841DA5A7C0A27539973C88C77C79EE8C190068EAAA9218CC35AE76' : true,
+ '6A525C84FBFEF83BEA806634766F1530D9C5964DFAE49BD2F678984AF29FB474' : true,
+ '6ABF9C8C111E6353439EF682EDBFECE4F8AF8029D4E9F3F0E638C27A347DBA14' : true,
+ '6AC112C1828538894A1FAC7CECE0ACFEE75658118041513498E880274BD2B7C9' : true,
+ '6B02CD14A3675354A800006220E94D8D4D5F9774D60EC984955FF720D927E529' : true,
+ '6B59DAD53B5D9FAD67626890D678177BE94BBD7C8E7815986BB28C09BD60E9D2' : true,
+ '6BF07AE522AE438A1736D449CDFF0D8F72F7690C120CD9F51FA2CF88160E8980' : true,
+ '6C636B0095B2D2ADC0DA3BEA01B82A14130410220A5692C3FA2F374E07EC03AA' : true,
+ '6CC97CE9EB4776E7E4EE831B97F15D992FDDE766B9AA2233B41770271C0BDD88' : true,
+ '6D13CD353D7F6723CC79620F59D5ADC6FF6FD185B9482C0D3044B69E8B60434B' : true,
+ '6D3BBB6612DF6B07FDB7630F79AE3C8B7609A853AC5E95FA5061E4248BE9CE97' : true,
+ '6DDA1CB95F5505512C2759E9F6ACB12B2F66CDEA160527EFA91D2F1CE057079F' : true,
+ '6DF2BF0E57C2A025F1FFACF32B574A50464D613CA9873BD8DF692B62CB1DFD74' : true,
+ '6DF8AC95B45A03538483369BAEE17EC1610F591F633E29A9A4DFD0C29E28397D' : true,
+ '6E01105B0FBC4CEC9790A2501D4DC5536754CD3B71480AB7C200B7A671A643B5' : true,
+ '6E61AF6B9F05C441F3AE6B3FE2D5A6ECF9885A2B223703D1C9660D14E6102F7F' : true,
+ '6E7E91E395DCD00520BAB2D41630963493456B73BF32E23ACBF4C2BBD5F0A703' : true,
+ '6E8D6125A9037938869D2D9C291AC9A2AC3731A6E7429D9E2037970069B7659C' : true,
+ '6E95E8980B03A9FF276C6A4F68B46DE8D29410A9FCF4285633DA91647BE7E10C' : true,
+ '6F6CA3B04E355CFF85B89EEB861EDD2D91CC874EEFE99A2D9B0A3095653D9E97' : true,
+ '6F8652847DB9289EECB5A58CA15FA522DA5F26A60E0BAFAA1BAAA37B32FBF465' : true,
+ '6FBABED892623FA77A93005871EF0A6374050AE9F3D3A346A8BD4558EE3959C1' : true,
+ '6FCE4CF77E254C2920BE515857DAB1929ECE7638DD8C370C1AF6A374F36517A6' : true,
+ '701E5C167D1D2A47E29F6E0EF64D59D978CA3287D20E3590ABF531EEFDDD885F' : true,
+ '70202315E3423BCD73E6A3CE51D0F541A78350111E683D8BA64AE9271A9C6369' : true,
+ '7066B709F68AFBA83E93FC497B97DAEE440AA3B27F8E6E32DFBB1365C3F2EE68' : true,
+ '70751440BEBC64501417A81F17FDB0FD31052D19DC361383EDE63E647ED1D8DA' : true,
+ '7081C7813097A8602BE2DFE4BF202EF4574BCD4DDF51FE8C7A2F872F93481E83' : true,
+ '709A501B0835742664FB4C650498359C1576F74186B0D12129A6E96A5C09080F' : true,
+ '70EE22590F5CFBBC659A9EA9BCFA0C876694116323562076D6FA6471E79907E9' : true,
+ '71168AF1899C2122E92CE1FAFCB2EE64B9CDE6D14069E7412F492C9078704F26' : true,
+ '713C52C05CB8B1EA3B27FBBE33649956A33D8E1AC4F222EC3B90428E52C28E00' : true,
+ '714F1E26865618BA75AD738AD3B843B14D776EC9B7D617CA4E7C2DBC98C8E7D2' : true,
+ '7180F1CD379E01A81DB181F3A839C48E64734FD493D1013367A7287181C4A7DA' : true,
+ '72FB0C9D7767CD725184EC22406246CC4E130E49E4630E2D5BF248187EA583D0' : true,
+ '72FC451177A264EC01165ACC89684C137EB92467BB44EE64962C5D1AED5F8409' : true,
+ '731D2388EDB673DEAA419BD26B43D6AE7D27EFDFB47B6A1124EB20D30F90965F' : true,
+ '7356E86E8C181E623D168491A780BA7011327CF716B416619FED3C3878A425B5' : true,
+ '73B26EBA4831AC03380E60772E12BE78303E9A6816058678BC432BA8D640B3F6' : true,
+ '745D3184B509466217C4305CF4082681DA91C917D7C176D5C8FB8C9810C1EFF0' : true,
+ '7464C196FA42968ABF359C05DE1A029FA4CC551380CBBE661CCBFBB1C7865E70' : true,
+ '74711F9774C66CEC41DE4FD32197132B13A40A6758A106DC95BCADB9298A6241' : true,
+ '747E80C10894375B82C313C81766E6757B1B28E5BAE75AAB0BDE87A9242E8655' : true,
+ '74C7149B1B6739C22FC0102A7EA2DBCA770432A85F2095812DC7961831F73EC2' : true,
+ '74D4CF230B19F9B9E3C674DB1B1754DEBA59A837534135CEA2A9DA3496876FD2' : true,
+ '74E0485AFE164965FF9F982F0999B980CF05DE73016EB7F6B38B105A5E07564D' : true,
+ '750C7E44BD7AE01B7D2ABEE54139FF35FC53DDE34A4E0802432CB08764E211C5' : true,
+ '7567AE3D698B690FB2349D4468F155CEFE64ED1975B768E791D934332970791B' : true,
+ '7572D3C2860E9D28159C0337E8DC7C693F307AE0F1F02E0C35E091AC1C1571F6' : true,
+ '75B0A587771EFCF6AD7AF92EFBDEFF0F4E5CAF9883AF521B9B13C78D247B5A4E' : true,
+ '75B50B0EBC80D619AC5A04DBDF5C622B1FBEE1F299594B0E4CD6B6363BEFF8CB' : true,
+ '75F12E7E7FEE1F0AE3C22D1B94D33E4A31EC9C3B0B30338AF4EAD52856A11D26' : true,
+ '7607259BFE14402887557E6AC9BB570FD9D3927DA048FF9C7926758ECE32B824' : true,
+ '7633A1503B4C364C9C55BAAE30CC899238244FC16BEEDF7DC22E54CB9B569A6C' : true,
+ '765511648B44C53C9335BA4041B2808D4B9BE5A3223FFB901ED32673D5898A4A' : true,
+ '767EB0B508322CA5B9E37A4A1CE1CC43F5AFEB557D509AD50261F25DA73ED0DE' : true,
+ '76A266265F7454F38CBC307C9FECDBE80081097444B97BCA9C722D93219EA358' : true,
+ '76B1A25306D53B410FE5318EF1D077B29081025ADDD40CA55ED4A0A1EF557E65' : true,
+ '76EBE04192726D45EAEF654FC3DFE992E2297DFDEE303BBE89C8F425269F41E7' : true,
+ '770784FC2B1A52F110194800E972006E868F055C52A8BE467F3AD7BCD7E441CC' : true,
+ '77C5EFEDC19C242BDC746C5EF4A1DF4117918CBE078CF6DD65FC274DB64CFBAD' : true,
+ '77CDA7C1BAC564BA322B350C6CEC0B9E813104332905F2D556603B8F661AC19A' : true,
+ '78C30D03D640DB32D06E482ABA1084A967544E9081BE94CA87CA4FBC2141C6E9' : true,
+ '79244B0AFBB3B26770A470A4F23555757DC25D3856F56D0096D9F06EB47D5889' : true,
+ '792EE0B202E6A45AAA85E918497D9C9F16FEAC99500A7940C0FC812ECC42120C' : true,
+ '79B0B3A8D1BDB11D40FE8B93868460B339CEE667DE3E94C880AD9BB14E50CBFD' : true,
+ '79B893E3487215CD87BE3BB3CD5CE1359CF8385BEA49A5E45BD03624A0DB3D08' : true,
+ '79F9792935CFEB56CBCCF76F92C17E93606B2774C0F3618F2DE9BFE9506AA04F' : true,
+ '7A081DEE8006EF40615953A1EF9BA820BADAA31338157E69660B3EBE7852838C' : true,
+ '7A0F440C38F18E15DE15BBD496D670B48571AC7A71EE56F0F696E26FE1C06C92' : true,
+ '7A898AD8A9DC791DD00EC4F1C6CA3F1AFBF711D2A26E99E6D0740B1B5FCEFA49' : true,
+ '7A938A727247270556F67BCA523A333A2F22573331A6D696E6C559302C9C1912' : true,
+ '7B3234A53D173A266510B9777DBDA7F372E40651E07B910899A0C1063A560787' : true,
+ '7B40E5E9E8A2F63FFF19CE2F4EFEC73C902CD146E75DF866ED274651288DEC80' : true,
+ '7B45E99CAD17290A002ED52128572713BDD96FC1544094FE297EDF28E4D40063' : true,
+ '7B6DCA23E77F3424FAA26C0DB800ACB6E3BBC3DC13A11EE4679049EE3DF03A02' : true,
+ '7C6BB49D3E96F1125169FEB59751BE733ABD4F0D2860EA0A8F1A5C9B14A62968' : true,
+ '7CE1119D84CDCA99D2C1040485C894E22A02106EEEAB39FD20650BFBF7CC5948' : true,
+ '7CEE465792A72473B5B70A88F140AA27C5DAFC6C876AD88D2E45423D9CDC6C06' : true,
+ '7D100CF85EE12F47C6C9755F00CEDCEBBFA513CEC80993AE5E7FAF6F68289C23' : true,
+ '7D3EF8DEBFDDD39FA7CA90EAC62E660639521686926488A315B10FB2A0005F6A' : true,
+ '7D7753734C01837BEC44A0E459A049D96683FF8D0DB78878C3BEC4C9574B412A' : true,
+ '7D817F280F1D664E0C9E717287D6AADB1132D4F3A3E2001B94009119733C9434' : true,
+ '7D886B62A526E2B996C9F715AC5B23D07EDA09AD69D18E8F54F5210166AE0C8D' : true,
+ '7DAB96077DBBA3345EB176EDF7919AF6889938AFD1D9BD32105BD82B0D1CBCA1' : true,
+ '7DBF7C36818F0BBE711267E6192080F75CE8908B48C9E6EB9626DD9B05308A7D' : true,
+ '7DE8C95508E4933243E3EC7D7C222F82A250E1B71C5619C547FCDA51146392FD' : true,
+ '7E0CD7D375698FDB4C4FFDA33ECBEEDCC86ECE5ED8942F85B216B022812A3504' : true,
+ '7E47F4F45DE3FCA19673D070AA99E0DBFD6049A98B94D090B6B2168A1347D6E7' : true,
+ '7E770FF8F54B17E68443C8D43DCF1661C1082C024BF46DC66716D39B7BC6FA80' : true,
+ '7F0F7FB9B5975CD10469ECD29F69E5C11CDE9EC561684535E8A36CBC514D3DBC' : true,
+ '7F3B3BE589085EF5F314845A6F850F9411F0594FAFDDF725D3AD3BB189BBBE99' : true,
+ '7FCD0B25EEE0A63FA151354DC39D42CA58AC10D8ED9EB4E0B215C652C07D4E28' : true,
+ '8035EB81467C64D22C3624A58022AF1B5D0D4047328109CABB74CE6B580A9A8E' : true,
+ '806791E1F1BCA3B3AFECAB7D1EC6FD66C2616C6CF13A3256AF0D53AB0A759BCF' : true,
+ '8126A7034869686473438C4C7C005631DF665491A9CE81D9B3ABAA27D327CF75' : true,
+ '813CF894750BE7FE8A0C8B5003B362D62D400F6F08BC1FCABF247172A63B17E7' : true,
+ '814461D429FB2539D44E02913E03F0698FC1ECFF7894260AD3AA9C2716B99E0B' : true,
+ '81A524F4768E8D164B51E023E9FDC90DFBD9EB3D6111C0DA5328B8743253BE8A' : true,
+ '81C82F1726447A63776BE2F5E36CC6DEDF0C62F3B11C7C8B7CE17E10309C4569' : true,
+ '81F32F8C3E868A588E5F34A64C6FBDB483891716BABC5C59D75391A58D8C6146' : true,
+ '8249977B7E0D31F533255488A5416349A1C6AAA59C330D6274C82364324C3870' : true,
+ '8256476D83180014AF0D76C02D405990926003E2052E205DD66B158E69DAD7AC' : true,
+ '82668C1629CB39A7B5D9DF6BC94349FA113F915999799DDFE31FF1862FACD095' : true,
+ '82C49DF2DF809141CB5FB30EAA8E41A3E510AC7F51CF203FAC2B16F20C96C2E4' : true,
+ '82D1AEF2AFC46271D18C5FE50811DF9A5EAB812156C2FE6F531A34FD529E75A9' : true,
+ '837CFD4C8E9033F38B46225EAF78A12DA6636DAA0CCA197FC964B51092C55634' : true,
+ '83BBDAE22AE7CC2EEC0698B2435650633DEE4E0DCF849789C974976D4D641C33' : true,
+ '83DD8D43E88B8D6ABAEA06F3A3A2455C8F6F79059923A08A8D2AF33233F5A63F' : true,
+ '840B5405310320AE110F3410F585B799CE365AC1076CA0CDCD94CA6867A9166A' : true,
+ '84A8C623C4304D57CE03893ACBF4E51FC9975C58658B89127508E5C33BE992A7' : true,
+ '84F98B7850FF7A169D5642E9EF4401DDEBE465DFD5BE957C9EF18CE9988C11AD' : true,
+ '8524BF9691E1C2AB2BA091218096105A335A0315C8282E59B6E8346B11E36608' : true,
+ '8583DD0B4F3B4EF42A66A8D6E369B1E2FCB8B7C64846B242384DF6B8FA0570BD' : true,
+ '85C4AABFC4B38B9B5D0A4B854DC02527DEC6BA1761B28F5698141AE36ECB15D1' : true,
+ '85DFEE3DF0EC8DFD281A3DE35C80A220A42FC9CFA1EA353349D98FBB58DB6E64' : true,
+ '86154D1D0FD89E4E1FCF72511C74A8B2B0DDF4F38E675B649192ED0C9DAF84CE' : true,
+ '8685E22CF1BE901D8E954A0674DB6EC013D9627DDC9FB81D3EEF752BB410DCB5' : true,
+ '87108514AFAE3DC15C9F52574F918D7FAE18350602652906E289802FC543E61E' : true,
+ '8769B55BC6349F2874697988D13507CC28F9EC6630431A7A9D360046DCBB3190' : true,
+ '8769C6220722FE98F6EA21C5456ED2BFDD9112CBAE15847B239AFB2E6A630DBF' : true,
+ '87C002662AAAB5BE7B6A7CF4B1CE9036E3A2A70A0A3CD80F64005C889ECCDDBE' : true,
+ '87D35135D0372CC692C261453242880BE00159B60C2450AC7D7B84DF963FCF8B' : true,
+ '87D61B9AF0E0A2D9F836AC304E2F5A84C543275820BC4BABBE3B75A0D182DAA0' : true,
+ '8858520A8D4E5C88D777C33963CC7F43E796B555E7FC573681B59DCFAFB43EFA' : true,
+ '887A5D0381838CCC20D204BBCFFDD864AB71C20D2BA06842921BD96BB171A796' : true,
+ '88BDA25A602E57FFD8A0837257CE1618DEA23AFB0051874072E85CD98F740F07' : true,
+ '88EBF5BCAB2CF8C43095EC58E1BD0E375518B5C734CDC394BEB34F3A7B0480EC' : true,
+ '8919E46CD5418E4CBC8FEA766240D5918B48BB28BAE25743EB276B996E6E7B73' : true,
+ '89489486E767E3C410896A44B28109680C653391FA763E7A21ED1FEB13540DFE' : true,
+ '8974A885ADD3112CB168E00C10557410A89955EDFA94CCC4EBA3F5A51759D8E5' : true,
+ '899F08AAF5A4105B9B6CD106464D7634D5B27A444CDBC70264B8CFB56D290DEF' : true,
+ '89CBF98E81A0F82966E19BF3BB997A2E0BCC7C90FB83A2D4627FB311B6FD1D58' : true,
+ '89F5AB7CB2C9A8F6123C4D2F3F4FE378BEEE92B2EF506202BFE847DB058631E8' : true,
+ '8BA43B5CC73958FF059423C2AC018F994F6FE3A7E88C4B4E6E89ADEC692FF1E9' : true,
+ '8BB672CAE5B222514864A8E4FB8C89A774200D7773F2A56347C75D5094514C74' : true,
+ '8BE5E1A7C8736600D204B7C20EDDA49E72107EDA9AA5E03F971FB24FA8F8C686' : true,
+ '8C2DDBA5CA9E4CF79937A5A3AFCA79F371B6F235B37308EB53ADF12C319A7EC9' : true,
+ '8C6DDA18A4CB339717E1321FBFDC9A3ACC52F2FEF6FB453EA389A2B43FFFC63C' : true,
+ '8C7CFA7D4BB49D306857772722769DB1FB9CDC09F565F22A8EC082D956E93694' : true,
+ '8C85C2F6E697880B740C96BF35FAA02B4B2F718DDBC4A8ED6ECF9EBD7FBEC1E4' : true,
+ '8CB93E0ED93C6730B58CC0314B8158A7A92184312C53A7CDABF05B369CC7E730' : true,
+ '8D0CF6F0B227BE9394DA0DADABAB81A44900D104A915645ABF030220F3AE187C' : true,
+ '8D0EC1B68E24C1C390A7DCE081085A14CB27FE8B5CE652A60529E04825F289DC' : true,
+ '8D7E00642EF079DCB1B9DE964075E3FD44C63D7DD6493AA3507D87D0E277CD25' : true,
+ '8E6419A3781E9E9C262AFDF8318332504EEA56B39EF770B9882523D132B85AE9' : true,
+ '8F8515B35B665B69D0DB9661EAE9FF0829B71CF4AFEB3BBF988BEE73985F5D3B' : true,
+ '8F9CE539058EA5E0587C8E79E554DBFD1971FDE7C5A96DD1EF7277AFC2EF70D3' : true,
+ '8FDA31393381A23479C8BFCADEA59DA75A1C390693F72CB7B546C641BC698256' : true,
+ '8FDDF56677555109B03ACCF8F39EAF657767096D71F1652125BBF487FC6BAEFC' : true,
+ '903081B318092837E460229248FA67A70B01EC6DF9C9D279188ACED18F1E6BB8' : true,
+ '905AF56BB5517C973A43C5B576B40C5EB69F00E615BEAA8538D294E40BBA836C' : true,
+ '90859FF52A82829F7DC99392C6AAD9F346F54ED3D468426C26233AD5D189FBC7' : true,
+ '90BDE9F4CB3DD673BDB6C641361BD8B076A985903DF004AF7E74DAD95EF82E50' : true,
+ '90D6AE9953E31E3DA34A67533E444BC924E67CC2C610FA468DB31E59B1A35471' : true,
+ '90FF35B27260290E94BE3E2FD6F62F412A3FF4303E38ACF6315E190A1980A095' : true,
+ '916A17B983FBECECABBDBC4ECA80A330919B2EC1F3F4BE4A54832B3874EEE5AF' : true,
+ '91CD0D276921BD32F4C8616BF2676078C24E39AE1B30943C5263AE0377F41F21' : true,
+ '91CE410FCEA8EC201D33AB8E7419BC60E8EC83509B51D10BBAD728E2B6EAFB1C' : true,
+ '91EE28B14AB2C7571BE6CDE2D75FD4C05C960FB033DA819EDD463D5D3C494591' : true,
+ '92624A843DE27E186FB6C18ADEE88F30E00A984E44BAB93108BFF565AFFD2A15' : true,
+ '927546232861B1DE9D105031E4A2502A170A06D65340705EE3D7ADDD34F9FE0A' : true,
+ '930971709C7B3F9D52B30CD42E61D03BB430A1D8641F685F5A9F730760FC78A5' : true,
+ '9343EA576B49D46887962DA39BEBE09276ED97EBDF47A82AA8CA4F28A04AC789' : true,
+ '936EC5E6437D79832DE6B015C38725C84A4638D73770965D82F3CBA4EC35C0BA' : true,
+ '9394C03EA88D9DCD628AACC140CF1FAAEC364252F318F577380BF2623009DFFF' : true,
+ '93AFEA0BFBF153CA77357087301C0F31B095EF2D5A53F7E2D02F9B13DD6E7325' : true,
+ '93D45B29473CACF1E89444ADB8FCB8C3626C278E2339E897C88C2A51119C1C25' : true,
+ '93DCEAA3D67BD8992097C446EECE4A6A02DCF89EAB0008EFAE7D0C9BE26B7C00' : true,
+ '94C5E69A5644B4BBFF863312752633025D60B905984BC297D103F7B58F8F1CAA' : true,
+ '94CE12FB5F69E4273C8F813ED37ECB954AD667BC81C4E37DD27A40C291DDB12E' : true,
+ '951E14CC4823E3E83E2DD0CE75826B7BDBCD45CB16FCB70A1CFBE6C6BE1157D0' : true,
+ '95EEDB5E6C8B8552E29D7FB0C607EC68AB3D3F88A3FF97F4C70D7BA9D69C8521' : true,
+ '9658D54C28C27DD6E9B79098D7D86C1EA32215492E8AE9DB225E3410EEBC39CE' : true,
+ '96735DA929F88A1A3292D120F963FF675FD13315DECAE2555139CCF71822F408' : true,
+ '96B9BCDC21A4E9187BC7BB7B5BB052A1953140044A59ECFB2F1DB1C0FC648FE6' : true,
+ '96BC0612871BA526E0F8AB96612077A50930AD430147A0BFD37E1BE21E0C64DD' : true,
+ '96DC92A327E33DF81946BB760B8C22FD7F74A2C9592987BA110F7A9D211F47B8' : true,
+ '974149DB587C53796C2752AE8D14C7F3E7C9A1002EECE93420AEDF52B1F48558' : true,
+ '9787EFF64AF68F280E2778414020672F24C44010549900A5A0487F11CADF9A41' : true,
+ '97907F0BB6A5CFB411D9975E742C8DD55AED77AA373C56DD74ABE6B7C9892A60' : true,
+ '97B09B0E6CD2378FA7CED47F365C77266C94B867F8F87B01D8B667D0DB2F5DC8' : true,
+ '98323FED7420A24CE2E1D0A4445B73918FA0C867BF19E2FEA18449B429D935CD' : true,
+ '984E447F3A932B79E9373A9EA9786E0637ADEE21B6EAA6B8127B05F26D7181FF' : true,
+ '98AD6C8A91B962AFCC223C26F0026802B688AE55C204BA0A4ED5BFA5619D979C' : true,
+ '98D9DCCD4C1EF004D7F000B29AC540E935ADC074DAB919F8ABBAC7507FC35EBF' : true,
+ '990477B5471E1BFF7187E419CFAFEDE674FAF3E6325182F9F8C686A2BAB085B5' : true,
+ '99E437DA5156E02DE52D0D95AFDE0FDBAF8F626F4D3BAD2FFFE7F4C75D76BD60' : true,
+ '9AE40265F51732A5A72BFE9B4C3CAA7106EE84D320F7C675C443C91550E5F701' : true,
+ '9B340670FFFA8B98B78247E2A470627E05F1AE05ADA505FDD049350B5A8521EC' : true,
+ '9B573154350FBEDA3CAC21F90DC0E59C9EB0DED7F069650E099F62B0871F3615' : true,
+ '9B80DD5C98B0F0A7AE343DBB896DBCE45DA52EB4E31BE057287A2A738D9CE3D6' : true,
+ '9B98284571E5FBB2A2BE676AE24830A6F0048748FA38D1F11CBCB252505D2E62' : true,
+ '9B9C56A1228EFF3D6520261D3CE06F38597A96199CEE7BFEE71D95F7EA6EB54D' : true,
+ '9BD01B7914B81371F2FBF23E7A0876608CAC69218A0DDB78C2AE45909744E5BE' : true,
+ '9BE0DD4F76D60653F0C3DF854026C8A73C5403B593504B80187730E6562FC67B' : true,
+ '9BF6A4CE27AD782886988DB3FC3AF54CC857946C7C5E32A9A6AB13A9F7504DB1' : true,
+ '9C0F47FE70B9E636409CD37362B052B40B3CF765DFE80E71D999E7EB1AE1D4C2' : true,
+ '9C102F918224790C649D916B43E1CC9EFC4C16ACD141E22E85F199C1C6BE7DA2' : true,
+ '9C109FBEC4A2FC259F1C89666AFC54EC974EF4CC52C858B3C612689CC8A943FF' : true,
+ '9C1C2898E71561BB2B87D8859A5066940BA97950DE95E12ED293822111EC3D35' : true,
+ '9C7F9776163746C45FBC96E2985B57C6AF769E83428F910C3EEF0918BC5CE593' : true,
+ '9CF455322FC12AA2FFE88CCC43388419F61C41ED1AEC560E11D627A009DA62EC' : true,
+ '9D484D53782C2FC0798843979D991B84A180C1A833D717AE002E75F90E954EFB' : true,
+ '9D93BBA3F1A3E4BE5D1146849473DC18A987B0CF48566E506564D4386B29C50F' : true,
+ '9DF287B6058B72D28B1B7E4A46CEC187EC1FF32561A6B681E2F6B6E5A4937F88' : true,
+ '9E2F5DDC11A878B6A7D27F9FECBF10861EF27BACAA208D8EC7ADBE2682FADE95' : true,
+ '9E531CB7619C8C0D5C97E7ED9B20C3A269ACE189AFC5D80DF6D2034BFFD0E804' : true,
+ '9E6937E5BD26C280FA683490204D1347BD8662325524F0BE4B25FC17381923E8' : true,
+ '9E837E2CEACD82AEE4D2CCFDFCCDD0331D305E5B2D123B317E2F3C0376BAC850' : true,
+ '9EA5F3B71232ACCBFFFAD71FCCD08B459DEE53DE93399DCE0A212D0034E9FE6F' : true,
+ '9ED22741CDF43DC2AA238D354F0BD95C28F1B5557ECE9489AABA4CC37CBFC9AF' : true,
+ '9EF5444454DA21B0B7D6110C9B040BDD005EA0BEA27788D00BB3F1C48D9D0F36' : true,
+ '9F7385E656F0E8237CE9A5E9C96A1B3CA17920EE75C112ABE9219C18F77E9E97' : true,
+ '9F9E4DC55925D2944C0ADE2959EED5F6E55A14BC2F6109F8864A8AAD2E4A7997' : true,
+ '9FC08812780624B21DB7596E278F22F0023D27DE99277E37CF07BBBD4B351590' : true,
+ '9FC5DF8E8AECAEAA4939A5BD94A078371135107A7AAA15ED5728C9887FF4DD8B' : true,
+ 'A0142CE676C4FA2524F53E7626D21042BFD8A903AC54F8AB2FB977ABB760D6D5' : true,
+ 'A029D3A07D53CF4D88E75038E45EA719A7A04F1084FA5C327E5AE66B229E7761' : true,
+ 'A03D7CE2FA040738CCFEF1F20872DDC1E321745B2C34095822A51B3BDC07D9F5' : true,
+ 'A03DFE739C80E109658E0B3EB41D9EE1F03EEE48162C4EB97EBC3548760402AF' : true,
+ 'A0AF36C48B0FB8F827459F8AFE6FB82AD1CF7D5D193057AA7BE7DE3EF5E4F69A' : true,
+ 'A0E9635A0A993A3C15F0D7362D4D7C1EC21A50B04AFDEC18685B4A21F69E42B3' : true,
+ 'A1504C131B0FE702B64AA259B901DA2D9B2AE9D85AADE02F1528C1147F98E535' : true,
+ 'A1712F04B99848A73D978552028EB84039AB331DCFCE329E8A7A59F678139F28' : true,
+ 'A1B71E94B84076BBF29645578CA796F299D5FC07CA4C2049D41760F9B53035F2' : true,
+ 'A2152E5BF42DA70683BFF5526B3F9B90045F74B82A034EDDDFD2F8674BD20D7F' : true,
+ 'A21C3F2CE357822C64D1F9C26446235137559939DBE7C7C3E5CDA218376EC1EB' : true,
+ 'A277B893194AE7687EBBCFA344178B3578AA6228D2B430BBE2FC8D5EAEE43135' : true,
+ 'A2E6C7ED88E5F8103D95E02F792372AB66EEDA5AF35CE4884316493325F971E9' : true,
+ 'A3554186EC7CFF6B11D03F042B490700287F9CCE71A4F581B0C5C13C2A0CE643' : true,
+ 'A37B9444FE3BB0FB2EC43F2677926EF458D0ED4F0688FEA6443A5F243F10C2AB' : true,
+ 'A44473407C78C1A951194CB7DBBFBD5010A60A0C82565E02AE1E372975C8D8E4' : true,
+ 'A450EA9215B45056104180FAA52CD6635B94625D0FA383A2000CD8FB0B203E28' : true,
+ 'A45C0F1FB81BDEAED2EF4302BD5AF171F31496B6A8D502B488BC8E3E22D5E992' : true,
+ 'A45C8546DF176BCD32BD7D15FFE732DA2B73EDB38D387108ADABBE4B20066275' : true,
+ 'A4C6A2F0F5175D6C5C1D87E61ECCECB368E6B5374F056F222FEDBD0857B83F2A' : true,
+ 'A4D07A0F8A6A11935F63B66461D06DAFE3D8AAC0E0001B5E842A2232F327137F' : true,
+ 'A5278398DC472DC37141AA3EFCF4953AD7B14AC25D3730D2E99020353CDEEA25' : true,
+ 'A558DE705EC13AE6FF7DF6E6B1BFDB54A7CB7FFAC1499954FB109E6B884CFC03' : true,
+ 'A59F7C5EA7F5C48B71DC6BB678541E4982BBA6FE8E181F5C91DBB9F9FBF49A66' : true,
+ 'A5B9EDB84D5E06BB960BD23A73B0AFC8A0F35C95B782BB54004EEF2430CD3351' : true,
+ 'A6584C2334B3B29B3F7DC858D65AC229F679D8134C75DBD5A6CC1A4B897ABB2D' : true,
+ 'A68F08DECE7FAEC73E7F00AFE4C758B2742EA6BCB9FFC0F3D09C3D3E79E41EBF' : true,
+ 'A6B6702113E87CFB26DA2066CE2151698C68EC71EA906F632FD65DD35B3E0094' : true,
+ 'A6D113CA991875E854CB226297662EE3B083F5D4E15E03D1FBD96AF0FA6691DB' : true,
+ 'A6D1CFE508A9E64AC65FDE0FB8EDB8A808D3083125E2BFA975B4A1F0373FE8B9' : true,
+ 'A718CF6FB0B4672FDB9BA1CDB812CDB98423DD8ACC8991780BE5E0FAEB863FBC' : true,
+ 'A74DA51FDF285B66F86065496D236FADC4D44051DA6400B743DAB15A81FF3B13' : true,
+ 'A7636BE0A08F56D7F05A8D69AF0B7199FA7C05AAC123DCE71AB57C538A4D910A' : true,
+ 'A806A89477E76D5B381113AFAF7D082B543E172A38A1C4B5E23645A81A411E8A' : true,
+ 'A84DC1DB143EEE938A45743268683770BA0FB2EE69A4EB4B131841555CF1E124' : true,
+ 'A8E146E7A32922CB9F5908D8FC85B2928D4BBAF44E8917F370E57C60EC479EBF' : true,
+ 'A9266E0A665A00C7C4360A7CE3FE0B5ADBD6E7E20A32677E43BA30FCFE112E30' : true,
+ 'A93B07A90F55AB3B6BDD56958FD69A808C8DEFA838DB35D323F080A4AB1E4B60' : true,
+ 'A982473B3AABC66BDE83F206E260A07267088862EF71389082A98858BB12C3EB' : true,
+ 'A99953DEB7EA51793C1A353F91A070E4702D42AECC9808E4F14805A755D1866C' : true,
+ 'A9C8BD62DD64EBE49F3DC28459A7756B6D7D6168A9195E8C52D41D2AB9D9CE05' : true,
+ 'A9DAFB7E89AA7141CD52F08D5740F09F388419744351D889C96D2B4C3153A424' : true,
+ 'AA1716CB8EAE12CAD75B01F3A4EC5516140813349BF4041369089A6063625EDB' : true,
+ 'AA55A82D7DDFFAE695312FA5ADFE893D1430057D1D8ECCCD2A9E985CEBAE3989' : true,
+ 'AA9F7FEBC74FE835504EE24501DB2D00409FC761AACAFA92DC8A696388AE843D' : true,
+ 'AAA011E89B2581C1863FB1DA1E41A8FB8EF14ED0817976F16909C68E27F4E70B' : true,
+ 'AAB01A25BB1EE114084DBA1E0B2B8E5C84936196D40CAAA26A16E58FC50E2B93' : true,
+ 'AAD7DA6E17F164E00B0B63A6338330219F40EE683F8E0CA5F6B709F2E13FB3E5' : true,
+ 'AADA8A48FB9966CCB61E4B8C97DB2DE50F0AF34422D74D1A770501AD00C40119' : true,
+ 'AB34CB23DF8A006DD182B01EBBD38DC13785C4DDD433564B5CA7579DEBF3B1AC' : true,
+ 'AB47045D4B45B0821E851EEEF7EA9D6571F9759DAE4F3DB1EF92597BFD2B4FF9' : true,
+ 'ABB5673AF0583FF328D23B1D4F35B33EF6B68DDCDD482BB3BC1DCB43D2A0367D' : true,
+ 'ABB5D30080E3CFE6F83F249F3F8A22C731F318DDF1BAC4D4895B2B7F7A6287E4' : true,
+ 'ABE9809D21AFE6E0FB253DCD55E10C31DBAB32A973EC52DFDA1C15068F89D333' : true,
+ 'AC3D6D1C64348ED7E068376BFDDA866A015317B4AA8A7FC0C16F7E7ED4DA9682' : true,
+ 'ACBD5C965EBDEE4D8D3EDEE2A5FC407A6A3A7AD5E6EC120EF1854C18118953B2' : true,
+ 'AD046A8C4DE2A89F32973F0566452CFD38CE0586998717364C528F5995B5E2F2' : true,
+ 'AD05645C0957254FE67FC48F7BFAFC24D30BEBE233B82D87DAFF3B44EF7314B4' : true,
+ 'AD3FC05D383E384659DA700279CE3C48DAB804AC74DE2B3DD3687F6ED355F99B' : true,
+ 'AD40C15657CEFAB57F6A71035796462F0184B0AAA489E601087DE329F35CD757' : true,
+ 'AD679FC990B740191DF7F88D51947A1F23D79F862160E3C94A22BB1169A7567D' : true,
+ 'AE03E5FDACD94805484DE44DB4BABB96D1D2EED4F0B9CB528CB30210C8005C6A' : true,
+ 'AE176A4F7AAFCDBBDC0B7A69ED5D5AE0A8FD0A5BD37BE887ED0F098239D11CE6' : true,
+ 'AE7960061D5D4739E2A6C0BEC6BE8E98ECE3E97994940C9BF5AB2E1C2C0D9702' : true,
+ 'AE7BAFD9FB7AB3D87D0D58774420B314E46538D2894DC58DF5F5614DFE7F0435' : true,
+ 'AEF7E370874D2001D989B258853C1974A5E45676D3D7595F74662C0B650BFE8D' : true,
+ 'AFEC41B1302FD09F03015FB573960516918EFAE30F68D97D027D45A51C4115B7' : true,
+ 'B06CD6AF9B4156B4379FF3C6C1F8CA182A923527D0DD92905394DB3446A11D5C' : true,
+ 'B09F332B8A115069BAC41865E1F1228DFD8ADCF3A66C1F2EC9DFF41173EE7A85' : true,
+ 'B0FD996D85E74BF51328181823707C4FE5E96C0028C2B3FAC104A96237B63EC6' : true,
+ 'B0FF4F8A6FD3F8FBB19A188351CD4925C951DC2D64633B9E0446F026670A47D1' : true,
+ 'B15FFE5C987B12D7299D96F1DBC1C7E85B0528D1AFAF9C6FE808361F7B0D1D06' : true,
+ 'B183D8E672345AABE24C849B4A13D0BD99C296AAB273ABE88C00CAA229A27154' : true,
+ 'B1991ED1894F821B66AEF2E26E0834CC796FFB43971A79588A44CCBF7E8B3076' : true,
+ 'B1D9B3EE2512A48A8E703E2D2263EEB4B0A3D24963F5165DB3719CD4750D2986' : true,
+ 'B20BEB685F3FB617FC974C4C624ED894EB2F7FA61DE28104C7B9EDA1F52F46FE' : true,
+ 'B295FDC9D7462488EBD4E5FA8E5B062FE5E2D0432C6A02B99F4CAD1F9BE6D0BB' : true,
+ 'B319CB30FD80959806C6836129AF6E1A8A32B8B8D39AF65674532BBCAFA2CF8C' : true,
+ 'B31C07387E56AA457F17CA3D3A4C485683253CF387E6DCE37469B6A8E51CBF29' : true,
+ 'B3251BB9A1B4F219400E69789FB08CA2BBA396C6D2FD3C4B69F4B7E1C0DDB615' : true,
+ 'B3381C627EFBEF5DF3BCC9DB71A9B6E4C0A4F3114F7E7408A356FB33FBA5D20B' : true,
+ 'B36D72C8B1F436DA49520421FC0A2869A9952DA405DA5E29EC3A1919453DD6F5' : true,
+ 'B38D0B1FCAFA3F435FECB2B3A25804FB004BF11DE5CD691C1461A4D76792A4B0' : true,
+ 'B4130785116E5A84BF7B191696B213BA8877228388B18C2DA38DCB9EE14AC8CA' : true,
+ 'B440A043514252DA267A339059C789BB14D1339B7964B0945262D978D9AD021E' : true,
+ 'B5008FE6CBE7E0EC5B158E8C9CE487FB6E5349F47007F3CDD2B1AAA69098FA40' : true,
+ 'B51BFFBF094EBB26247D54321DE8F7CC10B24BE9EA6D9383BF908E765D5D9594' : true,
+ 'B5453C09F38363BC702FCACE4B64A74538B1BE40617640C00150CA9129FCDF52' : true,
+ 'B55BBD123C4262662BC144E0CF4BC9B47059C4BD0A136C075BB9B3E82830799D' : true,
+ 'B56769F28FE8395FCD50E7552BFBC2AA549F30E1092A54921BE76B07A6A800F5' : true,
+ 'B5A9BD7AB128FDCB0DE3C7EAE193904867BAC57822BE195F3060369520403D6A' : true,
+ 'B5C58EAB37201F8A7F3C520FECBB3C016A30960C5931DD7C43ECA217A1E31774' : true,
+ 'B5D38F895E2681F656FEE774C8677D29749C3E5ADD3DAF7A2A91043BF5A4DDA5' : true,
+ 'B5F004A0997E3448A1ABE7DCE45D8BD263AC631D14B05A04CA195E98D665B679' : true,
+ 'B61D7AEFD0BDF0DF2C8C8E68D4E3D92EF45CF9F79AFD9EDC4729D71375916019' : true,
+ 'B633827A97472541F7DFF77C347301FB40604D6076D08FF4244C070FCFC9B731' : true,
+ 'B663B6C8C60A5969BEE4F6844813AAB8945EE2CE2253CFBA67500B991CD8A07F' : true,
+ 'B6CEE930054D71DEE1D167A566B9881B8971F7EB4BC4A34FCFD9DDB3DE311B9C' : true,
+ 'B6FAC01424B5C332C72B6B218DC93AEBE54318DDBFC5BD1277E262FA7831E5B1' : true,
+ 'B70CE73DC10ECA5F97059AFEA5A65F1B1CD45F3137BADD7F3A12DD1D6A468D82' : true,
+ 'B7135730040D8EC88C4228AF1C9482AE97526F30CEED5AA117387D20A61D7159' : true,
+ 'B72D29A0BC3BE16C085CE7AD38D1B7A945DC96F4A6F20F126138FC5202A072C4' : true,
+ 'B745A72DD07E5FED73CFA723D6BC2E98FA62B6E03ED378804EBEF7DCD83725C0' : true,
+ 'B76BD62A287E68C2CC8F8CA7FD5196938DF4C39E6F46DD81A3A37D22B761C158' : true,
+ 'B7E6A641053C86E17A4A328D98700AF4BA3BDD35E5208359AF120C2690F51E3E' : true,
+ 'B7EC03174DAD602E897345B072749AA86CAF05151062989E183C3039DE25569D' : true,
+ 'B839688B9303FEF8860B4FB2EDF19FF2A0BF5306DAC007E8CE074CBA13B39A03' : true,
+ 'B86F85494700264E918D8706B711B9E8C3C12AA776E0B63AF35B73CE56B15BBA' : true,
+ 'B8845702F28C3AF9B35D8B5F1DFFFA014CE411CF592B18395F700CD8B937F3B9' : true,
+ 'B8F0936622984493F4B74D087ACA8438AABAB1111DA258806EA86C23C6F6617E' : true,
+ 'B9772693C35DE8A4B6EDC9457AFC3B4B52ECAFDBF612CEF1A27AE7F7FAB8F79C' : true,
+ 'B9D8E2EC3C47B6130DB45DE0741CDB790E36E4617986AAD5A2BA232B8BD8A85D' : true,
+ 'BA4052C530EB5FDDBBFD98FA9EB99660BC084678009D5AFB2F9996BCA40C354B' : true,
+ 'BAC88F443D9F2F03CC7ABFB27373EF9600AC918E084967BB77E80650B3724266' : true,
+ 'BADED8CA137A9AFC4A0FE344F663C743D1A549D0A8DE663426B90E788868024C' : true,
+ 'BB7E9348A57593802F083CAA99351386DBDF348C83AB35E554BB7BA44FE1FA55' : true,
+ 'BB7F20108F934620F741F678F3D25F7DB4A50A2CD216FBAA1F4773767F645AB9' : true,
+ 'BBAA50F752648522389B89EDD345BF8C41FE10D4593A8A1DF467B2FFA7BF870B' : true,
+ 'BBB99D57C9ECE54B1634DB4BD6211C5167A5EB4DC310340BDE14B1BBCE275937' : true,
+ 'BBEF78F8C05ED5A5C2142C3598696B0674FF3DADFC8156896025A13EC892ECC2' : true,
+ 'BC0B758091A4613FE070BECD6CDC0BF1FE89727C3482DB4A2353CEC027E3AB11' : true,
+ 'BC17CA376A3CA716F41BFA9D3A2CED2B1941431D70543BD600B7596F4EA2E440' : true,
+ 'BC1FE50662610B7D575931031B1EE60479D9D9E3D94048DE6FBD44C88B9FDAF1' : true,
+ 'BC447B8A11DA8F1DE19285AAFB97AF1A26A35157AB8FE1E4AF80AA70B11AB65B' : true,
+ 'BC568DC8C01D8D7595FFCA2A7E000780F15EC24CD38AAF25EDDCE7BCD41E4FAE' : true,
+ 'BC622EDE87E66E364218B38609D792F6906F7CF95EE5EDD1A76BE0C48B8533F3' : true,
+ 'BCE02BE648B8A1EE092574F3D453388649082A1B72E7AFE7ADBA310EFBD38DE6' : true,
+ 'BCE27288DAB9DD76CB73B5754152983F14B11DD0466B1D4F6F55B61E27A3353D' : true,
+ 'BCEAEC2D8B8C18B58BD320D77850EC38285F419ACA8A9E939DAE7DFDF26696D0' : true,
+ 'BDE511A7E1B38D779BD9E758B2EE8F7F2DD5A242D37CA573394808CB01B78FA1' : true,
+ 'BEDF91AB2008A01DA4111518C8065D4BFD9ED614A29CF89A16E94CBCD5F5D17F' : true,
+ 'BF38E5D5BE0CC67C1CFAC96B40DFD91DE065F2DAAE427AA54893FFC5ADC73707' : true,
+ 'BF9B71E2C87C03CF421733610A1BDAB430C041EB20DB75ADBD9ECB3D342072CA' : true,
+ 'BFA0CD61FEFB0FE90D0F9025E67C62A735DC730F13B5D5FBED9B54A3DB882F91' : true,
+ 'BFA5B4A3751715409895D27F7C9F057F2C31EE560DB075008A3BAA21DE838FF3' : true,
+ 'BFE49B659622D1011F4BB655CDA77638665D068FBCAF11C73829D2DE16E43BE4' : true,
+ 'BFEC93327E0A7A92EB67CB3E00D29C97411077E06CFD010BB84A5C0836CD2F1B' : true,
+ 'C0AF523C6E9B52801FCA62602022547B25D8A107CC7008C67C438E1A093FA69B' : true,
+ 'C0DA5CBD6F39A5B707B0E7DD33004811FD6F925DE713C817F3E2719393163E9F' : true,
+ 'C1AF26C31745338DD2E13C1BA98A2E643AAA3271CF1FD5B878E93B1DDA2DB868' : true,
+ 'C1AFF08543BBDC3D2D796884D099D8A7B8D40FBA1F37AA31CEC16EBE2AFF0D0A' : true,
+ 'C27D64BA2F133417986FC42073BCD7DB4668A2FA7D2D217CDE215F25D2BD5E23' : true,
+ 'C284387A9875E45662ACE976D665D6A33C36F3EF2B053AF26C0918DEECBE7CB6' : true,
+ 'C2C65F50563C7E96AFE6602B9A0B68DE74F3C7AE5C00ECDB39B98960BDFE5B91' : true,
+ 'C2CE30C7F0723F2D2B25A18FA209B1CBC66662624FA8CD1EBA96BF051D969625' : true,
+ 'C2E60ADC4803F0F11F83C644D8DAF80DAD4B9D6A67FC108B3C2CE6F2576EB69C' : true,
+ 'C32E558AC4FEACD1690C227683DFC38CD26FEF103953FCEC9CBE0FAB08C176DF' : true,
+ 'C391E32BB11DD8F6F13BF71E0B9CE225364A50006E3F91147EDE39D2AA6E70E0' : true,
+ 'C3C07C187D95222D855EBFDFF827193F71C471BAA3A1B51242BFE963FD4A63F1' : true,
+ 'C3DEDA7A5C280862654DD266D482AF59CD7CE5C09020F8F32EDA0D0FE2345B02' : true,
+ 'C46DC6888470BF64D41C297E1FA082ABB128D4D0EC44DAB62E05E4FF8496B18B' : true,
+ 'C4D51A111115A7D06422BBB16B67ECFC73D636DB08551B27596FEB532D8CC2BA' : true,
+ 'C4F8364FC0A36A73AA0BDA4074FF1490B3AE07A7BEA479385BF28078288F9C3E' : true,
+ 'C520C3FFB5C5107BEF2E8DC44C74803713E13D9BCC99A57C6838BE15ADAAC04A' : true,
+ 'C55B18B5DF187AE68174C086FA4E692C6443B01FF4A19DCA743EC1F6E1B7E332' : true,
+ 'C58F0FF2DF810FAC8EA095F349A2E6D7E0D9C09D6FBE7D45895408530E1C75F4' : true,
+ 'C5B2A636DE1FD6629B4BA41FD1693F261F50577130A05366D298F9CD282E4BA7' : true,
+ 'C5E4575B4442687C80E6F9F290846CE80217AEE8892B9977C5F455BEBE285EDA' : true,
+ 'C610F374CDA9036FCB01F526005ED8561D16A27790491AFB26D56A1BF0716007' : true,
+ 'C6479E02F20A3596203FF184483F1F6A29EF9F95DAD258EF2A84BC6125B299DC' : true,
+ 'C66BA6D7D5EE44E268D2DFE0A00284BA59F2FD86AE8F738E84718A1B4C5927D3' : true,
+ 'C6983038573EE575734E531266D91772390BDF63A276B49E9360C81F8C813EA6' : true,
+ 'C69E1305EEEB633DAB5055D952D0A8FFAF35FE57D0E1896A7BB24EE37F29959B' : true,
+ 'C6A38936450B0D72D5C38EC5BE6FA683D25CBFE604C7415BC5E55E2DEB06A946' : true,
+ 'C71294A0124420512711C918C36F77192D2B45CDF8C99824B4BC862D0B31C3B0' : true,
+ 'C7E74023ADA70B7F3BE9085E1554B8EC7AA20B0E0A38A08B2A05DD377F7177D9' : true,
+ 'C821C2140114FA7DDE92FA497EED3E4B9131919A9EF3D6750013C6CE7FEE0B72' : true,
+ 'C86D8AEC465B23370C4D5086141E9C98935D91524E3CF68BBE62C0AB231EEEBD' : true,
+ 'C8726499B7FA3B32022A21230BC27CC59901DF584C69F33232EE76FD7A554F3D' : true,
+ 'C88BF2F611A7EE5307733DC2950EFF56A96BC832961FF595196EB88EFDDF4932' : true,
+ 'C8B4AB5E690CF9E14D079125CBD13232EACD4FA3F15276D2D7BC48FB84BDC0C3' : true,
+ 'C8CC1B97C420851221D3997B0C0E3A6B87B4D9F86D348917FF90BF710DE79351' : true,
+ 'C950A2AC5B35DEC3F384099AD2E3BA7FDBE79E93362A132380CB5ADD1EC2E94D' : true,
+ 'C9F2002F6542DA1BC5833AF9A11F6F5F144B76539CDB9E1738C7DB37097523D9' : true,
+ 'CA157632863D3E7B499F141741724FA84DBA48AEB51B04A53A9D3DFEA7F70BF1' : true,
+ 'CA362B0DE34C54F91953DDCDE461D54BF30DB252EC07AB6B4C449E45750BACED' : true,
+ 'CA46DA728E76E97AD214DBB6AC9CB1EA2DC87202C88C35E87CE574FC1F2E0438' : true,
+ 'CA846077B68DCA99AE30BAC33929143E856784B64E70098CBC7FF5BBD85C824B' : true,
+ 'CB42AB965E2C1CC7F20BE15F308C2173AE531C532DBBF8A36B292B1E1A891A07' : true,
+ 'CB6C703326037CB5C4456097438DF15387452C0CACD89D9DDAB1475A2111C197' : true,
+ 'CB7FF00DBEDF16D72C8A10151A30595AEEEB9A2317D3F44269966624417141F4' : true,
+ 'CBC3C62B44E2C35250AB62FB2C3993C55F251559259727D5F76A63002148F17A' : true,
+ 'CC1A62E8FD6FCF9A3BE4BAAA64AE2FC0BDEA2C2F34BAEF8F9123D991262DB210' : true,
+ 'CC815184FE74CDD53947DCC9733B1D5E9B9E8F31C8C96154355ABAF389BF7D63' : true,
+ 'CCF6435DDA033106286D7A69A4C8DD727B59C4E334826CDBCF6F66C801580FF4' : true,
+ 'CD35C7ABA0839C0D865DEA4C1DB624F709E5EA041A68DB55842E2C189F38BAC1' : true,
+ 'CD7C028069F371EBE93537094CB57A51CA0CA421B9A7F8C1422D9C454F864FD3' : true,
+ 'CDA01229ED05A3825448BF81C4479F02828C6E02DC3F303ADC153BC0600D1FE3' : true,
+ 'CDE7AA628678D4BCAEF4240A9D09B5BC7BC1A1757010006931949C83DA299B9E' : true,
+ 'CE01F10B612255CCF31E03F308F45E0A091C0FC41A13280F575BAA7F4F7B4A58' : true,
+ 'CE318D567E77FA3E2B87268B09B1FE99484916CDBC7A56B99900CE7BB7B4F967' : true,
+ 'CE34361030AA71334FC8EAC253C91EDDDAD3E2AF0974931325384B9A445CD116' : true,
+ 'CEA9DC1557689CC8AFBC740C095ABE8AA617C19AB92B761EA71F19AB2B3FBA4A' : true,
+ 'CF19B1004488D5D9C882E2C4D0A47789618E0BCD6475F6D9C6B5591C2BF333C9' : true,
+ 'CF3457D98980F7909742C974AE4EEABF2007967D9870705867C18A5B47CEB2B4' : true,
+ 'D010B9708329342E43370125857DBFD443ABC95CF5778898A7343E5F1C61F4E9' : true,
+ 'D0927B6D60E3441E11D75A8FD593A38665AA7D211F691BDA3D0E815EBE303C25' : true,
+ 'D0ADA8B3F0D09BD13AE5877B5E448C18376D129F92DCF2D4F1BB182725A62D3D' : true,
+ 'D0E5727B39200CF1054391FD251191C38F6754C103612F442673BC53F1C1634D' : true,
+ 'D18241A820196F4910694FBB37556273E54236F41FD53B3AF75B6C6430D93B15' : true,
+ 'D1B116326075EB6F65C4F8F8E6742B639DB23B56CD8420F42F8219CE615303C7' : true,
+ 'D1C4E4D1F014FB8F889F45AFA39485BE742F64268C662BB28494855E393ADE96' : true,
+ 'D1C684802932EB8EBBFA0DBD55EFA5345AB3A928653CC222D548CD29D91EEBFE' : true,
+ 'D249C8E95880A20CAEEFADA9A9B8E80386234DBCA6D990E78CE574B430C0E6A2' : true,
+ 'D2D9C57B19EABF7A90BCB421283733EABE5ECC6311B1D05089D4F4251D157E3D' : true,
+ 'D3525FAE9E537DD0A56F0311A27A603C422DB0376928C707A12A1E3785F2BEE7' : true,
+ 'D387A162888C2556F1D3B9A73201A8608A57085E1115214BD2588F315B89776A' : true,
+ 'D41844AFC9E00E17DC87F0ED1AE4A0559C418770A4FD7033E3D9A9997C5E204E' : true,
+ 'D44D1A7D80BD2F9B4A62E11BFEBBB74A5780B0366CB6038CEC9FBC8C8E19439A' : true,
+ 'D44DF644880E56596405F1364D8C3E5301F05ACBF82FD66B671D895288C75360' : true,
+ 'D53C334638CE54CB75DAA15D1AAAAD70081C9A52A2393DFC79E9C3A92D54F4D6' : true,
+ 'D5D9E3A7DAB437D5F8967A307F6BEDD3B2AEFCF59B229BA649C4E549F01668B5' : true,
+ 'D5E62D9B8F9EB17D8BA84646BC72AE6271E24D0C7787D302965A92ABAEDEE2FB' : true,
+ 'D6061064FEC9DF923123EDB3050700BE1532B68D9FC12FAECABB9FA82CE2B887' : true,
+ 'D6200C1744EDDC3BA40857A1089A20F7E86EC3B29FF413CA2BE49C060A79D19C' : true,
+ 'D63DF52A3A887D35ED58C64463BF73252738FDDFD73E0F8B378E318AD3057D36' : true,
+ 'D646154250C7883E951B03FBBE9EF7D3D00E74D60281FC82876A913A23AACB1B' : true,
+ 'D6ADFC439E8E9FAD7C281DF1117E0030BAE78D15E481B7886F54E72DB7DD352A' : true,
+ 'D7266CBBD307F97B7284312CD4C2A5BADA7D4EB123237EFA43E55D8D2F5B16A6' : true,
+ 'D737A5AE5F875A566A4ED4CB025D07D076998270F0D25292661B4CD581B0805C' : true,
+ 'D7632272521683A38E88A18C2CC6AED79B2C5E854483BDB6EE83D82BF41B96CA' : true,
+ 'D77C2904CEF8726B748EE36E43BE65BDBD12FC48E4A4ECA4885537745B0BFD15' : true,
+ 'D77D31A02283F81A4E64F7512C59BD71FF603FED5EC57F24F0A240F04B846999' : true,
+ 'D782121A27D3EFEBF791EFE34D5A81385358DA939F5DEB17530252BFBC8E2F02' : true,
+ 'D78220C9BDCD563F71BD8139B40A495879DAE9FB1968AE3225BD0D04DAF294BF' : true,
+ 'D796DA6F4413295EF05E79C798E92CF8A6AE172A091C862D7176384D520BA2FA' : true,
+ 'D7D1D7F326D3DE85FC1DFA7F45F9D5A3C64473B37143EB09DA66CE56F6258FCE' : true,
+ 'D82602A79F22AF46AD32D0AD123D30464371FFCB7A8AFB8C51A74841463A20FF' : true,
+ 'D86562629BA86C435C0965C4AC302160729F27804FEBA36E211F96CDEFB5DF8E' : true,
+ 'D86996C0C019AAD9DF5531836BC48F54427021AB8E24BA1AD073895574A143FA' : true,
+ 'D8AA8D8A7A48ACCB4C1B7E6C2228B7BFBC297EAFAB1315643744E3EE4DFA7E6C' : true,
+ 'D9065B6D9F7F27507D51170FB465FA6250DF528EC38BB46DAD0311C1DF63ACA1' : true,
+ 'D9259A35701E881FD41A9939C4AB82EDAA83A18D1ABCBBBF8329FC6850A0C6DD' : true,
+ 'D94290750677E2B5ECE7C2DC41AD4618C6995F173EC44DF80B23CC0E333EA654' : true,
+ 'D9FDB29EF83808BC82A97839FB2F22C2D20DAB2E6B67BF5862C8922BB1FA9068' : true,
+ 'DA5D20F1A6CF6CEC3AA7028A6E17D8F2E1A60069E497758B0CC938C08F4E76BC' : true,
+ 'DAA384D0D2A94A18A14E3DDF7A963E59BE41C06B978F3DC8862E1EE6C8E76DD0' : true,
+ 'DACA572539398A22DF7049B23BA3E59DAD6F34A44ED7D5E275457D9F79B880A8' : true,
+ 'DB7B1361B066EC2F777AE104F88A846DC163200AEB05B47D5BFEC91B6F13AC53' : true,
+ 'DB995D854C4EDEF4DB5CCF20B2B30719056F3EDAA0CCF4B9D9C5C898407C5C7A' : true,
+ 'DBBF19EB75C47A8473F59CE4B2A318B493EEFEE4B6719BDF40FAB2E81D9DB2D9' : true,
+ 'DC90A8BEF7B1C62F9E4B3D3345665DBB5D6CB46077F5E7ED0628A5C0E3DFB742' : true,
+ 'DCC87ABAA2524536C43A280BC52710BF117E56EBB39444873F93AEF18519A502' : true,
+ 'DCCFAA33D28DE7243AB2C1514FF36012E967B0C0C6E62E940325CFCE982BFC23' : true,
+ 'DCF5F2D0FD496B041393D2151A3C6366DB5D9E3E6FC5EEAF236CEA93B7E0126D' : true,
+ 'DD5A1FC87107218C43D2C1C73075C5506D6901CE1289F86DC0162E6BBB80B84C' : true,
+ 'DD79B321EF333A6C39D48DB57DC5A138F023A111D56851CD4CBC8EB1BD094893' : true,
+ 'DD7B5992561C1F706A82F7D9318E45DCB1CF508A564263893350E2D3CBC41241' : true,
+ 'DDB4149166CCAC259D826E4E6649B5F59DB8DE3A2ABE0D0CA88F192AC891B331' : true,
+ 'DDC51B2E6531407BA185447AD1A9825344FCD12E93D120D81825613F016DF297' : true,
+ 'DDCA648AB82DF2A942AAD4B384839255D5D98ABEAFB602B2BBA2F4B115072EDC' : true,
+ 'DE65D592D65A64794CCF2911A10DB5DB27C28E6C88BBBF75B75FCBC2CAF5A02A' : true,
+ 'DEC7DC8AB8ED70C1D2FB2875F0F99FA99FB53E6BED70CD47B244ABA2104DA5AD' : true,
+ 'DEEBA70EA985BD2637FA63B79F69B0EEE5D261E95E3699B97855296B23D82C3D' : true,
+ 'DF32CD36F2BAE47DB4BDD2610D77629F44819723F9BA4FCFF6CC7F6E5709FFFD' : true,
+ 'DF4482289B54CB444569A5436AEEBEBFB348D966D2FBC8C5115376F3E5496303' : true,
+ 'DF464344337A60D78868FE886F92848BFF8713D641C9AC5EBA29524842656CCA' : true,
+ 'E0BD7FDC3544BBBF78F401148ADE378A4A85214C0469EDD5EC23C5246A6F5555' : true,
+ 'E0EFCF7FC7033248F1933BE975F931485787F32928E47DABAC84FEC9D7365CFB' : true,
+ 'E0F0A23CA9D564C9EF7CCD977D01D6E6E7EF5ABD585819EE64520CF369967353' : true,
+ 'E18545BD6D070F0C6AFE93153C190792C4921FC90953FAA775E351B1FB1BCC44' : true,
+ 'E25454E967CE89CBD0F51AC02466D60FC091BDDD9CBD3093ABD027B0AC4E8174' : true,
+ 'E26F4C34273553354334DC7A22DC56A781F2491181799287CC91F12871FEB50D' : true,
+ 'E27966B8B9C67C751F9AB8315D0BD1CEE334D96A8C5F60C764070EF8B8FCE61A' : true,
+ 'E2C42D4BD3807D802CE3B9EBC6FACC04E34EF327F4BBEC1C7A48618A1271F5E4' : true,
+ 'E2FBB7B66934E9C420D496089F2C0FB5AFA193A1E6F49BF35A751EE1E1F983DA' : true,
+ 'E2FC1229FE0EDF06A3706DB8DBD2344B61A9364840A3E61E6B29CE49A966AC8F' : true,
+ 'E315468836F77DF6AA146AF392C5DB7262A83AA83FD7CD75771C70D29C3F16CB' : true,
+ 'E35CE61842F1093D8D4AA9923AC66D17F8D1870A03C9CFCA1A27361CE8091CBC' : true,
+ 'E381DF6792973BFE322D23C6CF2A6C24A4ECFC77F43F03D2FC04EE39FAD7C683' : true,
+ 'E3EADC69740DF00FD147B0718CB1063D7E90E172E196C96956920235CF9DB382' : true,
+ 'E3FFE980C209BCBE10F594806CAA472BA2D4702F6E2549AEB86DC52B46DCF773' : true,
+ 'E4A79C0CBC9966A44EC1185DD6E66371FF395D0FAC53C1FD2619B02F6ACC9C6D' : true,
+ 'E4E88DE573C9161962C072B7A9C966BE3070A6027A061DE32630C553C09EB046' : true,
+ 'E4F069C24D7162E3C94AB295EA33C8926BDDF79934CA28D8982A35650EB60B05' : true,
+ 'E50C2EC0BA6891F60BB325C0762AB06271161EFA9E0B2ADD50FF520128092FBF' : true,
+ 'E556C54852E6E0E61097B2A34DDCB87F12EF74CA847CE07C4CAD2348FF41D3E5' : true,
+ 'E5E046397DC23925AB8CAD7CB66E2A12EBD989350CE41F89EED455248A109098' : true,
+ 'E5FB4DB1871BDADEE779D366E7BD007F7A963FBCB00B90EC14C8077477E436AD' : true,
+ 'E68C4E54088AD4A308EC6053041A4A8B04A213347BAE2CE86D3F1587B1518981' : true,
+ 'E692108B3683F3C6362DF92476D62BAE60687035B70B9119F962190C9C215B04' : true,
+ 'E6A029856494D7FE48E048D60E7BDE80D2B6217FF084F64A929056E166F479C2' : true,
+ 'E6A6EDA8D60BE3C0A5A19631D1BC3262EDABEBFCD0144F3D19513C8F6342CD12' : true,
+ 'E6EB9DC7D407B4A2F308B4822E5BEA7428CD4520C59934214831D61E95F2BA34' : true,
+ 'E70FC0431E5B6632A30C04F99A4E0E55C860187A04CCCDA4FDC08E926E94964D' : true,
+ 'E7382549110E59A8E0AEADFBD5D29FFA2350B5FB2923F2095744FBFD8AD54C97' : true,
+ 'E7CF336F6E4E8CC153474F240D9238D41091EBA635F25CDAFCFCFC3AF2A6BA43' : true,
+ 'E7E7A31551051BC4346069C741DF38908FB54470BEA2FAAA789DDED2D627F09D' : true,
+ 'E80FA3BD00D99AF27B013B520D3CEB1A8DF8BE355EC971F08B4AE44FFCE44147' : true,
+ 'E8165BA89FE5F637FA2B3428FCC54E7E92BDDBB80505188C61320FC70E24F86F' : true,
+ 'E83B3C3A3EAA32F6C60BE4D4DA918AA4A5432FF3380D4886C2844D69094EC571' : true,
+ 'E893B898F708775C51A0A60748972C53C4B62787A591B96EFBF8CE28E29E87D8' : true,
+ 'E8AD1B8DA833226A37C21D1608E0DBA8C758EED7A943EDF323ACBB779E227C86' : true,
+ 'E9A176C583F8B5522A9A86B6A4409AFAF614D6A7650A5D6C32E4499319F5280B' : true,
+ 'E9BB3A11B595B1D403FE21DF47A3A4EB4CF43ED49259DA83FB0FAAEC048422D7' : true,
+ 'E9DDA8C162F91A7D746A5567060DD636491C8C1441697B600F56C00FE73AC594' : true,
+ 'EA64F2625FAFE2EC122B493D4754C2B090153F167213AB6F07A87C1D993E5292' : true,
+ 'EA6973A28807C80D7558B7636F875574C9FAD887BACF23B0F686A61C26EDBFA7' : true,
+ 'EA9369F9AEF701B1F9699363254A2AE007F47AA824AECE077B82F1C0B6A69197' : true,
+ 'EB11019A7642C75F4DDC1DC9CF3B469BFB4C44B71C615693C73175F16DCA036C' : true,
+ 'EB5F60FED8FCE35455A15B9A8E9E200FCF1B8B5B278D1511C8C5EE67BD99FB46' : true,
+ 'EBABE928B643E1B9FD6F61D67ACC4BA6A9BFCC95927D31D265F701AC4613B9AE' : true,
+ 'EBB8403BAC78C842A81201893DC86184BE82BC2BFEC8A51748651F938F4051B0' : true,
+ 'EBC9928117D91D999CC375930982E891C5DC4F9E02A3960FE692DAB13D96ADA5' : true,
+ 'EC3097F047F40894368CA744A97CBB177C1122963AFF3D958DDBAC299F793E71' : true,
+ 'EC4FC179A9A40EBCF5F9508C94C0209D9C28ABFB21EE932FE11BC87F2887C490' : true,
+ 'EC810B437C1FF46BD3F0DABC2AE11DBC7ADE12B9889580BCF20C097540C97A7B' : true,
+ 'EC869ABCCE3A1C036F1AFABE5ECD4FDA581D16C0E81E16A2734E6004A55896BC' : true,
+ 'ECA27FBA9090EAD50CEE16362AB7462FBD060DF8B4BE27C107328E49214D6758' : true,
+ 'ECA4B72D4C90C2889F21F4084AE4CB53F5B8EA5D147529B0CF72D3A9093532B4' : true,
+ 'ED310E1BAEB1759D2AEC00BCDE6D9A86DFA33B17563EB5105585F15327831032' : true,
+ 'EDEEFEA60ECD1F9063448654B3D1285B8D340B4AAE455A26C34AF221F6F96F85' : true,
+ 'EE5D710097EAD11639F98940D1F32793ECC114F0408856CCB6536F1EF2366704' : true,
+ 'EE82E118167C83EC466137DE867DF824A5063074FC61CD164D21F26976741A2E' : true,
+ 'EF162B09A3D267BB7B8C79D44D06A7AF21EF260518D0EF3A8CFA1730D7B89231' : true,
+ 'EF55226DCFD0FA606BFD3496633BFCBC146925B2D6685AB4875E142D79233600' : true,
+ 'F010781D39EBF1A76700CA71DB56877685A52CEC2E7250D2C5684AF659887AC8' : true,
+ 'F055D488944F4779BE3F17FBEAD728843701CE6598D01286AA1D525F26AEDAAB' : true,
+ 'F07E7F2A7106743D8C1FF2E201F944E3227363968C5A0AE31112473B93BACC7B' : true,
+ 'F0A9E452CB90B0B6C50FB794AAE7ECBF5E56801A10124C95292B28592FA9B003' : true,
+ 'F0FD8D8E64636B1A1CC2557C50DBADE7A1F0536B905F5FFC06AFEF630AB9A40B' : true,
+ 'F1C66D3A1C4917A59AF8ADC68A0722F7193D345BD978BA00FF669E7948D44F29' : true,
+ 'F1DE4066AF24E5744C9075CFE974CCEAAEC75EF9E6028B48090B1A46CC218C37' : true,
+ 'F205928C933AFF1F1A6411AB779CFAE3FAAF43754AB86735DB52F74DB1DA81D2' : true,
+ 'F233DDE8F7165F2D7AA4E736E6FE1F913570FA7CA3E3C134EFD22D5F303075DE' : true,
+ 'F2835EDF2E61A29F9E62FEF97476165D5FF40E553A2A4F955EDE30C0A5149E12' : true,
+ 'F28F54684E233C9EEC646C6E1336E33684DA3732ECBEEDB2A606E09DD29801FA' : true,
+ 'F2C91876EDB36EAD7E4821C2A6581144F1E5A67B2DEF4A5E4AFDF79F5E1CC4D7' : true,
+ 'F2F7938B7E294F17565B2833CC2E0A657DA80A237814C24B5C0AAAF35C4608F8' : true,
+ 'F3160DD030C118B5D5835743E78CCADD0620E5C08460E0CD1F5D9D437352105B' : true,
+ 'F319741878D155ED3E5DD4955A82B842700A64D86AB782B511F0CB9B25C48AFA' : true,
+ 'F3A6A1A957C3BC86EFB3772C6153D97C33B908124CA58480AD1F62C54CD89013' : true,
+ 'F3B356D9CE5B37D2B690C4EBB2E04A643CB542273C1754D2EC9803D831781737' : true,
+ 'F3D202454336E948C83BCA2342C4D1A0DBB4335E829229BEAE04B4125F0D508E' : true,
+ 'F3F90821BD1454FC7AC92F768D2C9F75B5CD79FF4DD3251F4B9D647D34024F73' : true,
+ 'F456775CCC8DEC02CF2F92A48101E18EBCC9C880D41FA87EBE5E2EAA0E24620D' : true,
+ 'F460158348B017310570CAB302E33DD12FF72526698115EEE8D3DE318383ED9C' : true,
+ 'F47CA7623AEE6A1849B4F3F90818A93AA937A0EFA65D6674EA769BD7EC113BF8' : true,
+ 'F48CB2C1C2551290BA59502BBFCEC7BF137B5176967BB92B38E79D4EAA63B7E0' : true,
+ 'F4AD6AEF9BCAC58CF21EA81D65C3B8C85CBC9BCF6A2807FB0C5CD332C5F9BF49' : true,
+ 'F4C119D9DB2CD569E75B9B1F0884B990575EFD920E8C62177990AE650B7AA274' : true,
+ 'F4EDB536BE8520B583202E17C56768579613187741195347DDB9BCE3AE2D5150' : true,
+ 'F5B52148D7155BEE637459A918CE58D22D4E024FB715325FC1B36DA4C6255357' : true,
+ 'F5DBA16527D871BEFEEAE706C232AD0B76FA1384EFB86A844C7BA46B96917B9D' : true,
+ 'F5EB7AFA398131FF3966EE221B9C8F332BEFCB634D42631E349AC0BCF367E920' : true,
+ 'F5F8E7786E1F61643C7D2805D86031E5C4CC97AE93FC3785FE289FBC44C381E4' : true,
+ 'F66ABF80914FBDBE53F794409F4E0DC895129066609E8B491506FCE246A2EEB8' : true,
+ 'F69B01FAC28E6126F1BA71159D0273519683F2317EA764B4C483B32BB97614B0' : true,
+ 'F6A08E63AF8E62D51930BCE0FA7CF25DD2944512652EFA275E150EDD9C11CF51' : true,
+ 'F6A7FA219283E5B13E256B4E039E4CCD93CB72B84D84086E398D5534ECA42DFE' : true,
+ 'F74D9E23F4CB53775CA60178347F2A029F77579000B21AA08EC62A1C2932348A' : true,
+ 'F754352E819D0C33E6CFC06EECBB4356DB5D8BD1FD2591C7C817CCE662BE2BC4' : true,
+ 'F77AF5088D4EB425ADC0997C059C641EFB5AE2CAC73669EBAEEA378EDA383186' : true,
+ 'F7A57247F89F0C50879598293BB33B7AFF5FB74BCE37BF7B53F8955CEFBB9511' : true,
+ 'F7B593D9277B72E9CF376EAC2BD5535F76CD9FA0FDA3793D7EA6B4D050602E85' : true,
+ 'F7FC63254BF2472575C6D5DEC8DDF02B24B6F1BDCE03D807B159A69820262D4A' : true,
+ 'F805AE1FEDB2D94096F0D341B703ECD4975D773A179555DDC83D424F85578571' : true,
+ 'F823D6220F702D0547375FC4451FE27A91F0CE2AF9DA31552235F96CBBA56326' : true,
+ 'F82E01B697453BD37AD7012E267DC78395DF3DF4BFB0B1657F58256616F9B355' : true,
+ 'F8434B1782EC41F184305BD75BB3C0206721BC6CAD62442377072C06101B70DE' : true,
+ 'F88D1DF97289C9ED7E062D4E4B2B2463F90946DAC91785A6FA02F2599D7FE65C' : true,
+ 'F8E68F837C3E9452994FD6BF08F02D12D087BF6D44137BA37F72E408620F558B' : true,
+ 'F9971BA9EA322BB3FCB85111FED48B9CC1C9788D7BC6985E3CCE4BB7801B0DCC' : true,
+ 'FA14D235A95650A4CFD7A2A4DD80BAF2AF47581E01E412D640F93D6BB79D1C06' : true,
+ 'FADEBB24D23CEE1E8B02430C31A939E14821E9567A25367303F20F74879AB51C' : true,
+ 'FB674F1642EE443BBB827B29FD871CC110D77875884B1B050FC804D2884B2B3A' : true,
+ 'FB6814C66D6DDA2F348BF759398AB81F7795CA223F8AE9C0D82CA295162F68AD' : true,
+ 'FB7EF701469F77B6412100BB2D6399B1A574BB9610186FFFCC0119E14CB2021F' : true,
+ 'FBCC79E05CC135E183F4963C2A206F9DFDBC2DD0D379A743D5FB301741796921' : true,
+ 'FC2DA5A38AD07685CC019C7C388A396159FBAEF9EA491588FC995DBDF52A0B9C' : true,
+ 'FCF4BA663F0032118EADF9D327B65AB502C7A8B336462A397238884E9A28508E' : true,
+ 'FD4E54155D3117D78872DA05046A16FE944315F63C20BF0530F986F5F3797ECF' : true,
+ 'FD87C175594ABB82818D5CFEE506105069ECE5D5A499CFAD2E6376A88BAEB15D' : true,
+ 'FD8B1849A13BBD87D072F9D09506C90C0F29D7CCBD2B6446AD31335348AF9294' : true,
+ 'FDEE85771EF592A9E5F47D08250AFCBC73DCE96A72418B2848AE400F3CF59341' : true,
+ 'FE5DBE234A59B532A12BD552A36DB75AD21EF243C48C61849A0F93AF314C5896' : true,
+ 'FE739A748FB17DAFB6CBA0DA5B2164B8E0435E8DA7FB85E7970BBE731B428631' : true,
+ 'FE9E5DFD73260F732A5F7CE93B82DFA71D84F10D772A845221204A9685089FE7' : true,
+ 'FEB92F19B7394B8BF0FF71AEFD233E262AB656BDD531AD89FBEB9228C5378301' : true,
+ 'FEE5D5CF3F51FDBCD24D5D4E9BA06AFB96BFB558CB5D4249C70066749EEA8FBA' : true,
+ 'FEFEF80071B0D8E2B57D6601BB353A435A425EAA701827370C3585CE09F2CE50' : true,
+ 'FF769AAD90F56FB48D6C6CFCC86E38F9CBC6DB23774342892AFD4680ED3560FB' : true,
+} ;
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/sha256.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/sha256.js
new file mode 100644
index 0000000..7e15f1a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/code/sha256.js
@@ -0,0 +1,249 @@
+/*
+ * A JavaScript implementation of the SHA256 hash function.
+ *
+ * FILE:sha256.js
+ * VERSION:0.8
+ * AUTHOR:Christoph Bichlmeier <informatik@zombiearena.de>
+ *
+ * NOTE: This version is not tested thoroughly!
+ *
+ * Copyright (c) 2003, Christoph Bichlmeier
+ * All rights reserved.
+ *
+ * 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.
+ * 3. Neither the name of the copyright holder nor the names of contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * ======================================================================
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''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 AUTHORS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* SHA256 logical functions */
+function rotateRight(n,x) {
+ return ((x >>> n) | (x << (32 - n)));
+}
+function choice(x,y,z) {
+ return ((x & y) ^ (~x & z));
+}
+function majority(x,y,z) {
+ return ((x & y) ^ (x & z) ^ (y & z));
+}
+function sha256_Sigma0(x) {
+ return (rotateRight(2, x) ^ rotateRight(13, x) ^ rotateRight(22, x));
+}
+function sha256_Sigma1(x) {
+ return (rotateRight(6, x) ^ rotateRight(11, x) ^ rotateRight(25, x));
+}
+function sha256_sigma0(x) {
+ return (rotateRight(7, x) ^ rotateRight(18, x) ^ (x >>> 3));
+}
+function sha256_sigma1(x) {
+ return (rotateRight(17, x) ^ rotateRight(19, x) ^ (x >>> 10));
+}
+function sha256_expand(W, j) {
+ return (W[j&0x0f] += sha256_sigma1(W[(j+14)&0x0f]) + W[(j+9)&0x0f] +
+ sha256_sigma0(W[(j+1)&0x0f]));
+}
+
+/* Hash constant words K: */
+var K256 = new Array(
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
+ 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
+ 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
+ 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
+ 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
+ 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+ );
+
+/* global arrays */
+var ihash, count, buffer;
+var sha256_hex_digits = "0123456789abcdef";
+
+/* Add 32-bit integers with 16-bit operations (bug in some JS-interpreters:
+ overflow) */
+function safe_add(x, y)
+{
+ var lsw = (x & 0xffff) + (y & 0xffff);
+ var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+ return (msw << 16) | (lsw & 0xffff);
+}
+
+/* Initialise the SHA256 computation */
+function sha256_init() {
+ ihash = new Array(8);
+ count = new Array(2);
+ buffer = new Array(64);
+ count[0] = count[1] = 0;
+ ihash[0] = 0x6a09e667;
+ ihash[1] = 0xbb67ae85;
+ ihash[2] = 0x3c6ef372;
+ ihash[3] = 0xa54ff53a;
+ ihash[4] = 0x510e527f;
+ ihash[5] = 0x9b05688c;
+ ihash[6] = 0x1f83d9ab;
+ ihash[7] = 0x5be0cd19;
+}
+
+/* Transform a 512-bit message block */
+function sha256_transform() {
+ var a, b, c, d, e, f, g, h, T1, T2;
+ var W = new Array(16);
+
+ /* Initialize registers with the previous intermediate value */
+ a = ihash[0];
+ b = ihash[1];
+ c = ihash[2];
+ d = ihash[3];
+ e = ihash[4];
+ f = ihash[5];
+ g = ihash[6];
+ h = ihash[7];
+
+ /* make 32-bit words */
+ for(var i=0; i<16; i++)
+ W[i] = ((buffer[(i<<2)+3]) | (buffer[(i<<2)+2] << 8) | (buffer[(i<<2)+1]
+ << 16) | (buffer[i<<2] << 24));
+
+ for(var j=0; j<64; j++) {
+ T1 = h + sha256_Sigma1(e) + choice(e, f, g) + K256[j];
+ if(j < 16) T1 += W[j];
+ else T1 += sha256_expand(W, j);
+ T2 = sha256_Sigma0(a) + majority(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = safe_add(d, T1);
+ d = c;
+ c = b;
+ b = a;
+ a = safe_add(T1, T2);
+ }
+
+ /* Compute the current intermediate hash value */
+ ihash[0] += a;
+ ihash[1] += b;
+ ihash[2] += c;
+ ihash[3] += d;
+ ihash[4] += e;
+ ihash[5] += f;
+ ihash[6] += g;
+ ihash[7] += h;
+}
+
+/* Read the next chunk of data and update the SHA256 computation */
+function sha256_update(data, inputLen) {
+ var i, index, curpos = 0;
+ /* Compute number of bytes mod 64 */
+ index = ((count[0] >> 3) & 0x3f);
+ var remainder = (inputLen & 0x3f);
+
+ /* Update number of bits */
+ if ((count[0] += (inputLen << 3)) < (inputLen << 3)) count[1]++;
+ count[1] += (inputLen >> 29);
+
+ /* Transform as many times as possible */
+ for(i=0; i+63<inputLen; i+=64) {
+ for(var j=index; j<64; j++)
+ buffer[j] = data.charCodeAt(curpos++);
+ sha256_transform();
+ index = 0;
+ }
+
+ /* Buffer remaining input */
+ for(var j=0; j<remainder; j++)
+ buffer[j] = data.charCodeAt(curpos++);
+}
+
+/* Finish the computation by operations such as padding */
+function sha256_final() {
+ var index = ((count[0] >> 3) & 0x3f);
+ buffer[index++] = 0x80;
+ if(index <= 56) {
+ for(var i=index; i<56; i++)
+ buffer[i] = 0;
+ } else {
+ for(var i=index; i<64; i++)
+ buffer[i] = 0;
+ sha256_transform();
+ for(var i=0; i<56; i++)
+ buffer[i] = 0;
+ }
+ buffer[56] = (count[1] >>> 24) & 0xff;
+ buffer[57] = (count[1] >>> 16) & 0xff;
+ buffer[58] = (count[1] >>> 8) & 0xff;
+ buffer[59] = count[1] & 0xff;
+ buffer[60] = (count[0] >>> 24) & 0xff;
+ buffer[61] = (count[0] >>> 16) & 0xff;
+ buffer[62] = (count[0] >>> 8) & 0xff;
+ buffer[63] = count[0] & 0xff;
+ sha256_transform();
+}
+
+/* Split the internal hash values into an array of bytes */
+function sha256_encode_bytes() {
+ var j=0;
+ var output = new Array(32);
+ for(var i=0; i<8; i++) {
+ output[j++] = ((ihash[i] >>> 24) & 0xff);
+ output[j++] = ((ihash[i] >>> 16) & 0xff);
+ output[j++] = ((ihash[i] >>> 8) & 0xff);
+ output[j++] = (ihash[i] & 0xff);
+ }
+ return output;
+}
+
+/* Get the internal hash as a hex string */
+function sha256_encode_hex() {
+ var output = new String();
+ for(var i=0; i<8; i++) {
+ for(var j=28; j>=0; j-=4)
+ output += sha256_hex_digits.charAt((ihash[i] >>> j) & 0x0f);
+ }
+ return output;
+}
+
+/* Main function: returns a hex string representing the SHA256 value of the
+ given data */
+function sha256_digest(data) {
+ sha256_init();
+ sha256_update(data, data.length);
+ sha256_final();
+ return sha256_encode_hex();
+}
+
+/* test if the JS-interpreter is working properly */
+function sha256_self_test()
+{
+ return sha256_digest("message digest") ==
+ "f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650";
+}
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/fetch-source.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/fetch-source.js
new file mode 100644
index 0000000..a0220c8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/fetch-source.js
@@ -0,0 +1,161 @@
+/* vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 foldmethod=marker: */
+
+/**
+ * HTTPS Everywhere Firefox Extension: https://www.eff.org/https-everywhere/
+ *
+ * Licensed under the GPL v3+.
+ *
+ * @copyright Copyright (C) 2010-2013 Mike Perry <mikeperry@fscked.org>
+ * Peter Eckersley <pde@eff.org>
+ * and many others.
+ */
+
+// Define https everywhere variable object that will act as a namespace, so that
+// global namespace pollution is avoided, although technically not required for
+// windows created by add-on.
+// See: https://developer.mozilla.org/en-US/docs/Security_best_practices_in_extensions#Code_wrapping
+if (!httpsEverywhere) { var httpsEverywhere = {}; }
+
+/**
+ * JS Object for fetching the XML source of rulesets.
+ *
+ * @author Pavel Kazakov <nullishzero@gmail.com>
+ */
+httpsEverywhere.fetchSource = {
+ // TODO: look into class constants
+ CC: Components.classes,
+ CI: Components.interfaces,
+
+ // Constants for generating URL from which source will be fetched
+ BASE_SITE: 'https://gitweb.torproject.org/https-everywhere.git/blob_plain/',
+ DIRECTORY: '/src/chrome/content/rules/',
+ HEAD_STRING: 'HEAD',
+
+ /**
+ * Initializes the window to view source.
+ */
+ init: function() {
+ var fs = httpsEverywhere.fetchSource;
+
+ if("arguments" in window && window.arguments.length > 0) {
+ var filename = window.arguments[0].xmlName;
+ var id = window.arguments[0].GITCommitID; //GIT commit ID
+ var URL = fs.getURL(filename, id);
+ var source = fs.getSource(URL, filename, false);
+ } else {
+ // Should never happen
+ throw 'Invalid window arguments.';
+ }
+ },
+
+ /**
+ * Generates a URL that can be used for viewing the ruleset source.
+ *
+ * @param filename name of ruleset to view, such as EFF.xml
+ * @param GITCommitID revision of ruleset
+ *
+ * @return string of URL
+ */
+ getURL: function(filename, GITCommitID) {
+ var fs = httpsEverywhere.fetchSource;
+ return fs.BASE_SITE + GITCommitID + ":" + fs.DIRECTORY + filename;
+ },
+
+ /**
+ * Sends HTTP request to view ruleset source and updates the window with the
+ * ruleset source.
+ *
+ * @param URL HTTP request will be sent to this URL
+ * @param filename used for displaying ruleset source
+ * @param useHead whether send request to latest revision of ruleset
+ */
+ getSource: function(URL, filename, useHead) {
+ var fs = httpsEverywhere.fetchSource;
+ fs.setFilenameText(filename);
+ fs.setPathText(URL);
+
+ var req = fs.CC["@mozilla.org/xmlextras/xmlhttprequest;1"]
+ .createInstance(fs.CI.nsIXMLHttpRequest);
+
+ // Use HTTP GET
+ req.open("GET", URL);
+
+ // Clear User-Agent so request is pseudo-anonymous
+ req.setRequestHeader("User-Agent", "");
+
+ // handle asynchronous request
+ req.onreadystatechange = function(params) {
+ if (req.readyState == 4) {
+
+ // HTTP Request was successful
+ if (req.status == 200) {
+ fs.setSourceText(req.responseText);
+ } else if (!useHead) {
+ // HTTP request was not successful and the request wasn't sent to
+ // get the latest revision. Therefore, if we can't fetch current
+ // revision (this project's revision might newer than lastest, for
+ // example), try to at least display the latest revision.
+ var URL = fs.getURL(filename, fs.HEAD_STRING);
+ fs.getSource(URL, filename, true);
+ } else {
+ // at least we tried...
+ fs.downloadFailed();
+ }
+ }
+ };
+
+ req.send();
+ },
+
+ /**
+ * Handle a download failure of ruleset.
+ */
+ downloadFailed: function() {
+ document.getElementById("source-text").hidden = true;
+ document.getElementById("failure-label").hidden = false;
+ },
+
+
+ /**
+ * Convenience method for setting ruleset source text.
+ *
+ * @param text ruleset source
+ */
+ setSourceText: function(text) {
+ var textBox = document.getElementById("source-text");
+ textBox.value = text;
+ },
+
+ /**
+ * Convenience method for setting filename text.
+ *
+ * @param text file name
+ */
+ setFilenameText: function (text) {
+ var textLabel = document.getElementById("filename-text");
+ textLabel.value = text;
+ },
+
+ /**
+ * Convenience method for setting the path (URL) that was used to fetch
+ * ruleset.
+ *
+ * @param text path text
+ */
+ setPathText: function(text) {
+ var textLabel = document.getElementById("path-text");
+ textLabel.value = text;
+ }
+};
+
+// TODO: Test resizing on mulitple platforms
+// adjust window resizing
+window.onresize = function() {
+ var textBox = document.getElementById("source-text");
+ // TODO: Move to constants
+ textBox.width = window.innerWidth - 100;
+ textBox.height = window.innerHeight - 150;
+};
+
+// hook event for init
+window.addEventListener("load", httpsEverywhere.fetchSource.init, false);
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/fetch-source.xul b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/fetch-source.xul
new file mode 100644
index 0000000..caa0048
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/fetch-source.xul
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+
+<!DOCTYPE overlay SYSTEM "chrome://https-everywhere/locale/https-everywhere.dtd">
+
+<dialog id="https-everywhere-fetch-xml"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ title="&https-everywhere.prefs.view_xml_source;"
+ persist="screenX screenY width height"
+ style="height:80%; resize:both;"
+ buttons="accept"
+ height="600"
+ width="650">
+
+
+ <script type="application/x-javascript" src="fetch-source.js"/>
+ <box orient="horizontal">
+ <label id="filename-label" value="&https-everywhere.source.filename;:"/>
+ <label id="filename-text"/>
+ </box>
+ <box orient="horizontal">
+ <label id="path-label" value="URL:"/>
+ <label id="path-text"/>
+ </box>
+ <separator class="thin"/>
+ <textbox id="source-text" multiline="true" readonly="true" value="&https-everywhere.source.downloading;..."/>
+ <label id="failure-label" hidden="true" value="&https-everywhere.source.unable_to_download;"/>
+</dialog>
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/meta-preferences.xul b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/meta-preferences.xul
new file mode 100644
index 0000000..3e48010
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/meta-preferences.xul
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://https-everywhere/content/preferences.css" type="text/css"?>
+
+<!DOCTYPE overlay SYSTEM "chrome://https-everywhere/locale/https-everywhere.dtd">
+
+<window id="https-everywhere-meta-prefs"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ title="&https-everywhere.prefs.title;"
+ persist="screenX screenY width height"
+ width="600"
+ height="600">
+ <separator class="thin" />
+ <tabbox flex="1">
+ <tabs>
+ <tab label="HTTPS Everywhere" />
+ <tab label="SSL Observatory" />
+ </tabs>
+ <tabpanels flex="1">
+ <tabpanel flex="1" orient="vertical">
+ <browser src="chrome://https-everywhere/content/preferences.xul" flex="1"/>
+ </tabpanel>
+ <tabpanel flex="1" orient="vertical">
+ <browser src="chrome://https-everywhere/content/observatory-preferences.xul" flex="1"/>
+ </tabpanel>
+ </tabpanels>
+ </tabbox>
+
+</window>
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/observatory-popup.xul b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/observatory-popup.xul
new file mode 100644
index 0000000..60da68f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/observatory-popup.xul
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<!DOCTYPE window SYSTEM "chrome://https-everywhere/locale/ssl-observatory.dtd">
+<window id="ssl-observatory-dialog"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ title="&ssl-observatory.popup.title;"
+ width="500"
+ height="440"
+ align="center"
+ onload="document.getElementById('ask-me-later').focus()"
+ >
+ <script type="application/x-javascript" src="observatory-xul.js" />
+ <image src="chrome://https-everywhere/skin/ssl-observatory-messy.jpg" />
+ <label style="padding:25px;">&ssl-observatory.popup.text;</label>
+
+ <commandgroup>
+ <command id="enable" oncommand="enable_observatory() ; popup_done()" />
+ <command id="nope" oncommand="disable_observatory() ; popup_done()" />
+ <command id="later" oncommand="window.close()" />
+ <command id="more-info"
+ oncommand='popup_done() ;
+ window.open("chrome://https-everywhere/content/observatory-preferences.xul","obsprefs",
+ "chrome, centerscreen")'/>
+ </commandgroup>
+
+ <vbox flex="1">
+ <spacer flex="5" />
+ <separator class="thin"/>
+ <hbox>
+ <spacer flex="2" />
+ <button label="&ssl-observatory.popup.yes;" tabindex="2" accesskey="y"
+ command='enable'/>
+ <spacer flex="1" />
+ <button label="&ssl-observatory.popup.no;" tabindex="3" accesskey="n"
+ command='nope'/>
+ <spacer flex="2" />
+ </hbox>
+ <separator class="thin"/>
+ <spacer flex="10" />
+ <hbox>
+ <spacer flex="2" />
+ <button label="&ssl-observatory.popup.details;" tabindex="4" accesskey="D"
+ command='more-info'/>
+ <spacer flex="1" />
+ <button id="ask-me-later" label="&ssl-observatory.popup.later;"
+ tabindex="1" accesskey="A" command='later'/>
+ <spacer flex="2" />
+ </hbox>
+ <separator class="thin"/>
+ <spacer flex="1" />
+ </vbox>
+
+ <!--
+ <hbox style="padding-top:10px;">
+ <label class="text-link" href="https://www.eff.org/" tabindex="3" value="&ssl-observatory.popup.details;" />
+ <spacer flex="1" />
+ <button label="&ssl-observatory.popup.later;" id="ask-me-later" tabindex="0" style="font-size:0.8em;" accesskey="l"
+ oncommand="doCancel()"/>-
+ </hbox>-->
+</window>
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/observatory-preferences.xul b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/observatory-preferences.xul
new file mode 100644
index 0000000..96102d0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/observatory-preferences.xul
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+
+<!DOCTYPE overlay SYSTEM "chrome://https-everywhere/locale/ssl-observatory.dtd">
+
+<dialog id="https-everywhere-prefs"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ buttons="accept"
+ buttonlabelaccept="&ssl-observatory.prefs.done;"
+ title="&ssl-observatory.prefs.title;"
+ width="800"
+ height="768"
+ persist="screenX screenY width height"
+ onload="observatory_prefs_init(document)"
+ ondialogaccept="observatory_prefs_accept()">
+ <script type="application/x-javascript" src="observatory-xul.js" />
+ <vbox flex="1" style="overflow:auto">
+ <spacer flex="1" />
+ <hbox flex="1">
+ <spacer flex="1" />
+ <image id="obs-title-logo"
+ src="chrome://https-everywhere/skin/ssl-observatory-messy.jpg" />
+ <spacer flex="1" />
+ </hbox>
+ <spacer flex="2" />
+ <label>&ssl-observatory.prefs.explanation;</label>
+ <separator class="thin" />
+ <label>&ssl-observatory.prefs.explanation2;</label>
+ <separator class="thin" />
+ <commandset>
+ <command id="toggle-enabled" oncommand="toggle_enabled()" />
+ <command id="use-obs-anon" oncommand="set_obs_anon(true)" />
+ <command id="use-obs-nonanon" oncommand="set_obs_anon(false)" />
+ <command id="toggle-alt-roots" oncommand="toggle_alt_roots()" />
+ <command id="toggle-send-asn" oncommand="toggle_send_asn()" />
+ <command id="toggle-priv-dns" oncommand="toggle_priv_dns()" />
+ <command id="toggle-self-signed" oncommand="toggle_self_signed()" />
+ </commandset>
+ <checkbox label="&ssl-observatory.prefs.use;" id="use-observatory"
+ command="toggle-enabled" style="font-size:1.5em;"/>
+ <separator class="thin"/>
+ <radiogroup style="margin-left:3em;" id="ssl-obs-how">
+ <radio label="&ssl-observatory.prefs.anonymous;"
+ tooltiptext="&ssl-observatory.prefs.anonymous_tooltip;"
+ alt_label="&ssl-observatory.prefs.anonymous_unavailable;"
+ command="use-obs-anon"
+ class="ssl-obs-conf" id="ssl-obs-anon"/>
+ <radio label="&ssl-observatory.prefs.nonanon;"
+ tooltiptext="&ssl-observatory.prefs.nonanon_tooltip;"
+ command="use-obs-nonanon"
+ class="ssl-obs-conf" id="ssl-obs-nonanon"/>
+ </radiogroup>
+ <separator class="thin"/>
+ <tooltip id="asn-tip" noautohide="true">
+ <label>&ssl-observatory.prefs.asn_tooltip;</label>
+ </tooltip>
+ <checkbox label="&ssl-observatory.prefs.asn;" id="send-asn"
+ tooltip="asn-tip" class="ssl-obs-conf"
+ command="toggle-send-asn"/>
+ <spacer flex="2" />
+ <hbox>
+ <spacer flex="1" />
+ <button label="&ssl-observatory.prefs.show;" onclick="show_advanced()"
+ id="show-advanced-button" class="ssl-obs-conf"/>
+ <button label="&ssl-observatory.prefs.hide;" onclick="hide_advanced()"
+ id="hide-advanced-button" hidden="true" />
+ <spacer flex="1" />
+ </hbox>
+ <spacer flex="1" />
+ <vbox flex="2">
+ <tooltip id="alt-roots-tip" noautohide="true">
+ <label>&ssl-observatory.prefs.alt_roots_tooltip;</label>
+ </tooltip>
+ <tooltip id="priv-dns-tip" noautohide="true">
+ <label>&ssl-observatory.prefs.priv_dns_tooltip;</label>
+ </tooltip>
+ <tooltip id="self-signed-tip" noautohide="true">
+ <label>&ssl-observatory.prefs.self_signed_tooltip;</label>
+ </tooltip>
+ <vbox id="observatory-advanced-opts" hidden="true">
+
+ <groupbox hidden="true" tooltip="self-signed-tip">
+ <checkbox label="&ssl-observatory.prefs.self_signed;"
+ class="ssl-obs-conf" id="self-signed"
+ command="toggle-self-signed"/>
+ </groupbox>
+
+ <groupbox hidden="true" tooltip="alt-roots-tip" >
+ <caption hidden="true" label="&ssl-observatory.prefs.adv_priv_opts1;"/>
+ <checkbox label="&ssl-observatory.prefs.alt_roots;"
+ command="toggle-alt-roots" class="ssl-obs-conf"
+ id="alt-roots" />
+ </groupbox>
+ <groupbox hidden="true" tooltip="priv-dns-tip">
+ <caption hidden="true" label="&ssl-observatory.prefs.adv_priv_opts2;"/>
+ <checkbox label="&ssl-observatory.prefs.priv_dns;"
+ class="ssl-obs-conf" id="priv-dns"
+ command="toggle-priv-dns"/>
+ </groupbox>
+ </vbox>
+ </vbox>
+ <spacer flex="5" />
+ </vbox>
+</dialog>
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/observatory-warning.xul b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/observatory-warning.xul
new file mode 100644
index 0000000..1f64e12
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/observatory-warning.xul
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<!DOCTYPE window SYSTEM "chrome://https-everywhere/locale/ssl-observatory.dtd">
+<window id="ssl-observatory-dialog"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ title="&ssl-observatory.warning.title;"
+ width="600"
+ height="500"
+ align="center"
+ onload="warning_populate(window.arguments[0])"
+ >
+ <script type="application/x-javascript" src="observatory-xul.js" />
+ <image src="chrome://https-everywhere/skin/ssl-observatory-messy.jpg" />
+ <vbox flex="1">
+ <vbox id="warning-container" flex="1">
+ <label style="padding:25px 25px 10px;">&ssl-observatory.warning.text;</label>
+ <spacer flex="1" />
+ </vbox>
+
+ <commandgroup>
+ <command id="showcert" oncommand="show_certs()" />
+ <command id="okay" oncommand='window.close()'
+ />
+ </commandgroup>
+
+ <spacer flex="1" />
+ <label style="padding:5px 25px 0px;">&ssl-observatory.warning.defense;</label>
+ <separator class="thin"/>
+ <hbox>
+ <spacer flex="2" />
+ <button label="&ssl-observatory.warning.showcert;" accesskey="S"
+ id="show-certificate" command='showcert'/>
+ <spacer flex="1" />
+ <button label="&ssl-observatory.warning.okay;" accesskey="I"
+ command='okay'/>
+ <spacer flex="2" />
+ </hbox>
+ <separator class="thin" />
+ </vbox>
+
+ <!--
+ <hbox style="padding-top:10px;">
+ <label class="text-link" href="https://www.eff.org/" tabindex="3" value="&ssl-observatory.popup.details;" />
+ <spacer flex="1" />
+ <button label="&ssl-observatory.popup.later;" id="ask-me-later" tabindex="0" style="font-size:0.8em;" accesskey="l"
+ oncommand="doCancel()"/>-
+ </hbox>-->
+</window>
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/observatory-xul.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/observatory-xul.js
new file mode 100644
index 0000000..df5e623
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/observatory-xul.js
@@ -0,0 +1,194 @@
+const CC = Components.classes;
+const CI = Components.interfaces;
+VERB=1;
+DBUG=2;
+INFO=3;
+NOTE=4;
+WARN=5;
+
+var ssl_observatory = CC["@eff.org/ssl-observatory;1"]
+ .getService(Components.interfaces.nsISupports)
+ .wrappedJSObject;
+var obsprefs = ssl_observatory.prefs;
+
+const pref_prefix = "extensions.ssl_observatory.";
+
+function observatory_prefs_init(doc) {
+ // Is the Observatory on?
+ var enabled = obsprefs.getBoolPref("extensions.https_everywhere._observatory.enabled");
+ document.getElementById("use-observatory").checked = enabled;
+ set_observatory_configurability(enabled);
+ // Other settings
+ document.getElementById("alt-roots").checked =
+ obsprefs.getBoolPref("extensions.https_everywhere._observatory.alt_roots");
+ document.getElementById("priv-dns").checked =
+ obsprefs.getBoolPref("extensions.https_everywhere._observatory.priv_dns");
+ document.getElementById("self-signed").checked =
+ obsprefs.getBoolPref("extensions.https_everywhere._observatory.self_signed");
+ document.getElementById("send-asn").checked =
+ obsprefs.getBoolPref("extensions.https_everywhere._observatory.send_asn");
+
+ // More complicated: is it anonymised by Tor?
+ var obs_how = doc.getElementById("ssl-obs-how");
+ var anon_radio = document.getElementById("ssl-obs-anon");
+ var nonanon_radio = document.getElementById("ssl-obs-nonanon");
+ var anon = !obsprefs.getBoolPref(
+ "extensions.https_everywhere._observatory.use_custom_proxy");
+
+ // first set the radios to match the current settings variables
+ obs_how.selectedItem = (anon) ? anon_radio : nonanon_radio;
+
+ // But if the user hasn't turned the observatory on,
+ // the default should be the maximally sensible one
+ var torbutton_avail = ssl_observatory.proxy_test_successful;
+ if (!enabled) {
+ set_obs_anon(torbutton_avail);
+ obs_how.selectedItem = (torbutton_avail) ? anon_radio : nonanon_radio;
+ }
+ //scale_title_logo();
+}
+
+// The user has responded to the popup in a final way; don't show it to them
+// again
+function popup_done() {
+ obsprefs.setBoolPref("extensions.https_everywhere._observatory.popup_shown", true);
+ obsprefs.setBoolPref("extensions.https_everywhere._observatory.clean_config", true);
+ window.close();
+}
+
+
+function scale_title_logo() {
+ // The image is naturally 500x207, but if it's shrunk we don't want it
+ // distorted
+ var img = document.getElementById("obs-title-logo");
+ alert("ch is " + img.height);
+ if (img.height != "207")
+ img.width = (500.0/207.0) * img.height;
+}
+
+// grey/ungrey UI elements that control observatory operation
+function set_observatory_configurability(enabled) {
+ // the relevant widgets are tagged with class="ssl-obs-conf"
+ var ui_elements = document.querySelectorAll(".ssl-obs-conf");
+ for (var i =0; i < ui_elements.length; i++)
+ ui_elements[i].disabled = !enabled;
+ // the "use tor" option can't be ungreyed unless tor is available
+ if (ssl_observatory.proxy_test_successful == false) {
+ var tor_opt = document.getElementById("ssl-obs-anon")
+ tor_opt.disabled = true;
+ tor_opt.label = tor_opt.getAttribute("alt_label");
+ }
+ if (!enabled)
+ hide_advanced();
+}
+
+// show/hide advanced options in the preferences dialog
+function show_advanced() {
+ var enabled = obsprefs.getBoolPref("extensions.https_everywhere._observatory.enabled");
+ if (enabled) {
+ var adv_opts_box = document.getElementById("observatory-advanced-opts");
+ recursive_set(adv_opts_box, "hidden", "false");
+ document.getElementById("show-advanced-button").hidden = true;
+ document.getElementById("hide-advanced-button").hidden = false;
+ }
+ //scale_title_logo();
+}
+function hide_advanced() {
+ var adv_opts_box = document.getElementById("observatory-advanced-opts");
+ recursive_set(adv_opts_box, "hidden", "true");
+ document.getElementById("show-advanced-button").hidden = false;
+ document.getElementById("hide-advanced-button").hidden = true;
+}
+
+function recursive_set(node, attrib, value) {
+ node.setAttribute(attrib, value);
+ for (var i=0; i < node.childNodes.length; i++)
+ recursive_set(node.childNodes[i], attrib, value)
+}
+
+
+function set_obs_anon(val) {
+ obsprefs.setBoolPref( "extensions.https_everywhere._observatory.use_custom_proxy", !val);
+}
+
+// called from the popup only
+function enable_observatory() {
+ obsprefs.setBoolPref("extensions.https_everywhere._observatory.enabled", true);
+ var torbutton_avail = ssl_observatory.proxy_test_successful;
+ set_obs_anon(torbutton_avail);
+}
+
+function disable_observatory() {
+ // default but be sure...
+ obsprefs.setBoolPref("extensions.https_everywhere._observatory.enabled", false);
+}
+
+// called from within the prefs window, we have more work to do:
+function toggle_enabled() {
+ var use_obs = document.getElementById("use-observatory").checked;
+ obsprefs.setBoolPref("extensions.https_everywhere._observatory.enabled", use_obs);
+ set_observatory_configurability(use_obs);
+}
+
+function toggle_send_asn() {
+ var send_asn = document.getElementById("send-asn").checked;
+ obsprefs.setBoolPref("extensions.https_everywhere._observatory.send_asn", send_asn);
+ if (send_asn) ssl_observatory.setupASNWatcher()
+ else ssl_observatory.stopASNWatcher();
+}
+
+function toggle_alt_roots() {
+ var alt_roots = document.getElementById("alt-roots").checked;
+ obsprefs.setBoolPref("extensions.https_everywhere._observatory.alt_roots", alt_roots);
+}
+
+function toggle_priv_dns() {
+ var priv_dns = document.getElementById("priv-dns").checked;
+ obsprefs.setBoolPref("extensions.https_everywhere._observatory.priv_dns", priv_dns);
+}
+
+function toggle_self_signed() {
+ var self_signed = document.getElementById("self-signed").checked;
+ obsprefs.setBoolPref("extensions.https_everywhere._observatory.self_signed", self_signed);
+}
+
+function observatory_prefs_accept() {
+ // This is *horrid*, but
+ // https://developer.mozilla.org/en/working_with_windows_in_chrome_code#Accessing_the_elements_of_the_top-level_document_from_a_child_window
+ var outer = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+ .getInterface(Components.interfaces.nsIWebNavigation)
+ .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
+ .rootTreeItem
+ .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+ .getInterface(Components.interfaces.nsIDOMWindow);
+
+ if (outer) outer.close()
+ else alert("no outer space");
+
+ return true; // https://developer.mozilla.org/en/XUL/dialog#a-ondialogaccept
+ // also close things if there is no out meta prefs window
+}
+
+function warning_populate(warningObj) {
+ // Fill in the SSL Observatory Warning labels...
+ var container = document.getElementById("warning-container");
+ for (var hash in warningObj) {
+ var label=document.createElement("label");
+ label.setAttribute("style","padding:5px 25px 5px;");
+ label.textContent = warningObj[hash].long_desc;
+ container.appendChild(label);
+ //var spacer=document.createElement("spacer");
+ //separator.setAttribute("flex","1");
+ //container.appendChild(spacer);
+ }
+}
+
+function show_certs() {
+ var parent_win = window.arguments[1];
+ var cert = window.arguments[2];
+ if (!parent_win)
+ alert("no parent window trying to show certs");
+ CC["@mozilla.org/nsCertificateDialogs;1"]
+ .getService(CI.nsICertificateDialogs)
+ .viewCert(parent_win, cert);
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/preferences.css b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/preferences.css
new file mode 100644
index 0000000..6b35c00
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/preferences.css
@@ -0,0 +1,11 @@
+treechildren::-moz-tree-checkbox { /* css for unchecked cells */
+ list-style-image: url("chrome://https-everywhere/skin/cross.png");
+}
+
+treechildren::-moz-tree-checkbox(checked) { /* css for checked cells */
+ list-style-image: url("chrome://https-everywhere/skin/tick.png");
+}
+
+treechildren::-moz-tree-checkbox(undefined) { /* css for empty cells */
+ list-style-image: url("");
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/preferences.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/preferences.js
new file mode 100644
index 0000000..557b335
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/preferences.js
@@ -0,0 +1,269 @@
+const CC = Components.classes;
+const CI = Components.interfaces;
+VERB=1;
+DBUG=2;
+INFO=3;
+NOTE=4;
+WARN=5;
+
+https_everywhere = CC["@eff.org/https-everywhere;1"]
+ .getService(Components.interfaces.nsISupports)
+ .wrappedJSObject;
+
+rulesets = [];
+
+const id_prefix = "he_enable";
+const pref_prefix = "extensions.https_everywhere.";
+const GITID = https_everywhere.https_rules.GITCommitID;
+
+// Disable all rules.
+function disable_all() {
+ for (var i in rulesets) {
+ rulesets[i].disable();
+ }
+
+ treeView.treebox.invalidate();
+}
+
+// Reset all rules to their default state.
+function reset_defaults() {
+ https_everywhere.https_rules.resetRulesetsToDefaults()
+ treeView.treebox.invalidate();
+}
+
+function resetSelected() {
+ var start = {};
+ var end = {};
+ var st = document.getElementById('sites_tree');
+ var sel = st.view.selection;
+ var numRanges = sel.getRangeCount();
+
+ for (var t = 0; t < numRanges; t++){
+ sel.getRangeAt(t, start, end);
+ for (var v = start.value; v <= end.value; v++){
+ var rs = treeView.rules[v];
+ rs.clear();
+ }
+ }
+}
+
+function resetSelectedMenu() {
+ var start = {};
+ var end = {};
+ var st = document.getElementById('sites_tree');
+ var sel = st.view.selection;
+ var numRanges = sel.getRangeCount();
+ var menuitem = document.getElementById("revert_menuitem");
+
+ for (var t = 0; t < numRanges; t++){
+ sel.getRangeAt(t, start, end);
+ for (var v = start.value; v <= end.value; v++){
+ var rs = treeView.rules[v];
+ if (rs.active !== rs.on_by_default) {
+ menuitem.disabled = false;
+ return;
+ }
+ }
+ }
+ menuitem.disabled = true;
+}
+
+function toggleSelected() {
+ var start = {};
+ var end = {};
+ var st = document.getElementById('sites_tree');
+ var sel = st.view.selection;
+ var numRanges = sel.getRangeCount();
+ var menuitem = document.getElementById("revert_menuitem");
+
+ for (var t = 0; t < numRanges; t++){
+ sel.getRangeAt(t, start, end);
+ for (var v = start.value; v <= end.value; v++){
+ var rs = treeView.rules[v];
+ rs.toggle();
+ treeView.treebox.invalidateRow(v);
+ }
+ }
+}
+
+
+function viewXMLSource() {
+ var start = {};
+ var end = {};
+ var st = document.getElementById('sites_tree');
+ var sel = st.view.selection;
+ var numRanges = sel.getRangeCount();
+ var menuitem = document.getElementById("revert_menuitem");
+
+ for (var t = 0; t < numRanges; t++){
+ sel.getRangeAt(t, start, end);
+ for (var v = start.value; v <= end.value; v++){
+ var rs = treeView.rules[v];
+
+ //This *should* not violate TorButton's State Control, but someone should double check
+ //this code just in case
+ var aWin = CC['@mozilla.org/appshell/window-mediator;1']
+ .getService(CI.nsIWindowMediator)
+ .getMostRecentWindow('navigator:browser');
+ aWin.openDialog("chrome://https-everywhere/content/fetch-source.xul",
+ rs.xmlName, "chrome,centerscreen",
+ {xmlName: rs.xmlName, GITCommitID: GITID} );
+ }
+ }
+}
+
+function getValue(row, col) {
+ switch (col.id) {
+ case "site_col":
+ return row.name;
+ case "note_col":
+ return row.notes;
+ case "enabled_col":
+ return https_everywhere.https_rules.rulesetsByName[row.name].active;
+ /*var ruleActive = false;
+ try {
+ if(https_everywhere.rule_toggle_prefs.getBoolPref(row.name))
+ ruleActive = true;
+ } catch(e) {
+ ruleActive = https_everywhere.https_rules.rulesetsByName[row.name].active;
+ }
+ return ruleActive;*/
+ default:
+ return;
+ }
+}
+
+function compareRules(a, b, col) {
+ var aval = getValue(a, col).toLowerCase();
+ var bval = getValue(b, col).toLowerCase();
+ var ret = 0;
+ if (aval < bval) {
+ ret = -1;
+ } else if (aval > bval) {
+ ret = 1;
+ } else {
+ ret = 0;
+ }
+ return ret;
+}
+
+function https_prefs_init(doc) {
+ var st = document.getElementById('sites_tree');
+ https_everywhere.https_rules.loadAllRulesets();
+ rulesets = Array.slice(https_everywhere.https_rules.rulesets);
+
+ // GLOBAL VARIABLE!
+ treeView = {
+ rules: rulesets,
+ rowCount: rulesets.length,
+ getCellValue: function(row, col) { // site names
+ if (!this.rules[row]) return;
+ return getValue(this.rules[row], col);
+ },
+ getCellText: function(row, col) { // activation indicator
+ return this.getCellValue(row, col);
+ },
+ setCellValue: function(row, col, val) { // toggle a rule's activation
+ var rule = this.rules[row];
+
+ if (val == "true") {
+ rule.enable();
+ } else {
+ rule.disable();
+ }
+
+ this.treebox.invalidateRow(row);
+ },
+ isEditable: function(row, col) {
+ return (col.id == "enabled_col");
+ },
+ setTree: function(treebox) {
+ this.treebox = treebox;
+ },
+ isContainer: function(row) { return false; },
+ isSeparator: function(row) { return false; },
+ isSorted: function() { return false; },
+ getRowProperties: function(row, props) {},
+ getColumnProperties: function(colid, col, props) {},
+ getCellProperties: function(row, col, props) {
+ if ( (col.id == "enabled_col") && !(this.rules[row]) ) {
+ var atomS = CC["@mozilla.org/atom-service;1"];
+ atomS = atomS.getService(CI.nsIAtomService);
+ // Starting with 22.0a1 there is no |props| available anymore. See:
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=407956. Looking at the
+ // patch the following seems to work, though.
+ if (!props) {
+ return "undefined";
+ }
+ props.AppendElement( atomS.getAtom("undefined") );
+ }
+ },
+ getLevel: function(row) { return 0; },
+ getImageSrc: function(row, col) { return null; },
+ search: function(query) {
+ var new_rules = [];
+ query = query.value.toLowerCase().replace(/^\s+|\s+$/g, "");
+
+ for (var i in rulesets) {
+ var rule_name = rulesets[i].name.toLowerCase();
+ if ( rule_name.indexOf(query) != -1 ) {
+ new_rules.push(rulesets[i]);
+ }
+ }
+
+ this.rules = new_rules;
+ this.rowCount = new_rules.length;
+ this.treebox.invalidate();
+ this.treebox.scrollToRow(rulesets[0]);
+ },
+ cycleHeader: function (col) {
+ var columnName;
+ var order = (col.element.getAttribute("sortDirection") === "ascending" ? -1 : 1);
+
+ var compare = function (a, b) {
+ return compareRules(a, b, col) * order;
+ };
+ rulesets.sort(compare);
+ this.rules.sort(compare);
+
+ var cols = st.getElementsByTagName("treecol");
+ for (var i = 0; i < cols.length; i++) {
+ cols[i].removeAttribute("sortDirection");
+ }
+ col.element.setAttribute("sortDirection", order === 1 ? "ascending" : "descending");
+ this.treebox.invalidate();
+ }
+ };
+
+ st.view = treeView;
+}
+
+function window_opener(uri) {
+ // we don't use window.open, because we need to work around TorButton's state control
+ if(typeof gBrowser == "undefined"){
+ var window = CC["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator);
+ var browserWindow = window.getMostRecentWindow("navigator:browser").getBrowser();
+ var newTab = browserWindow.addTab(uri, null, null);
+ browserWindow.selectedTab = newTab;
+
+ }
+ else
+ gBrowser.selectedTab = gBrowser.addTab(uri);
+}
+
+function https_prefs_accept() {
+ // This is *horrid*, but
+ // https://developer.mozilla.org/en/working_with_windows_in_chrome_code#Accessing_the_elements_of_the_top-level_document_from_a_child_window
+ var outer = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+ .getInterface(Components.interfaces.nsIWebNavigation)
+ .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
+ .rootTreeItem
+ .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+ .getInterface(Components.interfaces.nsIDOMWindow);
+
+ if (outer) outer.close();
+ else alert("no outer space");
+
+ return true; // https://developer.mozilla.org/en/XUL/dialog#a-ondialogaccept
+ // also close things if there is no out meta prefs window
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/preferences.xul b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/preferences.xul
new file mode 100644
index 0000000..ebde85b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/preferences.xul
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://https-everywhere/content/preferences.css" type="text/css"?>
+
+<!DOCTYPE overlay SYSTEM "chrome://https-everywhere/locale/https-everywhere.dtd">
+
+<dialog id="https-everywhere-prefs"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ buttons="accept,extra1,extra2"
+ buttonlabelextra1="&https-everywhere.prefs.disable_all;"
+ ondialogextra1="disable_all();"
+ buttonlabelextra2="&https-everywhere.prefs.reset_defaults;"
+ ondialogextra2="reset_defaults();"
+ title="&https-everywhere.prefs.title;"
+ persist="screenX screenY width height"
+ style="height:80%; resize:both;"
+ height="600"
+ width="650"
+ onload="https_prefs_init(document)"
+ ondialogaccept="https_prefs_accept()">
+
+ <script type="application/x-javascript" src="preferences.js"/>
+
+ <popupset>
+ <menupopup id="tree-contextmenu" onpopupshowing="resetSelectedMenu()">
+ <menuitem label="&https-everywhere.prefs.reset_default;" oncommand="resetSelected();" id="revert_menuitem"/>
+ <menuitem label="&https-everywhere.prefs.toggle;" oncommand="toggleSelected();"/>
+ <menuitem label="&https-everywhere.prefs.view_xml_source;" oncommand="viewXMLSource();"/>
+ </menupopup>
+ </popupset>
+
+ <groupbox flex="1">
+ <caption label="&https-everywhere.prefs.list_caption;"
+ align="center"/>
+ <vbox>
+ &https-everywhere.prefs.search;: <textbox id="tree_search" oninput="treeView.search(this);" />
+ </vbox>
+ <tree id="sites_tree" editable="true" flex="1" context="tree-contextmenu">
+ <treecols>
+ <treecol id="enabled_col" type="checkbox" label="&https-everywhere.prefs.enabled;"
+ editable="true" class="sortDirectionIndicator" persist="sortDirection width"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="site_col" label="&https-everywhere.prefs.site;" flex="1" editable="false" class="sortDirectionIndicator" persist="sortDirection width"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="note_col" label="&https-everywhere.prefs.notes;" flex="1" editable="false" class="sortDirectionIndicator" persist="sortDirection width"/>
+ </treecols>
+ <treechildren/>
+ </tree>
+ </groupbox>
+ <separator class="thin"/>
+ <vbox>
+ &https-everywhere.prefs.ruleset_howto;
+ <separator class="thin"/>
+ <label id="ruleset link"
+ value="&https-everywhere.prefs.here_link;"
+ style="color: blue; cursor:hand; text-decoration:underline;"
+ onmouseover="event.target.style.cursor='pointer'"
+ onmouseout="event.target.style.cursor='default'"
+ onclick="window_opener('https://eff.org/https-everywhere/rulesets')"/>.
+ </vbox>
+</dialog>
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/rules/00README b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/rules/00README
new file mode 100644
index 0000000..fcd8a77
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/rules/00README
@@ -0,0 +1,17 @@
+<!--
+This directory contains web site rewriting rules for the
+HTTPS Everywhere software, available from
+https://www.eff.org/https-everywhere
+
+These rules were contributed to the project by users and aim to
+enable routine secure access to as many different web sites as
+possible. They are automatically installed together with the
+HTTPS Everywhere software. The presence of these rules does not
+mean that an HTTPS Everywhere user accessed, or intended to
+access, any particular web site.
+
+For information about how to create additional HTTPS Everywhere
+rewriting rules to add support for new sites, please see
+
+https://www.eff.org/https-everywhere/rulesets
+-->
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.css b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.css
new file mode 100644
index 0000000..30dad18
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.css
@@ -0,0 +1,14 @@
+#ruleset-tests-status {
+ padding: 20px;
+}
+#wrapper {
+ text-align: center;
+}
+#progess-bar {
+ width: 300px;
+ height: 20px;
+}
+#log {
+ width: 400px;
+ height: 300px;
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.js
new file mode 100644
index 0000000..0bee33e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.js
@@ -0,0 +1,31 @@
+var HTTPSEverywhere = null;
+
+function updateStatusBar(current_test, total_tests) {
+ var labelText = "Test "+current_test+" of "+total_tests;
+ document.getElementById("progress-bar-label").value = labelText;
+
+ var percent = current_test / total_tests;
+ document.getElementById("progress-bar").value = percent;
+}
+
+function updateLog(msg) {
+ document.getElementById("log").value += msg+'\n';
+}
+
+function cancel() {
+ updateLog("Canceling early ...");
+ HTTPSEverywhere.httpseRulesetTests.cancel = true;
+}
+
+function start() {
+ HTTPSEverywhere = Components.classes["@eff.org/https-everywhere;1"]
+ .getService(Components.interfaces.nsISupports)
+ .wrappedJSObject;
+
+ HTTPSEverywhere.httpseRulesetTests.updateStatusBar = updateStatusBar;
+ HTTPSEverywhere.httpseRulesetTests.updateLog = updateLog;
+ HTTPSEverywhere.httpseRulesetTests.cancel = false;
+
+ updateLog("Starting ruleset tests ...");
+ HTTPSEverywhere.httpseRulesetTests.testRunner();
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.xul b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.xul
new file mode 100644
index 0000000..0efcd5d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.xul
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="ruleset-tests-status.css" type="text/css"?>
+<!DOCTYPE window SYSTEM "chrome://https-everywhere/locale/https-everywhere.dtd">
+<window id="ruleset-tests-status"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ title="&https-everywhere.ruleset-tests.status_title;"
+ >
+
+ <script type="application/x-javascript" src="ruleset-tests-status.js" />
+
+ <commandgroup>
+ <command id="cancel" oncommand="cancel();" />
+ <command id="start" oncommand="start();" />
+ </commandgroup>
+
+ <html:div id="wrapper">
+ <vbox flex="1" style="width:100%">
+ <label id="progress-bar-label" value="Click Start to start the tests"></label>
+
+ <spacer flex="1"/>
+
+ <progressmeter id="progress-bar" mode="determined" value="0" />
+
+ <spacer flex="1"/>
+
+ <textbox id="log" multiline="true" readonly="true" value="" />
+
+ <spacer flex="1"/>
+
+ <button
+ id="cancel-button"
+ label="&https-everywhere.ruleset-tests.status_cancel_button;"
+ command="cancel" />
+
+ <button
+ id="start-button"
+ label="&https-everywhere.ruleset-tests.status_start_button;"
+ command="start" />
+ </vbox>
+ </html:div>
+</window>
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests.js
new file mode 100644
index 0000000..1aa94d8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests.js
@@ -0,0 +1,155 @@
+// load the HTTPS Everywhere component
+var HTTPSEverywhere = null;
+try {
+ HTTPSEverywhere = Components.classes["@eff.org/https-everywhere;1"]
+ .getService(Components.interfaces.nsISupports)
+ .wrappedJSObject;
+} catch(e) {
+ // HTTPS Everywhere doesn't seem to be installed
+}
+
+// attach testRunner to the HTTPS Everywhere component so that status.js can run it
+if(HTTPSEverywhere) {
+ HTTPSEverywhere.httpseRulesetTests = {
+ testRunner: testRunner
+ };
+}
+
+
+function openStatus() {
+ // make sure mixed content blocking preferences are correct
+ Services.prefs.setBoolPref("security.mixed_content.block_display_content", false);
+ Services.prefs.setBoolPref("security.mixed_content.block_active_content", true);
+
+ // open the status tab
+ var statusTab = gBrowser.addTab('chrome://https-everywhere/content/ruleset-tests-status.xul');
+ gBrowser.selectedTab = statusTab;
+}
+
+function testRunner() {
+ Components.utils.import("resource://gre/modules/PopupNotifications.jsm");
+
+ const numTabs = 6;
+ var finished = false;
+ var output = [];
+ var urls = [];
+ var num = 0;
+
+ for(var target in HTTPSEverywhere.https_rules.targets) {
+ if(!target.indexOf("*") != -1) {
+ urls.push({
+ url: 'https://'+target,
+ target: target,
+ ruleset_names: HTTPSEverywhere.https_rules.targets[target]
+ });
+ }
+ }
+
+ function test() {
+ var i;
+
+ HTTPSEverywhere.httpseRulesetTests.updateStatusBar(num, urls.length);
+
+ // start loading all the tabs
+ window.focus
+ for(i=0; i<numTabs; i++) {
+ newTab(num);
+ }
+ }
+
+ function newTab(number) {
+ num +=1;
+ // start a test in this tab
+ if(urls.length) {
+
+ // open a new tab
+ var tab = gBrowser.addTab(urls[number].url);
+
+ // wait for the page to load
+ var intervalId = window.setTimeout(function(){
+
+ // detect mixed content blocker
+ if(PopupNotifications.getNotification("mixed-content-blocked", gBrowser.getBrowserForTab(tab))) {
+ // build output to log
+ ruleset_xmls = '';
+ for(let i=0; i<urls[number].ruleset_names.length; i++) {
+ ruleset_xmls += urls[number].ruleset_names[i].xmlName + ', ';
+ }
+ if(ruleset_xmls != '')
+ ruleset_xmls = ruleset_xmls.substring(ruleset_xmls.length-2, 2);
+ var output = 'MCB triggered: '+urls[number].url+' ('+ruleset_xmls+')';
+
+ HTTPSEverywhere.httpseRulesetTests.updateLog(output);
+ }
+
+ // close this tab, and open another
+ closeTab(tab);
+
+ }, 10000);
+
+ } else {
+
+ //to run if urls is empty
+ if (!finished) {
+ finished = true;
+ window.setTimeout(function(){
+ gBrowser.removeCurrentTab();
+ }, 10000);
+ }
+ }
+ }
+
+ //closes tab
+ function closeTab(tab) {
+ HTTPSEverywhere.httpseRulesetTests.updateStatusBar(num, urls.length);
+
+ gBrowser.selectedTab = tab;
+ gBrowser.removeCurrentTab();
+
+ // open a new tab, if the tests haven't been canceled
+ if(!HTTPSEverywhere.httpseRulesetTests.cancel) {
+ newTab(num);
+ }
+ }
+
+ //manages write out of output mochilog.txt, which contains sites that trigger mcb
+ function writeout(weburl) {
+
+ //initialize file
+ var file = Components.classes["@mozilla.org/file/directory_service;1"].
+ getService(Components.interfaces.nsIProperties).
+ get("Home", Components.interfaces.nsIFile);
+ writeoutfile = "mochilog.txt";
+ file.append(writeoutfile);
+
+ //create file if it does not already exist
+ if(!file.exists()) {
+ file.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 420);
+ }
+
+ //initialize output stream
+ var stream = Components.classes["@mozilla.org/network/file-output-stream;1"]
+ .createInstance(Components.interfaces.nsIFileOutputStream);
+
+ //permissions are set to append (will not delete existing contents)
+ stream.init(file, 0x02 | 0x08 | 0x10, 0666, 0);
+
+ var content = weburl + "\n";
+
+ //Deal with ascii text and write out
+ var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].
+ createInstance(Components.interfaces.nsIConverterOutputStream);
+ converter.init(stream, "UTF-8", 0, 0);
+ converter.writeString(content);
+ converter.close();
+
+ //alternative write out if ascii is not a concern
+ //stream.write(content,content.length);
+ //stream.close();
+
+ }
+ test();
+}
+
+
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/toolbar_button.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/toolbar_button.js
new file mode 100644
index 0000000..0e90a12
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/toolbar_button.js
@@ -0,0 +1,369 @@
+window.addEventListener("load", https_everywhere_load, true);
+window.addEventListener("load", function load(event) {
+ // need to wrap migratePreferences in another callback so that notification
+ // always displays on browser restart
+ window.removeEventListener("load", load, false);
+ gBrowser.addEventListener("DOMContentLoaded", migratePreferences, true);
+}, false);
+
+const CI = Components.interfaces;
+const CC = Components.classes;
+
+// LOG LEVELS ---
+VERB=1;
+DBUG=2;
+INFO=3;
+NOTE=4;
+WARN=5;
+
+HTTPSEverywhere = CC["@eff.org/https-everywhere;1"]
+ .getService(Components.interfaces.nsISupports)
+ .wrappedJSObject;
+
+// avoid polluting global namespace
+// see: https://developer.mozilla.org/en-US/docs/Security_best_practices_in_extensions#Code_wrapping
+if (!httpsEverywhere) { var httpsEverywhere = {}; }
+
+/**
+ * JS Object that acts as a namespace for the toolbar.
+ *
+ * Used to display toolbar hints to new users and change toolbar UI for cases
+ * such as when the toolbar is disabled.
+ */
+httpsEverywhere.toolbarButton = {
+
+ /**
+ * Name of preference for determining whether to show ruleset counter.
+ */
+ COUNTER_PREF: "extensions.https_everywhere.show_counter",
+
+ /**
+ * Used to determine if a hint has been previously shown.
+ * TODO: Probably extraneous, look into removing
+ */
+ hintShown: false,
+
+ /**
+ * Initialize the toolbar button used to hint new users and update UI on
+ * certain events.
+ */
+ init: function() {
+ HTTPSEverywhere.log(DBUG, 'Removing listener for toolbarButton init.');
+ window.removeEventListener('load', httpsEverywhere.toolbarButton.init, false);
+
+ var tb = httpsEverywhere.toolbarButton;
+
+ // make sure icon is proper color during init
+ tb.changeIcon();
+
+ // make sure the checkbox for showing counter is properly set
+ var showCounter = tb.shouldShowCounter();
+ var counterItem = document.getElementById('https-everywhere-counter-item');
+ counterItem.setAttribute('checked', showCounter ? 'true' : 'false');
+
+ // show ruleset counter when a tab is changed
+ tb.updateRulesetsApplied();
+ gBrowser.tabContainer.addEventListener(
+ 'TabSelect',
+ tb.updateRulesetsApplied,
+ false
+ );
+
+ // hook event for when page loads
+ var onPageLoad = function() {
+ // Timeout is used for a number of reasons.
+ // 1) For Performance since we want to defer computation.
+ // 2) Sometimes the page is loaded before all applied rulesets are
+ // calculated; in such a case, a half-second wait works.
+ setTimeout(tb.updateRulesetsApplied, 500);
+ };
+
+ var appcontent = document.getElementById('appcontent');
+ if (appcontent) {
+ appcontent.addEventListener('load', onPageLoad, true);
+ }
+
+ // decide whether to show toolbar hint
+ let hintPref = "extensions.https_everywhere.toolbar_hint_shown";
+ if (!Services.prefs.getPrefType(hintPref)
+ || !Services.prefs.getBoolPref(hintPref)) {
+ // only run once
+ Services.prefs.setBoolPref(hintPref, true);
+ gBrowser.addEventListener("DOMContentLoaded", tb.handleShowHint, true);
+ }
+ },
+
+ /**
+ * Shows toolbar hint if previously not shown.
+ */
+ handleShowHint: function() {
+ var tb = httpsEverywhere.toolbarButton;
+ if (!tb.hintShown){
+ tb.hintShown = true;
+ const faqURL = "https://www.eff.org/https-everywhere/faq";
+ var nBox = gBrowser.getNotificationBox();
+ var strings = document.getElementById('HttpsEverywhereStrings');
+ var msg = strings.getString('https-everywhere.toolbar.hint');
+ var hint = nBox.appendNotification(
+ msg,
+ 'https-everywhere',
+ 'chrome://https-everywhere/skin/https-everywhere-24.png',
+ nBox.PRIORITY_WARNING_MEDIUM,
+ [],
+ function(action) {
+ // see https://developer.mozilla.org/en-US/docs/XUL/Method/appendNotification#Notification_box_events
+ gBrowser.selectedTab = gBrowser.addTab(faqURL);
+ }
+ );
+ }
+ gBrowser.removeEventListener("DOMContentLoaded", tb.handleShowHint, true);
+ },
+
+ /**
+ * Changes HTTPS Everywhere toolbar icon based on whether HTTPS Everywhere
+ * is enabled or disabled.
+ */
+ changeIcon: function() {
+ var enabled = HTTPSEverywhere.prefs.getBoolPref("globalEnabled");
+
+ var toolbarbutton = document.getElementById('https-everywhere-button');
+ if (enabled) {
+ toolbarbutton.setAttribute('status', 'enabled');
+ } else {
+ toolbarbutton.setAttribute('status', 'disabled');
+ }
+ },
+
+ /**
+ * Update the rulesets applied counter for the current tab.
+ */
+ updateRulesetsApplied: function() {
+ var toolbarbutton = document.getElementById('https-everywhere-button');
+ var enabled = HTTPSEverywhere.prefs.getBoolPref("globalEnabled");
+ var showCounter = httpsEverywhere.toolbarButton.shouldShowCounter();
+ if (!enabled || !showCounter) {
+ toolbarbutton.setAttribute('rulesetsApplied', 0);
+ return;
+ }
+
+ var domWin = content.document.defaultView.top;
+ var alist = HTTPSEverywhere.getExpando(domWin,"applicable_rules", null);
+ if (!alist) {
+ return;
+ }
+ // Make sure the list is up to date
+ alist.populate_list();
+
+ var counter = 0;
+ for (var x in alist.active) {
+ if (!(x in alist.breaking)) {
+ ++counter;
+ }
+ }
+ for (var x in alist.moot) {
+ if (!(x in alist.active)) {
+ ++counter;
+ }
+ }
+
+ toolbarbutton.setAttribute('rulesetsApplied', counter);
+ HTTPSEverywhere.log(INFO, 'Setting icon counter to: ' + counter);
+ },
+
+ /**
+ * Gets whether to show the rulesets applied counter.
+ *
+ * @return {boolean}
+ */
+ shouldShowCounter: function() {
+ var tb = httpsEverywhere.toolbarButton;
+ var sp = Services.prefs;
+
+ var prefExists = sp.getPrefType(tb.COUNTER_PREF);
+
+ // the default behavior is to show the rulesets applied counter.
+ // if no preference exists (default) or its enabled, show the counter
+ return !prefExists || sp.getBoolPref(tb.COUNTER_PREF);
+ },
+
+ /**
+ * Toggles the user's preference for displaying the rulesets applied counter
+ * and updates the UI.
+ */
+ toggleShowCounter: function() {
+ var tb = httpsEverywhere.toolbarButton;
+ var sp = Services.prefs;
+
+ var showCounter = tb.shouldShowCounter();
+ sp.setBoolPref(tb.COUNTER_PREF, !showCounter);
+
+ tb.updateRulesetsApplied();
+ }
+
+};
+
+function https_everywhere_load() {
+ window.removeEventListener('load', https_everywhere_load, true);
+ // on first run, put the context menu in the addons bar
+ try {
+ var first_run;
+ try {
+ first_run = Services.prefs.getBoolPref("extensions.https_everywhere.firstrun_context_menu");
+ } catch(e) {
+ Services.prefs.setBoolPref("extensions.https_everywhere.firstrun_context_menu", true);
+ first_run = true;
+ }
+ if(first_run) {
+ Services.prefs.setBoolPref("extensions.https_everywhere.firstrun_context_menu", false);
+ var navbar = document.getElementById("nav-bar");
+ if(navbar.currentSet.indexOf("https-everywhere-button") == -1) {
+ var set = navbar.currentSet+',https-everywhere-button';
+ navbar.setAttribute('currentset', set);
+ navbar.currentSet = set;
+ document.persist('nav-bar', 'currentset');
+ }
+ }
+ } catch(e) { }
+}
+
+function stitch_context_menu() {
+ // the same menu appears both under Tools and via the toolbar button:
+ var menu = document.getElementById("https-everywhere-menu");
+ if (!menu.firstChild) {
+ var popup = document.getElementById("https-everywhere-context");
+ menu.appendChild(popup.cloneNode(true));
+ }
+}
+function stitch_context_menu2() {
+ // the same menu appears both under Tools and via the toolbar button:
+ var menu = document.getElementById("https-everywhere-menu2");
+ if (!menu.firstChild) {
+ var popup = document.getElementById("https-everywhere-context");
+ menu.appendChild(popup.cloneNode(true));
+ }
+}
+
+var rulesetTestsMenuItem = null;
+
+function show_applicable_list(menupopup) {
+ var domWin = content.document.defaultView.top;
+ if (!(domWin instanceof CI.nsIDOMWindow)) {
+ alert(domWin + " is not an nsIDOMWindow");
+ return null;
+ }
+
+ var alist = HTTPSEverywhere.getExpando(domWin,"applicable_rules", null);
+ var weird=false;
+
+ if (!alist) {
+ // This case occurs for error pages and similar. We need a dummy alist
+ // because populate_menu lives in there. Would be good to refactor this
+ // away.
+ alist = new HTTPSEverywhere.ApplicableList(HTTPSEverywhere.log, document, domWin);
+ weird = true;
+ }
+ alist.populate_menu(document, menupopup, weird);
+
+ // should we also show the ruleset tests menu item?
+ if(HTTPSEverywhere.prefs.getBoolPref("show_ruleset_tests")) {
+
+ if(!rulesetTestsMenuItem) {
+ let strings = document.getElementById('HttpsEverywhereStrings');
+ let label = strings.getString('https-everywhere.menu.ruleset-tests');
+
+ rulesetTestsMenuItem = this.document.createElement('menuitem');
+ rulesetTestsMenuItem.setAttribute('command', 'https-everywhere-menuitem-ruleset-tests');
+ rulesetTestsMenuItem.setAttribute('label', label);
+ }
+
+ if(!menupopup.contains(rulesetTestsMenuItem))
+ menupopup.appendChild(rulesetTestsMenuItem);
+ }
+
+}
+
+function toggle_rule(rule_id) {
+ // toggle the rule state
+ HTTPSEverywhere.https_rules.rulesetsByID[rule_id].toggle();
+ var domWin = content.document.defaultView.top;
+ /*if (domWin instanceof CI.nsIDOMWindow) {
+ var alist = HTTPSEverywhere.getExpando(domWin,"applicable_rules", null);
+ if (alist) alist.empty();
+ }*/
+ reload_window();
+}
+
+function reload_window() {
+ var domWin = content.document.defaultView.top;
+ if (!(domWin instanceof CI.nsIDOMWindow)) {
+ HTTPSEverywhere.log(WARN, domWin + " is not an nsIDOMWindow");
+ return null;
+ }
+ try {
+ var webNav = domWin.QueryInterface(CI.nsIInterfaceRequestor)
+ .getInterface(CI.nsIWebNavigation)
+ .QueryInterface(CI.nsIDocShell);
+ } catch(e) {
+ HTTPSEverywhere.log(WARN,"failed to get webNav");
+ return null;
+ }
+ // This choice of flags comes from NoScript's quickReload function; not sure
+ // if it's optimal
+ webNav.reload(webNav.LOAD_FLAGS_CHARSET_CHANGE);
+}
+
+function toggleEnabledState(){
+ HTTPSEverywhere.toggleEnabledState();
+ reload_window();
+
+ // Change icon depending on enabled state
+ httpsEverywhere.toolbarButton.changeIcon();
+}
+
+function open_in_tab(url) {
+ var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
+ .getService(Components.interfaces.nsIWindowMediator);
+ var recentWindow = wm.getMostRecentWindow("navigator:browser");
+ recentWindow.delayedOpenTab(url, null, null, null, null);
+}
+
+// hook event for showing hint
+HTTPSEverywhere.log(DBUG, 'Adding listener for toolbarButton init.');
+window.addEventListener("load", httpsEverywhere.toolbarButton.init, false);
+
+function migratePreferences() {
+ gBrowser.removeEventListener("DOMContentLoaded", migratePreferences, true);
+ let prefs_version = HTTPSEverywhere.prefs.getIntPref("prefs_version");
+
+ // first migration loses saved prefs
+ if(prefs_version == 0) {
+ try {
+ // upgrades will have old rules as preferences, such as the EFF rule
+ let upgrade = false;
+ let childList = HTTPSEverywhere.prefs.getChildList("", {});
+ for(let i=0; i<childList.length; i++) {
+ if(childList[i] == 'EFF') {
+ upgrade = true;
+ break;
+ }
+ }
+
+ if(upgrade) {
+ let nBox = gBrowser.getNotificationBox();
+ let strings = document.getElementById('HttpsEverywhereStrings');
+ let msg = strings.getString('https-everywhere.migration.notification0');
+ nBox.appendNotification(
+ msg,
+ 'https-everywhere-migration0',
+ 'chrome://https-everywhere/skin/https-everywhere-24.png',
+ nBox.PRIORITY_WARNING_MEDIUM
+ );
+ }
+ } catch(e) {
+ HTTPSEverywhere.log(WARN, "Migration from prefs_version 0 error: "+e);
+ }
+
+ HTTPSEverywhere.prefs.setIntPref("prefs_version", prefs_version+1);
+ }
+}
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/toolbar_button.xul b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/toolbar_button.xul
new file mode 100644
index 0000000..c3cbed0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/toolbar_button.xul
@@ -0,0 +1,71 @@
+<?xml version="1.0"?>
+<?xml-stylesheet href="chrome://https-everywhere/skin/https-everywhere.css" type="text/css"?>
+
+<!DOCTYPE overlay SYSTEM "chrome://https-everywhere/locale/https-everywhere.dtd">
+
+<!-- helpful docs at
+ https://developer.mozilla.org/en/XUL/PopupGuide/PopupEvents -->
+
+<overlay id="https-everywhere-button-overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+ <script type="application/x-javascript" src="chrome://https-everywhere/content/toolbar_button.js"/>
+ <script type="application/x-javascript" src="chrome://https-everywhere/content/ruleset-tests.js"/>
+
+ <stringbundleset id="stringbundleset">
+ <stringbundle id="HttpsEverywhereStrings"
+ src="chrome://https-everywhere/locale/https-everywhere.properties" />
+ </stringbundleset>
+
+ <!-- this works in Firefox, we need a Seamonkey version too... -->
+ <menupopup id="menu_ToolsPopup" onpopupshowing="stitch_context_menu()">
+ <menu id="https-everywhere-menu" label="&https-everywhere.about.ext_name;">
+ <!-- "https-everywhere-context" below gets .cloneNode()ed in here -->
+ </menu>
+ </menupopup>
+
+ <menupopup id="toolsPopup" onpopupshowing="stitch_context_menu2()">
+ <menu id="https-everywhere-menu2" label="&https-everywhere.about.ext_name;">
+ <!-- "https-everywhere-context" below gets .cloneNode()ed in here -->
+ </menu>
+ </menupopup>
+
+ <toolbarpalette id="BrowserToolbarPalette">
+ <toolbarbutton
+ id="https-everywhere-button"
+ tooltiptext="&https-everywhere.about.ext_name;"
+ label="HTTPS"
+ context="https-everywhere-context-menu"
+ oncontextmenu="this.open = true;"
+ oncommand="this.open = true;"
+ buttonstyle="pictures"
+ type="menu"
+ rulesetsApplied="0">
+
+ <menupopup id="https-everywhere-context" onpopupshowing="show_applicable_list(this)">
+ <!-- entries will be written here by ApplicableList.populate_menu() -->
+ <menuseparator />
+ <menuitem type="checkbox" id="https-everywhere-counter-item" label="&https-everywhere.menu.showCounter;"
+ oncommand="httpsEverywhere.toolbarButton.toggleShowCounter()" />
+ <menuseparator />
+ <menuitem label="&https-everywhere.menu.observatory;" command="https-everywhere-menuitem-observatory" />
+ <menuitem label="&https-everywhere.menu.about;" command="https-everywhere-menuitem-about" />
+ </menupopup>
+ </toolbarbutton>
+ </toolbarpalette>
+ <commandset>
+ <command id="https-everywhere-menuitem-globalEnableToggle"
+ oncommand="toggleEnabledState();" />
+ <command id="https-everywhere-menuitem-preferences"
+ oncommand="HTTPSEverywhere.chrome_opener('chrome://https-everywhere/content/preferences.xul', 'chrome,centerscreen,resizable=yes');" />
+ <command id="https-everywhere-menuitem-about"
+ oncommand="HTTPSEverywhere.chrome_opener('chrome://https-everywhere/content/about.xul');" />
+ <command id="https-everywhere-menuitem-observatory"
+ oncommand="HTTPSEverywhere.chrome_opener('chrome://https-everywhere/content/observatory-preferences.xul', 'chrome,centerscreen,resizable=yes');" />
+ <command id="https-everywhere-menuitem-donate-eff"
+ oncommand="open_in_tab('https://www.eff.org/donate');" />
+ <command id="https-everywhere-menuitem-donate-tor"
+ oncommand="open_in_tab('https://www.torproject.org/donate');" />
+ <command id="https-everywhere-menuitem-ruleset-tests"
+ oncommand="openStatus();" />
+ </commandset>
+</overlay>
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/toolbar_button_binding.xml b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/toolbar_button_binding.xml
new file mode 100644
index 0000000..1981b3a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/content/toolbar_button_binding.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!--
+Toolbar button needs to be extended to show a counter for the number of
+rulesets applied, and this can be done using XBL.
+
+See: https://developer.mozilla.org/en-US/docs/XBL
+-->
+<bindings xmlns="http://www.mozilla.org/xbl"
+ xmlns:xbl="http://www.mozilla.org/xbl"
+ xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+ <binding id="https-everywhere-binding">
+ <content>
+ <!-- ruleset counter (rscounter) and rulesets applied (rsapplied) -->
+ <xul:stack id="rscounter">
+ <xul:label id="rsapplied" xbl:inherits="value=rulesetsApplied" />
+ </xul:stack>
+
+ <!--
+ Https everywhere toolbar button is already defined; just use its settings.
+ TODO: Look into any issues with oncommand/oncontext.
+ -->
+ <xul:toolbarbutton
+ class="https-everywhere-button toolbarbutton-1 chromeclass-toolbar-additional"
+ flex="1"
+ allowevents="true"
+ xbl:inherits="type,crop,image,label,accesskey,command,align,dir,pack,orient,wrap">
+
+ <children includes="menupopup" />
+ </xul:toolbarbutton>
+ </content>
+ </binding>
+</bindings>
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ar/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ar/https-everywhere.dtd
new file mode 100644
index 0000000..00b898e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ar/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "عن HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Ø´ÙØ± شبكة الإنترنت! استخدم تلقائيا تقنية HTTPS للأمان مع الكثير من المواقع.">
+<!ENTITY https-everywhere.about.version "النسخة">
+<!ENTITY https-everywhere.about.created_by "أنشأه">
+<!ENTITY https-everywhere.about.librarians "جامعيْ القواعد">
+<!ENTITY https-everywhere.about.thanks "شكراً لكل من">
+<!ENTITY https-everywhere.about.contribute "إن أعجبتك Ø¥Ø¶Ø§ÙØ© HTTPS EverywhereØŒ Ùكر بـ">
+<!ENTITY https-everywhere.about.donate_tor "التبرع لتور">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "التبرع للـ EFF">
+
+<!ENTITY https-everywhere.menu.about "عن HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "خيارات مرصد SSL">
+<!ENTITY https-everywhere.menu.globalEnable "ÙØ¹Ù‘Ù„ HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "عطّل HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "خيارات HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "ÙØ¹Ù‘Ù„ الكل">
+<!ENTITY https-everywhere.prefs.disable_all "عطّل الكل">
+<!ENTITY https-everywhere.prefs.reset_defaults "استعادة الإعدادات Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ©">
+<!ENTITY https-everywhere.prefs.search "بحث">
+<!ENTITY https-everywhere.prefs.site "موقع">
+<!ENTITY https-everywhere.prefs.notes "ملاحظات">
+<!ENTITY https-everywhere.prefs.list_caption "أي من قواعد إعادة توجيه HTTPS يجب أن تطبق؟">
+<!ENTITY https-everywhere.prefs.enabled "Ù…ÙØ¹Ù‘Ù„">
+<!ENTITY https-everywhere.prefs.ruleset_howto "يمكنك تعلم كيÙية كتابة قواعد خاصة بك (Ù„Ø¥Ø¶Ø§ÙØ© الدعم لمواقع أخرى)">
+<!ENTITY https-everywhere.prefs.here_link "هنا">
+<!ENTITY https-everywhere.prefs.toggle "بدّل">
+<!ENTITY https-everywhere.prefs.reset_default "استعادة الإعداد Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ">
+<!ENTITY https-everywhere.prefs.view_xml_source "Ø§ÙØ­Øµ مصدر XML">
+
+<!ENTITY https-everywhere.source.downloading "يحÙمل حالياً">
+<!ENTITY https-everywhere.source.filename "اسم الملÙ">
+<!ENTITY https-everywhere.source.unable_to_download "تعذّر تنزيل المصدر.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "عذراً. انت كنت تستخدم اصدار مستقر من HTTPS Everywhere، ولكن تم تحديث اصدارك إلي الاصدار التجريبي عن طريق الخطء.">
+<!ENTITY https-everywhere.popup.paragraph2 "هل ترغب ÙÙŠ العودة للاصدار المستقر؟">
+<!ENTITY https-everywhere.popup.paragraph3 "كنا نحب لو واصلت استخدام الاصدار التجريبي من HTTPS Everywhere لان ذلك يساعدنا علي جعل البرنامج Ø£ÙØ¶Ù„! قد تجد ÙÙŠ الاصدار التجريبي بعض الأخطاء التي يمكنك ان تبلغ عنها بمراسلة https-everywhere@eff.org. نآس٠على الإزعاج Ùˆ شكراً لأستخدامك HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "ابقني علي الاصدار التجريبي">
+<!ENTITY https-everywhere.popup.revert "حمل الاصدار المستقر الاخير">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ar/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ar/https-everywhere.properties
new file mode 100644
index 0000000..2618335
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ar/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = ÙØ¹Ù‘Ù„ HTTPS Everywhere
+https-everywhere.menu.globalDisable = أوق٠HTTPS Everywhere
+https-everywhere.menu.enableDisable = ÙØ¹Ù„ / اوق٠القوانين
+https-everywhere.menu.noRules = (هذه Ø§Ù„ØµÙØ­Ø© لا تحتوي على قوانين)
+https-everywhere.menu.unknownRules = (قواين هذه Ø§Ù„ØµÙØ­Ø© غير Ù…Ø¹Ø±ÙˆÙØ©)
+https-everywhere.toolbar.hint = HTTPS Everywhere Ù…ÙØ¹Ù„ الان. يمكنك ØªÙØ¹ÙŠÙ„Ù‡ او تعطيله علي حسب الموقع الذي تزور عن طريق الضغط علي الرمز ÙÙŠ شريطة العناوين.
+https-everywhere.migration.notification0 = من أجل أن تنÙيذ اصلاح مهم، هذا التحديث يعيد قوانين HTTPS Everywhere إلى حالتها Ø§Ù„Ø¥ÙØªØ±Ø§Ø¶ÙŠØ©.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ar/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ar/ssl-observatory.dtd
new file mode 100644
index 0000000..04e3e91
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ar/ssl-observatory.dtd
@@ -0,0 +1,97 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Ø§Ù„ØªÙØ§ØµÙŠÙ„ ومعلومات الخصوصية">
+<!ENTITY ssl-observatory.popup.later "إسألني لاحقاً">
+<!ENTITY ssl-observatory.popup.no "لا">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere يمكن له أن يكتش٠الهجمات
+ضد Ù…ØªØµÙØ­Ùƒ عبر إرسال الشهادات التي تستقبلها إلى المرصد.
+هل تريد تشغيل هذه الخاصية؟">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"هل تريد أن يستخدم HTTPS Everywhere خاصية SSL Observatory؟">
+
+<!ENTITY ssl-observatory.popup.yes "نعم">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"ان استخدام تلك الخاصية آمن إلا إذا كنت تستخدم الإنترنت ضمن شبكة شركة ذات إعدادات رقابية:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"آمن، إلا إذا كنت تستخدم شبكة شركة داخلية تستخدم أسماء سرية لخوادمها:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"أرسل وتحقق من الشهادات الموقعة بواسطة سلطة غير معتمدة.">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"من الآمن (والمستحسن) ØªÙØ¹ÙŠÙ„ هذا الخيار، إلا إذا كنت تستخدم شبكة شركة تطÙلية أو برنامج كاسبرسكي المضاد للڤيروسات الذي يراقب ØªØµÙØ­Ùƒ عن طريق TLS بروكسي Ùˆ private root Certificate Authority. إذا ÙØ¹Ù„ت الخاصية على شبكة مماثلة، قد ينشر هذا الخيار أدلة على أي نطاقات https:// تمت زيارتها عبر ذلك البروكسي، وذلك بسبب الشهادات Ø§Ù„ÙØ±ÙŠØ¯Ø© التي يمكن أن ينتجها. ولذلك نحن نتركه غير Ù…ÙØ¹Ù„ ÙÙŠ الإعدادات Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ©.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "تحقق من الشهادات باستخدام تور Ù„Ø¥Ø®ÙØ§Ø¡ الهوية">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"تحقق من الشهادات باستخدام تور Ù„Ø¥Ø®ÙØ§Ø¡ الهوية (يتطلب تور)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"يتطلب هذا الخيار تثبيت و تشغيل تور">
+
+<!ENTITY ssl-observatory.prefs.asn
+"عندما ترى شهادة جديدة، أخبر المرصد عن هوية مزود خدمة الإنترنت الخاص بك.">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"هذا سيجلب Ùˆ يرسل &quot;رقم النظام المستقل&quot; الخاص بشبكتك. هذا سيساعدنا على تحديد موقع الهجمات ضد HTTPSØŒ وتحديد ما إذا كان لدينا ملاحظات من شبكات ÙÙŠ أماكن مثل سوريا وإيران حيث هذه الهجمات شائعة نسبياً.">
+
+<!ENTITY ssl-observatory.prefs.done "انتهى">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere يمكن له أن يستخدم مرصد SSL من الـEFF وهذا يعني شيئين: (۱)
+إرسال نسخ من شهادات HTTPS إلى المرصد لمساعدتنا على كش٠هجمات 'رجل-ÙÙŠ-الوسط'
+ وتحسين الأمان على الإنترنت، Ùˆ (Ù¢) يسمح لنا بتحذيرك عن الاتصالات غير الآمنة أو الهجمات على Ù…ØªØµÙØ­Ùƒ.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"على سبيل المثال، عندما تقوم بزيارة https://www.something.com, ÙØ¥Ù† الشهادة
+التي يتلقاها المرصد تشير إلى أن شخصاً ما قام بزيارة www.something.com, ولكن ليس من قام بالزيارة
+أو ما هي Ø§Ù„ØµÙØ­Ø§Øª التي قاموا بقراءتها. أشر Ø¨Ø§Ù„ÙØ£Ø±Ø© Ùوق الخيار للمزيد من Ø§Ù„ØªÙØ§ØµÙŠÙ„:">
+
+<!ENTITY ssl-observatory.prefs.hide "أخÙ٠الخيارات المتقدمة">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"تحقق من الشهادات حتى لو لم يكن تور متاح">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"سنحاول Ø§Ù„Ø­ÙØ§Ø¸ على سرية البيانات، ولكن هذا الخيار أقل أمناً">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"أرسل وتحقق من شهادات أسماء DNS غير العامة">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"ما لم يتم تحديد هذا الخيار، لن يسجل المرصد الشهادات للأسماء التي لا يستطيع حلها عبر نظام DNS.">
+
+<!ENTITY ssl-observatory.prefs.show "أظهر الخيارات المتقدمة">
+
+<!ENTITY ssl-observatory.prefs.title "ØªÙØ¶ÙŠÙ„ات مرصد SSL">
+
+<!ENTITY ssl-observatory.prefs.use "استخدم المرصد؟">
+<!ENTITY ssl-observatory.warning.title "تحذير من مرصد SSL الخاص بـEFF">
+<!ENTITY ssl-observatory.warning.showcert "أظهر سلسة الشهادة">
+<!ENTITY ssl-observatory.warning.okay "أنا Ø£Ùهم">
+<!ENTITY ssl-observatory.warning.text "أصدر مرصد SSL من الـEFF تحذيراً حول شهادة ( أو شهادات) HTTPS لهذا الموقع:">
+<!ENTITY ssl-observatory.warning.defense "إن كنت مسجل الدخول ÙÙŠ هذا الموقع، ننصحك بتغيير كلمة السر عندما تحصل علي اتصال آمن بالإنترنت.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"اعرض و تحقق من الشهادات الموقعة ذاتياً">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"هذا Ù…ÙØ¶Ù„ ; Ùمشاكل التشÙير شائعة بشكل خاص ÙÙŠ الأجهزة المدمجة الموقعة ذاتياً">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/bg/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/bg/https-everywhere.dtd
new file mode 100644
index 0000000..6bf445f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/bg/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "За HTTPS на вÑÑкаде">
+<!ENTITY https-everywhere.about.ext_name "HTTPS на вÑÑкаде">
+<!ENTITY https-everywhere.about.ext_description "Заключи интернетат! Ðвтоматично ползваи HTTPS защита на много Ñтраници.">
+<!ENTITY https-everywhere.about.version "ВерÑиÑ">
+<!ENTITY https-everywhere.about.created_by "Създаване от">
+<!ENTITY https-everywhere.about.librarians "Правилни Книжарници">
+<!ENTITY https-everywhere.about.thanks "Ð‘Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ Ð½Ð°">
+<!ENTITY https-everywhere.about.contribute "Ðко хареÑвате HTTPS на вÑÑкаде, можете да разгледате">
+<!ENTITY https-everywhere.about.donate_tor "ДарÑване към">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "ДарÑване към ЕФФ">
+
+<!ENTITY https-everywhere.menu.about "За HTTPS на вÑÑкаде">
+<!ENTITY https-everywhere.menu.observatory "SSL ОбÑÐµÑ€Ð¶Ð°Ñ‚Ð¾Ñ€Ð¸Ñ Ð½Ð°Ñтроики">
+<!ENTITY https-everywhere.menu.globalEnable "Включете HTTPS на вÑÑкаде">
+<!ENTITY https-everywhere.menu.globalDisable "Изключете HTTPS на вÑÑкаде">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS на вÑÑкаде наÑтроики">
+<!ENTITY https-everywhere.prefs.enable_all "Включи Ð’Ñички">
+<!ENTITY https-everywhere.prefs.disable_all "Изключи Ð’Ñички">
+<!ENTITY https-everywhere.prefs.reset_defaults "ВъзÑтанови Ñтандартните">
+<!ENTITY https-everywhere.prefs.search "ТърÑи">
+<!ENTITY https-everywhere.prefs.site "Страница">
+<!ENTITY https-everywhere.prefs.notes "Бележки">
+<!ENTITY https-everywhere.prefs.list_caption "Кой HTTPS преадреÑÐ¸Ñ€Ð°Ð½Ñ Ð´Ð° деиÑтват?">
+<!ENTITY https-everywhere.prefs.enabled "Включен">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Можеш да научеш да пишеш твоите правила(да добавÑте Ñтраници)">
+<!ENTITY https-everywhere.prefs.here_link "тук">
+<!ENTITY https-everywhere.prefs.toggle "Копче">
+<!ENTITY https-everywhere.prefs.reset_default "ВъзÑтанови Ñтандартните">
+<!ENTITY https-everywhere.prefs.view_xml_source "Виж XML Кода">
+
+<!ENTITY https-everywhere.source.downloading "ИзтеглÑне">
+<!ENTITY https-everywhere.source.filename "Име на файл">
+<!ENTITY https-everywhere.source.unable_to_download "Ðевъзможно да Ñвали кода.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/bg/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/bg/https-everywhere.properties
new file mode 100644
index 0000000..ec16615
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/bg/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Ключи HTTPS на вÑÑкаде
+https-everywhere.menu.globalDisable = Изключете
+https-everywhere.menu.enableDisable = Включи / Изключи Правила
+https-everywhere.menu.noRules = (ÐÑма Правила за Тази Страница)
+https-everywhere.menu.unknownRules = (Ðепознати Правила за Тази Страница)
+https-everywhere.toolbar.hint = HTTPS Everywhere is now active. You can toggle it on a site-by-site basis by clicking the icon in the address bar.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/bg/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/bg/ssl-observatory.dtd
new file mode 100644
index 0000000..a0f88fd
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/bg/ssl-observatory.dtd
@@ -0,0 +1,93 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Детайли и Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ‡Ñ Ð·Ð° Уединение">
+<!ENTITY ssl-observatory.popup.later "Попитай ме по-къÑно">
+<!ENTITY ssl-observatory.popup.no "Ðе">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere може да заÑече атаки
+против Ñ‚Ð²Ð¾Ñ Ð±Ñ€Ð°ÑƒÐ·ÑŠÑ€ като праща Ñертификатите, които получаваш към
+Observatory. Включи тази опциÑ?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"HTTPS Everywhere да използва ли SSL Observatory?">
+
+<!ENTITY ssl-observatory.popup.yes "Да">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"БезопаÑтно е да влючеш това, оÑвен ако ползваш много шпионÑка връÑка:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"БезопаÑно, уÑвен ако ползвате таиен интернет Ñ Ñ‚Ð°Ð¸Ð½Ð¸ имена на Ñървърите:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Вкарай и провери Ñертификати подпиÑани от не-Ñтандартни CAта">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"">
+
+<!ENTITY ssl-observatory.prefs.anonymous "ПроверÑвай Ñертификати като използваш Tor за анонимноÑÑ‚">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"ПроверÑвай Ñертификати като използваш Tor за анонимноÑÑ‚ (изиÑква Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Тази Ð¾Ð¿Ñ†Ð¸Ñ Ð¸Ð·Ð¸Ñква Tor и Torbutton да бъдат инÑталирани">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Когато видиш нов Ñертификат кажи на Observatory към кой ISP Ñи Ñвързан">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"">
+
+<!ENTITY ssl-observatory.prefs.done "Готово">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"">
+
+<!ENTITY ssl-observatory.prefs.hide "Скрий разширени наÑтройки">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"ПроверÑвай Ñертификати даье ако Tor ние Ñвободен">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Ð’Ñе още ше опитаме да пазим данните анонимни, но тази наÑтройка е по малко Ñигорна">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Вкараи и провери Ñертификати за чаÑтни DNS имена">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"">
+
+<!ENTITY ssl-observatory.prefs.show "Покажи разширени наÑтройки">
+
+<!ENTITY ssl-observatory.prefs.title "SSL ОбÑÐµÑ€Ð¶Ð°Ñ‚Ð¾Ñ€Ð¸Ñ NаÑтроики">
+
+<!ENTITY ssl-observatory.prefs.use "Използвай Observatory?">
+<!ENTITY ssl-observatory.warning.title "Ð’ÐИМÐÐИЕ от SSL обÑерваторÑта на ЕФФ">
+<!ENTITY ssl-observatory.warning.showcert "Покажи веригата на Ñертификата">
+<!ENTITY ssl-observatory.warning.okay "Разбирам">
+<!ENTITY ssl-observatory.warning.text "SSL ОбÑерваторÑта на ЕФФ е дала признак за HTTPS Ñертификат(и) на тази Ñтраница:">
+<!ENTITY ssl-observatory.warning.defense "Ðко Ñи влÑзал в тази Ñтраница, предложено е да Ñмениш паролата когато имаш безопаÑтна връÑка.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Вкарай и провери Ñамо-подпиÑани Ñертификати">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Това е предложено; проблеми Ñ ÐºÑ€Ð¸Ð¿Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ ÑÑŠ ÑпеÑифично нормални в Ñамо-подпиÑани дребни девизи ">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/cs/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/cs/https-everywhere.dtd
new file mode 100644
index 0000000..ce1f107
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/cs/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "O aplikaci HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "ZaÅ¡ifrujte Web! Automaticky používejte HTTPS zabezpeÄení na mnoha stránkách.">
+<!ENTITY https-everywhere.about.version "Verze">
+<!ENTITY https-everywhere.about.created_by "Vytvořil">
+<!ENTITY https-everywhere.about.librarians "Knihovníci Pravidel">
+<!ENTITY https-everywhere.about.thanks "Poděkování">
+<!ENTITY https-everywhere.about.contribute "Pokud se vám líbí HTTPS Everywhere, můžete">
+<!ENTITY https-everywhere.about.donate_tor "Přispět na Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "Přispět na EFF">
+
+<!ENTITY https-everywhere.menu.about "O aplikaci HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "Nastavení SSL Observatoře">
+<!ENTITY https-everywhere.menu.globalEnable "Zapnout HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Vypnout HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Nastavení HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "Zapnout vše">
+<!ENTITY https-everywhere.prefs.disable_all "Vypnout vše">
+<!ENTITY https-everywhere.prefs.reset_defaults "Vrátit výchozí nastavení">
+<!ENTITY https-everywhere.prefs.search "Hledat">
+<!ENTITY https-everywhere.prefs.site "Stránky">
+<!ENTITY https-everywhere.prefs.notes "Poznámky">
+<!ENTITY https-everywhere.prefs.list_caption "Která pravdila HTTPS pro přesměrování mají platit?">
+<!ENTITY https-everywhere.prefs.enabled "Zapnuto">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Návod, jak si vytvořit vlastní sadu pravidel (pro přidání podpory dalších webů) najdete">
+<!ENTITY https-everywhere.prefs.here_link "zde">
+<!ENTITY https-everywhere.prefs.toggle "Změnit">
+<!ENTITY https-everywhere.prefs.reset_default "Vrátit výchozí nastavení">
+<!ENTITY https-everywhere.prefs.view_xml_source "Zobrazit Zdroj v XML">
+
+<!ENTITY https-everywhere.source.downloading "Stahování">
+<!ENTITY https-everywhere.source.filename "Název souboru">
+<!ENTITY https-everywhere.source.unable_to_download "Zdroj nelze stáhnout.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/cs/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/cs/https-everywhere.properties
new file mode 100644
index 0000000..98fb982
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/cs/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Zapnout HTTPS Everywhere
+https-everywhere.menu.globalDisable = Vypnout HTTPS Everywhere
+https-everywhere.menu.enableDisable = Zapnout / Vypnout Pravidla
+https-everywhere.menu.noRules = (Pro tuto stránku neexistují žádná pravidla)
+https-everywhere.menu.unknownRules = (Pravidla pro tuto stránku nejsou známá)
+https-everywhere.toolbar.hint = HTTPS Everywhere is now active. You can toggle it on a site-by-site basis by clicking the icon in the address bar.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/cs/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/cs/ssl-observatory.dtd
new file mode 100644
index 0000000..724c842
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/cs/ssl-observatory.dtd
@@ -0,0 +1,94 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Podrobnosti a informace o soukromí">
+<!ENTITY ssl-observatory.popup.later "Rozhodnu se později">
+<!ENTITY ssl-observatory.popup.no "Ne">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere umí odhalit útotky
+proti vaÅ¡emu prohlížeÄi tak, že posílá certifikáty, které obdržíte, do
+Observatoře. Zapnout tuto funkci?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Má HTTPS Everywhere používat SSL Observatoř?">
+
+<!ENTITY ssl-observatory.popup.yes "Ano">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Povolit tuto funkci je bezpeÄné, pokud nejste na velmi
+dotěrné firemní síti:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"BezpeÄné, pokud nepoužíváte firemní síť s tajnými jmény intranetových serverů:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Odeslat a prověřit certikáty podepsané nestadartními koÅ™enovými CertifikaÄními Autoritami">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Je bezpeÄné (a doporuÄené) tuto možnost povolit, pokud nepoužíváte dotÄ›rnou firemní síť nebo antivirový sofware Kaspersky který monitoruje vaÅ¡e surfování s TLS proxy a sorkoumou koÅ™enovou CertifikaÄní Autoritou. Pokud ji na takové síti povolíte, může tato možnost publikovat důkazy o tom které https:// servery byly skrze tuto proxy navÅ¡tíveny, kvůli jedineÄným certifikátům které by takto vznikly. Proto nechváme tuto možnost ve výchozím nastavení vypnoutou.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Prověřovat certifikáty skrze Tor pro zajištění anonymity">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Prověřovat certifikáty skrze Tor pro zajištění anonymity (vyžaduje Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Pro použití této možnosti je třeba mít nainstalovaný Tor a Torbutton">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Když uvidíte nový certifikát, řekněte Observatoři přes kterého ISP jste připojení">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Toto naÄte a odeÅ¡le &quot;Äíslo Autonomního Systému&quot; vaší sítÄ›. Pomůže nám to lokalizovat útoky na HTTPS, a rozpoznat jestli máme hlášení ze sítí v zemích jako je Ãrán a Sýrie, kde jsou útoky relativnÄ› Äasté.">
+
+<!ENTITY ssl-observatory.prefs.done "Hotovo">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere umí použít SSL Observatoř od EFF. Ta udělá dvě věci: (1)
+oděšle kopie HTTPS cerifikátů do observotÅ™e, což nám pomůže detekovat útoky typu 'man in the middle' a zlepÅ¡it bezpeÄnost na Webu; a (2)
+umožní nám varovat vás pÅ™ed nezabezpeÄným pÅ™ipojením nebo útokem na váš prohlížeÄ.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Pokud například navštívíte https://www.something.com, certifikát, kerý příjde do Observatoře nás informuje o tom, že někdo navštívil
+www.something.com, ale neřekne kdo to byl, ani na jakou konkrétní stránku se
+díval. Pro zobrazení podrobností najeÄte na možnosti myší.">
+
+<!ENTITY ssl-observatory.prefs.hide "Skrýt pokroÄilé nastavení">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Prověřovat certifikáty i pokud Tor není dostupný">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"I tak se budeme snažit, aby data zůstala anonymní, ale tato možnost není tak bezpeÄná">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Odesílat a prověřovat certifikáty neveřejných DNS jmen">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Pokud není tato možnost zaškrtnutá, Observatoř nebude zaznamenávat certifikáty pro jména která nenajde v DNS systému.">
+
+<!ENTITY ssl-observatory.prefs.show "Zobrazit pokroÄilé nastavení">
+
+<!ENTITY ssl-observatory.prefs.title "Nastavení SSL Observatoře">
+
+<!ENTITY ssl-observatory.prefs.use "Používat Observatoř?">
+<!ENTITY ssl-observatory.warning.title "VAROVÃNà z SSL ObservatoÅ™e od EFF">
+<!ENTITY ssl-observatory.warning.showcert "Zobrazit řetězec certifikátů">
+<!ENTITY ssl-observatory.warning.okay "Rozumím">
+<!ENTITY ssl-observatory.warning.text "SSL Observatoř od EFF vydala varování před HTTPS cetifikátem / certifikáty na těchto stránkách:">
+<!ENTITY ssl-observatory.warning.defense "Pokud jste se na tÄ›chto stránkách pÅ™ihlásili, doporuÄujeme zmÄ›nit si heslo, až budete pÅ™ipojeni bezpeÄným pÅ™ipojením.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Odesílat a prověrovat certifikáty podepsané sami sebou">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Tuto možnost dopruÄujeme zapnout; kryprografické problémy jsou obzvášť Äasté u takto podepsaných vestavÄ›ných zařízení">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/da/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/da/https-everywhere.dtd
new file mode 100644
index 0000000..83ef71a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/da/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Om HTTPS Overalt">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Overalt">
+<!ENTITY https-everywhere.about.ext_description "Kryptér nettet! Brug HTTPS-sikkerhed automatisk på mange steder.">
+<!ENTITY https-everywhere.about.version "Version">
+<!ENTITY https-everywhere.about.created_by "Oprettet af">
+<!ENTITY https-everywhere.about.librarians "Regelsæt-bibliotekarer">
+<!ENTITY https-everywhere.about.thanks "Tak til">
+<!ENTITY https-everywhere.about.contribute "Hvis du kan lide HTTPS Overalt, så vil du måske overveje">
+<!ENTITY https-everywhere.about.donate_tor "Giv bidrag til Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "da">
+<!ENTITY https-everywhere.about.donate_eff "Giv bidrag til EFF">
+
+<!ENTITY https-everywhere.menu.about "Om HTTPS Overalt">
+<!ENTITY https-everywhere.menu.observatory "Indstillinger for SSL-observatorie">
+<!ENTITY https-everywhere.menu.globalEnable "Aktivér HTTPS Overalt">
+<!ENTITY https-everywhere.menu.globalDisable "Deaktivér HTTPS Overalt">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Indstillinger for HTTPS Overalt">
+<!ENTITY https-everywhere.prefs.enable_all "Aktivér alle">
+<!ENTITY https-everywhere.prefs.disable_all "Deaktivér alle">
+<!ENTITY https-everywhere.prefs.reset_defaults "Nulstil til standardindstillinger">
+<!ENTITY https-everywhere.prefs.search "Søg">
+<!ENTITY https-everywhere.prefs.site "Sted">
+<!ENTITY https-everywhere.prefs.notes "Noter">
+<!ENTITY https-everywhere.prefs.list_caption "Hvilke HTTPS-regler skal anvendes?">
+<!ENTITY https-everywhere.prefs.enabled "Aktiveret">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Du kan lære om at skrive dine egne regelsæt (for at føje understøttelse til andre websteder)">
+<!ENTITY https-everywhere.prefs.here_link "her">
+<!ENTITY https-everywhere.prefs.toggle "Slå til/fra">
+<!ENTITY https-everywhere.prefs.reset_default "Nulstil til standardindstilling">
+<!ENTITY https-everywhere.prefs.view_xml_source "Vis XML-kilde">
+
+<!ENTITY https-everywhere.source.downloading "Henter">
+<!ENTITY https-everywhere.source.filename "Filnavn">
+<!ENTITY https-everywhere.source.unable_to_download "Kan ikke hente kilde">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 meddelelse">
+<!ENTITY https-everywhere.popup.paragraph1 "Ups. Du anvendte den stabile version af HTTPS Everywhere, men vi har ved et uheld måske opdateret til udvikler-versionen ved den sidste opdatering.">
+<!ENTITY https-everywhere.popup.paragraph2 "Vil du skifte tilbage til den stabile version?">
+<!ENTITY https-everywhere.popup.paragraph3 "Vi ville sætte pris på at du fortsatte med at anvende vores udvikler-version, og derved hjalp os med at gøre HTTPS Everywhere bedre! Der er optræder måske fejl her og der, som du kan rapportere på https-everywhere@eff.org, på engelsk. Vi beklager besværet. Tak fordi du anvender HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Behold udvikler-versionen">
+<!ENTITY https-everywhere.popup.revert "Hent den seneste stabile version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/da/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/da/https-everywhere.properties
new file mode 100644
index 0000000..dcd8a36
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/da/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Aktivér HTTPS Overalt
+https-everywhere.menu.globalDisable = Deaktivér HTTPS Overalt
+https-everywhere.menu.enableDisable = Aktivér / Deaktivér regler
+https-everywhere.menu.noRules = (Der er ikke opsat regler for denne side)
+https-everywhere.menu.unknownRules = (Regler for denne side ukendt)
+https-everywhere.toolbar.hint = HTTPS Everywhere er nu aktiv. De kan tænde den ved et side-ved-side basis ved at klikke på ikonet i adresse baren.
+https-everywhere.migration.notification0 = For at rette en vigtig fejl, nulstiller denne opdatering dine HTTPS Everywhere indstillinger til deres oprindelige værdier.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/da/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/da/ssl-observatory.dtd
new file mode 100644
index 0000000..05722e8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/da/ssl-observatory.dtd
@@ -0,0 +1,100 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Detaljer og information om privatliv">
+<!ENTITY ssl-observatory.popup.later "Spørg mig senere">
+<!ENTITY ssl-observatory.popup.no "Nej">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Overalt kan registrere angreb
+mod din browser ved at sende certifikaterne du modtager til
+Observatoriet. Slå dette til?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Skal HTTPS Overalt anvende SSL-observatoriet?">
+
+<!ENTITY ssl-observatory.popup.yes "Ja">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Dette kan trygt aktiveres, medmindre du brug et virksomhedsnetværk
+som er udsat for meget indtrængen:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Sikker, medmindre du bruger et virksomhedsnetværk med skjulte intranet-servernavne:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Indsend og tjek certifikater signeret af ikke-standardiserede rod-certifikat-autoriteter">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Det er sikkert (og en god ide) at aktivere denne valgmulighed, medmindre du bruger virksomhedsnetværk med meget indtrængen eller antivirus-software fra Kaspersky, der overvåger din browserbrug med en TLS-proxy og en privat rod-certifikat-autoritet. Hvis den er aktiveret på sådan et netværk, så kan dette tilvalg risikere at udgive spor af hvilke https://-domæner som blev benyttet gennem proxy'en, som følge af de unikke certifikater den ville fremstille. Lad den derfor være slået fra som standard.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Tjek certifikater med brug af Tor for anonymitet">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Tjek certifikater med brug af Tor for anonymitet (kræver Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Dette tilvalg kræver at Tor og Torbutton er installerede.">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Når du ser et nyt certifikat, så fortæl Observatoriet hvilken internetudbyder du er tilsluttet til">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Dette vil hente og sende det &quot;autonome systemnummer&quot; for dit netværk. Dette vil hjælpe os med at lokalisere angreb mod HTTPS, og afgøre hvorvidt vi har observationer fra netværk fra steder som Iran og Syrien, hvor angreb set under sammenligning forekommer hyppigt.">
+
+<!ENTITY ssl-observatory.prefs.done "Færdig">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Overalt kan benytte EFFs SSL-observatorie. Dette indebærer to
+ting: (1) der sendes kopier af HTTPS-certifikater til observatoriet, der
+hjælper os med at registrere 'manden i midten'-angreb og forøge sikkerheden på nettet; og (2) giver os mulighed for at advare dig om usikre forbindelser eller angreb på din browser.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Som eksempel, når du besøger https://www.etellerandet.com, så vil
+certifikatet som Observatoriet har modtaget indikere at nogen besøgte
+www.etellerandet.com, men ikke hvem som besøgte stedet, eller hvilken
+specifik side de kiggede på. Hold musen over valgmuligheder for at flere
+detaljer:">
+
+<!ENTITY ssl-observatory.prefs.hide "Skjul avancerede valgmuligheder">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Tjek certifikater, selv når Tor ikke er tilgængelig">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Vi vil stadig forsøge at bevare data anonyme, men denne valgmulighed er mindre sikker">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Indsend og tjek certifikater for DNS-navne som ikke er offentlige">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Medmindre denne valgmulighed er valgt, så vil observatoriet ikke registrere certifikater for navne som den ikke kan opløse gennem DNS-systemet.">
+
+<!ENTITY ssl-observatory.prefs.show "Vis avanceret valgmuligheder">
+
+<!ENTITY ssl-observatory.prefs.title "Indstillinger for SSL-Observatoriet">
+
+<!ENTITY ssl-observatory.prefs.use "Brug Observatoriet?">
+<!ENTITY ssl-observatory.warning.title "ADVARSEL fra EFF's SSL-observatorie">
+<!ENTITY ssl-observatory.warning.showcert "Vis certifikat-kæden">
+<!ENTITY ssl-observatory.warning.okay "Jeg forstår">
+<!ENTITY ssl-observatory.warning.text "EFF's SSL-observatorie har udsted en advarsel om HTTPS-certifikaterne for dette sted:">
+<!ENTITY ssl-observatory.warning.defense "Hvis du er logget ind på dette sted, så kan det tilrådes at ændre din adgangskode når du har etableret en sikker forbindelse. ">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Indsend og tjek selvsignerede certifikater">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Dette er anbefalet, da kryptografiske problemer er oftere findes i selvsignerede indlejrede enheder">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/de/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/de/https-everywhere.dtd
new file mode 100644
index 0000000..75c8630
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/de/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Über HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Sichere deine Internet Anbindung! Automatische HTTPS-Sicherheit auf vielen Web-Seiten.">
+<!ENTITY https-everywhere.about.version "Version">
+<!ENTITY https-everywhere.about.created_by "Entwickelt durch">
+<!ENTITY https-everywhere.about.librarians "Regelliste">
+<!ENTITY https-everywhere.about.thanks "Dank an">
+<!ENTITY https-everywhere.about.contribute "Wenn du HTTPS-Everywhere magst, solltest du mal dieses ausprobieren">
+<!ENTITY https-everywhere.about.donate_tor "Spende an Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "de-DE">
+<!ENTITY https-everywhere.about.donate_eff "Spende an EFF">
+
+<!ENTITY https-everywhere.menu.about "Über HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL Observatory Einstellungen">
+<!ENTITY https-everywhere.menu.globalEnable "HTTPS Everywhere aktivieren">
+<!ENTITY https-everywhere.menu.globalDisable "HTTPS Everywhere deaktivieren">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere Einstellungen">
+<!ENTITY https-everywhere.prefs.enable_all "Alle aktivieren">
+<!ENTITY https-everywhere.prefs.disable_all "Alle deaktivieren">
+<!ENTITY https-everywhere.prefs.reset_defaults "Zurücksetzen">
+<!ENTITY https-everywhere.prefs.search "Suchen">
+<!ENTITY https-everywhere.prefs.site "Seite">
+<!ENTITY https-everywhere.prefs.notes "Notizen">
+<!ENTITY https-everywhere.prefs.list_caption "Welche HTTPS-Weiterleitung soll gewählt werden?">
+<!ENTITY https-everywhere.prefs.enabled "Gestartet">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Lerne, deine eigene Regelliste zu schreiben (Füge Regeln für andere Web-Seiten hinzu)">
+<!ENTITY https-everywhere.prefs.here_link "Hier">
+<!ENTITY https-everywhere.prefs.toggle "Toggle">
+<!ENTITY https-everywhere.prefs.reset_default "Reset to Default">
+<!ENTITY https-everywhere.prefs.view_xml_source "XML-Quelle ansehen">
+
+<!ENTITY https-everywhere.source.downloading "Downloade">
+<!ENTITY https-everywhere.source.filename "Dateiname">
+<!ENTITY https-everywhere.source.unable_to_download "Quelle konnte nicht heruntergeladen werden.">
+
+<!ENTITY https-everywhere.popup.title "Nachricht von HTTPS Everywhere 4.0development.11">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. Du hattest die stabile Version von HTTPS Everywhere benutzt, aber wir haben dich möglicherweise in unserem letztdem Update auf eine Entwickler-Version geupgraded.">
+<!ENTITY https-everywhere.popup.paragraph2 "Möchtest du zurück zur stabilen Version?">
+<!ENTITY https-everywhere.popup.paragraph3 "Wir würden uns freuen, wenn du weiterhin die Entwickler-Version benutzen würdest, um uns zu helfen HTTPS Everywhere zu verbessern! Es könnte sein, dass du hier und da einige Fehler findest, welche du an https-everywhere@eff.org melden kannst. Entschuldige die Unannehmlichkeit und danke, dass du HTTPS Everywhere benutzt.">
+<!ENTITY https-everywhere.popup.keep "Entwickler-Version beibehalten.">
+<!ENTITY https-everywhere.popup.revert "Die letzte stabile Version herunterladen">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/de/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/de/https-everywhere.properties
new file mode 100644
index 0000000..c1d3438
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/de/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = HTTPS Everywhere aktivieren
+https-everywhere.menu.globalDisable = HTTPS Everywhere deaktivieren
+https-everywhere.menu.enableDisable = Regeln Aktivieren / Deaktivieren
+https-everywhere.menu.noRules = (Keine Regeln für diese Seite)
+https-everywhere.menu.unknownRules = (Regeln für diese Seite unbekannt)
+https-everywhere.toolbar.hint = HTTPS Everywhere ist nun aktiv. Sie können es für bestimmte Seiten ein- oder ausschalten, indem Sie auf das Icon in der Adresszeile klicken.
+https-everywhere.migration.notification0 = Um einen wichtigen Fix zu implementieren, wird dieses Update deine HTTPS Everywhere Regel-Einstellungen zurücksetzen.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/de/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/de/ssl-observatory.dtd
new file mode 100644
index 0000000..74483cc
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/de/ssl-observatory.dtd
@@ -0,0 +1,91 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Details und Datenschutz Informationen">
+<!ENTITY ssl-observatory.popup.later "Später nachfragen">
+<!ENTITY ssl-observatory.popup.no "Nein">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere kann Angriffe gegen Ihren Browser erkennen, indem es Zertifikate, die Sie empfangen, zum SSL Observatory sendet. Einstellung aktivieren?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Soll HTTPS Everywhere SSL Observatory benutzen?">
+
+<!ENTITY ssl-observatory.popup.yes "Ja">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Es ist sicher, diese Option zu aktivieren, es sei denn, Sie benutzen ein sehr aufdringliches Firmennetzwerk:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Sicher, es sei denn, Sie benutzen ein Firmennetzwerk mit geheimen Intranet Servernamen:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Sende und überprüfe Zertifikate, die nicht von Stammzertifizierungsstellen ausgestellt wurden">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Es ist sicher (und eine gute Idee), diese Option zu aktivieren, es sei denn, Sie benutzen ein aufdringliches Firmennetzwerk, oder Kaspersky Antiviren-Software, die Sie beim Browsen mittels eines TLS Proxyservers und einer privaten Zertifizierungsstelle überwacht. Wenn diese Option in einem solchen Netzwerk verwendet wird, könnte Sie Hinweise (in Form der dadurch erstellten eindeutigen Zertifikate) auf die durch diesen Proxyserver besuchten https:// Domains hinterlassen.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Überprüfe Zertifikate mit Tor, um Anonymität zu bewahren">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Überprüfte Zertifikate mit Tor, um Anonymität zu bewahren (benötigt Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Diese Option macht die Installation von Tor und Torbutton erforderlich">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Dem SSL Observatory mitteilen, welchen ISP Sie verwenden, wenn Sie ein neues Zertifikat zu sehen bekommen">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Diese Option verwendet die 'Autonome System Zahl' Ihres Netzwerks. Das hilft uns, Angriffe gegen HTTPS zu orten und festzustellen, ob es sich um Angriffe von Netzwerken in Ländern wie Iran und Syrien handelt, in denen solche Angriffe vergleichsweise häufig sind.">
+
+<!ENTITY ssl-observatory.prefs.done "Fertig">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere kann EFF's SSL Observatory verwenden. Das ermöglicht uns 1. die Erkennung von 'man in the middle' Angriffen und damit eine Verbesserung der Internetsicherheit, indem Kopien der HTTPS Zertifikate an das SSL Observatory gesendet werden; und 2. können wir Sie bei unsicheren Verbindungen oder Angriffen gegen Ihren Browser warnen.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Beispiel: Wenn Sie https://www.irgendetwas.com besuchen, kann das SSL Observatory lediglich feststellen, dass irgendjemand www.irgendetwas.com besucht hat, aber nicht wer es war oder welche genaue Informationen aufgerufen wurde. Für mehr Informationen, fahren Sie mit der Maus über diese Option:">
+
+<!ENTITY ssl-observatory.prefs.hide "Verstecke erweiterte Optionen">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Zertifikate auch überprüfen, wenn Tor nicht verfügbar ist">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Wir bemühen uns, die Daten dennoch anonym zu halten, aber diese Option ist weniger sicher.">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Zertifikate für nicht-öffentliche DNS-Namen Senden und Überprüfen">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Wenn diese Option nicht aktiviert ist, wird das Observatory keine Zertifikate für Domain Namen aufnehmen, die es nicht über das DNS-System auflösen kann.">
+
+<!ENTITY ssl-observatory.prefs.show "Zeige erweiterte Optionen">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Observatory Einstellungen">
+
+<!ENTITY ssl-observatory.prefs.use "SSL Observatory verwenden?">
+<!ENTITY ssl-observatory.warning.title "WARNUNG von EFF's SSL Observatory">
+<!ENTITY ssl-observatory.warning.showcert "Zertifikatskette anzeigen">
+<!ENTITY ssl-observatory.warning.okay "Ich verstehe">
+<!ENTITY ssl-observatory.warning.text "EFF's SSL Observatory hat eine Warnung zu dem HTTPS Zertifikat dieser Seite veröffentlicht:">
+<!ENTITY ssl-observatory.warning.defense "Wenn Sie auf dieser Seite eingeloggt sind, kann es empfehlenswert sein, das Passwort zu ändern, sobald Sie eine sichere Verbindung haben.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Selbstsignierte Zertifikate Senden und Überprüfen">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Empfehlenswert; kryptographische Probleme sind in selbstsignierten eingebetteten Geräten besonders häufig.">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/el/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/el/https-everywhere.dtd
new file mode 100644
index 0000000..f8658cd
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/el/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Σχετικά με το HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "ΚÏυπτογÏαφήστε τον Παγκόσμιο Ιστό! ΧÏησιμοποιήστε ασφάλεια HTTPS σε πολλοÏÏ‚ δικτυακοÏÏ‚ τόπους.">
+<!ENTITY https-everywhere.about.version "Έκδοση">
+<!ENTITY https-everywhere.about.created_by "ΔημιουÏγήθηκε από">
+<!ENTITY https-everywhere.about.librarians "Βιβλιοθήκες για κανόνες">
+<!ENTITY https-everywhere.about.thanks "ΕυχαÏιστοÏμε τους">
+<!ENTITY https-everywhere.about.contribute "Αν σας αÏέσει το HTTPS Everywhere, δοκιμάστε">
+<!ENTITY https-everywhere.about.donate_tor "ΔωÏίστε στο Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "ΔωÏίστε στο EFF">
+
+<!ENTITY https-everywhere.menu.about "Σχετικά με το HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "ΠÏοτιμήσεις για το ΠαÏατηÏητήÏιο SSL">
+<!ENTITY https-everywhere.menu.globalEnable "ΕνεÏγοποίηση του HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "ΑπενεÏγοποίηση του HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "ΠÏοτιμήσεις του HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "ΕνεÏγοποίηση όλων">
+<!ENTITY https-everywhere.prefs.disable_all "ΑπενεÏγοποίηση όλων">
+<!ENTITY https-everywhere.prefs.reset_defaults "ΕπαναφοÏά Ï€Ïοεπιλεγμένων κανόνων">
+<!ENTITY https-everywhere.prefs.search "Αναζήτηση">
+<!ENTITY https-everywhere.prefs.site "Δικτυακός τόπος">
+<!ENTITY https-everywhere.prefs.notes "Σημειώσεις">
+<!ENTITY https-everywhere.prefs.list_caption "Ποιοι κανόνες ανακατεÏθυνσης σε HTTPS να εφαÏμοστοÏν;">
+<!ENTITY https-everywhere.prefs.enabled "ΕνεÏγοποιημένο">
+<!ENTITY https-everywhere.prefs.ruleset_howto "ΜποÏείτε να μάθετε πώς να γÏάφετε τους δικοÏÏ‚ σας κανόνες (ώστε να υποστηÏίξετε και άλλους δικτυακοÏÏ‚ τόπους)">
+<!ENTITY https-everywhere.prefs.here_link "εδώ">
+<!ENTITY https-everywhere.prefs.toggle "Εναλλαγή">
+<!ENTITY https-everywhere.prefs.reset_default "ΕπαναφοÏά Ï€Ïοεπιλογών">
+<!ENTITY https-everywhere.prefs.view_xml_source "ΠÏοβολή του Πηγαίου Κώδικα XML">
+
+<!ENTITY https-everywhere.source.downloading "Γίνεται λήψη">
+<!ENTITY https-everywhere.source.filename "Όνομα αÏχείου">
+<!ENTITY https-everywhere.source.unable_to_download "Αδυναμί λήψης πηγαίου κώδικα.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/el/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/el/https-everywhere.properties
new file mode 100644
index 0000000..1906756
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/el/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = ΕνεÏγοποίηση του HTTPS Everywhere
+https-everywhere.menu.globalDisable = ΑπενεÏγοποίηση του HTTPS Everywhere
+https-everywhere.menu.enableDisable = ΕνεÏγοποίηση / ΑπενεÏγοποίηση των κανόνων
+https-everywhere.menu.noRules = (Δεν υπάÏχουν κανόνες για αυτή την σελίδα)
+https-everywhere.menu.unknownRules = (Κανόνες για αυτή τη σελίδα: Άγνωστοι)
+https-everywhere.toolbar.hint = Το HTTPS Everywhere ειναι τωÏα ενεÏγοποιημενο. ΜποÏείτε να το αλλάξετε με βάση την τοποθεσία ανά τοποθεσία, κάνοντας κλικ στο εικονίδιο στη γÏαμμή διευθÏνσεων.
+https-everywhere.migration.notification0 = Αυτή η ενημέÏωση επαναφέÏει τις Ïυθμίσεις κανόνων του HTTPS Everywhere στις Ï€Ïοεπιλεγμένες τιμές, με σκοπό να εφαÏμοστεί μια κÏίσιμη διόÏθωση.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/el/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/el/ssl-observatory.dtd
new file mode 100644
index 0000000..28641ed
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/el/ssl-observatory.dtd
@@ -0,0 +1,99 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "ΛεπτομέÏειες και ΠληÏοφοÏίες Ιδιωτικότητας">
+<!ENTITY ssl-observatory.popup.later "Θέλω να ΕνημεÏωθώ ΑÏγότεÏα">
+<!ENTITY ssl-observatory.popup.no "Όχι">
+
+<!ENTITY ssl-observatory.popup.text "Το HTTPS Everywhere μποÏεί να εντοπίσει επιθέσεις
+εναντίον του φυλλομετÏητή σου στέλνοντας τα πιστοποιητικά που λαμβάνεις
+στο ΠαÏατηÏητήÏιο. Επιθυμείς ενεÏγοποίηση;">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Επιθυμείς το HTTPS Everywhere να χÏησιμοποιεί το ΠαÏατηÏητήÏιο SSL;">
+
+<!ENTITY ssl-observatory.popup.yes "Îαι">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Η ενεÏγοποίηση της επιλογής είναι ασφαλής, εκτός αν χÏησιμοποιείς εταιÏικό δίκτυο
+υψηλής παÏεμβατικότητας:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Η ενεÏγοποίηση της επιλογής είναι ασφαλής, εκτός αν χÏησιμοποιείς εταιÏικό δίκτυο με μυστικά ονόματα διακομιστών:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Υποβολή και έλεγχος πιστοποιητικών υπογεγÏαμμένων από μη-εγκεκÏιμένες ΑÏχές Πιστοποίησης πιστοποιητικών">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Είναι ασφαλές (και καλή ιδέα) να ενεÏγοποιηθεί η συγκεκÏιμένη επιλογή, εκτός αν χÏησιμοποιείς εταιÏικό δίκτυο υψηλής παÏεμβατικότητας ή το λογισμικό Ï€Ïοστασίας από ιοÏÏ‚ 'Kaspersky' το οποίο παÏακολουθεί την πεÏιήγηση μέσω ενός TLS διακομιστή μεσολάβησης και μιας ιδιωτικής ΑÏχής Πιστοποίησης πιστοποιητικών. Αν ενεÏγοποιηθεί σε ένα τέτοιο δίκτυο, μποÏεί να δημοσιοποιήσει στοιχεία για το ποια https:// ονόματα ιστοτόπων επισκέφθηκες μέσω Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… διακομιστή μεσολάβησης, εξαιτίας της μοναδικότητας των πιστοποιητικών που θα παÏάγει. Γι' αυτό το έχουμε αφήσει εξ' αÏχής απενεÏγοποιημένο.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Έλεγχος πιστοποιητικών χÏησιμοποιώντας το Tor για εξασφάλιση ανωνυμίας">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Έλεγχος πιστοποιητικών χÏησιμοποιώντας το Tor για εξασφάλιση ανωνυμίας (απαιτείται η εγκατάσταση του Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Η συγκεκÏιμένη επιλογή απαιτεί την εγκατάσταση του Tor και του Torbutton">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Όταν βλέπεις ένα νέο πιστοποιητικό, πες στο ΠαÏατηÏητήÏιο με ποιον ΠάÏοχο ΥπηÏεσιών ΔιαδικτÏου έχεις συνδεθεί.">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Η συγκεκÏιμένη επιλογή θα ανακτήσει και θα αποστείλει τον &quot;Αυτόνομο ΑÏιθμό Συστήματος&quot; (Autonomous System number) του δικτÏου σου. Αυτό θα μας βοηθήσει να εντοπίσουμε επιθέσεις εναντίον του HTTPS και να καθοÏίσουμε αν έχουν παÏατηÏηθεί επιθέσεις από μέÏη όπως η ΣυÏία και το ΙÏάν όπου αυτές οι επιθέσεις είναι συγκÏιτικά πιο συνηθισμένες.">
+
+<!ENTITY ssl-observatory.prefs.done "Έγινε">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"Το HTTPS Everywhere μποÏεί να χÏησιμοποιήσει το ΠαÏατηÏητήÏιο SSL του EFF, το οποίο Ï€Ïαγματοποιεί τα εξής: (1)
+στέλνει αντίγÏαφα των πιστοποιητικών HTTPS στο ΠαÏατηÏητήÏιο, για να μας βοηθήσει να ανιχνεÏσουμε επιθέσεις 'ενδιάμεσου παÏατηÏητή' και να βελτιώσει την ασφάλεια του Παγκόσμιου Î™ÏƒÏ„Î¿Ï (2)
+μας επιτÏέπει να σε Ï€ÏοειδοποιοÏμε σχετικά με μη-ασφαλείς συνδέσεις ή επιθέσεις στο φυλλομετÏητή σου.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Για παÏάδειγμα, όταν επισκέπτεσαι το https://www.example.com, το πιστοποιητικό
+που λαμβάνει το ΠαÏατηÏητήÏιο θα δείξει ότι κάποιος κάποιος επισκέφθηκε
+τον ιστότοπο www.something.com, αλλά όχι ποιος επισκέφθηκε τον ιστότοπο ή ποια συγκεκÏιμένη σελίδα
+είδε. ΣÏÏε το ποντίκι πάνω από τις επιλογές για πεÏισσότεÏες πληÏοφοÏίες:">
+
+<!ENTITY ssl-observatory.prefs.hide "ΑπόκÏυψη επιλογών για Ï€ÏοχωÏημένους">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Έλεγχος πιστοποιητικών ακόμα κι αν το Tor δεν είναι διαθέσιμο ">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Συνεχίζουμε την Ï€Ïοσπάθεια να κÏατήσουμε ανώνυμα τα δεδομένα, αλλά αυτή η επιλογή είναι λιγότεÏο ασφαλής">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Υποβολή και έλεγχος πιστοποιητικών για μη δημόσια DNS ονόματα">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Εκτός αν η συγκεκÏιμένη επιλογή ενεÏγοποιηθεί, το ΠαÏατηÏητήÏιο δε θα καταγÏάφει Πιστοποιητικά για ονόματα που δε θα μποÏεί να εξακÏιβώσει μέσω του συστήματος DNS">
+
+<!ENTITY ssl-observatory.prefs.show "ΠÏοβολή επιλογών για Ï€ÏοχωÏημένους">
+
+<!ENTITY ssl-observatory.prefs.title "ΠÏοτιμήσεις ΠαÏατηÏητηÏίου SSL">
+
+<!ENTITY ssl-observatory.prefs.use "Îα χÏησιμοποιηθεί το ΠαÏατηÏητήÏιο;">
+<!ENTITY ssl-observatory.warning.title "ΠΡΟΕΙΔΟΠΟΙΗΣΗ από το ΠαÏατηÏητήÏιο SSL του EFF">
+<!ENTITY ssl-observatory.warning.showcert "ΠÏοβολή της αλυσίδας πιστοποιητικών">
+<!ENTITY ssl-observatory.warning.okay "Καταλαβαίνω">
+<!ENTITY ssl-observatory.warning.text "Το ΠαÏατηÏητήÏιο SSL του EFF έχει εκδώσει μια Ï€Ïοειδοποίηση σχετικά με το πιστοποιητικό HTTPS του συγκεκÏιμένου ιστότοπου:">
+<!ENTITY ssl-observatory.warning.defense "Αν είσαι συνδεδεμένος στο συγκεκÏιμένο ιστότοπο, Ï€Ïοτείνεται να αλλάξεις τον κωδικό ασφαλείας σου όταν αποκτήσεις ασφαλή σÏνδεση.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Υποβολή και αυτο-υπογεγÏαμμένα πιστοποιητικά">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Συνιστώμενη ενέÏγεια· τα κÏυπτογÏαφικά Ï€Ïοβλήματα είναι ιδιαιτέÏως κοινά στις αυτο-υπογεγÏαμμένες ενσωματωμένες συσκευές">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/en/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/en/https-everywhere.dtd
new file mode 100644
index 0000000..9a63c45
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/en/https-everywhere.dtd
@@ -0,0 +1,47 @@
+<!ENTITY https-everywhere.about.title "About HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Encrypt the Web! Automatically use HTTPS security on many sites.">
+<!ENTITY https-everywhere.about.version "Version">
+<!ENTITY https-everywhere.about.created_by "Created by">
+<!ENTITY https-everywhere.about.librarians "Ruleset Librarians">
+<!ENTITY https-everywhere.about.thanks "Thanks to">
+<!ENTITY https-everywhere.about.contribute "If you like HTTPS Everywhere, you might consider">
+<!ENTITY https-everywhere.about.donate_tor "Donating to Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "Donating to EFF">
+
+<!ENTITY https-everywhere.menu.about "About HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL Observatory Preferences">
+<!ENTITY https-everywhere.menu.globalEnable "Enable HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Disable HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere Preferences">
+<!ENTITY https-everywhere.prefs.enable_all "Enable All">
+<!ENTITY https-everywhere.prefs.disable_all "Disable All">
+<!ENTITY https-everywhere.prefs.reset_defaults "Reset to Defaults">
+<!ENTITY https-everywhere.prefs.search "Search">
+<!ENTITY https-everywhere.prefs.site "Site">
+<!ENTITY https-everywhere.prefs.notes "Notes">
+<!ENTITY https-everywhere.prefs.list_caption "Which HTTPS redirection rules should apply?">
+<!ENTITY https-everywhere.prefs.enabled "Enabled">
+<!ENTITY https-everywhere.prefs.ruleset_howto "You can learn how to write your own rulesets (to add support for other web sites)">
+<!ENTITY https-everywhere.prefs.here_link "here">
+<!ENTITY https-everywhere.prefs.toggle "Toggle">
+<!ENTITY https-everywhere.prefs.reset_default "Reset to Default">
+<!ENTITY https-everywhere.prefs.view_xml_source "View XML Source">
+
+<!ENTITY https-everywhere.source.downloading "Downloading">
+<!ENTITY https-everywhere.source.filename "Filename">
+<!ENTITY https-everywhere.source.unable_to_download "Unable to download source.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/en/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/en/https-everywhere.properties
new file mode 100644
index 0000000..be83831
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/en/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Enable HTTPS Everywhere
+https-everywhere.menu.globalDisable = Disable HTTPS Everywhere
+https-everywhere.menu.enableDisable = Enable / Disable Rules
+https-everywhere.menu.noRules = (No Rules for This Page)
+https-everywhere.menu.unknownRules = (Rules for This Page Unknown)
+https-everywhere.toolbar.hint = HTTPS Everywhere is now active. You can toggle it on a site-by-site basis by clicking the icon in the address bar.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/en/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/en/ssl-observatory.dtd
new file mode 100644
index 0000000..8564082
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/en/ssl-observatory.dtd
@@ -0,0 +1,95 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Details and Privacy Information">
+<!ENTITY ssl-observatory.popup.later "Ask Me Later">
+<!ENTITY ssl-observatory.popup.no "No">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere can detect attacks
+against your browser by sending the certificates you receive to the
+Observatory. Turn this on?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Should HTTPS Everywhere use the SSL Observatory?">
+
+<!ENTITY ssl-observatory.popup.yes "Yes">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"It is safe to enable this, unless you use a very
+intrusive corporate network:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Safe, unless you use a corporate network with secret intranet server names:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Submit and check certificates signed by non-standard root CAs">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"It is safe (and a good idea) to enable this option, unless you use an intrusive corporate network or Kaspersky antivirus software that monitors your browsing with a TLS proxy and a private root Certificate Authority. If enabled on such a network, this option might publish evidence of which https:// domains were being visited through that proxy, because of the unique certificates it would produce. So we leave it off by default.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Check certificates using Tor for anonymity">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Check certificates using Tor for anonymity (requires Tor)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"This option requires Tor to be installed and running">
+
+<!ENTITY ssl-observatory.prefs.asn
+'When you see a new certificate, tell the Observatory which ISP you are connected to'>
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+'This will fetch and send the "Autonomous System number" of your network. This will help us locate attacks against HTTPS, and to determine whether we have observations from networks in places like Iran and Syria where attacks are comparatively common.'>
+
+<!ENTITY ssl-observatory.prefs.done "Done">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere can use EFF's SSL Observatory. This does two things: (1)
+sends copies of HTTPS certificates to the Observatory, to help us
+detect 'man in the middle' attacks and improve the Web's security; and (2)
+lets us warn you about insecure connections or attacks on your browser.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"For example, when you visit https://www.something.com, the certificate
+received by the Observatory will indicate that somebody visited
+www.something.com, but not who visited the site, or what specific page they
+looked at. Mouseover the options for further details:">
+
+<!ENTITY ssl-observatory.prefs.hide "Hide advanced options">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Check certificates even if Tor is not available">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"We will still try to keep the data anonymous, but this option is less secure">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Submit and check certificates for non-public DNS names">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Unless this option is checked, the Observatory will not record certificates for names that it cannot resolve through the DNS system.">
+
+<!ENTITY ssl-observatory.prefs.show "Show advanced options">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Observatory Preferences">
+
+<!ENTITY ssl-observatory.prefs.use "Use the Observatory?">
+<!ENTITY ssl-observatory.warning.title "WARNING from EFF's SSL Observatory">
+<!ENTITY ssl-observatory.warning.showcert "Show the certificate chain">
+<!ENTITY ssl-observatory.warning.okay "I understand">
+<!ENTITY ssl-observatory.warning.text "EFF's SSL Observatory has issued a warning about the HTTPS certificiate(s) for this site:">
+<!ENTITY ssl-observatory.warning.defense "If you are logged in to this site, it may be advisable to change your password once you have a safe connection.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Submit and check self-signed certificates">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"This is recommended; cryptographic problems are especially common in self-signed embedded devices">
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/es/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/es/https-everywhere.dtd
new file mode 100644
index 0000000..70456d2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/es/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Acerca de HTTPS Everywhere (HTTPS en cualquier sitio)">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "¡Cifre la Web! Utilice automáticamente la seguridad HTTPS en muchos sitios.">
+<!ENTITY https-everywhere.about.version "Versión">
+<!ENTITY https-everywhere.about.created_by "Creado por">
+<!ENTITY https-everywhere.about.librarians "Bibliotecarios de las reglas">
+<!ENTITY https-everywhere.about.thanks "Agradecimientos para">
+<!ENTITY https-everywhere.about.contribute "Si le agrada HTTPS Everywhere (HTTPS en cualquier sitio), podría considerar">
+<!ENTITY https-everywhere.about.donate_tor "donar a Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "es">
+<!ENTITY https-everywhere.about.donate_eff "donar a la Fundación Fronteras Electrónicas (EFF)">
+
+<!ENTITY https-everywhere.menu.about "Acerca de HTTPS Everywhere (HTTPS en cualquier sitio)">
+<!ENTITY https-everywhere.menu.observatory "Opciones del Observatorio SSL">
+<!ENTITY https-everywhere.menu.globalEnable "Activar HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Desactivar HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Preferencias de HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "Habilitar todo">
+<!ENTITY https-everywhere.prefs.disable_all "Deshabilitar todo">
+<!ENTITY https-everywhere.prefs.reset_defaults "Restablecer configuraciones predeterminadas">
+<!ENTITY https-everywhere.prefs.search "Buscar">
+<!ENTITY https-everywhere.prefs.site "Sitio">
+<!ENTITY https-everywhere.prefs.notes "Notas">
+<!ENTITY https-everywhere.prefs.list_caption "¿Qué reglas de redirección HTTPS deberían aplicarse?">
+<!ENTITY https-everywhere.prefs.enabled "Habilitado">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Puede aprender a escribir sus propias reglas (para añadir soporte para otros sitios web)">
+<!ENTITY https-everywhere.prefs.here_link "aquí">
+<!ENTITY https-everywhere.prefs.toggle "Cambiar">
+<!ENTITY https-everywhere.prefs.reset_default "Restablecer configuración predeterminada">
+<!ENTITY https-everywhere.prefs.view_xml_source "Ver código XML">
+
+<!ENTITY https-everywhere.source.downloading "Descargando">
+<!ENTITY https-everywhere.source.filename "Nombre de fichero">
+<!ENTITY https-everywhere.source.unable_to_download "No fue posible descargar el código.">
+
+<!ENTITY https-everywhere.popup.title "Notificación de HTTPS Everywhere 4.0development.11">
+<!ENTITY https-everywhere.popup.paragraph1 "Uups. Está usted usando la versión estable de HTTPS Everywhere, pero podríamos haberle elevado accidentalmente a la versión de desarrollo al publicar la última versión.">
+<!ENTITY https-everywhere.popup.paragraph2 "¿Le gustaría volver a la versión estable?">
+<!ENTITY https-everywhere.popup.paragraph3 "Nos encantaría que continuase usando nuestra versión de desarrollo ¡y nos ayudara a hacer HTTPS Everywhere mejor! Podría encontrar que hay unos pocos fallos más aquí y allá, de los que puede informar a 'https-everywhere@eff.org'. Disculpe la inconveniencia, y gracias por usar HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Manténganme en la versión de desarrollo.">
+<!ENTITY https-everywhere.popup.revert "Descargar la última versión estable.">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/es/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/es/https-everywhere.properties
new file mode 100644
index 0000000..8952158
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/es/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Activar HTTPS Everywhere
+https-everywhere.menu.globalDisable = Desactivar HTTPS Everywhere
+https-everywhere.menu.enableDisable = Habilitar/Deshabilitar reglas
+https-everywhere.menu.noRules = (No hay reglas para esta página)
+https-everywhere.menu.unknownRules = (No se conocen reglas para esta página)
+https-everywhere.toolbar.hint = HTTPS Everywhere no está activo. Puede activarlo sitio por sitio haciendo clic en el icono de la barra de direcciones.
+https-everywhere.migration.notification0 = Para implementar esta reparación crucial, esta actualización restablece sus preferencias de reglas de HTTPS Everywhere a los valores predeterminados.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/es/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/es/ssl-observatory.dtd
new file mode 100644
index 0000000..b5ded80
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/es/ssl-observatory.dtd
@@ -0,0 +1,100 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Detalles e información de privacidad">
+<!ENTITY ssl-observatory.popup.later "Preguntarme luego">
+<!ENTITY ssl-observatory.popup.no "No">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere puede detectar ataques
+contra su navegador enviando los certificados que reciba
+al Observatorio. ¿Quiere activarlo?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"¿Debe HTTPS Everywhere utilizar el Observatorio SSL?">
+
+<!ENTITY ssl-observatory.popup.yes "Sí">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Habilitar esto es seguro, a menos que use
+una red corporativa muy intrusiva:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Seguro, a menos que use una red corporativa con nombres de servidores de intranet secretos:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Envía y verifica los certificados firmados por autoridades de certificación raíz (ACs/CAs) no standard">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Es seguro (y una buena idea) habilitar esta opción, a menos que utilice una red corporativa intrusiva o el software antivirus Kaspersky que monitoriza su navegación con un proxy TLS y una Autoridad de Certificación raíz privada. Si se habilita en una red así, esta opción podría evidenciar qué dominios https:// fueron visitados por medio de ese proxy, debido a los certificados únicos que produciría. Por ello viene desactivado por defecto.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Verificar certificados utilizando Tor para obtener anonimato">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Verificar certificados utilizando Tor para obtener anonimato (requiere Tor)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Esta opción precisa tener Tor instalado y ejecutandose">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Al ver un nuevo certificado, comunicar al Observatorio a qué ISP se está conectado">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Esto obtendrá y enviará el &quot;número de Sistema Autónomo&quot; (AS) de su red. Esto nos ayudará a ubicar ataques contra HTTPS, y a determinar si tenemos observaciones desde redes en lugares como Irán o Siria donde los ataques son comparativamente más comunes.">
+
+<!ENTITY ssl-observatory.prefs.done "Listo">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere puede utilizar el Observatorio SSL de EFF. Esto hace dos cosas:
+(1) envía copias de los certificados HTTPS al Observatorio, para ayudarnos
+a detectar ataques de 'hombre en el medio' (MitM) y mejorar la seguridad de la Web; y
+(2) nos permite advertirle de conexiones inseguras o ataques sobre su navegador.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Por ejemplo, cuando visite https://www.algo.com, el certificado
+recibido por el Observatorio indicará que alguien visitó
+www.algo.com, pero no quién visitó el sitio, o qué página específica
+consultó. Pase el ratón sobre las opciones para mayores detalles:">
+
+<!ENTITY ssl-observatory.prefs.hide "Ocultar opciones avanzadas">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Verificar certificados incluso si Tor no está disponible">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Aún trataremos de mantener anónimos los datos, pero esta opción es menos segura">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Enviar y verificar certificados para nombres no públicados en DNS">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"A menos que esta opción esté marcada, el Observatorio no registra certificados para nombres que no pueda resolver a través de DNS.">
+
+<!ENTITY ssl-observatory.prefs.show "Mostrar opciones avanzadas">
+
+<!ENTITY ssl-observatory.prefs.title "Opciones del Observatorio SSL">
+
+<!ENTITY ssl-observatory.prefs.use "¿Utilizar el Observatorio?">
+<!ENTITY ssl-observatory.warning.title "ADVERTENCIA del Observatorio SSL de la EFF">
+<!ENTITY ssl-observatory.warning.showcert "Mostrar la cadena del certificado">
+<!ENTITY ssl-observatory.warning.okay "Entendido">
+<!ENTITY ssl-observatory.warning.text "El Observatorio SSL de la EFF ha emitido una advertencia sobre el(los) certificado(s) para este sitio:">
+<!ENTITY ssl-observatory.warning.defense "Si está autentificado en este sitio, sería aconsejable cambiar su contraseña una vez que se vuelva a autentificar de forma segura.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Enviar y verificar certificados auto-firmados">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Esto es recomendable; los problemas de cifrado son especialmente comunes en dispositivos embebidos auto-firmados">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/eu/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/eu/https-everywhere.dtd
new file mode 100644
index 0000000..bb7989c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/eu/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "HTTPS Everywhere buruz">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Weba enkriptatu! Automatikoki erabili HTTPS segurtasuna leku askotan.">
+<!ENTITY https-everywhere.about.version "Bertsioa">
+<!ENTITY https-everywhere.about.created_by "Sortzaileak">
+<!ENTITY https-everywhere.about.librarians "Arau-sorta Liburuzainak">
+<!ENTITY https-everywhere.about.thanks "Eskerrak">
+<!ENTITY https-everywhere.about.contribute "HTTPS Everywhere gustoko baduzu, kontutan har zenezake">
+<!ENTITY https-everywhere.about.donate_tor "Torera dohaintza eman">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "EFFra dohaintza eman">
+
+<!ENTITY https-everywhere.menu.about "HTTPS Everywhere buruz">
+<!ENTITY https-everywhere.menu.observatory "SSL Behatokiaren Hobespenak">
+<!ENTITY https-everywhere.menu.globalEnable "HTTPS Everywhere gaitu">
+<!ENTITY https-everywhere.menu.globalDisable "HTTPS Everywhere ezgaitu">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere Hobespenak">
+<!ENTITY https-everywhere.prefs.enable_all "Gaitu dena">
+<!ENTITY https-everywhere.prefs.disable_all "Ezgaitu dena">
+<!ENTITY https-everywhere.prefs.reset_defaults "Lehenetsiak berrezarri">
+<!ENTITY https-everywhere.prefs.search "Bilatu">
+<!ENTITY https-everywhere.prefs.site "Lekua">
+<!ENTITY https-everywhere.prefs.notes "Oharrak">
+<!ENTITY https-everywhere.prefs.list_caption "Zein HTTPS berbiderapen arau aplikatu beharko nituzke?">
+<!ENTITY https-everywhere.prefs.enabled "Gaituta">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Zure arau-sortak nola idatzi ikas dezakezu (beste webguneentzako laguntza gehitzeko)">
+<!ENTITY https-everywhere.prefs.here_link "hemen">
+<!ENTITY https-everywhere.prefs.toggle "Aldatu">
+<!ENTITY https-everywhere.prefs.reset_default "Lehenetsia berrezarri">
+<!ENTITY https-everywhere.prefs.view_xml_source "XML Iturria ikusi">
+
+<!ENTITY https-everywhere.source.downloading "Deskargatzen">
+<!ENTITY https-everywhere.source.filename "Fitxategi izena">
+<!ENTITY https-everywhere.source.unable_to_download "Ezin izan da iturria deskargatu">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/eu/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/eu/https-everywhere.properties
new file mode 100644
index 0000000..20460eb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/eu/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = HTTPS Everywhere gaitu
+https-everywhere.menu.globalDisable = HTTPS Everywhere ezgaitu
+https-everywhere.menu.enableDisable = Gaitu / Ezgaitu arauak
+https-everywhere.menu.noRules = (Araurik ez gune honetarako)
+https-everywhere.menu.unknownRules = (Gune honetarako arauak ezezagunak)
+https-everywhere.toolbar.hint = HTTPS Everywhere aktibo dago orain. Gunez-gune bere egoera txandakatu dezakezu nabigazio tresna-barrako ikonoan sakatuz.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/eu/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/eu/ssl-observatory.dtd
new file mode 100644
index 0000000..2936b43
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/eu/ssl-observatory.dtd
@@ -0,0 +1,95 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Xehetasunak eta Pribatutasun Informazioa">
+<!ENTITY ssl-observatory.popup.later "Beranduago galdeidazu">
+<!ENTITY ssl-observatory.popup.no "Ez">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywherek zure nabigatzailearen aurkako erasoak antzeman ditzake jaso dituzun ziurtagiriak Behatokira bidaliz. Gaitu hau?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"HTTPS Everywherek SSL Behatokia erabili beharko luke?">
+
+<!ENTITY ssl-observatory.popup.yes "Bai">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Hau gaitzea segurua da, sare korporatibo oso intrusibo bat erabiltzen ez duzun bitartean:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Segurua, sare korporatibo bat intranet zerbitzari izen sekretuekin erabiltzen ez duzun bitartean:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"CA erro ez-estandarrek sinatutako ziurtagiriak egiaztatu eta aurkeztu">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Aukera hau gaitzea segurua (eta ideia ona) da, sare korporatibo intrusibo bat edo TLS proxy batekin eta Ziurtagiri Aginpide erro pribatu batekin zure nabigazioa jarraitzen duen Kaspersky antibirus softwarea erabiltzen ez duzun bitartean. Horrelako sare batean gaitzen baduzu, aukera honek proxy horren bitartez zein https:// domeinu bisitatu diren argitara dezake, sortuko dituen ziurtagiri bakarrengatik. Beraz itzalita uztea lehentsi dugu.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Egiaztatu ziurtagiriak Tor anonimotasunerako erabiliz">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Egiaztatu ziurtagiriak Tor anonimotasunerako erabiliz (Torbutton behar du)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Aukera honek Tor eta Torbutton instalatuta izatea behar du">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Ziurtagiri berri bat ikusten duzunean, Behatokiari zein ISPra konektatuta zauden esan">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Honek zure sarearen &quot;Sistema Autonomo zenbakia&quot; lortu eta bidaliko du. Hau HTTPSren aurkako erasoak aurkitzen lagunduko gaitu, eta erasoak konparatiboki arruntak diren Iran eta Siria bezalako lekuetan behaketak ditugun zehaztu.">
+
+<!ENTITY ssl-observatory.prefs.done "Eginda">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywherek EFFren SSL Behatokia erabili dezake. Honek bi gauza egiten ditu: (1)
+HTTPS ziurtagirien kopiak Behatokira bidaltzen ditu, 'man in the middle' erasoak detektatzen eta Webguneen segurtasuna hobetzen lagun gaitzan; eta (2)
+seguruak ez diren konexioetaz edo zure nabigatzailearen aurkako erasoetaz abisa zaitzagun baimentzen digu.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Esate baterako, https://www.zerbait.com bisitatzen duzunean, Behatokiak jasotzen duen ziurtagiriak
+ norbait www.zerbait.com bisitatu duela adieraziko du, baina ez nork bisitatu duen, edo zehazki zein orri ikusi duen.
+Xehetasun gehiagorako pasa ezazu sagua aukeren gainetik:">
+
+<!ENTITY ssl-observatory.prefs.hide "Aukera aurreratuak ezkutatu">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Ziurtagiriak egiaztatu Tor eskuragarri ez badago ere">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Oraindik datuak anonimoki mantentzen saiatuko gara, baina aukera hau ez da hain segurua">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"DNS izen ez-publikoentzako ziurtagiriak egiaztatu eta aurkeztu">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Aukera hau gaituta ez dagoen bitartean, Behatokiak DNS sistemaren bitartez ebatzi ezin dituen izenentzako ziurtagiriak ez ditu erregistraruko.">
+
+<!ENTITY ssl-observatory.prefs.show "Aukera aurreratuak erakutsi">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Behatokiaren Hobespenak">
+
+<!ENTITY ssl-observatory.prefs.use "Behatokia erabili?">
+<!ENTITY ssl-observatory.warning.title "EFFren SSL Behatokiaren ABISUA">
+<!ENTITY ssl-observatory.warning.showcert "Ziurtagiri katea erakutsi">
+<!ENTITY ssl-observatory.warning.okay "Ulertzen dut">
+<!ENTITY ssl-observatory.warning.text "EFFren SSL Behatokiak leku honen HTTPS ziurtagiri(ar)entzako abisua igorri du:">
+<!ENTITY ssl-observatory.warning.defense "Leku honetan saioa hasi baduzu, konexio seguru bat duzunean zure pasahitza aldatzea komeni da.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Bidali eta egiaztatu norberak-sinatutako ziurtagiriak">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Hau gomendatzen da; arazo kriptografikoak norberak-sinatutako kapsulatutako gailuetan bereziki arruntak dira">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fa/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fa/https-everywhere.dtd
new file mode 100644
index 0000000..75ea17f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fa/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "درباره‌ی HTTPS همه‌جا">
+<!ENTITY https-everywhere.about.ext_name "HTTPS همه‌جا">
+<!ENTITY https-everywhere.about.ext_description "وب را رمزگذاری کنید! از امنیت HTTPS بصورت خودکار برای بسیاری از وب‌سایت‌ها Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید.">
+<!ENTITY https-everywhere.about.version "نسخه">
+<!ENTITY https-everywhere.about.created_by "نوشته‌شده توسط">
+<!ENTITY https-everywhere.about.librarians "Ruleset Librarians">
+<!ENTITY https-everywhere.about.thanks "با تشکر از">
+<!ENTITY https-everywhere.about.contribute "اگر شما از HTTPS همه‌جا راضی هستید، پیشنهاد می‌کنیم">
+<!ENTITY https-everywhere.about.donate_tor "به Tor کمک مالی کنید.">
+<!ENTITY https-everywhere.about.tor_lang_code "fa">
+<!ENTITY https-everywhere.about.donate_eff "به EFF کمک مالی کنید.">
+
+<!ENTITY https-everywhere.menu.about "درباره‌ی HTTPS همه‌جا">
+<!ENTITY https-everywhere.menu.observatory "تنظیم‌های رصدخانه‌ی SSL">
+<!ENTITY https-everywhere.menu.globalEnable "HTTPS همه‌جا را ÙØ¹Ø§Ù„ کنید">
+<!ENTITY https-everywhere.menu.globalDisable "HTTPS همه‌جا را ØºÛŒØ±ÙØ¹Ø§Ù„ کنید">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "تنظیم‌های HTTPS همه‌جا">
+<!ENTITY https-everywhere.prefs.enable_all "همه‌ی موارد را ÙØ¹Ø§Ù„ کنید">
+<!ENTITY https-everywhere.prefs.disable_all "همه‌ی موارد را ØºÛŒØ±ÙØ¹Ø§Ù„ کنید">
+<!ENTITY https-everywhere.prefs.reset_defaults "بازگشت به تنظیم‌های اولیه">
+<!ENTITY https-everywhere.prefs.search "جستجو">
+<!ENTITY https-everywhere.prefs.site "وب‌سایت">
+<!ENTITY https-everywhere.prefs.notes "یادداشت‌ها">
+<!ENTITY https-everywhere.prefs.list_caption "کدام روال‌های تغییر مسیر HTTPS باید اعمال شوند؟">
+<!ENTITY https-everywhere.prefs.enabled "ÙØ¹Ø§Ù„">
+<!ENTITY https-everywhere.prefs.ruleset_howto "شما می‌توانید یادبگیرید که مجموعه روال‌های خود را بنویسید (تا از وب‌سایت‌های دیگر پشتیبانی کنید)">
+<!ENTITY https-everywhere.prefs.here_link "اینجا">
+<!ENTITY https-everywhere.prefs.toggle "تغییر">
+<!ENTITY https-everywhere.prefs.reset_default "بازگشت به تنظیم‌های اولیه">
+<!ENTITY https-everywhere.prefs.view_xml_source "مشاهده منبع XML">
+
+<!ENTITY https-everywhere.source.downloading "در حال دانلود">
+<!ENTITY https-everywhere.source.filename "نام ÙØ§ÛŒÙ„">
+<!ENTITY https-everywhere.source.unable_to_download "امکان دانلود منبع وجود ندارد.">
+
+<!ENTITY https-everywhere.popup.title "آگهی از همه جا HTTPS نسخه 4.0development.11">
+<!ENTITY https-everywhere.popup.paragraph1 "اوه! شما از نسخه پایدار «همه جا HTTPS» Ø§Ø³ØªÙØ§Ø¯Ù‡ Ù…ÛŒ کردید، اما احتمالا ما به طور تصادÙÛŒ در حین آخرین انتشار، شما را به نسخه در حال توسعه ارتقا دادیم. ">
+<!ENTITY https-everywhere.popup.paragraph2 "آیا مایلید به نسخه‌ی پایدار بازگردید؟">
+<!ENTITY https-everywhere.popup.paragraph3 "ما خوشحال Ù…ÛŒ شویم اگر شما همچنان از آخرین نسخه‌ی در حال توسعه منتشر شده ما Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید! شاید اینجا Ùˆ آنجا به یکی دو مشکل برخورد کنید Ú©Ù‡ Ù…ÛŒ توانید آنها را به آدرس https-everywhere@eff.org اطلاع دهید. با عرض پوزش به خاطر مشکلات احتمالی Ùˆ با تشکر به خاطر Ø§Ø³ØªÙØ§Ø¯Ù‡ از «همه جا HTTPS».">
+<!ENTITY https-everywhere.popup.keep "آخرین نسخه پایدار را داونلود کن">
+<!ENTITY https-everywhere.popup.revert "آخرین نسخه پایدار را داونلود کن">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fa/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fa/https-everywhere.properties
new file mode 100644
index 0000000..7e7959c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fa/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = HTTPS همه‌جا را ÙØ¹Ø§Ù„ کنید
+https-everywhere.menu.globalDisable = HTTPS همه‌جا را ØºÛŒØ±ÙØ¹Ø§Ù„ کنید
+https-everywhere.menu.enableDisable = ÙØ¹Ø§Ù„/غیر ÙØ¹Ø§Ù„ کردن قوانین
+https-everywhere.menu.noRules = (هیچ قانونی برای این ØµÙØ­Ù‡ وجود ندارد)
+https-everywhere.menu.unknownRules = (قوانین مربوط به این ØµÙØ­Ù‡ ناشناخته است)
+https-everywhere.toolbar.hint = HTTPS همه‌جا ÙØ¹Ø§Ù„ شد. می‌توانید آن را برای هر سایتی Ú©Ù‡ خواستید ÙØ¹Ø§Ù„ یا ØºÛŒØ±ÙØ¹Ø§Ù„ کنید. کاÙیست روی نمایه آن در نوار آدرس کلیک کنید.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fa/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fa/ssl-observatory.dtd
new file mode 100644
index 0000000..3bec572
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fa/ssl-observatory.dtd
@@ -0,0 +1,91 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "جزییات Ùˆ Ø­ÙØ¸ حریم شخصی">
+<!ENTITY ssl-observatory.popup.later "بعدا بپرس">
+<!ENTITY ssl-observatory.popup.no "خیر">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS همه‌جا می‌تواند جمله به مرورگر شما را از طریق ارسال گواهینامه‌هایی Ú©Ù‡ شما Ø¯Ø±ÛŒØ§ÙØª می‌کنید به رصدگر کش٠کند. آیا می‌خواهید این امکان ÙØ¹Ø§Ù„ شود؟">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"آیا HTTPS همه‌جا باید از رصدگر SSL Ø§Ø³ØªÙØ§Ø¯Ù‡ کند؟">
+
+<!ENTITY ssl-observatory.popup.yes "بله">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"ÙØ¹Ø§Ù„‌کردن این گزینه امن است، مگر این‌که شما از یک شبکه‌ی کاری با درجه‌ی نظارت بالا Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"امن، مگر اینکه شما از یک شبکه‌ی کاری با نام‌های مخÙÛŒ در شبکه‌ی داخلی Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"گواهینامه‌های امضا شده توسط نهادهای تایید (CA) غیراستاندارد را برای بررسی ارسال کنید. ">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"این یک انتخاب امن (Ùˆ یک پیشنهاد خوب) است Ú©Ù‡ شما این گزینه را ÙØ¹Ø§Ù„ کنید، مگر اینکه شما از یک شبکه‌ی کاری با درجه‌ی نظارت بالا Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید یا Ù†Ø±Ù…â€ŒØ§ÙØ²Ø§Ø± ضدویروس کاسپرسکی، Ú©Ù‡ Ø±ÙØªØ§Ø± شما روی وب را به‌کمک TLS proxy Ùˆ یک نهاد تایید (CA) خصوصی بازرسی می‌کند، روی کامپیوتر شما نصب شده‌باشد. اگر روی شبکه‌ای مانند آن‌چه Ú¯ÙØªÙ‡â€ŒØ´Ø¯ قرار دارید، این گزینه می‌توانند این تصور را ایجاد کند Ú©Ù‡ آدرس‌های https:// از طریق یک پروکسی باز شده‌اند. این به‌دلیل گواهینامه‌های Ù…Ù†Ø­ØµØ±Ø¨Ù‡â€ŒÙØ±Ø¯ÛŒ است Ú©Ù‡ در این ÙØ±Ø§ÛŒÙ†Ø¯ تولید می‌شوند. بنابراین، ما این گزینه را بصورت پیشنهاده خاموش کرده‌ایم.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Ø§Ø³ØªÙØ§Ø¯Ù‡ از Tor برای مخÙÛŒ کردن هویت در زمان آزمایش گواهینامه">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Ø§Ø³ØªÙØ§Ø¯Ù‡ از Tor برای مخÙÛŒ کردن هویت در زمان آزمایش گواهینامه (نیاز به Torbutton دارد)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"برای Ø§Ø³ØªÙØ§Ø¯Ù‡ از این امکان لازم است Tor Ùˆ Torbutton نصب شده‌باشند">
+
+<!ENTITY ssl-observatory.prefs.asn
+"ارسال نام ISPی که ارتباط را ایجاد کرده است به رصدگر زمانی که یک گواهینامه‌ی جدید دیده شد">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"این گزینه محتوای Autonomous System number شما را بازیابی کرده Ùˆ ارسال خواهد کرد. این اطلاع به ما Ú©Ù…Ú© خواهد کرد Ú©Ù‡ حمله علیه HTTPS را مکان‌یابی کنیم Ùˆ از این طریق ما خواهیم دانست Ú©Ù‡ آیا این مشاهدات به شبکه‌هایی در مناطقی نظیر ایران Ùˆ سوریه مربوط هستند یا خیر. حملاتی نظیر آنچه Ú¯ÙØªÙ‡â€ŒØ´Ø¯ در این مناطق نسبتا معمول هستند.">
+
+<!ENTITY ssl-observatory.prefs.done "انجام شد">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS همه‌جا می‌تواند از رصدگر SSLÛŒ Ú©Ù‡ توسط EFF اداره می‌شود Ø§Ø³ØªÙØ§Ø¯Ù‡ کند. این امکان منتهی به دو اقدام می‌شود. Û±- به این‌ترتیب نسخه‌هایی از گواهینامه‌های HTTPS به رصدگر ÙØ±Ø³ØªØ§Ø¯Ù‡ می‌شوند. این مساله به ما این امکان را می‌دهد Ú©Ù‡ حملات «مردی در میان» را کش٠کنیم Ùˆ به این‌ترتیب به امنیت وب Ú©Ù…Ú© کنیم. Û²- ما این امکان را خواهیم داشت Ú©Ù‡ به شما درباره‌ی ارتباطات ناامن یا حملات به مرورگر شما هشدار بدهیم.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"برای مثال، زمانی Ú©Ù‡ شما ØµÙØ­Ù‡â€ŒÛŒ https://www.something.com را بازدید می‌کنید، گواهینامه‌ای Ú©Ù‡ برای رصدگر ارسال می‌شود نشان خواهد داد Ú©Ù‡ کسی از www.something.com بازدید کرده‌است، اما اینکه دقیقا چه‌کسی یا از Ú†Ù‡ ØµÙØ­Ù‡â€ŒØ§ÛŒ بازدید کرده‌است برای رصدگر دانسته نخواهد بود. موشواره‌ را روی این گزینه ببرید تا اطلاعات بیشتری در این زمینه بگیرید:">
+
+<!ENTITY ssl-observatory.prefs.hide "مخÙی‌کردن گزینه‌های Ù¾ÛŒØ´Ø±ÙØªÙ‡">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"آزمایش گواهینامه حتی اگر Tor نیز نصب نشده‌باشد">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"ما هم‌چنان تلاش خواهیم کرد که اطلاعات شما را محرمانه نگه‌داریم، اما این گزینه امنیت کمتری دارد">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"ارسال و آزمایش گواهینامه‌ی برای نام‌های DNS غیرعمومی">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"اگر این گزینه انتخاب نشده‌باشد، رصدگر اطلاعات گواهینامه‌هایی که نام آن‌ها از طریق DNS تعیین‌تکلی٠نشود را ذخیره نخواهد کرد.">
+
+<!ENTITY ssl-observatory.prefs.show "نمایش گزینه‌های Ù¾ÛŒØ´Ø±ÙØªÙ‡">
+
+<!ENTITY ssl-observatory.prefs.title "تنظیم‌های رصدگر SSL">
+
+<!ENTITY ssl-observatory.prefs.use "آیا باید از رصدگر Ø§Ø³ØªÙØ§Ø¯Ù‡ شود؟">
+<!ENTITY ssl-observatory.warning.title "هشدار از رصدگر SSLی که توسط EFF اداره می‌شود">
+<!ENTITY ssl-observatory.warning.showcert "نمایش زنجیره‌ی گواهینامه">
+<!ENTITY ssl-observatory.warning.okay "می‌Ùهمم">
+<!ENTITY ssl-observatory.warning.text "رصدگر SSLی که توسط EFF اداره می‌شود برای گواهینامه(ها)ی HTTPS این وب‌سایت هشدار صادر کرده‌است:">
+<!ENTITY ssl-observatory.warning.defense "اگر شما در این وب‌سایت لاگین کرده‌اید، پیشنهاد می‌کنیم که زمانی که با یک اتصال امن وارد شدید رمز ورود خود را تغییر دهید.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"ارسال و گواهینامه های خود-امضا را بررسی کن">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"این پیشنهاد میشه؛ مشکلات رمزنگاری بویژه در دستگاههای تعبیه شده خود-امضا رایج هستند">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fi/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fi/https-everywhere.dtd
new file mode 100644
index 0000000..91da15b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fi/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Tietoja HTTPS Everywheresta">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Salaa Web! Käytä automaattisesti HTTPS-suojausta useilla sivustoilla.">
+<!ENTITY https-everywhere.about.version "Versio">
+<!ENTITY https-everywhere.about.created_by "Tekijät">
+<!ENTITY https-everywhere.about.librarians "Sääntöjen hallinnoijat">
+<!ENTITY https-everywhere.about.thanks "Kiitokset">
+<!ENTITY https-everywhere.about.contribute "Jos pidät HTTPS Everywheresta, sinun on mahdollista">
+<!ENTITY https-everywhere.about.donate_tor "lahjoittaa Torille">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "lahjoittaa EFFille">
+
+<!ENTITY https-everywhere.menu.about "Tietoja HTTPS Everywheresta">
+<!ENTITY https-everywhere.menu.observatory "SSL Observatoryn asetukset">
+<!ENTITY https-everywhere.menu.globalEnable "Ota HTTPS Everywhere käyttöön">
+<!ENTITY https-everywhere.menu.globalDisable "Poista HTTPS Everywhere käytöstä">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywheren asetukset">
+<!ENTITY https-everywhere.prefs.enable_all "Ota kaikki käyttöön">
+<!ENTITY https-everywhere.prefs.disable_all "Poista kaikki käytöstä">
+<!ENTITY https-everywhere.prefs.reset_defaults "Palauta oletusarvoihin">
+<!ENTITY https-everywhere.prefs.search "Hae">
+<!ENTITY https-everywhere.prefs.site "Sivusto">
+<!ENTITY https-everywhere.prefs.notes "Huomautus">
+<!ENTITY https-everywhere.prefs.list_caption "Mitä HTTPS-uudelleenohjauksia tulisi käyttää?">
+<!ENTITY https-everywhere.prefs.enabled "Käytössä">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Voit opetella kirjoittamaan omia sääntöjäsi (laajentaaksesi muiden sivustojen tukea)">
+<!ENTITY https-everywhere.prefs.here_link "täällä">
+<!ENTITY https-everywhere.prefs.toggle "Vaihda tilaa">
+<!ENTITY https-everywhere.prefs.reset_default "Palauta oletusasetus">
+<!ENTITY https-everywhere.prefs.view_xml_source "Katso XML-lähde">
+
+<!ENTITY https-everywhere.source.downloading "Ladataan">
+<!ENTITY https-everywhere.source.filename "Tiedostonimi">
+<!ENTITY https-everywhere.source.unable_to_download "Lähteen lataaminen epäonnistui.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fi/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fi/https-everywhere.properties
new file mode 100644
index 0000000..ada876f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fi/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Ota HTTPS Everywhere käyttöön
+https-everywhere.menu.globalDisable = Poista HTTPS Everywhere käytöstä
+https-everywhere.menu.enableDisable = Ota sääntöjä käyttöön / poista käytöstä
+https-everywhere.menu.noRules = (Tälle sivulle ei ole sääntöjä)
+https-everywhere.menu.unknownRules = (Sivun sääntöä ei tunnistettu)
+https-everywhere.toolbar.hint = HTTPS Everywhere on käytössä. Voit valita, millä sivustoilla ohjelmaa käytetään, kun napsautat osoiterivissä olevaa kuvaketta.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fi/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fi/ssl-observatory.dtd
new file mode 100644
index 0000000..2d53a25
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fi/ssl-observatory.dtd
@@ -0,0 +1,91 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Lisä- ja yksityisyystiedot">
+<!ENTITY ssl-observatory.popup.later "Kysy myöhemmin">
+<!ENTITY ssl-observatory.popup.no "Ei">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere voi tunnistaa selaimeen kohdistuvat hyökkäykset lähettämällä varmenteet Observatoryyn. Otetaanko toiminto käyttöön?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Tulisiko HTTPS Everywheren käyttää SSL Observatorya?">
+
+<!ENTITY ssl-observatory.popup.yes "Kyllä">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Käyttöön ottaminen on turvallista, jos et käytä hyvin tunkeilevaa yritysverkkoa:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Turvallista, jos et käytä yritysverkkoa, jonka intranetin palvelinten nimet on salattu:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Lähetä ja tarkista varmenteet, jotka on allekirjoittanut epävirallinen päämyöntäjä">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"On turvallista (ja hyvä idea) valita tämä, jos et käytä tunkeilevaa yritysverkkoa tai Kasperskyn viruksentorjuntaohjelmaa, joka seuraa selaamista TLS-välipalvelimen ja yksityisen varmenteen päämyöntäjän avulla. Tällaisessa verkossa tämä asetus voi antaa vihjeitä siitä, missä HTTPS-verkkotunnuksissa välipalvelimen avulla on vierailtu. Vihjeiden syynä ovat niiden tuottamat ainutlaatuiset varmenteet. Tästä syystä valinta ei ole päällä oletusasetuksena.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Tarkista varmenteet anonyymisti Torilla">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Tarkista varmenteet anonyymisti Torilla (vaatii Torin)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Tämä valinta edellyttää, että Tor on asennettu ja käytössä.">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Kun näet uuden varmenteen, kerro Observatorylle, mihin palveluntarjoajaan olet yhteydessä">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Tämä noutaa ja lähettää verkkosi autonomisen järjestelmän numerotunnuksen (ASN). Näin pystymme paikantamaan HTTPS:ään kohdistuvat hyökkäykset ja voimme selvittää, ovatko havainnot Iranin ja Syyrian kaltaisten alueiden verkoista, joissa hyökkäykset ovat yleisiä.">
+
+<!ENTITY ssl-observatory.prefs.done "Valmis">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere voi hyödyntää EFFin SSL Observatorya. Sillä on kaksi tehtävää: (1) Se lähettää HTTPS-varmenteiden kopiot Observatoryyn, jotta pystyisimme tunnistamaan epärehellisen välittäjän (MitM) hyökkäykset ja edistämään WWW:n turvallisuutta. (2) Sen avulla voimme varoittaa sinua turvattomista yhteyksistä ja selaimeen kohdistuvista hyökkäyksistä.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Jos esimerkiksi käyt sivustolla https://www.something.com, Observatoryn vastaanottama varmenne kertoo, että joku on vieraillut osoitteessa www.something.com. Varmenne ei kuitenkaan kerro, kuka on käynyt sivustolla ja mitä tiettyjä sivuja on katseltu. Saat lisätietoja, kun kohdistat hiiren osoittimen valinnan päälle:">
+
+<!ENTITY ssl-observatory.prefs.hide "Piilota lisäasetukset">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Tarkista varmenteet, vaikka Tor ei ole käytössä">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Yritämme pitää tiedot nimettömänä, mutta tämä valinta on aina turvattomampi.">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Lähetä ja tarkista yksityisten DNS-nimien varmenteet">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Jos tätä valintaa ei ole valittu, Observatory ei kerää varmenteita, joiden nimiä se ei pysty selvittämään nimipalvelujärjestelmällä (DNS).">
+
+<!ENTITY ssl-observatory.prefs.show "Näytä lisäasetukset">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Observatoryn asetukset">
+
+<!ENTITY ssl-observatory.prefs.use "Käytä Observatorya?">
+<!ENTITY ssl-observatory.warning.title "VAROITUS EFFin SSL Observatorylta">
+<!ENTITY ssl-observatory.warning.showcert "Näytä palvelimen varmenneketju">
+<!ENTITY ssl-observatory.warning.okay "Ymmärrän">
+<!ENTITY ssl-observatory.warning.text "EFFin SSL Observatory on varoittanut tämän sivuston yhdestä tai useammasta HTTPS-varmenteesta:">
+<!ENTITY ssl-observatory.warning.defense "Jos olet kirjautunut sivustolle, voi olla suositeltavaa vaihtaa salasana, sitten kun käytössäsi on turvallinen yhteys.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Lähetä ja tarkista sivuston itsensä allekirjoittama varmenne">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Tämä on suositeltavaa. Salaukseen liittyvät ongelmat ovat hyvin yleisiä itsensä allekirjoittaneissa sulautetuissa järjestelmissä.">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fr/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fr/https-everywhere.dtd
new file mode 100644
index 0000000..bae723d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fr/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "À propos de HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Chiffrer le Web ! Utilisez HTTPS automatiquement avec de nombreux sites.">
+<!ENTITY https-everywhere.about.version "Version">
+<!ENTITY https-everywhere.about.created_by "Créé par">
+<!ENTITY https-everywhere.about.librarians "Bibliothécaires de règles">
+<!ENTITY https-everywhere.about.thanks "Merci à">
+<!ENTITY https-everywhere.about.contribute "Si vous aimez HTTPS Everywhere, vous pouvez">
+<!ENTITY https-everywhere.about.donate_tor "Donner à Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "Donner à l'EFF">
+
+<!ENTITY https-everywhere.menu.about "À propos de HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "Préférences de l'Observatoire SSL ">
+<!ENTITY https-everywhere.menu.globalEnable "Activer HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Désactiver HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Préférences de HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "Tout activer">
+<!ENTITY https-everywhere.prefs.disable_all "Tout désactiver">
+<!ENTITY https-everywhere.prefs.reset_defaults "Revenir aux paramètres par défaut">
+<!ENTITY https-everywhere.prefs.search "Recherche">
+<!ENTITY https-everywhere.prefs.site "Site">
+<!ENTITY https-everywhere.prefs.notes "Notes">
+<!ENTITY https-everywhere.prefs.list_caption "Quelles règles de redirection HTTPS devraient s'appliquer ?">
+<!ENTITY https-everywhere.prefs.enabled "Activé">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Vous pouvez apprendre à rédiger vos propres règles de redirection (pour la prise en charge d'autres sites Internet)">
+<!ENTITY https-everywhere.prefs.here_link "Ici">
+<!ENTITY https-everywhere.prefs.toggle "Retour">
+<!ENTITY https-everywhere.prefs.reset_default "Revenir aux paramètres par défaut.">
+<!ENTITY https-everywhere.prefs.view_xml_source "Regarder le code source XML">
+
+<!ENTITY https-everywhere.source.downloading "Telécharger">
+<!ENTITY https-everywhere.source.filename "Nom du fichier">
+<!ENTITY https-everywhere.source.unable_to_download "Impossible de télécharger le code source.">
+
+<!ENTITY https-everywhere.popup.title "Notification de HTTPS Everywhere 4.0development.11">
+<!ENTITY https-everywhere.popup.paragraph1 "Oups. Vous utilisiez la version stable de HTTPS Everywhere, mais notre dernière version a pu accidentellement effectuer la mise à jour vers la version de développement.">
+<!ENTITY https-everywhere.popup.paragraph2 "Est-ce que vous souhaitez revenir vers la version stable ?">
+<!ENTITY https-everywhere.popup.paragraph3 "Nous aimerions vous voir continuer à utiliser notre version de développement et à nous aider à améliorer HTTPS Everywhere ! Vous allez peut-être trouver des bugs ça et là, que vous pouvez rapporter (en anglais) en écrivant à https-everywhere@eff.org. Désolé pour le dérangement, et merci d'utiliser HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Rester sur la version de développement">
+<!ENTITY https-everywhere.popup.revert "Télécharger la dernière version stable">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fr/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fr/https-everywhere.properties
new file mode 100644
index 0000000..a64e511
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fr/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Activer HTTPS Everywhere
+https-everywhere.menu.globalDisable = Désactiver HTTPS Everywhere
+https-everywhere.menu.enableDisable = Activer / Désactiver les règles
+https-everywhere.menu.noRules = (Aucune règle pour cette page)
+https-everywhere.menu.unknownRules = (Règles inconnues pour cette page)
+https-everywhere.toolbar.hint = HTTPS Everywhere est désormais actif. Vous pouvez l'activer sur les sites au cas par cas en cliquant sur l'icône dans la barre d'adresse.
+https-everywhere.migration.notification0 = Afin d'appliquer un correctif crucial, cette mise à jour réinitialise vos règles de préférences HTTPS Everywhere, à leurs valeurs par défaut.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fr/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fr/ssl-observatory.dtd
new file mode 100644
index 0000000..0d4d394
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/fr/ssl-observatory.dtd
@@ -0,0 +1,90 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Informations relatives à la vie privée">
+<!ENTITY ssl-observatory.popup.later "Plus tard">
+<!ENTITY ssl-observatory.popup.no "Non">
+
+<!ENTITY ssl-observatory.popup.text " HTTPS Everywhere peut détecter les attaques contre votre navigateur en adressant les certificats reçus à l'Observatoire. Souhaitez-vous activer cette fonctionnalité ?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Activer l'usage de l'Observatoire SSL par HTTPS Everywhere ?">
+
+<!ENTITY ssl-observatory.popup.yes "Oui">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Cette option est sécurisée, sauf si vous vous connectez via un réseau d'entreprise très intrusif :">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Cette option est sécurisée, sauf si vous passez par un réseau d'entreprise qui comporte des serveurs Intranet masqués :">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Soumettre et vérifier les certificats signés par des autorités inhabituelles">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+" Il est sûr (et c'est une bonne idée) d'activer cette option, sauf si vous utilisez un réseau d'entreprise intrusif ou le logiciel antivirus Kaspersky qui surveille votre navigation avec un proxy TLS et une autorité racine privée du certificat. Si elle est activée sur un tel réseau, cette option pourrait publier des preuves que tel ou tel domaine a été visité en https:// à travers ce proxy, à cause des certificats uniques qu'elle produirait. Nous la désactivons donc par défaut">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Vérifier les certificats et utiliser l'outil d'anonymat TOR">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Vérifier les certificats et utiliser l'outil d'anonymat TOR (installation du TORbutton indispensable)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Cette option requiert l'installation de TOR et du Torbutton">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Quand vous voyez un nouveau certificat, indiquez à l'Observatoire quel FAI vous utilisez maintenant.">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Cette option récupérera et rapportera le « Autonomous System number » de votre réseau. Cela nous aidera à localiser les attaques contre HTTPS, et savoir si nous avons des observations à partir de réseaux dans des pays comme l'Iran et la Syrie où ces attaques sont fréquentes.">
+
+<!ENTITY ssl-observatory.prefs.done "OK">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere peut également faire appel à l'Observatoire SSL de l'EFF. Cela permet deux choses: (1)
+cela adresse les copies des certificats HTTPS à l'Observatoire, ce qui permet de détecter les attaques de type Homme du milieu et d'améliorer la sécurité globale de l'Internet ; et (2)
+cela nous permet de mieux vous informer quant aux connexions non sécurisées et aux attaques sur votre navigateur.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Par exemple, si vous visitez https://www.something.com, le certificat reçu par l'Observatoire indiquera que quelqu'un a visité
+www.something.com, mais pas qui a visité le site, ou quelle page a été lue. Passez votre souris sur les options pour plus d'informations:">
+
+<!ENTITY ssl-observatory.prefs.hide "Cacher les options avancées">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Vérifier les certificats même si TOR n'est pas disponible">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Nous essaierons toujours de faire en sorte que les données restent confidentielles, mais cette option est moins sécurisée">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Soumettre et vérifier les certificats des DNS privés">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Si cette option est activée, l'Observatoire conservera les certificats des domaines qui ne peuvent être résolus par le système DNS public">
+
+<!ENTITY ssl-observatory.prefs.show "Options avancées">
+
+<!ENTITY ssl-observatory.prefs.title "Préférences de l'Observatoire SSL">
+
+<!ENTITY ssl-observatory.prefs.use "Utiliser l'Observatoire ?">
+<!ENTITY ssl-observatory.warning.title "Avertissement de l'Observatoire SSL">
+<!ENTITY ssl-observatory.warning.showcert "Montrer l'empreinte du certificat">
+<!ENTITY ssl-observatory.warning.okay "Je comprends">
+<!ENTITY ssl-observatory.warning.text "L'Observatoire SSL de l'EFF a publié un avertissement sur les certificats SSL émis par ce site :">
+<!ENTITY ssl-observatory.warning.defense "Si vous vous êtes connecté à ce site, vous devriez changer de mot de passe dès que vous retrouvez une connexion sécurisée.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Envoyer et vérifier des certificats auto-signés">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Ceci est recommandé ; les problèmes cryptographiques sont particulièrement fréquents dans les systèmes embarqués auto-signés">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/he/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/he/https-everywhere.dtd
new file mode 100644
index 0000000..dd33377
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/he/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "×ודות HTTPS בכל מקו×">
+<!ENTITY https-everywhere.about.ext_name "HTTPS בכל מקו×">
+<!ENTITY https-everywhere.about.ext_description "הצפן ×ת הרשת! השתמש ב-HTTPS ×וטומטית">
+<!ENTITY https-everywhere.about.version "גרסה">
+<!ENTITY https-everywhere.about.created_by "נבנה על ידי">
+<!ENTITY https-everywhere.about.librarians "ספרני מערכת כללי×">
+<!ENTITY https-everywhere.about.thanks "תודות ל">
+<!ENTITY https-everywhere.about.contribute "×× ×הבת ×ת HTTPS בכל מקו×, ×ולי תרצה">
+<!ENTITY https-everywhere.about.donate_tor "×œ×ª×¨×•× ×œ-Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "×נגלית">
+<!ENTITY https-everywhere.about.donate_eff "תרומה לEFF">
+
+<!ENTITY https-everywhere.menu.about "×ודות HTTPS בכל מקו×">
+<!ENTITY https-everywhere.menu.observatory "העדפות SSL Observatory">
+<!ENTITY https-everywhere.menu.globalEnable "הפעל ×ת HTTPS בכל מקו×">
+<!ENTITY https-everywhere.menu.globalDisable "השבת ×ת HTTPS בכל מקו×">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "הגדרות HTTPS בכל מקו×">
+<!ENTITY https-everywhere.prefs.enable_all "הפעל הכל">
+<!ENTITY https-everywhere.prefs.disable_all "השבת הכל">
+<!ENTITY https-everywhere.prefs.reset_defaults "×יפוס לברירת מחדל">
+<!ENTITY https-everywhere.prefs.search "חפש">
+<!ENTITY https-everywhere.prefs.site "×תר">
+<!ENTITY https-everywhere.prefs.notes "פתקי×">
+<!ENTITY https-everywhere.prefs.list_caption "×ילו הגדרות ניתוב HTTPS לייש×?">
+<!ENTITY https-everywhere.prefs.enabled "פועל">
+<!ENTITY https-everywhere.prefs.ruleset_howto "×תה יכול ללמוד ×יך לכתוב rulesets משלך (להוספת תמיכה ב×תרי ×ינטרנט ×חרי×)">
+<!ENTITY https-everywhere.prefs.here_link "פה">
+<!ENTITY https-everywhere.prefs.toggle "Toggle">
+<!ENTITY https-everywhere.prefs.reset_default "החזר לברירת מחדל">
+<!ENTITY https-everywhere.prefs.view_xml_source "הצג מקור XML">
+
+<!ENTITY https-everywhere.source.downloading "מוריד">
+<!ENTITY https-everywhere.source.filename "×©× ×”×§×•×‘×¥">
+<!ENTITY https-everywhere.source.unable_to_download "הורדת המקור נכשלה">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/he/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/he/https-everywhere.properties
new file mode 100644
index 0000000..434edd3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/he/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = להפעיל ×ת HTTPS Everywhere
+https-everywhere.menu.globalDisable = להשבית ×ת HTTPS Everywhere
+https-everywhere.menu.enableDisable = להפעיל/להשבית כללי×
+https-everywhere.menu.noRules = (×ין ×›×œ×œ×™× ×¢×‘×•×¨ דף ×–×”)
+https-everywhere.menu.unknownRules = (×›×œ×œ×™× ×œ×“×£ ×–×” ××™× × ×™×“×•×¢×™×)
+https-everywhere.toolbar.hint = HTTPS Everywhere is now active. You can toggle it on a site-by-site basis by clicking the icon in the address bar.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/he/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/he/ssl-observatory.dtd
new file mode 100644
index 0000000..ab3ed77
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/he/ssl-observatory.dtd
@@ -0,0 +1,92 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "×¤×¨×˜×™× ×•×ž×™×“×¢ ×ישי">
+<!ENTITY ssl-observatory.popup.later "ש×ל ×ותי ×חר כך">
+<!ENTITY ssl-observatory.popup.no "ל×">
+
+<!ENTITY ssl-observatory.popup.text " ">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"×”×× ×›×“××™ ש- HTTPS בכל ×ž×§×•× ×™×©×ª×ž×© בתצפית SSL?">
+
+<!ENTITY ssl-observatory.popup.yes "כן">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"בטוח ל×פשר ×–×ת, ××œ× ×× ×›×Ÿ ×תה משתמש ברשת ת×גידית פולשנית מ×וד:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"בטוח, ××œ× ×× ×›×Ÿ ×תה משתמש ברשת ת×גידית ×¢× ×©×ž×•×ª ×©×¨×ª×™× ×¡×•×“×™×™× ×‘×¨×©×ª זמנית:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"שלח ובדוק ××™×©×•×¨×™× ×”×—×ª×•×ž×™× ×¢×œ ידי רשויות ×”××™×©×•×¨×™× ×”×¢×œ×™×•× ×•×ª ×”×œ× ×¨×’×™×œ×•×ª">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"×–×” בטוח (ורעיון טוב) ל×פשר ×פשרות ×–×ת, ××œ× ×× ×›×Ÿ ×תה משתמש ברשת ת×גידית פולשנית ×ו תוכנת ×נטיוירוס קספרסקי שמנטרת ×ת הגלישה שלך ×¢× ×¤×¨×•×§×¡×™ TLS ורשות ××™×©×•×¨×™× ×¢×œ×™×•× ×” ×ישית. ×× ×ž×ופשרת רשת ×›×–×ת, ×פשרות ×–×ת יכולה ×œ×¤×¨×¡× ×¢×“×•×ª של ×ילו כתובות שמתחילות ב https:// בוקרו דרך הפרוקסי ×”×–×”, בשל ×”×ישור המיוחד ×©×”×•× ×ž×™×™×¦×¨. לכן נש×יר ×–×ת כבוי כברירת מחדל.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "בדוק ××™×©×•×¨×™× ×œ×©×™×ž×•×© ב TOR ב×נונימיות">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"בדוק ××™×©×•×¨×™× ×œ×©×™×ž×•×© ב Tor ב×נונימיות (דורש Tor )">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"×פשרות ×–×ת דורשת ש Tor יותקן וירוץ ">
+
+<!ENTITY ssl-observatory.prefs.asn
+"×›×שר ×תה רו××” ×ישור חדש, תגיד למצפה ל××™×–×” ספק ×תה מחובר">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"×–×” ×ž×‘×™× ×•×©×•×œ×— ×ת &quot;מספר המערכת ×”×נונימי&quot; של הרשת שלך. ×–×” יעזור לנו ×œ×ž×§× ×”×ª×§×¤×•×ª נגד HTTPS, ולקבוע ×”×× ×™×© לנו תצפיות מרשתות במקומות כמו ×יר×ן וסוריה ×©×‘×”× ×”×ª×§×¤×•×ª נפוצות ב×ופן השוו×תי.">
+
+<!ENTITY ssl-observatory.prefs.done "הושל×">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS בכל ×ž×§×•× ×™×›×•×œ להשתמש במצפה SSL של EFF. ×–×” ×ž×§×™×™× ×©× ×™ דברי×:
+(1) שולח ×¢×•×ª×§×™× ×©×œ ×ישורי HTTPS למצפה, כדי לעזור לנו לגלות התקפות '×יש ב×מצע' ולשפר ×ת ×בטחת הרשת; ו (2) מ×פשר לנו להזהיר ×ותך מפני ×—×™×‘×•×¨×™× ×œ× ×ž××•×‘×˜×—×™× ×ו התקפות על הדפדפן שלך.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"לדוגמ×, ×›×שר ×תה מבקר ב https://www.something.com, ×”×ישור שהתקבל על ידי המצפה יציין שמישהו ביקר ב www.something.com, ×בל ×œ× ×ž×™ ביקר ב×תר, ×ו על ××™×–×” עמוד ספציפי ×”× ×”×¡×ª×›×œ×•. תעבור ×¢× ×”×¢×›×‘×¨ על ×”×פשרויות בשביל ×¤×¨×˜×™× × ×•×¡×¤×™×:">
+
+<!ENTITY ssl-observatory.prefs.hide "הסתר ×פשרויות מתקדמות">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"בדוק ××™×©×•×¨×™× ×פילו ×× Tor ×œ× ×–×ž×™×Ÿ">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"עדיין ננסה לשמור ×ת ×”× ×ª×•× ×™× ×נונימיי×, ×בל ×פשרות ×–×ת פחות מ×ובטחת">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"שלח ובדוק ××™×©×•×¨×™× ×¢×‘×•×¨ שמות DNS ×œ× ×¦×™×‘×•×¨×™×™×">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"××œ× ×× ×›×Ÿ ×”×פשרות ×”×–×ת נבדקה, המצפה ×œ× ×™×ª×¢×“ ××™×©×•×¨×™× ×¢×‘×•×¨ שמות ×©×”×•× ×œ× ×™×›×•×œ לגלות דרך מערכת ×” DNS ">
+
+<!ENTITY ssl-observatory.prefs.show "הר××” ×פשרויות מתקדמות">
+
+<!ENTITY ssl-observatory.prefs.title "עדיפויות מצפה SSL">
+
+<!ENTITY ssl-observatory.prefs.use "×”×× ×œ×”×©×ª×ž×© במצפה?">
+<!ENTITY ssl-observatory.warning.title "×זהרה ממצפה SSL של EFF">
+<!ENTITY ssl-observatory.warning.showcert "הר××” ×ת שרשרת ×”×ישורי×">
+<!ENTITY ssl-observatory.warning.okay "×× ×™ מבין">
+<!ENTITY ssl-observatory.warning.text "מצפה SSL של EFF עוסק ב×זהרה מפני ×”×ישור(×™×) של HTTPS עבור ×”×תר ×”×–×”:">
+<!ENTITY ssl-observatory.warning.defense "×× × ×¨×©×ž×ª ל×תר ×”×–×”, כד××™ לשנות ×ת ×”×¡×™×¡×ž× ×©×œ×š ברגע שיש לך חיבור בטוח.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"שלח ובדוק ×ת ×”××™×©×•×¨×™× ×”×—×ª×•×ž×™× ×¢×œ ידך">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"×–×” מומלץ; בעיות הצפנה נפוצות במיוחד ×‘×›×œ×™× ×ž×©×•×‘×¦×™× ×—×ª×•×ž×™× ×¢×¦×ž×™×ª">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hr/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hr/https-everywhere.dtd
new file mode 100644
index 0000000..87a30bc
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hr/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "About HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Encrypt the Web! Automatically use HTTPS security on many sites.">
+<!ENTITY https-everywhere.about.version "Version">
+<!ENTITY https-everywhere.about.created_by "Created by">
+<!ENTITY https-everywhere.about.librarians "Ruleset Librarians">
+<!ENTITY https-everywhere.about.thanks "Thanks to">
+<!ENTITY https-everywhere.about.contribute "If you like HTTPS Everywhere, you might consider">
+<!ENTITY https-everywhere.about.donate_tor "Donating to Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "Donating to EFF">
+
+<!ENTITY https-everywhere.menu.about "About HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL Observatory Preferences">
+<!ENTITY https-everywhere.menu.globalEnable "Enable HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Disable HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere Preferences">
+<!ENTITY https-everywhere.prefs.enable_all "Enable All">
+<!ENTITY https-everywhere.prefs.disable_all "Disable All">
+<!ENTITY https-everywhere.prefs.reset_defaults "Reset to Defaults">
+<!ENTITY https-everywhere.prefs.search "Search">
+<!ENTITY https-everywhere.prefs.site "Site">
+<!ENTITY https-everywhere.prefs.notes "Notes">
+<!ENTITY https-everywhere.prefs.list_caption "Which HTTPS redirection rules should apply?">
+<!ENTITY https-everywhere.prefs.enabled "Enabled">
+<!ENTITY https-everywhere.prefs.ruleset_howto "You can learn how to write your own rulesets (to add support for other web sites)">
+<!ENTITY https-everywhere.prefs.here_link "here">
+<!ENTITY https-everywhere.prefs.toggle "Toggle">
+<!ENTITY https-everywhere.prefs.reset_default "Reset to Default">
+<!ENTITY https-everywhere.prefs.view_xml_source "View XML Source">
+
+<!ENTITY https-everywhere.source.downloading "Downloading">
+<!ENTITY https-everywhere.source.filename "Filename">
+<!ENTITY https-everywhere.source.unable_to_download "Unable to download source.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hr/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hr/https-everywhere.properties
new file mode 100644
index 0000000..7f5aca3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hr/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Omogući HTTPS Svuda
+https-everywhere.menu.globalDisable = Onemogući HTTPS Svuda
+https-everywhere.menu.enableDisable = Omogući / Onemogući Pravila
+https-everywhere.menu.noRules = (Nema Pravila za Ovu Stranicu)
+https-everywhere.menu.unknownRules = (Pravila za Ovu Stranicu Nepoznata)
+https-everywhere.toolbar.hint = HTTPS Svuda je aktivan. Možete ga prebacivati od stranice do stranice tako da kliknete na ikonu na adresnoj traci.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hr/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hr/ssl-observatory.dtd
new file mode 100644
index 0000000..430846f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hr/ssl-observatory.dtd
@@ -0,0 +1,98 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Pojedinosti i informacije privatnosti">
+<!ENTITY ssl-observatory.popup.later "Pitaj me kasnije">
+<!ENTITY ssl-observatory.popup.no "Ne">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere može otkriti napade
+na vaš preglednik šaljući certifikate koje primite
+Opservatoriju. Želite li ukljuÄiti ovo?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Treba li HTTPS Everywhere koristiti SSL Opservatorij?">
+
+<!ENTITY ssl-observatory.popup.yes "Da">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Sigurnije je da omogućite ovo, osim ako koristite jako ometajuću korporativnu mrežu:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Sigurno, osim ako koristite korporativnu mrežu sa tajnim internet nazivima poslužitelja:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Prijavi i provjeri certifikate potpisanim od ne-standardnih korijenskih certifikata">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Sigurno je (i dobra je ideja) da omogućite ovu mogućnost, osim ako koristite ometajuću korporativnu mrežu ili Kaspersky antivirusni softver koji nadgleda vaÅ¡e surfanje sa TLS proxyjem i privatnim korijenskim certifikatima ovlasti. Ako je omogućeno na takvoj mreži, ova mogućnost bi mogla objaviti dokaz koja https:// domena je bila posjećena kroz taj proxy, zbog jedinstvenog certifikata kojeg bi proizvela. Stoga je zadano, ostavljena iskljuÄena.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Provjeri certifikate koristeći Tor za anonimnost">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Provjeri certifikate koristeći Tor za anonimnost (zahtijeva Tortipku)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Ova mogućnost zahtijeva instalirani Tor i Tortipku">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Kada vidite novi certifikat, recite Opservatoriju na koji ste ISP spojeni">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Ovo će dohvatiti i poslati &quot;Autonomni broj sustava&quot; vaÅ¡e mreže. To će nam pomoći u lociranju napada na HTTPS i u otkrivanju kada nas promatraju iz mreža sa mjesta poput Irana i Sirije odkuda stižu uÄestali napadi.">
+
+<!ENTITY ssl-observatory.prefs.done "UÄinjeno">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere može koristiti EFF-ov SSL Opservatorij. Ovo Äini dvije stvari: (1)
+Å¡alje kopije HTTPS certifikata Opservatoriju, da nam pomogne otkriti 'glavnog u sredini' napadaÄa i poboljÅ¡a Web sigurnost; i (2)
+da vas upozorimo o nesigurnim vezama ili napadima na vaš preglednik.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Npr., kada posjetite https://www.something.com, certifikat
+primljen od Opservatorija će naznaÄiti da je netko posjetio
+www.something.com, ali ne tko je posjetio stranicu, ili koju su određenu
+stranicu tražili. Prelazak mišem za daljnje pojedinosti:">
+
+<!ENTITY ssl-observatory.prefs.hide "Sakrij napredne mogućnpsti">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Provjeri certifikate iako Tor nije dostupan">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Mi ćemo još uvijek pokušati držati podatke anonimnim, ali ova mogućnost je manje sigurna">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Prijavite i provjerite certifikate za ne-javne DNS nazive">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Ako ova mogućnost nije odabrana, Opservatorij neće snimati certifikate za nazive koji se ne mogu razriješiti kroz DNS sustav.">
+
+<!ENTITY ssl-observatory.prefs.show "Prikaži napredne mogućnosti ">
+
+<!ENTITY ssl-observatory.prefs.title "Osobitosti SSL Opservatorija">
+
+<!ENTITY ssl-observatory.prefs.use "Koristi Opservatorij?">
+<!ENTITY ssl-observatory.warning.title "UPOZORENJE iz EFF-ovog SSL Opservatorija">
+<!ENTITY ssl-observatory.warning.showcert "Prikaži podatak certifikata">
+<!ENTITY ssl-observatory.warning.okay "Razumijem">
+<!ENTITY ssl-observatory.warning.text "EFF-ov SSL Opservatorij je izdao upozorenje o HTTPS certifikatu(ima) za ovu stranicu:">
+<!ENTITY ssl-observatory.warning.defense "Ako ste povezani sa ovom stranicom, preporuÄljivo je da promijenite svoju lozinku kada uspostavite sigurnu povezanost.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Prijavite i provijerite samopotpisane certifikate">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"To je preporuÄljivo; kriptografski problemi su naroÄito Äesti u samopotpisanim ugraÄ‘enim ureÄ‘ajima">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hu/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hu/https-everywhere.dtd
new file mode 100644
index 0000000..b9fa569
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hu/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "A HTTPS Everywhere névjegye">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Titkosítsa a Web-et! Automatikusan használja a HTTPS titkosítást a legtöbb oldalon.">
+<!ENTITY https-everywhere.about.version "Verzió">
+<!ENTITY https-everywhere.about.created_by "Készítette:">
+<!ENTITY https-everywhere.about.librarians "Szabálykészlet könyvtárosok">
+<!ENTITY https-everywhere.about.thanks "Köszönet:">
+<!ENTITY https-everywhere.about.contribute "Ha tetszik a HTTPS Everywhere, talán megfontolja a következőket:">
+<!ENTITY https-everywhere.about.donate_tor "A Tor támogatása">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "Az EFF támogatása">
+
+<!ENTITY https-everywhere.menu.about "A HTTPS Everywhere névjegye">
+<!ENTITY https-everywhere.menu.observatory "SSL Observatory Beállítások">
+<!ENTITY https-everywhere.menu.globalEnable "HTTPS Everywhere bekapcsolása">
+<!ENTITY https-everywhere.menu.globalDisable "HTTPS Everywhere kikapcsolása">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere Preferences">
+<!ENTITY https-everywhere.prefs.enable_all "Mind bekapcsolása">
+<!ENTITY https-everywhere.prefs.disable_all "Mind kikapcsolása">
+<!ENTITY https-everywhere.prefs.reset_defaults "Visszaállítás alaphelyzetre">
+<!ENTITY https-everywhere.prefs.search "Keresés">
+<!ENTITY https-everywhere.prefs.site "Oldal">
+<!ENTITY https-everywhere.prefs.notes "Megjegyzések">
+<!ENTITY https-everywhere.prefs.list_caption "Mely HTTPS átirányításokat szeretné használni?">
+<!ENTITY https-everywhere.prefs.enabled "Bekapcsolva">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Megtanulhatja, hogy adhatja hozzá a saját szabálykészletét (hogy további oldalakat támogasson) ">
+<!ENTITY https-everywhere.prefs.here_link "itt">
+<!ENTITY https-everywhere.prefs.toggle "Vált">
+<!ENTITY https-everywhere.prefs.reset_default "Visszaállítás alaphelyzetre">
+<!ENTITY https-everywhere.prefs.view_xml_source "Az XML forrás megtekintése">
+
+<!ENTITY https-everywhere.source.downloading "Letöltés">
+<!ENTITY https-everywhere.source.filename "Fájlnév">
+<!ENTITY https-everywhere.source.unable_to_download "A forrás letöltése sikertelen.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hu/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hu/https-everywhere.properties
new file mode 100644
index 0000000..1c95984
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hu/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = HTTPS Everywhere bekapcsolása
+https-everywhere.menu.globalDisable = HTTPS Everywhere kikapcsolása
+https-everywhere.menu.enableDisable = Szabályok Engedélyezése / Tiltása
+https-everywhere.menu.noRules = (nincs szabály ehhez az oldalhoz)
+https-everywhere.menu.unknownRules = (az oldalhoz tartozó szabályok ismeretlenek)
+https-everywhere.toolbar.hint = HTTPS Everywhere is now active. You can toggle it on a site-by-site basis by clicking the icon in the address bar.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hu/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hu/ssl-observatory.dtd
new file mode 100644
index 0000000..d8291e4
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/hu/ssl-observatory.dtd
@@ -0,0 +1,96 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Részletek és adatvédelmi információk">
+<!ENTITY ssl-observatory.popup.later "Kérdezzen meg később">
+<!ENTITY ssl-observatory.popup.no "Nem">
+
+<!ENTITY ssl-observatory.popup.text "A HTTPS Everywhere a böngésző elleni támadásokat képes észlelni, azzal ,hogy elküldi a megkapott tanúsítványokat az Observatory részére. Bekapcsoljuk ezt a funkciót?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Használja a HTTPS Everywhere az SSL Observatory-t?">
+
+<!ENTITY ssl-observatory.popup.yes "Igen">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Biztonságos, ha bekapcsolja, kivéve, ha nagyon privát szférába hatoló vállalati hálózatot használ:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Biztonságos, ha nem használ titkos internet szerver nevekkel rendelkező vállalati hálózatot:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Küldje be és ellenőrizze azon tanúsítványokat, amelyek nem standard tanúsítványkiadótól származnak">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Biztonságos (és javasolt) ha bekapcsolja ezt az opciót, kivéve ha nagyon figyelt vállalati hálózatról vagy Kaspersky víruskereső szoftvert használ, ami figyeli a böngészést egy TLS proxy-val, és egy helyi tanúsítványkiadóval.
+Ha bekapcsolja, az az opció nyomokat hagyhat arról, hogy mely https:// oldalakor látogatott meg azon a proxy-n keresztül, mert egyedi tanúsítványokat hoz létre.
+Tehát hagyja kikapcsolva alapértelmezetten.
+">
+
+<!ENTITY ssl-observatory.prefs.anonymous "A tanúsítványok ellenőrzése Tor-on keresztül az anonimitás megőrzéséhez.">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"A tanúsítványok ellenőrzése Tor-on keresztül az anonimitás megőrzéséhez. (Torbutton szükséges hozzá)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Ez az opció a Tor és Torbutton szoftverek telepítését igényli.">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Ha új tanúsítványt lát, küldje el az Observatory-nak, hogy mely internet szolgáltatóhoz csatlakozik éppen">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Ez kiolvassa és elküldi az ASN számát a hálózatának. Ez segít a HTTPS elleni támadások észlelésében, és lehetővé teszi az észlelést annak, hogy a támadás olyan hálózatokon zajlik-e mint Irán vagy Szíria, ahol a támadások meglehetősen gyakoriak.">
+
+<!ENTITY ssl-observatory.prefs.done "Kész">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"A HTTPS Everywhere használni tudja az EFF's SSL Obszervatóriumát (Observatory). Ez két dolgot jelent: (1)
+elküldi a másolatát a HTTPS kapcoslatok tanúsítványainak az Obszervatóriumba, hogy segítse a MITM támadások észlelését, és növelje a Web biztonságát; és (2)
+lehetővé teszi, hogy figyelmeztessük, ha nem biztonságos a kapcoslata, vagy valaki támadja a böngészőjét.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Például, ha meglátogatja a https://www.valami.hu oldalt, a tanúsítvány amit az Obszervatórium megkap, azt jelzi majd, hogy valaki meglátogatta a www.valami.hu oldalt, de nem mutatja, hogy ki, és hogy melyik oldalt nézte. Húzza az egeret az opciók felé a részletekért:">
+
+<!ENTITY ssl-observatory.prefs.hide "Speciális beállítások elrejtése">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"A tanúsítványok ellenőrzése akkor is, ha a Tor nem elérhető">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Továbbra is megpróbáljuk az adatot névtelenül kezelni, de ez a beállítás kevésbé biztonságos">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Nem publikus DNS nevekhez tartozó tanúsítványok elküldése és ellenőrzése">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Ha ez az opció nicns bejelölve, akkor az Observatory nem rögzíti azon tanúsítványokat, amelyek nem feloldhatók publikus DNS rendszereken keresztül.">
+
+<!ENTITY ssl-observatory.prefs.show "Speciális beállítások megjelenítése">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Observatory Beállítások">
+
+<!ENTITY ssl-observatory.prefs.use "Az Observatory használata?">
+<!ENTITY ssl-observatory.warning.title "FIGYELMEZTETÉS az EFF SSL Observatory-tól">
+<!ENTITY ssl-observatory.warning.showcert "A tanúsítványlánc megjelenítése">
+<!ENTITY ssl-observatory.warning.okay "Megértettem">
+<!ENTITY ssl-observatory.warning.text "Az EFF SSL Oeservatory figyelmeztetést bocsátott az alábbi tanúsítványokról, ehhez az oldalhoz:">
+<!ENTITY ssl-observatory.warning.defense "Ha belépett erre az oldalra, ha már biztonságos kapcsolattal rendelkezik, hogy lecserélje a jelszavát.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"A használt önaláírt tanúsítványok feltöltése és ellenőrzése">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Ez ajánlott; a kriptográfiai problémák széles körben elterjedtek az önaláírt tanúsítvánnyal ellátott céleszközöknél.">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/it/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/it/https-everywhere.dtd
new file mode 100644
index 0000000..782711f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/it/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Informazioni su HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Cripta il Web! Usa HTTPS automaticamente su numerosi siti.">
+<!ENTITY https-everywhere.about.version "Versione">
+<!ENTITY https-everywhere.about.created_by "Creato da">
+<!ENTITY https-everywhere.about.librarians "Autori regole">
+<!ENTITY https-everywhere.about.thanks "Grazie a">
+<!ENTITY https-everywhere.about.contribute "Se ti piace HTTPS Everywhere, considera anche">
+<!ENTITY https-everywhere.about.donate_tor "Donazioni a Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "it">
+<!ENTITY https-everywhere.about.donate_eff "Donazioni a EFF">
+
+<!ENTITY https-everywhere.menu.about "Informazioni su HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "Preferenze Osservatorio SSL">
+<!ENTITY https-everywhere.menu.globalEnable "Abilita HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Disabilita HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Preferenze di HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "Abilita Tutto">
+<!ENTITY https-everywhere.prefs.disable_all "Disabilita Tutto">
+<!ENTITY https-everywhere.prefs.reset_defaults "Ripristina Predefiniti">
+<!ENTITY https-everywhere.prefs.search "Cerca">
+<!ENTITY https-everywhere.prefs.site "Sito">
+<!ENTITY https-everywhere.prefs.notes "Note">
+<!ENTITY https-everywhere.prefs.list_caption "Quali regole di reindirizzamento HTTPS dovrebbero essere applicate?">
+<!ENTITY https-everywhere.prefs.enabled "Abilitato">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Puoi imparare a scrivere i tuoi set di regole (per aggiungere supporto ad altri siti)">
+<!ENTITY https-everywhere.prefs.here_link "qui">
+<!ENTITY https-everywhere.prefs.toggle "Commuta">
+<!ENTITY https-everywhere.prefs.reset_default "Ripristina Predefiniti">
+<!ENTITY https-everywhere.prefs.view_xml_source "Mostra Sorgente XML">
+
+<!ENTITY https-everywhere.source.downloading "Scaricamento">
+<!ENTITY https-everywhere.source.filename "Nome file">
+<!ENTITY https-everywhere.source.unable_to_download "Impossibile scaricare la sorgente.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/it/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/it/https-everywhere.properties
new file mode 100644
index 0000000..a6150b2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/it/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Abilita HTTPS Everywhere
+https-everywhere.menu.globalDisable = Disabilita HTTPS Everywhere
+https-everywhere.menu.enableDisable = Abilita / Disabilita Regole
+https-everywhere.menu.noRules = (Nessuna Regola per Questa Pagina)
+https-everywhere.menu.unknownRules = (Regole per Questa Pagina Sconosciute)
+https-everywhere.toolbar.hint = HTTPS Everywhere is now active. You can toggle it on a site-by-site basis by clicking the icon in the address bar.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/it/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/it/ssl-observatory.dtd
new file mode 100644
index 0000000..40cbb9f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/it/ssl-observatory.dtd
@@ -0,0 +1,98 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Dettagli e informazioni sulla privacy">
+<!ENTITY ssl-observatory.popup.later "Chiedimelo più tardi">
+<!ENTITY ssl-observatory.popup.no "No">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere può rilevare attacchi
+contro il tuo browser inviando i certificati che ricevi all'
+Osservatorio. Vuoi abilitarla?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Vuoi che HTTPS Everywhere usi l' Osservatorio SSL?">
+
+<!ENTITY ssl-observatory.popup.yes "Sì">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"È consigliato abilitarla, a meno che non utilizzi una rete aziendale molto intrusiva:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Consigliato, a meno che non utilizzi una rete aziendale con nomi server intranet segreti:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Invia e controlla certificati firmati da CA root non standard">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"È una buona idea abilitare questa opzione, a meno che non utilizzi una rete aziendale intrusiva o l'antivirus Kaspersky che monitora la tua navigazione con un proxy TLS e una Certificate Authority root privata. Se viene abilitata in quel caso, questa opzione può pubblicare prove evidenti su quali domini https:// sono stati visitati attraverso quel proxy, a causa di certificati unici che produrrebbe. Per questo la lasciamo disabilitata in partenza.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Controlla i certificati usando Tor per l'anonimato">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Controlla i certificati usando Tor per l'anonimato (richiede Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Questa opzione richiede Tor e Torbutton installati">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Quando trovi un certificato nuovo, comunica all' Osservatorio a quale ISP sei connesso">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Recupera e invia il &quot;numero di Sistema Autonomo&quot; della tua rete. Questo ci aiuterà a localizzare gli attacchi contro HTTPS e a determinare se abbiamo osservazioni provenienti da reti in luoghi come Iran e Siria dove gli attacchi sono relativamente comuni.">
+
+<!ENTITY ssl-observatory.prefs.done "Fatto">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere può usare l' Osservatorio SSL di EFF. Questo fa due cose: (1)
+invia copie dei certificati HTTPS all' Osservatorio per aiutarci ad individuare attacchi 'man in the middle' e migliorare la sicurezza del Web; e (2)
+ci consente di metterti in guardia da connessioni insicure o attacchi al tuo browser.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Ad esempio, quando visiti https://www.qualcosa.com, il certificato
+ricevuto dall' Osservatorio indicherà che qualcuno ha visitato
+www.qualcosa.com, ma non chi ha visitato il sito, o quale particolare pagina
+ha visto. Passa sopra le opzioni con il mouse per maggiori dettagli:">
+
+<!ENTITY ssl-observatory.prefs.hide "Nascondi opzioni avanzate">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Controlla certificati anche se Tor non è disponibile">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Cercheremo comunque di mantenere i dati anonimi, ma questa opzione è meno sicura">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Invia e controlla certificati per nomi DNS non pubblici">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"A meno che questa opzione sia selezionata, l' Osservatorio non registrerà i certificati per nomi che non può risolvere attraverso il sistema DNS.">
+
+<!ENTITY ssl-observatory.prefs.show "Mostra opzioni avanzate">
+
+<!ENTITY ssl-observatory.prefs.title "Preferenze Osservatorio SSL">
+
+<!ENTITY ssl-observatory.prefs.use "Usare l' Osservatorio?">
+<!ENTITY ssl-observatory.warning.title "AVVISO dall' Osservatorio SSL di EFF">
+<!ENTITY ssl-observatory.warning.showcert "Mostra la catena di certificati">
+<!ENTITY ssl-observatory.warning.okay "Capisco">
+<!ENTITY ssl-observatory.warning.text "L' Osservatorio SSL di EFF ha emesso un avviso sul(i) certificato(i) HTTPS di questo sito:">
+<!ENTITY ssl-observatory.warning.defense "Se hai effettuato l'accesso a questo sito, può essere consigliabile cambiare la password appena hai una connessione sicura.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Invia e controlla certificati autofirmati">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Consigliato; problemi di crittografia sono particolarmente comuni in dispositivi embedded autofirmati">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ja/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ja/https-everywhere.dtd
new file mode 100644
index 0000000..724a2bd
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ja/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "HTTPS Everywhereã«ã¤ã„ã¦">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "ã‚¦ã‚§ãƒ–ã®æš—å·åŒ–ï¼è‡ªå‹•çš„ã«å¤šãã®ã‚µã‚¤ãƒˆã«HTTPSセキュリティを使用ã—ã¾ã™ã€‚">
+<!ENTITY https-everywhere.about.version "ãƒãƒ¼ã‚¸ãƒ§ãƒ³">
+<!ENTITY https-everywhere.about.created_by "作æˆè€…:">
+<!ENTITY https-everywhere.about.librarians "ルール設定ライブラリ">
+<!ENTITY https-everywhere.about.thanks "Thanks to">
+<!ENTITY https-everywhere.about.contribute "HTTPS EverywhereãŒå¥½ããªã‚‰ã€æ¤œè¨Žã—ã¦ãã ã•ã„">
+<!ENTITY https-everywhere.about.donate_tor "Torã«å¯„付ã™ã‚‹">
+<!ENTITY https-everywhere.about.tor_lang_code "英語">
+<!ENTITY https-everywhere.about.donate_eff "EFFã«å¯„付ã™ã‚‹">
+
+<!ENTITY https-everywhere.menu.about "HTTPS Everywhereã«ã¤ã„ã¦">
+<!ENTITY https-everywhere.menu.observatory "ssl Observatoryã®è¨­å®š">
+<!ENTITY https-everywhere.menu.globalEnable "HTTPS Everywhereを有効化">
+<!ENTITY https-everywhere.menu.globalDisable "HTTPS Everywhereを無効化">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhereã®è¨­å®š">
+<!ENTITY https-everywhere.prefs.enable_all "å…¨ã¦æœ‰åŠ¹åŒ–">
+<!ENTITY https-everywhere.prefs.disable_all "ã™ã¹ã¦ç„¡åŠ¹åŒ–">
+<!ENTITY https-everywhere.prefs.reset_defaults "デフォルトã«ãƒªã‚»ãƒƒãƒˆ">
+<!ENTITY https-everywhere.prefs.search "検索">
+<!ENTITY https-everywhere.prefs.site "サイト">
+<!ENTITY https-everywhere.prefs.notes "履歴">
+<!ENTITY https-everywhere.prefs.list_caption "ã©ã®HTTPSリダイレクトスールをé©ç”¨ã—ã¾ã™ã‹ï¼Ÿ">
+<!ENTITY https-everywhere.prefs.enabled "有効">
+<!ENTITY https-everywhere.prefs.ruleset_howto "自分ã®ãƒ«ãƒ¼ãƒ«è¨­å®šã®æ›¸ã方を学ã¹ã¾ã™ (ä»–ã®ã‚¦ã‚§ãƒ–サイトã¸ã®ã‚µãƒãƒ¼ãƒˆã‚’追加)">
+<!ENTITY https-everywhere.prefs.here_link "ã“ã“">
+<!ENTITY https-everywhere.prefs.toggle "切り替ãˆ">
+<!ENTITY https-everywhere.prefs.reset_default "デフォルトã«ãƒªã‚»ãƒƒãƒˆ">
+<!ENTITY https-everywhere.prefs.view_xml_source "XMLソースを表示">
+
+<!ENTITY https-everywhere.source.downloading "ダウンロード中">
+<!ENTITY https-everywhere.source.filename "ファイルå">
+<!ENTITY https-everywhere.source.unable_to_download "ソースをダウンロード出æ¥ã¾ã›ã‚“。">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ja/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ja/https-everywhere.properties
new file mode 100644
index 0000000..2135ddd
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ja/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = HTTPS Everywhereを有効化
+https-everywhere.menu.globalDisable = HTTPS Everywhereを無効化
+https-everywhere.menu.enableDisable = ルールを有効化/無効化
+https-everywhere.menu.noRules = (ã“ã®ãƒšãƒ¼ã‚¸ã«ãƒ«ãƒ¼ãƒ«ã¯ã‚りã¾ã›ã‚“)
+https-everywhere.menu.unknownRules = (ã“ã®ãƒšãƒ¼ã‚¸ã®ãƒ«ãƒ¼ãƒ«ã¯ä¸æ˜Ž)
+https-everywhere.toolbar.hint = HTTPS Everywhereã¯ã’ã‚“ã–ã„æœ‰åйã§ã™ã€‚アドレスãƒãƒ¼ã®ã‚¢ã‚¤ã‚³ãƒ³ã‚’クリックã™ã‚‹ã¨ã‚µã‚¤ãƒˆã”ã¨ã‚’基本ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ja/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ja/ssl-observatory.dtd
new file mode 100644
index 0000000..d9be24f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ja/ssl-observatory.dtd
@@ -0,0 +1,94 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "詳細ã¨ãƒ—ライãƒã‚·ãƒ¼æƒ…å ±">
+<!ENTITY ssl-observatory.popup.later "後ã§é€šçŸ¥ã™ã‚‹">
+<!ENTITY ssl-observatory.popup.no "ã„ã„ãˆ">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhereã¯Observatoryã«å—ã‘å–る証明書をé€ä¿¡ã™ã‚‹ã“ã¨ã§ã€ã‚ãªãŸã®ãƒ–ラウザã«å¯¾ã™ã‚‹æ”»æ’ƒã‚’検知ã§ãã¾ã™ã€‚ã“れを有効ã«ã—ã¾ã™ã‹ï¼Ÿ">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"HTTPS Everywhereã¯SSL Observatoryを使用ã™ã‚‹ã¹ãã§ã™ã‹ï¼Ÿ">
+
+<!ENTITY ssl-observatory.popup.yes "ã¯ã„">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"éžå¸¸ã«é‘‘賞ã•ã‚Œã‚‹ä¼æ¥­ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’使用ã—ã¦ã„ãªã‘れã°ã€ã“れを有効ã«ã™ã‚‹æ–¹ãŒå®‰å…¨ã§ã™:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"次ã®ç§˜å¯†ã‚¤ãƒ³ãƒˆãƒ©ãƒãƒƒãƒˆã®ã‚µãƒ¼ãƒãƒ¼åã§ä¼æ¥­ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’使用ã—ãªã‘れã°ã€å®‰å…¨ã§ã™:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"éžæ¨™æº–ã®ãƒ«ãƒ¼ãƒˆCAã«ã‚ˆã£ã¦ç½²åã•れãŸè¨¼æ˜Žæ›¸ã‚’確èªã—ã¦æƒ…å ±æä¾›ã™ã‚‹ã€‚">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"干渉ã•ã‚Œã‚‹ä¼æ¥­ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚„ã€TLSプロキシã¨ãƒ—ライベートルートèªè¨¼å±€ã§ã‚ãªãŸã®ãƒ–ラウジングをモニターã—ã¦ã„ã‚‹Kasperskyアンãƒã‚¦ã‚¤ãƒ«ã‚¹ã‚½ãƒ•トウェアを使用ã—ã¦ã„ãªã‘れã°ã€ã“ã®ã‚ªãƒ—ションを有効ã«ã™ã‚‹ã“ã¨ã¯å®‰å…¨ã§ã™ (ãã—ã¦ã€è‰¯ã„アイディアã§ã™)。ãã®ã‚ˆã†ãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã§æœ‰åйã«ã—ãŸå ´åˆã€ã“ã®ã‚ªãƒ—ションã¯ã€ãれãŒç™ºè¡Œã™ã‚‹ä¸€æ„ãªè¨¼æ˜Žæ›¸ã®ãŸã‚ã«ã€ã©ã‚“ãªhttps:// domainsãŒãã®ãƒ—ロキシを通ã˜ã¦è¨ªã‚Œã‚‰ã‚ŒãŸã‹ã®è¨¼æ‹ ã‚’æä¾›ã—ã¦ã—ã¾ã†æã‚ŒãŒã‚りã¾ã™ã€‚ãã®ãŸã‚ã«ã€ç§ãŸã¡ã¯ãƒ‡ãƒ•ォルトã§ã¯ãれをオフã«ã—ã¦ã„ã¾ã™ã€‚">
+
+<!ENTITY ssl-observatory.prefs.anonymous "åŒ¿åæ€§ã®ãŸã‚ã«è¨¼æ˜Žæ›¸ã®ãƒã‚§ãƒƒã‚¯ã«Torを使ã†ã€‚">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"åŒ¿åæ€§ã®ãŸã‚ã«è¨¼æ˜Žæ›¸ã®ãƒã‚§ãƒƒã‚¯ã«Torを使ㆠ(TorãŒå¿…è¦)。">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"ã“ã®ã‚ªãƒ—ションã¯TorãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã€å‹•作ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚">
+
+<!ENTITY ssl-observatory.prefs.asn
+"æ–°ã—ã„証明書を確èªã—ãŸã¨ãã€Observatoryã«ã‚ãªãŸãŒã©ã®ISPã«æŽ¥ç¶šã—ã¦ã„ã‚‹ã®ã‹ä¼ãˆã‚‹">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"ã“れã¯ã‚ãªãŸã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ã€Œè‡ªå¾‹ã‚·ã‚¹ãƒ†ãƒ ç•ªå·ã€ã‚’åŽé›†ã—ã€é€ä¿¡ã—ã¾ã™ã€‚ã“れã¯ç§ãŸã¡ãŒHTTPSã«å¯¾ã™ã‚‹æ”»æ’ƒã‚’検出ã—ã™ã‚‹ã®ã‚’支æ´ã—ã¾ã™ã€‚ã¾ãŸã€ç§ãŸã¡ãŒæ”»æ’ƒãŒæ¯”較的一般的ã§ã‚るイランやシリアã®ã‚ˆã†ãªå ´æ‰€ã§ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«è¦³æ¸¬æ‰€ã‚’æŒã£ã¦ã„ã‚‹ã®ã‹ç¢ºèªã™ã‚‹ã®ã«å½¹ç«‹ã¡ã¾ã™ã€‚">
+
+<!ENTITY ssl-observatory.prefs.done "完了">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhereã¯EFFã®SSL Observatoryを使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れã¯ï¼’ã¤ã®åƒãã‚’ã—ã¾ã™: (1)
+ç§ãŸã¡ãŒä¸­é–“者攻撃を検出ã—ã€ã‚¦ã‚§ãƒ–セキュリティをå‘上ã•ã›ã‚‹ã®ã‚’支æ´ã™ã‚‹ãŸã‚ã«ã€HTTP証明書ã®ã‚³ãƒ”ーを観測所ã«é€ä¿¡ã—ã¾ã™ã€‚
+ãã—ã¦ã€(2)
+ç§ãŸã¡ãŒå®‰å…¨ã§ãªã„接続やブラウザã¸ã®æ”»æ’ƒã‚’警告ã§ãるよã†ã«ã—ã¾ã™ã€‚">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"例ãˆã°ã€https://www.something.com を訪れるã¨ãã€è¦³æ¸¬æ‰€ãŒå—ä¿¡ã—ãŸè¨¼æ˜Žæ›¸ã¯èª°ã‹ãŒwww.something.comを訪れãŸã“ã¨ã‚’示ã—ã¾ã™ãŒã€èª°ãŒã“ã®ã‚µã‚¤ãƒˆã‚’訪れãŸã®ã‹ã€ã©ã®ç‰¹å®šã®ãƒšãƒ¼ã‚¸ã‚’見ã¦ã„ãŸã®ã‹ã¯ç¤ºã•れã¾ã›ã‚“。詳細ã¯ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã—ã¦ãã ã•ã„:">
+
+<!ENTITY ssl-observatory.prefs.hide "高度ãªè¨­å®šã‚’éš ã™">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"TorãŒåˆ©ç”¨ã§ããªã„å ´åˆã§ã‚‚証明書をãƒã‚§ãƒƒã‚¯ã™ã‚‹">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"ç§ãŸã¡ã¯ä»Šã¾ã§é€šã‚Šãƒ‡ãƒ¼ã‚¿ã‚’匿åã«ä¿ã¨ã†ã¨ã™ã‚‹ã§ã—ょã†ãŒã€ã“ã®ã‚ªãƒ—ションã¯å®‰å…¨æ€§ã‚’低下ã•ã›ã¾ã™">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"éžå…¬é–‹DNSåã®è¨¼æ˜Žæ›¸ã‚’確èªã—ã¦æä¾›ã™ã‚‹">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"ã“ã®ã‚ªãƒ—ションãŒãƒã‚§ãƒƒã‚¯ã•れã¦ã„ãªã„å ´åˆã€Observatoryã¯DNSシステムを通ã—ã¦è§£æ±ºã§ããªã„åå‰ã¸ã®è¨¼æ˜Žæ›¸ã‚’記録ã—ã¾ã›ã‚“。">
+
+<!ENTITY ssl-observatory.prefs.show "高度ãªè¨­å®šã‚’表示ã™ã‚‹">
+
+<!ENTITY ssl-observatory.prefs.title "ssl Observatoryã®è¨­å®š">
+
+<!ENTITY ssl-observatory.prefs.use "Observatoryを使用ã—ã¾ã™ã‹?">
+<!ENTITY ssl-observatory.warning.title "EFFã®SSL Observatoryã‹ã‚‰è­¦å‘Š">
+<!ENTITY ssl-observatory.warning.showcert "証明書ã®ãƒã‚§ãƒ¼ãƒ³ã‚’表示">
+<!ENTITY ssl-observatory.warning.okay "了解ã—ã¾ã™">
+<!ENTITY ssl-observatory.warning.text "EFFã®SSL Observatoryã¯ã“ã®ã‚µã‚¤ãƒˆã¸ã®HTTPS証明書ã«ã¤ã„ã¦ã®è­¦å‘Šã‚’出ã—ã¾ã—ãŸã€‚()">
+<!ENTITY ssl-observatory.warning.defense "ã“ã®ã‚µã‚¤ãƒˆã«ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã„ã‚‹å ´åˆã€ä¸€åº¦å®‰å…¨ãªæŽ¥ç¶šã‚’確ä¿ã—ã¦ã‹ã‚‰ãƒ‘スワードを変更ã™ã‚‹ã®ãŒè³¢æ˜Žã‹ã‚‚ã—れã¾ã›ã‚“。">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"自己署åã®è¨¼æ˜Žæ›¸ã‚’確èªã—ã¦æä¾›ã™ã‚‹">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"ã“ã‚Œã¯æŽ¨å¥¨ã•れã¾ã™ã€‚æš—å·åŒ–ã®å•題ã¯ã€è‡ªå·±ç½²åã•れãŸçµ„ã¿è¾¼ã¿ãƒ‡ãƒã‚¤ã‚¹ã§ç‰¹ã«ä¸€èˆ¬çš„ã§ã™ã€‚">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ko/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ko/https-everywhere.dtd
new file mode 100644
index 0000000..93d22f4
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ko/https-everywhere.dtd
@@ -0,0 +1,49 @@
+<!ENTITY https-everywhere.about.title "HTTPS Everywhereì— ëŒ€í•˜ì—¬
+">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "웹 암호화! ìžë™ìœ¼ë¡œ 여러 사ì´íŠ¸ì— HTTPS ë³´ì•ˆì„ ì‚¬ìš©í•©ë‹ˆë‹¤.">
+<!ENTITY https-everywhere.about.version "Version">
+<!ENTITY https-everywhere.about.created_by "작성">
+<!ENTITY https-everywhere.about.librarians "규칙설정 ë¼ì´ë¸ŒëŸ¬ë¦¬">
+<!ENTITY https-everywhere.about.thanks "Thanks to">
+<!ENTITY https-everywhere.about.contribute "모든곳ì—서 HTTPS를 사용하려면, 고려해 보십시오">
+<!ENTITY https-everywhere.about.donate_tor "Torì— ê¸°ë¶€í•˜ê¸°">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "EFFì— ê¸°ë¶€í•˜ê¸°">
+
+<!ENTITY https-everywhere.menu.about "HTTPS Everywhereì— ëŒ€í•˜ì—¬">
+<!ENTITY https-everywhere.menu.observatory "SSL 관측 환경 설정">
+<!ENTITY https-everywhere.menu.globalEnable "모든곳ì—서 HTTPS 사용">
+<!ENTITY https-everywhere.menu.globalDisable "모든곳ì—서 HTTPS 사용 안 함">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS 모든곳 사용 환경 설정">
+<!ENTITY https-everywhere.prefs.enable_all "ëª¨ë‘ ì‚¬ìš©">
+<!ENTITY https-everywhere.prefs.disable_all "ëª¨ë‘ ì‚¬ìš© 안 함">
+<!ENTITY https-everywhere.prefs.reset_defaults "기본값으로 다시 설정">
+<!ENTITY https-everywhere.prefs.search "검색">
+<!ENTITY https-everywhere.prefs.site "사ì´íЏ">
+<!ENTITY https-everywhere.prefs.notes "참고">
+<!ENTITY https-everywhere.prefs.list_caption "HTTPS 리디렉션 ê·œì¹™ì„ ì ìš©í•˜ì‹œê²ŸìŠµë‹ˆê¹Œ?">
+<!ENTITY https-everywhere.prefs.enabled "사용">
+<!ENTITY https-everywhere.prefs.ruleset_howto "ìžì‹ ì˜ 규칙 작성 ë°©ë²•ì„ ë°°ìš¸ 수 있습니다 (다른 웹 사ì´íŠ¸ì— ëŒ€í•œ ì§€ì› ì¶”ê°€)">
+<!ENTITY https-everywhere.prefs.here_link "여기">
+<!ENTITY https-everywhere.prefs.toggle "전환">
+<!ENTITY https-everywhere.prefs.reset_default "기본값으로 다시 설정">
+<!ENTITY https-everywhere.prefs.view_xml_source "XML 소스 보기">
+
+<!ENTITY https-everywhere.source.downloading "다운로드">
+<!ENTITY https-everywhere.source.filename "파ì¼ëª…">
+<!ENTITY https-everywhere.source.unable_to_download "소스를 다운로드할 수 없습니다.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ko/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ko/https-everywhere.properties
new file mode 100644
index 0000000..110e0b8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ko/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = 모든 ê³³ì—서 HTTPS 사용
+https-everywhere.menu.globalDisable = 모든 ê³³ì—서 HTTPS 사용 안 함
+https-everywhere.menu.enableDisable = 규칙 활성화 / 비활성화
+https-everywhere.menu.noRules = (ì´ íŽ˜ì´ì§€ë¥¼ 위한 규칙 ì—†ìŒ)
+https-everywhere.menu.unknownRules = (알 수 없는 ì´ íŽ˜ì´ì§€ë¥¼ 위한 규칙)
+https-everywhere.toolbar.hint = HTTPS Everywhere is now active. You can toggle it on a site-by-site basis by clicking the icon in the address bar.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ko/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ko/ssl-observatory.dtd
new file mode 100644
index 0000000..83deb59
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ko/ssl-observatory.dtd
@@ -0,0 +1,92 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "세부 사항과 사ìƒí™œ ì •ë³´">
+<!ENTITY ssl-observatory.popup.later "ë‚˜ì¤‘ì— ì•Œë¦¼">
+<!ENTITY ssl-observatory.popup.no "아니ë„">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"HTTPS Everywhereì´ SSL 관측소를 사용해야 합니까?">
+
+<!ENTITY ssl-observatory.popup.yes "예">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"매우 방해하는 기업 네트워í¬ë¥¼ 사용중ì´ì§€ 않으면, ì´ê²ƒì„ 사용하는 ê²ƒì´ ì•ˆì „ì••ë‹ˆë‹¤.">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"ë‹¤ìŒ ë¹„ë°€ 서버 ì´ë¦„ê³¼ 기업 네트워í¬ë¥¼ 사용하지 않는다면, 안전합니다.">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"비표준 루트 CA로부터 서명ë˜ì§€ ì•Šì€ ì¸ì¦ì„œë¥¼ 확ì¸í•˜ê³  제보함.">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"ê°œì¸ ë£¨íŠ¸ ì¸ì¦ì„œ 권한과 ë¶€ë¼ìš°ì§•ì„ ëª¨ë‹ˆí„°í•˜ëŠ” 방해하는 기업 네트워í¬ë‚˜ TLS 프ë¡ì‹œì™€ 카스í¼ìŠ¤í‚¤ 안티바ì´ëŸ¬ìŠ¤ë¥¼ 사용하지 않는다면, ì´ ì˜µì…˜ì„ í™œì„±í™”í•˜ëŠ” ê²ƒì€ ì•ˆì „í•©ë‹ˆë‹¤(그리고 ì¢‹ì€ ìƒê°ìž…니다). ê·¸ 네트워í¬ì—서 활성화ëœë‹¤ë©´, ì´ ì˜µì…˜ì€ ì œê³µë˜ì–´ì ¸ì•¼í•˜ëŠ” 드문 ì¸ì¦ì„œ ë•Œë¬¸ì— https:// ë„ë©”ì¸ì„ ê·¸ 프ë¡ì‹œë¥¼ 통해 방문한 ì¦ê±°ë¥¼ 알릴 것입니다. 그래서 우리는 기본값으로 ë‘는 ê²ƒì„ ì¶”ì²œí•©ë‹ˆë‹¤.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "ìµëª…ì„ ìœ„í•´ Tor를 사용하는 ë™ì•ˆ ì¸ì¦ì„œ 확ì¸">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"ìµëª…ì„ ìœ„í•´ Tor를 사용하는 ë™ì•ˆ ì¸ì¦ì„œ í™•ì¸ (Torcheck 권장)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"ì´ ì˜µì…˜ì€ Tor와 Torbuttonì´ ì„¤ì¹˜ëœ ê²½ìš° 권장ë©ë‹ˆë‹¤.">
+
+<!ENTITY ssl-observatory.prefs.asn
+"새로운 ì¸ì¦ì„œë¥¼ ë³¼ 때, ì–´ë–¤ ISPì— ì—°ê²°ë˜ì–´ 있는지 ê´€ì¸¡ì†Œì— ë§í•˜ì‹­ì‹œì˜¤.">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"ì´ê²ƒì€ ê·€í•˜ì˜ ë„¤íŠ¸ì›Œí¬ì˜ &quot;ìžìœ¨ 시스템 번호&quot;를 수집하고 전송할 것입니다. ì´ê²ƒì€ 우리가 HTTPSì— ëŒ€í•­í•˜ëŠ” ê³µê²©ì„ ì°¾ëŠ” ê²ƒì— ëŒ€í•´ ë„ì›€ì„ ì¤„ 것입니다. 그리고 우리는 ê³µê²©ì´ ë¹„êµì  ì¼ë°˜ì ì¸ ì´ëž€ê³¼ 시리아와 ê°™ì€ ìž¥ì†Œì—서 네트워í¬ì—서 관측소를 가지고 ìžˆëŠ”ì§€ì— ëŒ€í•œ 여부를 확ì¸í•˜ëŠ” ë° ë„ì›€ì´ ë  ê²ƒìž…ë‹ˆë‹¤.">
+
+<!ENTITY ssl-observatory.prefs.done "완료">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhereì€ EFFì˜ SSL 관측소를 사용할 수 있습니다. ì´ê²ƒì€ ë‘ ê°€ì§€ ì¼ì„ 합니다: (1)
+ì¤‘ê°„ìž ê³µê²©ì„ ê°ì§€í•˜ê³  ì›¹ì˜ ë³´ì•ˆì„ í–¥ìƒì‹œí‚¤ëŠ” ê²ƒì„ ë•기 위해, HTTPS ì¸ì¦ì„œì˜ ë³µì‚¬ë³¸ì„ SSL 관측소로 보냅니다. 그리고 (2) 우리가 귀하ì—게 보안ì ì´ì§€ 않는 ì—°ê²°ì´ë‚˜ 브ë¼ìš°ì €ì— 대한 ê³µê²©ì— ëŒ€í•´ 경고하ë„ë¡ í•©ë‹ˆë‹¤.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"예를 들어, https://www.something.comì„ ë°©ë¬¸í•  때, 관측소ì—서 ë°›ì€ ì¸ì¦ì„œëŠ” 누가 사ì´íŠ¸ë¥¼ 방문했는지가 아닌, 누가 www.something.comì„ ë°©ë¬¸í–ˆê±°ë‚˜, ê·¸ë“¤ì´ ë³¸ 특정한 페ì´ì§€ 키를 표시할 것입니다. ë” ë§Žì€ ì„¸ë¶€ì‚¬í•­ì„ ìœ„í•´ ì˜µì…˜ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤.">
+
+<!ENTITY ssl-observatory.prefs.hide "고급 설정 숨기기">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Torê°€ 가능하지 않ë”ë¼ë„ ì¸ì¦ì„œ 확ì¸">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"우리는 ê³„ì† ë°ì´í„°ë¥¼ ìµëª…으로 보내겠지만, ì´ ì„ íƒì€ ëœ ë³´ì•ˆì ìž…니다.">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"non-public DNS ì´ë¦„ì„ ìœ„í•œ ì¸ì¦ì„œ 확ì¸ê³¼ 제출">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"ì´ ì˜µì…˜ì´ ì„ íƒë˜ì§€ 않는다면, 관측소는 DNS ì‹œìŠ¤í…œì„ í†µí•´ ë¶„ì„ë  ìˆ˜ 없는 ì¸ì¦ì„œë¥¼ 기ë¡í•˜ì§€ ì•Šì„ ê²ƒìž…ë‹ˆë‹¤.">
+
+<!ENTITY ssl-observatory.prefs.show "고급 설정 ë³´ì´ê¸°">
+
+<!ENTITY ssl-observatory.prefs.title "SSL 관측소 설정">
+
+<!ENTITY ssl-observatory.prefs.use "관측소 사용?">
+<!ENTITY ssl-observatory.warning.title "EFFì˜ SSL ê´€ì¸¡ì†Œë¡œë¶€í„°ì˜ ê²½ê³ ">
+<!ENTITY ssl-observatory.warning.showcert "ì¸ì¦ì„œ ì²´ì¸ ë³´ì´ê¸°">
+<!ENTITY ssl-observatory.warning.okay "ì´í•´í–ˆìŠµë‹ˆë‹¤.">
+<!ENTITY ssl-observatory.warning.text "EFFì˜ SSL 관측소가 ë‹¤ìŒ ì‚¬ì´íŠ¸ë¥¼ 위한 HTTPS ì¸ì¦ì„œì— 대한 경고를 보내왔습니다.">
+<!ENTITY ssl-observatory.warning.defense "만약 ì´ ì‚¬ì´íŠ¸ì— ë¡œê·¸ì¸ë˜ì–´ 있다면, 안전한 ì—°ê²°ì— ì¼ë‹¨ 연결한 ë’¤, 비밀번호를 바꾸는 ê²ƒì´ ê¶Œìž¥ë©ë‹ˆë‹¤.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"ìžì‹ -서명 ì¸ì¦ì„œ í™•ì¸ ë° ì œë³´">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"ì´ê²ƒì€ 추천ë©ë‹ˆë‹¤: 암호화 문제는 ìžê¸° ì„œëª…ëœ ìž„ë² ë””ë“œ 장치ì—서 특히 ì¼ë°˜ì ìž…니다.">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lt/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lt/https-everywhere.dtd
new file mode 100644
index 0000000..e249494
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lt/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Apie HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Šifruokite žiniatinklį! Automatiškai naudokite HTTPS apsaugą daugelyje svetainių.">
+<!ENTITY https-everywhere.about.version "Versija">
+<!ENTITY https-everywhere.about.created_by "Sukūrė">
+<!ENTITY https-everywhere.about.librarians "Taisyklių bibliotekininkai">
+<!ENTITY https-everywhere.about.thanks "DÄ—kojame">
+<!ENTITY https-everywhere.about.contribute "Jei Jums patinka HTTPS Everywhere, galbūt norėsite">
+<!ENTITY https-everywhere.about.donate_tor "Paaukoti Tor projektui">
+<!ENTITY https-everywhere.about.tor_lang_code "lt">
+<!ENTITY https-everywhere.about.donate_eff "Paaukoti EFF">
+
+<!ENTITY https-everywhere.menu.about "Apie HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL Observatorijos nustatymai">
+<!ENTITY https-everywhere.menu.globalEnable "Įgalinti HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Išjungti HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere nustatymai">
+<!ENTITY https-everywhere.prefs.enable_all "Įgalinti visas">
+<!ENTITY https-everywhere.prefs.disable_all "Uždrausti visas">
+<!ENTITY https-everywhere.prefs.reset_defaults "Atstatyti numatytas">
+<!ENTITY https-everywhere.prefs.search "Ieškoti">
+<!ENTITY https-everywhere.prefs.site "Tinklapis">
+<!ENTITY https-everywhere.prefs.notes "Pastabos">
+<!ENTITY https-everywhere.prefs.list_caption "Kurias HTTPS nukreipimo taisykles naudoti?">
+<!ENTITY https-everywhere.prefs.enabled "Įgalinta">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Galite sužinoti, kaip patiems rašyti nukreipimo taisykles (kad pridėtumėte kitų svetainių palaikymą)">
+<!ENTITY https-everywhere.prefs.here_link "Äia">
+<!ENTITY https-everywhere.prefs.toggle "Perjungti">
+<!ENTITY https-everywhere.prefs.reset_default "Atstatyti numatytÄ…">
+<!ENTITY https-everywhere.prefs.view_xml_source "Žiūrėti XML šaltinį">
+
+<!ENTITY https-everywhere.source.downloading "AtsisiunÄiama">
+<!ENTITY https-everywhere.source.filename "Failo pavadinimas">
+<!ENTITY https-everywhere.source.unable_to_download "Nepavyko atsisiųsti šaltinio">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lt/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lt/https-everywhere.properties
new file mode 100644
index 0000000..00fdde9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lt/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = \u012ejungti HTTPS Everywhere
+https-everywhere.menu.globalDisable = I\u0161jungti HTTPS Everywhere
+https-everywhere.menu.enableDisable = Ijungti/i\u0161jungti taisykles
+https-everywhere.menu.noRules = (\u0160iam puslapiui taisykli\u0173 n\u0117ra)
+https-everywhere.menu.unknownRules = (\u0160io puslapio taisykl\u0117s ne\u017einomos)
+https-everywhere.toolbar.hint = HTTPS Everywhere aktyvuotas. Galite \u012fjungti/i\u0161jungti j\u012f konkre\u010dioje svetain\u0117je spausdami \u017eenkliuk\u0105 adresyno juostoje.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lt/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lt/ssl-observatory.dtd
new file mode 100644
index 0000000..f17e52c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lt/ssl-observatory.dtd
@@ -0,0 +1,100 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "DetalÄ—s ir informacija apie privatumÄ…">
+<!ENTITY ssl-observatory.popup.later "Klausti vÄ—liau">
+<!ENTITY ssl-observatory.popup.no "Ne">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere gali aptikti atakas
+nukreiptas prieš jūsų naršyklę, siųsdama gautus sertifikatus į SSL
+Observatoriją. Ar įjungti?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Ar HTTPS Everywhere turėtų naudoti SSL Observatoriją?">
+
+<!ENTITY ssl-observatory.popup.yes "Taip">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Įjungti yra saugu, nebent naudojate labai ribojamą
+korporatyvinį tinklą:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Saugu, nebent naudojate korporatyvinį tinklą su slaptais vidinio tinklo serverių pavadinimais:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Siųsti ir tikrinti sertifikatus, pasirašytus nestandartinių sertifikavimo centrų">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Ä®jungti Å¡iÄ… parinktį yra saugu (ir gera mintis), nebent naudojate ribojamÄ… korporatyvinį tinklÄ…, kuris stebi jÅ«sų narÅ¡ymÄ… su TLS įgaliotuoju serveriu ir privaÄiu sertifikavimo centru. Jei įjungsite tokiame tinkle, Å¡i parinktis gali palikti informacijos apie tai, kurios https:// svetainÄ—s buvo aplankytos naudojant šį įgaliotÄ…jį serverį, nes bus naudojami unikalÅ«s sertifikatai. TodÄ—l pagal nutylÄ—jimÄ… tai iÅ¡jungiame.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Tikrinti sertifikatus naudojant Tor tinklą anonimiškumui">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Tikrinti sertifikatus naudojant Tor tinklą anonimiškumui (reikalauja Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Ši parinktis reikalauja, kad būtų įdiegti Tor ir Torbutton">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Sutikus naują sertifikatą pranešti Observatorijai, prie kokio interneto paslaugų tiekėjo esate prisijungę">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Gaus ir išsiųs jūsų tinklo &quot;autonominį sistemos numerį&quot;. Tai padės mums aptikti atakas nukreiptas prieš HTTPS ir nustatyti, ar mes turime duomenų apie tinklus iš tokių vietų kaip Iranas ar Sirija, kur atakos yra gana dažnos.">
+
+<!ENTITY ssl-observatory.prefs.done "Atlikta">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere gali naudoti EFF SSL ObservatorijÄ…. Ji atlieka du dalykus: (1)
+siunÄia HTTPS sertifikatų kopijas į ObservatorijÄ…, kad padÄ—tų mums
+aptikti 'žmogaus viduryje' atakas ir pagerinti žiniatinkio saugumą; ir (2)
+leidžia mums įspėti jus apie nesaugius prisijungimus ar atakas nukreiptas prieš jūsų naršyklę.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Pavyzdžiui, kai aplankote https://www.kazkas.com, Observatorijos
+gautas sertifikatas rodys, kad kažkas aplankė www.kazkas.com,
+bet ne tai, kas aplankÄ— svetainÄ™, ar kokį konkreÄiai puslapį jie
+žiÅ«rÄ—jo. IÅ¡samesniai informacijai, užveskite pelÄ—s žymeklį virÅ¡ parinkÄių:">
+
+<!ENTITY ssl-observatory.prefs.hide "Slėpti išsamesnius nustatymus">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Tikrinti sertifikatus net jei Tor nepasiekiamas">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Mes vis vien bandysime išlaikyti duomenis anonimiškus, bet ši parinktis yra mažiau saugi">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Siųsti ir tikrinti sertifikatus gautus iš neviešų DNS vardų">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Jei ši parinktis išjungta, Observatorija neįrašinės tų sertifikatų, kurių vardų nepavyksta gauti per DNS sistemą.">
+
+<!ENTITY ssl-observatory.prefs.show "Rodyti išsamesnius nustatymus">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Observatorijos nustatymai">
+
+<!ENTITY ssl-observatory.prefs.use "Naudoti ObservatorijÄ…?">
+<!ENTITY ssl-observatory.warning.title "ĮSPĖJIMAS iš EFF SSL Observatorijos">
+<!ENTITY ssl-observatory.warning.showcert "Rodyti sertifikatų grandinę">
+<!ENTITY ssl-observatory.warning.okay "Suprantu">
+<!ENTITY ssl-observatory.warning.text "EFF SSL Observatorija įspėja apie šių svetainių HTTPS sertifikatus:">
+<!ENTITY ssl-observatory.warning.defense "Jei esate prisiregistravę prie šios svetainės, patartina pasikeisti slaptažodį, kai turėsite saugų ryšį.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Teikti ir tikrinti savo paties pasirašytus sertifikatus">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Rekomenduojama. Kriptografijos problemos ypaÄ dažnos savo paties pasiraÅ¡ytuose įmontuotuosiuose įtaisuose">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lv/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lv/https-everywhere.dtd
new file mode 100644
index 0000000..c7659af
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lv/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Par HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Å ifrÄ“t tÄ«mekli! AutomÄtiski lietot HTTPS drošību daudzÄs vietnÄ“s.">
+<!ENTITY https-everywhere.about.version "Versija">
+<!ENTITY https-everywhere.about.created_by "Autori">
+<!ENTITY https-everywhere.about.librarians "Ruleset Librarians">
+<!ENTITY https-everywhere.about.thanks "Pateicoties">
+<!ENTITY https-everywhere.about.contribute "ja Jums patīk HTTPS Everywhere, iespējams vēlaties">
+<!ENTITY https-everywhere.about.donate_tor "ziedot Tor'am">
+<!ENTITY https-everywhere.about.tor_lang_code "an">
+<!ENTITY https-everywhere.about.donate_eff "ziedot EFF'am">
+
+<!ENTITY https-everywhere.menu.about "Par HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL Observatory preferences">
+<!ENTITY https-everywhere.menu.globalEnable "Iespējot HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Atspējot HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere preferences">
+<!ENTITY https-everywhere.prefs.enable_all "Iespējot visus">
+<!ENTITY https-everywhere.prefs.disable_all "Atspējot visus">
+<!ENTITY https-everywhere.prefs.reset_defaults "AtiestatÄ«t uz noklusÄ“juma vÄ“rtÄ«bÄm">
+<!ENTITY https-everywhere.prefs.search "Meklēt">
+<!ENTITY https-everywhere.prefs.site "Vietne">
+<!ENTITY https-everywhere.prefs.notes "Piezīmes">
+<!ENTITY https-everywhere.prefs.list_caption "Kurus HTTPS pÄradresÄcijas noteikumus lietot?">
+<!ENTITY https-everywhere.prefs.enabled "Iespējots">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Variet iemÄcÄ«ties kÄ rakstÄ«t savus noteikumu komplektus (lai pievienotu citu tÄ«mekļa vietņu atbalstu)">
+<!ENTITY https-everywhere.prefs.here_link "te">
+<!ENTITY https-everywhere.prefs.toggle "PÄrslÄ“gt">
+<!ENTITY https-everywhere.prefs.reset_default "AtiestatÄ«t uz noklusÄ“juma vÄ“rtÄ«bÄm">
+<!ENTITY https-everywhere.prefs.view_xml_source "Skatīt XML avotu">
+
+<!ENTITY https-everywhere.source.downloading "LejupielÄdÄ“">
+<!ENTITY https-everywhere.source.filename "Datnes_nosaukums">
+<!ENTITY https-everywhere.source.unable_to_download "Nevar lejupielÄdÄ“t avotu.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 paziņojums">
+<!ENTITY https-everywhere.popup.paragraph1 "OpÄ! JÅ«s lietojÄt stabilu HTTPS Everywhere versiju, bet, iespÄ“jams, mÅ«su jaunÄkajÄ laidienÄ mÄ“s nejauÅ¡i jauninÄjÄm JÅ«su lÄ«dzÅ¡inÄ“jo versiju ar izstrÄdÄtÄju versiju.">
+<!ENTITY https-everywhere.popup.paragraph2 "Vai vÄ“laties atgriezties pie stabilÄs versijas?">
+<!ENTITY https-everywhere.popup.paragraph3 "MÄ“s ļoti priecÄtos, ja JÅ«s turpinÄtu lietot izstrÄdÄtÄju versiju un palÄ«dzÄ“tu padarÄ«t HTTPS Everywhere labÄku! IespÄ“jams, ka laiku pa laikam pamanÄ«sit kÄdas kļūdas, par kurÄm varat ziņot rakstot angļu valodÄ https-everywhere@eff.org . Atvainojamies par sagÄdÄtajÄm neÄ“rtÄ«bÄm un pateicamies par to, ka lietojat HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "IzvÄ“los strÄdÄt ar izstrÄdÄtÄja versiju">
+<!ENTITY https-everywhere.popup.revert "LejuplÄdÄ“t jaunÄko stabilo versiju">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lv/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lv/https-everywhere.properties
new file mode 100644
index 0000000..aeef29d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lv/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Iespējot HTTPS visur
+https-everywhere.menu.globalDisable = Izslēgt HTTPS visur
+https-everywhere.menu.enableDisable = IespÄ“jot / IzslÄ“gt kÄrtulas
+https-everywhere.menu.noRules = (Å ai lapai kÄrtulu nav)
+https-everywhere.menu.unknownRules = (šīs lapas kÄrtulas nav zinÄmas)
+https-everywhere.toolbar.hint = HTTPS Everywhere tagad ir aktÄ«vs. Klikšķinot ikonu adreses joslÄ, JÅ«s varat to pÄrslÄ“gt ikvienÄ vietnÄ“.
+https-everywhere.migration.notification0 = Lai ieviestu kritisku labojumu, Å¡is jauninÄjums atiestata JÅ«su HTTPS visur kÄrtulu preferences uz to noklusÄ“juma vÄ“rtÄ«bÄm.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lv/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lv/ssl-observatory.dtd
new file mode 100644
index 0000000..a0e33e3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/lv/ssl-observatory.dtd
@@ -0,0 +1,99 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Papildu informÄcija un privÄtums">
+<!ENTITY ssl-observatory.popup.later "JautÄt man vÄ“lÄk">
+<!ENTITY ssl-observatory.popup.no "NÄ“">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS visur var atklÄt uzbrukumus JÅ«su pÄrlÅ«kam, nosÅ«tot uz Observatory sertifikÄtus, kurus saņemat.
+Ieslēgt šo funkciju?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Vai HTTPS visur jÄizmanto SSL Observatory?">
+
+<!ENTITY ssl-observatory.popup.yes "JÄ">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Iespējot ir droši, ja vien neizmantojat
+ļoti traucÄ“joÅ¡u jeb uzmÄcÄ«gu korporatÄ«vo tÄ«klu:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"DroÅ¡i, ja vien neizmantojat korporatÄ«vo tÄ«klu ar slepeniem iekÅ¡tÄ«kla serveru vÄrdiem:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Iesniegt un pÄrbaudÄ«t sertifikÄtus, kurus parakstÄ«juÅ¡as nestandarta saknes CA jeb sertifikÄcijas iestÄdes">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Ir droÅ¡i (un arÄ« ir laba doma) iespÄ“jot Å¡o opciju, ja vien neizmantojat traucÄ“joÅ¡u jeb uzmÄcÄ«gu korporatÄ«vu tÄ«klu, kurÅ¡ jÅ«su veiktajai pÄrlÅ«koÅ¡anai seko, izmantojot TLS starpniekserveri un privÄto saknes sertifikÄcijas iestÄdi.
+Opcija, kas iespÄ“jota Å¡ÄdÄ tÄ«klÄ, varÄ“tu publicÄ“t pierÄdÄ«jumus tam, kuri https:// domÄ“ni tiek skatÄ«ti caur Å¡o starpniekserveri, tÄ izsniegto unikÄlo sertifikÄtu dēļ. TÄdēļ, pÄ“c noklusÄ“juma, mÄ“s Å¡o izvÄ“li esam izslÄ“guÅ¡i.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "AnonimitÄtes nodroÅ¡inÄÅ¡anai pÄrbaudÄ«t sertifikÄtus izmantojot Tor">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"AnonimitÄtes nodroÅ¡inÄÅ¡anai pÄrbaudÄ«t sertifikÄtus izmantojot Tor (nepiecieÅ¡ams Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Opcijas lietošanai nepieciešams instalēt Tor un Torbutton">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Kad redzat jaunu sertifikÄtu, informÄ“jiet Observatory par ISP, pie kura esat pieslÄ“dzies">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Darbība nolasīs un nosūtīs jūsu tīkla &quot;Autonomo sistēmas numuru&quot;.
+Tas palÄ«dzÄ“s mums noteikt uzbrukumus pret HTTPS, un atklÄt vai no tÄ«kliem tiek veikta pÄrraudzÄ«ba tÄdÄs valstÄ«s kÄ IrÄna un SÄ«rija, kur uzbrukumi notiek salÄ«dzinoÅ¡i bieži.">
+
+<!ENTITY ssl-observatory.prefs.done "Gatavs">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS visur var lietot EFF's SSL Observatory.
+Tas veic divas darbības: (1)
+sÅ«ta Obsevatory HTTPS sertifikÄtu kopijas, lai palÄ«dzÄ“tu mums
+noteikt &quot;starpnieka&quot; uzbrukumus, un palielinÄtu tÄ«mekļa drošību, un (2)
+ļauj mums brÄ«dinÄt jÅ«s par nedroÅ¡iem savienojumiem vai uzbrukumiem jÅ«su pÄrlÅ«kam.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"PiemÄ“ram, kad apmeklÄ“jat https://www.something.com , tad sertifikÄts, kuru saņem Observatory, rÄdÄ«s, ka kÄds ir apmeklÄ“jis www.something.com , bet nerÄdÄ«s ne to, kurÅ¡ ir apmeklÄ“jis Å¡o vietni, ne ari to kuras lapas skatÄ«tas. Slidiniet peli pÄr opcijÄm, lai iegÅ«tu papildu informÄciju:">
+
+<!ENTITY ssl-observatory.prefs.hide "Slēpt papildu opcijas">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"PÄrbaudÄ«t sertifikÄtus pat ja Tor nav pieejams">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"MÄ“s joprojÄm centÄ«simies nodroÅ¡inÄt datu anonimitÄti, tomÄ“r šī opcija ir mazÄk droÅ¡a">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Iesniegt un pÄrbaudÄ«t sertifikÄtus DNS nosaukumiem, kuri nav publiski ">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Ja vien šī opcija nav atzÄ«mÄ“ta, Observatory neierakstÄ«s sertifikÄtus nosaukumiem, kurus tÄ nevar atrisinÄt caur DNS sistÄ“mu.">
+
+<!ENTITY ssl-observatory.prefs.show "ParÄdÄ«t papildu opcijas">
+
+<!ENTITY ssl-observatory.prefs.title "Observatory SSL preferences">
+
+<!ENTITY ssl-observatory.prefs.use "Izmantot Observatory?">
+<!ENTITY ssl-observatory.warning.title "EFF's Observatory SSL BRĪDINĀJUMS">
+<!ENTITY ssl-observatory.warning.showcert "ParÄdÄ«t sertificēšanas Ä·Ä“di">
+<!ENTITY ssl-observatory.warning.okay "Es saprotu">
+<!ENTITY ssl-observatory.warning.text "EFF's SSL Observatory SSL izsniedza brÄ«dinÄjumu saistÄ«bÄ ar norÄdÄ«tÄs vietnes HTTPS sertifikÄtu(iem):">
+<!ENTITY ssl-observatory.warning.defense "Ja Å¡ajÄ vietnÄ“ esat reÄ£istrÄ“jies darbam, tad pÄ“c droÅ¡a savienojuma izveides apsveriet paroles maiņu.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Iesniegt un pÄrbaudÄ«t paÅ¡parakstÄ«tus sertifikÄtus">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Tiek rekomendÄ“ts; ar Å¡ifrēšanu saistÄ«tas problÄ“mas ir Ä«paÅ¡i biežas iegultÄs, paÅ¡parakstoÅ¡Äs iekÄrtÄs">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ms/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ms/https-everywhere.dtd
new file mode 100644
index 0000000..358e781
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ms/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Mengenai HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Encrypt laman sesawang! Gunakan HTTPS secara automatik di kebanyakan laman sesawang.">
+<!ENTITY https-everywhere.about.version "Versi">
+<!ENTITY https-everywhere.about.created_by "Dihasilkan oleh">
+<!ENTITY https-everywhere.about.librarians "Pustaka set aturan">
+<!ENTITY https-everywhere.about.thanks "Terima kasih kepada">
+<!ENTITY https-everywhere.about.contribute "Sekiranya anda menyukai HTTPS Everywhere, anda mungkin ingin mempertimbangkan untuk">
+<!ENTITY https-everywhere.about.donate_tor "Menderma kepada Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "ms-MY">
+<!ENTITY https-everywhere.about.donate_eff "Menderma kepada EFF">
+
+<!ENTITY https-everywhere.menu.about "Mengenai HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "Tetapan Pemantau SSL">
+<!ENTITY https-everywhere.menu.globalEnable "Pengaktifan HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Nyah-aktifkan HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Tetapan HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "Pengaktifan semua">
+<!ENTITY https-everywhere.prefs.disable_all "Nyah-aktifkan All">
+<!ENTITY https-everywhere.prefs.reset_defaults "Tetapan semula kepada asal">
+<!ENTITY https-everywhere.prefs.search "Carian">
+<!ENTITY https-everywhere.prefs.site "Laman">
+<!ENTITY https-everywhere.prefs.notes "Nota">
+<!ENTITY https-everywhere.prefs.list_caption "Penghalaan aturan HTTPS yang manakah patut digunakan?">
+<!ENTITY https-everywhere.prefs.enabled "Pengaktifan">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Anda boleh mempelajari penulisan set aturan tersendiri (bagi menambah sokongan kepada laman sesawang yang lain)">
+<!ENTITY https-everywhere.prefs.here_link "di sini">
+<!ENTITY https-everywhere.prefs.toggle "Togol">
+<!ENTITY https-everywhere.prefs.reset_default "Tetapan semula kepada asal">
+<!ENTITY https-everywhere.prefs.view_xml_source "Papar Sumber XML">
+
+<!ENTITY https-everywhere.source.downloading "Sedang memuat turun">
+<!ENTITY https-everywhere.source.filename "Nama fail">
+<!ENTITY https-everywhere.source.unable_to_download "Gagal untuk memuat turun sumber.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ms/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ms/https-everywhere.properties
new file mode 100644
index 0000000..c369b37
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ms/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Pengaktifan HTTPS Everywhere
+https-everywhere.menu.globalDisable = Nyah-aktifkan HTTPS Everywhere
+https-everywhere.menu.enableDisable = Enable / Disable Rules
+https-everywhere.menu.noRules = (No Rules for This Page)
+https-everywhere.menu.unknownRules = (Rules for This Page Unknown)
+https-everywhere.toolbar.hint = HTTPS Everywhere is now active. You can toggle it on a site-by-site basis by clicking the icon in the address bar.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ms/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ms/ssl-observatory.dtd
new file mode 100644
index 0000000..9b95cc0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ms/ssl-observatory.dtd
@@ -0,0 +1,104 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Keterangan dan Maklumat Privasi">
+<!ENTITY ssl-observatory.popup.later "Tanya Saya Kemudian">
+<!ENTITY ssl-observatory.popup.no "Tidak">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere boleh mengesan serangan
+terhadap pelayar web anda dengan menghantar sijil SSL yang anda terima ke
+Pemantau SSL. Aktifkan fungsi ini?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Perlukah HTTPS Everywhere mengunakan Pemantau SSL?">
+
+<!ENTITY ssl-observatory.popup.yes "Ya">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Ianya adalah selamat untuk pengaktifan, melainkan
+anda menggunakan rangkaian koprat yang sangat merejah:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Selamat, melainkan anda menggunakan rangkaian koprat
+dengan pelayan nama internet rahsia:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Hantar dan semak sijil SSL yang ditandatangani oleh
+root CA yang tidak standard">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Ianya adalah selamat (dan satu idea yang bagus) untuk mengaktifkan pilihan ini, melainkan anda menggunakan rangkaian koprat yang sangat merejah atau perisian Kaspersky antivirus yang memantau pelayaran anda dengan proksi TLS dan root Certificate Authority persendirian. Sekiranya diaktifkan di atas rangkaian berkenaan, pilihan ini mungkin akan memaparkan bukti domain https:// yang telah dilawati menggunakan proksi tersebut, disebabkan oleh sijil SSL yang unik yang dihasilkan. Oleh itu kami, secara asalnya kami biarkan ia tidak aktif.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Semak sijil SSL menggunakan Tor untuk ujuan anonymiti">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Semak sijil SSL menggunakan Tor untuk tujuan anonimiti (memerlukan Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Pemilihan ini memerlukan Tor and Torbutton sedia terpasang">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Apabila terpapar sijil SSL yang baru, maklumkan kepada Pemantau SSL tentang ISP yang telah berjaya disambungkan">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Ini akan capai dan hantar &quot;Autonomous System number&quot; rangkaian anda. Ia akan membantu mengesan serangan terhadap HTTPS, dan untuk menentukan samada terdapat pemantauan dari rangkaian seperti Iran dan Syria di mana serangan sering berlaku.">
+
+<!ENTITY ssl-observatory.prefs.done "Selesai">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere boleh menggunakan Pemantau SSL EFF. Terdapat dua
+perkara yang dilakukan iaitu: (1) menghantar salinan sijil SSL kepada
+Pemantau bagi tujuan mengesan serangan &quot;man in the middle&quot; serta
+menambah baik keselamatan web; dan (2) memberi amaran kepada anda tentang
+rangkaian yang tidak selamat atau serangan ke atas pelayar web anda.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Contohnya, apabila melawati laman https://www.something.com, sijil SSL
+yang diterima oleh Pemantau SSL akan memberitahu bahawa ada pelawat yang
+telah ke laman tersebut, tetapi bukan siapa yang telah melawatinya, atau
+halaman yang mereka telah kunjungi. Halakan tetikus kepada senarai pilihan
+untuk butiran lanjut:">
+
+<!ENTITY ssl-observatory.prefs.hide "Sembunyikan tetapan maju">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Semak sijil SSL walaupun ketiadaan Tor">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Kami akan cuba menyimpan data secara anonimus, namun langkah ini adalah kurang selamat">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Hantar dan semak sijil SSL untuk nama DNS yang tidak awam">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Pemantau SSL tidak akan merakam sijil SSL yang namanya tidak dapat diselesaikan oleh sistem DNS, selagi pilihan ini tidak terpilih.">
+
+<!ENTITY ssl-observatory.prefs.show "Paparkan pilihan maju">
+
+<!ENTITY ssl-observatory.prefs.title "Tetapan Pemantau SSL">
+
+<!ENTITY ssl-observatory.prefs.use "Gunakan Pemantau SSL?">
+<!ENTITY ssl-observatory.warning.title "AMARAN dari Pemantau SSL EFF">
+<!ENTITY ssl-observatory.warning.showcert "Paparkan rantaian sijil SSL">
+<!ENTITY ssl-observatory.warning.okay "Saya faham">
+<!ENTITY ssl-observatory.warning.text "Amaran tentang sijil SSL untuk laman ini telah diberikan oleh Pemantau SSL EFF:">
+<!ENTITY ssl-observatory.warning.defense "Jika anda berjaya memasuki laman sesawang ini, anda dinasihatkan supaya menukar kata laluan setelah berada dalam sambungan yang selamat.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Hantar dan periksa sijil sendiri-bertanda">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Disarankan, masalah kriptografik adalah biasa pada peranti self-signed ">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nb/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nb/https-everywhere.dtd
new file mode 100644
index 0000000..797be6f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nb/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Om HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Kryptér nettet. Bruk HTTPS-sikkerhet automatisk på mange nettsider.">
+<!ENTITY https-everywhere.about.version "Versjon">
+<!ENTITY https-everywhere.about.created_by "Lagd av">
+<!ENTITY https-everywhere.about.librarians "Regelsettbibliotekarer">
+<!ENTITY https-everywhere.about.thanks "Takk til">
+<!ENTITY https-everywhere.about.contribute "Hvis du liker HTTPS Everywhere, vurder å">
+<!ENTITY https-everywhere.about.donate_tor "Donére til Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "Donére til EFF">
+
+<!ENTITY https-everywhere.menu.about "Om HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL Observatory Innstillinger">
+<!ENTITY https-everywhere.menu.globalEnable "Aktiver HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Deaktiver HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere Innstillinger">
+<!ENTITY https-everywhere.prefs.enable_all "Aktiver Alle">
+<!ENTITY https-everywhere.prefs.disable_all "Deaktiver Alle">
+<!ENTITY https-everywhere.prefs.reset_defaults "Gjenopprett Standardinnstillinger">
+<!ENTITY https-everywhere.prefs.search "Søk">
+<!ENTITY https-everywhere.prefs.site "Side">
+<!ENTITY https-everywhere.prefs.notes "Merknader">
+<!ENTITY https-everywhere.prefs.list_caption "Hvilke HTTPS omdirigeringsregler skal gjelde?">
+<!ENTITY https-everywhere.prefs.enabled "Aktivert">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Du kan lære mer om hvordan du lager dine egne regelsett (for å støtte andre websider)">
+<!ENTITY https-everywhere.prefs.here_link "her">
+<!ENTITY https-everywhere.prefs.toggle "Av/PÃ¥">
+<!ENTITY https-everywhere.prefs.reset_default "Gjenopprett Standardinnstilling">
+<!ENTITY https-everywhere.prefs.view_xml_source "Vis XML Kilde">
+
+<!ENTITY https-everywhere.source.downloading "Laster ned">
+<!ENTITY https-everywhere.source.filename "Filnavn">
+<!ENTITY https-everywhere.source.unable_to_download "Klarte ikke å laste ned kilde.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nb/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nb/https-everywhere.properties
new file mode 100644
index 0000000..0bf50bc
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nb/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Aktiver HTTPS Everywhere
+https-everywhere.menu.globalDisable = Deaktiver HTTPS Everywhere
+https-everywhere.menu.enableDisable = Aktiver / Deaktiver Regler
+https-everywhere.menu.noRules = (Ingen regler for denne siden)
+https-everywhere.menu.unknownRules = (Reglene for denne siden er ukjente)
+https-everywhere.toolbar.hint = HTTPS Everywhere er nå aktiv. Du kan aktivere/deaktivere fra side til side ved å klikke på ikonet i adresselinjen.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nb/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nb/ssl-observatory.dtd
new file mode 100644
index 0000000..a7fce63
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nb/ssl-observatory.dtd
@@ -0,0 +1,100 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Detaljer og Personvernsinformasjon">
+<!ENTITY ssl-observatory.popup.later "Spør Meg Senere">
+<!ENTITY ssl-observatory.popup.no "Nei">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere kan oppdage angrep
+mot nettleseren din ved å sende sertifikatene du mottar til
+Observatory. Aktivere dette?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Skal HTTPS Everywhere bruke SSL Observatory?">
+
+<!ENTITY ssl-observatory.popup.yes "Ja">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Det er trygt å aktivere dette, hvis du ikke er på et veldig
+påtrengende bedriftsnettverk:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Trygt, med mindre du bruker et bedriftsnettverk med hemmelige intranett servernavn.">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Send inn og sjekk sertifikater signert av ikke-standardiserte rotsertifiseringsinstanser">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Det er trygt (og en god idé) å aktivere denne innstillingen, med mindre du bruker et påtrengende bedriftsnettverk eller Kaspersky antivirusprogramvare som overvåker surfingen din med en TLS proxy og en privat rotsertifiseringsinstans. Hvis du aktiverer dette på et slikt nettverk, kan innstillingen publisere bevis på hvilke https://-domener som ble besøk gjennom den proxyen, som følge av de unike sertifkatene den vil lage. Så vi deaktiverer den som standard.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Sjekk sertifikatene ved å bruke Tor for anonymitet">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Sjekk sertifikater anonymt ved å bruke Tor (Tor kreves)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Denne innstillingen krever at Tor installeres og aktiveres">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Når du ser et nytt sertifikat, fortell Observatory hvilken internettleverandør du er tilkoblet">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Dette vil hente og sende ditt nettverks &quot;autonome systemnummer&quot;. Dette vil hjelpe oss med å lokalisere angrep mot HTTPS og med å avgjøre om vi har observasjoner fra nettverk i Iran og Syria, hvor angrep er relativt vanlige.">
+
+<!ENTITY ssl-observatory.prefs.done "Ferdig">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere kan bruke EFF's SSL Observatory. Dette gjør to ting: (1)
+sender kopier av HTTPS sertifikater til Observatory, for å hjelpe oss å
+avsløre 'mellommann'-angrep og forbedre sikkerheten på nettet; og (2)
+lar oss advare deg mot usikre tilkoblinger og angrep på nettleseren din.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"For eksempel, hvis du besøker https://www.something.com, vil sertifikatet
+Observatory mottar indikere at noen besøkte
+www.something.com, men ikke hvem som besøkte siden, eller spesifikt hvilken side
+de så på. Hold muspekeren over innstillingene for flere detaljer:">
+
+<!ENTITY ssl-observatory.prefs.hide "Skjul avanserte innstillinger">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Sjekk sertifikater selv om Tor ikke er tilgjengelig.">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Vil vil fortsatt prøve å holde dataene anonyme, men denne innstillingen er mindre sikker">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Send inn og sjekk sertifikater til DNS-navn som ikke er offentlige">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Hvis denne innstillingen ikke er aktivert, vil ikke Observatory registrere sertikatene til navn som ikke kan analyseres gjennom DNS-systemet.">
+
+<!ENTITY ssl-observatory.prefs.show "Vis avanserte innstillinger">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Observatory Innstillinger">
+
+<!ENTITY ssl-observatory.prefs.use "Bruke Observatory?">
+<!ENTITY ssl-observatory.warning.title "ADVARSEL fra EFF's SSL Observatory ">
+<!ENTITY ssl-observatory.warning.showcert "Vis sertifikatkjede">
+<!ENTITY ssl-observatory.warning.okay "Jeg forstår">
+<!ENTITY ssl-observatory.warning.text "EFF's SSL Observatory har utstedt en advarsel om bruk av HTTPS sertifikatene på denne siden:">
+<!ENTITY ssl-observatory.warning.defense "Hvis du er innlogget på denne siden, er det anbefalt at du forandrer passordet så snart du har en sikker tilkobling.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Send og sjekk selvsignerte sertifikater">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Dette er anbefalt; kryptografiske problemer er spesielt vanlig i selvsignerte enheter">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nl/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nl/https-everywhere.dtd
new file mode 100644
index 0000000..04bb6c5
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nl/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Over HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Versleutel het web! Gebruik HTTPS-beveiliging automatisch op vele sites.">
+<!ENTITY https-everywhere.about.version "Versie">
+<!ENTITY https-everywhere.about.created_by "Gemaakt door">
+<!ENTITY https-everywhere.about.librarians "Regelsetbibliothecarissen">
+<!ENTITY https-everywhere.about.thanks "Met dank aan">
+<!ENTITY https-everywhere.about.contribute "Als HTTPS Everywhere u bevalt, kunt u overwegen">
+<!ENTITY https-everywhere.about.donate_tor "te doneren aan Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "te doneren aan het EFF">
+
+<!ENTITY https-everywhere.menu.about "Over HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL-observatoriumvoorkeuren">
+<!ENTITY https-everywhere.menu.globalEnable "HTTPS Everywhere inschakelen">
+<!ENTITY https-everywhere.menu.globalDisable "HTTPS Everywhere uitschakelen">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere-voorkeuren">
+<!ENTITY https-everywhere.prefs.enable_all "Alles inschakelen">
+<!ENTITY https-everywhere.prefs.disable_all "Alles uitschakelen">
+<!ENTITY https-everywhere.prefs.reset_defaults "Standaardwaarden herstellen">
+<!ENTITY https-everywhere.prefs.search "Zoeken">
+<!ENTITY https-everywhere.prefs.site "Site">
+<!ENTITY https-everywhere.prefs.notes "Opmerkingen">
+<!ENTITY https-everywhere.prefs.list_caption "Welke HTTPS-omleidingsregels moeten worden toegepast?">
+<!ENTITY https-everywhere.prefs.enabled "Ingeschakeld">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Om ondersteuning voor andere websites toe te voegen, kunt u">
+<!ENTITY https-everywhere.prefs.here_link "zelf regelsets opstellen">
+<!ENTITY https-everywhere.prefs.toggle "Schakelen">
+<!ENTITY https-everywhere.prefs.reset_default "Standaardwaarden herstellen">
+<!ENTITY https-everywhere.prefs.view_xml_source "XML-broncode bekijken">
+
+<!ENTITY https-everywhere.source.downloading "Bezig met downloaden">
+<!ENTITY https-everywhere.source.filename "Bestandsnaam">
+<!ENTITY https-everywhere.source.unable_to_download "Kan broncode niet downloaden.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 bericht">
+<!ENTITY https-everywhere.popup.paragraph1 "Oeps! U gebruikte de stabiele versie van HTTPS Everywhere, maar het is mogelijk dat we u tijdens de laatste uitgave per ongeluk naar de ontwikkelversie hebben geupgrade.">
+<!ENTITY https-everywhere.popup.paragraph2 "Wilt u teruggaan naar de stabiele versie?">
+<!ENTITY https-everywhere.popup.paragraph3 "We zouden het op prijs stellen als u doorging met het gebruik van onze ontwikkelde versie en ons hielp met het verbeteren van HTTPS Everywhere! U zult hier en daar wat bugs tegenkomen, die u kunt melden aan https-everywhere@eff.org. Excuses voor het ongemak, en veel dank voor het gebruik van HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Hou me op de ontwikkelde versie">
+<!ENTITY https-everywhere.popup.revert "Download de meest recenste stabiele uitgave.">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nl/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nl/https-everywhere.properties
new file mode 100644
index 0000000..a96fdc7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nl/https-everywhere.properties
@@ -0,0 +1,7 @@
+https-everywhere.menu.globalEnable = HTTPS Everywhere inschakelen
+https-everywhere.menu.globalDisable = HTTPS Everywhere uitschakelen
+https-everywhere.menu.enableDisable = Regels in-/uitschakelen
+https-everywhere.menu.noRules = (Geen regels voor deze pagina)
+https-everywhere.menu.unknownRules = (Regels voor deze pagina zijn onbekend)
+https-everywhere.toolbar.hint = HTTPS Everywhere is nu geactiveerd. Je kan dit aanpassen door op een site-by-site basis te clicken op het icoon naast de adres bar.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nl/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nl/ssl-observatory.dtd
new file mode 100644
index 0000000..e576db5
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/nl/ssl-observatory.dtd
@@ -0,0 +1,99 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Details en privacy-informatie">
+<!ENTITY ssl-observatory.popup.later "Later opnieuw vragen">
+<!ENTITY ssl-observatory.popup.no "Nee">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere kan aanvallen op uw browser detecteren door
+de certificaten die u ontvangt, naar het observatorium door te sturen. Wilt u dit inschakelen?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"SSL-observatorium gebruiken?">
+
+<!ENTITY ssl-observatory.popup.yes "Ja">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Het is veilig om dit in te schakelen, tenzij u een zeer indringend bedrijfsnetwerk gebruikt:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Veilig, tenzij u een bedrijfsnetwerk met geheime intranetservernamen gebruikt:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Certificaten ondertekend door niet-standaard hoofd-CA’s opsturen en controleren">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Het is veilig (en aangeraden) om deze optie in te schakelen, tenzij u een indringend
+bedrijfsnetwerk gebruikt dat uw surfgedrag met een TLS-proxy en een
+privé-hoofdcertificaatautoriteit monitort. Indien deze optie op een dergelijk netwerk is ingeschakeld,
+kan deze bewijs publiceren over welke HTTPS-domeinen via die proxy werden bezocht, vanwege de unieke
+certificaten die dan worden geproduceerd. De optie is daarom standaard uitgeschakeld.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Certificaten omwille van anonimiteit via Tor controleren">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Certificaten omwille van anonimiteit via Tor controleren (vereist Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Voor deze optie zijn Tor en Torbutton vereist">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Melden met welke ISP u bent verbonden indien u een nieuwe certificaat ziet">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Dit zal het Autonoom Systeem-nummer van uw netwerk ophalen en verzenden als het observatorium een
+waarschuwing afgeeft over een certificaat dat u zag. Dit helpt ons aanvallen op HTTPS te lokaliseren.">
+
+<!ENTITY ssl-observatory.prefs.done "OK">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere kan het SSL-observatorium van EFF gebruiken. Dit doet twee dingen: ten eerste zendt
+het kopieën van HTTPS-certificaten naar het observatorium om ons te helpen man-in-the-middle-aanvallen
+te detecteren en de veiligheid van het web te verbeteren; ten tweede laat het ons u waarschuwen over
+onveilige verbindingen en aanvallen op uw browser.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Als u bijvoorbeeld https://www.iets.nl bezoekt, geeft het certificaat dat het observatorium ontvangt aan
+dat iemand www.iets.nl bezocht, maar niet wie de site bezocht of welke specifieke pagina de bezoeker
+bekeek. Plaats uw muis boven de opties voor meer details:">
+
+<!ENTITY ssl-observatory.prefs.hide "Geavanceerde opties verbergen">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Certificaten controleren zelfs als Tor niet beschikbaar is">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"We zullen nog steeds proberen de gegevens anoniem te houden, maar deze optie is minder veilig">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Certificaten voor niet-openbare DNS-namen opsturen en controleren">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Tenzij deze optie is aangevinkt, legt het observatorium geen certificaten vast voor namen die niet via
+het DNS-systeem zijn op te lossen.">
+
+<!ENTITY ssl-observatory.prefs.show "Geavanceerde opties tonen">
+
+<!ENTITY ssl-observatory.prefs.title "Voorkeuren SSL-observatorium">
+
+<!ENTITY ssl-observatory.prefs.use "Het observatorium gebruiken?">
+<!ENTITY ssl-observatory.warning.title "WAARSCHUWING van SSL-observatorium van EFF">
+<!ENTITY ssl-observatory.warning.showcert "Toon de certificaatketen">
+<!ENTITY ssl-observatory.warning.okay "Ik begrijp het">
+<!ENTITY ssl-observatory.warning.text "Het SSL-observatorium van EFF heeft een waarschuwing uitgegeven over een HTTPS-certificaat voor deze site:">
+<!ENTITY ssl-observatory.warning.defense "Als u bent ingelogd op deze site, is het aan te raden uw wachtwoord te wijzigen zodra u een veilige verbinding hebt.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Verstuur en controleer zelf-getekende certificaten">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Dit is aanbevolen; cryptografische problemen zijn veel voorkomend in zelf-getekende embedded apparaten">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pl/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pl/https-everywhere.dtd
new file mode 100644
index 0000000..e0194a6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pl/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "O HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Szyfruj sieć! Automatycznie używaj zabezpieczeń HTTPS na wielu stronach.">
+<!ENTITY https-everywhere.about.version "Wersja">
+<!ENTITY https-everywhere.about.created_by "Stworzone przez">
+<!ENTITY https-everywhere.about.librarians "Ruleset Librarians">
+<!ENTITY https-everywhere.about.thanks "Dzięki dla">
+<!ENTITY https-everywhere.about.contribute "Jeżeli lubisz HTTPS Everywhere, możesz rozważyć ">
+<!ENTITY https-everywhere.about.donate_tor "Dotacje dla Tora">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "Dotacje dla Electronic Frontier Foundation">
+
+<!ENTITY https-everywhere.menu.about "O HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "Ustawienia SSL Observatory">
+<!ENTITY https-everywhere.menu.globalEnable "Włącz HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Wyłącz HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Ustawienia HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "Włącz wszystko">
+<!ENTITY https-everywhere.prefs.disable_all "Wyłącz wszystko">
+<!ENTITY https-everywhere.prefs.reset_defaults "Przywróć ustawienia fabryczne">
+<!ENTITY https-everywhere.prefs.search "Szukaj">
+<!ENTITY https-everywhere.prefs.site "Strona">
+<!ENTITY https-everywhere.prefs.notes "Notatki">
+<!ENTITY https-everywhere.prefs.list_caption "Które z opcji przekierowań HTTPS należy zastosować?">
+<!ENTITY https-everywhere.prefs.enabled "Włączone">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Możesz nauczyć się jak pisać własne pakiety reguł (by dać wsparcie innym stronom)">
+<!ENTITY https-everywhere.prefs.here_link "tutaj">
+<!ENTITY https-everywhere.prefs.toggle "Przełączanie">
+<!ENTITY https-everywhere.prefs.reset_default "Przywróć ustawienia fabryczne">
+<!ENTITY https-everywhere.prefs.view_xml_source "Zobacz źródło XML ">
+
+<!ENTITY https-everywhere.source.downloading "ÅšciÄ…ganie">
+<!ENTITY https-everywhere.source.filename "Nazwa pliku">
+<!ENTITY https-everywhere.source.unable_to_download "Nie można ściągnąć źródła. ">
+
+<!ENTITY https-everywhere.popup.title "Powiadomienie o wersji HTTPS Everywhere 4.0development.11">
+<!ENTITY https-everywhere.popup.paragraph1 "Ojej. Używałeś stabilnej wersji HTTPS Everywhere, ale mogliśmy wraz z najnowszą wersją przypadkowo zaktualizować Twój system do wersji rozwojowej.">
+<!ENTITY https-everywhere.popup.paragraph2 "Czy chciałbyś wrócić do wersji stabilnej?">
+<!ENTITY https-everywhere.popup.paragraph3 "Pragnęlibyśmy abyś dalej używał naszej wersji rozwojowej i pomógł nam uczyć HTTPS Everywhere lepszym! Może się okazać, że jest trochę więcej błędów tu i tam, które możesz zgłosić pod adres https-everywhere@eff.org. Wybacz proszę tę niedogodność. Dziękujemy za używanie HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Pozostań przy wersji rozwojowej">
+<!ENTITY https-everywhere.popup.revert "Pobierz najnowszÄ… wersjÄ™ stabilnÄ…">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pl/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pl/https-everywhere.properties
new file mode 100644
index 0000000..03428a2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pl/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Włącz HTTPS Everywhere
+https-everywhere.menu.globalDisable = Wyłącz HTTPS Everywhere
+https-everywhere.menu.enableDisable = Włącz/Wyłącz reguły
+https-everywhere.menu.noRules = (brak reguł dla tej strony)
+https-everywhere.menu.unknownRules = (reguły dla strony nieznane)
+https-everywhere.toolbar.hint = HTTPS Everywhere jest teraz aktywne. Możesz przełączać to dla poszczególnych stron, klikając ikonę w pasku adresu.
+https-everywhere.migration.notification0 = W celu implementacji pewnej kluczowej poprawki, ta aktualizacja zresetuje ustawienia reguł HTTPS Everywhere do ich domyślnych wartości.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pl/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pl/ssl-observatory.dtd
new file mode 100644
index 0000000..bd515b3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pl/ssl-observatory.dtd
@@ -0,0 +1,91 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Szczegóły i Polityka Prywatności">
+<!ENTITY ssl-observatory.popup.later "Zapytaj mnie później">
+<!ENTITY ssl-observatory.popup.no "Nie">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere może wykryć ataki
+na twoją przeglądarkę przez wysyłanie do ciebie certyfikatów, które otrzymujesz
+do &quot;SSL Observatory&quot;. Włączyć tą opcję?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Czy HTTPS Everywhere ma używać &quot;SSL Observatory&quot;?">
+
+<!ENTITY ssl-observatory.popup.yes "Tak">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Bezpiecznym jest używanie tej opcji, chyba że korzystasz
+z intruzywnej sieci korporacyjnej.">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Bezpieczne, jeżeli używasz sieci korporacyjnej z ukrytymi nazwami serwerów Intranetowych.">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Wysyłaj i sprawdzaj certyfikaty podpisane przez niestandardowe ośrodki certyfikacji">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Jest bezpiecznym, (i dobrym pomysłem), by włączyć tą opcję, chyba że używasz intruzywnej sieci korporacyjnej lub antywirusa firmy Kaspersky, które monitorują twoje przeglądanie za pomocą TLS proxy i prywatnego roota CA. Jeżeli ta opcja jest włączona na takich właśnie sieciach, opcja ta może przyczynić się do publikacji dowodów na temat stron, które były odwiedzane przez ten proxy, ponieważ unikalne certyfikaty zostaną utworzone. Dlatego też opcja ta domyślnie jest wyłączona.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Sprawdź certyfikaty używając Tora dla prywatności">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Sprawdź certyfikaty używając Tora dla prywatności (wymaga aplikacji Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Ta opcja, do instalacji, wymaga Tora oraz aplikacji Torbutton ">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Jeżeli dostrzeżesz nowe certyfikaty, potwierdź SLL Observatory, do którego ISP jesteś obecnie podłączony">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"To pobierze i wyśle &quot;numer Autonomicznego Systemu&quot; Twojej sieci.
+To pomoże nam zlokalizować ataki na HTTPS i określić, czy mamy obserwacje sieci w miejscach takich jak Iran czy Syria, gdzie ataki są porównywalnie częste.">
+
+<!ENTITY ssl-observatory.prefs.done "Gotowe">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere może używać EFF's SSL Observatory. Daje to dwie rzeczy: (1) wysyła kopie certyfikatów HTTPS do SSL Observatory, pomagając nam wykryć ataki osób podsłuchujących; i (2) daje nam znać o niezabezpieczonych połączeniach lub atakach na twoją przeklądarkę.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Dla przykładu, jeżeli odwiedzasz https://www.something.com, certyfikat otrzymany przez SSL Observatory wskaże, że ktoś odwiedził https://www.something.com ale nie wskaże kto dokładnie ją odwiedzał i jakie strony przeglądał. Najedź kursorem na opcje by zobaczyć więcej szczegółów ">
+
+<!ENTITY ssl-observatory.prefs.hide "Schowaj zaawansowane opcje">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Sprawdź certyfikaty nawet jeżeli Tor nie jest dostępny">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Postaramy się zachować anonimowość twoich danych, jednak ta opcja jest mniej bezpieczna.">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Wyślij i sprawdź certyfikaty dla niepublicznych nazw DNSów">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Jeśli ta opcja nie jest włączona, Obserwatorium nie zarejestruje certyfikatów dla nazw, których nie można znaleźć w systemie DNS.">
+
+<!ENTITY ssl-observatory.prefs.show "Pokaż zaawansowane opcje">
+
+<!ENTITY ssl-observatory.prefs.title "Preferencje SLL Observatory">
+
+<!ENTITY ssl-observatory.prefs.use "Użyj Observatory?">
+<!ENTITY ssl-observatory.warning.title "OSTRZEŻENIE od EFF's SSL Observatory">
+<!ENTITY ssl-observatory.warning.showcert "Pokaż łańcuch certyfikatu">
+<!ENTITY ssl-observatory.warning.okay "Tak rozumie">
+<!ENTITY ssl-observatory.warning.text "EFF's SSL Observatory wystawił ostrzeżenie na temat certyfikatów HTTPS dla tej stron:">
+<!ENTITY ssl-observatory.warning.defense "Jeżeli zalogowałeś się do tej strony, bezpiecznym będzie zmiana hasła, po ponownym połączeniu się z bezpieczną siecią.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Wysyłaj i sprawdzaj samopodpisane certyfikaty">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"To jest zalecane; problemy kryptograficzne są szczególnie częste w samopodpisanych urządzeniach wbudowanych.">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pt/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pt/https-everywhere.dtd
new file mode 100644
index 0000000..805b7c5
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pt/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Sobre o HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Criptografe a Web! Use automaticamente a segurança HTTPS em diversos sites.">
+<!ENTITY https-everywhere.about.version "Versão">
+<!ENTITY https-everywhere.about.created_by "Criado por">
+<!ENTITY https-everywhere.about.librarians "Bibliotecários dos Conjuntos de Regras">
+<!ENTITY https-everywhere.about.thanks "Obrigado a">
+<!ENTITY https-everywhere.about.contribute "Se você gostar do HTTPS Everywhere, considere">
+<!ENTITY https-everywhere.about.donate_tor "Fazer uma doação para o Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "Fazer uma doação para a EFF">
+
+<!ENTITY https-everywhere.menu.about "Sobre o HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "Preferências do Observatório SSL">
+<!ENTITY https-everywhere.menu.globalEnable "Habilitar HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Desabilitar HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Preferências do HTTPS Everywhere ">
+<!ENTITY https-everywhere.prefs.enable_all "Habilitar tudo">
+<!ENTITY https-everywhere.prefs.disable_all "Desabilitar tudo">
+<!ENTITY https-everywhere.prefs.reset_defaults "Restaurar as configurações padrão">
+<!ENTITY https-everywhere.prefs.search "Procurar">
+<!ENTITY https-everywhere.prefs.site "Site">
+<!ENTITY https-everywhere.prefs.notes "Notas">
+<!ENTITY https-everywhere.prefs.list_caption "Quais regras de redirecionamento HTTPS devem ser aplicadas?">
+<!ENTITY https-everywhere.prefs.enabled "Habilitado(a)">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Você pode aprender como escrever seu próprio conjunto de regras (para adicionar suporte para outros websites)">
+<!ENTITY https-everywhere.prefs.here_link "aqui">
+<!ENTITY https-everywhere.prefs.toggle "Alternar">
+<!ENTITY https-everywhere.prefs.reset_default "Restaurar as configurações padrão">
+<!ENTITY https-everywhere.prefs.view_xml_source "Ver Fonte XML">
+
+<!ENTITY https-everywhere.source.downloading "Fazendo download">
+<!ENTITY https-everywhere.source.filename "Nome do Arquivo">
+<!ENTITY https-everywhere.source.unable_to_download "Impossível fazer download da origem.">
+
+<!ENTITY https-everywhere.popup.title "Aviso do HTTPS Everywhere 4.0development.11">
+<!ENTITY https-everywhere.popup.paragraph1 "Desculpe. Você usava a versão estável do HTTPS Everywhere, mas, na nossa última liberação, sem querer podemos ter atualizado seu navegador para a versão de desenvolvimento.">
+<!ENTITY https-everywhere.popup.paragraph2 "Gostaria de voltar à versão estável?">
+<!ENTITY https-everywhere.popup.paragraph3 "Seria útil para o nosso projeto se quiser continuar a usar a versão de desenvolvimento para ajudar-nos a melhorar o HTTPS Everywhere. Porém, pode encontrar mais bugs; pode informar sobre eles escrevendo para https-everywhere@eff.org. Desculpe pelo incômodo, e obrigado por usar o HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Manter o navegador na versão de desenvolvimento">
+<!ENTITY https-everywhere.popup.revert "Baixar a versão estável mais recente">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pt/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pt/https-everywhere.properties
new file mode 100644
index 0000000..66160e4
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pt/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Habilitar HTTPS Everywhere
+https-everywhere.menu.globalDisable = Desabilitar HTTPS Everywhere
+https-everywhere.menu.enableDisable = Habilitar / Desabilitar Regras
+https-everywhere.menu.noRules = (Não há Regras para Esta Página)
+https-everywhere.menu.unknownRules = (Regras Desconhecidas para Esta Página)
+https-everywhere.toolbar.hint = HTTPS Everywhere foi ativado. Você pode habilitá-lo individualmente para cada site, clicando no ícone na barra de endereços.
+https-everywhere.migration.notification0 = Para implementar uma reparação crucial, esta atualização limpa sua preferência de regras do HTTPS Everywhere para valores padrão.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pt/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pt/ssl-observatory.dtd
new file mode 100644
index 0000000..7ef2617
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/pt/ssl-observatory.dtd
@@ -0,0 +1,94 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Detalhes e Informações sobre a Privacidade">
+<!ENTITY ssl-observatory.popup.later "Pergunte-me mais tarde">
+<!ENTITY ssl-observatory.popup.no "Não">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere detecta ataques
+contra seu navegador enviando os certificados que você receber
+ao Observatório. Você gostaria de ativá-lo?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"O HTTPS Everywhere deverá usar o Observatório SSL?">
+
+<!ENTITY ssl-observatory.popup.yes "Sim">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"É seguro habilitar isto, a não ser que você use uma
+rede corporativa muito intrusiva:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Seguro, a não ser que você use uma rede corporativa com nomes de servidores secretos na intranet:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Submeta e verifique os certificados assinados pelas non-standard root CAs">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"É seguro (e uma boa idéia) habilitar esta opção, a não ser que você use uma rede corporativa intrusiva ou o Kapersky antivirus que monitora sua navegação com uma proxy TLS e um certificado Certificate Authority privado raiz. Se habilitado em uma rede deste tipo, esta opção pode publicar evidências de quais domínios httpss:// foram visitados através daquele proxy, por causa dos certificados únicos que serão produzidos. Então nós deixamos isto desabilitado por padrão.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Checar certificados usando Tor para anonimato">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Checar certificados usando Tor para anonimato (requer Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Esta opção requer que o Tor e o Torbutton estejam instalados">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Quando você vir um novo certificado, diga ao Observatório a qual ISP você está conectado">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Isto irá buscar e enviar o &quot;Autonomous System Number&quot; de sua rede. Isto irá nos ajudar a localizar ataques contra HTTPS, e a determinar se nós temos observações das redes localizadas em lugares como Irã e Síria, onde os ataques são relativamente mais comuns.">
+
+<!ENTITY ssl-observatory.prefs.done "Pronto">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere pode usar o Observatório SSL de EFF, para realizar duas funções: (1) enviar cópias dos certificados HTTPS ao Observatório, para ajudar-nos
+a detectar o &quot;homem no meio&quot; dos ataques e melhorar a segurança da Web; e (2)
+Avisar-nos sobre conexões não seguras ou ataques ao seu navegador.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Por exemplo, quando você visita https://www.algumacoisa.com, o certificado
+recebido pelo Observatório indicará que alguém visitou
+www.algumacoisa.com, mas não quem visitou o site, ou qual página específica foi vista. Passe o mouse sobre as opções para mais detalhes:">
+
+<!ENTITY ssl-observatory.prefs.hide "Ocultar opções avançadas">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Checar os certificados mesmo se o Tor não estiver disponível">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Nós continuaremos tentando manter os dados anônimos, mas esta opção é menos segura">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Submeter e checar os certificados para nomes de DNS não-públicos">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"A não ser que esta opção esteja marcada, o Observatório gravará os certificados para os nomes impossíveis de resolver através do sistema DNS.">
+
+<!ENTITY ssl-observatory.prefs.show "Mostrar opções avançadas">
+
+<!ENTITY ssl-observatory.prefs.title "Preferências do Observatório SSL">
+
+<!ENTITY ssl-observatory.prefs.use "Usar este Observatório?">
+<!ENTITY ssl-observatory.warning.title "AVISO do Observatório SSL de EFF">
+<!ENTITY ssl-observatory.warning.showcert "Mostrar a série do certificado">
+<!ENTITY ssl-observatory.warning.okay "Eu entendi">
+<!ENTITY ssl-observatory.warning.text "O Observatório SSL de EFF emitiu um aviso sobre o(s) certificados(s) HTTPS para este site:">
+<!ENTITY ssl-observatory.warning.defense "Se você estiver logado neste site, é aconselhável trocar sua senha assim que você tiver uma conexão segura.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Envie e verifique os certificados auto-assinados">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Isto é recomendado; problemas de criptografia são especialmente comuns em certificados auto-assinados de sistemas embarcados">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ru/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ru/https-everywhere.dtd
new file mode 100644
index 0000000..86d3da2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ru/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "О HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Зашифруйте Ñеть! ÐвтоматичеÑки переключайтеÑÑŒ на безопаÑный протокол HTTPS там, где Ñто возможно.">
+<!ENTITY https-everywhere.about.version "ВерÑиÑ">
+<!ENTITY https-everywhere.about.created_by "Ðвторы">
+<!ENTITY https-everywhere.about.librarians "Хранители правил">
+<!ENTITY https-everywhere.about.thanks "БлагодарноÑти">
+<!ENTITY https-everywhere.about.contribute "ЕÑли Вам нравитÑÑ HTTPS Everywhere, возможно, Ð’Ñ‹ хотели бы Ñделать">
+<!ENTITY https-everywhere.about.donate_tor "пожертвование Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "ru">
+<!ENTITY https-everywhere.about.donate_eff "пожертвование EFF">
+
+<!ENTITY https-everywhere.menu.about "О HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "ÐаÑтройки SSL Observatory">
+<!ENTITY https-everywhere.menu.globalEnable "Включить HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Выключить HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "ÐаÑтройки HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "Включить вÑÑ‘">
+<!ENTITY https-everywhere.prefs.disable_all "Выключить вÑÑ‘">
+<!ENTITY https-everywhere.prefs.reset_defaults "По умолчанию">
+<!ENTITY https-everywhere.prefs.search "ПоиÑк">
+<!ENTITY https-everywhere.prefs.site "Сайт">
+<!ENTITY https-everywhere.prefs.notes "ПримечаниÑ">
+<!ENTITY https-everywhere.prefs.list_caption "Какие правила перенаправлений Ñледует иÑпользовать?">
+<!ENTITY https-everywhere.prefs.enabled "Включено">
+<!ENTITY https-everywhere.prefs.ruleset_howto "РуководÑтво по Ñозданию новых правил находитÑÑ">
+<!ENTITY https-everywhere.prefs.here_link "здеÑÑŒ">
+<!ENTITY https-everywhere.prefs.toggle "Переключить">
+<!ENTITY https-everywhere.prefs.reset_default "СброÑить к значению по умолчанию">
+<!ENTITY https-everywhere.prefs.view_xml_source "ПроÑмотреть иÑходник XML">
+
+<!ENTITY https-everywhere.source.downloading "Загрузка">
+<!ENTITY https-everywhere.source.filename "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°">
+<!ENTITY https-everywhere.source.unable_to_download "Ðе могу загрузить иÑходник">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 уведомление">
+<!ENTITY https-everywhere.popup.paragraph1 "Ой. Ð’Ñ‹ иÑпользовали Ñтабильную верÑию HTTPS Everywhere, но мы, возможно, Ñлучайно обновили Вам её до разрабатываемой верÑии.">
+<!ENTITY https-everywhere.popup.paragraph2 "Хотели бы Ð’Ñ‹ вернутьÑÑ Ðº Ñтабильной верÑии?">
+<!ENTITY https-everywhere.popup.paragraph3 "Мы были бы рады, еÑли бы Ð’Ñ‹ продолжили иÑпользовать разрабатываемую верÑию, и помогли нам Ñделать HTTPS Everywhere лучше! Ð’Ñ‹ могли бы найти неÑколько ошибок, и приÑлать их нам на https-everywhere@eff.org. Извините за неудобÑтва, и ÑпаÑибо за иÑпользование HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "ОÑтатьÑÑ Ð½Ð° разрабатываемой верÑии">
+<!ENTITY https-everywhere.popup.revert "Загрузить поÑледнюю Ñтабильную верÑию">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ru/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ru/https-everywhere.properties
new file mode 100644
index 0000000..36530f3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ru/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Включить HTTPS Everywhere
+https-everywhere.menu.globalDisable = Выключить HTTPS Everywhere
+https-everywhere.menu.enableDisable = Включить / Выключить правила
+https-everywhere.menu.noRules = Ðет правил Ð´Ð»Ñ Ñтой Ñтраницы
+https-everywhere.menu.unknownRules = Правила Ð´Ð»Ñ Ñтой Ñтраницы неизвеÑтны
+https-everywhere.toolbar.hint = HTTPS Everywhere активен. Ð’Ñ‹ можете отключить его Ð´Ð»Ñ Ñтого Ñайта кликнув по значку.
+https-everywhere.migration.notification0 = Ð’ целÑÑ… реализации критичеÑких иÑправлений, Ñто обновление ÑбраÑывает наÑтройки правил HTTPS Everywhere к значениÑм по умолчанию.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ru/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ru/ssl-observatory.dtd
new file mode 100644
index 0000000..f0f06bd
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/ru/ssl-observatory.dtd
@@ -0,0 +1,120 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "ÐŸÐ¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸ ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ конфиденциальноÑти">
+<!ENTITY ssl-observatory.popup.later "СпроÑить позже">
+<!ENTITY ssl-observatory.popup.no "Ðет">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere может раÑпознавать атаки на Ваш браузер,
+путём отправки получаемых Ñертификатов в SSL Observatory.
+Включить данную опцию?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Должен ли HTTPS Everywhere иÑпользовать SSL Observatory?">
+
+<!ENTITY ssl-observatory.popup.yes "Да">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Включение данной опции безопаÑно, кроме ÑÐ»ÑƒÑ‡Ð°Ñ ÐºÐ¾Ð³Ð´Ð°
+Ð’Ñ‹ иÑпользуете очень навÑзчивую корпоративную Ñеть">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"БезопаÑно, кроме ÑÐ»ÑƒÑ‡Ð°Ñ ÐºÐ¾Ð³Ð´Ð° Ð’Ñ‹ иÑпользуете
+корпоративную Ñеть Ñ Ñекретными именами Ñерверов">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Отправить и проверить Ñертификаты, подпиÑанные
+неÑтандартными корневыми центрами Ñертификации">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Это безопаÑно (а так же Ñ…Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ð¸Ð´ÐµÑ) включить данную опцию,
+кроме ÑлучаÑ, когда Ð’Ñ‹ иÑпользуете навÑзчивую корпоративную Ñеть
+или ÐÐ½Ñ‚Ð¸Ð²Ð¸Ñ€ÑƒÑ ÐšÐ°ÑперÑкого, который Ñледит за Вашей работой в Ñети
+Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ TLS прокÑи и чаÑтного корневого Центра Сертификации.
+ЕÑли она будет включена в такой Ñети, то может обнародовать
+ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ том какие домены https:// были поÑещены через Ñтот
+прокÑи, вÑледÑтвие уникальных Ñертификатов которые он будет
+издавать. ПоÑтому мы оÑтавили её выключенной по умолчанию.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Проверить Ñертификаты иÑпользуемые Tor Ð´Ð»Ñ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð¾Ñти">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Проверить Ñертификаты иÑпользуемые Tor
+Ð´Ð»Ñ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð¾Ñти (требует Tor)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Эта Ð¾Ð¿Ñ†Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ ÑƒÑтановленного и включенного Tor.">
+
+<!ENTITY ssl-observatory.prefs.asn
+"При получении нового Ñертификата, Ñообщить
+SSL Observatory к какому провайдеру Вы подключены">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Будет получать и отправлÑть &quot;Ðомер Ðвтономной СиÑтемы&quot;
+Вашей Ñети. Это поможет нам локализовать атаки против HTTPS
+и определить наличие наблюдений Ð´Ð»Ñ Ñетей в таких меÑтах как
+Иран и СириÑ, где атаки Ñравнительно чаÑты.">
+
+<!ENTITY ssl-observatory.prefs.done "Готово">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere может иÑпользовать SSL Observatory. Это
+обеÑпечивает две вещи: (1) отправлÑет копии Ñертификатов в SSL
+Observatory, что бы помочь нам определить атаки 'человек
+поÑередине' и улучшить безопаÑноÑть Веб; и (2) позволÑет нам
+предупреждать Ð’Ð°Ñ Ð¾ небезопаÑных ÑоединениÑÑ… или атаках на
+Ваш браузер.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Ðапример, когда Ð’Ñ‹ заходите на https://www.something.com,
+Ñертификат полученный SSL Observatory будет означать что кто-то
+поÑетил www.something.com, но не кто именно его поÑетил, или
+какую конкретную Ñтраницу он проÑматривал. Ðаведите курÑор на
+опции Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ подробной информации:">
+
+<!ENTITY ssl-observatory.prefs.hide "Скрыть дополнительные опции">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"ПроверÑть Ñертификаты даже еÑли Tor недоÑтупен">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Мы по-прежнему ÑтараемÑÑ Ñохранить Ваши
+данные анонимными, но Ñта Ð¾Ð¿Ñ†Ð¸Ñ Ð¼ÐµÐ½ÐµÐµ безопаÑна.">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Отправить и проверить Ñертификаты Ð´Ð»Ñ Ð½ÐµÐ¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… DNS имён">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"ЕÑли Ð´Ð°Ð½Ð½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°, SSL Observatory не будет
+региÑтрировать Ñертификаты Ð´Ð»Ñ Ð¸Ð¼Ñ‘Ð½, которые он не может
+разрешить через DNS.">
+
+<!ENTITY ssl-observatory.prefs.show "Показать дополнительные опции">
+
+<!ENTITY ssl-observatory.prefs.title "ÐаÑтройки SSL Observatory">
+
+<!ENTITY ssl-observatory.prefs.use "ИÑпользовать SSL Observatory?">
+<!ENTITY ssl-observatory.warning.title "ПРЕДУПРЕЖДЕÐИЕ от SSL Observatory">
+<!ENTITY ssl-observatory.warning.showcert "Показать цепочку Ñертификатов">
+<!ENTITY ssl-observatory.warning.okay "Я понимаю">
+<!ENTITY ssl-observatory.warning.text "SSL Observatory выдал предупреждение
+Ð´Ð»Ñ Ñертификат(-а/-ов) данного Ñайта:">
+<!ENTITY ssl-observatory.warning.defense "ЕÑли Ð’Ñ‹ вошли в учётную запиÑÑŒ на данном Ñайте, может быть
+целеÑообразно Ñменить пароль поÑле уÑтановки безопаÑного
+ÑоединениÑ.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Подтвердите и проверьте ÑобÑтвенные Ñертификаты">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"РекомендуетÑÑ. КриптографичеÑкие проблемы оÑобенно
+раÑпроÑтранены в ÑамоподпиÑанных вÑтраиваемых уÑтройÑтвах.">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/si/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/si/https-everywhere.dtd
new file mode 100644
index 0000000..f528d07
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/si/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "HTTPS Everywhere පිලිබඳව">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "බොහ෠වෙබ් අඩවි සඳහ෠HTTPS ආරක්ෂà·à·€ ස්වයංක්â€à¶»à·“යව à¶´à·à·€à·’à¶ à·Šà¶ à·’ කරන්න.">
+<!ENTITY https-everywhere.about.version "සංස්කරණය">
+<!ENTITY https-everywhere.about.created_by "නිර්මිත">
+<!ENTITY https-everywhere.about.librarians "Ruleset Librarians">
+<!ENTITY https-everywhere.about.thanks "ස්තුතිය">
+<!ENTITY https-everywhere.about.contribute "HTTPS Everywhere පිලිබඳව ඔබ à¶šà·à¶¸à¶­à·’නම් මේව෠සලක෠බà·à¶½à·’ය යුතුය">
+<!ENTITY https-everywhere.about.donate_tor "Tor වලට ආධà·à¶» කිරීම">
+<!ENTITY https-everywhere.about.tor_lang_code "ඉංග්â€à¶»à·“සි">
+<!ENTITY https-everywhere.about.donate_eff " EFF වලට ආධà·à¶» කරන්න">
+
+<!ENTITY https-everywhere.menu.about "HTTPS Everywhere පිලිබඳව">
+<!ENTITY https-everywhere.menu.observatory "SSL නිරික්ෂණà·à¶œà·à¶» මනà·à¶´ ">
+<!ENTITY https-everywhere.menu.globalEnable "HTTPS Everywhere à¶šà·Šâ€à¶»à·’යà·à¶šà¶»à·€à¶±à·Šà¶±">
+<!ENTITY https-everywhere.menu.globalDisable "HTTPS Everywhere à¶šà·Šâ€à¶»à·’යà·à·€à·’රහිත කරවන්න">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere මනà·à¶´ ">
+<!ENTITY https-everywhere.prefs.enable_all "සියල්ල සබල කරන්න ">
+<!ENTITY https-everywhere.prefs.disable_all "සියල්ල අබල කරන්න ">
+<!ENTITY https-everywhere.prefs.reset_defaults "යථ෠තත්වයට පත් කරන්න">
+<!ENTITY https-everywhere.prefs.search "සොයන්න">
+<!ENTITY https-everywhere.prefs.site "අඩවිය">
+<!ENTITY https-everywhere.prefs.notes "සටහන්">
+<!ENTITY https-everywhere.prefs.list_caption "කුමන HTTPS à·„à·à¶»à·€à·”ම් කොන්දේසිය à¶­à·à¶»à¶œà¶±à·Šà¶±à¶¯ ? ">
+<!ENTITY https-everywhere.prefs.enabled "සබල කරන ලදී ">
+<!ENTITY https-everywhere.prefs.ruleset_howto "ඔබගේ rulesets ලියන ආකà·à¶»à¶º පිළිබද ඔබට ඉගෙනගත à·„à·à¶š(අනෙකුත් වෙබ් අඩවි සදහ෠සහය à¶‘à¶šà¶­à·” කිරීමට) ">
+<!ENTITY https-everywhere.prefs.here_link "මෙහි ">
+<!ENTITY https-everywhere.prefs.toggle "ටොගලය ">
+<!ENTITY https-everywhere.prefs.reset_default "යථ෠තත්වයට පත් කරන්න">
+<!ENTITY https-everywhere.prefs.view_xml_source "XML කේත පෙන්වන්න ">
+
+<!ENTITY https-everywhere.source.downloading "à¶·à·à¶œà¶­ වෙමින්">
+<!ENTITY https-everywhere.source.filename "ගොනු නම">
+<!ENTITY https-everywhere.source.unable_to_download "à¶·à·à¶œà¶­ කිරීම සිදුකල නොහà·à¶š.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/si/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/si/https-everywhere.properties
new file mode 100644
index 0000000..7cdeccb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/si/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = HTTPS Everywhere සබල කරවන්න
+https-everywhere.menu.globalDisable = HTTPS Everywhere අබල කරවන්න
+https-everywhere.menu.enableDisable = සබල/ දුබල කරවීමේ නීති
+https-everywhere.menu.noRules = (මෙම පිටුව සදහ෠නීති කිසිවක් à¶±à·à¶­)
+https-everywhere.menu.unknownRules = (මෙම පිටුව සම්බන්ද නීති පිළිබද සදහනක් à¶±à·à¶­)
+https-everywhere.toolbar.hint = HTTPS Everywhere දà·à¶±à·Š à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶šà¶ºà·’. ඔබට එය දà·à¶±à·Š යොමු තීරුවේ ඇති නිරූපකය ඔබමින් අඩවියෙන් අඩවියට ටොගල් à¶šà¶½ à·„à·à¶š.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/si/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/si/ssl-observatory.dtd
new file mode 100644
index 0000000..0064466
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/si/ssl-observatory.dtd
@@ -0,0 +1,100 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "විස්තර හ෠පෞද්ගලික තොරතුරු ">
+<!ENTITY ssl-observatory.popup.later "පසුව මගෙන් අසන්න.">
+<!ENTITY ssl-observatory.popup.no "à¶±à·à¶­">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere ඔබේ à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶»à¶ºà¶§ එරෙහිව ඇතිවන ආක්â€à¶»à¶¸à¶«
+හදුනà·à¶œà¶±à·Šà¶±à· à¶…à¶­à¶», ඔබට à¶½à·à¶¶à·™à¶± සහතික නිරික්ෂණà·à¶œà·à¶»à¶ºà¶§ යවයි.
+මෙම à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ය සිදුකරනවà·à¶§ ඔබ à¶šà·à¶¸à¶­à·’ද?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"HTTPS Everywhere SSL නිරික්ෂණà·à¶œà·à¶»à¶º à¶·à·à·€à·’à¶­à· à¶šà¶½ යුතුද?">
+
+<!ENTITY ssl-observatory.popup.yes "ඔව්">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"ආගන්තුක සංයුක්ත à¶¢à·à¶½à¶ºà¶šà·Š à¶·à·à·€à·’ත෠කරන විට à·„à·à¶»à·™à¶±à·Šà¶±
+මෙය සබල කිරීම සුරක්ෂිත වේ:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"ඔබ රහසිගත අන්තඃජà·à¶½ සේවà·à¶¯à·à¶ºà¶š නමක් සමග සංයුක්ත à¶¢à·à¶½à¶ºà¶šà·Š à¶·à·à·€à·’ත෠නොකරන්නේ නම් ඔබ සුරක්ෂිතය.">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"යොමුකරීමෙන් පසු අසම්මත මුල සහතික බලධà·à¶»à·“න් අත්සන් à¶šà¶½ සහතික පරික්ෂ෠කරන්න.">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"ආගන්තුක සංයුක්ත à¶¢à·à¶½à¶ºà¶šà·Š à·„à· TLS proxy හ෠පෞද්ගලික සහතික බලධà·à¶»à·’ය෠විසින් ඔබේ පිරික්සුම් නිරීක්ෂණය කරන ලබන Kaspersky à¶´à·Šâ€à¶»à¶­à·’වයිරස මෘදුකà·à¶‚ගයක් à·„à· à¶·à·à·€à·’ත෠කරන විට මෙම විකල්පය සබල කිරීම සුරක්ෂිත නොවේ (එමෙන්ම මෙය අනුවණ අදහසකි). මෙවà·à¶±à·’ à¶¢à·à¶½à¶ºà¶š මෙම විකල්පය සබල à¶šà¶» à¶­à·à¶¶à·”වහොත් එම proxy යොද෠ගිය https:// වසම් පිළිබද à·ƒà·à¶šà·Šà·‚à·’ හෙළිවිය à·„à·à¶š. à¶’ නිස෠මෙම විකල්පය à·ƒà·à¶¸à·à¶±à·Šâ€à¶ºà¶ºà·™à¶±à·Š à¶…à¶¶à¶½ à¶šà¶» ඇත.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "නිර්නà·à¶¸à·’à¶šà¶­à·à·€ සදහ෠Tor යොදà·à¶œà¶±à·Šà¶±à· සහතික බලන්න.">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"නිර්නà·à¶¸à·’à¶šà¶­à·à·€ උදෙස෠Tor à¶·à·à·€à·’ත෠කරන (Tor à¶…à·€à·à·Šâ€à¶º වන) සහතික පරික්ෂ෠කරන්න">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"මෙම විකල්පය සදහ෠Tor ස්ථà·à¶´à¶±à¶º à¶šà¶» à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š à¶šà¶½ යුතුයි.">
+
+<!ENTITY ssl-observatory.prefs.asn
+"ඔබ නව සහතිකයක් දකිනවිට නිරික්ෂනà·à¶œà·à¶»à¶ºà¶§ ඔබ සම්බන්ධ වී ඇති ISPය පවසන්න.">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"මෙමගින් ඔබේ à¶¢à·à¶½à¶ºà·š &quot;ස්වතන්ත්â€à¶» පද්ධති අංකය&quot; අමුණ෠යවයි. මෙමගින් à¶…à¶´à¶§ HTTPS වලට විරුද්ධව හටගන්න෠ආක්â€à¶»à¶¸à¶« හදුනà·à¶œà·à¶±à·“මටත්, අපගේ à¶¢à·à¶½à¶º කවුරුන් හ෠නිරීක්ෂණය කරන්නේ දà·à¶ºà·’ දà·à¶±à¶œà·à¶±à·“මටත් à¶‹à¶´à¶šà·à¶»à·“ වේ. සිරියà·à·€ හ෠ඉරà·à¶±à¶º à·€à·à¶±à·’ රටවල්වල මෙවà·à¶±à·’ ආක්â€à¶»à¶¸à¶« ඉත෠සුලබ වේ.">
+
+<!ENTITY ssl-observatory.prefs.done "à¶šà·à¶»à·Šà¶ºà¶º ඉටු කරන ලදී">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere මගින් EFF's SSL නිරික්ෂණà·à¶œà·à¶»à¶º à¶·à·à·€à·’à¶­à· à¶šà¶½ à·„à·à¶š. මෙමගින් කර්තව්â€à¶ºà¶ºà¶±à·Š 2 à¶šà·Š සිදුවේ: (1)
+HTTPS සහතිකවල අනුපිටපත් නිරික්ෂණà·à¶œà·à¶»à¶ºà¶§ යà·à·€à·“මෙන්,
+'man in the middle' ආක්â€à¶»à¶¸à¶«à¶º හදුනà·à¶œà·à¶±à·“මට à·„à· à¶¢à·à¶½ ආරක්ෂà·à·€ සදහ෠උපකà·à¶»à·“ වේ; තවද (2)
+මෙමගින් ඔබට à¶…à¶±à·à¶»à¶šà·Šà·‚à·’à¶­ සබà·à¶¯à·’ය෠හ෠ඔබේ à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶»à¶ºà¶§ එල්ලවන ආක්â€à¶»à¶¸à¶«à¶º පිළිබද අනතුරු අගවයි.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"උදà·à·„රණයක් ලෙස ඔබ https://www.something.com නම් වෙබ් අඩවියට ඇතුළු වූ විට,
+නිරික්ෂණà·à¶œà·à¶»à¶ºà¶§ à¶½à·à¶¶à·™à¶± සහතිකයෙන් යම් පුද්ගලයෙක් www.something.com වෙබ් අඩවියට à¶´à·Šâ€à¶»à·€à·šà· වූ à¶¶à·€ සදහන් කෙරුනද,
+ මෙම වෙබ් අඩවියට à¶´à·Šâ€à¶»à·€à·šà· à¶šà¶½ පුද්ගලය෠හ෠එම පුද්ගලය෠නරඹන ලද වෙබ් පිටුවන් පිළිබද තොරතුරු à¶½à·à¶¶à·™à¶±à·Šà¶±à·š à¶±à·à¶­.
+à·€à·à¶©à·’පුර විස්තර දà·à¶±à¶œà·à¶±à·“මට මෙම විකල්ප මත මුසකය තබන්න:">
+
+<!ENTITY ssl-observatory.prefs.hide "à¶´à·Šâ€à¶»à¶œà¶¸à¶± විකල්ප සගවන්න.">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Tor උපයà·à¶¢à·Šâ€à¶º නොවන අවස්ථ෠වලදී ද සහතික පරික්ෂ෠කරන්න.">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"මෙම විකල්පය එතරම් සුරක්ෂිත නොවන නමුදු, ඔබේ දත්ත නිර්නà·à¶¸à·’à¶šà·€ à¶­à¶¶à·à¶œà·à¶±à·“මට à¶…à¶´ උත්සහ කරමු">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"යොමුකිරීමෙන් පසු පොදු -නොවන DNS නම් සදහ෠සහතික පරික්ෂ෠කරන්න ">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"මෙම විකල්පය à¶­à·à¶»à·à¶œà·™à¶± නොමà·à¶­à·’ නම්, නිරික්ෂණà·à¶œà·à¶»à¶º මගින් DNS à¶±à·à¶¸ නිà·à·Šà¶ à¶º කරගà·à¶±à·“මට නොහà·à¶šà·’ සහතික සටහන් කරගන්නේ à¶±à·à¶­. ">
+
+<!ENTITY ssl-observatory.prefs.show "à¶´à·Šâ€à¶»à¶œà¶¸à¶± විකල්පයන් පෙන්වන්න ">
+
+<!ENTITY ssl-observatory.prefs.title "SSL නිරික්ෂණà·à¶œà·à¶» මනà·à¶´ ">
+
+<!ENTITY ssl-observatory.prefs.use "නිරික්ෂණà·à¶œà·à¶»à¶º à¶·à·à·€à·’ත෠කරයි ද?">
+<!ENTITY ssl-observatory.warning.title "EFF à·„à·“ SSL නිරික්ෂණà·à¶œà·à¶»à¶º අවවà·à¶¯à¶ºà¶šà·Š නිකුත් කරයි ">
+<!ENTITY ssl-observatory.warning.showcert "සහතික දà·à¶¸à¶º පෙන්වන්න ">
+<!ENTITY ssl-observatory.warning.okay "මම වටහà·à¶œà¶­à·’මි">
+<!ENTITY ssl-observatory.warning.text "EFF à·„à·“ SSL නිරික්ෂණà·à¶œà·à¶»à¶º මෙම වෙබ් අඩවියෙහි HTTPS සහතික(ය) පිළිබද අවවà·à¶¯à¶ºà¶šà·Š නිකුත් à¶šà¶» ඇත:">
+<!ENTITY ssl-observatory.warning.defense "ඔබ මෙම වෙබ් අඩවියට පුරන වී ඇති නම්, ඔබට සුරක්ෂිත සම්බන්ධතà·à·€à¶šà·Š ඇතිවිට ඔබේ මුරපදය වෙනස් කිරීම වඩ෠උචිත වේ.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"යොමු කිරීමෙන් පසු ස්වයං-අත්සන් යොදන ලද සහතික පරික්ෂ෠කරන්න.">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"මෙය නිර්දේà·à·’තයි; සංකේතන à¶œà·à¶§à¶½à·” ස්‌වයං-අත්සන් කරන ලද à¶‹à¶´à¶šà·Šâ€à¶»à¶¸à·€à¶½ බහුලය.">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sk/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sk/https-everywhere.dtd
new file mode 100644
index 0000000..3ea4ae8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sk/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "O HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "ZaÅ¡ifruj Web! Automatické použitie HTTPS zabezpeÄenia na mnohých stránkach.">
+<!ENTITY https-everywhere.about.version "Verzia">
+<!ENTITY https-everywhere.about.created_by "Autori">
+<!ENTITY https-everywhere.about.librarians "Ruleset Librarians">
+<!ENTITY https-everywhere.about.thanks "PoÄakovanie">
+<!ENTITY https-everywhere.about.contribute "Ak sa Vám páÄi HTTPS Everywhere, môžno by ste mohli">
+<!ENTITY https-everywhere.about.donate_tor "Prispieť na Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "sk">
+<!ENTITY https-everywhere.about.donate_eff "Prispieť na EFF">
+
+<!ENTITY https-everywhere.menu.about "O HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "Nastavenia SSL Observatory">
+<!ENTITY https-everywhere.menu.globalEnable "Povoliť HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Zakázať HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Nastavenia HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "Povoliť všetko">
+<!ENTITY https-everywhere.prefs.disable_all "Zakázať všetko">
+<!ENTITY https-everywhere.prefs.reset_defaults "Obnoviť predvolené">
+<!ENTITY https-everywhere.prefs.search "Hľadať">
+<!ENTITY https-everywhere.prefs.site "Stránka">
+<!ENTITY https-everywhere.prefs.notes "Poznámky">
+<!ENTITY https-everywhere.prefs.list_caption "Ktoré pravidlá pre HTTPS presmerovanie mám použiť?">
+<!ENTITY https-everywhere.prefs.enabled "Povolené">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Môžete sa nauÄiÅ¥ ako napísaÅ¥ svoje vlastné pravidlá (pridaÅ¥ podporu pre ÄalÅ¡ie webové stránky)">
+<!ENTITY https-everywhere.prefs.here_link "tu">
+<!ENTITY https-everywhere.prefs.toggle "Prepnúť">
+<!ENTITY https-everywhere.prefs.reset_default "Obnoviť predvolené">
+<!ENTITY https-everywhere.prefs.view_xml_source "Zobraziť zdroj XML">
+
+<!ENTITY https-everywhere.source.downloading "SÅ¥ahovanie">
+<!ENTITY https-everywhere.source.filename "Názov súboru">
+<!ENTITY https-everywhere.source.unable_to_download "Nie je možné stiahnuť zdroj.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sk/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sk/https-everywhere.properties
new file mode 100644
index 0000000..9ceec89
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sk/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Povoliť HTTPS Everywhere
+https-everywhere.menu.globalDisable = Zakázať HTTPS Everywhere
+https-everywhere.menu.enableDisable = Povoliť / Zakázať Pravidlá
+https-everywhere.menu.noRules = (Pre Túto Stránku Neexistujú Žiadne Pravidlá)
+https-everywhere.menu.unknownRules = (Pravidlá Pre Túto Stránku Sú Neznáme)
+https-everywhere.toolbar.hint = HTTPS Everywhere is now active. You can toggle it on a site-by-site basis by clicking the icon in the address bar.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sk/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sk/ssl-observatory.dtd
new file mode 100644
index 0000000..7fd9f57
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sk/ssl-observatory.dtd
@@ -0,0 +1,100 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Podrobnosti a Informácie o súkromí">
+<!ENTITY ssl-observatory.popup.later "Opýtajte sa ma neskôr">
+<!ENTITY ssl-observatory.popup.no "Nie">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere dokáže detekovať útoky
+na Váš prehliadaÄ tak, že poÅ¡le certifikát, ktorý ste dostali do
+Observatory. Zapnúť túto funkciu?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Má HTTPS Everywhere použiť SSL Observatory?">
+
+<!ENTITY ssl-observatory.popup.yes "Ãno">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Použitie tejto funkcie je bezpeÄné, pokiaľ nepoužívate
+firemnú sieť:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"BezpeÄné, pokiaľ nepoužívate firemnú sieÅ¥ s menami utajených intranetových serverov:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"PoÅ¡li a skontroluj certifikáty podpísané neÅ¡tandardnou koreňovou certifikaÄnou autoritou">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"PovoliÅ¥ túto možnosÅ¥ je bezpeÄné (a aj dobrý nápad) pokiaľ nepoužívate firemnú sieÅ¥ alebo antivírový softvér Kaspersky, ktorý monitoruje VaÅ¡e prehliadanie s TLS proxy a súkromné koreňové certifikaÄné autority. Ak povolíte túto možnosÅ¥ na takejto sieti, tak pomocou unikátnych certifikátov sa môžu uverejniÅ¥ dôkazy o tom aké https:// domény ste navÅ¡tívili cez túto proxy. Tak sme ju nechali v predvolenom nastavení vypnutú.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Skontrolovať certifikát pomocou Tor kvôli anonymite">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Skontrolovať certifikát pomocou Tor kvôli anonymite (vyžaduje Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Aby ste mohli použiť toto nastavenie, musíte mať nainštalovaný Tor a Torbutton">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Ak zistíš nový certifikát, povedz Observatory, ku ktorému poskytovateľovi internetového pripojenia si pripojený">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Toto stiahne a poÅ¡le &quot;Autonomous System Number&quot; VaÅ¡ej siete. Pomôže nám to lokalizovaÅ¥ útok proti HTTPS a urÄiÅ¥ Äi máme pozorovania zo sietí z miest ako je Iran a Syria, kde sú útoky pomerne Äasté.">
+
+<!ENTITY ssl-observatory.prefs.done "Hotovo">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere môže používať SSL Observatory od EFF. Toto spraví dve veci: (1)
+pošle kópie HTTPS certifikátov do Observatory, aby nám pomohli detekovať
+'man in the middle' útoky a zdokonaľovaÅ¥ bezpeÄnosÅ¥ na Webe; a (2)
+umožní nám varovaÅ¥ Vás o nebezpeÄných pripojeniach alebo útokoch na Váš prehliadaÄ.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Napríklad, ak navÅ¡tívite https://www.nieÄo.com, certifikát prijatý pomocou
+Observatory indikuje, že niekto navÅ¡tívil www.nieÄo.com, ale nie kto ju navÅ¡tívil
+alebo Äo konkrétne pozeral. Prejdite kurzorom nad jednotlivé možnosti
+pre ÄalÅ¡ie podrobnosti.">
+
+<!ENTITY ssl-observatory.prefs.hide "SkryÅ¥ pokroÄilé možnosti">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Skontrolujte certifikát, aj keÄ Tor nebude k dispozícií">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Pokúsime sa aj naÄalej udržaÅ¥ dáta anonymné, lenže táto možnosÅ¥ je menej bezpeÄná">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Pošli a skontroluj certifikáty pre neverejné názvy DNS">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Ak je táto voľba aktívna, tak Observatory nebude zaznamenávať certifikáty pre názvy, ktoré nedokáže rozoznať pomocou systému DNS.">
+
+<!ENTITY ssl-observatory.prefs.show "UkázaÅ¥ pokroÄilé možnosti">
+
+<!ENTITY ssl-observatory.prefs.title "Nastavenia SSL Observatory">
+
+<!ENTITY ssl-observatory.prefs.use "Použiť Observatory?">
+<!ENTITY ssl-observatory.warning.title "VAROVANIE od EFF SSL Observatory">
+<!ENTITY ssl-observatory.warning.showcert "Zobraziť reťaz certifikátov">
+<!ENTITY ssl-observatory.warning.okay "Porozumel som">
+<!ENTITY ssl-observatory.warning.text "EFF's SSL Observatory vydalo varovanie o HTTPS certifikáte(certifikátoch) pre túto stránku:">
+<!ENTITY ssl-observatory.warning.defense "Ak ste prihlásený na tejto stránke, tak sa odporúÄa, aby ste si zmenili heslo hneÄ ako budete maÅ¥ bezpeÄné pripojenie">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Posielať a preverovať certifikáty podpísané samé sebou">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Toto sa odporúÄa; kryptografické problémy sú veľmi Äasté u vstavaných zariadení, ktoré sú podpísané samé sebou">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sl/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sl/https-everywhere.dtd
new file mode 100644
index 0000000..13bbd7d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sl/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "O HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Zakodirajte internet! Samodejno uporabite HTTPS zaÅ¡Äito na mnogih spletnih straneh.">
+<!ENTITY https-everywhere.about.version "RazliÄica">
+<!ENTITY https-everywhere.about.created_by "Izdelal">
+<!ENTITY https-everywhere.about.librarians "Izdelovalci pravil">
+<!ENTITY https-everywhere.about.thanks "Zahvala">
+<!ENTITY https-everywhere.about.contribute "ÄŒe vam je HTTPS Everywhere vÅ¡eÄ, razmislite o">
+<!ENTITY https-everywhere.about.donate_tor "donaciji za Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "donaciji za EFF">
+
+<!ENTITY https-everywhere.menu.about "O HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "Nastavitve SSL Observatorija">
+<!ENTITY https-everywhere.menu.globalEnable "OmogoÄi HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "OnemogoÄi HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Nastavitve HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "OmogoÄi vse">
+<!ENTITY https-everywhere.prefs.disable_all "OnemogoÄi vse">
+<!ENTITY https-everywhere.prefs.reset_defaults "Ponastavi na privzeto">
+<!ENTITY https-everywhere.prefs.search "IÅ¡Äi">
+<!ENTITY https-everywhere.prefs.site "Stran">
+<!ENTITY https-everywhere.prefs.notes "Opombe">
+<!ENTITY https-everywhere.prefs.list_caption "Katera pravila za preusmeritev HTTPS naj bodo upoštevana?">
+<!ENTITY https-everywhere.prefs.enabled "OmogoÄeno">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Lahko se nauÄite pisati svoja pravila (da dodate podporo za druge spletne strani)">
+<!ENTITY https-everywhere.prefs.here_link "tukaj">
+<!ENTITY https-everywhere.prefs.toggle "Preklopi">
+<!ENTITY https-everywhere.prefs.reset_default "Ponastavi na privzeto">
+<!ENTITY https-everywhere.prefs.view_xml_source "Ogled XML kode">
+
+<!ENTITY https-everywhere.source.downloading "Prenos">
+<!ENTITY https-everywhere.source.filename "Ime datoteke">
+<!ENTITY https-everywhere.source.unable_to_download "Ne morem prenesti izvora.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sl/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sl/https-everywhere.properties
new file mode 100644
index 0000000..f70d2ee
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sl/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = OmogoÄi HTTPS Everywhere
+https-everywhere.menu.globalDisable = OnemogoÄi HTTPS Everywhere
+https-everywhere.menu.enableDisable = OmogoÄi / OnemogoÄi pravila
+https-everywhere.menu.noRules = (Za to stran ni pravil)
+https-everywhere.menu.unknownRules = (Pravila za to stran neznana)
+https-everywhere.toolbar.hint = HTTPS Everywhere je sedaj aktiven. Za posamezne spletne strani ga lahko preklapljate s klikom na ikono v naslovni vrstici.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sl/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sl/ssl-observatory.dtd
new file mode 100644
index 0000000..26917a3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sl/ssl-observatory.dtd
@@ -0,0 +1,97 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Podrobnosti in informacije o zasebnosti">
+<!ENTITY ssl-observatory.popup.later "Vprašaj me kasneje">
+<!ENTITY ssl-observatory.popup.no "Ne">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere lahko zazna napade
+na vaš brskalnik tako, da pošlje certifikate ki jih prejmete v
+Observatorij. Želite to vkljuÄiti?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Ali naj HTTPS Everywhere uporablja SSL Observatorij?">
+
+<!ENTITY ssl-observatory.popup.yes "Da">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"OmogoÄanje tega je varno, razen Äe uporabljate zelo
+vsiljivo poslovno omrežje:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Varno, razen Äe uporabljate poslovno omrežje s tajnimi imeni lokalnih strežnikov:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Predloži in preveri certifikate nestandardnih overoviteljev">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"OmogoÄanje tega je varno (in priporoÄljivo), razen Äe uporabljate vsiljivo poslovno omrežje ali protivirusni program Kaspersky, ki spremlja vaÅ¡e brskanje s TLS proksijem in privatnim overoviteljem certifikatov. ÄŒe je omogoÄeno v takem omrežju lahko ta možnost objavi dokazila o tem, katere https:// domene so bile obiskane preko tega proksija, ker bi ustvarila edinstvene certifikate. Zato je to privzeto izkljuÄeno.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Anonimno preveri certifikate preko omrežja Tor">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Anonimno preveri certifikate preko omrežja Tor (potrebuje Tor)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Za to možnost mora biti Tor nameÅ¡Äen in zagnan">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Ko zasledite nov certifikat povejte Observatoriju h kateremu internetnemu ponudniku ste prikljuÄeni">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"To bo pridobilo in poslalo &quot;Avtonomno Å¡tevilko sistema&quot; (ASN) vaÅ¡ega omrežja. To nam bo pomagalo locirati napade na HTTPS in doloÄiti, ali so opažanja iz omrežij na podroÄjih kot so Iran in Sirija, kjer so napadi razmeroma pogosti.">
+
+<!ENTITY ssl-observatory.prefs.done "KonÄano">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere lahko uporablja EFF SSL Observatorij. S tem naredi dvoje: (1)
+pošlje kopije HTTPS certifikatov observatoriju, da nam pomaga odkriti napade 'man in the middle' in izboljšati varnost medmrežja; (2)
+nam omogoÄi, da vas opozorimo na nevarne povezave ali napade na vaÅ¡ brskalnik.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Ko na primer obiÅ¡Äete https://www.nekadomena.com bo certifikat, ki ga sprejme observatorij, nakazal, da je nekdo obiskal www.nekadomena.com, ne pa kdo je to bil ali katero stran si je ogledal.
+Pridržite miÅ¡ko nad možnosti za veÄ podrobnosti:">
+
+<!ENTITY ssl-observatory.prefs.hide "Skrij napredne možnosti">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Preveri certifikate tudi Äe ni Tor omrežja">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Poskušali bomo ohraniti anonimnost podatkov, vendar je ta možnost manj varna">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Predloži in preveri certifikate za ne-javna imena DNS">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"ÄŒe je ta možnost ni izbrana, observatorij ne bo zabeležil potrdil za imena, ki jih ni mogoÄe razkriti s sistemom DNS.">
+
+<!ENTITY ssl-observatory.prefs.show "Pokaži napredne možnosti">
+
+<!ENTITY ssl-observatory.prefs.title "Nastavitve SSL Observatorija">
+
+<!ENTITY ssl-observatory.prefs.use "Uporabim Observatorij?">
+<!ENTITY ssl-observatory.warning.title "OPOZORILO s strani EFF SSL Observatorija">
+<!ENTITY ssl-observatory.warning.showcert "Pokaži certifikatno verigo">
+<!ENTITY ssl-observatory.warning.okay "Razumem">
+<!ENTITY ssl-observatory.warning.text "EFF SSL Observatorij je izdal opozorilo za HTTPS certifikat(e) za to stran:">
+<!ENTITY ssl-observatory.warning.defense "ÄŒe ste vpisani na tej strani je priporoÄljivo, da spremenite geslo, ko boste varno povezani.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Predložite in preverite samopodpisana potrdila">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"To je priporoÄljivo; težave s Å¡ifriranjem so posebej pogoste pri samopodpisanih vgnezdenih napravah.">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sv/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sv/https-everywhere.dtd
new file mode 100644
index 0000000..e43cae0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sv/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Om HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Kryptera webben! Använd HTTPS automatiskt på många sidor.">
+<!ENTITY https-everywhere.about.version "Version">
+<!ENTITY https-everywhere.about.created_by "Skapat av">
+<!ENTITY https-everywhere.about.librarians "Regelförfattare">
+<!ENTITY https-everywhere.about.thanks "Tack till">
+<!ENTITY https-everywhere.about.contribute "Om du gillar HTTPS Everywhere, kanske du kan tänka dig">
+<!ENTITY https-everywhere.about.donate_tor "Donera till Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "Donera till EFF">
+
+<!ENTITY https-everywhere.menu.about "Om HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL observerings inställningar">
+<!ENTITY https-everywhere.menu.globalEnable "Aktivera HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Inaktivera HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Visa räknare">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere: Inställningar">
+<!ENTITY https-everywhere.prefs.enable_all "Aktivera alla">
+<!ENTITY https-everywhere.prefs.disable_all "Inaktivera alla">
+<!ENTITY https-everywhere.prefs.reset_defaults "Återställ till standardvärden">
+<!ENTITY https-everywhere.prefs.search "Sök">
+<!ENTITY https-everywhere.prefs.site "Sida">
+<!ENTITY https-everywhere.prefs.notes "Kommentarer">
+<!ENTITY https-everywhere.prefs.list_caption "Vilka HTTPS omdirigerings regler skall gälla?">
+<!ENTITY https-everywhere.prefs.enabled "Aktiverad">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Du kan lära dig att skriva egna regler (för att lägga till stöd för andra sidor">
+<!ENTITY https-everywhere.prefs.here_link "här">
+<!ENTITY https-everywhere.prefs.toggle "Växla">
+<!ENTITY https-everywhere.prefs.reset_default "Återställ till standardvärden">
+<!ENTITY https-everywhere.prefs.view_xml_source "Visa XML källa">
+
+<!ENTITY https-everywhere.source.downloading "Laddar ner">
+<!ENTITY https-everywhere.source.filename "Filnamn">
+<!ENTITY https-everywhere.source.unable_to_download "Kan inte ladda ner.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Hoppsan. Du använde den stabila versionen av HTTPS Everywhere, men vi har kanske av misstag uppdaterat dig till utvecklingsversionen i den senaste publiceringen.">
+<!ENTITY https-everywhere.popup.paragraph2 "Vill du gå tillbaka till den stabila versionen?">
+<!ENTITY https-everywhere.popup.paragraph3 "Vi skulle vara tacksamma ifall du fortsatte använda utvecklingsversionen och hjälpte oss göra HTTPS Everywhere ännu bättre! Du kanske hittar någon bugg här och där, som du kan rapportera till https-everywhere@eff.org. Vi ber om ursäkt för besväret. Tack för att du använder HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Fortsätt använda utvecklingsversionen">
+<!ENTITY https-everywhere.popup.revert "Ladda ner den senaste stabila versionen">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "Testa alla HTTPS Everywhere regler">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Avbryt">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Starta">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sv/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sv/https-everywhere.properties
new file mode 100644
index 0000000..fb1cb14
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sv/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Aktivera HTTPS Everywhere
+https-everywhere.menu.globalDisable = Inaktivera HTTPS Everywhere
+https-everywhere.menu.enableDisable = Aktivera / inaktivera regler
+https-everywhere.menu.noRules = (Inga Regler för Denna Sida)
+https-everywhere.menu.unknownRules = (Regler för Denna Sida Okänt)
+https-everywhere.toolbar.hint = HTTPS Everywhere är nu aktivt. Du kan ändra aktivera / inaktivera det per sida genom att klicka på ikonen i adressfältet.
+https-everywhere.migration.notification0 = För att implementera en kritiskt fix, åteställer denna uppdatering dina HTTPS Everywhere regelinställningar till dereas standardvärden.
+https-everywhere.menu.ruleset-tests = Kör alla regel tester för HTTPS Everywhere.
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sv/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sv/ssl-observatory.dtd
new file mode 100644
index 0000000..4cfac8b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/sv/ssl-observatory.dtd
@@ -0,0 +1,100 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Details and Privacy Information">
+<!ENTITY ssl-observatory.popup.later "Ask Me Later">
+<!ENTITY ssl-observatory.popup.no "No">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere can detect attacks
+against your browser by sending the certificates you receive to the
+Observatory. Turn this on?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Should HTTPS Everywhere use the SSL Observatory?">
+
+<!ENTITY ssl-observatory.popup.yes "Yes">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"It is safe to enable this, unless you use a very
+intrusive corporate network:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Safe, unless you use a corporate network with secret intranet server names:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Submit and check certificates signed by non-standard root CAs">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"It is safe (and a good idea) to enable this option, unless you use an intrusive corporate network that monitors your browsing with a TLS proxy and a private root Certificate Authority. If enabled on such a network, this option might publish evidence of which https:// domains were being visited through that proxy, because of the unique certificates it would produce. So we leave it off by default.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Check certificates using Tor for anonymity">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Check certificates using Tor for anonymity (requires Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"This option requires Tor and Torbutton to be installed">
+
+<!ENTITY ssl-observatory.prefs.asn
+"When you see a new certificate, tell the Observatory which ISP you are connected to">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"This will fetch and send the &quot;Autonomous System number&quot; of your network. This will help us locate attacks against HTTPS, and to determine whether we have observations from networks in places like Iran and Syria where attacks are comparatively common.">
+
+<!ENTITY ssl-observatory.prefs.done "Done">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere can use EFF's SSL Observatory. This does two things: (1)
+sends copies of HTTPS certificates to the Observatory, to help us
+detect 'man in the middle' attacks and improve the Web's security; and (2)
+lets us warn you about insecure connections or attacks on your browser.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"For example, when you visit https://www.something.com, the certificate
+received by the Observatory will indicate that somebody visited
+www.something.com, but not who visited the site, or what specific page they
+looked at. Mouseover the options for further details:">
+
+<!ENTITY ssl-observatory.prefs.hide "Hide advanced options">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Check certificates even if Tor is not available">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"We will still try to keep the data anonymous, but this option is less secure">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Submit and check certificates for non-public DNS names">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Unless this option is checked, the Observatory will not record certificates for names that it cannot resolve through the DNS system.">
+
+<!ENTITY ssl-observatory.prefs.show "Show advanced options">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Observatory Preferences">
+
+<!ENTITY ssl-observatory.prefs.use "Use the Observatory?">
+<!ENTITY ssl-observatory.warning.title "WARNING from EFF's SSL Observatory">
+<!ENTITY ssl-observatory.warning.showcert "Show the certificate chain">
+<!ENTITY ssl-observatory.warning.okay "I understand">
+<!ENTITY ssl-observatory.warning.text "EFF's SSL Observatory has issued a warning about the HTTPS certificiate(s) for this site:">
+<!ENTITY ssl-observatory.warning.defense "If you are logged in to this site, it may be advisable to change your password once you have a safe connection.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Skicka och kolla själv-signerade certifikat">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Detta är rekommenderat; kryptografiska problem är särskilt vanliga i själv-signerad inbäddad utrustning">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/tr/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/tr/https-everywhere.dtd
new file mode 100644
index 0000000..e686d19
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/tr/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Hakkında">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "İnternet'i şifrele ! Bir çok sitede otomatik olarak HTTPS kullan.">
+<!ENTITY https-everywhere.about.version "Sürüm">
+<!ENTITY https-everywhere.about.created_by "Yaratıcı">
+<!ENTITY https-everywhere.about.librarians "Kural Seti Kütüphaneleri">
+<!ENTITY https-everywhere.about.thanks "Teşekkürler">
+<!ENTITY https-everywhere.about.contribute "EÄŸer HTTPS Everywhere'i sevdiysen, sen de destek olabilirsin">
+<!ENTITY https-everywhere.about.donate_tor "Tor'a bağışla">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "EFF'e bağışla">
+
+<!ENTITY https-everywhere.menu.about "Hakkında">
+<!ENTITY https-everywhere.menu.observatory "SSL Gözlemcisi Tercihleri">
+<!ENTITY https-everywhere.menu.globalEnable "EtkinleÅŸtir">
+<!ENTITY https-everywhere.menu.globalDisable "Devre Dışı Bırak">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere Tercihleri">
+<!ENTITY https-everywhere.prefs.enable_all "Tümünü Etkinleştir">
+<!ENTITY https-everywhere.prefs.disable_all "Tümünü Devre Dışı Bırak">
+<!ENTITY https-everywhere.prefs.reset_defaults "Varsayılana Dön">
+<!ENTITY https-everywhere.prefs.search "Ara">
+<!ENTITY https-everywhere.prefs.site "Site">
+<!ENTITY https-everywhere.prefs.notes "Notlar">
+<!ENTITY https-everywhere.prefs.list_caption "Hangi HTTPS yönlendirme kuralları etkin olarak uygulansın?">
+<!ENTITY https-everywhere.prefs.enabled "Etkin">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Kendi kural setini nasıl yazabileceğini">
+<!ENTITY https-everywhere.prefs.here_link "öğrenebilirsin.">
+<!ENTITY https-everywhere.prefs.toggle "DeÄŸiÅŸtir">
+<!ENTITY https-everywhere.prefs.reset_default "Varsayılana Dön">
+<!ENTITY https-everywhere.prefs.view_xml_source "XML Kaynağını Görüntüle">
+
+<!ENTITY https-everywhere.source.downloading "İndiriliyor">
+<!ENTITY https-everywhere.source.filename "Dosya Adı">
+<!ENTITY https-everywhere.source.unable_to_download "Kaynak indirmeye uygun deÄŸil">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/tr/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/tr/https-everywhere.properties
new file mode 100644
index 0000000..37182cf
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/tr/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = EtkinleÅŸtir
+https-everywhere.menu.globalDisable = Devre dışı
+https-everywhere.menu.enableDisable = Kuralları Aç / Kapa
+https-everywhere.menu.noRules = (Bu sayfa için hiçbir kural yok)
+https-everywhere.menu.unknownRules = (Bu sayfa için hangi kuralların kullanılacağı bilinmiyor)
+https-everywhere.toolbar.hint = HTTPS Everywhere şuan etkin. Adres çubuğundaki simgeye tıklayarak istediğiniz sitelerde etkinliğini değiştirebilirsiniz.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/tr/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/tr/ssl-observatory.dtd
new file mode 100644
index 0000000..f9fd37c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/tr/ssl-observatory.dtd
@@ -0,0 +1,96 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Detaylar ve Gizlilik Bilgileri">
+<!ENTITY ssl-observatory.popup.later "Daha Sonra Sor">
+<!ENTITY ssl-observatory.popup.no "Hayır">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere tarayıcınıza
+karşı yapılacak saldırıları Gözlemci'ye alır.
+Bu özelliği aktif etmek ister misiniz?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"HTTPS Everywhere SSL Gözlemcisini kullansın mı?">
+
+<!ENTITY ssl-observatory.popup.yes "Evet">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Elverişsiz bir şirket ağı kullanmıyorsanız,
+etkinleştirmek sizin için güvenlidir.">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Güvenli, gizli intranet şirket sunucularını kullanmadığınız sürece:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Geçerli bir otorite tarafından imzalanmamış sertifikaları gönder ve kontrol et">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Eğer ki TLS proxy veya özel kök Sertifika Otoritesi ile internet gezintilerini gözlemleyebilen Kaspersky antivirüs yazılımı ya da araya girilebilen bir şirket ağı kullanmıyorsanız bu özelliği etkinleştirmek güvenlidir (ve akıllıca), Eğer ağ üzerinde bunlar etkinse, bu seçenek eşsiz sertifikalar verdiğinden vekil sunucu üzerinden https:// adreslerine eriştiğinize kanıt olmuşturur. Dolayısıyla varsayılan ayarlarda kapalı bıraktık.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Gizliliğim için Tor kullanırken de sertifikaları kontrol et">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Gizliliğim için Tor kullanırken de sertifikaları kontrol et (Torbutton gerektirir)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Bu özellik Tor ve Torbutton'un yüklü olmasını gerektirir.">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Yeni bir sertifika gördüğünde, hangi ISS'den bağlandığımı Gözlemci'ye bildir">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Bu ağın &quot;Özerk Sistemi numarası&quot; alıp göndereceğiz. Bu bize HTTPS'e karşı gerçekleştirilen yerel saldırıları belirlemekte ve nispeten İran ve Suriye gibi yerlerde ağlara karşı gözlemler olup olmadığını belirlemek için yardımcı olacaktır.">
+
+<!ENTITY ssl-observatory.prefs.done "Tamamlandı">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere EFF'nin SSL Gözlemcisini kullanır. Gözlemci iki olay gerçekleştirir:(1)
+HTTPS sertifikalarının kopyalarını Gözlemci'ye yollar ki MITM saldırılarının tespitinde yardım edelim, internet güvenliğini geliştirebilelim; ve (2)
+seni güvensiz bağlantılar hakkında uyarabilelim.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Örneğin, https://www.hack4career.com adresini ziyaret ettiğinde ve eğer ki sayfayı daha önce hiç kimse ziyaret etmemişse sertifika Gözlemci tarafından ileride bu siteyi ziyaret edecekler için alınır. Daha fazla bilgi için aşağıdan gözlemciyi aktif etmelisiniz:">
+
+<!ENTITY ssl-observatory.prefs.hide "Gelişmiş ayarları gizle">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Tor uygun olmadığında dahi sertifikaları kontrol et">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Verilerini anonim tutmaya çalışıyoruz, ama bu özellik pek güvenli değil">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Özel DNS isimleri için olan sertifikaları gönder ve kontrol et">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Bu seçenek işaretlenmediği sürece, Gözlemci DNS sistemleri üzerinden çözümleyemediği sertifika isimlerini kaydetmeyecektir.">
+
+<!ENTITY ssl-observatory.prefs.show "Gelişmiş ayarları göster">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Gözlemci Tercihleri">
+
+<!ENTITY ssl-observatory.prefs.use "Gözlemci kullanılsın mı?">
+<!ENTITY ssl-observatory.warning.title " EFF'in SSL Gözlemcisi'nden UYARI">
+<!ENTITY ssl-observatory.warning.showcert "Sertifika zincirini göster">
+<!ENTITY ssl-observatory.warning.okay "Anladım">
+<!ENTITY ssl-observatory.warning.text "EFF SSL Gözlemcisi bu sitenin HTTPS serfikası (ları) hakkında bir sorun olduğunu belirtiyor:">
+<!ENTITY ssl-observatory.warning.defense "Eğer bu siteye giriş yaptıysan, güvenli bir bağlantı sağlandığında site sana şifreni değiştirmeni tavsiye edebilir.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Kendinden imzalı sertifikaları gönder ve kontrol et">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Bu bir öneridir; özellikle kendinden imzalanmış gömülü cihazlarda şifreleme problemleri mevcut ">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/https-everywhere.dtd
new file mode 100644
index 0000000..d53c43c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "关于 HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "加密网络æµè§ˆï¼Œè‡ªåŠ¨ä½¿ç”¨ HTTPS 连接访问站点,更加安全。">
+<!ENTITY https-everywhere.about.version "版本">
+<!ENTITY https-everywhere.about.created_by "创建者">
+<!ENTITY https-everywhere.about.librarians "规则管ç†å‘˜">
+<!ENTITY https-everywhere.about.thanks "致谢">
+<!ENTITY https-everywhere.about.contribute "如果喜欢 HTTPS Everywhere,您å¯ä»¥è€ƒè™‘">
+<!ENTITY https-everywhere.about.donate_tor "æåŠ© Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "æåŠ©ç”µå­å‰çº¿åŸºé‡‘会 (EFF)">
+
+<!ENTITY https-everywhere.menu.about "关于 HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL Observatory 首选项">
+<!ENTITY https-everywhere.menu.globalEnable "å¯ç”¨ HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "ç¦ç”¨ HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere 首选项">
+<!ENTITY https-everywhere.prefs.enable_all "全部å¯ç”¨">
+<!ENTITY https-everywhere.prefs.disable_all "全部ç¦ç”¨">
+<!ENTITY https-everywhere.prefs.reset_defaults "é‡ç½®ä¸ºé»˜è®¤å€¼">
+<!ENTITY https-everywhere.prefs.search "æœç´¢">
+<!ENTITY https-everywhere.prefs.site "站点">
+<!ENTITY https-everywhere.prefs.notes "注释">
+<!ENTITY https-everywhere.prefs.list_caption "应用哪些 HTTPS é‡å®šå‘规则?">
+<!ENTITY https-everywhere.prefs.enabled "å·²å¯ç”¨">
+<!ENTITY https-everywhere.prefs.ruleset_howto "您å¯ä»¥å­¦ä¹ å¦‚何编写您自己的规则(以增加对其他网站的支æŒï¼‰">
+<!ENTITY https-everywhere.prefs.here_link "这里">
+<!ENTITY https-everywhere.prefs.toggle "切æ¢">
+<!ENTITY https-everywhere.prefs.reset_default "é‡ç½®ä¸ºé»˜è®¤å€¼">
+<!ENTITY https-everywhere.prefs.view_xml_source "查看 XML æ ¼å¼çš„æºä»£ç ">
+
+<!ENTITY https-everywhere.source.downloading "正在下载">
+<!ENTITY https-everywhere.source.filename "文件å">
+<!ENTITY https-everywhere.source.unable_to_download "无法下载æºä»£ç ã€‚">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 通知">
+<!ENTITY https-everywhere.popup.paragraph1 "抱歉,你之å‰ç”¨çš„æ˜¯ HTTPS Everywhere 稳定版,在上次å‘布时,我们å¯èƒ½ä¸å°å¿ƒå°†ä½ ç”¨çš„版本å‡çº§ä¸ºå¼€å‘版。">
+<!ENTITY https-everywhere.popup.paragraph2 "是å¦éœ€è¦æ¢ä¸ºç¨³å®šç‰ˆï¼Ÿ">
+<!ENTITY https-everywhere.popup.paragraph3 "如果您愿æ„,我们éžå¸¸æ¬¢è¿Žæ‚¨ç»§ç»­ä½¿ç”¨æˆ‘们的开å‘版本,并以此帮助我们改善 HTTPS Everywhereï¼æ‚¨ä¹Ÿè®¸ä¼šé‡åˆ°æ›´å¤šçš„缺陷问题,您å¯ä»¥æŠ¥å‘Šåˆ° https-everywhere@eff.org。对此带æ¥çš„ä¸ä¾¿æˆ‘们深感抱歉,感谢您使用 HTTPS Everywhere。">
+<!ENTITY https-everywhere.popup.keep "我è¦ç»§ç»­ä½¿ç”¨å¼€å‘版">
+<!ENTITY https-everywhere.popup.revert "下载最新稳定版">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/https-everywhere.properties
new file mode 100644
index 0000000..0e24891
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = å¯ç”¨ HTTPS Everywhere
+https-everywhere.menu.globalDisable = ç¦ç”¨ HTTPS Everywhere
+https-everywhere.menu.enableDisable = å¯ç”¨/ç¦ç”¨è§„则
+https-everywhere.menu.noRules = ï¼ˆæœ¬é¡µé¢æ— è§„则)
+https-everywhere.menu.unknownRules = (此页é¢è§„则未知)
+https-everywhere.toolbar.hint = HTTPS Everywhere 当å‰å·²æ¿€æ´»ã€‚æ ¹æ®æ¯ä¸ªç½‘站,å¯ç‚¹å‡»åœ°å€æ ä¸­å›¾æ ‡å¯ç”¨æˆ–ç¦ç”¨è¯¥åŠŸèƒ½ã€‚
+https-everywhere.migration.notification0 = 为了部署é‡è¦ä¿®è®¢ï¼Œè¯¥æ›´æ–°å°† HTTPS Everywhere 规则å好é‡ç½®ä¸ºé»˜è®¤å€¼ã€‚
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/ssl-observatory.dtd
new file mode 100644
index 0000000..6998aa6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/ssl-observatory.dtd
@@ -0,0 +1,98 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "详情与éšç§ä¿¡æ¯">
+<!ENTITY ssl-observatory.popup.later "以åŽå†è¯´">
+<!ENTITY ssl-observatory.popup.no "å¦">
+
+<!ENTITY ssl-observatory.popup.text "通过将接收到的è¯ä¹¦
+æäº¤è‡³ Observatory,HTTPS Everywhere 能够检测针对æµè§ˆå™¨çš„æ”»å‡»ã€‚
+是å¦å¯ç”¨è¯¥åŠŸèƒ½ï¼Ÿ">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"是å¦å…许 HTTPS Everywhere 使用 SSL Observatory?">
+
+<!ENTITY ssl-observatory.popup.yes "是">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"å¯ç”¨è¿™ä¸ªåŠŸèƒ½æ˜¯å®‰å…¨çš„ï¼Œé™¤éžä½ æ‰€ç”¨çš„æ˜¯é«˜ä¾µå…¥æ€§çš„ä¼ä¸šç½‘络:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"å®‰å…¨ï¼Œé™¤éžæ‰€ç”¨çš„ä¼ä¸šç½‘络具有加密的内部网æœåС噍å称:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"æäº¤å¹¶æ£€æŸ¥ç”±éžæ ‡å‡†æ ¹ CA 所签åçš„è¯ä¹¦">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"å¯ç”¨æ­¤é€‰é¡¹æ˜¯å®‰å…¨ï¼ˆè€Œä¸”æœ‰ç›Šçš„ï¼‰ï¼Œé™¤éžæ‰€ç”¨çš„æ˜¯é«˜ä¾µå…¥æ€§çš„å…¬å¸ç½‘络,或者使用å¡å·´æ–¯åŸºé˜²ç—…毒软件通过本地 TLS 代ç†ä¸Žç§æœ‰æ ¹è¯ä¹¦è®¤è¯æ–¹æ£€æµ‹äº’è”网æµè§ˆè¡Œä¸ºã€‚对于这样的网络,由于生æˆçš„æ•°å­—è¯ä¹¦æ˜¯å”¯ä¸€çš„,å¯ç”¨è¯¥é€‰é¡¹å¯èƒ½å°†å…¬å¼€é€šè¿‡è¯¥ä»£ç†è®¿é—®çš„ https:// 网域å称,因此默认关闭该功能。">
+
+<!ENTITY ssl-observatory.prefs.anonymous "通过 Tor 网络进行数字è¯ä¹¦çš„æ£€æŸ¥ï¼Œä»¥ä¿æŠ¤åŒ¿å性">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"通过 Tor 网络进行数字è¯ä¹¦çš„æ£€æŸ¥ï¼Œä»¥ä¿æŠ¤åŒ¿åæ€§ï¼ˆéœ€è¦æœ‰ Tor)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"此选项需è¦å·²ç»å®‰è£…å¹¶è¿è¡Œ Tor">
+
+<!ENTITY ssl-observatory.prefs.asn
+"é‡åˆ°æ–°çš„æ•°å­—è¯ä¹¦æ—¶ï¼Œé€šçŸ¥ Observatory 当å‰ä½¿ç”¨çš„互è”网æœåŠ¡æä¾›å•† (ISP)">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"这将抓å–网络的“自治系统å·ç â€(Autonomous System number)。这将有助于找出对 HTTPS å‘动攻击的æºå¤´ï¼Œå¹¶åˆ¤æ–­åœ¨æ”»å‡»ç›¸å¯¹å¸¸è§çš„地区网络上,如伊朗和å™åˆ©äºšï¼Œæˆ‘们是å¦å…·æœ‰è§‚测数æ®ã€‚">
+
+<!ENTITY ssl-observatory.prefs.done "完æˆ">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere å¯ä»¥ä½¿ç”¨ EFF çš„ SSL 观测站 。 这有两个功能:
+(1) å°† HTTPS æ•°å­—è¯ä¹¦å¯„é€åˆ°è§‚测站,以å助我们侦测中间人å¼çš„æ”»å‡»
+并改善网络的安全性;
+(2) 针对ä¸å®‰å…¨çš„连接以åŠå¯¹ä½ çš„æµè§ˆå™¨è¿›è¡Œçš„æ”»å‡»ï¼Œå‘ä½ å‘出警告。">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"例如,在访问 https://www.something.com 时,观测站收到的数字è¯ä¹¦æ˜¾ç¤º
+æŸäººè®¿é—®äº† www.something.com,但ä¸ä¼šæ˜¾ç¤ºæ˜¯è°è®¿é—®äº†è¯¥ç«™ç‚¹æˆ–者æµè§ˆäº†
+哪些页é¢ã€‚将鼠标移至该选项å¯äº†è§£æ›´å¤šè¯¦ç»†ä¿¡æ¯ï¼š">
+
+<!ENTITY ssl-observatory.prefs.hide "éšè—高级选项">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"在没有 Tor 网络的情况下ä¾ç„¶æ£€æŸ¥æ•°å­—è¯ä¹¦">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"我们ä»å°†å°½åŠ›ç¡®ä¿æ•°æ®çš„åŒ¿åæ€§ï¼Œä½†è¯¥é€‰é¡¹çš„安全性较低">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"æäº¤å¹¶æ£€æŸ¥éžå…¬å¼€ DNS å称的数字è¯ä¹¦">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"除éžå‹¾é€‰è¯¥é€‰é¡¹ï¼Œå¦åˆ™è§‚测站将ä¸ä¼šè®°å½•通过 DNS 系统无法解æžåŸŸåçš„è¯ä¹¦ã€‚">
+
+<!ENTITY ssl-observatory.prefs.show "显示高级选项">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Observatory 首选项">
+
+<!ENTITY ssl-observatory.prefs.use "是å¦ä½¿ç”¨è§‚测站?">
+<!ENTITY ssl-observatory.warning.title "EFF çš„ SSL 观测站å‘布的警告">
+<!ENTITY ssl-observatory.warning.showcert "显示数字è¯ä¹¦é“¾">
+<!ENTITY ssl-observatory.warning.okay "我已了解">
+<!ENTITY ssl-observatory.warning.text "EFF çš„ SSL 观测站已对该 HTTPS æ•°å­—è¯ä¹¦å‘出警告:">
+<!ENTITY ssl-observatory.warning.defense "如果已登录该站点,在使用安全连接时,å¯èƒ½å»ºè®®ä½ ä¿®æ”¹è¯¥ç«™ç‚¹çš„密ç ã€‚">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"æäº¤å¹¶æ£€æŸ¥è‡ªç­¾åè¯ä¹¦">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"我们推è该选项;在自签å的嵌入å¼è®¾å¤‡ä¸­ï¼ŒåŠ å¯†é—®é¢˜å°¤ä¸ºå¸¸è§">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/https-everywhere.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/https-everywhere.dtd
new file mode 100644
index 0000000..1b56a63
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/https-everywhere.dtd
@@ -0,0 +1,49 @@
+<!ENTITY https-everywhere.about.title "關於 HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Encrypt the Web! Automatically use HTTPS security on many sites.
+ä½¿ç¶²è·¯åŠ å¯†ï¼æ–¼çœ¾å¤šç¶²ç«™ä¸Šè‡ªå‹•使用 HTTPS 安全連線。">
+<!ENTITY https-everywhere.about.version "版本">
+<!ENTITY https-everywhere.about.created_by "建立於">
+<!ENTITY https-everywhere.about.librarians "è¦å‰‡åº«ç®¡ç†">
+<!ENTITY https-everywhere.about.thanks "致è¬">
+<!ENTITY https-everywhere.about.contribute "若喜歡 HTTPS Everywhere,或許您å¯ä»¥è€ƒæ…®">
+<!ENTITY https-everywhere.about.donate_tor "贊助 Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "zh-TW">
+<!ENTITY https-everywhere.about.donate_eff "贊助 EFF">
+
+<!ENTITY https-everywhere.menu.about "關於 HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL 觀測站å好設定">
+<!ENTITY https-everywhere.menu.globalEnable "啟用 HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "åœç”¨ HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere å好設定">
+<!ENTITY https-everywhere.prefs.enable_all "全部啟用">
+<!ENTITY https-everywhere.prefs.disable_all "全部åœç”¨">
+<!ENTITY https-everywhere.prefs.reset_defaults "æ¢å¾©é è¨­å€¼">
+<!ENTITY https-everywhere.prefs.search "æœå°‹">
+<!ENTITY https-everywhere.prefs.site "網站">
+<!ENTITY https-everywhere.prefs.notes "備註">
+<!ENTITY https-everywhere.prefs.list_caption "è¦ä½¿ç”¨å“ªäº› HTTPS å°Žå‘è¦å‰‡ï¼Ÿ">
+<!ENTITY https-everywhere.prefs.enabled "已啟用">
+<!ENTITY https-everywhere.prefs.ruleset_howto "è¦äº†è§£å¦‚何編寫自訂è¦å‰‡(以增加å°å…¶ä»–網站的支æ´)">
+<!ENTITY https-everywhere.prefs.here_link "請看這裡">
+<!ENTITY https-everywhere.prefs.toggle "切æ›">
+<!ENTITY https-everywhere.prefs.reset_default "æ¢å¾©é è¨­å€¼">
+<!ENTITY https-everywhere.prefs.view_xml_source "檢視 XML 原始碼">
+
+<!ENTITY https-everywhere.source.downloading "下載中">
+<!ENTITY https-everywhere.source.filename "檔案å稱">
+<!ENTITY https-everywhere.source.unable_to_download "無法下載原始碼">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0 dev.11通知">
+<!ENTITY https-everywhere.popup.paragraph1 "ç³Ÿç³•ã€‚ä»¥å‰æ‚¨ä¸€ç›´ä½¿ç”¨HTTPS Everywhere 穩定版本,但我們å¯èƒ½å·²ç¶“ä¸å°å¿ƒå‡ç´šæ‚¨åœ¨æˆ‘們最新版本中為開發中版本。">
+<!ENTITY https-everywhere.popup.paragraph2 "您想回復為穩定版本?">
+<!ENTITY https-everywhere.popup.paragraph3 "如果您繼續使用我們的開發中版本,並幫助我們使得HTTPS Everywhere變得更好,我們也很願æ„ï¼æ‚¨å¯èƒ½æœƒç™¼ç¾é€™è£¡å’Œé‚£è£¡æœ‰ä¸€äº›æ›´å¤šçš„錯誤,您å¯ä»¥å‘https-everywhere@eff.orgæäº¤å ±å‘Šï¼Œå°ä¸èµ·æ‚¨æ·»éº»ç…©äº†ï¼Œæ„Ÿè¬æ‚¨ä½¿ç”¨HTTPS Everywhere。">
+<!ENTITY https-everywhere.popup.keep "è®“æˆ‘ç‚ºæŒæ–¼é–‹ç™¼ä¸­ç‰ˆæœ¬">
+<!ENTITY https-everywhere.popup.revert "下載最新的穩定版本">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/https-everywhere.properties b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/https-everywhere.properties
new file mode 100644
index 0000000..e944b0d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = 啟用 HTTPS Everywhere
+https-everywhere.menu.globalDisable = åœç”¨ HTTPS Everywhere
+https-everywhere.menu.enableDisable = 啟用 / åœç”¨è¦å‰‡
+https-everywhere.menu.noRules = (沒有è¦å‰‡é©ç”¨æ–¼æ­¤ç¶²é )
+https-everywhere.menu.unknownRules = (é©ç”¨æ­¤ç¶²é çš„è¦å‰‡ä¸æ˜Ž)
+https-everywhere.toolbar.hint = HTTPS Everywhere 已啟用。您å¯ä»¥æ ¹æ“šç¶²ç«™ç«™é»žåŸºç¤Žä¸Šé€éŽåˆ‡æ›ç¶²å€åˆ—圖示以啟用。
+https-everywhere.migration.notification0 = 為了徹底è½å¯¦é—œéµä¿®æ­£ï¼Œæ›´æ–°é‡ç½®æ‚¨çš„HTTPS Everywhere è¦å‰‡è¨­å®šè‡³å®ƒå€‘çš„é è¨­å€¼ã€‚
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/ssl-observatory.dtd b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/ssl-observatory.dtd
new file mode 100644
index 0000000..496c3df
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/ssl-observatory.dtd
@@ -0,0 +1,91 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "詳細資料與隱ç§è¨Šæ¯">
+<!ENTITY ssl-observatory.popup.later "ç¨å¾Œå†è©¢å•">
+<!ENTITY ssl-observatory.popup.no "å–æ¶ˆ">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere 能將您收到的憑證é€åˆ°è§€æ¸¬ç«™ï¼Œä»¥åµæ¸¬å‡ºå°æ‚¨ç€è¦½å™¨çš„æ”»æ“Šã€‚è¦å•Ÿç”¨æœ¬åŠŸèƒ½å—Žï¼Ÿ">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"è¦è®“ HTTPS Everywhere 使用 SSL 觀測站嗎?">
+
+<!ENTITY ssl-observatory.popup.yes "確定">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"啟用這個é¸é …æ˜¯å®‰å…¨çš„ï¼Œé™¤éžæ‚¨ä½¿ç”¨é«˜ä¾µå…¥æ€§çš„伿¥­ç¶²è·¯ï¼ˆcorporate network):">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"啟用這個é¸é …æ˜¯å®‰å…¨çš„ï¼Œé™¤éžæ‚¨ä½¿ç”¨å«æœ‰éš±å¯†å…§éƒ¨ç¶²è·¯ä¼ºæœå™¨åç¨±çš„ä¼æ¥­ç¶²è·¯ï¼ˆcorporate network):">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"é€å‡ºä¸¦æª¢æŸ¥ç”±éžæ­£è¦çš„æ ¹æ†‘證所簽署的憑證">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"啟用這個é¸é …æ˜¯å®‰å…¨çš„ï¼ˆè€Œä¸”ä¹ŸæŽ¨è–¦å•Ÿç”¨ï¼‰ï¼Œé™¤éžæ‚¨ä½¿ç”¨ä¾µå…¥æ€§çš„伿¥­ç¶²è·¯ï¼Œæˆ–者 Kaspersky 防毒軟體監控到您é€éŽ TLS proxy ç€è¦½ä¸¦ä½¿ç”¨ç§äººçš„æ ¹æ†‘證。 在這類的網路環境啟用此é¸é …,å¯èƒ½æœƒå› ç‚ºæ‰€ç”¢ç”Ÿçš„特有憑證,導致經由此代ç†ä¼ºæœå™¨ç€è¦½ç‰¹å®š https:// 網域的證明被公開。 å› æ­¤é è¨­ç‚ºä¸å•Ÿç”¨æ­¤é¸é …。">
+
+<!ENTITY ssl-observatory.prefs.anonymous "以 Tor åŒ¿åæª¢æ¸¬æ†‘è­‰">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"以 Tor åŒ¿åæª¢æ¸¬æ†‘è­‰ï¼ˆéœ€å®‰è£ Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"這個é¸é …å¿…é ˆå®‰è£ Tor åŠ Torbutton">
+
+<!ENTITY ssl-observatory.prefs.asn
+"看到新的憑證時,告訴觀測站您連線的 ISP">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"這個é¸é …會å–得並回傳您的網路的自治系統號碼(Autonomous System Number)。 這個動作能å”助我們定ä½å° HTTPS çš„æ”»æ“Šï¼Œä¸¦åˆ¤å®šæˆ‘å€‘æ‰€è§€æ¸¬åˆ°ç™¼è‡ªä¼Šæœ—åŠæ•˜åˆ©äºžç­‰åœ°ç¶²è·¯çš„æ”»æ“Šæ˜¯å¦è¼ƒç‚ºå¸¸è¦‹ã€‚">
+
+<!ENTITY ssl-observatory.prefs.done "完æˆ">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere å¯ä»¥ä½¿ç”¨ EFF çš„ SSL è§€æ¸¬ç«™ã€‚é€™éº¼åšæœ‰å…©å€‹æ•ˆæžœï¼š(1) å°‡ HTTPS 憑證的副本傳é€åˆ°è§€æ¸¬ç«™ï¼Œå”åŠ©æˆ‘å€‘åµæ¸¬ã€Œä¸­é–“äººã€æ”»æ“Šä¸¦å¢žé€²ç¶²è·¯å®‰å…¨æ€§ï¼›(2) 當您é‡åˆ°ä¸å®‰å…¨çš„連線或ç€è¦½å™¨é­åˆ°æ”»æ“Šæ™‚,我們能夠æå‡ºè­¦å‘Šã€‚">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"例如當您開啟 https://www.something.com(範例網å€ï¼‰æ™‚,觀測站所收到的憑證會顯示有人ç€è¦½ www.something.comï¼Œä½†ä¸æœƒæŒ‡å‡ºç€è¦½è€…身分或者觀看的是哪些特定é é¢ã€‚將游標移至é¸é …上å¯å¾—到詳細說明:">
+
+<!ENTITY ssl-observatory.prefs.hide "éš±è—進階é¸é …">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"在 Tor ç„¡æ³•ä½¿ç”¨æ™‚ä»æª¢æŸ¥æ†‘è­‰">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"æˆ‘å€‘ä»æœƒè©¦åœ–ç¶­æŒè³‡æ–™çš„åŒ¿åæ€§ï¼Œä½†é€™å€‹é¸é …的安全性較低">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"é€å‡ºä¸¦æª¢æŸ¥éžå…¬å…±åŸŸå系統(non-public DNS)å稱的憑證">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"è§€æ¸¬ç«™ä¸æœƒè¨˜éŒ„å稱未經 DNS 系統解æžçš„æ†‘è­‰ï¼Œé™¤éžæ‚¨æœ‰å‹¾é¸é€™å€‹é¸é …。">
+
+<!ENTITY ssl-observatory.prefs.show "顯示進階é¸é …">
+
+<!ENTITY ssl-observatory.prefs.title "SSL 觀測站å好設定">
+
+<!ENTITY ssl-observatory.prefs.use "使用觀測站?">
+<!ENTITY ssl-observatory.warning.title "EFF çš„ SSL 觀測站æå‡ºè­¦å‘Š">
+<!ENTITY ssl-observatory.warning.showcert "顯示憑證éŠï¼ˆcertificate chain)">
+<!ENTITY ssl-observatory.warning.okay "我了解">
+<!ENTITY ssl-observatory.warning.text "EFF çš„ SSL 觀測站å°é€™å€‹ç¶²ç«™çš„ HTTPS 憑證æå‡ºè­¦å‘Š:">
+<!ENTITY ssl-observatory.warning.defense "若您已登入此網站,當您能使用安全連線時最好變更一下密碼。">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"é€å‡ºä¸¦æª¢æŸ¥è‡ªæˆ‘簽署的憑證">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"建議啟用;加密å•題在自我簽署的嵌入å¼è£ç½®æ¥µç‚ºå¸¸è¦‹ã€‚">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/cross.png b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/cross.png
new file mode 100644
index 0000000..e39a083
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/cross.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-16-gray.png b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-16-gray.png
new file mode 100644
index 0000000..dc362dc
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-16-gray.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-16.png b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-16.png
new file mode 100644
index 0000000..a207180
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-16.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-24-gray.png b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-24-gray.png
new file mode 100644
index 0000000..9cf0798
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-24-gray.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-24.png b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-24.png
new file mode 100644
index 0000000..b4bffc0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-24.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-banner.jpg b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-banner.jpg
new file mode 100644
index 0000000..6154da6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-banner.jpg
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-half-24.png b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-half-24.png
new file mode 100644
index 0000000..b4bffc0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-half-24.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere.css b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere.css
new file mode 100644
index 0000000..6c03b83
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere.css
@@ -0,0 +1,72 @@
+#https-everywhere-button {
+ -moz-binding: url("chrome://https-everywhere/content/toolbar_button_binding.xml#https-everywhere-binding");
+}
+
+#https-everywhere-button > .https-everywhere-button {
+ list-style-image: url("chrome://https-everywhere/skin/https-everywhere-24.png");
+}
+
+toolbar[iconsize="small"] #https-everywhere-button > .https-everywhere-button {
+ list-style-image: url("chrome://https-everywhere/skin/https-everywhere-16.png");
+}
+
+toolbar #https-everywhere-button,
+toolbar #https-everywhere-button > .https-everywhere-button {
+ -moz-box-orient: horizontal;
+}
+
+/* Use CSS attribute selector for changing icon */
+#https-everywhere-button[status="disabled"] > .https-everywhere-button {
+ list-style-image: url("chrome://https-everywhere/skin/https-everywhere-24-gray.png");
+}
+
+toolbar[iconsize="small"] #https-everywhere-button[status="disabled"] > .https-everywhere-button {
+ list-style-image: url("chrome://https-everywhere/skin/https-everywhere-16-gray.png");
+}
+
+/* ruleset counter */
+#rscounter {
+ margin: 3px -12px 0 -8px;
+ display: block;
+ -moz-box-sizing: border-box;
+}
+
+/* increase negative margins in the palette and panel so the button isn't too wide. */
+#wrapper-https-everywhere-button[place="palette"] > #https-everywhere-button > #rscounter,
+#https-everywhere-button[cui-areatype="menu-panel"] > #rscounter {
+ margin: 3px -16px 0 -8px;
+}
+
+/* rulesets applied label */
+#rsapplied {
+ -moz-box-sizing: border-box;
+ font-size: 12px;
+ color: #000;
+ background-color: #FFF;
+ border-width: 1px;
+ border-style: solid;
+ padding: 1px 1px 1px 1px;
+ visibility: hidden;
+}
+
+#https-everywhere-button:not([rulesetsApplied="0"]) #rsapplied {
+ visibility: visible;
+}
+
+#https-everywhere-button menuitem.active-item label {
+ color: #9AD100;
+ font-weight: bold;
+}
+#https-everywhere-button menuitem.moot-item label {
+ color: #9AD100;
+ opacity: 0.5;
+ font-weight: bold;
+}
+#https-everywhere-button menuitem.breaking-item label {
+ color: #b99999;
+ font-weight: bold;
+}
+#https-everywhere-button menuitem.inactive-item label {
+ color: #999999;
+ font-weight: bold;
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere.png b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere.png
new file mode 100644
index 0000000..5e21688
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/loop.png b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/loop.png
new file mode 100644
index 0000000..33dfd42
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/loop.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/ssl-observatory-messy.jpg b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/ssl-observatory-messy.jpg
new file mode 100644
index 0000000..84c43e9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/ssl-observatory-messy.jpg
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/tick-moot.png b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/tick-moot.png
new file mode 100644
index 0000000..5d3c085
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/tick-moot.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/tick.png b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/tick.png
new file mode 100644
index 0000000..f055312
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/chrome/skin/tick.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/components/https-everywhere.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/components/https-everywhere.js
new file mode 100644
index 0000000..90f55e2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/components/https-everywhere.js
@@ -0,0 +1,832 @@
+// LOG LEVELS ---
+
+VERB=1;
+DBUG=2;
+INFO=3;
+NOTE=4;
+WARN=5;
+
+// PREFERENCE BRANCHES
+PREFBRANCH_ROOT=0;
+PREFBRANCH_RULE_TOGGLE=1;
+
+//---------------
+
+https_domains = {}; // maps domain patterns (with at most one
+ // wildcard) to RuleSets
+
+https_everywhere_blacklist = {}; // URLs we've given up on rewriting because
+ // of redirection loops
+
+https_blacklist_domains = {}; // domains for which there is at least one
+ // blacklisted URL
+
+//
+const CI = Components.interfaces;
+const CC = Components.classes;
+const CU = Components.utils;
+const CR = Components.results;
+const Ci = Components.interfaces;
+const Cc = Components.classes;
+const Cu = Components.utils;
+const Cr = Components.results;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/FileUtils.jsm");
+
+const CP_SHOULDPROCESS = 4;
+
+const SERVICE_CTRID = "@eff.org/https-everywhere;1";
+const SERVICE_ID=Components.ID("{32c165b4-fe5e-4964-9250-603c410631b4}");
+const SERVICE_NAME = "Encrypts your communications with a number of major websites";
+
+const LLVAR = "LogLevel";
+
+const IOS = CC["@mozilla.org/network/io-service;1"].getService(CI.nsIIOService);
+const OS = CC['@mozilla.org/observer-service;1'].getService(CI.nsIObserverService);
+const LOADER = CC["@mozilla.org/moz/jssubscript-loader;1"].getService(CI.mozIJSSubScriptLoader);
+const _INCLUDED = {};
+
+// NoScript uses this blob to include js constructs that stored in the chrome/
+// directory, but are not attached to the Firefox UI (normally, js located
+// there is attached to an Overlay and therefore is part of the UI).
+
+// Reasons for this: things in components/ directory cannot be split into
+// separate files; things in chrome/ can be
+
+const INCLUDE = function(name) {
+ if (arguments.length > 1)
+ for (var j = 0, len = arguments.length; j < len; j++)
+ INCLUDE(arguments[j]);
+ else if (!_INCLUDED[name]) {
+ // we used to try/catch here, but that was less useful because it didn't
+ // produce line numbers for syntax errors
+ LOADER.loadSubScript("chrome://https-everywhere/content/code/"
+ + name + ".js");
+ _INCLUDED[name] = true;
+ }
+};
+
+const WP_STATE_START = CI.nsIWebProgressListener.STATE_START;
+const WP_STATE_STOP = CI.nsIWebProgressListener.STATE_STOP;
+const WP_STATE_DOC = CI.nsIWebProgressListener.STATE_IS_DOCUMENT;
+const WP_STATE_START_DOC = WP_STATE_START | WP_STATE_DOC;
+const WP_STATE_RESTORING = CI.nsIWebProgressListener.STATE_RESTORING;
+
+const LF_VALIDATE_ALWAYS = CI.nsIRequest.VALIDATE_ALWAYS;
+const LF_LOAD_BYPASS_ALL_CACHES = CI.nsIRequest.LOAD_BYPASS_CACHE | CI.nsICachingChannel.LOAD_BYPASS_LOCAL_CACHE;
+
+const NS_OK = 0;
+const NS_BINDING_ABORTED = 0x804b0002;
+const NS_BINDING_REDIRECTED = 0x804b0003;
+const NS_ERROR_UNKNOWN_HOST = 0x804b001e;
+const NS_ERROR_REDIRECT_LOOP = 0x804b001f;
+const NS_ERROR_CONNECTION_REFUSED = 0x804b000e;
+const NS_ERROR_NOT_AVAILABLE = 0x804b0111;
+
+const LOG_CONTENT_BLOCK = 1;
+const LOG_CONTENT_CALL = 2;
+const LOG_CONTENT_INTERCEPT = 4;
+const LOG_CHROME_WIN = 8;
+const LOG_XSS_FILTER = 16;
+const LOG_INJECTION_CHECK = 32;
+const LOG_DOM = 64;
+const LOG_JS = 128;
+const LOG_LEAKS = 1024;
+const LOG_SNIFF = 2048;
+const LOG_CLEARCLICK = 4096;
+const LOG_ABE = 8192;
+
+const HTML_NS = "http://www.w3.org/1999/xhtml";
+
+const WHERE_UNTRUSTED = 1;
+const WHERE_TRUSTED = 2;
+const ANYWHERE = 3;
+
+const N_COHORTS = 1000;
+
+const DUMMY_OBJ = {};
+DUMMY_OBJ.wrappedJSObject = DUMMY_OBJ;
+const DUMMY_FUNC = function() {};
+const DUMMY_ARRAY = [];
+
+const EARLY_VERSION_CHECK = !("nsISessionStore" in CI && typeof(/ /) === "object");
+
+// This is probably obsolete since the switch to the channel.redirectTo API
+const OBSERVER_TOPIC_URI_REWRITE = "https-everywhere-uri-rewrite";
+
+// XXX: Better plan for this?
+// We need it to exist to make our updates of ChannelReplacement.js easier.
+var ABE = {
+ consoleDump: false,
+ log: function(str) {
+ https_everywhereLog(WARN, str);
+ }
+};
+
+function xpcom_generateQI(iids) {
+ var checks = [];
+ for each (var iid in iids) {
+ checks.push("CI." + iid.name + ".equals(iid)");
+ }
+ var src = checks.length
+ ? "if (" + checks.join(" || ") + ") return this;\n"
+ : "";
+ return new Function("iid", src + "throw Components.results.NS_ERROR_NO_INTERFACE;");
+}
+
+function xpcom_checkInterfaces(iid,iids,ex) {
+ for (var j = iids.length; j-- >0;) {
+ if (iid.equals(iids[j])) return true;
+ }
+ throw ex;
+}
+
+INCLUDE('ChannelReplacement', 'IOUtil', 'HTTPSRules', 'HTTPS', 'Thread', 'ApplicableList');
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
+// This is black magic for storing Expando data w/ an nsIDOMWindow
+// See http://pastebin.com/qY28Jwbv ,
+// https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIControllers
+
+StorageController.prototype = {
+ QueryInterface: XPCOMUtils.generateQI(
+ [ Components.interfaces.nsISupports,
+ Components.interfaces.nsIController ]),
+ wrappedJSObject: null, // Initialized by constructor
+ supportsCommand: function (cmd) {return (cmd == this.command);},
+ isCommandEnabled: function (cmd) {return (cmd == this.command);},
+ onEvent: function(eventName) {return true;},
+ doCommand: function() {return true;}
+};
+
+function StorageController(command) {
+ this.command = command;
+ this.data = {};
+ this.wrappedJSObject = this;
+}
+
+/*var Controller = Class("Controller", XPCOM(CI.nsIController), {
+ init: function (command, data) {
+ this.command = command;
+ this.data = data;
+ },
+ supportsCommand: function (cmd) cmd === this.command
+});*/
+
+function HTTPSEverywhere() {
+
+ // Set up logging in each component:
+ HTTPS.log = HTTPSRules.log = RuleWriter.log = this.log = https_everywhereLog;
+
+ this.log = https_everywhereLog;
+ this.wrappedJSObject = this;
+ this.https_rules = HTTPSRules;
+ this.INCLUDE=INCLUDE;
+ this.ApplicableList = ApplicableList;
+ this.browser_initialised = false; // the browser is completely loaded
+
+ this.prefs = this.get_prefs();
+ this.rule_toggle_prefs = this.get_prefs(PREFBRANCH_RULE_TOGGLE);
+
+ // We need to use observers instead of categories for FF3.0 for these:
+ // https://developer.mozilla.org/en/Observer_Notifications
+ // https://developer.mozilla.org/en/nsIObserverService.
+ // https://developer.mozilla.org/en/nsIObserver
+ // We also use the observer service to let other extensions know about URIs
+ // we rewrite.
+ this.obsService = CC["@mozilla.org/observer-service;1"]
+ .getService(Components.interfaces.nsIObserverService);
+
+ if(this.prefs.getBoolPref("globalEnabled")){
+ this.obsService.addObserver(this, "profile-before-change", false);
+ this.obsService.addObserver(this, "profile-after-change", false);
+ this.obsService.addObserver(this, "sessionstore-windows-restored", false);
+ this.obsService.addObserver(this, "browser:purge-session-history", false);
+ }
+
+ var pref_service = Components.classes["@mozilla.org/preferences-service;1"]
+ .getService(Components.interfaces.nsIPrefBranchInternal);
+ var branch = pref_service.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
+
+ branch.addObserver("extensions.https_everywhere.enable_mixed_rulesets",
+ this, false);
+ branch.addObserver("security.mixed_content.block_active_content",
+ this, false);
+
+ return;
+}
+
+
+// nsIContentPolicy interface
+// we use numeric constants for performance sake:
+const TYPE_OTHER = 1;
+const TYPE_SCRIPT = 2;
+const TYPE_IMAGE = 3;
+const TYPE_STYLESHEET = 4;
+const TYPE_OBJECT = 5;
+const TYPE_DOCUMENT = 6;
+const TYPE_SUBDOCUMENT = 7;
+const TYPE_REFRESH = 8;
+const TYPE_XBL = 9;
+const TYPE_PING = 10;
+const TYPE_XMLHTTPREQUEST = 11;
+const TYPE_OBJECT_SUBREQUEST = 12;
+const TYPE_DTD = 13;
+const TYPE_FONT = 14;
+const TYPE_MEDIA = 15;
+// --------------
+// REJECT_SERVER = -3
+// ACCEPT = 1
+
+
+// Some of these types are known by arbitrary assertion at
+// https://bugzilla.mozilla.org/show_bug.cgi?id=677643#c47
+// TYPE_FONT was required to fix https://trac.torproject.org/projects/tor/ticket/4194
+// TYPE_SUBDOCUMENT was required to fix https://trac.torproject.org/projects/tor/ticket/4149
+// I have NO IDEA why JS won't let me use the constants above in defining this
+const shouldLoadTargets = {
+ 1 : true,
+ 3 : true,
+ 5 : true,
+ 12 : true,
+ 14 : true,
+ 7 : true
+};
+
+
+
+/*
+In recent versions of Firefox and HTTPS Everywhere, the call stack for performing an HTTP -> HTTPS rewrite looks like this:
+
+1. HTTPSEverywhere.observe() gets a callback with the "http-on-modify-request" topic, and the channel as a subject
+
+ 2. HTTPS.replaceChannel()
+
+ 3. HTTPSRules.rewrittenURI()
+
+ 4. HTTPSRules.potentiallyApplicableRulesets uses <target host=""> elements to identify relevant rulesets
+
+ foreach RuleSet:
+
+ 4. RuleSet.transformURI()
+
+ 5. RuleSet.apply() does the tests and rewrites with RegExps, returning a string
+
+ 4. RuleSet.transformURI() makes a new uri object for the destination string, if required
+
+ 2. HTTPS.replaceChannel() calls channel.redirectTo() if a redirect is needed
+
+
+In addition, the following other important tasks happen along the way:
+
+HTTPSEverywhere.observe() aborts if there is a redirect loop
+ finds a reference to the ApplicableList or alist that represents the toolbar context menu
+
+HTTPS.replaceChannel() notices redirect loops (and used to do much more complex XPCOM API work in the NoScript-based past)
+
+HTTPSRules.rewrittenURI() works around weird URI types like about: and http://user:pass@example.com/
+ and notifies the alist of what it should display for each ruleset
+
+*/
+
+// This defines for Mozilla what stuff HTTPSEverywhere will implement.
+
+// ChannelEventSink used to be necessary in order to handle redirects (eg
+// HTTP redirects) correctly. It may now be obsolete? XXX
+
+HTTPSEverywhere.prototype = {
+ prefs: null,
+ // properties required for XPCOM registration:
+ classDescription: SERVICE_NAME,
+ classID: SERVICE_ID,
+ contractID: SERVICE_CTRID,
+
+ _xpcom_factory: {
+ createInstance: function (outer, iid) {
+ if (outer != null)
+ throw Components.results.NS_ERROR_NO_AGGREGATION;
+ if (!HTTPSEverywhere.instance)
+ HTTPSEverywhere.instance = new HTTPSEverywhere();
+ return HTTPSEverywhere.instance.QueryInterface(iid);
+ },
+
+ QueryInterface: XPCOMUtils.generateQI(
+ [ Components.interfaces.nsISupports,
+ Components.interfaces.nsIModule,
+ Components.interfaces.nsIFactory ])
+ },
+
+ // [optional] an array of categories to register this component in.
+ _xpcom_categories: [
+ {
+ category: "app-startup",
+ },
+ ],
+
+ // QueryInterface implementation, e.g. using the generateQI helper
+ QueryInterface: XPCOMUtils.generateQI(
+ [ Components.interfaces.nsIObserver,
+ Components.interfaces.nsISupports,
+ Components.interfaces.nsISupportsWeakReference,
+ Components.interfaces.nsIWebProgressListener,
+ Components.interfaces.nsIWebProgressListener2,
+ Components.interfaces.nsIChannelEventSink ]),
+
+ wrappedJSObject: null, // Initialized by constructor
+
+ getWeakReference: function () {
+ return Components.utils.getWeakReference(this);
+ },
+
+ // An "expando" is an attribute glued onto something. From NoScript.
+ getExpando: function(domWin, key) {
+ var c = domWin.controllers.getControllerForCommand("https-everywhere-storage");
+ try {
+ if (c) {
+ c = c.wrappedJSObject;
+ //this.log(DBUG, "Found a controller, returning data");
+ return c.data[key];
+ } else {
+ this.log(INFO, "No controller attached to " + domWin);
+ return null;
+ }
+ } catch(e) {
+ // Firefox 3.5
+ this.log(WARN,"exception in getExpando");
+ this.getExpando = this.getExpando_old;
+ this.setExpando = this.setExpando_old;
+ return this.getExpando_old(domWin, key, null);
+ }
+ },
+ setExpando: function(domWin, key, value) {
+ var c = domWin.controllers.getControllerForCommand("https-everywhere-storage");
+ try {
+ if (!c) {
+ this.log(DBUG, "Appending new StorageController for " + domWin);
+ c = new StorageController("https-everywhere-storage");
+ domWin.controllers.appendController(c);
+ } else {
+ c = c.wrappedJSObject;
+ }
+ c.data[key] = value;
+ } catch(e) {
+ this.log(WARN,"exception in setExpando");
+ this.getExpando = this.getExpando_old;
+ this.setExpando = this.setExpando_old;
+ this.setExpando_old(domWin, key, value);
+ }
+ },
+
+ // This method is straight out of NoScript... we fall back to it in FF 3.*?
+ getExpando_old: function(domWin, key, defValue) {
+ var domObject = domWin.document;
+ return domObject && domObject.__httpsEStorage && domObject.__httpsEStorage[key] ||
+ (defValue ? this.setExpando(domObject, key, defValue) : null);
+ },
+ setExpando_old: function(domWin, key, value) {
+ var domObject = domWin.document;
+ if (!domObject) return null;
+ if (!domObject.__httpsEStorage) domObject.__httpsEStorage = {};
+ if (domObject.__httpsEStorage) domObject.__httpsEStorage[key] = value;
+ else this.log(WARN, "Warning: cannot set expando " + key + " to value " + value);
+ return value;
+ },
+
+ // We use onLocationChange to make a fresh list of rulesets that could have
+ // applied to the content in the current page (the "applicable list" is used
+ // for the context menu in the UI). This will be appended to as various
+ // content is embedded / requested by JavaScript.
+ onLocationChange: function(wp, req, uri) {
+ if (wp instanceof CI.nsIWebProgress) {
+ if (!this.newApplicableListForDOMWin(wp.DOMWindow))
+ this.log(WARN,"Something went wrong in onLocationChange");
+ } else {
+ this.log(WARN,"onLocationChange: no nsIWebProgress");
+ }
+ },
+
+ getWindowForChannel: function(channel) {
+ // Obtain an nsIDOMWindow from a channel
+ let loadContext;
+ try {
+ loadContext = channel.notificationCallbacks.getInterface(CI.nsILoadContext);
+ } catch(e) {
+ try {
+ loadContext = channel.loadGroup.notificationCallbacks.getInterface(CI.nsILoadContext);
+ } catch(e) {
+ this.log(NOTE, "No loadContext for " + channel.URI.spec);
+ return null;
+ }
+ }
+
+ let domWin = loadContext.associatedWindow;
+ if (!domWin) {
+ this.log(NOTE, "failed to get DOMWin for " + channel.URI.spec);
+ return null;
+ }
+
+ domWin = domWin.top;
+ return domWin;
+ },
+
+ // the lists get made when the urlbar is loading something new, but they
+ // need to be appended to with reference only to the channel
+ getApplicableListForChannel: function(channel) {
+ var domWin = this.getWindowForChannel(channel);
+ return this.getApplicableListForDOMWin(domWin, "on-modify-request w " + domWin);
+ },
+
+ newApplicableListForDOMWin: function(domWin) {
+ if (!domWin || !(domWin instanceof CI.nsIDOMWindow)) {
+ this.log(WARN, "Get alist without domWin");
+ return null;
+ }
+ var dw = domWin.top;
+ var alist = new ApplicableList(this.log,dw.document,dw);
+ this.setExpando(dw,"applicable_rules",alist);
+ return alist;
+ },
+
+ getApplicableListForDOMWin: function(domWin, where) {
+ if (!domWin || !(domWin instanceof CI.nsIDOMWindow)) {
+ //this.log(WARN, "Get alist without domWin");
+ return null;
+ }
+ var dw = domWin.top;
+ var alist= this.getExpando(dw,"applicable_rules",null);
+ if (alist) {
+ //this.log(DBUG,"get AL success in " + where);
+ return alist;
+ } else {
+ //this.log(DBUG, "Making new AL in getApplicableListForDOMWin in " + where);
+ alist = new ApplicableList(this.log,dw.document,dw);
+ this.setExpando(dw,"applicable_rules",alist);
+ }
+ return alist;
+ },
+
+ observe: function(subject, topic, data) {
+ // Top level glue for the nsIObserver API
+ var channel = subject;
+ //this.log(VERB,"Got observer topic: "+topic);
+
+ if (topic == "http-on-modify-request") {
+ if (!(channel instanceof CI.nsIHttpChannel)) return;
+
+ this.log(DBUG,"Got http-on-modify-request: "+channel.URI.spec);
+ var lst = this.getApplicableListForChannel(channel); // null if no window is associated (ex: xhr)
+ if (channel.URI.spec in https_everywhere_blacklist) {
+ this.log(DBUG, "Avoiding blacklisted " + channel.URI.spec);
+ if (lst) lst.breaking_rule(https_everywhere_blacklist[channel.URI.spec]);
+ else this.log(NOTE,"Failed to indicate breakage in content menu");
+ return;
+ }
+ HTTPS.replaceChannel(lst, channel);
+ } else if (topic == "http-on-examine-response") {
+ this.log(DBUG, "Got http-on-examine-response @ "+ (channel.URI ? channel.URI.spec : '') );
+ HTTPS.handleSecureCookies(channel);
+ } else if (topic == "http-on-examine-merged-response") {
+ this.log(DBUG, "Got http-on-examine-merged-response ");
+ HTTPS.handleSecureCookies(channel);
+ } else if (topic == "cookie-changed") {
+ // Javascript can add cookies via document.cookie that are insecure.
+ if (data == "added" || data == "changed") {
+ // subject can also be an nsIArray! bleh.
+ try {
+ subject.QueryInterface(CI.nsIArray);
+ var elems = subject.enumerate();
+ while (elems.hasMoreElements()) {
+ var cookie = elems.getNext()
+ .QueryInterface(CI.nsICookie2);
+ if (!cookie.isSecure) {
+ HTTPS.handleInsecureCookie(cookie);
+ }
+ }
+ } catch(e) {
+ subject.QueryInterface(CI.nsICookie2);
+ if(!subject.isSecure) {
+ HTTPS.handleInsecureCookie(subject);
+ }
+ }
+ }
+ } else if (topic == "profile-before-change") {
+ this.log(INFO, "Got profile-before-change");
+ var catman = Components.classes["@mozilla.org/categorymanager;1"]
+ .getService(Components.interfaces.nsICategoryManager);
+ catman.deleteCategoryEntry("net-channel-event-sinks", SERVICE_CTRID, true);
+ Thread.hostRunning = false;
+ } else if (topic == "profile-after-change") {
+ this.log(DBUG, "Got profile-after-change");
+
+ if(this.prefs.getBoolPref("globalEnabled")){
+ OS.addObserver(this, "cookie-changed", false);
+ OS.addObserver(this, "http-on-modify-request", false);
+ OS.addObserver(this, "http-on-examine-merged-response", false);
+ OS.addObserver(this, "http-on-examine-response", false);
+
+ var dls = CC['@mozilla.org/docloaderservice;1']
+ .getService(CI.nsIWebProgress);
+ dls.addProgressListener(this, CI.nsIWebProgress.NOTIFY_LOCATION);
+ this.log(INFO,"ChannelReplacement.supported = "+ChannelReplacement.supported);
+
+ HTTPSRules.init();
+
+ Thread.hostRunning = true;
+ var catman = Components.classes["@mozilla.org/categorymanager;1"]
+ .getService(Components.interfaces.nsICategoryManager);
+ // hook on redirections (non persistent, otherwise crashes on 1.8.x)
+ catman.addCategoryEntry("net-channel-event-sinks", SERVICE_CTRID,
+ SERVICE_CTRID, false, true);
+ }
+ } else if (topic == "sessionstore-windows-restored") {
+ this.log(DBUG,"Got sessionstore-windows-restored");
+ this.maybeShowObservatoryPopup();
+ this.browser_initialised = true;
+ } else if (topic == "nsPref:changed") {
+ // If the user toggles the Mixed Content Blocker settings, reload the rulesets
+ // to enable/disable the mixedcontent ones
+
+ // this pref gets set to false and then true during FF 26 startup!
+ // so do nothing if we're being notified during startup
+ if (!this.browser_initialised)
+ return;
+ switch (data) {
+ case "security.mixed_content.block_active_content":
+ case "extensions.https_everywhere.enable_mixed_rulesets":
+ var p = CC["@mozilla.org/preferences-service;1"].getService(CI.nsIPrefBranch);
+ var val = p.getBoolPref("security.mixed_content.block_active_content");
+ this.log(INFO,"nsPref:changed for "+data + " to " + val);
+ HTTPSRules.init();
+ break;
+ }
+ } else if (topic == "browser:purge-session-history") {
+ // The list of rulesets that have been loaded from the sqlite DB
+ // constitutes a parallel history store, so we have to clear it.
+ this.log(DBUG, "History cleared, reloading HTTPSRules to avoid information leak.");
+ HTTPSRules.init();
+ }
+ return;
+ },
+
+ maybeShowObservatoryPopup: function() {
+ // Show the popup at most once. Users who enabled the Observatory before
+ // a version that would have shown it to them, don't need to see it
+ // again.
+ var ssl_observatory = CC["@eff.org/ssl-observatory;1"]
+ .getService(Components.interfaces.nsISupports)
+ .wrappedJSObject;
+ var shown = ssl_observatory.myGetBoolPref("popup_shown");
+ var enabled = ssl_observatory.myGetBoolPref("enabled");
+ var that = this;
+ var obs_popup_callback = function(result) {
+ if (result) that.log(INFO, "Got positive proxy test.");
+ else that.log(INFO, "Got negative proxy text.");
+ // We are now ready to show the popup in its most informative state
+ that.chrome_opener("chrome://https-everywhere/content/observatory-popup.xul");
+ };
+ if (!shown && !enabled)
+ ssl_observatory.registerProxyTestNotification(obs_popup_callback);
+
+ if (shown && enabled)
+ this.maybeCleanupObservatoryPrefs(ssl_observatory);
+ },
+
+ maybeCleanupObservatoryPrefs: function(ssl_observatory) {
+ // Recover from a past UI processing bug that would leave the Obsevatory
+ // accidentally disabled for some users
+ // https://trac.torproject.org/projects/tor/ticket/10728
+ var clean = ssl_observatory.myGetBoolPref("clean_config");
+ if (clean) return;
+
+ // unchanged: returns true if a pref has not been modified
+ var unchanged = function(p){return !ssl_observatory.prefs.prefHasUserValue("extensions.https_everywhere._observatory."+p)};
+ var cleanup_obsprefs_callback = function(tor_avail) {
+ // we only run this once
+ ssl_observatory.prefs.setBoolPref("extensions.https_everywhere._observatory.clean_config", true);
+ if (!tor_avail) {
+ // use_custom_proxy is the variable that is often false when it should be true;
+ if (!ssl_observatory.myGetBoolPref("use_custom_proxy")) {
+ // however don't do anything if any of the prefs have been set by the user
+ if (unchanged("alt_roots") && unchanged("self_signed") && unchanged ("send_asn") && unchanged("priv_dns")) {
+ ssl_observatory.prefs.setBoolPref("extensions.https_everywhere._observatory.use_custom_proxy", true);
+ }
+ }
+ }
+ }
+ ssl_observatory.registerProxyTestNotification(cleanup_obsprefs_callback);
+ },
+
+
+ getExperimentalFeatureCohort: function() {
+ // This variable is used for gradually turning on features for testing and
+ // scalability purposes. It is a random integer [0,N_COHORTS) generated
+ // once and stored thereafter.
+ //
+ // This is not currently used/called in the development branch
+ var cohort;
+ try {
+ cohort = this.prefs.getIntPref("experimental_feature_cohort");
+ } catch(e) {
+ cohort = Math.round(Math.random() * N_COHORTS);
+ this.prefs.setIntPref("experimental_feature_cohort", cohort);
+ }
+ return cohort;
+ },
+
+ // nsIChannelEventSink implementation
+ // XXX This was here for rewrites in the past. Do we still need it?
+ onChannelRedirect: function(oldChannel, newChannel, flags) {
+ const uri = newChannel.URI;
+ this.log(DBUG,"Got onChannelRedirect to "+uri.spec);
+ if (!(newChannel instanceof CI.nsIHttpChannel)) {
+ this.log(DBUG, newChannel + " is not an instance of nsIHttpChannel");
+ return;
+ }
+ var alist = this.juggleApplicableListsDuringRedirection(oldChannel, newChannel);
+ HTTPS.replaceChannel(alist,newChannel);
+ },
+
+ juggleApplicableListsDuringRedirection: function(oldChannel, newChannel) {
+ // If the new channel doesn't yet have a list of applicable rulesets, start
+ // with the old one because that's probably a better representation of how
+ // secure the load process was for this page
+ var domWin = this.getWindowForChannel(oldChannel);
+ var old_alist = null;
+ if (domWin)
+ old_alist = this.getExpando(domWin,"applicable_rules", null);
+ domWin = this.getWindowForChannel(newChannel);
+ if (!domWin) return null;
+ var new_alist = this.getExpando(domWin,"applicable_rules", null);
+ if (old_alist && !new_alist) {
+ new_alist = old_alist;
+ this.setExpando(domWin,"applicable_rules",new_alist);
+ } else if (!new_alist) {
+ new_alist = new ApplicableList(this.log, domWin.document, domWin);
+ this.setExpando(domWin,"applicable_rules",new_alist);
+ }
+ return new_alist;
+ },
+
+ asyncOnChannelRedirect: function(oldChannel, newChannel, flags, callback) {
+ this.onChannelRedirect(oldChannel, newChannel, flags);
+ callback.onRedirectVerifyCallback(0);
+ },
+
+ get_prefs: function(prefBranch) {
+ if(!prefBranch) prefBranch = PREFBRANCH_ROOT;
+
+ // get our preferences branch object
+ // FIXME: Ugly hack stolen from https
+ var branch_name;
+ if(prefBranch == PREFBRANCH_RULE_TOGGLE)
+ branch_name = "extensions.https_everywhere.rule_toggle.";
+ else
+ branch_name = "extensions.https_everywhere.";
+ var o_prefs = false;
+ var o_branch = false;
+ // this function needs to be called from inside https_everywhereLog, so
+ // it needs to do its own logging...
+ var econsole = Components.classes["@mozilla.org/consoleservice;1"]
+ .getService(Components.interfaces.nsIConsoleService);
+
+ o_prefs = Components.classes["@mozilla.org/preferences-service;1"]
+ .getService(Components.interfaces.nsIPrefService);
+
+ if (!o_prefs)
+ {
+ econsole.logStringMessage("HTTPS Everywhere: Failed to get preferences-service!");
+ return false;
+ }
+
+ o_branch = o_prefs.getBranch(branch_name);
+ if (!o_branch)
+ {
+ econsole.logStringMessage("HTTPS Everywhere: Failed to get prefs branch!");
+ return false;
+ }
+
+ if(prefBranch == PREFBRANCH_ROOT) {
+ // make sure there's an entry for our log level
+ try {
+ o_branch.getIntPref(LLVAR);
+ } catch (e) {
+ econsole.logStringMessage("Creating new about:config https_everywhere.LogLevel variable");
+ o_branch.setIntPref(LLVAR, WARN);
+ }
+ }
+
+ return o_branch;
+ },
+
+ chrome_opener: function(uri, args) {
+ // we don't use window.open, because we need to work around TorButton's
+ // state control
+ args = args || 'chrome,centerscreen';
+ return CC['@mozilla.org/appshell/window-mediator;1']
+ .getService(CI.nsIWindowMediator)
+ .getMostRecentWindow('navigator:browser')
+ .open(uri,'', args );
+ },
+
+ tab_opener: function(uri) {
+ var gb = CC['@mozilla.org/appshell/window-mediator;1']
+ .getService(CI.nsIWindowMediator)
+ .getMostRecentWindow('navigator:browser')
+ .gBrowser;
+ var tab = gb.addTab(uri);
+ gb.selectedTab = tab;
+ return tab;
+ },
+
+ toggleEnabledState: function() {
+ if(this.prefs.getBoolPref("globalEnabled")){
+ try{
+ this.obsService.removeObserver(this, "profile-before-change");
+ this.obsService.removeObserver(this, "profile-after-change");
+ this.obsService.removeObserver(this, "sessionstore-windows-restored");
+ OS.removeObserver(this, "cookie-changed");
+ OS.removeObserver(this, "http-on-modify-request");
+ OS.removeObserver(this, "http-on-examine-merged-response");
+ OS.removeObserver(this, "http-on-examine-response");
+
+ var catman = Components.classes["@mozilla.org/categorymanager;1"]
+ .getService(Components.interfaces.nsICategoryManager);
+ catman.deleteCategoryEntry("net-channel-event-sinks", SERVICE_CTRID, true);
+
+ var dls = CC['@mozilla.org/docloaderservice;1']
+ .getService(CI.nsIWebProgress);
+ dls.removeProgressListener(this);
+
+ this.prefs.setBoolPref("globalEnabled", false);
+ }
+ catch(e){
+ this.log(WARN, "Couldn't remove observers: " + e);
+ }
+ }
+ else{
+ try{
+ this.obsService.addObserver(this, "profile-before-change", false);
+ this.obsService.addObserver(this, "profile-after-change", false);
+ this.obsService.addObserver(this, "sessionstore-windows-restored", false);
+ OS.addObserver(this, "cookie-changed", false);
+ OS.addObserver(this, "http-on-modify-request", false);
+ OS.addObserver(this, "http-on-examine-merged-response", false);
+ OS.addObserver(this, "http-on-examine-response", false);
+
+ var dls = CC['@mozilla.org/docloaderservice;1']
+ .getService(CI.nsIWebProgress);
+ dls.addProgressListener(this, CI.nsIWebProgress.NOTIFY_LOCATION);
+
+ this.log(INFO,"ChannelReplacement.supported = "+ChannelReplacement.supported);
+
+ if(!Thread.hostRunning)
+ Thread.hostRunning = true;
+
+ var catman = Components.classes["@mozilla.org/categorymanager;1"]
+ .getService(Components.interfaces.nsICategoryManager);
+ // hook on redirections (non persistent, otherwise crashes on 1.8.x)
+ catman.addCategoryEntry("net-channel-event-sinks", SERVICE_CTRID,
+ SERVICE_CTRID, false, true);
+
+ HTTPSRules.init();
+ this.prefs.setBoolPref("globalEnabled", true);
+ }
+ catch(e){
+ this.log(WARN, "Couldn't add observers: " + e);
+ }
+ }
+ }
+};
+
+var prefs = 0;
+var econsole = 0;
+function https_everywhereLog(level, str) {
+ if (prefs == 0) {
+ prefs = HTTPSEverywhere.instance.get_prefs();
+ econsole = Components.classes["@mozilla.org/consoleservice;1"]
+ .getService(Components.interfaces.nsIConsoleService);
+ }
+ try {
+ var threshold = prefs.getIntPref(LLVAR);
+ } catch (e) {
+ econsole.logStringMessage( "HTTPS Everywhere: Failed to read about:config LogLevel");
+ threshold = WARN;
+ }
+ if (level >= threshold) {
+ dump("HTTPS Everywhere: "+str+"\n");
+ econsole.logStringMessage("HTTPS Everywhere: " +str);
+ }
+}
+
+/**
+* XPCOMUtils.generateNSGetFactory was introduced in Mozilla 2 (Firefox 4).
+* XPCOMUtils.generateNSGetModule is for Mozilla 1.9.2 (Firefox 3.6).
+*/
+if (XPCOMUtils.generateNSGetFactory)
+ var NSGetFactory = XPCOMUtils.generateNSGetFactory([HTTPSEverywhere]);
+else
+ var NSGetModule = XPCOMUtils.generateNSGetModule([HTTPSEverywhere]);
+
+/* vim: set tabstop=4 expandtab: */
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/components/ssl-observatory.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/components/ssl-observatory.js
new file mode 100644
index 0000000..7b301d1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/components/ssl-observatory.js
@@ -0,0 +1,1026 @@
+const Ci = Components.interfaces;
+const Cc = Components.classes;
+const Cr = Components.results;
+
+const CI = Components.interfaces;
+const CC = Components.classes;
+const CR = Components.results;
+const CU = Components.utils;
+
+// Log levels
+VERB=1;
+DBUG=2;
+INFO=3;
+NOTE=4;
+WARN=5;
+
+BASE_REQ_SIZE=4096;
+MAX_OUTSTANDING = 20; // Max # submission XHRs in progress
+MAX_DELAYED = 32; // Max # XHRs are waiting around to be sent or retried
+TIMEOUT = 60000;
+
+ASN_PRIVATE = -1; // Do not record the ASN this cert was seen on
+ASN_IMPLICIT = -2; // ASN can be learned from connecting IP
+ASN_UNKNOWABLE = -3; // Cert was seen in the absence of [trustworthy] Internet access
+
+// XXX: We should make the _observatory tree relative.
+LLVAR="extensions.https_everywhere.LogLevel";
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+Components.utils.import("resource://gre/modules/ctypes.jsm");
+
+
+const OS = Cc['@mozilla.org/observer-service;1'].getService(CI.nsIObserverService);
+
+const SERVICE_CTRID = "@eff.org/ssl-observatory;1";
+const SERVICE_ID=Components.ID("{0f9ab521-986d-4ad8-9c1f-6934e195c15c}");
+const SERVICE_NAME = "Anonymously Submits SSL certificates to EFF for security auditing.";
+const LOADER = CC["@mozilla.org/moz/jssubscript-loader;1"].getService(CI.mozIJSSubScriptLoader);
+
+const _INCLUDED = {};
+
+const INCLUDE = function(name) {
+ if (arguments.length > 1)
+ for (var j = 0, len = arguments.length; j < len; j++)
+ INCLUDE(arguments[j]);
+ else if (!_INCLUDED[name]) {
+ try {
+ LOADER.loadSubScript("chrome://https-everywhere/content/code/"
+ + name + ".js");
+ _INCLUDED[name] = true;
+ } catch(e) {
+ dump("INCLUDE " + name + ": " + e + "\n");
+ }
+ }
+};
+
+INCLUDE('Root-CAs');
+INCLUDE('sha256');
+INCLUDE('X509ChainWhitelist');
+INCLUDE('NSS');
+
+function SSLObservatory() {
+ this.prefs = CC["@mozilla.org/preferences-service;1"]
+ .getService(CI.nsIPrefBranch);
+
+ try {
+ // Check for torbutton
+ this.tor_logger = CC["@torproject.org/torbutton-logger;1"]
+ .getService(CI.nsISupports).wrappedJSObject;
+ this.torbutton_installed = true;
+ } catch(e) {
+ this.torbutton_installed = false;
+ }
+
+ this.HTTPSEverywhere = CC["@eff.org/https-everywhere;1"]
+ .getService(Components.interfaces.nsISupports)
+ .wrappedJSObject;
+
+ /* The proxy test result starts out null until the test is attempted.
+ * This is for UI notification purposes */
+ this.proxy_test_successful = null;
+ this.proxy_test_callback = null;
+ this.cto_url = "https://check.torproject.org/?TorButton=true";
+ // a regexp to match the above URL
+ this.cto_regexp = RegExp("^https://check\\.torproject\\.org/");
+
+ this.public_roots = root_ca_hashes;
+
+ // Clear these on cookies-cleared observer event
+ this.already_submitted = {};
+ this.delayed_submissions = {};
+
+ // Figure out the url to submit to
+ this.submit_host = null;
+ this.findSubmissionTarget();
+
+ // Used to track current number of pending requests to the server
+ this.current_outstanding_requests = 0;
+
+ // We can't always know private browsing state per request, sometimes
+ // we have to guess based on what we've seen in the past
+ this.everSeenPrivateBrowsing = false;
+
+ // Generate nonce to append to url, to catch in nsIProtocolProxyFilter
+ // and to protect against CSRF
+ this.csrf_nonce = "#"+Math.random().toString()+Math.random().toString();
+
+ this.compatJSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
+
+ var pref_service = Components.classes["@mozilla.org/preferences-service;1"]
+ .getService(Components.interfaces.nsIPrefBranchInternal);
+ var branch = pref_service.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
+
+ branch.addObserver("extensions.https_everywhere._observatory.enabled",
+ this, false);
+
+ if (this.myGetBoolPref("enabled")) {
+ OS.addObserver(this, "cookie-changed", false);
+ OS.addObserver(this, "http-on-examine-response", false);
+
+ var dls = CC['@mozilla.org/docloaderservice;1']
+ .getService(CI.nsIWebProgress);
+ dls.addProgressListener(this,
+ Ci.nsIWebProgress.NOTIFY_STATE_REQUEST);
+ }
+
+ // Register protocolproxyfilter
+ this.pps = CC["@mozilla.org/network/protocol-proxy-service;1"]
+ .getService(CI.nsIProtocolProxyService);
+
+ this.pps.registerFilter(this, 0);
+ this.wrappedJSObject = this;
+
+ this.client_asn = ASN_PRIVATE;
+ if (this.myGetBoolPref("send_asn"))
+ this.setupASNWatcher();
+
+ try {
+ NSS.initialize("");
+ } catch(e) {
+ this.log(WARN, "Failed to initialize NSS component:" + e);
+ }
+
+ this.testProxySettings();
+
+ this.log(DBUG, "Loaded observatory component!");
+}
+
+SSLObservatory.prototype = {
+ // QueryInterface implementation, e.g. using the generateQI helper
+ QueryInterface: XPCOMUtils.generateQI(
+ [ CI.nsIObserver,
+ CI.nsIProtocolProxyFilter,
+ //CI.nsIWifiListener,
+ CI.nsIWebProgressListener,
+ CI.nsISupportsWeakReference,
+ CI.nsIInterfaceRequestor]),
+
+ wrappedJSObject: null, // Initialized by constructor
+
+ // properties required for XPCOM registration:
+ classDescription: SERVICE_NAME,
+ classID: SERVICE_ID,
+ contractID: SERVICE_CTRID,
+
+ // https://developer.mozilla.org/En/How_to_check_the_security_state_of_an_XMLHTTPRequest_over_SSL
+ getSSLCertChain: function(channel) {
+ try {
+ // Do we have a valid channel argument?
+ if (!channel instanceof Ci.nsIChannel) {
+ return null;
+ }
+ var secInfo = channel.securityInfo;
+
+ // Print general connection security state
+ if (secInfo instanceof Ci.nsITransportSecurityInfo) {
+ secInfo.QueryInterface(Ci.nsITransportSecurityInfo);
+ } else {
+ return null;
+ }
+
+ if (secInfo instanceof Ci.nsISSLStatusProvider) {
+ return secInfo.QueryInterface(Ci.nsISSLStatusProvider).
+ SSLStatus.QueryInterface(Ci.nsISSLStatus).serverCert;
+ }
+ return null;
+ } catch(err) {
+ return null;
+ }
+ },
+
+ findSubmissionTarget: function() {
+ // Compute the URL that the Observatory will currently submit to
+ var host = this.prefs.getCharPref("extensions.https_everywhere._observatory.server_host");
+ // Rebuild the regexp iff the host has changed
+ if (host != this.submit_host) {
+ this.submit_host = host;
+ this.submit_url = "https://" + host + "/submit_cert";
+ this.submission_regexp = RegExp("^" + this.regExpEscape(this.submit_url));
+ }
+ },
+
+ regExpEscape: function(s) {
+ // Borrowed from the Closure Library,
+ // https://closure-library.googlecode.com/svn/docs/closure_goog_string_string.js.source.html
+ return String(s).replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, '\\$1').replace(/\x08/g, '\\x08');
+ },
+
+ notifyCertProblem: function(socketInfo, status, targetSite) {
+ this.log(NOTE, "cert warning for " + targetSite);
+ if (targetSite == "observatory.eff.org") {
+ this.log(WARN, "Surpressing observatory warning");
+ return true;
+ }
+ return false;
+ },
+
+ setupASNWatcher: function() {
+ this.getClientASN();
+ this.max_ap = null;
+
+ // we currently do not actually do *any* ASN watching from the client
+ // (in other words, the db will not have ASNs for certs submitted
+ // through Tor, even if the user checks the "send ASN" option)
+ // all of this code for guessing at changes in our public IP via WiFi hints
+ // is therefore disabled
+ /*
+ // Observe network changes to get new ASNs
+ OS.addObserver(this, "network:offline-status-changed", false);
+ var pref_service = Cc["@mozilla.org/preferences-service;1"]
+ .getService(Ci.nsIPrefBranchInternal);
+ var proxy_branch = pref_service.QueryInterface(Ci.nsIPrefBranchInternal);
+ proxy_branch.addObserver("network.proxy", this, false);
+
+ try {
+ var wifi_service = Cc["@mozilla.org/wifi/monitor;1"].getService(Ci.nsIWifiMonitor);
+ wifi_service.startWatching(this);
+ } catch(e) {
+ this.log(INFO, "Failed to register ASN change monitor: "+e);
+ }*/
+ },
+
+ stopASNWatcher: function() {
+ this.client_asn = ASN_PRIVATE;
+ /*
+ // unhook the observers we registered above
+ OS.removeObserver(this, "network:offline-status-changed");
+ var pref_service = Cc["@mozilla.org/preferences-service;1"]
+ .getService(Ci.nsIPrefBranchInternal);
+ var proxy_branch = pref_service.QueryInterface(Ci.nsIPrefBranchInternal);
+ proxy_branch.removeObserver(this, "network.proxy");
+ try {
+ var wifi_service = Cc["@mozilla.org/wifi/monitor;1"].getService(Ci.nsIWifiMonitor);
+ wifi_service.stopWatching(this);
+ } catch(e) {
+ this.log(WARN, "Failed to stop wifi state monitor: "+e);
+ }*/
+ },
+
+ getClientASN: function() {
+ // Fetch a new client ASN..
+ if (!this.myGetBoolPref("send_asn")) {
+ this.client_asn = ASN_PRIVATE;
+ return;
+ }
+ else if (!this.torbutton_installed) {
+ this.client_asn = ASN_IMPLICIT;
+ return;
+ }
+ // XXX As a possible base case: the user is running Tor, is not using
+ // bridges, and has send_asn enabled: should we ping an eff.org URL to
+ // learn our ASN?
+ return;
+ },
+
+ /*
+ // Wifi status listener
+ onChange: function(accessPoints) {
+ try {
+ var max_ap = accessPoints[0].mac;
+ } catch(e) {
+ return null; // accessPoints[0] is undefined
+ }
+ var max_signal = accessPoints[0].signal;
+ var old_max_present = false;
+ for (var i=0; i<accessPoints.length; i++) {
+ if (accessPoints[i].mac == this.max_ap) {
+ old_max_present = true;
+ }
+ if (accessPoints[i].signal > max_signal) {
+ max_ap = accessPoints[i].mac;
+ max_signal = accessPoints[i].signal;
+ }
+ }
+ this.max_ap = max_ap;
+ if (!old_max_present) {
+ this.log(INFO, "Old access point is out of range. Getting new ASN");
+ this.getClientASN();
+ } else {
+ this.log(DBUG, "Old access point is still in range.");
+ }
+ },
+
+ // Wifi status listener
+ onError: function(value) {
+ // XXX: Do we care?
+ this.log(NOTE, "ASN change observer got an error: "+value);
+ this.getClientASN();
+ },
+ */
+
+ ourFingerprint: function(cert) {
+ // Calculate our custom fingerprint from an nsIX509Cert
+ return (cert.md5Fingerprint+cert.sha1Fingerprint).replace(":", "", "g");
+ },
+
+ // onSecurity is used to listen for bad cert warnings
+ // There is also onSecurityStateChange, but it does not handle subdocuments. See git
+ // history for an implementation stub.
+ onStateChange: function(aProgress, aRequest, aState, aStatus) {
+ if (!aRequest) return;
+ var chan = null;
+ try {
+ chan = aRequest.QueryInterface(Ci.nsIHttpChannel);
+ } catch(e) {
+ return;
+ }
+ if (chan) {
+ if (!this.observatoryActive(chan)) return;
+ var certchain = this.getSSLCertChain(chan);
+ if (certchain) {
+ this.log(INFO, "Got state cert chain for "
+ + chan.originalURI.spec + "->" + chan.URI.spec + ", state: " + aState);
+ var warning = true;
+ this.submitCertChainForChannel(certchain, chan, warning);
+ }
+ }
+ },
+
+ observe: function(subject, topic, data) {
+ if (topic == "cookie-changed" && data == "cleared") {
+ this.already_submitted = {};
+ this.delayed_submissions = {};
+ this.log(INFO, "Cookies were cleared. Purging list of pending and already submitted certs");
+ return;
+ }
+
+ if ("http-on-examine-response" == topic) {
+ var channel = subject;
+ if (!this.observatoryActive(channel)) return;
+
+ var certchain = this.getSSLCertChain(subject);
+ var warning = false;
+ this.submitCertChainForChannel(certchain, channel, warning);
+ }
+
+ if (topic == "network:offline-status-changed" && data == "online") {
+ this.log(INFO, "Browser back online. Getting new ASN.");
+ this.getClientASN();
+ return;
+ }
+
+ if (topic == "nsPref:changed") {
+ // If the user toggles the SSL Observatory settings, we need to add or remove
+ // our observers
+ switch (data) {
+ case "network.proxy.ssl":
+ case "network.proxy.ssl_port":
+ case "network.proxy.socks":
+ case "network.proxy.socks_port":
+ // XXX: We somehow need to only call this once. Right now, we'll make
+ // like 3 calls to getClientASN().. The only thing I can think
+ // of is a timer...
+ this.log(INFO, "Proxy settings have changed. Getting new ASN");
+ this.getClientASN();
+ break;
+ case "extensions.https_everywhere._observatory.enabled":
+ if (this.myGetBoolPref("enabled")) {
+ this.pps.registerFilter(this, 0);
+ OS.addObserver(this, "cookie-changed", false);
+ OS.addObserver(this, "http-on-examine-response", false);
+
+ var dls = CC['@mozilla.org/docloaderservice;1']
+ .getService(CI.nsIWebProgress);
+ dls.addProgressListener(this,
+ Ci.nsIWebProgress.NOTIFY_STATE_REQUEST);
+ this.log(INFO,"SSL Observatory is now enabled via pref change!");
+ } else {
+ try {
+ this.pps.unregisterFilter(this);
+ OS.removeObserver(this, "cookie-changed");
+ OS.removeObserver(this, "http-on-examine-response");
+
+ var dls = CC['@mozilla.org/docloaderservice;1']
+ .getService(CI.nsIWebProgress);
+ dls.removeProgressListener(this);
+ this.log(INFO,"SSL Observatory is now disabled via pref change!");
+ } catch(e) {
+ this.log(WARN, "Removing SSL Observatory observers failed: "+e);
+ }
+ }
+ break;
+ }
+ return;
+ }
+
+ },
+
+ submitCertChainForChannel: function(certchain, channel, warning) {
+ if (!certchain) {
+ return;
+ }
+ var host_ip = "-1";
+ var httpchannelinternal = channel.QueryInterface(Ci.nsIHttpChannelInternal);
+ try {
+ host_ip = httpchannelinternal.remoteAddress;
+ } catch(e) {
+ this.log(INFO, "Could not get server IP address.");
+ }
+
+ channel.QueryInterface(Ci.nsIHttpChannel);
+ var chainEnum = certchain.getChain();
+ var chainArray = [];
+ var chainArrayFpStr = '';
+ var fps = [];
+ for(var i = 0; i < chainEnum.length; i++) {
+ var cert = chainEnum.queryElementAt(i, Ci.nsIX509Cert);
+ chainArray.push(cert);
+ var fp = this.ourFingerprint(cert);
+ fps.push(fp);
+ chainArrayFpStr = chainArrayFpStr + fp;
+ }
+ var chain_hash = sha256_digest(chainArrayFpStr).toUpperCase();
+ this.log(INFO, "SHA-256 hash of cert chain for "+new String(channel.URI.host)+" is "+ chain_hash);
+
+ if(!this.myGetBoolPref("use_whitelist")) {
+ this.log(WARN, "Not using whitelist to filter cert chains.");
+ }
+ else if (this.isChainWhitelisted(chain_hash)) {
+ this.log(INFO, "This cert chain is whitelisted. Not submitting.");
+ return;
+ }
+ else {
+ this.log(INFO, "Cert chain is NOT whitelisted. Proceeding with submission.");
+ }
+
+ if (channel.URI.port == -1) {
+ this.submitChainArray(chainArray, fps, new String(channel.URI.host), channel, host_ip, warning, false);
+ } else {
+ this.submitChainArray(chainArray, fps, channel.URI.host+":"+channel.URI.port, channel, host_ip, warning, false);
+ }
+ },
+
+ observatoryActive: function(channel) {
+
+ if (!this.myGetBoolPref("enabled"))
+ return false;
+
+ if (this.torbutton_installed && this.proxy_test_successful) {
+ // Allow Tor users to choose if they want to submit
+ // during tor and/or non-tor
+ if (this.myGetBoolPref("submit_during_tor") &&
+ this.prefs.getBoolPref("extensions.torbutton.tor_enabled"))
+ return true;
+
+ if (this.myGetBoolPref("submit_during_nontor") &&
+ !this.prefs.getBoolPref("extensions.torbutton.tor_enabled"))
+ return true;
+
+ return false;
+ }
+
+ if (this.proxy_test_successful) {
+ return true;
+ } else if (this.myGetBoolPref("use_custom_proxy")) {
+ // no torbutton; the custom proxy is probably the user opting to
+ // submit certs without strong anonymisation. Because the
+ // anonymisation is weak, we avoid submitting during private browsing
+ // mode.
+ var pbm = this.inPrivateBrowsingMode(channel);
+ this.log(DBUG, "Private browsing mode: " + pbm);
+ return !pbm;
+ }
+ },
+
+ inPrivateBrowsingMode: function(channel) {
+ // In classic firefox fashion, there are multiple versions of this API
+ // https://developer.mozilla.org/EN/docs/Supporting_per-window_private_browsing
+ try {
+ // Firefox 20+, this state is per-window;
+ // should raise an exception on FF < 20
+ CU.import("resource://gre/modules/PrivateBrowsingUtils.jsm");
+ if (!(channel instanceof CI.nsIHttpChannel)) {
+ this.log(NOTE, "observatoryActive() without a channel");
+ // This is a windowless request. We cannot tell if private browsing
+ // applies. Conservatively, if we have ever seen PBM, it might be
+ // active now
+ return this.everSeenPrivateBrowsing;
+ }
+ var win = this.HTTPSEverywhere.getWindowForChannel(channel);
+ if (!win) return this.everSeenPrivateBrowsing; // windowless request
+
+ if (PrivateBrowsingUtils.isWindowPrivate(win)) {
+ this.everSeenPrivateBrowsing = true;
+ return true;
+ }
+ } catch (e) {
+ // Firefox < 20, this state is global
+ try {
+ var pbs = CC["@mozilla.org/privatebrowsing;1"].getService(CI.nsIPrivateBrowsingService);
+ if (pbs.privateBrowsingEnabled) {
+ this.everSeenPrivateBrowsing = true;
+ return true;
+ }
+ } catch (e) { /* seamonkey or very old firefox */ }
+ }
+ return false;
+ },
+
+ myGetBoolPref: function(prefstring) {
+ // syntactic sugar
+ return this.prefs.getBoolPref ("extensions.https_everywhere._observatory." + prefstring);
+ },
+
+ isChainWhitelisted: function(chainhash) {
+ if (X509ChainWhitelist == null) {
+ this.log(WARN, "Could not find whitelist of popular certificate chains, so ignoring whitelist");
+ return false;
+ }
+ if (X509ChainWhitelist[chainhash] != null) {
+ return true;
+ }
+ return false;
+ },
+
+ findRootInChain: function(certArray) {
+ // Return the position in the chain Array of the/a root CA
+ var rootidx = -1;
+ var nextInChain = certArray[0].issuer;
+ for (var i = 0; i < certArray.length; i++) {
+ // Find the next cert in the valid chain
+ if (certArray[i].equals(nextInChain)) {
+ if (certArray[i].issuerName == certArray[i].subjectName) {
+ // All X509 root certs are self-signed
+ this.log(INFO, "Got root cert at position: "+i);
+ rootidx = i;
+ break;
+ } else {
+ // This is an intermediate CA cert; keep looking for the root
+ nextInChain = certArray[i].issuer;
+ }
+ }
+ }
+ return rootidx;
+ },
+
+ processConvergenceChain: function(chain) {
+ // Make sure the chain we're working with is sane, even if Convergence is
+ // present.
+
+ // Convergence currently performs MITMs against the Firefox in order to
+ // get around https://bugzilla.mozilla.org/show_bug.cgi?id=644640. The
+ // end-entity cert produced by Convergence contains a copy of the real
+ // end-entity cert inside an X509v3 extension. We extract this and send
+ // it rather than the Convergence certs.
+ var convergence = Components.classes['@thoughtcrime.org/convergence;1'];
+ if (!convergence) return null;
+ convergence = convergence.getService().wrappedJSObject;
+ if (!convergence || !convergence.enabled) return null;
+
+ this.log(INFO, "Convergence uses its own internal root certs; not submitting those");
+
+ //this.log(WARN, convergence.certificateStatus.getVerificiationStatus(chain.certArray[0]));
+ try {
+ var certInfo = this.extractRealLeafFromConveregenceLeaf(chain.certArray[0]);
+ var b64Cert = certInfo["certificate"];
+ var certDB = Cc["@mozilla.org/security/x509certdb;1"].getService(Ci.nsIX509CertDB);
+ chain.leaf = certDB.constructX509FromBase64(b64Cert);
+ chain.certArray = [chain.leaf];
+ chain.fps = [this.ourFingerprint(chain.leaf)];
+ } catch (e) {
+ this.log(WARN, "Failed to extract leaf cert from Convergence cert " + e);
+ chain.certArray = chain.certArray.slice(0,1);
+ chain.fps = chain.fps.slice(0,1);
+ }
+
+ },
+
+ extractRealLeafFromConveregenceLeaf: function(certificate) {
+ // Copied from Convergence's CertificateStatus.getVerificiationStatus
+ var len = {};
+ var derEncoding = certificate.getRawDER(len);
+
+ var derItem = NSS.types.SECItem();
+ derItem.data = NSS.lib.ubuffer(derEncoding);
+ derItem.len = len.value;
+
+ var completeCertificate = NSS.lib.CERT_DecodeDERCertificate(derItem.address(), 1, null);
+
+ var extItem = NSS.types.SECItem();
+ var status = NSS.lib.CERT_FindCertExtension(completeCertificate,
+ NSS.lib.SEC_OID_NS_CERT_EXT_COMMENT,
+ extItem.address());
+ if (status != -1) {
+ var encoded = '';
+ var asArray = ctypes.cast(extItem.data, ctypes.ArrayType(ctypes.unsigned_char, extItem.len).ptr).contents;
+ var marker = false;
+
+ for (var i=0;i<asArray.length;i++) {
+ if (marker) {
+ encoded += String.fromCharCode(asArray[i]);
+ } else if (asArray[i] == 0x00) {
+ marker = true;
+ }
+ }
+
+ return JSON.parse(encoded);
+ }
+ },
+
+ shouldSubmit: function(chain, domain) {
+ // Return true if we should submit this chain to the SSL Observatory
+ var rootidx = this.findRootInChain(chain.certArray);
+ var ss = false; // ss: self-signed
+
+ if (chain.leaf.issuerName == chain.leaf.subjectName)
+ ss = true;
+
+ if (!this.myGetBoolPref("self_signed") && ss) {
+ this.log(INFO, "Not submitting self-signed cert for " + domain);
+ return false;
+ }
+
+ if (!ss && !this.myGetBoolPref("alt_roots")) {
+ if (rootidx == -1) {
+ // A cert with an unknown/absent Issuer. Out of caution, don't submit these
+ this.log(INFO, "Cert for " + domain + " issued by unknown CA " +
+ chain.leaf.issuerName + " (not submitting due to settings)");
+ return false;
+ } else if (!(chain.fps[rootidx] in this.public_roots)) {
+ // A cert with a known but non-public Issuer
+ this.log(INFO, "Got a private root cert. Ignoring domain "
+ +domain+" with root "+chain.fps[rootidx]);
+ return false;
+ }
+ }
+
+ if (chain.fps[0] in this.already_submitted) {
+ this.log(INFO, "Already submitted cert for "+domain+". Ignoring");
+ return false;
+ }
+ return true;
+ },
+
+ submitChainArray: function(certArray, fps, domain, channel, host_ip, warning, resubmitting) {
+ var base64Certs = [];
+ // Put all this chain data in one object so that it can be modified by
+ // subroutines if required
+ var c = {}; c.certArray = certArray; c.fps = fps; c.leaf = certArray[0];
+ this.processConvergenceChain(c);
+ if (!this.shouldSubmit(c,domain)) return;
+
+ // only try to submit now if there aren't too many outstanding requests
+ if (this.current_outstanding_requests > MAX_OUTSTANDING) {
+ this.log(WARN, "Too many outstanding requests ("+this.current_outstanding_requests+"), not submitting");
+
+ // if there are too many current requests but not too many
+ // delayed/pending ones, then delay this one
+ if (Object.keys(this.delayed_submissions).length < MAX_DELAYED)
+ if (!(c.fps[0] in this.delayed_submissions)) {
+ this.log(WARN, "Planning to retry submission...");
+ let retry = function() { this.submitChainArray(certArray, fps, domain, channel, host_ip, warning, true); };
+ this.delayed_submissions[c.fps[0]] = retry;
+ }
+ return;
+ }
+
+ for (var i = 0; i < c.certArray.length; i++) {
+ var len = new Object();
+ var derData = c.certArray[i].getRawDER(len);
+ let result = "";
+ for (let j = 0, dataLength = derData.length; j < dataLength; ++j)
+ result += String.fromCharCode(derData[j]);
+ base64Certs.push(btoa(result));
+ }
+
+ var reqParams = [];
+ reqParams.push("domain="+domain);
+ reqParams.push("server_ip="+host_ip);
+ if (this.myGetBoolPref("testing")) {
+ reqParams.push("testing=1");
+ // The server can compute these, but they're a nice test suite item!
+ reqParams.push("fplist="+this.compatJSON.encode(c.fps));
+ }
+ reqParams.push("certlist="+this.compatJSON.encode(base64Certs));
+
+ if (resubmitting) {
+ reqParams.push("client_asn="+ASN_UNKNOWABLE);
+ } else {
+ reqParams.push("client_asn="+this.client_asn);
+ }
+
+ if (this.myGetBoolPref("priv_dns")) {
+ reqParams.push("private_opt_in=1");
+ } else {
+ reqParams.push("private_opt_in=0");
+ }
+
+ if (warning) {
+ reqParams.push("browser_warning=1");
+ } else {
+ reqParams.push("browser_warning=0");
+ }
+
+ var params = reqParams.join("&") + "&padding=0";
+ var tot_len = BASE_REQ_SIZE;
+
+ this.log(INFO, "Submitting cert for "+domain);
+ this.log(DBUG, "submit_cert params: "+params);
+
+ // Pad to exp scale. This is done because the distribution of cert sizes
+ // is almost certainly pareto, and definitely not uniform.
+ for (tot_len = BASE_REQ_SIZE; tot_len < params.length; tot_len*=2);
+
+ while (params.length != tot_len) {
+ params += "0";
+ }
+
+ var that = this; // We have neither SSLObservatory nor this in scope in the lambda
+
+ var win = channel ? this.HTTPSEverywhere.getWindowForChannel(channel) : null;
+ var req = this.buildRequest(params);
+ req.timeout = TIMEOUT;
+
+ req.onreadystatechange = function(evt) {
+ if (req.readyState == 4) {
+ // pop off one outstanding request
+ that.current_outstanding_requests -= 1;
+ that.log(DBUG, "Popping one off of outstanding requests, current num is: "+that.current_outstanding_requests);
+
+ if (req.status == 200) {
+ that.log(INFO, "Successful cert submission");
+ if (!that.prefs.getBoolPref("extensions.https_everywhere._observatory.cache_submitted"))
+ if (c.fps[0] in that.already_submitted)
+ delete that.already_submitted[c.fps[0]];
+
+ // Retry up to two previously failed submissions
+ let n = 0;
+ for (let fp in that.delayed_submissions) {
+ that.log(WARN, "Retrying a submission...");
+ that.delayed_submissions[fp]();
+ delete that.delayed_submissions[fp];
+ if (++n >= 2) break;
+ }
+ } else if (req.status == 403) {
+ that.log(WARN, "The SSL Observatory has issued a warning about this certificate for " + domain);
+ try {
+ var warningObj = JSON.parse(req.responseText);
+ if (win) that.warnUser(warningObj, win, c.certArray[0]);
+ } catch(e) {
+ that.log(WARN, "Failed to process SSL Observatory cert warnings :( " + e);
+ that.log(WARN, req.responseText);
+ }
+ } else {
+ // Submission failed
+ if (c.fps[0] in that.already_submitted)
+ delete that.already_submitted[c.fps[0]];
+ try {
+ that.log(WARN, "Cert submission failure "+req.status+": "+req.responseText);
+ } catch(e) {
+ that.log(WARN, "Cert submission failure and exception: "+e);
+ }
+ // If we don't have too many delayed submissions, and this isn't
+ // (somehow?) one of them, then plan to retry this submission later
+ if (Object.keys(that.delayed_submissions).length < MAX_DELAYED)
+ if (!(c.fps[0] in that.delayed_submissions)) {
+ that.log(WARN, "Planning to retry submission...");
+ let retry = function() { that.submitChainArray(certArray, fps, domain, channel, host_ip, warning, true); };
+ that.delayed_submissions[c.fps[0]] = retry;
+ }
+
+ }
+ }
+ };
+
+ // Cache this here to prevent multiple submissions for all the content elements.
+ that.already_submitted[c.fps[0]] = true;
+
+ // add one to current outstanding request number
+ that.current_outstanding_requests += 1;
+ that.log(DBUG, "Adding outstanding request, current num is: "+that.current_outstanding_requests);
+ req.send(params);
+ },
+
+ buildRequest: function(params) {
+ var req = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
+ .createInstance(Ci.nsIXMLHttpRequest);
+
+ // We do this again in case the user altered about:config
+ this.findSubmissionTarget();
+ req.open("POST", this.submit_url+this.csrf_nonce, true);
+
+ // Send the proper header information along with the request
+ // Do not set gzip header.. It will ruin the padding
+ req.setRequestHeader("X-Privacy-Info", "EFF SSL Observatory: https://eff.org/r.22c");
+ req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+ req.setRequestHeader("Content-length", params.length);
+ req.setRequestHeader("Connection", "close");
+ // Need to clear useragent and other headers..
+ req.setRequestHeader("User-Agent", "");
+ req.setRequestHeader("Accept", "");
+ req.setRequestHeader("Accept-Language", "");
+ req.setRequestHeader("Accept-Encoding", "");
+ req.setRequestHeader("Accept-Charset", "");
+ return req;
+ },
+
+ warnUser: function(warningObj, win, cert) {
+ var aWin = CC['@mozilla.org/appshell/window-mediator;1']
+ .getService(CI.nsIWindowMediator)
+ .getMostRecentWindow('navigator:browser');
+ aWin.openDialog("chrome://https-everywhere/content/observatory-warning.xul",
+ "","chrome,centerscreen", warningObj, win, cert);
+ },
+
+ registerProxyTestNotification: function(callback_fcn) {
+ if (this.proxy_test_successful != null) {
+ /* Proxy test already ran. Callback immediately. */
+ callback_fcn(this.proxy_test_successful);
+ this.proxy_test_callback = null;
+ return;
+ } else {
+ this.proxy_test_callback = callback_fcn;
+ }
+ },
+
+ testProxySettings: function() {
+ /* Plan:
+ * 1. Launch an async XMLHttpRequest to check.tp.o with magic nonce
+ * 3. Filter the nonce in protocolProxyFilter to use proxy settings
+ * 4. Async result function sets test result status based on check.tp.o
+ */
+ this.proxy_test_successful = null;
+
+ try {
+ var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
+ .createInstance(Components.interfaces.nsIXMLHttpRequest);
+ var url = this.cto_url + this.csrf_nonce;
+ req.open('GET', url, true);
+ req.channel.loadFlags |= Ci.nsIRequest.LOAD_BYPASS_CACHE;
+ req.overrideMimeType("text/xml");
+ var that = this; // Scope gymnastics for async callback
+ req.onreadystatechange = function (oEvent) {
+ if (req.readyState === 4) {
+ that.proxy_test_successful = false;
+
+ if(req.status == 200) {
+ if(!req.responseXML) {
+ that.log(INFO, "Tor check failed: No XML returned by check service.");
+ that.proxyTestFinished();
+ return;
+ }
+
+ var result = req.responseXML.getElementById('TorCheckResult');
+ if(result===null) {
+ that.log(INFO, "Tor check failed: Non-XML returned by check service.");
+ } else if(typeof(result.target) == 'undefined'
+ || result.target === null) {
+ that.log(INFO, "Tor check failed: Busted XML returned by check service.");
+ } else if(result.target === "success") {
+ that.log(INFO, "Tor check succeeded.");
+ that.proxy_test_successful = true;
+ } else {
+ that.log(INFO, "Tor check failed: "+result.target);
+ }
+ } else {
+ that.log(INFO, "Tor check failed: HTTP Error "+req.status);
+ }
+
+ /* Notify the UI of the test result */
+ if (that.proxy_test_callback) {
+ that.proxy_test_callback(that.proxy_test_successful);
+ that.proxy_test_callback = null;
+ }
+ that.proxyTestFinished();
+ }
+ };
+ req.send(null);
+ } catch(e) {
+ this.proxy_test_successful = false;
+ if(e.result == 0x80004005) { // NS_ERROR_FAILURE
+ this.log(INFO, "Tor check failed: Proxy not running.");
+ }
+ this.log(INFO, "Tor check failed: Internal error: "+e);
+ if (this.proxy_test_callback) {
+ this.proxy_test_callback(this.proxy_test_successful);
+ this.proxy_test_callback = null;
+ }
+ that.proxyTestFinished();
+ }
+ },
+
+ proxyTestFinished: function() {
+ if (!this.myGetBoolPref("enabled")) {
+ this.pps.unregisterFilter(this);
+ }
+ },
+
+ getProxySettings: function(testingForTor) {
+ // This may be called either for an Observatory submission, or during a test to see if Tor is
+ // present. The testingForTor argument is true in the latter case.
+ var proxy_settings = ["direct", "", 0];
+ this.log(INFO,"in getProxySettings()");
+ var custom_proxy_type = this.prefs.getCharPref("extensions.https_everywhere._observatory.proxy_type");
+ if (this.torbutton_installed && this.myGetBoolPref("use_tor_proxy")) {
+ this.log(INFO,"CASE: use_tor_proxy");
+ // extract torbutton proxy settings
+ proxy_settings[0] = "http";
+ proxy_settings[1] = this.prefs.getCharPref("extensions.torbutton.https_proxy");
+ proxy_settings[2] = this.prefs.getIntPref("extensions.torbutton.https_port");
+
+ if (proxy_settings[2] == 0) {
+ proxy_settings[0] = "socks";
+ proxy_settings[1] = this.prefs.getCharPref("extensions.torbutton.socks_host");
+ proxy_settings[2] = this.prefs.getIntPref("extensions.torbutton.socks_port");
+ }
+ /* Regarding the test below:
+ *
+ * custom_proxy_type == "direct" is indicative of the user having selected "submit certs even if
+ * Tor is not available", rather than true custom Tor proxy settings. So in that case, there's
+ * not much point probing to see if the direct proxy is actually a Tor connection, and
+ * localhost:9050 is a better bet. People whose networks send all traffc through Tor can just
+ * tell the Observatory to submit certs without Tor.
+ */
+ } else if (this.myGetBoolPref("use_custom_proxy") && !(testingForTor && custom_proxy_type == "direct")) {
+ this.log(INFO,"CASE: use_custom_proxy");
+ proxy_settings[0] = custom_proxy_type;
+ proxy_settings[1] = this.prefs.getCharPref("extensions.https_everywhere._observatory.proxy_host");
+ proxy_settings[2] = this.prefs.getIntPref("extensions.https_everywhere._observatory.proxy_port");
+ } else {
+ /* Take a guess at default tor proxy settings */
+ this.log(INFO,"CASE: try localhost:9050");
+ proxy_settings[0] = "socks";
+ proxy_settings[1] = "localhost";
+ proxy_settings[2] = 9050;
+ }
+ this.log(INFO, "Using proxy: " + proxy_settings);
+ return proxy_settings;
+ },
+
+ applyFilter: function(aProxyService, inURI, aProxy) {
+
+ try {
+ if (inURI instanceof Ci.nsIURI) {
+ var aURI = inURI.QueryInterface(Ci.nsIURI);
+ if (!aURI) this.log(WARN, "Failed to QI to nsIURI!");
+ } else {
+ this.log(WARN, "applyFilter called without URI");
+ }
+ } catch (e) {
+ this.log(WARN, "EXPLOSION: " + e);
+ }
+
+ var isSubmission = this.submission_regexp.test(aURI.spec);
+ var testingForTor = this.cto_regexp.test(aURI.spec);
+
+ if (isSubmission || testingForTor) {
+ if (aURI.path.search(this.csrf_nonce+"$") != -1) {
+
+ this.log(INFO, "Got observatory url + nonce: "+aURI.spec);
+ var proxy_settings = null;
+ var proxy = null;
+
+ // Send it through tor by creating an nsIProxy instance
+ // for the torbutton proxy settings.
+ try {
+ proxy_settings = this.getProxySettings(testingForTor);
+ proxy = this.pps.newProxyInfo(proxy_settings[0], proxy_settings[1],
+ proxy_settings[2],
+ Ci.nsIProxyInfo.TRANSPARENT_PROXY_RESOLVES_HOST,
+ 0xFFFFFFFF, null);
+ } catch(e) {
+ this.log(WARN, "Error specifying proxy for observatory: "+e);
+ }
+
+ this.log(INFO, "Specifying proxy: "+proxy);
+
+ // TODO: Use new identity or socks u/p to ensure we get a unique
+ // tor circuit for this request
+ return proxy;
+ }
+ }
+ return aProxy;
+ },
+
+ // [optional] an array of categories to register this component in.
+ // Hack to cause us to get instantiate early
+ _xpcom_categories: [ { category: "profile-after-change" }, ],
+
+ encString: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
+ encStringS: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',
+
+ log: function(level, str) {
+ var econsole = CC["@mozilla.org/consoleservice;1"]
+ .getService(CI.nsIConsoleService);
+ try {
+ var threshold = this.prefs.getIntPref(LLVAR);
+ } catch (e) {
+ econsole.logStringMessage( "SSL Observatory: Failed to read about:config LogLevel");
+ threshold = WARN;
+ }
+ if (level >= threshold) {
+ dump("SSL Observatory: "+str+"\n");
+ econsole.logStringMessage("SSL Observatory: " +str);
+ }
+ }
+};
+
+/**
+* XPCOMUtils.generateNSGetFactory was introduced in Mozilla 2 (Firefox 4).
+* XPCOMUtils.generateNSGetModule is for Mozilla 1.9.2 (Firefox 3.6).
+*/
+if (XPCOMUtils.generateNSGetFactory)
+ var NSGetFactory = XPCOMUtils.generateNSGetFactory([SSLObservatory]);
+else
+ var NSGetModule = XPCOMUtils.generateNSGetModule([SSLObservatory]);
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/defaults/preferences/preferences.js b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/defaults/preferences/preferences.js
new file mode 100644
index 0000000..205bf8d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/defaults/preferences/preferences.js
@@ -0,0 +1,45 @@
+pref("extensions.https_everywhere.LogLevel", 5);
+pref("extensions.https_everywhere.globalEnabled",true);
+
+// this is the HTTPS Everywhere preferences version (for migrations)
+pref("extensions.https_everywhere.prefs_version", 0);
+
+// this is a popup asking whether the user really meant to be on the dev branch
+pref("extensions.https_everywhere.dev_popup_shown", false);
+
+// show ruleset tests in the menu
+pref("extensions.https_everywhere.show_ruleset_tests", false);
+// run a ruleset performance test at startup
+pref("extensions.https_everywhere.performance_tests", false);
+
+// enable rulesets that trigger mixed content blocking
+pref("extensions.https_everywhere.enable_mixed_rulesets", false);
+
+
+// SSl Observatory preferences
+pref("extensions.https_everywhere._observatory.enabled",false);
+
+// "testing" currently means send unecessary fingerprints and other test-suite
+// type stuff
+pref("extensions.https_everywhere._observatory.testing",false);
+
+pref("extensions.https_everywhere._observatory.server_host","observatory.eff.org");
+pref("extensions.https_everywhere._observatory.use_tor_proxy",true);
+pref("extensions.https_everywhere._observatory.submit_during_tor",true);
+pref("extensions.https_everywhere._observatory.submit_during_nontor",true);
+
+pref("extensions.https_everywhere._observatory.cache_submitted",true);
+
+pref("extensions.https_everywhere._observatory.use_custom_proxy",false);
+pref("extensions.https_everywhere._observatory.popup_shown",true);
+pref("extensions.https_everywhere.toolbar_hint_shown",true);
+pref("extensions.https_everywhere._observatory.proxy_host","");
+pref("extensions.https_everywhere._observatory.proxy_port",0);
+pref("extensions.https_everywhere._observatory.proxy_type","direct");
+pref("extensions.https_everywhere._observatory.use_tor_proxy",true);
+pref("extensions.https_everywhere._observatory.alt_roots",false);
+pref("extensions.https_everywhere._observatory.self_signed",true);
+pref("extensions.https_everywhere._observatory.priv_dns",false);
+pref("extensions.https_everywhere._observatory.send_asn",true);
+pref("extensions.https_everywhere._observatory.use_whitelist",true);
+pref("extensions.https_everywhere._observatory.clean_config",false);
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/defaults/rulesets.sqlite b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/defaults/rulesets.sqlite
new file mode 100644
index 0000000..6141547
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/defaults/rulesets.sqlite
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/install.rdf b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/install.rdf
new file mode 100644
index 0000000..ddb6e14
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/https-everywhere@eff.org/install.rdf
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+
+ <Description about="urn:mozilla:install-manifest">
+ <em:name>HTTPS-Everywhere</em:name>
+ <em:creator>Mike Perry &amp; Peter Eckersley</em:creator>
+ <em:aboutURL>chrome://https-everywhere/content/about.xul</em:aboutURL>
+ <em:id>https-everywhere@eff.org</em:id>
+ <em:description>Encrypt the Web! Automatically use HTTPS security on many sites.</em:description>
+ <em:version>3.5.1</em:version>
+ <em:homepageURL>https://www.eff.org/https-everywhere</em:homepageURL>
+ <em:optionsURL>chrome://https-everywhere/content/meta-preferences.xul</em:optionsURL>
+ <em:iconURL>chrome://https-everywhere/skin/https-everywhere.png</em:iconURL>
+ <em:updateURL>https://www.eff.org/files/https-everywhere-update-2048.rdf</em:updateURL>
+ <em:unpack>true</em:unpack> <!-- Required for Firefox 4 -->
+ <em:updateKey>MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6MR8W/galdxnpGqBsYbqOzQb2eyW15YFjDDEMI0ZOzt8f504obNs920lDnpPD2/KqgsfjOgw2K7xWDJIj/18xUvWPk3LDkrnokNiRkA3KOx3W6fHycKL+zID7zy+xZYBuh2fLyQtWV1VGQ45iNRp9+Zo7rH86cdfgkdnWTlNSHyTLW9NbXvyv/E12bppPcEvgCTAQXgnDVJ0/sqmeiijn9tTFh03aM+R2V/21h8aTraAS24qiPCz6gkmYGC8yr6mglcnNoYbsLNYZ69zF1XHcXPduCPdPdfLlzVlKK1/U7hkA28eG3BIAMh6uJYBRJTpiGgaGdPd7YekUB8S6cy+CQIDAQAB</em:updateKey>
+ <!-- firefox -->
+ <em:targetApplication>
+ <Description>
+ <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
+ <em:minVersion>20</em:minVersion>
+ <em:maxVersion>32.*</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ <!-- Seamonkey -->
+ <em:targetApplication>
+ <Description>
+ <em:id>{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}</em:id>
+ <em:minVersion>2.17</em:minVersion>
+ <em:maxVersion>3.*</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ <!-- thunderbird -->
+ <em:targetApplication>
+ <Description>
+ <em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</em:id>
+ <em:minVersion>17.0.5</em:minVersion>
+ <em:maxVersion>32</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ <!-- Conkeror -->
+ <em:targetApplication>
+ <Description>
+ <em:id>{a79fe89b-6662-4ff4-8e88-09950ad4dfde}</em:id>
+ <em:minVersion>0.1</em:minVersion>
+ <em:maxVersion>99.*</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ </Description>
+</RDF>
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/bootstrap.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/bootstrap.js
new file mode 100644
index 0000000..840103a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/bootstrap.js
@@ -0,0 +1,350 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// @see http://mxr.mozilla.org/mozilla-central/source/js/src/xpconnect/loader/mozJSComponentLoader.cpp
+
+'use strict';
+
+// IMPORTANT: Avoid adding any initialization tasks here, if you need to do
+// something before add-on is loaded consider addon/runner module instead!
+
+const { classes: Cc, Constructor: CC, interfaces: Ci, utils: Cu,
+ results: Cr, manager: Cm } = Components;
+const ioService = Cc['@mozilla.org/network/io-service;1'].
+ getService(Ci.nsIIOService);
+const resourceHandler = ioService.getProtocolHandler('resource').
+ QueryInterface(Ci.nsIResProtocolHandler);
+const systemPrincipal = CC('@mozilla.org/systemprincipal;1', 'nsIPrincipal')();
+const scriptLoader = Cc['@mozilla.org/moz/jssubscript-loader;1'].
+ getService(Ci.mozIJSSubScriptLoader);
+const prefService = Cc['@mozilla.org/preferences-service;1'].
+ getService(Ci.nsIPrefService).
+ QueryInterface(Ci.nsIPrefBranch);
+const appInfo = Cc["@mozilla.org/xre/app-info;1"].
+ getService(Ci.nsIXULAppInfo);
+const vc = Cc["@mozilla.org/xpcom/version-comparator;1"].
+ getService(Ci.nsIVersionComparator);
+
+
+const REASON = [ 'unknown', 'startup', 'shutdown', 'enable', 'disable',
+ 'install', 'uninstall', 'upgrade', 'downgrade' ];
+
+const bind = Function.call.bind(Function.bind);
+
+let loader = null;
+let unload = null;
+let cuddlefishSandbox = null;
+let nukeTimer = null;
+
+let resourceDomains = [];
+function setResourceSubstitution(domain, uri) {
+ resourceDomains.push(domain);
+ resourceHandler.setSubstitution(domain, uri);
+}
+
+// Utility function that synchronously reads local resource from the given
+// `uri` and returns content string.
+function readURI(uri) {
+ let ioservice = Cc['@mozilla.org/network/io-service;1'].
+ getService(Ci.nsIIOService);
+ let channel = ioservice.newChannel(uri, 'UTF-8', null);
+ let stream = channel.open();
+
+ let cstream = Cc['@mozilla.org/intl/converter-input-stream;1'].
+ createInstance(Ci.nsIConverterInputStream);
+ cstream.init(stream, 'UTF-8', 0, 0);
+
+ let str = {};
+ let data = '';
+ let read = 0;
+ do {
+ read = cstream.readString(0xffffffff, str);
+ data += str.value;
+ } while (read != 0);
+
+ cstream.close();
+
+ return data;
+}
+
+// We don't do anything on install & uninstall yet, but in a future
+// we should allow add-ons to cleanup after uninstall.
+function install(data, reason) {}
+function uninstall(data, reason) {}
+
+function startup(data, reasonCode) {
+ try {
+ let reason = REASON[reasonCode];
+ // URI for the root of the XPI file.
+ // 'jar:' URI if the addon is packed, 'file:' URI otherwise.
+ // (Used by l10n module in order to fetch `locale` folder)
+ let rootURI = data.resourceURI.spec;
+
+ // TODO: Maybe we should perform read harness-options.json asynchronously,
+ // since we can't do anything until 'sessionstore-windows-restored' anyway.
+ let options = JSON.parse(readURI(rootURI + './harness-options.json'));
+
+ let id = options.jetpackID;
+ let name = options.name;
+
+ // Clean the metadata
+ options.metadata[name]['permissions'] = options.metadata[name]['permissions'] || {};
+
+ // freeze the permissionss
+ Object.freeze(options.metadata[name]['permissions']);
+ // freeze the metadata
+ Object.freeze(options.metadata[name]);
+
+ // Register a new resource 'domain' for this addon which is mapping to
+ // XPI's `resources` folder.
+ // Generate the domain name by using jetpack ID, which is the extension ID
+ // by stripping common characters that doesn't work as a domain name:
+ let uuidRe =
+ /^\{([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\}$/;
+
+ let domain = id.
+ toLowerCase().
+ replace(/@/g, '-at-').
+ replace(/\./g, '-dot-').
+ replace(uuidRe, '$1');
+
+ let prefixURI = 'resource://' + domain + '/';
+ let resourcesURI = ioService.newURI(rootURI + '/resources/', null, null);
+ setResourceSubstitution(domain, resourcesURI);
+
+ // Create path to URLs mapping supported by loader.
+ let paths = {
+ // Relative modules resolve to add-on package lib
+ './': prefixURI + name + '/lib/',
+ './tests/': prefixURI + name + '/tests/',
+ '': 'resource://gre/modules/commonjs/'
+ };
+
+ // Maps addon lib and tests ressource folders for each package
+ paths = Object.keys(options.metadata).reduce(function(result, name) {
+ result[name + '/'] = prefixURI + name + '/lib/'
+ result[name + '/tests/'] = prefixURI + name + '/tests/'
+ return result;
+ }, paths);
+
+ // We need to map tests folder when we run sdk tests whose package name
+ // is stripped
+ if (name == 'addon-sdk')
+ paths['tests/'] = prefixURI + name + '/tests/';
+
+ let useBundledSDK = options['force-use-bundled-sdk'];
+ if (!useBundledSDK) {
+ try {
+ useBundledSDK = prefService.getBoolPref("extensions.addon-sdk.useBundledSDK");
+ }
+ catch (e) {
+ // Pref doesn't exist, allow using Firefox shipped SDK
+ }
+ }
+
+ // Starting with Firefox 21.0a1, we start using modules shipped into firefox
+ // Still allow using modules from the xpi if the manifest tell us to do so.
+ // And only try to look for sdk modules in xpi if the xpi actually ship them
+ if (options['is-sdk-bundled'] &&
+ (vc.compare(appInfo.version, '21.0a1') < 0 || useBundledSDK)) {
+ // Maps sdk module folders to their resource folder
+ paths[''] = prefixURI + 'addon-sdk/lib/';
+ // test.js is usually found in root commonjs or SDK_ROOT/lib/ folder,
+ // so that it isn't shipped in the xpi. Keep a copy of it in sdk/ folder
+ // until we no longer support SDK modules in XPI:
+ paths['test'] = prefixURI + 'addon-sdk/lib/sdk/test.js';
+ }
+
+ // Retrieve list of module folder overloads based on preferences in order to
+ // eventually used a local modules instead of files shipped into Firefox.
+ let branch = prefService.getBranch('extensions.modules.' + id + '.path');
+ paths = branch.getChildList('', {}).reduce(function (result, name) {
+ // Allows overloading of any sub folder by replacing . by / in pref name
+ let path = name.substr(1).split('.').join('/');
+ // Only accept overloading folder by ensuring always ending with `/`
+ if (path) path += '/';
+ let fileURI = branch.getCharPref(name);
+
+ // On mobile, file URI has to end with a `/` otherwise, setSubstitution
+ // takes the parent folder instead.
+ if (fileURI[fileURI.length-1] !== '/')
+ fileURI += '/';
+
+ // Maps the given file:// URI to a resource:// in order to avoid various
+ // failure that happens with file:// URI and be close to production env
+ let resourcesURI = ioService.newURI(fileURI, null, null);
+ let resName = 'extensions.modules.' + domain + '.commonjs.path' + name;
+ setResourceSubstitution(resName, resourcesURI);
+
+ result[path] = 'resource://' + resName + '/';
+ return result;
+ }, paths);
+
+ // Make version 2 of the manifest
+ let manifest = options.manifest;
+
+ // Import `cuddlefish.js` module using a Sandbox and bootstrap loader.
+ let cuddlefishPath = 'loader/cuddlefish.js';
+ let cuddlefishURI = 'resource://gre/modules/commonjs/sdk/' + cuddlefishPath;
+ if (paths['sdk/']) { // sdk folder has been overloaded
+ // (from pref, or cuddlefish is still in the xpi)
+ cuddlefishURI = paths['sdk/'] + cuddlefishPath;
+ }
+ else if (paths['']) { // root modules folder has been overloaded
+ cuddlefishURI = paths[''] + 'sdk/' + cuddlefishPath;
+ }
+
+ cuddlefishSandbox = loadSandbox(cuddlefishURI);
+ let cuddlefish = cuddlefishSandbox.exports;
+
+ // Normalize `options.mainPath` so that it looks like one that will come
+ // in a new version of linker.
+ let main = options.mainPath;
+
+ unload = cuddlefish.unload;
+ loader = cuddlefish.Loader({
+ paths: paths,
+ // modules manifest.
+ manifest: manifest,
+
+ // Add-on ID used by different APIs as a unique identifier.
+ id: id,
+ // Add-on name.
+ name: name,
+ // Add-on version.
+ version: options.metadata[name].version,
+ // Add-on package descriptor.
+ metadata: options.metadata[name],
+ // Add-on load reason.
+ loadReason: reason,
+
+ prefixURI: prefixURI,
+ // Add-on URI.
+ rootURI: rootURI,
+ // options used by system module.
+ // File to write 'OK' or 'FAIL' (exit code emulation).
+ resultFile: options.resultFile,
+ // Arguments passed as --static-args
+ staticArgs: options.staticArgs,
+ // Add-on preferences branch name
+ preferencesBranch: options.preferencesBranch,
+
+ // Arguments related to test runner.
+ modules: {
+ '@test/options': {
+ allTestModules: options.allTestModules,
+ iterations: options.iterations,
+ filter: options.filter,
+ profileMemory: options.profileMemory,
+ stopOnError: options.stopOnError,
+ verbose: options.verbose,
+ parseable: options.parseable,
+ checkMemory: options.check_memory,
+ }
+ }
+ });
+
+ let module = cuddlefish.Module('sdk/loader/cuddlefish', cuddlefishURI);
+ let require = cuddlefish.Require(loader, module);
+
+ require('sdk/addon/runner').startup(reason, {
+ loader: loader,
+ main: main,
+ prefsURI: rootURI + 'defaults/preferences/prefs.js'
+ });
+ } catch (error) {
+ dump('Bootstrap error: ' +
+ (error.message ? error.message : String(error)) + '\n' +
+ (error.stack || error.fileName + ': ' + error.lineNumber) + '\n');
+ throw error;
+ }
+};
+
+function loadSandbox(uri) {
+ let proto = {
+ sandboxPrototype: {
+ loadSandbox: loadSandbox,
+ ChromeWorker: ChromeWorker
+ }
+ };
+ let sandbox = Cu.Sandbox(systemPrincipal, proto);
+ // Create a fake commonjs environnement just to enable loading loader.js
+ // correctly
+ sandbox.exports = {};
+ sandbox.module = { uri: uri, exports: sandbox.exports };
+ sandbox.require = function (id) {
+ if (id !== "chrome")
+ throw new Error("Bootstrap sandbox `require` method isn't implemented.");
+
+ return Object.freeze({ Cc: Cc, Ci: Ci, Cu: Cu, Cr: Cr, Cm: Cm,
+ CC: bind(CC, Components), components: Components,
+ ChromeWorker: ChromeWorker });
+ };
+ scriptLoader.loadSubScript(uri, sandbox, 'UTF-8');
+ return sandbox;
+}
+
+function unloadSandbox(sandbox) {
+ if ("nukeSandbox" in Cu)
+ Cu.nukeSandbox(sandbox);
+}
+
+function setTimeout(callback, delay) {
+ let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ timer.initWithCallback({ notify: callback }, delay,
+ Ci.nsITimer.TYPE_ONE_SHOT);
+ return timer;
+}
+
+function shutdown(data, reasonCode) {
+ let reason = REASON[reasonCode];
+ if (loader) {
+ unload(loader, reason);
+ unload = null;
+
+ // Don't waste time cleaning up if the application is shutting down
+ if (reason != "shutdown") {
+ // Avoid leaking all modules when something goes wrong with one particular
+ // module. Do not clean it up immediatly in order to allow executing some
+ // actions on addon disabling.
+ // We need to keep a reference to the timer, otherwise it is collected
+ // and won't ever fire.
+ nukeTimer = setTimeout(nukeModules, 1000);
+
+ // Bug 944951 - bootstrap.js must remove the added resource: URIs on unload
+ resourceDomains.forEach(domain => {
+ resourceHandler.setSubstitution(domain, null);
+ })
+ }
+ }
+};
+
+function nukeModules() {
+ nukeTimer = null;
+ // module objects store `exports` which comes from sandboxes
+ // We should avoid keeping link to these object to avoid leaking sandboxes
+ for (let key in loader.modules) {
+ delete loader.modules[key];
+ }
+ // Direct links to sandboxes should be removed too
+ for (let key in loader.sandboxes) {
+ let sandbox = loader.sandboxes[key];
+ delete loader.sandboxes[key];
+ // Bug 775067: From FF17 we can kill all CCW from a given sandbox
+ unloadSandbox(sandbox);
+ }
+ loader = null;
+
+ // both `toolkit/loader` and `system/xul-app` are loaded as JSM's via
+ // `cuddlefish.js`, and needs to be unloaded to avoid memory leaks, when
+ // the addon is unload.
+
+ unloadSandbox(cuddlefishSandbox.loaderSandbox);
+ unloadSandbox(cuddlefishSandbox.xulappSandbox);
+
+ // Bug 764840: We need to unload cuddlefish otherwise it will stay alive
+ // and keep a reference to this compartment.
+ unloadSandbox(cuddlefishSandbox);
+ cuddlefishSandbox = null;
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/defaults/preferences/prefs.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/defaults/preferences/prefs.js
new file mode 100644
index 0000000..d5b39bf
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/defaults/preferences/prefs.js
@@ -0,0 +1,3 @@
+pref("extensions.jid1-KtlZuoiikVfFew@jetpack.whitelist", "");
+pref("extensions.jid1-KtlZuoiikVfFew@jetpack.complaint_tab", true);
+pref("extensions.jid1-KtlZuoiikVfFew@jetpack.display_notifications", false);
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/harness-options.json b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/harness-options.json
new file mode 100644
index 0000000..abb45db
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/harness-options.json
@@ -0,0 +1,737 @@
+{
+ "abort_on_missing": false,
+ "check_memory": false,
+ "enable_e10s": false,
+ "is-sdk-bundled": false,
+ "jetpackID": "jid1-KtlZuoiikVfFew@jetpack",
+ "loader": "addon-sdk/lib/sdk/loader/cuddlefish.js",
+ "main": "lib/main",
+ "mainPath": "librejs/main",
+ "manifest": {
+ "addon-tab/addon-tab": {
+ "docsSHA256": null,
+ "jsSHA256": "8b277dc27d85a72bfba1becfe6f57dceb5c9c717e5bc52a3bea936ec957a6893",
+ "moduleName": "addon-tab",
+ "packageName": "addon-tab",
+ "requirements": {
+ "sdk/core/namespace": "sdk/core/namespace",
+ "sdk/deprecated/window-utils": "sdk/deprecated/window-utils",
+ "sdk/lang/functional": "sdk/lang/functional",
+ "sdk/self": "sdk/self",
+ "sdk/tabs": "sdk/tabs",
+ "sdk/tabs/utils": "sdk/tabs/utils",
+ "sdk/util/array": "sdk/util/array",
+ "sdk/window/utils": "sdk/window/utils"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/addon_management/install_uninstall": {
+ "docsSHA256": null,
+ "jsSHA256": "6a16abeaed2a4983ce58d1895166abf3d93726cd6ca9e1506bfc6910c9840414",
+ "moduleName": "addon_management/install_uninstall",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "http_observer/caching": "librejs/http_observer/caching",
+ "http_observer/http_request_observer": "librejs/http_observer/http_request_observer",
+ "narcissus_parser/narcissus_worker": "librejs/narcissus_parser/narcissus_worker",
+ "sdk/tabs": "sdk/tabs",
+ "settings/storage": "librejs/settings/storage"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/addon_management/prefchange": {
+ "docsSHA256": null,
+ "jsSHA256": "692562f0c44ad53551cbf60d7c7f6ff066455c114f174d1ce875e287d5c1b1d0",
+ "moduleName": "addon_management/prefchange",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "script_entries/scripts_cache": "librejs/script_entries/scripts_cache",
+ "sdk/simple-prefs": "sdk/simple-prefs"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/bug_fix": {
+ "docsSHA256": null,
+ "jsSHA256": "0a5bf0ff6dcb522bd39dcc60d37d0b0eb3b897487ff41656521c7594d0b6a018",
+ "moduleName": "html_script_finder/bug_fix",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/dom_handler": {
+ "docsSHA256": null,
+ "jsSHA256": "556cd3e5df38a622958fa4b7710f59f2edc896407e0e3d2b21b36bfa71d869f4",
+ "moduleName": "html_script_finder/dom_handler",
+ "packageName": "librejs",
+ "requirements": {
+ "addon_management/prefchange": "librejs/addon_management/prefchange",
+ "chrome": "chrome",
+ "html_script_finder/dom_handler/attributes": "librejs/html_script_finder/dom_handler/attributes",
+ "html_script_finder/dom_handler/dom_checker": "librejs/html_script_finder/dom_handler/dom_checker",
+ "html_script_finder/dom_handler/dom_gatherer": "librejs/html_script_finder/dom_handler/dom_gatherer",
+ "html_script_finder/dom_handler/script_object": "librejs/html_script_finder/dom_handler/script_object",
+ "html_script_finder/dom_handler/script_properties": "librejs/html_script_finder/dom_handler/script_properties",
+ "html_script_finder/web_labels/js_web_labels": "librejs/html_script_finder/web_labels/js_web_labels",
+ "http_observer/allowed_referrers": "librejs/http_observer/allowed_referrers",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/js_checker": "librejs/js_checker/js_checker",
+ "js_checker/privacy_checker": "librejs/js_checker/privacy_checker",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/dom_handler/attributes": {
+ "docsSHA256": null,
+ "jsSHA256": "6a7af82d8e90742721060a9eba70f49562d099570b5e7ea6cc4f4d0634a0a78a",
+ "moduleName": "html_script_finder/dom_handler/attributes",
+ "packageName": "librejs",
+ "requirements": {
+ "html_script_finder/dom_handler/script_object": "librejs/html_script_finder/dom_handler/script_object",
+ "html_script_finder/dom_handler/script_properties": "librejs/html_script_finder/dom_handler/script_properties"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/dom_handler/dom_checker": {
+ "docsSHA256": null,
+ "jsSHA256": "efecce628d06b18b820da370bf5e9408b9d9e33ab6cc4b82c8f2063e95701489",
+ "moduleName": "html_script_finder/dom_handler/dom_checker",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "html_script_finder/dom_handler/request": "librejs/html_script_finder/dom_handler/request",
+ "html_script_finder/dom_handler/script_properties": "librejs/html_script_finder/dom_handler/script_properties",
+ "html_script_finder/url_seen_tester": "librejs/html_script_finder/url_seen_tester",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/js_checker": "librejs/js_checker/js_checker",
+ "js_checker/privacy_checker": "librejs/js_checker/privacy_checker",
+ "script_entries/scripts_cache": "librejs/script_entries/scripts_cache",
+ "sdk/timers": "sdk/timers",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/dom_handler/dom_gatherer": {
+ "docsSHA256": null,
+ "jsSHA256": "d90a852c6abfd418085b243e18795471c695590cad7829490d0e079a2f550b6d",
+ "moduleName": "html_script_finder/dom_handler/dom_gatherer",
+ "packageName": "librejs",
+ "requirements": {
+ "html_script_finder/bug_fix": "librejs/html_script_finder/bug_fix",
+ "html_script_finder/dom_handler/attributes": "librejs/html_script_finder/dom_handler/attributes",
+ "html_script_finder/dom_handler/script_object": "librejs/html_script_finder/dom_handler/script_object",
+ "html_script_finder/dom_handler/script_properties": "librejs/html_script_finder/dom_handler/script_properties",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/privacy_checker": "librejs/js_checker/privacy_checker",
+ "script_entries/scripts_cache": "librejs/script_entries/scripts_cache",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/dom_handler/request": {
+ "docsSHA256": null,
+ "jsSHA256": "af49bc14e9ee3d561a698a4dc149e6436368caba47504620ece88e9b43446d78",
+ "moduleName": "html_script_finder/dom_handler/request",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "html_script_finder/url_seen_tester": "librejs/html_script_finder/url_seen_tester",
+ "script_entries/scripts_cache": "librejs/script_entries/scripts_cache",
+ "sdk/timers": "sdk/timers",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/dom_handler/script_object": {
+ "docsSHA256": null,
+ "jsSHA256": "947f425475661a1f7572bb58a49763dfb6bb628e2dfaa34aad626a63ebe04c08",
+ "moduleName": "html_script_finder/dom_handler/script_object",
+ "packageName": "librejs",
+ "requirements": {
+ "script_entries/accepted_scripts": "librejs/script_entries/accepted_scripts",
+ "script_entries/dryrun_scripts": "librejs/script_entries/dryrun_scripts",
+ "script_entries/removed_scripts": "librejs/script_entries/removed_scripts"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/dom_handler/script_properties": {
+ "docsSHA256": null,
+ "jsSHA256": "2faf007239a9f519ce4d563e462a3940cb5176ddcc3c0baf9ab13130d6050b37",
+ "moduleName": "html_script_finder/dom_handler/script_properties",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/html_parser": {
+ "docsSHA256": null,
+ "jsSHA256": "00b174d23d15dd7d7833f35fe9c1bd56a1142f3b6066f8160123be2fc707adf5",
+ "moduleName": "html_script_finder/html_parser",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "html_script_finder/dom_handler": "librejs/html_script_finder/dom_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/url_seen_tester": {
+ "docsSHA256": null,
+ "jsSHA256": "80b2a59407826b389b6eaa15409ecdd6ebe6039de0a19933858f0a73f3de6286",
+ "moduleName": "html_script_finder/url_seen_tester",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/web_labels/find_js_labels": {
+ "docsSHA256": null,
+ "jsSHA256": "503889ed95b612c82413ebd1ac690ee9a8621b60f5125a0419f10c68d0a92027",
+ "moduleName": "html_script_finder/web_labels/find_js_labels",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/web_labels/js_web_labels": {
+ "docsSHA256": null,
+ "jsSHA256": "3440132dcaecc725d0ab81691c7830decb8408a56a6d525b9ab13cb413359eec",
+ "moduleName": "html_script_finder/web_labels/js_web_labels",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "html_script_finder/web_labels/find_js_labels": "librejs/html_script_finder/web_labels/find_js_labels",
+ "html_script_finder/web_labels/script_hash_worker": "librejs/html_script_finder/web_labels/script_hash_worker",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/license_definitions": "librejs/js_checker/license_definitions",
+ "sdk/self": "sdk/self",
+ "sdk/timers": "sdk/timers",
+ "sdk/url": "sdk/url",
+ "ui/notification": "librejs/ui/notification",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/web_labels/script_hash_worker": {
+ "docsSHA256": null,
+ "jsSHA256": "396431bed43197096e21a086b65e39edaa05c4c07d29ae9533ef95654a4f9add",
+ "moduleName": "html_script_finder/web_labels/script_hash_worker",
+ "packageName": "librejs",
+ "requirements": {
+ "html_script_finder/dom_handler/dom_checker": "librejs/html_script_finder/dom_handler/dom_checker",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "script_entries/scripts_cache": "librejs/script_entries/scripts_cache",
+ "sdk/timers": "sdk/timers"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/http_observer/allowed_referrers": {
+ "docsSHA256": null,
+ "jsSHA256": "6792a243c6413f20b719a5526eac3be4b75d48888922d978b0d2dfa0b0449ea3",
+ "moduleName": "http_observer/allowed_referrers",
+ "packageName": "librejs",
+ "requirements": {
+ "addon_management/prefchange": "librejs/addon_management/prefchange"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/http_observer/caching": {
+ "docsSHA256": null,
+ "jsSHA256": "2e1d459f007aaa88133d97af8d994c23030d4b5057450772cb482dea49c38c6e",
+ "moduleName": "http_observer/caching",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/http_observer/http_request_observer": {
+ "docsSHA256": null,
+ "jsSHA256": "d7dcb48aa57f7970401a8a5385130eb74fb71d981eb44b3387ef5decd84a9fe2",
+ "moduleName": "http_observer/http_request_observer",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "html_script_finder/url_seen_tester": "librejs/html_script_finder/url_seen_tester",
+ "http_observer/stream_loader": "librejs/http_observer/stream_loader"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/http_observer/process_response": {
+ "docsSHA256": null,
+ "jsSHA256": "2e8a93d70ba811a090bc2876f958818d87c0b79ac00d3122acfe36717d933209",
+ "moduleName": "http_observer/process_response",
+ "packageName": "librejs",
+ "requirements": {
+ "addon_management/prefchange": "librejs/addon_management/prefchange",
+ "chrome": "chrome",
+ "html_script_finder/html_parser": "librejs/html_script_finder/html_parser",
+ "html_script_finder/web_labels/js_web_labels": "librejs/html_script_finder/web_labels/js_web_labels",
+ "http_observer/allowed_referrers": "librejs/http_observer/allowed_referrers",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/js_checker": "librejs/js_checker/js_checker",
+ "script_entries/accepted_scripts": "librejs/script_entries/accepted_scripts",
+ "script_entries/dryrun_scripts": "librejs/script_entries/dryrun_scripts",
+ "script_entries/removed_scripts": "librejs/script_entries/removed_scripts",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/http_observer/stream_loader": {
+ "docsSHA256": null,
+ "jsSHA256": "4f3eb2c9cf163cd95932b74b1df6f765121a8d014f42db238d03c83e0f5fced4",
+ "moduleName": "http_observer/stream_loader",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "http_observer/process_response": "librejs/http_observer/process_response"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/js_checker/constant_types": {
+ "docsSHA256": null,
+ "jsSHA256": "96273f784e92749ffa833ae2993987fbab7be40d7293dd01d990def147bc29a5",
+ "moduleName": "js_checker/constant_types",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/js_checker/free_checker": {
+ "docsSHA256": null,
+ "jsSHA256": "22433f7aeb3f6c41c8c36b083501ad9805b21e703074602b8d50d194467ffb6a",
+ "moduleName": "js_checker/free_checker",
+ "packageName": "librejs",
+ "requirements": {
+ "html_script_finder/bug_fix": "librejs/html_script_finder/bug_fix",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/license_definitions": "librejs/js_checker/license_definitions",
+ "js_checker/pattern_utils": "librejs/js_checker/pattern_utils",
+ "sdk/simple-storage": "sdk/simple-storage"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/js_checker/js_checker": {
+ "docsSHA256": null,
+ "jsSHA256": "e40794e96193a92eab003a9b028c52319e6c6c033eceb41e25893708292f519d",
+ "moduleName": "js_checker/js_checker",
+ "packageName": "librejs",
+ "requirements": {
+ "addon_management/prefchange": "librejs/addon_management/prefchange",
+ "chrome": "chrome",
+ "html_script_finder/bug_fix": "librejs/html_script_finder/bug_fix",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/free_checker": "librejs/js_checker/free_checker",
+ "js_checker/nontrivial_checker": "librejs/js_checker/nontrivial_checker",
+ "js_checker/relation_checker": "librejs/js_checker/relation_checker",
+ "narcissus_parser/narcissus_worker": "librejs/narcissus_parser/narcissus_worker",
+ "script_entries/scripts_cache": "librejs/script_entries/scripts_cache",
+ "sdk/timers": "sdk/timers",
+ "ui/notification": "librejs/ui/notification"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/js_checker/license_definitions": {
+ "docsSHA256": null,
+ "jsSHA256": "26c979a2ec71a6134e4564f2f00d7c27ad878716948a31491189d8c7e4c0041b",
+ "moduleName": "js_checker/license_definitions",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/js_checker/nontrivial_checker": {
+ "docsSHA256": null,
+ "jsSHA256": "a14b688c0d54918ea0c1649e8f44e7d627706278c9732c9f14b5887a6cf69ce5",
+ "moduleName": "js_checker/nontrivial_checker",
+ "packageName": "librejs",
+ "requirements": {
+ "js_checker/constant_types": "librejs/js_checker/constant_types"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/js_checker/pattern_utils": {
+ "docsSHA256": null,
+ "jsSHA256": "6680b0a5f803eb1f0e40119f87c4149ed3a29011e74215322be2f8e4a9b47c66",
+ "moduleName": "js_checker/pattern_utils",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/js_checker/privacy_checker": {
+ "docsSHA256": null,
+ "jsSHA256": "aa7e796cd77ed096a9a47a9cca55b85f8359f670aed7391bc5225d348b5e3848",
+ "moduleName": "js_checker/privacy_checker",
+ "packageName": "librejs",
+ "requirements": {
+ "js_checker/pattern_utils": "librejs/js_checker/pattern_utils",
+ "js_checker/privacy_threat_definitions.js": "librejs/js_checker/privacy_threat_definitions"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/js_checker/privacy_threat_definitions": {
+ "docsSHA256": null,
+ "jsSHA256": "08c681d4827f52bd8cdfc939224577a22194ee32337b9334a4f8b423f17f8ade",
+ "moduleName": "js_checker/privacy_threat_definitions.js",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/js_checker/relation_checker": {
+ "docsSHA256": null,
+ "jsSHA256": "b81106d3a439da67f6a87c6dd76ff9a6759febc6b77305040718eccf4a4dfb41",
+ "moduleName": "js_checker/relation_checker",
+ "packageName": "librejs",
+ "requirements": {
+ "js_checker/constant_types": "librejs/js_checker/constant_types"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/main": {
+ "docsSHA256": null,
+ "jsSHA256": "b60c8856a74381b7c06fef7e0573778492746f3b6984644965bb5bb909ab3d11",
+ "moduleName": "main",
+ "packageName": "librejs",
+ "requirements": {
+ "addon_management/install_uninstall": "librejs/addon_management/install_uninstall",
+ "addon_management/prefchange": "librejs/addon_management/prefchange",
+ "chrome": "chrome",
+ "http_observer/allowed_referrers": "librejs/http_observer/allowed_referrers",
+ "http_observer/http_request_observer": "librejs/http_observer/http_request_observer",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/js_checker": "librejs/js_checker/js_checker",
+ "menuitems": "menuitems/menuitems",
+ "script_entries/accepted_scripts": "librejs/script_entries/accepted_scripts",
+ "script_entries/dryrun_scripts": "librejs/script_entries/dryrun_scripts",
+ "script_entries/removed_scripts": "librejs/script_entries/removed_scripts",
+ "script_entries/scripts_cache": "librejs/script_entries/scripts_cache",
+ "sdk/page-worker": "sdk/page-worker",
+ "sdk/panel": "sdk/panel",
+ "sdk/self": "sdk/self",
+ "sdk/simple-storage": "sdk/simple-storage",
+ "sdk/tabs": "sdk/tabs",
+ "sdk/ui/button/toggle": "sdk/ui/button/toggle",
+ "sdk/window/utils": "sdk/window/utils",
+ "settings/settings_tab": "librejs/settings/settings_tab",
+ "settings/storage": "librejs/settings/storage",
+ "ui/script_panel.js": "librejs/ui/script_panel",
+ "ui/ui_info": "librejs/ui/ui_info",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/narcissus_parser/narcissus_worker": {
+ "docsSHA256": null,
+ "jsSHA256": "bcd4350373fe0b4364a7bcdc6013feea837720e9a8792e84f905cc86dd346ce0",
+ "moduleName": "narcissus_parser/narcissus_worker",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "js_checker/js_checker": "librejs/js_checker/js_checker",
+ "sdk/self": "sdk/self"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/script_entries/accepted_scripts": {
+ "docsSHA256": null,
+ "jsSHA256": "ee96b355fb087aadca3c51a77cc9f14321aad96c834dda5a0812724fa26a7a7e",
+ "moduleName": "script_entries/accepted_scripts",
+ "packageName": "librejs",
+ "requirements": {
+ "script_entries/all_scripts": "librejs/script_entries/all_scripts"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/script_entries/all_scripts": {
+ "docsSHA256": null,
+ "jsSHA256": "6530feda85a57e12f47b4ab6c07d403e4b0fdb4d7b6e433ad1eeb60af90756aa",
+ "moduleName": "script_entries/all_scripts",
+ "packageName": "librejs",
+ "requirements": {
+ "script_entries/crypto": "librejs/script_entries/crypto"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/script_entries/crypto": {
+ "docsSHA256": null,
+ "jsSHA256": "c77e0067499b2f99fb6a3c0302e156ef89a4d3834f1fdac4f323a9d2ad966679",
+ "moduleName": "script_entries/crypto",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/script_entries/dryrun_scripts": {
+ "docsSHA256": null,
+ "jsSHA256": "808d0fa10cf794277f4bf26edf43b916695b32466edb2a2a5ebdb71a761f0773",
+ "moduleName": "script_entries/dryrun_scripts",
+ "packageName": "librejs",
+ "requirements": {
+ "script_entries/all_scripts": "librejs/script_entries/all_scripts",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/script_entries/free_libraries": {
+ "docsSHA256": null,
+ "jsSHA256": "a716922a4a427d0ae177e92cf7b94710573f162bd17302dc24871bd876f4b60f",
+ "moduleName": "script_entries/free_libraries",
+ "packageName": "librejs",
+ "requirements": {
+ "./scripts_cache": "librejs/script_entries/scripts_cache",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/relation_checker": "librejs/js_checker/relation_checker",
+ "sdk/self": "sdk/self"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/script_entries/removed_scripts": {
+ "docsSHA256": null,
+ "jsSHA256": "529ad3d10162a836e3d481592e078bf913b762848c0673686ef0317d7a28f212",
+ "moduleName": "script_entries/removed_scripts",
+ "packageName": "librejs",
+ "requirements": {
+ "script_entries/all_scripts": "librejs/script_entries/all_scripts",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/script_entries/scripts_cache": {
+ "docsSHA256": null,
+ "jsSHA256": "2a6c61f5422a4285aeadb2d3108f4b7cc710d20701062e30f42d0dbf5f162cc9",
+ "moduleName": "script_entries/scripts_cache",
+ "packageName": "librejs",
+ "requirements": {
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/relation_checker": "librejs/js_checker/relation_checker",
+ "script_entries/crypto": "librejs/script_entries/crypto",
+ "ui/notification": "librejs/ui/notification"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/settings/settings_tab": {
+ "docsSHA256": null,
+ "jsSHA256": "fe6fa07ad3ca1b9e1ce4219af1f046ba7a21e0757e9cffc772b80b094bd56af0",
+ "moduleName": "settings/settings_tab",
+ "packageName": "librejs",
+ "requirements": {
+ "addon-tab": "addon-tab/addon-tab",
+ "script_entries/scripts_cache": "librejs/script_entries/scripts_cache",
+ "sdk/self": "sdk/self",
+ "settings/storage": "librejs/settings/storage"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/settings/storage": {
+ "docsSHA256": null,
+ "jsSHA256": "25e0a3d6f9551f736b60375eeefde289ecd9b216995eb824d99559eef040f244",
+ "moduleName": "settings/storage",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "js_checker/relation_checker": "librejs/js_checker/relation_checker",
+ "script_entries/free_libraries": "librejs/script_entries/free_libraries",
+ "script_entries/scripts_cache": "librejs/script_entries/scripts_cache"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/ui/notification": {
+ "docsSHA256": null,
+ "jsSHA256": "4cef86f9d21cbda8633ea595968c9a6ba189d30923cf895c1f5453a362ab028b",
+ "moduleName": "ui/notification",
+ "packageName": "librejs",
+ "requirements": {
+ "addon_management/prefchange": "librejs/addon_management/prefchange",
+ "notification-box": "notification-box/notification-box",
+ "sdk/self": "sdk/self",
+ "sdk/timers": "sdk/timers"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/ui/script_panel": {
+ "docsSHA256": null,
+ "jsSHA256": "9bd52a58004737dd85ca814dfbdd23cc87541dcfe661124db4cbdd068c2a84fe",
+ "moduleName": "ui/script_panel.js",
+ "packageName": "librejs",
+ "requirements": {
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/ui/ui_info": {
+ "docsSHA256": null,
+ "jsSHA256": "6ee2f0d991aa0535487c3c431f3bd8990636c6739405f3a89485bbb414fd317f",
+ "moduleName": "ui/ui_info",
+ "packageName": "librejs",
+ "requirements": {
+ "addon_management/prefchange": "librejs/addon_management/prefchange",
+ "sdk/page-mod": "sdk/page-mod",
+ "sdk/page-worker": "sdk/page-worker",
+ "sdk/self": "sdk/self",
+ "sdk/tabs": "sdk/tabs",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/url_handler/node_punycode": {
+ "docsSHA256": null,
+ "jsSHA256": "8f604c209e3f9913fbcda68b2cfe203335e0117e145031e4a5c826d6b021c3f2",
+ "moduleName": "url_handler/node_punycode",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/url_handler/node_querystring": {
+ "docsSHA256": null,
+ "jsSHA256": "e25cebb6984e5c84b1b6a4d100e87a66a9763a2573cf093a2923160fa704b083",
+ "moduleName": "url_handler/node_querystring",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/url_handler/node_url": {
+ "docsSHA256": null,
+ "jsSHA256": "a73dd5be86af3e6a2fff3c250fb9a860d14aa4688babc87efd69eba4d9315a2a",
+ "moduleName": "url_handler/node_url",
+ "packageName": "librejs",
+ "requirements": {
+ "url_handler/node_punycode": "librejs/url_handler/node_punycode",
+ "url_handler/node_querystring": "librejs/url_handler/node_querystring"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/url_handler/url_handler": {
+ "docsSHA256": null,
+ "jsSHA256": "dd5c54c8e8220e7334c50d11f841a988ae0fb29c259cd91cb012f16ca93b76df",
+ "moduleName": "url_handler/url_handler",
+ "packageName": "librejs",
+ "requirements": {
+ "url_handler/node_url": "librejs/url_handler/node_url"
+ },
+ "sectionName": "lib"
+ },
+ "menuitems/menuitems": {
+ "docsSHA256": "58ad1ff182b33d89a46eb8e0b4847ff84f5403840ddbd03b017a4a855d2008fc",
+ "jsSHA256": "30d5fc7421841e6ac4ec3756515ac8f2dc3850bed7334f3ff038528d18262524",
+ "moduleName": "menuitems",
+ "packageName": "menuitems",
+ "requirements": {
+ "sdk/core/heritage": "sdk/core/heritage",
+ "sdk/core/namespace": "sdk/core/namespace",
+ "sdk/deprecated/api-utils": "sdk/deprecated/api-utils",
+ "sdk/deprecated/window-utils": "sdk/deprecated/window-utils",
+ "sdk/event/core": "sdk/event/core",
+ "sdk/event/target": "sdk/event/target",
+ "sdk/window/utils": "sdk/window/utils",
+ "unload+": "vold-utils/unload+"
+ },
+ "sectionName": "lib"
+ },
+ "notification-box/notification-box": {
+ "docsSHA256": null,
+ "jsSHA256": "d7e5a8b906ff408b90622769e175d02e243b1e9b238d7a54ad4be213e03c8454",
+ "moduleName": "notification-box",
+ "packageName": "notification-box",
+ "requirements": {
+ "chrome": "chrome",
+ "sdk/window/utils": "sdk/window/utils"
+ },
+ "sectionName": "lib"
+ },
+ "vold-utils/unload+": {
+ "docsSHA256": "465618992a8bbf3da6425fd79aaec54b92db0353d9670d8dcc1373d14c25b69b",
+ "jsSHA256": "fbbdfe29fd5cd3ed3593d5720278df4091bd208fc14478fcbff6776fad6c4dd1",
+ "moduleName": "unload+",
+ "packageName": "vold-utils",
+ "requirements": {
+ "sdk/core/heritage": "sdk/core/heritage",
+ "sdk/core/namespace": "sdk/core/namespace",
+ "sdk/system/unload": "sdk/system/unload"
+ },
+ "sectionName": "lib"
+ }
+ },
+ "metadata": {
+ "addon-sdk": {
+ "description": "Add-on development made easy.",
+ "keywords": [
+ "javascript",
+ "engine",
+ "addon",
+ "extension",
+ "xulrunner",
+ "firefox",
+ "browser"
+ ],
+ "license": "MPL 2.0",
+ "name": "addon-sdk"
+ },
+ "addon-tab": {
+ "author": "Loic J. Duros",
+ "description": "Opens a tab with a local page, hiding the location/search bars, and allows to set styles directly on the tab element (see example). This is ideal if your addon has a complex UI requiring a complex html page (and using such frameworks as jQuery UI, Bootstrap, etc, ...)",
+ "license": "MPL 2.0",
+ "main": "main",
+ "name": "addon-tab",
+ "version": "0.1"
+ },
+ "librejs": {
+ "author": "Loic J. Duros",
+ "description": "GNU LibreJS is an add-on for Mozilla-based browsers (IceCat, Firefox, Abrowser, Iceweasel)\n that prevents the execution of nonfree nontrivial JavaScript as described in \"The Javascript Trap\": http://www.gnu.org/philosophy/javascript-trap.html",
+ "license": "GPL v3.0 and later",
+ "main": "lib/main",
+ "name": "librejs",
+ "permissions": {
+ "unsafe-content-script": true
+ },
+ "version": "6.0.1"
+ },
+ "menuitems": {
+ "author": "Erik Vold (http://erikvold.com/) <erikvvold@gmail.com>",
+ "description": "Menuitems for Jetpacks",
+ "keywords": [
+ "menu",
+ "menuitems",
+ "button",
+ "ui"
+ ],
+ "license": "MPL 2.0",
+ "name": "menuitems",
+ "version": "1.1.1"
+ },
+ "notification-box": {
+ "description": "a basic add-on",
+ "license": "MPL 2.0",
+ "main": "main",
+ "name": "notification-box",
+ "version": "0.1"
+ },
+ "vold-utils": {
+ "author": "Erik Vold (http://erikvold.com/) <erikvvold@gmail.com>",
+ "description": "Utilitys for Jetpacks",
+ "name": "vold-utils",
+ "version": "1.1"
+ }
+ },
+ "name": "librejs",
+ "parseable": false,
+ "preferences": [
+ {
+ "name": "whitelist",
+ "title": "Whitelist domain, separated by comma, omit protocol, e.g.: gnu.org, wildcard is *",
+ "type": "string",
+ "value": ""
+ },
+ {
+ "name": "complaint_tab",
+ "title": "Display complaint tab on sites where nonfree nontrivial JavaScript is detected",
+ "type": "bool",
+ "value": true
+ },
+ {
+ "name": "display_notifications",
+ "title": "Display notifications of the JavaScript code being analyzed by LibreJS.",
+ "type": "bool",
+ "value": false
+ }
+ ],
+ "preferencesBranch": "jid1-KtlZuoiikVfFew@jetpack",
+ "sdkVersion": "1.17",
+ "staticArgs": {},
+ "verbose": false
+} \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/install.rdf b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/install.rdf
new file mode 100644
index 0000000..dc20696
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/install.rdf
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?><!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --><RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+ <Description about="urn:mozilla:install-manifest">
+ <em:id>jid1-KtlZuoiikVfFew@jetpack</em:id>
+ <em:version>6.0.1</em:version>
+ <em:type>2</em:type>
+ <em:bootstrap>true</em:bootstrap>
+ <em:unpack>false</em:unpack>
+
+ <!-- Firefox -->
+ <em:targetApplication>
+ <Description>
+ <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
+ <em:minVersion>26.0</em:minVersion>
+ <em:maxVersion>30.0</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+
+ <!-- Front End MetaData -->
+ <em:name>GNU LibreJS</em:name>
+ <em:description>GNU LibreJS is an add-on for Mozilla-based browsers (IceCat, Firefox, Abrowser, Iceweasel)
+ that prevents the execution of nonfree nontrivial JavaScript as described in &quot;The Javascript Trap&quot;: http://www.gnu.org/philosophy/javascript-trap.html</em:description>
+ <em:creator>Loic J. Duros</em:creator>
+
+ <em:optionsType>2</em:optionsType>
+
+ </Description>
+</RDF> \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/locales.json b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/locales.json
new file mode 100644
index 0000000..303e186
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/locales.json
@@ -0,0 +1 @@
+{"locales": []}
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/options.xul b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/options.xul
new file mode 100644
index 0000000..70c2c77
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/options.xul
@@ -0,0 +1,6 @@
+<?xml version="1.0" ?>
+<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+ <setting data-jetpack-id="jid1-KtlZuoiikVfFew@jetpack" pref="extensions.jid1-KtlZuoiikVfFew@jetpack.whitelist" pref-name="whitelist" title="Whitelist domain, separated by comma, omit protocol, e.g.: gnu.org, wildcard is *" type="string"/>
+ <setting data-jetpack-id="jid1-KtlZuoiikVfFew@jetpack" pref="extensions.jid1-KtlZuoiikVfFew@jetpack.complaint_tab" pref-name="complaint_tab" title="Display complaint tab on sites where nonfree nontrivial JavaScript is detected" type="bool"/>
+ <setting data-jetpack-id="jid1-KtlZuoiikVfFew@jetpack" pref="extensions.jid1-KtlZuoiikVfFew@jetpack.display_notifications" pref-name="display_notifications" title="Display notifications of the JavaScript code being analyzed by LibreJS." type="bool"/>
+</vbox>
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/addon-tab/lib/addon-tab.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/addon-tab/lib/addon-tab.js
new file mode 100644
index 0000000..0236161
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/addon-tab/lib/addon-tab.js
@@ -0,0 +1,153 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+'use strict';
+
+module.metadata = {
+ 'stability': 'experimental'
+};
+
+const { WindowTracker } = require('sdk/deprecated/window-utils');
+const { isXULBrowser } = require('sdk/window/utils');
+const { add, remove } = require('sdk/util/array');
+const { getTabs, closeTab, getURI, getTabURL, getBrowserForTab } = require('sdk/tabs/utils');
+const { data } = require('sdk/self');
+const { ns } = require("sdk/core/namespace");
+
+const tabs = require("sdk/tabs");
+
+const { defer } = require("sdk/lang/functional");
+
+// store list of addon URLs to hide the navigation bar from
+// and to add proper style.
+// the url is used as the key for lookup efficiency.
+// Objects contained are: {[url]: { [styles] }}
+let addonTabs = {};
+
+const windows = ns();
+
+/* Add tab to a list of URL/styles. Can be called
+ * from other scripts */
+let addTabToList = function (options) {
+
+ options = options || {};
+ let url;
+
+ if (options.url) {
+ addonTabs[options.url] = {};
+ }
+ else {
+ throw new Error("No url provided for the AddonTab page");
+ }
+
+ if (options.tabStyle)
+ addonTabs[options.url] = options.tabStyle;
+ else
+ addonTabs[options.tabStyle] = null;
+
+};
+
+exports.removeAddonTab = function (url) {
+ if (url && url in addonTabs)
+ delete addonTabs[url];
+};
+
+let applyStyle = function (tab, property, value) {
+ tab.style.setProperty(property,
+ value,
+ 'important');
+};
+
+let applyStyles = function (tab, url) {
+ if (!url) {
+ url = getURI(tab);
+ }
+
+ if (url in addonTabs && addonTabs[url] != null) {
+ for (let item in addonTabs[url]) {
+ applyStyle(tab, item, addonTabs[url][item]);
+ }
+ }
+};
+
+/* Simply adds the URL/style to the list,
+ * and then just open a tab using the high-level
+ * tab module.
+ */
+exports.open = function (options) {
+ addTabToList(options);
+ let tab = tabs.open(options);
+ return tab;
+};
+
+/*
+ * Track tabs opened and closed.
+ * Once you have a tab open, get the browser for it
+ * and figure out the location (which turns out to be the right one, not about:blank)
+ */
+tabs.on('open', function onOpen(tab) {
+ let browser = getBrowserForTab(tab);
+
+ tab.on('load', function onTabLoad(e) {
+ if (typeof browser == 'undefined') {
+ return;
+ }
+ // let's get the location of the document.
+ applyStyles(tab, browser.contentDocument.location);
+ }, true);
+});
+
+
+WindowTracker({
+ onTrack: function onTrack(window) {
+ if (!isXULBrowser(window) || windows(window).hideChromeForLocation)
+ return;
+
+ let { XULBrowserWindow } = window;
+ let { hideChromeForLocation } = XULBrowserWindow;
+
+ windows(window).hideChromeForLocation = hideChromeForLocation;
+
+ // Augmenting the behavior of `hideChromeForLocation` method, as
+ // suggested by https://developer.mozilla.org/en-US/docs/Hiding_browser_chrome
+ XULBrowserWindow.hideChromeForLocation = function(url) {
+
+ if (url in addonTabs)
+ return true;
+
+ return hideChromeForLocation.call(this, url);
+ };
+ },
+
+ onUntrack: function onUntrack(window) {
+ if (isXULBrowser(window))
+ getTabs(window).filter(tabFilter).forEach(untrackTab.bind(null, window));
+
+ }
+});
+
+
+function tabFilter(tab) {
+ if (getURI(tab) in addonTabs) {
+ return true;
+ }
+
+ return false;
+}
+
+function untrackTab(window, tab) {
+ // Note: `onUntrack` will be called for all windows on add-on unloads,
+ // so we want to clean them up from these URLs.
+ let { hideChromeForLocation } = windows(window);
+
+ if (hideChromeForLocation) {
+ window.XULBrowserWindow.hideChromeForLocation = hideChromeForLocation;
+ windows(window).hideChromeForLocation = null;
+ }
+ // had to remove closeTab call to prevent a TypeError: element is
+ // undefined.
+ //closeTab(tab);
+}
+
+
+
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/README b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/README
new file mode 100644
index 0000000..6633b5e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/README
@@ -0,0 +1,2 @@
+The stylesheets, HTML files, and images provided in this folder and
+its subfolders are released under the GPL version 3 or later. \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/css/style.css b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/css/style.css
new file mode 100644
index 0000000..84b9ab3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/css/style.css
@@ -0,0 +1,150 @@
+/*
+
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+
+
+
+*/
+/* quick reset for box and children */
+#librejs-complaint-box, #librejs-complaint-box *, #librejs-complaint-box a:hover, #librejs-complaint-box a:active, #librejs-complaint-box a:visited, #librejs-time-mention, #librejs-time-mention:hover {
+ margin:0;
+ padding:0;
+ line-height:1;
+ list-style:square;
+ color:#000;
+ text-align:left;
+ border:0;
+ content: '';
+ font-style:normal;
+ font-weight:normal;
+ font-size:12px;
+ text-decoration:none;
+ font-variant:normal;
+ font-family:sans-serif !important;
+ text-shadow:none !important;
+ text-transform:none !important;
+ background-image:none;
+ background-color:transparent;
+}
+
+#librejs-time-mention, #librejs-time-mention:hover {
+ font-size:14px;
+ font-weight:bold;
+ text-align:center;
+}
+
+#librejs-complaint-box, #librejs-complaint-box * {
+ width:auto;
+}
+
+div {
+ width:auto;
+}
+
+#librejs-tab-button, #librejs-tab-button:hover, #librejs-tab-button:visited, #librejs-tab-button:active {
+ display: block;
+ width: 18px;
+ height: 70px;
+ color: rgb(255, 255, 255);
+ padding: 30px !important;
+ background-color:#e3dedb !important;
+ background-image:url("../images/torchy.png"), url("../images/separator.png") !important;
+ background-position: 19px 23px, 55px 16px !important;
+ background-repeat: no-repeat !important;
+ border:solid #454545 3px !important;
+ border-right:none !important;
+ overflow: hidden;
+ text-indent: -1000em;
+ border-top-left-radius:20px !important;
+ border-bottom-left-radius:20px !important;
+ float:left;
+ z-index:50;
+ position:relative;
+}
+
+#librejs-complaint-box {
+ position: fixed;
+ top: 15%;
+ z-index: 2147483647 !important; /* fix for tech crunch big number */
+ right:-530px;
+ display:none;
+}
+
+#librejs-complaint-info {
+ border:solid #454545 3px;
+ background-color:#e3dedb !important;
+ width:460px !important;
+ margin-left:78px !important;
+ border-bottom-left-radius:30px;
+ z-index:0;
+ padding:0 20px 50px;
+ text-align:center;
+ position:relative;
+}
+
+#librejs-complaint-info:hover {
+ background-color:#e3dedb !important;
+}
+
+#librejs-complaint-info-text {
+ overflow:auto !important;
+ height:auto;
+ padding:0 30px;
+}
+
+#librejs-complaint-info h1 {
+ z-index:1;
+ font:"Century Schoolbook";
+ font-size:25px;
+ text-align:center;
+ background:url('../images/info-title.png') no-repeat 50% 30px !important;
+ overflow:hidden;
+ text-indent:-3000em;
+ height:100px;
+ padding:30px;
+ margin:0 !important;
+ line-height:0 !important;
+ display:block !important;
+ clear:none !important;
+ width:auto !important;
+}
+
+#librejs-complaint-info h1 span.huge {
+ display:block;
+ font-size:35px;
+ font-weight:bold;
+}
+
+#librejs-complaint-info h2 {
+ font-weight:bold !important;
+ font-size:14px !important;
+ margin:20px 0 10px !important;
+ display:none;
+ border-top:1px solid #CCC;
+ padding:10px 0 10px;
+ text-shadow: 0 1px 0 #FFF !important;
+}
+
+#librejs-complaint-info ul {
+ margin-left:15px;
+}
+
+#librejs-complaint-info ul li a {
+ font-size:14px !important;
+} \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/README b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/README
new file mode 100644
index 0000000..e442861
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/README
@@ -0,0 +1,21 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+All images in this directory are free, released under the GPLv3 or later. \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/complain-button3.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/complain-button3.png
new file mode 100644
index 0000000..5e3b4e3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/complain-button3.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/info-title.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/info-title.png
new file mode 100644
index 0000000..02ebbfa
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/info-title.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/separator.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/separator.png
new file mode 100644
index 0000000..7eedd12
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/separator.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/torchy.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/torchy.png
new file mode 100644
index 0000000..363e0a3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/torchy.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/torchy2.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/torchy2.png
new file mode 100644
index 0000000..60da8fc
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/torchy2.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jsdefs.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jsdefs.js
new file mode 100644
index 0000000..aff5c08
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jsdefs.js
@@ -0,0 +1,751 @@
+/* vim: set sw=4 ts=4 et tw=78: */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Narcissus JavaScript engine.
+ *
+ * The Initial Developer of the Original Code is
+ * Brendan Eich <brendan@mozilla.org>.
+ * Portions created by the Initial Developer are Copyright (C) 2004
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Tom Austin <taustin@ucsc.edu>
+ * Brendan Eich <brendan@mozilla.org>
+ * Shu-Yu Guo <shu@rfrn.org>
+ * Dave Herman <dherman@mozilla.com>
+ * Dimitris Vardoulakis <dimvar@ccs.neu.edu>
+ * Patrick Walton <pcwalton@mozilla.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/*
+ * Narcissus - JS implemented in JS.
+ *
+ * Well-known constants and lookup tables. Many consts are generated from the
+ * tokens table via eval to minimize redundancy, so consumers must be compiled
+ * separately to take advantage of the simple switch-case constant propagation
+ * done by SpiderMonkey.
+ */
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+//"use scrict";
+
+var Narcissus = {};
+(function() {
+
+ var narcissus = {
+ options: {
+ version: 185,
+ // Global variables to hide from the interpreter
+ hiddenHostGlobals: { Narcissus: true },
+ // Desugar SpiderMonkey language extensions?
+ desugarExtensions: false
+ },
+ hostSupportsEvalConst: (function() {
+ try {
+ return eval("(function(s) { eval(s); return x })('const x = true;')");
+ } catch (e) {
+ return false;
+ }
+ })(),
+ hostGlobal: this
+ };
+ Narcissus = narcissus;
+})();
+
+Narcissus.definitions = (function() {
+
+ var tokens = [
+ // End of source.
+ "END",
+
+ // Operators and punctuators. Some pair-wise order matters, e.g. (+, -)
+ // and (UNARY_PLUS, UNARY_MINUS).
+ "\n", ";",
+ ",",
+ "=",
+ "?", ":", "CONDITIONAL",
+ "||",
+ "&&",
+ "|",
+ "^",
+ "&",
+ "==", "!=", "===", "!==",
+ "<", "<=", ">=", ">",
+ "<<", ">>", ">>>",
+ "+", "-",
+ "*", "/", "%",
+ "!", "~", "UNARY_PLUS", "UNARY_MINUS",
+ "++", "--",
+ ".",
+ "[", "]",
+ "{", "}",
+ "(", ")",
+
+ // Nonterminal tree node type codes.
+ "SCRIPT", "BLOCK", "LABEL", "FOR_IN", "CALL", "NEW_WITH_ARGS", "INDEX",
+ "ARRAY_INIT", "OBJECT_INIT", "PROPERTY_INIT", "GETTER", "SETTER",
+ "GROUP", "LIST", "LET_BLOCK", "ARRAY_COMP", "GENERATOR", "COMP_TAIL",
+
+ // Terminals.
+ "IDENTIFIER", "NUMBER", "STRING", "REGEXP",
+
+ // Keywords.
+ "break",
+ "case", "catch", "const", "continue",
+ "debugger", "default", "delete", "do",
+ "else", "export",
+ "false", "finally", "for", "function",
+ "if", "import", "in", "instanceof",
+ "let", "module",
+ "new", "null",
+ "return",
+ "switch",
+ "this", "throw", "true", "try", "typeof",
+ "var", "void",
+ "yield",
+ "while", "with",
+ ];
+
+ var statementStartTokens = [
+ "break",
+ "const", "continue",
+ "debugger", "do",
+ "for",
+ "if",
+ "return",
+ "switch",
+ "throw", "try",
+ "var",
+ "yield",
+ "while", "with",
+ ];
+
+ // Whitespace characters (see ECMA-262 7.2)
+ var whitespaceChars = [
+ // normal whitespace:
+ "\u0009", "\u000B", "\u000C", "\u0020", "\u00A0", "\uFEFF",
+
+ // high-Unicode whitespace:
+ "\u1680", "\u180E",
+ "\u2000", "\u2001", "\u2002", "\u2003", "\u2004", "\u2005", "\u2006",
+ "\u2007", "\u2008", "\u2009", "\u200A",
+ "\u202F", "\u205F", "\u3000"
+ ];
+
+ var whitespace = {};
+ for (var i = 0; i < whitespaceChars.length; i++) {
+ whitespace[whitespaceChars[i]] = true;
+ }
+
+ // Operator and punctuator mapping from token to tree node type name.
+ // NB: because the lexer doesn't backtrack, all token prefixes must themselves
+ // be valid tokens (e.g. !== is acceptable because its prefixes are the valid
+ // tokens != and !).
+ var opTypeNames = {
+ '\n': "NEWLINE",
+ ';': "SEMICOLON",
+ ',': "COMMA",
+ '?': "HOOK",
+ ':': "COLON",
+ '||': "OR",
+ '&&': "AND",
+ '|': "BITWISE_OR",
+ '^': "BITWISE_XOR",
+ '&': "BITWISE_AND",
+ '===': "STRICT_EQ",
+ '==': "EQ",
+ '=': "ASSIGN",
+ '!==': "STRICT_NE",
+ '!=': "NE",
+ '<<': "LSH",
+ '<=': "LE",
+ '<': "LT",
+ '>>>': "URSH",
+ '>>': "RSH",
+ '>=': "GE",
+ '>': "GT",
+ '++': "INCREMENT",
+ '--': "DECREMENT",
+ '+': "PLUS",
+ '-': "MINUS",
+ '*': "MUL",
+ '/': "DIV",
+ '%': "MOD",
+ '!': "NOT",
+ '~': "BITWISE_NOT",
+ '.': "DOT",
+ '[': "LEFT_BRACKET",
+ ']': "RIGHT_BRACKET",
+ '{': "LEFT_CURLY",
+ '}': "RIGHT_CURLY",
+ '(': "LEFT_PAREN",
+ ')': "RIGHT_PAREN"
+ };
+
+ // Hash of keyword identifier to tokens index. NB: we must null __proto__ to
+ // avoid toString, etc. namespace pollution.
+ var keywords = {__proto__: null};
+
+ // Define const END, etc., based on the token names. Also map name to index.
+ var tokenIds = {};
+
+ // Building up a string to be eval'd in different contexts.
+ var consts = Narcissus.hostSupportsEvalConst ? "const " : "var ";
+ for (var i = 0, j = tokens.length; i < j; i++) {
+ if (i > 0)
+ consts += ", ";
+ var t = tokens[i];
+ var name;
+ if (/^[a-z]/.test(t)) {
+ name = t.toUpperCase();
+ keywords[t] = i;
+ } else {
+ name = (/^\W/.test(t) ? opTypeNames[t] : t);
+ }
+ consts += name + " = " + i;
+ tokenIds[name] = i;
+ tokens[t] = i;
+ }
+ consts += ";";
+
+ var isStatementStartCode = {__proto__: null};
+ for (i = 0, j = statementStartTokens.length; i < j; i++)
+ isStatementStartCode[keywords[statementStartTokens[i]]] = true;
+
+ // Map assignment operators to their indexes in the tokens array.
+ var assignOps = ['|', '^', '&', '<<', '>>', '>>>', '+', '-', '*', '/', '%'];
+
+ for (i = 0, j = assignOps.length; i < j; i++) {
+ t = assignOps[i];
+ assignOps[t] = tokens[t];
+ }
+
+ function defineGetter(obj, prop, fn, dontDelete, dontEnum) {
+ Object.defineProperty(obj, prop,
+ { get: fn, configurable: !dontDelete, enumerable: !dontEnum });
+ }
+
+ function defineGetterSetter(obj, prop, getter, setter, dontDelete, dontEnum) {
+ Object.defineProperty(obj, prop, {
+ get: getter,
+ set: setter,
+ configurable: !dontDelete,
+ enumerable: !dontEnum
+ });
+ }
+
+ function defineMemoGetter(obj, prop, fn, dontDelete, dontEnum) {
+ Object.defineProperty(obj, prop, {
+ get: function() {
+ var val = fn();
+ defineProperty(obj, prop, val, dontDelete, true, dontEnum);
+ return val;
+ },
+ configurable: true,
+ enumerable: !dontEnum
+ });
+ }
+
+ function defineProperty(obj, prop, val, dontDelete, readOnly, dontEnum) {
+ Object.defineProperty(obj, prop,
+ { value: val, writable: !readOnly, configurable: !dontDelete,
+ enumerable: !dontEnum });
+ }
+
+ // Returns true if fn is a native function. (Note: SpiderMonkey specific.)
+ function isNativeCode(fn) {
+ // Relies on the toString method to identify native code.
+ return ((typeof fn) === "function") && fn.toString().match(/\[native code\]/);
+ }
+
+ var Fpapply = Function.prototype.apply;
+
+ function apply(f, o, a) {
+ return Fpapply.call(f, [o].concat(a));
+ }
+
+ var applyNew;
+
+ // ES5's bind is a simpler way to implement applyNew
+ if (Function.prototype.bind) {
+ applyNew = function applyNew(f, a) {
+ return new (f.bind.apply(f, [,].concat(a)))();
+ };
+ } else {
+ applyNew = function applyNew(f, a) {
+ switch (a.length) {
+ case 0:
+ return new f();
+ case 1:
+ return new f(a[0]);
+ case 2:
+ return new f(a[0], a[1]);
+ case 3:
+ return new f(a[0], a[1], a[2]);
+ default:
+ var argStr = "a[0]";
+ for (var i = 1, n = a.length; i < n; i++)
+ argStr += ",a[" + i + "]";
+ return eval("new f(" + argStr + ")");
+ }
+ };
+ }
+
+ function getPropertyDescriptor(obj, name) {
+ while (obj) {
+ if (({}).hasOwnProperty.call(obj, name))
+ return Object.getOwnPropertyDescriptor(obj, name);
+ obj = Object.getPrototypeOf(obj);
+ }
+ return undefined;
+ }
+
+ function getPropertyNames(obj) {
+ var table = Object.create(null, {});
+ while (obj) {
+ var names = Object.getOwnPropertyNames(obj);
+ for (var i = 0, n = names.length; i < n; i++)
+ table[names[i]] = true;
+ obj = Object.getPrototypeOf(obj);
+ }
+ return Object.keys(table);
+ }
+
+ function getOwnProperties(obj) {
+ var map = {};
+ for (var name in Object.getOwnPropertyNames(obj))
+ map[name] = Object.getOwnPropertyDescriptor(obj, name);
+ return map;
+ }
+
+ function blacklistHandler(target, blacklist) {
+ var mask = Object.create(null, {});
+ var redirect = StringMap.create(blacklist).mapObject(function(name) { return mask; });
+ return mixinHandler(redirect, target);
+ }
+
+ function whitelistHandler(target, whitelist) {
+ var catchall = Object.create(null, {});
+ var redirect = StringMap.create(whitelist).mapObject(function(name) { return target; });
+ return mixinHandler(redirect, catchall);
+ }
+
+ function mirrorHandler(target, writable) {
+ var handler = makePassthruHandler(target);
+
+ var defineProperty = handler.defineProperty;
+ handler.defineProperty = function(name, desc) {
+ if (!desc.enumerable)
+ throw new Error("mirror property must be enumerable");
+ if (!desc.configurable)
+ throw new Error("mirror property must be configurable");
+ if (desc.writable !== writable)
+ throw new Error("mirror property must " + (writable ? "" : "not ") + "be writable");
+ defineProperty(name, desc);
+ };
+
+ handler.fix = function() { };
+ handler.getOwnPropertyDescriptor = handler.getPropertyDescriptor;
+ handler.getOwnPropertyNames = getPropertyNames.bind(handler, target);
+ handler.keys = handler.enumerate;
+ handler["delete"] = function() { return false; };
+ handler.hasOwn = handler.has;
+ return handler;
+ }
+
+ /*
+ * Mixin proxies break the single-inheritance model of prototypes, so
+ * the handler treats all properties as own-properties:
+ *
+ * X
+ * |
+ * +------------+------------+
+ * | O |
+ * | | |
+ * | O O O |
+ * | | | | |
+ * | O O O O |
+ * | | | | | |
+ * | O O O O O |
+ * | | | | | | |
+ * +-(*)--(w)--(x)--(y)--(z)-+
+ */
+
+ function mixinHandler(redirect, catchall) {
+ function targetFor(name) {
+ return hasOwn(redirect, name) ? redirect[name] : catchall;
+ }
+
+ function getMuxPropertyDescriptor(name) {
+ var desc = getPropertyDescriptor(targetFor(name), name);
+ if (desc)
+ desc.configurable = true;
+ return desc;
+ }
+
+ function getMuxPropertyNames() {
+ var names1 = Object.getOwnPropertyNames(redirect).filter(function(name) {
+ return name in redirect[name];
+ });
+ var names2 = getPropertyNames(catchall).filter(function(name) {
+ return !hasOwn(redirect, name);
+ });
+ return names1.concat(names2);
+ }
+
+ function enumerateMux() {
+ var result = Object.getOwnPropertyNames(redirect).filter(function(name) {
+ return name in redirect[name];
+ });
+ for (name in catchall) {
+ if (!hasOwn(redirect, name))
+ result.push(name);
+ };
+ return result;
+ }
+
+ function hasMux(name) {
+ return name in targetFor(name);
+ }
+
+ return {
+ getOwnPropertyDescriptor: getMuxPropertyDescriptor,
+ getPropertyDescriptor: getMuxPropertyDescriptor,
+ getOwnPropertyNames: getMuxPropertyNames,
+ defineProperty: function(name, desc) {
+ Object.defineProperty(targetFor(name), name, desc);
+ },
+ "delete": function(name) {
+ var target = targetFor(name);
+ return delete target[name];
+ },
+ // FIXME: ha ha ha
+ fix: function() { },
+ has: hasMux,
+ hasOwn: hasMux,
+ get: function(receiver, name) {
+ var target = targetFor(name);
+ return target[name];
+ },
+ set: function(receiver, name, val) {
+ var target = targetFor(name);
+ target[name] = val;
+ return true;
+ },
+ enumerate: enumerateMux,
+ keys: enumerateMux
+ };
+ }
+
+ function makePassthruHandler(obj) {
+ // Handler copied from
+ // http://wiki.ecmascript.org/doku.php?id=harmony:proxies&s=proxy%20object#examplea_no-op_forwarding_proxy
+ return {
+ getOwnPropertyDescriptor: function(name) {
+ var desc = Object.getOwnPropertyDescriptor(obj, name);
+
+ // a trapping proxy's properties must always be configurable
+ desc.configurable = true;
+ return desc;
+ },
+ getPropertyDescriptor: function(name) {
+ var desc = getPropertyDescriptor(obj, name);
+
+ // a trapping proxy's properties must always be configurable
+ desc.configurable = true;
+ return desc;
+ },
+ getOwnPropertyNames: function() {
+ return Object.getOwnPropertyNames(obj);
+ },
+ defineProperty: function(name, desc) {
+ Object.defineProperty(obj, name, desc);
+ },
+ "delete": function(name) { return delete obj[name]; },
+ fix: function() {
+ if (Object.isFrozen(obj)) {
+ return getOwnProperties(obj);
+ }
+
+ // As long as obj is not frozen, the proxy won't allow itself to be fixed.
+ return undefined; // will cause a TypeError to be thrown
+ },
+
+ has: function(name) { return name in obj; },
+ hasOwn: function(name) { return ({}).hasOwnProperty.call(obj, name); },
+ get: function(receiver, name) { return obj[name]; },
+
+ // bad behavior when set fails in non-strict mode
+ set: function(receiver, name, val) { obj[name] = val; return true; },
+ enumerate: function() {
+ var result = [];
+ for (name in obj) { result.push(name); };
+ return result;
+ },
+ keys: function() { return Object.keys(obj); }
+ };
+ }
+
+ var hasOwnProperty = ({}).hasOwnProperty;
+
+ function hasOwn(obj, name) {
+ return hasOwnProperty.call(obj, name);
+ }
+
+ function StringMap(table, size) {
+ this.table = table || Object.create(null, {});
+ this.size = size || 0;
+ }
+
+ StringMap.create = function(table) {
+ var init = Object.create(null, {});
+ var size = 0;
+ var names = Object.getOwnPropertyNames(table);
+ for (var i = 0, n = names.length; i < n; i++) {
+ var name = names[i];
+ init[name] = table[name];
+ size++;
+ }
+ return new StringMap(init, size);
+ };
+
+ StringMap.prototype = {
+ has: function(x) { return hasOwnProperty.call(this.table, x); },
+ set: function(x, v) {
+ if (!hasOwnProperty.call(this.table, x))
+ this.size++;
+ this.table[x] = v;
+ },
+ get: function(x) { return this.table[x]; },
+ getDef: function(x, thunk) {
+ if (!hasOwnProperty.call(this.table, x)) {
+ this.size++;
+ this.table[x] = thunk();
+ }
+ return this.table[x];
+ },
+ forEach: function(f) {
+ var table = this.table;
+ for (var key in table)
+ f.call(this, key, table[key]);
+ },
+ map: function(f) {
+ var table1 = this.table;
+ var table2 = Object.create(null, {});
+ this.forEach(function(key, val) {
+ table2[key] = f.call(this, val, key);
+ });
+ return new StringMap(table2, this.size);
+ },
+ mapObject: function(f) {
+ var table1 = this.table;
+ var table2 = Object.create(null, {});
+ this.forEach(function(key, val) {
+ table2[key] = f.call(this, val, key);
+ });
+ return table2;
+ },
+ toObject: function() {
+ return this.mapObject(function(val) { return val; });
+ },
+ choose: function() {
+ return Object.getOwnPropertyNames(this.table)[0];
+ },
+ remove: function(x) {
+ if (hasOwnProperty.call(this.table, x)) {
+ this.size--;
+ delete this.table[x];
+ }
+ },
+ copy: function() {
+ var table = Object.create(null, {});
+ for (var key in this.table)
+ table[key] = this.table[key];
+ return new StringMap(table, this.size);
+ },
+ keys: function() {
+ return Object.keys(this.table);
+ },
+ toString: function() { return "[object StringMap]" }
+ };
+
+ // an object-key table with poor asymptotics (replace with WeakMap when possible)
+ function ObjectMap(array) {
+ this.array = array || [];
+ }
+
+ function searchMap(map, key, found, notFound) {
+ var a = map.array;
+ for (var i = 0, n = a.length; i < n; i++) {
+ var pair = a[i];
+ if (pair.key === key)
+ return found(pair, i);
+ }
+ return notFound();
+ }
+
+ ObjectMap.prototype = {
+ has: function(x) {
+ return searchMap(this, x, function() { return true }, function() { return false });
+ },
+ set: function(x, v) {
+ var a = this.array;
+ searchMap(this, x,
+ function(pair) { pair.value = v },
+ function() { a.push({ key: x, value: v }) });
+ },
+ get: function(x) {
+ return searchMap(this, x,
+ function(pair) { return pair.value },
+ function() { return null });
+ },
+ getDef: function(x, thunk) {
+ var a = this.array;
+ return searchMap(this, x,
+ function(pair) { return pair.value },
+ function() {
+ var v = thunk();
+ a.push({ key: x, value: v });
+ return v;
+ });
+ },
+ forEach: function(f) {
+ var a = this.array;
+ for (var i = 0, n = a.length; i < n; i++) {
+ var pair = a[i];
+ f.call(this, pair.key, pair.value);
+ }
+ },
+ choose: function() {
+ return this.array[0].key;
+ },
+ get size() {
+ return this.array.length;
+ },
+ remove: function(x) {
+ var a = this.array;
+ searchMap(this, x,
+ function(pair, i) { a.splice(i, 1) },
+ function() { });
+ },
+ copy: function() {
+ return new ObjectMap(this.array.map(function(pair) {
+ return { key: pair.key, value: pair.value }
+ }));
+ },
+ clear: function() {
+ this.array = [];
+ },
+ toString: function() { return "[object ObjectMap]" }
+ };
+
+ // non-destructive stack
+ function Stack(elts) {
+ this.elts = elts || null;
+ }
+
+ Stack.prototype = {
+ push: function(x) {
+ return new Stack({ top: x, rest: this.elts });
+ },
+ top: function() {
+ if (!this.elts)
+ throw new Error("empty stack");
+ return this.elts.top;
+ },
+ isEmpty: function() {
+ return this.top === null;
+ },
+ find: function(test) {
+ for (var elts = this.elts; elts; elts = elts.rest) {
+ if (test(elts.top))
+ return elts.top;
+ }
+ return null;
+ },
+ has: function(x) {
+ return Boolean(this.find(function(elt) { return elt === x }));
+ },
+ forEach: function(f) {
+ for (var elts = this.elts; elts; elts = elts.rest) {
+ f(elts.top);
+ }
+ }
+ };
+
+ if (!Array.prototype.copy) {
+ Array.prototype.copy = function() {
+ var result = [];
+ for (var i = 0, n = this.length; i < n; i++)
+ result[i] = this[i];
+ return result;
+ };
+ }
+
+ return {
+ tokens: tokens,
+ whitespace: whitespace,
+ opTypeNames: opTypeNames,
+ keywords: keywords,
+ isStatementStartCode: isStatementStartCode,
+ tokenIds: tokenIds,
+ consts: consts,
+ assignOps: assignOps,
+ defineGetter: defineGetter,
+ defineGetterSetter: defineGetterSetter,
+ defineMemoGetter: defineMemoGetter,
+ defineProperty: defineProperty,
+ isNativeCode: isNativeCode,
+ apply: apply,
+ applyNew: applyNew,
+ mirrorHandler: mirrorHandler,
+ mixinHandler: mixinHandler,
+ whitelistHandler: whitelistHandler,
+ blacklistHandler: blacklistHandler,
+ makePassthruHandler: makePassthruHandler,
+ StringMap: StringMap,
+ ObjectMap: ObjectMap,
+ Stack: Stack
+ };
+}());
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jslex.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jslex.js
new file mode 100644
index 0000000..c5c2673
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jslex.js
@@ -0,0 +1,719 @@
+/* vim: set sw=4 ts=4 et tw=78: */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Narcissus JavaScript engine.
+ *
+ * The Initial Developer of the Original Code is
+ * Brendan Eich <brendan@mozilla.org>.
+ * Portions created by the Initial Developer are Copyright (C) 2004
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Tom Austin <taustin@ucsc.edu>
+ * Brendan Eich <brendan@mozilla.org>
+ * Shu-Yu Guo <shu@rfrn.org>
+ * Stephan Herhut <stephan.a.herhut@intel.com>
+ * Dave Herman <dherman@mozilla.com>
+ * Dimitris Vardoulakis <dimvar@ccs.neu.edu>
+ * Patrick Walton <pcwalton@mozilla.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+/*
+ * Narcissus - JS implemented in JS.
+ *
+ * Lexical scanner.
+ */
+
+"use strict";
+
+Narcissus.lexer = (function() {
+
+ var definitions = Narcissus.definitions;
+
+ //throw Error (definitions.consts);
+
+ // Set constants in the local scope.
+ //eval(definitions.consts);
+ const END = 0,
+ NEWLINE = 1,
+ SEMICOLON = 2,
+ COMMA = 3,
+ ASSIGN = 4,
+ HOOK = 5,
+ COLON = 6,
+ CONDITIONAL = 7,
+ OR = 8,
+ AND = 9,
+ BITWISE_OR = 10,
+ BITWISE_XOR = 11,
+ BITWISE_AND = 12,
+ EQ = 13,
+ NE = 14,
+ STRICT_EQ = 15,
+ STRICT_NE = 16,
+ LT = 17,
+ LE = 18,
+ GE = 19,
+ GT = 20,
+ LSH = 21,
+ RSH = 22,
+ URSH = 23,
+ PLUS = 24,
+ MINUS = 25,
+ MUL = 26,
+ DIV = 27,
+ MOD = 28,
+ NOT = 29,
+ BITWISE_NOT = 30,
+ UNARY_PLUS = 31,
+ UNARY_MINUS = 32,
+ INCREMENT = 33,
+ DECREMENT = 34,
+ DOT = 35,
+ LEFT_BRACKET = 36,
+ RIGHT_BRACKET = 37,
+ LEFT_CURLY = 38,
+ RIGHT_CURLY = 39,
+ LEFT_PAREN = 40,
+ RIGHT_PAREN = 41,
+ SCRIPT = 42,
+ BLOCK = 43,
+ LABEL = 44,
+ FOR_IN = 45,
+ CALL = 46,
+ NEW_WITH_ARGS = 47,
+ INDEX = 48,
+ ARRAY_INIT = 49,
+ OBJECT_INIT = 50,
+ PROPERTY_INIT = 51,
+ GETTER = 52,
+ SETTER = 53,
+ GROUP = 54,
+ LIST = 55,
+ LET_BLOCK = 56,
+ ARRAY_COMP = 57,
+ GENERATOR = 58,
+ COMP_TAIL = 59,
+ IDENTIFIER = 60,
+ NUMBER = 61,
+ STRING = 62,
+ REGEXP = 63,
+ BREAK = 64,
+ CASE = 65,
+ CATCH = 66,
+ CONST = 67,
+ CONTINUE = 68,
+ DEBUGGER = 69,
+ DEFAULT = 70,
+ DELETE = 71,
+ DO = 72,
+ ELSE = 73,
+ EXPORT = 74,
+ FALSE = 75,
+ FINALLY = 76,
+ FOR = 77,
+ FUNCTION = 78,
+ IF = 79,
+ IMPORT = 80,
+ IN = 81,
+ INSTANCEOF = 82,
+ LET = 83,
+ MODULE = 84,
+ NEW = 85,
+ NULL = 86,
+ RETURN = 87,
+ SWITCH = 88,
+ THIS = 89,
+ THROW = 90,
+ TRUE = 91,
+ TRY = 92,
+ TYPEOF = 93,
+ VAR = 94,
+ VOID = 95,
+ YIELD = 96,
+ WHILE = 97,
+ WITH = 98;
+
+ // Banned keywords by language version
+ const blackLists = { 160: {}, 185: {}, harmony: {} };
+/* blackLists[160][LET] = true;
+ blackLists[160][MODULE] = true;
+ blackLists[160][YIELD] = true;
+ blackLists[185][MODULE] = true;
+*/
+ // Build up a trie of operator tokens.
+ var opTokens = {};
+ for (var op in definitions.opTypeNames) {
+ if (op === '\n' || op === '.')
+ continue;
+
+ var node = opTokens;
+ for (var i = 0; i < op.length; i++) {
+ var ch = op[i];
+ if (!(ch in node))
+ node[ch] = {};
+ node = node[ch];
+ node.op = op;
+ }
+ }
+
+ /*
+ * Since JavaScript provides no convenient way to determine if a
+ * character is in a particular Unicode category, we use
+ * metacircularity to accomplish this (oh yeaaaah!)
+ */
+ function isValidIdentifierChar(ch, first) {
+ // check directly for ASCII
+ if (ch <= "\u007F") {
+ if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '$' || ch === '_' ||
+ (!first && (ch >= '0' && ch <= '9'))) {
+ return true;
+ }
+ return false;
+ }
+
+ // create an object to test this in
+ var x = {};
+ x["x"+ch] = true;
+ x[ch] = true;
+
+ // then use eval to determine if it's a valid character
+ var valid = false;
+ try {
+ valid = (Function("x", "return (x." + (first?"":"x") + ch + ");")(x) === true);
+ } catch (ex) {}
+
+ return valid;
+ }
+
+ function isIdentifier(str) {
+ if (typeof str !== "string")
+ return false;
+
+ if (str.length === 0)
+ return false;
+
+ if (!isValidIdentifierChar(str[0], true))
+ return false;
+
+ for (var i = 1; i < str.length; i++) {
+ if (!isValidIdentifierChar(str[i], false))
+ return false;
+ }
+
+ return true;
+ }
+
+ /*
+ * Tokenizer :: (source, filename, line number) -> Tokenizer
+ */
+ function Tokenizer(s, f, l) {
+ this.cursor = 0;
+ this.source = String(s);
+ this.tokens = [];
+ this.tokenIndex = 0;
+ this.lookahead = 0;
+ this.scanNewlines = false;
+ this.unexpectedEOF = false;
+ this.filename = f || "";
+ this.lineno = l || 1;
+ this.blackList = blackLists[Narcissus.options.version];
+ this.blockComments = null;
+ }
+
+ Tokenizer.prototype = {
+ get done() {
+ // We need to set scanOperand to true here because the first thing
+ // might be a regexp.
+ return this.peek(true) === END;
+ },
+
+ get token() {
+ return this.tokens[this.tokenIndex];
+ },
+
+ match: function (tt, scanOperand) {
+ return this.get(scanOperand) === tt || this.unget();
+ },
+
+ mustMatch: function (tt) {
+ if (!this.match(tt)) {
+ throw this.newSyntaxError("Missing " +
+ definitions.tokens[tt].toLowerCase());
+ }
+ return this.token;
+ },
+
+ peek: function (scanOperand) {
+ var tt, next;
+ if (this.lookahead) {
+ next = this.tokens[(this.tokenIndex + this.lookahead) & 3];
+ tt = (this.scanNewlines && next.lineno !== this.lineno)
+ ? NEWLINE
+ : next.type;
+ } else {
+ tt = this.get(scanOperand);
+ this.unget();
+ }
+ return tt;
+ },
+
+ peekOnSameLine: function (scanOperand) {
+ this.scanNewlines = true;
+ var tt = this.peek(scanOperand);
+ this.scanNewlines = false;
+ return tt;
+ },
+
+ lastBlockComment: function() {
+ var length = this.blockComments.length;
+ return length ? this.blockComments[length - 1] : null;
+ },
+
+ // Eat comments and whitespace.
+ skip: function () {
+ var input = this.source;
+ this.blockComments = [];
+ for (;;) {
+ var ch = input[this.cursor++];
+ var next = input[this.cursor];
+ // handle \r, \r\n and (always preferable) \n
+ if (ch === '\r') {
+ // if the next character is \n, we don't care about this at all
+ if (next === '\n') continue;
+
+ // otherwise, we want to consider this as a newline
+ ch = '\n';
+ }
+
+ if (ch === '\n' && !this.scanNewlines) {
+ this.lineno++;
+ } else if (ch === '/' && next === '*') {
+ var commentStart = ++this.cursor;
+ for (;;) {
+ ch = input[this.cursor++];
+ if (ch === undefined)
+ throw this.newSyntaxError("Unterminated comment");
+
+ if (ch === '*') {
+ next = input[this.cursor];
+ if (next === '/') {
+ var commentEnd = this.cursor - 1;
+ this.cursor++;
+ break;
+ }
+ } else if (ch === '\n') {
+ this.lineno++;
+ }
+ }
+ this.blockComments.push(input.substring(commentStart, commentEnd));
+ }
+ else if (ch === '-' && next === '-' &&
+ input[this.cursor + 1] === '>') {
+ this.cursor += 2;
+ }
+ else if ((ch === '/' && next === '/') ||
+ (ch === '<' && next === '!' &&
+ input[this.cursor + 1] === '-' &&
+ input[this.cursor + 2] === '-' &&
+ (this.cursor += 2))) {
+
+ // capture single line comments starts.
+ var commentStart = ++this.cursor;
+ for (;;) {
+ ch = input[this.cursor++];
+ if (ch === undefined) {
+ //this.lineno++;
+ break;
+ //throw this.newSyntaxError("Unterminated comment");
+ }
+ if (ch === '\r') {
+ // check for \r\n
+ if (next !== '\n') ch = '\n';
+ var commentEnd = this.cursor - 1;
+ }
+
+ if (ch === '\n') {
+ if (this.scanNewlines) {
+ this.cursor--;
+ } else {
+ this.lineno++;
+ }
+ var commentEnd = this.cursor - 1;
+ break;
+ }
+ }
+ this.blockComments.push(input.substring(commentStart, commentEnd));
+ // capture single line comments ends.
+ } else if (!(ch in definitions.whitespace)) {
+ this.cursor--;
+ return;
+ }
+ }
+ },
+
+ // Lex the exponential part of a number, if present. Return true iff an
+ // exponential part was found.
+ lexExponent: function() {
+ var input = this.source;
+ var next = input[this.cursor];
+ if (next === 'e' || next === 'E') {
+ this.cursor++;
+ ch = input[this.cursor++];
+ if (ch === '+' || ch === '-')
+ ch = input[this.cursor++];
+
+ if (ch < '0' || ch > '9')
+ throw this.newSyntaxError("Missing exponent");
+
+ do {
+ ch = input[this.cursor++];
+ } while (ch >= '0' && ch <= '9');
+ this.cursor--;
+
+ return true;
+ }
+
+ return false;
+ },
+
+ lexZeroNumber: function (ch) {
+ var token = this.token, input = this.source;
+ token.type = NUMBER;
+
+ ch = input[this.cursor++];
+ if (ch === '.') {
+ do {
+ ch = input[this.cursor++];
+ } while (ch >= '0' && ch <= '9');
+ this.cursor--;
+
+ this.lexExponent();
+ token.value = parseFloat(
+ input.substring(token.start, this.cursor));
+ } else if (ch === 'x' || ch === 'X') {
+ do {
+ ch = input[this.cursor++];
+ } while ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') ||
+ (ch >= 'A' && ch <= 'F'));
+ this.cursor--;
+
+ token.value = parseInt(input.substring(token.start, this.cursor));
+ } else if (ch >= '0' && ch <= '7') {
+ do {
+ ch = input[this.cursor++];
+ } while (ch >= '0' && ch <= '7');
+ this.cursor--;
+
+ token.value = parseInt(input.substring(token.start, this.cursor));
+ } else {
+ this.cursor--;
+ this.lexExponent(); // 0E1, &c.
+ token.value = 0;
+ }
+ },
+
+ lexNumber: function (ch) {
+ var token = this.token, input = this.source;
+ token.type = NUMBER;
+
+ var floating = false;
+ do {
+ ch = input[this.cursor++];
+ if (ch === '.' && !floating) {
+ floating = true;
+ ch = input[this.cursor++];
+ }
+ } while (ch >= '0' && ch <= '9');
+
+ this.cursor--;
+
+ var exponent = this.lexExponent();
+ floating = floating || exponent;
+
+ var str = input.substring(token.start, this.cursor);
+ token.value = floating ? parseFloat(str) : parseInt(str);
+ },
+
+ lexDot: function (ch) {
+ var token = this.token, input = this.source;
+ var next = input[this.cursor];
+ if (next >= '0' && next <= '9') {
+ do {
+ ch = input[this.cursor++];
+ } while (ch >= '0' && ch <= '9');
+ this.cursor--;
+
+ this.lexExponent();
+
+ token.type = NUMBER;
+ token.value = parseFloat(
+ input.substring(token.start, this.cursor));
+ } else {
+ token.type = DOT;
+ token.assignOp = null;
+ token.value = '.';
+ }
+ },
+
+ lexString: function (ch) {
+ var token = this.token, input = this.source;
+ token.type = STRING;
+
+ var hasEscapes = false;
+ var delim = ch;
+ if (input.length <= this.cursor)
+ throw this.newSyntaxError("Unterminated string literal");
+ while ((ch = input[this.cursor++]) !== delim) {
+ if (this.cursor == input.length)
+ throw this.newSyntaxError("Unterminated string literal");
+ if (ch === '\\') {
+ hasEscapes = true;
+ if (++this.cursor == input.length)
+ throw this.newSyntaxError("Unterminated string literal");
+ }
+ }
+
+ token.value = hasEscapes
+ ? eval(input.substring(token.start, this.cursor))
+ : input.substring(token.start + 1, this.cursor - 1);
+ },
+
+ lexRegExp: function (ch) {
+ var token = this.token, input = this.source;
+ token.type = REGEXP;
+
+ do {
+ ch = input[this.cursor++];
+ if (ch === '\\') {
+ this.cursor++;
+ } else if (ch === '[') {
+ do {
+ if (ch === undefined)
+ throw this.newSyntaxError("Unterminated character class");
+
+ if (ch === '\\')
+ this.cursor++;
+
+ ch = input[this.cursor++];
+ } while (ch !== ']');
+ } else if (ch === undefined) {
+ throw this.newSyntaxError("Unterminated regex");
+ }
+ } while (ch !== '/');
+
+ do {
+ ch = input[this.cursor++];
+ } while (ch >= 'a' && ch <= 'z');
+
+ this.cursor--;
+
+ token.value = eval(input.substring(token.start, this.cursor));
+ },
+
+ lexOp: function (ch) {
+ var token = this.token, input = this.source;
+
+ // A bit ugly, but it seems wasteful to write a trie lookup routine
+ // for only 3 characters...
+ var node = opTokens[ch];
+ var next = input[this.cursor];
+ if (next in node) {
+ node = node[next];
+ this.cursor++;
+ next = input[this.cursor];
+ if (next in node) {
+ node = node[next];
+ this.cursor++;
+ next = input[this.cursor];
+ }
+ }
+
+ var op = node.op;
+ if (definitions.assignOps[op] && input[this.cursor] === '=') {
+ this.cursor++;
+ token.type = ASSIGN;
+ token.assignOp = definitions.tokenIds[definitions.opTypeNames[op]];
+ op += '=';
+ } else {
+ token.type = definitions.tokenIds[definitions.opTypeNames[op]];
+ token.assignOp = null;
+ }
+
+ token.value = op;
+ },
+
+ // FIXME: Unicode escape sequences
+ lexIdent: function (ch) {
+ var token = this.token;
+ var id = ch;
+
+ while ((ch = this.getValidIdentifierChar(false)) !== null) {
+ id += ch;
+ }
+
+ token.type = definitions.keywords[id] || IDENTIFIER;
+ if (token.type in this.blackList) {
+ // banned keyword, this is an identifier
+ token.type = IDENTIFIER;
+ }
+ token.value = id;
+ },
+
+ /*
+ * Tokenizer.get :: void -> token type
+ *
+ * Consume input *only* if there is no lookahead.
+ * Dispatch to the appropriate lexing function depending on the input.
+ */
+ get: function (scanOperand) {
+ var token;
+ while (this.lookahead) {
+ --this.lookahead;
+ this.tokenIndex = (this.tokenIndex + 1) & 3;
+ token = this.tokens[this.tokenIndex];
+ if (token.type !== NEWLINE || this.scanNewlines)
+ return token.type;
+ }
+
+ this.skip();
+
+ this.tokenIndex = (this.tokenIndex + 1) & 3;
+ token = this.tokens[this.tokenIndex];
+ if (!token)
+ this.tokens[this.tokenIndex] = token = {};
+
+ var input = this.source;
+ if (this.cursor >= input.length)
+ return token.type = END;
+
+ token.start = this.cursor;
+ token.lineno = this.lineno;
+
+ var ich = this.getValidIdentifierChar(true);
+ var ch = (ich === null) ? input[this.cursor++] : null;
+ if (ich !== null) {
+ this.lexIdent(ich);
+ } else if (scanOperand && ch === '/') {
+ this.lexRegExp(ch);
+ } else if (ch in opTokens) {
+ this.lexOp(ch);
+ } else if (ch === '.') {
+ this.lexDot(ch);
+ } else if (ch >= '1' && ch <= '9') {
+ this.lexNumber(ch);
+ } else if (ch === '0') {
+ this.lexZeroNumber(ch);
+ } else if (ch === '"' || ch === "'") {
+ this.lexString(ch);
+ } else if (this.scanNewlines && (ch === '\n' || ch === '\r')) {
+ // if this was a \r, look for \r\n
+ if (ch === '\r' && input[this.cursor] === '\n') this.cursor++;
+ token.type = NEWLINE;
+ token.value = '\n';
+ this.lineno++;
+ } else {
+ throw this.newSyntaxError("Illegal token");
+ }
+
+ token.end = this.cursor;
+ return token.type;
+ },
+
+ /*
+ * Tokenizer.unget :: void -> undefined
+ *
+ * Match depends on unget returning undefined.
+ */
+ unget: function () {
+ if (++this.lookahead === 4) throw "PANIC: too much lookahead!";
+ this.tokenIndex = (this.tokenIndex - 1) & 3;
+ },
+
+ newSyntaxError: function (m) {
+ m = (this.filename ? this.filename + ":" : "") + this.lineno + ": " + m;
+ var e = new SyntaxError(m, this.filename, this.lineno);
+ e.source = this.source;
+ e.cursor = this.lookahead
+ ? this.tokens[(this.tokenIndex + this.lookahead) & 3].start
+ : this.cursor;
+ return e;
+ },
+
+
+ /* Gets a single valid identifier char from the input stream, or null
+ * if there is none.
+ */
+ getValidIdentifierChar: function(first) {
+ var input = this.source;
+ if (this.cursor >= input.length) return null;
+ var ch = input[this.cursor];
+
+ // first check for \u escapes
+ if (ch === '\\' && input[this.cursor+1] === 'u') {
+ // get the character value
+ try {
+ ch = String.fromCharCode(parseInt(
+ input.substring(this.cursor + 2, this.cursor + 6),
+ 16));
+ } catch (ex) {
+ return null;
+ }
+ this.cursor += 5;
+ }
+
+ var valid = isValidIdentifierChar(ch, first);
+ if (valid) this.cursor++;
+ return (valid ? ch : null);
+ },
+ };
+
+
+ return {
+ isIdentifier: isIdentifier,
+ Tokenizer: Tokenizer
+ };
+
+}());
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jsparse.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jsparse.js
new file mode 100644
index 0000000..b78078c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jsparse.js
@@ -0,0 +1,2042 @@
+/* -*- Mode: JS; tab-width: 4; indent-tabs-mode: nil; -*-
+ * vim: set sw=4 ts=4 et tw=78:
+ * ***** BEGIN LICENSE BLOCK *****
+ *
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Narcissus JavaScript engine.
+ *
+ * The Initial Developer of the Original Code is
+ * Brendan Eich <brendan@mozilla.org>.
+ * Portions created by the Initial Developer are Copyright (C) 2004
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Tom Austin <taustin@ucsc.edu>
+ * Brendan Eich <brendan@mozilla.org>
+ * Shu-Yu Guo <shu@rfrn.org>
+ * Dave Herman <dherman@mozilla.com>
+ * Dimitris Vardoulakis <dimvar@ccs.neu.edu>
+ * Patrick Walton <pcwalton@mozilla.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+/*
+ * Narcissus - JS implemented in JS.
+ *
+ * Parser.
+ */
+
+"use strict";
+
+Narcissus.parser = (function() {
+
+ var lexer = Narcissus.lexer;
+ var definitions = Narcissus.definitions;
+
+ const StringMap = definitions.StringMap;
+ const Stack = definitions.Stack;
+
+ var comment;
+
+ // Set constants in the local scope.
+ //eval(definitions.consts);
+ const END = 0,
+ NEWLINE = 1,
+ SEMICOLON = 2,
+ COMMA = 3,
+ ASSIGN = 4,
+ HOOK = 5,
+ COLON = 6,
+ CONDITIONAL = 7,
+ OR = 8,
+ AND = 9,
+ BITWISE_OR = 10,
+ BITWISE_XOR = 11,
+ BITWISE_AND = 12,
+ EQ = 13,
+ NE = 14,
+ STRICT_EQ = 15,
+ STRICT_NE = 16,
+ LT = 17,
+ LE = 18,
+ GE = 19,
+ GT = 20,
+ LSH = 21,
+ RSH = 22,
+ URSH = 23,
+ PLUS = 24,
+ MINUS = 25,
+ MUL = 26,
+ DIV = 27,
+ MOD = 28,
+ NOT = 29,
+ BITWISE_NOT = 30,
+ UNARY_PLUS = 31,
+ UNARY_MINUS = 32,
+ INCREMENT = 33,
+ DECREMENT = 34,
+ DOT = 35,
+ LEFT_BRACKET = 36,
+ RIGHT_BRACKET = 37,
+ LEFT_CURLY = 38,
+ RIGHT_CURLY = 39,
+ LEFT_PAREN = 40,
+ RIGHT_PAREN = 41,
+ SCRIPT = 42,
+ BLOCK = 43,
+ LABEL = 44,
+ FOR_IN = 45,
+ CALL = 46,
+ NEW_WITH_ARGS = 47,
+ INDEX = 48,
+ ARRAY_INIT = 49,
+ OBJECT_INIT = 50,
+ PROPERTY_INIT = 51,
+ GETTER = 52,
+ SETTER = 53,
+ GROUP = 54,
+ LIST = 55,
+ LET_BLOCK = 56,
+ ARRAY_COMP = 57,
+ GENERATOR = 58,
+ COMP_TAIL = 59,
+ IDENTIFIER = 60,
+ NUMBER = 61,
+ STRING = 62,
+ REGEXP = 63,
+ BREAK = 64,
+ CASE = 65,
+ CATCH = 66,
+ CONST = 67,
+ CONTINUE = 68,
+ DEBUGGER = 69,
+ DEFAULT = 70,
+ DELETE = 71,
+ DO = 72,
+ ELSE = 73,
+ EXPORT = 74,
+ FALSE = 75,
+ FINALLY = 76,
+ FOR = 77,
+ FUNCTION = 78,
+ IF = 79,
+ IMPORT = 80,
+ IN = 81,
+ INSTANCEOF = 82,
+ LET = 83,
+ MODULE = 84,
+ NEW = 85,
+ NULL = 86,
+ RETURN = 87,
+ SWITCH = 88,
+ THIS = 89,
+ THROW = 90,
+ TRUE = 91,
+ TRY = 92,
+ TYPEOF = 93,
+ VAR = 94,
+ VOID = 95,
+ YIELD = 96,
+ WHILE = 97,
+ WITH = 98;
+
+ // Banned statement types by language version.
+ const blackLists = { 160: {}, 185: {}, harmony: {} };
+ /* blackLists[160][IMPORT] = true;
+ blackLists[160][EXPORT] = true;
+ blackLists[160][LET] = true;
+ blackLists[160][MODULE] = true;
+ blackLists[160][YIELD] = true;
+ blackLists[185][IMPORT] = true;
+ blackLists[185][EXPORT] = true;
+ blackLists[185][MODULE] = true;
+ blackLists.harmony[WITH] = true;
+*/
+ /*
+ * pushDestructuringVarDecls :: (node, hoisting node) -> void
+ *
+ * Recursively add all destructured declarations to varDecls.
+ */
+ function pushDestructuringVarDecls(n, s) {
+ for (var i in n) {
+ var sub = n[i];
+ if (sub.type === IDENTIFIER) {
+ s.varDecls.push(sub);
+ } else {
+ pushDestructuringVarDecls(sub, s);
+ }
+ }
+ }
+
+ function StaticContext(parentScript, parentBlock, inModule, inFunction) {
+ this.parentScript = parentScript;
+ this.parentBlock = parentBlock || parentScript;
+ this.inModule = inModule || false;
+ this.inFunction = inFunction || false;
+ this.inForLoopInit = false;
+ this.topLevel = true;
+ this.allLabels = new Stack();
+ this.currentLabels = new Stack();
+ this.labeledTargets = new Stack();
+ this.defaultLoopTarget = null;
+ this.defaultTarget = null;
+ this.blackList = blackLists[Narcissus.options.version];
+ Narcissus.options.ecma3OnlyMode && (this.ecma3OnlyMode = true);
+ Narcissus.options.parenFreeMode && (this.parenFreeMode = true);
+ }
+
+ StaticContext.prototype = {
+ ecma3OnlyMode: false,
+ parenFreeMode: false,
+ // non-destructive update via prototype extension
+ update: function(ext) {
+ var desc = {};
+ for (var key in ext) {
+ desc[key] = {
+ value: ext[key],
+ writable: true,
+ enumerable: true,
+ configurable: true
+ }
+ }
+ return Object.create(this, desc);
+ },
+ pushLabel: function(label) {
+ return this.update({ currentLabels: this.currentLabels.push(label),
+ allLabels: this.allLabels.push(label) });
+ },
+ pushTarget: function(target) {
+ var isDefaultLoopTarget = target.isLoop;
+ var isDefaultTarget = isDefaultLoopTarget || target.type === SWITCH;
+
+ if (this.currentLabels.isEmpty()) {
+ if (isDefaultLoopTarget) this.update({ defaultLoopTarget: target });
+ if (isDefaultTarget) this.update({ defaultTarget: target });
+ return this;
+ }
+
+ target.labels = new StringMap();
+ this.currentLabels.forEach(function(label) {
+ target.labels.set(label, true);
+ });
+ return this.update({ currentLabels: new Stack(),
+ labeledTargets: this.labeledTargets.push(target),
+ defaultLoopTarget: isDefaultLoopTarget
+ ? target
+ : this.defaultLoopTarget,
+ defaultTarget: isDefaultTarget
+ ? target
+ : this.defaultTarget });
+ },
+ nest: function() {
+ return this.topLevel ? this.update({ topLevel: false }) : this;
+ },
+ allow: function(type) {
+ switch (type) {
+ case EXPORT:
+ if (!this.inModule || this.inFunction || !this.topLevel)
+ return false;
+ // FALL THROUGH
+
+ case IMPORT:
+ return !this.inFunction && this.topLevel;
+
+ case MODULE:
+ return !this.inFunction && this.topLevel;
+
+ default:
+ return true;
+ }
+ }
+ };
+
+ /*
+ * Script :: (tokenizer, boolean, boolean) -> node
+ *
+ * Parses the toplevel and module/function bodies.
+ */
+ function Script(t, inModule, inFunction) {
+ var n = new Node(t, scriptInit());
+ Statements(t, new StaticContext(n, n, inModule, inFunction), n);
+ return n;
+ }
+
+ // We extend Array slightly with a top-of-stack method.
+ definitions.defineProperty(Array.prototype, "top",
+ function() {
+ return this.length && this[this.length-1];
+ }, false, false, true);
+
+ /*
+ * Node :: (tokenizer, optional init object) -> node
+ */
+ function Node(t, init) {
+ var token = t.token;
+ if (token) {
+ // If init.type exists it will override token.type.
+ this.type = token.type;
+ this.value = token.value;
+ this.lineno = token.lineno;
+
+ // Start and end are file positions for error handling.
+ this.start = token.start;
+ this.end = token.end;
+ } else {
+ this.lineno = t.lineno;
+ }
+
+ // Node uses a tokenizer for debugging (getSource, filename getter).
+ this.tokenizer = t;
+ this.children = [];
+
+ for (var prop in init)
+ this[prop] = init[prop];
+ }
+
+ /*
+ * SyntheticNode :: (tokenizer, optional init object) -> node
+ */
+ function SyntheticNode(t, init) {
+ // print("SYNTHETIC NODE");
+ // if (init.type === COMMA) {
+ // print("SYNTHETIC COMMA");
+ // print(init);
+ // }
+ this.tokenizer = t;
+ this.children = [];
+ for (var prop in init)
+ this[prop] = init[prop];
+ this.synthetic = true;
+ }
+
+ var Np = Node.prototype = SyntheticNode.prototype = {};
+ Np.constructor = Node;
+
+ const TO_SOURCE_SKIP = {
+ type: true,
+ value: true,
+ lineno: true,
+ start: true,
+ end: true,
+ tokenizer: true,
+ assignOp: true
+ };
+ function unevalableConst(code) {
+ var token = definitions.tokens[code];
+ var constName = definitions.opTypeNames.hasOwnProperty(token)
+ ? definitions.opTypeNames[token]
+ : token in definitions.keywords
+ ? token.toUpperCase()
+ : token;
+ return { toSource: function() { return constName } };
+ }
+ Np.toSource = function toSource() {
+ var mock = {};
+ var self = this;
+ mock.type = unevalableConst(this.type);
+ if ("value" in this)
+ mock.value = this.value;
+ if ("lineno" in this)
+ mock.lineno = this.lineno;
+ if ("start" in this)
+ mock.start = this.start;
+ if ("end" in this)
+ mock.end = this.end;
+ if (this.assignOp)
+ mock.assignOp = unevalableConst(this.assignOp);
+ for (var key in this) {
+ if (this.hasOwnProperty(key) && !(key in TO_SOURCE_SKIP))
+ mock[key] = this[key];
+ }
+ return mock.toSource();
+ };
+
+ // Always use push to add operands to an expression, to update start and end.
+ Np.push = function (kid) {
+ // kid can be null e.g. [1, , 2].
+ if (kid !== null) {
+ if (kid.start < this.start)
+ this.start = kid.start;
+ if (this.end < kid.end)
+ this.end = kid.end;
+ }
+ return this.children.push(kid);
+ }
+
+ Node.indentLevel = 0;
+
+ function tokenString(tt) {
+ var t = definitions.tokens[tt];
+ return /^\W/.test(t) ? definitions.opTypeNames[t] : t.toUpperCase();
+ }
+
+ Np.toString = function () {
+ var a = [];
+ for (var i in this) {
+ if (this.hasOwnProperty(i) && i !== 'type' && i !== 'target')
+ a.push({id: i, value: this[i]});
+ }
+ a.sort(function (a,b) { return (a.id < b.id) ? -1 : 1; });
+ const INDENTATION = " ";
+ var n = ++Node.indentLevel;
+ var s = "{\n" + INDENTATION.repeat(n) + "type: " + tokenString(this.type);
+ for (i = 0; i < a.length; i++)
+ s += ",\n" + INDENTATION.repeat(n) + a[i].id + ": " + a[i].value;
+ n = --Node.indentLevel;
+ s += "\n" + INDENTATION.repeat(n) + "}";
+ return s;
+ }
+
+ Np.getSource = function () {
+ return this.tokenizer.source.slice(this.start, this.end);
+ };
+
+ /*
+ * Helper init objects for common nodes.
+ */
+
+ const LOOP_INIT = { isLoop: true };
+
+ function blockInit() {
+ return { type: BLOCK, varDecls: [] };
+ }
+
+ function scriptInit() {
+ return { type: SCRIPT,
+ funDecls: [],
+ varDecls: [],
+ modDefns: new StringMap(),
+ modAssns: new StringMap(),
+ modDecls: new StringMap(),
+ modLoads: new StringMap(),
+ impDecls: [],
+ expDecls: [],
+ exports: new StringMap(),
+ hasEmptyReturn: false,
+ hasReturnWithValue: false,
+ isGenerator: false };
+ }
+
+ definitions.defineGetter(Np, "filename",
+ function() {
+ return this.tokenizer.filename;
+ });
+
+ definitions.defineGetter(Np, "length",
+ function() {
+ throw new Error("Node.prototype.length is gone; " +
+ "use n.children.length instead");
+ });
+
+ definitions.defineProperty(String.prototype, "repeat",
+ function(n) {
+ var s = "", t = this + s;
+ while (--n >= 0)
+ s += t;
+ return s;
+ }, false, false, true);
+
+ function MaybeLeftParen(t, x) {
+ if (x.parenFreeMode)
+ return t.match(LEFT_PAREN) ? LEFT_PAREN : END;
+ return t.mustMatch(LEFT_PAREN).type;
+ }
+
+ function MaybeRightParen(t, p) {
+ if (p === LEFT_PAREN)
+ t.mustMatch(RIGHT_PAREN);
+ }
+
+ /*
+ * Statements :: (tokenizer, compiler context, node) -> void
+ *
+ * Parses a sequence of Statements.
+ */
+ function Statements(t, x, n) {
+ try {
+ while (!t.done && t.peek(true) !== RIGHT_CURLY)
+ n.push(Statement(t, x));
+ } catch (e) {
+ if (t.done)
+ t.unexpectedEOF = true;
+ throw e;
+ }
+ }
+
+ function Block(t, x) {
+ t.mustMatch(LEFT_CURLY);
+ var n = new Node(t, blockInit());
+ Statements(t, x.update({ parentBlock: n }).pushTarget(n), n);
+ t.mustMatch(RIGHT_CURLY);
+ return n;
+ }
+
+ const DECLARED_FORM = 0, EXPRESSED_FORM = 1, STATEMENT_FORM = 2;
+
+ /*
+ * Export :: (binding node, boolean) -> Export
+ *
+ * Static semantic representation of a module export.
+ */
+ function Export(node, isDefinition) {
+ this.node = node; // the AST node declaring this individual export
+ this.isDefinition = isDefinition; // is the node an 'export'-annotated definition?
+ this.resolved = null; // resolved pointer to the target of this export
+ }
+
+ /*
+ * registerExport :: (StringMap, EXPORT node) -> void
+ */
+ function registerExport(exports, decl) {
+ function register(name, exp) {
+ if (exports.has(name))
+ throw new SyntaxError("multiple exports of " + name);
+ exports.set(name, exp);
+ }
+
+ switch (decl.type) {
+ case MODULE:
+ case FUNCTION:
+ register(decl.name, new Export(decl, true));
+ break;
+
+ case VAR:
+ for (var i = 0; i < decl.children.length; i++)
+ register(decl.children[i].name, new Export(decl.children[i], true));
+ break;
+
+ case LET:
+ case CONST:
+ throw new Error("NYI: " + definitions.tokens[decl.type]);
+
+ case EXPORT:
+ for (var i = 0; i < decl.pathList.length; i++) {
+ var path = decl.pathList[i];
+ switch (path.type) {
+ case OBJECT_INIT:
+ for (var j = 0; j < path.children.length; j++) {
+ // init :: IDENTIFIER | PROPERTY_INIT
+ var init = path.children[j];
+ if (init.type === IDENTIFIER)
+ register(init.value, new Export(init, false));
+ else
+ register(init.children[0].value, new Export(init.children[1], false));
+ }
+ break;
+
+ case DOT:
+ register(path.children[1].value, new Export(path, false));
+ break;
+
+ case IDENTIFIER:
+ register(path.value, new Export(path, false));
+ break;
+
+ default:
+ throw new Error("unexpected export path: " + definitions.tokens[path.type]);
+ }
+ }
+ break;
+
+ default:
+ throw new Error("unexpected export decl: " + definitions.tokens[exp.type]);
+ }
+ }
+
+ /*
+ * Module :: (node) -> Module
+ *
+ * Static semantic representation of a module.
+ */
+ function Module(node) {
+ var exports = node.body.exports;
+ var modDefns = node.body.modDefns;
+
+ var exportedModules = new StringMap();
+
+ exports.forEach(function(name, exp) {
+ var node = exp.node;
+ if (node.type === MODULE) {
+ exportedModules.set(name, node);
+ } else if (!exp.isDefinition && node.type === IDENTIFIER && modDefns.has(node.value)) {
+ var mod = modDefns.get(node.value);
+ exportedModules.set(name, mod);
+ }
+ });
+
+ this.node = node;
+ this.exports = exports;
+ this.exportedModules = exportedModules;
+ }
+
+ /*
+ * Statement :: (tokenizer, compiler context) -> node
+ *
+ * Parses a Statement.
+ */
+ function Statement(t, x) {
+ var i, label, n, n2, p, c, ss, tt = t.get(true), tt2, x2, x3;
+
+ var comments = t.blockComments;
+
+ if (x.blackList[tt])
+ throw t.newSyntaxError(definitions.tokens[tt] + " statements only allowed in Harmony");
+ if (!x.allow(tt))
+ throw t.newSyntaxError(definitions.tokens[tt] + " statement in illegal context");
+
+ // Cases for statements ending in a right curly return early, avoiding the
+ // common semicolon insertion magic after this switch.
+ switch (tt) {
+ case IMPORT:
+ n = new Node(t);
+ n.pathList = ImportPathList(t, x);
+ x.parentScript.impDecls.push(n);
+ n.blockComments = comments;
+ break;
+
+ case EXPORT:
+ switch (t.peek()) {
+ case MODULE:
+ case FUNCTION:
+ case LET:
+ case VAR:
+ case CONST:
+ n = Statement(t, x);
+ n.blockComments = comments;
+ n.exported = true;
+ x.parentScript.expDecls.push(n);
+ registerExport(x.parentScript.exports, n);
+ return n;
+
+ default:
+ n = new Node(t);
+ n.blockComments = comments;
+ n.pathList = ExportPathList(t, x);
+ break;
+ }
+ x.parentScript.expDecls.push(n);
+ registerExport(x.parentScript.exports, n);
+ break;
+
+ case MODULE:
+ n = new Node(t);
+ n.blockComments = comments;
+ t.mustMatch(IDENTIFIER);
+ label = t.token.value;
+
+ if (t.match(LEFT_CURLY)) {
+ n.name = label;
+ n.body = Script(t, true, false);
+ n.module = new Module(n);
+ t.mustMatch(RIGHT_CURLY);
+ x.parentScript.modDefns.set(n.name, n);
+ return n;
+ }
+
+ t.unget();
+ ModuleVariables(t, x, n);
+ return n;
+
+ case FUNCTION:
+ // DECLARED_FORM extends funDecls of x, STATEMENT_FORM doesn't.
+ return FunctionDefinition(t, x, true, x.topLevel ? DECLARED_FORM : STATEMENT_FORM, comments);
+
+ case LEFT_CURLY:
+ n = new Node(t, blockInit());
+ n.blockComments = comments;
+ Statements(t, x.update({ parentBlock: n }).pushTarget(n).nest(), n);
+ t.mustMatch(RIGHT_CURLY);
+ return n;
+
+ case IF:
+ n = new Node(t);
+ n.blockComments = comments;
+ n.condition = HeadExpression(t, x);
+ x2 = x.pushTarget(n).nest();
+ n.thenPart = Statement(t, x2);
+ n.elsePart = t.match(ELSE, true) ? Statement(t, x2) : null;
+ return n;
+
+ case SWITCH:
+ // This allows CASEs after a DEFAULT, which is in the standard.
+ n = new Node(t, { cases: [], defaultIndex: -1 });
+ n.blockComments = comments;
+ n.discriminant = HeadExpression(t, x);
+ x2 = x.pushTarget(n).nest();
+ t.mustMatch(LEFT_CURLY);
+ while ((tt = t.get()) !== RIGHT_CURLY) {
+ switch (tt) {
+ case DEFAULT:
+ if (n.defaultIndex >= 0)
+ throw t.newSyntaxError("More than one switch default");
+ // FALL THROUGH
+ case CASE:
+ n2 = new Node(t);
+ if (tt === DEFAULT)
+ n.defaultIndex = n.cases.length;
+ else
+ n2.caseLabel = Expression(t, x2, COLON);
+ break;
+
+ default:
+ throw t.newSyntaxError("Invalid switch case");
+ }
+ t.mustMatch(COLON);
+ n2.statements = new Node(t, blockInit());
+ while ((tt=t.peek(true)) !== CASE && tt !== DEFAULT &&
+ tt !== RIGHT_CURLY)
+ n2.statements.push(Statement(t, x2));
+ n.cases.push(n2);
+ }
+ return n;
+
+ case FOR:
+ n = new Node(t, LOOP_INIT);
+ n.blockComments = comments;
+ if (t.match(IDENTIFIER)) {
+ if (t.token.value === "each")
+ n.isEach = true;
+ else
+ t.unget();
+ }
+ if (!x.parenFreeMode)
+ t.mustMatch(LEFT_PAREN);
+ x2 = x.pushTarget(n).nest();
+ x3 = x.update({ inForLoopInit: true });
+ n2 = null;
+ if ((tt = t.peek(true)) !== SEMICOLON) {
+ if (tt === VAR || tt === CONST) {
+ t.get();
+ n2 = Variables(t, x3);
+ } else if (tt === LET) {
+ t.get();
+ if (t.peek() === LEFT_PAREN) {
+ n2 = LetBlock(t, x3, false);
+ } else {
+ // Let in for head, we need to add an implicit block
+ // around the rest of the for.
+ x3.parentBlock = n;
+ n.varDecls = [];
+ n2 = Variables(t, x3);
+ }
+ } else {
+ n2 = Expression(t, x3);
+ }
+ }
+ if (n2 && t.match(IN)) {
+ n.type = FOR_IN;
+ n.object = Expression(t, x3);
+ if (n2.type === VAR || n2.type === LET) {
+ c = n2.children;
+
+ // Destructuring turns one decl into multiples, so either
+ // there must be only one destructuring or only one
+ // decl.
+ if (c.length !== 1 && n2.destructurings.length !== 1) {
+ throw new SyntaxError("Invalid for..in left-hand side",
+ t.filename, n2.lineno);
+ }
+ if (n2.destructurings.length > 0) {
+ n.iterator = n2.destructurings[0];
+ } else {
+ n.iterator = c[0];
+ }
+ n.varDecl = n2;
+ } else {
+ if (n2.type === ARRAY_INIT || n2.type === OBJECT_INIT) {
+ n2.destructuredNames = checkDestructuring(t, x3, n2);
+ }
+ n.iterator = n2;
+ }
+ } else {
+ x3.inForLoopInit = false;
+ n.setup = n2;
+ t.mustMatch(SEMICOLON);
+ if (n.isEach)
+ throw t.newSyntaxError("Invalid for each..in loop");
+ n.condition = (t.peek(true) === SEMICOLON)
+ ? null
+ : Expression(t, x3);
+ t.mustMatch(SEMICOLON);
+ tt2 = t.peek(true);
+ n.update = (x.parenFreeMode
+ ? tt2 === LEFT_CURLY || definitions.isStatementStartCode[tt2]
+ : tt2 === RIGHT_PAREN)
+ ? null
+ : Expression(t, x3);
+ }
+ if (!x.parenFreeMode)
+ t.mustMatch(RIGHT_PAREN);
+ n.body = Statement(t, x2);
+ return n;
+
+ case WHILE:
+ n = new Node(t, { isLoop: true });
+ n.blockComments = comments;
+ n.condition = HeadExpression(t, x);
+ n.body = Statement(t, x.pushTarget(n).nest());
+ return n;
+
+ case DO:
+ n = new Node(t, { isLoop: true });
+ n.blockComments = comments;
+ n.body = Statement(t, x.pushTarget(n).nest());
+ t.mustMatch(WHILE);
+ n.condition = HeadExpression(t, x);
+ if (!x.ecmaStrictMode) {
+ // <script language="JavaScript"> (without version hints) may need
+ // automatic semicolon insertion without a newline after do-while.
+ // See http://bugzilla.mozilla.org/show_bug.cgi?id=238945.
+ t.match(SEMICOLON);
+ return n;
+ }
+ break;
+
+ case BREAK:
+ case CONTINUE:
+ n = new Node(t);
+ n.blockComments = comments;
+
+ // handle the |foo: break foo;| corner case
+ x2 = x.pushTarget(n);
+
+ if (t.peekOnSameLine() === IDENTIFIER) {
+ t.get();
+ n.label = t.token.value;
+ }
+
+ if (n.label) {
+ n.target = x2.labeledTargets.find(function(target) { return target.labels.has(n.label) });
+ } else if (tt === CONTINUE) {
+ n.target = x2.defaultLoopTarget;
+ } else {
+ n.target = x2.defaultTarget;
+ }
+
+ if (!n.target)
+ throw t.newSyntaxError("Invalid " + ((tt === BREAK) ? "break" : "continue"));
+ if (!n.target.isLoop && tt === CONTINUE)
+ throw t.newSyntaxError("Invalid continue");
+
+ break;
+
+ case TRY:
+ n = new Node(t, { catchClauses: [] });
+ n.blockComments = comments;
+ n.tryBlock = Block(t, x);
+ while (t.match(CATCH)) {
+ n2 = new Node(t);
+ p = MaybeLeftParen(t, x);
+ switch (t.get()) {
+ case LEFT_BRACKET:
+ case LEFT_CURLY:
+ // Destructured catch identifiers.
+ t.unget();
+ n2.varName = DestructuringExpression(t, x, true);
+ break;
+ case IDENTIFIER:
+ n2.varName = t.token.value;
+ break;
+ default:
+ throw t.newSyntaxError("missing identifier in catch");
+ break;
+ }
+ if (t.match(IF)) {
+ if (x.ecma3OnlyMode)
+ throw t.newSyntaxError("Illegal catch guard");
+ if (n.catchClauses.length && !n.catchClauses.top().guard)
+ throw t.newSyntaxError("Guarded catch after unguarded");
+ n2.guard = Expression(t, x);
+ }
+ MaybeRightParen(t, p);
+ n2.block = Block(t, x);
+ n.catchClauses.push(n2);
+ }
+ if (t.match(FINALLY))
+ n.finallyBlock = Block(t, x);
+ if (!n.catchClauses.length && !n.finallyBlock)
+ throw t.newSyntaxError("Invalid try statement");
+ return n;
+
+ case CATCH:
+ case FINALLY:
+ throw t.newSyntaxError(definitions.tokens[tt] + " without preceding try");
+
+ case THROW:
+ n = new Node(t);
+ n.blockComments = comments;
+ n.exception = Expression(t, x);
+ break;
+
+ case RETURN:
+ n = ReturnOrYield(t, x);
+ break;
+
+ case WITH:
+ n = new Node(t);
+ n.blockComments = comments;
+ n.object = HeadExpression(t, x);
+ n.body = Statement(t, x.pushTarget(n).nest());
+ return n;
+
+ case VAR:
+ case CONST:
+ n = Variables(t, x);
+ break;
+
+ case LET:
+ if (t.peek() === LEFT_PAREN)
+ n = LetBlock(t, x, true);
+ else
+ n = Variables(t, x);
+ break;
+
+ case DEBUGGER:
+ n = new Node(t);
+ n.blockComments = comments;
+ break;
+
+ case NEWLINE:
+ case SEMICOLON:
+ n = new Node(t, { type: SEMICOLON });
+ n.blockComments = comments;
+ n.expression = null;
+ return n;
+
+ default:
+ if (tt === IDENTIFIER) {
+ tt = t.peek();
+ // Labeled statement.
+ if (tt === COLON) {
+ label = t.token.value;
+ if (x.allLabels.has(label))
+ throw t.newSyntaxError("Duplicate label");
+ t.get();
+ n = new Node(t, { type: LABEL, label: label });
+ n.blockComments = comments;
+ n.statement = Statement(t, x.pushLabel(label).nest());
+ n.target = (n.statement.type === LABEL) ? n.statement.target : n.statement;
+ return n;
+ }
+ }
+
+ // Expression statement.
+ // We unget the current token to parse the expression as a whole.
+ n = new Node(t, { type: SEMICOLON });
+ t.unget();
+ n.blockComments = comments;
+ n.expression = Expression(t, x);
+ n.end = n.expression.end;
+ break;
+ }
+
+ n.blockComments = comments;
+ MagicalSemicolon(t);
+ return n;
+ }
+
+ /*
+ * MagicalSemicolon :: (tokenizer) -> void
+ */
+ function MagicalSemicolon(t) {
+ var tt;
+ if (t.lineno === t.token.lineno) {
+ tt = t.peekOnSameLine();
+ if (tt !== END && tt !== NEWLINE && tt !== SEMICOLON && tt !== RIGHT_CURLY)
+ throw t.newSyntaxError("missing ; before statement");
+ }
+ t.match(SEMICOLON);
+ }
+
+ /*
+ * ReturnOrYield :: (tokenizer, compiler context) -> (RETURN | YIELD) node
+ */
+ function ReturnOrYield(t, x) {
+ var n, b, tt = t.token.type, tt2;
+
+ var parentScript = x.parentScript;
+
+ if (tt === RETURN) {
+ if (!x.inFunction) {
+ // pass
+ //throw t.newSyntaxError("Return not in function");
+ }
+
+ } else /* if (tt === YIELD) */ {
+ if (!x.inFunction)
+ throw t.newSyntaxError("Yield not in function");
+ parentScript.isGenerator = true;
+ }
+ n = new Node(t, { value: undefined });
+
+ tt2 = (tt === RETURN) ? t.peekOnSameLine(true) : t.peek(true);
+ if (tt2 !== END && tt2 !== NEWLINE &&
+ tt2 !== SEMICOLON && tt2 !== RIGHT_CURLY
+ && (tt !== YIELD ||
+ (tt2 !== tt && tt2 !== RIGHT_BRACKET && tt2 !== RIGHT_PAREN &&
+ tt2 !== COLON && tt2 !== COMMA))) {
+ if (tt === RETURN) {
+ n.value = Expression(t, x);
+ parentScript.hasReturnWithValue = true;
+ } else {
+ n.value = AssignExpression(t, x);
+ }
+ } else if (tt === RETURN) {
+ parentScript.hasEmptyReturn = true;
+ }
+
+ // Disallow return v; in generator.
+ if (parentScript.hasReturnWithValue && parentScript.isGenerator)
+ throw t.newSyntaxError("Generator returns a value");
+
+ return n;
+ }
+
+ /*
+ * ModuleExpression :: (tokenizer, compiler context) -> (STRING | IDENTIFIER | DOT) node
+ */
+ function ModuleExpression(t, x) {
+ return t.match(STRING) ? new Node(t) : QualifiedPath(t, x);
+ }
+
+ /*
+ * ImportPathList :: (tokenizer, compiler context) -> Array[DOT node]
+ */
+ function ImportPathList(t, x) {
+ var a = [];
+ do {
+ a.push(ImportPath(t, x));
+ } while (t.match(COMMA));
+ return a;
+ }
+
+ /*
+ * ImportPath :: (tokenizer, compiler context) -> DOT node
+ */
+ function ImportPath(t, x) {
+ var n = QualifiedPath(t, x);
+ if (!t.match(DOT)) {
+ if (n.type === IDENTIFIER)
+ throw t.newSyntaxError("cannot import local variable");
+ return n;
+ }
+
+ var n2 = new Node(t);
+ n2.push(n);
+ n2.push(ImportSpecifierSet(t, x));
+ return n2;
+ }
+
+ /*
+ * ExplicitSpecifierSet :: (tokenizer, compiler context, (tokenizer, compiler context) -> node)
+ * -> OBJECT_INIT node
+ */
+ function ExplicitSpecifierSet(t, x, SpecifierRHS) {
+ var n, n2, id, tt;
+
+ n = new Node(t, { type: OBJECT_INIT });
+ t.mustMatch(LEFT_CURLY);
+
+ if (!t.match(RIGHT_CURLY)) {
+ do {
+ id = Identifier(t, x);
+ if (t.match(COLON)) {
+ n2 = new Node(t, { type: PROPERTY_INIT });
+ n2.push(id);
+ n2.push(SpecifierRHS(t, x));
+ n.push(n2);
+ } else {
+ n.push(id);
+ }
+ } while (!t.match(RIGHT_CURLY) && t.mustMatch(COMMA));
+ }
+
+ return n;
+ }
+
+ /*
+ * ImportSpecifierSet :: (tokenizer, compiler context) -> (IDENTIFIER | OBJECT_INIT) node
+ */
+ function ImportSpecifierSet(t, x) {
+ return t.match(MUL)
+ ? new Node(t, { type: IDENTIFIER, name: "*" })
+ : ExplicitSpecifierSet(t, x, Identifier);
+ }
+
+ /*
+ * Identifier :: (tokenizer, compiler context) -> IDENTIFIER node
+ */
+ function Identifier(t, x) {
+ t.mustMatch(IDENTIFIER);
+ return new Node(t, { type: IDENTIFIER });
+ }
+
+ /*
+ * IdentifierName :: (tokenizer) -> IDENTIFIER node
+ */
+ function IdentifierName(t) {
+ if (t.match(IDENTIFIER))
+ return new Node(t, { type: IDENTIFIER });
+ t.get();
+ if (t.token.value in definitions.keywords)
+ return new Node(t, { type: IDENTIFIER });
+ throw t.newSyntaxError("missing IdentifierName");
+ }
+
+ /*
+ * QualifiedPath :: (tokenizer, compiler context) -> (IDENTIFIER | DOT) node
+ */
+ function QualifiedPath(t, x) {
+ var n, n2;
+
+ n = Identifier(t, x);
+
+ while (t.match(DOT)) {
+ if (t.peek() !== IDENTIFIER) {
+ // Unget the '.' token, which isn't part of the QualifiedPath.
+ t.unget();
+ break;
+ }
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(Identifier(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ /*
+ * ExportPath :: (tokenizer, compiler context) -> (IDENTIFIER | DOT | OBJECT_INIT) node
+ */
+ function ExportPath(t, x) {
+ if (t.peek() === LEFT_CURLY)
+ return ExplicitSpecifierSet(t, x, QualifiedPath);
+ return QualifiedPath(t, x);
+ }
+
+ /*
+ * ExportPathList :: (tokenizer, compiler context)
+ * -> Array[(IDENTIFIER | DOT | OBJECT_INIT) node]
+ */
+ function ExportPathList(t, x) {
+ var a = [];
+ do {
+ a.push(ExportPath(t, x));
+ } while (t.match(COMMA));
+ return a;
+ }
+
+ /*
+ * FunctionDefinition :: (tokenizer, compiler context, boolean,
+ * DECLARED_FORM or EXPRESSED_FORM or STATEMENT_FORM,
+ * [string] or null or undefined)
+ * -> node
+ */
+ function FunctionDefinition(t, x, requireName, functionForm, comments) {
+ var tt;
+ var f = new Node(t, { params: [], paramComments: [] });
+ if (typeof comment === "undefined")
+ comment = null;
+ f.blockComments = comments;
+ if (f.type !== FUNCTION)
+ f.type = (f.value === "get") ? GETTER : SETTER;
+ if (t.match(IDENTIFIER))
+ f.name = t.token.value;
+ else if (requireName)
+ throw t.newSyntaxError("missing function identifier");
+
+ var inModule = x ? x.inModule : false;
+ var x2 = new StaticContext(null, null, inModule, true);
+
+ t.mustMatch(LEFT_PAREN);
+ if (!t.match(RIGHT_PAREN)) {
+ do {
+ tt = t.get();
+ f.paramComments.push(t.lastBlockComment());
+ switch (tt) {
+ case LEFT_BRACKET:
+ case LEFT_CURLY:
+ // Destructured formal parameters.
+ t.unget();
+ f.params.push(DestructuringExpression(t, x2));
+ break;
+ case IDENTIFIER:
+ f.params.push(t.token.value);
+ break;
+ default:
+ throw t.newSyntaxError("missing formal parameter");
+ break;
+ }
+ } while (t.match(COMMA));
+ t.mustMatch(RIGHT_PAREN);
+ }
+
+ // Do we have an expression closure or a normal body?
+ tt = t.get();
+ if (tt !== LEFT_CURLY)
+ t.unget();
+
+ if (tt !== LEFT_CURLY) {
+ f.body = AssignExpression(t, x2);
+ if (f.body.isGenerator)
+ throw t.newSyntaxError("Generator returns a value");
+ } else {
+ f.body = Script(t, inModule, true);
+ }
+
+ if (tt === LEFT_CURLY)
+ t.mustMatch(RIGHT_CURLY);
+
+ f.end = t.token.end;
+ f.functionForm = functionForm;
+ if (functionForm === DECLARED_FORM)
+ x.parentScript.funDecls.push(f);
+ return f;
+ }
+
+ /*
+ * ModuleVariables :: (tokenizer, compiler context, MODULE node) -> void
+ *
+ * Parses a comma-separated list of module declarations (and maybe
+ * initializations).
+ */
+ function ModuleVariables(t, x, n) {
+ var n1, n2;
+ do {
+ n1 = Identifier(t, x);
+ if (t.match(ASSIGN)) {
+ n2 = ModuleExpression(t, x);
+ n1.initializer = n2;
+ if (n2.type === STRING)
+ x.parentScript.modLoads.set(n1.value, n2.value);
+ else
+ x.parentScript.modAssns.set(n1.value, n1);
+ }
+ n.push(n1);
+ } while (t.match(COMMA));
+ }
+
+ /*
+ * Variables :: (tokenizer, compiler context) -> node
+ *
+ * Parses a comma-separated list of var declarations (and maybe
+ * initializations).
+ */
+ function Variables(t, x, letBlock) {
+ var n, n2, ss, i, s, tt;
+
+ tt = t.token.type;
+ switch (tt) {
+ case VAR:
+ case CONST:
+ s = x.parentScript;
+ break;
+ case LET:
+ s = x.parentBlock;
+ break;
+ case LEFT_PAREN:
+ tt = LET;
+ s = letBlock;
+ break;
+ }
+
+ n = new Node(t, { type: tt, destructurings: [] });
+
+ do {
+ tt = t.get();
+ if (tt === LEFT_BRACKET || tt === LEFT_CURLY) {
+ // Need to unget to parse the full destructured expression.
+ t.unget();
+
+ var dexp = DestructuringExpression(t, x, true);
+
+ n2 = new Node(t, { type: IDENTIFIER,
+ name: dexp,
+ readOnly: n.type === CONST });
+ n.push(n2);
+ pushDestructuringVarDecls(n2.name.destructuredNames, s);
+ n.destructurings.push({ exp: dexp, decl: n2 });
+
+ if (x.inForLoopInit && t.peek() === IN) {
+ continue;
+ }
+
+ t.mustMatch(ASSIGN);
+ if (t.token.assignOp)
+ throw t.newSyntaxError("Invalid variable initialization");
+
+ n2.blockComment = t.lastBlockComment();
+ n2.initializer = AssignExpression(t, x);
+
+ continue;
+ }
+
+ if (tt !== IDENTIFIER)
+ throw t.newSyntaxError("missing variable name");
+
+ n2 = new Node(t, { type: IDENTIFIER,
+ name: t.token.value,
+ readOnly: n.type === CONST });
+ n.push(n2);
+ s.varDecls.push(n2);
+
+ if (t.match(ASSIGN)) {
+ var comment = t.lastBlockComment();
+ if (t.token.assignOp)
+ throw t.newSyntaxError("Invalid variable initialization");
+
+ n2.initializer = AssignExpression(t, x);
+ } else {
+ var comment = t.lastBlockComment();
+ }
+ n2.blockComment = comment;
+ } while (t.match(COMMA));
+
+ return n;
+ }
+
+ /*
+ * LetBlock :: (tokenizer, compiler context, boolean) -> node
+ *
+ * Does not handle let inside of for loop init.
+ */
+ function LetBlock(t, x, isStatement) {
+ var n, n2;
+
+ // t.token.type must be LET
+ n = new Node(t, { type: LET_BLOCK, varDecls: [] });
+ t.mustMatch(LEFT_PAREN);
+ n.variables = Variables(t, x, n);
+ t.mustMatch(RIGHT_PAREN);
+
+ if (isStatement && t.peek() !== LEFT_CURLY) {
+ /*
+ * If this is really an expression in let statement guise, then we
+ * need to wrap the LET_BLOCK node in a SEMICOLON node so that we pop
+ * the return value of the expression.
+ */
+ n2 = new Node(t, { type: SEMICOLON,
+ expression: n });
+ isStatement = false;
+ }
+
+ if (isStatement)
+ n.block = Block(t, x);
+ else
+ n.expression = AssignExpression(t, x);
+
+ return n;
+ }
+
+ function checkDestructuring(t, x, n, simpleNamesOnly) {
+ if (n.type === ARRAY_COMP)
+ throw t.newSyntaxError("Invalid array comprehension left-hand side");
+ if (n.type !== ARRAY_INIT && n.type !== OBJECT_INIT)
+ return undefined;
+
+ var lhss = {};
+ var nn, n2, idx, sub, cc, c = n.children;
+ for (var i = 0, j = c.length; i < j; i++) {
+ if (!(nn = c[i]))
+ continue;
+ if (nn.type === PROPERTY_INIT) {
+ cc = nn.children;
+ sub = cc[1];
+ idx = cc[0].value;
+ } else if (n.type === OBJECT_INIT) {
+ // Do we have destructuring shorthand {foo, bar}?
+ sub = nn;
+ idx = nn.value;
+ } else {
+ sub = nn;
+ idx = i;
+ }
+
+ if (sub.type === ARRAY_INIT || sub.type === OBJECT_INIT) {
+ lhss[idx] = checkDestructuring(t, x, sub, simpleNamesOnly);
+ } else {
+ if (simpleNamesOnly && sub.type !== IDENTIFIER) {
+ // In declarations, lhs must be simple names
+ throw t.newSyntaxError("missing name in pattern");
+ }
+
+ lhss[idx] = sub;
+ }
+ }
+
+ return lhss;
+ }
+
+ function DestructuringExpression(t, x, simpleNamesOnly) {
+ var n = PrimaryExpression(t, x);
+ // Keep the list of lefthand sides for varDecls
+ n.destructuredNames = checkDestructuring(t, x, n, simpleNamesOnly);
+ return n;
+ }
+
+ function GeneratorExpression(t, x, e) {
+ return new Node(t, { type: GENERATOR,
+ expression: e,
+ tail: ComprehensionTail(t, x) });
+ }
+
+ function ComprehensionTail(t, x) {
+ var body, n, n2, n3, p;
+
+ // t.token.type must be FOR
+ body = new Node(t, { type: COMP_TAIL });
+
+ do {
+ // Comprehension tails are always for..in loops.
+ n = new Node(t, { type: FOR_IN, isLoop: true });
+ if (t.match(IDENTIFIER)) {
+ // But sometimes they're for each..in.
+ if (t.token.value === "each")
+ n.isEach = true;
+ else
+ t.unget();
+ }
+ p = MaybeLeftParen(t, x);
+ switch(t.get()) {
+ case LEFT_BRACKET:
+ case LEFT_CURLY:
+ t.unget();
+ // Destructured left side of for in comprehension tails.
+ n.iterator = DestructuringExpression(t, x);
+ break;
+
+ case IDENTIFIER:
+ n.iterator = n3 = new Node(t, { type: IDENTIFIER });
+ n3.name = n3.value;
+ n.varDecl = n2 = new Node(t, { type: VAR });
+ n2.push(n3);
+ x.parentScript.varDecls.push(n3);
+ // Don't add to varDecls since the semantics of comprehensions is
+ // such that the variables are in their own function when
+ // desugared.
+ break;
+
+ default:
+ throw t.newSyntaxError("missing identifier");
+ }
+ t.mustMatch(IN);
+ n.object = Expression(t, x);
+ MaybeRightParen(t, p);
+ body.push(n);
+ } while (t.match(FOR));
+
+ // Optional guard.
+ if (t.match(IF))
+ body.guard = HeadExpression(t, x);
+
+ return body;
+ }
+
+ function HeadExpression(t, x) {
+ var p = MaybeLeftParen(t, x);
+ var n = ParenExpression(t, x);
+ MaybeRightParen(t, p);
+ if (p === END && !n.parenthesized) {
+ var tt = t.peek();
+ if (tt !== LEFT_CURLY && !definitions.isStatementStartCode[tt])
+ throw t.newSyntaxError("Unparenthesized head followed by unbraced body");
+ }
+ return n;
+ }
+
+ function ParenExpression(t, x) {
+ // Always accept the 'in' operator in a parenthesized expression,
+ // where it's unambiguous, even if we might be parsing the init of a
+ // for statement.
+ var n = Expression(t, x.update({ inForLoopInit: x.inForLoopInit &&
+ (t.token.type === LEFT_PAREN) }));
+
+ if (t.match(FOR)) {
+ if (n.type === YIELD && !n.parenthesized)
+ throw t.newSyntaxError("Yield expression must be parenthesized");
+ if (n.type === COMMA && !n.parenthesized)
+ throw t.newSyntaxError("Generator expression must be parenthesized");
+ n = GeneratorExpression(t, x, n);
+ }
+
+ return n;
+ }
+
+ /*
+ * Expression :: (tokenizer, compiler context) -> node
+ *
+ * Top-down expression parser matched against SpiderMonkey.
+ */
+ function Expression(t, x) {
+ var n, n2;
+
+ n = AssignExpression(t, x);
+ if (t.match(COMMA)) {
+ n2 = new Node(t, { type: COMMA });
+ n2.push(n);
+ n = n2;
+ do {
+ n2 = n.children[n.children.length-1];
+ if (n2.type === YIELD && !n2.parenthesized)
+ throw t.newSyntaxError("Yield expression must be parenthesized");
+ n.push(AssignExpression(t, x));
+ } while (t.match(COMMA));
+ }
+
+ return n;
+ }
+
+ function AssignExpression(t, x) {
+ var n, lhs;
+
+ // Have to treat yield like an operand because it could be the leftmost
+ // operand of the expression.
+ if (t.match(YIELD, true))
+ return ReturnOrYield(t, x);
+
+ n = new Node(t, { type: ASSIGN });
+ lhs = ConditionalExpression(t, x);
+
+ if (!t.match(ASSIGN)) {
+ return lhs;
+ }
+
+ n.blockComment = t.lastBlockComment();
+
+ switch (lhs.type) {
+ case OBJECT_INIT:
+ case ARRAY_INIT:
+ lhs.destructuredNames = checkDestructuring(t, x, lhs);
+ // FALL THROUGH
+ case IDENTIFIER: case DOT: case INDEX: case CALL:
+ break;
+ default:
+ throw t.newSyntaxError("Bad left-hand side of assignment");
+ break;
+ }
+
+ n.assignOp = lhs.assignOp = t.token.assignOp;
+ n.push(lhs);
+ n.push(AssignExpression(t, x));
+
+ return n;
+ }
+
+ function ConditionalExpression(t, x) {
+ var n, n2;
+
+ n = OrExpression(t, x);
+ if (t.match(HOOK)) {
+ n2 = n;
+ n = new Node(t, { type: HOOK });
+ n.push(n2);
+ /*
+ * Always accept the 'in' operator in the middle clause of a ternary,
+ * where it's unambiguous, even if we might be parsing the init of a
+ * for statement.
+ */
+ n.push(AssignExpression(t, x.update({ inForLoopInit: false })));
+ if (!t.match(COLON))
+ throw t.newSyntaxError("missing : after ?");
+ n.push(AssignExpression(t, x));
+ }
+
+ return n;
+ }
+
+ function OrExpression(t, x) {
+ var n, n2;
+
+ n = AndExpression(t, x);
+ while (t.match(OR)) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(AndExpression(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function AndExpression(t, x) {
+ var n, n2;
+
+ n = BitwiseOrExpression(t, x);
+ while (t.match(AND)) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(BitwiseOrExpression(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function BitwiseOrExpression(t, x) {
+ var n, n2;
+
+ n = BitwiseXorExpression(t, x);
+ while (t.match(BITWISE_OR)) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(BitwiseXorExpression(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function BitwiseXorExpression(t, x) {
+ var n, n2;
+
+ n = BitwiseAndExpression(t, x);
+ while (t.match(BITWISE_XOR)) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(BitwiseAndExpression(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function BitwiseAndExpression(t, x) {
+ var n, n2;
+
+ n = EqualityExpression(t, x);
+ while (t.match(BITWISE_AND)) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(EqualityExpression(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function EqualityExpression(t, x) {
+ var n, n2;
+
+ n = RelationalExpression(t, x);
+ while (t.match(EQ) || t.match(NE) ||
+ t.match(STRICT_EQ) || t.match(STRICT_NE)) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(RelationalExpression(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function RelationalExpression(t, x) {
+ var n, n2;
+
+ /*
+ * Uses of the in operator in shiftExprs are always unambiguous,
+ * so unset the flag that prohibits recognizing it.
+ */
+ var x2 = x.update({ inForLoopInit: false });
+ n = ShiftExpression(t, x2);
+ while ((t.match(LT) || t.match(LE) || t.match(GE) || t.match(GT) ||
+ (!x.inForLoopInit && t.match(IN)) ||
+ t.match(INSTANCEOF))) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(ShiftExpression(t, x2));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function ShiftExpression(t, x) {
+ var n, n2;
+
+ n = AddExpression(t, x);
+ while (t.match(LSH) || t.match(RSH) || t.match(URSH)) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(AddExpression(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function AddExpression(t, x) {
+ var n, n2;
+
+ n = MultiplyExpression(t, x);
+ while (t.match(PLUS) || t.match(MINUS)) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(MultiplyExpression(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function MultiplyExpression(t, x) {
+ var n, n2;
+
+ n = UnaryExpression(t, x);
+ while (t.match(MUL) || t.match(DIV) || t.match(MOD)) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(UnaryExpression(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function UnaryExpression(t, x) {
+ var n, n2, tt;
+
+ switch (tt = t.get(true)) {
+ case DELETE: case VOID: case TYPEOF:
+ case NOT: case BITWISE_NOT: case PLUS: case MINUS:
+ if (tt === PLUS)
+ n = new Node(t, { type: UNARY_PLUS });
+ else if (tt === MINUS)
+ n = new Node(t, { type: UNARY_MINUS });
+ else
+ n = new Node(t);
+ n.push(UnaryExpression(t, x));
+ break;
+
+ case INCREMENT:
+ case DECREMENT:
+ // Prefix increment/decrement.
+ n = new Node(t);
+ n.push(MemberExpression(t, x, true));
+ break;
+
+ default:
+ t.unget();
+ n = MemberExpression(t, x, true);
+
+ // Don't look across a newline boundary for a postfix {in,de}crement.
+ if (t.tokens[(t.tokenIndex + t.lookahead - 1) & 3].lineno ===
+ t.lineno) {
+ if (t.match(INCREMENT) || t.match(DECREMENT)) {
+ n2 = new Node(t, { postfix: true });
+ n2.push(n);
+ n = n2;
+ }
+ }
+ break;
+ }
+
+ return n;
+ }
+
+ function MemberExpression(t, x, allowCallSyntax) {
+ var n, n2, name, tt;
+
+ if (t.match(NEW)) {
+ n = new Node(t);
+ n.push(MemberExpression(t, x, false));
+ if (t.match(LEFT_PAREN)) {
+ n.type = NEW_WITH_ARGS;
+ n.push(ArgumentList(t, x));
+ }
+ } else {
+ n = PrimaryExpression(t, x);
+ }
+
+ while ((tt = t.get()) !== END) {
+ switch (tt) {
+ case DOT:
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(IdentifierName(t));
+ break;
+
+ case LEFT_BRACKET:
+ n2 = new Node(t, { type: INDEX });
+ n2.push(n);
+ n2.push(Expression(t, x));
+ t.mustMatch(RIGHT_BRACKET);
+ break;
+
+ case LEFT_PAREN:
+ if (allowCallSyntax) {
+ n2 = new Node(t, { type: CALL });
+ n2.push(n);
+ n2.push(ArgumentList(t, x));
+ break;
+ }
+
+ // FALL THROUGH
+ default:
+ t.unget();
+ return n;
+ }
+
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function ArgumentList(t, x) {
+ var n, n2;
+
+ n = new Node(t, { type: LIST });
+ if (t.match(RIGHT_PAREN, true))
+ return n;
+ do {
+ n2 = AssignExpression(t, x);
+ if (n2.type === YIELD && !n2.parenthesized && t.peek() === COMMA)
+ throw t.newSyntaxError("Yield expression must be parenthesized");
+ if (t.match(FOR)) {
+ n2 = GeneratorExpression(t, x, n2);
+ if (n.children.length > 1 || t.peek(true) === COMMA)
+ throw t.newSyntaxError("Generator expression must be parenthesized");
+ }
+ n.push(n2);
+ } while (t.match(COMMA));
+ t.mustMatch(RIGHT_PAREN);
+
+ return n;
+ }
+
+ function PrimaryExpression(t, x) {
+ var n, n2, tt = t.get(true);
+
+ switch (tt) {
+ case FUNCTION:
+ n = FunctionDefinition(t, x, false, EXPRESSED_FORM);
+ break;
+
+ case LEFT_BRACKET:
+ n = new Node(t, { type: ARRAY_INIT });
+ while ((tt = t.peek(true)) !== RIGHT_BRACKET) {
+ if (tt === COMMA) {
+ t.get();
+ n.push(null);
+ continue;
+ }
+ n.push(AssignExpression(t, x));
+ if (tt !== COMMA && !t.match(COMMA))
+ break;
+ }
+
+ // If we matched exactly one element and got a FOR, we have an
+ // array comprehension.
+ if (n.children.length === 1 && t.match(FOR)) {
+ n2 = new Node(t, { type: ARRAY_COMP,
+ expression: n.children[0],
+ tail: ComprehensionTail(t, x) });
+ n = n2;
+ }
+ t.mustMatch(RIGHT_BRACKET);
+ break;
+
+ case LEFT_CURLY:
+ var id, fd;
+ n = new Node(t, { type: OBJECT_INIT });
+
+ object_init:
+ if (!t.match(RIGHT_CURLY)) {
+ do {
+ tt = t.get();
+ if ((t.token.value === "get" || t.token.value === "set") &&
+ t.peek() === IDENTIFIER) {
+ if (x.ecma3OnlyMode)
+ throw t.newSyntaxError("Illegal property accessor");
+ n.push(FunctionDefinition(t, x, true, EXPRESSED_FORM));
+ } else {
+ var comments = t.blockComments;
+ switch (tt) {
+ case IDENTIFIER: case NUMBER: case STRING:
+ id = new Node(t, { type: IDENTIFIER });
+ break;
+ case RIGHT_CURLY:
+ if (x.ecma3OnlyMode)
+ throw t.newSyntaxError("Illegal trailing ,");
+ break object_init;
+ default:
+ if (t.token.value in definitions.keywords) {
+ id = new Node(t, { type: IDENTIFIER });
+ break;
+ }
+ throw t.newSyntaxError("Invalid property name");
+ }
+ if (t.match(COLON)) {
+ n2 = new Node(t, { type: PROPERTY_INIT });
+ n2.push(id);
+ n2.push(AssignExpression(t, x));
+ n2.blockComments = comments;
+ n.push(n2);
+ } else {
+ // Support, e.g., |var {x, y} = o| as destructuring shorthand
+ // for |var {x: x, y: y} = o|, per proposed JS2/ES4 for JS1.8.
+ if (t.peek() !== COMMA && t.peek() !== RIGHT_CURLY)
+ throw t.newSyntaxError("missing : after property");
+ n.push(id);
+ }
+ }
+ } while (t.match(COMMA));
+ t.mustMatch(RIGHT_CURLY);
+ }
+ break;
+
+ case LEFT_PAREN:
+ n = ParenExpression(t, x);
+ t.mustMatch(RIGHT_PAREN);
+ n.parenthesized = true;
+ break;
+
+ case LET:
+ n = LetBlock(t, x, false);
+ break;
+
+ case NULL: case THIS: case TRUE: case FALSE:
+ case IDENTIFIER: case NUMBER: case STRING: case REGEXP:
+ n = new Node(t);
+ break;
+
+ default:
+ n = new Node(t);
+ // don't throw an error by default. Just make it a node and forget it :-}
+ //throw t.newSyntaxError("missing operand");
+ break;
+ }
+
+ return n;
+ }
+
+ /*
+ * parse :: (source, filename, line number) -> node
+ */
+ function parse(s, f, l) {
+ var t = new lexer.Tokenizer(s, f, l);
+ var n = Script(t, false, false);
+ if (!t.done)
+ throw t.newSyntaxError("Syntax error");
+
+ return n;
+ }
+
+ /*
+ * parseStdin :: (source, {line number}, string, (string) -> boolean) -> program node
+ */
+ function parseStdin(s, ln, prefix, isCommand) {
+ // the special .begin command is only recognized at the beginning
+ if (s.match(/^[\s]*\.begin[\s]*$/)) {
+ ++ln.value;
+ return parseMultiline(ln, prefix);
+ }
+
+ // commands at the beginning are treated as the entire input
+ if (isCommand(s.trim()))
+ s = "";
+
+ for (;;) {
+ try {
+ var t = new lexer.Tokenizer(s, "stdin", ln.value);
+ var n = Script(t, false, false);
+ ln.value = t.lineno;
+ return n;
+ } catch (e) {
+ if (!t.unexpectedEOF)
+ throw e;
+
+ // commands in the middle are not treated as part of the input
+ var more;
+ do {
+ if (prefix)
+ putstr(prefix);
+ more = readline();
+ if (!more)
+ throw e;
+ } while (isCommand(more.trim()));
+
+ s += "\n" + more;
+ }
+ }
+ }
+
+ /*
+ * parseMultiline :: ({line number}, string | null) -> program node
+ */
+ function parseMultiline(ln, prefix) {
+ var s = "";
+ for (;;) {
+ if (prefix)
+ putstr(prefix);
+ var more = readline();
+ if (more === null)
+ return null;
+ // the only command recognized in multiline mode is .end
+ if (more.match(/^[\s]*\.end[\s]*$/))
+ break;
+ s += "\n" + more;
+ }
+ var t = new lexer.Tokenizer(s, "stdin", ln.value);
+ var n = Script(t, false, false);
+ ln.value = t.lineno;
+ return n;
+ }
+
+ return {
+ parse: parse,
+ parseStdin: parseStdin,
+ Node: Node,
+ SyntheticNode: SyntheticNode,
+ DECLARED_FORM: DECLARED_FORM,
+ EXPRESSED_FORM: EXPRESSED_FORM,
+ STATEMENT_FORM: STATEMENT_FORM,
+ Tokenizer: lexer.Tokenizer,
+ FunctionDefinition: FunctionDefinition,
+ Module: Module,
+ Export: Export
+ };
+
+}());
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/narcissus_parse.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/narcissus_parse.js
new file mode 100644
index 0000000..d5565e8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/narcissus_parse.js
@@ -0,0 +1,58 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * narcissus_parse.js
+ *
+ * A chrome worker that we keep working for the duration
+ * of the session.
+ *
+ * It takes about 10-12M in memory when not actively running, and it
+ * is much faster than reloading the Narcissus scripts for every
+ * script.
+ *
+ */
+
+importScripts('./jsdefs.js', './jslex.js', './jsparse.js');
+
+self.onmessage = function (event) {
+
+ if (event.data === 'stop') {
+ // destroy chrome worker.
+ self.close();
+ return;
+ }
+
+ var obj = JSON.parse(event.data),
+ tree;
+
+// try {
+ tree = new Narcissus.parser.parse(obj.code);
+ self.postMessage({'tree': tree, 'hash': obj.hash});
+/* } catch (x) {
+ // error with parsing. Delete all.
+ self.postMessage({'hash': obj.hash});
+ }
+ */
+ tree = null;
+ obj = null;
+
+};
+
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/contact_finder.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/contact_finder.js
new file mode 100644
index 0000000..cbdfb39
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/contact_finder.js
@@ -0,0 +1,465 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var contactFinder = {
+
+ // initial full list of links
+ // on a page.
+ pageLinks:null,
+
+ // arrays of links.
+ certainLinks: null,
+ probableLinks: null,
+ uncertainLinks: null,
+
+ // if not page worker,
+ // then allow to trigger a page worker.
+ isPageWorker: false,
+
+ // keep track of links already visited.
+ visitedLinks: {},
+
+ // keep track of the hostname of the original page.
+ originalHostname: null,
+
+ init: function (isPageWorker) {
+
+ if (isPageWorker) {
+
+ this.isPageWorker = true;
+ console.debug('visiting', document.location.href);
+ }
+
+ this.convertStringToRegexp();
+
+ },
+
+ /**
+ * searchForContactLink Main interface method to call from outside
+ * the object.
+ */
+ searchForContactLink: function (originalUrl) {
+
+ // find hostname of original page.
+ this.originalHostname = this.getHostname(originalUrl);
+
+ // initialize arrays of links to keep.
+ this.certainLinks = [];
+ this.probableLinks = [];
+ this.uncertainLinks = [];
+
+ // select all a tags.
+ this.pageLinks = $('a').get();
+
+ this.searchForUSPhoneNumber($('body').text());
+
+ // run through list of links.
+ this.processLinks();
+ },
+
+ /**
+ * loopThroughLanguages
+ * Select strings for all languages.
+ */
+ loopThroughLanguages: function (callback) {
+ var le;
+
+ for (var language in contactStr) {
+ for (var degree in contactStr[language]) {
+ le = contactStr[language][degree].length;
+ callback(degree, contactStr[language][degree], le);
+ }
+ }
+
+ },
+
+ /**
+ * convertStringToRegexp
+ *
+ */
+ convertStringToRegexp: function () {
+
+ var regexpList, i, le;
+
+ this.loopThroughLanguages(function (degreeName, arr, le) {
+
+ for (i = 0; i < le; i++) {
+ arr[i] = new RegExp(arr[i], 'i');
+ }
+
+ });
+
+ },
+
+ /**
+ * processLinks
+ *
+ * Run through the list of links in a page
+ * and call the method that checks the regexs
+ * for each of them.
+ *
+ */
+ processLinks: function () {
+
+ var start = Date.now();
+ var currentLink;
+
+ while (this.pageLinks.length) {
+
+ currentLink = this.pageLinks.pop();
+
+ if (currentLink !== undefined) {
+
+ this.matchContact(currentLink);
+
+ }
+
+ var end = Date.now();
+
+ if (this.pageLinks.length) {
+
+ if ((end - start) > 8) {
+
+ setTimeout(this.processLinks.bind(this), 100);
+ return;
+
+ }
+
+ }
+
+ else if (this.isPageWorker) {
+
+ self.postMessage({event: 'destroy'});
+ return;
+
+ }
+
+
+ }
+
+
+
+
+ },
+
+ /**
+ * searchForUSPhoneNumber
+ *
+ */
+ searchForUSPhoneNumber: function (str) {
+ var phoneMatch, phone;
+ var regClutter = /[\(\)\-\. ]+/gm;
+
+ while ((phoneMatch = usaPhoneNumber.exec(str)) !== null) {
+
+ phone = $.trim(phoneMatch).replace(regClutter, '-').replace(/^\-/, '');
+ phone = phone.replace(/[^0-9]$/, '');
+
+ self.postMessage(
+ { event: linkTypes.PHONE_NUMBER_FOUND,
+ contact: {
+ 'label': phone,
+ 'link': 'javascript:void("' + phone + '")' }
+ }
+ );
+ }
+ },
+
+ /**
+ * searchForSocialMedia
+ *
+ * Match a Twitter or identi.ca url.
+ *
+ */
+ searchForSocialMedia: function (link) {
+
+ var elem = $(link),
+ eventType;
+
+ var text = this.notEmptyOrUri(link);
+
+ if (reTwitter.test(elem.attr('href'))) {
+ eventType = linkTypes.TWITTER_LINK_FOUND;
+ }
+
+ else if (reIdentiCa.test(elem.attr('href'))) {
+ eventType = linkTypes.IDENTICA_LINK_FOUND;
+ }
+
+ if (eventType) {
+ self.postMessage(
+ { event: eventType,
+ contact: {
+ 'label': text,
+ 'link': elem.attr('href')}
+ }
+ );
+ return true;
+ }
+
+ return false;
+ },
+
+ /**
+ * notEmptyOrUri
+ *
+ * If link has text, use it, if not,
+ * then return uri.
+ *
+ */
+ notEmptyOrUri: function (link) {
+
+ var elem = $(link);
+
+ if (/([^\s]*)]/.test(elem.text())) {
+ // contains something else than just space.
+ // It is valid.
+ return elem.text();
+
+ } else {
+
+ return link.href;
+
+ }
+
+ },
+
+ /**
+ * searchForContactEmail
+ *
+ * Sends a particular message if a matching email
+ * is found.
+ *
+ */
+ searchForContactEmail: function (link) {
+
+ var elem = $(link),
+ eventType;
+
+ if (reEmail.test(elem.attr('href'))) {
+ console.debug('found an email address', elem.attr('href'));
+ if (this.isSameHostname(elem.attr('href'))) {
+ // this is a good email with same hostname, priceless!
+ eventType = linkTypes.CERTAIN_EMAIL_ADDRESS_FOUND;
+ } else {
+ // not the same hostname... we'll keep it just in case.
+ eventType = linkTypes.UNCERTAIN_EMAIL_ADDRESS_FOUND;
+ }
+
+ } else if (reAnyEmail.test(elem.attr('href'))) {
+
+ if (this.isSameHostname(elem.attr('href'))) {
+ eventType = linkTypes.UNCERTAIN_EMAIL_ADDRESS_FOUND;
+ }
+
+ }
+ if (eventType) {
+ // we found an email address.
+ // send message with whatever event type was found.
+ self.postMessage({event: eventType,
+ contact: {
+ 'label': elem.attr('href').replace('mailto:', ''),
+ 'link': elem.attr('href')}
+ });
+ return true;
+
+ }
+ else {
+ // not an email address.
+ return false;
+ }
+
+ },
+
+ /**
+ * matchContact
+ *
+ * Loop through the regexp and try to find a match.
+ *
+ */
+ matchContact: function (currentLink) {
+
+ // search for an email address.
+ if (this.searchForContactEmail(currentLink)) {
+ return true;
+ }
+ if (this.searchForSocialMedia(currentLink)) {
+ return true;
+ }
+
+ // check all contact link strings.
+ this.matchContactLink(currentLink);
+
+ // this link is worth nothing.
+ //return false;
+
+ },
+
+ /**
+ * matchContactLink
+ *
+ * loop through regexp for a contact link.
+ * And send a message to trigger a page worker
+ * if not currently a page worker.
+ *
+ */
+ matchContactLink: function (currentLink) {
+
+ var that = this;
+
+ this.loopThroughLanguages(
+ function (degreeName, arr, le) {
+
+ var text, j, href;
+
+ for (j = 0; j < le; j++) {
+
+ text = $(currentLink).text();
+ href = currentLink.href;
+
+ if (arr[j].test(text)) {
+
+ if (degreeName === 'certain') {
+
+ self.postMessage(
+ { event: linkTypes.CERTAIN_LINK_FOUND,
+ contact: {
+ 'label': text,
+ 'link': href}
+ }
+ );
+
+ if (!that.isPageWorker) {
+ that.complaintSearch(linkTypes.CERTAIN_LINK_FOUND, href);
+ }
+
+
+ } else if (degreeName === 'probable'){
+
+ self.postMessage(
+ { event: linkTypes.PROBABLE_LINK_FOUND,
+ contact: {
+ 'label': text,
+ 'link': href}
+ }
+ );
+
+ if (!that.isPageWorker) {
+ that.complaintSearch(linkTypes.PROBABLE_LINK_FOUND, href);
+ }
+
+ } else if (degreeName === 'uncertain') {
+
+ self.postMessage(
+ { event: linkTypes.UNCERTAIN_LINK_FOUND,
+ contact: {
+ 'label': text,
+ 'link': href}
+ }
+ );
+
+
+ if (!that.isPageWorker) {
+ that.complaintSearch(linkTypes.UNCERTAIN_LINK_FOUND, href);
+ }
+ }
+ }
+
+ }
+ });
+
+ },
+
+ /**
+ * complaintSearch
+ * returns to ui_info a link to open.
+ */
+ complaintSearch: function (linkType, link) {
+
+ console.debug('the complaint search url is', link);
+
+ if (!this.isEmailLink(link)) {
+
+ // we don't want to "visit" mailto links.
+ self.postMessage({event: 'complaintSearch',
+ urlSearch: {'type': linkType, 'linkValue': link}
+ });
+
+ }
+ },
+
+ /**
+ * getHostname
+ * small regex taken from
+ * http://beardscratchers.com/journal/using-javascript-to-get-the-hostname-of-a-url
+ * to extract hostname from url.
+ * do not consider www as subdomain.
+ *
+ */
+ getHostname: function (str) {
+
+ // remove www, but not other kind of subdomains (which most likely
+ // may not be the same site than the domain itself.)
+ str = this.removeWWW(str);
+ var urlHostname = /^(?:f|ht)tp(?:s)?\:\/\/([^\/]+)/im;
+ var emailHostname = /^mailto:[A-Z0-9\.\_\+\-]+\@([A-Z0-9\.\-]+\.[A-Z]{2,6})$/im;
+ var match1 = urlHostname.exec(str);
+ var match2 = emailHostname.exec(str);
+
+ if (match1) {
+ return match1[1];
+ }
+ else if (match2) {
+ return match2[1];
+ }
+
+ // no match.
+ return false;
+
+ },
+
+ /**
+ * isSameHostname
+ *
+ * Checks a link has the same hostname than the original url.
+ *
+ */
+ isSameHostname: function (url) {
+
+ return this.getHostname(url) === this.originalHostname;
+
+ },
+
+ /**
+ * remove www from hostname.
+ */
+ removeWWW: function (str) {
+
+ return str.replace("www.", "", 'i');
+
+ },
+
+ isEmailLink: function (str) {
+
+ return /^mailto:/i.test(str);
+
+ }
+
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/contact_regex.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/contact_regex.js
new file mode 100644
index 0000000..e797b5e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/contact_regex.js
@@ -0,0 +1,49 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+// email address regexp
+var reEmail = /^mailto\:(admin|feedback|webmaster|info|contact|support|comments|team|help)\@[a-z0-9.\-]+\.[a-z]{2,4}$/i;
+
+var reAnyEmail = /^mailto\:.*?\@[a-z0-9\.\-]+\.[a-z]{2,4}$/i;
+
+// twitter address regexp
+var reTwitter = /twitter\.com\/(\!?#\/)?[a-z0-9]*/i;
+
+// identi.ca address regexp
+var reIdentiCa = /identi\.ca\/(?!notice\/)[a-z0-9]*/i;
+
+/**
+ * contactSearchStrings
+ * Contains arrays of strings classified by language
+ * and by degree of certainty.
+ */
+var contactStr = {
+ 'english': {
+ 'certain': ['^[\s]*Contact Us[\s]*$', '^[\s]*Email Us[\s]*$', '^[\s]*Contact[\s]*$', '^[\s]*Feedback[\s]*$', '^[\s]*Web.?site Feedback[\s]*$'],
+ 'probable': ['^[\s]Contact', '^[\s]*Email'],
+ 'uncertain': ['^[\s]*About Us', '^[\s]*About', 'Who we are', 'Who I am', 'Company Info', 'Customer Service']
+ },
+ 'french': {
+ 'certain': ['^[\s]*Contactez nous[\s]*$', '^[\s]*(Nous )?contacter[\s]*$', '^[\s]*Email[\s]*$', '^[\s]*Contact[\s]*$', '^[\s]*Commentaires[\s]*$'],
+ 'probable': ['^[\s]Contact', '^[\s]*Email'],
+ 'uncertain': ['^[\s]*(A|À) propos', 'Qui nous sommes', 'Qui suis(-| )?je', 'Info', 'Service Client(e|è)le']
+ },
+};
+
+var usaPhoneNumber = /(?:\+ ?1 ?)?\(?[2-9]{1}[0-9]{2}\)?(?:\-|\.| )?[0-9]{3}(?:\-|\.| )[0-9]{4}(?:[^0-9])/mg; \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/link_types.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/link_types.js
new file mode 100644
index 0000000..fefd4fd
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/link_types.js
@@ -0,0 +1,42 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var linkTypes = {
+
+ // constants. Also available in lib/ui_info.js
+ 'CERTAIN_EMAIL_ADDRESS_FOUND': 'certainEmailAddressFound',
+ 'UNCERTAIN_EMAIL_ADDRESS_FOUND': 'uncertainEmailAddressFound',
+
+ // Looking for contact links
+ 'CERTAIN_LINK_FOUND': 'certainLinkFound',
+ 'PROBABLE_LINK_FOUND': 'probableLinkFound',
+ 'UNCERTAIN_LINK_FOUND': 'uncertainLinkFound',
+ 'LINK_NOT_FOUND': 'contactLinkNotFound',
+
+ // Looking for identi.ca and twitter accounts.
+ 'TWITTER_LINK_FOUND': 'twitterLinkFound',
+ 'IDENTICA_LINK_FOUND': 'identicaLinkFound',
+
+ // phone number and address
+ 'PHONE_NUMBER_FOUND': 'phoneNumberFound',
+ 'SNAIL_ADDRESS_FOUND': 'snailAddressFound'
+
+};
+
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/pagemod_finder.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/pagemod_finder.js
new file mode 100644
index 0000000..036f5f6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/pagemod_finder.js
@@ -0,0 +1,291 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+var pageModFinder = {
+
+
+ image: null,
+
+ stylesheet: null,
+
+ button: null,
+
+ displayPanel: false,
+
+ links: null,
+
+ box: null,
+
+ infoBox: null,
+
+ init: function () {
+
+ var that = this, le;
+
+ this.links = [];
+
+
+ self.on('message', function (respData) {
+
+ if (respData.event === 'assets-uri') {
+ that.setComplaintPanel(respData.value);
+ }
+
+ else if (respData.event === 'page-url') {
+
+ // search for contact list. Top level.
+ contactFinder.init();
+ //console.debug('page url is', respData.value);
+ contactFinder.searchForContactLink(respData.value);
+
+ }
+
+ else if (respData.contact !== undefined){
+ that.displayLinkByPriority(respData);
+ }
+ });
+
+ },
+
+ /**
+ * setComplaintPanel
+ *
+ * Create complaint panel and assign properties to the
+ * dom elements.
+ *
+ */
+ setComplaintPanel: function (uri) {
+
+ // provide uri of stylesheet
+ this.stylesheet = uri + 'css/style.css';
+
+ // add stylesheet.
+ $('head').append($('<link/>').attr({'rel': 'stylesheet',
+ 'href': this.stylesheet,
+ 'type': 'text/css'}));
+
+ $('body').prepend('<div id="librejs-complaint-box" style="display:none">' +
+ '\n\n ' +
+ '<a id="librejs-tab-button" href="#" title="LibreJS -- Complain to this site">LibreJS -- Complain to this site.</a>' +
+ '\n\n ' +
+ '<div id="librejs-complaint-info">' +
+ '\n\n ' +
+ '<h1 title="Nonfree JavaScript -- Complain">\n Nonfree JavaScript Complain\n </h1>' +
+ '\n\n' +
+ '<p id="librejs-time-mention">Searching for contact links in this website...</p>' +
+ '\n\n' +
+ '<div id="librejs-complaint-info-text">' +
+
+ '<h2>Emails you should use</h2>' +
+ '<ul id="librejs-certain-emails"></ul>' +
+
+ '<h2>Non-webmaster Emails you might want to use</h2>' +
+ '<ul id="librejs-uncertain-emails"></ul>' +
+
+ '<h2>Contact form or useful Contact Information</h2>' +
+ '<ul id="librejs-certain-links"></ul>' +
+
+ '<h2>Twitter Links</h2>' +
+ '<ul id="librejs-twitter-links"></ul>' +
+
+ '<h2>Identi.ca Links</h2>' +
+ '<ul id="librejs-identica-links"></ul>' +
+
+ '<h2>May be of interest</h2>' +
+ '<ul id="librejs-uncertain-links"></ul>' +
+
+ '<h2>May be of interest</h2>' +
+ '<ul id="librejs-probable-links"></ul>' +
+
+ '<h2>Phone Numbers</h2>' +
+ '<ul id="librejs-phone-numbers"></ul>' +
+
+ '<h2>Snail Mail Addresses</h2>' +
+ '<ul id="librejs-snail-addresses"></ul>' +
+ '</div>' +
+ ' </div></div>');
+
+ // main elements of the complaint panel.
+ this.infoBox = $('#librejs-complaint-info');
+ this.infoBoxText = $('#librejs-complaint-info-text');
+
+ // all lists.
+ this.certainEmails = $("#librejs-certain-emails");
+ this.uncertainEmails = $("#librejs-uncertain-emails");
+ this.certainLinks = $("#librejs-certain-links");
+ this.uncertainLinks = $("#librejs-uncertain-links");
+ this.probableLinks = $("#librejs-probable-links");
+ this.twitterLinks = $("#librejs-twitter-links");
+ this.identicaLinks = $("#librejs-identica-links");
+ this.phoneNumbers = $("#librejs-phone-numbers");
+ this.snailAddresses = $("#librejs-snail-addresses");
+
+ this.button = $('#librejs-tab-button');
+ this.box = $('#librejs-complaint-box');
+
+ this.infoBox.height(window.innerHeight / 1.3);
+ this.infoBoxText.height(this.infoBox.height() - 150);
+
+ },
+
+
+ /**
+ *
+ * displayLinkByPriority
+ *
+ * Place the link in the correct list depending
+ * on the correct
+ */
+ displayLinkByPriority: function (respData) {
+
+ // we have a link to show. Add it to the button.
+ // first time finalLinkFound is triggered.
+ if (this.displayPanel === false) {
+
+ this.addComplaintOverlay();
+ this.displayPanel = true;
+ this.hideBox(true);
+ }
+
+ // check link isn't already added.
+ if (respData.contact !== undefined &&
+ !this.isInLinks(respData.contact.link)) {
+
+ // push link to list.
+ le = this.links.push(respData);
+
+ // making sure this is the latest link added.
+ this.addALinkToPanel(this.links[le -1]);
+
+ }
+
+
+ },
+
+ isInLinks: function (searchValue) {
+ var i = 0,
+ le = this.links.length;
+
+ for (; i < le; i++) {
+
+ if (this.links[i].contact.link.replace(/\/$/, '') === searchValue.replace(/\/$/, '')) {
+ return true;
+ }
+ }
+
+ // no match has been found.
+ return false;
+
+ },
+
+ /**
+ * addALinkToPanel
+ *
+ * Check the type of link and place it in the
+ * appropriate list in the complaint panel.
+ *
+ */
+ addALinkToPanel: function (link) {
+
+ var listElem;
+
+ switch (link.event) {
+
+ case linkTypes.CERTAIN_EMAIL_ADDRESS_FOUND:
+ listElem = this.certainEmails;
+ break;
+
+ case linkTypes.UNCERTAIN_EMAIL_ADDRESS_FOUND:
+ listElem = this.uncertainEmails;
+ break;
+
+ case linkTypes.CERTAIN_LINK_FOUND:
+ listElem = this.certainLinks;
+ break;
+
+ case linkTypes.PROBABLE_LINK_FOUND:
+ listElem = this.probableLinks;
+ break;
+
+ case linkTypes.UNCERTAIN_LINK_FOUND:
+ listElem = this.uncertainLinks;
+ break;
+
+ case linkTypes.TWITTER_LINK_FOUND:
+ listElem = this.twitterLinks;
+ break;
+
+ case linkTypes.IDENTICA_LINK_FOUND:
+ listElem = this.identicaLinks;
+ break;
+
+ case linkTypes.PHONE_NUMBER_FOUND:
+ listElem = this.phoneNumbers;
+ break;
+
+ case linkTypes.SNAIL_ADDRESS_FOUND:
+ listElem = this.snailAddresses;
+ break;
+ }
+
+ listElem.prev('h2').css({'display': 'block'});
+ listElem.append($('<li/>').append($('<a/>').attr({'href': link.contact.link,
+ 'target': '_blank'}).text(link.contact.label)));
+
+
+ },
+
+ addComplaintOverlay: function () {
+ var that = this;
+
+ this.button.bind('mouseenter', function () { that.showBox(); });
+
+ this.box.bind('mouseleave', function () { that.hideBox(); });
+
+ this.button.bind('focus', function () { that.showBox(); });
+ this.box.bind('blur', function () { that.hideBox(); });
+
+ this.box.css({'display': 'block'});
+
+ //this.hideBox(true);
+ },
+
+ showBox: function () {
+ this.box.stop().animate({
+ right: '-5px'
+ }, {queue: false, duration: 1500, easing: 'easeInOutQuart'});
+ },
+
+ hideBox: function (hint) {
+ var rightMargin = '-550px';
+
+ if (hint) {
+ rightMargin = '-530px';
+ }
+
+ this.box.stop().delay(10000).animate({
+ right: rightMargin
+ }, {queue:false, duration: 1500, easing: 'easeInOutQuart'});
+
+ }
+
+
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/worker_finder.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/worker_finder.js
new file mode 100644
index 0000000..2cda32e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/worker_finder.js
@@ -0,0 +1,35 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var workerFinder = {
+
+ init: function () {
+
+ var that = this;
+ console.debug('searching with pageworker');
+
+ contactFinder.init(true);
+ contactFinder.searchForContactLink(window.location.href);
+
+ }
+
+};
+
+workerFinder.init();
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/README b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/README
new file mode 100644
index 0000000..e442861
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/README
@@ -0,0 +1,21 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+All images in this directory are free, released under the GPLv3 or later. \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/background-panel.jpg b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/background-panel.jpg
new file mode 100644
index 0000000..67f56a9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/background-panel.jpg
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/display-panel.html b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/display-panel.html
new file mode 100644
index 0000000..4ae7cde
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/display-panel.html
@@ -0,0 +1,56 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>Display JS Monitoring Panel</title>
+<link rel="stylesheet" type="text/css" href="./panel-styles.css"/>
+
+<!-- /**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+-->
+</head>
+
+<body>
+
+
+<a class="libre" id="ljs-settings" href="javascript:void"><h1 class="libre">LibreJS</h1></a>
+
+<div id='info'>
+
+<div id="dryrun">
+<h2 class="dryrun-js"></h2>
+<ul class="dryrun-js"></ul>
+</div>
+
+<div id="accepted">
+<h2 class="accepted-js"></h2>
+<ul class="accepted-js"></ul>
+</div>
+
+<div id="blocked">
+<h2 class="blocked-js"></h2>
+<ul class="blocked-js">
+</div>
+
+</ul>
+
+</div>
+</body>
+</html>
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/librejs-title-old.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/librejs-title-old.png
new file mode 100644
index 0000000..8a11527
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/librejs-title-old.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/librejs-title.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/librejs-title.png
new file mode 100644
index 0000000..c1a911c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/librejs-title.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/panel-styles.css b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/panel-styles.css
new file mode 100644
index 0000000..66b0696
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/panel-styles.css
@@ -0,0 +1,177 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+html {
+ padding:10px;
+ color:#000 !important;
+ background:url('background-panel.jpg') !important;
+}
+document {
+ padding:10px;
+}
+body {
+ padding:10px;
+ font-size:67.5%;
+ overflow-x:hidden;
+ overflow-y:visible;
+ color:#000;
+}
+
+.libre {
+ width:230px;
+ height:104px;
+ display:block;
+}
+h1.libre {
+ font-size:1.5em;
+ font-weight:normal;
+ font-family:Arial;
+ margin:-20px 0 0 0;
+ padding:0;
+ font-weight:bold;
+ background:url('librejs-title.png') no-repeat top left;
+ text-indent:-1000px;
+ overflow:hidden;
+}
+h2 {
+ font-size:1.5em;
+ font-weight:bold;
+ font-family:arial;
+ border-bottom:4px solid #444;
+ padding-bottom:0;
+ margin:30px 0 0 0;
+ width:710px;
+ line-height:140%;
+}
+code {
+ font-size:1.2em;
+ margin:0;
+ padding:0;
+}
+ul {
+ margin:0;
+ padding:0;
+ list-style:none;
+}
+ul.blocked-js li, ul.accepted-js li, ul.dryrun-js li {
+ padding:5px;
+ border-bottom:2px solid #CCC;
+ margin:0;
+ width:700px;
+}
+
+ul ul {
+ margin:10px;
+ list-style:disc;
+}
+ul.blocked-js ul li, ul.accepted-js ul li, ul.dryrun-js ul li {
+ padding:5px;
+ border-bottom:0;
+ width:auto;
+}
+#info {
+ clear:both;
+}
+.button {
+ float:right;
+ padding:10px;
+ display:none;
+ clear:both;
+ margin:10px;
+}
+
+/*
+ Pure JS button styles below taken from:
+ http://webdesignerwall.com/tutorials/css3-gradient-buttons
+ */
+.button {
+ display: inline-block;
+ outline: none;
+ cursor: pointer;
+ text-align: center;
+ text-decoration: none;
+ font: 14px/100% Arial, Helvetica, sans-serif;
+ padding: .5em 2em .55em;
+ text-shadow: 0 1px 1px rgba(0,0,0,.3);
+ -webkit-border-radius: .5em;
+ -moz-border-radius: .5em;
+ border-radius: .5em;
+ -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.2);
+ -moz-box-shadow: 0 1px 2px rgba(0,0,0,.2);
+ box-shadow: 0 1px 2px rgba(0,0,0,.2);
+}
+.small.button {
+ font-size:11px;
+ padding:.5em .5em;
+ margin-top:10px;
+}
+.button:hover {
+ text-decoration: none;
+}
+.button:active {
+ position: relative;
+ top: 1px;
+}
+.orange {
+ color: #fef4e9;
+ border: solid 1px #da7c0c;
+ background: #f78d1d;
+ background: -webkit-gradient(linear, left top, left bottom, from(#faa51a), to(#f47a20));
+ background: -moz-linear-gradient(top, #faa51a, #f47a20);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#faa51a', endColorstr='#f47a20');
+}
+.orange:hover {
+ background: #f47c20;
+ background: -webkit-gradient(linear, left top, left bottom, from(#f88e11), to(#f06015));
+ background: -moz-linear-gradient(top, #f88e11, #f06015);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f88e11', endColorstr='#f06015');
+}
+.orange:active {
+ color: #fcd3a5;
+ background: -webkit-gradient(linear, left top, left bottom, from(#f47a20), to(#faa51a));
+ background: -moz-linear-gradient(top, #f47a20, #faa51a);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f47a20', endColorstr='#faa51a');
+}
+.white {
+ background: -moz-linear-gradient(center top , #FFFFFF, #EDEDED) repeat scroll 0 0 transparent;
+ border: 1px solid #B7B7B7;
+ /* color: #606060;*/
+ color:#9d0d0d;
+}
+.white:hover {
+ background: -moz-linear-gradient(center top , #FFFFFF, #DCDCDC) repeat scroll 0 0 transparent;
+}
+.white:active {
+ background: -moz-linear-gradient(center top , #EDEDED, #FFFFFF) repeat scroll 0 0 transparent;
+/*color: #999999;*/
+
+}
+
+span.accepted, span.blocked {
+ color:#008e00;
+ font-size:145%;
+ font-variant:small-caps;
+ font-weight:bold;
+}
+ul.blocked-js li {
+ overflow:hidden;
+}
+span.blocked {
+ color:#8e0000;
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/main_panel.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/main_panel.js
new file mode 100644
index 0000000..dfe2b73
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/main_panel.js
@@ -0,0 +1,319 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+var arraySrc, pageURL, urlData;
+
+
+var displayPanel = {
+ complainButton: null,
+ button1: null,
+ button2: null,
+ pageURL: null,
+ urlData: null,
+
+ init: function () {
+ // add the buttons to the panel dynamically.
+ $('body').prepend(
+ '<a id="complain-contact" class="button white" href="#">' +
+ '<span>Complain to site owner</span>' +
+ '</a>' +
+ '<a id="allow-button" class="button white" href="#">' +
+ '<span>Allow all scripts in this page</span>' +
+ '</a>' +
+ '<a id="disallow-button" class="button white" href="#">' +
+ '<span>Block all nonfree/nontrivial scripts from this page</span>' +
+ '</a>' +
+ '<a id="open-in-tab" class="button white" href="#">' +
+ '<span>Open this report in a new tab</span>' +
+ '</a>'
+ );
+
+ // assign properties to these new elements.
+ this.complainButton = $('#complain-contact');
+ this.button1 = $('#allow-button');
+ this.button2 = $('#disallow-button');
+
+ // start listening for messages sent from modules.
+ this.messageListen();
+ this.openInNewTab();
+ this.logoClick();
+ },
+ logoClick: function () {
+ $("#ljs-settings").click(function (e) {
+ e.preventDefault();
+ self.port.emit('openSesame');
+ });
+ },
+ openInNewTab: function () {
+ $('#open-in-tab').click(function (e) {
+ console.debug("open in tab clicked");
+ try {
+ var html = $("#info").html();
+ var text = window.btoa(unescape(encodeURIComponent(html)));
+ self.port.emit('openInTab', text);
+ } catch (x) {
+ console.debug("error", x.lineNumber, x.message);
+ }
+ return false;
+ });
+
+ },
+ messageListen: function () {
+ var that = this;
+ self.on("message", function onMessage(message) {
+ that.handleMessage(message);
+ });
+ },
+
+ getHostname: function (str) {
+ var re = new RegExp('^(http(?:s)?://[^/]+)', 'im');
+ return str.match(re)[1].toString();
+ },
+
+ /**
+ * formatListScript
+ * Depending on the type of script in the item,
+ * will return a preformatted code element with
+ * on-page JavaScript or a link to an external
+ * JavaScript file.
+ */
+ formatListScript: function (item, canWhitelist) {
+ var li, pre, code, a, reason = '';
+ li = $("<li/>");
+ if (item.reason !== undefined) {
+ reason = item.reason;
+ }
+ if (item.inline === true) {
+ pre = $('<pre/>');
+ pre.css('white-space', 'pre-wrap');
+ code = $('<code/>');
+ reason_obj = $('<span class="reason"/>').text(reason);
+ code.text(item.contents);
+ code.prepend($('<br/>'));
+ code.prepend(reason_obj);
+
+ pre.append(code);
+ li.append(pre);
+ } else {
+ console.debug("item url is %s", item.url);
+ reason_obj = $('<span class="reason"/>').text(reason);
+ li.text(item.contents);
+ li.prepend($('<br/>'));
+ li.prepend(reason_obj);
+ a = $('<a/>');
+ a.attr('href', item.url);
+ a.attr('target', '_blank');
+ a.text(item.url);
+ li.append(a);
+ }
+ if (canWhitelist) {
+ li.prepend(
+ $('<a class="small button white whitelist">Whitelist</a>')
+ .data('librejs-hash', item.hash));
+ }
+ else if (item.reason.indexOf('whitelisted by user') > -1) {
+ // a hack until LibreJS version 6.1. Need to have a value attached
+ // to item.whitelisted for this.
+ li.prepend(
+ $('<a class="small button white rm-whitelist">Remove from Whitelist</a>')
+ .data('librejs-hash', item.hash));
+ }
+ return li;
+ },
+
+ resetButtons: function (message) {
+ this.complainButton.hide().unbind('click');
+ if (message.contact === undefined) {
+ this.button1.hide();
+ this.button2.hide();
+ }
+ },
+
+ siteContactFound: function (url) {
+ this.complainButton.show();
+
+ this.complainButton.bind('click',
+ function (e) {
+ e.preventDefault();
+ self.port.emit('complainButtonClicked');
+ window.open(url,'_blank');
+ });
+ },
+
+ handleMessage: function (message) {
+ var removedLen, acceptedLen;
+
+ this.resetButtons(message);
+
+ // handle complaint feature message
+ if (message.event === 'contactLinkFound' ||
+ message.event === 'uncertainLinkFound') {
+ this.siteContactFound(message.absolute);
+ return;
+ } else if (message.event === 'contactLinkNotFound') {
+ // no contact link was found.
+ this.complainButton.hide();
+ }
+
+ if (message.isAllowed !== undefined) {
+ this.button2.show();
+ } else if (message.contact === undefined) {
+ this.button1.show();
+ }
+
+ var li, code, pre, len, i;
+
+ if (message.pageURL !== undefined) {
+
+ this.button1.attr('href', message.pageURL);
+ this.button2.attr('href', message.pageURL);
+ if (message.pageURL == 'resource://jid1-ktlzuoiikvffew-at-jetpack/librejs/data/settings/index.html') {
+ message.pageURL = "LibreJS Whitelist";
+ }
+ $('#info').css({'opacity': 0});
+ $('h2.blocked-js')
+ .html("List of <span class='blocked'>blocked</span> JavaScript in " +
+ $('<div/>').text(message.pageURL).html());
+ $('#dryrun').hide();
+ $('ul.blocked-js').empty();
+ $('ul.accepted-js').empty();
+ $('ul.dryrun-js').empty();
+
+ removedLen = message.urlData.removed.length;
+ acceptedLen = message.urlData.accepted.length;
+ dryRunLen = message.urlData.dryRun.length;
+ if (dryRunLen > 0) {
+ $dryRun = $("#dryrun");
+ $dryRun.show();
+ $('h2.dryrun-js')
+ .html("List of loaded <span class='blocked'>scripts that should be blocked</span> (but were allowed by you) in " +
+ $('<div/>').text(message.pageURL).html());
+ for (i = 0; i < dryRunLen; i++) {
+ li = this.formatListScript(message.urlData.dryRun[i],
+ true);
+ $('ul.dryrun-js').append(li);
+ }
+ }
+ if (removedLen > 0) {
+ $("#blocked").insertBefore($('#accepted'));
+ for (i = 0; i < removedLen; i++) {
+ this.button1.fadeIn();
+ li = this.formatListScript(message.urlData.removed[i],
+ true);
+ $('ul.blocked-js').append(li);
+ }
+ } else {
+
+ this.button1.hide();
+
+ $('ul.blocked-js').append('<li>LibreJS did not block any script on this page: \n\n<ul><li>There may be no script on this page (check source, C-u).</li><li>All the scripts on this page may be trivial and/or free.</li><li>You may have whitelisted this domain name or url from the preferences (Type about:addons in your location bar to check)</li><li>You may have clicked the "allow all scripts" button, which causes LibreJS to load all JavaScript on a page regardless of whether it is free, trivial, nontrivial or nonfree. This policy is effective for the entire duration of a Firefox session.</li><li>If for any reason you think LibreJS should have blocked JavaScript code on this page, please report this issue to: <a id="report" href="" target="_blank">lduros@gnu.org</a></li></ul></li>');
+
+ $('#report').attr('href',
+ 'mailto:lduros@gnu.org?subject=LibreJS bug Report&body=LibreJS issue with page: ' +
+ message.pageURL);
+ }
+
+ // get accepted scripts.
+ $('h2.accepted-js')
+ .html("List of <span class='accepted'>accepted</span> JavaScript in " +
+ $('<div/>').text(message.pageURL).html());
+
+ if (acceptedLen > 0) {
+ $('#accepted').insertBefore($('#blocked'));
+ for (i = 0; i < acceptedLen; i++) {
+
+ li = this.formatListScript(message.urlData.accepted[i],
+ false);
+ $('ul.accepted-js').append(li);
+
+ }
+
+ } else {
+ $('ul.accepted-js').append(
+ '<li>LibreJS did not allow the execution of any script on this page: \n\n\'' +
+ '<ul>' +
+ '<li>There may be no script on this page (check source, C-u)</li>' +
+ '<li>The inline and on-page JavaScript code may not be free and/or may not have proper license information and external scripts (if present) may have been removed by default.</li>' +
+ '<li>External scripts may not be free and/or may not have proper licensing and are not part of the whitelist of free JavaScript libraries.</li></ul></li>');
+ }
+
+ $('#info').animate({opacity: 1});
+
+ // emit allowAllClicked when button is clicked.
+ this.button1.bind(
+ 'click',
+ function(e) {
+ console.debug('clicked allow button');
+ e.preventDefault();
+ var url = $(this).attr('href');
+
+ var urlForDisplay = (url.length > 100) ?
+ url.substr(0,100) + '…' : url;
+ var areYouSure = window.confirm(
+ "Allow all nonfree/nontrivial scripts on this page?\n\n" +
+ urlForDisplay);
+
+ if (areYouSure) {
+ self.port.emit('allowAllClicked', url);
+ }
+
+ });
+
+ this.button2.bind(
+ 'click',
+ function(e) {
+ e.preventDefault();
+ var url = $(this).attr('href');
+ self.port.emit('disallowAllClicked', url);
+ });
+ var that = this;
+ // whitelist a script
+ $('.whitelist').bind(
+ 'click',
+ function (e) {
+ e.preventDefault();
+ // get the url of the page from main button.
+ var url = that.button1.attr('href');
+ var hash = $(this).data('librejs-hash');
+ var reason = $(this).parent('li').children('.reason')
+ .text();
+ if (!reason) {
+ reason = $(this).parent('li').children('pre')
+ .find('.reason').text();
+ }
+ self.port.emit('whitelistByHash', hash, url, '', reason);
+ $(this).parent().append(
+ $('<span style="font-weight:bold"/>')
+ .text("Reload page to load script"));
+ $(this).remove();
+ });
+
+ $('.rm-whitelist').bind(
+ 'click',
+ function (e) {
+ e.preventDefault();
+ var hash = $(this).data('librejs-hash');
+ self.port.emit('removeFromWhitelistByHash', hash);
+ $(this).text("Reload page to take effect");
+ });
+ }
+ }
+};
+
+displayPanel.init();
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon-white.ico b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon-white.ico
new file mode 100644
index 0000000..c053584
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon-white.ico
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon.ico b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon.ico
new file mode 100644
index 0000000..709de01
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon.ico
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon.png
new file mode 100644
index 0000000..7c603f0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/librejs-settings.html b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/librejs-settings.html
new file mode 100644
index 0000000..1292280
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/librejs-settings.html
@@ -0,0 +1,23 @@
+<!doctype html>
+<html>
+<head>
+<meta charset=utf-8 />
+<title>LibreJS - Settings</title>
+<link rel="icon"
+ type="image/icon"
+ href="images/gnu-icon.ico">
+<style>
+body {
+ background:#e3dedb;
+ color:#1b1615;
+ font-family:Sans-Serif;
+
+}
+h1 {
+ font-family:Georgia;
+}
+</style>
+</head>
+<body>
+</body>
+</html>
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/Boost-1.0.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/Boost-1.0.txt
new file mode 100644
index 0000000..36b7cd9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/Boost-1.0.txt
@@ -0,0 +1,23 @@
+Boost Software License - Version 1.0 - August 17th, 2003
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/ISC.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/ISC.txt
new file mode 100644
index 0000000..9f68299
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/ISC.txt
@@ -0,0 +1,12 @@
+Permission to use, copy, modify, and/or distribute this software for
+any purpose with or without fee is hereby granted, provided that the
+above copyright notice and this permission notice appear in all
+copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY
+SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/IntelACPI.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/IntelACPI.txt
new file mode 100644
index 0000000..8152ad6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/IntelACPI.txt
@@ -0,0 +1,116 @@
+ACPI - Software License Agreement
+
+
+Software License Agreement IMPORTANT - READ BEFORE COPYING, INSTALLING OR USING.
+
+Do not use or load this software and any associated materials
+(collectively, the "Software") until you have carefully read the
+following terms and conditions. By loading or using the Software, you
+agree to the terms of this Agreement. If you do not wish to so agree,
+do not install or use the Software.
+
+1. COPYRIGHT NOTICE Some or all of this work - Copyright © 1999-2005,
+Intel Corp. All rights reserved.
+
+2. LICENSE
+
+2.1. This is your license from Intel Corp. under its intellectual
+property rights. You may have additional license terms from the party
+that provided you this software, covering your right to use that
+party's intellectual property rights.
+
+2.2. Intel grants, free of charge, to any person ("Licensee")
+obtaining a copy of the source code appearing in this file ("Covered
+Code") an irrevocable, perpetual, worldwide license under Intel's
+copyrights in the base code distributed originally by Intel ("Original
+Intel Code") to copy, make derivatives, distribute, use and display
+any portion of the Covered Code in any form, with the right to
+sublicense such rights; and
+
+2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+license (with the right to sublicense), under only those claims of
+Intel patents that are infringed by the Original Intel Code, to make,
+use, sell, offer to sell, and import the Covered Code and derivative
+works thereof solely to the minimum extent necessary to exercise the
+above copyright license, and in no event shall the patent license
+extend to any additions to or modifications of the Original Intel
+Code. No other license or right is granted directly or by implication,
+estoppel or otherwise; The above copyright and patent license is
+granted only if the following conditions are met:
+
+3. CONDITIONS
+
+3.1. Redistribution of Source with Rights to Further Distribute
+Source. Redistribution of source code of any substantial portion of
+the Covered Code or modification with rights to further distribute
+source must include the above Copyright Notice, the above License,
+this list of Conditions, and the following Disclaimer and Export
+Compliance provision. In addition, Licensee must cause all Covered
+Code to which Licensee contributes to contain a file documenting the
+changes Licensee made to create that Covered Code and the date of any
+change. Licensee must include in that file the documentation of any
+changes made by any predecessor Licensee. Licensee must include a
+prominent statement that the modification is derived, directly or
+indirectly, from Original Intel Code.
+
+3.2. Redistribution of Source with no Rights to Further Distribute
+Source. Redistribution of source code of any substantial portion of
+the Covered Code or modification without rights to further distribute
+source must include the following Disclaimer and Export Compliance
+provision in the documentation and/or other materials provided with
+distribution. In addition, Licensee may not authorize further
+sublicense of source of any portion of the Covered Code, and must
+include terms to the effect that the license from Licensee to its
+licensee is limited to the intellectual property embodied in the
+software Licensee provides to its licensee, and not to intellectual
+property embodied in modifications its licensee may make.
+
+3.3. Redistribution of Executable. Redistribution in executable form
+of any substantial portion of the Covered Code or modification must
+reproduce the above Copyright Notice, and the following Disclaimer and
+Export Compliance provision in the documentation and/or other
+materials provided with the distribution.
+
+3.4. Intel retains all right, title, and interest in and to the
+Original Intel Code.
+
+3.5. Neither the name Intel nor any other trademark owned or
+controlled by Intel shall be used in advertising or otherwise to
+promote the sale, use or other dealings in products derived from or
+relating to the Covered Code without prior written authorization from
+Intel.
+
+4. DISCLAIMER AND EXPORT COMPLIANCE
+
+4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE
+PROVIDED HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM
+INTEL SOFTWARE IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY
+SUPPORT, ASSISTANCE, INSTALLATION, TRAINING OR OTHER SERVICES. INTEL
+WILL NOT PROVIDE ANY UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL
+SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+NONINFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
+
+4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS
+LICENSEES OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA,
+LOSS OF USE OR COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
+OR FOR ANY INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF
+THIS AGREEMENT, UNDER ANY CAUSE OF ACTION OR THEORY OF LIABILITY, AND
+IRRESPECTIVE OF WHETHER INTEL HAS ADVANCE NOTICE OF THE POSSIBILITY OF
+SUCH DAMAGES. THESE LIMITATIONS SHALL APPLY NOTWITHSTANDING THE
+FAILURE OF THE ESSENTIAL PURPOSE OF ANY LIMITED REMEDY.
+
+4.3. Licensee shall not export, either directly or indirectly, any of
+this software or system incorporating such software without first
+obtaining any required license or other approval from the
+U. S. Department of Commerce or any other agency or department of the
+United States Government. In the event Licensee exports any such
+software from the United States or re-exports any such software from a
+foreign destination, Licensee shall ensure that the distribution and
+export/re-export of the software is in compliance with all laws,
+regulations, orders, or other restrictions of the U.S. Export
+Administration Regulations. Licensee agrees that neither it nor any of
+its subsidiaries will export/re-export any technical data, process,
+software, or service, directly or indirectly, to any country for which
+the United States government or any agency thereof requires an export
+license, other governmental approval, or letter of assurance, without
+first obtaining such license, approval or letter.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/agpl-3.0.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/agpl-3.0.txt
new file mode 100644
index 0000000..dba13ed
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/agpl-3.0.txt
@@ -0,0 +1,661 @@
+ GNU AFFERO GENERAL PUBLIC LICENSE
+ Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+ A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate. Many developers of free software are heartened and
+encouraged by the resulting cooperation. However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+ The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community. It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server. Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+ An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals. This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU Affero General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Remote Network Interaction; Use with the GNU General Public License.
+
+ Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software. This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time. Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source. For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code. There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<http://www.gnu.org/licenses/>.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/apache-2.0.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/apache-2.0.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/apache-2.0.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/artistic-2.0.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/artistic-2.0.txt
new file mode 100644
index 0000000..ddb9a46
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/artistic-2.0.txt
@@ -0,0 +1,201 @@
+ The Artistic License 2.0
+
+ Copyright (c) 2000-2006, The Perl Foundation.
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+Preamble
+
+This license establishes the terms under which a given free software
+Package may be copied, modified, distributed, and/or redistributed.
+The intent is that the Copyright Holder maintains some artistic
+control over the development of that Package while still keeping the
+Package available as open source and free software.
+
+You are always permitted to make arrangements wholly outside of this
+license directly with the Copyright Holder of a given Package. If the
+terms of this license do not permit the full use that you propose to
+make of the Package, you should contact the Copyright Holder and seek
+a different licensing arrangement.
+
+Definitions
+
+ "Copyright Holder" means the individual(s) or organization(s)
+ named in the copyright notice for the entire Package.
+
+ "Contributor" means any party that has contributed code or other
+ material to the Package, in accordance with the Copyright Holder's
+ procedures.
+
+ "You" and "your" means any person who would like to copy,
+ distribute, or modify the Package.
+
+ "Package" means the collection of files distributed by the
+ Copyright Holder, and derivatives of that collection and/or of
+ those files. A given Package may consist of either the Standard
+ Version, or a Modified Version.
+
+ "Distribute" means providing a copy of the Package or making it
+ accessible to anyone else, or in the case of a company or
+ organization, to others outside of your company or organization.
+
+ "Distributor Fee" means any fee that you charge for Distributing
+ this Package or providing support for this Package to another
+ party. It does not mean licensing fees.
+
+ "Standard Version" refers to the Package if it has not been
+ modified, or has been modified only in ways explicitly requested
+ by the Copyright Holder.
+
+ "Modified Version" means the Package, if it has been changed, and
+ such changes were not explicitly requested by the Copyright
+ Holder.
+
+ "Original License" means this Artistic License as Distributed with
+ the Standard Version of the Package, in its current version or as
+ it may be modified by The Perl Foundation in the future.
+
+ "Source" form means the source code, documentation source, and
+ configuration files for the Package.
+
+ "Compiled" form means the compiled bytecode, object code, binary,
+ or any other form resulting from mechanical transformation or
+ translation of the Source form.
+
+
+Permission for Use and Modification Without Distribution
+
+(1) You are permitted to use the Standard Version and create and use
+Modified Versions for any purpose without restriction, provided that
+you do not Distribute the Modified Version.
+
+
+Permissions for Redistribution of the Standard Version
+
+(2) You may Distribute verbatim copies of the Source form of the
+Standard Version of this Package in any medium without restriction,
+either gratis or for a Distributor Fee, provided that you duplicate
+all of the original copyright notices and associated disclaimers. At
+your discretion, such verbatim copies may or may not include a
+Compiled form of the Package.
+
+(3) You may apply any bug fixes, portability changes, and other
+modifications made available from the Copyright Holder. The resulting
+Package will still be considered the Standard Version, and as such
+will be subject to the Original License.
+
+
+Distribution of Modified Versions of the Package as Source
+
+(4) You may Distribute your Modified Version as Source (either gratis
+or for a Distributor Fee, and with or without a Compiled form of the
+Modified Version) provided that you clearly document how it differs
+from the Standard Version, including, but not limited to, documenting
+any non-standard features, executables, or modules, and provided that
+you do at least ONE of the following:
+
+ (a) make the Modified Version available to the Copyright Holder
+ of the Standard Version, under the Original License, so that the
+ Copyright Holder may include your modifications in the Standard
+ Version.
+
+ (b) ensure that installation of your Modified Version does not
+ prevent the user installing or running the Standard Version. In
+ addition, the Modified Version must bear a name that is different
+ from the name of the Standard Version.
+
+ (c) allow anyone who receives a copy of the Modified Version to
+ make the Source form of the Modified Version available to others
+ under
+
+ (i) the Original License or
+
+ (ii) a license that permits the licensee to freely copy,
+ modify and redistribute the Modified Version using the same
+ licensing terms that apply to the copy that the licensee
+ received, and requires that the Source form of the Modified
+ Version, and of any works derived from it, be made freely
+ available in that license fees are prohibited but Distributor
+ Fees are allowed.
+
+
+Distribution of Compiled Forms of the Standard Version
+or Modified Versions without the Source
+
+(5) You may Distribute Compiled forms of the Standard Version without
+the Source, provided that you include complete instructions on how to
+get the Source of the Standard Version. Such instructions must be
+valid at the time of your distribution. If these instructions, at any
+time while you are carrying out such distribution, become invalid, you
+must provide new instructions on demand or cease further distribution.
+If you provide valid instructions or cease distribution within thirty
+days after you become aware that the instructions are invalid, then
+you do not forfeit any of your rights under this license.
+
+(6) You may Distribute a Modified Version in Compiled form without
+the Source, provided that you comply with Section 4 with respect to
+the Source of the Modified Version.
+
+
+Aggregating or Linking the Package
+
+(7) You may aggregate the Package (either the Standard Version or
+Modified Version) with other packages and Distribute the resulting
+aggregation provided that you do not charge a licensing fee for the
+Package. Distributor Fees are permitted, and licensing fees for other
+components in the aggregation are permitted. The terms of this license
+apply to the use and Distribution of the Standard or Modified Versions
+as included in the aggregation.
+
+(8) You are permitted to link Modified and Standard Versions with
+other works, to embed the Package in a larger work of your own, or to
+build stand-alone binary or bytecode versions of applications that
+include the Package, and Distribute the result without restriction,
+provided the result does not expose a direct interface to the Package.
+
+
+Items That are Not Considered Part of a Modified Version
+
+(9) Works (including, but not limited to, modules and scripts) that
+merely extend or make use of the Package, do not, by themselves, cause
+the Package to be a Modified Version. In addition, such works are not
+considered parts of the Package itself, and are not subject to the
+terms of this license.
+
+
+General Provisions
+
+(10) Any use, modification, and distribution of the Standard or
+Modified Versions is governed by this Artistic License. By using,
+modifying or distributing the Package, you accept this license. Do not
+use, modify, or distribute the Package, if you do not accept this
+license.
+
+(11) If your Modified Version has been derived from a Modified
+Version made by someone other than you, you are nevertheless required
+to ensure that your Modified Version complies with the requirements of
+this license.
+
+(12) This license does not grant you the right to use any trademark,
+service mark, tradename, or logo of the Copyright Holder.
+
+(13) This license includes the non-exclusive, worldwide,
+free-of-charge patent license to make, have made, use, offer to sell,
+sell, import and otherwise transfer the Package with respect to any
+patent claims licensable by the Copyright Holder that are necessarily
+infringed by the Package. If you institute patent litigation
+(including a cross-claim or counterclaim) against any party alleging
+that the Package constitutes direct or contributory patent
+infringement, then this Artistic License to you shall terminate on the
+date that such litigation is filed.
+
+(14) Disclaimer of Warranty:
+THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS
+IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL
+LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/bsd-3-clause.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/bsd-3-clause.txt
new file mode 100644
index 0000000..0a0fa15
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/bsd-3-clause.txt
@@ -0,0 +1,27 @@
+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.
+
+ (3)The name of the author may not be used to
+ endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/cc0.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/cc0.txt
new file mode 100644
index 0000000..bdfff7a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/cc0.txt
@@ -0,0 +1,118 @@
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT
+ PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT
+ CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES
+ THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO
+ WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION
+ OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES
+ RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR
+ WORKS PROVIDED HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically
+confer exclusive Copyright and Related Rights (defined below) upon the
+creator and subsequent owner(s) (each and all, an "owner") of an
+original work of authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work
+for the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without
+fear of later claims of infringement build upon, modify, incorporate
+in other works, reuse and redistribute as freely as possible in any
+form whatsoever and for any purposes, including without limitation
+commercial purposes. These owners may contribute to the Commons to
+promote the ideal of a free culture and the further production of
+creative, cultural and scientific works, or to gain reputation or
+greater distribution for their Work in part through the use and
+efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or
+she is an owner of Copyright and Related Rights in the Work,
+voluntarily elects to apply CC0 to the Work and publicly distribute
+the Work under its terms, with knowledge of his or her Copyright and
+Related Rights in the Work and the meaning and intended legal effect
+of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may
+be protected by copyright and related or neighboring rights
+("Copyright and Related Rights"). Copyright and Related Rights
+include, but are not limited to, the following:
+
+ the right to reproduce, adapt, distribute, perform, display,
+ communicate, and translate a Work; moral rights retained by the
+ original author(s) and/or performer(s); publicity and privacy
+ rights pertaining to a person's image or likeness depicted in a
+ Work; rights protecting against unfair competition in regards to a
+ Work, subject to the limitations in paragraph 4(a), below; rights
+ protecting the extraction, dissemination, use and reuse of data in
+ a Work; database rights (such as those arising under Directive
+ 96/9/EC of the European Parliament and of the Council of 11 March
+ 1996 on the legal protection of databases, and under any national
+ implementation thereof, including any amended or successor version
+ of such directive); and other similar, equivalent or corresponding
+ rights throughout the world based on applicable law or treaty, and
+ any national implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in
+contravention of, applicable law, Affirmer hereby overtly, fully,
+permanently, irrevocably and unconditionally waives, abandons, and
+surrenders all of Affirmer's Copyright and Related Rights and
+associated claims and causes of action, whether now known or unknown
+(including existing as well as future claims and causes of action), in
+the Work (i) in all territories worldwide, (ii) for the maximum
+duration provided by applicable law or treaty (including future time
+extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"Waiver"). Affirmer makes the Waiver for the benefit of each member of
+the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal
+or equitable action to disrupt the quiet enjoyment of the Work by the
+public as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any
+reason be judged legally invalid or ineffective under applicable law,
+then the Waiver shall be preserved to the maximum extent permitted
+taking into account Affirmer's express Statement of Purpose. In
+addition, to the extent the Waiver is so judged Affirmer hereby grants
+to each affected person a royalty-free, non transferable, non
+sublicensable, non exclusive, irrevocable and unconditional license to
+exercise Affirmer's Copyright and Related Rights in the Work (i) in
+all territories worldwide, (ii) for the maximum duration provided by
+applicable law or treaty (including future time extensions), (iii) in
+any current or future medium and for any number of copies, and (iv)
+for any purpose whatsoever, including without limitation commercial,
+advertising or promotional purposes (the "License"). The License shall
+be deemed effective as of the date CC0 was applied by Affirmer to the
+Work. Should any part of the License for any reason be judged legally
+invalid or ineffective under applicable law, such partial invalidity
+or ineffectiveness shall not invalidate the remainder of the License,
+and in such case Affirmer hereby affirms that he or she will not (i)
+exercise any of his or her remaining Copyright and Related Rights in
+the Work or (ii) assert any associated claims and causes of action
+with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ No trademark or patent rights held by Affirmer are waived,
+ abandoned, surrendered, licensed or otherwise affected by this
+ document. Affirmer offers the Work as-is and makes no
+ representations or warranties of any kind concerning the Work,
+ express, implied, statutory or otherwise, including without
+ limitation warranties of title, merchantability, fitness for a
+ particular purpose, non infringement, or the absence of latent or
+ other defects, accuracy, or the present or absence of errors,
+ whether or not discoverable, all to the greatest extent
+ permissible under applicable law. Affirmer disclaims
+ responsibility for clearing rights of other persons that may apply
+ to the Work or any use thereof, including without limitation any
+ person's Copyright and Related Rights in the Work. Further,
+ Affirmer disclaims responsibility for obtaining any necessary
+ consents, permissions or other rights required for any use of the
+ Work. Affirmer understands and acknowledges that Creative Commons
+ is not a party to this document and has no duty or obligation with
+ respect to this CC0 or use of the Work.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/clear-bsd.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/clear-bsd.txt
new file mode 100644
index 0000000..550cf5b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/clear-bsd.txt
@@ -0,0 +1,33 @@
+The Clear BSD License
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted (subject to the limitations in the
+disclaimer below) provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the
+ distribution.
+
+ * Neither the name of <Owner Organization> nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/cpal-1.0.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/cpal-1.0.txt
new file mode 100644
index 0000000..c7ca984
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/cpal-1.0.txt
@@ -0,0 +1,105 @@
+Common Public Attribution License Version 1.0 (CPAL)
+1. "Definitions"
+1.0.1 "Commercial Use" means distribution or otherwise making the Covered Code available to a third party.
+1.1 "Contributor" means each entity that creates or contributes to the creation of Modifications.
+1.2 "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor.
+1.3 "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof.
+1.4 "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data.
+1.5 "Executable" means Covered Code in any form other than Source Code.
+1.6 "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A.
+1.7 "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License.
+1.8 "License" means this document.
+1.8.1 "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.
+1.9 "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is:
+A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications.
+B. Any new file that contains any part of the Original Code or previous Modifications.
+1.10 "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License.
+1.10.1 "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
+1.11 "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge.
+1.12 "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.
+2. Source Code License.
+2.1 The Initial Developer Grant.
+The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims:
+(a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and
+(b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof).
+(c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License.
+(d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices.
+2.2 Contributor Grant.
+Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license
+(a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and
+(b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
+(c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code.
+(d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor.
+3. Distribution Obligations.
+3.1 Application of License.
+The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5.
+3.2 Availability of Source Code.
+Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party.
+3.3 Description of Modifications.
+You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code.
+3.4 Intellectual Property Matters
+(a) Third Party Claims.
+If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained.
+(b) Contributor APIs.
+If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file.
+(c) Representations.
+Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License.
+3.5 Required Notices.
+You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
+3.6 Distribution of Executable Versions.
+You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer.
+3.7 Larger Works.
+You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code.
+4. Inability to Comply Due to Statute or Regulation.
+If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it.
+5. Application of this License.
+This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code.
+6. Versions of the License.
+6.1 New Versions.
+Socialtext, Inc. ("Socialtext") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number.
+6.2 Effect of New Versions.
+Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License.
+6.3 Derivative Works.
+If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "Socialtext", "CPAL" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.)
+7. DISCLAIMER OF WARRANTY.
+COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+8. TERMINATION.
+8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
+8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as "Participant") alleging that:
+(a) such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above.
+(b) any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant.
+8.3 If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license.
+8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination.
+9. LIMITATION OF LIABILITY.
+UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+10. U.S. GOVERNMENT END USERS.
+The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein.
+11. MISCELLANEOUS.
+This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License.
+12. RESPONSIBILITY FOR CLAIMS.
+As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
+13. MULTIPLE-LICENSED CODE.
+Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A.
+14. ADDITIONAL TERM: ATTRIBUTION
+(a) As a modest attribution to the organizer of the development of the Original Code ("Original Developer"), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B ("Attribution Information") a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer's Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an "about" display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice.
+(b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL ("Attribution Information") and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the "Attribution Limits").
+(c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer.
+(d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License.
+15. ADDITIONAL TERM: NETWORK USE.
+The term "External Deployment" means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2.
+EXHIBIT A. Common Public Attribution License Version 1.0.
+"The contents of this file are subject to the Common Public Attribution License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at _____________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B.
+Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License.
+The Original Code is______________________.
+The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer.
+The Initial Developer of the Original Code is ____________. All portions of the code written by ___________ are Copyright (c) _____. All Rights Reserved.
+Contributor ______________________.
+Alternatively, the contents of this file may be used under the terms of the _____ license (the (___) License), in which case the provisions of (______) License are applicable instead of those above.
+If you wish to allow use of your version of this file only under the terms of the (____) License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the (___) License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the (___) License."
+(NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.)
+EXHIBIT B. Attribution Information
+Attribution Copyright Notice: _______________________
+Attribution Phrase (not exceeding 10 words): _______________________
+Attribution URL: _______________________
+Graphic Image as provided in the Covered Code, if any.
+Display of Attribution Information is (required/not required) in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/create-magnets.sh b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/create-magnets.sh
new file mode 100644
index 0000000..b20be4b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/create-magnets.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# This file is part of GNU LibreJS.
+#
+# GNU LibreJS is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# GNU LibreJS is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+
+# this script requires transmission-daemon. Install it as a package.
+echo "" > magnet-links.txt
+curtorrent=""
+for f in *.txt
+do
+ echo "Processing $f"
+ curtorrent="torrents/$f.torrent"
+ echo "Creating $curtorrent"
+ transmission-create -o "$curtorrent" "$f"
+ transmission-show --magnet "$curtorrent" >> magnet-links.txt
+done
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/expat.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/expat.txt
new file mode 100644
index 0000000..1f95d26
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/expat.txt
@@ -0,0 +1,5 @@
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/freebsd.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/freebsd.txt
new file mode 100644
index 0000000..29b4d8e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/freebsd.txt
@@ -0,0 +1,25 @@
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer. Redistributions
+in binary form must reproduce the above copyright notice, this list of
+conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution. THIS SOFTWARE IS
+PROVIDED BY THE FREEBSD PROJECT ``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 FREEBSD PROJECT OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The views and conclusions contained in the software and documentation
+are those of the authors and should not be interpreted as representing
+official policies, either expressed or implied, of the FreeBSD
+Project.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/gpl-2.0.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/gpl-2.0.txt
new file mode 100644
index 0000000..d159169
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/gpl-2.0.txt
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/gpl-3.0.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/gpl-3.0.txt
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/gpl-3.0.txt
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/illinois-NCSA.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/illinois-NCSA.txt
new file mode 100644
index 0000000..4f2da6c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/illinois-NCSA.txt
@@ -0,0 +1,24 @@
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+“Softwareâ€), to deal with the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimers.
+Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimers in the
+documentation and/or other materials provided with the distribution.
+Neither the names of <Name of Development Group, Name of Institution>,
+nor the names of its contributors may be used to endorse or promote
+products derived from this Software without specific prior written
+permission. THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY
+KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/imlib2.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/imlib2.txt
new file mode 100644
index 0000000..5fc3f71
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/imlib2.txt
@@ -0,0 +1,31 @@
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies of the Software and its Copyright notices. In addition publicly
+documented acknowledgment must be given that this software has been used if no
+source code of this software is made available publicly. Making the source
+available publicly means including the source for this software with the
+distribution, or a method to get this software via some reasonable mechanism
+(electronic transfer via a network or media) as well as making an offer to
+supply the source on request. This Copyright notice serves as an offer to
+supply the source on on request as well. Instead of this, supplying
+acknowledgments of use of this software in either Copyright notices, Manuals,
+Publicity and Marketing documents or any documentation provided with any
+product containing this software. This License does not apply to any software
+that links to the libraries provided by this software (statically or
+dynamically), but only to the software provided.
+
+Please see the COPYING-PLAIN for a plain-english explanation of this notice
+and its intent.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-2.0.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-2.0.txt
new file mode 100644
index 0000000..5bc8fb2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-2.0.txt
@@ -0,0 +1,481 @@
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-2.1.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-2.1.txt
new file mode 100644
index 0000000..4362b49
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-2.1.txt
@@ -0,0 +1,502 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-3.0.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-3.0.txt
new file mode 100644
index 0000000..65c5ca8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-3.0.txt
@@ -0,0 +1,165 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/magnet-links.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/magnet-links.txt
new file mode 100644
index 0000000..8026b91
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/magnet-links.txt
@@ -0,0 +1,26 @@
+
+magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt
+magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7&dn=apache-2.0.txt
+magnet:?xt=urn:btih:54fd2283f9dbdf29466d2df1a98bf8f65cafe314&dn=artistic-2.0.txt
+magnet:?xt=urn:btih:89a97c535628232f2f3888c2b7b8ffd4c078cec0&dn=Boost-1.0.txt
+magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt
+magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt
+magnet:?xt=urn:btih:e8823381a12cbaec8042d8f5928ed9ca427ae6ed&dn=clear-bsd.txt
+magnet:?xt=urn:btih:84143bc45939fc8fa42921d619a95462c2031c5c&dn=cpal-1.0.txt
+magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt
+magnet:?xt=urn:btih:0c9737ee7c3f64a549ae792605960b900d0bab7f&dn=freebsd.txt
+magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt
+magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt
+magnet:?xt=urn:btih:035da57b2e51467406d7f737ce130844ceb555e1&dn=illinois-NCSA.txt
+magnet:?xt=urn:btih:34b1392ce6108db166bd9ee4a37e655c67891e5b&dn=imlib2.txt
+magnet:?xt=urn:btih:3254dcf4f9d9dadad8dfb4951177854d5d0e2491&dn=IntelACPI.txt
+magnet:?xt=urn:btih:b8999bbaf509c08d127678643c515b9ab0836bae&dn=ISC.txt
+magnet:?xt=urn:btih:fcd495f3ca5fb96b147041401bcf213eec0a6439&dn=lgpl-2.0.txt
+magnet:?xt=urn:btih:5de60da917303dbfad4f93fb1b985ced5a89eac2&dn=lgpl-2.1.txt
+magnet:?xt=urn:btih:0ef1b8170b3b615170ff270def6427c317705f85&dn=lgpl-3.0.txt
+magnet:?xt=urn:btih:3877d6d54b3accd4bc32f8a48bf32ebc0901502a&dn=mpl-2.0.txt
+magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt
+magnet:?xt=urn:btih:5866afca5f37889c0c1fdd108f4922d4fcdb5e3d&dn=unlicense.txt
+magnet:?xt=urn:btih:723febf9f6185544f57f0660a41489c7d6b4931b&dn=wtfpl.txt
+magnet:?xt=urn:btih:5305d91886084f776adcf57509a648432709a7c7&dn=x11.txt
+magnet:?xt=urn:btih:12f2ec9e8de2a3b0002a33d518d6010cc8ab2ae9&dn=xfree86.txt
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/mpl-2.0.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/mpl-2.0.txt
new file mode 100644
index 0000000..14e2f77
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/mpl-2.0.txt
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ (a) that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+
+ (b) that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+1.6. "Executable Form"
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+1.8. "License"
+ means this document.
+
+1.9. "Licensable"
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+1.10. "Modifications"
+ means any of the following:
+
+ (a) any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+
+ (b) any new file in Source Code Form that contains any Covered
+ Software.
+
+1.11. "Patent Claims" of a Contributor
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+1.12. "Secondary License"
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those
+ licenses.
+
+1.13. "Source Code Form"
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, "control" means (a) the power, direct
+ or indirect, to cause the direction or management of such entity,
+ whether by contract or otherwise, or (b) ownership of more than
+ fifty percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+ for sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+ or
+
+(b) for infringements caused by: (i) Your and any other third party's
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+ Form, as described in Section 3.1, and You must inform recipients of
+ the Executable Form how they can obtain a copy of such Source Code
+ Form by reasonable means in a timely manner, at a charge no more
+ than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter
+ the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+* *
+* 6. Disclaimer of Warranty *
+* ------------------------- *
+* *
+* Covered Software is provided under this License on an "as is" *
+* basis, without warranty of any kind, either expressed, implied, or *
+* statutory, including, without limitation, warranties that the *
+* Covered Software is free of defects, merchantable, fit for a *
+* particular purpose or non-infringing. The entire risk as to the *
+* quality and performance of the Covered Software is with You. *
+* Should any Covered Software prove defective in any respect, You *
+* (not any Contributor) assume the cost of any necessary servicing, *
+* repair, or correction. This disclaimer of warranty constitutes an *
+* essential part of this License. No use of any Covered Software is *
+* authorized under this License except under this disclaimer. *
+* *
+************************************************************************
+
+************************************************************************
+* *
+* 7. Limitation of Liability *
+* -------------------------- *
+* *
+* Under no circumstances and under no legal theory, whether tort *
+* (including negligence), contract, or otherwise, shall any *
+* Contributor, or anyone who distributes Covered Software as *
+* permitted above, be liable to You for any direct, indirect, *
+* special, incidental, or consequential damages of any character *
+* including, without limitation, damages for lost profits, loss of *
+* goodwill, work stoppage, computer failure or malfunction, or any *
+* and all other commercial damages or losses, even if such party *
+* shall have been informed of the possibility of such damages. This *
+* limitation of liability shall not apply to liability for death or *
+* personal injury resulting from such party's negligence to the *
+* extent applicable law prohibits such limitation. Some *
+* jurisdictions do not allow the exclusion or limitation of *
+* incidental or consequential damages, so this exclusion and *
+* limitation may not apply to You. *
+* *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+ This Source Code Form is "Incompatible With Secondary Licenses", as
+ defined by the Mozilla Public License, v. 2.0.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/public-domain.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/public-domain.txt
new file mode 100644
index 0000000..68cf1a8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/public-domain.txt
@@ -0,0 +1,18 @@
+Being in the public domain is not a license; rather, it means the
+material is not copyrighted and no license is needed. Practically
+speaking, though, if a work is in the public domain, it might as well
+have an all-permissive non-copyleft free software license. Public
+domain material is compatible with the GNU GPL.
+
+If you want to release your work to the public domain, we encourage
+you to use formal tools to do so. We ask people who make small
+contributions to GNU to sign a disclaimer form; that's one
+solution. If you're working on a project that doesn't have formal
+contribution policies like that, CC0 is a good tool that anyone can
+use. It formally dedicates your work to the public domain, and
+provides a fallback license for cases where that is not legally
+possible.
+
+http://directory.fsf.org/wiki/License:CC0
+
+Source: http://www.gnu.org/licenses/license-list.html#PublicDomain
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/Boost-1.0.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/Boost-1.0.txt.torrent
new file mode 100644
index 0000000..d859c22
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/Boost-1.0.txt.torrent
@@ -0,0 +1,2 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343399e8:encoding5:UTF-84:infod6:lengthi1338e4:name13:Boost-1.0.txt12:piece lengthi32768e6:pieces20:<º)â¹ÕŸbÖú
+8k-½7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/ISC.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/ISC.txt.torrent
new file mode 100644
index 0000000..c221f05
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/ISC.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343405e8:encoding5:UTF-84:infod6:lengthi683e4:name7:ISC.txt12:piece lengthi32768e6:pieces20:_9tq””ø…ç-°ä~.ŽÎw 7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/IntelACPI.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/IntelACPI.txt.torrent
new file mode 100644
index 0000000..8de0ded
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/IntelACPI.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343405e8:encoding5:UTF-84:infod6:lengthi6080e4:name13:IntelACPI.txt12:piece lengthi32768e6:pieces20: ¹×æo°Ÿ†ê*-|í_(7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/agpl-3.0.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/agpl-3.0.txt.torrent
new file mode 100644
index 0000000..21f7000
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/agpl-3.0.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343398e8:encoding5:UTF-84:infod6:lengthi34520e4:name12:agpl-3.0.txt12:piece lengthi32768e6:pieces40:‚¥¢öIß='5íN?bý¨¤.ÐÅİNʯÈúï¸ÕJ¡”6ÿœ7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/apache-2.0.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/apache-2.0.txt.torrent
new file mode 100644
index 0000000..f0b13ab
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/apache-2.0.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343398e8:encoding5:UTF-84:infod6:lengthi11358e4:name14:apache-2.0.txt12:piece lengthi32768e6:pieces20:+‹R)ªŠaäƒûK X‹‹lI7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/artistic-2.0.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/artistic-2.0.txt.torrent
new file mode 100644
index 0000000..5bb11db
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/artistic-2.0.txt.torrent
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/bsd-3-clause.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/bsd-3-clause.txt.torrent
new file mode 100644
index 0000000..9dfc19a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/bsd-3-clause.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343400e8:encoding5:UTF-84:infod6:lengthi1373e4:name16:bsd-3-clause.txt12:piece lengthi32768e6:pieces20:ëÒP©`ïã‰ôZ†Œó#ô²°à‰7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/cc0.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/cc0.txt.torrent
new file mode 100644
index 0000000..02991e9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/cc0.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343400e8:encoding5:UTF-84:infod6:lengthi6982e4:name7:cc0.txt12:piece lengthi32768e6:pieces20:¢&Nq˜L/bQV¾ ÕÊ–™\Â7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/clear-bsd.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/clear-bsd.txt.torrent
new file mode 100644
index 0000000..5f56d34
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/clear-bsd.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343401e8:encoding5:UTF-84:infod6:lengthi1633e4:name13:clear-bsd.txt12:piece lengthi32768e6:pieces20:Ÿ ”1m? „Á§[>$k™Ž7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/cpal-1.0.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/cpal-1.0.txt.torrent
new file mode 100644
index 0000000..93e5631
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/cpal-1.0.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343401e8:encoding5:UTF-84:infod6:lengthi28079e4:name12:cpal-1.0.txt12:piece lengthi32768e6:pieces20:Î*²T#Ѹ X;ÀhÔ è?ÚÛæ…7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/expat.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/expat.txt.torrent
new file mode 100644
index 0000000..62f134f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/expat.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343402e8:encoding5:UTF-84:infod6:lengthi1023e4:name9:expat.txt12:piece lengthi32768e6:pieces20:©ó|+®þDàݶî( ¡²¹ï957:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/freebsd.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/freebsd.txt.torrent
new file mode 100644
index 0000000..8d07cb1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/freebsd.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343402e8:encoding5:UTF-84:infod6:lengthi1426e4:name11:freebsd.txt12:piece lengthi32768e6:pieces20: ÛS­ VuÓ;¦´‡™3àÜöGí7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/gpl-2.0.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/gpl-2.0.txt.torrent
new file mode 100644
index 0000000..55830d3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/gpl-2.0.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343403e8:encoding5:UTF-84:infod6:lengthi18092e4:name11:gpl-2.0.txt12:piece lengthi32768e6:pieces20:LÇ{¯‘æ¦JàH“ýÿ§“¸L7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/gpl-3.0.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/gpl-3.0.txt.torrent
new file mode 100644
index 0000000..b101841
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/gpl-3.0.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343403e8:encoding5:UTF-84:infod6:lengthi35147e4:name11:gpl-3.0.txt12:piece lengthi32768e6:pieces40:N@ˆ˜ã™Þšmýê¢Íô’M焎š¥F–)f"&"`ÕHŠå~üw7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/illinois-NCSA.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/illinois-NCSA.txt.torrent
new file mode 100644
index 0000000..3ce156a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/illinois-NCSA.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343404e8:encoding5:UTF-84:infod6:lengthi1462e4:name17:illinois-NCSA.txt12:piece lengthi32768e6:pieces20:Wá¢1úíõiÐé$±F¸´J–*Ê7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/imlib2.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/imlib2.txt.torrent
new file mode 100644
index 0000000..5975ed3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/imlib2.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343404e8:encoding5:UTF-84:infod6:lengthi1987e4:name10:imlib2.txt12:piece lengthi32768e6:pieces20:÷´Øpi.§Ó»?ÉßtRî7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-2.0.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-2.0.txt.torrent
new file mode 100644
index 0000000..fe8e055
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-2.0.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343406e8:encoding5:UTF-84:infod6:lengthi25383e4:name12:lgpl-2.0.txt12:piece lengthi32768e6:pieces20:º‰fâG:™i½Ê³Ü‚'L|ý˜¡7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-2.1.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-2.1.txt.torrent
new file mode 100644
index 0000000..ae6e06b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-2.1.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343406e8:encoding5:UTF-84:infod6:lengthi26530e4:name12:lgpl-2.1.txt12:piece lengthi32768e6:pieces20:¦´¿y¬©µV‚&jú¸nŒO¿7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-3.0.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-3.0.txt.torrent
new file mode 100644
index 0000000..c518b15
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-3.0.txt.torrent
@@ -0,0 +1,2 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343407e8:encoding5:UTF-84:infod6:lengthi7651e4:name12:lgpl-3.0.txt12:piece lengthi32768e6:pieces20:ô^áÇedh´BÊXÞrâ
+d§Ýº7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/magnet-links.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/magnet-links.txt.torrent
new file mode 100644
index 0000000..9e7641b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/magnet-links.txt.torrent
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/mpl-2.0.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/mpl-2.0.txt.torrent
new file mode 100644
index 0000000..cbe4ec0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/mpl-2.0.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343408e8:encoding5:UTF-84:infod6:lengthi16726e4:name11:mpl-2.0.txt12:piece lengthi32768e6:pieces20:—DÎÜà™÷'³'Í™¡ýÅŠU™7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/public-domain.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/public-domain.txt.torrent
new file mode 100644
index 0000000..a1efd8a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/public-domain.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343408e8:encoding5:UTF-84:infod6:lengthi889e4:name17:public-domain.txt12:piece lengthi32768e6:pieces20:â§JaHûã2’IÛO‡4 ó¾(7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/unlicense.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/unlicense.txt.torrent
new file mode 100644
index 0000000..c77ff26
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/unlicense.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343409e8:encoding5:UTF-84:infod6:lengthi1212e4:name13:unlicense.txt12:piece lengthi32768e6:pieces20:§y’¯FAÞm¡†@$š² Žm— 7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/wtfpl.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/wtfpl.txt.torrent
new file mode 100644
index 0000000..7819326
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/wtfpl.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343409e8:encoding5:UTF-84:infod6:lengthi432e4:name9:wtfpl.txt12:piece lengthi32768e6:pieces20:ÔHÙÿ’šÂ·O.KªßýUi7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/x11.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/x11.txt.torrent
new file mode 100644
index 0000000..f6239e2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/x11.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343410e8:encoding5:UTF-84:infod6:lengthi1293e4:name7:x11.txt12:piece lengthi32768e6:pieces20:&×¾;T‚#¢+j‹¶H,uÜq7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/xfree86.txt.torrent b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/xfree86.txt.torrent
new file mode 100644
index 0000000..b4c430e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/xfree86.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343411e8:encoding5:UTF-84:infod6:lengthi2297e4:name11:xfree86.txt12:piece lengthi32768e6:pieces20:)~ŽSÅÿHu¤×í–;y0°h>7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/unlicense.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/unlicense.txt
new file mode 100644
index 0000000..471f09f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/unlicense.txt
@@ -0,0 +1,25 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <http://unlicense.org/>
+
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/wtfpl.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/wtfpl.txt
new file mode 100644
index 0000000..0557e73
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/wtfpl.txt
@@ -0,0 +1,11 @@
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ Version 2, December 2004
+
+ Everyone is permitted to copy and distribute verbatim or modified
+ copies of this license document, and changing it is allowed as long
+ as the name is changed.
+
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. You just DO WHAT THE FUCK YOU WANT TO.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/x11.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/x11.txt
new file mode 100644
index 0000000..e133cb3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/x11.txt
@@ -0,0 +1,26 @@
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from the X Consortium.
+
+X Window System is a trademark of X Consortium, Inc.
+
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/xfree86.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/xfree86.txt
new file mode 100644
index 0000000..b41fc74
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/xfree86.txt
@@ -0,0 +1,43 @@
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+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,
+and in the same place and form as other copyright, license and
+disclaimer information.
+
+3. The end-user documentation included with the redistribution, if
+any, must include the following acknowledgment: "This product includes
+software developed by The XFree86 Project, Inc
+(http://www.xfree86.org/) and its contributors", in the same place and
+form as other third-party acknowledgments. Alternately, this
+acknowledgment may appear in the software itself, in the same form and
+location as other such third-party acknowledgments.
+
+4. Except as contained in this notice, the name of The XFree86
+Project, Inc shall not be used in advertising or otherwise to promote
+the sale, use or other dealings in this Software without prior written
+authorization from The XFree86 Project, Inc.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 XFREE86 PROJECT, INC 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.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/loading/loader.gif b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/loading/loader.gif
new file mode 100644
index 0000000..22a5bb3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/loading/loader.gif
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/loading/loading-panel.html b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/loading/loading-panel.html
new file mode 100644
index 0000000..4db4709
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/loading/loading-panel.html
@@ -0,0 +1,31 @@
+<!doctype html>
+
+<html>
+<head>
+<!-- /**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+-->
+</head>
+
+<body>
+<h1>LibreJS: Analyzing JavaScript</h1>
+<img src="./loader.gif"/>
+</body>
+</html>
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/preferences_panel/contentscript.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/preferences_panel/contentscript.js
new file mode 100644
index 0000000..6ac7578
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/preferences_panel/contentscript.js
@@ -0,0 +1,70 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/*
+ * Handle messages sent from add-on to the content script
+ */
+//onMessage = function onMessage(message) {
+self.on('message', function (message) {
+ var reason = message[0];
+
+ if(reason == "INCOMINGPREFS") {
+ // These are the prefs we need to set up the pref panel
+
+ initPanel(message);
+ }
+});
+
+function initPanel(prefObject) {
+
+ for(var i in prefObject) {
+ if(prefObject[i]) {
+ if(prefObject[i].split(":")[1]) {
+ try {
+ var item = this.document.getElementById("pref_" + prefObject[i].split(":")[0]);
+ item.checked = prefObject[i].split(":")[1] == "true";
+ } catch(e) {
+ //"ERROR: " + //console.log(i);
+ }
+ }
+ }
+ }
+
+
+ var inputs = this.document.getElementsByTagName("input");
+
+ for(i in inputs) {
+
+ input = inputs[i]; // correct version
+
+ if(input) {
+ if(input.nodeName == "INPUT") {
+ input.onclick = function() {
+ self.postMessage("SETPREF:" + this.id.split("pref_")[1] + ":" + this.checked);
+ };
+ }
+ }
+ }
+
+
+
+
+ prefObject = null;
+} \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/preferences_panel/preferences_panel.html b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/preferences_panel/preferences_panel.html
new file mode 100644
index 0000000..ffb1c5a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/preferences_panel/preferences_panel.html
@@ -0,0 +1,71 @@
+<html>
+ <head>
+<!-- /**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+-->
+ <title>
+ LibreJS preferences
+ </title>
+ <style>
+ body > div {
+ border: 1px black;
+ }
+ div.choice {
+ background: #555;
+ color:#c4c4c4;
+ margin:10px;
+
+ padding:10px;
+ font-size:13px;
+ clear:both;
+ overflow:hidden;
+ }
+ input {
+ float:left;
+ display:inline;
+ }
+ div.choice p {
+ display:block;
+ width:200px;
+ float:left;
+ margin-left:0;
+ }
+ span.notdone {
+ color:red;
+ }
+ #pref_whitelist {
+ width:240px;
+ }
+ </style>
+
+ </head>
+
+ <body>
+ <h3>
+ LibreJS Preferences
+ </h1>
+ <div>
+ <div>
+ <div class="choice">
+ <input id="pref_nolazy" type="checkbox"/><p>Do not consider lazy license mentions as free (e.g.: dual-licensed under MIT and GPL, ...)</p>
+ </div>
+ </div>
+ </body>
+</html>
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_detector/script_detector.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_detector/script_detector.js
new file mode 100644
index 0000000..b16b9dd
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_detector/script_detector.js
@@ -0,0 +1,363 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+// array reflects valid types as listed in
+// http://mxr.mozilla.org/mozilla-central/source/content/base/src/nsScriptLoader.cpp#437
+// anything appended to end of strings is considered valid:
+var jsValidTypes = [
+ /^text\/javascript/i,
+ /^text\/ecmascript/i,
+ /^application\/javascript/i,
+ /^application\/ecmascript/i,
+ /^application\/x-javascript/i
+];
+
+// the list of all available event attributes
+var intrinsecEvents = [
+ "onload",
+ "onunload",
+ "onclick",
+ "ondblclick",
+ "onmousedown",
+ "onmouseup",
+ "onmouseover",
+ "onmousemove",
+ "onmouseout",
+ "onfocus",
+ "onblur",
+ "onkeypress",
+ "onkeydown",
+ "onkeyup",
+ "onsubmit",
+ "onreset",
+ "onselect",
+ "onchange"];
+
+
+/**
+ * scriptHasInvalidType
+ *
+ * Checks that a script does not have a js "template" type.
+ * Normally any script that has a type attribute other than the
+ * few allowed ones is not interpreted. But by security, we only
+ * discard a few of them.
+ *
+ * @param script obj The script element.
+ * @return returns true if it matches a template type.
+ *
+ */
+var scriptHasInvalidType = function (type) {
+
+ var i = 0,
+ le = jsValidTypes.length;
+
+ if (type === 'librejs/blocked') {
+ // js has already been blocked.
+ return true;
+ }
+
+ if (!type) {
+ // type isn't set, don't look further.
+ return false;
+ }
+
+ for (; i < le; i++) {
+ if (jsValidTypes[i].test(type)) {
+ return false;
+ }
+ }
+
+ // type is invalid and
+ // hence cannot be executed.
+ return true;
+
+};
+
+
+/**
+ * scriptDetector
+ * Detects all scripts (inline, onpage, and external)
+ * and checks whether they have been blocked or if they
+ * are being executed.
+ */
+
+var scriptDetector = {
+ contactLink: null,
+ blockedScripts: null,
+ acceptedScripts: null,
+ dryRunScripts: null,
+ acceptedAttributes: null,
+ acceptedCode: [],
+ blockedCode: [],
+ dryRunCode: [],
+
+ init: function() {
+ if (typeof $ !== 'function') {
+ return;
+ }
+ this.blockedScripts = $('script[type="librejs/blocked"]');
+ this.acceptedScripts = $('script[type!="librejs/blocked"]')
+ .not('script[data-librejs-dryrun]');
+ this.dryRunScripts = $('script[data-librejs-dryrun]');
+ console.debug(this.dryRunScripts);
+ this.fetchAllNonScriptTags();
+
+ if (this.blockedScripts.length) {
+
+ // display noscript tags if applicable.
+ this.displayNoScriptTags();
+ try {
+ // initialize the page mod code.
+ pageModFinder.init();
+ } catch (e) {
+ // fail silently.
+ }
+ this.fetchBlockedScripts();
+ }
+
+ if (this.acceptedScripts.length) {
+ this.fetchAcceptedScripts();
+ }
+ if (this.dryRunScripts.length) {
+ this.fetchDryRunScripts();
+ }
+
+ self.postMessage({
+ 'event': 'scriptsFetched',
+ 'value': {
+ 'blocked': this.blockedCode,
+ 'accepted': this.acceptedCode,
+ 'dryRun': this.dryRunCode
+ }
+ });
+ },
+
+ /**
+ * fetchBlockedScripts
+ *
+ * Gather blocked scripts.
+ *
+ */
+ fetchBlockedScripts: function () {
+ var that = this,
+ singleton = '', reason;
+
+ this.blockedScripts.each(function() {
+ singleton = '';
+ reason = "";
+
+
+ if ($(this).data('librejs-reason') && $(this).data('librejs-reason').length > 9) {
+ reason = $(this).data('librejs-reason') + ': ';
+ }
+
+ if ($(this).text()) {
+
+ if ($(this).data('singleton') === true) {
+ singleton = 'This script was removed before LibreJS analysis: ';
+ }
+
+ that.blockedCode.push({'contents': singleton + reason + that.truncateText($(this).text()),
+ 'inline': true});
+ }
+
+ if ($(this).data('librejs-blocked-src')) {
+
+ that.blockedCode.push({'url': $(this).data('librejs-blocked-src'), 'contents': reason, 'inline': false});
+ }
+
+ });
+ },
+
+ /**
+ * fetchAcceptedScripts
+ *
+ * Gather accepted scripts.
+ *
+ */
+ fetchAcceptedScripts: function () {
+
+ var that = this, typeMessage = '', reason = "";
+
+ this.acceptedScripts.each(function() {
+ reason = "";
+
+ if ($(this).data('librejs-reason') && $(this).data('librejs-reason').length > 9) {
+ reason = $(this).data('librejs-reason') + ':';
+ }
+
+ if ($(this).attr('type') &&
+ scriptHasInvalidType($(this).attr('type'))) {
+ typeMessage = 'script type is not valid (js is not executed): '+ $(this).attr('type') + ' ';
+ }
+
+ if ($(this).text()) {
+ that.acceptedCode.push({'contents': reason + typeMessage + that.truncateText($(this).text()),
+ 'inline': true});
+ }
+
+ if ($(this).attr('src')) {
+ that.acceptedCode.push({'url': $(this).attr('src'), 'contents': reason + typeMessage,
+ 'inline': false});
+ }
+
+ });
+
+ },
+
+ /**
+ * fetchDryRunScripts
+ *
+ * Gather accepted scripts.
+ *
+ */
+ fetchDryRunScripts: function () {
+
+ var that = this, typeMessage = '', reason = "";
+
+ this.dryRunScripts.each(function() {
+ reason = "";
+
+ if ($(this).data('librejs-reason') && $(this).data('librejs-reason').length > 9) {
+ reason = $(this).data('librejs-reason') + ':';
+ }
+
+ if ($(this).attr('type') &&
+ scriptHasInvalidType($(this).attr('type'))) {
+ typeMessage = 'script type is not valid (js is not executed): '+ $(this).attr('type') + ' ';
+ }
+
+ if ($(this).text()) {
+ that.dryRunCode.push({'contents': reason + typeMessage + that.truncateText($(this).text()),
+ 'inline': true});
+ }
+
+ if ($(this).attr('src')) {
+ that.dryRunCode.push({'url': $(this).attr('src'), 'contents': reason + typeMessage,
+ 'inline': false});
+ }
+
+ });
+
+ },
+
+ fetchAllNonScriptTags: function () {
+ var that = this;
+ var blockedAnchors = $('*[data-librejs="rejected"]').not('script');
+ var acceptedAnchors = $('*[data-librejs="accepted"]').not('script');
+ var i = 0, le, attributes;
+
+ acceptedAnchors.each(function () {
+
+ var content = "";
+
+ if ($(this).attr('href')) {
+
+ content = $(this).attr('href');
+
+ }
+
+ else {
+ content = that.findOnAttributeContent($(this));
+ }
+
+ that.acceptedCode.push(
+ {contents: 'in attribute: ' + content,
+ inline: true}
+ );
+
+ });
+
+ blockedAnchors.each(function () {
+
+ var content = "";
+
+ if ($(this).attr('href')) {
+ content = $(this).attr('href');
+ } else if ($(this).data('librejs-blocked-event')) {
+ attributes = $(this).data('librejs-blocked-event');
+ le = attributes.length;
+ for (i = 0; i < le; i++) {
+ content += attributes[i].attribute + ":" + attributes[i].value + ";\n";
+ }
+ }
+
+ that.blockedCode.push(
+ {contents: 'in attribute: ' + content,
+ inline: true}
+ );
+ });
+ },
+
+ findOnAttributeContent: function (elem) {
+ var i = 0,
+ le = intrinsecEvents.length,
+ content = "";
+
+ for (; i < le; i++) {
+
+ if (elem.attr(intrinsecEvents[i])) {
+
+ content += elem.attr(intrinsecEvents[i]) + " -- ";
+
+ }
+
+ }
+ return content;
+ },
+
+ /**
+ * displayNoScriptTags
+ * Whenever blocked scripts are found, deep clone noscript tags
+ * and place them in a new div.
+ */
+ displayNoScriptTags: function () {
+
+ var noscripts = $('body noscript'),
+ div, content;
+
+ noscripts.each(function (index) {
+ div = $('<div/>');
+
+
+ content = $(this).contents();
+ content = $("<div>").html(content).text();
+
+ div.append(content);
+ div.children('style, script, meta').remove();
+
+
+ // insert noscript content right after the
+ // original noscript tag.
+ div.insertAfter($(this));
+ });
+
+ },
+ truncateText: function (str) {
+
+ if (str.length > 1000) {
+ str = str.slice(0, 1000) + '…';
+ }
+ return str;
+ }
+
+};
+
+scriptDetector.init();
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_libraries/gethash.sh b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_libraries/gethash.sh
new file mode 100644
index 0000000..f55b45c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_libraries/gethash.sh
@@ -0,0 +1,10 @@
+#!/usr/bin/env bash
+#
+# gethash.sh
+#
+# Get the hash of a js file for use in the librejs database.
+#
+
+FILE=$1
+wget -O /tmp/jsfile $FILE
+iconv -f LATIN1 -t UTF8 /tmp/jsfile | sha1sum
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_libraries/script-libraries.json b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_libraries/script-libraries.json
new file mode 100644
index 0000000..437f70b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_libraries/script-libraries.json
@@ -0,0 +1,1440 @@
+{
+ "9d6f8bdcadd59eba977e9e31066bf393c9fdf8a4": {
+ "filename": "http://code.jquery.com/jquery-1.0.4.js",
+ "result": "[freelib]"
+ },
+ "31555f340a206de7622fb760718ef4a1b296ed44": {
+ "filename": "http://code.jquery.com/jquery-1.1.js",
+ "result": "[freelib]"
+ },
+ "88c03b5c437ac3551661ecfbe6e1de155c3099c4": {
+ "filename": "http://code.jquery.com/jquery-1.0.pack.js",
+ "result": "[freelib]"
+ },
+ "08341cd159e29f561ca0ec16c99bf4b85e43d30f": {
+ "filename": "http://code.jquery.com/jquery-1.0.1.pack.js",
+ "result": "[freelib]"
+ },
+ "84b1514a01def3bc0b52f6fa03d0d9fa349bef72": {
+ "filename": "http://code.jquery.com/jquery-1.0.2.pack.js",
+ "result": "[freelib]"
+ },
+ "d3b30b0fead39e4c40fb0c91408e74439020a279": {
+ "filename": "http://code.jquery.com/jquery-1.0.2.js",
+ "result": "[freelib]"
+ },
+ "fa05290dadfb7d2659a55c50b77595e23f999a74": {
+ "filename": "http://code.jquery.com/jquery-1.0.1.js",
+ "result": "[freelib]"
+ },
+ "4a2c9fd552e1ca9ad66feaaad365990b1e664a8f": {
+ "filename": "http://code.jquery.com/jquery-1.0.4.pack.js",
+ "result": "[freelib]"
+ },
+ "ddb4126bf4713cb4e0f2310401e58cb9e3f98997": {
+ "filename": "http://code.jquery.com/jquery-1.0.3.pack.js",
+ "result": "[freelib]"
+ },
+ "4c12e01d990bd2b1075812d9f28e3ffa50ca59df": {
+ "filename": "http://code.jquery.com/jquery-1.0.3.js",
+ "result": "[freelib]"
+ },
+ "16306f8187df578589821e6eb6b807ac4d467d1f": {
+ "filename": "http://code.jquery.com/jquery-1.1.pack.js",
+ "result": "[freelib]"
+ },
+ "24dd74d65d2e02aae973af97ebbb31b9820a5bbb": {
+ "filename": "http://code.jquery.com/jquery-1.1.1.pack.js",
+ "result": "[freelib]"
+ },
+ "24fdaa88685c8b2dadcc94559ceef318fdcd115b": {
+ "filename": "http://code.jquery.com/jquery-1.1.1.js",
+ "result": "[freelib]"
+ },
+ "07c089df7b7a5da16f434870087d6b0e1c45d3b5": {
+ "filename": "http://code.jquery.com/jquery-1.1.2.pack.js",
+ "result": "[freelib]"
+ },
+ "788bb58005b75a004cd7abbd26f942eea0391f47": {
+ "filename": "http://code.jquery.com/jquery-1.1.2.js",
+ "result": "[freelib]"
+ },
+ "a7e07121debf460f86aa77073676c1e936478c22": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.1.3.js",
+ "result": "[freelib]"
+ },
+ "d0d4200eedc83fe692dd65aeab5a548bfe840d06": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.1.3.1.pack.js",
+ "result": "[freelib]"
+ },
+ "e1c9252b3e60673e4fa1bb1648cb18cd33139535": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.1.3.1.js",
+ "result": "[freelib]"
+ },
+ "0c80055d513ce3103bb70ca956be005f63e32922": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.1.4.pack.js",
+ "result": "[freelib]"
+ },
+ "5af7abb29b3b091080db17e53ef6ddcfa555dbe6": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.1.4.js",
+ "result": "[freelib]"
+ },
+ "e0c497fc264d7706da23235266ed52acf2c7b89a": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.min.js",
+ "result": "[freelib]"
+ },
+ "3aca6488dfb65cf0e600a7a70376ca1354b7377c": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.js",
+ "result": "[freelib]"
+ },
+ "0cafb88edcaebad82c207cdf124de1889364c9f3": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.1.min.js",
+ "result": "[freelib]"
+ },
+ "384cbfe95d92a30d7c86ac07ea5de56f79c15f6a": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.1.js",
+ "result": "[freelib]"
+ },
+ "2710cce192fcc4dc676d9572cd852f104ea59387": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.2.pack.js",
+ "result": "[freelib]"
+ },
+ "6869cb783670d6a4923aaccfe4331015961ed8d6": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.4.pack.js",
+ "result": "[freelib]"
+ },
+ "55c7f265deba4afc1335071fafbbf7fda8f02bbe": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.6.js",
+ "result": "[freelib]"
+ },
+ "f3abd53f3725675e3e049c414749e16df11951ba": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.3.js",
+ "result": "[freelib]"
+ },
+ "7b9e8594368d30387059e5fdef9d662095dbbf7a": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.3.min.js",
+ "result": "[freelib]"
+ },
+ "6be187a67b639b65dc8427eb8e790e42bbe4d7dd": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.3.1.js",
+ "result": "[freelib]"
+ },
+ "fed603a4db640b82de54b246de4be7a1cffa8780": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.3.1.min.js",
+ "result": "[freelib]"
+ },
+ "f0b95e99225f314fbe37ccf6b74ce2f916c517de": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.3.2.js",
+ "result": "[freelib]"
+ },
+ "3dc9f7c2642efff4482e68c9d9df874bf98f5bcb": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js",
+ "result": "[freelib]"
+ },
+ "ea6cc893792569fdbb344181034eb668261f2b24": {
+ "filename": "http://code.jquery.com/jquery-1.5.1.js",
+ "result": "[freelib]"
+ },
+ "fe7b4d1b72fc22fc397f3df3f1fd891c78f8fc96": {
+ "filename": "http://code.jquery.com/jquery-1.5.2.min.js",
+ "result": "[freelib]"
+ },
+ "b509dd44ba3f9c72cf8bba6fcb5f06fae15cabf6": {
+ "filename": "http://code.jquery.com/jquery-1.5.2.js",
+ "result": "[freelib]"
+ },
+ "22c1eefcce5be20a3e0966f5bcdf88ed81e9f5e7": {
+ "filename": "http://code.jquery.com/jquery-1.6.1.js",
+ "result": "[freelib]"
+ },
+ "7fa300666dadade0d006e4c496bf1c85f4b0ab0c": {
+ "filename": "http://code.jquery.com/jquery-1.6.2.min.js",
+ "result": "[freelib]"
+ },
+ "eeee9d4604e71f2e01b818fc1439f7b5baf1be7a": {
+ "filename": "http://code.jquery.com/jquery-1.6.2.js",
+ "result": "[freelib]"
+ },
+ "aee58a81bea80c20176c61ff03caaf0aa273f9a1": {
+ "filename": "http://code.jquery.com/jquery-1.6.3.min.js",
+ "result": "[freelib]"
+ },
+ "61a11f601d70a331de6444c11e72eab2ffd86427": {
+ "filename": "http://code.jquery.com/jquery-1.6.4.min.js",
+ "result": "[freelib]"
+ },
+ "3e5c6d7c6e09965d36df8c1e3d9dca6462c41ec1": {
+ "filename": "http://code.jquery.com/jquery-1.6.3.js",
+ "result": "[freelib]"
+ },
+ "921e7702ac9e4c4a4bca052b7bc83b0304440ee3": {
+ "filename": "http://code.jquery.com/jquery-1.6.4.js",
+ "result": "[freelib]"
+ },
+ "13184e03cd6a0fc0020cf5ad4eee3d8cb3fadac1": {
+ "filename": "http://code.jquery.com/jquery-1.7.min.js",
+ "result": "[freelib]"
+ },
+ "7f389928e5f9d3cb2ae273ae1a6913741d18f0a6": {
+ "filename": "http://code.jquery.com/jquery-1.7.js",
+ "result": "[freelib]"
+ },
+ "b47730ffaec4272a8a01756af2ef13ecea1c4e92": {
+ "filename": "http://code.jquery.com/jquery-1.7.1.js",
+ "result": "[freelib]"
+ },
+ "0b6da89c21e1dd2093fb26366dd90ffeea635c6a": {
+ "filename": "http://code.jquery.com/jquery-1.7.1.min.js",
+ "result": "[freelib]"
+ },
+ "7c64f79dbeeebaa7accd13bf68302c7adb195d7d": {
+ "filename": "http://code.jquery.com/jquery-1.7.2.min.js",
+ "result": "[freelib]"
+ },
+ "0d7896e2bb23f88e26e52b22a075350b354df447": {
+ "filename": "http://code.jquery.com/jquery-1.7.2.js",
+ "result": "[freelib]"
+ },
+ "0eaabd478dd9538ac53334276b8ff784180140a6": {
+ "filename": "http://code.jquery.com/jquery-1.8.0.js",
+ "result": "[freelib]"
+ },
+ "b567b6dd8cb0cb5c1183e55d2f2d1466f32edb39": {
+ "filename": "http://code.jquery.com/jquery-1.8.2.min.js",
+ "result": "[freelib]"
+ },
+ "229d5537173d1f006b744b014a28f64912988c61": {
+ "filename": "http://code.jquery.com/jquery-1.8.2.js",
+ "result": "[freelib]"
+ },
+ "8b6babff47b8a9793f37036fd1b1a3ad41d38423": {
+ "filename": "http://code.jquery.com/jquery-1.8.3.min.js",
+ "result": "[freelib]"
+ },
+ "49a6d1346f3d5a167331a8a5de4f34b5fcc1f6d0": {
+ "filename": "http://code.jquery.com/jquery-1.8.3.js",
+ "result": "[freelib]"
+ },
+ "002da8cbe90fcf32fbdebb72386125079e3805ee": {
+ "filename": "http://code.jquery.com/jquery-1.9.0.min.js",
+ "result": "[freelib]"
+ },
+ "bfc05b695dfa4f23e11d04b84993585da7a764bf": {
+ "filename": "http://code.jquery.com/jquery-1.9.0.js",
+ "result": "[freelib]"
+ },
+ "6c6f10e003ad0c7f462802c0e6422971577c3532": {
+ "filename": "http://code.jquery.com/jquery-1.8.1.min.js",
+ "result": "[freelib]"
+ },
+ "45efe8797f5a875878fec7fdaaa90d99532dbf16": {
+ "filename": "http://code.jquery.com/jquery-1.8.1.js",
+ "result": "[freelib]"
+ },
+ "ebc4e804054a68c177e9c67cc58e7960d3a8706f": {
+ "filename": "http://code.jquery.com/jquery-1.8.0.min.js",
+ "result": "[freelib]"
+ },
+ "ae49e56999d82802727455f0ba83b63acd90a22b": {
+ "filename": "http://code.jquery.com/jquery-1.9.1.min.js",
+ "result": "[freelib]"
+ },
+ "9257afd2d46c3a189ec0d40a45722701d47e9ca5": {
+ "filename": "http://code.jquery.com/jquery-1.9.1.js",
+ "result": "[freelib]"
+ },
+ "348ab13488f5ab45e048dfb39bb4bc8ed9d840c2": {
+ "filename": "http://code.jquery.com/jquery-1.10.0.js",
+ "result": "[freelib]"
+ },
+ "19715ffee604b54e95a0e9db76f6de2b5125c29e": {
+ "filename": "http://code.jquery.com/jquery-1.10.0.min.js",
+ "result": "[freelib]"
+ },
+ "b39b6f7d8c5f62a40960ded5c40cc288c10b438d": {
+ "filename": "http://code.jquery.com/jquery-1.10.1.js",
+ "result": "[freelib]"
+ },
+ "161b78ec52f28657a835e4a5423f03782fd35806": {
+ "filename": "http://code.jquery.com/jquery-1.10.1.min.js",
+ "result": "[freelib]"
+ },
+ "1d85f0f3464e5e49b0522744bf7314e176ac76d9": {
+ "filename": "http://code.jquery.com/jquery-1.10.2.js",
+ "result": "[freelib]"
+ },
+ "0511abe9863c2ea7084efa7e24d1d86c5b3974f1": {
+ "filename": "http://code.jquery.com/jquery-1.10.2.min.js",
+ "result": "[freelib]"
+ },
+ "6945741107601d402c70a13ce46eb72fd1168bc8": {
+ "filename": "http://code.jquery.com/jquery-1.11.0.js",
+ "result": "[freelib]"
+ },
+ "b66ed708717bf0b4a005a4d0113af8843ef3b8ff": {
+ "filename": "http://code.jquery.com/jquery-1.11.0.min.js",
+ "result": "[freelib]"
+ },
+ "73e5d044bd153dd912930e8be433059454ce19cd": {
+ "filename": "http://code.jquery.com/jquery-1.11.1.js",
+ "result": "[freelib]"
+ },
+ "d6c1f41972de07b09bfa63d2e50f9ab41ec372bd": {
+ "filename": "http://code.jquery.com/jquery-1.11.1.min.js",
+ "result": "[freelib]"
+ },
+ "0be05c714a7e6cf28fe692629ece5b3769901dca": {
+ "filename": "http://code.jquery.com/jquery-2.0.0.min.js",
+ "result": "[freelib]"
+ },
+ "79db35e3a94da9ce724c4d3c8ccc5d1864b23a95": {
+ "filename": "http://code.jquery.com/jquery-2.0.0.js",
+ "result": "[freelib]"
+ },
+ "d193cc22196566fce6b7a54d483f8ca55b38a2f5": {
+ "filename": "http://code.jquery.com/jquery-2.0.1.js",
+ "result": "[freelib]"
+ },
+ "2a35d61baf7dde4a800b08fd7b495a62a8a1e620": {
+ "filename": "http://code.jquery.com/jquery-2.0.1.min.js",
+ "result": "[freelib]"
+ },
+ "37fc3e651159cf6b9353a3f6f3bfe6e5e63e0092": {
+ "filename": "http://code.jquery.com/jquery-2.0.2.js",
+ "result": "[freelib]"
+ },
+ "1e0331b6dd11e6b511d2e3d75805f5ccdb3b83df": {
+ "filename": "http://code.jquery.com/jquery-2.0.2.min.js",
+ "result": "[freelib]"
+ },
+ "ad73590c92b4c3f08d02a0751ba4e4aef658daa0": {
+ "filename": "http://code.jquery.com/jquery-2.0.3.js",
+ "result": "[freelib]"
+ },
+ "fbf9c77d0c4e3c34a485980c1e5316b6212160c8": {
+ "filename": "http://code.jquery.com/jquery-2.0.3.min.js",
+ "result": "[freelib]"
+ },
+ "0fe3e567e0776226ee98326ba8cae7680683c112": {
+ "filename": "http://code.jquery.com/jquery-2.1.0.js",
+ "result": "[freelib]"
+ },
+ "98884258cbdb0d939fa2c5e74fc7ac9e56d8170f": {
+ "filename": "http://code.jquery.com/jquery-2.1.0.min.js",
+ "result": "[freelib]"
+ },
+ "8d55aabf2b76486cc311fdc553a3613cad46aa3f": {
+ "filename": "http://code.jquery.com/jquery-2.1.1.js",
+ "result": "[freelib]"
+ },
+ "afb90752e0a90c24b7f724faca86c5f3d15d1178": {
+ "filename": "http://code.jquery.com/jquery-2.1.1.min.js",
+ "result": "[freelib]"
+ },
+
+ "5f99079e4564f94a1d5e45d22d6dc18acbb148da": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.21/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "a2035b74876c5212cfe3e4e35dfd070e74e8c3fd": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.22/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "2a3fa481079f9e02043810cbeee6b5481abf51c0": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.20/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "0881516b541abe68d79724c08c1a665872f8f2c2": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "85b15aef55b1eede971c7febd0c00ba04dc16edf": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.17/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "d9b48fef067caa58d4e1dec54801c22fe0ea7449": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "990dbb08231ef9c9c59653051f5ac7c1e2185d46": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.15/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "2e140b943f459e383f569227b3e5569f0dbc6f34": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.14/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "53dd39212504739ac18790a4461b9a67c50f2728": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "5cd73db8238d48c08c88f12fe9e5b99b6fa644f7": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.12/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "0c3d725fac553c73368496769ff77c3045103704": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.11/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "e5de581f09ac990adae2b4aede35264f1dc5cd72": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "e1e87320b2d14e36a9bba1b637b5247645df7185": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.19/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "8b71e136c6275d0eeed2b55b9e718a54ce343015": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "c71ddb1b3843c24e909a31595b7e873d7e6da45d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "d5203dbbb97db1a68ca5a3adf265f17cdaea738d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.8/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "1b96be82b697e835b903c6c22799c8e4e55e285c": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "2804fac51308f459c3eb9c3d20e7ee009a8ba31c": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.5/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "5d61b19cbee2f8047f518a58ceff7fdaeeb24921": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "7f7859e006f0644a43a7294b50b39e7e9159b3a2": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "842cb8f83614f6de98f70fa7de2f866eecae7ab4": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.1/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "90fab357529f510e5134ad0dcdad3f654894d4fc": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.3/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "960e36796c42dadf66fafb63bba6087c7d6e1d85": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.0/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "1f102103bea71c5e173a916137c563dc62a97cdb": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "61c88c8898ae6bd653737a9dae52209a98998def": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "b87f7150da2b0811ed143443af4038e3e2d41eda": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.0/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "429282063ca7f3bae9797d70a6f09f2e3e05458a": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "e398b87b98ae72cbee9f7d3044189ea638f3f80c": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.22/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "e9b5baec45507c35477aac5d19afbca8cad92426": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.21/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "431b7ebb5e36d5af5e7890b782789ac983e28d00": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.19/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "680f1bd5b4021dbac8b82d68a818d3a94f097ffd": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "fc4c1a4691f3819ecd16eaefa68f96f764538f1e": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.17/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "1d97dd4111b504abc8f6dee45daf6f358aa40140": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.5.3/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "aff393e11d2122a6026df1e2f75d46de4ead89ff": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.5.2/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "d81b246f0f221f4d9a6eb74a8994c4041d2b7215": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.6.0/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "8e8b0dccbacc70dc6406023be9e35dfa4f3a944e": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "67070ff953d6b0f886083edba723f6d66fa6cbca": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.15/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "6952564ff6404bd93cb523f1634b451ac1cc8fec": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.14/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "b48e01c35c1e6ad622386b9a3161bd1bf02723c8": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "34d32c47711aa10bdeb196c55d489962296a64c4": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.12/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "33f5808531e82f2f6e8859da3a765c4d8a0073d2": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.11/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "973e1554af7d9240e059e38165f2e7b5fc7aa0a5": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "ae74362cdb2fadb2eee6c962f47f1e33af51c79d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.20/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "31d0cb90f7b82088df6c4e00b5765f9dccc48329": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "a192b2ef3371febba192179ff86e3da3f633160d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "db895a7ed5c8b42e27de2b3ef3199d038a259fdb": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.8/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "06adc576409427237ce3c269bb9a568d3cd53c9b": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "8fdfbe7ccaf0bdcde4c0b34738c0cd73b4587a45": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "02d2e4a524b0da52c3cb236619ad065fec44d69a": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.5/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "42936431058c6c4663e64e2c07931b9159083c31": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "bbf7ce8f5ce8d8f9d207f8973328527ac0093b17": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "09fdd3d9aebc9086b27b45b3fb051ebded272b39": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "e002b335c75b5edefcd251962f61f53a2ab8e0f2": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.0/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "b5f2733aac4e257929a5f1ff93410ee0bda311b6": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.3/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "f978dcb9ea6ecfbc7f8a2f9948bacd679c0cd1b4": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "f78ae3cdaf4a6a21dfb2565491f5d295462d8be3": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.1/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "5ed6bdacae842fc530dbc83aabb9a466c7f2b5a1": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.6.0/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "fe810f47883364fbc4dc2c61e03a3aca0f74fed7": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.5.3/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "da851ac384c279992d1855d59257f8d98c603063": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.0/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "5b59bc1a7087c3a83abd5b9ff559a88428ceab0a": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.5.2/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+
+ "0a2054143eddc76447bacf3da455ffc1c726e304": {
+ "filename": "http://yui.yahooapis.com/3.6.0/build/yui-base/yui-base.js",
+ "result": "[freelib]"
+ },
+ "5f47da5d3c8902e763ef6ae02e9307a63a95ae5a": {
+ "filename": "http://yui.yahooapis.com/2.6.0/build/yuiloader/yuiloader-min.js",
+ "result": "[freelib]"
+ },
+ "52ebc252c54e6cdaa9e349e1fea37a2950f6af96": {
+ "filename": "http://yui.yahooapis.com/2.7.0/build/yuiloader/yuiloader-min.js",
+ "result": "[freelib]"
+ },
+ "e77f9c1022bb48425d63cbaf309d7718ff5d3fbd": {
+ "filename": "http://yui.yahooapis.com/2.8.0r4/build/yuiloader/yuiloader-min.js",
+ "result": "[freelib]"
+ },
+ "8f1cfeefecc782f53f411de1bf64c77b48b8ba56": {
+ "filename": "http://yui.yahooapis.com/2.8.1/build/yuiloader/yuiloader-min.js",
+ "result": "[freelib]"
+ },
+ "aa113da84ddbad46a8002ea22393a238eccf9ee4": {
+ "filename": "http://yui.yahooapis.com/2.9.0/build/yuiloader/yuiloader-min.js",
+ "result": "[freelib]"
+ },
+ "a4fadcd6f68d7823a9fd9d1f6089025041a3212a": {
+ "filename": "http://yui.yahooapis.com/2.8.2/build/yuiloader/yuiloader-min.js",
+ "result": "[freelib]"
+ },
+ "c398b7eab95bfe84816f60311eaf91194f3bfec8": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/aes.js",
+ "result": "[freelib]"
+ },
+ "a7eba31001379f751d1a54b988ccdb500d873ec1": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/enc-base64.js",
+ "result": "[freelib]"
+ },
+ "9bdf0dfad487422fd36693d4119b59175f0112ee": {
+ "filename": "http://yui.yahooapis.com/2.8.1/build/yuiloader/yuiloader.js",
+ "result": "[freelib]"
+ },
+ "d9f710afddaba467707c0d6e7b187a8beae1e1f2": {
+ "filename": "http://yui.yahooapis.com/2.8.2/build/yuiloader/yuiloader.js",
+ "result": "[freelib]"
+ },
+ "5f8d372d7b385588f61dd53c588608f47a3c3b60": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/enc-utf16.js",
+ "result": "[freelib]"
+ },
+ "4dc6c77a03258ee7fbe5e877a1ed97311bc45652": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject_src.js",
+ "result": "[freelib]"
+ },
+ "5847ed101f55d51c53538a7078971e7de8fb6762": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js",
+ "result": "[freelib]"
+ },
+ "fe91b37266d1cdb4b4f51297f69326e271704f35": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.3.1/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "493afa22594fdff6e6fc4f21f99c626533c35b06": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.3.0/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "9fa29ea8f3ec6714b3b6236eb2ce6e1ce905c560": {
+ "filename": "http://yui.yahooapis.com/2.6.0/build/yuiloader/yuiloader.js",
+ "result": "[freelib]"
+ },
+ "1523029ce227a35976407408c5d08039c8fe4f0e": {
+ "filename": "http://yui.yahooapis.com/2.7.0/build/yuiloader/yuiloader.js",
+ "result": "[freelib]"
+ },
+ "9514b1927292acf4c670fae6492e9ce2e263472f": {
+ "filename": "http://yui.yahooapis.com/2.8.0r4/build/yuiloader/yuiloader.js",
+ "result": "[freelib]"
+ },
+ "6b911b0dc178423b946b0299851d9661004c21ef": {
+ "filename": "http://code.jquery.com/jquery-1.4.1.js",
+ "result": "[freelib]"
+ },
+ "65cbff4e9d95d47a6f31d96ab4ea361c1f538a7b": {
+ "filename": "http://code.jquery.com/jquery-1.4.2.min.js",
+ "result": "[freelib]"
+ },
+ "f02e1f7f1bb966d5fcf16b03daa79ee077a993f8": {
+ "filename": "http://code.jquery.com/jquery-1.4.js",
+ "result": "[freelib]"
+ },
+ "b9c72aa78de3c124248f30234c64bf6f3b1a7cb5": {
+ "filename": "http://code.jquery.com/jquery-1.1.3.pack.js",
+ "result": "[freelib]"
+ },
+ "bff995d3a845903f281b0b51fea421059459a808": {
+ "filename": "http://code.jquery.com/jquery-1.4.1.min.js",
+ "result": "[freelib]"
+ },
+ "b5efe44645f5358e3d785091af3440f80afa85e3": {
+ "filename": "http://code.jquery.com/jquery-1.4.min.js",
+ "result": "[freelib]"
+ },
+ "0e9545b59077541c44f521769243a8b717d83aae": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.5/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "e80905e4a45e31075b89189f5ba4913fc0451fdf": {
+ "filename": "http://yui.yahooapis.com/2.9.0/build/yuiloader/yuiloader.js",
+ "result": "[freelib]"
+ },
+ "80494ad8eb98e317ffec3671b00944cdc30cee02": {
+ "filename": "http://yui.yahooapis.com/3.4.0/build/yui-base/yui-base-min.js",
+ "result": "[freelib]"
+ },
+ "83d1b489e30275a03f568f7e3fa6537d695e0197": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.pack.js",
+ "result": "[freelib]"
+ },
+ "e956e4de8f223992e2d1362d78c5b5bb33e27497": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.4/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "3c737636f4789a45b73f5365cd4cfc8c0922f458": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/hmac.js",
+ "result": "[freelib]"
+ },
+ "42a8029d12e24767778fc1c6d978b4696b445524": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/mode-cfb.js",
+ "result": "[freelib]"
+ },
+ "14682f01c5c15f8656cb01425487ad675676df8e": {
+ "filename": "http://yui.yahooapis.com/3.5.1/build/yui-base/yui-base-min.js",
+ "result": "[freelib]"
+ },
+ "e1ae2c72f8c5e1b6c423c015349a476f8a908b22": {
+ "filename": "http://yui.yahooapis.com/3.4.1/build/yui-base/yui-base-min.js",
+ "result": "[freelib]"
+ },
+ "ca0aea084a63d0a56e1bbf17fde5061f631b391f": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.1.pack.js",
+ "result": "[freelib]"
+ },
+ "265a86a9d9df5dfdbad77e06c85605bec4beb32a": {
+ "filename": "http://code.jquery.com/jquery-1.4.2.js",
+ "result": "[freelib]"
+ },
+ "a2358d630d1a5dad24b679d52e9777b7349910b2": {
+ "filename": "http://yui.yahooapis.com/3.5.0/build/yui-base/yui-base-min.js",
+ "result": "[freelib]"
+ },
+ "65fe3b80fae349ecb3acd6541ef651d1ff4961f6": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.1/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "66851ab2133e27b97c4f3048416b947aa7ed82c5": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/swfobject/2.1/swfobject.js",
+ "result": "[freelib]"
+ },
+ "08f37f8169e620c6ecd87635c18fc2b22e3e850e": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/scriptaculous.js",
+ "result": "[freelib]"
+ },
+ "28780fdb8fc54bf7d80b1f223abca4f77cd89e85": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/swfobject/2.1/swfobject_src.js",
+ "result": "[freelib]"
+ },
+ "00a5e26ff9ed4b84fc93c764225684c33588a41e": {
+ "filename": "http://yui.yahooapis.com/3.6.0/build/yui-base/yui-base-min.js",
+ "result": "[freelib]"
+ },
+ "fe56013bb04c602e676feb34bb49add4da2e0225": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.3/scriptaculous.js",
+ "result": "[freelib]"
+ },
+ "6c445baf655cccb16ee2788714827ab186ed94bf": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.2/scriptaculous.js",
+ "result": "[freelib]"
+ },
+ "74974f9dc0810ea359367589cb273dd5174d80df": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.1/scriptaculous.js",
+ "result": "[freelib]"
+ },
+ "c7e9c7f2fb17e0d2ca2391e33007bf3547fec465": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/prototype/1.7.1.0/prototype.js",
+ "result": "[freelib]"
+ },
+ "d97ecac3f1b3ccf1f0f68434e8406f87f5acc907": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.2.min.js",
+ "result": "[freelib]"
+ },
+ "97be02d1785b7bb4f41ae116a6a9bef74cb018d6": {
+ "filename": "http://code.jquery.com/jquery-1.4.3.min.js",
+ "result": "[freelib]"
+ },
+ "6a7a7d88fa4e7369003de24164f5961852731e0e": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/mode-ctr.js",
+ "result": "[freelib]"
+ },
+ "d65a39fc4b09df061a30172f080019ef9d800ca4": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/mode-ecb.js",
+ "result": "[freelib]"
+ },
+ "427300f82762288c5af967dbf642fbec58c201ea": {
+ "filename": "http://code.jquery.com/jquery-1.4.4.js",
+ "result": "[freelib]"
+ },
+ "94ec4a3bcd6b30353584026c0e109e79fb21b6ad": {
+ "filename": "http://code.jquery.com/jquery-1.5.min.js",
+ "result": "[freelib]"
+ },
+ "71adcc2cae87e412e521e4a7276efeaee2347927": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.2.js",
+ "result": "[freelib]"
+ },
+ "677c1ad6d84705c818d63a43298ee3a12959c1b3": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.3.pack.js",
+ "result": "[freelib]"
+ },
+ "3d542e33a9f3eb3cb45e06fe93d08dd4b7490496": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/prototype/1.7.0.0/prototype.js",
+ "result": "[freelib]"
+ },
+ "e70997dd3dbadadebf375908515617059d0c597e": {
+ "filename": "http://yui.yahooapis.com/3.4.1/build/yui-base/yui-base.js",
+ "result": "[freelib]"
+ },
+ "b3db6906c1c0641b7a3098e547e0a8039accd80a": {
+ "filename": "http://yui.yahooapis.com/3.5.0/build/yui-base/yui-base.js",
+ "result": "[freelib]"
+ },
+ "cc66556593e147584f19b41b697405f828f7562e": {
+ "filename": "http://code.jquery.com/jquery-1.5.js",
+ "result": "[freelib]"
+ },
+ "c147a1a86a2c33e60f160b8861501f43f4638c8d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js",
+ "result": "[freelib]"
+ },
+ "d45787e64e233eb17f3f1492b12a682f294f866a": {
+ "filename": "http://code.jquery.com/jquery-1.5.1.min.js",
+ "result": "[freelib]"
+ },
+ "278d68b8e9edad4895836e272fbc8f78ec4f2f3e": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/prototype/1.6.0.3/prototype.js",
+ "result": "[freelib]"
+ },
+ "b98bb654c88a9b7da659fe8dad95a5c7376bb166": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/md5.js",
+ "result": "[freelib]"
+ },
+ "6463e558dd79d51a2e8464806824c7bbc18c77fd": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.3.min.js",
+ "result": "[freelib]"
+ },
+ "5cc87d3fcd5cb3c5913c08bad17ff80f4d0d7f46": {
+ "filename": "http://yui.yahooapis.com/3.4.0/build/yui-base/yui-base.js",
+ "result": "[freelib]"
+ },
+ "333b6d92a99eac873b1de2045c670fbdb61970ab": {
+ "filename": "http://yui.yahooapis.com/3.5.1/build/yui-base/yui-base.js",
+ "result": "[freelib]"
+ },
+ "522f0852b91775306ca47138c1d6ceeb87677880": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/mode-ofb.js",
+ "result": "[freelib]"
+ },
+ "4407f7b9602539e80f1569ae734696fd92deeff0": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/pad-ansix923.js",
+ "result": "[freelib]"
+ },
+ "c82ea9768b18696832408b6cc729e2e121def691": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.3.js",
+ "result": "[freelib]"
+ },
+ "0d2bc9db63acd9cc238a4925e79f9a3079490970": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.4.min.js",
+ "result": "[freelib]"
+ },
+ "5900300a75ed7917eaa6f75077afe9ef49e66986": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js",
+ "result": "[freelib]"
+ },
+ "2cc787ebd4d29f2e24646f76f9c525336949783e": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.5/mootools.js",
+ "result": "[freelib]"
+ },
+ "a965003ea3313be11a02743f4807411c9eb71f04": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/pad-iso10126.js",
+ "result": "[freelib]"
+ },
+ "3bb92e84642c03cf0fe49174d0e1c420d46d2e18": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.4.js",
+ "result": "[freelib]"
+ },
+ "325edd57857f7a3160cfe2512dff5526d7e647db": {
+ "filename": "http://code.jquery.com/jquery-1.6.min.js",
+ "result": "[freelib]"
+ },
+ "034970f98cb529c779c8f961b2b7c09ecb499240": {
+ "filename": "http://code.jquery.com/jquery-1.6.js",
+ "result": "[freelib]"
+ },
+ "341a7a52109c3abfb23d5a5b4f363fd8d6a52f6c": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/pad-iso97971.js",
+ "result": "[freelib]"
+ },
+ "c654cdaa3ca1184d9b18d0c31f8369a04c63f7f5": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/pad-nopadding.js",
+ "result": "[freelib]"
+ },
+ "20860bad9c83c3890be57052f009b9d97848c9ec": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.5.min.js",
+ "result": "[freelib]"
+ },
+ "6111fcf6c2277eba8821ca365dbbea472a3206e7": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.4/mootools.js",
+ "result": "[freelib]"
+ },
+ "9025fe9334566eb919ddca85a8f949b01c7d837d": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.5.pack.js",
+ "result": "[freelib]"
+ },
+ "0e9a07ee104153a459cdbcb9fa28293b4bbb429f": {
+ "filename": "http://code.jquery.com/jquery-1.6.1.min.js",
+ "result": "[freelib]"
+ },
+ "e55462193a857ffe36e42bfcbecfebf1ca33d0b8": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.3.2/mootools.js",
+ "result": "[freelib]"
+ },
+ "7df0e9aae795337db012b3efd0b9ee9cc7719b56": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.3.0/mootools.js",
+ "result": "[freelib]"
+ },
+ "8963108fa84c2033a1052d47079d7f75a7e5b60e": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.5.js",
+ "result": "[freelib]"
+ },
+ "aa7020d6c8d5475ae588640954caa9e4cdd7eca0": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/pad-zeropadding.js",
+ "result": "[freelib]"
+ },
+ "1be9c3684054001f53fa7ff6d85ec3cb573a9cd2": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js",
+ "result": "[freelib]"
+ },
+ "e0f3225498158bc63af7bfba636b091ea4ee5fcd": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/pbkdf2.js",
+ "result": "[freelib]"
+ },
+ "c415b533f7edda8b9de417cc0517904f86e9fe1f": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/rabbit.js",
+ "result": "[freelib]"
+ },
+ "c10dbe0c2b23444d0794f3376398702d84f41583": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.6.pack.js",
+ "result": "[freelib]"
+ },
+ "f4d4125bcd5151aad69dd849a11fc1ca589cc64b": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.3.1/mootools.js",
+ "result": "[freelib]"
+ },
+ "4ee6675ca57dda3255aa669d8ec4d35760eb47c3": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.0/mootools.js",
+ "result": "[freelib]"
+ },
+ "0c89448016629bb2ea758f4e98529c2e166a122d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.1/mootools.js",
+ "result": "[freelib]"
+ },
+ "b4096385cad3144e81c255aa6e4b7dabb30bc19f": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/rc4.js",
+ "result": "[freelib]"
+ },
+ "037f4fadbc2020ccb4935384b8ae5af62bdd0145": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/sha1.js",
+ "result": "[freelib]"
+ },
+ "bc018ec49a5c7757577bb63e5d5f8a99be0e3954": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.2/mootools.js",
+ "result": "[freelib]"
+ },
+ "aa5c283b9e094eeacdd080b44951406abbc9e58c": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/sha224.js",
+ "result": "[freelib]"
+ },
+ "6dc7644a54d5cc254a1f6d7cb7154128b2b6570a": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.3/mootools.js",
+ "result": "[freelib]"
+ },
+ "c0c37b7d3119f29d3759fdaf7eb8bc4670ea9e7f": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.1.1/mootools.js",
+ "result": "[freelib]"
+ },
+ "b38f741b43f6ddcce3f1b47274d1683cca9f07a8": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/sha256.js",
+ "result": "[freelib]"
+ },
+ "e29701dd85d792bddbf52d1e1fc3d1ada41b6192": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/sha384.js",
+ "result": "[freelib]"
+ },
+ "cc019ac09f68258ee3442fe7cc440adf78a3cef2": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.5/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "e88bb2c302b41a4cc5b97604354a48d068e3e1eb": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/sha512.js",
+ "result": "[freelib]"
+ },
+ "fc39ed8ca4a58668124471e509506443de4467f2": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.4/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "b1a271458ae47d0b47c9e0996956091a93dec16f": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.1/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "86f0df8662b511142dfc4e0ce9c81d805c8d7a7e": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.0/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "e0bfed3ffc741a9f4e59e6004a1dec9c71241a59": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/x64-core.js",
+ "result": "[freelib]"
+ },
+ "fc21f8084ad4040ddbf620ba79acd3998fb3dc7b": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.3.2/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "1e8f9e1614db771782bc9e871fb712b06610b9f4": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.2/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "c7e2076a3af9997731499bc1f7dc3941b522c1eb": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.3/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "dd7783b4c8d4ecaad4091d1d32df2f97d7b10ddc": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.1.2/mootools.js",
+ "result": "[freelib]"
+ },
+ "55bba460dcbb70562536ddd5c8734b311f38c42d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.1/mootools.js",
+ "result": "[freelib]"
+ },
+ "3c1ddf62af20a1f5c5de7a3af180b32528dc47db": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.2/mootools.js",
+ "result": "[freelib]"
+ },
+ "c43a38fce1aa745d59b1a6f7ab7def81f28701a4": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.3/mootools.js",
+ "result": "[freelib]"
+ },
+ "e5335c2a82f26e49b1324edc21e452de040d5cdc": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.4/mootools.js",
+ "result": "[freelib]"
+ },
+ "ccf015fcd45618c6b116977c96539d93ee10b542": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/tripledes.js",
+ "result": "[freelib]"
+ },
+ "3d9fc65389ce7de16f87909039aa2e728c693b3d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.5/mootools.js",
+ "result": "[freelib]"
+ },
+ "5f970c3c8ca26a94c14a1ae1e7321621cf4eae0c": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.1.2/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "03a65e56fc95caea1b85a591c984e9b6c080726d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.1.1/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "669d164e3bff6156b21084cf035979d62433df75": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.2/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "f3e20ad41082a93dbd09202590717da71aebd316": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.3/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "8dda5f159c9bedee9f4a6b7a7a6028a554977994": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.4.3/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "15c3f73c75bb3ab87040fe55240f9dd5ea69b6bf": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/ext-core/3.1.0/ext-core-debug.js",
+ "result": "[freelib]"
+ },
+ "5c83aac1a3409dc1ec3a228e4c765292eb4434d4": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/ext-core/3.0.0/ext-core-debug.js",
+ "result": "[freelib]"
+ },
+ "7dc1b4f3e358c58030c4676c990eff60a0fc838f": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/ext-core/3.1.0/ext-core.js",
+ "result": "[freelib]"
+ },
+ "d19d40a20252730e9fd9af1c7867c0f5417ebe32": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/ext-core/3.0.0/ext-core.js",
+ "result": "[freelib]"
+ },
+ "e1db767afb82018ab6a695fe52334f2f5d81a0e3": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "a90b5f6afb6c78b30c3539392d49e45fd9dfe3d9": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.5.1/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "0a0a820f2bc4f2dac8dcfde2282411275e2dc697": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.5/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "b6d2c0b655b327407966b52303449dedce084ded": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.4.3/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "4cc838a3be933fda21bbbfc8f52b01e14a1e70a5": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.4.1/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "2ef4341a4ca0b9a0fc1aea422d85b5d9771fde87": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.4.0/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "df435b881e8364ddfbd44d5f786b10c75f964175": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.3.2/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "19214655c4152b79f204e222a481d1e18da84972": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.3.1/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "f444ee6b041735ee6109dd2fe3c3a7755fa949f7": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.3.0/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "c7f5b42b2306a79f67988ee073ac98c2a1d5782f": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.2.3/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "d8afec39893c1a99139212feb40888847f8a5253": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.2.0/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "a6edefef305d9164212fa140426629c7d8a58c93": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.1.1/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "a3e5c42f93722ad28cda811f8635bddf213819ed": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "741b8eeb65774256a8a76ea1af91f976357fcd81": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.5.1/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "911a35988b8540414cfbc990fbc112eb124fd968": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.5/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "c753cf372377ef0b5a18204cd86df8d4792fa8f5": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.4.1/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "8b95d59f6b28b072ceb4228a6db107b934500a02": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.4.0/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "8c135fc57355fe5d5a18f3dbe5736bc772bb20a7": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.3.2/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "70b1fe9dd4ebec0b5d417647e549bca8f9200020": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.3.1/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "8980e43d4750c63eb57cfff5f0723f118d243c67": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.3.0/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "d2fc56e1b9f2014fb7710d186a355a57e3acd283": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.2.3/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "2bab42610adee25cdc0d3a4ba96b94f1e9ccd115": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.2.0/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "6bb906d86dd239add79d0779a9fcdf9740aa7e3b": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.1.1/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "3d96f61e48510cbe595081ef8b2d5c8479f95d3e": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.7.1/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "1e4cb0dcb97df9a15433477f9f8a666914eedc3c": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.7.0/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "47732fb5e03d251aff1a7c0b550a3af74c7ceea5": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.7.3/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "85399dd9527026afc66a6fb43ad5c0d4ea97f83e": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.7.2/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "147eab514dfe1d88506a5e158b782cb5c504c056": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.8.0/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "229e4025f71b0b94d98505f56c5cfd7cd41d06aa": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.7.3/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "135ade1e60da3e3b79fd73c3a6a005a250e2a7f7": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.8.0/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "135188b624daae8f4b015b0b8b75875a6132aa3d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.7.1/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "fac80a6188865418344d4b6c5d4955ee7e7362c2": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.7.0/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "311d8f38b12a09f16f5a19e1dfb6575b5ce0f83c": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.7.2/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "ca2868985811d45cfbad118a297869707572e0bb": {
+ "filename": "https://raw.github.com/voldsoftware/toolbarbutton-jplib/stable/lib/toolbarbutton.js",
+ "result": "[freelib]"
+ },
+ "32d542564913a016f1cea340ba8ac164c160004d": {
+ "filename": "http://yui.yahooapis.com/3.3.0/build/yui-base/yui-base.js",
+ "result": "[freelib]"
+ },
+ "012cc186912c473552a341b2eaffb71240688ccd": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/cipher-core.js",
+ "result": "[freelib]"
+ },
+ "d1c9d4d91c1c3c76f601778cb5e0489e0f80a10d": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/evpkdf.js",
+ "result": "[freelib]"
+ },
+ "794503310ed31a11f233e1acdddc10f2ce91748e": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/core.js",
+ "result": "[freelib]"
+ },
+ "5717e22c3b2c7caf870fc0772a64344962b59ee6": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.6/underscore.js",
+ "result": "[freelib]"
+ },
+ "7e0294019938a772f4ddd7799501496074e0f0fb": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.7/underscore.js",
+ "result": "[freelib]"
+ },
+ "28e41c3ce9232633468013342c49fd62a4f5f6bd": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.2/underscore.js",
+ "result": "[freelib]"
+ },
+ "8d84b347dfe4f5b75f7b5f670326ca5c8041b7a9": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.3/underscore.js",
+ "result": "[freelib]"
+ },
+ "9564fa7a6a001e4e56b0244ccda03eef3940813e": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.3/underscore.js",
+ "result": "[freelib]"
+ },
+ "058cbd179f032f667823545519aa2d10b0b69508": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.2/underscore.js",
+ "result": "[freelib]"
+ },
+ "868141351efa758d031779c776e608e3a049d823": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.4/underscore.js",
+ "result": "[freelib]"
+ },
+ "2fee700150a7de876acc21403f77e57dae2f5618": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.5/underscore.js",
+ "result": "[freelib]"
+ },
+ "40946800c5c8bee189ca3e7f8017661f9456e490": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.0/underscore.js",
+ "result": "[freelib]"
+ },
+ "b842a8ca5e996e001e648fc8c73316cd55e496ed": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.4/underscore.js",
+ "result": "[freelib]"
+ },
+ "f2fa9179d764f6a688dc0c99b1b5283f1b680249": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.1/underscore.js",
+ "result": "[freelib]"
+ },
+ "c1dff1c5dbb68af6e22bd401afd28aab970a8aff": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.3/underscore.js",
+ "result": "[freelib]"
+ },
+ "5846c870e0f1daca152db22277915adb6520ffa3": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.0/underscore.js",
+ "result": "[freelib]"
+ },
+ "cdacc2b0045fa1b920b64664b88b155d0c0df169": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.2/underscore.js",
+ "result": "[freelib]"
+ },
+ "baa693e82387a328abccf9694c6d2db571ac8aca": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.3.3/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "e67cf6a985999c7ef5595772e4ffefeacd0c6ac3": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.1/underscore.js",
+ "result": "[freelib]"
+ },
+ "0a15952061f6fb7a5493281f6ff8eb916a417e2f": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.3.1/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "bd9624f882f7d3d29292ddc7f484987b3e991cb5": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.3.0/underscore.js",
+ "result": "[freelib]"
+ },
+ "ede1d022640f26eaa6109da9e924670f6ed14cce": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.3.2/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "63f6a94752e5fde78627529763e67ecd4ef78f12": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.4/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "1185da1043863517c6aa0a4e0a3bc433dfb98313": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.2/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "86752ba2e4f3855a8a5e45d5f07567ea70a9cc98": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.3.0/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "cfbc3fa20d685d100308e123c3310dc9600ef0fd": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.3/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "083bbcd739b7b1336f13c72603e1704b164c02bd": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.1/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "f665459959c5167c0905974a62ffe923f2c19813": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.5/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "2de2ecea5ba12e7235ffb44d6892cc77fe6f4abe": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.4/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "81afb4cd3755671fea5e74d7118d7d460c475308": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.7/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "9e389ede8ed7f782c5ecf2f87c3afa3b1e309bff": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.3/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "703d6a61f31ddb45252c55813556a92e8cc2ee22": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.6/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "7d6e352b0d26655ba851863561b5d912cc24caa7": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.0/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "5de53da57fc8b7ab6c77d597c22875d747352fef": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.1/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "bcdd63e18a8a7cf728253f738556ad3b88d74649": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.2/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "ee68308411c690cd51cc8a43fe6ae60d3d1678af": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.4/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "49a747d3284b1d04f3eb823a4188f7725004f823": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.0/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "97f93241957893ebd7febc5b5bac9a7bd1d94a0f": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.3/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "710c3a99f0bd456c2fd6dcbcbd1e500e0646ec19": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.1/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "7361e8afa72bd0098e2520584786474c9c4a5064": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.2/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "ad0775c89a87111019840dc7bbf902d832e4ccdf": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.0/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "34454bfed864addf8ec4aacdd9adf872f8360ed3": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.3.1/underscore.js",
+ "result": "[freelib]"
+ },
+ "07916c0b7274275f916fe288d01b254545b17d9a": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.4/underscore.js",
+ "result": "[freelib]"
+ },
+ "133de2283d03193cb06f62f92c494afe098460a5": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.0/underscore.js",
+ "result": "[freelib]"
+ },
+ "4c977634c87efbd2b7113993d36dad603b8dcf2f": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.1/underscore.js",
+ "result": "[freelib]"
+ },
+ "3fa74bb289537fcdee796b26968e47d53d38f903": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.3.2/underscore.js",
+ "result": "[freelib]"
+ },
+ "772b2587aa2fa345fb760eff9ebe5acd97937243": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.3.3/underscore.js",
+ "result": "[freelib]"
+ },
+ "562c6c44b39809ec07c047f4ed6c591f3ae7c034": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.4.0/underscore.js",
+ "result": "[freelib]"
+ },
+ "063a7d75792dff2b46eee81cc12de63def672911": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.4.1/underscore.js",
+ "result": "[freelib]"
+ },
+ "47479149fe12fc56685a9de90c5a9903390cb451": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.4.2/underscore.js",
+ "result": "[freelib]"
+ },
+ "d53fbd7308ae3d7eeb4a536c2cbfe739648850b4": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.4.3/underscore.js",
+ "result": "[freelib]"
+ },
+ "6d9ee62759cb911ec03b21078c9f92f0f2afa25c": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.4.4/underscore.js",
+ "result": "[freelib]"
+ },
+ "5d42ed92480d3a88efa270449f38c6d88d653af5": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.5.0/underscore.js",
+ "result": "[freelib]"
+ },
+ "9ee15c1f1a84a258ba5f48de72da3538c8b7c375": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.5.1/underscore.js",
+ "result": "[freelib]"
+ },
+ "c9ae7b502c521d2f53b9065ef4fc7d7cc97dce4c": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.5.2/underscore.js",
+ "result": "[freelib]"
+ },
+ "fe1b87838b7328273812380d26837f58348103b0": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.6.0/underscore.js",
+ "result": "[freelib]"
+ }
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/beta-ribbon-cropped.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/beta-ribbon-cropped.png
new file mode 100644
index 0000000..738a0ea
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/beta-ribbon-cropped.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/beta-ribbon.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/beta-ribbon.png
new file mode 100644
index 0000000..3ba267b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/beta-ribbon.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/button-download.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/button-download.png
new file mode 100644
index 0000000..5ca5430
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/button-download.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/collapsed-nonfree.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/collapsed-nonfree.png
new file mode 100644
index 0000000..0790b1b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/collapsed-nonfree.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/expanded-nonfree.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/expanded-nonfree.png
new file mode 100644
index 0000000..0d8bc70
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/expanded-nonfree.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/libre.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/libre.png
new file mode 100644
index 0000000..8042caa
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/libre.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/librejs-running-blocked-wikipedia.jpg b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/librejs-running-blocked-wikipedia.jpg
new file mode 100644
index 0000000..c54d839
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/librejs-running-blocked-wikipedia.jpg
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/logo-medium.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/logo-medium.png
new file mode 100644
index 0000000..0bb6eb2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/logo-medium.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/index.html b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/index.html
new file mode 100644
index 0000000..5bbc3aa
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/index.html
@@ -0,0 +1,131 @@
+<!doctype html>
+<html lang="en">
+
+ <head>
+ <meta charset="utf-8" />
+ <title>LibreJS | Whitelist </title>
+
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
+
+ <!-- Your styles -->
+ <link rel="stylesheet" href="styles/styles.css" type="text/css" media="screen" />
+ <script type="text/javascript">
+ /**
+ *
+ * @licstart The following is the entire license notice for the
+ * JavaScript code in this page.
+ *
+ *
+ * Copyright (C) 2011, 2014 Loic J. Duros
+ *
+ * The JavaScript code in this page is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GNU GPL) as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option)
+ * any later version. The code is distributed WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
+ *
+ * As additional permission under GNU GPL version 3 section 7, you
+ * may distribute non-source (e.g., minimized or compacted) forms of
+ * that code without the copy of the GNU GPL normally required by
+ * section 4, provided you include this license notice and a URL
+ * through which recipients can access the Corresponding Source.
+ *
+ *
+ *
+ * @licend The above is the entire license notice
+ * for the JavaScript code in this page.
+ *
+ *
+ *
+ */
+ </script>
+ <!-- Bootstrap CSS (APL 2.0)-->
+ <link href="third-party/bootstrap/css/bootstrap.min.css" rel="stylesheet" media="screen">
+ <link href="third-party/jquery-ui/css/ui-lightness/jquery-ui.theme.min.css" rel="stylesheet" media="screen">
+
+ <link media="screen" rel="stylesheet" href="styles/form.css">
+ <script src="third-party/jquery/jquery.min.js"></script>
+ <script src="third-party/jquery-ui/js/jquery-ui.min.js"></script>
+ <script src="third-party/bootstrap/js/bootstrap.min.js"></script>
+
+ <link href="third-party/editable/bootstrap-editable/css/bootstrap-editable.css" rel="stylesheet">
+ <script src="third-party/editable/bootstrap-editable/js/bootstrap-editable-inline.min.js"></script>
+ <script src="third-party/block-ui/jquery.blockUI.js"></script>
+ <!--<script src="js/form-types.js"></script>-->
+ <script src="js/form-row.js"></script>
+ <style>
+ #rules button {
+ margin-top:0 !important;
+ }
+ .drag-handle {
+ cursor:pointer;
+ }
+ #loadingBox {
+ display:none;
+ }
+ </style>
+
+ </head>
+
+ <body>
+ <header id="site-header">
+ <div class="container">
+ <hgroup class="row">
+ <h1><a id="logo" target="_blank" href="http://www.gnu.org/s/librejs/" title="LibreJS -- Free JavaScript in your browser">LibreJS -- Free JavaScript in your browser</a></h1>
+ </hgroup>
+ </div>
+ </header>
+
+ <div id="main">
+ <div id="promotional">
+ <div class="container">
+
+ <div class="row">
+
+ <div class="span12">
+ <div class="page-header">
+ <h1>LibreJS | Whitelist</h1>
+ </div>
+ <div>
+ <button class="deleteall btn">reset whitelist to default.</button>
+ <table style="max-width:800px" id="whitelist" class="table table-bordered table-striped">
+ <thead>
+ <tr>
+ <th class="rule-type">JavaScript contents hash-code</th>
+ <th class="url">Found at URL</th>
+ <th class="reason">Reason</th>
+ <th class="delete-rule">Delete script from whitelist</th>
+ </tr>
+ </thead>
+ <tbody>
+
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+
+ </div>
+ <div id="loadingBox"><img src="images/ajax-loader.gif"/></div>
+
+ </div>
+ <div id="banners" class="row">
+ <div class="twelvecol">
+ <a href="http://www.gnu.org/philosophy/free-sw.html"><img src="images/libre.png"></a>
+
+ </div>
+ </div>
+
+ </div>
+ <footer>
+ <p class="copyrights">
+ Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros<br/>
+ </p>
+ </footer>
+
+ </body>
+
+</html>
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/form-row.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/form-row.js
new file mode 100644
index 0000000..13390eb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/form-row.js
@@ -0,0 +1,110 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var GenerateForm = {
+ $trContainer: null, // will jQuery element for rules table tboby
+
+ le: 0,
+
+ init: function () {
+ var that = this;
+ $(document).ready(function (e) {
+ that.$trContainer = $("#whitelist").children('tbody');
+
+ // listen for when data is ready to populate form.
+ document.documentElement.addEventListener(
+ "populate-form",
+ function (event) {
+ //console.log("populate-form event triggered in form-row.js");
+ that.populateForm(event.detail.data);
+
+ }, false);
+ that.$trContainer.on("click", ".delete", function (event) {
+ that.deleteRow($(this));
+ });
+ $('deleteall').click(function (e) {
+ that.deleteAll();
+ });
+ });
+ },
+
+ deleteAll: function () {
+ event.initCustomEvent("librejs-settings-change", true, true, {event: 'rules-form-delete-all', value: ''});
+ },
+
+ deleteRow: function ($button) {
+ var hash = $button.parents('tr').children('.hash').text();
+ //console.log("hash is", hash);
+ this.le--;
+ this.changeTitle();
+ $button.parents('tr').remove();
+ var event = document.createEvent("CustomEvent");
+ event.initCustomEvent("librejs-settings-change", true, true, {event: 'rules-form-delete', value: hash});
+ document.documentElement.dispatchEvent(event);
+ },
+
+ createRow: function (key, url, reason) {
+
+ var $tr = $("<tr/>");//.addClass('sortable');
+ var $td = $('<td/>').addClass('hash').text(key);
+ var $delete, $button;
+ $tr.append($td);
+ $td = $('<td/>').append($('<a/>').attr({"href": url,
+ "target": "_blank"}).text(url));
+ $tr.append($td);
+ $td = $('<td/>').text(reason);
+ $tr.append($td);
+
+ //$tr.append($('<td/>').append("<span class='drag-handle ui-icon ui-icon-arrowthick-2-n-s'>drag</span>"));
+ $delete = $("<td/>");
+ $button = $("<button/>").addClass("delete btn").attr({'value': 'delete'}).text("delete");
+ $delete.append($button);
+ $tr.append($delete);
+ return $tr;
+ },
+
+ appendNewRow: function (key, rowData) {
+ if (key && rowData !== undefined) {
+ //console.log(rowData);
+ this.$trContainer.append(this.createRow(key, (rowData.filename || rowData.url), (rowData.result.reason || "no reason recorded")));
+ }
+ },
+ clearForm: function () {
+ $('#whitelist').children('tbody').empty();
+ },
+ changeTitle: function () {
+ var tt = this.le + " scripts whitelisted";
+ $('div.page-header h1').text(tt);
+ $('title').text(tt);
+ },
+ populateForm: function (data) {
+ var key;
+ this.le = Object.keys(data).length;
+ this.changeTitle();
+ //console.log("populateForm triggered");
+ this.clearForm();
+ for (key in data) {
+ this.appendNewRow(key, data[key]);
+ }
+
+ }
+};
+
+GenerateForm.init();
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/form-types.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/form-types.js
new file mode 100644
index 0000000..3d0d6de
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/form-types.js
@@ -0,0 +1,150 @@
+/**
+ * Permafrost - Protect your privacy!
+ * *
+ * Copyright (C) 2012 2013 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+/*jslint indent: 2 */
+/*jslint white: false */
+/*jslint eqeq: true */
+/*jslint plusplus: true*/
+/*global clearInterval: false, clearTimeout: false, document: false, event: false, frames: false, history: false, Image: false, location: false, name: false, navigator: false, Option: false, parent: false, screen: false, setInterval: false, setTimeout: false, window: false, XMLHttpRequest: false */
+
+var FORM_TYPES;
+
+/* constructor for form types options */
+function FormType(options) {
+ "use strict";
+ var item;
+ for (item in options) {
+ this[item] = options[item];
+ }
+}
+
+FormType.prototype = {
+ onblur: 'submit',
+ showbuttons: true,
+ pk: null,
+ name: null,
+ value: null,
+ url: function (params) {
+ "use strict";
+ // see https://addons.mozilla.org/en-US/developers/docs/sdk/latest/dev-guide/guides/content-scripts/communicating-with-other-scripts.html#Using%20Custom%20DOM%20Events for information on this.
+ FORM_TYPES.triggerEvent({'event': 'rules-form-update', 'value': params});
+
+ }
+};
+
+
+FORM_TYPES = {
+
+ patternPlaceholder: 'Enter wildcard patterns or regular expression ' +
+ 'patterns, one per line',
+
+ ruleType: null,
+
+ requestOrigin: null,
+
+ visitingSite: null,
+
+ contentType: null,
+
+ blockUI: function () {
+ "use strict";
+ $.blockUI({
+ message: null,
+ overlayCSS: { backgroundColor: 'none' }});
+ },
+
+ unblockUI: function () {
+ "use strict";
+ window.setTimeout($.unblockUI, 500);
+ },
+
+ triggerEvent: function (msg) {
+ "use strict";
+ var event = document.createEvent("CustomEvent");
+ var that = this;
+ event.initCustomEvent("permafrost-settings-change", true, true, msg);
+ document.documentElement.dispatchEvent(event);
+ this.blockUI();
+
+ var success = function (event) {
+ that.unblockUI();
+ document.documentElement.removeListener("rules-form-data-written", success, false);
+ };
+
+ document.documentElement.addEventListener("rules-form-data-written", success, false);
+
+ },
+
+ init: function () {
+ "use strict";
+
+ var formTypesHelper = this;
+
+ // these four objects will be used to represent all the
+ // form items in the table, and will hold different values
+ // depending on the last active html form object.
+
+ this.ruleType = new FormType({
+ type: 'select',
+ name: 'rule',
+ source: [
+ {value: 'block', text: 'Block'},
+ {value: 'allow', text: 'Allow'}
+ ]
+ });
+
+ this.requestOrigin = new FormType({
+ type: 'textarea',
+ name: 'content-location',
+ title: 'Requests originating from',
+ placeholder: formTypesHelper.patternPlaceholder
+ });
+
+ this.visitingSite = new FormType({
+ type: 'textarea',
+ name: 'request-origin',
+ title: 'when visiting (referrer)',
+ placeholder: formTypesHelper.patternPlaceholder
+ });
+
+ this.contentType = new FormType({
+ type: 'checklist',
+ name: 'content-type',
+ title: 'and are of type',
+ separator: ',',
+ source: [
+ { value: 'script', text: 'scripts' },
+ { value: 'image', text: 'images' },
+ { value: 'stylesheet', text: 'stylesheets' },
+ { value: 'object', text: 'objects and plugin contents' },
+ { value: 'object-request', text: 'requests made by plugins' },
+ { value: 'subdocument', text: 'subdocuments (iframes, frames, and objects)' },
+ { value: 'font', text: 'web font (@font-face)' },
+ { value: 'media', text: 'video or audio content' },
+ { value: 'xbl', text: 'XBL binding request' },
+ { value: 'dtd', text: 'DTD loaded by an XML document' },
+ { value: 'xrh', text: 'Ajax requests (XMLHttpRequests)' },
+ { value: 'others', text: 'miscellaneous content' }
+ ]
+ });
+
+
+ }
+
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/pagescript-emitter.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/pagescript-emitter.js
new file mode 100644
index 0000000..a29c806
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/pagescript-emitter.js
@@ -0,0 +1,14 @@
+// listen for addon script emit and pass on the object to the page script.
+self.port.on("populate-form", function (data) {
+ // custom DOM event
+ var event = document.createEvent('CustomEvent');
+ event.initCustomEvent("populate-form", true, true, { data: data });
+ document.documentElement.dispatchEvent(event);
+});
+
+/*self.port.on("rules-form-data-written", function (data) {
+ // custom DOM event
+ var event = document.createEvent('CustomEvent');
+ event.initCustomEvent("rules-form-data-written", true, true, {});
+ document.documentElement.dispatchEvent(event);
+});*/
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/pagescript-listener.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/pagescript-listener.js
new file mode 100644
index 0000000..af01544
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/pagescript-listener.js
@@ -0,0 +1,59 @@
+/**
+ * Permafrost - Protect your privacy!
+ * *
+ * Copyright (C) 2012 2013 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/*jslint indent: 2 */
+/*jslint white: false */
+/*jslint eqeq: true */
+/*jslint plusplus: true*/
+/*jslint forin: true */
+/*global document: false, self: false */
+
+// listen for a message from the pagescript
+document.documentElement.addEventListener("librejs-settings-change", function (event) {
+ "use strict";
+
+ switch (event.detail.event) {
+
+ case 'rules-form-update':
+ self.port.emit('rules-form-update', event.detail.value);
+ break;
+
+ case 'rules-form-delete':
+ //console.log('hash is', event.detail.value);
+ self.port.emit('rules-form-delete', event.detail.value);
+ break;
+
+ case 'rules-form-delete-all':
+ self.port.emit('rules-form-delete-all');
+ break;
+
+ case 'rules-form-reorder':
+ self.port.emit('rules-form-reorder', event.detail.value);
+ break;
+
+ case 'rules-form-add-empty-row':
+ self.port.emit('rules-form-add-empty-row', event.detail.value);
+ break;
+
+ }
+
+}, false);
+
+
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/permafrost-info-box.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/permafrost-info-box.js
new file mode 100644
index 0000000..51c33cb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/permafrost-info-box.js
@@ -0,0 +1,21 @@
+/**
+ * Permafrost - Protect your privacy!
+ * *
+ * Copyright (C) 2012 2013 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var box = '<div id="permafrost-info-panel" style="width: 250px; height: auto; padding: 20px; background-color: rgba(255, 255, 255, 0.9); box-shadow: 0px 0px 50px rgb(255, 255, 255); margin: 2%; border-radius: 15px 15px 0 0; font-family: Droid Sans,Helvetica,Arial,Sans; font-size: 12px; z-index: 20000; position: fixed; right: 3%; bottom: -10px; margin-bottom:0;;"> <ul> <li>test 1</li> <li>test 2</li> <li>test 3</li> <li>test 4</li><li>blah</li><li>blobl</li> </ul></div>';
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/1140.css b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/1140.css
new file mode 100644
index 0000000..b8d6fa2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/1140.css
@@ -0,0 +1,130 @@
+/* CSS Resets */
+
+html,body,div,span,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,address,cite,code,del,dfn,em,img,ins,q,small,strong,sub,sup,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{border:0;margin:0;padding:0}article,aside,figure,figure img,figcaption,hgroup,footer,header,nav,section,video,object{display:block}a img{border:0}figure{position:relative}figure img{width:100%}
+
+
+/* ==================================================================================================================== */
+/* ! The 1140px Grid V2 by Andy Taylor \ http://cssgrid.net \ http://www.twitter.com/andytlr \ http://www.andytlr.com */
+/* ==================================================================================================================== */
+
+.container {
+padding-left: 20px;
+padding-right: 20px;
+}
+
+.row {
+width: 100%;
+max-width: 1140px;
+min-width: 755px;
+margin: 0 auto;
+overflow: hidden;
+}
+
+.onecol, .twocol, .threecol, .fourcol, .fivecol, .sixcol, .sevencol, .eightcol, .ninecol, .tencol, .elevencol {
+margin-right: 3.8%;
+float: left;
+min-height: 1px;
+}
+
+.row .onecol {
+width: 4.85%;
+}
+
+.row .twocol {
+width: 13.45%;
+}
+
+.row .threecol {
+width: 22.05%;
+}
+
+.row .fourcol {
+width: 30.75%;
+}
+
+.row .fivecol {
+width: 39.45%;
+}
+
+.row .sixcol {
+width: 48%;
+}
+
+.row .sevencol {
+width: 56.75%;
+}
+
+.row .eightcol {
+width: 65.4%;
+}
+
+.row .ninecol {
+width: 74.05%;
+}
+
+.row .tencol {
+width: 82.7%;
+}
+
+.row .elevencol {
+width: 91.35%;
+}
+
+.row .twelvecol {
+width: 100%;
+float: left;
+}
+
+.last {
+margin-right: 0px;
+}
+
+img, object, embed {
+max-width: 100%;
+}
+
+img {
+ height: auto;
+}
+
+
+/* Smaller screens */
+
+@media only screen and (max-width: 1023px) {
+
+ body {
+ font-size: 0.8em;
+ line-height: 1.5em;
+ }
+
+ }
+
+
+/* Mobile */
+
+@media handheld, only screen and (max-width: 767px) {
+
+ body {
+ font-size: 16px;
+ -webkit-text-size-adjust: none;
+ }
+
+ .row, body, .container {
+ width: 100%;
+ min-width: 0;
+ margin-left: 0px;
+ margin-right: 0px;
+ padding-left: 0px;
+ padding-right: 0px;
+ }
+
+ .row .onecol, .row .twocol, .row .threecol, .row .fourcol, .row .fivecol, .row .sixcol, .row .sevencol, .row .eightcol, .row .ninecol, .row .tencol, .row .elevencol, .row .twelvecol {
+ width: auto;
+ float: none;
+ margin-left: 0px;
+ margin-right: 0px;
+ padding-left: 20px;
+ padding-right: 20px;
+ }
+
+} \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/form.css b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/form.css
new file mode 100644
index 0000000..3e8c3bf
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/form.css
@@ -0,0 +1,8 @@
+tr.ui-sortable-helper > td {
+ background: #229ac1 !important;
+}
+
+#whitelist td {
+ max-width:350px;
+ word-wrap: break-word;
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/index.html b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/index.html
new file mode 100644
index 0000000..2883db3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/index.html
@@ -0,0 +1,277 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8" />
+ <title>The 1140px Grid &middot; Fluid down to mobile</title>
+
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
+ <!-- 1140px Grid styles for IE -->
+ <!--[if lte IE 9]><link rel="stylesheet" href="css/ie.css" type="text/css" media="screen" /><![endif]-->
+
+ <!-- The 1140px Grid - http://cssgrid.net/ -->
+ <link rel="stylesheet" href="css/1140.css" type="text/css" media="screen" />
+
+ <!-- Your styles -->
+ <link rel="stylesheet" href="css/styles.css" type="text/css" media="screen" />
+
+ <!--css3-mediaqueries-js - http://code.google.com/p/css3-mediaqueries-js/ - Enables media queries in some unsupported browsers-->
+ <script type="text/javascript" src="js/css3-mediaqueries.js"></script>
+
+ <!--Delete embedded styles, just for example.-->
+ <style type="text/css">
+
+ body {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ }
+
+ .container p {
+ color: #fff;
+ line-height: 100px;
+ background: #000;
+ text-align: center;
+ margin: 20px 0 0 0;
+ }
+
+ </style>
+
+</head>
+
+
+<body>
+
+<div class="container">
+ <div class="row">
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol last">
+ <p>One</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="twocol">
+ <p>Two columns</p>
+ </div>
+ <div class="twocol">
+ <p>Two columns</p>
+ </div>
+ <div class="twocol">
+ <p>Two columns</p>
+ </div>
+ <div class="twocol">
+ <p>Two columns</p>
+ </div>
+ <div class="twocol">
+ <p>Two columns</p>
+ </div>
+ <div class="twocol last">
+ <p>Two columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="threecol">
+ <p>Three columns</p>
+ </div>
+ <div class="threecol">
+ <p>Three columns</p>
+ </div>
+ <div class="threecol">
+ <p>Three columns</p>
+ </div>
+ <div class="threecol last">
+ <p>Three columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="fourcol">
+ <p>Four columns</p>
+ </div>
+ <div class="fourcol">
+ <p>Four columns</p>
+ </div>
+ <div class="fourcol last">
+ <p>Four columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="elevencol last">
+ <p>Eleven columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="twocol">
+ <p>Two columns</p>
+ </div>
+ <div class="tencol last">
+ <p>Ten columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="threecol">
+ <p>Three columns</p>
+ </div>
+ <div class="ninecol last">
+ <p>Nine columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="fourcol">
+ <p>Four columns</p>
+ </div>
+ <div class="eightcol last">
+ <p>Eight columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="fivecol">
+ <p>Five columns</p>
+ </div>
+ <div class="sevencol last">
+ <p>Seven columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="sixcol">
+ <p>Six columns</p>
+ </div>
+ <div class="sixcol last">
+ <p>Six columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="sevencol">
+ <p>Seven columns</p>
+ </div>
+ <div class="fivecol last">
+ <p>Five columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="eightcol">
+ <p>Eight columns</p>
+ </div>
+ <div class="fourcol last">
+ <p>Four columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="ninecol">
+ <p>Nine columns</p>
+ </div>
+ <div class="threecol last">
+ <p>Three columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="tencol">
+ <p>Ten columns</p>
+ </div>
+ <div class="twocol last">
+ <p>Two columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="elevencol">
+ <p>Eleven columns</p>
+ </div>
+ <div class="onecol last">
+ <p>One</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="threecol">
+ <p>Three columns</p>
+ </div>
+ <div class="sixcol">
+ <p>Six columns</p>
+ </div>
+ <div class="threecol last">
+ <p>Three columns</p>
+ </div>
+ </div>
+</div>
+
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/styles.css b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/styles.css
new file mode 100644
index 0000000..7e50c65
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/styles.css
@@ -0,0 +1,135 @@
+body {
+ font-size:67.5%;
+ background:#CCC;
+}
+#site-header {
+ background:#898168;
+ min-height:130px;
+ position:relative;
+ border-bottom:#916f6f solid 10px;
+ overflow:hidden;
+}
+
+#logo {
+ background:url('../images/logo-medium.png') top left no-repeat;
+ width:269px;
+ height:119px;
+ display:block;
+ text-indent:-1000em;
+ overflow:hidden;
+ margin:10px 0;
+}
+
+#ribbon {
+ position:absolute;
+ right:-50px;
+ top:-15px;
+ z-index:2;
+}
+
+header nav {
+ position:absolute;
+ bottom:0;
+ right:3em;
+ z-index:3;
+}
+
+header nav ul li {
+ display:inline;
+}
+header nav ul li a {
+ display:block;
+ float:left;
+ background:#916f6f;
+ width:auto;
+ height:10px;
+ padding:10px;
+ text-align:center;
+ margin:0 0.5em;
+ text-decoration:none;
+ color:#000;
+ font-family:Georgia Serif;
+ font-weight:bold;
+ font-size:1.1em;
+}
+header nav ul li a:visited {
+ color:#000;
+}
+
+#main {
+ background:#CCC;
+ padding:1em 0;
+}
+div.screenshot img {
+ float:right;
+ display:block;
+}
+.description {
+ padding-top:5px;
+ font-family:Georgia, Serif;
+ font-size:1.2em;
+ line-height:2em;
+}
+article p, article ul {
+ padding-top:1em;
+}
+article li {
+ padding-top:0.7em;
+}
+#promotional {
+ padding-top:30px;
+
+}
+
+a.download {
+ background:url('../images/button-download.png') top left no-repeat;
+ width:192px;
+ height:57px;
+ display:block;
+ margin:20px auto;
+ overflow:hidden;
+ text-indent:-10000em;
+}
+
+#main ul {
+ list-style-type:disc;
+}
+
+#main h1 {
+ color:#453B35;
+ font-family:arial, sans-serif;
+ font-size:3.5em;
+}
+#main h2 {
+ color:#453B35;
+ font-size:2em;
+ margin:1.5em 0 0;
+}
+#banners {
+ text-align:center;
+ padding:3em 0;
+}
+#banners a {
+ margin:0 5em;
+}
+
+footer p.copyrights {
+ text-align:center;
+ padding:2em 0;
+
+}
+
+figcaption {
+ font-style:italic;
+ font-size:1em;
+ padding:0 3em;
+}
+
+div.intro {
+ padding-top:2em;
+}
+.announcement {
+ color:#453B35;
+ font-size:1.2em;
+ margin:1em 0;
+} \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/block-ui/jquery.blockUI.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/block-ui/jquery.blockUI.js
new file mode 100644
index 0000000..d60303d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/block-ui/jquery.blockUI.js
@@ -0,0 +1,574 @@
+/*!
+ * jQuery blockUI plugin
+ * Version 2.54 (17-DEC-2012)
+ * @requires jQuery v1.3 or later
+ *
+ * Examples at: http://malsup.com/jquery/block/
+ * Copyright (c) 2007-2012 M. Alsup
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Thanks to Amir-Hossein Sobhi for some excellent contributions!
+ */
+
+;(function() {
+"use strict";
+
+ function setup($) {
+ if (/^1\.(0|1|2)/.test($.fn.jquery)) {
+ /*global alert:true */
+ alert('blockUI requires jQuery v1.3 or later! You are using v' + $.fn.jquery);
+ return;
+ }
+
+ $.fn._fadeIn = $.fn.fadeIn;
+
+ var noOp = $.noop || function() {};
+
+ // this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle
+ // retarded userAgent strings on Vista)
+ var msie = /MSIE/.test(navigator.userAgent);
+ var ie6 = /MSIE 6.0/.test(navigator.userAgent);
+ var mode = document.documentMode || 0;
+ // var setExpr = msie && (($.browser.version < 8 && !mode) || mode < 8);
+ var setExpr = $.isFunction( document.createElement('div').style.setExpression );
+
+ // global $ methods for blocking/unblocking the entire page
+ $.blockUI = function(opts) { install(window, opts); };
+ $.unblockUI = function(opts) { remove(window, opts); };
+
+ // convenience method for quick growl-like notifications (http://www.google.com/search?q=growl)
+ $.growlUI = function(title, message, timeout, onClose) {
+ var $m = $('<div class="growlUI"></div>');
+ if (title) $m.append('<h1>'+title+'</h1>');
+ if (message) $m.append('<h2>'+message+'</h2>');
+ if (timeout === undefined) timeout = 3000;
+ $.blockUI({
+ message: $m, fadeIn: 700, fadeOut: 1000, centerY: false,
+ timeout: timeout, showOverlay: false,
+ onUnblock: onClose,
+ css: $.blockUI.defaults.growlCSS
+ });
+ };
+
+ // plugin method for blocking element content
+ $.fn.block = function(opts) {
+ var fullOpts = $.extend({}, $.blockUI.defaults, opts || {});
+ this.each(function() {
+ var $el = $(this);
+ if (fullOpts.ignoreIfBlocked && $el.data('blockUI.isBlocked'))
+ return;
+ $el.unblock({ fadeOut: 0 });
+ });
+
+ return this.each(function() {
+ if ($.css(this,'position') == 'static')
+ this.style.position = 'relative';
+ this.style.zoom = 1; // force 'hasLayout' in ie
+ install(this, opts);
+ });
+ };
+
+ // plugin method for unblocking element content
+ $.fn.unblock = function(opts) {
+ return this.each(function() {
+ remove(this, opts);
+ });
+ };
+
+ $.blockUI.version = 2.54; // 2nd generation blocking at no extra cost!
+
+ // override these in your code to change the default behavior and style
+ $.blockUI.defaults = {
+ // message displayed when blocking (use null for no message)
+ message: '<h1>Please wait...</h1>',
+
+ title: null, // title string; only used when theme == true
+ draggable: true, // only used when theme == true (requires jquery-ui.js to be loaded)
+
+ theme: false, // set to true to use with jQuery UI themes
+
+ // styles for the message when blocking; if you wish to disable
+ // these and use an external stylesheet then do this in your code:
+ // $.blockUI.defaults.css = {};
+ css: {
+ padding: 0,
+ margin: 0,
+ width: '30%',
+ top: '40%',
+ left: '35%',
+ textAlign: 'center',
+ color: '#000',
+ border: '3px solid #aaa',
+ backgroundColor:'#fff',
+ cursor: 'wait'
+ },
+
+ // minimal style set used when themes are used
+ themedCSS: {
+ width: '30%',
+ top: '40%',
+ left: '35%'
+ },
+
+ // styles for the overlay
+ overlayCSS: {
+ backgroundColor: '#000',
+ opacity: 0.6,
+ cursor: 'wait'
+ },
+
+ // style to replace wait cursor before unblocking to correct issue
+ // of lingering wait cursor
+ cursorReset: 'default',
+
+ // styles applied when using $.growlUI
+ growlCSS: {
+ width: '350px',
+ top: '10px',
+ left: '',
+ right: '10px',
+ border: 'none',
+ padding: '5px',
+ opacity: 0.6,
+ cursor: 'default',
+ color: '#fff',
+ backgroundColor: '#000',
+ '-webkit-border-radius':'10px',
+ '-moz-border-radius': '10px',
+ 'border-radius': '10px'
+ },
+
+ // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w
+ // (hat tip to Jorge H. N. de Vasconcelos)
+ /*jshint scripturl:true */
+ iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',
+
+ // force usage of iframe in non-IE browsers (handy for blocking applets)
+ forceIframe: false,
+
+ // z-index for the blocking overlay
+ baseZ: 1000,
+
+ // set these to true to have the message automatically centered
+ centerX: true, // <-- only effects element blocking (page block controlled via css above)
+ centerY: true,
+
+ // allow body element to be stetched in ie6; this makes blocking look better
+ // on "short" pages. disable if you wish to prevent changes to the body height
+ allowBodyStretch: true,
+
+ // enable if you want key and mouse events to be disabled for content that is blocked
+ bindEvents: true,
+
+ // be default blockUI will supress tab navigation from leaving blocking content
+ // (if bindEvents is true)
+ constrainTabKey: true,
+
+ // fadeIn time in millis; set to 0 to disable fadeIn on block
+ fadeIn: 200,
+
+ // fadeOut time in millis; set to 0 to disable fadeOut on unblock
+ fadeOut: 400,
+
+ // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock
+ timeout: 0,
+
+ // disable if you don't want to show the overlay
+ showOverlay: true,
+
+ // if true, focus will be placed in the first available input field when
+ // page blocking
+ focusInput: true,
+
+ // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)
+ // no longer needed in 2012
+ // applyPlatformOpacityRules: true,
+
+ // callback method invoked when fadeIn has completed and blocking message is visible
+ onBlock: null,
+
+ // callback method invoked when unblocking has completed; the callback is
+ // passed the element that has been unblocked (which is the window object for page
+ // blocks) and the options that were passed to the unblock call:
+ // onUnblock(element, options)
+ onUnblock: null,
+
+ // callback method invoked when the overlay area is clicked.
+ // setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used.
+ onOverlayClick: null,
+
+ // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493
+ quirksmodeOffsetHack: 4,
+
+ // class name of the message block
+ blockMsgClass: 'blockMsg',
+
+ // if it is already blocked, then ignore it (don't unblock and reblock)
+ ignoreIfBlocked: false
+ };
+
+ // private data and functions follow...
+
+ var pageBlock = null;
+ var pageBlockEls = [];
+
+ function install(el, opts) {
+ var css, themedCSS;
+ var full = (el == window);
+ var msg = (opts && opts.message !== undefined ? opts.message : undefined);
+ opts = $.extend({}, $.blockUI.defaults, opts || {});
+
+ if (opts.ignoreIfBlocked && $(el).data('blockUI.isBlocked'))
+ return;
+
+ opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});
+ css = $.extend({}, $.blockUI.defaults.css, opts.css || {});
+ if (opts.onOverlayClick)
+ opts.overlayCSS.cursor = 'pointer';
+
+ themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});
+ msg = msg === undefined ? opts.message : msg;
+
+ // remove the current block (if there is one)
+ if (full && pageBlock)
+ remove(window, {fadeOut:0});
+
+ // if an existing element is being used as the blocking content then we capture
+ // its current place in the DOM (and current display style) so we can restore
+ // it when we unblock
+ if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) {
+ var node = msg.jquery ? msg[0] : msg;
+ var data = {};
+ $(el).data('blockUI.history', data);
+ data.el = node;
+ data.parent = node.parentNode;
+ data.display = node.style.display;
+ data.position = node.style.position;
+ if (data.parent)
+ data.parent.removeChild(node);
+ }
+
+ $(el).data('blockUI.onUnblock', opts.onUnblock);
+ var z = opts.baseZ;
+
+ // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;
+ // layer1 is the iframe layer which is used to supress bleed through of underlying content
+ // layer2 is the overlay layer which has opacity and a wait cursor (by default)
+ // layer3 is the message content that is displayed while blocking
+ var lyr1, lyr2, lyr3, s;
+ if (msie || opts.forceIframe)
+ lyr1 = $('<iframe class="blockUI" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="'+opts.iframeSrc+'"></iframe>');
+ else
+ lyr1 = $('<div class="blockUI" style="display:none"></div>');
+
+ if (opts.theme)
+ lyr2 = $('<div class="blockUI blockOverlay ui-widget-overlay" style="z-index:'+ (z++) +';display:none"></div>');
+ else
+ lyr2 = $('<div class="blockUI blockOverlay" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>');
+
+ if (opts.theme && full) {
+ s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage ui-dialog ui-widget ui-corner-all" style="z-index:'+(z+10)+';display:none;position:fixed">';
+ if ( opts.title ) {
+ s += '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>';
+ }
+ s += '<div class="ui-widget-content ui-dialog-content"></div>';
+ s += '</div>';
+ }
+ else if (opts.theme) {
+ s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement ui-dialog ui-widget ui-corner-all" style="z-index:'+(z+10)+';display:none;position:absolute">';
+ if ( opts.title ) {
+ s += '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>';
+ }
+ s += '<div class="ui-widget-content ui-dialog-content"></div>';
+ s += '</div>';
+ }
+ else if (full) {
+ s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage" style="z-index:'+(z+10)+';display:none;position:fixed"></div>';
+ }
+ else {
+ s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement" style="z-index:'+(z+10)+';display:none;position:absolute"></div>';
+ }
+ lyr3 = $(s);
+
+ // if we have a message, style it
+ if (msg) {
+ if (opts.theme) {
+ lyr3.css(themedCSS);
+ lyr3.addClass('ui-widget-content');
+ }
+ else
+ lyr3.css(css);
+ }
+
+ // style the overlay
+ if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/)
+ lyr2.css(opts.overlayCSS);
+ lyr2.css('position', full ? 'fixed' : 'absolute');
+
+ // make iframe layer transparent in IE
+ if (msie || opts.forceIframe)
+ lyr1.css('opacity',0.0);
+
+ //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);
+ var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el);
+ $.each(layers, function() {
+ this.appendTo($par);
+ });
+
+ if (opts.theme && opts.draggable && $.fn.draggable) {
+ lyr3.draggable({
+ handle: '.ui-dialog-titlebar',
+ cancel: 'li'
+ });
+ }
+
+ // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)
+ var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0);
+ if (ie6 || expr) {
+ // give body 100% height
+ if (full && opts.allowBodyStretch && $.support.boxModel)
+ $('html,body').css('height','100%');
+
+ // fix ie6 issue when blocked element has a border width
+ if ((ie6 || !$.support.boxModel) && !full) {
+ var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth');
+ var fixT = t ? '(0 - '+t+')' : 0;
+ var fixL = l ? '(0 - '+l+')' : 0;
+ }
+
+ // simulate fixed position
+ $.each(layers, function(i,o) {
+ var s = o[0].style;
+ s.position = 'absolute';
+ if (i < 2) {
+ if (full)
+ s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"');
+ else
+ s.setExpression('height','this.parentNode.offsetHeight + "px"');
+ if (full)
+ s.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"');
+ else
+ s.setExpression('width','this.parentNode.offsetWidth + "px"');
+ if (fixL) s.setExpression('left', fixL);
+ if (fixT) s.setExpression('top', fixT);
+ }
+ else if (opts.centerY) {
+ if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"');
+ s.marginTop = 0;
+ }
+ else if (!opts.centerY && full) {
+ var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0;
+ var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"';
+ s.setExpression('top',expression);
+ }
+ });
+ }
+
+ // show the message
+ if (msg) {
+ if (opts.theme)
+ lyr3.find('.ui-widget-content').append(msg);
+ else
+ lyr3.append(msg);
+ if (msg.jquery || msg.nodeType)
+ $(msg).show();
+ }
+
+ if ((msie || opts.forceIframe) && opts.showOverlay)
+ lyr1.show(); // opacity is zero
+ if (opts.fadeIn) {
+ var cb = opts.onBlock ? opts.onBlock : noOp;
+ var cb1 = (opts.showOverlay && !msg) ? cb : noOp;
+ var cb2 = msg ? cb : noOp;
+ if (opts.showOverlay)
+ lyr2._fadeIn(opts.fadeIn, cb1);
+ if (msg)
+ lyr3._fadeIn(opts.fadeIn, cb2);
+ }
+ else {
+ if (opts.showOverlay)
+ lyr2.show();
+ if (msg)
+ lyr3.show();
+ if (opts.onBlock)
+ opts.onBlock();
+ }
+
+ // bind key and mouse events
+ bind(1, el, opts);
+
+ if (full) {
+ pageBlock = lyr3[0];
+ pageBlockEls = $(':input:enabled:visible',pageBlock);
+ if (opts.focusInput)
+ setTimeout(focus, 20);
+ }
+ else
+ center(lyr3[0], opts.centerX, opts.centerY);
+
+ if (opts.timeout) {
+ // auto-unblock
+ var to = setTimeout(function() {
+ if (full)
+ $.unblockUI(opts);
+ else
+ $(el).unblock(opts);
+ }, opts.timeout);
+ $(el).data('blockUI.timeout', to);
+ }
+ }
+
+ // remove the block
+ function remove(el, opts) {
+ var full = (el == window);
+ var $el = $(el);
+ var data = $el.data('blockUI.history');
+ var to = $el.data('blockUI.timeout');
+ if (to) {
+ clearTimeout(to);
+ $el.removeData('blockUI.timeout');
+ }
+ opts = $.extend({}, $.blockUI.defaults, opts || {});
+ bind(0, el, opts); // unbind events
+
+ if (opts.onUnblock === null) {
+ opts.onUnblock = $el.data('blockUI.onUnblock');
+ $el.removeData('blockUI.onUnblock');
+ }
+
+ var els;
+ if (full) // crazy selector to handle odd field errors in ie6/7
+ els = $('body').children().filter('.blockUI').add('body > .blockUI');
+ else
+ els = $el.find('>.blockUI');
+
+ // fix cursor issue
+ if ( opts.cursorReset ) {
+ if ( els.length > 1 )
+ els[1].style.cursor = opts.cursorReset;
+ if ( els.length > 2 )
+ els[2].style.cursor = opts.cursorReset;
+ }
+
+ if (full)
+ pageBlock = pageBlockEls = null;
+
+ if (opts.fadeOut) {
+ els.fadeOut(opts.fadeOut);
+ setTimeout(function() { reset(els,data,opts,el); }, opts.fadeOut);
+ }
+ else
+ reset(els, data, opts, el);
+ }
+
+ // move blocking element back into the DOM where it started
+ function reset(els,data,opts,el) {
+ els.each(function(i,o) {
+ // remove via DOM calls so we don't lose event handlers
+ if (this.parentNode)
+ this.parentNode.removeChild(this);
+ });
+
+ if (data && data.el) {
+ data.el.style.display = data.display;
+ data.el.style.position = data.position;
+ if (data.parent)
+ data.parent.appendChild(data.el);
+ $(el).removeData('blockUI.history');
+ }
+
+ if (typeof opts.onUnblock == 'function')
+ opts.onUnblock(el,opts);
+
+ // fix issue in Safari 6 where block artifacts remain until reflow
+ var body = $(document.body), w = body.width(), cssW = body[0].style.width;
+ body.width(w-1).width(w);
+ body[0].style.width = cssW;
+ }
+
+ // bind/unbind the handler
+ function bind(b, el, opts) {
+ var full = el == window, $el = $(el);
+
+ // don't bother unbinding if there is nothing to unbind
+ if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked')))
+ return;
+
+ $el.data('blockUI.isBlocked', b);
+
+ // don't bind events when overlay is not in use or if bindEvents is false
+ if (!opts.bindEvents || (b && !opts.showOverlay))
+ return;
+
+ // bind anchors and inputs for mouse and key events
+ var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove';
+ if (b)
+ $(document).bind(events, opts, handler);
+ else
+ $(document).unbind(events, handler);
+
+ // former impl...
+ // var $e = $('a,:input');
+ // b ? $e.bind(events, opts, handler) : $e.unbind(events, handler);
+ }
+
+ // event handler to suppress keyboard/mouse events when blocking
+ function handler(e) {
+ // allow tab navigation (conditionally)
+ if (e.keyCode && e.keyCode == 9) {
+ if (pageBlock && e.data.constrainTabKey) {
+ var els = pageBlockEls;
+ var fwd = !e.shiftKey && e.target === els[els.length-1];
+ var back = e.shiftKey && e.target === els[0];
+ if (fwd || back) {
+ setTimeout(function(){focus(back);},10);
+ return false;
+ }
+ }
+ }
+ var opts = e.data;
+ var target = $(e.target);
+ if (target.hasClass('blockOverlay') && opts.onOverlayClick)
+ opts.onOverlayClick();
+
+ // allow events within the message content
+ if (target.parents('div.' + opts.blockMsgClass).length > 0)
+ return true;
+
+ // allow events for content that is not being blocked
+ return target.parents().children().filter('div.blockUI').length === 0;
+ }
+
+ function focus(back) {
+ if (!pageBlockEls)
+ return;
+ var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0];
+ if (e)
+ e.focus();
+ }
+
+ function center(el, x, y) {
+ var p = el.parentNode, s = el.style;
+ var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth');
+ var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth');
+ if (x) s.left = l > 0 ? (l+'px') : '0';
+ if (y) s.top = t > 0 ? (t+'px') : '0';
+ }
+
+ function sz(el, p) {
+ return parseInt($.css(el,p),10)||0;
+ }
+
+ }
+
+
+ /*global define:true */
+ if (typeof define === 'function' && define.amd && define.amd.jQuery) {
+ define(['jquery'], setup);
+ } else {
+ setup(jQuery);
+ }
+
+})();
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/css/bootstrap-responsive.min.css b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/css/bootstrap-responsive.min.css
new file mode 100644
index 0000000..96a435b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/css/bootstrap-responsive.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap Responsive v2.3.2
+ *
+ * Copyright 2013 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}}
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/css/bootstrap.min.css b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/css/bootstrap.min.css
new file mode 100644
index 0000000..df96c86
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/css/bootstrap.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap v2.3.2
+ *
+ * Copyright 2013 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/img/glyphicons-halflings-white.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/img/glyphicons-halflings-white.png
new file mode 100644
index 0000000..3bf6484
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/img/glyphicons-halflings-white.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/img/glyphicons-halflings.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/img/glyphicons-halflings.png
new file mode 100644
index 0000000..8815a8a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/img/glyphicons-halflings.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/js/bootstrap.min.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/js/bootstrap.min.js
new file mode 100644
index 0000000..848258d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/js/bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+* Bootstrap.js by @fat & @mdo
+* Copyright 2013 Twitter, Inc.
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(".dropdown-backdrop").remove(),e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||("ontouchstart"in document.documentElement&&e('<div class="dropdown-backdrop"/>').insertBefore(e(this)).on("click",r),s.toggleClass("open")),n.focus(),!1},keydown:function(n){var r,s,o,u,a,f;if(!/(38|40|27)/.test(n.keyCode))return;r=e(this),n.preventDefault(),n.stopPropagation();if(r.is(".disabled, :disabled"))return;u=i(r),a=u.hasClass("open");if(!a||a&&n.keyCode==27)return n.which==27&&u.find(t).focus(),r.click();s=e("[role=menu] li:not(.divider):visible a",u);if(!s.length)return;f=s.index(s.filter(":focus")),n.keyCode==38&&f>0&&f--,n.keyCode==40&&f<s.length-1&&f++,~f||(f=0),s.eq(f).focus()}};var s=e.fn.dropdown;e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e.fn.dropdown.noConflict=function(){return e.fn.dropdown=s,this},e(document).on("click.dropdown.data-api",r).on("click.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.focus().trigger("shown")}):t.$element.focus().trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(){var e=this;this.$element.hide(),this.backdrop(function(){e.removeBackdrop(),e.$element.trigger("hidden")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.$backdrop.click(this.options.backdrop=="static"?e.proxy(this.$element[0].focus,this.$element[0]):e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in");if(!t)return;i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,t):t()):t&&t()}};var n=e.fn.modal;e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e.fn.modal.noConflict=function(){return e.fn.modal=n,this},e(document).on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s,o,u,a;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,o=this.options.trigger.split(" ");for(a=o.length;a--;)u=o[a],u=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):u!="manual"&&(i=u=="hover"?"mouseenter":"focus",s=u=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this)));this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,this.$element.data(),t),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e.fn[this.type].defaults,r={},i;this._options&&e.each(this._options,function(e,t){n[e]!=t&&(r[e]=t)},this),i=e(t.currentTarget)[this.type](r).data(this.type);if(!i.options.delay||!i.options.delay.show)return i.show();clearTimeout(this.timeout),i.hoverState="in",this.timeout=setTimeout(function(){i.hoverState=="in"&&i.show()},i.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var t,n,r,i,s,o,u=e.Event("show");if(this.hasContent()&&this.enabled){this.$element.trigger(u);if(u.isDefaultPrevented())return;t=this.tip(),this.setContent(),this.options.animation&&t.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,t[0],this.$element[0]):this.options.placement,t.detach().css({top:0,left:0,display:"block"}),this.options.container?t.appendTo(this.options.container):t.insertAfter(this.$element),n=this.getPosition(),r=t[0].offsetWidth,i=t[0].offsetHeight;switch(s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}this.applyPlacement(o,s),this.$element.trigger("shown")}},applyPlacement:function(e,t){var n=this.tip(),r=n[0].offsetWidth,i=n[0].offsetHeight,s,o,u,a;n.offset(e).addClass(t).addClass("in"),s=n[0].offsetWidth,o=n[0].offsetHeight,t=="top"&&o!=i&&(e.top=e.top+i-o,a=!0),t=="bottom"||t=="top"?(u=0,e.left<0&&(u=e.left*-2,e.left=0,n.offset(e),s=n[0].offsetWidth,o=n[0].offsetHeight),this.replaceArrow(u-r+s,s,"left")):this.replaceArrow(o-i,o,"top"),a&&n.offset(e)},replaceArrow:function(e,t,n){this.arrow().css(n,e?50*(1-e/t)+"%":"")},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function i(){var t=setTimeout(function(){n.off(e.support.transition.end).detach()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.detach()})}var t=this,n=this.tip(),r=e.Event("hide");this.$element.trigger(r);if(r.isDefaultPrevented())return;return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?i():n.detach(),this.$element.trigger("hidden"),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").attr("title","")},hasContent:function(){return this.getTitle()},getPosition:function(){var t=this.$element[0];return e.extend({},typeof t.getBoundingClientRect=="function"?t.getBoundingClientRect():{width:t.offsetWidth,height:t.offsetHeight},this.$element.offset())},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},arrow:function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(t){var n=t?e(t.currentTarget)[this.type](this._options).data(this.type):this;n.tip().hasClass("in")?n.hide():n.show()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var n=e.fn.tooltip;e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},e.fn.tooltip.noConflict=function(){return e.fn.tooltip=n,this}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=(typeof n.content=="function"?n.content.call(t[0]):n.content)||t.attr("data-content"),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var n=e.fn.popover;e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var n=e(this),r=n.data("target")||n.attr("href"),i=/^#\w/.test(r)&&e(r);return i&&i.length&&[[i.position().top+(!e.isWindow(t.$scrollElement.get(0))&&t.$scrollElement.scrollTop()),r]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}};var n=e.fn.scrollspy;e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e.fn.scrollspy.noConflict=function(){return e.fn.scrollspy=n,this},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active:last a")[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}};var n=e.fn.tab;e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=n,this},e(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=e(this.options.menu),this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:t.top+t.height,left:t.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("focus",e.proxy(this.focus,this)).on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this)).on("mouseleave","li",e.proxy(this.mouseleave,this))},eventSupported:function(e){var t=e in this.$element;return t||(this.$element.setAttribute(e,"return;"),t=typeof this.$element[e]=="function"),t},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},focus:function(e){this.focused=!0},blur:function(e){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(e){e.stopPropagation(),e.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(t){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var n=e.fn.typeahead;e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e.fn.typeahead.noConflict=function(){return e.fn.typeahead=n,this},e(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;n.typeahead(n.data())})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))};var n=e.fn.affix;e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery); \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/CHANGELOG.txt b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/CHANGELOG.txt
new file mode 100644
index 0000000..5c410ec
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/CHANGELOG.txt
@@ -0,0 +1,103 @@
+X-editable changelog
+=============================
+
+
+Version 1.3.0 Dec 10, 2012
+----------------------------
+[enh] added html5 inputs support: password, email, url, tel, number, range (vitalets)
+[bug #43] fix for bootstrap 2.2.2 (vitalets)
+[enh #41] 'abstract' class renamed to 'abstractinput' as abstract is reserved word (vitalets)
+[enh #40] 'params' option defined as function overwrites original ajax data instead of appending (vitalets)
+[bug] datepicker: error when click on arrows after clear date (vitalets)
+[enh] 'hidden' event: added possible value of reason param - 'nochange'. Occurs when form is submitted but value was not changed (vitalets)
+[enh] 'submit' method changed: error-callback's parameter simplified (vitalets)
+[enh] 'submit' method changed: now when response 200 OK it does not set pk automatically (vitalets)
+[enh] 'submit' method changed: removed dataType='json'. Use 'ajaxOptions' to specify dataType if needed (vitalets)
+[enh] removed default ajax dataType='json'. Use 'ajaxOptions' to specify dataType if needed (vitalets)
+[enh] select: do not show 'sourceError' in element during autotext execution (vitalets)
+
+
+Version 1.2.0 Dec 6, 2012
+----------------------------
+[enh #36] 'submit' method: added 'ajaxOptions' property to modify ajax request (vitalets)
+[enh] inputs now internally use 'value2submit' method instead of previous 'value2str' (vitalets)
+[enh] editableContainer removed from docs (vitalets)
+[enh] editableContainer: removed 'autohide' option and 'cancel' event. Use 'hidden' event instead (vitalets)
+[enh] 'hidden' event: added param 'reason' that points to reason caused hiding (vitalets)
+[enh] 'select' submit by enter (vitalets)
+[bug #37] fix incorrectly shown datepicker in jquery 1.7.1 + webkit (vitalets)
+[enh] added url param 'jquery' to run tests in different versions of jquery, e.g. '&jquery=1.7.2' (vitalets)
+[enh] 'enablefocus' option removed. More efficient to use 'save/hide' events to set focus to any element (vitalets)
+[enh] 'init' event was added due to removal of render event (vitalets)
+[enh] 'render' event was removed, use 'display' callback instead (vitalets)
+[enh] 'checklist' submit value as array, not comma separated string (vitalets)
+[enh] 'checklist' was refactored: options 'viewseparator', 'limit', 'limitText' are supressed by 'display' callback (vitalets)
+[enh] new option: 'display' callback. Makes far more flexible rendering value into element's text. (vitalets)
+[bug] fix typos (atrophic)
+[enh] all callbacks scope changed to element (vitalets)
+[enh] new option: 'savenochange' to save or cancel value when it was not changed in form (vitalets)
+[enh] composite pk can be defined as JSON in data-pk attribute (vitalets)
+[enh #30] new option 'sourceCache' true|false to disable cache for select (vitalets)
+[bug #34] inputclass span* broken with fluid bootstrap layout. Classes changed to 'input-*'. (vitalets)
+[enh] utils now added to $.fn.editableutils instead of $.fn.editableform.utils (vitalets)
+[enh] input types now added to $.fn.editabletypes instead of $.fn.editableform.types (vitalets)
+[enh] playground and tests now use requirejs (vitalets)
+[bug #27] 'today' button toggle bug in bootstrap-datepicker (vitalets)
+
+
+Version 1.1.1 Nov 30, 2012
+----------------------------
+[enh] 'showbuttons' option to hide buttons in form (vitalets)
+[enh] object can be passed in 'option' method to set several options at once (vitalets)
+[enh #20] toggle editable by 'dblclick' and 'mouseenter' (vitalets)
+[enh] added 'inputs-ext' directory with sample input 'address'. They will not be concatenated to main files (vitalets)
+[enh #13] 'onblur' option: to cancel, submit or ignore when user clicks outside the form (vitalets)
+[enh] 'ajaxOptions' parameter for advanced ajax configuration (vitalets)
+[enh] 'success' callback can return object to overwrite submitted value (vitalets)
+
+
+Version 1.1.0 Nov 27, 2012
+----------------------------
+[enh #11] icon cancel changed to 'cross' (tarciozemel)
+[enh] added support for IE7+ (vitalets)
+[enh #9] 'name' or 'id' is not required anymore (vitalets)
+[enh] 'clear' button added in date and dateui (vitalets)
+[enh] form template changed: added DIV.editable-input, DIV.editable.buttons and $.fn.editableform.buttons (vitalets)
+[enh] new input type: checklist (vitalets)
+[enh] updated docs: inputs dropdown menu, global templates section (vitalets)
+
+
+Version 1.0.1 Nov 22, 2012
+----------------------------
+[enh] contribution guide in README.md (vitalets)
+[enh #7] 'shown', 'hidden' events added (vitalets)
+[enh #1] params can be a function to calculate it dynamically (vitalets)
+[enh #6] do not preventDefault() in click when toggle='manual'. This allows to have clickable links (vitalets)
+[bug #3] should not mark element with unsave css if url is user's function (vitalets)
+
+
+Version 1.0.0 Nov 19, 2012
+----------------------------
+Initial release. This library is new life of bootstrap-editable (1.1.4) that was strongly refactored and improved.
+Main features:
+- support not only bootstrap but any core library: bootstrap, jquery-ui or pure jquery
+- different container classes to show form: popover, tooltip, poshytip, etc
+- inline and popup versions
+- new directory structure and logic in separate js files allowing easy contribution
+
+It is not fully compatible with bootstrap-editable but has mainly the same interface and api.
+Here list of differences to help you to upgrade your application:
+
+[change] 'toggle' option value can be only click|manual (not toggling element id). In case of 'manual' you should write handler calling 'show' method.
+[change] 'validate' option cannot be defined as object anymore.
+[change] events 'init', 'update', 'shown', 'hidden' removed. Events 'save', 'cancel' added. Event 'render' remains.
+[change] input's option 'template' renamed to 'tpl' (to exclude conflict with container's template).
+[change] value can be stored internally as object (previously was always string). Useful for date input.
+[change] 'error' callback option is removed. 'success' callback remained.
+[enh] 'source' option in select can be array of structure [{value: 1, text: 'abc'}, {...}]. This allows to keep ordering of items in dropdown list. Previous format is supported for compatibility.
+[enh] api method 'setValue' to set manually value of editable.
+[change] locales directory is excluded from bootstrap-datepicker input. If you need localization you should jus download corresponding file from github.
+[change] date and dateui specific options can be set only via 'datepicker' option in first level of config (previously it was possible to set some options directly in config, e.g. weekStart).
+[change] if 'url' option defined as function - it is used as submit method instead of ajax (previously it was dynamically return url string and ajax occurred anyway)
+
+Also all known bugs of bootstrap-editable were closed.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/LICENSE-MIT b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/LICENSE-MIT
new file mode 100644
index 0000000..bc67d5b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/LICENSE-MIT
@@ -0,0 +1,22 @@
+Copyright (c) 2012 Vitaliy Potapov
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/README.md b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/README.md
new file mode 100644
index 0000000..38aacf7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/README.md
@@ -0,0 +1,71 @@
+# X-editable
+
+In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery.
+It is a new life of [bootstrap-editable plugin](http://github.com/vitalets/bootstrap-editable) that was strongly refactored and improved.
+
+## Demo + Docs + Download
+See **http://vitalets.github.com/x-editable**
+
+## Reporting issues
+When creating issues please provide [jsFiddle](http://jsfiddle.net) example. You can easily fork one of **jsFiddle templates**:
+1. [bootstrap](http://jsfiddle.net/xBB5x/25/)
+2. [jqueryui](http://jsfiddle.net/xBB5x/24/)
+3. [plain](http://jsfiddle.net/xBB5x/23/)
+Your feedback is very appreciated!
+
+## Contribution
+A few steps how to start contributing:
+
+1.[Fork X-editable](https://github.com/vitalets/x-editable/fork) and pull the latest changes from <code>dev</code> branch
+
+2.Arrange local directory structure. It should be:
+**x-editable**
+ | -- **lib** (repo related to <code>dev</code> and <code>master</code> branches)
+ | -- **gh-pages** (repo related to <code>gh-pages</code> branch for docs & demo)
+ | -- **playground** (simple node-server and html page for testing, [playground_1.2.zip](https://github.com/downloads/vitalets/x-editable/playground_1.2.zip), **updated in 1.2.0!**)
+
+To make it easy follow this script ( _assuming you have [nodejs](http://nodejs.org) installed_ ).
+Please replace <code>&lt;your-github-name&gt;</code> with your name:
+````
+mkdir x-editable
+cd x-editable
+
+#lib
+git clone https://github.com/<your-github-name>/x-editable.git -b dev lib
+cd lib
+#install gruntjs globally - building tool
+npm install -g grunt
+#install other dependencies - grunt-contrib
+npm install
+cd ..
+
+#gh-pages
+git clone https://github.com/<your-github-name>/x-editable.git -b gh-pages gh-pages
+cd gh-pages
+npm install
+cd ..
+
+#playground
+#download playground.zip from https://github.com/downloads/vitalets/x-editable/playground_1.2.zip
+unzip playground.zip
+cd playground
+npm install
+````
+3.That's it! You can start editing files in **lib/src** directory or create new editable input/container/whatever.
+To test the result go to **playground**, start server <code>node server.js</code> and open in your browser [http://localhost:3000/playground](http://localhost:3000/playground).
+
+4.To run unit tests you can open it directly in browser **lib/test/index.html**.
+Or use grunt's _qunit_ task <code>grunt test</code>. For that you also need to [install PhantomJS](https://github.com/gruntjs/grunt/blob/master/docs/faq.md#why-does-grunt-complain-that-phantomjs-isnt-installed)
+
+5.To build distributive run <code>grunt build</code> in **lib** directory. Result will appear in **lib/dist**.
+
+6.To build docs run <code>build data-docs-dist</code> in **gh-pages** directory. Result will appear in **gh-pages/*.html**.
+Do not edit **index.html** and **docs.html** directly! Instead look at [Handlebars](https://github.com/wycats/handlebars.js) templates in **generator/templates**.
+
+7.Commit changes on <code>dev</code> / <code>gh-pages-dev</code> branch and make pull request as usual.
+
+Thanks for your support!
+
+## License
+Copyright (c) 2012 Vitaliy Potapov
+Licensed under the MIT licenses. \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/css/bootstrap-editable.css b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/css/bootstrap-editable.css
new file mode 100644
index 0000000..7c0b1c2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/css/bootstrap-editable.css
@@ -0,0 +1,434 @@
+/*! X-editable - v1.3.0
+* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery
+* http://github.com/vitalets/x-editable
+* Copyright (c) 2012 Vitaliy Potapov; Licensed MIT */
+
+.editableform {
+ margin-bottom: 0; /* overwrites bootstrap margin */
+}
+
+.editableform .control-group {
+ margin-bottom: 0; /* overwrites bootstrap margin */
+ white-space: nowrap; /* prevent wrapping buttons on new line */
+}
+
+.editable-buttons {
+ display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */
+ vertical-align: top;
+ margin-left: 7px;
+ /* display-inline emulation for IE7*/
+ zoom: 1;
+ *display: inline;
+}
+
+
+
+.editable-input {
+ vertical-align: top;
+ display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */
+ width: auto; /* bootstrap-responsive has width: 100% that breakes layout */
+ white-space: normal; /* reset white-space decalred in parent*/
+ /* display-inline emulation for IE7*/
+ zoom: 1;
+ *display: inline;
+}
+
+.editable-buttons .editable-cancel {
+ margin-left: 7px;
+}
+
+/*for jquery-ui buttons need set height to look more pretty*/
+.editable-buttons button.ui-button-icon-only {
+ height: 24px;
+ width: 30px;
+}
+
+.editableform-loading {
+ background: url('img/loading.gif') center center no-repeat;
+ height: 25px;
+ width: auto;
+ min-width: 25px;
+}
+
+.editable-inline .editableform-loading {
+ background-position: left 5px;
+}
+
+ .editable-error-block {
+ max-width: 300px;
+ margin: 5px 0 0 0;
+ width: auto;
+ white-space: normal;
+}
+
+/*add padding for jquery ui*/
+.editable-error-block.ui-state-error {
+ padding: 3px;
+}
+
+.editable-error {
+ color: red;
+}
+
+.editableform textarea {
+ height: 150px; /*default height for textarea*/
+}
+
+.editableform .editable-date {
+ padding: 0;
+ margin: 0;
+ float: left;
+}
+
+
+/* checklist vertical alignment */
+.editable-checklist label input[type="checkbox"],
+.editable-checklist label span {
+ vertical-align: middle;
+ margin: 0;
+}
+
+.editable-checklist label {
+ white-space: nowrap;
+}
+
+.editable-clear {
+ clear: both;
+ font-size: 0.9em;
+ text-decoration: none;
+ text-align: right;
+}
+.editable-container {
+ max-width: none !important; /* without this rule poshytip/tooltip does not stretch */
+}
+
+.editable-container.popover {
+/* width: 300px;*/ /* debug */
+ width: auto; /* without this rule popover does not stretch */
+}
+
+.editable-container.editable-inline {
+/* display: inline; */ /* display: inline does not correctly work with show()/hide() in jquery <= 1.7.2 */
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.editable-container.ui-widget {
+ font-size: inherit; /* jqueryui widget font 1.1em too big, overwrite it */
+}
+.editable-click,
+a.editable-click,
+a.editable-click:hover {
+ text-decoration: none;
+ border-bottom: dashed 1px #0088cc;
+}
+
+.editable-click.editable-disabled,
+a.editable-click.editable-disabled,
+a.editable-click.editable-disabled:hover {
+ color: #585858;
+ cursor: default;
+ border-bottom: none;
+}
+
+.editable-empty, .editable-empty:hover{
+ font-style: italic;
+ color: #DD1144;
+ border-bottom: none;
+ text-decoration: none;
+}
+
+.editable-unsaved {
+ font-weight: bold;
+}
+
+.editable-unsaved:after {
+/* content: '*'*/
+}
+
+
+/*!
+ * Datepicker for Bootstrap
+ *
+ * Copyright 2012 Stefan Petre
+ * Improvements by Andrew Rowls
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ */
+.datepicker {
+ padding: 4px;
+ margin-top: 1px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ /*.dow {
+ border-top: 1px solid #ddd !important;
+ }*/
+}
+
+.datepicker-inline {
+ width: 220px;
+/* height: 220px; */
+}
+
+.datepicker-float {
+ top: 0;
+ left: 0;
+}
+
+.datepicker-float:before {
+ content: '';
+ display: inline-block;
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ border-bottom: 7px solid #ccc;
+ border-bottom-color: rgba(0, 0, 0, 0.2);
+ position: absolute;
+ top: -7px;
+ left: 6px;
+}
+.datepicker-float:after {
+ content: '';
+ display: inline-block;
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid #ffffff;
+ position: absolute;
+ top: -6px;
+ left: 7px;
+}
+.datepicker > div {
+ display: none;
+}
+.datepicker.days div.datepicker-days {
+ display: block;
+}
+.datepicker.months div.datepicker-months {
+ display: block;
+}
+.datepicker.years div.datepicker-years {
+ display: block;
+}
+.datepicker table {
+ margin: 0;
+}
+.datepicker td,
+.datepicker th {
+ text-align: center;
+ width: 20px;
+ height: 20px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ /* vitalets: required to disable css inheritance when display inline inside table */
+ border: none !important;
+ background-color: transparent !important;
+}
+.datepicker td.day:hover {
+ background: #eeeeee !important; /* disable inheritance for inline */
+ cursor: pointer;
+}
+.datepicker td.old,
+.datepicker td.new {
+ color: #999999;
+}
+.datepicker td.disabled,
+.datepicker td.disabled:hover {
+ background: none;
+ color: #999999;
+ cursor: default;
+}
+.datepicker td.today,
+.datepicker td.today:hover,
+.datepicker td.today.disabled,
+.datepicker td.today.disabled:hover {
+ background-color: #fde19a !important; /* disable inheritance for inline */
+ background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a);
+ background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));
+ background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a);
+ background-image: -o-linear-gradient(top, #fdd49a, #fdf59a);
+ background-image: linear-gradient(top, #fdd49a, #fdf59a);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);
+ border-color: #fdf59a #fdf59a #fbed50;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+}
+.datepicker td.today:hover,
+.datepicker td.today:hover:hover,
+.datepicker td.today.disabled:hover,
+.datepicker td.today.disabled:hover:hover,
+.datepicker td.today:active,
+.datepicker td.today:hover:active,
+.datepicker td.today.disabled:active,
+.datepicker td.today.disabled:hover:active,
+.datepicker td.today.active,
+.datepicker td.today:hover.active,
+.datepicker td.today.disabled.active,
+.datepicker td.today.disabled:hover.active,
+.datepicker td.today.disabled,
+.datepicker td.today:hover.disabled,
+.datepicker td.today.disabled.disabled,
+.datepicker td.today.disabled:hover.disabled,
+.datepicker td.today[disabled],
+.datepicker td.today:hover[disabled],
+.datepicker td.today.disabled[disabled],
+.datepicker td.today.disabled:hover[disabled] {
+ background-color: #fdf59a !important; /* disable inheritance for inline */
+}
+.datepicker td.today:active,
+.datepicker td.today:hover:active,
+.datepicker td.today.disabled:active,
+.datepicker td.today.disabled:hover:active,
+.datepicker td.today.active,
+.datepicker td.today:hover.active,
+.datepicker td.today.disabled.active,
+.datepicker td.today.disabled:hover.active {
+ background-color: #fbf069 \9;
+}
+.datepicker td.active,
+.datepicker td.active:hover,
+.datepicker td.active.disabled,
+.datepicker td.active.disabled:hover {
+ background-color: #006dcc !important; /* disable inheritance for inline */
+ background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -ms-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+ background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+ background-image: linear-gradient(top, #0088cc, #0044cc);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
+ border-color: #0044cc #0044cc #002a80;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+ color: #fff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker td.active:hover,
+.datepicker td.active:hover:hover,
+.datepicker td.active.disabled:hover,
+.datepicker td.active.disabled:hover:hover,
+.datepicker td.active:active,
+.datepicker td.active:hover:active,
+.datepicker td.active.disabled:active,
+.datepicker td.active.disabled:hover:active,
+.datepicker td.active.active,
+.datepicker td.active:hover.active,
+.datepicker td.active.disabled.active,
+.datepicker td.active.disabled:hover.active,
+.datepicker td.active.disabled,
+.datepicker td.active:hover.disabled,
+.datepicker td.active.disabled.disabled,
+.datepicker td.active.disabled:hover.disabled,
+.datepicker td.active[disabled],
+.datepicker td.active:hover[disabled],
+.datepicker td.active.disabled[disabled],
+.datepicker td.active.disabled:hover[disabled] {
+ background-color: #0044cc;
+}
+.datepicker td.active:active,
+.datepicker td.active:hover:active,
+.datepicker td.active.disabled:active,
+.datepicker td.active.disabled:hover:active,
+.datepicker td.active.active,
+.datepicker td.active:hover.active,
+.datepicker td.active.disabled.active,
+.datepicker td.active.disabled:hover.active {
+ background-color: #003399 \9;
+}
+.datepicker td span {
+ display: block;
+ width: 23%;
+ height: 54px;
+ line-height: 54px;
+ float: left;
+ margin: 1%;
+ cursor: pointer;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+.datepicker td span:hover {
+ background: #eeeeee;
+}
+.datepicker td span.disabled,
+.datepicker td span.disabled:hover {
+ background: none;
+ color: #999999;
+ cursor: default;
+}
+.datepicker td span.active,
+.datepicker td span.active:hover,
+.datepicker td span.active.disabled,
+.datepicker td span.active.disabled:hover {
+ background-color: #006dcc;
+ background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -ms-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+ background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+ background-image: linear-gradient(top, #0088cc, #0044cc);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
+ border-color: #0044cc #0044cc #002a80;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+ color: #fff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker td span.active:hover,
+.datepicker td span.active:hover:hover,
+.datepicker td span.active.disabled:hover,
+.datepicker td span.active.disabled:hover:hover,
+.datepicker td span.active:active,
+.datepicker td span.active:hover:active,
+.datepicker td span.active.disabled:active,
+.datepicker td span.active.disabled:hover:active,
+.datepicker td span.active.active,
+.datepicker td span.active:hover.active,
+.datepicker td span.active.disabled.active,
+.datepicker td span.active.disabled:hover.active,
+.datepicker td span.active.disabled,
+.datepicker td span.active:hover.disabled,
+.datepicker td span.active.disabled.disabled,
+.datepicker td span.active.disabled:hover.disabled,
+.datepicker td span.active[disabled],
+.datepicker td span.active:hover[disabled],
+.datepicker td span.active.disabled[disabled],
+.datepicker td span.active.disabled:hover[disabled] {
+ background-color: #0044cc;
+}
+.datepicker td span.active:active,
+.datepicker td span.active:hover:active,
+.datepicker td span.active.disabled:active,
+.datepicker td span.active.disabled:hover:active,
+.datepicker td span.active.active,
+.datepicker td span.active:hover.active,
+.datepicker td span.active.disabled.active,
+.datepicker td span.active.disabled:hover.active {
+ background-color: #003399 \9;
+}
+.datepicker td span.old {
+ color: #999999;
+}
+.datepicker th.switch {
+ width: 145px;
+}
+.datepicker thead tr:first-child th,
+.datepicker tfoot tr:first-child th {
+ cursor: pointer;
+}
+.datepicker thead tr:first-child th:hover,
+.datepicker tfoot tr:first-child th:hover {
+ background: #eeeeee;
+}
+.input-append.date .add-on i,
+.input-prepend.date .add-on i {
+ display: block;
+ cursor: pointer;
+ width: 16px;
+ height: 16px;
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/css/img/loading.gif b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/css/img/loading.gif
new file mode 100644
index 0000000..5b33f7e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/css/img/loading.gif
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/js/bootstrap-editable-inline.min.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/js/bootstrap-editable-inline.min.js
new file mode 100644
index 0000000..ed749a3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/js/bootstrap-editable-inline.min.js
@@ -0,0 +1,5 @@
+/*! X-editable - v1.3.0
+* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery
+* http://github.com/vitalets/x-editable
+* Copyright (c) 2012 Vitaliy Potapov; Licensed MIT */
+(function(e){var t=function(t,n){this.options=e.extend({},e.fn.editableform.defaults,n),this.$div=e(t),this.options.scope||(this.options.scope=this),this.initInput()};t.prototype={constructor:t,initInput:function(){var t,n;if(typeof e.fn.editabletypes[this.options.type]!="function"){e.error("Unknown type: "+this.options.type);return}t=e.fn.editabletypes[this.options.type],n=e.fn.editableutils.sliceObj(this.options,e.fn.editableutils.objectKeys(t.defaults)),this.input=new t(n),this.value=this.input.str2value(this.options.value)},initTemplate:function(){this.$form=e(e.fn.editableform.template)},initButtons:function(){this.$form.find(".editable-buttons").append(e.fn.editableform.buttons)},render:function(){this.$loading=e(e.fn.editableform.loading),this.$div.empty().append(this.$loading),this.showLoading(),this.initTemplate(),this.options.showbuttons?this.initButtons():this.$form.find(".editable-buttons").remove(),this.$div.triggerHandler("rendering"),e.when(this.input.render()).then(e.proxy(function(){this.$form.find("div.editable-input").append(this.input.$input),this.options.showbuttons||this.input.autosubmit(),this.input.$clear&&this.$form.find("div.editable-input").append(e('<div class="editable-clear">').append(this.input.$clear)),this.$div.append(this.$form),this.$form.find(".editable-cancel").click(e.proxy(this.cancel,this)),this.input.error?(this.error(this.input.error),this.$form.find(".editable-submit").attr("disabled",!0),this.input.$input.attr("disabled",!0),this.$form.submit(function(e){e.preventDefault()})):(this.error(!1),this.input.$input.removeAttr("disabled"),this.$form.find(".editable-submit").removeAttr("disabled"),this.input.value2input(this.value),this.$form.submit(e.proxy(this.submit,this))),this.$div.triggerHandler("rendered"),this.showForm()},this))},cancel:function(){this.$div.triggerHandler("cancel")},showLoading:function(){var e;this.$form?(this.$loading.width(this.$form.outerWidth()),this.$loading.height(this.$form.outerHeight()),this.$form.hide()):(e=this.$loading.parent().width(),e&&this.$loading.width(e)),this.$loading.show()},showForm:function(e){this.$loading.hide(),this.$form.show(),e!==!1&&this.input.activate(),this.$div.triggerHandler("show")},error:function(t){var n=this.$form.find(".control-group"),r=this.$form.find(".editable-error-block");t===!1?(n.removeClass(e.fn.editableform.errorGroupClass),r.removeClass(e.fn.editableform.errorBlockClass).empty().hide()):(n.addClass(e.fn.editableform.errorGroupClass),r.addClass(e.fn.editableform.errorBlockClass).text(t).show())},submit:function(t){t.stopPropagation(),t.preventDefault();var n,r=this.input.input2value();if(n=this.validate(r)){this.error(n),this.showForm();return}if(!this.options.savenochange&&this.input.value2str(r)==this.input.value2str(this.value)){this.$div.triggerHandler("nochange");return}e.when(this.save(r)).done(e.proxy(function(e){var t=typeof this.options.success=="function"?this.options.success.call(this.options.scope,e,r):null;if(t===!1){this.error(!1),this.showForm(!1);return}if(typeof t=="string"){this.error(t),this.showForm();return}t&&typeof t=="object"&&t.hasOwnProperty("newValue")&&(r=t.newValue),this.error(!1),this.value=r,this.$div.triggerHandler("save",{newValue:r,response:e})},this)).fail(e.proxy(function(e){this.error(typeof e=="string"?e:e.responseText||e.statusText||"Unknown error!"),this.showForm()},this))},save:function(t){var n=this.input.value2submit(t);this.options.pk=e.fn.editableutils.tryParseJson(this.options.pk,!0);var r=typeof this.options.pk=="function"?this.options.pk.call(this.options.scope):this.options.pk,i=!!(typeof this.options.url=="function"||this.options.url&&(this.options.send==="always"||this.options.send==="auto"&&r)),s;if(i)return this.showLoading(),s={name:this.options.name||"",value:n,pk:r},typeof this.options.params=="function"?s=this.options.params.call(this.options.scope,s):(this.options.params=e.fn.editableutils.tryParseJson(this.options.params,!0),e.extend(s,this.options.params)),typeof this.options.url=="function"?this.options.url.call(this.options.scope,s):e.ajax(e.extend({url:this.options.url,data:s,type:"POST"},this.options.ajaxOptions))},validate:function(e){e===undefined&&(e=this.value);if(typeof this.options.validate=="function")return this.options.validate.call(this.options.scope,e)},option:function(e,t){this.options[e]=t,e==="value"&&this.setValue(t)},setValue:function(e,t){t?this.value=this.input.str2value(e):this.value=e}},e.fn.editableform=function(n){var r=arguments;return this.each(function(){var i=e(this),s=i.data("editableform"),o=typeof n=="object"&&n;s||i.data("editableform",s=new t(this,o)),typeof n=="string"&&s[n].apply(s,Array.prototype.slice.call(r,1))})},e.fn.editableform.Constructor=t,e.fn.editableform.defaults={type:"text",url:null,params:null,name:null,pk:null,value:null,send:"auto",validate:null,success:null,ajaxOptions:null,showbuttons:!0,scope:null,savenochange:!1},e.fn.editableform.template='<form class="form-inline editableform"><div class="control-group"><div><div class="editable-input"></div><div class="editable-buttons"></div></div><div class="editable-error-block"></div></div></form>',e.fn.editableform.loading='<div class="editableform-loading"></div>',e.fn.editableform.buttons='<button type="submit" class="editable-submit">ok</button><button type="button" class="editable-cancel">cancel</button>',e.fn.editableform.errorGroupClass=null,e.fn.editableform.errorBlockClass="editable-error"})(window.jQuery),function(e){e.fn.editableutils={inherit:function(e,t){var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e,e.superclass=t.prototype},setCursorPosition:function(e,t){if(e.setSelectionRange)e.setSelectionRange(t,t);else if(e.createTextRange){var n=e.createTextRange();n.collapse(!0),n.moveEnd("character",t),n.moveStart("character",t),n.select()}},tryParseJson:function(e,t){if(typeof e=="string"&&e.length&&e.match(/^[\{\[].*[\}\]]$/))if(t)try{e=(new Function("return "+e))()}catch(n){}finally{return e}else e=(new Function("return "+e))();return e},sliceObj:function(t,n,r){var i,s,o={};if(!e.isArray(n)||!n.length)return o;for(var u=0;u<n.length;u++){i=n[u],t.hasOwnProperty(i)&&(o[i]=t[i]);if(r===!0)continue;s=i.toLowerCase(),t.hasOwnProperty(s)&&(o[i]=t[s])}return o},getConfigData:function(t){var n={};return e.each(t.data(),function(e,t){if(typeof t!="object"||t&&typeof t=="object"&&t.constructor===Object)n[e]=t}),n},objectKeys:function(e){if(Object.keys)return Object.keys(e);if(e!==Object(e))throw new TypeError("Object.keys called on a non-object");var t=[],n;for(n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.push(n);return t},escape:function(t){return e("<div>").text(t).html()}}}(window.jQuery),function(e){var t=function(e,t){this.init(e,t)};t.prototype={containerName:null,innerCss:null,init:function(n,r){this.$element=e(n),this.options=e.extend({},e.fn.editableContainer.defaults,e.fn.editableutils.getConfigData(this.$element),r),this.splitOptions(),this.initContainer(),this.$element.on("destroyed",e.proxy(function(){this.destroy()},this)),e(document).data("editable-handlers-attached")||(e(document).on("keyup.editable",function(t){t.which===27&&e(".editable-open").editableContainer("hide")}),e(document).on("click.editable",function(n){var r=e(n.target);if(r.is(".editable-container")||r.parents(".editable-container").length||r.parents(".ui-datepicker-header").length)return;t.prototype.closeOthers(n.target)}),e(document).data("editable-handlers-attached",!0))},splitOptions:function(){this.containerOptions={},this.formOptions={};var t=e.fn[this.containerName].defaults;for(var n in this.options)n in t?this.containerOptions[n]=this.options[n]:this.formOptions[n]=this.options[n]},initContainer:function(){this.call(this.containerOptions)},initForm:function(){return this.formOptions.scope=this.$element[0],this.$form=e("<div>").editableform(this.formOptions).on({save:e.proxy(this.save,this),cancel:e.proxy(function(){this.hide("cancel")},this),nochange:e.proxy(function(){this.hide("nochange")},this),show:e.proxy(this.setPosition,this),rendering:e.proxy(this.setPosition,this),rendered:e.proxy(function(){this.$element.triggerHandler("shown")},this)}),this.$form},tip:function(){return this.container().$tip},container:function(){return this.$element.data(this.containerName)},call:function(){this.$element[this.containerName].apply(this.$element,arguments)},show:function(e){this.$element.addClass("editable-open"),e!==!1&&this.closeOthers(this.$element[0]),this.innerShow()},innerShow:function(){this.call("show"),this.tip().addClass("editable-container"),this.initForm(),this.tip().find(this.innerCss).empty().append(this.$form),this.$form.editableform("render")},hide:function(e){if(!this.tip()||!this.tip().is(":visible")||!this.$element.hasClass("editable-open"))return;this.$element.removeClass("editable-open"),this.innerHide(),this.$element.triggerHandler("hidden",e)},innerHide:function(){this.call("hide")},toggle:function(e){this.tip&&this.tip().is(":visible")?this.hide():this.show(e)},setPosition:function(){},save:function(e,t){this.hide("save"),this.$element.triggerHandler("save",t)},option:function(e,t){this.options[e]=t,e in this.containerOptions?(this.containerOptions[e]=t,this.setContainerOption(e,t)):(this.formOptions[e]=t,this.$form&&this.$form.editableform("option",e,t))},setContainerOption:function(e,t){this.call("option",e,t)},destroy:function(){this.call("destroy")},closeOthers:function(t){e(".editable-open").each(function(n,r){if(r===t||e(r).find(t).length)return;var i=e(r),s=i.data("editableContainer");if(!s)return;s.options.onblur==="cancel"?i.data("editableContainer").hide("onblur"):s.options.onblur==="submit"&&i.data("editableContainer").tip().find("form").submit()})},activate:function(){this.tip&&this.tip().is(":visible")&&this.$form&&this.$form.data("editableform").input.activate()}},e.fn.editableContainer=function(n){var r=arguments;return this.each(function(){var i=e(this),s="editableContainer",o=i.data(s),u=typeof n=="object"&&n;o||i.data(s,o=new t(this,u)),typeof n=="string"&&o[n].apply(o,Array.prototype.slice.call(r,1))})},e.fn.editableContainer.Constructor=t,e.fn.editableContainer.defaults={value:null,placement:"top",autohide:!0,onblur:"cancel"},jQuery.event.special.destroyed={remove:function(e){e.handler&&e.handler()}}}(window.jQuery),function(e){var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.editable.defaults,e.fn.editableutils.getConfigData(this.$element),n),this.init()};t.prototype={constructor:t,init:function(){var t,n=!1,r,i;if(!e.fn.editableContainer){e.error("You must define $.fn.editableContainer via including corresponding file (e.g. editable-popover.js)");return}this.options.name=this.options.name||this.$element.attr("id");if(typeof e.fn.editabletypes[this.options.type]!="function"){e.error("Unknown type: "+this.options.type);return}t=e.fn.editabletypes[this.options.type],this.typeOptions=e.fn.editableutils.sliceObj(this.options,e.fn.editableutils.objectKeys(t.defaults)),this.input=new t(this.typeOptions),this.options.value===undefined||this.options.value===null?(this.value=this.input.html2value(e.trim(this.$element.html())),n=!0):(this.options.value=e.fn.editableutils.tryParseJson(this.options.value,!0),typeof this.options.value=="string"?this.value=this.input.str2value(this.options.value):this.value=this.options.value),this.$element.addClass("editable"),this.options.toggle!=="manual"?(this.$element.addClass("editable-click"),this.$element.on(this.options.toggle+".editable",e.proxy(function(e){e.preventDefault();if(this.options.toggle==="mouseenter")this.show();else{var t=this.options.toggle!=="click";this.toggle(t)}},this))):this.$element.attr("tabindex",-1),r=!n&&this.value!==null&&this.value!==undefined,r&=this.options.autotext==="always"||this.options.autotext==="auto"&&!this.$element.text().length,e.when(r?this.render():!0).then(e.proxy(function(){this.options.disabled?this.disable():this.enable(),this.$element.triggerHandler("init",this)},this))},render:function(){if(this.options.display===!1)return;return this.input.options.hasOwnProperty("source")?this.input.value2html(this.value,this.$element[0],this.options.display):typeof this.options.display=="function"?this.options.display.call(this.$element[0],this.value):this.input.value2html(this.value,this.$element[0])},enable:function(){this.options.disabled=!1,this.$element.removeClass("editable-disabled"),this.handleEmpty(),this.options.toggle!=="manual"&&this.$element.attr("tabindex")==="-1"&&this.$element.removeAttr("tabindex")},disable:function(){this.options.disabled=!0,this.hide(),this.$element.addClass("editable-disabled"),this.handleEmpty(),this.$element.attr("tabindex",-1)},toggleDisabled:function(){this.options.disabled?this.enable():this.disable()},option:function(t,n){if(t&&typeof t=="object"){e.each(t,e.proxy(function(t,n){this.option(e.trim(t),n)},this));return}this.options[t]=n;if(t==="disabled"){n?this.disable():this.enable();return}t==="value"&&this.setValue(n),this.container&&this.container.option(t,n)},handleEmpty:function(){if(this.options.display===!1)return;var t="editable-empty";this.options.disabled?this.$element.hasClass(t)&&(this.$element.empty(),this.$element.removeClass(t)):e.trim(this.$element.text())===""?this.$element.addClass(t).text(this.options.emptytext):this.$element.removeClass(t)},show:function(t){if(this.options.disabled)return;if(!this.container){var n=e.extend({},this.options,{value:this.value});this.$element.editableContainer(n),this.$element.on("save.internal",e.proxy(this.save,this)),this.container=this.$element.data("editableContainer")}else if(this.container.tip().is(":visible"))return;this.container.show(t)},hide:function(){this.container&&this.container.hide()},toggle:function(e){this.container&&this.container.tip().is(":visible")?this.hide():this.show(e)},save:function(e,t){typeof this.options.url!="function"&&this.options.display!==!1&&t.response===undefined&&this.input.value2str(this.value)!==this.input.value2str(t.newValue)?this.$element.addClass("editable-unsaved"):this.$element.removeClass("editable-unsaved"),this.setValue(t.newValue)},validate:function(){if(typeof this.options.validate=="function")return this.options.validate.call(this,this.value)},setValue:function(t,n){n?this.value=this.input.str2value(t):this.value=t,this.container&&this.container.option("value",this.value),e.when(this.render()).then(e.proxy(function(){this.handleEmpty()},this))},activate:function(){this.container&&this.container.activate()}},e.fn.editable=function(n){var r={},i=arguments,s="editable";switch(n){case"validate":return this.each(function(){var t=e(this),n=t.data(s),i;n&&(i=n.validate())&&(r[n.options.name]=i)}),r;case"getValue":return this.each(function(){var t=e(this),n=t.data(s);n&&n.value!==undefined&&n.value!==null&&(r[n.options.name]=n.input.value2submit(n.value))}),r;case"submit":var o=arguments[1]||{},u=this,a=this.editable("validate"),f;return e.isEmptyObject(a)?(f=this.editable("getValue"),o.data&&e.extend(f,o.data),e.ajax(e.extend({url:o.url,data:f,type:"POST"},o.ajaxOptions)).success(function(e){typeof o.success=="function"&&o.success.call(u,e,o)}).error(function(){typeof o.error=="function"&&o.error.apply(u,arguments)})):typeof o.error=="function"&&o.error.call(u,a),this}return this.each(function(){var r=e(this),o=r.data(s),u=typeof n=="object"&&n;o||r.data(s,o=new t(this,u)),typeof n=="string"&&o[n].apply(o,Array.prototype.slice.call(i,1))})},e.fn.editable.defaults={type:"text",disabled:!1,toggle:"click",emptytext:"Empty",autotext:"auto",value:null,display:null}}(window.jQuery),function(e){e.fn.editabletypes={};var t=function(){};t.prototype={init:function(t,n,r){this.type=t,this.options=e.extend({},r,n),this.$input=null,this.$clear=null,this.error=null},render:function(){this.$input=e(this.options.tpl),this.options.inputclass&&this.$input.addClass(this.options.inputclass),this.options.placeholder&&this.$input.attr("placeholder",this.options.placeholder)},value2html:function(t,n){e(n).text(t)},html2value:function(t){return e("<div>").html(t).text()},value2str:function(e){return e},str2value:function(e){return e},value2submit:function(e){return e},value2input:function(e){this.$input.val(e)},input2value:function(){return this.$input.val()},activate:function(){this.$input.is(":visible")&&this.$input.focus()},clear:function(){this.$input.val(null)},escape:function(t){return e("<div>").text(t).html()},autosubmit:function(){}},t.defaults={tpl:"",inputclass:"input-medium",name:null},e.extend(e.fn.editabletypes,{abstractinput:t})}(window.jQuery),function(e){var t=function(e){};e.fn.editableutils.inherit(t,e.fn.editabletypes.abstractinput),e.extend(t.prototype,{render:function(){t.superclass.render.call(this);var n=e.Deferred();return this.error=null,this.sourceData=null,this.prependData=null,this.onSourceReady(function(){this.renderList(),n.resolve()},function(){this.error=this.options.sourceError,n.resolve()}),n.promise()},html2value:function(e){return null},value2html:function(t,n,r){var i=e.Deferred();return this.onSourceReady(function(){typeof r=="function"?r.call(n,t,this.sourceData):this.value2htmlFinal(t,n),i.resolve()},function(){i.resolve()}),i.promise()},onSourceReady:function(t,n){if(e.isArray(this.sourceData)){t.call(this);return}try{this.options.source=e.fn.editableutils.tryParseJson(this.options.source,!1)}catch(r){n.call(this);return}if(typeof this.options.source=="string"){if(this.options.sourceCache){var i=this.options.source+(this.options.name?"-"+this.options.name:""),s;e(document).data(i)||e(document).data(i,{}),s=e(document).data(i);if(s.loading===!1&&s.sourceData){this.sourceData=s.sourceData,t.call(this);return}if(s.loading===!0){s.callbacks.push(e.proxy(function(){this.sourceData=s.sourceData,t.call(this)},this)),s.err_callbacks.push(e.proxy(n,this));return}s.loading=!0,s.callbacks=[],s.err_callbacks=[]}e.ajax({url:this.options.source,type:"get",cache:!1,data:this.options.name?{name:this.options.name}:{},dataType:"json",success:e.proxy(function(r){s&&(s.loading=!1),this.sourceData=this.makeArray(r),e.isArray(this.sourceData)?(this.doPrepend(),t.call(this),s&&(s.sourceData=this.sourceData,e.each(s.callbacks,function(){this.call()}))):(n.call(this),s&&e.each(s.err_callbacks,function(){this.call()}))},this),error:e.proxy(function(){n.call(this),s&&(s.loading=!1,e.each(s.err_callbacks,function(){this.call()}))},this)})}else this.sourceData=this.makeArray(this.options.source),e.isArray(this.sourceData)?(this.doPrepend(),t.call(this)):n.call(this)},doPrepend:function(){if(this.options.prepend===null||this.options.prepend===undefined)return;e.isArray(this.prependData)||(this.options.prepend=e.fn.editableutils.tryParseJson(this.options.prepend,!0),typeof this.options.prepend=="string"&&(this.options.prepend={"":this.options.prepend}),this.prependData=this.makeArray(this.options.prepend)),e.isArray(this.prependData)&&e.isArray(this.sourceData)&&(this.sourceData=this.prependData.concat(this.sourceData))},renderList:function(){},value2htmlFinal:function(e,t){},makeArray:function(t){var n,r,i=[],s;if(!t||typeof t=="string")return null;if(e.isArray(t)){s=function(e,t){r={value:e,text:t};if(n++>=2)return!1};for(var o=0;o<t.length;o++)typeof t[o]=="object"?(n=0,e.each(t[o],s),n===1?i.push(r):n>1&&t[o].hasOwnProperty("value")&&t[o].hasOwnProperty("text")&&i.push(t[o])):i.push({value:t[o],text:t[o]})}else e.each(t,function(e,t){i.push({value:e,text:t})});return i},itemByVal:function(t){if(e.isArray(this.sourceData))for(var n=0;n<this.sourceData.length;n++)if(this.sourceData[n].value==t)return this.sourceData[n]}}),t.defaults=e.extend({},e.fn.editabletypes.abstractinput.defaults,{source:null,prepend:!1,sourceError:"Error when loading list",sourceCache:!0}),e.fn.editabletypes.list=t}(window.jQuery),function(e){var t=function(e){this.init("text",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.abstractinput),e.extend(t.prototype,{activate:function(){this.$input.is(":visible")&&(this.$input.focus(),e.fn.editableutils.setCursorPosition(this.$input.get(0),this.$input.val().length))}}),t.defaults=e.extend({},e.fn.editabletypes.abstractinput.defaults,{tpl:'<input type="text">',placeholder:null}),e.fn.editabletypes.text=t}(window.jQuery),function(e){var t=function(e){this.init("textarea",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.abstractinput),e.extend(t.prototype,{render:function(){t.superclass.render.call(this),this.$input.keydown(function(t){t.ctrlKey&&t.which===13&&e(this).closest("form").submit()})},value2html:function(t,n){var r="",i;if(t){i=t.split("\n");for(var s=0;s<i.length;s++)i[s]=e("<div>").text(i[s]).html();r=i.join("<br>")}e(n).html(r)},html2value:function(t){if(!t)return"";var n=t.split(/<br\s*\/?>/i);for(var r=0;r<n.length;r++)n[r]=e("<div>").html(n[r]).text();return n.join("\n")},activate:function(){this.$input.is(":visible")&&(e.fn.editableutils.setCursorPosition(this.$input.get(0),this.$input.val().length),this.$input.focus())}}),t.defaults=e.extend({},e.fn.editabletypes.abstractinput.defaults,{tpl:"<textarea></textarea>",inputclass:"input-large",placeholder:null}),e.fn.editabletypes.textarea=t}(window.jQuery),function(e){var t=function(e){this.init("select",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.list),e.extend(t.prototype,{renderList:function(){if(!e.isArray(this.sourceData))return;for(var t=0;t<this.sourceData.length;t++)this.$input.append(e("<option>",{value:this.sourceData[t].value}).text(this.sourceData[t].text));this.$input.on("keydown.editable",function(t){t.which===13&&e(this).closest("form").submit()})},value2htmlFinal:function(e,n){var r="",i=this.itemByVal(e);i&&(r=i.text),t.superclass.constructor.superclass.value2html(r,n)},autosubmit:function(){this.$input.off("keydown.editable").on("change.editable",function(){e(this).closest("form").submit()})}}),t.defaults=e.extend({},e.fn.editabletypes.list.defaults,{tpl:"<select></select>"}),e.fn.editabletypes.select=t}(window.jQuery),function(e){var t=function(e){this.init("checklist",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.list),e.extend(t.prototype,{renderList:function(){var t,n;if(!e.isArray(this.sourceData))return;for(var r=0;r<this.sourceData.length;r++)t=e("<label>").append(e("<input>",{type:"checkbox",value:this.sourceData[r].value,name:this.options.name})).append(e("<span>").text(" "+this.sourceData[r].text)),e("<div>").append(t).appendTo(this.$input)},value2str:function(t){return e.isArray(t)?t.sort().join(e.trim(this.options.separator)):""},str2value:function(t){var n,r=null;return typeof t=="string"&&t.length?(n=new RegExp("\\s*"+e.trim(this.options.separator)+"\\s*"),r=t.split(n)):e.isArray(t)&&(r=t),r},value2input:function(t){var n=this.$input.find('input[type="checkbox"]');n.removeAttr("checked"),e.isArray(t)&&t.length&&n.each(function(n,r){var i=e(r);e.each(t,function(e,t){i.val()==t&&i.attr("checked","checked")})})},input2value:function(){var t=[];return this.$input.find("input:checked").each(function(n,r){t.push(e(r).val())}),t},value2htmlFinal:function(t,n){var r=[],i=e.grep(this.sourceData,function(n){return e.grep(t,function(e){return e==n.value}).length});i.length?(e.each(i,function(t,n){r.push(e.fn.editableutils.escape(n.text))}),e(n).html(r.join("<br>"))):e(n).empty()},activate:function(){this.$input.find('input[type="checkbox"]').first().focus()},autosubmit:function(){this.$input.find('input[type="checkbox"]').on("keydown",function(t){t.which===13&&e(this).closest("form").submit()})}}),t.defaults=e.extend({},e.fn.editabletypes.list.defaults,{tpl:"<div></div>",inputclass:"editable-checklist",separator:","}),e.fn.editabletypes.checklist=t}(window.jQuery),function(e){var t=function(e){this.init("password",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.text),e.extend(t.prototype,{value2html:function(t,n){t?e(n).text("[hidden]"):e(n).empty()},html2value:function(e){return null}}),t.defaults=e.extend({},e.fn.editabletypes.text.defaults,{tpl:'<input type="password">'}),e.fn.editabletypes.password=t}(window.jQuery),function(e){var t=function(e){this.init("email",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.text),t.defaults=e.extend({},e.fn.editabletypes.text.defaults,{tpl:'<input type="email">'}),e.fn.editabletypes.email=t}(window.jQuery),function(e){var t=function(e){this.init("url",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.text),t.defaults=e.extend({},e.fn.editabletypes.text.defaults,{tpl:'<input type="url">'}),e.fn.editabletypes.url=t}(window.jQuery),function(e){var t=function(e){this.init("tel",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.text),t.defaults=e.extend({},e.fn.editabletypes.text.defaults,{tpl:'<input type="tel">'}),e.fn.editabletypes.tel=t}(window.jQuery),function(e){var t=function(e){this.init("number",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.text),e.extend(t.prototype,{render:function(){t.superclass.render.call(this),this.options.min!==null&&this.$input.attr("min",this.options.min),this.options.max!==null&&this.$input.attr("max",this.options.max),this.options.step!==null&&this.$input.attr("step",this.options.step)}}),t.defaults=e.extend({},e.fn.editabletypes.text.defaults,{tpl:'<input type="number">',inputclass:"input-mini",min:null,max:null,step:null}),e.fn.editabletypes.number=t}(window.jQuery),function(e){var t=function(e){this.init("range",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.number),e.extend(t.prototype,{render:function(){this.$input=e(this.options.tpl);var t=this.$input.filter("input");this.options.inputclass&&t.addClass(this.options.inputclass),this.options.min!==null&&t.attr("min",this.options.min),this.options.max!==null&&t.attr("max",this.options.max),this.options.step!==null&&t.attr("step",this.options.step),t.on("input",function(){e(this).siblings("output").text(e(this).val())})},activate:function(){this.$input.filter("input").focus()}}),t.defaults=e.extend({},e.fn.editabletypes.number.defaults,{tpl:'<input type="range"><output style="width: 30px; display: inline-block"></output>',inputclass:"input-medium"}),e.fn.editabletypes.range=t}(window.jQuery),function(e){e.extend(e.fn.editableform.Constructor.prototype,{initTemplate:function(){this.$form=e(e.fn.editableform.template),this.$form.find(".editable-error-block").addClass("help-block")}}),e.fn.editableform.buttons='<button type="submit" class="btn btn-primary editable-submit"><i class="icon-ok icon-white"></i></button><button type="button" class="btn editable-cancel"><i class="icon-remove"></i></button>',e.fn.editableform.errorGroupClass="error",e.fn.editableform.errorBlockClass=null}(window.jQuery),function(e){e.extend(e.fn.editableContainer.Constructor.prototype,{containerName:"editableform",innerCss:null,initContainer:function(){this.options.anim||(this.options.anim=0)},splitOptions:function(){this.containerOptions={},this.formOptions=this.options},tip:function(){return this.$form},innerShow:function(){this.$element.hide(),this.$form&&this.$form.remove(),this.initForm(),this.tip().addClass("editable-container").addClass("editable-inline"),this.$form.insertAfter(this.$element),this.$form.show(this.options.anim),this.$form.editableform("render")},innerHide:function(){this.$form.hide(this.options.anim,e.proxy(function(){this.$element.show()},this))},destroy:function(){this.tip().remove()}}),e.fn.editableContainer.defaults=e.extend({},e.fn.editableContainer.defaults,{anim:"fast"})}(window.jQuery),function(e){var t=function(n){this.init("date",n,t.defaults);var r=e.fn.editableutils.sliceObj(this.options,["format"]);this.options.datepicker=e.extend({},t.defaults.datepicker,r,n.datepicker),this.options.viewformat||(this.options.viewformat=this.options.datepicker.format),this.options.datepicker.language=this.options.datepicker.language||"en",this.dpg=e.fn.datepicker.DPGlobal,this.parsedFormat=this.dpg.parseFormat(this.options.datepicker.format),this.parsedViewFormat=this.dpg.parseFormat(this.options.viewformat)};e.fn.editableutils.inherit(t,e.fn.editabletypes.abstractinput),e.extend(t.prototype,{render:function(){t.superclass.render.call(this),this.$input.datepicker(this.options.datepicker),this.options.clear&&(this.$clear=e('<a href="#"></a>').html(this.options.clear).click(e.proxy(function(e){e.preventDefault(),e.stopPropagation(),this.clear()},this)))},value2html:function(e,n){var r=e?this.dpg.formatDate(e,this.parsedViewFormat,this.options.datepicker.language):"";t.superclass.value2html(r,n)},html2value:function(e){return e?this.dpg.parseDate(e,this.parsedViewFormat,this.options.datepicker.language):null},value2str:function(e){return e?this.dpg.formatDate(e,this.parsedFormat,this.options.datepicker.language):""},str2value:function(e){return e?this.dpg.parseDate(e,this.parsedFormat,this.options.datepicker.language):null},value2submit:function(e){return this.value2str(e)},value2input:function(e){this.$input.datepicker("update",e)},input2value:function(){return this.$input.data("datepicker").date},activate:function(){},clear:function(){this.$input.data("datepicker").date=null,this.$input.find(".active").removeClass("active")},autosubmit:function(){this.$input.on("changeDate",function(t){var n=e(this).closest("form");setTimeout(function(){n.submit()},200)})}}),t.defaults=e.extend({},e.fn.editabletypes.abstractinput.defaults,{tpl:"<div></div>",inputclass:"editable-date well",format:"yyyy-mm-dd",viewformat:null,datepicker:{weekStart:0,startView:0,autoclose:!1},clear:"&times; clear"}),e.fn.editabletypes.date=t}(window.jQuery),!function(e){function t(){return new Date(Date.UTC.apply(Date,arguments))}function n(){var e=new Date;return t(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate())}var r=function(t,n){var r=this;this.element=e(t),this.language=n.language||this.element.data("date-language")||"en",this.language=this.language in i?this.language:"en",this.format=s.parseFormat(n.format||this.element.data("date-format")||"mm/dd/yyyy"),this.isInline=!1,this.isInput=this.element.is("input"),this.component=this.element.is(".date")?this.element.find(".add-on"):!1,this.hasInput=this.component&&this.element.find("input").length,this.component&&this.component.length===0&&(this.component=!1),this.isInput?this.element.on({focus:e.proxy(this.show,this),keyup:e.proxy(this.update,this),keydown:e.proxy(this.keydown,this)}):this.component&&this.hasInput?(this.element.find("input").on({focus:e.proxy(this.show,this),keyup:e.proxy(this.update,this),keydown:e.proxy(this.keydown,this)}),this.component.on("click",e.proxy(this.show,this))):this.element.is("div")?this.isInline=!0:this.element.on("click",e.proxy(this.show,this)),this.picker=e(s.template).appendTo(this.isInline?this.element:"body").on({click:e.proxy(this.click,this),mousedown:e.proxy(this.mousedown,this)}),this.isInline?this.picker.addClass("datepicker-inline"):this.picker.addClass("dropdown-menu"),e(document).on("mousedown",function(t){e(t.target).closest(".datepicker").length==0&&r.hide()}),this.autoclose=!1,"autoclose"in n?this.autoclose=n.autoclose:"dateAutoclose"in this.element.data()&&(this.autoclose=this.element.data("date-autoclose")),this.keyboardNavigation=!0,"keyboardNavigation"in n?this.keyboardNavigation=n.keyboardNavigation:"dateKeyboardNavigation"in this.element.data()&&(this.keyboardNavigation=this.element.data("date-keyboard-navigation"));switch(n.startView||this.element.data("date-start-view")){case 2:case"decade":this.viewMode=this.startViewMode=2;break;case 1:case"year":this.viewMode=this.startViewMode=1;break;case 0:case"month":default:this.viewMode=this.startViewMode=0}this.todayBtn=n.todayBtn||this.element.data("date-today-btn")||!1,this.todayHighlight=n.todayHighlight||this.element.data("date-today-highlight")||!1,this.weekStart=(n.weekStart||this.element.data("date-weekstart")||i[this.language].weekStart||0)%7,this.weekEnd=(this.weekStart+6)%7,this.startDate=-Infinity,this.endDate=Infinity,this.setStartDate(n.startDate||this.element.data("date-startdate")),this.setEndDate(n.endDate||this.element.data("date-enddate")),this.fillDow(),this.fillMonths(),this.update(),this.showMode(),this.isInline&&this.show()};r.prototype={constructor:r,show:function(t){this.picker.show(),this.height=this.component?this.component.outerHeight():this.element.outerHeight(),this.update(),this.place(),e(window).on("resize",e.proxy(this.place,this)),t&&(t.stopPropagation(),t.preventDefault()),this.element.trigger({type:"show",date:this.date})},hide:function(t){if(this.isInline)return;this.picker.hide(),e(window).off("resize",this.place),this.viewMode=this.startViewMode,this.showMode(),this.isInput||e(document).off("mousedown",this.hide),t&&t.currentTarget.value&&this.setValue(),this.element.trigger({type:"hide",date:this.date})},getDate:function(){var e=this.getUTCDate();return new Date(e.getTime()+e.getTimezoneOffset()*6e4)},getUTCDate:function(){return this.date},setDate:function(e){this.setUTCDate(new Date(e.getTime()-e.getTimezoneOffset()*6e4))},setUTCDate:function(e){this.date=e,this.setValue()},setValue:function(){var e=this.getFormattedDate();this.isInput?this.element.prop("value",e):(this.component&&this.element.find("input").prop("value",e),this.element.data("date",e))},getFormattedDate:function(e){return e==undefined&&(e=this.format),s.formatDate(this.date,e,this.language)},setStartDate:function(e){this.startDate=e||-Infinity,this.startDate!==-Infinity&&(this.startDate=s.parseDate(this.startDate,this.format,this.language)),this.update(),this.updateNavArrows()},setEndDate:function(e){this.endDate=e||Infinity,this.endDate!==Infinity&&(this.endDate=s.parseDate(this.endDate,this.format,this.language)),this.update(),this.updateNavArrows()},place:function(){if(this.isInline)return;var t=parseInt(this.element.parents().filter(function(){return e(this).css("z-index")!="auto"}).first().css("z-index"))+10,n=this.component?this.component.offset():this.element.offset();this.picker.css({top:n.top+this.height,left:n.left,zIndex:t})},update:function(){var e,t=!1;arguments&&arguments.length&&(typeof arguments[0]=="string"||arguments[0]instanceof Date)?(e=arguments[0],t=!0):e=this.isInput?this.element.prop("value"):this.element.data("date")||this.element.find("input").prop("value"),this.date=s.parseDate(e,this.format,this.language),t&&this.setValue(),this.date<this.startDate?this.viewDate=new Date(this.startDate):this.date>this.endDate?this.viewDate=new Date(this.endDate):this.viewDate=new Date(this.date),this.fill()},fillDow:function(){var e=this.weekStart,t="<tr>";while(e<this.weekStart+7)t+='<th class="dow">'+i[this.language].daysMin[e++%7]+"</th>";t+="</tr>",this.picker.find(".datepicker-days thead").append(t)},fillMonths:function(){var e="",t=0;while(t<12)e+='<span class="month">'+i[this.language].monthsShort[t++]+"</span>";this.picker.find(".datepicker-months td").html(e)},fill:function(){var e=new Date(this.viewDate),n=e.getUTCFullYear(),r=e.getUTCMonth(),o=this.startDate!==-Infinity?this.startDate.getUTCFullYear():-Infinity,u=this.startDate!==-Infinity?this.startDate.getUTCMonth():-Infinity,a=this.endDate!==Infinity?this.endDate.getUTCFullYear():Infinity,f=this.endDate!==Infinity?this.endDate.getUTCMonth():Infinity,l=this.date&&this.date.valueOf(),c=new Date;this.picker.find(".datepicker-days thead th:eq(1)").text(i[this.language].months[r]+" "+n),this.picker.find("tfoot th.today").text(i[this.language].today).toggle(this.todayBtn!==!1),this.updateNavArrows(),this.fillMonths();var h=t(n,r-1,28,0,0,0,0),p=s.getDaysInMonth(h.getUTCFullYear(),h.getUTCMonth());h.setUTCDate(p),h.setUTCDate(p-(h.getUTCDay()-this.weekStart+7)%7);var d=new Date(h);d.setUTCDate(d.getUTCDate()+42),d=d.valueOf();var v=[],m;while(h.valueOf()<d){h.getUTCDay()==this.weekStart&&v.push("<tr>"),m="";if(h.getUTCFullYear()<n||h.getUTCFullYear()==n&&h.getUTCMonth()<r)m+=" old";else if(h.getUTCFullYear()>n||h.getUTCFullYear()==n&&h.getUTCMonth()>r)m+=" new";this.todayHighlight&&h.getUTCFullYear()==c.getFullYear()&&h.getUTCMonth()==c.getMonth()&&h.getUTCDate()==c.getDate()&&(m+=" today"),l&&h.valueOf()==l&&(m+=" active");if(h.valueOf()<this.startDate||h.valueOf()>this.endDate)m+=" disabled";v.push('<td class="day'+m+'">'+h.getUTCDate()+"</td>"),h.getUTCDay()==this.weekEnd&&v.push("</tr>"),h.setUTCDate(h.getUTCDate()+1)}this.picker.find(".datepicker-days tbody").empty().append(v.join(""));var g=this.date&&this.date.getUTCFullYear(),y=this.picker.find(".datepicker-months").find("th:eq(1)").text(n).end().find("span").removeClass("active");g&&g==n&&y.eq(this.date.getUTCMonth()).addClass("active"),(n<o||n>a)&&y.addClass("disabled"),n==o&&y.slice(0,u).addClass("disabled"),n==a&&y.slice(f+1).addClass("disabled"),v="",n=parseInt(n/10,10)*10;var b=this.picker.find(".datepicker-years").find("th:eq(1)").text(n+"-"+(n+9)).end().find("td");n-=1;for(var w=-1;w<11;w++)v+='<span class="year'+(w==-1||w==10?" old":"")+(g==n?" active":"")+(n<o||n>a?" disabled":"")+'">'+n+"</span>",n+=1;b.html(v)},updateNavArrows:function(){var e=new Date(this.viewDate),t=e.getUTCFullYear(),n=e.getUTCMonth();switch(this.viewMode){case 0:this.startDate!==-Infinity&&t<=this.startDate.getUTCFullYear()&&n<=this.startDate.getUTCMonth()?this.picker.find(".prev").css({visibility:"hidden"}):this.picker.find(".prev").css({visibility:"visible"}),this.endDate!==Infinity&&t>=this.endDate.getUTCFullYear()&&n>=this.endDate.getUTCMonth()?this.picker.find(".next").css({visibility:"hidden"}):this.picker.find(".next").css({visibility:"visible"});break;case 1:case 2:this.startDate!==-Infinity&&t<=this.startDate.getUTCFullYear()?this.picker.find(".prev").css({visibility:"hidden"}):this.picker.find(".prev").css({visibility:"visible"}),this.endDate!==Infinity&&t>=this.endDate.getUTCFullYear()?this.picker.find(".next").css({visibility:"hidden"}):this.picker.find(".next").css({visibility:"visible"})}},click:function(n){n.stopPropagation(),n.preventDefault();var r=e(n.target).closest("span, td, th");if(r.length==1)switch(r[0].nodeName.toLowerCase()){case"th":switch(r[0].className){case"switch":this.showMode(1);break;case"prev":case"next":var i=s.modes[this.viewMode].navStep*(r[0].className=="prev"?-1:1);switch(this.viewMode){case 0:this.viewDate=this.moveMonth(this.viewDate,i);break;case 1:case 2:this.viewDate=this.moveYear(this.viewDate,i)}this.fill();break;case"today":var o=new Date;o=t(o.getFullYear(),o.getMonth(),o.getDate(),0,0,0),this.showMode(-2);var u=this.todayBtn=="linked"?null:"view";this._setDate(o,u)}break;case"span":if(!r.is(".disabled")){this.viewDate.setUTCDate(1);if(r.is(".month")){var a=r.parent().find("span").index(r);this.viewDate.setUTCMonth(a),this.element.trigger({type:"changeMonth",date:this.viewDate})}else{var f=parseInt(r.text(),10)||0;this.viewDate.setUTCFullYear(f),this.element.trigger({type:"changeYear",date:this.viewDate})}this.showMode(-1),this.fill()}break;case"td":if(r.is(".day")&&!r.is(".disabled")){var l=parseInt(r.text(),10)||1,f=this.viewDate.getUTCFullYear(),a=this.viewDate.getUTCMonth();r.is(".old")?a==0?(a=11,f-=1):a-=1:r.is(".new")&&(a==11?(a=0,f+=1):a+=1),this._setDate(t(f,a,l,0,0,0,0))}}},_setDate:function(e,t){if(!t||t=="date")this.date=e;if(!t||t=="view")this.viewDate=e;this.fill(),this.setValue(),this.element.trigger({type:"changeDate",date:this.date});var n;this.isInput?n=this.element:this.component&&(n=this.element.find("input")),n&&(n.change(),this.autoclose&&this.hide())},moveMonth:function(e,t){if(!t)return e;var n=new Date(e.valueOf()),r=n.getUTCDate(),i=n.getUTCMonth(),s=Math.abs(t),o,u;t=t>0?1:-1;if(s==1){u=t==-1?function(){return n.getUTCMonth()==i}:function(){return n.getUTCMonth()!=o},o=i+t,n.setUTCMonth(o);if(o<0||o>11)o=(o+12)%12}else{for(var a=0;a<s;a++)n=this.moveMonth(n,t);o=n.getUTCMonth(),n.setUTCDate(r),u=function(){return o!=n.getUTCMonth()}}while(u())n.setUTCDate(--r),n.setUTCMonth(o);return n},moveYear:function(e,t){return this.moveMonth(e,t*12)},dateWithinRange:function(e){return e>=this.startDate&&e<=this.endDate},keydown:function(e){if(this.picker.is(":not(:visible)")){e.keyCode==27&&this.show();return}var t=!1,n,r,i,s,o;switch(e.keyCode){case 27:this.hide(),e.preventDefault();break;case 37:case 39:if(!this.keyboardNavigation)break;n=e.keyCode==37?-1:1,e.ctrlKey?(s=this.moveYear(this.date,n),o=this.moveYear(this.viewDate,n)):e.shiftKey?(s=this.moveMonth(this.date,n),o=this.moveMonth(this.viewDate,n)):(s=new Date(this.date),s.setUTCDate(this.date.getUTCDate()+n),o=new Date(this.viewDate),o.setUTCDate(this.viewDate.getUTCDate()+n)),this.dateWithinRange(s)&&(this.date=s,this.viewDate=o,this.setValue(),this.update(),e.preventDefault(),t=!0);break;case 38:case 40:if(!this.keyboardNavigation)break;n=e.keyCode==38?-1:1,e.ctrlKey?(s=this.moveYear(this.date,n),o=this.moveYear(this.viewDate,n)):e.shiftKey?(s=this.moveMonth(this.date,n),o=this.moveMonth(this.viewDate,n)):(s=new Date(this.date),s.setUTCDate(this.date.getUTCDate()+n*7),o=new Date(this.viewDate),o.setUTCDate(this.viewDate.getUTCDate()+n*7)),this.dateWithinRange(s)&&(this.date=s,this.viewDate=o,this.setValue(),this.update(),e.preventDefault(),t=!0);break;case 13:this.hide(),e.preventDefault();break;case 9:this.hide()}if(t){this.element.trigger({type:"changeDate",date:this.date});var u;this.isInput?u=this.element:this.component&&(u=this.element.find("input")),u&&u.change()}},showMode:function(e){e&&(this.viewMode=Math.max(0,Math.min(2,this.viewMode+e))),this.picker.find(">div").hide().filter(".datepicker-"+s.modes[this.viewMode].clsName).css("display","block"),this.updateNavArrows()}},e.fn.datepicker=function(t){var n=Array.apply(null,arguments);return n.shift(),this.each(function(){var i=e(this),s=i.data("datepicker"),o=typeof t=="object"&&t;s||i.data("datepicker",s=new r(this,e.extend({},e.fn.datepicker.defaults,o))),typeof t=="string"&&typeof s[t]=="function"&&s[t].apply(s,n)})},e.fn.datepicker.defaults={},e.fn.datepicker.Constructor=r;var i=e.fn.datepicker.dates={en:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa","Su"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today"}},s={modes:[{clsName:"days",navFnc:"Month",navStep:1},{clsName:"months",navFnc:"FullYear",navStep:1},{clsName:"years",navFnc:"FullYear",navStep:10}],isLeapYear:function(e){return e%4===0&&e%100!==0||e%400===0},getDaysInMonth:function(e,t){return[31,s.isLeapYear(e)?29:28,31,30,31,30,31,31,30,31,30,31][t]},validParts:/dd?|mm?|MM?|yy(?:yy)?/g,nonpunctuation:/[^ -\/:-@\[-`{-~\t\n\r]+/g,parseFormat:function(e){var t=e.replace(this.validParts,"\0").split("\0"),n=e.match(this.validParts);if(!t||!t.length||!n||n.length==0)throw new Error("Invalid date format.");return{separators:t,parts:n}},parseDate:function(n,s,o){if(n instanceof Date)return n;if(/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(n)){var u=/([-+]\d+)([dmwy])/,a=n.match(/([-+]\d+)([dmwy])/g),f,l;n=new Date;for(var c=0;c<a.length;c++){f=u.exec(a[c]),l=parseInt(f[1]);switch(f[2]){case"d":n.setUTCDate(n.getUTCDate()+l);break;case"m":n=r.prototype.moveMonth.call(r.prototype,n,l);break;case"w":n.setUTCDate(n.getUTCDate()+l*7);break;case"y":n=r.prototype.moveYear.call(r.prototype,n,l)}}return t(n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate(),0,0,0)}var a=n&&n.match(this.nonpunctuation)||[],n=new Date,h={},p=["yyyy","yy","M","MM","m","mm","d","dd"],d={yyyy:function(e,t){return e.setUTCFullYear(t)},yy:function(e,t){return e.setUTCFullYear(2e3+t)},m:function(e,t){t-=1;while(t<0)t+=12;t%=12,e.setUTCMonth(t);while(e.getUTCMonth()!=t)e.setUTCDate(e.getUTCDate()-1);return e},d:function(e,t){return e.setUTCDate(t)}},v,m,f;d.M=d.MM=d.mm=d.m,d.dd=d.d,n=t(n.getFullYear(),n.getMonth(),n.getDate(),0,0,0);if(a.length==s.parts.length){for(var c=0,g=s.parts.length;c<g;c++){v=parseInt(a[c],10),f=s.parts[c];if(isNaN(v))switch(f){case"MM":m=e(i[o].months).filter(function(){var e=this.slice(0,a[c].length),t=a[c].slice(0,e.length);return e==t}),v=e.inArray(m[0],i[o].months)+1;break;case"M":m=e(i[o].monthsShort).filter(function(){var e=this.slice(0,a[c].length),t=a[c].slice(0,e.length);return e==t}),v=e.inArray(m[0],i[o].monthsShort)+1}h[f]=v}for(var c=0,y;c<p.length;c++)y=p[c],y in h&&d[y](n,h[y])}return n},formatDate:function(t,n,r){var s={d:t.getUTCDate(),m:t.getUTCMonth()+1,M:i[r].monthsShort[t.getUTCMonth()],MM:i[r].months[t.getUTCMonth()],yy:t.getUTCFullYear().toString().substring(2),yyyy:t.getUTCFullYear()};s.dd=(s.d<10?"0":"")+s.d,s.mm=(s.m<10?"0":"")+s.m;var t=[],o=e.extend([],n.separators);for(var u=0,a=n.parts.length;u<a;u++)o.length&&t.push(o.shift()),t.push(s[n.parts[u]]);return t.join("")},headTemplate:'<thead><tr><th class="prev"><i class="icon-arrow-left"/></th><th colspan="5" class="switch"></th><th class="next"><i class="icon-arrow-right"/></th></tr></thead>',contTemplate:'<tbody><tr><td colspan="7"></td></tr></tbody>',footTemplate:'<tfoot><tr><th colspan="7" class="today"></th></tr></tfoot>'};s.template='<div class="datepicker"><div class="datepicker-days"><table class=" table-condensed">'+s.headTemplate+"<tbody></tbody>"+s.footTemplate+"</table>"+"</div>"+'<div class="datepicker-months">'+'<table class="table-condensed">'+s.headTemplate+s.contTemplate+s.footTemplate+"</table>"+"</div>"+'<div class="datepicker-years">'+'<table class="table-condensed">'+s.headTemplate+s.contTemplate+s.footTemplate+"</table>"+"</div>"+"</div>",e.fn.datepicker.DPGlobal=s}(window.jQuery); \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/no-theme/jquery-ui.min.css b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/no-theme/jquery-ui.min.css
new file mode 100644
index 0000000..4649e5d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/no-theme/jquery-ui.min.css
@@ -0,0 +1,7 @@
+/*! jQuery UI - v1.11.1 - 2014-08-23
+* http://jqueryui.com
+* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_228ef1_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffd27a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x;opacity:.2;filter:Alpha(Opacity=20);border-radius:5px} \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/no-theme/jquery-ui.structure.min.css b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/no-theme/jquery-ui.structure.min.css
new file mode 100644
index 0000000..52b2349
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/no-theme/jquery-ui.structure.min.css
@@ -0,0 +1,5 @@
+/*! jQuery UI - v1.11.1 - 2014-08-19
+* http://jqueryui.com
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px} \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png
new file mode 100644
index 0000000..2639bee
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png
new file mode 100644
index 0000000..f2d760e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png
new file mode 100644
index 0000000..ad01bf6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png
new file mode 100644
index 0000000..dad987a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png
new file mode 100644
index 0000000..0875e4f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png
new file mode 100644
index 0000000..0af0537
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png
new file mode 100644
index 0000000..e6e5130
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
new file mode 100644
index 0000000..be87342
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
new file mode 100644
index 0000000..fe75af5
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_222222_256x240.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_222222_256x240.png
new file mode 100644
index 0000000..5977ef2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_222222_256x240.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png
new file mode 100644
index 0000000..8df056f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png
new file mode 100644
index 0000000..9d3db37
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png
new file mode 100644
index 0000000..392fd6e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png
new file mode 100644
index 0000000..a45283b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/jquery-ui.theme.min.css b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/jquery-ui.theme.min.css
new file mode 100644
index 0000000..6bdc4ef
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/jquery-ui.theme.min.css
@@ -0,0 +1,5 @@
+/*! jQuery UI - v1.11.1 - 2014-08-23
+* http://jqueryui.com
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_228ef1_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffd27a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x;opacity:.2;filter:Alpha(Opacity=20);border-radius:5px} \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/js/jquery-ui.min.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/js/jquery-ui.min.js
new file mode 100644
index 0000000..71b02d1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/js/jquery-ui.min.js
@@ -0,0 +1,13 @@
+/*! jQuery UI - v1.11.1 - 2014-08-19
+* http://jqueryui.com
+* Includes: core.js, widget.js, mouse.js, position.js, draggable.js, droppable.js, resizable.js, selectable.js, sortable.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, menu.js, progressbar.js, selectmenu.js, slider.js, spinner.js, tabs.js, tooltip.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/input|select|textarea|button|object/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}function s(e){for(var t,i;e.length&&e[0]!==document;){if(t=e.css("position"),("absolute"===t||"relative"===t||"fixed"===t)&&(i=parseInt(e.css("zIndex"),10),!isNaN(i)&&0!==i))return i;e=e.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},e.extend(this._defaults,this.regional[""]),this.regional.en=e.extend(!0,{},this.regional[""]),this.regional["en-US"]=e.extend(!0,{},this.regional.en),this.dpDiv=a(e("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function a(t){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.delegate(i,"mouseout",function(){e(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",o)}function o(){e.datepicker._isDisabledDatepicker(v.inline?v.dpDiv.parent()[0]:v.input[0])||(e(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),e(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).addClass("ui-datepicker-next-hover"))}function r(t,i){e.extend(t,i);for(var s in i)null==i[s]&&(t[s]=i[s]);return t}function h(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.1",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var l=0,u=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,n=u.call(arguments,1),a=0,o=n.length;o>a;a++)for(i in n[a])s=n[a][i],n[a].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(n){var a="string"==typeof n,o=u.call(arguments,1),r=this;return n=!a&&o.length?e.widget.extend.apply(null,[n].concat(o)):n,a?this.each(function(){var i,a=e.data(this,s);return"instance"===n?(r=a,!1):a?e.isFunction(a[n])&&"_"!==n.charAt(0)?(i=a[n].apply(a,o),i!==a&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+n+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+n+"'")}):this.each(function(){var t=e.data(this,s);t?(t.option(n||{}),t._init&&t._init()):e.data(this,s,new i(n,this))}),r}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(e,t){t=(t||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.unbind(t).undelegate(t)},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var d=!1;e(document).mouseup(function(){d=!1}),e.widget("ui.mouse",{version:"1.11.1",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!d){this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),d=!0,!0)):!0}},_mouseMove:function(t){return e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button?this._mouseUp(t):t.which?this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted):this._mouseUp(t)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),d=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.width<t.element[0].scrollWidth,a="scroll"===s||"auto"===s&&t.height<t.element[0].scrollHeight;return{width:a?e.position.scrollbarWidth():0,height:n?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var i=e(t||window),s=e.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s||n?i.width():i.outerWidth(),height:s||n?i.height():i.outerHeight()}}},e.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=e.extend({},n);var p,m,g,v,y,b,_=e(n.of),x=e.position.getWithinInfo(n.within),w=e.position.getScrollInfo(x),k=(n.collision||"flip").split(" "),T={};return b=s(_),_[0].preventDefault&&(n.at="left top"),m=b.width,g=b.height,v=b.offset,y=e.extend({},v),e.each(["my","at"],function(){var e,t,i=(n[this]||"").split(" ");1===i.length&&(i=l.test(i[0])?i.concat(["center"]):u.test(i[0])?["center"].concat(i):["center","center"]),i[0]=l.test(i[0])?i[0]:"center",i[1]=u.test(i[1])?i[1]:"center",e=d.exec(i[0]),t=d.exec(i[1]),T[this]=[e?e[0]:0,t?t[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===n.at[0]?y.left+=m:"center"===n.at[0]&&(y.left+=m/2),"bottom"===n.at[1]?y.top+=g:"center"===n.at[1]&&(y.top+=g/2),p=t(T.at,m,g),y.left+=p[0],y.top+=p[1],this.each(function(){var s,l,u=e(this),d=u.outerWidth(),c=u.outerHeight(),f=i(this,"marginLeft"),b=i(this,"marginTop"),D=d+f+i(this,"marginRight")+w.width,S=c+b+i(this,"marginBottom")+w.height,N=e.extend({},y),M=t(T.my,u.outerWidth(),u.outerHeight());"right"===n.my[0]?N.left-=d:"center"===n.my[0]&&(N.left-=d/2),"bottom"===n.my[1]?N.top-=c:"center"===n.my[1]&&(N.top-=c/2),N.left+=M[0],N.top+=M[1],a||(N.left=h(N.left),N.top=h(N.top)),s={marginLeft:f,marginTop:b},e.each(["left","top"],function(t,i){e.ui.position[k[t]]&&e.ui.position[k[t]][i](N,{targetWidth:m,targetHeight:g,elemWidth:d,elemHeight:c,collisionPosition:s,collisionWidth:D,collisionHeight:S,offset:[p[0]+M[0],p[1]+M[1]],my:n.my,at:n.at,within:x,elem:u})}),n.using&&(l=function(e){var t=v.left-N.left,i=t+m-d,s=v.top-N.top,a=s+g-c,h={target:{element:_,left:v.left,top:v.top,width:m,height:g},element:{element:u,left:N.left,top:N.top,width:d,height:c},horizontal:0>i?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(N,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,e.top+p+f+m>u&&(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,e.top+p+f+m>d&&(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.draggable",e.ui.mouse,{version:"1.11.1",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"!==this.options.helper||/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._setHandleClassName(),this._mouseInit()},_setOption:function(e,t){this._super(e,t),"handle"===e&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(t){var i=this.document[0],s=this.options;try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()&&e(i.activeElement).blur()}catch(n){}return this.helper||s.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(e(s.iframeFix===!0?"iframe":s.iframeFix).each(function(){e("<div class='ui-draggable-iframeFix' style='background: #fff;'></div>").css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(e(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.offsetParentCssPosition=this.offsetParent.css("position"),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.offset.scroll=!1,e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_mouseDrag:function(t,i){if("fixed"===this.offsetParentCssPosition&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1},_mouseUp:function(t){return e("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),this.element.focus(),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this.handleElement.addClass("ui-draggable-handle")},_removeHandleClassName:function(){this.handleElement.removeClass("ui-draggable-handle")},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return s.parents("body").length||s.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s[0]===this.element[0]||/(fixed|absolute)/.test(s.css("position"))||s.css("position","absolute"),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(e){return/(html|body)/i.test(e.tagName)||e===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var e=this.element.position(),t=this._isRootNode(this.scrollParent[0]);return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+(t?0:this.scrollParent.scrollTop()),left:e.left-(parseInt(this.helper.css("left"),10)||0)+(t?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options,a=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,e(a).width()-this.helperProportions.width-this.margins.left,(e(a).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=e(n.containment),s=i[0],s&&(t="hidden"!==i.css("overflow"),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(t?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)},_convertPositionTo:function(e,t){t||(t=this.position);var i="absolute"===e?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:t.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:t.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(e,t){var i,s,n,a,o=this.options,r=this._isRootNode(this.scrollParent[0]),h=e.pageX,l=e.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),t&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a),"y"===o.axis&&(h=this.originalPageX),"x"===o.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}
+},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s,this],!0),"drag"===t&&(this.positionAbs=this._convertPositionTo("absolute")),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i,s){var n=s.options,a=e.extend({},i,{item:s.element});s.sortables=[],e(n.connectToSortable).each(function(){var i=e(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push({instance:i,shouldRevert:i.options.revert}),i.refreshPositions(),i._trigger("activate",t,a))})},stop:function(t,i,s){var n=e.extend({},i,{item:s.element});e.each(s.sortables,function(){this.instance.isOver?(this.instance.isOver=0,s.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=this.shouldRevert),this.instance._mouseStop(t),this.instance.options.helper=this.instance.options._helper,"original"===s.options.helper&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",t,n))})},drag:function(t,i,s){var n=this;e.each(s.sortables,function(){var a=!1,o=this;this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this.instance._intersectsWith(this.instance.containerCache)&&(a=!0,e.each(s.sortables,function(){return this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this!==o&&this.instance._intersectsWith(this.instance.containerCache)&&e.contains(o.instance.element[0],this.instance.element[0])&&(a=!1),a})),a?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=e(n).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return i.helper[0]},t.target=this.instance.currentItem[0],this.instance._mouseCapture(t,!0),this.instance._mouseStart(t,!0,!0),this.instance.offset.click.top=s.offset.click.top,this.instance.offset.click.left=s.offset.click.left,this.instance.offset.parent.left-=s.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=s.offset.parent.top-this.instance.offset.parent.top,s._trigger("toSortable",t),s.dropped=this.instance.element,s.currentItem=s.element,this.instance.fromOutside=s),this.instance.currentItem&&this.instance._mouseDrag(t)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",t,this.instance._uiHash(this.instance)),this.instance._mouseStop(t,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),s._trigger("fromSortable",t),s.dropped=!1)})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,i,s){var n=e("body"),a=s.options;n.css("cursor")&&(a._cursor=n.css("cursor")),n.css("cursor",a.cursor)},stop:function(t,i,s){var n=s.options;n._cursor&&e("body").css("cursor",n._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("opacity")&&(a._opacity=n.css("opacity")),n.css("opacity",a.opacity)},stop:function(t,i,s){var n=s.options;n._opacity&&e(i.helper).css("opacity",n._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(e,t,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,i,s){var n=s.options,a=!1,o=s.scrollParentNotHidden[0],r=s.document[0];o!==r&&"HTML"!==o.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+o.offsetHeight-t.pageY<n.scrollSensitivity?o.scrollTop=a=o.scrollTop+n.scrollSpeed:t.pageY-s.overflowOffset.top<n.scrollSensitivity&&(o.scrollTop=a=o.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+o.offsetWidth-t.pageX<n.scrollSensitivity?o.scrollLeft=a=o.scrollLeft+n.scrollSpeed:t.pageX-s.overflowOffset.left<n.scrollSensitivity&&(o.scrollLeft=a=o.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(t.pageY-e(r).scrollTop()<n.scrollSensitivity?a=e(r).scrollTop(e(r).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(r).scrollTop())<n.scrollSensitivity&&(a=e(r).scrollTop(e(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(t.pageX-e(r).scrollLeft()<n.scrollSensitivity?a=e(r).scrollLeft(e(r).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(r).scrollLeft())<n.scrollSensitivity&&(a=e(r).scrollLeft(e(r).scrollLeft()+n.scrollSpeed)))),a!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(s,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,i,s){var n=s.options;s.snapElements=[],e(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var t=e(this),i=t.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:i.top,left:i.left})})},drag:function(t,i,s){var n,a,o,r,h,l,u,d,c,p,f=s.options,m=f.snapTolerance,g=i.offset.left,v=g+s.helperProportions.width,y=i.offset.top,b=y+s.helperProportions.height;for(c=s.snapElements.length-1;c>=0;c--)h=s.snapElements[c].left,l=h+s.snapElements[c].width,u=s.snapElements[c].top,d=u+s.snapElements[c].height,h-m>v||g>l+m||u-m>b||y>d+m||!e.contains(s.snapElements[c].item.ownerDocument,s.snapElements[c].item)?(s.snapElements[c].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=!1):("inner"!==f.snapMode&&(n=m>=Math.abs(u-b),a=m>=Math.abs(d-y),o=m>=Math.abs(h-v),r=m>=Math.abs(l-g),n&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top-s.margins.top),a&&(i.position.top=s._convertPositionTo("relative",{top:d,left:0}).top-s.margins.top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left-s.margins.left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left-s.margins.left)),p=n||a||o||r,"outer"!==f.snapMode&&(n=m>=Math.abs(u-y),a=m>=Math.abs(d-b),o=m>=Math.abs(h-g),r=m>=Math.abs(l-v),n&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top-s.margins.top),a&&(i.position.top=s._convertPositionTo("relative",{top:d-s.helperProportions.height,left:0}).top-s.margins.top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left-s.margins.left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left-s.margins.left)),!s.snapElements[c].snapping&&(n||a||o||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=n||a||o||r||p)}}),e.ui.plugin.add("draggable","stack",{start:function(t,i,s){var n,a=s.options,o=e.makeArray(e(a.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});o.length&&(n=parseInt(e(o[0]).css("zIndex"),10)||0,e(o).each(function(t){e(this).css("zIndex",n+t)}),this.css("zIndex",n+o.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("zIndex")&&(a._zIndex=n.css("zIndex")),n.css("zIndex",a.zIndex)},stop:function(t,i,s){var n=s.options;n._zIndex&&e(i.helper).css("zIndex",n._zIndex)}}),e.ui.draggable,e.widget("ui.droppable",{version:"1.11.1",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=e.isFunction(s)?s:function(e){return e.is(s)},this.proportions=function(){return arguments.length?(t=arguments[0],void 0):t?t:t={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this.element.addClass("ui-droppable")},_addToManager:function(t){e.ui.ddmanager.droppables[t]=e.ui.ddmanager.droppables[t]||[],e.ui.ddmanager.droppables[t].push(this)},_splice:function(e){for(var t=0;e.length>t;t++)e[t]===this&&e.splice(t,1)},_destroy:function(){var t=e.ui.ddmanager.droppables[this.options.scope];this._splice(t),this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,i){if("accept"===t)this.accept=e.isFunction(i)?i:function(e){return e.is(i)};else if("scope"===t){var s=e.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(t,i)},_activate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",t,this.ui(i))},_deactivate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",t,this.ui(i))},_over:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(i)))},_out:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(i)))},_drop:function(t,i){var s=i||e.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=e(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&e.ui.intersect(s,e.extend(i,{offset:i.element.offset()}),i.options.tolerance,t)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(s)),this.element):!1):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(){function e(e,t,i){return e>=t&&t+i>e}return function(t,i,s,n){if(!i.offset)return!1;var a=(t.positionAbs||t.position.absolute).left,o=(t.positionAbs||t.position.absolute).top,r=a+t.helperProportions.width,h=o+t.helperProportions.height,l=i.offset.left,u=i.offset.top,d=l+i.proportions().width,c=u+i.proportions().height;switch(s){case"fit":return a>=l&&d>=r&&o>=u&&c>=h;case"intersect":return a+t.helperProportions.width/2>l&&d>r-t.helperProportions.width/2&&o+t.helperProportions.height/2>u&&c>h-t.helperProportions.height/2;case"pointer":return e(n.pageY,u,i.proportions().height)&&e(n.pageX,l,i.proportions().width);case"touch":return(o>=u&&c>=o||h>=u&&c>=h||u>o&&h>c)&&(a>=l&&d>=a||r>=l&&d>=r||l>a&&r>d);default:return!1}}}(),e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,i){var s,n,a=e.ui.ddmanager.droppables[t.options.scope]||[],o=i?i.type:null,r=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();e:for(s=0;a.length>s;s++)if(!(a[s].options.disabled||t&&!a[s].accept.call(a[s].element[0],t.currentItem||t.element))){for(n=0;r.length>n;n++)if(r[n]===a[s].element[0]){a[s].proportions().height=0;continue e}a[s].visible="none"!==a[s].element.css("display"),a[s].visible&&("mousedown"===o&&a[s]._activate.call(a[s],i),a[s].offset=a[s].element.offset(),a[s].proportions({width:a[s].element[0].offsetWidth,height:a[s].element[0].offsetHeight}))}},drop:function(t,i){var s=!1;return e.each((e.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(t,i){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)})},drag:function(t,i){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,i),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,o=e.ui.intersect(t,this,this.options.tolerance,i),r=!o&&this.isover?"isout":o&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(":data(ui-droppable)").filter(function(){return e(this).droppable("instance").options.scope===n}),a.length&&(s=e(a[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(t,i){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)}},e.ui.droppable,e.widget("ui.resizable",e.ui.mouse,{version:"1.11.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(e){return parseInt(e,10)||0},_isNumber:function(e){return!isNaN(parseInt(e,10))},_hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return t[s]>0?!0:(t[s]=1,n=t[s]>0,t[s]=0,n)},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(e("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("<div class='ui-resizable-handle "+a+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String&&(this.handles[i]=this.element.children(this.handles[i]).first().show()),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),e(this.handles[i]).length},this._renderAxis(this.element),this._handles=e(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var i,s,n,a=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),a.containment&&(i+=e(a.containment).scrollLeft()||0,s+=e(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===n?this.axis+"-resize":n),o.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var i,s,n=this.originalMousePosition,a=this.axis,o=t.pageX-n.left||0,r=t.pageY-n.top||0,h=this._change[a];return this._updatePrevProperties(),h?(i=h.apply(this,[t,o,r]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var e={};return this.position.top!==this.prevPosition.top&&(e.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(e.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(e.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(e.height=this.size.height+"px"),this.helper.css(e),e},_updateVirtualBoundaries:function(e){var t,i,s,n,a,o=this.options;a={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||e)&&(t=a.minHeight*this.aspectRatio,s=a.minWidth/this.aspectRatio,i=a.maxHeight*this.aspectRatio,n=a.maxWidth/this.aspectRatio,t>a.minWidth&&(a.minWidth=t),s>a.minHeight&&(a.minHeight=s),a.maxWidth>i&&(a.maxWidth=i),a.maxHeight>n&&(a.maxHeight=n)),this._vBoundaries=a},_updateCache:function(e){this.offset=this.helper.offset(),this._isNumber(e.left)&&(this.position.left=e.left),this._isNumber(e.top)&&(this.position.top=e.top),this._isNumber(e.height)&&(this.size.height=e.height),this._isNumber(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,i=this.size,s=this.axis;return this._isNumber(e.height)?e.width=e.height*this.aspectRatio:this._isNumber(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===s&&(e.left=t.left+(i.width-e.width),e.top=null),"nw"===s&&(e.top=t.top+(i.height-e.height),e.left=t.left+(i.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,i=this.axis,s=this._isNumber(e.width)&&t.maxWidth&&t.maxWidth<e.width,n=this._isNumber(e.height)&&t.maxHeight&&t.maxHeight<e.height,a=this._isNumber(e.width)&&t.minWidth&&t.minWidth>e.width,o=this._isNumber(e.height)&&t.minHeight&&t.minHeight>e.height,r=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,l=/sw|nw|w/.test(i),u=/nw|ne|n/.test(i);return a&&(e.width=t.minWidth),o&&(e.height=t.minHeight),s&&(e.width=t.maxWidth),n&&(e.height=t.maxHeight),a&&l&&(e.left=r-t.minWidth),s&&l&&(e.left=r-t.maxWidth),o&&u&&(e.top=h-t.minHeight),n&&u&&(e.top=h-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_getPaddingPlusBorderDimensions:function(e){for(var t=0,i=[],s=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],n=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];4>t;t++)i[t]=parseInt(s[t],10)||0,i[t]+=parseInt(n[t],10)||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var e,t=0,i=this.helper||this.element;this._proportionallyResizeElements.length>t;t++)e=this._proportionallyResizeElements[t],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(e)),e.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var t,i,s,n,a,o,r,h=e(this).resizable("instance"),l=h.options,u=h.element,d=l.containment,c=d instanceof e?d.get(0):/parent/.test(d)?u.parent().get(0):d;c&&(h.containerElement=e(c),/document/.test(d)||d===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(t=e(c),i=[],e(["Top","Right","Left","Bottom"]).each(function(e,s){i[e]=h._num(t.css("padding"+s))}),h.containerOffset=t.offset(),h.containerPosition=t.position(),h.containerSize={height:t.innerHeight()-i[3],width:t.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,a=h.containerSize.width,o=h._hasScroll(c,"left")?c.scrollWidth:a,r=h._hasScroll(c)?c.scrollHeight:n,h.parentData={element:c,left:s.left,top:s.top,width:o,height:r}))},resize:function(t){var i,s,n,a,o=e(this).resizable("instance"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,d={top:0,left:0},c=o.containerElement,p=!0;c[0]!==document&&/static/.test(c.css("position"))&&(d=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-d.left),u&&(o.size.height=o.size.width/o.aspectRatio,p=!1),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio,p=!1),o.position.top=o._helper?h.top:0),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css("position")),n&&a?(o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top):(o.offset.left=o.element.offset().left,o.offset.top=o.element.offset().top),i=Math.abs(o.sizeDiff.width+(o._helper?o.offset.left-d.left:o.offset.left-h.left)),s=Math.abs(o.sizeDiff.height+(o._helper?o.offset.top-d.top:o.offset.top-h.top)),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio,p=!1)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio,p=!1)),p||(o.position.left=o.prevPosition.left,o.position.top=o.prevPosition.top,o.size.width=o.prevSize.width,o.size.height=o.prevSize.height)},stop:function(){var t=e(this).resizable("instance"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=function(t){e(t).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})};"object"!=typeof i.alsoResize||i.alsoResize.parentNode?s(i.alsoResize):i.alsoResize.length?(i.alsoResize=i.alsoResize[0],s(i.alsoResize)):e.each(i.alsoResize,function(e){s(e)})},resize:function(t,i){var s=e(this).resizable("instance"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0},h=function(t,s){e(t).each(function(){var t=e(this),n=e(this).data("ui-resizable-alsoresize"),a={},o=s&&s.length?s:t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(o,function(e,t){var i=(n[t]||0)+(r[t]||0);i&&i>=0&&(a[t]=i||null)}),t.css(a)})};"object"!=typeof n.alsoResize||n.alsoResize.nodeType?h(n.alsoResize):e.each(n.alsoResize,function(e,t){h(e,t)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t,i=e(this).resizable("instance"),s=i.options,n=i.size,a=i.originalSize,o=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,u=h[1]||1,d=Math.round((n.width-a.width)/l)*l,c=Math.round((n.height-a.height)/u)*u,p=a.width+d,f=a.height+c,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,v=s.minWidth&&s.minWidth>p,y=s.minHeight&&s.minHeight>f;s.grid=h,v&&(p+=l),y&&(f+=u),m&&(p-=l),g&&(f-=u),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=o.top-c):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=o.left-d):((0>=f-u||0>=p-l)&&(t=i._getPaddingPlusBorderDimensions(this)),f-u>0?(i.size.height=f,i.position.top=o.top-c):(f=u-t.height,i.size.height=f,i.position.top=o.top+a.height-f),p-l>0?(i.size.width=p,i.position.left=o.left-d):(p=u-t.height,i.size.width=p,i.position.left=o.left+a.width-p))}}),e.ui.resizable,e.widget("ui.selectable",e.ui.mouse,{version:"1.11.1",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var t,i=this;
+this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){t=e(i.options.filter,i.element[0]),t.addClass("ui-selectee"),t.each(function(){var t=e(this),i=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:i.left,top:i.top,right:i.left+t.outerWidth(),bottom:i.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=t.addClass("ui-selectee"),this._mouseInit(),this.helper=e("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var i=this,s=this.options;this.opos=[t.pageX,t.pageY],this.options.disabled||(this.selectees=e(s.filter,this.element[0]),this._trigger("start",t),e(s.appendTo).append(this.helper),this.helper.css({left:t.pageX,top:t.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=e.data(this,"selectable-item");s.startselected=!0,t.metaKey||t.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",t,{unselecting:s.element}))}),e(t.target).parents().addBack().each(function(){var s,n=e.data(this,"selectable-item");return n?(s=!t.metaKey&&!t.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",t,{selecting:n.element}):i._trigger("unselecting",t,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(t){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,a=this.opos[0],o=this.opos[1],r=t.pageX,h=t.pageY;return a>r&&(i=r,r=a,a=i),o>h&&(i=h,h=o,o=i),this.helper.css({left:a,top:o,width:r-a,height:h-o}),this.selectees.each(function(){var i=e.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||a>i.right||i.top>h||o>i.bottom):"fit"===n.tolerance&&(l=i.left>a&&r>i.right&&i.top>o&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",t,{selecting:i.element}))):(i.selecting&&((t.metaKey||t.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",t,{unselecting:i.element}))),i.selected&&(t.metaKey||t.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",t,{unselecting:i.element})))))}),!1}},_mouseStop:function(t){var i=this;return this.dragged=!1,e(".ui-unselecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",t,{unselected:s.element})}),e(".ui-selecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",t,{selected:s.element})}),this._trigger("stop",t),this.helper.remove(),!1}}),e.widget("ui.sortable",e.ui.mouse,{version:"1.11.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(e,t,i){return e>=t&&t+i>e},_isFloating:function(e){return/left|right/.test(e.css("float"))||/inline|table-cell/.test(e.css("display"))},_create:function(){var e=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?"x"===e.axis||this._isFloating(this.items[0].item):!1,this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(e,t){this._super(e,t),"handle"===e&&this._setHandleClassName()},_setHandleClassName:function(){this.element.find(".ui-sortable-handle").removeClass("ui-sortable-handle"),e.each(this.items,function(){(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item).addClass("ui-sortable-handle")})},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").find(".ui-sortable-handle").removeClass("ui-sortable-handle"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(t,i){var s=null,n=!1,a=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(t),e(t.target).parents().each(function(){return e.data(this,a.widgetName+"-item")===a?(s=e(this),!1):void 0}),e.data(t.target,a.widgetName+"-item")===a&&(s=e(t.target)),s?!this.options.handle||i||(e(this.options.handle,s).find("*").addBack().each(function(){this===t.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(t,i,s){var n,a,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(a=this.document.find("body"),this.storedCursor=a.css("cursor"),a.css("cursor",o.cursor),this.storedStylesheet=e("<style>*{ cursor: "+o.cursor+" !important; }</style>").appendTo(a)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",t,this._uiHash(this));return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){var i,s,n,a,o=this.options,r=!1;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+o.scrollSpeed:t.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+o.scrollSpeed:t.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(t.pageY-e(document).scrollTop()<o.scrollSensitivity?r=e(document).scrollTop(e(document).scrollTop()-o.scrollSpeed):e(window).height()-(t.pageY-e(document).scrollTop())<o.scrollSensitivity&&(r=e(document).scrollTop(e(document).scrollTop()+o.scrollSpeed)),t.pageX-e(document).scrollLeft()<o.scrollSensitivity?r=e(document).scrollLeft(e(document).scrollLeft()-o.scrollSpeed):e(window).width()-(t.pageX-e(document).scrollLeft())<o.scrollSensitivity&&(r=e(document).scrollLeft(e(document).scrollLeft()+o.scrollSpeed))),r!==!1&&e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],a=this._intersectsWithPointer(s),a&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===a?"next":"prev"]()[0]!==n&&!e.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!e.contains(this.element[0],n):!0)){if(this.direction=1===a?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger("change",t,this._uiHash());break}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,i){if(t){if(e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t),this.options.revert){var s=this,n=this.placeholder.offset(),a=this.options.axis,o={};a&&"x"!==a||(o.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollLeft)),a&&"y"!==a||(o.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,e(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){s._clear(t)})}else this._clear(t,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},e(i).each(function(){var i=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[\-=_](.+)/);i&&s.push((t.key||i[1]+"[]")+"="+(t.key&&t.expression?i[1]:i[2]))}),!s.length&&t.key&&s.push(t.key+"="),s.join("&")},toArray:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},i.each(function(){s.push(e(t.item||this).attr(t.attribute||"id")||"")}),s},_intersectsWith:function(e){var t=this.positionAbs.left,i=t+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,a=e.left,o=a+e.width,r=e.top,h=r+e.height,l=this.offset.click.top,u=this.offset.click.left,d="x"===this.options.axis||s+l>r&&h>s+l,c="y"===this.options.axis||t+u>a&&o>t+u,p=d&&c;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>e[this.floating?"width":"height"]?p:t+this.helperProportions.width/2>a&&o>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(e){var t="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top,e.height),i="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left,e.width),s=t&&i,n=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return s?this.floating?a&&"right"===a||"down"===n?2:1:n&&("down"===n?2:1):!1},_intersectsWithSides:function(e){var t=this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+e.height/2,e.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+e.width/2,e.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&t||"up"===s&&!t)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return 0!==e&&(e>0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return 0!==e&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor===String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){function i(){r.push(this)}var s,n,a,o,r=[],h=[],l=this._connectWith();if(l&&t)for(s=l.length-1;s>=0;s--)for(a=e(l[s]),n=a.length-1;n>=0;n--)o=e.data(a[n],this.widgetFullName),o&&o!==this&&!o.options.disabled&&h.push([e.isFunction(o.options.items)?o.options.items.call(o.element):e(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(h.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return e(r)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var i=0;t.length>i;i++)if(t[i]===e.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var i,s,n,a,o,r,h,l,u=this.items,d=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],c=this._connectWith();if(c&&this.ready)for(i=c.length-1;i>=0;i--)for(n=e(c[i]),s=n.length-1;s>=0;s--)a=e.data(n[s],this.widgetFullName),a&&a!==this&&!a.options.disabled&&(d.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a));for(i=d.length-1;i>=0;i--)for(o=d[i][1],r=d[i][0],s=0,l=r.length;l>s;s++)h=e(r[s]),h.data(this.widgetName+"-item",o),u.push({item:h,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(t){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,a;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?e(this.options.toleranceElement,s.item):s.item,t||(s.width=n.outerWidth(),s.height=n.outerHeight()),a=n.offset(),s.left=a.left,s.top=a.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)a=this.containers[i].element.offset(),this.containers[i].containerCache.left=a.left,this.containers[i].containerCache.top=a.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(t){t=t||this;var i,s=t.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=t.currentItem[0].nodeName.toLowerCase(),n=e("<"+s+">",t.document[0]).addClass(i||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tr"===s?t.currentItem.children().each(function(){e("<td>&#160;</td>",t.document[0]).attr("colspan",e(this).attr("colspan")||1).appendTo(n)}):"img"===s&&n.attr("src",t.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(e,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10)))}}),t.placeholder=e(s.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),s.placeholder.update(t,t.placeholder)},_contactContainers:function(t){var i,s,n,a,o,r,h,l,u,d,c=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!e.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(c&&e.contains(this.containers[i].element[0],c.element[0]))continue;c=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0);if(c)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,a=null,u=c.floating||this._isFloating(this.currentItem),o=u?"left":"top",r=u?"width":"height",d=u?"clientX":"clientY",s=this.items.length-1;s>=0;s--)e.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[o],l=!1,t[d]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(t[d]-h)&&(n=Math.abs(t[d]-h),a=this.items[s],this.direction=l?"up":"down"));if(!a&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return;a?this._rearrange(t,a,null,!0):this._rearrange(t,null,this.containers[p].element,!0),this._trigger("change",t,this._uiHash()),this.containers[p]._trigger("change",t,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||e("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,e("document"===n.containment?document:window).width()-this.helperProportions.width-this.margins.left,(e("document"===n.containment?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(t=e(n.containment)[0],i=e(n.containment).offset(),s="hidden"!==e(t).css("overflow"),this.containment=[i.left+(parseInt(e(t).css("borderLeftWidth"),10)||0)+(parseInt(e(t).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(e(t).css("borderTopWidth"),10)||0)+(parseInt(e(t).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(e(t).css("borderLeftWidth"),10)||0)-(parseInt(e(t).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(e(t).css("borderTopWidth"),10)||0)-(parseInt(e(t).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,i){i||(i=this.position);var s="absolute"===t?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,a=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():a?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():a?0:n.scrollLeft())*s}},_generatePosition:function(t){var i,s,n=this.options,a=t.pageX,o=t.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==document&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(a=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(a=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((a-this.originalPageX)/n.grid[0])*n.grid[0],a=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(e,t,i,s){i?i[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(e,t){function i(e,t,i){return function(s){i._trigger(e,s,t._uiHash(t))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!t&&n.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||t||n.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(t||(n.push(function(e){this._trigger("remove",e,this._uiHash())}),n.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)t||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,this.cancelHelperRemoval){if(!t){for(this._trigger("beforeStop",e,this._uiHash()),s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!1}if(t||this._trigger("beforeStop",e,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null,!t){for(s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!0},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var i=t||this;return{helper:i.helper,placeholder:i.placeholder||e([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:t?t.element:null}}}),e.widget("ui.accordion",{version:"1.11.1",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),t.collapsible||t.active!==!1&&null!=t.active||(t.active=0),this._processPanels(),0>t.active&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("<span>").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").removeUniqueId(),this._destroyIcons(),e=this.headers.next().removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").css("display","").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&e.css("height","")},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):("event"===e&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),"collapsible"!==e||t||this.options.active!==!1||this._activate(0),"icons"===e&&(this._destroyIcons(),t&&this._createIcons()),"disabled"===e&&(this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)),void 0)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var i=e.ui.keyCode,s=this.headers.length,n=this.headers.index(t.target),a=!1;switch(t.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(t);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(e(t.target).attr("tabIndex",-1),e(a).attr("tabIndex",0),a.focus(),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels(),t.active===!1&&t.collapsible===!0||!this.headers.length?(t.active=!1,this.active=e()):t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-state-default ui-corner-all"),this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide()},_refresh:function(){var t,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(){var t=e(this),i=t.uniqueId().attr("id"),s=t.next(),n=s.uniqueId().attr("id");
+t.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(t=n.height(),this.element.siblings(":visible").each(function(){var i=e(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(t-=i.outerHeight(!0))}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===s&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var i=this._findActive(t)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):e()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?e():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?e():n,newPanel:r};t.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(t){var i=t.newPanel,s=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,t):(s.hide(),i.show(),this._toggleComplete(t)),s.attr({"aria-hidden":"true"}),s.prev().attr("aria-selected","false"),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true",tabIndex:0,"aria-expanded":"true"})},_animate:function(e,t,i){var s,n,a,o=this,r=0,h=e.length&&(!t.length||e.index()<t.index()),l=this.options.animate||{},u=h&&l.down||l,d=function(){o._toggleComplete(i)};return"number"==typeof u&&(a=u),"string"==typeof u&&(n=u),n=n||u.easing||l.easing,a=a||u.duration||l.duration,t.length?e.length?(s=e.show().outerHeight(),t.animate(this.hideProps,{duration:a,easing:n,step:function(e,t){t.now=Math.round(e)}}),e.hide().animate(this.showProps,{duration:a,easing:n,complete:d,step:function(e,i){i.now=Math.round(e),"height"!==i.prop?r+=i.now:"content"!==o.options.heightStyle&&(i.now=Math.round(s-t.outerHeight()-r),r=0)}}),void 0):t.animate(this.hideProps,a,n,d):e.animate(this.showProps,a,n,d)},_toggleComplete:function(e){var t=e.oldPanel;t.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),t.length&&(t.parent()[0].className=t.parent()[0].className),this._trigger("activate",null,e)}}),e.widget("ui.menu",{version:"1.11.1",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},items:"> *",menus:"ul",position:{my:"left-1 top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item":function(e){e.preventDefault()},"click .ui-menu-item":function(t){var i=e(t.target);!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&e(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){var i=e(t.currentTarget);i.siblings(".ui-state-active").removeClass("ui-state-active"),this.focus(t,i)},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var i=this.active||this.element.find(this.options.items).eq(0);t||this.focus(e,i)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){this._closeOnDocumentClick(e)&&this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-menu-icons ui-front").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").removeUniqueId().removeClass("ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){function i(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}var s,n,a,o,r,h=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:h=!1,n=this.previousFilter||"",a=String.fromCharCode(t.keyCode),o=!1,clearTimeout(this.filterTimer),a===n?o=!0:a=n+a,r=RegExp("^"+i(a),"i"),s=this.activeMenu.find(this.options.items).filter(function(){return r.test(e(this).text())}),s=o&&-1!==s.index(this.active.next())?this.active.nextAll(".ui-menu-item"):s,s.length||(a=String.fromCharCode(t.keyCode),r=RegExp("^"+i(a),"i"),s=this.activeMenu.find(this.options.items).filter(function(){return r.test(e(this).text())})),s.length?(this.focus(t,s),s.length>1?(this.previousFilter=a,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter):delete this.previousFilter}h&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.is("[aria-haspopup='true']")?this.expand(e):this.select(e))},refresh:function(){var t,i,s=this,n=this.options.icons.submenu,a=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),a.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-front").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),i=t.parent(),s=e("<span>").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);i.attr("aria-haspopup","true").prepend(s),t.attr("aria-labelledby",i.attr("id"))}),t=a.add(this.element),i=t.find(this.options.items),i.not(".ui-menu-item").each(function(){var t=e(this);s._isDivider(t)&&t.addClass("ui-widget-content ui-menu-divider")}),i.not(".ui-menu-item, .ui-menu-divider").addClass("ui-menu-item").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){"icons"===e&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(t.submenu),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},focus:function(e,t){var i,s;this.blur(e,e&&"focus"===e.type),this._scrollIntoView(t),this.active=t.first(),s=this.active.addClass("ui-state-focus").removeClass("ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").addClass("ui-state-active"),e&&"keydown"===e.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=t.children(".ui-menu"),i.length&&e&&/^mouse/.test(e.type)&&this._startOpening(i),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,n=t.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=t.outerHeight(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(e,t){t||clearTimeout(this.timer),this.active&&(this.active.removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active}))},_startOpening:function(e){clearTimeout(this.timer),"true"===e.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(e)},this.delay))},_open:function(t){var i=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(t,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(t),this.activeMenu=s},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find(".ui-state-active").not(".ui-state-focus").removeClass("ui-state-active")},_closeOnDocumentClick:function(t){return!e(t.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,i){var s;this.active&&(s="first"===e||"last"===e?this.active["first"===e?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[e+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[t]()),this.focus(i,s)},nextPage:function(t){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=e(this),0>i.offset().top-s-n}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(t),void 0)},previousPage:function(t){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=e(this),i.offset().top-s+n>0}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items).first())),void 0):(this.next(t),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||e(t.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,i)}}),e.widget("ui.autocomplete",{version:"1.11.1",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,void 0;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),void 0):(this._searchTimeout(e),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(e),this._change(e),void 0)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(s){s.target===t.element[0]||s.target===i||e.contains(i,s.target)||t.close()})})},menufocus:function(t,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:n})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&e.trim(s).length&&(this.liveRegion.children().hide(),e("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,t){var i=t.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",e,{item:i})&&this._value(i.value),this.term=this._value(),this.close(e),this.selectedItem=i}}),this.liveRegion=e("<span>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),"source"===e&&this._initSource(),"appendTo"===e&&this.menu.element.appendTo(this._appendTo()),"disabled"===e&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_initSource:function(){var t,i,s=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(i,s){s(e.ui.autocomplete.filter(t,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(t,n){s.xhr&&s.xhr.abort(),s.xhr=e.ajax({url:i,data:t,dataType:"json",success:function(e){n(e)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),i=this.menu.element.is(":visible"),s=e.altKey||e.ctrlKey||e.metaKey||e.shiftKey;(!t||t&&!i&&!s)&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){return e=null!=e?e:this._value(),this.term=this._value(),e.length<this.options.minLength?this.close(t):this._trigger("search",t)!==!1?this._search(e):void 0},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var t=++this.requestIndex;return e.proxy(function(e){t===this.requestIndex&&this.__response(e),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},this)},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return"string"==typeof t?{label:t,value:t}:e.extend({},t,{label:t.label||t.value,value:t.value||t.label})})},_suggest:function(t){var i=this.menu.element.empty();this._renderMenu(i,t),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,i){var s=this;e.each(i,function(e,i){s._renderItemData(t,i)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,i){return e("<li>").text(i.label).appendTo(t)},_move:function(e,t){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[e](t),void 0):(this.search(null,t),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(e,t),t.preventDefault())}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,i){var s=RegExp(e.ui.autocomplete.escapeRegex(i),"i");return e.grep(t,function(e){return s.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.children().hide(),e("<div>").text(i).appendTo(this.liveRegion))}}),e.ui.autocomplete;var c,p="ui-button ui-widget ui-state-default ui-corner-all",f="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",m=function(){var t=e(this);setTimeout(function(){t.find(":ui-button").button("refresh")},1)},g=function(t){var i=t.name,s=t.form,n=e([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?e(s).find("[name='"+i+"'][type=radio]"):e("[name='"+i+"'][type=radio]",t.ownerDocument).filter(function(){return!this.form})),n};e.widget("ui.button",{version:"1.11.1",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,m),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var t=this,i=this.options,s="checkbox"===this.type||"radio"===this.type,n=s?"":"ui-state-active";null===i.label&&(i.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(p).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){i.disabled||this===c&&e(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){i.disabled||e(this).removeClass(n)}).bind("click"+this.eventNamespace,function(e){i.disabled&&(e.preventDefault(),e.stopImmediatePropagation())}),this._on({focus:function(){this.buttonElement.addClass("ui-state-focus")},blur:function(){this.buttonElement.removeClass("ui-state-focus")}}),s&&this.element.bind("change"+this.eventNamespace,function(){t.refresh()}),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return i.disabled?!1:void 0}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(i.disabled)return!1;e(this).addClass("ui-state-active"),t.buttonElement.attr("aria-pressed","true");var s=t.element[0];g(s).not(s).map(function(){return e(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return i.disabled?!1:(e(this).addClass("ui-state-active"),c=this,t.document.one("mouseup",function(){c=null}),void 0)}).bind("mouseup"+this.eventNamespace,function(){return i.disabled?!1:(e(this).removeClass("ui-state-active"),void 0)}).bind("keydown"+this.eventNamespace,function(t){return i.disabled?!1:((t.keyCode===e.ui.keyCode.SPACE||t.keyCode===e.ui.keyCode.ENTER)&&e(this).addClass("ui-state-active"),void 0)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){e(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(t){t.keyCode===e.ui.keyCode.SPACE&&e(this).click()})),this._setOption("disabled",i.disabled),this._resetButton()},_determineButtonType:function(){var e,t,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(e=this.element.parents().last(),t="label[for='"+this.element.attr("id")+"']",this.buttonElement=e.find(t),this.buttonElement.length||(e=e.length?e.siblings():this.element.siblings(),this.buttonElement=e.filter(t),this.buttonElement.length||(this.buttonElement=e.find(t))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(p+" ui-state-active "+f).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(e,t){return this._super(e,t),"disabled"===e?(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),t&&("checkbox"===this.type||"radio"===this.type?this.buttonElement.removeClass("ui-state-focus"):this.buttonElement.removeClass("ui-state-focus ui-state-active")),void 0):(this._resetButton(),void 0)},refresh:function(){var t=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOption("disabled",t),"radio"===this.type?g(this.element[0]).each(function(){e(this).is(":checked")?e(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):e(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),void 0;var t=this.buttonElement.removeClass(f),i=e("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(t.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,a=[];s.primary||s.secondary?(this.options.text&&a.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&t.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&t.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(a.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||t.attr("title",e.trim(i)))):a.push("ui-button-text-only"),t.addClass(a.join(" "))}}),e.widget("ui.buttonset",{version:"1.11.1",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(e,t){"disabled"===e&&this.buttons.button("option",e,t),this._super(e,t)},refresh:function(){var t="rtl"===this.element.css("direction"),i=this.element.find(this.options.items),s=i.filter(":ui-button");i.not(":ui-button").button(),s.button("refresh"),this.buttons=i.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(t?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(t?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}}),e.ui.button,e.extend(e.ui,{datepicker:{version:"1.11.1"}});var v;e.extend(n.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return r(this._defaults,e||{}),this},_attachDatepicker:function(t,i){var s,n,a;s=t.nodeName.toLowerCase(),n="div"===s||"span"===s,t.id||(this.uuid+=1,t.id="dp"+this.uuid),a=this._newInst(e(t),n),a.settings=e.extend({},i||{}),"input"===s?this._connectDatepicker(t,a):n&&this._inlineDatepicker(t,a)},_newInst:function(t,i){var s=t[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?a(e("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,i){var s=e(t);i.append=e([]),i.trigger=e([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),e.data(t,"datepicker",i),i.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,i){var s,n,a,o=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),o&&(i.append=e("<span class='"+this._appendClass+"'>"+o+"</span>"),t[r?"before":"after"](i.append)),t.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&t.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),a=this._get(i,"buttonImage"),i.trigger=e(this._get(i,"buttonImageOnly")?e("<img/>").addClass(this._triggerClass).attr({src:a,alt:n,title:n}):e("<button type='button'></button>").addClass(this._triggerClass).html(a?e("<img/>").attr({src:a,alt:n,title:n}):n)),t[r?"before":"after"](i.trigger),i.trigger.click(function(){return e.datepicker._datepickerShowing&&e.datepicker._lastInput===t[0]?e.datepicker._hideDatepicker():e.datepicker._datepickerShowing&&e.datepicker._lastInput!==t[0]?(e.datepicker._hideDatepicker(),e.datepicker._showDatepicker(t[0])):e.datepicker._showDatepicker(t[0]),!1}))},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t,i,s,n,a=new Date(2009,11,20),o=this._get(e,"dateFormat");o.match(/[DM]/)&&(t=function(e){for(i=0,s=0,n=0;e.length>n;n++)e[n].length>i&&(i=e[n].length,s=n);return s},a.setMonth(t(this._get(e,o.match(/MM/)?"monthNames":"monthNamesShort"))),a.setDate(t(this._get(e,o.match(/DD/)?"dayNames":"dayNamesShort"))+20-a.getDay())),e.input.attr("size",this._formatDate(e,a).length)}},_inlineDatepicker:function(t,i){var s=e(t);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),e.data(t,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(t),i.dpDiv.css("display","block"))},_dialogDatepicker:function(t,i,s,n,a){var o,h,l,u,d,c=this._dialogInst;return c||(this.uuid+=1,o="dp"+this.uuid,this._dialogInput=e("<input type='text' id='"+o+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),e("body").append(this._dialogInput),c=this._dialogInst=this._newInst(this._dialogInput,!1),c.settings={},e.data(this._dialogInput[0],"datepicker",c)),r(c.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(c,i):i,this._dialogInput.val(i),this._pos=a?a.length?a:[a.pageX,a.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+u,l/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),c.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),e.blockUI&&e.blockUI(this.dpDiv),e.data(this._dialogInput[0],"datepicker",c),this},_destroyDatepicker:function(t){var i,s=e(t),n=e.data(t,"datepicker");s.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),e.removeData(t,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty())
+},_enableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!1,a.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}))},_disableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!0,a.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}),this._disabledInputs[this._disabledInputs.length]=t)},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;this._disabledInputs.length>t;t++)if(this._disabledInputs[t]===e)return!0;return!1},_getInst:function(t){try{return e.data(t,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,i,s){var n,a,o,h,l=this._getInst(t);return 2===arguments.length&&"string"==typeof i?"defaults"===i?e.extend({},e.datepicker._defaults):l?"all"===i?e.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),a=this._getDateDatepicker(t,!0),o=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),r(l.settings,n),null!==o&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,o)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(e(t),l),this._autoSize(l),this._setDate(l,a),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(e,t,i){this._optionDatepicker(e,t,i)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var i=this._getInst(e);i&&(this._setDate(i,t),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(e,t){var i=this._getInst(e);return i&&!i.inline&&this._setDateFromField(i,t),i?this._getDate(i):null},_doKeyDown:function(t){var i,s,n,a=e.datepicker._getInst(t.target),o=!0,r=a.dpDiv.is(".ui-datepicker-rtl");if(a._keyEvent=!0,e.datepicker._datepickerShowing)switch(t.keyCode){case 9:e.datepicker._hideDatepicker(),o=!1;break;case 13:return n=e("td."+e.datepicker._dayOverClass+":not(."+e.datepicker._currentClass+")",a.dpDiv),n[0]&&e.datepicker._selectDay(t.target,a.selectedMonth,a.selectedYear,n[0]),i=e.datepicker._get(a,"onSelect"),i?(s=e.datepicker._formatDate(a),i.apply(a.input?a.input[0]:null,[s,a])):e.datepicker._hideDatepicker(),!1;case 27:e.datepicker._hideDatepicker();break;case 33:e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 34:e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&e.datepicker._clearDate(t.target),o=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&e.datepicker._gotoToday(t.target),o=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?1:-1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,-7,"D"),o=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?-1:1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,7,"D"),o=t.ctrlKey||t.metaKey;break;default:o=!1}else 36===t.keyCode&&t.ctrlKey?e.datepicker._showDatepicker(this):o=!1;o&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var i,s,n=e.datepicker._getInst(t.target);return e.datepicker._get(n,"constrainInput")?(i=e.datepicker._possibleChars(e.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(t){var i,s=e.datepicker._getInst(t.target);if(s.input.val()!==s.lastVal)try{i=e.datepicker.parseDate(e.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,e.datepicker._getFormatConfig(s)),i&&(e.datepicker._setDateFromField(s),e.datepicker._updateAlternate(s),e.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(t){if(t=t.target||t,"input"!==t.nodeName.toLowerCase()&&(t=e("input",t.parentNode)[0]),!e.datepicker._isDisabledDatepicker(t)&&e.datepicker._lastInput!==t){var i,n,a,o,h,l,u;i=e.datepicker._getInst(t),e.datepicker._curInst&&e.datepicker._curInst!==i&&(e.datepicker._curInst.dpDiv.stop(!0,!0),i&&e.datepicker._datepickerShowing&&e.datepicker._hideDatepicker(e.datepicker._curInst.input[0])),n=e.datepicker._get(i,"beforeShow"),a=n?n.apply(t,[t,i]):{},a!==!1&&(r(i.settings,a),i.lastVal=null,e.datepicker._lastInput=t,e.datepicker._setDateFromField(i),e.datepicker._inDialog&&(t.value=""),e.datepicker._pos||(e.datepicker._pos=e.datepicker._findPos(t),e.datepicker._pos[1]+=t.offsetHeight),o=!1,e(t).parents().each(function(){return o|="fixed"===e(this).css("position"),!o}),h={left:e.datepicker._pos[0],top:e.datepicker._pos[1]},e.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),e.datepicker._updateDatepicker(i),h=e.datepicker._checkOffset(i,h,o),i.dpDiv.css({position:e.datepicker._inDialog&&e.blockUI?"static":o?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),i.inline||(l=e.datepicker._get(i,"showAnim"),u=e.datepicker._get(i,"duration"),i.dpDiv.css("z-index",s(e(t))+1),e.datepicker._datepickerShowing=!0,e.effects&&e.effects.effect[l]?i.dpDiv.show(l,e.datepicker._get(i,"showOptions"),u):i.dpDiv[l||"show"](l?u:null),e.datepicker._shouldFocusInput(i)&&i.input.focus(),e.datepicker._curInst=i))}},_updateDatepicker:function(t){this.maxRows=4,v=t,t.dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t);var i,s=this._getNumberOfMonths(t),n=s[1],a=17,r=t.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&t.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),t.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===e.datepicker._curInst&&e.datepicker._datepickerShowing&&e.datepicker._shouldFocusInput(t)&&t.input.focus(),t.yearshtml&&(i=t.yearshtml,setTimeout(function(){i===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year:first").replaceWith(t.yearshtml),i=t.yearshtml=null},0))},_shouldFocusInput:function(e){return e.input&&e.input.is(":visible")&&!e.input.is(":disabled")&&!e.input.is(":focus")},_checkOffset:function(t,i,s){var n=t.dpDiv.outerWidth(),a=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,r=t.input?t.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:e(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:e(document).scrollTop());return i.left-=this._get(t,"isRTL")?n-o:0,i.left-=s&&i.left===t.input.offset().left?e(document).scrollLeft():0,i.top-=s&&i.top===t.input.offset().top+r?e(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+a>l&&l>a?Math.abs(a+r):0),i},_findPos:function(t){for(var i,s=this._getInst(t),n=this._get(s,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||e.expr.filters.hidden(t));)t=t[n?"previousSibling":"nextSibling"];return i=e(t).offset(),[i.left,i.top]},_hideDatepicker:function(t){var i,s,n,a,o=this._curInst;!o||t&&o!==e.data(t,"datepicker")||this._datepickerShowing&&(i=this._get(o,"showAnim"),s=this._get(o,"duration"),n=function(){e.datepicker._tidyDialog(o)},e.effects&&(e.effects.effect[i]||e.effects[i])?o.dpDiv.hide(i,e.datepicker._get(o,"showOptions"),s,n):o.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,a=this._get(o,"onClose"),a&&a.apply(o.input?o.input[0]:null,[o.input?o.input.val():"",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),e.blockUI&&(e.unblockUI(),e("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(t){if(e.datepicker._curInst){var i=e(t.target),s=e.datepicker._getInst(i[0]);(i[0].id!==e.datepicker._mainDivId&&0===i.parents("#"+e.datepicker._mainDivId).length&&!i.hasClass(e.datepicker.markerClassName)&&!i.closest("."+e.datepicker._triggerClass).length&&e.datepicker._datepickerShowing&&(!e.datepicker._inDialog||!e.blockUI)||i.hasClass(e.datepicker.markerClassName)&&e.datepicker._curInst!==s)&&e.datepicker._hideDatepicker()}},_adjustDate:function(t,i,s){var n=e(t),a=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(a,i+("M"===s?this._get(a,"showCurrentAtPos"):0),s),this._updateDatepicker(a))},_gotoToday:function(t){var i,s=e(t),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(t,i,s){var n=e(t),a=this._getInst(n[0]);a["selected"+("M"===s?"Month":"Year")]=a["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(a),this._adjustDate(n)},_selectDay:function(t,i,s,n){var a,o=e(t);e(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0])||(a=this._getInst(o[0]),a.selectedDay=a.currentDay=e("a",n).html(),a.selectedMonth=a.currentMonth=i,a.selectedYear=a.currentYear=s,this._selectDate(t,this._formatDate(a,a.currentDay,a.currentMonth,a.currentYear)))},_clearDate:function(t){var i=e(t);this._selectDate(i,"")},_selectDate:function(t,i){var s,n=e(t),a=this._getInst(n[0]);i=null!=i?i:this._formatDate(a),a.input&&a.input.val(i),this._updateAlternate(a),s=this._get(a,"onSelect"),s?s.apply(a.input?a.input[0]:null,[i,a]):a.input&&a.input.trigger("change"),a.inline?this._updateDatepicker(a):(this._hideDatepicker(),this._lastInput=a.input[0],"object"!=typeof a.input[0]&&a.input.focus(),this._lastInput=null)},_updateAlternate:function(t){var i,s,n,a=this._get(t,"altField");a&&(i=this._get(t,"altFormat")||this._get(t,"dateFormat"),s=this._getDate(t),n=this.formatDate(i,s,this._getFormatConfig(t)),e(a).each(function(){e(this).val(n)}))},noWeekends:function(e){var t=e.getDay();return[t>0&&6>t,""]},iso8601Week:function(e){var t,i=new Date(e.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),t=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((t-i)/864e5)/7)+1},parseDate:function(t,i,s){if(null==t||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,a,o,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),d=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,c=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,m=-1,g=-1,v=-1,y=-1,b=!1,_=function(e){var i=t.length>n+1&&t.charAt(n+1)===e;return i&&n++,i},x=function(e){var t=_(e),s="@"===e?14:"!"===e?20:"y"===e&&t?4:"o"===e?3:2,n="y"===e?s:1,a=RegExp("^\\d{"+n+","+s+"}"),o=i.substring(h).match(a);if(!o)throw"Missing number at position "+h;return h+=o[0].length,parseInt(o[0],10)},w=function(t,s,n){var a=-1,o=e.map(_(t)?n:s,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)});if(e.each(o,function(e,t){var s=t[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(a=t[0],h+=s.length,!1):void 0}),-1!==a)return a+1;throw"Unknown name at position "+h},k=function(){if(i.charAt(h)!==t.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;t.length>n;n++)if(b)"'"!==t.charAt(n)||_("'")?k():b=!1;else switch(t.charAt(n)){case"d":v=x("d");break;case"D":w("D",d,c);break;case"o":y=x("o");break;case"m":g=x("m");break;case"M":g=w("M",p,f);break;case"y":m=x("y");break;case"@":r=new Date(x("@")),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"!":r=new Date((x("!")-this._ticksTo1970)/1e4),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"'":_("'")?k():b=!0;break;default:k()}if(i.length>h&&(o=i.substr(h),!/^\s+/.test(o)))throw"Extra/unparsed characters found in date: "+o;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),y>-1)for(g=1,v=y;;){if(a=this._getDaysInMonth(m,g-1),a>=v)break;g++,v-=a}if(r=this._daylightSavingAdjust(new Date(m,g-1,v)),r.getFullYear()!==m||r.getMonth()+1!==g||r.getDate()!==v)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(e,t,i){if(!t)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,a=(i?i.dayNames:null)||this._defaults.dayNames,o=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(t){var i=e.length>s+1&&e.charAt(s+1)===t;return i&&s++,i},l=function(e,t,i){var s=""+t;if(h(e))for(;i>s.length;)s="0"+s;return s},u=function(e,t,i,s){return h(e)?s[t]:i[t]},d="",c=!1;if(t)for(s=0;e.length>s;s++)if(c)"'"!==e.charAt(s)||h("'")?d+=e.charAt(s):c=!1;else switch(e.charAt(s)){case"d":d+=l("d",t.getDate(),2);break;case"D":d+=u("D",t.getDay(),n,a);break;case"o":d+=l("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":d+=l("m",t.getMonth()+1,2);break;case"M":d+=u("M",t.getMonth(),o,r);break;case"y":d+=h("y")?t.getFullYear():(10>t.getYear()%100?"0":"")+t.getYear()%100;break;case"@":d+=t.getTime();break;case"!":d+=1e4*t.getTime()+this._ticksTo1970;break;case"'":h("'")?d+="'":c=!0;break;default:d+=e.charAt(s)}return d},_possibleChars:function(e){var t,i="",s=!1,n=function(i){var s=e.length>t+1&&e.charAt(t+1)===i;return s&&t++,s};for(t=0;e.length>t;t++)if(s)"'"!==e.charAt(t)||n("'")?i+=e.charAt(t):s=!1;else switch(e.charAt(t)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=e.charAt(t)}return i},_get:function(e,t){return void 0!==e.settings[t]?e.settings[t]:this._defaults[t]},_setDateFromField:function(e,t){if(e.input.val()!==e.lastVal){var i=this._get(e,"dateFormat"),s=e.lastVal=e.input?e.input.val():null,n=this._getDefaultDate(e),a=n,o=this._getFormatConfig(e);try{a=this.parseDate(i,s,o)||n}catch(r){s=t?"":s}e.selectedDay=a.getDate(),e.drawMonth=e.selectedMonth=a.getMonth(),e.drawYear=e.selectedYear=a.getFullYear(),e.currentDay=s?a.getDate():0,e.currentMonth=s?a.getMonth():0,e.currentYear=s?a.getFullYear():0,this._adjustInstDate(e)}},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,"defaultDate"),new Date))},_determineDate:function(t,i,s){var n=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},a=function(i){try{return e.datepicker.parseDate(e.datepicker._get(t,"dateFormat"),i,e.datepicker._getFormatConfig(t))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?e.datepicker._getDate(t):null)||new Date,a=n.getFullYear(),o=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":o+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o));break;case"y":case"Y":a+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o))}l=h.exec(i)}return new Date(a,o,r)},o=null==i||""===i?s:"string"==typeof i?a(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return o=o&&"Invalid Date"==""+o?s:o,o&&(o.setHours(0),o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)),this._daylightSavingAdjust(o)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,i){var s=!t,n=e.selectedMonth,a=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),n===e.selectedMonth&&a===e.selectedYear||i||this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(s?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&""===e.input.val()?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(t){var i=this._get(t,"stepMonths"),s="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){e.datepicker._adjustDate(s,-i,"M")},next:function(){e.datepicker._adjustDate(s,+i,"M")},hide:function(){e.datepicker._hideDatepicker()},today:function(){e.datepicker._gotoToday(s)},selectDay:function(){return e.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return e.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return e.datepicker._selectMonthYear(s,this,"Y"),!1}};e(this).bind(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t,i,s,n,a,o,r,h,l,u,d,c,p,f,m,g,v,y,b,_,x,w,k,T,D,S,N,M,C,A,P,I,H,z,F,E,W,L,O,j=new Date,R=this._daylightSavingAdjust(new Date(j.getFullYear(),j.getMonth(),j.getDate())),Y=this._get(e,"isRTL"),J=this._get(e,"showButtonPanel"),B=this._get(e,"hideIfNoPrevNext"),K=this._get(e,"navigationAsDateFormat"),V=this._getNumberOfMonths(e),U=this._get(e,"showCurrentAtPos"),q=this._get(e,"stepMonths"),G=1!==V[0]||1!==V[1],X=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),Q=this._getMinMaxDate(e,"min"),$=this._getMinMaxDate(e,"max"),Z=e.drawMonth-U,et=e.drawYear;if(0>Z&&(Z+=12,et--),$)for(t=this._daylightSavingAdjust(new Date($.getFullYear(),$.getMonth()-V[0]*V[1]+1,$.getDate())),t=Q&&Q>t?Q:t;this._daylightSavingAdjust(new Date(et,Z,1))>t;)Z--,0>Z&&(Z=11,et--);for(e.drawMonth=Z,e.drawYear=et,i=this._get(e,"prevText"),i=K?this.formatDate(i,this._daylightSavingAdjust(new Date(et,Z-q,1)),this._getFormatConfig(e)):i,s=this._canAdjustMonth(e,-1,et,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":B?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(e,"nextText"),n=K?this.formatDate(n,this._daylightSavingAdjust(new Date(et,Z+q,1)),this._getFormatConfig(e)):n,a=this._canAdjustMonth(e,1,et,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":B?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",o=this._get(e,"currentText"),r=this._get(e,"gotoCurrent")&&e.currentDay?X:R,o=K?this.formatDate(o,r,this._getFormatConfig(e)):o,h=e.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(e,"closeText")+"</button>",l=J?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(e,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+o+"</button>":"")+(Y?"":h)+"</div>":"",u=parseInt(this._get(e,"firstDay"),10),u=isNaN(u)?0:u,d=this._get(e,"showWeek"),c=this._get(e,"dayNames"),p=this._get(e,"dayNamesMin"),f=this._get(e,"monthNames"),m=this._get(e,"monthNamesShort"),g=this._get(e,"beforeShowDay"),v=this._get(e,"showOtherMonths"),y=this._get(e,"selectOtherMonths"),b=this._getDefaultDate(e),_="",w=0;V[0]>w;w++){for(k="",this.maxRows=4,T=0;V[1]>T;T++){if(D=this._daylightSavingAdjust(new Date(et,Z,e.selectedDay)),S=" ui-corner-all",N="",G){if(N+="<div class='ui-datepicker-group",V[1]>1)switch(T){case 0:N+=" ui-datepicker-group-first",S=" ui-corner-"+(Y?"right":"left");break;case V[1]-1:N+=" ui-datepicker-group-last",S=" ui-corner-"+(Y?"left":"right");break;default:N+=" ui-datepicker-group-middle",S=""}N+="'>"}for(N+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+S+"'>"+(/all|left/.test(S)&&0===w?Y?a:s:"")+(/all|right/.test(S)&&0===w?Y?s:a:"")+this._generateMonthYearHeader(e,Z,et,Q,$,w>0||T>0,f,m)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",M=d?"<th class='ui-datepicker-week-col'>"+this._get(e,"weekHeader")+"</th>":"",x=0;7>x;x++)C=(x+u)%7,M+="<th scope='col'"+((x+u+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+c[C]+"'>"+p[C]+"</span></th>";for(N+=M+"</tr></thead><tbody>",A=this._getDaysInMonth(et,Z),et===e.selectedYear&&Z===e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,A)),P=(this._getFirstDayOfMonth(et,Z)-u+7)%7,I=Math.ceil((P+A)/7),H=G?this.maxRows>I?this.maxRows:I:I,this.maxRows=H,z=this._daylightSavingAdjust(new Date(et,Z,1-P)),F=0;H>F;F++){for(N+="<tr>",E=d?"<td class='ui-datepicker-week-col'>"+this._get(e,"calculateWeek")(z)+"</td>":"",x=0;7>x;x++)W=g?g.apply(e.input?e.input[0]:null,[z]):[!0,""],L=z.getMonth()!==Z,O=L&&!y||!W[0]||Q&&Q>z||$&&z>$,E+="<td class='"+((x+u+6)%7>=5?" ui-datepicker-week-end":"")+(L?" ui-datepicker-other-month":"")+(z.getTime()===D.getTime()&&Z===e.selectedMonth&&e._keyEvent||b.getTime()===z.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(O?" "+this._unselectableClass+" ui-state-disabled":"")+(L&&!v?"":" "+W[1]+(z.getTime()===X.getTime()?" "+this._currentClass:"")+(z.getTime()===R.getTime()?" ui-datepicker-today":""))+"'"+(L&&!v||!W[2]?"":" title='"+W[2].replace(/'/g,"&#39;")+"'")+(O?"":" data-handler='selectDay' data-event='click' data-month='"+z.getMonth()+"' data-year='"+z.getFullYear()+"'")+">"+(L&&!v?"&#xa0;":O?"<span class='ui-state-default'>"+z.getDate()+"</span>":"<a class='ui-state-default"+(z.getTime()===R.getTime()?" ui-state-highlight":"")+(z.getTime()===X.getTime()?" ui-state-active":"")+(L?" ui-priority-secondary":"")+"' href='#'>"+z.getDate()+"</a>")+"</td>",z.setDate(z.getDate()+1),z=this._daylightSavingAdjust(z);N+=E+"</tr>"}Z++,Z>11&&(Z=0,et++),N+="</tbody></table>"+(G?"</div>"+(V[0]>0&&T===V[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),k+=N}_+=k}return _+=l,e._keyEvent=!1,_},_generateMonthYearHeader:function(e,t,i,s,n,a,o,r){var h,l,u,d,c,p,f,m,g=this._get(e,"changeMonth"),v=this._get(e,"changeYear"),y=this._get(e,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",_="";if(a||!g)_+="<span class='ui-datepicker-month'>"+o[t]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,_+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",u=0;12>u;u++)(!h||u>=s.getMonth())&&(!l||n.getMonth()>=u)&&(_+="<option value='"+u+"'"+(u===t?" selected='selected'":"")+">"+r[u]+"</option>");_+="</select>"}if(y||(b+=_+(!a&&g&&v?"":"&#xa0;")),!e.yearshtml)if(e.yearshtml="",a||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(d=this._get(e,"yearRange").split(":"),c=(new Date).getFullYear(),p=function(e){var t=e.match(/c[+\-].*/)?i+parseInt(e.substring(1),10):e.match(/[+\-].*/)?c+parseInt(e,10):parseInt(e,10);return isNaN(t)?c:t},f=p(d[0]),m=Math.max(f,p(d[1]||"")),f=s?Math.max(f,s.getFullYear()):f,m=n?Math.min(m,n.getFullYear()):m,e.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";m>=f;f++)e.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";e.yearshtml+="</select>",b+=e.yearshtml,e.yearshtml=null}return b+=this._get(e,"yearSuffix"),y&&(b+=(!a&&g&&v?"":"&#xa0;")+_),b+="</div>"},_adjustInstDate:function(e,t,i){var s=e.drawYear+("Y"===i?t:0),n=e.drawMonth+("M"===i?t:0),a=Math.min(e.selectedDay,this._getDaysInMonth(s,n))+("D"===i?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(s,n,a)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(e)},_restrictMinMax:function(e,t){var i=this._getMinMaxDate(e,"min"),s=this._getMinMaxDate(e,"max"),n=i&&i>t?i:t;return s&&n>s?s:n},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return null==t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return new Date(e,t,1).getDay()},_canAdjustMonth:function(e,t,i,s){var n=this._getNumberOfMonths(e),a=this._daylightSavingAdjust(new Date(i,s+(0>t?t:n[0]*n[1]),1));return 0>t&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(e,a)},_isInRange:function(e,t){var i,s,n=this._getMinMaxDate(e,"min"),a=this._getMinMaxDate(e,"max"),o=null,r=null,h=this._get(e,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),o=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(o+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||t.getTime()>=n.getTime())&&(!a||t.getTime()<=a.getTime())&&(!o||t.getFullYear()>=o)&&(!r||r>=t.getFullYear())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t="string"!=typeof t?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,i,s){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var n=t?"object"==typeof t?t:this._daylightSavingAdjust(new Date(s,i,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),n,this._getFormatConfig(e))}}),e.fn.datepicker=function(t){if(!this.length)return this;e.datepicker.initialized||(e(document).mousedown(e.datepicker._checkExternalClick),e.datepicker.initialized=!0),0===e("#"+e.datepicker._mainDivId).length&&e("body").append(e.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof t||"isDisabled"!==t&&"getDate"!==t&&"widget"!==t?"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof t?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this].concat(i)):e.datepicker._attachDatepicker(this,t)}):e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i))},e.datepicker=new n,e.datepicker.initialized=!1,e.datepicker.uuid=(new Date).getTime(),e.datepicker.version="1.11.1",e.datepicker,e.widget("ui.dialog",{version:"1.11.1",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"Close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var i=e(this).css(t).offset().top;0>i&&e(this).css("top",t.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&e.fn.draggable&&this._makeDraggable(),this.options.resizable&&e.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?e(t):this.document.find(t||"body").eq(0)},_destroy:function(){var e,t=this.originalPosition;this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},disable:e.noop,enable:e.noop,close:function(t){var i,s=this;if(this._isOpen&&this._trigger("beforeClose",t)!==!1){if(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),!this.opener.filter(":focusable").focus().length)try{i=this.document[0].activeElement,i&&"body"!==i.nodeName.toLowerCase()&&e(i).blur()}catch(n){}this._hide(this.uiDialog,this.options.hide,function(){s._trigger("close",t)})}},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+e(this).css("z-index")}).get(),a=Math.max.apply(null,n);return a>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",a+1),s=!0),s&&!i&&this._trigger("focus",t),s},open:function(){var t=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=e(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var e=this._focusedElement;
+e||(e=this.element.find("[autofocus]")),e.length||(e=this.element.find(":tabbable")),e.length||(e=this.uiDialogButtonPane.find(":tabbable")),e.length||(e=this.uiDialogTitlebarClose.filter(":tabbable")),e.length||(e=this.uiDialog),e.eq(0).focus()},_keepFocus:function(t){function i(){var t=this.document[0].activeElement,i=this.uiDialog[0]===t||e.contains(this.uiDialog[0],t);i||this._focusTabbable()}t.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=e("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===e.ui.keyCode.ESCAPE)return t.preventDefault(),this.close(t),void 0;if(t.keyCode===e.ui.keyCode.TAB&&!t.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");t.target!==n[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==s[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){n.focus()}),t.preventDefault()):(this._delay(function(){s.focus()}),t.preventDefault())}},mousedown:function(e){this._moveToTop(e)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=e("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(t){e(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=e("<button type='button'></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(e){e.preventDefault(),this.close(e)}}),t=e("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(t),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(e){this.options.title||e.html("&#160;"),e.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=e("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=e("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var t=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),e.isEmptyObject(i)||e.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),void 0):(e.each(i,function(i,s){var n,a;s=e.isFunction(s)?{click:s,text:i}:s,s=e.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(t.element[0],arguments)},a={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,e("<button></button>",s).button(a).appendTo(t.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function t(e){return{position:e.position,offset:e.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){e(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,t(n))},drag:function(e,s){i._trigger("drag",e,t(s))},stop:function(n,a){var o=a.offset.left-i.document.scrollLeft(),r=a.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(o>=0?"+":"")+o+" "+"top"+(r>=0?"+":"")+r,of:i.window},e(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,t(a))}})},_makeResizable:function(){function t(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}var i=this,s=this.options,n=s.resizable,a=this.uiDialog.css("position"),o="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:o,start:function(s,n){e(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,t(n))},resize:function(e,s){i._trigger("resize",e,t(s))},stop:function(n,a){var o=i.uiDialog.offset(),r=o.left-i.document.scrollLeft(),h=o.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(h>=0?"+":"")+h,of:i.window},e(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,t(a))}}).css("position",a)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._makeFocusTarget(),this._focusedElement=e(t.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var t=this._trackingInstances(),i=e.inArray(this,t);-1!==i&&t.splice(i,1)},_trackingInstances:function(){var e=this.document.data("ui-dialog-instances");return e||(e=[],this.document.data("ui-dialog-instances",e)),e},_minHeight:function(){var e=this.options;return"auto"===e.height?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(){var e=this.uiDialog.is(":visible");e||this.uiDialog.show(),this.uiDialog.position(this.options.position),e||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};e.each(t,function(e,t){i._setOption(e,t),e in i.sizeRelatedOptions&&(s=!0),e in i.resizableRelatedOptions&&(n[e]=t)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,t){var i,s,n=this.uiDialog;"dialogClass"===e&&n.removeClass(this.options.dialogClass).addClass(t),"disabled"!==e&&(this._super(e,t),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:""+t}),"draggable"===e&&(i=n.is(":data(ui-draggable)"),i&&!t&&n.draggable("destroy"),!i&&t&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(s=n.is(":data(ui-resizable)"),s&&!t&&n.resizable("destroy"),s&&"string"==typeof t&&n.resizable("option","handles",t),s||t===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var e,t,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),e=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),t=Math.max(0,s.minHeight-e),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-e):"none","auto"===s.height?this.element.css({minHeight:t,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-e)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var t=e(this);return e("<div>").css({position:"absolute",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return e(t.target).closest(".ui-dialog").length?!0:!!e(t.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var t=!0;this._delay(function(){t=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(e){t||this._allowInteraction(e)||(e.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=e("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var e=this.document.data("ui-dialog-overlays")-1;e?this.document.data("ui-dialog-overlays",e):this.document.unbind("focusin").removeData("ui-dialog-overlays"),this.overlay.remove(),this.overlay=null}}}),e.widget("ui.progressbar",{version:"1.11.1",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=e("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()},value:function(e){return void 0===e?this.options.value:(this.options.value=this._constrainedValue(e),this._refreshValue(),void 0)},_constrainedValue:function(e){return void 0===e&&(e=this.options.value),this.indeterminate=e===!1,"number"!=typeof e&&(e=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,e))},_setOptions:function(e){var t=e.value;delete e.value,this._super(e),this.options.value=this._constrainedValue(t),this._refreshValue()},_setOption:function(e,t){"max"===e&&(t=Math.max(this.min,t)),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).toggleClass("ui-corner-right",t===this.options.max).width(i.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=e("<div class='ui-progressbar-overlay'></div>").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger("change")),t===this.options.max&&this._trigger("complete")}}),e.widget("ui.selectmenu",{version:"1.11.1",defaultElement:"<select>",options:{appendTo:null,disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:null,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this.options.disabled&&this.disable()},_drawButton:function(){var t=this,i=this.element.attr("tabindex");this.label=e("label[for='"+this.ids.element+"']").attr("for",this.ids.button),this._on(this.label,{click:function(e){this.button.focus(),e.preventDefault()}}),this.element.hide(),this.button=e("<span>",{"class":"ui-selectmenu-button ui-widget ui-state-default ui-corner-all",tabindex:i||this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true"}).insertAfter(this.element),e("<span>",{"class":"ui-icon "+this.options.icons.button}).prependTo(this.button),this.buttonText=e("<span>",{"class":"ui-selectmenu-text"}).appendTo(this.button),this._setText(this.buttonText,this.element.find("option:selected").text()),this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){t.menuItems||t._refreshMenu()}),this._hoverable(this.button),this._focusable(this.button)},_drawMenu:function(){var t=this;this.menu=e("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=e("<div>",{"class":"ui-selectmenu-menu ui-front"}).append(this.menu).appendTo(this._appendTo()),this.menuInstance=this.menu.menu({role:"listbox",select:function(e,i){e.preventDefault(),t._select(i.item.data("ui-selectmenu-item"),e)},focus:function(e,i){var s=i.item.data("ui-selectmenu-item");null!=t.focusIndex&&s.index!==t.focusIndex&&(t._trigger("focus",e,{item:s}),t.isOpen||t._select(s,e)),t.focusIndex=s.index,t.button.attr("aria-activedescendant",t.menuItems.eq(s.index).attr("id"))}}).menu("instance"),this.menu.addClass("ui-corner-bottom").removeClass("ui-corner-all"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this._setText(this.buttonText,this._getSelectedItem().text()),this.options.width||this._resizeButton()},_refreshMenu:function(){this.menu.empty();var e,t=this.element.find("option");t.length&&(this._parseOptions(t),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup"),e=this._getSelectedItem(),this.menuInstance.focus(null,e),this._setAria(e.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(e){this.options.disabled||(this.menuItems?(this.menu.find(".ui-state-focus").removeClass("ui-state-focus"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",e))},_position:function(){this.menuWrap.position(e.extend({of:this.button},this.options.position))},close:function(e){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this._off(this.document),this._trigger("close",e))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderMenu:function(t,i){var s=this,n="";e.each(i,function(i,a){a.optgroup!==n&&(e("<li>",{"class":"ui-selectmenu-optgroup ui-menu-divider"+(a.element.parent("optgroup").prop("disabled")?" ui-state-disabled":""),text:a.optgroup}).appendTo(t),n=a.optgroup),s._renderItemData(t,a)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-selectmenu-item",t)},_renderItem:function(t,i){var s=e("<li>");return i.disabled&&s.addClass("ui-state-disabled"),this._setText(s,i.label),s.appendTo(t)},_setText:function(e,t){t?e.text(t):e.html("&#160;")},_move:function(e,t){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex):(i=this.menuItems.eq(this.element[0].selectedIndex),n+=":not(.ui-state-disabled)"),s="first"===e||"last"===e?i["first"===e?"prevAll":"nextAll"](n).eq(-1):i[e+"All"](n).eq(0),s.length&&this.menuInstance.focus(t,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex)},_toggle:function(e){this[this.isOpen?"close":"open"](e)},_documentClick:{mousedown:function(t){this.isOpen&&(e(t.target).closest(".ui-selectmenu-menu, #"+this.ids.button).length||this.close(t))}},_buttonEvents:{mousedown:function(e){e.preventDefault()},click:"_toggle",keydown:function(t){var i=!0;switch(t.keyCode){case e.ui.keyCode.TAB:case e.ui.keyCode.ESCAPE:this.close(t),i=!1;break;case e.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(t);break;case e.ui.keyCode.UP:t.altKey?this._toggle(t):this._move("prev",t);break;case e.ui.keyCode.DOWN:t.altKey?this._toggle(t):this._move("next",t);break;case e.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(t):this._toggle(t);break;case e.ui.keyCode.LEFT:this._move("prev",t);break;case e.ui.keyCode.RIGHT:this._move("next",t);break;case e.ui.keyCode.HOME:case e.ui.keyCode.PAGE_UP:this._move("first",t);break;case e.ui.keyCode.END:case e.ui.keyCode.PAGE_DOWN:this._move("last",t);break;default:this.menu.trigger(t),i=!1}i&&t.preventDefault()}},_selectFocusedItem:function(e){var t=this.menuItems.eq(this.focusIndex);t.hasClass("ui-state-disabled")||this._select(t.data("ui-selectmenu-item"),e)},_select:function(e,t){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=e.index,this._setText(this.buttonText,e.label),this._setAria(e),this._trigger("select",t,{item:e}),e.index!==i&&this._trigger("change",t,{item:e}),this.close(t)},_setAria:function(e){var t=this.menuItems.eq(e.index).attr("id");this.button.attr({"aria-labelledby":t,"aria-activedescendant":t}),this.menu.attr("aria-activedescendant",t)},_setOption:function(e,t){"icons"===e&&this.button.find("span.ui-icon").removeClass(this.options.icons.button).addClass(t.button),this._super(e,t),"appendTo"===e&&this.menuWrap.appendTo(this._appendTo()),"disabled"===e&&(this.menuInstance.option("disabled",t),this.button.toggleClass("ui-state-disabled",t).attr("aria-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)),"width"===e&&this._resizeButton()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_toggleAttr:function(){this.button.toggleClass("ui-corner-top",this.isOpen).toggleClass("ui-corner-all",!this.isOpen).attr("aria-expanded",this.isOpen),this.menuWrap.toggleClass("ui-selectmenu-open",this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var e=this.options.width;e||(e=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(e)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){return{disabled:this.element.prop("disabled")}},_parseOptions:function(t){var i=[];t.each(function(t,s){var n=e(s),a=n.parent("optgroup");i.push({element:n,index:t,value:n.attr("value"),label:n.text(),optgroup:a.attr("label")||"",disabled:a.prop("disabled")||n.prop("disabled")})}),this.items=i},_destroy:function(){this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.label.attr("for",this.ids.element)}}),e.widget("ui.slider",e.ui.mouse,{version:"1.11.1",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),a="<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",o=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),t=n.length;i>t;t++)o.push(a);this.handles=n.add(e(o.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)})},_createRange:function(){var t=this.options,i="";t.range?(t.range===!0&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:e.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=e("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===t.range||"max"===t.range?" ui-slider-range-"+t.range:""))):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,a,o,r,h,l,u=this,d=this.options;return d.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:t.pageX,y:t.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var i=Math.abs(s-u.values(t));(n>i||n===i&&(t===u._lastChangedValue||u.values(t)===d.min))&&(n=i,a=e(this),o=t)}),r=this._start(t,o),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,a.addClass("ui-state-active").focus(),h=a.offset(),l=!e(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:t.pageX-h.left-a.width()/2,top:t.pageY-h.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},i=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,i),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,i,s,n,a;return"horizontal"===this.orientation?(t=this.elementSize.width,i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/t,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(e,t){var i={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("start",e,i)},_slide:function(e,t,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(t?0:1),2===this.options.values.length&&this.options.range===!0&&(0===t&&i>s||1===t&&s>i)&&(i=s),i!==this.values(t)&&(n=this.values(),n[t]=i,a=this._trigger("slide",e,{handle:this.handles[t],value:i,values:n}),s=this.values(t?0:1),a!==!1&&this.values(t,i))):i!==this.value()&&(a=this._trigger("slide",e,{handle:this.handles[t],value:i}),a!==!1&&this.value(i))},_stop:function(e,t){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("stop",e,i)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._lastChangedValue=t,this._trigger("change",e,i)}},value:function(e){return arguments.length?(this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(t,i){var s,n,a;if(arguments.length>1)return this.options.values[t]=this._trimAlignValue(i),this._refreshValue(),this._change(null,t),void 0;if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);this._refreshValue()},_setOption:function(t,i){var s,n=0;switch("range"===t&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),e.isArray(this.options.values)&&(n=this.options.values.length),"disabled"===t&&this.element.toggleClass("ui-state-disabled",!!i),this._super(t,i),t){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue(),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"min":case"max":this._animateOff=!0,this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e)},_values:function(e){var t,i,s;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(e){if(this._valueMin()>=e)return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,i=(e-this._valueMin())%t,s=e-i;return 2*Math.abs(i)>=t&&(s+=i>0?t:-t),parseFloat(s.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var t,i,s,n,a,o=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),u["horizontal"===h.orientation?"left":"bottom"]=i+"%",e(this).stop(1,1)[l?"animate":"css"](u,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-t+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-t+"%"},{queue:!1,duration:r.animate}))),t=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](u,r.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===o&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===o&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(t){var i,s,n,a,o=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,e(t.target).addClass("ui-state-active"),i=this._start(t,o),i===!1))return}switch(a=this.options.step,s=n=this.options.values&&this.options.values.length?this.values(o):this.value(),t.keyCode){case e.ui.keyCode.HOME:n=this._valueMin();break;case e.ui.keyCode.END:n=this._valueMax();break;case e.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+a);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-a)}this._slide(t,o,n)},keyup:function(t){var i=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,i),this._change(t,i),e(t.target).removeClass("ui-state-active"))}}}),e.widget("ui.spinner",{version:"1.11.1",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var t={},i=this.element;return e.each(["min","max","step"],function(e,s){var n=i.attr(s);void 0!==n&&n.length&&(t[s]=n)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",e),void 0)},mousewheel:function(e,t){if(t){if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()}},"mousedown .ui-spinner-button":function(t){function i(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(t)!==!1&&this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){return e(t.currentTarget).hasClass("ui-state-active")?this._start(t)===!1?!1:(this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var e=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=e.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(.5*e.height())&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()},_keydown:function(t){var i=this.options,s=e.ui.keyCode;switch(t.keyCode){case s.UP:return this._repeat(null,1,t),!0;case s.DOWN:return this._repeat(null,-1,t),!0;case s.PAGE_UP:return this._repeat(null,i.page,t),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,t),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>&#9650;</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>&#9660;</span>"+"</a>"},_start:function(e){return this.spinning||this._trigger("start",e)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(e,t,i){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,i)},e),this._spin(t*this.options.step,i)},_spin:function(e,t){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+e*this._increment(this.counter)),this.spinning&&this._trigger("spin",t,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(t){var i=this.options.incremental;
+return i?e.isFunction(i)?i(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_adjustValue:function(e){var t,i,s=this.options;return t=null!==s.min?s.min:0,i=e-t,i=Math.round(i/s.step)*s.step,e=t+i,e=parseFloat(e.toFixed(this._precision())),null!==s.max&&e>s.max?s.max:null!==s.min&&s.min>e?s.min:e},_stop:function(e){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",e))},_setOption:function(e,t){if("culture"===e||"numberFormat"===e){var i=this._parse(this.element.val());return this.options[e]=t,this.element.val(this._format(i)),void 0}("max"===e||"min"===e||"step"===e)&&"string"==typeof t&&(t=this._parse(t)),"icons"===e&&(this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(t.up),this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(t.down)),this._super(e,t),"disabled"===e&&(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable"))},_setOptions:h(function(e){this._super(e)}),_parse:function(e){return"string"==typeof e&&""!==e&&(e=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(e,10,this.options.culture):+e),""===e||isNaN(e)?null:e},_format:function(e){return""===e?"":window.Globalize&&this.options.numberFormat?Globalize.format(e,this.options.numberFormat,this.options.culture):e},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var e=this.value();return null===e?!1:e===this._adjustValue(e)},_value:function(e,t){var i;""!==e&&(i=this._parse(e),null!==i&&(t||(i=this._adjustValue(i)),e=this._format(i))),this.element.val(e),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:h(function(e){this._stepUp(e)}),_stepUp:function(e){this._start()&&(this._spin((e||1)*this.options.step),this._stop())},stepDown:h(function(e){this._stepDown(e)}),_stepDown:function(e){this._start()&&(this._spin((e||1)*-this.options.step),this._stop())},pageUp:h(function(e){this._stepUp((e||1)*this.options.page)}),pageDown:h(function(e){this._stepDown((e||1)*this.options.page)}),value:function(e){return arguments.length?(h(this._value).call(this,e),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),e.widget("ui.tabs",{version:"1.11.1",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var e=/#.*$/;return function(t){var i,s;t=t.cloneNode(!1),i=t.href.replace(e,""),s=location.href.replace(e,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return t.hash.length>1&&i===s}}(),_create:function(){var t=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible),this._processTabs(),i.active=this._initialActive(),e.isArray(i.disabled)&&(i.disabled=e.unique(i.disabled.concat(e.map(this.tabs.filter(".ui-state-disabled"),function(e){return t.tabs.index(e)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):e(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var t=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===t&&(s&&this.tabs.each(function(i,n){return e(n).attr("aria-controls")===s?(t=i,!1):void 0}),null===t&&(t=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===t||-1===t)&&(t=this.tabs.length?0:!1)),t!==!1&&(t=this.tabs.index(this.tabs.eq(t)),-1===t&&(t=i?!1:0)),!i&&t===!1&&this.anchors.length&&(t=0),t},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var i=e(this.document[0].activeElement).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(t)){switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:s++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:n=!1,s--;break;case e.ui.keyCode.END:s=this.anchors.length-1;break;case e.ui.keyCode.HOME:s=0;break;case e.ui.keyCode.SPACE:return t.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case e.ui.keyCode.ENTER:return t.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}t.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),t.ctrlKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(t){this._handlePageNav(t)||t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){return t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(t,i){function s(){return t>n&&(t=0),0>t&&(t=n),t}for(var n=this.tabs.length-1;-1!==e.inArray(s(),this.options.disabled);)t=i?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):"disabled"===e?(this._setupDisabled(t),void 0):(this._super(e,t),"collapsible"===e&&(this.element.toggleClass("ui-tabs-collapsible",t),t||this.options.active!==!1||this._activate(0)),"event"===e&&this._setupEvents(t),"heightStyle"===e&&this._setupHeightStyle(t),void 0)},_sanitizeSelector:function(e){return e?e.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,i=this.tablist.children(":has(a[href])");t.disabled=e.map(i.filter(".ui-state-disabled"),function(e){return i.index(e)}),this._processTabs(),t.active!==!1&&this.anchors.length?this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active):(t.active=!1,this.active=e()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var t=this;this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist").delegate("> li","mousedown"+this.eventNamespace,function(t){e(this).is(".ui-state-disabled")&&t.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){e(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=e(),this.anchors.each(function(i,s){var n,a,o,r=e(s).uniqueId().attr("id"),h=e(s).closest("li"),l=h.attr("aria-controls");t._isLocal(s)?(n=s.hash,o=n.substring(1),a=t.element.find(t._sanitizeSelector(n))):(o=h.attr("aria-controls")||e({}).uniqueId()[0].id,n="#"+o,a=t.element.find(n),a.length||(a=t._createPanel(o),a.insertAfter(t.panels[i-1]||t.tablist)),a.attr("aria-live","polite")),a.length&&(t.panels=t.panels.add(a)),l&&h.data("ui-tabs-aria-controls",l),h.attr({"aria-controls":o,"aria-labelledby":r}),a.attr("aria-labelledby",r)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel")},_getList:function(){return this.tablist||this.element.find("ol,ul").eq(0)},_createPanel:function(t){return e("<div>").attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var i,s=0;i=this.tabs[s];s++)t===!0||-1!==e.inArray(s,t)?e(i).addClass("ui-state-disabled").attr("aria-disabled","true"):e(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=t},_setupEvents:function(t){var i={};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(e){e.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,s=this.element.parent();"fill"===t?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var t=e(this),s=t.css("position");"absolute"!==s&&"fixed"!==s&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,i-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===t&&(i=0,this.panels.each(function(){i=Math.max(i,e(this).height("").height())}).height(i))},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n.closest("li"),o=a[0]===s[0],r=o&&i.collapsible,h=r?e():this._getPanelForTab(a),l=s.length?this._getPanelForTab(s):e(),u={oldTab:s,oldPanel:l,newTab:r?e():a,newPanel:h};t.preventDefault(),a.hasClass("ui-state-disabled")||a.hasClass("ui-tabs-loading")||this.running||o&&!i.collapsible||this._trigger("beforeActivate",t,u)===!1||(i.active=r?!1:this.tabs.index(a),this.active=o?e():a,this.xhr&&this.xhr.abort(),l.length||h.length||e.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(a),t),this._toggle(t,u))},_toggle:function(t,i){function s(){a.running=!1,a._trigger("activate",t,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),o.length&&a.options.show?a._show(o,a.options.show,s):(o.show(),s())}var a=this,o=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),o.length&&r.length?i.oldTab.attr("tabIndex",-1):o.length&&this.tabs.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),o.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(t){var i,s=this._findActive(t);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+e+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tablist.unbind(this.eventNamespace),this.tabs.add(this.panels).each(function(){e.data(this,"ui-tabs-destroy")?e(this).remove():e(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var t=e(this),i=t.data("ui-tabs-aria-controls");i?t.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):t.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(t){var i=this.options.disabled;i!==!1&&(void 0===t?i=!1:(t=this._getIndex(t),i=e.isArray(i)?e.map(i,function(e){return e!==t?e:null}):e.map(this.tabs,function(e,i){return i!==t?i:null})),this._setupDisabled(i))},disable:function(t){var i=this.options.disabled;if(i!==!0){if(void 0===t)i=!0;else{if(t=this._getIndex(t),-1!==e.inArray(t,i))return;i=e.isArray(i)?e.merge([t],i).sort():[t]}this._setupDisabled(i)}},load:function(t,i){t=this._getIndex(t);var s=this,n=this.tabs.eq(t),a=n.find(".ui-tabs-anchor"),o=this._getPanelForTab(n),r={tab:n,panel:o};this._isLocal(a[0])||(this.xhr=e.ajax(this._ajaxSettings(a,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(n.addClass("ui-tabs-loading"),o.attr("aria-busy","true"),this.xhr.success(function(e){setTimeout(function(){o.html(e),s._trigger("load",i,r)},1)}).complete(function(e,t){setTimeout(function(){"abort"===t&&s.panels.stop(!1,!0),n.removeClass("ui-tabs-loading"),o.removeAttr("aria-busy"),e===s.xhr&&delete s.xhr},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr("href"),beforeSend:function(t,a){return n._trigger("beforeLoad",i,e.extend({jqXHR:t,ajaxSettings:a},s))}}},_getPanelForTab:function(t){var i=e(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),e.widget("ui.tooltip",{version:"1.11.1",options:{content:function(){var t=e(this).attr("title")||"";return e("<a>").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_addDescribedBy:function(t,i){var s=(t.attr("aria-describedby")||"").split(/\s+/);s.push(i),t.data("ui-tooltip-id",i).attr("aria-describedby",e.trim(s.join(" ")))},_removeDescribedBy:function(t){var i=t.data("ui-tooltip-id"),s=(t.attr("aria-describedby")||"").split(/\s+/),n=e.inArray(i,s);-1!==n&&s.splice(n,1),t.removeData("ui-tooltip-id"),s=e.trim(s.join(" ")),s?t.attr("aria-describedby",s):t.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable(),this.liveRegion=e("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body)},_setOption:function(t,i){var s=this;return"disabled"===t?(this[i?"_disable":"_enable"](),this.options[t]=i,void 0):(this._super(t,i),"content"===t&&e.each(this.tooltips,function(e,t){s._updateContent(t)}),void 0)},_disable:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s[0],t.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).removeAttr("title")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var i=this,s=e(t?t.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),t&&"mouseover"===t.type&&s.parents().each(function(){var t,s=e(this);s.data("ui-tooltip-open")&&(t=e.Event("blur"),t.target=t.currentTarget=this,i.close(t,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._updateContent(s,t))},_updateContent:function(e,t){var i,s=this.options.content,n=this,a=t?t.type:null;return"string"==typeof s?this._open(t,e,s):(i=s.call(e[0],function(i){e.data("ui-tooltip-open")&&n._delay(function(){t&&(t.type=a),this._open(t,e,i)})}),i&&this._open(t,e,i),void 0)},_open:function(t,i,s){function n(e){l.of=e,a.is(":hidden")||a.position(l)}var a,o,r,h,l=e.extend({},this.options.position);if(s){if(a=this._find(i),a.length)return a.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(t&&"mouseover"===t.type?i.attr("title",""):i.removeAttr("title")),a=this._tooltip(i),this._addDescribedBy(i,a.attr("id")),a.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),s.clone?(h=s.clone(),h.removeAttr("id").find("[id]").removeAttr("id")):h=s,e("<div>").html(h).appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:n}),n(t)):a.position(e.extend({of:i},this.options.position)),this.hiding=!1,this.closing=!1,a.hide(),this._show(a,this.options.show),this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){a.is(":visible")&&(n(l.of),clearInterval(r))},e.fx.interval)),this._trigger("open",t,{tooltip:a}),o={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var s=e.Event(t);s.currentTarget=i[0],this.close(s,!0)}}},i[0]!==this.element[0]&&(o.remove=function(){this._removeTooltip(a)}),t&&"mouseover"!==t.type||(o.mouseleave="close"),t&&"focusin"!==t.type||(o.focusout="close"),this._on(!0,i,o)}},close:function(t){var i=this,s=e(t?t.currentTarget:this.element),n=this._find(s);this.closing||(clearInterval(this.delayedShow),s.data("ui-tooltip-title")&&!s.attr("title")&&s.attr("title",s.data("ui-tooltip-title")),this._removeDescribedBy(s),this.hiding=!0,n.stop(!0),this._hide(n,this.options.hide,function(){i._removeTooltip(e(this)),this.hiding=!1,this.closing=!1}),s.removeData("ui-tooltip-open"),this._off(s,"mouseleave focusout keyup"),s[0]!==this.element[0]&&this._off(s,"remove"),this._off(this.document,"mousemove"),t&&"mouseleave"===t.type&&e.each(this.parents,function(t,s){e(s.element).attr("title",s.title),delete i.parents[t]}),this.closing=!0,this._trigger("close",t,{tooltip:n}),this.hiding||(this.closing=!1))},_tooltip:function(t){var i=e("<div>").attr("role","tooltip").addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||"")),s=i.uniqueId().attr("id");return e("<div>").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[s]=t,i},_find:function(t){var i=t.data("ui-tooltip-id");return i?e("#"+i):e()},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s[0],t.close(n,!0),e("#"+i).remove(),s.data("ui-tooltip-title")&&(s.attr("title")||s.attr("title",s.data("ui-tooltip-title")),s.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}});var y="ui-effects-",b=e;e.effects={effect:{}},function(e,t){function i(e,t,i){var s=d[t.type]||{};return null==e?i||!t.def?null:t.def:(e=s.floor?~~e:parseFloat(e),isNaN(e)?t.def:s.mod?(e+s.mod)%s.mod:0>e?0:e>s.max?s.max:e)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(e,a){var o,r=a.re.exec(i),h=r&&a.parse(r),l=a.space||"rgba";return h?(o=s[l](h),s[u[l].cache]=o[u[l].cache],n=s._rgba=o._rgba,!1):t}),n.length?("0,0,0,0"===n.join()&&e.extend(n,a.transparent),s):a[i]}function n(e,t,i){return i=(i+1)%1,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+6*(t-e)*(2/3-i):e}var a,o="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[2.55*e[1],2.55*e[2],2.55*e[3],e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],l=e.Color=function(t,i,s,n){return new e.Color.fn.parse(t,i,s,n)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},d={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},c=l.support={},p=e("<p>")[0],f=e.each;p.style.cssText="background-color:rgba(1,1,1,.5)",c.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),l.fn=e.extend(l.prototype,{parse:function(n,o,r,h){if(n===t)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=e(n).css(o),o=t);var d=this,c=e.type(n),p=this._rgba=[];return o!==t&&(n=[n,o,r,h],c="array"),"string"===c?this.parse(s(n)||a._default):"array"===c?(f(u.rgba.props,function(e,t){p[t.idx]=i(n[t.idx],t)}),this):"object"===c?(n instanceof l?f(u,function(e,t){n[t.cache]&&(d[t.cache]=n[t.cache].slice())}):f(u,function(t,s){var a=s.cache;f(s.props,function(e,t){if(!d[a]&&s.to){if("alpha"===e||null==n[e])return;d[a]=s.to(d._rgba)}d[a][t.idx]=i(n[e],t,!0)}),d[a]&&0>e.inArray(null,d[a].slice(0,3))&&(d[a][3]=1,s.from&&(d._rgba=s.from(d[a])))}),this):t},is:function(e){var i=l(e),s=!0,n=this;return f(u,function(e,a){var o,r=i[a.cache];return r&&(o=n[a.cache]||a.to&&a.to(n._rgba)||[],f(a.props,function(e,i){return null!=r[i.idx]?s=r[i.idx]===o[i.idx]:t})),s}),s},_space:function(){var e=[],t=this;return f(u,function(i,s){t[s.cache]&&e.push(i)}),e.pop()},transition:function(e,t){var s=l(e),n=s._space(),a=u[n],o=0===this.alpha()?l("transparent"):this,r=o[a.cache]||a.to(o._rgba),h=r.slice();return s=s[a.cache],f(a.props,function(e,n){var a=n.idx,o=r[a],l=s[a],u=d[n.type]||{};null!==l&&(null===o?h[a]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[a]=i((l-o)*t+o,n)))}),this[n](h)},blend:function(t){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(t)._rgba;return l(e.map(i,function(e,t){return(1-s)*n[t]+s*e}))},toRgbaString:function(){var t="rgba(",i=e.map(this._rgba,function(e,t){return null==e?t>2?1:0:e});return 1===i[3]&&(i.pop(),t="rgb("),t+i.join()+")"},toHslaString:function(){var t="hsla(",i=e.map(this.hsla(),function(e,t){return null==e&&(e=t>2?1:0),t&&3>t&&(e=Math.round(100*e)+"%"),e});return 1===i[3]&&(i.pop(),t="hsl("),t+i.join()+")"},toHexString:function(t){var i=this._rgba.slice(),s=i.pop();return t&&i.push(~~(255*s)),"#"+e.map(i,function(e){return e=(e||0).toString(16),1===e.length?"0"+e:e}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t,i,s=e[0]/255,n=e[1]/255,a=e[2]/255,o=e[3],r=Math.max(s,n,a),h=Math.min(s,n,a),l=r-h,u=r+h,d=.5*u;return t=h===r?0:s===r?60*(n-a)/l+360:n===r?60*(a-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=d?l/u:l/(2-u),[Math.round(t)%360,i,d,null==o?1:o]},u.hsla.from=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t=e[0]/360,i=e[1],s=e[2],a=e[3],o=.5>=s?s*(1+i):s+i-s*i,r=2*s-o;return[Math.round(255*n(r,o,t+1/3)),Math.round(255*n(r,o,t)),Math.round(255*n(r,o,t-1/3)),a]},f(u,function(s,n){var a=n.props,o=n.cache,h=n.to,u=n.from;l.fn[s]=function(s){if(h&&!this[o]&&(this[o]=h(this._rgba)),s===t)return this[o].slice();var n,r=e.type(s),d="array"===r||"object"===r?s:arguments,c=this[o].slice();return f(a,function(e,t){var s=d["object"===r?e:t.idx];null==s&&(s=c[t.idx]),c[t.idx]=i(s,t)}),u?(n=l(u(c)),n[o]=c,n):l(c)},f(a,function(t,i){l.fn[t]||(l.fn[t]=function(n){var a,o=e.type(n),h="alpha"===t?this._hsla?"hsla":"rgba":s,l=this[h](),u=l[i.idx];return"undefined"===o?u:("function"===o&&(n=n.call(this,u),o=e.type(n)),null==n&&i.empty?this:("string"===o&&(a=r.exec(n),a&&(n=u+parseFloat(a[2])*("+"===a[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(t){var i=t.split(" ");f(i,function(t,i){e.cssHooks[i]={set:function(t,n){var a,o,r="";if("transparent"!==n&&("string"!==e.type(n)||(a=s(n)))){if(n=l(a||n),!c.rgba&&1!==n._rgba[3]){for(o="backgroundColor"===i?t.parentNode:t;(""===r||"transparent"===r)&&o&&o.style;)try{r=e.css(o,"backgroundColor"),o=o.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{t.style[i]=n}catch(h){}}},e.fx.step[i]=function(t){t.colorInit||(t.start=l(t.elem,i),t.end=l(t.end),t.colorInit=!0),e.cssHooks[i].set(t.elem,t.start.transition(t.end,t.pos))}})},l.hook(o),e.cssHooks.borderColor={expand:function(e){var t={};return f(["Top","Right","Bottom","Left"],function(i,s){t["border"+s+"Color"]=e}),t}},a=e.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(b),function(){function t(t){var i,s,n=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,a={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(a[e.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(a[i]=n[i]);return a}function i(t,i){var s,a,o={};for(s in i)a=i[s],t[s]!==a&&(n[s]||(e.fx.step[s]||!isNaN(parseFloat(a)))&&(o[s]=a));return o}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,i){e.fx.step[i]=function(e){("none"!==e.end&&!e.setAttr||1===e.pos&&!e.setAttr)&&(b.style(e.elem,i,e.end),e.setAttr=!0)}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(n,a,o,r){var h=e.speed(a,o,r);return this.queue(function(){var a,o=e(this),r=o.attr("class")||"",l=h.children?o.find("*").addBack():o;l=l.map(function(){var i=e(this);return{el:i,start:t(this)}}),a=function(){e.each(s,function(e,t){n[t]&&o[t+"Class"](n[t])})},a(),l=l.map(function(){return this.end=t(this.el[0]),this.diff=i(this.start,this.end),this}),o.attr("class",r),l=l.map(function(){var t=this,i=e.Deferred(),s=e.extend({},h,{queue:!1,complete:function(){i.resolve(t)}});return this.el.animate(this.diff,s),i.promise()}),e.when.apply(e,l.get()).done(function(){a(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),h.complete.call(o[0])})})},e.fn.extend({addClass:function(t){return function(i,s,n,a){return s?e.effects.animateClass.call(this,{add:i},s,n,a):t.apply(this,arguments)}}(e.fn.addClass),removeClass:function(t){return function(i,s,n,a){return arguments.length>1?e.effects.animateClass.call(this,{remove:i},s,n,a):t.apply(this,arguments)}}(e.fn.removeClass),toggleClass:function(t){return function(i,s,n,a,o){return"boolean"==typeof s||void 0===s?n?e.effects.animateClass.call(this,s?{add:i}:{remove:i},n,a,o):t.apply(this,arguments):e.effects.animateClass.call(this,{toggle:i},s,n,a)}}(e.fn.toggleClass),switchClass:function(t,i,s,n,a){return e.effects.animateClass.call(this,{add:i,remove:t},s,n,a)}})}(),function(){function t(t,i,s,n){return e.isPlainObject(t)&&(i=t,t=t.effect),t={effect:t},null==i&&(i={}),e.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||e.fx.speeds[i])&&(n=s,s=i,i={}),e.isFunction(s)&&(n=s,s=null),i&&e.extend(t,i),s=s||i.duration,t.duration=e.fx.off?0:"number"==typeof s?s:s in e.fx.speeds?e.fx.speeds[s]:e.fx.speeds._default,t.complete=n||i.complete,t}function i(t){return!t||"number"==typeof t||e.fx.speeds[t]?!0:"string"!=typeof t||e.effects.effect[t]?e.isFunction(t)?!0:"object"!=typeof t||t.effect?!1:!0:!0}e.extend(e.effects,{version:"1.11.1",save:function(e,t){for(var i=0;t.length>i;i++)null!==t[i]&&e.data(y+t[i],e[0].style[t[i]])},restore:function(e,t){var i,s;for(s=0;t.length>s;s++)null!==t[s]&&(i=e.data(y+t[s]),void 0===i&&(i=""),e.css(t[s],i))},setMode:function(e,t){return"toggle"===t&&(t=e.is(":hidden")?"show":"hide"),t},getBaseline:function(e,t){var i,s;switch(e[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=e[0]/t.height}switch(e[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=e[1]/t.width}return{x:s,y:i}},createWrapper:function(t){if(t.parent().is(".ui-effects-wrapper"))return t.parent();var i={width:t.outerWidth(!0),height:t.outerHeight(!0),"float":t.css("float")},s=e("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:t.width(),height:t.height()},a=document.activeElement;try{a.id}catch(o){a=document.body}return t.wrap(s),(t[0]===a||e.contains(t[0],a))&&e(a).focus(),s=t.parent(),"static"===t.css("position")?(s.css({position:"relative"}),t.css({position:"relative"})):(e.extend(i,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,s){i[s]=t.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(n),s.css(i).show()},removeWrapper:function(t){var i=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===i||e.contains(t[0],i))&&e(i).focus()),t},setTransition:function(t,i,s,n){return n=n||{},e.each(i,function(e,i){var a=t.cssUnit(i);a[0]>0&&(n[i]=a[0]*s+a[1])}),n}}),e.fn.extend({effect:function(){function i(t){function i(){e.isFunction(a)&&a.call(n[0]),e.isFunction(t)&&t()}var n=e(this),a=s.complete,r=s.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),i()):o.call(n[0],s,i)}var s=t.apply(this,arguments),n=s.mode,a=s.queue,o=e.effects.effect[s.effect];return e.fx.off||!o?n?this[n](s.duration,s.complete):this.each(function(){s.complete&&s.complete.call(this)}):a===!1?this.each(i):this.queue(a||"fx",i)},show:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(e.fn.show),hide:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(e.fn.hide),toggle:function(e){return function(s){if(i(s)||"boolean"==typeof s)return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(e.fn.toggle),cssUnit:function(t){var i=this.css(t),s=[];return e.each(["em","px","%","pt"],function(e,t){i.indexOf(t)>0&&(s=[parseFloat(i),t])}),s}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,i){t[i]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)
+},Elastic:function(e){return 0===e||1===e?e:-Math.pow(2,8*(e-1))*Math.sin((80*(e-1)-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){for(var t,i=4;((t=Math.pow(2,--i))-1)/11>e;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*t-2)/22-e,2)}}),e.each(t,function(t,i){e.easing["easeIn"+t]=i,e.easing["easeOut"+t]=function(e){return 1-i(1-e)},e.easing["easeInOut"+t]=function(e){return.5>e?i(2*e)/2:1-i(-2*e+2)/2}})}(),e.effects,e.effects.effect.blind=function(t,i){var s,n,a,o=e(this),r=/up|down|vertical/,h=/up|left|vertical|horizontal/,l=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(o,t.mode||"hide"),d=t.direction||"up",c=r.test(d),p=c?"height":"width",f=c?"top":"left",m=h.test(d),g={},v="show"===u;o.parent().is(".ui-effects-wrapper")?e.effects.save(o.parent(),l):e.effects.save(o,l),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n=s[p](),a=parseFloat(s.css(f))||0,g[p]=v?n:0,m||(o.css(c?"bottom":"right",0).css(c?"top":"left","auto").css({position:"absolute"}),g[f]=v?a:n+a),v&&(s.css(p,0),m||s.css(f,a+n)),s.animate(g,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){"hide"===u&&o.hide(),e.effects.restore(o,l),e.effects.removeWrapper(o),i()}})},e.effects.effect.bounce=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"effect"),l="hide"===h,u="show"===h,d=t.direction||"up",c=t.distance,p=t.times||5,f=2*p+(u||l?1:0),m=t.duration/f,g=t.easing,v="up"===d||"down"===d?"top":"left",y="up"===d||"left"===d,b=o.queue(),_=b.length;for((u||l)&&r.push("opacity"),e.effects.save(o,r),o.show(),e.effects.createWrapper(o),c||(c=o["top"===v?"outerHeight":"outerWidth"]()/3),u&&(a={opacity:1},a[v]=0,o.css("opacity",0).css(v,y?2*-c:2*c).animate(a,m,g)),l&&(c/=Math.pow(2,p-1)),a={},a[v]=0,s=0;p>s;s++)n={},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g).animate(a,m,g),c=l?2*c:c/2;l&&(n={opacity:0},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g)),o.queue(function(){l&&o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}),_>1&&b.splice.apply(b,[1,0].concat(b.splice(_,f+1))),o.dequeue()},e.effects.effect.clip=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"hide"),l="show"===h,u=t.direction||"vertical",d="vertical"===u,c=d?"height":"width",p=d?"top":"left",f={};e.effects.save(o,r),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n="IMG"===o[0].tagName?s:o,a=n[c](),l&&(n.css(c,0),n.css(p,a/2)),f[c]=l?a:0,f[p]=l?0:a/2,n.animate(f,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){l||o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}})},e.effects.effect.drop=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","opacity","height","width"],o=e.effects.setMode(n,t.mode||"hide"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h?"pos":"neg",d={opacity:r?1:0};e.effects.save(n,a),n.show(),e.effects.createWrapper(n),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,r&&n.css("opacity",0).css(l,"pos"===u?-s:s),d[l]=(r?"pos"===u?"+=":"-=":"pos"===u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.explode=function(t,i){function s(){b.push(this),b.length===d*c&&n()}function n(){p.css({visibility:"visible"}),e(b).remove(),m||p.hide(),i()}var a,o,r,h,l,u,d=t.pieces?Math.round(Math.sqrt(t.pieces)):3,c=d,p=e(this),f=e.effects.setMode(p,t.mode||"hide"),m="show"===f,g=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/c),y=Math.ceil(p.outerHeight()/d),b=[];for(a=0;d>a;a++)for(h=g.top+a*y,u=a-(d-1)/2,o=0;c>o;o++)r=g.left+o*v,l=o-(c-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-o*v,top:-a*y}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:y,left:r+(m?l*v:0),top:h+(m?u*y:0),opacity:m?0:1}).animate({left:r+(m?0:l*v),top:h+(m?0:u*y),opacity:m?1:0},t.duration||500,t.easing,s)},e.effects.effect.fade=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"toggle");s.animate({opacity:n},{queue:!1,duration:t.duration,easing:t.easing,complete:i})},e.effects.effect.fold=function(t,i){var s,n,a=e(this),o=["position","top","bottom","left","right","height","width"],r=e.effects.setMode(a,t.mode||"hide"),h="show"===r,l="hide"===r,u=t.size||15,d=/([0-9]+)%/.exec(u),c=!!t.horizFirst,p=h!==c,f=p?["width","height"]:["height","width"],m=t.duration/2,g={},v={};e.effects.save(a,o),a.show(),s=e.effects.createWrapper(a).css({overflow:"hidden"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],d&&(u=parseInt(d[1],10)/100*n[l?0:1]),h&&s.css(c?{height:0,width:u}:{height:u,width:0}),g[f[0]]=h?n[0]:u,v[f[1]]=h?n[1]:0,s.animate(g,m,t.easing).animate(v,m,t.easing,function(){l&&a.hide(),e.effects.restore(a,o),e.effects.removeWrapper(a),i()})},e.effects.effect.highlight=function(t,i){var s=e(this),n=["backgroundImage","backgroundColor","opacity"],a=e.effects.setMode(s,t.mode||"show"),o={backgroundColor:s.css("backgroundColor")};"hide"===a&&(o.opacity=0),e.effects.save(s,n),s.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===a&&s.hide(),e.effects.restore(s,n),i()}})},e.effects.effect.size=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],u=["fontSize"],d=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],c=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=e.effects.setMode(o,t.mode||"effect"),f=t.restore||"effect"!==p,m=t.scale||"both",g=t.origin||["middle","center"],v=o.css("position"),y=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&o.show(),s={height:o.height(),width:o.width(),outerHeight:o.outerHeight(),outerWidth:o.outerWidth()},"toggle"===t.mode&&"show"===p?(o.from=t.to||b,o.to=t.from||s):(o.from=t.from||("show"===p?b:s),o.to=t.to||("hide"===p?b:s)),a={from:{y:o.from.height/s.height,x:o.from.width/s.width},to:{y:o.to.height/s.height,x:o.to.width/s.width}},("box"===m||"both"===m)&&(a.from.y!==a.to.y&&(y=y.concat(d),o.from=e.effects.setTransition(o,d,a.from.y,o.from),o.to=e.effects.setTransition(o,d,a.to.y,o.to)),a.from.x!==a.to.x&&(y=y.concat(c),o.from=e.effects.setTransition(o,c,a.from.x,o.from),o.to=e.effects.setTransition(o,c,a.to.x,o.to))),("content"===m||"both"===m)&&a.from.y!==a.to.y&&(y=y.concat(u).concat(l),o.from=e.effects.setTransition(o,u,a.from.y,o.from),o.to=e.effects.setTransition(o,u,a.to.y,o.to)),e.effects.save(o,y),o.show(),e.effects.createWrapper(o),o.css("overflow","hidden").css(o.from),g&&(n=e.effects.getBaseline(g,s),o.from.top=(s.outerHeight-o.outerHeight())*n.y,o.from.left=(s.outerWidth-o.outerWidth())*n.x,o.to.top=(s.outerHeight-o.to.outerHeight)*n.y,o.to.left=(s.outerWidth-o.to.outerWidth)*n.x),o.css(o.from),("content"===m||"both"===m)&&(d=d.concat(["marginTop","marginBottom"]).concat(u),c=c.concat(["marginLeft","marginRight"]),l=r.concat(d).concat(c),o.find("*[width]").each(function(){var i=e(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()};f&&e.effects.save(i,l),i.from={height:s.height*a.from.y,width:s.width*a.from.x,outerHeight:s.outerHeight*a.from.y,outerWidth:s.outerWidth*a.from.x},i.to={height:s.height*a.to.y,width:s.width*a.to.x,outerHeight:s.height*a.to.y,outerWidth:s.width*a.to.x},a.from.y!==a.to.y&&(i.from=e.effects.setTransition(i,d,a.from.y,i.from),i.to=e.effects.setTransition(i,d,a.to.y,i.to)),a.from.x!==a.to.x&&(i.from=e.effects.setTransition(i,c,a.from.x,i.from),i.to=e.effects.setTransition(i,c,a.to.x,i.to)),i.css(i.from),i.animate(i.to,t.duration,t.easing,function(){f&&e.effects.restore(i,l)})})),o.animate(o.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){0===o.to.opacity&&o.css("opacity",o.from.opacity),"hide"===p&&o.hide(),e.effects.restore(o,y),f||("static"===v?o.css({position:"relative",top:o.to.top,left:o.to.left}):e.each(["top","left"],function(e,t){o.css(t,function(t,i){var s=parseInt(i,10),n=e?o.to.left:o.to.top;return"auto"===i?n+"px":s+n+"px"})})),e.effects.removeWrapper(o),i()}})},e.effects.effect.scale=function(t,i){var s=e(this),n=e.extend(!0,{},t),a=e.effects.setMode(s,t.mode||"effect"),o=parseInt(t.percent,10)||(0===parseInt(t.percent,10)?0:"hide"===a?0:100),r=t.direction||"both",h=t.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},u={y:"horizontal"!==r?o/100:1,x:"vertical"!==r?o/100:1};n.effect="size",n.queue=!1,n.complete=i,"effect"!==a&&(n.origin=h||["middle","center"],n.restore=!0),n.from=t.from||("show"===a?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*u.y,width:l.width*u.x,outerHeight:l.outerHeight*u.y,outerWidth:l.outerWidth*u.x},n.fade&&("show"===a&&(n.from.opacity=0,n.to.opacity=1),"hide"===a&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},e.effects.effect.puff=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"hide"),a="hide"===n,o=parseInt(t.percent,10)||150,r=o/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:n,complete:i,percent:a?o:100,from:a?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(t)},e.effects.effect.pulsate=function(t,i){var s,n=e(this),a=e.effects.setMode(n,t.mode||"show"),o="show"===a,r="hide"===a,h=o||"hide"===a,l=2*(t.times||5)+(h?1:0),u=t.duration/l,d=0,c=n.queue(),p=c.length;for((o||!n.is(":visible"))&&(n.css("opacity",0).show(),d=1),s=1;l>s;s++)n.animate({opacity:d},u,t.easing),d=1-d;n.animate({opacity:d},u,t.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&c.splice.apply(c,[1,0].concat(c.splice(p,l+1))),n.dequeue()},e.effects.effect.shake=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","height","width"],o=e.effects.setMode(n,t.mode||"effect"),r=t.direction||"left",h=t.distance||20,l=t.times||3,u=2*l+1,d=Math.round(t.duration/u),c="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},m={},g={},v=n.queue(),y=v.length;for(e.effects.save(n,a),n.show(),e.effects.createWrapper(n),f[c]=(p?"-=":"+=")+h,m[c]=(p?"+=":"-=")+2*h,g[c]=(p?"-=":"+=")+2*h,n.animate(f,d,t.easing),s=1;l>s;s++)n.animate(m,d,t.easing).animate(g,d,t.easing);n.animate(m,d,t.easing).animate(f,d/2,t.easing).queue(function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}),y>1&&v.splice.apply(v,[1,0].concat(v.splice(y,u+1))),n.dequeue()},e.effects.effect.slide=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","width","height"],o=e.effects.setMode(n,t.mode||"show"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h,d={};e.effects.save(n,a),n.show(),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(n).css({overflow:"hidden"}),r&&n.css(l,u?isNaN(s)?"-"+s:-s:s),d[l]=(r?u?"+=":"-=":u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.transfer=function(t,i){var s=e(this),n=e(t.to),a="fixed"===n.css("position"),o=e("body"),r=a?o.scrollTop():0,h=a?o.scrollLeft():0,l=n.offset(),u={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},d=s.offset(),c=e("<div class='ui-effects-transfer'></div>").appendTo(document.body).addClass(t.className).css({top:d.top-r,left:d.left-h,height:s.innerHeight(),width:s.innerWidth(),position:a?"fixed":"absolute"}).animate(u,t.duration,t.easing,function(){c.remove(),i()})}}); \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery/jquery.min.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery/jquery.min.js
new file mode 100644
index 0000000..9f7b3d3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery/jquery.min.js
@@ -0,0 +1,9190 @@
+/*!
+ * jQuery JavaScript Library v2.1.1
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-05-01T17:11Z
+ */
+
+(function( global, factory ) {
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+ // For CommonJS and CommonJS-like environments where a proper window is present,
+ // execute the factory and get jQuery
+ // For environments that do not inherently posses a window with a document
+ // (such as Node.js), expose a jQuery-making factory as module.exports
+ // This accentuates the need for the creation of a real window
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//
+
+var arr = [];
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
+
+
+
+var
+ // Use the correct document accordingly with window argument (sandbox)
+ document = window.document,
+
+ version = "2.1.1",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android<4.1
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ };
+
+jQuery.fn = jQuery.prototype = {
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // Start with an empty selector
+ selector: "",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num != null ?
+
+ // Return just the one element from the set
+ ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+
+ // Return all the elements in a clean array
+ slice.call( this );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+ target = {};
+ }
+
+ // extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+ // Only deal with non-null/undefined values
+ if ( (options = arguments[ i ]) != null ) {
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend({
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ // See test/unit/core.js for details concerning isFunction.
+ // Since version 1.3, DOM methods and functions like alert
+ // aren't supported. They return false on IE (#2968).
+ isFunction: function( obj ) {
+ return jQuery.type(obj) === "function";
+ },
+
+ isArray: Array.isArray,
+
+ isWindow: function( obj ) {
+ return obj != null && obj === obj.window;
+ },
+
+ isNumeric: function( obj ) {
+ // parseFloat NaNs numeric-cast false positives (null|true|false|"")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0;
+ },
+
+ isPlainObject: function( obj ) {
+ // Not plain objects:
+ // - Any object or value whose internal [[Class]] property is not "[object Object]"
+ // - DOM nodes
+ // - window
+ if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.constructor &&
+ !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
+ return false;
+ }
+
+ // If the function hasn't returned already, we're confident that
+ // |obj| is a plain object, created by {} or constructed with new Object
+ return true;
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+ // Support: Android < 4.0, iOS < 6 (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call(obj) ] || "object" :
+ typeof obj;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function( code ) {
+ var script,
+ indirect = eval;
+
+ code = jQuery.trim( code );
+
+ if ( code ) {
+ // If the code includes a valid, prologue position
+ // strict mode pragma, execute code by injecting a
+ // script tag into the document.
+ if ( code.indexOf("use strict") === 1 ) {
+ script = document.createElement("script");
+ script.text = code;
+ document.head.appendChild( script ).parentNode.removeChild( script );
+ } else {
+ // Otherwise, avoid the DOM node creation, insertion
+ // and removal by using an indirect global eval
+ indirect( code );
+ }
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ // args is for internal usage only
+ each: function( obj, callback, args ) {
+ var value,
+ i = 0,
+ length = obj.length,
+ isArray = isArraylike( obj );
+
+ if ( args ) {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android<4.1
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArraylike( Object(arr) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var value,
+ i = 0,
+ length = elems.length,
+ isArray = isArraylike( elems ),
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ now: Date.now,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+ var length = obj.length,
+ type = jQuery.type( obj );
+
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.nodeType === 1 && length ) {
+ return true;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v1.10.19
+ * http://sizzlejs.com/
+ *
+ * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-04-18
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + -(new Date()),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // General-purpose constants
+ strundefined = typeof undefined,
+ MAX_NEGATIVE = 1 << 31,
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf if we can't use a native one
+ indexOf = arr.indexOf || function( elem ) {
+ var i = 0,
+ len = this.length;
+ for ( ; i < len; i++ ) {
+ if ( this[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+ // http://www.w3.org/TR/css3-syntax/#characters
+ characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+ // Loosely modeled on CSS identifier characters
+ // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+ // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = characterEncoding.replace( "w", "w#" ),
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + characterEncoding + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+ "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+ "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+ rescape = /'|\\/g,
+
+ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ };
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var match, elem, m, nodeType,
+ // QSA vars
+ i, groups, old, nid, newContext, newSelector;
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+
+ context = context || document;
+ results = results || [];
+
+ if ( !selector || typeof selector !== "string" ) {
+ return results;
+ }
+
+ if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+ return [];
+ }
+
+ if ( documentIsHTML && !seed ) {
+
+ // Shortcuts
+ if ( (match = rquickExpr.exec( selector )) ) {
+ // Speed-up: Sizzle("#ID")
+ if ( (m = match[1]) ) {
+ if ( nodeType === 9 ) {
+ elem = context.getElementById( m );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document (jQuery #6963)
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE, Opera, and Webkit return items
+ // by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+ } else {
+ // Context is not a document
+ if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+ contains( context, elem ) && elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Speed-up: Sizzle("TAG")
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Speed-up: Sizzle(".CLASS")
+ } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // QSA path
+ if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+ nid = old = expando;
+ newContext = context;
+ newSelector = nodeType === 9 && selector;
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+ groups = tokenize( selector );
+
+ if ( (old = context.getAttribute("id")) ) {
+ nid = old.replace( rescape, "\\$&" );
+ } else {
+ context.setAttribute( "id", nid );
+ }
+ nid = "[id='" + nid + "'] ";
+
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = nid + toSelector( groups[i] );
+ }
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
+ newSelector = groups.join(",");
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch(qsaError) {
+ } finally {
+ if ( !old ) {
+ context.removeAttribute("id");
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+ var div = document.createElement("div");
+
+ try {
+ return !!fn( div );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( div.parentNode ) {
+ div.parentNode.removeChild( div );
+ }
+ // release memory in IE
+ div = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = attrs.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ ( ~b.sourceIndex || MAX_NEGATIVE ) -
+ ( ~a.sourceIndex || MAX_NEGATIVE );
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== strundefined && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare,
+ doc = node ? node.ownerDocument || node : preferredDoc,
+ parent = doc.defaultView;
+
+ // If no document and documentElement is available, return
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Set our document
+ document = doc;
+ docElem = doc.documentElement;
+
+ // Support tests
+ documentIsHTML = !isXML( doc );
+
+ // Support: IE>8
+ // If iframe document is assigned to "document" variable and if iframe has been reloaded,
+ // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+ // IE6-8 do not support the defaultView property so parent will be undefined
+ if ( parent && parent !== parent.top ) {
+ // IE11 does not have attachEvent, so all must suffer
+ if ( parent.addEventListener ) {
+ parent.addEventListener( "unload", function() {
+ setDocument();
+ }, false );
+ } else if ( parent.attachEvent ) {
+ parent.attachEvent( "onunload", function() {
+ setDocument();
+ });
+ }
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+ support.attributes = assert(function( div ) {
+ div.className = "i";
+ return !div.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( div ) {
+ div.appendChild( doc.createComment("") );
+ return !div.getElementsByTagName("*").length;
+ });
+
+ // Check if getElementsByClassName can be trusted
+ support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {
+ div.innerHTML = "<div class='a'></div><div class='a i'></div>";
+
+ // Support: Safari<4
+ // Catch class over-caching
+ div.firstChild.className = "i";
+ // Support: Opera<10
+ // Catch gEBCN failure to find non-leading classes
+ return div.getElementsByClassName("i").length === 2;
+ });
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( div ) {
+ docElem.appendChild( div ).id = expando;
+ return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+ });
+
+ // ID find and filter
+ if ( support.getById ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+ var m = context.getElementById( id );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [ m ] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ } else {
+ // Support: IE6/7
+ // getElementById is not reliable as a find shortcut
+ delete Expr.find["ID"];
+
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== strundefined ) {
+ return context.getElementsByTagName( tag );
+ }
+ } :
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See http://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( div ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // http://bugs.jquery.com/ticket/12359
+ div.innerHTML = "<select msallowclip=''><option selected=''></option></select>";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( div.querySelectorAll("[msallowclip^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !div.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+ });
+
+ assert(function( div ) {
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = doc.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ div.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( div.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":enabled").length ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( div ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( div, "div" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( div, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully does not implement inclusive descendent
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === doc ? -1 :
+ b === doc ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return doc;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch(e) {}
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, outerCache, node, diff, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+ // Seek `elem` from a previously-cached index
+ outerCache = parent[ expando ] || (parent[ expando ] = {});
+ cache = outerCache[ type ] || [];
+ nodeIndex = cache[0] === dirruns && cache[1];
+ diff = cache[0] === dirruns && cache[2];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ // Use previously-cached element index if available
+ } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+ diff = cache[1];
+
+ // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ } else {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf.call( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": function( elem ) {
+ return elem.disabled === false;
+ },
+
+ "disabled": function( elem ) {
+ return elem.disabled === true;
+ },
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ checkNonElements = base && dir === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+ if ( (oldCache = outerCache[ dir ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ outerCache[ dir ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf.call( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context !== document && context;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context, xml ) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // Apply set filters to unmatched elements
+ matchedCount += i;
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is no seed and only one group
+ if ( match.length === 1 ) {
+
+ // Take a shortcut and set the context if the root selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome<14
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+ // Should return 1, but returns 4 (following)
+ return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+ div.innerHTML = "<a href='#'></a>";
+ return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+ div.innerHTML = "<input/>";
+ div.firstChild.setAttribute( "value", "" );
+ return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+ return div.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ /* jshint -W018 */
+ return !!qualifier.call( elem, i, elem ) !== not;
+ });
+
+ }
+
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ });
+
+ }
+
+ if ( typeof qualifier === "string" ) {
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ qualifier = jQuery.filter( qualifier, elements );
+ }
+
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
+ });
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 && elem.nodeType === 1 ?
+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ }));
+};
+
+jQuery.fn.extend({
+ find: function( selector ) {
+ var i,
+ len = this.length,
+ ret = [],
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter(function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ }) );
+ }
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+ ret.selector = this.selector ? this.selector + " " + selector : selector;
+ return ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], false) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], true) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+});
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ init = jQuery.fn.init = function( selector, context ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ context = context instanceof jQuery ? context[0] : context;
+
+ // scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[1],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[2] );
+
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if ( elem && elem.parentNode ) {
+ // Inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || rootjQuery ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return typeof rootjQuery.ready !== "undefined" ?
+ rootjQuery.ready( selector ) :
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+ // methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.extend({
+ dir: function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+ },
+
+ sibling: function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+ }
+});
+
+jQuery.fn.extend({
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter(function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[i] ) ) {
+ return true;
+ }
+ }
+ });
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( ; i < l; i++ ) {
+ for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && (pos ?
+ pos.index(cur) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector(cur, selectors)) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
+ },
+
+ // Determine the position of an element within
+ // the matched set of elements
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.unique(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter(selector)
+ );
+ }
+});
+
+function sibling( cur, dir ) {
+ while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each({
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return jQuery.dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return jQuery.dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return jQuery.dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return jQuery.sibling( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.unique( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+});
+var rnotwhite = (/\S+/g);
+
+
+
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+ var object = optionsCache[ options ] = {};
+ jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ });
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ ( optionsCache[ options ] || createOptions( options ) ) :
+ jQuery.extend( {}, options );
+
+ var // Last fire value (for non-forgettable lists)
+ memory,
+ // Flag to know if list was already fired
+ fired,
+ // Flag to know if list is currently firing
+ firing,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
+ // End of the loop when firing
+ firingLength,
+ // Index of currently firing callback (modified by remove if needed)
+ firingIndex,
+ // Actual callback list
+ list = [],
+ // Stack of fire calls for repeatable lists
+ stack = !options.once && [],
+ // Fire callbacks
+ fire = function( data ) {
+ memory = options.memory && data;
+ fired = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ firing = true;
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+ if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+ memory = false; // To prevent further calls using add
+ break;
+ }
+ }
+ firing = false;
+ if ( list ) {
+ if ( stack ) {
+ if ( stack.length ) {
+ fire( stack.shift() );
+ }
+ } else if ( memory ) {
+ list = [];
+ } else {
+ self.disable();
+ }
+ }
+ },
+ // Actual Callbacks object
+ self = {
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+ // First, we save the current length
+ var start = list.length;
+ (function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ var type = jQuery.type( arg );
+ if ( type === "function" ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && type !== "string" ) {
+ // Inspect recursively
+ add( arg );
+ }
+ });
+ })( arguments );
+ // Do we need to add the callbacks to the
+ // current firing batch?
+ if ( firing ) {
+ firingLength = list.length;
+ // With memory, if we're not firing then
+ // we should call right away
+ } else if ( memory ) {
+ firingStart = start;
+ fire( memory );
+ }
+ }
+ return this;
+ },
+ // Remove a callback from the list
+ remove: function() {
+ if ( list ) {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+ // Handle firing indexes
+ if ( firing ) {
+ if ( index <= firingLength ) {
+ firingLength--;
+ }
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ }
+ });
+ }
+ return this;
+ },
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+ },
+ // Remove all callbacks from the list
+ empty: function() {
+ list = [];
+ firingLength = 0;
+ return this;
+ },
+ // Have the list do nothing anymore
+ disable: function() {
+ list = stack = memory = undefined;
+ return this;
+ },
+ // Is it disabled?
+ disabled: function() {
+ return !list;
+ },
+ // Lock the list in its current state
+ lock: function() {
+ stack = undefined;
+ if ( !memory ) {
+ self.disable();
+ }
+ return this;
+ },
+ // Is it locked?
+ locked: function() {
+ return !stack;
+ },
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( list && ( !fired || stack ) ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ if ( firing ) {
+ stack.push( args );
+ } else {
+ fire( args );
+ }
+ }
+ return this;
+ },
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+jQuery.extend({
+
+ Deferred: function( func ) {
+ var tuples = [
+ // action, add listener, listener list, final state
+ [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks("memory") ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[ tuple[1] ](function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .done( newDefer.resolve )
+ .fail( newDefer.reject )
+ .progress( newDefer.notify );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+ }
+ });
+ });
+ fns = null;
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 3 ];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[1] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(function() {
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[0] ] = function() {
+ deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+ return this;
+ };
+ deferred[ tuple[0] + "With" ] = list.fireWith;
+ });
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
+ resolveValues = slice.call( arguments ),
+ length = resolveValues.length,
+
+ // the count of uncompleted subordinates
+ remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+ // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+ // Update function for both resolve and progress values
+ updateFunc = function( i, contexts, values ) {
+ return function( value ) {
+ contexts[ i ] = this;
+ values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( values === progressValues ) {
+ deferred.notifyWith( contexts, values );
+ } else if ( !( --remaining ) ) {
+ deferred.resolveWith( contexts, values );
+ }
+ };
+ },
+
+ progressValues, progressContexts, resolveContexts;
+
+ // add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+ resolveValues[ i ].promise()
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject )
+ .progress( updateFunc( i, progressContexts, progressValues ) );
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // if we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
+ }
+
+ return deferred.promise();
+ }
+});
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+ // Add the callback
+ jQuery.ready.promise().done( fn );
+
+ return this;
+};
+
+jQuery.extend({
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.triggerHandler ) {
+ jQuery( document ).triggerHandler( "ready" );
+ jQuery( document ).off( "ready" );
+ }
+ }
+});
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed, false );
+ window.removeEventListener( "load", completed, false );
+ jQuery.ready();
+}
+
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
+
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called after the browser event has already occurred.
+ // we once tried to use readyState "interactive" here, but it caused issues like the one
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ setTimeout( jQuery.ready );
+
+ } else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed, false );
+ }
+ }
+ return readyList.promise( obj );
+};
+
+// Kick off the DOM ready check even if the user does not
+jQuery.ready.promise();
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ len ? fn( elems[0], key ) : emptyGet;
+};
+
+
+/**
+ * Determines whether an object can have data
+ */
+jQuery.acceptData = function( owner ) {
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ /* jshint -W018 */
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+function Data() {
+ // Support: Android < 4,
+ // Old WebKit does not have Object.preventExtensions/freeze method,
+ // return new empty object instead with no [[set]] accessor
+ Object.defineProperty( this.cache = {}, 0, {
+ get: function() {
+ return {};
+ }
+ });
+
+ this.expando = jQuery.expando + Math.random();
+}
+
+Data.uid = 1;
+Data.accepts = jQuery.acceptData;
+
+Data.prototype = {
+ key: function( owner ) {
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return the key for a frozen object.
+ if ( !Data.accepts( owner ) ) {
+ return 0;
+ }
+
+ var descriptor = {},
+ // Check if the owner object already has a cache key
+ unlock = owner[ this.expando ];
+
+ // If not, create one
+ if ( !unlock ) {
+ unlock = Data.uid++;
+
+ // Secure it in a non-enumerable, non-writable property
+ try {
+ descriptor[ this.expando ] = { value: unlock };
+ Object.defineProperties( owner, descriptor );
+
+ // Support: Android < 4
+ // Fallback to a less secure definition
+ } catch ( e ) {
+ descriptor[ this.expando ] = unlock;
+ jQuery.extend( owner, descriptor );
+ }
+ }
+
+ // Ensure the cache object
+ if ( !this.cache[ unlock ] ) {
+ this.cache[ unlock ] = {};
+ }
+
+ return unlock;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ // There may be an unlock assigned to this node,
+ // if there is no entry for this "owner", create one inline
+ // and set the unlock as though an owner entry had always existed
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ // Handle: [ owner, key, value ] args
+ if ( typeof data === "string" ) {
+ cache[ data ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+ // Fresh assignments by object are shallow copied
+ if ( jQuery.isEmptyObject( cache ) ) {
+ jQuery.extend( this.cache[ unlock ], data );
+ // Otherwise, copy the properties one-by-one to the cache object
+ } else {
+ for ( prop in data ) {
+ cache[ prop ] = data[ prop ];
+ }
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ // Either a valid cache is found, or will be created.
+ // New caches will be created and the unlock returned,
+ // allowing direct access to the newly created
+ // empty data object. A valid owner object must be provided.
+ var cache = this.cache[ this.key( owner ) ];
+
+ return key === undefined ?
+ cache : cache[ key ];
+ },
+ access: function( owner, key, value ) {
+ var stored;
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ((key && typeof key === "string") && value === undefined) ) {
+
+ stored = this.get( owner, key );
+
+ return stored !== undefined ?
+ stored : this.get( owner, jQuery.camelCase(key) );
+ }
+
+ // [*]When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i, name, camel,
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ if ( key === undefined ) {
+ this.cache[ unlock ] = {};
+
+ } else {
+ // Support array or space separated string of keys
+ if ( jQuery.isArray( key ) ) {
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = key.concat( key.map( jQuery.camelCase ) );
+ } else {
+ camel = jQuery.camelCase( key );
+ // Try the string as a key before any manipulation
+ if ( key in cache ) {
+ name = [ key, camel ];
+ } else {
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ name = camel;
+ name = name in cache ?
+ [ name ] : ( name.match( rnotwhite ) || [] );
+ }
+ }
+
+ i = name.length;
+ while ( i-- ) {
+ delete cache[ name[ i ] ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ return !jQuery.isEmptyObject(
+ this.cache[ owner[ this.expando ] ] || {}
+ );
+ },
+ discard: function( owner ) {
+ if ( owner[ this.expando ] ) {
+ delete this.cache[ owner[ this.expando ] ];
+ }
+ }
+};
+var data_priv = new Data();
+
+var data_user = new Data();
+
+
+
+/*
+ Implementation Summary
+
+ 1. Enforce API surface and semantic compatibility with 1.9.x branch
+ 2. Improve the module's maintainability by reducing the storage
+ paths to a single mechanism.
+ 3. Use the same single mechanism to support "private" and "user" data.
+ 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+ 5. Avoid exposing implementation details on user objects (eg. expando properties)
+ 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+*/
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /([A-Z])/g;
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ data_user.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend({
+ hasData: function( elem ) {
+ return data_user.hasData( elem ) || data_priv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return data_user.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ data_user.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to data_priv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return data_priv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ data_priv.remove( elem, name );
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = data_user.get( elem );
+
+ if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE11+
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.slice(5) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ data_priv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each(function() {
+ data_user.set( this, key );
+ });
+ }
+
+ return access( this, function( value ) {
+ var data,
+ camelKey = jQuery.camelCase( key );
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+ // Attempt to get data from the cache
+ // with the key as-is
+ data = data_user.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to get data from the cache
+ // with the key camelized
+ data = data_user.get( elem, camelKey );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, camelKey, undefined );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ this.each(function() {
+ // First, attempt to store a copy or reference of any
+ // data that might've been store with a camelCased key.
+ var data = data_user.get( this, camelKey );
+
+ // For HTML5 data-* attribute interop, we have to
+ // store property names with dashes in a camelCase form.
+ // This might not apply to all properties...*
+ data_user.set( this, camelKey, value );
+
+ // *... In the case of properties that might _actually_
+ // have dashes, we need to also store a copy of that
+ // unchanged property.
+ if ( key.indexOf("-") !== -1 && data !== undefined ) {
+ data_user.set( this, key, value );
+ }
+ });
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each(function() {
+ data_user.remove( this, key );
+ });
+ }
+});
+
+
+jQuery.extend({
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = data_priv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray( data ) ) {
+ queue = data_priv.access( elem, type, jQuery.makeArray(data) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // not intended for public consumption - generates a queueHooks object, or returns the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return data_priv.get( elem, key ) || data_priv.access( elem, key, {
+ empty: jQuery.Callbacks("once memory").add(function() {
+ data_priv.remove( elem, [ type + "queue", key ] );
+ })
+ });
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[0], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each(function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ dequeue: function( type ) {
+ return this.each(function() {
+ jQuery.dequeue( this, type );
+ });
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = data_priv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+});
+var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHidden = function( elem, el ) {
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+ return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+ };
+
+var rcheckableType = (/^(?:checkbox|radio)$/i);
+
+
+
+(function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // #11217 - WebKit loses check when the name is after the checked attribute
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` need .setAttribute for WWA
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
+ // old WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ // Support: IE9-IE11+
+ div.innerHTML = "<textarea>x</textarea>";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+})();
+var strundefined = typeof undefined;
+
+
+
+support.focusinBubbles = "onfocusin" in window;
+
+
+var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.get( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !(events = elemData.events) ) {
+ events = elemData.events = {};
+ }
+ if ( !(eventHandle = elemData.handle) ) {
+ eventHandle = elemData.handle = function( e ) {
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend({
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join(".")
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !(handlers = events[ type ]) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.hasData( elem ) && data_priv.get( elem );
+
+ if ( !elemData || !(events = elemData.events) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ delete elemData.handle;
+ data_priv.remove( elem, "events" );
+ }
+ },
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+
+ var i, cur, tmp, bubbleType, ontype, handle, special,
+ eventPath = [ elem || document ],
+ type = hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+ cur = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf(".") >= 0 ) {
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf(":") < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join(".");
+ event.namespace_re = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === (elem.ownerDocument || document) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
+ event.result = handle.apply( cur, data );
+ if ( event.result === false ) {
+ event.preventDefault();
+ }
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+ if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
+ jQuery.acceptData( elem ) ) {
+
+ // Call a native DOM method on the target with the same name name as the event.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ ontype ];
+
+ if ( tmp ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+ elem[ type ]();
+ jQuery.event.triggered = undefined;
+
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event );
+
+ var i, j, ret, matched, handleObj,
+ handlerQueue = [],
+ args = slice.call( arguments ),
+ handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[0] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or
+ // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+ .apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( (event.result = ret) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, matches, sel, handleObj,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ // Black-hole SVG <use> instance trees (#13180)
+ // Avoid non-left-click bubbling in Firefox (#3861)
+ if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.disabled !== true || event.type !== "click" ) {
+ matches = [];
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matches[ sel ] === undefined ) {
+ matches[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) >= 0 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matches[ sel ] ) {
+ matches.push( handleObj );
+ }
+ }
+ if ( matches.length ) {
+ handlerQueue.push({ elem: cur, handlers: matches });
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+ }
+
+ return handlerQueue;
+ },
+
+ // Includes some event props shared by KeyEvent and MouseEvent
+ props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+ fixHooks: {},
+
+ keyHooks: {
+ props: "char charCode key keyCode".split(" "),
+ filter: function( event, original ) {
+
+ // Add which for key events
+ if ( event.which == null ) {
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
+ }
+
+ return event;
+ }
+ },
+
+ mouseHooks: {
+ props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+ filter: function( event, original ) {
+ var eventDoc, doc, body,
+ button = original.button;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && original.clientX != null ) {
+ eventDoc = event.target.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+ event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && button !== undefined ) {
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+ }
+
+ return event;
+ }
+ },
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop, copy,
+ type = event.type,
+ originalEvent = event,
+ fixHook = this.fixHooks[ type ];
+
+ if ( !fixHook ) {
+ this.fixHooks[ type ] = fixHook =
+ rmouseEvent.test( type ) ? this.mouseHooks :
+ rkeyEvent.test( type ) ? this.keyHooks :
+ {};
+ }
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+ event = new jQuery.Event( originalEvent );
+
+ i = copy.length;
+ while ( i-- ) {
+ prop = copy[ i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Support: Cordova 2.5 (WebKit) (#13255)
+ // All events should have a target; Cordova deviceready doesn't
+ if ( !event.target ) {
+ event.target = document;
+ }
+
+ // Support: Safari 6.0+, Chrome < 28
+ // Target should not be a text node (#504, #13143)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+ },
+
+ special: {
+ load: {
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ focus: {
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== safeActiveElement() && this.focus ) {
+ this.focus();
+ return false;
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function() {
+ if ( this === safeActiveElement() && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+ click: {
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
+ this.click();
+ return false;
+ }
+ },
+
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function( event ) {
+ return jQuery.nodeName( event.target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ },
+
+ simulate: function( type, elem, event, bubble ) {
+ // Piggyback on a donor event to simulate a different one.
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
+ // simulated event prevents default then we do the same on the donor.
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ {
+ type: type,
+ isSimulated: true,
+ originalEvent: {}
+ }
+ );
+ if ( bubble ) {
+ jQuery.event.trigger( e, null, elem );
+ } else {
+ jQuery.event.dispatch.call( elem, e );
+ }
+ if ( e.isDefaultPrevented() ) {
+ event.preventDefault();
+ }
+ }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle, false );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+ // Allow instantiation without the 'new' keyword
+ if ( !(this instanceof jQuery.Event) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+ // Support: Android < 4.0
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && e.preventDefault ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && e.stopPropagation ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && e.stopImmediatePropagation ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// Support: Chrome 15+
+jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mousenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+});
+
+// Create "bubbling" focus and blur events
+// Support: Firefox, Chrome, Safari
+if ( !support.focusinBubbles ) {
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+ // Attach a single capturing handler on the document while someone wants focusin/focusout
+ var handler = function( event ) {
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+ };
+
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix );
+
+ if ( !attaches ) {
+ doc.addEventListener( orig, handler, true );
+ }
+ data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
+ },
+ teardown: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix ) - 1;
+
+ if ( !attaches ) {
+ doc.removeEventListener( orig, handler, true );
+ data_priv.remove( doc, fix );
+
+ } else {
+ data_priv.access( doc, fix, attaches );
+ }
+ }
+ };
+ });
+}
+
+jQuery.fn.extend({
+
+ on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ this.on( type, selector, data, types[ type ], one );
+ }
+ return this;
+ }
+
+ if ( data == null && fn == null ) {
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return this;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return this.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ });
+ },
+ one: function( types, selector, data, fn ) {
+ return this.on( types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each(function() {
+ jQuery.event.remove( this, types, fn, selector );
+ });
+ },
+
+ trigger: function( type, data ) {
+ return this.each(function() {
+ jQuery.event.trigger( type, data, this );
+ });
+ },
+ triggerHandler: function( type, data ) {
+ var elem = this[0];
+ if ( elem ) {
+ return jQuery.event.trigger( type, data, elem, true );
+ }
+ }
+});
+
+
+var
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+ rtagName = /<([\w:]+)/,
+ rhtml = /<|&#?\w+;/,
+ rnoInnerhtml = /<(?:script|style|link)/i,
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rscriptType = /^$|\/(?:java|ecma)script/i,
+ rscriptTypeMasked = /^true\/(.*)/,
+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+ // We have to close these tags to support XHTML (#13200)
+ wrapMap = {
+
+ // Support: IE 9
+ option: [ 1, "<select multiple='multiple'>", "</select>" ],
+
+ thead: [ 1, "<table>", "</table>" ],
+ col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
+ tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+ _default: [ 0, "", "" ]
+ };
+
+// Support: IE 9
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// Support: 1.x compatibility
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+ return jQuery.nodeName( elem, "table" ) &&
+ jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
+
+ elem.getElementsByTagName("tbody")[0] ||
+ elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+ elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+ elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
+ return elem;
+}
+function restoreScript( elem ) {
+ var match = rscriptTypeMasked.exec( elem.type );
+
+ if ( match ) {
+ elem.type = match[ 1 ];
+ } else {
+ elem.removeAttribute("type");
+ }
+
+ return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ data_priv.set(
+ elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+function cloneCopyEvent( src, dest ) {
+ var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+ if ( dest.nodeType !== 1 ) {
+ return;
+ }
+
+ // 1. Copy private data: events, handlers, etc.
+ if ( data_priv.hasData( src ) ) {
+ pdataOld = data_priv.access( src );
+ pdataCur = data_priv.set( dest, pdataOld );
+ events = pdataOld.events;
+
+ if ( events ) {
+ delete pdataCur.handle;
+ pdataCur.events = {};
+
+ for ( type in events ) {
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type, events[ type ][ i ] );
+ }
+ }
+ }
+ }
+
+ // 2. Copy user data
+ if ( data_user.hasData( src ) ) {
+ udataOld = data_user.access( src );
+ udataCur = jQuery.extend( {}, udataOld );
+
+ data_user.set( dest, udataCur );
+ }
+}
+
+function getAll( context, tag ) {
+ var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
+ context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
+ [];
+
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], ret ) :
+ ret;
+}
+
+// Support: IE >= 9
+function fixInput( src, dest ) {
+ var nodeName = dest.nodeName.toLowerCase();
+
+ // Fails to persist the checked state of a cloned checkbox or radio button.
+ if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+ dest.checked = src.checked;
+
+ // Fails to return the selected option to the default selected state when cloning options
+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
+ dest.defaultValue = src.defaultValue;
+ }
+}
+
+jQuery.extend({
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var i, l, srcElements, destElements,
+ clone = elem.cloneNode( true ),
+ inPage = jQuery.contains( elem.ownerDocument, elem );
+
+ // Support: IE >= 9
+ // Fix Cloning issues
+ if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+ !jQuery.isXMLDoc( elem ) ) {
+
+ // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+ destElements = getAll( clone );
+ srcElements = getAll( elem );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ fixInput( srcElements[ i ], destElements[ i ] );
+ }
+ }
+
+ // Copy the events from the original to the clone
+ if ( dataAndEvents ) {
+ if ( deepDataAndEvents ) {
+ srcElements = srcElements || getAll( elem );
+ destElements = destElements || getAll( clone );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+ }
+ } else {
+ cloneCopyEvent( elem, clone );
+ }
+ }
+
+ // Preserve script evaluation history
+ destElements = getAll( clone, "script" );
+ if ( destElements.length > 0 ) {
+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+ }
+
+ // Return the cloned set
+ return clone;
+ },
+
+ buildFragment: function( elems, context, scripts, selection ) {
+ var elem, tmp, tag, wrap, contains, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement("div") );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Fixes #12346
+ // Support: Webkit, IE
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( (elem = nodes[ i++ ]) ) {
+
+ // #4087 - If origin and destination elements are the same, and this is
+ // that element, do not do anything
+ if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( (elem = tmp[ j++ ]) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+ },
+
+ cleanData: function( elems ) {
+ var data, elem, type, key,
+ special = jQuery.event.special,
+ i = 0;
+
+ for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
+ if ( jQuery.acceptData( elem ) ) {
+ key = elem[ data_priv.expando ];
+
+ if ( key && (data = data_priv.cache[ key ]) ) {
+ if ( data.events ) {
+ for ( type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent( elem, type, data.handle );
+ }
+ }
+ }
+ if ( data_priv.cache[ key ] ) {
+ // Discard any remaining `private` data
+ delete data_priv.cache[ key ];
+ }
+ }
+ }
+ // Discard any remaining `user` data
+ delete data_user.cache[ elem[ data_user.expando ] ];
+ }
+ }
+});
+
+jQuery.fn.extend({
+ text: function( value ) {
+ return access( this, function( value ) {
+ return value === undefined ?
+ jQuery.text( this ) :
+ this.empty().each(function() {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ this.textContent = value;
+ }
+ });
+ }, null, value, arguments.length );
+ },
+
+ append: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.appendChild( elem );
+ }
+ });
+ },
+
+ prepend: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.insertBefore( elem, target.firstChild );
+ }
+ });
+ },
+
+ before: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this );
+ }
+ });
+ },
+
+ after: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ }
+ });
+ },
+
+ remove: function( selector, keepData /* Internal Use Only */ ) {
+ var elem,
+ elems = selector ? jQuery.filter( selector, this ) : this,
+ i = 0;
+
+ for ( ; (elem = elems[i]) != null; i++ ) {
+ if ( !keepData && elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem ) );
+ }
+
+ if ( elem.parentNode ) {
+ if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+ setGlobalEval( getAll( elem, "script" ) );
+ }
+ elem.parentNode.removeChild( elem );
+ }
+ }
+
+ return this;
+ },
+
+ empty: function() {
+ var elem,
+ i = 0;
+
+ for ( ; (elem = this[i]) != null; i++ ) {
+ if ( elem.nodeType === 1 ) {
+
+ // Prevent memory leaks
+ jQuery.cleanData( getAll( elem, false ) );
+
+ // Remove any remaining nodes
+ elem.textContent = "";
+ }
+ }
+
+ return this;
+ },
+
+ clone: function( dataAndEvents, deepDataAndEvents ) {
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map(function() {
+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+ });
+ },
+
+ html: function( value ) {
+ return access( this, function( value ) {
+ var elem = this[ 0 ] || {},
+ i = 0,
+ l = this.length;
+
+ if ( value === undefined && elem.nodeType === 1 ) {
+ return elem.innerHTML;
+ }
+
+ // See if we can take a shortcut and just use innerHTML
+ if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+ !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+ value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+ try {
+ for ( ; i < l; i++ ) {
+ elem = this[ i ] || {};
+
+ // Remove element nodes and prevent memory leaks
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem, false ) );
+ elem.innerHTML = value;
+ }
+ }
+
+ elem = 0;
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch( e ) {}
+ }
+
+ if ( elem ) {
+ this.empty().append( value );
+ }
+ }, null, value, arguments.length );
+ },
+
+ replaceWith: function() {
+ var arg = arguments[ 0 ];
+
+ // Make the changes, replacing each context element with the new content
+ this.domManip( arguments, function( elem ) {
+ arg = this.parentNode;
+
+ jQuery.cleanData( getAll( this ) );
+
+ if ( arg ) {
+ arg.replaceChild( elem, this );
+ }
+ });
+
+ // Force removal if there was no new content (e.g., from empty arguments)
+ return arg && (arg.length || arg.nodeType) ? this : this.remove();
+ },
+
+ detach: function( selector ) {
+ return this.remove( selector, true );
+ },
+
+ domManip: function( args, callback ) {
+
+ // Flatten any nested arrays
+ args = concat.apply( [], args );
+
+ var fragment, first, scripts, hasScripts, node, doc,
+ i = 0,
+ l = this.length,
+ set = this,
+ iNoClone = l - 1,
+ value = args[ 0 ],
+ isFunction = jQuery.isFunction( value );
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( isFunction ||
+ ( l > 1 && typeof value === "string" &&
+ !support.checkClone && rchecked.test( value ) ) ) {
+ return this.each(function( index ) {
+ var self = set.eq( index );
+ if ( isFunction ) {
+ args[ 0 ] = value.call( this, index, self.html() );
+ }
+ self.domManip( args, callback );
+ });
+ }
+
+ if ( l ) {
+ fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
+ first = fragment.firstChild;
+
+ if ( fragment.childNodes.length === 1 ) {
+ fragment = first;
+ }
+
+ if ( first ) {
+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+ hasScripts = scripts.length;
+
+ // Use the original fragment for the last item instead of the first because it can end up
+ // being emptied incorrectly in certain situations (#8070).
+ for ( ; i < l; i++ ) {
+ node = fragment;
+
+ if ( i !== iNoClone ) {
+ node = jQuery.clone( node, true, true );
+
+ // Keep references to cloned scripts for later restoration
+ if ( hasScripts ) {
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( scripts, getAll( node, "script" ) );
+ }
+ }
+
+ callback.call( this[ i ], node, i );
+ }
+
+ if ( hasScripts ) {
+ doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+ // Reenable scripts
+ jQuery.map( scripts, restoreScript );
+
+ // Evaluate executable scripts on first document insertion
+ for ( i = 0; i < hasScripts; i++ ) {
+ node = scripts[ i ];
+ if ( rscriptType.test( node.type || "" ) &&
+ !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+ if ( node.src ) {
+ // Optional AJAX dependency, but won't run scripts if not present
+ if ( jQuery._evalUrl ) {
+ jQuery._evalUrl( node.src );
+ }
+ } else {
+ jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return this;
+ }
+});
+
+jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function( name, original ) {
+ jQuery.fn[ name ] = function( selector ) {
+ var elems,
+ ret = [],
+ insert = jQuery( selector ),
+ last = insert.length - 1,
+ i = 0;
+
+ for ( ; i <= last; i++ ) {
+ elems = i === last ? this : this.clone( true );
+ jQuery( insert[ i ] )[ original ]( elems );
+
+ // Support: QtWebKit
+ // .get() because push.apply(_, arraylike) throws
+ push.apply( ret, elems.get() );
+ }
+
+ return this.pushStack( ret );
+ };
+});
+
+
+var iframe,
+ elemdisplay = {};
+
+/**
+ * Retrieve the actual display of a element
+ * @param {String} name nodeName of the element
+ * @param {Object} doc Document object
+ */
+// Called only from within defaultDisplay
+function actualDisplay( name, doc ) {
+ var style,
+ elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+
+ // getDefaultComputedStyle might be reliably used only on attached element
+ display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
+
+ // Use of this method is a temporary fix (more like optmization) until something better comes along,
+ // since it was removed from specification and supported only in FF
+ style.display : jQuery.css( elem[ 0 ], "display" );
+
+ // We don't have any data stored on the element,
+ // so use "detach" method as fast way to get rid of the element
+ elem.detach();
+
+ return display;
+}
+
+/**
+ * Try to determine the default display value of an element
+ * @param {String} nodeName
+ */
+function defaultDisplay( nodeName ) {
+ var doc = document,
+ display = elemdisplay[ nodeName ];
+
+ if ( !display ) {
+ display = actualDisplay( nodeName, doc );
+
+ // If the simple way fails, read from inside an iframe
+ if ( display === "none" || !display ) {
+
+ // Use the already-created iframe if possible
+ iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
+
+ // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+ doc = iframe[ 0 ].contentDocument;
+
+ // Support: IE
+ doc.write();
+ doc.close();
+
+ display = actualDisplay( nodeName, doc );
+ iframe.detach();
+ }
+
+ // Store the correct default display
+ elemdisplay[ nodeName ] = display;
+ }
+
+ return display;
+}
+var rmargin = (/^margin/);
+
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+ return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+ };
+
+
+
+function curCSS( elem, name, computed ) {
+ var width, minWidth, maxWidth, ret,
+ style = elem.style;
+
+ computed = computed || getStyles( elem );
+
+ // Support: IE9
+ // getPropertyValue is only needed for .css('filter') in IE9, see #12537
+ if ( computed ) {
+ ret = computed.getPropertyValue( name ) || computed[ name ];
+ }
+
+ if ( computed ) {
+
+ if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+ ret = jQuery.style( elem, name );
+ }
+
+ // Support: iOS < 6
+ // A tribute to the "awesome hack by Dean Edwards"
+ // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+ // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+ if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+ // Remember the original values
+ width = style.width;
+ minWidth = style.minWidth;
+ maxWidth = style.maxWidth;
+
+ // Put in the new values to get a computed value out
+ style.minWidth = style.maxWidth = style.width = ret;
+ ret = computed.width;
+
+ // Revert the changed values
+ style.width = width;
+ style.minWidth = minWidth;
+ style.maxWidth = maxWidth;
+ }
+ }
+
+ return ret !== undefined ?
+ // Support: IE
+ // IE returns zIndex value as an integer.
+ ret + "" :
+ ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+ // Define the hook, we'll check on the first run if it's really needed.
+ return {
+ get: function() {
+ if ( conditionFn() ) {
+ // Hook not needed (or it's not possible to use it due to missing dependency),
+ // remove it.
+ // Since there are no other hooks for marginRight, remove the whole object.
+ delete this.get;
+ return;
+ }
+
+ // Hook needed; redefine it so that the support test is not executed again.
+
+ return (this.get = hookFn).apply( this, arguments );
+ }
+ };
+}
+
+
+(function() {
+ var pixelPositionVal, boxSizingReliableVal,
+ docElem = document.documentElement,
+ container = document.createElement( "div" ),
+ div = document.createElement( "div" );
+
+ if ( !div.style ) {
+ return;
+ }
+
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" +
+ "position:absolute";
+ container.appendChild( div );
+
+ // Executing both pixelPosition & boxSizingReliable tests require only one layout
+ // so they're executed at the same time to save the second computation.
+ function computePixelPositionAndBoxSizingReliable() {
+ div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
+ "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
+ "border:1px;padding:1px;width:4px;position:absolute";
+ div.innerHTML = "";
+ docElem.appendChild( container );
+
+ var divStyle = window.getComputedStyle( div, null );
+ pixelPositionVal = divStyle.top !== "1%";
+ boxSizingReliableVal = divStyle.width === "4px";
+
+ docElem.removeChild( container );
+ }
+
+ // Support: node.js jsdom
+ // Don't assume that getComputedStyle is a property of the global object
+ if ( window.getComputedStyle ) {
+ jQuery.extend( support, {
+ pixelPosition: function() {
+ // This test is executed only once but we still do memoizing
+ // since we can use the boxSizingReliable pre-computing.
+ // No need to check if the test was already performed, though.
+ computePixelPositionAndBoxSizingReliable();
+ return pixelPositionVal;
+ },
+ boxSizingReliable: function() {
+ if ( boxSizingReliableVal == null ) {
+ computePixelPositionAndBoxSizingReliable();
+ }
+ return boxSizingReliableVal;
+ },
+ reliableMarginRight: function() {
+ // Support: Android 2.3
+ // Check if div with explicit width and no margin-right incorrectly
+ // gets computed margin-right based on width of container. (#3333)
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // This support function is only executed once so no memoizing is needed.
+ var ret,
+ marginDiv = div.appendChild( document.createElement( "div" ) );
+
+ // Reset CSS: box-sizing; display; margin; border; padding
+ marginDiv.style.cssText = div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+ "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
+ marginDiv.style.marginRight = marginDiv.style.width = "0";
+ div.style.width = "1px";
+ docElem.appendChild( container );
+
+ ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
+
+ docElem.removeChild( container );
+
+ return ret;
+ }
+ });
+ }
+})();
+
+
+// A method for quickly swapping in/out CSS properties to get correct calculations.
+jQuery.swap = function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
+var
+ // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+ // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+ rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
+ rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
+
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+ cssNormalTransform = {
+ letterSpacing: "0",
+ fontWeight: "400"
+ },
+
+ cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+ // shortcut for names that are not vendor prefixed
+ if ( name in style ) {
+ return name;
+ }
+
+ // check for vendor prefixed names
+ var capName = name[0].toUpperCase() + name.slice(1),
+ origName = name,
+ i = cssPrefixes.length;
+
+ while ( i-- ) {
+ name = cssPrefixes[ i ] + capName;
+ if ( name in style ) {
+ return name;
+ }
+ }
+
+ return origName;
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+ var matches = rnumsplit.exec( value );
+ return matches ?
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+ value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+ var i = extra === ( isBorderBox ? "border" : "content" ) ?
+ // If we already have the right measurement, avoid augmentation
+ 4 :
+ // Otherwise initialize for horizontal or vertical properties
+ name === "width" ? 1 : 0,
+
+ val = 0;
+
+ for ( ; i < 4; i += 2 ) {
+ // both box models exclude margin, so add it if we want it
+ if ( extra === "margin" ) {
+ val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+ }
+
+ if ( isBorderBox ) {
+ // border-box includes padding, so remove it if we want content
+ if ( extra === "content" ) {
+ val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+ }
+
+ // at this point, extra isn't border nor margin, so remove border
+ if ( extra !== "margin" ) {
+ val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ } else {
+ // at this point, extra isn't content, so add padding
+ val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+ // at this point, extra isn't content nor padding, so add border
+ if ( extra !== "padding" ) {
+ val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ }
+ }
+
+ return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+ // Start with offset property, which is equivalent to the border-box value
+ var valueIsBorderBox = true,
+ val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+ styles = getStyles( elem ),
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+ // some non-html elements return undefined for offsetWidth, so check for null/undefined
+ // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+ // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+ if ( val <= 0 || val == null ) {
+ // Fall back to computed then uncomputed css if necessary
+ val = curCSS( elem, name, styles );
+ if ( val < 0 || val == null ) {
+ val = elem.style[ name ];
+ }
+
+ // Computed unit is not pixels. Stop here and return.
+ if ( rnumnonpx.test(val) ) {
+ return val;
+ }
+
+ // we need the check for style in case a browser which returns unreliable values
+ // for getComputedStyle silently falls back to the reliable elem.style
+ valueIsBorderBox = isBorderBox &&
+ ( support.boxSizingReliable() || val === elem.style[ name ] );
+
+ // Normalize "", auto, and prepare for extra
+ val = parseFloat( val ) || 0;
+ }
+
+ // use the active box-sizing model to add/subtract irrelevant styles
+ return ( val +
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra || ( isBorderBox ? "border" : "content" ),
+ valueIsBorderBox,
+ styles
+ )
+ ) + "px";
+}
+
+function showHide( elements, show ) {
+ var display, elem, hidden,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+
+ values[ index ] = data_priv.get( elem, "olddisplay" );
+ display = elem.style.display;
+ if ( show ) {
+ // Reset the inline display of this element to learn if it is
+ // being hidden by cascaded rules or not
+ if ( !values[ index ] && display === "none" ) {
+ elem.style.display = "";
+ }
+
+ // Set elements which have been overridden with display: none
+ // in a stylesheet to whatever the default browser style is
+ // for such an element
+ if ( elem.style.display === "" && isHidden( elem ) ) {
+ values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+ }
+ } else {
+ hidden = isHidden( elem );
+
+ if ( display !== "none" || !hidden ) {
+ data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+ }
+ }
+ }
+
+ // Set the display of most of the elements in a second loop
+ // to avoid the constant reflow
+ for ( index = 0; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+ if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+ elem.style.display = show ? values[ index ] || "" : "none";
+ }
+ }
+
+ return elements;
+}
+
+jQuery.extend({
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function( elem, computed ) {
+ if ( computed ) {
+ // We should always get a number back from opacity
+ var ret = curCSS( elem, "opacity" );
+ return ret === "" ? "1" : ret;
+ }
+ }
+ }
+ },
+
+ // Don't automatically add "px" to these possibly-unitless properties
+ cssNumber: {
+ "columnCount": true,
+ "fillOpacity": true,
+ "flexGrow": true,
+ "flexShrink": true,
+ "fontWeight": true,
+ "lineHeight": true,
+ "opacity": true,
+ "order": true,
+ "orphans": true,
+ "widows": true,
+ "zIndex": true,
+ "zoom": true
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {
+ // normalize float css property
+ "float": "cssFloat"
+ },
+
+ // Get and set the style property on a DOM Node
+ style: function( elem, name, value, extra ) {
+ // Don't set styles on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret, type, hooks,
+ origName = jQuery.camelCase( name ),
+ style = elem.style;
+
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+ // gets hook for the prefixed version
+ // followed by the unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // Check if we're setting a value
+ if ( value !== undefined ) {
+ type = typeof value;
+
+ // convert relative number strings (+= or -=) to relative numbers. #7345
+ if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+ value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+ // Fixes bug #9237
+ type = "number";
+ }
+
+ // Make sure that null and NaN values aren't set. See: #7116
+ if ( value == null || value !== value ) {
+ return;
+ }
+
+ // If a number was passed in, add 'px' to the (except for certain CSS properties)
+ if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+ value += "px";
+ }
+
+ // Fixes #8908, it can be done more correctly by specifying setters in cssHooks,
+ // but it would mean to define eight (for every problematic property) identical functions
+ if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+ style[ name ] = "inherit";
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+ style[ name ] = value;
+ }
+
+ } else {
+ // If a hook was provided get the non-computed value from there
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[ name ];
+ }
+ },
+
+ css: function( elem, name, extra, styles ) {
+ var val, num, hooks,
+ origName = jQuery.camelCase( name );
+
+ // Make sure that we're working with the right name
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+ // gets hook for the prefixed version
+ // followed by the unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // If a hook was provided get the computed value from there
+ if ( hooks && "get" in hooks ) {
+ val = hooks.get( elem, true, extra );
+ }
+
+ // Otherwise, if a way to get the computed value exists, use that
+ if ( val === undefined ) {
+ val = curCSS( elem, name, styles );
+ }
+
+ //convert "normal" to computed value
+ if ( val === "normal" && name in cssNormalTransform ) {
+ val = cssNormalTransform[ name ];
+ }
+
+ // Return, converting to number if forced or a qualifier was provided and val looks numeric
+ if ( extra === "" || extra ) {
+ num = parseFloat( val );
+ return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+ }
+ return val;
+ }
+});
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+ jQuery.cssHooks[ name ] = {
+ get: function( elem, computed, extra ) {
+ if ( computed ) {
+ // certain elements can have dimension info if we invisibly show them
+ // however, it must have a current display style that would benefit from this
+ return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
+ jQuery.swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, name, extra );
+ }) :
+ getWidthOrHeight( elem, name, extra );
+ }
+ },
+
+ set: function( elem, value, extra ) {
+ var styles = extra && getStyles( elem );
+ return setPositiveNumber( elem, value, extra ?
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra,
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ styles
+ ) : 0
+ );
+ }
+ };
+});
+
+// Support: Android 2.3
+jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
+ function( elem, computed ) {
+ if ( computed ) {
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // Work around by temporarily setting element display to inline-block
+ return jQuery.swap( elem, { "display": "inline-block" },
+ curCSS, [ elem, "marginRight" ] );
+ }
+ }
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+ margin: "",
+ padding: "",
+ border: "Width"
+}, function( prefix, suffix ) {
+ jQuery.cssHooks[ prefix + suffix ] = {
+ expand: function( value ) {
+ var i = 0,
+ expanded = {},
+
+ // assumes a single number if not a string
+ parts = typeof value === "string" ? value.split(" ") : [ value ];
+
+ for ( ; i < 4; i++ ) {
+ expanded[ prefix + cssExpand[ i ] + suffix ] =
+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+ }
+
+ return expanded;
+ }
+ };
+
+ if ( !rmargin.test( prefix ) ) {
+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+ }
+});
+
+jQuery.fn.extend({
+ css: function( name, value ) {
+ return access( this, function( elem, name, value ) {
+ var styles, len,
+ map = {},
+ i = 0;
+
+ if ( jQuery.isArray( name ) ) {
+ styles = getStyles( elem );
+ len = name.length;
+
+ for ( ; i < len; i++ ) {
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+ }
+
+ return map;
+ }
+
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ }, name, value, arguments.length > 1 );
+ },
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each(function() {
+ if ( isHidden( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ });
+ }
+});
+
+
+function Tween( elem, options, prop, end, easing ) {
+ return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+ constructor: Tween,
+ init: function( elem, options, prop, end, easing, unit ) {
+ this.elem = elem;
+ this.prop = prop;
+ this.easing = easing || "swing";
+ this.options = options;
+ this.start = this.now = this.cur();
+ this.end = end;
+ this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+ },
+ cur: function() {
+ var hooks = Tween.propHooks[ this.prop ];
+
+ return hooks && hooks.get ?
+ hooks.get( this ) :
+ Tween.propHooks._default.get( this );
+ },
+ run: function( percent ) {
+ var eased,
+ hooks = Tween.propHooks[ this.prop ];
+
+ if ( this.options.duration ) {
+ this.pos = eased = jQuery.easing[ this.easing ](
+ percent, this.options.duration * percent, 0, 1, this.options.duration
+ );
+ } else {
+ this.pos = eased = percent;
+ }
+ this.now = ( this.end - this.start ) * eased + this.start;
+
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
+
+ if ( hooks && hooks.set ) {
+ hooks.set( this );
+ } else {
+ Tween.propHooks._default.set( this );
+ }
+ return this;
+ }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+ _default: {
+ get: function( tween ) {
+ var result;
+
+ if ( tween.elem[ tween.prop ] != null &&
+ (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+ return tween.elem[ tween.prop ];
+ }
+
+ // passing an empty string as a 3rd parameter to .css will automatically
+ // attempt a parseFloat and fallback to a string if the parse fails
+ // so, simple values such as "10px" are parsed to Float.
+ // complex values such as "rotate(1rad)" are returned as is.
+ result = jQuery.css( tween.elem, tween.prop, "" );
+ // Empty strings, null, undefined and "auto" are converted to 0.
+ return !result || result === "auto" ? 0 : result;
+ },
+ set: function( tween ) {
+ // use step hook for back compat - use cssHook if its there - use .style if its
+ // available and use plain properties where available
+ if ( jQuery.fx.step[ tween.prop ] ) {
+ jQuery.fx.step[ tween.prop ]( tween );
+ } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+ } else {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+ }
+};
+
+// Support: IE9
+// Panic based approach to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+ set: function( tween ) {
+ if ( tween.elem.nodeType && tween.elem.parentNode ) {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+};
+
+jQuery.easing = {
+ linear: function( p ) {
+ return p;
+ },
+ swing: function( p ) {
+ return 0.5 - Math.cos( p * Math.PI ) / 2;
+ }
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+ fxNow, timerId,
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
+ rrun = /queueHooks$/,
+ animationPrefilters = [ defaultPrefilter ],
+ tweeners = {
+ "*": [ function( prop, value ) {
+ var tween = this.createTween( prop, value ),
+ target = tween.cur(),
+ parts = rfxnum.exec( value ),
+ unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+ rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+ scale = 1,
+ maxIterations = 20;
+
+ if ( start && start[ 3 ] !== unit ) {
+ // Trust units reported by jQuery.css
+ unit = unit || start[ 3 ];
+
+ // Make sure we update the tween properties later on
+ parts = parts || [];
+
+ // Iteratively approximate from a nonzero starting point
+ start = +target || 1;
+
+ do {
+ // If previous iteration zeroed out, double until we get *something*
+ // Use a string for doubling factor so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ start = start / scale;
+ jQuery.style( tween.elem, prop, start + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur()
+ // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+ } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+ }
+
+ // Update tween properties
+ if ( parts ) {
+ start = tween.start = +start || +target || 0;
+ tween.unit = unit;
+ // If a +=/-= token was provided, we're doing a relative animation
+ tween.end = parts[ 1 ] ?
+ start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+ +parts[ 2 ];
+ }
+
+ return tween;
+ } ]
+ };
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+ setTimeout(function() {
+ fxNow = undefined;
+ });
+ return ( fxNow = jQuery.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+ var which,
+ i = 0,
+ attrs = { height: type };
+
+ // if we include width, step value is 1 to do all cssExpand values,
+ // if we don't include width, step value is 2 to skip over Left and Right
+ includeWidth = includeWidth ? 1 : 0;
+ for ( ; i < 4 ; i += 2 - includeWidth ) {
+ which = cssExpand[ i ];
+ attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+ }
+
+ if ( includeWidth ) {
+ attrs.opacity = attrs.width = type;
+ }
+
+ return attrs;
+}
+
+function createTween( value, prop, animation ) {
+ var tween,
+ collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+ index = 0,
+ length = collection.length;
+ for ( ; index < length; index++ ) {
+ if ( (tween = collection[ index ].call( animation, prop, value )) ) {
+
+ // we're done with this property
+ return tween;
+ }
+ }
+}
+
+function defaultPrefilter( elem, props, opts ) {
+ /* jshint validthis: true */
+ var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
+ anim = this,
+ orig = {},
+ style = elem.style,
+ hidden = elem.nodeType && isHidden( elem ),
+ dataShow = data_priv.get( elem, "fxshow" );
+
+ // handle queue: false promises
+ if ( !opts.queue ) {
+ hooks = jQuery._queueHooks( elem, "fx" );
+ if ( hooks.unqueued == null ) {
+ hooks.unqueued = 0;
+ oldfire = hooks.empty.fire;
+ hooks.empty.fire = function() {
+ if ( !hooks.unqueued ) {
+ oldfire();
+ }
+ };
+ }
+ hooks.unqueued++;
+
+ anim.always(function() {
+ // doing this makes sure that the complete handler will be called
+ // before this completes
+ anim.always(function() {
+ hooks.unqueued--;
+ if ( !jQuery.queue( elem, "fx" ).length ) {
+ hooks.empty.fire();
+ }
+ });
+ });
+ }
+
+ // height/width overflow pass
+ if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+ // Make sure that nothing sneaks out
+ // Record all 3 overflow attributes because IE9-10 do not
+ // change the overflow attribute when overflowX and
+ // overflowY are set to the same value
+ opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+ // Set display property to inline-block for height/width
+ // animations on inline elements that are having width/height animated
+ display = jQuery.css( elem, "display" );
+
+ // Test default display if display is currently "none"
+ checkDisplay = display === "none" ?
+ data_priv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
+
+ if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
+ style.display = "inline-block";
+ }
+ }
+
+ if ( opts.overflow ) {
+ style.overflow = "hidden";
+ anim.always(function() {
+ style.overflow = opts.overflow[ 0 ];
+ style.overflowX = opts.overflow[ 1 ];
+ style.overflowY = opts.overflow[ 2 ];
+ });
+ }
+
+ // show/hide pass
+ for ( prop in props ) {
+ value = props[ prop ];
+ if ( rfxtypes.exec( value ) ) {
+ delete props[ prop ];
+ toggle = toggle || value === "toggle";
+ if ( value === ( hidden ? "hide" : "show" ) ) {
+
+ // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
+ if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+ hidden = true;
+ } else {
+ continue;
+ }
+ }
+ orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+
+ // Any non-fx value stops us from restoring the original display value
+ } else {
+ display = undefined;
+ }
+ }
+
+ if ( !jQuery.isEmptyObject( orig ) ) {
+ if ( dataShow ) {
+ if ( "hidden" in dataShow ) {
+ hidden = dataShow.hidden;
+ }
+ } else {
+ dataShow = data_priv.access( elem, "fxshow", {} );
+ }
+
+ // store state if its toggle - enables .stop().toggle() to "reverse"
+ if ( toggle ) {
+ dataShow.hidden = !hidden;
+ }
+ if ( hidden ) {
+ jQuery( elem ).show();
+ } else {
+ anim.done(function() {
+ jQuery( elem ).hide();
+ });
+ }
+ anim.done(function() {
+ var prop;
+
+ data_priv.remove( elem, "fxshow" );
+ for ( prop in orig ) {
+ jQuery.style( elem, prop, orig[ prop ] );
+ }
+ });
+ for ( prop in orig ) {
+ tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+ if ( !( prop in dataShow ) ) {
+ dataShow[ prop ] = tween.start;
+ if ( hidden ) {
+ tween.end = tween.start;
+ tween.start = prop === "width" || prop === "height" ? 1 : 0;
+ }
+ }
+ }
+
+ // If this is a noop like .hide().hide(), restore an overwritten display value
+ } else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
+ style.display = display;
+ }
+}
+
+function propFilter( props, specialEasing ) {
+ var index, name, easing, value, hooks;
+
+ // camelCase, specialEasing and expand cssHook pass
+ for ( index in props ) {
+ name = jQuery.camelCase( index );
+ easing = specialEasing[ name ];
+ value = props[ index ];
+ if ( jQuery.isArray( value ) ) {
+ easing = value[ 1 ];
+ value = props[ index ] = value[ 0 ];
+ }
+
+ if ( index !== name ) {
+ props[ name ] = value;
+ delete props[ index ];
+ }
+
+ hooks = jQuery.cssHooks[ name ];
+ if ( hooks && "expand" in hooks ) {
+ value = hooks.expand( value );
+ delete props[ name ];
+
+ // not quite $.extend, this wont overwrite keys already present.
+ // also - reusing 'index' from above because we have the correct "name"
+ for ( index in value ) {
+ if ( !( index in props ) ) {
+ props[ index ] = value[ index ];
+ specialEasing[ index ] = easing;
+ }
+ }
+ } else {
+ specialEasing[ name ] = easing;
+ }
+ }
+}
+
+function Animation( elem, properties, options ) {
+ var result,
+ stopped,
+ index = 0,
+ length = animationPrefilters.length,
+ deferred = jQuery.Deferred().always( function() {
+ // don't match elem in the :animated selector
+ delete tick.elem;
+ }),
+ tick = function() {
+ if ( stopped ) {
+ return false;
+ }
+ var currentTime = fxNow || createFxNow(),
+ remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+ // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+ temp = remaining / animation.duration || 0,
+ percent = 1 - temp,
+ index = 0,
+ length = animation.tweens.length;
+
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( percent );
+ }
+
+ deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+ if ( percent < 1 && length ) {
+ return remaining;
+ } else {
+ deferred.resolveWith( elem, [ animation ] );
+ return false;
+ }
+ },
+ animation = deferred.promise({
+ elem: elem,
+ props: jQuery.extend( {}, properties ),
+ opts: jQuery.extend( true, { specialEasing: {} }, options ),
+ originalProperties: properties,
+ originalOptions: options,
+ startTime: fxNow || createFxNow(),
+ duration: options.duration,
+ tweens: [],
+ createTween: function( prop, end ) {
+ var tween = jQuery.Tween( elem, animation.opts, prop, end,
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.tweens.push( tween );
+ return tween;
+ },
+ stop: function( gotoEnd ) {
+ var index = 0,
+ // if we are going to the end, we want to run all the tweens
+ // otherwise we skip this part
+ length = gotoEnd ? animation.tweens.length : 0;
+ if ( stopped ) {
+ return this;
+ }
+ stopped = true;
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( 1 );
+ }
+
+ // resolve when we played the last frame
+ // otherwise, reject
+ if ( gotoEnd ) {
+ deferred.resolveWith( elem, [ animation, gotoEnd ] );
+ } else {
+ deferred.rejectWith( elem, [ animation, gotoEnd ] );
+ }
+ return this;
+ }
+ }),
+ props = animation.props;
+
+ propFilter( props, animation.opts.specialEasing );
+
+ for ( ; index < length ; index++ ) {
+ result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+ if ( result ) {
+ return result;
+ }
+ }
+
+ jQuery.map( props, createTween, animation );
+
+ if ( jQuery.isFunction( animation.opts.start ) ) {
+ animation.opts.start.call( elem, animation );
+ }
+
+ jQuery.fx.timer(
+ jQuery.extend( tick, {
+ elem: elem,
+ anim: animation,
+ queue: animation.opts.queue
+ })
+ );
+
+ // attach callbacks from options
+ return animation.progress( animation.opts.progress )
+ .done( animation.opts.done, animation.opts.complete )
+ .fail( animation.opts.fail )
+ .always( animation.opts.always );
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+ tweener: function( props, callback ) {
+ if ( jQuery.isFunction( props ) ) {
+ callback = props;
+ props = [ "*" ];
+ } else {
+ props = props.split(" ");
+ }
+
+ var prop,
+ index = 0,
+ length = props.length;
+
+ for ( ; index < length ; index++ ) {
+ prop = props[ index ];
+ tweeners[ prop ] = tweeners[ prop ] || [];
+ tweeners[ prop ].unshift( callback );
+ }
+ },
+
+ prefilter: function( callback, prepend ) {
+ if ( prepend ) {
+ animationPrefilters.unshift( callback );
+ } else {
+ animationPrefilters.push( callback );
+ }
+ }
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+ };
+
+ opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+ // normalize opt.queue - true/undefined/null -> "fx"
+ if ( opt.queue == null || opt.queue === true ) {
+ opt.queue = "fx";
+ }
+
+ // Queueing
+ opt.old = opt.complete;
+
+ opt.complete = function() {
+ if ( jQuery.isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+
+ if ( opt.queue ) {
+ jQuery.dequeue( this, opt.queue );
+ }
+ };
+
+ return opt;
+};
+
+jQuery.fn.extend({
+ fadeTo: function( speed, to, easing, callback ) {
+
+ // show any hidden elements after setting opacity to 0
+ return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+ // animate to the value specified
+ .end().animate({ opacity: to }, speed, easing, callback );
+ },
+ animate: function( prop, speed, easing, callback ) {
+ var empty = jQuery.isEmptyObject( prop ),
+ optall = jQuery.speed( speed, easing, callback ),
+ doAnimation = function() {
+ // Operate on a copy of prop so per-property easing won't be lost
+ var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+ // Empty animations, or finishing resolves immediately
+ if ( empty || data_priv.get( this, "finish" ) ) {
+ anim.stop( true );
+ }
+ };
+ doAnimation.finish = doAnimation;
+
+ return empty || optall.queue === false ?
+ this.each( doAnimation ) :
+ this.queue( optall.queue, doAnimation );
+ },
+ stop: function( type, clearQueue, gotoEnd ) {
+ var stopQueue = function( hooks ) {
+ var stop = hooks.stop;
+ delete hooks.stop;
+ stop( gotoEnd );
+ };
+
+ if ( typeof type !== "string" ) {
+ gotoEnd = clearQueue;
+ clearQueue = type;
+ type = undefined;
+ }
+ if ( clearQueue && type !== false ) {
+ this.queue( type || "fx", [] );
+ }
+
+ return this.each(function() {
+ var dequeue = true,
+ index = type != null && type + "queueHooks",
+ timers = jQuery.timers,
+ data = data_priv.get( this );
+
+ if ( index ) {
+ if ( data[ index ] && data[ index ].stop ) {
+ stopQueue( data[ index ] );
+ }
+ } else {
+ for ( index in data ) {
+ if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+ stopQueue( data[ index ] );
+ }
+ }
+ }
+
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+ timers[ index ].anim.stop( gotoEnd );
+ dequeue = false;
+ timers.splice( index, 1 );
+ }
+ }
+
+ // start the next in the queue if the last step wasn't forced
+ // timers currently will call their complete callbacks, which will dequeue
+ // but only if they were gotoEnd
+ if ( dequeue || !gotoEnd ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ finish: function( type ) {
+ if ( type !== false ) {
+ type = type || "fx";
+ }
+ return this.each(function() {
+ var index,
+ data = data_priv.get( this ),
+ queue = data[ type + "queue" ],
+ hooks = data[ type + "queueHooks" ],
+ timers = jQuery.timers,
+ length = queue ? queue.length : 0;
+
+ // enable finishing flag on private data
+ data.finish = true;
+
+ // empty the queue first
+ jQuery.queue( this, type, [] );
+
+ if ( hooks && hooks.stop ) {
+ hooks.stop.call( this, true );
+ }
+
+ // look for any active animations, and finish them
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+ timers[ index ].anim.stop( true );
+ timers.splice( index, 1 );
+ }
+ }
+
+ // look for any animations in the old queue and finish them
+ for ( index = 0; index < length; index++ ) {
+ if ( queue[ index ] && queue[ index ].finish ) {
+ queue[ index ].finish.call( this );
+ }
+ }
+
+ // turn off finishing flag
+ delete data.finish;
+ });
+ }
+});
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+ var cssFn = jQuery.fn[ name ];
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return speed == null || typeof speed === "boolean" ?
+ cssFn.apply( this, arguments ) :
+ this.animate( genFx( name, true ), speed, easing, callback );
+ };
+});
+
+// Generate shortcuts for custom animations
+jQuery.each({
+ slideDown: genFx("show"),
+ slideUp: genFx("hide"),
+ slideToggle: genFx("toggle"),
+ fadeIn: { opacity: "show" },
+ fadeOut: { opacity: "hide" },
+ fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return this.animate( props, speed, easing, callback );
+ };
+});
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+ var timer,
+ i = 0,
+ timers = jQuery.timers;
+
+ fxNow = jQuery.now();
+
+ for ( ; i < timers.length; i++ ) {
+ timer = timers[ i ];
+ // Checks the timer has not already been removed
+ if ( !timer() && timers[ i ] === timer ) {
+ timers.splice( i--, 1 );
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+ jQuery.timers.push( timer );
+ if ( timer() ) {
+ jQuery.fx.start();
+ } else {
+ jQuery.timers.pop();
+ }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+ if ( !timerId ) {
+ timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+ }
+};
+
+jQuery.fx.stop = function() {
+ clearInterval( timerId );
+ timerId = null;
+};
+
+jQuery.fx.speeds = {
+ slow: 600,
+ fast: 200,
+ // Default speed
+ _default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = setTimeout( next, time );
+ hooks.stop = function() {
+ clearTimeout( timeout );
+ };
+ });
+};
+
+
+(function() {
+ var input = document.createElement( "input" ),
+ select = document.createElement( "select" ),
+ opt = select.appendChild( document.createElement( "option" ) );
+
+ input.type = "checkbox";
+
+ // Support: iOS 5.1, Android 4.x, Android 2.3
+ // Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere)
+ support.checkOn = input.value !== "";
+
+ // Must access the parent to make an option select properly
+ // Support: IE9, IE10
+ support.optSelected = opt.selected;
+
+ // Make sure that the options inside disabled selects aren't marked as disabled
+ // (WebKit marks them as disabled)
+ select.disabled = true;
+ support.optDisabled = !opt.disabled;
+
+ // Check if an input maintains its value after becoming a radio
+ // Support: IE9, IE10
+ input = document.createElement( "input" );
+ input.value = "t";
+ input.type = "radio";
+ support.radioValue = input.value === "t";
+})();
+
+
+var nodeHook, boolHook,
+ attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return access( this, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr: function( name ) {
+ return this.each(function() {
+ jQuery.removeAttr( this, name );
+ });
+ }
+});
+
+jQuery.extend({
+ attr: function( elem, name, value ) {
+ var hooks, ret,
+ nType = elem.nodeType;
+
+ // don't get/set attributes on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( typeof elem.getAttribute === strundefined ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ // All attributes are lowercase
+ // Grab necessary hook if one is defined
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+ name = name.toLowerCase();
+ hooks = jQuery.attrHooks[ name ] ||
+ ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+ }
+
+ if ( value !== undefined ) {
+
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+
+ } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ elem.setAttribute( name, value + "" );
+ return value;
+ }
+
+ } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+ ret = jQuery.find.attr( elem, name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ?
+ undefined :
+ ret;
+ }
+ },
+
+ removeAttr: function( elem, value ) {
+ var name, propName,
+ i = 0,
+ attrNames = value && value.match( rnotwhite );
+
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( (name = attrNames[i++]) ) {
+ propName = jQuery.propFix[ name ] || name;
+
+ // Boolean attributes get special treatment (#10870)
+ if ( jQuery.expr.match.bool.test( name ) ) {
+ // Set corresponding property to false
+ elem[ propName ] = false;
+ }
+
+ elem.removeAttribute( name );
+ }
+ }
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ if ( !support.radioValue && value === "radio" &&
+ jQuery.nodeName( elem, "input" ) ) {
+ // Setting the type on a radio button after the value resets the value in IE6-9
+ // Reset value to default in case type is set after value during creation
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
+ }
+});
+
+// Hooks for boolean attributes
+boolHook = {
+ set: function( elem, value, name ) {
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else {
+ elem.setAttribute( name, name );
+ }
+ return name;
+ }
+};
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+ var getter = attrHandle[ name ] || jQuery.find.attr;
+
+ attrHandle[ name ] = function( elem, name, isXML ) {
+ var ret, handle;
+ if ( !isXML ) {
+ // Avoid an infinite loop by temporarily removing this function from the getter
+ handle = attrHandle[ name ];
+ attrHandle[ name ] = ret;
+ ret = getter( elem, name, isXML ) != null ?
+ name.toLowerCase() :
+ null;
+ attrHandle[ name ] = handle;
+ }
+ return ret;
+ };
+});
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i;
+
+jQuery.fn.extend({
+ prop: function( name, value ) {
+ return access( this, jQuery.prop, name, value, arguments.length > 1 );
+ },
+
+ removeProp: function( name ) {
+ return this.each(function() {
+ delete this[ jQuery.propFix[ name ] || name ];
+ });
+ }
+});
+
+jQuery.extend({
+ propFix: {
+ "for": "htmlFor",
+ "class": "className"
+ },
+
+ prop: function( elem, name, value ) {
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
+ // don't get/set properties on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ if ( notxml ) {
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+ ret :
+ ( elem[ name ] = value );
+
+ } else {
+ return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+ ret :
+ elem[ name ];
+ }
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+ return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
+ elem.tabIndex :
+ -1;
+ }
+ }
+ }
+});
+
+// Support: IE9+
+// Selectedness for an option in an optgroup can be inaccurate
+if ( !support.optSelected ) {
+ jQuery.propHooks.selected = {
+ get: function( elem ) {
+ var parent = elem.parentNode;
+ if ( parent && parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ return null;
+ }
+ };
+}
+
+jQuery.each([
+ "tabIndex",
+ "readOnly",
+ "maxLength",
+ "cellSpacing",
+ "cellPadding",
+ "rowSpan",
+ "colSpan",
+ "useMap",
+ "frameBorder",
+ "contentEditable"
+], function() {
+ jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+
+
+
+var rclass = /[\t\r\n\f]/g;
+
+jQuery.fn.extend({
+ addClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).addClass( value.call( this, j, this.className ) );
+ });
+ }
+
+ if ( proceed ) {
+ // The disjunction here is for better compressibility (see removeClass)
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ " "
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
+ }
+ }
+
+ // only assign if different to avoid unneeded rendering.
+ finalValue = jQuery.trim( cur );
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = arguments.length === 0 || typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).removeClass( value.call( this, j, this.className ) );
+ });
+ }
+ if ( proceed ) {
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ ""
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
+ }
+ }
+
+ // only assign if different to avoid unneeded rendering.
+ finalValue = value ? jQuery.trim( cur ) : "";
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value;
+
+ if ( typeof stateVal === "boolean" && type === "string" ) {
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
+ }
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery( this ),
+ classNames = value.match( rnotwhite ) || [];
+
+ while ( (className = classNames[ i++ ]) ) {
+ // check each className given, space separated list
+ if ( self.hasClass( className ) ) {
+ self.removeClass( className );
+ } else {
+ self.addClass( className );
+ }
+ }
+
+ // Toggle whole class name
+ } else if ( type === strundefined || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ data_priv.set( this, "__className__", this.className );
+ }
+
+ // If the element has a class name or if we're passed "false",
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
+ }
+ });
+ },
+
+ hasClass: function( selector ) {
+ var className = " " + selector + " ",
+ i = 0,
+ l = this.length;
+ for ( ; i < l; i++ ) {
+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+});
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend({
+ val: function( value ) {
+ var hooks, ret, isFunction,
+ elem = this[0];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ return typeof ret === "string" ?
+ // handle most common string cases
+ ret.replace(rreturn, "") :
+ // handle cases where value is null/undef or number
+ ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ isFunction = jQuery.isFunction( value );
+
+ return this.each(function( i ) {
+ var val;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call( this, i, jQuery( this ).val() );
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+
+ } else if ( typeof val === "number" ) {
+ val += "";
+
+ } else if ( jQuery.isArray( val ) ) {
+ val = jQuery.map( val, function( value ) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+ this.value = val;
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ valHooks: {
+ option: {
+ get: function( elem ) {
+ var val = jQuery.find.attr( elem, "value" );
+ return val != null ?
+ val :
+ // Support: IE10-11+
+ // option.text throws exceptions (#14686, #14858)
+ jQuery.trim( jQuery.text( elem ) );
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, option,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one" || index < 0,
+ values = one ? null : [],
+ max = one ? index + 1 : options.length,
+ i = index < 0 ?
+ max :
+ one ? index : 0;
+
+ // Loop through all the selected options
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // IE6-9 doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+ // Don't return options that are disabled or in a disabled optgroup
+ ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) &&
+ ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var optionSet, option,
+ options = elem.options,
+ values = jQuery.makeArray( value ),
+ i = options.length;
+
+ while ( i-- ) {
+ option = options[ i ];
+ if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {
+ optionSet = true;
+ }
+ }
+
+ // force browsers to behave consistently when non-matching value is set
+ if ( !optionSet ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ }
+});
+
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ set: function( elem, value ) {
+ if ( jQuery.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+ }
+ }
+ };
+ if ( !support.checkOn ) {
+ jQuery.valHooks[ this ].get = function( elem ) {
+ // Support: Webkit
+ // "" is returned instead of "on" if a value isn't specified
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ };
+ }
+});
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+});
+
+jQuery.fn.extend({
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ },
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+ }
+});
+
+
+var nonce = jQuery.now();
+
+var rquery = (/\?/);
+
+
+
+// Support: Android 2.3
+// Workaround failure to string-cast null input
+jQuery.parseJSON = function( data ) {
+ return JSON.parse( data + "" );
+};
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+ var xml, tmp;
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+
+ // Support: IE9
+ try {
+ tmp = new DOMParser();
+ xml = tmp.parseFromString( data, "text/xml" );
+ } catch ( e ) {
+ xml = undefined;
+ }
+
+ if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
+ jQuery.error( "Invalid XML: " + data );
+ }
+ return xml;
+};
+
+
+var
+ // Document location
+ ajaxLocParts,
+ ajaxLocation,
+
+ rhash = /#.*$/,
+ rts = /([?&])_=[^&]*/,
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+ // #7653, #8125, #8152: local protocol detection
+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rprotocol = /^\/\//,
+ rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
+
+ /* Prefilters
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+ * 2) These are called:
+ * - BEFORE asking for a transport
+ * - AFTER param serialization (s.data is a string if s.processData is true)
+ * 3) key is the dataType
+ * 4) the catchall symbol "*" can be used
+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+ */
+ prefilters = {},
+
+ /* Transports bindings
+ * 1) key is the dataType
+ * 2) the catchall symbol "*" can be used
+ * 3) selection will start with transport dataType and THEN go to "*" if needed
+ */
+ transports = {},
+
+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+ allTypes = "*/".concat("*");
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+ ajaxLocation = location.href;
+} catch( e ) {
+ // Use the href attribute of an A element
+ // since IE will modify it given document.location
+ ajaxLocation = document.createElement( "a" );
+ ajaxLocation.href = "";
+ ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+ // dataTypeExpression is optional and defaults to "*"
+ return function( dataTypeExpression, func ) {
+
+ if ( typeof dataTypeExpression !== "string" ) {
+ func = dataTypeExpression;
+ dataTypeExpression = "*";
+ }
+
+ var dataType,
+ i = 0,
+ dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
+
+ if ( jQuery.isFunction( func ) ) {
+ // For each dataType in the dataTypeExpression
+ while ( (dataType = dataTypes[i++]) ) {
+ // Prepend if requested
+ if ( dataType[0] === "+" ) {
+ dataType = dataType.slice( 1 ) || "*";
+ (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+ // Otherwise append
+ } else {
+ (structure[ dataType ] = structure[ dataType ] || []).push( func );
+ }
+ }
+ }
+ };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+ var inspected = {},
+ seekingTransport = ( structure === transports );
+
+ function inspect( dataType ) {
+ var selected;
+ inspected[ dataType ] = true;
+ jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+ var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+ if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+ options.dataTypes.unshift( dataTypeOrTransport );
+ inspect( dataTypeOrTransport );
+ return false;
+ } else if ( seekingTransport ) {
+ return !( selected = dataTypeOrTransport );
+ }
+ });
+ return selected;
+ }
+
+ return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+ var key, deep,
+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+ for ( key in src ) {
+ if ( src[ key ] !== undefined ) {
+ ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
+ }
+ }
+ if ( deep ) {
+ jQuery.extend( true, target, deep );
+ }
+
+ return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+ var ct, type, finalDataType, firstDataType,
+ contents = s.contents,
+ dataTypes = s.dataTypes;
+
+ // Remove auto dataType and get content-type in the process
+ while ( dataTypes[ 0 ] === "*" ) {
+ dataTypes.shift();
+ if ( ct === undefined ) {
+ ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+ }
+ }
+
+ // Check if we're dealing with a known content-type
+ if ( ct ) {
+ for ( type in contents ) {
+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
+ dataTypes.unshift( type );
+ break;
+ }
+ }
+ }
+
+ // Check to see if we have a response for the expected dataType
+ if ( dataTypes[ 0 ] in responses ) {
+ finalDataType = dataTypes[ 0 ];
+ } else {
+ // Try convertible dataTypes
+ for ( type in responses ) {
+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+ finalDataType = type;
+ break;
+ }
+ if ( !firstDataType ) {
+ firstDataType = type;
+ }
+ }
+ // Or just use first one
+ finalDataType = finalDataType || firstDataType;
+ }
+
+ // If we found a dataType
+ // We add the dataType to the list if needed
+ // and return the corresponding response
+ if ( finalDataType ) {
+ if ( finalDataType !== dataTypes[ 0 ] ) {
+ dataTypes.unshift( finalDataType );
+ }
+ return responses[ finalDataType ];
+ }
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+ var conv2, current, conv, tmp, prev,
+ converters = {},
+ // Work with a copy of dataTypes in case we need to modify it for conversion
+ dataTypes = s.dataTypes.slice();
+
+ // Create converters map with lowercased keys
+ if ( dataTypes[ 1 ] ) {
+ for ( conv in s.converters ) {
+ converters[ conv.toLowerCase() ] = s.converters[ conv ];
+ }
+ }
+
+ current = dataTypes.shift();
+
+ // Convert to each sequential dataType
+ while ( current ) {
+
+ if ( s.responseFields[ current ] ) {
+ jqXHR[ s.responseFields[ current ] ] = response;
+ }
+
+ // Apply the dataFilter if provided
+ if ( !prev && isSuccess && s.dataFilter ) {
+ response = s.dataFilter( response, s.dataType );
+ }
+
+ prev = current;
+ current = dataTypes.shift();
+
+ if ( current ) {
+
+ // There's only work to do if current dataType is non-auto
+ if ( current === "*" ) {
+
+ current = prev;
+
+ // Convert response if prev dataType is non-auto and differs from current
+ } else if ( prev !== "*" && prev !== current ) {
+
+ // Seek a direct converter
+ conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+ // If none found, seek a pair
+ if ( !conv ) {
+ for ( conv2 in converters ) {
+
+ // If conv2 outputs current
+ tmp = conv2.split( " " );
+ if ( tmp[ 1 ] === current ) {
+
+ // If prev can be converted to accepted input
+ conv = converters[ prev + " " + tmp[ 0 ] ] ||
+ converters[ "* " + tmp[ 0 ] ];
+ if ( conv ) {
+ // Condense equivalence converters
+ if ( conv === true ) {
+ conv = converters[ conv2 ];
+
+ // Otherwise, insert the intermediate dataType
+ } else if ( converters[ conv2 ] !== true ) {
+ current = tmp[ 0 ];
+ dataTypes.unshift( tmp[ 1 ] );
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ // Apply converter (if not an equivalence)
+ if ( conv !== true ) {
+
+ // Unless errors are allowed to bubble, catch and return them
+ if ( conv && s[ "throws" ] ) {
+ response = conv( response );
+ } else {
+ try {
+ response = conv( response );
+ } catch ( e ) {
+ return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return { state: "success", data: response };
+}
+
+jQuery.extend({
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {},
+
+ ajaxSettings: {
+ url: ajaxLocation,
+ type: "GET",
+ isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+ global: true,
+ processData: true,
+ async: true,
+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+ /*
+ timeout: 0,
+ data: null,
+ dataType: null,
+ username: null,
+ password: null,
+ cache: null,
+ throws: false,
+ traditional: false,
+ headers: {},
+ */
+
+ accepts: {
+ "*": allTypes,
+ text: "text/plain",
+ html: "text/html",
+ xml: "application/xml, text/xml",
+ json: "application/json, text/javascript"
+ },
+
+ contents: {
+ xml: /xml/,
+ html: /html/,
+ json: /json/
+ },
+
+ responseFields: {
+ xml: "responseXML",
+ text: "responseText",
+ json: "responseJSON"
+ },
+
+ // Data converters
+ // Keys separate source (or catchall "*") and destination types with a single space
+ converters: {
+
+ // Convert anything to text
+ "* text": String,
+
+ // Text to html (true = no transformation)
+ "text html": true,
+
+ // Evaluate text as a json expression
+ "text json": jQuery.parseJSON,
+
+ // Parse text as xml
+ "text xml": jQuery.parseXML
+ },
+
+ // For options that shouldn't be deep extended:
+ // you can add your own custom options here if
+ // and when you create one that shouldn't be
+ // deep extended (see ajaxExtend)
+ flatOptions: {
+ url: true,
+ context: true
+ }
+ },
+
+ // Creates a full fledged settings object into target
+ // with both ajaxSettings and settings fields.
+ // If target is omitted, writes into ajaxSettings.
+ ajaxSetup: function( target, settings ) {
+ return settings ?
+
+ // Building a settings object
+ ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+ // Extending ajaxSettings
+ ajaxExtend( jQuery.ajaxSettings, target );
+ },
+
+ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+ ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+ // Main method
+ ajax: function( url, options ) {
+
+ // If url is an object, simulate pre-1.5 signature
+ if ( typeof url === "object" ) {
+ options = url;
+ url = undefined;
+ }
+
+ // Force options to be an object
+ options = options || {};
+
+ var transport,
+ // URL without anti-cache param
+ cacheURL,
+ // Response headers
+ responseHeadersString,
+ responseHeaders,
+ // timeout handle
+ timeoutTimer,
+ // Cross-domain detection vars
+ parts,
+ // To know if global events are to be dispatched
+ fireGlobals,
+ // Loop variable
+ i,
+ // Create the final options object
+ s = jQuery.ajaxSetup( {}, options ),
+ // Callbacks context
+ callbackContext = s.context || s,
+ // Context for global events is callbackContext if it is a DOM node or jQuery collection
+ globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+ jQuery( callbackContext ) :
+ jQuery.event,
+ // Deferreds
+ deferred = jQuery.Deferred(),
+ completeDeferred = jQuery.Callbacks("once memory"),
+ // Status-dependent callbacks
+ statusCode = s.statusCode || {},
+ // Headers (they are sent all at once)
+ requestHeaders = {},
+ requestHeadersNames = {},
+ // The jqXHR state
+ state = 0,
+ // Default abort message
+ strAbort = "canceled",
+ // Fake xhr
+ jqXHR = {
+ readyState: 0,
+
+ // Builds headers hashtable if needed
+ getResponseHeader: function( key ) {
+ var match;
+ if ( state === 2 ) {
+ if ( !responseHeaders ) {
+ responseHeaders = {};
+ while ( (match = rheaders.exec( responseHeadersString )) ) {
+ responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+ }
+ }
+ match = responseHeaders[ key.toLowerCase() ];
+ }
+ return match == null ? null : match;
+ },
+
+ // Raw string
+ getAllResponseHeaders: function() {
+ return state === 2 ? responseHeadersString : null;
+ },
+
+ // Caches the header
+ setRequestHeader: function( name, value ) {
+ var lname = name.toLowerCase();
+ if ( !state ) {
+ name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+ requestHeaders[ name ] = value;
+ }
+ return this;
+ },
+
+ // Overrides response content-type header
+ overrideMimeType: function( type ) {
+ if ( !state ) {
+ s.mimeType = type;
+ }
+ return this;
+ },
+
+ // Status-dependent callbacks
+ statusCode: function( map ) {
+ var code;
+ if ( map ) {
+ if ( state < 2 ) {
+ for ( code in map ) {
+ // Lazy-add the new callback in a way that preserves old ones
+ statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+ }
+ } else {
+ // Execute the appropriate callbacks
+ jqXHR.always( map[ jqXHR.status ] );
+ }
+ }
+ return this;
+ },
+
+ // Cancel the request
+ abort: function( statusText ) {
+ var finalText = statusText || strAbort;
+ if ( transport ) {
+ transport.abort( finalText );
+ }
+ done( 0, finalText );
+ return this;
+ }
+ };
+
+ // Attach deferreds
+ deferred.promise( jqXHR ).complete = completeDeferred.add;
+ jqXHR.success = jqXHR.done;
+ jqXHR.error = jqXHR.fail;
+
+ // Remove hash character (#7531: and string promotion)
+ // Add protocol if not provided (prefilters might expect it)
+ // Handle falsy url in the settings object (#10093: consistency with old signature)
+ // We also use the url parameter if available
+ s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
+ .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+ // Alias method option to type as per ticket #12004
+ s.type = options.method || options.type || s.method || s.type;
+
+ // Extract dataTypes list
+ s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
+
+ // A cross-domain request is in order when we have a protocol:host:port mismatch
+ if ( s.crossDomain == null ) {
+ parts = rurl.exec( s.url.toLowerCase() );
+ s.crossDomain = !!( parts &&
+ ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+ ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+ ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+ );
+ }
+
+ // Convert data if not already a string
+ if ( s.data && s.processData && typeof s.data !== "string" ) {
+ s.data = jQuery.param( s.data, s.traditional );
+ }
+
+ // Apply prefilters
+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+ // If request was aborted inside a prefilter, stop there
+ if ( state === 2 ) {
+ return jqXHR;
+ }
+
+ // We can fire global events as of now if asked to
+ fireGlobals = s.global;
+
+ // Watch for a new set of requests
+ if ( fireGlobals && jQuery.active++ === 0 ) {
+ jQuery.event.trigger("ajaxStart");
+ }
+
+ // Uppercase the type
+ s.type = s.type.toUpperCase();
+
+ // Determine if request has content
+ s.hasContent = !rnoContent.test( s.type );
+
+ // Save the URL in case we're toying with the If-Modified-Since
+ // and/or If-None-Match header later on
+ cacheURL = s.url;
+
+ // More options handling for requests with no content
+ if ( !s.hasContent ) {
+
+ // If data is available, append data to url
+ if ( s.data ) {
+ cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+ // #9682: remove data so that it's not used in an eventual retry
+ delete s.data;
+ }
+
+ // Add anti-cache in url if needed
+ if ( s.cache === false ) {
+ s.url = rts.test( cacheURL ) ?
+
+ // If there is already a '_' parameter, set its value
+ cacheURL.replace( rts, "$1_=" + nonce++ ) :
+
+ // Otherwise add one to the end
+ cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
+ }
+ }
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ if ( jQuery.lastModified[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+ }
+ if ( jQuery.etag[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+ }
+ }
+
+ // Set the correct header, if data is being sent
+ if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+ jqXHR.setRequestHeader( "Content-Type", s.contentType );
+ }
+
+ // Set the Accepts header for the server, depending on the dataType
+ jqXHR.setRequestHeader(
+ "Accept",
+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+ s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+ s.accepts[ "*" ]
+ );
+
+ // Check for headers option
+ for ( i in s.headers ) {
+ jqXHR.setRequestHeader( i, s.headers[ i ] );
+ }
+
+ // Allow custom headers/mimetypes and early abort
+ if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+ // Abort if not done already and return
+ return jqXHR.abort();
+ }
+
+ // aborting is no longer a cancellation
+ strAbort = "abort";
+
+ // Install callbacks on deferreds
+ for ( i in { success: 1, error: 1, complete: 1 } ) {
+ jqXHR[ i ]( s[ i ] );
+ }
+
+ // Get transport
+ transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+ // If no transport, we auto-abort
+ if ( !transport ) {
+ done( -1, "No Transport" );
+ } else {
+ jqXHR.readyState = 1;
+
+ // Send global event
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+ }
+ // Timeout
+ if ( s.async && s.timeout > 0 ) {
+ timeoutTimer = setTimeout(function() {
+ jqXHR.abort("timeout");
+ }, s.timeout );
+ }
+
+ try {
+ state = 1;
+ transport.send( requestHeaders, done );
+ } catch ( e ) {
+ // Propagate exception as error if not done
+ if ( state < 2 ) {
+ done( -1, e );
+ // Simply rethrow otherwise
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ // Callback for when everything is done
+ function done( status, nativeStatusText, responses, headers ) {
+ var isSuccess, success, error, response, modified,
+ statusText = nativeStatusText;
+
+ // Called once
+ if ( state === 2 ) {
+ return;
+ }
+
+ // State is "done" now
+ state = 2;
+
+ // Clear timeout if it exists
+ if ( timeoutTimer ) {
+ clearTimeout( timeoutTimer );
+ }
+
+ // Dereference transport for early garbage collection
+ // (no matter how long the jqXHR object will be used)
+ transport = undefined;
+
+ // Cache response headers
+ responseHeadersString = headers || "";
+
+ // Set readyState
+ jqXHR.readyState = status > 0 ? 4 : 0;
+
+ // Determine if successful
+ isSuccess = status >= 200 && status < 300 || status === 304;
+
+ // Get response data
+ if ( responses ) {
+ response = ajaxHandleResponses( s, jqXHR, responses );
+ }
+
+ // Convert no matter what (that way responseXXX fields are always set)
+ response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+ // If successful, handle type chaining
+ if ( isSuccess ) {
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ modified = jqXHR.getResponseHeader("Last-Modified");
+ if ( modified ) {
+ jQuery.lastModified[ cacheURL ] = modified;
+ }
+ modified = jqXHR.getResponseHeader("etag");
+ if ( modified ) {
+ jQuery.etag[ cacheURL ] = modified;
+ }
+ }
+
+ // if no content
+ if ( status === 204 || s.type === "HEAD" ) {
+ statusText = "nocontent";
+
+ // if not modified
+ } else if ( status === 304 ) {
+ statusText = "notmodified";
+
+ // If we have data, let's convert it
+ } else {
+ statusText = response.state;
+ success = response.data;
+ error = response.error;
+ isSuccess = !error;
+ }
+ } else {
+ // We extract error from statusText
+ // then normalize statusText and status for non-aborts
+ error = statusText;
+ if ( status || !statusText ) {
+ statusText = "error";
+ if ( status < 0 ) {
+ status = 0;
+ }
+ }
+ }
+
+ // Set data for the fake xhr object
+ jqXHR.status = status;
+ jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+ // Success/Error
+ if ( isSuccess ) {
+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+ } else {
+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+ }
+
+ // Status-dependent callbacks
+ jqXHR.statusCode( statusCode );
+ statusCode = undefined;
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+ [ jqXHR, s, isSuccess ? success : error ] );
+ }
+
+ // Complete
+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+ // Handle the global AJAX counter
+ if ( !( --jQuery.active ) ) {
+ jQuery.event.trigger("ajaxStop");
+ }
+ }
+ }
+
+ return jqXHR;
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get( url, data, callback, "json" );
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get( url, undefined, callback, "script" );
+ }
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+ jQuery[ method ] = function( url, data, callback, type ) {
+ // shift arguments if data argument was omitted
+ if ( jQuery.isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = undefined;
+ }
+
+ return jQuery.ajax({
+ url: url,
+ type: method,
+ dataType: type,
+ data: data,
+ success: callback
+ });
+ };
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
+ jQuery.fn[ type ] = function( fn ) {
+ return this.on( type, fn );
+ };
+});
+
+
+jQuery._evalUrl = function( url ) {
+ return jQuery.ajax({
+ url: url,
+ type: "GET",
+ dataType: "script",
+ async: false,
+ global: false,
+ "throws": true
+ });
+};
+
+
+jQuery.fn.extend({
+ wrapAll: function( html ) {
+ var wrap;
+
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( html.call(this, i) );
+ });
+ }
+
+ if ( this[ 0 ] ) {
+
+ // The elements to wrap the target around
+ wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+ if ( this[ 0 ].parentNode ) {
+ wrap.insertBefore( this[ 0 ] );
+ }
+
+ wrap.map(function() {
+ var elem = this;
+
+ while ( elem.firstElementChild ) {
+ elem = elem.firstElementChild;
+ }
+
+ return elem;
+ }).append( this );
+ }
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapInner( html.call(this, i) );
+ });
+ }
+
+ return this.each(function() {
+ var self = jQuery( this ),
+ contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
+ }
+ });
+ },
+
+ wrap: function( html ) {
+ var isFunction = jQuery.isFunction( html );
+
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+ });
+ },
+
+ unwrap: function() {
+ return this.parent().each(function() {
+ if ( !jQuery.nodeName( this, "body" ) ) {
+ jQuery( this ).replaceWith( this.childNodes );
+ }
+ }).end();
+ }
+});
+
+
+jQuery.expr.filters.hidden = function( elem ) {
+ // Support: Opera <= 12.12
+ // Opera reports offsetWidths and offsetHeights less than zero on some elements
+ return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
+};
+jQuery.expr.filters.visible = function( elem ) {
+ return !jQuery.expr.filters.hidden( elem );
+};
+
+
+
+
+var r20 = /%20/g,
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+ var name;
+
+ if ( jQuery.isArray( obj ) ) {
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || rbracket.test( prefix ) ) {
+ // Treat each array item as a scalar.
+ add( prefix, v );
+
+ } else {
+ // Item is non-scalar (array or object), encode its numeric index.
+ buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+ }
+ });
+
+ } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+ // Serialize object item.
+ for ( name in obj ) {
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+ }
+
+ } else {
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+ var prefix,
+ s = [],
+ add = function( key, value ) {
+ // If value is a function, invoke it and return its value
+ value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+ s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+ };
+
+ // Set traditional to true for jQuery <= 1.3.2 behavior.
+ if ( traditional === undefined ) {
+ traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ });
+
+ } else {
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( prefix in a ) {
+ buildParams( prefix, a[ prefix ], traditional, add );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join( "&" ).replace( r20, "+" );
+};
+
+jQuery.fn.extend({
+ serialize: function() {
+ return jQuery.param( this.serializeArray() );
+ },
+ serializeArray: function() {
+ return this.map(function() {
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop( this, "elements" );
+ return elements ? jQuery.makeArray( elements ) : this;
+ })
+ .filter(function() {
+ var type = this.type;
+
+ // Use .is( ":disabled" ) so that fieldset[disabled] works
+ return this.name && !jQuery( this ).is( ":disabled" ) &&
+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+ ( this.checked || !rcheckableType.test( type ) );
+ })
+ .map(function( i, elem ) {
+ var val = jQuery( this ).val();
+
+ return val == null ?
+ null :
+ jQuery.isArray( val ) ?
+ jQuery.map( val, function( val ) {
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }) :
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }).get();
+ }
+});
+
+
+jQuery.ajaxSettings.xhr = function() {
+ try {
+ return new XMLHttpRequest();
+ } catch( e ) {}
+};
+
+var xhrId = 0,
+ xhrCallbacks = {},
+ xhrSuccessStatus = {
+ // file protocol always yields status code 0, assume 200
+ 0: 200,
+ // Support: IE9
+ // #1450: sometimes IE returns 1223 when it should be 204
+ 1223: 204
+ },
+ xhrSupported = jQuery.ajaxSettings.xhr();
+
+// Support: IE9
+// Open requests must be manually aborted on unload (#5280)
+if ( window.ActiveXObject ) {
+ jQuery( window ).on( "unload", function() {
+ for ( var key in xhrCallbacks ) {
+ xhrCallbacks[ key ]();
+ }
+ });
+}
+
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport(function( options ) {
+ var callback;
+
+ // Cross domain only allowed if supported through XMLHttpRequest
+ if ( support.cors || xhrSupported && !options.crossDomain ) {
+ return {
+ send: function( headers, complete ) {
+ var i,
+ xhr = options.xhr(),
+ id = ++xhrId;
+
+ xhr.open( options.type, options.url, options.async, options.username, options.password );
+
+ // Apply custom fields if provided
+ if ( options.xhrFields ) {
+ for ( i in options.xhrFields ) {
+ xhr[ i ] = options.xhrFields[ i ];
+ }
+ }
+
+ // Override mime type if needed
+ if ( options.mimeType && xhr.overrideMimeType ) {
+ xhr.overrideMimeType( options.mimeType );
+ }
+
+ // X-Requested-With header
+ // For cross-domain requests, seeing as conditions for a preflight are
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
+ // (it can always be set on a per-request basis or even using ajaxSetup)
+ // For same-domain requests, won't change header if already provided.
+ if ( !options.crossDomain && !headers["X-Requested-With"] ) {
+ headers["X-Requested-With"] = "XMLHttpRequest";
+ }
+
+ // Set headers
+ for ( i in headers ) {
+ xhr.setRequestHeader( i, headers[ i ] );
+ }
+
+ // Callback
+ callback = function( type ) {
+ return function() {
+ if ( callback ) {
+ delete xhrCallbacks[ id ];
+ callback = xhr.onload = xhr.onerror = null;
+
+ if ( type === "abort" ) {
+ xhr.abort();
+ } else if ( type === "error" ) {
+ complete(
+ // file: protocol always yields status 0; see #8605, #14207
+ xhr.status,
+ xhr.statusText
+ );
+ } else {
+ complete(
+ xhrSuccessStatus[ xhr.status ] || xhr.status,
+ xhr.statusText,
+ // Support: IE9
+ // Accessing binary-data responseText throws an exception
+ // (#11426)
+ typeof xhr.responseText === "string" ? {
+ text: xhr.responseText
+ } : undefined,
+ xhr.getAllResponseHeaders()
+ );
+ }
+ }
+ };
+ };
+
+ // Listen to events
+ xhr.onload = callback();
+ xhr.onerror = callback("error");
+
+ // Create the abort callback
+ callback = xhrCallbacks[ id ] = callback("abort");
+
+ try {
+ // Do send the request (this may raise an exception)
+ xhr.send( options.hasContent && options.data || null );
+ } catch ( e ) {
+ // #14683: Only rethrow if this hasn't been notified as an error yet
+ if ( callback ) {
+ throw e;
+ }
+ }
+ },
+
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+ accepts: {
+ script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+ },
+ contents: {
+ script: /(?:java|ecma)script/
+ },
+ converters: {
+ "text script": function( text ) {
+ jQuery.globalEval( text );
+ return text;
+ }
+ }
+});
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+ if ( s.cache === undefined ) {
+ s.cache = false;
+ }
+ if ( s.crossDomain ) {
+ s.type = "GET";
+ }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+ // This transport only deals with cross domain requests
+ if ( s.crossDomain ) {
+ var script, callback;
+ return {
+ send: function( _, complete ) {
+ script = jQuery("<script>").prop({
+ async: true,
+ charset: s.scriptCharset,
+ src: s.url
+ }).on(
+ "load error",
+ callback = function( evt ) {
+ script.remove();
+ callback = null;
+ if ( evt ) {
+ complete( evt.type === "error" ? 404 : 200, evt.type );
+ }
+ }
+ );
+ document.head.appendChild( script[ 0 ] );
+ },
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+var oldCallbacks = [],
+ rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+ jsonp: "callback",
+ jsonpCallback: function() {
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+ this[ callback ] = true;
+ return callback;
+ }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+ var callbackName, overwritten, responseContainer,
+ jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+ "url" :
+ typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+ );
+
+ // Handle iff the expected data type is "jsonp" or we have a parameter to set
+ if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+ // Get callback name, remembering preexisting value associated with it
+ callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+ s.jsonpCallback() :
+ s.jsonpCallback;
+
+ // Insert callback into url or form data
+ if ( jsonProp ) {
+ s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+ } else if ( s.jsonp !== false ) {
+ s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+ }
+
+ // Use data converter to retrieve json after script execution
+ s.converters["script json"] = function() {
+ if ( !responseContainer ) {
+ jQuery.error( callbackName + " was not called" );
+ }
+ return responseContainer[ 0 ];
+ };
+
+ // force json dataType
+ s.dataTypes[ 0 ] = "json";
+
+ // Install callback
+ overwritten = window[ callbackName ];
+ window[ callbackName ] = function() {
+ responseContainer = arguments;
+ };
+
+ // Clean-up function (fires after converters)
+ jqXHR.always(function() {
+ // Restore preexisting value
+ window[ callbackName ] = overwritten;
+
+ // Save back as free
+ if ( s[ callbackName ] ) {
+ // make sure that re-using the options doesn't screw things around
+ s.jsonpCallback = originalSettings.jsonpCallback;
+
+ // save the callback name for future use
+ oldCallbacks.push( callbackName );
+ }
+
+ // Call if it was a function and we have a response
+ if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+ overwritten( responseContainer[ 0 ] );
+ }
+
+ responseContainer = overwritten = undefined;
+ });
+
+ // Delegate to script
+ return "script";
+ }
+});
+
+
+
+
+// data: string of html
+// context (optional): If specified, the fragment will be created in this context, defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+ if ( typeof context === "boolean" ) {
+ keepScripts = context;
+ context = false;
+ }
+ context = context || document;
+
+ var parsed = rsingleTag.exec( data ),
+ scripts = !keepScripts && [];
+
+ // Single tag
+ if ( parsed ) {
+ return [ context.createElement( parsed[1] ) ];
+ }
+
+ parsed = jQuery.buildFragment( [ data ], context, scripts );
+
+ if ( scripts && scripts.length ) {
+ jQuery( scripts ).remove();
+ }
+
+ return jQuery.merge( [], parsed.childNodes );
+};
+
+
+// Keep a copy of the old load method
+var _load = jQuery.fn.load;
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+ if ( typeof url !== "string" && _load ) {
+ return _load.apply( this, arguments );
+ }
+
+ var selector, type, response,
+ self = this,
+ off = url.indexOf(" ");
+
+ if ( off >= 0 ) {
+ selector = jQuery.trim( url.slice( off ) );
+ url = url.slice( 0, off );
+ }
+
+ // If it's a function
+ if ( jQuery.isFunction( params ) ) {
+
+ // We assume that it's the callback
+ callback = params;
+ params = undefined;
+
+ // Otherwise, build a param string
+ } else if ( params && typeof params === "object" ) {
+ type = "POST";
+ }
+
+ // If we have elements to modify, make the request
+ if ( self.length > 0 ) {
+ jQuery.ajax({
+ url: url,
+
+ // if "type" variable is undefined, then "GET" method will be used
+ type: type,
+ dataType: "html",
+ data: params
+ }).done(function( responseText ) {
+
+ // Save response for use in complete callback
+ response = arguments;
+
+ self.html( selector ?
+
+ // If a selector was specified, locate the right elements in a dummy div
+ // Exclude scripts to avoid IE 'Permission Denied' errors
+ jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+ // Otherwise use the full result
+ responseText );
+
+ }).complete( callback && function( jqXHR, status ) {
+ self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+ });
+ }
+
+ return this;
+};
+
+
+
+
+jQuery.expr.filters.animated = function( elem ) {
+ return jQuery.grep(jQuery.timers, function( fn ) {
+ return elem === fn.elem;
+ }).length;
+};
+
+
+
+
+var docElem = window.document.documentElement;
+
+/**
+ * Gets a window from an element
+ */
+function getWindow( elem ) {
+ return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
+}
+
+jQuery.offset = {
+ setOffset: function( elem, options, i ) {
+ var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+ position = jQuery.css( elem, "position" ),
+ curElem = jQuery( elem ),
+ props = {};
+
+ // Set position first, in-case top/left are set even on static elem
+ if ( position === "static" ) {
+ elem.style.position = "relative";
+ }
+
+ curOffset = curElem.offset();
+ curCSSTop = jQuery.css( elem, "top" );
+ curCSSLeft = jQuery.css( elem, "left" );
+ calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+ ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
+
+ // Need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+ if ( calculatePosition ) {
+ curPosition = curElem.position();
+ curTop = curPosition.top;
+ curLeft = curPosition.left;
+
+ } else {
+ curTop = parseFloat( curCSSTop ) || 0;
+ curLeft = parseFloat( curCSSLeft ) || 0;
+ }
+
+ if ( jQuery.isFunction( options ) ) {
+ options = options.call( elem, i, curOffset );
+ }
+
+ if ( options.top != null ) {
+ props.top = ( options.top - curOffset.top ) + curTop;
+ }
+ if ( options.left != null ) {
+ props.left = ( options.left - curOffset.left ) + curLeft;
+ }
+
+ if ( "using" in options ) {
+ options.using.call( elem, props );
+
+ } else {
+ curElem.css( props );
+ }
+ }
+};
+
+jQuery.fn.extend({
+ offset: function( options ) {
+ if ( arguments.length ) {
+ return options === undefined ?
+ this :
+ this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ var docElem, win,
+ elem = this[ 0 ],
+ box = { top: 0, left: 0 },
+ doc = elem && elem.ownerDocument;
+
+ if ( !doc ) {
+ return;
+ }
+
+ docElem = doc.documentElement;
+
+ // Make sure it's not a disconnected DOM node
+ if ( !jQuery.contains( docElem, elem ) ) {
+ return box;
+ }
+
+ // If we don't have gBCR, just use 0,0 rather than error
+ // BlackBerry 5, iOS 3 (original iPhone)
+ if ( typeof elem.getBoundingClientRect !== strundefined ) {
+ box = elem.getBoundingClientRect();
+ }
+ win = getWindow( doc );
+ return {
+ top: box.top + win.pageYOffset - docElem.clientTop,
+ left: box.left + win.pageXOffset - docElem.clientLeft
+ };
+ },
+
+ position: function() {
+ if ( !this[ 0 ] ) {
+ return;
+ }
+
+ var offsetParent, offset,
+ elem = this[ 0 ],
+ parentOffset = { top: 0, left: 0 };
+
+ // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
+ if ( jQuery.css( elem, "position" ) === "fixed" ) {
+ // We assume that getBoundingClientRect is available when computed position is fixed
+ offset = elem.getBoundingClientRect();
+
+ } else {
+ // Get *real* offsetParent
+ offsetParent = this.offsetParent();
+
+ // Get correct offsets
+ offset = this.offset();
+ if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+ parentOffset = offsetParent.offset();
+ }
+
+ // Add offsetParent borders
+ parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+ parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+ }
+
+ // Subtract parent offsets and element margins
+ return {
+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+ };
+ },
+
+ offsetParent: function() {
+ return this.map(function() {
+ var offsetParent = this.offsetParent || docElem;
+
+ while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
+ offsetParent = offsetParent.offsetParent;
+ }
+
+ return offsetParent || docElem;
+ });
+ }
+});
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+ var top = "pageYOffset" === prop;
+
+ jQuery.fn[ method ] = function( val ) {
+ return access( this, function( elem, method, val ) {
+ var win = getWindow( elem );
+
+ if ( val === undefined ) {
+ return win ? win[ prop ] : elem[ method ];
+ }
+
+ if ( win ) {
+ win.scrollTo(
+ !top ? val : window.pageXOffset,
+ top ? val : window.pageYOffset
+ );
+
+ } else {
+ elem[ method ] = val;
+ }
+ }, method, val, arguments.length, null );
+ };
+});
+
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// getComputedStyle returns percent when specified for top/left/bottom/right
+// rather than make the css module depend on the offset module, we just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+ jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+ function( elem, computed ) {
+ if ( computed ) {
+ computed = curCSS( elem, prop );
+ // if curCSS returns percentage, fallback to offset
+ return rnumnonpx.test( computed ) ?
+ jQuery( elem ).position()[ prop ] + "px" :
+ computed;
+ }
+ }
+ );
+});
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+ jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+ // margin is only for outerHeight, outerWidth
+ jQuery.fn[ funcName ] = function( margin, value ) {
+ var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+ extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+ return access( this, function( elem, type, value ) {
+ var doc;
+
+ if ( jQuery.isWindow( elem ) ) {
+ // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+ // isn't a whole lot we can do. See pull request at this URL for discussion:
+ // https://github.com/jquery/jquery/pull/764
+ return elem.document.documentElement[ "client" + name ];
+ }
+
+ // Get document width or height
+ if ( elem.nodeType === 9 ) {
+ doc = elem.documentElement;
+
+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+ // whichever is greatest
+ return Math.max(
+ elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+ elem.body[ "offset" + name ], doc[ "offset" + name ],
+ doc[ "client" + name ]
+ );
+ }
+
+ return value === undefined ?
+ // Get width or height on the element, requesting but not forcing parseFloat
+ jQuery.css( elem, type, extra ) :
+
+ // Set width or height on the element
+ jQuery.style( elem, type, value, extra );
+ }, type, chainable ? margin : undefined, chainable, null );
+ };
+ });
+});
+
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+ return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+ define( "jquery", [], function() {
+ return jQuery;
+ });
+}
+
+
+
+
+var
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
+
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in
+// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( typeof noGlobal === strundefined ) {
+ window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+
+}));
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/README b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/README
new file mode 100644
index 0000000..a8c11c4
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/README
@@ -0,0 +1,14 @@
+The following is the license information for the file jquery-src.js
+/*!
+ * jQuery JavaScript Library v2.1.1
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-05-01T17:11Z
+ */
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/jquery-src.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/jquery-src.js
new file mode 100644
index 0000000..9f7b3d3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/jquery-src.js
@@ -0,0 +1,9190 @@
+/*!
+ * jQuery JavaScript Library v2.1.1
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-05-01T17:11Z
+ */
+
+(function( global, factory ) {
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+ // For CommonJS and CommonJS-like environments where a proper window is present,
+ // execute the factory and get jQuery
+ // For environments that do not inherently posses a window with a document
+ // (such as Node.js), expose a jQuery-making factory as module.exports
+ // This accentuates the need for the creation of a real window
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//
+
+var arr = [];
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
+
+
+
+var
+ // Use the correct document accordingly with window argument (sandbox)
+ document = window.document,
+
+ version = "2.1.1",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android<4.1
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ };
+
+jQuery.fn = jQuery.prototype = {
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // Start with an empty selector
+ selector: "",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num != null ?
+
+ // Return just the one element from the set
+ ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+
+ // Return all the elements in a clean array
+ slice.call( this );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+ target = {};
+ }
+
+ // extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+ // Only deal with non-null/undefined values
+ if ( (options = arguments[ i ]) != null ) {
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend({
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ // See test/unit/core.js for details concerning isFunction.
+ // Since version 1.3, DOM methods and functions like alert
+ // aren't supported. They return false on IE (#2968).
+ isFunction: function( obj ) {
+ return jQuery.type(obj) === "function";
+ },
+
+ isArray: Array.isArray,
+
+ isWindow: function( obj ) {
+ return obj != null && obj === obj.window;
+ },
+
+ isNumeric: function( obj ) {
+ // parseFloat NaNs numeric-cast false positives (null|true|false|"")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0;
+ },
+
+ isPlainObject: function( obj ) {
+ // Not plain objects:
+ // - Any object or value whose internal [[Class]] property is not "[object Object]"
+ // - DOM nodes
+ // - window
+ if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.constructor &&
+ !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
+ return false;
+ }
+
+ // If the function hasn't returned already, we're confident that
+ // |obj| is a plain object, created by {} or constructed with new Object
+ return true;
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+ // Support: Android < 4.0, iOS < 6 (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call(obj) ] || "object" :
+ typeof obj;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function( code ) {
+ var script,
+ indirect = eval;
+
+ code = jQuery.trim( code );
+
+ if ( code ) {
+ // If the code includes a valid, prologue position
+ // strict mode pragma, execute code by injecting a
+ // script tag into the document.
+ if ( code.indexOf("use strict") === 1 ) {
+ script = document.createElement("script");
+ script.text = code;
+ document.head.appendChild( script ).parentNode.removeChild( script );
+ } else {
+ // Otherwise, avoid the DOM node creation, insertion
+ // and removal by using an indirect global eval
+ indirect( code );
+ }
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ // args is for internal usage only
+ each: function( obj, callback, args ) {
+ var value,
+ i = 0,
+ length = obj.length,
+ isArray = isArraylike( obj );
+
+ if ( args ) {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android<4.1
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArraylike( Object(arr) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var value,
+ i = 0,
+ length = elems.length,
+ isArray = isArraylike( elems ),
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ now: Date.now,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+ var length = obj.length,
+ type = jQuery.type( obj );
+
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.nodeType === 1 && length ) {
+ return true;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v1.10.19
+ * http://sizzlejs.com/
+ *
+ * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-04-18
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + -(new Date()),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // General-purpose constants
+ strundefined = typeof undefined,
+ MAX_NEGATIVE = 1 << 31,
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf if we can't use a native one
+ indexOf = arr.indexOf || function( elem ) {
+ var i = 0,
+ len = this.length;
+ for ( ; i < len; i++ ) {
+ if ( this[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+ // http://www.w3.org/TR/css3-syntax/#characters
+ characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+ // Loosely modeled on CSS identifier characters
+ // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+ // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = characterEncoding.replace( "w", "w#" ),
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + characterEncoding + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+ "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+ "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+ rescape = /'|\\/g,
+
+ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ };
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var match, elem, m, nodeType,
+ // QSA vars
+ i, groups, old, nid, newContext, newSelector;
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+
+ context = context || document;
+ results = results || [];
+
+ if ( !selector || typeof selector !== "string" ) {
+ return results;
+ }
+
+ if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+ return [];
+ }
+
+ if ( documentIsHTML && !seed ) {
+
+ // Shortcuts
+ if ( (match = rquickExpr.exec( selector )) ) {
+ // Speed-up: Sizzle("#ID")
+ if ( (m = match[1]) ) {
+ if ( nodeType === 9 ) {
+ elem = context.getElementById( m );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document (jQuery #6963)
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE, Opera, and Webkit return items
+ // by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+ } else {
+ // Context is not a document
+ if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+ contains( context, elem ) && elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Speed-up: Sizzle("TAG")
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Speed-up: Sizzle(".CLASS")
+ } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // QSA path
+ if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+ nid = old = expando;
+ newContext = context;
+ newSelector = nodeType === 9 && selector;
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+ groups = tokenize( selector );
+
+ if ( (old = context.getAttribute("id")) ) {
+ nid = old.replace( rescape, "\\$&" );
+ } else {
+ context.setAttribute( "id", nid );
+ }
+ nid = "[id='" + nid + "'] ";
+
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = nid + toSelector( groups[i] );
+ }
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
+ newSelector = groups.join(",");
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch(qsaError) {
+ } finally {
+ if ( !old ) {
+ context.removeAttribute("id");
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+ var div = document.createElement("div");
+
+ try {
+ return !!fn( div );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( div.parentNode ) {
+ div.parentNode.removeChild( div );
+ }
+ // release memory in IE
+ div = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = attrs.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ ( ~b.sourceIndex || MAX_NEGATIVE ) -
+ ( ~a.sourceIndex || MAX_NEGATIVE );
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== strundefined && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare,
+ doc = node ? node.ownerDocument || node : preferredDoc,
+ parent = doc.defaultView;
+
+ // If no document and documentElement is available, return
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Set our document
+ document = doc;
+ docElem = doc.documentElement;
+
+ // Support tests
+ documentIsHTML = !isXML( doc );
+
+ // Support: IE>8
+ // If iframe document is assigned to "document" variable and if iframe has been reloaded,
+ // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+ // IE6-8 do not support the defaultView property so parent will be undefined
+ if ( parent && parent !== parent.top ) {
+ // IE11 does not have attachEvent, so all must suffer
+ if ( parent.addEventListener ) {
+ parent.addEventListener( "unload", function() {
+ setDocument();
+ }, false );
+ } else if ( parent.attachEvent ) {
+ parent.attachEvent( "onunload", function() {
+ setDocument();
+ });
+ }
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+ support.attributes = assert(function( div ) {
+ div.className = "i";
+ return !div.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( div ) {
+ div.appendChild( doc.createComment("") );
+ return !div.getElementsByTagName("*").length;
+ });
+
+ // Check if getElementsByClassName can be trusted
+ support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {
+ div.innerHTML = "<div class='a'></div><div class='a i'></div>";
+
+ // Support: Safari<4
+ // Catch class over-caching
+ div.firstChild.className = "i";
+ // Support: Opera<10
+ // Catch gEBCN failure to find non-leading classes
+ return div.getElementsByClassName("i").length === 2;
+ });
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( div ) {
+ docElem.appendChild( div ).id = expando;
+ return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+ });
+
+ // ID find and filter
+ if ( support.getById ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+ var m = context.getElementById( id );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [ m ] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ } else {
+ // Support: IE6/7
+ // getElementById is not reliable as a find shortcut
+ delete Expr.find["ID"];
+
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== strundefined ) {
+ return context.getElementsByTagName( tag );
+ }
+ } :
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See http://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( div ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // http://bugs.jquery.com/ticket/12359
+ div.innerHTML = "<select msallowclip=''><option selected=''></option></select>";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( div.querySelectorAll("[msallowclip^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !div.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+ });
+
+ assert(function( div ) {
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = doc.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ div.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( div.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":enabled").length ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( div ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( div, "div" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( div, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully does not implement inclusive descendent
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === doc ? -1 :
+ b === doc ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return doc;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch(e) {}
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, outerCache, node, diff, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+ // Seek `elem` from a previously-cached index
+ outerCache = parent[ expando ] || (parent[ expando ] = {});
+ cache = outerCache[ type ] || [];
+ nodeIndex = cache[0] === dirruns && cache[1];
+ diff = cache[0] === dirruns && cache[2];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ // Use previously-cached element index if available
+ } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+ diff = cache[1];
+
+ // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ } else {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf.call( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": function( elem ) {
+ return elem.disabled === false;
+ },
+
+ "disabled": function( elem ) {
+ return elem.disabled === true;
+ },
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ checkNonElements = base && dir === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+ if ( (oldCache = outerCache[ dir ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ outerCache[ dir ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf.call( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context !== document && context;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context, xml ) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // Apply set filters to unmatched elements
+ matchedCount += i;
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is no seed and only one group
+ if ( match.length === 1 ) {
+
+ // Take a shortcut and set the context if the root selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome<14
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+ // Should return 1, but returns 4 (following)
+ return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+ div.innerHTML = "<a href='#'></a>";
+ return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+ div.innerHTML = "<input/>";
+ div.firstChild.setAttribute( "value", "" );
+ return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+ return div.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ /* jshint -W018 */
+ return !!qualifier.call( elem, i, elem ) !== not;
+ });
+
+ }
+
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ });
+
+ }
+
+ if ( typeof qualifier === "string" ) {
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ qualifier = jQuery.filter( qualifier, elements );
+ }
+
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
+ });
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 && elem.nodeType === 1 ?
+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ }));
+};
+
+jQuery.fn.extend({
+ find: function( selector ) {
+ var i,
+ len = this.length,
+ ret = [],
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter(function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ }) );
+ }
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+ ret.selector = this.selector ? this.selector + " " + selector : selector;
+ return ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], false) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], true) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+});
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ init = jQuery.fn.init = function( selector, context ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ context = context instanceof jQuery ? context[0] : context;
+
+ // scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[1],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[2] );
+
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if ( elem && elem.parentNode ) {
+ // Inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || rootjQuery ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return typeof rootjQuery.ready !== "undefined" ?
+ rootjQuery.ready( selector ) :
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+ // methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.extend({
+ dir: function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+ },
+
+ sibling: function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+ }
+});
+
+jQuery.fn.extend({
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter(function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[i] ) ) {
+ return true;
+ }
+ }
+ });
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( ; i < l; i++ ) {
+ for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && (pos ?
+ pos.index(cur) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector(cur, selectors)) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
+ },
+
+ // Determine the position of an element within
+ // the matched set of elements
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.unique(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter(selector)
+ );
+ }
+});
+
+function sibling( cur, dir ) {
+ while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each({
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return jQuery.dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return jQuery.dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return jQuery.dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return jQuery.sibling( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.unique( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+});
+var rnotwhite = (/\S+/g);
+
+
+
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+ var object = optionsCache[ options ] = {};
+ jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ });
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ ( optionsCache[ options ] || createOptions( options ) ) :
+ jQuery.extend( {}, options );
+
+ var // Last fire value (for non-forgettable lists)
+ memory,
+ // Flag to know if list was already fired
+ fired,
+ // Flag to know if list is currently firing
+ firing,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
+ // End of the loop when firing
+ firingLength,
+ // Index of currently firing callback (modified by remove if needed)
+ firingIndex,
+ // Actual callback list
+ list = [],
+ // Stack of fire calls for repeatable lists
+ stack = !options.once && [],
+ // Fire callbacks
+ fire = function( data ) {
+ memory = options.memory && data;
+ fired = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ firing = true;
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+ if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+ memory = false; // To prevent further calls using add
+ break;
+ }
+ }
+ firing = false;
+ if ( list ) {
+ if ( stack ) {
+ if ( stack.length ) {
+ fire( stack.shift() );
+ }
+ } else if ( memory ) {
+ list = [];
+ } else {
+ self.disable();
+ }
+ }
+ },
+ // Actual Callbacks object
+ self = {
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+ // First, we save the current length
+ var start = list.length;
+ (function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ var type = jQuery.type( arg );
+ if ( type === "function" ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && type !== "string" ) {
+ // Inspect recursively
+ add( arg );
+ }
+ });
+ })( arguments );
+ // Do we need to add the callbacks to the
+ // current firing batch?
+ if ( firing ) {
+ firingLength = list.length;
+ // With memory, if we're not firing then
+ // we should call right away
+ } else if ( memory ) {
+ firingStart = start;
+ fire( memory );
+ }
+ }
+ return this;
+ },
+ // Remove a callback from the list
+ remove: function() {
+ if ( list ) {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+ // Handle firing indexes
+ if ( firing ) {
+ if ( index <= firingLength ) {
+ firingLength--;
+ }
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ }
+ });
+ }
+ return this;
+ },
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+ },
+ // Remove all callbacks from the list
+ empty: function() {
+ list = [];
+ firingLength = 0;
+ return this;
+ },
+ // Have the list do nothing anymore
+ disable: function() {
+ list = stack = memory = undefined;
+ return this;
+ },
+ // Is it disabled?
+ disabled: function() {
+ return !list;
+ },
+ // Lock the list in its current state
+ lock: function() {
+ stack = undefined;
+ if ( !memory ) {
+ self.disable();
+ }
+ return this;
+ },
+ // Is it locked?
+ locked: function() {
+ return !stack;
+ },
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( list && ( !fired || stack ) ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ if ( firing ) {
+ stack.push( args );
+ } else {
+ fire( args );
+ }
+ }
+ return this;
+ },
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+jQuery.extend({
+
+ Deferred: function( func ) {
+ var tuples = [
+ // action, add listener, listener list, final state
+ [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks("memory") ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[ tuple[1] ](function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .done( newDefer.resolve )
+ .fail( newDefer.reject )
+ .progress( newDefer.notify );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+ }
+ });
+ });
+ fns = null;
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 3 ];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[1] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(function() {
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[0] ] = function() {
+ deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+ return this;
+ };
+ deferred[ tuple[0] + "With" ] = list.fireWith;
+ });
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
+ resolveValues = slice.call( arguments ),
+ length = resolveValues.length,
+
+ // the count of uncompleted subordinates
+ remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+ // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+ // Update function for both resolve and progress values
+ updateFunc = function( i, contexts, values ) {
+ return function( value ) {
+ contexts[ i ] = this;
+ values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( values === progressValues ) {
+ deferred.notifyWith( contexts, values );
+ } else if ( !( --remaining ) ) {
+ deferred.resolveWith( contexts, values );
+ }
+ };
+ },
+
+ progressValues, progressContexts, resolveContexts;
+
+ // add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+ resolveValues[ i ].promise()
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject )
+ .progress( updateFunc( i, progressContexts, progressValues ) );
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // if we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
+ }
+
+ return deferred.promise();
+ }
+});
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+ // Add the callback
+ jQuery.ready.promise().done( fn );
+
+ return this;
+};
+
+jQuery.extend({
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.triggerHandler ) {
+ jQuery( document ).triggerHandler( "ready" );
+ jQuery( document ).off( "ready" );
+ }
+ }
+});
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed, false );
+ window.removeEventListener( "load", completed, false );
+ jQuery.ready();
+}
+
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
+
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called after the browser event has already occurred.
+ // we once tried to use readyState "interactive" here, but it caused issues like the one
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ setTimeout( jQuery.ready );
+
+ } else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed, false );
+ }
+ }
+ return readyList.promise( obj );
+};
+
+// Kick off the DOM ready check even if the user does not
+jQuery.ready.promise();
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ len ? fn( elems[0], key ) : emptyGet;
+};
+
+
+/**
+ * Determines whether an object can have data
+ */
+jQuery.acceptData = function( owner ) {
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ /* jshint -W018 */
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+function Data() {
+ // Support: Android < 4,
+ // Old WebKit does not have Object.preventExtensions/freeze method,
+ // return new empty object instead with no [[set]] accessor
+ Object.defineProperty( this.cache = {}, 0, {
+ get: function() {
+ return {};
+ }
+ });
+
+ this.expando = jQuery.expando + Math.random();
+}
+
+Data.uid = 1;
+Data.accepts = jQuery.acceptData;
+
+Data.prototype = {
+ key: function( owner ) {
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return the key for a frozen object.
+ if ( !Data.accepts( owner ) ) {
+ return 0;
+ }
+
+ var descriptor = {},
+ // Check if the owner object already has a cache key
+ unlock = owner[ this.expando ];
+
+ // If not, create one
+ if ( !unlock ) {
+ unlock = Data.uid++;
+
+ // Secure it in a non-enumerable, non-writable property
+ try {
+ descriptor[ this.expando ] = { value: unlock };
+ Object.defineProperties( owner, descriptor );
+
+ // Support: Android < 4
+ // Fallback to a less secure definition
+ } catch ( e ) {
+ descriptor[ this.expando ] = unlock;
+ jQuery.extend( owner, descriptor );
+ }
+ }
+
+ // Ensure the cache object
+ if ( !this.cache[ unlock ] ) {
+ this.cache[ unlock ] = {};
+ }
+
+ return unlock;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ // There may be an unlock assigned to this node,
+ // if there is no entry for this "owner", create one inline
+ // and set the unlock as though an owner entry had always existed
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ // Handle: [ owner, key, value ] args
+ if ( typeof data === "string" ) {
+ cache[ data ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+ // Fresh assignments by object are shallow copied
+ if ( jQuery.isEmptyObject( cache ) ) {
+ jQuery.extend( this.cache[ unlock ], data );
+ // Otherwise, copy the properties one-by-one to the cache object
+ } else {
+ for ( prop in data ) {
+ cache[ prop ] = data[ prop ];
+ }
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ // Either a valid cache is found, or will be created.
+ // New caches will be created and the unlock returned,
+ // allowing direct access to the newly created
+ // empty data object. A valid owner object must be provided.
+ var cache = this.cache[ this.key( owner ) ];
+
+ return key === undefined ?
+ cache : cache[ key ];
+ },
+ access: function( owner, key, value ) {
+ var stored;
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ((key && typeof key === "string") && value === undefined) ) {
+
+ stored = this.get( owner, key );
+
+ return stored !== undefined ?
+ stored : this.get( owner, jQuery.camelCase(key) );
+ }
+
+ // [*]When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i, name, camel,
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ if ( key === undefined ) {
+ this.cache[ unlock ] = {};
+
+ } else {
+ // Support array or space separated string of keys
+ if ( jQuery.isArray( key ) ) {
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = key.concat( key.map( jQuery.camelCase ) );
+ } else {
+ camel = jQuery.camelCase( key );
+ // Try the string as a key before any manipulation
+ if ( key in cache ) {
+ name = [ key, camel ];
+ } else {
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ name = camel;
+ name = name in cache ?
+ [ name ] : ( name.match( rnotwhite ) || [] );
+ }
+ }
+
+ i = name.length;
+ while ( i-- ) {
+ delete cache[ name[ i ] ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ return !jQuery.isEmptyObject(
+ this.cache[ owner[ this.expando ] ] || {}
+ );
+ },
+ discard: function( owner ) {
+ if ( owner[ this.expando ] ) {
+ delete this.cache[ owner[ this.expando ] ];
+ }
+ }
+};
+var data_priv = new Data();
+
+var data_user = new Data();
+
+
+
+/*
+ Implementation Summary
+
+ 1. Enforce API surface and semantic compatibility with 1.9.x branch
+ 2. Improve the module's maintainability by reducing the storage
+ paths to a single mechanism.
+ 3. Use the same single mechanism to support "private" and "user" data.
+ 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+ 5. Avoid exposing implementation details on user objects (eg. expando properties)
+ 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+*/
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /([A-Z])/g;
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ data_user.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend({
+ hasData: function( elem ) {
+ return data_user.hasData( elem ) || data_priv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return data_user.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ data_user.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to data_priv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return data_priv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ data_priv.remove( elem, name );
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = data_user.get( elem );
+
+ if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE11+
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.slice(5) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ data_priv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each(function() {
+ data_user.set( this, key );
+ });
+ }
+
+ return access( this, function( value ) {
+ var data,
+ camelKey = jQuery.camelCase( key );
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+ // Attempt to get data from the cache
+ // with the key as-is
+ data = data_user.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to get data from the cache
+ // with the key camelized
+ data = data_user.get( elem, camelKey );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, camelKey, undefined );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ this.each(function() {
+ // First, attempt to store a copy or reference of any
+ // data that might've been store with a camelCased key.
+ var data = data_user.get( this, camelKey );
+
+ // For HTML5 data-* attribute interop, we have to
+ // store property names with dashes in a camelCase form.
+ // This might not apply to all properties...*
+ data_user.set( this, camelKey, value );
+
+ // *... In the case of properties that might _actually_
+ // have dashes, we need to also store a copy of that
+ // unchanged property.
+ if ( key.indexOf("-") !== -1 && data !== undefined ) {
+ data_user.set( this, key, value );
+ }
+ });
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each(function() {
+ data_user.remove( this, key );
+ });
+ }
+});
+
+
+jQuery.extend({
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = data_priv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray( data ) ) {
+ queue = data_priv.access( elem, type, jQuery.makeArray(data) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // not intended for public consumption - generates a queueHooks object, or returns the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return data_priv.get( elem, key ) || data_priv.access( elem, key, {
+ empty: jQuery.Callbacks("once memory").add(function() {
+ data_priv.remove( elem, [ type + "queue", key ] );
+ })
+ });
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[0], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each(function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ dequeue: function( type ) {
+ return this.each(function() {
+ jQuery.dequeue( this, type );
+ });
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = data_priv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+});
+var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHidden = function( elem, el ) {
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+ return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+ };
+
+var rcheckableType = (/^(?:checkbox|radio)$/i);
+
+
+
+(function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // #11217 - WebKit loses check when the name is after the checked attribute
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` need .setAttribute for WWA
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
+ // old WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ // Support: IE9-IE11+
+ div.innerHTML = "<textarea>x</textarea>";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+})();
+var strundefined = typeof undefined;
+
+
+
+support.focusinBubbles = "onfocusin" in window;
+
+
+var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.get( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !(events = elemData.events) ) {
+ events = elemData.events = {};
+ }
+ if ( !(eventHandle = elemData.handle) ) {
+ eventHandle = elemData.handle = function( e ) {
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend({
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join(".")
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !(handlers = events[ type ]) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.hasData( elem ) && data_priv.get( elem );
+
+ if ( !elemData || !(events = elemData.events) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ delete elemData.handle;
+ data_priv.remove( elem, "events" );
+ }
+ },
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+
+ var i, cur, tmp, bubbleType, ontype, handle, special,
+ eventPath = [ elem || document ],
+ type = hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+ cur = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf(".") >= 0 ) {
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf(":") < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join(".");
+ event.namespace_re = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === (elem.ownerDocument || document) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
+ event.result = handle.apply( cur, data );
+ if ( event.result === false ) {
+ event.preventDefault();
+ }
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+ if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
+ jQuery.acceptData( elem ) ) {
+
+ // Call a native DOM method on the target with the same name name as the event.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ ontype ];
+
+ if ( tmp ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+ elem[ type ]();
+ jQuery.event.triggered = undefined;
+
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event );
+
+ var i, j, ret, matched, handleObj,
+ handlerQueue = [],
+ args = slice.call( arguments ),
+ handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[0] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or
+ // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+ .apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( (event.result = ret) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, matches, sel, handleObj,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ // Black-hole SVG <use> instance trees (#13180)
+ // Avoid non-left-click bubbling in Firefox (#3861)
+ if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.disabled !== true || event.type !== "click" ) {
+ matches = [];
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matches[ sel ] === undefined ) {
+ matches[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) >= 0 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matches[ sel ] ) {
+ matches.push( handleObj );
+ }
+ }
+ if ( matches.length ) {
+ handlerQueue.push({ elem: cur, handlers: matches });
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+ }
+
+ return handlerQueue;
+ },
+
+ // Includes some event props shared by KeyEvent and MouseEvent
+ props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+ fixHooks: {},
+
+ keyHooks: {
+ props: "char charCode key keyCode".split(" "),
+ filter: function( event, original ) {
+
+ // Add which for key events
+ if ( event.which == null ) {
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
+ }
+
+ return event;
+ }
+ },
+
+ mouseHooks: {
+ props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+ filter: function( event, original ) {
+ var eventDoc, doc, body,
+ button = original.button;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && original.clientX != null ) {
+ eventDoc = event.target.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+ event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && button !== undefined ) {
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+ }
+
+ return event;
+ }
+ },
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop, copy,
+ type = event.type,
+ originalEvent = event,
+ fixHook = this.fixHooks[ type ];
+
+ if ( !fixHook ) {
+ this.fixHooks[ type ] = fixHook =
+ rmouseEvent.test( type ) ? this.mouseHooks :
+ rkeyEvent.test( type ) ? this.keyHooks :
+ {};
+ }
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+ event = new jQuery.Event( originalEvent );
+
+ i = copy.length;
+ while ( i-- ) {
+ prop = copy[ i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Support: Cordova 2.5 (WebKit) (#13255)
+ // All events should have a target; Cordova deviceready doesn't
+ if ( !event.target ) {
+ event.target = document;
+ }
+
+ // Support: Safari 6.0+, Chrome < 28
+ // Target should not be a text node (#504, #13143)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+ },
+
+ special: {
+ load: {
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ focus: {
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== safeActiveElement() && this.focus ) {
+ this.focus();
+ return false;
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function() {
+ if ( this === safeActiveElement() && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+ click: {
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
+ this.click();
+ return false;
+ }
+ },
+
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function( event ) {
+ return jQuery.nodeName( event.target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ },
+
+ simulate: function( type, elem, event, bubble ) {
+ // Piggyback on a donor event to simulate a different one.
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
+ // simulated event prevents default then we do the same on the donor.
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ {
+ type: type,
+ isSimulated: true,
+ originalEvent: {}
+ }
+ );
+ if ( bubble ) {
+ jQuery.event.trigger( e, null, elem );
+ } else {
+ jQuery.event.dispatch.call( elem, e );
+ }
+ if ( e.isDefaultPrevented() ) {
+ event.preventDefault();
+ }
+ }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle, false );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+ // Allow instantiation without the 'new' keyword
+ if ( !(this instanceof jQuery.Event) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+ // Support: Android < 4.0
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && e.preventDefault ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && e.stopPropagation ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && e.stopImmediatePropagation ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// Support: Chrome 15+
+jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mousenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+});
+
+// Create "bubbling" focus and blur events
+// Support: Firefox, Chrome, Safari
+if ( !support.focusinBubbles ) {
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+ // Attach a single capturing handler on the document while someone wants focusin/focusout
+ var handler = function( event ) {
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+ };
+
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix );
+
+ if ( !attaches ) {
+ doc.addEventListener( orig, handler, true );
+ }
+ data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
+ },
+ teardown: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix ) - 1;
+
+ if ( !attaches ) {
+ doc.removeEventListener( orig, handler, true );
+ data_priv.remove( doc, fix );
+
+ } else {
+ data_priv.access( doc, fix, attaches );
+ }
+ }
+ };
+ });
+}
+
+jQuery.fn.extend({
+
+ on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ this.on( type, selector, data, types[ type ], one );
+ }
+ return this;
+ }
+
+ if ( data == null && fn == null ) {
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return this;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return this.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ });
+ },
+ one: function( types, selector, data, fn ) {
+ return this.on( types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each(function() {
+ jQuery.event.remove( this, types, fn, selector );
+ });
+ },
+
+ trigger: function( type, data ) {
+ return this.each(function() {
+ jQuery.event.trigger( type, data, this );
+ });
+ },
+ triggerHandler: function( type, data ) {
+ var elem = this[0];
+ if ( elem ) {
+ return jQuery.event.trigger( type, data, elem, true );
+ }
+ }
+});
+
+
+var
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+ rtagName = /<([\w:]+)/,
+ rhtml = /<|&#?\w+;/,
+ rnoInnerhtml = /<(?:script|style|link)/i,
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rscriptType = /^$|\/(?:java|ecma)script/i,
+ rscriptTypeMasked = /^true\/(.*)/,
+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+ // We have to close these tags to support XHTML (#13200)
+ wrapMap = {
+
+ // Support: IE 9
+ option: [ 1, "<select multiple='multiple'>", "</select>" ],
+
+ thead: [ 1, "<table>", "</table>" ],
+ col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
+ tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+ _default: [ 0, "", "" ]
+ };
+
+// Support: IE 9
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// Support: 1.x compatibility
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+ return jQuery.nodeName( elem, "table" ) &&
+ jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
+
+ elem.getElementsByTagName("tbody")[0] ||
+ elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+ elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+ elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
+ return elem;
+}
+function restoreScript( elem ) {
+ var match = rscriptTypeMasked.exec( elem.type );
+
+ if ( match ) {
+ elem.type = match[ 1 ];
+ } else {
+ elem.removeAttribute("type");
+ }
+
+ return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ data_priv.set(
+ elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+function cloneCopyEvent( src, dest ) {
+ var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+ if ( dest.nodeType !== 1 ) {
+ return;
+ }
+
+ // 1. Copy private data: events, handlers, etc.
+ if ( data_priv.hasData( src ) ) {
+ pdataOld = data_priv.access( src );
+ pdataCur = data_priv.set( dest, pdataOld );
+ events = pdataOld.events;
+
+ if ( events ) {
+ delete pdataCur.handle;
+ pdataCur.events = {};
+
+ for ( type in events ) {
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type, events[ type ][ i ] );
+ }
+ }
+ }
+ }
+
+ // 2. Copy user data
+ if ( data_user.hasData( src ) ) {
+ udataOld = data_user.access( src );
+ udataCur = jQuery.extend( {}, udataOld );
+
+ data_user.set( dest, udataCur );
+ }
+}
+
+function getAll( context, tag ) {
+ var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
+ context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
+ [];
+
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], ret ) :
+ ret;
+}
+
+// Support: IE >= 9
+function fixInput( src, dest ) {
+ var nodeName = dest.nodeName.toLowerCase();
+
+ // Fails to persist the checked state of a cloned checkbox or radio button.
+ if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+ dest.checked = src.checked;
+
+ // Fails to return the selected option to the default selected state when cloning options
+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
+ dest.defaultValue = src.defaultValue;
+ }
+}
+
+jQuery.extend({
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var i, l, srcElements, destElements,
+ clone = elem.cloneNode( true ),
+ inPage = jQuery.contains( elem.ownerDocument, elem );
+
+ // Support: IE >= 9
+ // Fix Cloning issues
+ if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+ !jQuery.isXMLDoc( elem ) ) {
+
+ // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+ destElements = getAll( clone );
+ srcElements = getAll( elem );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ fixInput( srcElements[ i ], destElements[ i ] );
+ }
+ }
+
+ // Copy the events from the original to the clone
+ if ( dataAndEvents ) {
+ if ( deepDataAndEvents ) {
+ srcElements = srcElements || getAll( elem );
+ destElements = destElements || getAll( clone );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+ }
+ } else {
+ cloneCopyEvent( elem, clone );
+ }
+ }
+
+ // Preserve script evaluation history
+ destElements = getAll( clone, "script" );
+ if ( destElements.length > 0 ) {
+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+ }
+
+ // Return the cloned set
+ return clone;
+ },
+
+ buildFragment: function( elems, context, scripts, selection ) {
+ var elem, tmp, tag, wrap, contains, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement("div") );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Fixes #12346
+ // Support: Webkit, IE
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( (elem = nodes[ i++ ]) ) {
+
+ // #4087 - If origin and destination elements are the same, and this is
+ // that element, do not do anything
+ if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( (elem = tmp[ j++ ]) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+ },
+
+ cleanData: function( elems ) {
+ var data, elem, type, key,
+ special = jQuery.event.special,
+ i = 0;
+
+ for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
+ if ( jQuery.acceptData( elem ) ) {
+ key = elem[ data_priv.expando ];
+
+ if ( key && (data = data_priv.cache[ key ]) ) {
+ if ( data.events ) {
+ for ( type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent( elem, type, data.handle );
+ }
+ }
+ }
+ if ( data_priv.cache[ key ] ) {
+ // Discard any remaining `private` data
+ delete data_priv.cache[ key ];
+ }
+ }
+ }
+ // Discard any remaining `user` data
+ delete data_user.cache[ elem[ data_user.expando ] ];
+ }
+ }
+});
+
+jQuery.fn.extend({
+ text: function( value ) {
+ return access( this, function( value ) {
+ return value === undefined ?
+ jQuery.text( this ) :
+ this.empty().each(function() {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ this.textContent = value;
+ }
+ });
+ }, null, value, arguments.length );
+ },
+
+ append: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.appendChild( elem );
+ }
+ });
+ },
+
+ prepend: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.insertBefore( elem, target.firstChild );
+ }
+ });
+ },
+
+ before: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this );
+ }
+ });
+ },
+
+ after: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ }
+ });
+ },
+
+ remove: function( selector, keepData /* Internal Use Only */ ) {
+ var elem,
+ elems = selector ? jQuery.filter( selector, this ) : this,
+ i = 0;
+
+ for ( ; (elem = elems[i]) != null; i++ ) {
+ if ( !keepData && elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem ) );
+ }
+
+ if ( elem.parentNode ) {
+ if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+ setGlobalEval( getAll( elem, "script" ) );
+ }
+ elem.parentNode.removeChild( elem );
+ }
+ }
+
+ return this;
+ },
+
+ empty: function() {
+ var elem,
+ i = 0;
+
+ for ( ; (elem = this[i]) != null; i++ ) {
+ if ( elem.nodeType === 1 ) {
+
+ // Prevent memory leaks
+ jQuery.cleanData( getAll( elem, false ) );
+
+ // Remove any remaining nodes
+ elem.textContent = "";
+ }
+ }
+
+ return this;
+ },
+
+ clone: function( dataAndEvents, deepDataAndEvents ) {
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map(function() {
+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+ });
+ },
+
+ html: function( value ) {
+ return access( this, function( value ) {
+ var elem = this[ 0 ] || {},
+ i = 0,
+ l = this.length;
+
+ if ( value === undefined && elem.nodeType === 1 ) {
+ return elem.innerHTML;
+ }
+
+ // See if we can take a shortcut and just use innerHTML
+ if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+ !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+ value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+ try {
+ for ( ; i < l; i++ ) {
+ elem = this[ i ] || {};
+
+ // Remove element nodes and prevent memory leaks
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem, false ) );
+ elem.innerHTML = value;
+ }
+ }
+
+ elem = 0;
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch( e ) {}
+ }
+
+ if ( elem ) {
+ this.empty().append( value );
+ }
+ }, null, value, arguments.length );
+ },
+
+ replaceWith: function() {
+ var arg = arguments[ 0 ];
+
+ // Make the changes, replacing each context element with the new content
+ this.domManip( arguments, function( elem ) {
+ arg = this.parentNode;
+
+ jQuery.cleanData( getAll( this ) );
+
+ if ( arg ) {
+ arg.replaceChild( elem, this );
+ }
+ });
+
+ // Force removal if there was no new content (e.g., from empty arguments)
+ return arg && (arg.length || arg.nodeType) ? this : this.remove();
+ },
+
+ detach: function( selector ) {
+ return this.remove( selector, true );
+ },
+
+ domManip: function( args, callback ) {
+
+ // Flatten any nested arrays
+ args = concat.apply( [], args );
+
+ var fragment, first, scripts, hasScripts, node, doc,
+ i = 0,
+ l = this.length,
+ set = this,
+ iNoClone = l - 1,
+ value = args[ 0 ],
+ isFunction = jQuery.isFunction( value );
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( isFunction ||
+ ( l > 1 && typeof value === "string" &&
+ !support.checkClone && rchecked.test( value ) ) ) {
+ return this.each(function( index ) {
+ var self = set.eq( index );
+ if ( isFunction ) {
+ args[ 0 ] = value.call( this, index, self.html() );
+ }
+ self.domManip( args, callback );
+ });
+ }
+
+ if ( l ) {
+ fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
+ first = fragment.firstChild;
+
+ if ( fragment.childNodes.length === 1 ) {
+ fragment = first;
+ }
+
+ if ( first ) {
+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+ hasScripts = scripts.length;
+
+ // Use the original fragment for the last item instead of the first because it can end up
+ // being emptied incorrectly in certain situations (#8070).
+ for ( ; i < l; i++ ) {
+ node = fragment;
+
+ if ( i !== iNoClone ) {
+ node = jQuery.clone( node, true, true );
+
+ // Keep references to cloned scripts for later restoration
+ if ( hasScripts ) {
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( scripts, getAll( node, "script" ) );
+ }
+ }
+
+ callback.call( this[ i ], node, i );
+ }
+
+ if ( hasScripts ) {
+ doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+ // Reenable scripts
+ jQuery.map( scripts, restoreScript );
+
+ // Evaluate executable scripts on first document insertion
+ for ( i = 0; i < hasScripts; i++ ) {
+ node = scripts[ i ];
+ if ( rscriptType.test( node.type || "" ) &&
+ !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+ if ( node.src ) {
+ // Optional AJAX dependency, but won't run scripts if not present
+ if ( jQuery._evalUrl ) {
+ jQuery._evalUrl( node.src );
+ }
+ } else {
+ jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return this;
+ }
+});
+
+jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function( name, original ) {
+ jQuery.fn[ name ] = function( selector ) {
+ var elems,
+ ret = [],
+ insert = jQuery( selector ),
+ last = insert.length - 1,
+ i = 0;
+
+ for ( ; i <= last; i++ ) {
+ elems = i === last ? this : this.clone( true );
+ jQuery( insert[ i ] )[ original ]( elems );
+
+ // Support: QtWebKit
+ // .get() because push.apply(_, arraylike) throws
+ push.apply( ret, elems.get() );
+ }
+
+ return this.pushStack( ret );
+ };
+});
+
+
+var iframe,
+ elemdisplay = {};
+
+/**
+ * Retrieve the actual display of a element
+ * @param {String} name nodeName of the element
+ * @param {Object} doc Document object
+ */
+// Called only from within defaultDisplay
+function actualDisplay( name, doc ) {
+ var style,
+ elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+
+ // getDefaultComputedStyle might be reliably used only on attached element
+ display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
+
+ // Use of this method is a temporary fix (more like optmization) until something better comes along,
+ // since it was removed from specification and supported only in FF
+ style.display : jQuery.css( elem[ 0 ], "display" );
+
+ // We don't have any data stored on the element,
+ // so use "detach" method as fast way to get rid of the element
+ elem.detach();
+
+ return display;
+}
+
+/**
+ * Try to determine the default display value of an element
+ * @param {String} nodeName
+ */
+function defaultDisplay( nodeName ) {
+ var doc = document,
+ display = elemdisplay[ nodeName ];
+
+ if ( !display ) {
+ display = actualDisplay( nodeName, doc );
+
+ // If the simple way fails, read from inside an iframe
+ if ( display === "none" || !display ) {
+
+ // Use the already-created iframe if possible
+ iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
+
+ // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+ doc = iframe[ 0 ].contentDocument;
+
+ // Support: IE
+ doc.write();
+ doc.close();
+
+ display = actualDisplay( nodeName, doc );
+ iframe.detach();
+ }
+
+ // Store the correct default display
+ elemdisplay[ nodeName ] = display;
+ }
+
+ return display;
+}
+var rmargin = (/^margin/);
+
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+ return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+ };
+
+
+
+function curCSS( elem, name, computed ) {
+ var width, minWidth, maxWidth, ret,
+ style = elem.style;
+
+ computed = computed || getStyles( elem );
+
+ // Support: IE9
+ // getPropertyValue is only needed for .css('filter') in IE9, see #12537
+ if ( computed ) {
+ ret = computed.getPropertyValue( name ) || computed[ name ];
+ }
+
+ if ( computed ) {
+
+ if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+ ret = jQuery.style( elem, name );
+ }
+
+ // Support: iOS < 6
+ // A tribute to the "awesome hack by Dean Edwards"
+ // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+ // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+ if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+ // Remember the original values
+ width = style.width;
+ minWidth = style.minWidth;
+ maxWidth = style.maxWidth;
+
+ // Put in the new values to get a computed value out
+ style.minWidth = style.maxWidth = style.width = ret;
+ ret = computed.width;
+
+ // Revert the changed values
+ style.width = width;
+ style.minWidth = minWidth;
+ style.maxWidth = maxWidth;
+ }
+ }
+
+ return ret !== undefined ?
+ // Support: IE
+ // IE returns zIndex value as an integer.
+ ret + "" :
+ ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+ // Define the hook, we'll check on the first run if it's really needed.
+ return {
+ get: function() {
+ if ( conditionFn() ) {
+ // Hook not needed (or it's not possible to use it due to missing dependency),
+ // remove it.
+ // Since there are no other hooks for marginRight, remove the whole object.
+ delete this.get;
+ return;
+ }
+
+ // Hook needed; redefine it so that the support test is not executed again.
+
+ return (this.get = hookFn).apply( this, arguments );
+ }
+ };
+}
+
+
+(function() {
+ var pixelPositionVal, boxSizingReliableVal,
+ docElem = document.documentElement,
+ container = document.createElement( "div" ),
+ div = document.createElement( "div" );
+
+ if ( !div.style ) {
+ return;
+ }
+
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" +
+ "position:absolute";
+ container.appendChild( div );
+
+ // Executing both pixelPosition & boxSizingReliable tests require only one layout
+ // so they're executed at the same time to save the second computation.
+ function computePixelPositionAndBoxSizingReliable() {
+ div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
+ "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
+ "border:1px;padding:1px;width:4px;position:absolute";
+ div.innerHTML = "";
+ docElem.appendChild( container );
+
+ var divStyle = window.getComputedStyle( div, null );
+ pixelPositionVal = divStyle.top !== "1%";
+ boxSizingReliableVal = divStyle.width === "4px";
+
+ docElem.removeChild( container );
+ }
+
+ // Support: node.js jsdom
+ // Don't assume that getComputedStyle is a property of the global object
+ if ( window.getComputedStyle ) {
+ jQuery.extend( support, {
+ pixelPosition: function() {
+ // This test is executed only once but we still do memoizing
+ // since we can use the boxSizingReliable pre-computing.
+ // No need to check if the test was already performed, though.
+ computePixelPositionAndBoxSizingReliable();
+ return pixelPositionVal;
+ },
+ boxSizingReliable: function() {
+ if ( boxSizingReliableVal == null ) {
+ computePixelPositionAndBoxSizingReliable();
+ }
+ return boxSizingReliableVal;
+ },
+ reliableMarginRight: function() {
+ // Support: Android 2.3
+ // Check if div with explicit width and no margin-right incorrectly
+ // gets computed margin-right based on width of container. (#3333)
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // This support function is only executed once so no memoizing is needed.
+ var ret,
+ marginDiv = div.appendChild( document.createElement( "div" ) );
+
+ // Reset CSS: box-sizing; display; margin; border; padding
+ marginDiv.style.cssText = div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+ "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
+ marginDiv.style.marginRight = marginDiv.style.width = "0";
+ div.style.width = "1px";
+ docElem.appendChild( container );
+
+ ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
+
+ docElem.removeChild( container );
+
+ return ret;
+ }
+ });
+ }
+})();
+
+
+// A method for quickly swapping in/out CSS properties to get correct calculations.
+jQuery.swap = function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
+var
+ // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+ // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+ rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
+ rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
+
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+ cssNormalTransform = {
+ letterSpacing: "0",
+ fontWeight: "400"
+ },
+
+ cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+ // shortcut for names that are not vendor prefixed
+ if ( name in style ) {
+ return name;
+ }
+
+ // check for vendor prefixed names
+ var capName = name[0].toUpperCase() + name.slice(1),
+ origName = name,
+ i = cssPrefixes.length;
+
+ while ( i-- ) {
+ name = cssPrefixes[ i ] + capName;
+ if ( name in style ) {
+ return name;
+ }
+ }
+
+ return origName;
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+ var matches = rnumsplit.exec( value );
+ return matches ?
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+ value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+ var i = extra === ( isBorderBox ? "border" : "content" ) ?
+ // If we already have the right measurement, avoid augmentation
+ 4 :
+ // Otherwise initialize for horizontal or vertical properties
+ name === "width" ? 1 : 0,
+
+ val = 0;
+
+ for ( ; i < 4; i += 2 ) {
+ // both box models exclude margin, so add it if we want it
+ if ( extra === "margin" ) {
+ val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+ }
+
+ if ( isBorderBox ) {
+ // border-box includes padding, so remove it if we want content
+ if ( extra === "content" ) {
+ val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+ }
+
+ // at this point, extra isn't border nor margin, so remove border
+ if ( extra !== "margin" ) {
+ val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ } else {
+ // at this point, extra isn't content, so add padding
+ val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+ // at this point, extra isn't content nor padding, so add border
+ if ( extra !== "padding" ) {
+ val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ }
+ }
+
+ return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+ // Start with offset property, which is equivalent to the border-box value
+ var valueIsBorderBox = true,
+ val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+ styles = getStyles( elem ),
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+ // some non-html elements return undefined for offsetWidth, so check for null/undefined
+ // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+ // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+ if ( val <= 0 || val == null ) {
+ // Fall back to computed then uncomputed css if necessary
+ val = curCSS( elem, name, styles );
+ if ( val < 0 || val == null ) {
+ val = elem.style[ name ];
+ }
+
+ // Computed unit is not pixels. Stop here and return.
+ if ( rnumnonpx.test(val) ) {
+ return val;
+ }
+
+ // we need the check for style in case a browser which returns unreliable values
+ // for getComputedStyle silently falls back to the reliable elem.style
+ valueIsBorderBox = isBorderBox &&
+ ( support.boxSizingReliable() || val === elem.style[ name ] );
+
+ // Normalize "", auto, and prepare for extra
+ val = parseFloat( val ) || 0;
+ }
+
+ // use the active box-sizing model to add/subtract irrelevant styles
+ return ( val +
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra || ( isBorderBox ? "border" : "content" ),
+ valueIsBorderBox,
+ styles
+ )
+ ) + "px";
+}
+
+function showHide( elements, show ) {
+ var display, elem, hidden,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+
+ values[ index ] = data_priv.get( elem, "olddisplay" );
+ display = elem.style.display;
+ if ( show ) {
+ // Reset the inline display of this element to learn if it is
+ // being hidden by cascaded rules or not
+ if ( !values[ index ] && display === "none" ) {
+ elem.style.display = "";
+ }
+
+ // Set elements which have been overridden with display: none
+ // in a stylesheet to whatever the default browser style is
+ // for such an element
+ if ( elem.style.display === "" && isHidden( elem ) ) {
+ values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+ }
+ } else {
+ hidden = isHidden( elem );
+
+ if ( display !== "none" || !hidden ) {
+ data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+ }
+ }
+ }
+
+ // Set the display of most of the elements in a second loop
+ // to avoid the constant reflow
+ for ( index = 0; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+ if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+ elem.style.display = show ? values[ index ] || "" : "none";
+ }
+ }
+
+ return elements;
+}
+
+jQuery.extend({
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function( elem, computed ) {
+ if ( computed ) {
+ // We should always get a number back from opacity
+ var ret = curCSS( elem, "opacity" );
+ return ret === "" ? "1" : ret;
+ }
+ }
+ }
+ },
+
+ // Don't automatically add "px" to these possibly-unitless properties
+ cssNumber: {
+ "columnCount": true,
+ "fillOpacity": true,
+ "flexGrow": true,
+ "flexShrink": true,
+ "fontWeight": true,
+ "lineHeight": true,
+ "opacity": true,
+ "order": true,
+ "orphans": true,
+ "widows": true,
+ "zIndex": true,
+ "zoom": true
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {
+ // normalize float css property
+ "float": "cssFloat"
+ },
+
+ // Get and set the style property on a DOM Node
+ style: function( elem, name, value, extra ) {
+ // Don't set styles on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret, type, hooks,
+ origName = jQuery.camelCase( name ),
+ style = elem.style;
+
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+ // gets hook for the prefixed version
+ // followed by the unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // Check if we're setting a value
+ if ( value !== undefined ) {
+ type = typeof value;
+
+ // convert relative number strings (+= or -=) to relative numbers. #7345
+ if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+ value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+ // Fixes bug #9237
+ type = "number";
+ }
+
+ // Make sure that null and NaN values aren't set. See: #7116
+ if ( value == null || value !== value ) {
+ return;
+ }
+
+ // If a number was passed in, add 'px' to the (except for certain CSS properties)
+ if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+ value += "px";
+ }
+
+ // Fixes #8908, it can be done more correctly by specifying setters in cssHooks,
+ // but it would mean to define eight (for every problematic property) identical functions
+ if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+ style[ name ] = "inherit";
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+ style[ name ] = value;
+ }
+
+ } else {
+ // If a hook was provided get the non-computed value from there
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[ name ];
+ }
+ },
+
+ css: function( elem, name, extra, styles ) {
+ var val, num, hooks,
+ origName = jQuery.camelCase( name );
+
+ // Make sure that we're working with the right name
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+ // gets hook for the prefixed version
+ // followed by the unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // If a hook was provided get the computed value from there
+ if ( hooks && "get" in hooks ) {
+ val = hooks.get( elem, true, extra );
+ }
+
+ // Otherwise, if a way to get the computed value exists, use that
+ if ( val === undefined ) {
+ val = curCSS( elem, name, styles );
+ }
+
+ //convert "normal" to computed value
+ if ( val === "normal" && name in cssNormalTransform ) {
+ val = cssNormalTransform[ name ];
+ }
+
+ // Return, converting to number if forced or a qualifier was provided and val looks numeric
+ if ( extra === "" || extra ) {
+ num = parseFloat( val );
+ return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+ }
+ return val;
+ }
+});
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+ jQuery.cssHooks[ name ] = {
+ get: function( elem, computed, extra ) {
+ if ( computed ) {
+ // certain elements can have dimension info if we invisibly show them
+ // however, it must have a current display style that would benefit from this
+ return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
+ jQuery.swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, name, extra );
+ }) :
+ getWidthOrHeight( elem, name, extra );
+ }
+ },
+
+ set: function( elem, value, extra ) {
+ var styles = extra && getStyles( elem );
+ return setPositiveNumber( elem, value, extra ?
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra,
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ styles
+ ) : 0
+ );
+ }
+ };
+});
+
+// Support: Android 2.3
+jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
+ function( elem, computed ) {
+ if ( computed ) {
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // Work around by temporarily setting element display to inline-block
+ return jQuery.swap( elem, { "display": "inline-block" },
+ curCSS, [ elem, "marginRight" ] );
+ }
+ }
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+ margin: "",
+ padding: "",
+ border: "Width"
+}, function( prefix, suffix ) {
+ jQuery.cssHooks[ prefix + suffix ] = {
+ expand: function( value ) {
+ var i = 0,
+ expanded = {},
+
+ // assumes a single number if not a string
+ parts = typeof value === "string" ? value.split(" ") : [ value ];
+
+ for ( ; i < 4; i++ ) {
+ expanded[ prefix + cssExpand[ i ] + suffix ] =
+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+ }
+
+ return expanded;
+ }
+ };
+
+ if ( !rmargin.test( prefix ) ) {
+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+ }
+});
+
+jQuery.fn.extend({
+ css: function( name, value ) {
+ return access( this, function( elem, name, value ) {
+ var styles, len,
+ map = {},
+ i = 0;
+
+ if ( jQuery.isArray( name ) ) {
+ styles = getStyles( elem );
+ len = name.length;
+
+ for ( ; i < len; i++ ) {
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+ }
+
+ return map;
+ }
+
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ }, name, value, arguments.length > 1 );
+ },
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each(function() {
+ if ( isHidden( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ });
+ }
+});
+
+
+function Tween( elem, options, prop, end, easing ) {
+ return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+ constructor: Tween,
+ init: function( elem, options, prop, end, easing, unit ) {
+ this.elem = elem;
+ this.prop = prop;
+ this.easing = easing || "swing";
+ this.options = options;
+ this.start = this.now = this.cur();
+ this.end = end;
+ this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+ },
+ cur: function() {
+ var hooks = Tween.propHooks[ this.prop ];
+
+ return hooks && hooks.get ?
+ hooks.get( this ) :
+ Tween.propHooks._default.get( this );
+ },
+ run: function( percent ) {
+ var eased,
+ hooks = Tween.propHooks[ this.prop ];
+
+ if ( this.options.duration ) {
+ this.pos = eased = jQuery.easing[ this.easing ](
+ percent, this.options.duration * percent, 0, 1, this.options.duration
+ );
+ } else {
+ this.pos = eased = percent;
+ }
+ this.now = ( this.end - this.start ) * eased + this.start;
+
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
+
+ if ( hooks && hooks.set ) {
+ hooks.set( this );
+ } else {
+ Tween.propHooks._default.set( this );
+ }
+ return this;
+ }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+ _default: {
+ get: function( tween ) {
+ var result;
+
+ if ( tween.elem[ tween.prop ] != null &&
+ (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+ return tween.elem[ tween.prop ];
+ }
+
+ // passing an empty string as a 3rd parameter to .css will automatically
+ // attempt a parseFloat and fallback to a string if the parse fails
+ // so, simple values such as "10px" are parsed to Float.
+ // complex values such as "rotate(1rad)" are returned as is.
+ result = jQuery.css( tween.elem, tween.prop, "" );
+ // Empty strings, null, undefined and "auto" are converted to 0.
+ return !result || result === "auto" ? 0 : result;
+ },
+ set: function( tween ) {
+ // use step hook for back compat - use cssHook if its there - use .style if its
+ // available and use plain properties where available
+ if ( jQuery.fx.step[ tween.prop ] ) {
+ jQuery.fx.step[ tween.prop ]( tween );
+ } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+ } else {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+ }
+};
+
+// Support: IE9
+// Panic based approach to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+ set: function( tween ) {
+ if ( tween.elem.nodeType && tween.elem.parentNode ) {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+};
+
+jQuery.easing = {
+ linear: function( p ) {
+ return p;
+ },
+ swing: function( p ) {
+ return 0.5 - Math.cos( p * Math.PI ) / 2;
+ }
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+ fxNow, timerId,
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
+ rrun = /queueHooks$/,
+ animationPrefilters = [ defaultPrefilter ],
+ tweeners = {
+ "*": [ function( prop, value ) {
+ var tween = this.createTween( prop, value ),
+ target = tween.cur(),
+ parts = rfxnum.exec( value ),
+ unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+ rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+ scale = 1,
+ maxIterations = 20;
+
+ if ( start && start[ 3 ] !== unit ) {
+ // Trust units reported by jQuery.css
+ unit = unit || start[ 3 ];
+
+ // Make sure we update the tween properties later on
+ parts = parts || [];
+
+ // Iteratively approximate from a nonzero starting point
+ start = +target || 1;
+
+ do {
+ // If previous iteration zeroed out, double until we get *something*
+ // Use a string for doubling factor so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ start = start / scale;
+ jQuery.style( tween.elem, prop, start + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur()
+ // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+ } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+ }
+
+ // Update tween properties
+ if ( parts ) {
+ start = tween.start = +start || +target || 0;
+ tween.unit = unit;
+ // If a +=/-= token was provided, we're doing a relative animation
+ tween.end = parts[ 1 ] ?
+ start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+ +parts[ 2 ];
+ }
+
+ return tween;
+ } ]
+ };
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+ setTimeout(function() {
+ fxNow = undefined;
+ });
+ return ( fxNow = jQuery.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+ var which,
+ i = 0,
+ attrs = { height: type };
+
+ // if we include width, step value is 1 to do all cssExpand values,
+ // if we don't include width, step value is 2 to skip over Left and Right
+ includeWidth = includeWidth ? 1 : 0;
+ for ( ; i < 4 ; i += 2 - includeWidth ) {
+ which = cssExpand[ i ];
+ attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+ }
+
+ if ( includeWidth ) {
+ attrs.opacity = attrs.width = type;
+ }
+
+ return attrs;
+}
+
+function createTween( value, prop, animation ) {
+ var tween,
+ collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+ index = 0,
+ length = collection.length;
+ for ( ; index < length; index++ ) {
+ if ( (tween = collection[ index ].call( animation, prop, value )) ) {
+
+ // we're done with this property
+ return tween;
+ }
+ }
+}
+
+function defaultPrefilter( elem, props, opts ) {
+ /* jshint validthis: true */
+ var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
+ anim = this,
+ orig = {},
+ style = elem.style,
+ hidden = elem.nodeType && isHidden( elem ),
+ dataShow = data_priv.get( elem, "fxshow" );
+
+ // handle queue: false promises
+ if ( !opts.queue ) {
+ hooks = jQuery._queueHooks( elem, "fx" );
+ if ( hooks.unqueued == null ) {
+ hooks.unqueued = 0;
+ oldfire = hooks.empty.fire;
+ hooks.empty.fire = function() {
+ if ( !hooks.unqueued ) {
+ oldfire();
+ }
+ };
+ }
+ hooks.unqueued++;
+
+ anim.always(function() {
+ // doing this makes sure that the complete handler will be called
+ // before this completes
+ anim.always(function() {
+ hooks.unqueued--;
+ if ( !jQuery.queue( elem, "fx" ).length ) {
+ hooks.empty.fire();
+ }
+ });
+ });
+ }
+
+ // height/width overflow pass
+ if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+ // Make sure that nothing sneaks out
+ // Record all 3 overflow attributes because IE9-10 do not
+ // change the overflow attribute when overflowX and
+ // overflowY are set to the same value
+ opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+ // Set display property to inline-block for height/width
+ // animations on inline elements that are having width/height animated
+ display = jQuery.css( elem, "display" );
+
+ // Test default display if display is currently "none"
+ checkDisplay = display === "none" ?
+ data_priv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
+
+ if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
+ style.display = "inline-block";
+ }
+ }
+
+ if ( opts.overflow ) {
+ style.overflow = "hidden";
+ anim.always(function() {
+ style.overflow = opts.overflow[ 0 ];
+ style.overflowX = opts.overflow[ 1 ];
+ style.overflowY = opts.overflow[ 2 ];
+ });
+ }
+
+ // show/hide pass
+ for ( prop in props ) {
+ value = props[ prop ];
+ if ( rfxtypes.exec( value ) ) {
+ delete props[ prop ];
+ toggle = toggle || value === "toggle";
+ if ( value === ( hidden ? "hide" : "show" ) ) {
+
+ // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
+ if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+ hidden = true;
+ } else {
+ continue;
+ }
+ }
+ orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+
+ // Any non-fx value stops us from restoring the original display value
+ } else {
+ display = undefined;
+ }
+ }
+
+ if ( !jQuery.isEmptyObject( orig ) ) {
+ if ( dataShow ) {
+ if ( "hidden" in dataShow ) {
+ hidden = dataShow.hidden;
+ }
+ } else {
+ dataShow = data_priv.access( elem, "fxshow", {} );
+ }
+
+ // store state if its toggle - enables .stop().toggle() to "reverse"
+ if ( toggle ) {
+ dataShow.hidden = !hidden;
+ }
+ if ( hidden ) {
+ jQuery( elem ).show();
+ } else {
+ anim.done(function() {
+ jQuery( elem ).hide();
+ });
+ }
+ anim.done(function() {
+ var prop;
+
+ data_priv.remove( elem, "fxshow" );
+ for ( prop in orig ) {
+ jQuery.style( elem, prop, orig[ prop ] );
+ }
+ });
+ for ( prop in orig ) {
+ tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+ if ( !( prop in dataShow ) ) {
+ dataShow[ prop ] = tween.start;
+ if ( hidden ) {
+ tween.end = tween.start;
+ tween.start = prop === "width" || prop === "height" ? 1 : 0;
+ }
+ }
+ }
+
+ // If this is a noop like .hide().hide(), restore an overwritten display value
+ } else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
+ style.display = display;
+ }
+}
+
+function propFilter( props, specialEasing ) {
+ var index, name, easing, value, hooks;
+
+ // camelCase, specialEasing and expand cssHook pass
+ for ( index in props ) {
+ name = jQuery.camelCase( index );
+ easing = specialEasing[ name ];
+ value = props[ index ];
+ if ( jQuery.isArray( value ) ) {
+ easing = value[ 1 ];
+ value = props[ index ] = value[ 0 ];
+ }
+
+ if ( index !== name ) {
+ props[ name ] = value;
+ delete props[ index ];
+ }
+
+ hooks = jQuery.cssHooks[ name ];
+ if ( hooks && "expand" in hooks ) {
+ value = hooks.expand( value );
+ delete props[ name ];
+
+ // not quite $.extend, this wont overwrite keys already present.
+ // also - reusing 'index' from above because we have the correct "name"
+ for ( index in value ) {
+ if ( !( index in props ) ) {
+ props[ index ] = value[ index ];
+ specialEasing[ index ] = easing;
+ }
+ }
+ } else {
+ specialEasing[ name ] = easing;
+ }
+ }
+}
+
+function Animation( elem, properties, options ) {
+ var result,
+ stopped,
+ index = 0,
+ length = animationPrefilters.length,
+ deferred = jQuery.Deferred().always( function() {
+ // don't match elem in the :animated selector
+ delete tick.elem;
+ }),
+ tick = function() {
+ if ( stopped ) {
+ return false;
+ }
+ var currentTime = fxNow || createFxNow(),
+ remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+ // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+ temp = remaining / animation.duration || 0,
+ percent = 1 - temp,
+ index = 0,
+ length = animation.tweens.length;
+
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( percent );
+ }
+
+ deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+ if ( percent < 1 && length ) {
+ return remaining;
+ } else {
+ deferred.resolveWith( elem, [ animation ] );
+ return false;
+ }
+ },
+ animation = deferred.promise({
+ elem: elem,
+ props: jQuery.extend( {}, properties ),
+ opts: jQuery.extend( true, { specialEasing: {} }, options ),
+ originalProperties: properties,
+ originalOptions: options,
+ startTime: fxNow || createFxNow(),
+ duration: options.duration,
+ tweens: [],
+ createTween: function( prop, end ) {
+ var tween = jQuery.Tween( elem, animation.opts, prop, end,
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.tweens.push( tween );
+ return tween;
+ },
+ stop: function( gotoEnd ) {
+ var index = 0,
+ // if we are going to the end, we want to run all the tweens
+ // otherwise we skip this part
+ length = gotoEnd ? animation.tweens.length : 0;
+ if ( stopped ) {
+ return this;
+ }
+ stopped = true;
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( 1 );
+ }
+
+ // resolve when we played the last frame
+ // otherwise, reject
+ if ( gotoEnd ) {
+ deferred.resolveWith( elem, [ animation, gotoEnd ] );
+ } else {
+ deferred.rejectWith( elem, [ animation, gotoEnd ] );
+ }
+ return this;
+ }
+ }),
+ props = animation.props;
+
+ propFilter( props, animation.opts.specialEasing );
+
+ for ( ; index < length ; index++ ) {
+ result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+ if ( result ) {
+ return result;
+ }
+ }
+
+ jQuery.map( props, createTween, animation );
+
+ if ( jQuery.isFunction( animation.opts.start ) ) {
+ animation.opts.start.call( elem, animation );
+ }
+
+ jQuery.fx.timer(
+ jQuery.extend( tick, {
+ elem: elem,
+ anim: animation,
+ queue: animation.opts.queue
+ })
+ );
+
+ // attach callbacks from options
+ return animation.progress( animation.opts.progress )
+ .done( animation.opts.done, animation.opts.complete )
+ .fail( animation.opts.fail )
+ .always( animation.opts.always );
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+ tweener: function( props, callback ) {
+ if ( jQuery.isFunction( props ) ) {
+ callback = props;
+ props = [ "*" ];
+ } else {
+ props = props.split(" ");
+ }
+
+ var prop,
+ index = 0,
+ length = props.length;
+
+ for ( ; index < length ; index++ ) {
+ prop = props[ index ];
+ tweeners[ prop ] = tweeners[ prop ] || [];
+ tweeners[ prop ].unshift( callback );
+ }
+ },
+
+ prefilter: function( callback, prepend ) {
+ if ( prepend ) {
+ animationPrefilters.unshift( callback );
+ } else {
+ animationPrefilters.push( callback );
+ }
+ }
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+ };
+
+ opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+ // normalize opt.queue - true/undefined/null -> "fx"
+ if ( opt.queue == null || opt.queue === true ) {
+ opt.queue = "fx";
+ }
+
+ // Queueing
+ opt.old = opt.complete;
+
+ opt.complete = function() {
+ if ( jQuery.isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+
+ if ( opt.queue ) {
+ jQuery.dequeue( this, opt.queue );
+ }
+ };
+
+ return opt;
+};
+
+jQuery.fn.extend({
+ fadeTo: function( speed, to, easing, callback ) {
+
+ // show any hidden elements after setting opacity to 0
+ return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+ // animate to the value specified
+ .end().animate({ opacity: to }, speed, easing, callback );
+ },
+ animate: function( prop, speed, easing, callback ) {
+ var empty = jQuery.isEmptyObject( prop ),
+ optall = jQuery.speed( speed, easing, callback ),
+ doAnimation = function() {
+ // Operate on a copy of prop so per-property easing won't be lost
+ var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+ // Empty animations, or finishing resolves immediately
+ if ( empty || data_priv.get( this, "finish" ) ) {
+ anim.stop( true );
+ }
+ };
+ doAnimation.finish = doAnimation;
+
+ return empty || optall.queue === false ?
+ this.each( doAnimation ) :
+ this.queue( optall.queue, doAnimation );
+ },
+ stop: function( type, clearQueue, gotoEnd ) {
+ var stopQueue = function( hooks ) {
+ var stop = hooks.stop;
+ delete hooks.stop;
+ stop( gotoEnd );
+ };
+
+ if ( typeof type !== "string" ) {
+ gotoEnd = clearQueue;
+ clearQueue = type;
+ type = undefined;
+ }
+ if ( clearQueue && type !== false ) {
+ this.queue( type || "fx", [] );
+ }
+
+ return this.each(function() {
+ var dequeue = true,
+ index = type != null && type + "queueHooks",
+ timers = jQuery.timers,
+ data = data_priv.get( this );
+
+ if ( index ) {
+ if ( data[ index ] && data[ index ].stop ) {
+ stopQueue( data[ index ] );
+ }
+ } else {
+ for ( index in data ) {
+ if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+ stopQueue( data[ index ] );
+ }
+ }
+ }
+
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+ timers[ index ].anim.stop( gotoEnd );
+ dequeue = false;
+ timers.splice( index, 1 );
+ }
+ }
+
+ // start the next in the queue if the last step wasn't forced
+ // timers currently will call their complete callbacks, which will dequeue
+ // but only if they were gotoEnd
+ if ( dequeue || !gotoEnd ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ finish: function( type ) {
+ if ( type !== false ) {
+ type = type || "fx";
+ }
+ return this.each(function() {
+ var index,
+ data = data_priv.get( this ),
+ queue = data[ type + "queue" ],
+ hooks = data[ type + "queueHooks" ],
+ timers = jQuery.timers,
+ length = queue ? queue.length : 0;
+
+ // enable finishing flag on private data
+ data.finish = true;
+
+ // empty the queue first
+ jQuery.queue( this, type, [] );
+
+ if ( hooks && hooks.stop ) {
+ hooks.stop.call( this, true );
+ }
+
+ // look for any active animations, and finish them
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+ timers[ index ].anim.stop( true );
+ timers.splice( index, 1 );
+ }
+ }
+
+ // look for any animations in the old queue and finish them
+ for ( index = 0; index < length; index++ ) {
+ if ( queue[ index ] && queue[ index ].finish ) {
+ queue[ index ].finish.call( this );
+ }
+ }
+
+ // turn off finishing flag
+ delete data.finish;
+ });
+ }
+});
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+ var cssFn = jQuery.fn[ name ];
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return speed == null || typeof speed === "boolean" ?
+ cssFn.apply( this, arguments ) :
+ this.animate( genFx( name, true ), speed, easing, callback );
+ };
+});
+
+// Generate shortcuts for custom animations
+jQuery.each({
+ slideDown: genFx("show"),
+ slideUp: genFx("hide"),
+ slideToggle: genFx("toggle"),
+ fadeIn: { opacity: "show" },
+ fadeOut: { opacity: "hide" },
+ fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return this.animate( props, speed, easing, callback );
+ };
+});
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+ var timer,
+ i = 0,
+ timers = jQuery.timers;
+
+ fxNow = jQuery.now();
+
+ for ( ; i < timers.length; i++ ) {
+ timer = timers[ i ];
+ // Checks the timer has not already been removed
+ if ( !timer() && timers[ i ] === timer ) {
+ timers.splice( i--, 1 );
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+ jQuery.timers.push( timer );
+ if ( timer() ) {
+ jQuery.fx.start();
+ } else {
+ jQuery.timers.pop();
+ }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+ if ( !timerId ) {
+ timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+ }
+};
+
+jQuery.fx.stop = function() {
+ clearInterval( timerId );
+ timerId = null;
+};
+
+jQuery.fx.speeds = {
+ slow: 600,
+ fast: 200,
+ // Default speed
+ _default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = setTimeout( next, time );
+ hooks.stop = function() {
+ clearTimeout( timeout );
+ };
+ });
+};
+
+
+(function() {
+ var input = document.createElement( "input" ),
+ select = document.createElement( "select" ),
+ opt = select.appendChild( document.createElement( "option" ) );
+
+ input.type = "checkbox";
+
+ // Support: iOS 5.1, Android 4.x, Android 2.3
+ // Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere)
+ support.checkOn = input.value !== "";
+
+ // Must access the parent to make an option select properly
+ // Support: IE9, IE10
+ support.optSelected = opt.selected;
+
+ // Make sure that the options inside disabled selects aren't marked as disabled
+ // (WebKit marks them as disabled)
+ select.disabled = true;
+ support.optDisabled = !opt.disabled;
+
+ // Check if an input maintains its value after becoming a radio
+ // Support: IE9, IE10
+ input = document.createElement( "input" );
+ input.value = "t";
+ input.type = "radio";
+ support.radioValue = input.value === "t";
+})();
+
+
+var nodeHook, boolHook,
+ attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return access( this, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr: function( name ) {
+ return this.each(function() {
+ jQuery.removeAttr( this, name );
+ });
+ }
+});
+
+jQuery.extend({
+ attr: function( elem, name, value ) {
+ var hooks, ret,
+ nType = elem.nodeType;
+
+ // don't get/set attributes on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( typeof elem.getAttribute === strundefined ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ // All attributes are lowercase
+ // Grab necessary hook if one is defined
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+ name = name.toLowerCase();
+ hooks = jQuery.attrHooks[ name ] ||
+ ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+ }
+
+ if ( value !== undefined ) {
+
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+
+ } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ elem.setAttribute( name, value + "" );
+ return value;
+ }
+
+ } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+ ret = jQuery.find.attr( elem, name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ?
+ undefined :
+ ret;
+ }
+ },
+
+ removeAttr: function( elem, value ) {
+ var name, propName,
+ i = 0,
+ attrNames = value && value.match( rnotwhite );
+
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( (name = attrNames[i++]) ) {
+ propName = jQuery.propFix[ name ] || name;
+
+ // Boolean attributes get special treatment (#10870)
+ if ( jQuery.expr.match.bool.test( name ) ) {
+ // Set corresponding property to false
+ elem[ propName ] = false;
+ }
+
+ elem.removeAttribute( name );
+ }
+ }
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ if ( !support.radioValue && value === "radio" &&
+ jQuery.nodeName( elem, "input" ) ) {
+ // Setting the type on a radio button after the value resets the value in IE6-9
+ // Reset value to default in case type is set after value during creation
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
+ }
+});
+
+// Hooks for boolean attributes
+boolHook = {
+ set: function( elem, value, name ) {
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else {
+ elem.setAttribute( name, name );
+ }
+ return name;
+ }
+};
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+ var getter = attrHandle[ name ] || jQuery.find.attr;
+
+ attrHandle[ name ] = function( elem, name, isXML ) {
+ var ret, handle;
+ if ( !isXML ) {
+ // Avoid an infinite loop by temporarily removing this function from the getter
+ handle = attrHandle[ name ];
+ attrHandle[ name ] = ret;
+ ret = getter( elem, name, isXML ) != null ?
+ name.toLowerCase() :
+ null;
+ attrHandle[ name ] = handle;
+ }
+ return ret;
+ };
+});
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i;
+
+jQuery.fn.extend({
+ prop: function( name, value ) {
+ return access( this, jQuery.prop, name, value, arguments.length > 1 );
+ },
+
+ removeProp: function( name ) {
+ return this.each(function() {
+ delete this[ jQuery.propFix[ name ] || name ];
+ });
+ }
+});
+
+jQuery.extend({
+ propFix: {
+ "for": "htmlFor",
+ "class": "className"
+ },
+
+ prop: function( elem, name, value ) {
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
+ // don't get/set properties on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ if ( notxml ) {
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+ ret :
+ ( elem[ name ] = value );
+
+ } else {
+ return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+ ret :
+ elem[ name ];
+ }
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+ return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
+ elem.tabIndex :
+ -1;
+ }
+ }
+ }
+});
+
+// Support: IE9+
+// Selectedness for an option in an optgroup can be inaccurate
+if ( !support.optSelected ) {
+ jQuery.propHooks.selected = {
+ get: function( elem ) {
+ var parent = elem.parentNode;
+ if ( parent && parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ return null;
+ }
+ };
+}
+
+jQuery.each([
+ "tabIndex",
+ "readOnly",
+ "maxLength",
+ "cellSpacing",
+ "cellPadding",
+ "rowSpan",
+ "colSpan",
+ "useMap",
+ "frameBorder",
+ "contentEditable"
+], function() {
+ jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+
+
+
+var rclass = /[\t\r\n\f]/g;
+
+jQuery.fn.extend({
+ addClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).addClass( value.call( this, j, this.className ) );
+ });
+ }
+
+ if ( proceed ) {
+ // The disjunction here is for better compressibility (see removeClass)
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ " "
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
+ }
+ }
+
+ // only assign if different to avoid unneeded rendering.
+ finalValue = jQuery.trim( cur );
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = arguments.length === 0 || typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).removeClass( value.call( this, j, this.className ) );
+ });
+ }
+ if ( proceed ) {
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ ""
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
+ }
+ }
+
+ // only assign if different to avoid unneeded rendering.
+ finalValue = value ? jQuery.trim( cur ) : "";
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value;
+
+ if ( typeof stateVal === "boolean" && type === "string" ) {
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
+ }
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery( this ),
+ classNames = value.match( rnotwhite ) || [];
+
+ while ( (className = classNames[ i++ ]) ) {
+ // check each className given, space separated list
+ if ( self.hasClass( className ) ) {
+ self.removeClass( className );
+ } else {
+ self.addClass( className );
+ }
+ }
+
+ // Toggle whole class name
+ } else if ( type === strundefined || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ data_priv.set( this, "__className__", this.className );
+ }
+
+ // If the element has a class name or if we're passed "false",
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
+ }
+ });
+ },
+
+ hasClass: function( selector ) {
+ var className = " " + selector + " ",
+ i = 0,
+ l = this.length;
+ for ( ; i < l; i++ ) {
+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+});
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend({
+ val: function( value ) {
+ var hooks, ret, isFunction,
+ elem = this[0];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ return typeof ret === "string" ?
+ // handle most common string cases
+ ret.replace(rreturn, "") :
+ // handle cases where value is null/undef or number
+ ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ isFunction = jQuery.isFunction( value );
+
+ return this.each(function( i ) {
+ var val;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call( this, i, jQuery( this ).val() );
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+
+ } else if ( typeof val === "number" ) {
+ val += "";
+
+ } else if ( jQuery.isArray( val ) ) {
+ val = jQuery.map( val, function( value ) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+ this.value = val;
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ valHooks: {
+ option: {
+ get: function( elem ) {
+ var val = jQuery.find.attr( elem, "value" );
+ return val != null ?
+ val :
+ // Support: IE10-11+
+ // option.text throws exceptions (#14686, #14858)
+ jQuery.trim( jQuery.text( elem ) );
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, option,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one" || index < 0,
+ values = one ? null : [],
+ max = one ? index + 1 : options.length,
+ i = index < 0 ?
+ max :
+ one ? index : 0;
+
+ // Loop through all the selected options
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // IE6-9 doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+ // Don't return options that are disabled or in a disabled optgroup
+ ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) &&
+ ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var optionSet, option,
+ options = elem.options,
+ values = jQuery.makeArray( value ),
+ i = options.length;
+
+ while ( i-- ) {
+ option = options[ i ];
+ if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {
+ optionSet = true;
+ }
+ }
+
+ // force browsers to behave consistently when non-matching value is set
+ if ( !optionSet ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ }
+});
+
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ set: function( elem, value ) {
+ if ( jQuery.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+ }
+ }
+ };
+ if ( !support.checkOn ) {
+ jQuery.valHooks[ this ].get = function( elem ) {
+ // Support: Webkit
+ // "" is returned instead of "on" if a value isn't specified
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ };
+ }
+});
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+});
+
+jQuery.fn.extend({
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ },
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+ }
+});
+
+
+var nonce = jQuery.now();
+
+var rquery = (/\?/);
+
+
+
+// Support: Android 2.3
+// Workaround failure to string-cast null input
+jQuery.parseJSON = function( data ) {
+ return JSON.parse( data + "" );
+};
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+ var xml, tmp;
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+
+ // Support: IE9
+ try {
+ tmp = new DOMParser();
+ xml = tmp.parseFromString( data, "text/xml" );
+ } catch ( e ) {
+ xml = undefined;
+ }
+
+ if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
+ jQuery.error( "Invalid XML: " + data );
+ }
+ return xml;
+};
+
+
+var
+ // Document location
+ ajaxLocParts,
+ ajaxLocation,
+
+ rhash = /#.*$/,
+ rts = /([?&])_=[^&]*/,
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+ // #7653, #8125, #8152: local protocol detection
+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rprotocol = /^\/\//,
+ rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
+
+ /* Prefilters
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+ * 2) These are called:
+ * - BEFORE asking for a transport
+ * - AFTER param serialization (s.data is a string if s.processData is true)
+ * 3) key is the dataType
+ * 4) the catchall symbol "*" can be used
+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+ */
+ prefilters = {},
+
+ /* Transports bindings
+ * 1) key is the dataType
+ * 2) the catchall symbol "*" can be used
+ * 3) selection will start with transport dataType and THEN go to "*" if needed
+ */
+ transports = {},
+
+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+ allTypes = "*/".concat("*");
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+ ajaxLocation = location.href;
+} catch( e ) {
+ // Use the href attribute of an A element
+ // since IE will modify it given document.location
+ ajaxLocation = document.createElement( "a" );
+ ajaxLocation.href = "";
+ ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+ // dataTypeExpression is optional and defaults to "*"
+ return function( dataTypeExpression, func ) {
+
+ if ( typeof dataTypeExpression !== "string" ) {
+ func = dataTypeExpression;
+ dataTypeExpression = "*";
+ }
+
+ var dataType,
+ i = 0,
+ dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
+
+ if ( jQuery.isFunction( func ) ) {
+ // For each dataType in the dataTypeExpression
+ while ( (dataType = dataTypes[i++]) ) {
+ // Prepend if requested
+ if ( dataType[0] === "+" ) {
+ dataType = dataType.slice( 1 ) || "*";
+ (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+ // Otherwise append
+ } else {
+ (structure[ dataType ] = structure[ dataType ] || []).push( func );
+ }
+ }
+ }
+ };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+ var inspected = {},
+ seekingTransport = ( structure === transports );
+
+ function inspect( dataType ) {
+ var selected;
+ inspected[ dataType ] = true;
+ jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+ var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+ if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+ options.dataTypes.unshift( dataTypeOrTransport );
+ inspect( dataTypeOrTransport );
+ return false;
+ } else if ( seekingTransport ) {
+ return !( selected = dataTypeOrTransport );
+ }
+ });
+ return selected;
+ }
+
+ return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+ var key, deep,
+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+ for ( key in src ) {
+ if ( src[ key ] !== undefined ) {
+ ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
+ }
+ }
+ if ( deep ) {
+ jQuery.extend( true, target, deep );
+ }
+
+ return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+ var ct, type, finalDataType, firstDataType,
+ contents = s.contents,
+ dataTypes = s.dataTypes;
+
+ // Remove auto dataType and get content-type in the process
+ while ( dataTypes[ 0 ] === "*" ) {
+ dataTypes.shift();
+ if ( ct === undefined ) {
+ ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+ }
+ }
+
+ // Check if we're dealing with a known content-type
+ if ( ct ) {
+ for ( type in contents ) {
+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
+ dataTypes.unshift( type );
+ break;
+ }
+ }
+ }
+
+ // Check to see if we have a response for the expected dataType
+ if ( dataTypes[ 0 ] in responses ) {
+ finalDataType = dataTypes[ 0 ];
+ } else {
+ // Try convertible dataTypes
+ for ( type in responses ) {
+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+ finalDataType = type;
+ break;
+ }
+ if ( !firstDataType ) {
+ firstDataType = type;
+ }
+ }
+ // Or just use first one
+ finalDataType = finalDataType || firstDataType;
+ }
+
+ // If we found a dataType
+ // We add the dataType to the list if needed
+ // and return the corresponding response
+ if ( finalDataType ) {
+ if ( finalDataType !== dataTypes[ 0 ] ) {
+ dataTypes.unshift( finalDataType );
+ }
+ return responses[ finalDataType ];
+ }
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+ var conv2, current, conv, tmp, prev,
+ converters = {},
+ // Work with a copy of dataTypes in case we need to modify it for conversion
+ dataTypes = s.dataTypes.slice();
+
+ // Create converters map with lowercased keys
+ if ( dataTypes[ 1 ] ) {
+ for ( conv in s.converters ) {
+ converters[ conv.toLowerCase() ] = s.converters[ conv ];
+ }
+ }
+
+ current = dataTypes.shift();
+
+ // Convert to each sequential dataType
+ while ( current ) {
+
+ if ( s.responseFields[ current ] ) {
+ jqXHR[ s.responseFields[ current ] ] = response;
+ }
+
+ // Apply the dataFilter if provided
+ if ( !prev && isSuccess && s.dataFilter ) {
+ response = s.dataFilter( response, s.dataType );
+ }
+
+ prev = current;
+ current = dataTypes.shift();
+
+ if ( current ) {
+
+ // There's only work to do if current dataType is non-auto
+ if ( current === "*" ) {
+
+ current = prev;
+
+ // Convert response if prev dataType is non-auto and differs from current
+ } else if ( prev !== "*" && prev !== current ) {
+
+ // Seek a direct converter
+ conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+ // If none found, seek a pair
+ if ( !conv ) {
+ for ( conv2 in converters ) {
+
+ // If conv2 outputs current
+ tmp = conv2.split( " " );
+ if ( tmp[ 1 ] === current ) {
+
+ // If prev can be converted to accepted input
+ conv = converters[ prev + " " + tmp[ 0 ] ] ||
+ converters[ "* " + tmp[ 0 ] ];
+ if ( conv ) {
+ // Condense equivalence converters
+ if ( conv === true ) {
+ conv = converters[ conv2 ];
+
+ // Otherwise, insert the intermediate dataType
+ } else if ( converters[ conv2 ] !== true ) {
+ current = tmp[ 0 ];
+ dataTypes.unshift( tmp[ 1 ] );
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ // Apply converter (if not an equivalence)
+ if ( conv !== true ) {
+
+ // Unless errors are allowed to bubble, catch and return them
+ if ( conv && s[ "throws" ] ) {
+ response = conv( response );
+ } else {
+ try {
+ response = conv( response );
+ } catch ( e ) {
+ return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return { state: "success", data: response };
+}
+
+jQuery.extend({
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {},
+
+ ajaxSettings: {
+ url: ajaxLocation,
+ type: "GET",
+ isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+ global: true,
+ processData: true,
+ async: true,
+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+ /*
+ timeout: 0,
+ data: null,
+ dataType: null,
+ username: null,
+ password: null,
+ cache: null,
+ throws: false,
+ traditional: false,
+ headers: {},
+ */
+
+ accepts: {
+ "*": allTypes,
+ text: "text/plain",
+ html: "text/html",
+ xml: "application/xml, text/xml",
+ json: "application/json, text/javascript"
+ },
+
+ contents: {
+ xml: /xml/,
+ html: /html/,
+ json: /json/
+ },
+
+ responseFields: {
+ xml: "responseXML",
+ text: "responseText",
+ json: "responseJSON"
+ },
+
+ // Data converters
+ // Keys separate source (or catchall "*") and destination types with a single space
+ converters: {
+
+ // Convert anything to text
+ "* text": String,
+
+ // Text to html (true = no transformation)
+ "text html": true,
+
+ // Evaluate text as a json expression
+ "text json": jQuery.parseJSON,
+
+ // Parse text as xml
+ "text xml": jQuery.parseXML
+ },
+
+ // For options that shouldn't be deep extended:
+ // you can add your own custom options here if
+ // and when you create one that shouldn't be
+ // deep extended (see ajaxExtend)
+ flatOptions: {
+ url: true,
+ context: true
+ }
+ },
+
+ // Creates a full fledged settings object into target
+ // with both ajaxSettings and settings fields.
+ // If target is omitted, writes into ajaxSettings.
+ ajaxSetup: function( target, settings ) {
+ return settings ?
+
+ // Building a settings object
+ ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+ // Extending ajaxSettings
+ ajaxExtend( jQuery.ajaxSettings, target );
+ },
+
+ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+ ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+ // Main method
+ ajax: function( url, options ) {
+
+ // If url is an object, simulate pre-1.5 signature
+ if ( typeof url === "object" ) {
+ options = url;
+ url = undefined;
+ }
+
+ // Force options to be an object
+ options = options || {};
+
+ var transport,
+ // URL without anti-cache param
+ cacheURL,
+ // Response headers
+ responseHeadersString,
+ responseHeaders,
+ // timeout handle
+ timeoutTimer,
+ // Cross-domain detection vars
+ parts,
+ // To know if global events are to be dispatched
+ fireGlobals,
+ // Loop variable
+ i,
+ // Create the final options object
+ s = jQuery.ajaxSetup( {}, options ),
+ // Callbacks context
+ callbackContext = s.context || s,
+ // Context for global events is callbackContext if it is a DOM node or jQuery collection
+ globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+ jQuery( callbackContext ) :
+ jQuery.event,
+ // Deferreds
+ deferred = jQuery.Deferred(),
+ completeDeferred = jQuery.Callbacks("once memory"),
+ // Status-dependent callbacks
+ statusCode = s.statusCode || {},
+ // Headers (they are sent all at once)
+ requestHeaders = {},
+ requestHeadersNames = {},
+ // The jqXHR state
+ state = 0,
+ // Default abort message
+ strAbort = "canceled",
+ // Fake xhr
+ jqXHR = {
+ readyState: 0,
+
+ // Builds headers hashtable if needed
+ getResponseHeader: function( key ) {
+ var match;
+ if ( state === 2 ) {
+ if ( !responseHeaders ) {
+ responseHeaders = {};
+ while ( (match = rheaders.exec( responseHeadersString )) ) {
+ responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+ }
+ }
+ match = responseHeaders[ key.toLowerCase() ];
+ }
+ return match == null ? null : match;
+ },
+
+ // Raw string
+ getAllResponseHeaders: function() {
+ return state === 2 ? responseHeadersString : null;
+ },
+
+ // Caches the header
+ setRequestHeader: function( name, value ) {
+ var lname = name.toLowerCase();
+ if ( !state ) {
+ name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+ requestHeaders[ name ] = value;
+ }
+ return this;
+ },
+
+ // Overrides response content-type header
+ overrideMimeType: function( type ) {
+ if ( !state ) {
+ s.mimeType = type;
+ }
+ return this;
+ },
+
+ // Status-dependent callbacks
+ statusCode: function( map ) {
+ var code;
+ if ( map ) {
+ if ( state < 2 ) {
+ for ( code in map ) {
+ // Lazy-add the new callback in a way that preserves old ones
+ statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+ }
+ } else {
+ // Execute the appropriate callbacks
+ jqXHR.always( map[ jqXHR.status ] );
+ }
+ }
+ return this;
+ },
+
+ // Cancel the request
+ abort: function( statusText ) {
+ var finalText = statusText || strAbort;
+ if ( transport ) {
+ transport.abort( finalText );
+ }
+ done( 0, finalText );
+ return this;
+ }
+ };
+
+ // Attach deferreds
+ deferred.promise( jqXHR ).complete = completeDeferred.add;
+ jqXHR.success = jqXHR.done;
+ jqXHR.error = jqXHR.fail;
+
+ // Remove hash character (#7531: and string promotion)
+ // Add protocol if not provided (prefilters might expect it)
+ // Handle falsy url in the settings object (#10093: consistency with old signature)
+ // We also use the url parameter if available
+ s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
+ .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+ // Alias method option to type as per ticket #12004
+ s.type = options.method || options.type || s.method || s.type;
+
+ // Extract dataTypes list
+ s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
+
+ // A cross-domain request is in order when we have a protocol:host:port mismatch
+ if ( s.crossDomain == null ) {
+ parts = rurl.exec( s.url.toLowerCase() );
+ s.crossDomain = !!( parts &&
+ ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+ ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+ ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+ );
+ }
+
+ // Convert data if not already a string
+ if ( s.data && s.processData && typeof s.data !== "string" ) {
+ s.data = jQuery.param( s.data, s.traditional );
+ }
+
+ // Apply prefilters
+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+ // If request was aborted inside a prefilter, stop there
+ if ( state === 2 ) {
+ return jqXHR;
+ }
+
+ // We can fire global events as of now if asked to
+ fireGlobals = s.global;
+
+ // Watch for a new set of requests
+ if ( fireGlobals && jQuery.active++ === 0 ) {
+ jQuery.event.trigger("ajaxStart");
+ }
+
+ // Uppercase the type
+ s.type = s.type.toUpperCase();
+
+ // Determine if request has content
+ s.hasContent = !rnoContent.test( s.type );
+
+ // Save the URL in case we're toying with the If-Modified-Since
+ // and/or If-None-Match header later on
+ cacheURL = s.url;
+
+ // More options handling for requests with no content
+ if ( !s.hasContent ) {
+
+ // If data is available, append data to url
+ if ( s.data ) {
+ cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+ // #9682: remove data so that it's not used in an eventual retry
+ delete s.data;
+ }
+
+ // Add anti-cache in url if needed
+ if ( s.cache === false ) {
+ s.url = rts.test( cacheURL ) ?
+
+ // If there is already a '_' parameter, set its value
+ cacheURL.replace( rts, "$1_=" + nonce++ ) :
+
+ // Otherwise add one to the end
+ cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
+ }
+ }
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ if ( jQuery.lastModified[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+ }
+ if ( jQuery.etag[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+ }
+ }
+
+ // Set the correct header, if data is being sent
+ if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+ jqXHR.setRequestHeader( "Content-Type", s.contentType );
+ }
+
+ // Set the Accepts header for the server, depending on the dataType
+ jqXHR.setRequestHeader(
+ "Accept",
+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+ s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+ s.accepts[ "*" ]
+ );
+
+ // Check for headers option
+ for ( i in s.headers ) {
+ jqXHR.setRequestHeader( i, s.headers[ i ] );
+ }
+
+ // Allow custom headers/mimetypes and early abort
+ if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+ // Abort if not done already and return
+ return jqXHR.abort();
+ }
+
+ // aborting is no longer a cancellation
+ strAbort = "abort";
+
+ // Install callbacks on deferreds
+ for ( i in { success: 1, error: 1, complete: 1 } ) {
+ jqXHR[ i ]( s[ i ] );
+ }
+
+ // Get transport
+ transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+ // If no transport, we auto-abort
+ if ( !transport ) {
+ done( -1, "No Transport" );
+ } else {
+ jqXHR.readyState = 1;
+
+ // Send global event
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+ }
+ // Timeout
+ if ( s.async && s.timeout > 0 ) {
+ timeoutTimer = setTimeout(function() {
+ jqXHR.abort("timeout");
+ }, s.timeout );
+ }
+
+ try {
+ state = 1;
+ transport.send( requestHeaders, done );
+ } catch ( e ) {
+ // Propagate exception as error if not done
+ if ( state < 2 ) {
+ done( -1, e );
+ // Simply rethrow otherwise
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ // Callback for when everything is done
+ function done( status, nativeStatusText, responses, headers ) {
+ var isSuccess, success, error, response, modified,
+ statusText = nativeStatusText;
+
+ // Called once
+ if ( state === 2 ) {
+ return;
+ }
+
+ // State is "done" now
+ state = 2;
+
+ // Clear timeout if it exists
+ if ( timeoutTimer ) {
+ clearTimeout( timeoutTimer );
+ }
+
+ // Dereference transport for early garbage collection
+ // (no matter how long the jqXHR object will be used)
+ transport = undefined;
+
+ // Cache response headers
+ responseHeadersString = headers || "";
+
+ // Set readyState
+ jqXHR.readyState = status > 0 ? 4 : 0;
+
+ // Determine if successful
+ isSuccess = status >= 200 && status < 300 || status === 304;
+
+ // Get response data
+ if ( responses ) {
+ response = ajaxHandleResponses( s, jqXHR, responses );
+ }
+
+ // Convert no matter what (that way responseXXX fields are always set)
+ response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+ // If successful, handle type chaining
+ if ( isSuccess ) {
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ modified = jqXHR.getResponseHeader("Last-Modified");
+ if ( modified ) {
+ jQuery.lastModified[ cacheURL ] = modified;
+ }
+ modified = jqXHR.getResponseHeader("etag");
+ if ( modified ) {
+ jQuery.etag[ cacheURL ] = modified;
+ }
+ }
+
+ // if no content
+ if ( status === 204 || s.type === "HEAD" ) {
+ statusText = "nocontent";
+
+ // if not modified
+ } else if ( status === 304 ) {
+ statusText = "notmodified";
+
+ // If we have data, let's convert it
+ } else {
+ statusText = response.state;
+ success = response.data;
+ error = response.error;
+ isSuccess = !error;
+ }
+ } else {
+ // We extract error from statusText
+ // then normalize statusText and status for non-aborts
+ error = statusText;
+ if ( status || !statusText ) {
+ statusText = "error";
+ if ( status < 0 ) {
+ status = 0;
+ }
+ }
+ }
+
+ // Set data for the fake xhr object
+ jqXHR.status = status;
+ jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+ // Success/Error
+ if ( isSuccess ) {
+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+ } else {
+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+ }
+
+ // Status-dependent callbacks
+ jqXHR.statusCode( statusCode );
+ statusCode = undefined;
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+ [ jqXHR, s, isSuccess ? success : error ] );
+ }
+
+ // Complete
+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+ // Handle the global AJAX counter
+ if ( !( --jQuery.active ) ) {
+ jQuery.event.trigger("ajaxStop");
+ }
+ }
+ }
+
+ return jqXHR;
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get( url, data, callback, "json" );
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get( url, undefined, callback, "script" );
+ }
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+ jQuery[ method ] = function( url, data, callback, type ) {
+ // shift arguments if data argument was omitted
+ if ( jQuery.isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = undefined;
+ }
+
+ return jQuery.ajax({
+ url: url,
+ type: method,
+ dataType: type,
+ data: data,
+ success: callback
+ });
+ };
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
+ jQuery.fn[ type ] = function( fn ) {
+ return this.on( type, fn );
+ };
+});
+
+
+jQuery._evalUrl = function( url ) {
+ return jQuery.ajax({
+ url: url,
+ type: "GET",
+ dataType: "script",
+ async: false,
+ global: false,
+ "throws": true
+ });
+};
+
+
+jQuery.fn.extend({
+ wrapAll: function( html ) {
+ var wrap;
+
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( html.call(this, i) );
+ });
+ }
+
+ if ( this[ 0 ] ) {
+
+ // The elements to wrap the target around
+ wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+ if ( this[ 0 ].parentNode ) {
+ wrap.insertBefore( this[ 0 ] );
+ }
+
+ wrap.map(function() {
+ var elem = this;
+
+ while ( elem.firstElementChild ) {
+ elem = elem.firstElementChild;
+ }
+
+ return elem;
+ }).append( this );
+ }
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapInner( html.call(this, i) );
+ });
+ }
+
+ return this.each(function() {
+ var self = jQuery( this ),
+ contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
+ }
+ });
+ },
+
+ wrap: function( html ) {
+ var isFunction = jQuery.isFunction( html );
+
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+ });
+ },
+
+ unwrap: function() {
+ return this.parent().each(function() {
+ if ( !jQuery.nodeName( this, "body" ) ) {
+ jQuery( this ).replaceWith( this.childNodes );
+ }
+ }).end();
+ }
+});
+
+
+jQuery.expr.filters.hidden = function( elem ) {
+ // Support: Opera <= 12.12
+ // Opera reports offsetWidths and offsetHeights less than zero on some elements
+ return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
+};
+jQuery.expr.filters.visible = function( elem ) {
+ return !jQuery.expr.filters.hidden( elem );
+};
+
+
+
+
+var r20 = /%20/g,
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+ var name;
+
+ if ( jQuery.isArray( obj ) ) {
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || rbracket.test( prefix ) ) {
+ // Treat each array item as a scalar.
+ add( prefix, v );
+
+ } else {
+ // Item is non-scalar (array or object), encode its numeric index.
+ buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+ }
+ });
+
+ } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+ // Serialize object item.
+ for ( name in obj ) {
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+ }
+
+ } else {
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+ var prefix,
+ s = [],
+ add = function( key, value ) {
+ // If value is a function, invoke it and return its value
+ value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+ s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+ };
+
+ // Set traditional to true for jQuery <= 1.3.2 behavior.
+ if ( traditional === undefined ) {
+ traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ });
+
+ } else {
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( prefix in a ) {
+ buildParams( prefix, a[ prefix ], traditional, add );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join( "&" ).replace( r20, "+" );
+};
+
+jQuery.fn.extend({
+ serialize: function() {
+ return jQuery.param( this.serializeArray() );
+ },
+ serializeArray: function() {
+ return this.map(function() {
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop( this, "elements" );
+ return elements ? jQuery.makeArray( elements ) : this;
+ })
+ .filter(function() {
+ var type = this.type;
+
+ // Use .is( ":disabled" ) so that fieldset[disabled] works
+ return this.name && !jQuery( this ).is( ":disabled" ) &&
+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+ ( this.checked || !rcheckableType.test( type ) );
+ })
+ .map(function( i, elem ) {
+ var val = jQuery( this ).val();
+
+ return val == null ?
+ null :
+ jQuery.isArray( val ) ?
+ jQuery.map( val, function( val ) {
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }) :
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }).get();
+ }
+});
+
+
+jQuery.ajaxSettings.xhr = function() {
+ try {
+ return new XMLHttpRequest();
+ } catch( e ) {}
+};
+
+var xhrId = 0,
+ xhrCallbacks = {},
+ xhrSuccessStatus = {
+ // file protocol always yields status code 0, assume 200
+ 0: 200,
+ // Support: IE9
+ // #1450: sometimes IE returns 1223 when it should be 204
+ 1223: 204
+ },
+ xhrSupported = jQuery.ajaxSettings.xhr();
+
+// Support: IE9
+// Open requests must be manually aborted on unload (#5280)
+if ( window.ActiveXObject ) {
+ jQuery( window ).on( "unload", function() {
+ for ( var key in xhrCallbacks ) {
+ xhrCallbacks[ key ]();
+ }
+ });
+}
+
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport(function( options ) {
+ var callback;
+
+ // Cross domain only allowed if supported through XMLHttpRequest
+ if ( support.cors || xhrSupported && !options.crossDomain ) {
+ return {
+ send: function( headers, complete ) {
+ var i,
+ xhr = options.xhr(),
+ id = ++xhrId;
+
+ xhr.open( options.type, options.url, options.async, options.username, options.password );
+
+ // Apply custom fields if provided
+ if ( options.xhrFields ) {
+ for ( i in options.xhrFields ) {
+ xhr[ i ] = options.xhrFields[ i ];
+ }
+ }
+
+ // Override mime type if needed
+ if ( options.mimeType && xhr.overrideMimeType ) {
+ xhr.overrideMimeType( options.mimeType );
+ }
+
+ // X-Requested-With header
+ // For cross-domain requests, seeing as conditions for a preflight are
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
+ // (it can always be set on a per-request basis or even using ajaxSetup)
+ // For same-domain requests, won't change header if already provided.
+ if ( !options.crossDomain && !headers["X-Requested-With"] ) {
+ headers["X-Requested-With"] = "XMLHttpRequest";
+ }
+
+ // Set headers
+ for ( i in headers ) {
+ xhr.setRequestHeader( i, headers[ i ] );
+ }
+
+ // Callback
+ callback = function( type ) {
+ return function() {
+ if ( callback ) {
+ delete xhrCallbacks[ id ];
+ callback = xhr.onload = xhr.onerror = null;
+
+ if ( type === "abort" ) {
+ xhr.abort();
+ } else if ( type === "error" ) {
+ complete(
+ // file: protocol always yields status 0; see #8605, #14207
+ xhr.status,
+ xhr.statusText
+ );
+ } else {
+ complete(
+ xhrSuccessStatus[ xhr.status ] || xhr.status,
+ xhr.statusText,
+ // Support: IE9
+ // Accessing binary-data responseText throws an exception
+ // (#11426)
+ typeof xhr.responseText === "string" ? {
+ text: xhr.responseText
+ } : undefined,
+ xhr.getAllResponseHeaders()
+ );
+ }
+ }
+ };
+ };
+
+ // Listen to events
+ xhr.onload = callback();
+ xhr.onerror = callback("error");
+
+ // Create the abort callback
+ callback = xhrCallbacks[ id ] = callback("abort");
+
+ try {
+ // Do send the request (this may raise an exception)
+ xhr.send( options.hasContent && options.data || null );
+ } catch ( e ) {
+ // #14683: Only rethrow if this hasn't been notified as an error yet
+ if ( callback ) {
+ throw e;
+ }
+ }
+ },
+
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+ accepts: {
+ script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+ },
+ contents: {
+ script: /(?:java|ecma)script/
+ },
+ converters: {
+ "text script": function( text ) {
+ jQuery.globalEval( text );
+ return text;
+ }
+ }
+});
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+ if ( s.cache === undefined ) {
+ s.cache = false;
+ }
+ if ( s.crossDomain ) {
+ s.type = "GET";
+ }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+ // This transport only deals with cross domain requests
+ if ( s.crossDomain ) {
+ var script, callback;
+ return {
+ send: function( _, complete ) {
+ script = jQuery("<script>").prop({
+ async: true,
+ charset: s.scriptCharset,
+ src: s.url
+ }).on(
+ "load error",
+ callback = function( evt ) {
+ script.remove();
+ callback = null;
+ if ( evt ) {
+ complete( evt.type === "error" ? 404 : 200, evt.type );
+ }
+ }
+ );
+ document.head.appendChild( script[ 0 ] );
+ },
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+var oldCallbacks = [],
+ rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+ jsonp: "callback",
+ jsonpCallback: function() {
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+ this[ callback ] = true;
+ return callback;
+ }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+ var callbackName, overwritten, responseContainer,
+ jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+ "url" :
+ typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+ );
+
+ // Handle iff the expected data type is "jsonp" or we have a parameter to set
+ if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+ // Get callback name, remembering preexisting value associated with it
+ callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+ s.jsonpCallback() :
+ s.jsonpCallback;
+
+ // Insert callback into url or form data
+ if ( jsonProp ) {
+ s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+ } else if ( s.jsonp !== false ) {
+ s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+ }
+
+ // Use data converter to retrieve json after script execution
+ s.converters["script json"] = function() {
+ if ( !responseContainer ) {
+ jQuery.error( callbackName + " was not called" );
+ }
+ return responseContainer[ 0 ];
+ };
+
+ // force json dataType
+ s.dataTypes[ 0 ] = "json";
+
+ // Install callback
+ overwritten = window[ callbackName ];
+ window[ callbackName ] = function() {
+ responseContainer = arguments;
+ };
+
+ // Clean-up function (fires after converters)
+ jqXHR.always(function() {
+ // Restore preexisting value
+ window[ callbackName ] = overwritten;
+
+ // Save back as free
+ if ( s[ callbackName ] ) {
+ // make sure that re-using the options doesn't screw things around
+ s.jsonpCallback = originalSettings.jsonpCallback;
+
+ // save the callback name for future use
+ oldCallbacks.push( callbackName );
+ }
+
+ // Call if it was a function and we have a response
+ if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+ overwritten( responseContainer[ 0 ] );
+ }
+
+ responseContainer = overwritten = undefined;
+ });
+
+ // Delegate to script
+ return "script";
+ }
+});
+
+
+
+
+// data: string of html
+// context (optional): If specified, the fragment will be created in this context, defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+ if ( typeof context === "boolean" ) {
+ keepScripts = context;
+ context = false;
+ }
+ context = context || document;
+
+ var parsed = rsingleTag.exec( data ),
+ scripts = !keepScripts && [];
+
+ // Single tag
+ if ( parsed ) {
+ return [ context.createElement( parsed[1] ) ];
+ }
+
+ parsed = jQuery.buildFragment( [ data ], context, scripts );
+
+ if ( scripts && scripts.length ) {
+ jQuery( scripts ).remove();
+ }
+
+ return jQuery.merge( [], parsed.childNodes );
+};
+
+
+// Keep a copy of the old load method
+var _load = jQuery.fn.load;
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+ if ( typeof url !== "string" && _load ) {
+ return _load.apply( this, arguments );
+ }
+
+ var selector, type, response,
+ self = this,
+ off = url.indexOf(" ");
+
+ if ( off >= 0 ) {
+ selector = jQuery.trim( url.slice( off ) );
+ url = url.slice( 0, off );
+ }
+
+ // If it's a function
+ if ( jQuery.isFunction( params ) ) {
+
+ // We assume that it's the callback
+ callback = params;
+ params = undefined;
+
+ // Otherwise, build a param string
+ } else if ( params && typeof params === "object" ) {
+ type = "POST";
+ }
+
+ // If we have elements to modify, make the request
+ if ( self.length > 0 ) {
+ jQuery.ajax({
+ url: url,
+
+ // if "type" variable is undefined, then "GET" method will be used
+ type: type,
+ dataType: "html",
+ data: params
+ }).done(function( responseText ) {
+
+ // Save response for use in complete callback
+ response = arguments;
+
+ self.html( selector ?
+
+ // If a selector was specified, locate the right elements in a dummy div
+ // Exclude scripts to avoid IE 'Permission Denied' errors
+ jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+ // Otherwise use the full result
+ responseText );
+
+ }).complete( callback && function( jqXHR, status ) {
+ self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+ });
+ }
+
+ return this;
+};
+
+
+
+
+jQuery.expr.filters.animated = function( elem ) {
+ return jQuery.grep(jQuery.timers, function( fn ) {
+ return elem === fn.elem;
+ }).length;
+};
+
+
+
+
+var docElem = window.document.documentElement;
+
+/**
+ * Gets a window from an element
+ */
+function getWindow( elem ) {
+ return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
+}
+
+jQuery.offset = {
+ setOffset: function( elem, options, i ) {
+ var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+ position = jQuery.css( elem, "position" ),
+ curElem = jQuery( elem ),
+ props = {};
+
+ // Set position first, in-case top/left are set even on static elem
+ if ( position === "static" ) {
+ elem.style.position = "relative";
+ }
+
+ curOffset = curElem.offset();
+ curCSSTop = jQuery.css( elem, "top" );
+ curCSSLeft = jQuery.css( elem, "left" );
+ calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+ ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
+
+ // Need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+ if ( calculatePosition ) {
+ curPosition = curElem.position();
+ curTop = curPosition.top;
+ curLeft = curPosition.left;
+
+ } else {
+ curTop = parseFloat( curCSSTop ) || 0;
+ curLeft = parseFloat( curCSSLeft ) || 0;
+ }
+
+ if ( jQuery.isFunction( options ) ) {
+ options = options.call( elem, i, curOffset );
+ }
+
+ if ( options.top != null ) {
+ props.top = ( options.top - curOffset.top ) + curTop;
+ }
+ if ( options.left != null ) {
+ props.left = ( options.left - curOffset.left ) + curLeft;
+ }
+
+ if ( "using" in options ) {
+ options.using.call( elem, props );
+
+ } else {
+ curElem.css( props );
+ }
+ }
+};
+
+jQuery.fn.extend({
+ offset: function( options ) {
+ if ( arguments.length ) {
+ return options === undefined ?
+ this :
+ this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ var docElem, win,
+ elem = this[ 0 ],
+ box = { top: 0, left: 0 },
+ doc = elem && elem.ownerDocument;
+
+ if ( !doc ) {
+ return;
+ }
+
+ docElem = doc.documentElement;
+
+ // Make sure it's not a disconnected DOM node
+ if ( !jQuery.contains( docElem, elem ) ) {
+ return box;
+ }
+
+ // If we don't have gBCR, just use 0,0 rather than error
+ // BlackBerry 5, iOS 3 (original iPhone)
+ if ( typeof elem.getBoundingClientRect !== strundefined ) {
+ box = elem.getBoundingClientRect();
+ }
+ win = getWindow( doc );
+ return {
+ top: box.top + win.pageYOffset - docElem.clientTop,
+ left: box.left + win.pageXOffset - docElem.clientLeft
+ };
+ },
+
+ position: function() {
+ if ( !this[ 0 ] ) {
+ return;
+ }
+
+ var offsetParent, offset,
+ elem = this[ 0 ],
+ parentOffset = { top: 0, left: 0 };
+
+ // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
+ if ( jQuery.css( elem, "position" ) === "fixed" ) {
+ // We assume that getBoundingClientRect is available when computed position is fixed
+ offset = elem.getBoundingClientRect();
+
+ } else {
+ // Get *real* offsetParent
+ offsetParent = this.offsetParent();
+
+ // Get correct offsets
+ offset = this.offset();
+ if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+ parentOffset = offsetParent.offset();
+ }
+
+ // Add offsetParent borders
+ parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+ parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+ }
+
+ // Subtract parent offsets and element margins
+ return {
+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+ };
+ },
+
+ offsetParent: function() {
+ return this.map(function() {
+ var offsetParent = this.offsetParent || docElem;
+
+ while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
+ offsetParent = offsetParent.offsetParent;
+ }
+
+ return offsetParent || docElem;
+ });
+ }
+});
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+ var top = "pageYOffset" === prop;
+
+ jQuery.fn[ method ] = function( val ) {
+ return access( this, function( elem, method, val ) {
+ var win = getWindow( elem );
+
+ if ( val === undefined ) {
+ return win ? win[ prop ] : elem[ method ];
+ }
+
+ if ( win ) {
+ win.scrollTo(
+ !top ? val : window.pageXOffset,
+ top ? val : window.pageYOffset
+ );
+
+ } else {
+ elem[ method ] = val;
+ }
+ }, method, val, arguments.length, null );
+ };
+});
+
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// getComputedStyle returns percent when specified for top/left/bottom/right
+// rather than make the css module depend on the offset module, we just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+ jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+ function( elem, computed ) {
+ if ( computed ) {
+ computed = curCSS( elem, prop );
+ // if curCSS returns percentage, fallback to offset
+ return rnumnonpx.test( computed ) ?
+ jQuery( elem ).position()[ prop ] + "px" :
+ computed;
+ }
+ }
+ );
+});
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+ jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+ // margin is only for outerHeight, outerWidth
+ jQuery.fn[ funcName ] = function( margin, value ) {
+ var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+ extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+ return access( this, function( elem, type, value ) {
+ var doc;
+
+ if ( jQuery.isWindow( elem ) ) {
+ // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+ // isn't a whole lot we can do. See pull request at this URL for discussion:
+ // https://github.com/jquery/jquery/pull/764
+ return elem.document.documentElement[ "client" + name ];
+ }
+
+ // Get document width or height
+ if ( elem.nodeType === 9 ) {
+ doc = elem.documentElement;
+
+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+ // whichever is greatest
+ return Math.max(
+ elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+ elem.body[ "offset" + name ], doc[ "offset" + name ],
+ doc[ "client" + name ]
+ );
+ }
+
+ return value === undefined ?
+ // Get width or height on the element, requesting but not forcing parseFloat
+ jQuery.css( elem, type, extra ) :
+
+ // Set width or height on the element
+ jQuery.style( elem, type, value, extra );
+ }, type, chainable ? margin : undefined, chainable, null );
+ };
+ });
+});
+
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+ return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+ define( "jquery", [], function() {
+ return jQuery;
+ });
+}
+
+
+
+
+var
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
+
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in
+// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( typeof noGlobal === strundefined ) {
+ window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+
+}));
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/jquery.easing.1.3.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/jquery.easing.1.3.js
new file mode 100644
index 0000000..ef74321
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/jquery.easing.1.3.js
@@ -0,0 +1,205 @@
+/*
+ * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
+ *
+ * Uses the built in easing capabilities added In jQuery 1.1
+ * to offer multiple easing options
+ *
+ * TERMS OF USE - jQuery Easing
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright © 2008 George McGinley Smith
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * Neither the name of the author nor the names of contributors may be used to endorse
+ * or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+// t: current time, b: begInnIng value, c: change In value, d: duration
+jQuery.easing['jswing'] = jQuery.easing['swing'];
+
+jQuery.extend( jQuery.easing,
+{
+ def: 'easeOutQuad',
+ swing: function (x, t, b, c, d) {
+ //alert(jQuery.easing.default);
+ return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
+ },
+ easeInQuad: function (x, t, b, c, d) {
+ return c*(t/=d)*t + b;
+ },
+ easeOutQuad: function (x, t, b, c, d) {
+ return -c *(t/=d)*(t-2) + b;
+ },
+ easeInOutQuad: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t + b;
+ return -c/2 * ((--t)*(t-2) - 1) + b;
+ },
+ easeInCubic: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t + b;
+ },
+ easeOutCubic: function (x, t, b, c, d) {
+ return c*((t=t/d-1)*t*t + 1) + b;
+ },
+ easeInOutCubic: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t + b;
+ return c/2*((t-=2)*t*t + 2) + b;
+ },
+ easeInQuart: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t*t + b;
+ },
+ easeOutQuart: function (x, t, b, c, d) {
+ return -c * ((t=t/d-1)*t*t*t - 1) + b;
+ },
+ easeInOutQuart: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
+ return -c/2 * ((t-=2)*t*t*t - 2) + b;
+ },
+ easeInQuint: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t*t*t + b;
+ },
+ easeOutQuint: function (x, t, b, c, d) {
+ return c*((t=t/d-1)*t*t*t*t + 1) + b;
+ },
+ easeInOutQuint: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
+ return c/2*((t-=2)*t*t*t*t + 2) + b;
+ },
+ easeInSine: function (x, t, b, c, d) {
+ return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
+ },
+ easeOutSine: function (x, t, b, c, d) {
+ return c * Math.sin(t/d * (Math.PI/2)) + b;
+ },
+ easeInOutSine: function (x, t, b, c, d) {
+ return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
+ },
+ easeInExpo: function (x, t, b, c, d) {
+ return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
+ },
+ easeOutExpo: function (x, t, b, c, d) {
+ return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
+ },
+ easeInOutExpo: function (x, t, b, c, d) {
+ if (t==0) return b;
+ if (t==d) return b+c;
+ if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
+ return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
+ },
+ easeInCirc: function (x, t, b, c, d) {
+ return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
+ },
+ easeOutCirc: function (x, t, b, c, d) {
+ return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
+ },
+ easeInOutCirc: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
+ return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
+ },
+ easeInElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+ },
+ easeOutElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
+ },
+ easeInOutElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+ return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
+ },
+ easeInBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ return c*(t/=d)*t*((s+1)*t - s) + b;
+ },
+ easeOutBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+ },
+ easeInOutBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
+ return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+ },
+ easeInBounce: function (x, t, b, c, d) {
+ return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
+ },
+ easeOutBounce: function (x, t, b, c, d) {
+ if ((t/=d) < (1/2.75)) {
+ return c*(7.5625*t*t) + b;
+ } else if (t < (2/2.75)) {
+ return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
+ } else if (t < (2.5/2.75)) {
+ return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
+ } else {
+ return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
+ }
+ },
+ easeInOutBounce: function (x, t, b, c, d) {
+ if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
+ return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
+ }
+});
+
+/*
+ *
+ * TERMS OF USE - EASING EQUATIONS
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright © 2001 Robert Penner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * Neither the name of the author nor the names of contributors may be used to endorse
+ * or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */ \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/README b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/README
new file mode 100644
index 0000000..e442861
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/README
@@ -0,0 +1,21 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+All images in this directory are free, released under the GPLv3 or later. \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/librejs-off.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/librejs-off.png
new file mode 100644
index 0000000..abb7b95
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/librejs-off.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/librejs.png b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/librejs.png
new file mode 100644
index 0000000..ee6a59b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/librejs.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/widget.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/widget.js
new file mode 100644
index 0000000..5bbb77a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/widget.js
@@ -0,0 +1,32 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+this.addEventListener('click', function(event) {
+ if(event.button === 0 && event.shiftKey === false) {
+
+ self.port.emit('left-click');
+
+ }
+
+ if(event.button == 2 || (event.button === 0 && event.shiftKey === true)){
+ self.port.emit('right-click');
+ }
+ event.preventDefault();
+}, true);
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/addon_management/install_uninstall.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/addon_management/install_uninstall.js
new file mode 100644
index 0000000..6a4999d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/addon_management/install_uninstall.js
@@ -0,0 +1,68 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * The following module is intended to perform tasks when the
+ * add-on is enabled and disabled.
+ */
+
+const {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+const httpObserver = require("http_observer/http_request_observer");
+
+const narcissusWorker = require("narcissus_parser/narcissus_worker");
+
+const caching = require("http_observer/caching");
+
+const prompt = Cc["@mozilla.org/embedcomp/prompt-service;1"].
+ getService(Ci.nsIPromptService);
+
+
+const tabs = require('sdk/tabs');
+
+/**
+ * Stop the httpObserver when the add-on
+ * is disabled or removed.
+ */
+exports.onUnload = function(reason) {
+
+ if (reason == "disable" ||
+ reason == "shutdown" ||
+ reason == "upgrade" ||
+ reason == "downgrade") {
+ require("settings/storage").librejsStorage.writeCacheToDB();
+ // remove all http notifications
+ httpObserver.removeHttpObserver();
+ // remove worker.
+ narcissusWorker.stopWorker();
+ }
+
+};
+
+exports.onLoad = function () {
+ try {
+ var clearCache = prompt.dialog(null, "LibreJS installation", "If you have tabs and windows opened prior to installing LibreJS, you will have to refresh them for their JavaScript to be analyzed and blocked. Press OK to clear the browser cache.");
+ if (clearCache) {
+ caching.clearAllCache();
+ }
+ } catch (e) {
+ console.debug(e);
+ }
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/addon_management/prefchange.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/addon_management/prefchange.js
new file mode 100644
index 0000000..532dd81
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/addon_management/prefchange.js
@@ -0,0 +1,118 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var whitelist = [];
+
+var prefSet = require("sdk/simple-prefs");
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+var prompt = Cc['@mozilla.org/embedcomp/prompt-service;1'].
+ getService(Ci.nsIPromptService);
+var scriptsCached = require("script_entries/scripts_cache").scriptsCached;
+
+var setWhitelist = function () {
+
+ whitelist = [];
+
+ var str;
+
+ var whitelistString = prefSet.prefs.whitelist.split(',');
+
+ for (var i = 0; i < whitelistString.length; i++) {
+
+ // remove space, trailing slash, escape any nonalpha except *, replace * with .*
+ str = whitelistString[i].replace(" ", "").replace(/\/$/, "").replace(/[^a-z0-9\*]/ig, "\\$&").replace("*", ".*");
+
+ if (str !== '') {
+ whitelist.push(new RegExp('^https?:\/\/(www\.)?' + str + '/', 'i'));
+ }
+
+ }
+
+};
+
+exports.getWhitelist = function () {
+ return whitelist;
+};
+
+exports.init = function () {
+ setWhitelist();
+};
+
+prefSet.on("whitelist", setWhitelist);
+
+var setDryRun = function () {
+ var dryRun = prefSet.prefs.dryrun;
+ if (dryRun === true) {
+ prompt.alert(null, "LibreJS Dry Run Mode", "Is Dry Run Mode really what you want? LibreJS will still analyze JavaScript on a page, but it will not block any of it. As a result, ALL of the JavaScript on a page will run as is, whether it is free and trivial or not. You will not be warned again. Uncheck that box if you are unsure.");
+ scriptsCached.resetCache();
+ } else {
+ prompt.alert(null, "LibreJS Dry Run Mode", "LibreJS Dry Run Mode is now disabled");
+ }
+};
+
+//prefSet.on("dryrun", setDryRun);
+
+exports.isDryRun = function () {
+ /**
+ * Returns true if dryRun mode is enabled. False otherwise.
+ */
+ //return prefSet.prefs.dryrun;
+ return false;
+};
+
+
+
+var setComplaintTab = function () {
+ var complaintTab = prefSet.prefs.complaint_tab;
+ if (complaintTab === true) {
+ prompt.alert(null, "Turning on complaint tab", "A complaint tab will be displayed on pages where nonfree nontrivial JavaScript is found and contact information is found as well.");
+ } else {
+ prompt.alert(null, "Turning off complaint tab", "No complaint tab will appear on pages, even when nonfree nontrivial JavaScript is found.");
+ }
+};
+prefSet.on("complaint_tab", setComplaintTab);
+
+exports.isComplaintTab = function () {
+ /**
+ * Returns true if complaint tab mode is enabled. False otherwise.
+ */
+ return prefSet.prefs.complaint_tab;
+};
+
+
+
+var setDisplayNotifications = function () {
+ var displayNotifications = prefSet.prefs.display_notifications;
+ if (displayNotifications === true) {
+ prompt.alert(null, "Turning on notifications", "Notifications with code snippets will now appear while LibreJS is analyzing JavaScript on a page.");
+ } else {
+ prompt.alert(null, "Turning off notifications", "Notifications of code being analyzed will not be displayed.");
+ }
+};
+
+prefSet.on("display_notifications", setDisplayNotifications);
+
+exports.isDisplayNotifications = function () {
+ /**
+ * Returns true if complaint tab mode is enabled. False otherwise.
+ */
+ return prefSet.prefs.display_notifications;
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/bug_fix.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/bug_fix.js
new file mode 100644
index 0000000..bba7653
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/bug_fix.js
@@ -0,0 +1,23 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+exports.END_OF_SCRIPT = 'this.narcissusBugFixLibreJS'; // value from parse tree without \n\n
+exports.narcissusBugFixLibreJS = '\n\n' + exports.END_OF_SCRIPT; // real value from source.
+
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler.js
new file mode 100644
index 0000000..db0c46c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler.js
@@ -0,0 +1,560 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ *
+ * dom_handler.js
+ *
+ * After the HTML DOM has been parsed, domHandler finds all the scripts
+ * on a page (including inline, on-page, and external files), and triggers the
+ * JavaScript analysis for each of them.
+ *
+ */
+
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+var scriptProperties = require("html_script_finder/dom_handler/script_properties");
+
+const scriptTypes = scriptProperties.scriptTypes;
+
+const statusTypes = scriptProperties.statusTypes;
+
+const reasons = scriptProperties.reasons;
+
+var urlHandler = require("url_handler/url_handler");
+
+var WebLabelFinder = require("html_script_finder/web_labels/js_web_labels").WebLabelFinder;
+
+// object model for script entries.
+var scriptObject = require("html_script_finder/dom_handler/script_object");
+
+var privacyChecker = require("js_checker/privacy_checker").privacyCheck;
+var jsChecker = require("js_checker/js_checker");
+
+const types = require("js_checker/constant_types");
+
+var checkTypes = types.checkTypes;
+
+var stripCDATAOpen = /<\!\[CDATA\[/gi;
+var stripCDATAClose = /]]>/g;
+
+var isDryRun = require("addon_management/prefchange").isDryRun;
+var allowedRef = require('http_observer/allowed_referrers').allowedReferrers;
+
+var attributeHelpers = require("html_script_finder/dom_handler/attributes");
+
+// javascript:*
+var jsInAttrRe = attributeHelpers.jsInAttrRe;
+
+// the list of all available event attributes
+var intrinsecEvents = attributeHelpers.intrinsecEvents;
+
+var domGatherer = require("html_script_finder/dom_handler/dom_gatherer").domGatherer;
+
+var domChecker = require("html_script_finder/dom_handler/dom_checker").domChecker;
+
+/**
+ * The DomHandler object takes a whole document,
+ * finds script elements within that DOM, analyzes them
+ * using the js_checker module and finally returns a cleaned
+ * DOM depending on the result.
+ */
+var DomHandler = function() {
+ // external object with methods used
+ // in DomHandler
+ this.domGatherer = null;
+
+ // external object with methods used
+ // in DomHandler
+ this.domChecker = null;
+
+ this.dom = null;
+ this.pageURL = null;
+
+ // fragment found in url.
+ this.fragment = null;
+
+ // array containing all scripts on a page.
+ this.domScripts = null;
+
+ // array containing all scripts on a page,
+ // data related to them, such as parse tree, ...
+ this.inlineScripts = null;
+
+ this.externalScripts = null;
+
+ // all scripts.
+ this.scripts = null;
+
+ // keeps track of the number of scripts.
+ this.numScripts = 0;
+
+ // store the reference to the callback method
+ // presumably from htmlParser.
+ this.callback = null;
+
+ // boolean set to true if external scripts are loaded
+ // from the html page.
+ this.loadsHtmlExternalScripts = false;
+
+ this.jsCheckString = null;
+
+ /* object containing boolean property set to false if trivialness
+ is not allowed anymore (if another script defines ajax requests,
+ ...) */
+ this.allowTrivial = null;
+
+ // boolean set to true if inline JavaScript
+ // is found to be free.
+ this.inlineJsFree = null;
+
+ // boolean set to true when at least one script
+ // has been removed.
+ this.hasRemovedScripts = null;
+
+ // boolean to check if scripts were removed
+ // prevents removeAllJs from running multiple times.
+ this.removedAllScripts = null;
+
+ // will eventually contain an array of data
+ // for the js web labels licenses.
+ this.licenseList = null;
+
+ // the response status for the page (200, 404, ...)
+ this.responseStatus = null;
+
+ // count the number of scripts fully tested.
+ this.scriptsTested = null;
+
+ // number of external scripts to be tested.
+ this.numExternalScripts = null;
+
+ // number of inline/inattribute scripts
+ this.numInlineScripts = null;
+};
+
+/**
+ * Initialize properties of the object
+ *
+ * @param {domObject} obj A reference of the DOM object being
+ * analyzed.
+ *
+ * @param {pageURL} string The formatted URL (with fragment
+ * removed) of the corresponding page for this DOM
+ *
+ * @param {fragment} the #fragment from the url if applicable.
+ *
+ * @param {callback} the callback function.
+ *
+ */
+DomHandler.prototype.init = function(
+ domObject, pageURL, fragment, responseStatus, callback) {
+ // initialize object properties.
+
+ console.debug('init', pageURL);
+ var that = this;
+
+ this.reset();
+
+ // arguments passed.
+ this.dom = domObject;
+ this.pageURL = pageURL;
+ this.fragment = fragment;
+ this.responseStatus = responseStatus;
+
+ console.debug('in dom handler, responseStatus is', this.responseStatus);
+
+ // make callback function available
+ // for the entire object.
+ this.callback = function (dom) {
+ callback(dom);
+ that.destroy();
+ };
+};
+
+DomHandler.prototype.reset = function () {
+
+ this.dom = null;
+ // arrays.
+ this.onEventElement = [];
+ this.scriptStatus = [];
+ this.inlineScripts = [];
+ this.externalScripts = [];
+ this.scripts = [];
+
+ // booleans
+ this.allowTrivial = true;
+ this.inlineJsFree = false;
+ this.hasRemovedScripts = false;
+ this.removedAllScripts = false;
+
+ // we start with 0, and will increment in
+ // dom_checker.
+ this.numExternalScripts = 0;
+
+ this.numInlineScripts = 0;
+
+ this.scriptsTested = 0;
+
+};
+
+DomHandler.prototype.destroy = function () {
+ this.domGatherer = null;
+ this.domChecker = null;
+ /* destroy callback so that it can't be called multiple times. */
+ this.callback = function() {};
+ //this.reset();
+};
+
+DomHandler.prototype.scriptHasBeenTested = function () {
+ this.scriptsTested++;
+};
+
+/**
+ * scriptHasJsWebLabel
+ *
+ * Checks if a script was found earlier in a Js License Web Label
+ * table. See http://www.gnu.org/licenses/javascript-labels.html
+ * for more information.
+ *
+ */
+DomHandler.prototype.scriptHasJsWebLabel = function (script) {
+ if (this.licenseList) {
+
+ var url = urlHandler.resolve(this.pageURL, script.src),
+ i = 0,
+ len = this.licenseList.length;
+
+ console.debug('looking for web label');
+
+ for (; i < len; i++) {
+ if (this.licenseList[i].fileUrl === url &&
+ this.licenseList[i].free === true) {
+ console.debug('found something true');
+ console.debug(this.licenseList[i].fileUrl, ' is found');
+ return true;
+ }
+ }
+ }
+ return false;
+};
+
+/**
+ * processScripts.
+ * Starts by looking for a js web labels page
+ * then calls the complete function, which runs
+ * the rest of the check.
+ */
+DomHandler.prototype.processScripts = function () {
+ var that = this;
+
+ // check for the existence of the
+ // js web labels first.
+ this.lookForJsWebLabels(function () {
+
+ // gather and check all script elements on
+ // page.
+ console.debug("Calling checkAllScripts");
+ that.checkAllScripts();
+
+ });
+
+};
+
+/**
+ * jsWebLabelsComplete
+ *
+ */
+DomHandler.prototype.checkAllScripts = function () {
+ try {
+ console.debug('found in', this.pageURL, JSON.stringify(this.licenseList));
+ console.debug('checkAllScripts triggered async');
+
+ // use domGatherer to gather scripts.
+ this.domGatherer.findScripts();
+ this.domGatherer.gatherScriptsContent();
+ this.domGatherer.gatherIntrinsecEvents();
+
+ console.debug('fragment is', this.fragment);
+
+ if (
+ (this.fragment === undefined ||
+ this.fragment === null ||
+ this.fragment.indexOf('librejs=true') < 0) &&
+ this.responseStatus != 404
+ ) {
+ try {
+
+ // use domChecker to check scripts.
+ console.debug("Calling checkAllInlineScripts");
+ this.domChecker.checkAllInlineScripts();
+ } catch (x) {
+ console.debug('error in domChecker:', x, x.lineNumber);
+ this.removeAllJs();
+ }
+ } else {
+ console.debug('404 or pageworker, removing all js');
+ // this is the page Worker to find contact link
+ // just remove all the JS since we don't need it.
+ console.debug('fragment found, remove js');
+ this.removeAllJs();
+ }
+ } catch (x) {
+ console.debug('error', x, x.lineNumber, x.fileName);
+ }
+};
+
+/**
+ * lookForJsWebLabels
+ *
+ * Checks if a link to a js web label table exists.
+ * If it does, return an array of objects with the data
+ * gathered (script name, path, license name, url, ...)
+ *
+ */
+DomHandler.prototype.lookForJsWebLabels = function (completed) {
+ var that = this;
+ console.debug("calling lookForJsWebLabels");
+ if (this.fragment != '#librejs=true') {
+ var webLabelFinder = new WebLabelFinder();
+ webLabelFinder.init(
+ this.dom,
+ this.pageURL,
+ function (licenseList) {
+ // assign array returned to property.
+ that.licenseList = licenseList;
+ console.debug("calling completed");
+ completed();
+ });
+ } else {
+ completed();
+ }
+};
+
+DomHandler.prototype.checkScriptForJsWebLabels = function (script) {
+ var scriptEntry;
+
+ if (this.hasSrc(script) && this.scriptHasJsWebLabel(script)) {
+
+ // in the list of allowed scripts (through web labels)
+ scriptEntry = scriptObject.Script({'type': scriptTypes.EXTERNAL,
+ 'status': statusTypes.ACCEPTED,
+ 'element':script,
+ 'url': urlHandler.resolve(this.pageURL, script.src)});
+
+ scriptEntry.tagAsAccepted(this.pageURL, reasons.FREE);
+
+ return true;
+ }
+};
+
+
+/**
+ * hasSrc
+ * Check the given script has an src attribute.
+ * @param script obj The script element.
+ * @return a string with the value of the src attribute.
+ */
+DomHandler.prototype.hasSrc = function(script) {
+ if (script.src) {
+ return script.src;
+ }
+ return false;
+};
+
+/**
+ * Uses relationChecker to guess whether the script only uses
+ * predefined functions/variables or interacts with other scripts
+ * (this is still very experimental and needs improvement.)
+ *
+ */
+DomHandler.prototype.removeScriptIfDependent = function (script) {
+
+ var nonWindowProps = script.tree.relationChecker.nonWindowProperties;
+
+ for (var entry in nonWindowProps) {
+ if (nonWindowProps[entry]) {
+ console.debug('script has non window properties.');
+ this.removeGivenJs(script, reasons.TRIVIAL_NOT_ALLOWED);
+ return true;
+ }
+ }
+
+};
+
+/**
+ * removeGivenJs
+ * Remove a single script from the DOM.
+ * @param script Obj The script element to be removed from the
+ * DOM.
+ *
+ */
+DomHandler.prototype.removeGivenJs = function (script, reason, singleton, hash) {
+ var commentedOut;
+ var isAllowed = allowedRef.urlInAllowedReferrers(this.pageURL);
+ console.debug("removing given js hash", hash);
+
+ if (script.status != statusTypes.REJECTED &&
+ script.status != statusTypes.JSWEBLABEL
+ ) {
+ console.debug('removing a', script.type);
+ if (script.type === scriptTypes.ATTRIBUTE &&
+ !isAllowed
+ ) {
+ this.removeGivenAttribute(script, reason);
+ return;
+ }
+ if (!isAllowed) {
+ // set invalid type if dry run off.
+ script.element.setAttribute('type', 'librejs/blocked');
+ // add entry as removed.
+ console.debug('removeGivenJs hash is', hash);
+ script.tagAsRemoved(this.pageURL, reason, hash);
+ } else {
+ script.element.setAttribute('data-librejs-dryrun', 'librejs/blocked');
+ script.tagAsDryRun(this.pageURL, reason, hash);
+ }
+
+ if (singleton === true) {
+ // flag singletons.
+ script.element.setAttribute('data-singleton', 'true');
+ }
+
+ // remove src if dry run off.
+ if (script.element.getAttribute('src') !== undefined) {
+ script.element.setAttribute('data-librejs-blocked-src', script.element.getAttribute('src'));
+ if (!isAllowed) {
+ script.element.removeAttribute('src');
+ }
+ }
+ if (isAllowed) {
+ comment_str = 'LibreJS: Script should be blocked, but page is whitelisted.';
+ script.status = statusTypes.ACCEPTED;
+ } else {
+ comment_str = 'LibreJS: script blocked.';
+ script.status = statusTypes.REJECTED;
+ }
+
+ commentedOut = this.dom.createComment(comment_str);
+ // add a comment for curious source readers.
+ script.element.parentNode.appendChild(commentedOut);
+ script.element.parentNode.insertBefore(commentedOut, script.element);
+ this.hasRemovedScripts = true;
+ }
+};
+
+DomHandler.prototype.removeGivenAttribute = function (script, reason) {
+ var i = 0,
+ le = script.jsAttributes.length;
+
+ console.debug('removing given attribute', script, reason);
+ script.element.setAttribute('data-librejs-blocked-event',
+ JSON.stringify(script.jsAttributes));
+
+ script.tagAsRemoved(this.pageURL, reason, script.hash || script.tree.hash);
+
+ // might need to be removed.
+ script.element.setAttribute('data-librejs-blocked-value', '');
+
+ if (!allowedRef.urlInAllowedReferrers(this.pageURL)) {
+ // only run if not in dry run mode.
+ for (; i < le; i++) {
+ console.debug('removing attribute', JSON.stringify(script.jsAttributes));
+ script.element.removeAttribute(script.jsAttributes[i].attribute);
+ }
+ } else {
+
+ }
+ this.hasRemovedScripts = true;
+};
+
+/**
+ * removeAllJs
+ * Loop through all scripts from top to bottom and add a type
+ * attribute 'librejs/blocked' to prevent their interpretation
+ * by the browser.
+ *
+ */
+DomHandler.prototype.removeAllJs = function (reason) {
+ // remove all js is useless from now on.
+ console.debug('removeAllJs');
+ this.hasRemovedScripts = true;
+
+ // removeAllJs needs not be run next time.
+ this.removedAllScripts = true;
+
+ try {
+ this.removeAllArray(this.scripts, reason);
+ this.callback(this.dom);
+ } catch (x) {
+ console.debug('in removeAllJs method: ', x, 'number of scripts is', this.numScripts);
+ this.callback(this.dom);
+ }
+
+};
+
+DomHandler.prototype.removeAllArray = function(scriptArray, reason) {
+ var script, i = 0, le;
+ console.debug('removeAllArray');
+ try {
+ le = scriptArray.length;
+ // loop through all scripts.
+
+ for (; i < le; i++) {
+ script = scriptArray[i];
+ if (script.type === scriptTypes.INLINE ||
+ script.type === scriptTypes.EXTERNAL) {
+ this.removeGivenJs(script, reason);
+ }
+ else if (script.type === scriptTypes.ATTRIBUTE) {
+ this.removeGivenAttribute(script, reason);
+ }
+ }
+ } catch (e) {
+ this.callback("");
+ }
+
+};
+
+exports.DomHandler = DomHandler;
+
+/**
+ * exports.domHandler
+ * Instantiates a DomHandler and checks the DOM
+ * @param dom obj The given dom for analysis.
+ * @param pageURL string the URL for the page.
+ * @param callback function callback when all the work has been performed.
+ */
+exports.domHandler = function(
+ dom, pageURL, fragment, responseStatus, callback) {
+ console.debug("Creating domHandler");
+ var domHandler = new DomHandler();
+ domHandler.init(dom, pageURL, fragment, responseStatus, callback);
+
+ // use domGatherer methods.
+ domHandler.domGatherer = domGatherer(domHandler);
+
+ // use domChecker methods.
+ domHandler.domChecker = domChecker(domHandler);
+
+ // launch the whole process.
+ console.debug("Calling processScripts");
+ domHandler.processScripts();
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/attributes.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/attributes.js
new file mode 100644
index 0000000..6e9ace4
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/attributes.js
@@ -0,0 +1,137 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+// object model for script entries.
+var scriptObject = require("html_script_finder/dom_handler/script_object");
+
+var scriptProperties = require("html_script_finder/dom_handler/script_properties");
+
+const scriptTypes = scriptProperties.scriptTypes;
+
+const statusTypes = scriptProperties.statusTypes;
+
+var jsInAttrRe = /javascript:/ig;
+
+// the list of all available event attributes
+var intrinsecEvents = [
+ "onload",
+ "onunload",
+ "onclick",
+ "ondblclick",
+ "onmousedown",
+ "onmouseup",
+ "onmouseover",
+ "onmousemove",
+ "onmouseout",
+ "onfocus",
+ "onblur",
+ "onkeypress",
+ "onkeydown",
+ "onkeyup",
+ "onsubmit",
+ "onreset",
+ "onselect",
+ "onchange"];
+
+exports.jsInAttrRe = jsInAttrRe;
+exports.intrinsecEvents = intrinsecEvents;
+
+
+/**
+ * findJSinAttribute
+ *
+ * Looks for attributes containing 'javascript:'
+ *
+ */
+exports.findJSinAttribute = function (elem, callback) {
+ var i = 0, attrLen = elem.attributes.length;
+
+ var attribPairs = [];
+
+ for (; i < attrLen; i++) {
+
+ //looping through all attributes in elem to look for "javascript:"
+ attrib = elem.attributes[i];
+
+ if (attrib.value.match(jsInAttrRe)) {
+ str = attrib.value.replace(jsInAttrRe, '');
+ attribPairs.push({attribute: attrib.name, value: str});
+ }
+
+ }
+
+ if (attribPairs.length > 0) {
+ // contains in attribute javascript.
+ scriptEntry = scriptObject.Script({'type': scriptTypes.ATTRIBUTE,
+ 'status': statusTypes.UNCHECKED,
+ 'element': elem,
+ 'jsAttributes': attribPairs
+ });
+
+ // push back to DOMHandler
+ callback(scriptEntry);
+
+ } else {
+ callback(false);
+ }
+
+};
+
+/**
+ * findOnJSAttribute.
+ *
+ * Look for attributes in on*
+ *
+ */
+exports.findOnJSAttribute = function (elem, callback) {
+
+ var i = 0, eventsLen = intrinsecEvents.length;
+
+ var attribPairs = [];
+
+ for (; i < eventsLen; i++) {
+
+ // looping through all on* attributes
+ if (elem.hasAttribute(intrinsecEvents[i])) {
+
+ attribPairs.push({
+ attribute: intrinsecEvents[i],
+ value: elem.getAttribute(intrinsecEvents[i])
+ });
+
+ }
+
+ }
+ if (attribPairs.length > 0) {
+
+ console.debug('found an attribute', scriptTypes.ATTRIBUTE);
+ scriptEntry = scriptObject.Script({'type': scriptTypes.ATTRIBUTE,
+ 'status': statusTypes.UNCHECKED,
+ 'element':elem,
+ 'jsAttributes': attribPairs
+ });
+ // Push back to DOMHandler.
+ // push back to DOMHandler
+ callback(scriptEntry);
+
+ } else {
+ callback(false);
+ }
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/dom_checker.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/dom_checker.js
new file mode 100644
index 0000000..76cbc3e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/dom_checker.js
@@ -0,0 +1,464 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * dom_checker.js
+ *
+ * checks scripts for nonfree/nontrivial.
+ *
+ */
+
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+var scriptProperties = require("html_script_finder/dom_handler/script_properties");
+
+const scriptTypes = scriptProperties.scriptTypes;
+
+const statusTypes = scriptProperties.statusTypes;
+
+const reasons = scriptProperties.reasons;
+
+// ensure xhr won't create an infinite loop
+// with html content.
+var urlTester = require("html_script_finder/url_seen_tester").urlSeenTester;
+var urlHandler = require("url_handler/url_handler");
+
+
+var privacyChecker = require("js_checker/privacy_checker").privacyCheck;
+var jsChecker = require("js_checker/js_checker");
+
+const types = require("js_checker/constant_types");
+
+var checkTypes = types.checkTypes;
+
+var stripCDATAOpen = /<\!\[CDATA\[/gi;
+var stripCDATAClose = /]]>/g;
+
+var timer = require("sdk/timers");
+
+const getHash = require("script_entries/scripts_cache").scriptsCached.getHash;
+
+var DomChecker = function() {
+ // reference to domHandler instance
+ // using this object.
+ this.d = null;
+};
+
+/**
+ * init
+ *
+ * assign a reference domHandler object
+ * to access/updates its properties.
+ *
+ */
+DomChecker.prototype.init = function(domHandler) {
+ "use strict";
+
+ this.d = domHandler;
+};
+
+DomChecker.prototype.destroy = function() {
+ "use strict";
+
+ this.d = null;
+};
+
+/**
+ * checkAllInlineScripts
+ *
+ * Sends all the inline/onpage scripts as a whole for a check and
+ * removes all scripts if nonfree nontrivial is found.
+ *
+ */
+DomChecker.prototype.checkAllInlineScripts = function() {
+ "use strict";
+
+ try {
+ var i = 0, len, script;
+
+ if (typeof this.d.inlineScripts !== 'undefined' &&
+ this.d.inlineScripts.length > 0
+ ) {
+ script = this.d.inlineScripts.shift();
+ console.debug("checking script for page",
+ this.d.pageURL
+ /*, JSON.stringify(script)*/);
+ if (this.d.removedAllScripts) {
+ // all js has already been removed.
+ // stop check.
+ console.debug("removed all");
+ return;
+ }
+
+ if (this.d.inlineJsFree === true) {
+ // add entry as accepted.
+ try {
+ hash = getHash(script.text);
+ script.tagAsAccepted(this.d.pageURL, reasons.FREE, hash);
+ } catch (e) {
+ console.debug(e);
+ }
+ }
+
+ // even if page is free we need to check for allow trivial.
+ if (script.type === scriptTypes.INLINE) {
+ console.debug("analyzing script", script);
+ this.analyzeJs(script,
+ script.text,
+ this.checkSingleInlineScript.bind(this));
+ } else if (script.type === scriptTypes.ATTRIBUTE) {
+ console.debug("analyzing inline script", script);
+ this.analyzeJs(script,
+ this.concatAttributes(script),
+ this.checkSingleElementAttributes.bind(this));
+ }
+ } else {
+ // no more inline scripts. Switch to external scripts.
+ this.readyForExternal();
+ }
+ } catch (x) {
+ console.debug('checkAllInlineScripts error',
+ x, x.lineNumber, x.fileName);
+ this.readyForExternal();
+ }
+};
+
+DomChecker.prototype.concatAttributes = function(script) {
+ "use strict";
+ var i = 0,
+ le = script.jsAttributes.length,
+ text = "";
+
+ // we concatenate all js in multiple attributes.
+ // because it's too much of a hassle to keep track
+ // otherwise.
+ for (; i < le; i++) {
+ text += script.jsAttributes[i].value + '\n';
+ }
+
+ return text;
+
+};
+
+/**
+ *
+ * check a single element with attributes
+ */
+DomChecker.prototype.checkSingleElementAttributes = function(
+ script, loadedScript, checker) {
+ "use strict";
+ var check, value,
+ i = 0,
+ le = script.jsAttributes.length,
+ text = "";
+
+ try {
+ check = checker.parseTree.freeTrivialCheck;
+ script.tree = checker;
+ script.result = check;
+ script.status = statusTypes.CHECKED;
+ } catch (e) {
+ console.debug('problem checking inline scripts', e, e.lineNumber);
+ this.d.removeGivenJs(script);
+ }
+
+ this.processInlineCheckResult(script, check, checker);
+};
+
+DomChecker.prototype.processInlineCheckResult = function(
+ script, check, checker) {
+ "use strict";
+ console.debug("check.reason is", check.reason, "and type", check.type);
+ var hash = checker.hash;
+
+ if (this.d.inlineJsFree === true) {
+ console.debug('tagging', script.text, 'as accepted', "with reason", check.reason);
+ script.tagAsAccepted(this.d.pageURL, this.d.freeReason + " -- " + check.reason, hash);
+ }
+
+ // process the result.
+ if (check.type === checkTypes.FREE) {
+ // this is free.
+ console.debug('tagging', script.text, 'as accepted with reason', check.reason);
+ this.d.inlineJsFree = true;
+ this.d.freeReason = check.reason;
+ // add entry as accepted.
+ script.tagAsAccepted(this.d.pageURL, check.reason, hash);
+ } else if (check.type === checkTypes.FREE_SINGLE_ITEM) {
+ // accept this script.
+ console.debug("free single item, ", check.reason);
+ script.tagAsAccepted(this.d.pageURL, check.reason, hash);
+ } else if (check.type === checkTypes.NONTRIVIAL) {
+ console.debug("nontrivial hash is", hash);
+ if (this.d.inlineJsFree) {
+ // inline is free. So accept.
+ console.debug('tagging', script.text, 'as accepted');
+ script.tagAsAccepted(
+ this.d.pageURL,
+ this.d.freeReason + ' -- ' + check.reason,
+ hash);
+ } else {
+ console.debug('tagging', script.text, 'as removed');
+ this.d.removeGivenJs(script, check.reason, false, hash);
+ }
+ } else if (!this.d.inlineJsFree &&
+ this.d.loadsHtmlExternalScripts &&
+ check.type === checkTypes.TRIVIAL_DEFINES_FUNCTION
+ ) {
+ // nontrivial, because defines function and loads
+ // external scripts
+ console.debug('tagging', script.text, 'as removed');
+ this.d.removeGivenJs(script, reasons.FUNCTIONS_INLINE, false, hash);
+ } else if (!this.d.loadsHtmlExternalScripts &&
+ check === checkTypes.TRIVIAL_DEFINES_FUNCTION
+ ) {
+ console.debug("Tag as accepted doesn't load another external script");
+ script.tagAsAccepted(this.d.pageURL, check.reason, hash);
+ } else if (check.type === checkTypes.TRIVIAL ||
+ check.type === checkTypes.TRIVIAL_DEFINES_FUNCTION ||
+ check.type === checkTypes.WHITELISTED
+ ) {
+ // add entry as accepted.
+ console.debug("Trivial accepted");
+ script.tagAsAccepted(this.d.pageURL, check.reason, hash);
+ }
+
+ // next inline script, if applicable.
+ this.checkAllInlineScripts();
+};
+
+DomChecker.prototype.readyForExternal = function() {
+ "use strict";
+
+ // done with those inline scripts, continue with
+ // the rest.
+ this.checkExternalScripts();
+};
+
+/**
+ * check a single inline script.
+ */
+DomChecker.prototype.checkSingleInlineScript = function(
+ script, loadedScript, checker) {
+ "use strict";
+ var check, text;
+
+ try {
+
+ check = checker.parseTree.freeTrivialCheck;
+
+ // update status.
+ script.tree = checker;
+ script.result = check;
+ console.debug("script result is", check.type);
+ script.status = statusTypes.CHECKED;
+
+ } catch (e) {
+ console.debug('problem checking inline scripts', e, e.lineNumber);
+ this.d.removeGivenJs(script, '', false, checker.hash);
+ }
+
+ this.processInlineCheckResult(script, check, checker);
+
+};
+
+/**
+ * checkExternalScripts
+ * Loop through series of external scripts,
+ * perform xhr to get their data, and check them
+ * to see whether they are free/nontrivial
+ *
+ */
+DomChecker.prototype.checkExternalScripts = function() {
+ "use strict";
+ var i = 0,
+ len = this.d.externalScripts.length,
+ that = this;
+ console.debug("externalScripts length", this.d.externalScripts.length);
+ if (this.d.removedAllScripts ||
+ this.d.externalScripts.length === 0) {
+ // all js has already been removed.
+ // stop check.
+ this.wrapUpBeforeLeaving();
+ return;
+
+ }
+
+ for (; i < len; i++) {
+
+ this.xhr(this.d.externalScripts[i],
+
+ function(script, scriptText) {
+ console.debug("doing xhr", script.url);
+ if (scriptText === false) {
+ that.d.removeGivenJs(script);
+ that.d.scriptHasBeenTested();
+ that.externalCheckIsDone();
+ return;
+ }
+
+ that.analyzeJs(script,
+ scriptText,
+ that.checkSingleExternalScript.bind(that));
+ });
+ }
+};
+
+DomChecker.prototype.wrapUpBeforeLeaving = function() {
+ "use strict";
+
+ console.debug("wrap up before leaving triggered");
+ console.debug('wrapping up');
+ this.d.callback(this.d.dom);
+
+};
+
+DomChecker.prototype.analyzeJs = function(script, scriptText, callback) {
+ "use strict";
+ try {
+ console.debug("checking ", script.url);
+ var checker = jsChecker.jsChecker();
+ var url = "";
+ if (typeof script.url !== "undefined") {
+ url = script.url;
+ } else {
+ url = this.pageURL;
+ }
+ checker.searchJs(scriptText, function() {
+ console.debug("Analyze JS"/*, JSON.stringify(checker)*/);
+ timer.setTimeout(function() {
+ callback(script, scriptText, checker);
+ }, 0);
+ }, url);
+ } catch (x) {
+ console.debug('error', x, x.lineNumber, x.fileName);
+ }
+};
+
+/**
+ * Check a single external script.
+ */
+DomChecker.prototype.checkSingleExternalScript = function(
+ script, loadedScript, checker) {
+ "use strict";
+ var check;
+
+ try {
+
+ check = checker.parseTree.freeTrivialCheck;
+
+ script.tree = checker;
+ script.result = check;
+ console.debug('in checkSingleExternalScript, checker.hash is', checker.hash);
+ if (script.status != statusTypes.JSWEBLABEL) {
+ script.status = statusTypes.CHECKED;
+ }
+
+ if (check.type === checkTypes.FREE ||
+ check.type === checkTypes.FREE_SINGLE_ITEM
+ ) {
+ // add entry as accepted.
+ script.tagAsAccepted(this.d.pageURL, check.reason, checker.hash);
+ }
+
+ else if (check.type === checkTypes.NONTRIVIAL) {
+ console.debug("Removing given js", check.reason);
+ this.d.removeGivenJs(script, check.reason, false, checker.hash);
+ }
+
+ else if (check.type === checkTypes.TRIVIAL ||
+ check.type === checkTypes.WHITELISTED
+ ) {
+ // if it's accepted, allow.
+ script.tagAsAccepted(this.d.pageURL, check.reason, checker.hash);
+ } else {
+ // anything else is nontrivial. Including TRIVIAL_DEFINES_FUNCTION.
+ console.debug("checker hash for remove is ", checker.hash);
+ this.d.removeGivenJs(script, reasons.FUNCTIONS_EXTERNAL, false, checker.hash);
+ }
+
+ } catch (e) {
+ console.debug('error in checkExternalScript',
+ e, e.lineNumber, 'for script', script.url);
+
+ this.d.removeAllJs();
+ this.destroy();
+ return;
+ }
+ console.debug('script url is', script.url, 'result is', script.result);
+ this.d.scriptHasBeenTested();
+ this.externalCheckIsDone();
+};
+
+DomChecker.prototype.externalCheckIsDone = function() {
+ "use strict";
+
+ console.debug('scriptsTested is', this.d.scriptsTested);
+ console.debug('num external', this.d.numExternalScripts);
+
+ if (this.d.scriptsTested >= this.d.numExternalScripts) {
+ console.debug('wrapping up external');
+ this.wrapUpBeforeLeaving();
+ }
+};
+
+/**
+ * xhr
+ * Perform a XMLHttpRequest on the url given.
+ * @param url string A URL.
+ * @return The response text.
+ */
+DomChecker.prototype.xhr = function(script, responseCallback) {
+ "use strict";
+
+ var regex = /^text\/html/i;
+ var url = script.url;
+
+ try {
+ // add url to whitelist.
+ urlTester.addUrl(url);
+
+ // request module. Compatible with Https-Everywhere.
+ require('html_script_finder/dom_handler/request')
+ .request(script, responseCallback).request();
+ } catch (x) {
+ console.debug('error', x, x.lineNumber, x.fileName);
+ responseCallback(script, false);
+ }
+};
+
+/**
+ * exports.domChecker
+ * Instantiate a brand new clone of the domChecker.
+ * @param dom obj The given dom for analysis.
+ * @param pageURL string the URL for the page.
+ * @param callback function callback when all the work has been performed.
+ */
+exports.domChecker = function(domHandler) {
+ "use strict";
+
+ var domChecker = new DomChecker();
+
+ domChecker.init(domHandler);
+
+ return domChecker;
+};
+
+exports.xhr = new DomChecker().xhr;
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/dom_gatherer.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/dom_gatherer.js
new file mode 100644
index 0000000..5451f53
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/dom_gatherer.js
@@ -0,0 +1,301 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+var scriptProperties = require("html_script_finder/dom_handler/script_properties");
+
+const scriptTypes = scriptProperties.scriptTypes;
+const scriptsCached = require("script_entries/scripts_cache").scriptsCached;
+
+const statusTypes = scriptProperties.statusTypes;
+// object model for script entries.
+var scriptObject = require("html_script_finder/dom_handler/script_object");
+
+var urlHandler = require("url_handler/url_handler");
+
+var attributeHelpers = require("html_script_finder/dom_handler/attributes");
+
+// javascript:*
+var jsInAttrRe = attributeHelpers.jsInAttrRe;
+
+// the list of all available event attributes
+var intrinsecEvents = attributeHelpers.intrinsecEvents;
+
+var privacyChecker = require("js_checker/privacy_checker").privacyCheck;
+
+const types = require("js_checker/constant_types");
+
+var checkTypes = types.checkTypes;
+
+
+// array reflex valid types as listed in
+// http://mxr.mozilla.org/mozilla-central/source/content/base/src/nsScriptLoader.cpp#437
+// anything appended to end of strings is considered valid:
+var jsValidTypes = [
+ /^text\/javascript/i,
+ /^text\/ecmascript/i,
+ /^application\/javascript/i,
+ /^application\/ecmascript/i,
+ /^application\/x-javascript/i
+];
+
+var stripCDATAOpen = /<\!\[CDATA\[/gi;
+var stripCDATAClose = /]]>/g;
+
+var stripHtmlCommentsInScript = function (s) {
+ s = s.replace(stripCDATAOpen, '');
+ s = s.replace(stripCDATAClose, '');
+ return s;
+};
+
+
+
+// gather scripts and javascript in attributes across a dom object.
+var domGathererObject = {
+
+ // domHandler object.
+ d: null,
+
+ /**
+ * init
+ *
+ * assign a reference domHandler object
+ * to access/updates its properties.
+ *
+ */
+ init: function (domHandler) {
+
+ this.d = domHandler;
+
+ },
+
+ /**
+ * scriptHasInvalidType
+ *
+ * Checks that a script does not have a js "template" type.
+ * Normally any script that has a type attribute other than the
+ * few allowed ones is not interpreted. But by security, we only
+ * discard a few of them.
+ *
+ * @param script obj The script element.
+ * @return returns true if it matches a template type.
+ *
+ */
+ scriptHasInvalidType: function (script) {
+ var i = 0,
+ le = jsValidTypes.length;
+
+ var type = script.getAttribute('type');
+
+ if (type === 'librejs/blocked') {
+ // js has already been blocked.
+ return true;
+ }
+
+ if (!type) {
+ // type isn't set, don't look further.
+ return false;
+ }
+
+ for (; i < le; i++) {
+ if (jsValidTypes[i].test(type)) {
+ return false;
+ }
+ }
+
+ // type is invalid and
+ // hence cannot be executed.
+ return true;
+
+
+ },
+
+ /**
+ * findScripts
+ *
+ * Assigns the array of scripts in the dom to a property
+ * as well as a number of scripts present for looping purposing.
+ */
+ findScripts: function() {
+ this.d.domScripts = this.d.dom.getElementsByTagName('script');
+ this.d.numScripts = this.d.domScripts.length;
+ },
+
+ /**
+ * gatherIntrinsecEvents
+ *
+ * Fetches all the event attributes that might contain JavaScript
+ * as well as all element attributes that start with
+ * "javascript:".
+ *
+ */
+ gatherIntrinsecEvents: function() {
+ var i = 0, j, k,
+ all = this.d.dom.getElementsByTagName('*'),
+ max = all.length,
+ that = this,
+ attrLen, attrib, str, scriptEntry;
+
+
+
+ for (; i < max; i++) {
+
+ // look for attributes with value javascript:*
+ attributeHelpers.findJSinAttribute(all[i],
+ function (scriptEntry) {
+ if (scriptEntry !== false) {
+
+ that.d.inlineScripts.push(scriptEntry);
+ that.d.scripts.push(scriptEntry);
+
+ // add inline script in the count.
+ that.d.numInlineScripts++;
+
+ }
+ });
+
+ // look for attributes of on* (onLoad, ...)
+ attributeHelpers.findOnJSAttribute(all[i],
+ function (scriptEntry) {
+ if (scriptEntry !== false) {
+ that.d.inlineScripts.push(scriptEntry);
+ that.d.scripts.push(scriptEntry);
+
+ // add inline script in the count.
+ that.d.numInlineScripts++;
+ }
+ });
+
+ }
+
+ },
+
+ /**
+ * gatherScriptsContent
+ *
+ * Aggregate all content within on-page JavaScript code.
+ * Keep a list of all absolute urls to external scripts.
+ *
+ */
+ gatherScriptsContent: function() {
+ var i = 0, currentScript = '', absolutePath, scriptEntry,
+ that = this;
+ try {
+ for (; i < this.d.numScripts; i++) {
+
+ if (this.d.checkScriptForJsWebLabels(this.d.domScripts[i])) {
+ //break;
+ absolutePath = urlHandler.resolve(this.d.pageURL, this.d.domScripts[i].src);
+ scriptEntry = scriptObject.Script({'type': scriptTypes.EXTERNAL,
+ 'status': statusTypes.JSWEBLABEL,
+ 'element': this.d.domScripts[i],
+ 'url': absolutePath});
+ scriptEntry.tree = {};
+
+ this.d.externalScripts.push(scriptEntry);
+ that.d.scripts.push(scriptEntry);
+
+ this.d.loadsHtmlExternalScripts = true;
+
+ // increment number of scripts found.
+ this.d.numExternalScripts++;
+
+ }
+
+ // check that script has valid type
+ else if (!this.scriptHasInvalidType(this.d.domScripts[i])) {
+
+
+ if (this.d.hasSrc(this.d.domScripts[i]) &&
+ !this.d.scriptHasJsWebLabel(this.d.domScripts[i])) {
+
+ console.debug('an external script', this.d.domScripts[i]);
+
+ absolutePath = urlHandler.resolve(this.d.pageURL, this.d.domScripts[i].src);
+ scriptEntry = scriptObject.Script({'type': scriptTypes.EXTERNAL,
+ 'status': statusTypes.UNCHECKED,
+ 'element': this.d.domScripts[i],
+ 'url': absolutePath});
+ this.d.externalScripts.push(scriptEntry);
+ that.d.scripts.push(scriptEntry);
+
+ this.d.loadsHtmlExternalScripts = true;
+
+ // increment number of scripts found.
+ this.d.numExternalScripts++;
+
+ }
+
+ else if (privacyChecker.checkScriptPrivacyThreat(this.d.domScripts[i].text)) {
+
+ this.d.removeGivenJs(scriptObject.Script({'type': scriptTypes.SINGLETON,
+ 'status': statusTypes.UNCHECKED,
+ 'element': this.d.domScripts[i],
+ 'text': this.d.domScripts[i].text
+ }), '', true);
+ }
+
+ else if (this.d.domScripts[i].text !== '') {
+ // using else if since script text is
+ // ignored if src attribute is set.
+ // adding this.narcissusBugFixLibreJS to fix comment bug.
+ var bugfix = require('html_script_finder/bug_fix').narcissusBugFixLibreJS;
+ currentScript = stripHtmlCommentsInScript(this.d.domScripts[i].text + bugfix);
+
+ scriptEntry = scriptObject.Script({'type': scriptTypes.INLINE,
+ 'status': statusTypes.UNCHECKED,
+ 'element': this.d.domScripts[i],
+ 'text': currentScript});
+ this.d.inlineScripts.push(scriptEntry);
+ this.d.scripts.push(scriptEntry);
+
+ // add inline script in the count.
+ this.d.numInlineScripts++;
+
+ }
+ }
+ }
+ } catch (e) {
+ // Any problem arising, we remove the script.
+ console.debug('problem gathering scripts', e, e.lineNumber);
+ this.d.removeAllJs();
+ }
+
+ }
+
+
+};
+
+/*
+ * exports.domGatherer
+ * Instantiate a brand new clone of the domGatherer.
+ * @param dom obj The given dom for analysis.
+ * @param pageURL string the URL for the page.
+ * @param callback function callback when all the work has been performed.
+ */
+exports.domGatherer = function (domHandler) {
+
+ var domGatherer = Object.create(domGathererObject);
+
+ domGatherer.init(domHandler);
+
+ return domGatherer;
+
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/request.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/request.js
new file mode 100644
index 0000000..d1d26d8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/request.js
@@ -0,0 +1,112 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var timer = require("sdk/timers");
+
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+var {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+
+// ensure xhr won't create an infinite loop
+// with html content.
+var urlTester = require("html_script_finder/url_seen_tester").urlSeenTester;
+var urlHandler = require("url_handler/url_handler");
+const scriptsCached = require("script_entries/scripts_cache").scriptsCached;
+
+var Request = function() {
+ this.url = null;
+ this.channel = null;
+ this.script = null;
+ this.responseCallback = null;
+};
+
+/**
+ * init
+ */
+Request.prototype.init = function(script, callback) {
+ this.script = script;
+ // set initial url
+ this.url = this.script.url;
+
+ this.responseCallback = callback;
+
+ var iOService = Cc["@mozilla.org/network/io-service;1"]
+ .getService(Ci.nsIIOService);
+
+ this.channel = iOService.newChannel(this.url, null, null);
+};
+
+Request.prototype.request = function() {
+ var that = this;
+ var responseReceived = function (data) {
+ that.responseCallback(that.script, data);
+ };
+ try {
+ this.channel.asyncOpen({
+ QueryInterface: XPCOMUtils.generateQI(
+ [Ci.nsIRequestObserver, Ci.nsIStreamListener]),
+ data: "",
+ charset: null,
+
+ onStartRequest: function(request, context) {
+ this.charset = request.contentCharset || "UTF-8";
+ },
+
+ onDataAvailable: function (request, context, stream, offset, count) {
+ try {
+ var binaryInputStream = Cc["@mozilla.org/binaryinputstream;1"]
+ .createInstance(Ci.nsIBinaryInputStream);
+ binaryInputStream.setInputStream(stream);
+ var data = binaryInputStream.readBytes(count);
+ this.data += data;
+ } catch (x) {
+ console.debug('error in request', x, x.lineNumber);
+ responseReceived("");
+ }
+ },
+
+ onStopRequest: function (request, context, result) {
+ try {
+ if (this.charset.toLowerCase() != "utf-8") {
+ var uConv = Cc["@mozilla.org/intl/utf8converterservice;1"]
+ .createInstance(Ci.nsIUTF8ConverterService);
+
+ this.data = uConv.convertStringToUTF8(this.data, this.charset, true);
+ }
+ } catch (e) {
+ console.debug("Issue with nsIUTF8ConverterService", e);
+ console.debug("Charset was", this.charset);
+ responseReceived("");
+ }
+ responseReceived(this.data);
+ }
+ }, null);
+ } catch(e) {
+ console.debug("asyncOpen exception", e);
+ responseReceived("");
+ }
+};
+
+// Instantiate a Request
+exports.request = function (script, callback) {
+ var obj = new Request();
+ obj.init(script, callback);
+ return obj;
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/script_object.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/script_object.js
new file mode 100644
index 0000000..e919f23
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/script_object.js
@@ -0,0 +1,198 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var removedScripts = require("script_entries/removed_scripts").removedScripts;
+
+var acceptedScripts = require("script_entries/accepted_scripts").acceptedScripts;
+var dryRunScripts = require("script_entries/dryrun_scripts").dryRunScripts;
+
+var Script = function(props) {
+ // can be an attribute, an inline script,
+ // or an external script.
+ this.type = null;
+
+ // flagged whether it is unchecked, checked,
+ // accepted, or rejected, ...
+ this.status = null;
+
+ // contains the dom element
+ this.element = null;
+
+ // the attribute name, if applicable.
+ this.attribute = null;
+
+ // the script text as a string.
+ this.value = null;
+
+ // the src url if external.
+ this.url = null;
+
+ // the script text if inline.
+ this.text = null;
+
+ this.init(props);
+};
+
+Script.prototype.init = function(props) {
+ // check the required elements are present.
+ if (props == undefined) {
+ throw "Error, missing script entry value in script_object.js";
+ }
+
+ // required properties
+ if (props.type != undefined) {
+ this.type = props.type;
+ } else {
+ throw "type is missing";
+ }
+
+ if (props.status != undefined) {
+ this.status = props.status;
+ } else {
+ throw "status is missing";
+ }
+
+ if (props.element != undefined) {
+ this.element = props.element;
+ } else {
+ throw "element is missing";
+ }
+
+ // conditional properties.
+ this.url = (props.url) ? props.url : null;
+ this.text = (props.text) ? props.text : null;
+ this.jsAttributes = (props.jsAttributes) ? props.jsAttributes : null;
+
+ if (typeof this.text !== 'string' &&
+ this.tree !== null &&
+ typeof this.tree === 'object' &&
+ this.tree.hasOwnProperty('jsCode')
+ ) {
+ this.text = this.tree.jsCode;
+ }
+};
+
+Script.prototype.tagAsDryRun = function(pageURL, reason, hash) {
+ var content = this.findContentType();
+ var inline = (this.url != undefined) ? false : true;
+ var url = (inline == false ? this.url : null);
+ console.debug("url is", url);
+ this.element.setAttribute('data-librejs', 'dryrun');
+
+
+ this.element.setAttribute('data-librejs-reason', reason);
+
+ dryRunScripts.addAScript(pageURL, {'inline': inline,
+ 'contents': content,
+ 'reason': reason,
+ 'url': url,
+ 'hash': hash
+ });
+};
+
+Script.prototype.tagAsAccepted = function(pageURL, reason, hash) {
+ var content = this.findContentType();
+ var inline = (this.url != undefined) ? false : true;
+ var url = (inline == false ? this.url : null);
+ console.debug("url is", url);
+ this.element.setAttribute('data-librejs', 'accepted');
+
+
+ this.element.setAttribute('data-librejs-reason', reason);
+
+ acceptedScripts.addAScript(pageURL, {'inline': inline,
+ 'contents': content,
+ 'reason': reason,
+ 'url': url,
+ 'hash': hash
+ });
+
+};
+
+Script.prototype.tagAsRemoved = function(pageURL, reason, hash) {
+ var content = this.findContentType();
+ var inline = (this.url != undefined) ? false : true;
+ var url = (inline == false ? this.url : null);
+ this.element.setAttribute('data-librejs', 'rejected');
+ this.element.setAttribute('data-librejs-reason', reason);
+ console.debug("tagAsRemoved hash is", hash);
+ removedScripts.addAScript(pageURL, {
+ 'inline': inline,
+ 'contents': content,
+ 'reason': reason,
+ 'url': url,
+ 'hash': hash
+ });
+
+};
+
+Script.prototype.tagAsDryRun = function(pageURL, reason, hash) {
+ var content = this.findContentType();
+ var inline = (this.url != undefined) ? false : true;
+ var url = (inline == false ? this.url : null);
+ this.element.setAttribute('data-librejs', 'dryrun');
+ this.element.setAttribute('data-librejs-reason', reason);
+
+ dryRunScripts.addAScript(pageURL, {'inline': inline,
+ 'contents': content,
+ 'reason': reason,
+ 'url': url,
+ 'hash': hash
+ });
+};
+
+/**
+ * removeNarcissusBugLine
+ *
+ * Removes the line that is appended to all
+ * inline scripts and prevent the bug that prevent
+ * script tags with comments only from being checked.
+ *
+ */
+Script.prototype.removeNarcissusBugLine = function(str) {
+ return str.replace('\n\nthis.narcissusBugFixLibreJS', '');
+};
+
+/**
+ * findContentType
+ *
+ * Figure out whether it's an external script,
+ * an inline script, or an attribute from the property
+ * that has been set, rather than blindly trusting the given
+ * constant.
+ */
+Script.prototype.findContentType = function() {
+ if (this.url != undefined) {
+
+ return "";
+
+ } else if (this.text != undefined) {
+
+ return this.element.text;
+
+ } else if (this.jsAttributes != undefined) {
+ // return the array.
+ return JSON.stringify(this.jsAttributes);
+ }
+};
+
+exports.Script = function(props) {
+ return new Script(props);
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/script_properties.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/script_properties.js
new file mode 100644
index 0000000..2eeeedb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/script_properties.js
@@ -0,0 +1,43 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+exports.scriptTypes = {
+ INLINE: 0,
+ EXTERNAL: 1,
+ ATTRIBUTE: 2,
+ SINGLETON: 3
+};
+
+exports.statusTypes = {
+ UNCHECKED: 0,
+ CHECKED: 1,
+ ACCEPTED: 2,
+ REJECTED: 3,
+ JSWEBLABEL: 4
+};
+
+exports.reasons = {
+ 'FUNCTIONS_INLINE': 'This script is detected as inline, nonfree, defining functions or methods, and the rest of the page as loading external scripts',
+ 'FUNCTIONS_EXTERNAL': 'This script is detected as nonfree, external, and as defining functions or methods',
+ 'CONSTRUCT': 'This script is detected as nonfree and as defining nontrivial constructs',
+ 'FREE': 'This script is detected as free',
+ 'TRIVIAL': 'This script is detected as trivial',
+ 'TRIVIAL_NOT_ALLOWED': 'This script is detected as trivial, but trivial is not allowed here because of other scripts'
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/html_parser.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/html_parser.js
new file mode 100644
index 0000000..69b2acc
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/html_parser.js
@@ -0,0 +1,158 @@
+/*
+ # ***** BEGIN LICENSE BLOCK *****
+ # Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ #
+ # The contents of this file are subject to the Mozilla Public License Version
+ # 1.1 (the "License"); you may not use this file except in compliance with
+ # the License. You may obtain a copy of the License at
+ # http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS IS" basis,
+ # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ # for the specific language governing rights and limitations under the
+ # License.
+ #
+ # The Original Code is Microsummarizer.
+ #
+ # The Initial Developer of the Original Code is Mozilla.
+ # Portions created by the Initial Developer are Copyright (C) 2006
+ # the Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s):
+ # Myk Melez <myk@mozilla.org> (Original Author)
+ # Simon Bünzli <zeniko@gmail.com>
+ # Asaf Romano <mano@mozilla.com>
+ # Dan Mills <thunder@mozilla.com>
+ # Ryan Flint <rflint@dslr.net>
+ #
+ # Alternatively, the contents of this file may be used under the terms of
+ # either the GNU General Public License Version 2 or later (the "GPL"), or
+ # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ # in which case the provisions of the GPL or the LGPL are applicable instead
+ # of those above. If you wish to allow use of your version of this file only
+ # under the terms of either the GPL or the LGPL, and not to allow others to
+ # use your version of this file under the terms of the MPL, indicate your
+ # decision by deleting the provisions above and replace them with the notice
+ # and other provisions required by the GPL or the LGPL. If you do not delete
+ # the provisions above, a recipient may use your version of this file under
+ # the terms of any one of the MPL, the GPL or the LGPL.
+ #
+ # ***** END LICENSE BLOCK *****
+ */
+
+/*
+ * The original file is located here:
+ * http://mxr.mozilla.org/mozilla/source/browser/components/microsummaries/src/nsMicrosummaryService.js?raw=1
+ *
+ */
+
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * html_parser
+ *
+ * Takes in an http response (string), loads it into a secured iframe
+ * so that it can be manipulated as a DOM object. It then returns a
+ * modified string to be passed along as a replacement of the original
+ * response.
+ *
+ */
+
+var {Cc, Ci, Cu} = require("chrome");
+
+var domHandlerModule = require("html_script_finder/dom_handler");
+
+const PR_UINT32_MAX = 2147483647;
+
+
+exports.htmlParser = function () {
+
+ return {
+ charset: null,
+ htmlText: null,
+ pageURL: null,
+ fragment: null,
+ contentType: null,
+ responseStatus: null,
+
+ parse: function (htmlText, charset, contentType, url, fragment,
+ responseStatus, parseResult) {
+
+ // DOMParser still has too many issues.
+ this.htmlText = htmlText;
+ this.charset = charset;
+
+ if (this.charset === "" || this.charset === undefined) {
+ this.charset = "utf-8";
+ }
+ this.contentType = contentType;
+ this.pageURL = url;
+ this.fragment = fragment;
+ this.responseStatus = responseStatus;
+ var that = this;
+
+ var domParser = Cc["@mozilla.org/xmlextras/domparser;1"].
+ createInstance(Ci.nsIDOMParser);
+
+ var dom = domParser.parseFromString(this.htmlText, this.contentType);
+ // console.debug(dom.getElementsByTagName('body')[0].innerHTML);
+ domHandlerModule.domHandler(dom, this.pageURL, this.fragment, this.responseStatus, function (newDom) {
+ parseResult(that.serializeToStream(newDom, that));
+ });
+
+ },
+
+ /**
+ * serializeToStream
+ * Serializes an HTML DOM into a binary stream. Uses
+ * nsIDOMSerializer only as a backup to when the
+ * reconstituteHtmlString method fails (not sure if/when it
+ * happens).
+ * @param dom obj Reference to the dom object
+ * @param that obj Reference to the object returned by htmlParser.
+ * This allows to give access to the iframe.
+ * @return a binary stream.
+ */
+ serializeToStream: function (dom, that) {
+
+ var newData, len;
+
+ try {
+ var storageStream = Cc["@mozilla.org/storagestream;1"].createInstance(Ci.nsIStorageStream);
+ var binaryOutputStream = Cc["@mozilla.org/binaryoutputstream;1"].createInstance(Ci.nsIBinaryOutputStream);
+ var serializer = Cc["@mozilla.org/xmlextras/xmlserializer;1"].createInstance(Ci.nsIDOMSerializer);
+ var encoder = Cc["@mozilla.org/layout/documentEncoder;1?type=" + this.contentType]
+ .createInstance(Ci.nsIDocumentEncoder);
+
+ encoder.setCharset(this.charset);
+ encoder.init(dom, this.contentType, 0);
+ storageStream.init(8192, PR_UINT32_MAX, null);
+
+ binaryOutputStream.setOutputStream(storageStream.getOutputStream(0));
+ encoder.encodeToStream(binaryOutputStream);
+ return storageStream;
+ } catch (e) {
+ console.debug('issue with serializer', e, e.lineNumber);
+ }
+ }
+
+ };
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/url_seen_tester.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/url_seen_tester.js
new file mode 100644
index 0000000..6b98ce1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/url_seen_tester.js
@@ -0,0 +1,87 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var httpRe = /^(http:)/i;
+
+var httpsRe = /^(https:)/i;
+
+exports.urlSeenTester = {
+
+ whitelist: {},
+
+
+ httpToHttps: function (url) {
+ try {
+
+ if (httpRe.test(url)) {
+
+ return url.replace(httpRe, 'https:');
+
+ } else if (httpsRe.test(url)) {
+
+ return url.replace(httpsRe, 'http:');
+
+ } else {
+
+ return url;
+
+ }
+ } catch (x) {
+ console.debug('error', x);
+ }
+
+ },
+
+ clearUrls: function () {
+ this.whitelist = {};
+ },
+
+ clearUrl: function (url) {
+
+ if (this.whitelist[url]) {
+
+ // console.debug('disallowing', url);
+ delete this.whitelist[url];
+
+ }
+
+ },
+
+ addUrl: function (url) {
+
+ console.debug('adding', url);
+
+ if (!this.isWhitelisted(url)) {
+
+ console.debug('allowing', url);
+ this.whitelist[url] = true;
+ }
+
+ },
+
+ isWhitelisted: function (url) {
+ if (this.whitelist[url] || this.whitelist[this.httpToHttps(url)]) {
+ console.debug('found to be whitelisted', url);
+ return true;
+ }
+ return false;
+ }
+
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/find_js_labels.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/find_js_labels.js
new file mode 100644
index 0000000..d56d650
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/find_js_labels.js
@@ -0,0 +1,95 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * This file works in conjunction with lib/html_script_finder/js_web_labels.js
+ * to find mentions of external JavaScript files and their license information.
+ * This allows the dom_handler to allow them by default.
+ */
+
+// find table.
+exports.getLicenseList = function (document) {
+
+ var tbl = document.getElementById("jslicense-labels1"),
+ jsList = [],
+ i = 0,
+ le,
+ rows,
+ link,
+ fileCell,
+ licenseCell,
+ sourceCell,
+ row;
+
+
+ if (tbl) {
+
+ try {
+ rows = tbl.getElementsByTagName("tr");
+ le = rows.length;
+ var mockElem = {textContent: "Unknown", href: "Unknown" };
+ // loop through rows, and add each valid element to
+ // the array.
+ for (; i < le; i++) {
+
+ row = rows[i].getElementsByTagName('td');
+
+ if (row[0] && row[0].getElementsByTagName('a')[0]) {
+ fileCell = row[0].getElementsByTagName('a')[0];
+ } else {
+ fileCell = mockElem;
+ }
+
+ if (row[1] && row[1].getElementsByTagName('a')[0]) {
+ licenseCell = row[1].getElementsByTagName('a')[0];
+ } else {
+ licenseCell = mockElem;
+ }
+
+ if (row[2] && row[2].getElementsByTagName('a')[0]) {
+ sourceCell = row[2].getElementsByTagName('a')[0];
+ } else {
+ sourceCell = mockElem;
+ }
+ if (fileCell.href != 'Unknown') {
+ jsList.push({
+
+ 'fileName': fileCell.textContent,
+ 'fileUrl': fileCell.href,
+ 'fileHash': null, // we'll fill this with value when needed to compare script.
+
+ 'licenseName': licenseCell.textContent,
+ 'licenseUrl': licenseCell.href, // this will now be a magnet link, most likely.
+
+ 'sourceName': sourceCell.textContent,
+ 'sourceUrl': sourceCell.href
+ });
+ }
+
+ }
+ } catch (e) {
+ console.debug("Error fetching JS Web Label licenses", e,
+ e.lineNumber, e.fileName, "index is", i);
+ }
+ }
+
+ return jsList;
+
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/js_web_labels.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/js_web_labels.js
new file mode 100644
index 0000000..f13091c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/js_web_labels.js
@@ -0,0 +1,216 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+// node.js url module. Makes it easier to resole
+// urls in that datauri loaded dom
+var urlHandler = require("url_handler/url_handler");
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+var data = require("sdk/self").data;
+
+// license definitions, we are using canonical urls and license
+// identifiers.
+var licenses = require('js_checker/license_definitions').licenses;
+
+var getLicenseList = require('html_script_finder/web_labels/find_js_labels').getLicenseList;
+const types = require("js_checker/constant_types");
+
+const addToCache = require("html_script_finder/web_labels/script_hash_worker").addToCache;
+
+// keep web labels in memory so that they can be checked even when they
+// are embedded dynamically.
+var jsWebLabelEntries = {};
+
+// store the url to js web labels already visited during this session
+var jsLabelsPageVisited = {};
+
+var WebLabelFinder = function () {
+ this.dom = null;
+ this.pageURL = null;
+ this.jslicenseURL = null;
+ this.pageContent = null;
+ this.licenseList = null;
+ this.callback = null;
+};
+
+WebLabelFinder.prototype.init = function(dom, pageURL, callback) {
+ var that = this;
+ this.pageURL = pageURL;
+ this.dom = dom;
+ this.callback = function (a) {
+ if (typeof a == 'undefined') {
+ a = null;
+ }
+
+ // rewrite callback as soon as it is triggered once.
+ that.callback = function () {
+ console.debug("Callback already called");
+ };
+
+ callback(a);
+ };
+ this.findJavaScriptLicenses();
+ this.pageContent = '';
+ this.jslicenseURL = '';
+};
+
+WebLabelFinder.prototype.findJavaScriptLicenses = function () {
+ this.searchForJsLink();
+
+ if (this.jslicenseURL && !(jsLabelsPageVisited[this.jslicenseURL])) {
+ // get content from license page.
+ console.debug('called fetch license page for', this.jslicenseURL);
+ this.pageContent = this.fetchLicensePage();
+ }
+ else {
+ console.debug(this.jslicenseURL, "already visited");
+ this.callback();
+ }
+};
+
+WebLabelFinder.prototype.searchForJsLink = function() {
+ console.debug('triggered searchForJsLink');
+ if (this.dom) {
+ var linkTags = this.dom.getElementsByTagName('a'),
+ i = 0,
+ len = linkTags.length,
+ path;
+
+ // loop through all a tags.
+ for (; i < len; i++) {
+ if (linkTags[i].hasAttribute('rel') &&
+ linkTags[i].getAttribute('rel') === 'jslicense') {
+ return this.formatURL(linkTags[i]);
+ }
+ }
+ }
+ // no js web labels were found. call back.
+ this.callback();
+};
+
+WebLabelFinder.prototype.formatURL = function(link) {
+ this.jslicenseURL = urlHandler.resolve(this.pageURL, link.href);
+ this.jslicenseURL = urlHandler.addFragment(this.jslicenseURL, 'librejs=true');
+ console.debug('license URL found', this.jslicenseURL);
+};
+
+WebLabelFinder.prototype.fetchLicensePage = function() {
+ var that = this;
+ try {
+
+ var req = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance();
+
+ req.onload = function() {
+ console.debug("Fetching License!");
+ console.debug("URL is ", this._url);
+
+ that.licenseList = getLicenseList(this.responseXML);
+ console.debug("the license list", that.licenseList);
+ that.matchListWithDefs(this._url);
+
+ // add these entries to the global
+ // object for dynamically embedded scripts.
+ jsWebLabelEntries[that.pageURL] = that.licenseList;
+ jsLabelsPageVisited[req._url] = 1;
+
+ };
+ console.debug(this.jslicenseURL);
+ req.open('GET', this.jslicenseURL, true);
+ req._url = this.jslicenseURL;
+ req.responseType = "document";
+ req.send();
+
+ } catch (e) {
+ console.debug(e, e.lineNumber, e.fileName, this.jslicenseURL);
+ this.callback({});
+ }
+
+};
+
+WebLabelFinder.prototype.matchListWithDefs = function(jslicenseURL) {
+ var i = 0,
+ len = this.licenseList.length,
+ lic,
+ licDef,
+ urlLength,
+ iUrl,
+ licArray = null,
+ license, script;
+ var cacheCalls = 0;
+ list_check = {};
+ // nested loop.
+ cacheCalls = 0;
+ var callback = function (url) {
+ cacheCalls++;
+ list_check[url] = 1;
+ if (cacheCalls == Object.keys(list_check).length) {
+ console.debug("triggering callback duh");
+ // return array to requester object
+ callback = false;
+ that.callback(that.licenseList);
+ }
+ };
+ require("sdk/timers").setTimeout(function () {
+ // callback after 60 seconds if it's still not returned.
+ // using this as a safeguard.
+ // return array to requester object
+ if (callback !== false) {
+ that.callback(that.licenseList);
+ console.debug(list_check);
+ }
+ }, 15000);
+
+ for (; i < len; i++) {
+ lic = this.licenseList[i];
+ var that = this;
+ for (license in licenses) {
+ licDef = licenses[license];
+ if (licDef.canonicalUrl !== undefined) {
+ if (typeof licDef.canonicalUrl == 'string') {
+ // this is a string. make it an array.
+ licArray = [licDef.canonicalUrl];
+ } else {
+ licArray = licDef.canonicalUrl;
+ }
+
+ urlLength = licArray.length;
+
+ for (iUrl = 0; iUrl < urlLength; iUrl++) {
+ if (urlHandler.removeFragment(licArray[iUrl]) === urlHandler.removeFragment(lic.licenseUrl)) {
+ if (!require("sdk/url").isValidURI(lic.fileUrl)) {
+ console.debug(lic.fileUrl, " is not a valid URL");
+ callback();
+ }
+ lic.free = true;
+ var notif = require("ui/notification").createNotification(lic.fileUrl).notification;
+ console.debug("about TO ADD TO XHR: ", lic.fileUrl);
+ list_check[lic.fileUrl] = 0;
+ addToCache(lic, 0, jslicenseURL, callback);
+ }
+ }
+ }
+ }
+ }
+};
+
+exports.WebLabelFinder = WebLabelFinder;
+
+// store the web labels harvested across webpages (single session).
+exports.jsWebLabelEntries = jsWebLabelEntries;
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/script_hash_worker.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/script_hash_worker.js
new file mode 100644
index 0000000..e62133e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/script_hash_worker.js
@@ -0,0 +1,58 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+const types = require("js_checker/constant_types");
+const scriptsCached = require("script_entries/scripts_cache").scriptsCached;
+const xhr = require('html_script_finder/dom_handler/dom_checker').xhr;
+const timers = require("sdk/timers");
+
+exports.addToCache = function (lic, delay, jsWebLabelsURL, callback) {
+ console.debug("jslicenseURL is", jsWebLabelsURL);
+ if (typeof delay === 'undefined') {
+ delay = 0;
+ }
+
+ // get file hash and store as cached.
+ console.debug('performing xhr for', lic.fileUrl);
+ timers.setTimeout(function() {
+ var cb = function (script, contents) {
+ try {
+ // add a cache entry.
+ var hash = scriptsCached.addEntryIfNotCached(contents,
+ types.freeWithComment(
+ 'This script is free according to a JS Web Labels page visited recently (at ' +
+ jsWebLabelsURL.replace("librejs=true", "") + ' )'),
+ {},
+ true,
+ lic.fileUrl);
+ console.debug('returning xhr from', lic.fileUrl);
+ callback(lic.fileUrl);
+ } catch (e) {
+ callback(lic.fileUrl);
+ }
+ };
+ // just callback after 5 seconds if we don't get the answer yet.
+ timers.setTimeout(function() {
+ cb = function() {};
+ callback(lic.fileUrl); }, 20000);
+
+ xhr({'url': lic.fileUrl}, cb);},
+ delay);
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/allowed_referrers.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/allowed_referrers.js
new file mode 100644
index 0000000..4f524a7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/allowed_referrers.js
@@ -0,0 +1,75 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var prefChange = require("addon_management/prefchange");
+
+/**
+ * Contains a list of pages that are allowed
+ * to execute JavaScript regardless of whether it is
+ * nonfree and nontrivial.
+ */
+exports.allowedReferrers = {
+
+ allowed: {},
+
+ addPage: function (url) {
+ this.allowed[url] = 1;
+ },
+
+ urlInAllowedReferrers: function (url) {
+
+ if (this.allowed[url] === 1) {
+ return true;
+ }
+ // check if whitelisted.
+ return this.urlInWhitelist(url);
+
+ },
+
+ urlInWhitelist: function (url) {
+ var whitelist = prefChange.getWhitelist();
+ var i = 0, le = whitelist.length;
+
+ for (; i < le; i++) {
+
+ if (whitelist[i].test(url)) {
+
+ return true;
+
+ }
+
+ }
+
+ },
+
+ clearSinglePageEntry: function (url) {
+
+ var index = this.allowed[url];
+
+ if (this.allowed[url] === 1) {
+ delete this.allowed[url];
+ }
+
+ },
+
+ clearAllEntries: function () {
+ this.allowed = {};
+ }
+}; \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/caching.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/caching.js
new file mode 100644
index 0000000..1463b1c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/caching.js
@@ -0,0 +1,30 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+const nsICacheService = Ci.nsICacheService;
+const cacheService = Cc["@mozilla.org/network/cache-service;1"].getService(nsICacheService);
+
+exports.clearAllCache = function () {
+ cacheService.evictEntries(Ci.nsICache.STORE_ON_DISK);
+ cacheService.evictEntries(Ci.nsICache.STORE_IN_MEMORY);
+};
+
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/http_request_observer.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/http_request_observer.js
new file mode 100644
index 0000000..09e66e8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/http_request_observer.js
@@ -0,0 +1,161 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+var observerService = Cc["@mozilla.org/observer-service;1"]
+ .getService(Ci.nsIObserverService);
+
+// these are our target mime types for response interception.
+var targetMimeTypes = /.*(javascript|ecmascript|html).*/i;
+//var targetMimeTypes = /.*(html).*/i;
+
+// ensure xhr won't create an infinite loop
+// with html content.
+var urlTester = require("html_script_finder/url_seen_tester").urlSeenTester;
+
+var streamLoader = require("http_observer/stream_loader").streamLoader;
+
+var httpRequestObserver = {
+
+ observe: function(request, aTopic, aData) {
+
+ console.debug('atopic is', aTopic);
+
+ var url, newListener, status;
+
+ if (aTopic == "http-on-examine-response" ||
+ aTopic == "http-on-examine-cached-response" ||
+ aTopic == "http-on-examine-merged-response") {
+
+ request.QueryInterface(Ci.nsIHttpChannel);
+
+ if (request.URI.scheme != 'chrome' &&
+ (request.responseStatus < 300 ||
+ request.responseStatus > 399) &&
+ (targetMimeTypes.test(request.contentType) ||
+ request.contentType == undefined) &&
+ (!urlTester.isWhitelisted(request.URI.spec) &&
+ !urlTester.isWhitelisted(request.originalURI.spec))) {
+
+ newListener = new TracingListener();
+ request.QueryInterface(Ci.nsITraceableChannel);
+ newListener.originalListener = request.setNewListener(newListener);
+
+ }
+
+ else if (urlTester.isWhitelisted(request.URI.spec) ||
+ urlTester.isWhitelisted(request.originalURI.spec)) {
+ urlTester.clearUrl(request.URI.spec);
+ urlTester.clearUrl(request.originalURI.spec);
+ }
+
+ }
+ },
+
+ QueryInterface : function (aIID) {
+ if (aIID.equals(Ci.nsIObserver) ||
+ aIID.equals(Ci.nsISupports)) {
+ return this;
+ }
+ throw Cr.NS_NOINTERFACE;
+ }
+};
+
+// Copy response listener implementation.
+function TracingListener() {
+ this.originalListener = null;
+ this.streamLoader = streamLoader();
+}
+
+TracingListener.prototype = {
+
+ onDataAvailable: function(request, context, inputStream, offset, count) {
+
+ try {
+ this.streamLoader.loader.onDataAvailable(request, context, inputStream, offset, count);
+ } catch (x) {
+
+ console.debug(x, x.lineNumber, x.fileName, "In this case, charset is");
+
+ }
+
+ },
+
+ onStartRequest: function(request, context) {
+
+ this.streamLoader.setOriginalListener(this.originalListener);
+ this.streamLoader.loader.onStartRequest(request, context);
+ this.originalListener.onStartRequest(request, context);
+
+ },
+
+ onStopRequest: function(request, context, statusCode) {
+
+ try {
+ this.streamLoader.loader.onStopRequest(request, context, statusCode);
+ } catch (e) {
+ console.debug('error in onStopRequest', e, e.lineNumber);
+ }
+ },
+
+ QueryInterface: function (aIID) {
+ if (aIID.equals(Ci.nsIStreamListener) ||
+ aIID.equals(Ci.nsISupports)) {
+ return this;
+ }
+ throw Cr.NS_NOINTERFACE;
+ },
+
+
+};
+
+observerService.addObserver(httpRequestObserver,
+ "http-on-examine-response", false);
+
+observerService.addObserver(httpRequestObserver,
+ "http-on-examine-cached-response", false);
+
+observerService.addObserver(httpRequestObserver,
+ "http-on-examine-merged-response", false);
+
+
+
+/* remove observer */
+exports.removeHttpObserver = function () {
+
+ try {
+
+ observerService.removeObserver(httpRequestObserver,
+ "http-on-examine-response");
+
+ observerService.removeObserver(httpRequestObserver,
+ "http-on-examine-cached-response");
+
+ observerService.removeObserver(httpRequestObserver,
+ "http-on-examine-merged-response");
+
+ console.debug('turned off http observer');
+
+ } catch (e) {
+ console.debug(e);
+ }
+
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/process_response.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/process_response.js
new file mode 100644
index 0000000..759adf7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/process_response.js
@@ -0,0 +1,408 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * This module checks http responses by mime type and returns a
+ * modified response.
+ */
+
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+var jsChecker = require("js_checker/js_checker");
+
+const types = require("js_checker/constant_types");
+var checkTypes = types.checkTypes;
+
+// check if scripts embedded dynamically have a jsWebLabel entry indexed by referrer.
+var jsWebLabelEntries = require("html_script_finder/web_labels/js_web_labels").jsWebLabelEntries;
+
+var htmlParser = require("html_script_finder/html_parser");
+
+var removedScripts = require("script_entries/removed_scripts").removedScripts;
+var allowedRef = require('http_observer/allowed_referrers').allowedReferrers;
+
+var acceptedScripts = require("script_entries/accepted_scripts").acceptedScripts;
+
+// used to display info when a url is whitelisted.
+var dryRunScripts = require("script_entries/dryrun_scripts").dryRunScripts;
+
+// node.js url module. Makes it easier to resolve
+// urls in that datauri loaded dom
+var urlHandler = require("url_handler/url_handler");
+var isDryRun = require("addon_management/prefchange").isDryRun;
+
+var jsMimeTypeRe = /.*(javascript|ecmascript).*/i;
+var htmlMimeTypeRe = /.*(xhtml\+xml|html|multipart\/x-mixed-replace).*/i;
+
+
+var processResponseObject = {
+ data: null,
+ myParser: null,
+ url: null,
+ scriptFinder: null,
+ jsCheckString: null,
+ referrer: null,
+ contentType: null,
+ resInfo: null,
+ listener: null,
+ req: null,
+
+ /**
+ * starts the handling of a new response.
+ */
+ init: function (listener, resInfo) {
+ this.resInfo = resInfo;
+ this.req = resInfo.request;
+ /* needed for this.req.referrer */
+ this.req.QueryInterface(Ci.nsIHttpChannel);
+ this.listener = listener;
+ this.setData();
+ this.setContentType();
+ this.setUrls();
+ },
+
+ /**
+ * genBinaryOutput
+ * Set or reset binaryOutputStream and storageStream.
+ */
+ genBinaryOutput: function () {
+ this.storageStream = Cc["@mozilla.org/storagestream;1"].createInstance(Ci.nsIStorageStream);
+ this.binaryOutputStream = Cc["@mozilla.org/binaryoutputstream;1"].createInstance(Ci.nsIBinaryOutputStream);
+ },
+
+ /**
+ * Gather the data gathered from onDataAvailable.
+ */
+ setData: function () {
+
+ this.data = this.resInfo.receivedData;
+ console.debug("\n\nDump of whole data:\n\n", this.data, "\n\n end of dump");
+ // Prevents the http response body from being empty,
+ // which would throw an error.
+ if (this.data == '' || this.data == undefined) {
+ this.data = " ";
+ }
+
+ },
+
+ /**
+ * Set a standardized lowercase mime type.
+ */
+ setContentType: function() {
+ if (this.req.contentType != undefined) {
+ this.contentType = String(this.req.contentType).toLowerCase();
+ }
+ },
+
+ /**
+ * setUrls
+ * Set the current URL of the response, and
+ * set referrer if applicable.
+ */
+ setUrls: function() {
+
+ if (this.req.URI != undefined) {
+ this.fragment = urlHandler.getFragment(this.req.URI.spec);
+ console.debug('fragment is', this.fragment);
+ this.url = urlHandler.removeFragment(this.req.URI.spec);
+ }
+ if (this.req.referrer != undefined) {
+ this.referrerFragment = urlHandler.getFragment(this.req.referrer.spec);
+ this.referrer = urlHandler.removeFragment(this.req.referrer.spec);
+ }
+ },
+
+ /**
+ * processHTML
+ * Modifies a string of html
+ */
+ processHTML: function() {
+
+ var charset = this.req.contentCharset, myParser;
+
+ if (this.req.contentCharset != undefined && this.req.contentCharset != "") {
+ charset = this.req.contentCharset;
+ } else {
+ charset = "";
+ }
+ acceptedScripts.clearScripts(this.req.URI.spec);
+ removedScripts.clearScripts(this.req.URI.spec);
+ dryRunScripts.clearScripts(this.req.URI.spec);
+
+ console.debug('charset is', charset);
+ console.debug('responseStatus for', this.url, 'is', this.req.responseStatus);
+
+ // send data to htmlParser, and pass on modified data to
+ // originalListener.
+
+ myParser = htmlParser.htmlParser().parse(this.data,
+ charset,
+ this.contentType,
+ this.url,
+ this.fragment,
+ this.req.responseStatus,
+ this.htmlParseCallback.bind(this));
+ },
+
+ /**
+ *
+ * htmlParseCallback
+ *
+ * Passed on the callback result to
+ * the originalListener.
+ *
+ */
+ htmlParseCallback: function(result) {
+
+ var len = result.length;
+
+ try {
+
+ this.listener.onDataAvailable(this.req,
+ this.resInfo.context,
+ result.newInputStream(0), 0, len);
+
+
+ } catch (e) {
+
+ this.req.cancel(this.req.NS_BINDING_ABORTED);
+
+ }
+
+ this.listener.onStopRequest(this.req,
+ this.resInfo.context, this.resInfo.statusCode);
+
+ },
+
+ /**
+ * processJS
+ * Process and modify a string of JavaScript.
+ */
+ processJS: function() {
+ var checker, check, jsCheckString,
+ that = this;
+ //var start = Date.now(), end;
+
+ try {
+ // make sure script isn't already listed as free
+ // in a JS web labels table.
+ if (this.checkJsWebLabelsForScript()) {
+ // this is free. we are done.
+ this.jsListenerCallback();
+ return;
+
+ }
+
+ // analyze javascript in response.
+ checker = jsChecker.jsChecker();
+ check = checker.searchJs(this.data, function () {
+ console.debug("Has been analyzing", that.data);
+ that.processJsCallback(checker);
+ }, that.url);
+
+
+
+ } catch(e) {
+
+ // any error is considered nontrivial.
+ console.debug('js error in js app, removing script', e);
+ console.debug("error", e, e.lineNumber);
+ // modify data that will be sent to the browser.
+ this.data = '// LibreJS: Script contents were removed when it was loaded from a page, because another script attempted to load this one dynamically. Please place your cursor in the url bar and press the enter key to see the source.';
+ this.jsListenerCallback();
+ }
+
+ },
+
+ /**
+ * checkJsWebLabelsForScript
+ *
+ * check whether script that's been received has an entry
+ * in a js web labels table (lookup referrer.)
+ *
+ */
+ checkJsWebLabelsForScript: function () {
+
+ console.debug('checking script', this.url);
+ console.debug('current list is', JSON.stringify(jsWebLabelEntries));
+ if (jsWebLabelEntries[this.referrer] != undefined) {
+
+ var scriptList = jsWebLabelEntries[this.referrer],
+ i = 0,
+ len = scriptList.length;
+
+ for (; i < len; i++) {
+
+ if (scriptList[i].fileUrl === this.url &&
+ scriptList[i].free === true) {
+
+ console.debug(this.url, "is free and dynamic!");
+
+ var scriptObj = {inline: false,
+ url: this.url,
+ contents: this.url,
+ reason: "This script is free (see JS Web Labels page for detail)"};
+
+ acceptedScripts.addAScript(this.req.referrer.spec, scriptObj, "Script is free");
+
+ return true;
+
+ }
+
+ }
+
+
+ }
+
+ },
+
+ processJsCallback: function(checker) {
+ try {
+ var scriptObj;
+
+ var jsCheckString = checker.parseTree.freeTrivialCheck;
+ console.debug("analyzing js callback for", this.url);
+ // for testing only.
+ //var jsCheckString = {'type': checkTypes.FREE_SINGLE_ITEM };
+ console.debug('jscheckstring is', jsCheckString.type);
+
+ if (jsCheckString.type === checkTypes.NONTRIVIAL) {
+ if (!allowedRef.urlInAllowedReferrers(this.req.referrer.spec)) {
+ //if (true) {
+ console.debug("url", this.url, " is found nontrivial", "with reason", jsCheckString.reason);
+ scriptObj = {inline: false,
+ contents: '',
+ removalReason: 'nontrivial',
+ reason: jsCheckString.reason,
+ url: this.url,
+ hash: checker.hash};
+ removedScripts.addAScript(this.req.referrer.spec, scriptObj);
+
+ // modify data that will be sent to the browser.
+ this.data = '// LibreJS: Script contents were removed when it was loaded from a page, because another script attempted to load this one dynamically and its contents appear to be nonfree/nontrivial. Please hit enter in the location bar to see the actual source.';
+ } else {
+ console.debug("writing to dry run", this.url);
+ scriptObj = {inline:false,
+ contents: '',
+ removalReason: 'nontrivial',
+ reason: jsCheckString.reason,
+ url: this.url,
+ hash:checker.hash};
+ dryRunScripts.addAScript(this.req.referrer.spec, scriptObj);
+ }
+
+ this.jsListenerCallback();
+
+ } else if (jsCheckString.type === checkTypes.FREE ||
+ jsCheckString.type === checkTypes.FREE_SINGLE_ITEM ||
+ jsCheckString.type === checkTypes.TRIVIAL ||
+ jsCheckString.type === checkTypes.TRIVIAL_DEFINES_FUNCTION ||
+ jsCheckString.type === checkTypes.WHITELISTED) {
+ console.debug("found a free script for", this.url, this.req.referrer.spec, jsCheckString.reason);
+ console.debug('found a free script', this.req.referrer.spec);
+
+ scriptObj = {inline: false,
+ contents: '',
+ reason: jsCheckString.reason,
+ url: this.url,
+ hash:checker.hash};
+
+ acceptedScripts.addAScript(this.req.referrer.spec, scriptObj);
+ this.jsListenerCallback();
+ }
+
+ //var end = Date.now();
+ console.debug('exec time', this.url, ' -- ', end - start);
+ } catch (x) {
+ console.debug('error', x);
+ }
+ },
+
+ /**
+ * ProcessAllTypes
+ * Calls processHTML or JS if it finds an appropriate content
+ * type. For everything else it just passes on the data to the
+ * original listener.
+ */
+ processAllTypes: function() {
+ // toggle xlibrejs if X-LibreJS is set.
+
+ // process HTML
+ if ((htmlMimeTypeRe.test(this.contentType) ||
+ this.req.contentType === undefined)) {
+ this.processHTML();
+ return;
+ }
+
+ else {
+ // process external JS files that are called from another
+ // file (and hence have a referrer).
+
+ if (this.referrer != undefined &&
+ jsMimeTypeRe.test(this.contentType) &&
+ !(acceptedScripts.isFound(this.referrer, {inline: false, contents: this.url})) &&
+ !(acceptedScripts.isFound(this.referrer, {inline:false, contents:this.req.originalURI.spec}))) {
+
+ // console.debug('process js triggered for', this.url);
+ this.processJS();
+
+ } else {
+ this.jsListenerCallback();
+ }
+
+ }
+
+ },
+
+ jsListenerCallback: function () {
+
+ var len = this.data.length;
+
+ this.genBinaryOutput();
+
+ this.storageStream.init(8192, len, null);
+ this.binaryOutputStream.setOutputStream(this.storageStream.getOutputStream(0));
+ this.binaryOutputStream.writeBytes(this.data, len);
+
+ try {
+ this.listener.onDataAvailable(this.req,
+ this.resInfo.context,
+ this.storageStream.newInputStream(0),
+ 0, len);
+ } catch (e) {
+ this.req.cancel(this.req.NS_BINDING_ABORTED);
+ }
+
+ this.listener.onStopRequest(this.req,
+ this.resInfo.context,
+ this.resInfo.statusCode);
+
+ }
+
+
+};
+
+// creates an instance of processResponseObject.
+exports.ProcessResponse = function (listener, resInfo) {
+ console.debug('triggered');
+ var procResponse = Object.create(processResponseObject);
+ procResponse.init(listener, resInfo);
+ return procResponse;
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/stream_loader.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/stream_loader.js
new file mode 100644
index 0000000..bd27132
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/stream_loader.js
@@ -0,0 +1,110 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+const processResponse = require('http_observer/process_response');
+
+var StreamLoader = function() {
+ this.loader = null;
+ this.listener = null;
+ this.originalListener = null;
+}
+
+StreamLoader.prototype.setOriginalListener = function(listener) {
+ this.originalListener = listener;
+};
+
+StreamLoader.prototype.init = function() {
+ try {
+ var that = this;
+ this.listener = new StreamListener();
+
+ this.listener.callback = function (loader, context, status, data) {
+ console.debug("here is the data", data);
+ var responseInfo = {'request': loader.channel,
+ 'context': context,
+ 'statusCode': status,
+ 'receivedData': data};
+ var responseHandler = processResponse.ProcessResponse(that.originalListener, responseInfo);
+ responseHandler.processAllTypes();
+
+ that.destroy();
+ };
+
+ this.loader = Cc["@mozilla.org/network/unichar-stream-loader;1"].
+ createInstance(Ci.nsIUnicharStreamLoader);
+
+ this.loader.init(this.listener);
+ } catch (e) {
+ console.debug(e);
+ }
+};
+
+StreamLoader.prototype.destroy = function () {
+ this.loader = null;
+ this.listener = null;
+};
+
+var getRegexForContentType = function (contentType) {
+ if (/xhtml/i.test(contentType)) {
+ return /<\?[^>]*?encoding=(?:["']*)([^"'\s\?>]+)(?:["']*)/i;
+ }
+
+ // return the regular html regexp for anything else.
+ return /<meta[^>]*?charset=(?:["']*)([^"'\s>]+)(?:["']*)/i;
+};
+
+var StreamListener = function() {};
+
+StreamListener.prototype.QueryInterface = function listener_qi(iid) {
+ if (iid.equals(Ci.nsISupports) ||
+ iid.equals(Ci.nsIUnicharStreamLoaderObserver)) {
+ return this;
+ }
+ throw Cr.NS_ERROR_NO_INTERFACE;
+};
+
+StreamListener.prototype.onStreamComplete = function onStreamComplete(
+ loader, context, status, data) {
+ this.callback(loader, context, status, data);
+};
+
+StreamListener.prototype.onDetermineCharset = function onDetermineCharset(
+ loader, context, data) {
+ var match, regex;
+ if (loader.channel.contentCharset != undefined &&
+ loader.channel.contentCharset != "") {
+ return loader.channel.contentCharset;
+ } else {
+ match = getRegexForContentType(loader.channel.contentType).exec(data);
+ if (match) {
+ loader.channel.contentCharset = match[1];
+ return match[1];
+ } else {
+ return "UTF-8";
+ }
+ }
+};
+
+exports.streamLoader = function () {
+ var l = new StreamLoader();
+ l.init();
+ return l;
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/constant_types.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/constant_types.js
new file mode 100644
index 0000000..1a3b2a9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/constant_types.js
@@ -0,0 +1,190 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+//var debug = require("debug/debug");
+
+// token list from exports.init();
+exports.token = {
+ END: 0,
+ NEWLINE: 1,
+ SEMICOLON: 2,
+ COMMA: 3,
+ ASSIGN: 4,
+ HOOK: 5,
+ COLON: 6,
+ CONDITIONAL: 7,
+ OR: 8,
+ AND: 9,
+ BITWISE_OR: 10,
+ BITWISE_XOR: 11,
+ BITWISE_AND: 12,
+ EQ: 13,
+ NE: 14,
+ STRICT_EQ: 15,
+ STRICT_NE: 16,
+ LT: 17,
+ LE: 18,
+ GE: 19,
+ GT: 20,
+ LSH: 21,
+ RSH: 22,
+ URSH: 23,
+ PLUS: 24,
+ MINUS: 25,
+ MUL: 26,
+ DIV: 27,
+ MOD: 28,
+ NOT: 29,
+ BITWISE_NOT: 30,
+ UNARY_PLUS: 31,
+ UNARY_MINUS: 32,
+ INCREMENT: 33,
+ DECREMENT: 34,
+ DOT: 35,
+ LEFT_BRACKET: 36,
+ RIGHT_BRACKET: 37,
+ LEFT_CURLY: 38,
+ RIGHT_CURLY: 39,
+ LEFT_PAREN: 40,
+ RIGHT_PAREN: 41,
+ SCRIPT: 42,
+ BLOCK: 43,
+ LABEL: 44,
+ FOR_IN: 45,
+ CALL: 46,
+ NEW_WITH_ARGS: 47,
+ INDEX: 48,
+ ARRAY_INIT: 49,
+ OBJECT_INIT: 50,
+ PROPERTY_INIT: 51,
+ GETTER: 52,
+ SETTER: 53,
+ GROUP: 54,
+ LIST: 55,
+ LET_BLOCK: 56,
+ ARRAY_COMP: 57,
+ GENERATOR: 58,
+ COMP_TAIL: 59,
+ IDENTIFIER: 60,
+ NUMBER: 61,
+ STRING: 62,
+ REGEXP: 63,
+ BREAK: 64,
+ CASE: 65,
+ CATCH: 66,
+ CONST: 67,
+ CONTINUE: 68,
+ DEBUGGER: 69,
+ DEFAULT: 70,
+ DELETE: 71,
+ DO: 72,
+ ELSE: 73,
+ EXPORT: 74,
+ FALSE: 75,
+ FINALLY: 76,
+ FOR: 77,
+ FUNCTION: 78,
+ IF: 79,
+ IMPORT: 80,
+ IN: 81,
+ INSTANCEOF: 82,
+ LET: 83,
+ MODULE: 84,
+ NEW: 85,
+ NULL: 86,
+ RETURN: 87,
+ SWITCH: 88,
+ THIS: 89,
+ THROW: 90,
+ TRUE: 91,
+ TRY: 92,
+ TYPEOF: 93,
+ VAR: 94,
+ VOID: 95,
+ YIELD: 96,
+ WHILE: 97,
+ WITH: 98
+};
+
+var checkTypes = {
+ // trivial.
+ TRIVIAL: 1,
+
+ // defines functions, and so might or might not
+ // be trivial in the end.
+ TRIVIAL_DEFINES_FUNCTION: 2,
+
+ NONTRIVIAL: 3,
+
+ // Free
+ FREE: 4,
+ FREE_SINGLE_ITEM: 5,
+ WHITELISTED: 6
+};
+
+exports.checkTypes = checkTypes;
+
+exports.emptyTypeObj = function () {
+ return {
+ 'type': null,
+ 'reason': null
+ };
+};
+
+exports.nontrivialWithComment = function (comment) {
+ return {
+ 'type': checkTypes.NONTRIVIAL,
+ 'reason': comment
+ };
+};
+
+exports.trivialWithComment = function (comment) {
+ return {
+ 'type': checkTypes.TRIVIAL,
+ 'reason': comment
+ };
+};
+
+exports.trivialFuncWithComment = function (comment) {
+ return {
+ 'type': checkTypes.TRIVIAL_DEFINES_FUNCTION,
+ 'reason': comment
+ };
+};
+
+exports.freeWithComment = function (comment) {
+ return {
+ 'type': checkTypes.FREE,
+ 'reason': comment
+ };
+};
+
+exports.singleFreeWithComment = function (comment) {
+ return {
+ 'type': checkTypes.FREE_SINGLE_ITEM,
+ 'reason': comment
+ };
+};
+
+exports.whitelisted = function (comment) {
+ return {
+ 'type': checkTypes.WHITELISTED,
+ 'reason': comment + ' -- whitelisted by user'
+ };
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/free_checker.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/free_checker.js
new file mode 100644
index 0000000..f5690f2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/free_checker.js
@@ -0,0 +1,227 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+
+var licenses = require('js_checker/license_definitions');
+var simpleStorage = require("sdk/simple-storage");
+const LAZY = licenses.types.LAZY;
+var licenseRegex = [];
+const END_OF_SCRIPT = require('html_script_finder/bug_fix').END_OF_SCRIPT;
+const types = require("js_checker/constant_types");
+
+const token = types.token;
+
+var patternUtils = require('js_checker/pattern_utils').patternUtils;
+
+var licStartLicEndRe = /@licstartThefollowingistheentirelicensenoticefortheJavaScriptcodeinthis(?:page|file)(.*)?@licendTheaboveistheentirelicensenoticefortheJavaScriptcodeinthis(?:page|file)/mi;
+var licenseMagnet = /.*@license ?(magnet\:\?xt=urn\:btih\:[0-9A-Za-z]+).*/;
+var licenseEndMagnet = /.*@license-end.*/i;
+exports.freeCheck = {
+ initLicenses: function (licenses) {
+ for (var item in licenses) {
+ this.stripLicenseToRegexp(licenses[item]);
+ }
+ },
+
+ /**
+ * stripLicenseToRegexp
+ *
+ * Removes all non-alphanumeric characters except for the
+ * special tokens, and replace the text values that are
+ * hardcoded in license_definitions.js
+ *
+ */
+ stripLicenseToRegexp: function (license) {
+ var i = 0,
+ max = license.licenseFragments.length,
+ item;
+
+ for (; i < max; i++) {
+ item = license.licenseFragments[i];
+ item.regex = patternUtils.removeNonalpha(item.text);
+
+ if (license.licenseFragments[i].type === LAZY) {
+
+ // do not permit words before. Since "Not" could be added
+ // and make it nonfree. e.g.: Not licensed under the GPLv3.
+ item.regex = '^(?!.*not).*' + item.regex;
+
+ }
+
+ item.regex = new RegExp(patternUtils.replaceTokens(item.regex), 'i');
+ }
+
+ return license;
+ },
+
+ /**
+ * checkNodeFreeLicense
+ *
+ * Check if the node mentions a free license
+ * in one of its comments.
+ *
+ */
+ checkNodeFreeLicense: function (n, queue) {
+ var strippedComment,
+ magnetLink,
+ comment = this.getComment(n),
+ list = licenses.licenses,
+ i, j,
+ max,
+ regex,
+ frag,
+ matchLicStart,
+ matchMagnet,
+ license,
+ isMagnetValid = false;
+
+ if (n.counter === 2 &&
+ n.parent != undefined &&
+ n.parent.type === token.SCRIPT &&
+ comment != undefined &&
+ comment != " ") {
+ strippedComment = patternUtils.removeNonalpha(comment);
+ matchLicStart = strippedComment.match(licStartLicEndRe);
+ console.debug("matchMagnet is", matchMagnet);
+ if (matchLicStart) {
+ strippedComment = matchLicStart[1];
+ for (license in list) {
+ frag = list[license].licenseFragments;
+ max = list[license].licenseFragments.length;
+ for (i = 0;i < max; i++) {
+ if (frag[i].regex.test(strippedComment)) {
+ return {licenseName: list[license].licenseName,
+ type: types.checkTypes.FREE} ;
+
+ }
+ }
+ }
+ }
+ return this.matchMagnet(comment, queue); /// check for @license -- @license-end notation.
+ }
+
+ },
+
+ /**
+ * matchMagnet
+ * Attempts to find valid @license [magnet]
+ * and @license-end notation.
+ */
+ matchMagnet: function (comment, queue) {
+ let matchMagnet = comment.match(licenseMagnet);
+ if (matchMagnet) {
+ let magnetLinkRe = new RegExp(matchMagnet[1].replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"));
+ let list = licenses.licenses;
+ let queue_end = queue.length;
+
+ for (var license in list) {
+ frag = list[license].canonicalUrl;
+ console.debug("frag is ", frag);
+ if (frag != undefined) {
+ max = list[license].canonicalUrl.length;
+ console.debug("max is", max);
+ for (i = 0;i < max; i++) {
+ console.debug("current frag is", frag[i]);
+ if (frag[i].match(magnetLinkRe)) {
+ for (let i = 0; i < queue_end; i++) {
+ console.debug(queue[i]);
+ let n = queue[i];
+ comment = this.getComment(n);
+ if (comment != undefined &&
+ comment.match(licenseEndMagnet) &&
+ this.checkIsLastNode(n)) {
+ // found a closing match. Just accept this script.
+ return {licenseName: list[license].licenseName,
+ type: types.checkTypes.FREE_SINGLE_ITEM};
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return;
+ },
+
+ /**
+ * checkIsLastJsNode.
+ * returns true if n is the last node.
+ * Or if nodes before it are only comments etc (not valid code.)
+ * A special LibreJS node is appended at the end of a script tree to
+ * check if this is the last (and also for narcissus to keep the last comment
+ * in the tree.)
+ * TODO: Refactor LibreJS so that END nodes can have a comment.
+ */
+ checkIsLastNode: function (n) {
+ // first check if the comment is part of the very last statement.
+ if (n.value == "this" && n.next == undefined) {
+ // just make sure the last node is indeed our harmless bit of
+ // js.
+ if (n.tokenizer) {
+ let source = n.tokenizer.source;
+ let substring = source.substr(n.start, n.end+23);
+ if (substring == END_OF_SCRIPT) {
+ return true;
+ }
+ else {
+ console.debug("substring is ", substring);
+ return false;
+ }
+ }
+ console.debug("Hurra! This is the end of our script");
+ return true;
+ }
+
+ // isn't our last node.
+ return false;
+ },
+
+ /**
+ * getComment
+ *
+ * Grab the comment(s) from the node. Concatenates
+ * multiple comments.
+ *
+ */
+ getComment: function (n) {
+
+ var i = 0, length, comment = "";
+
+ if (n.blockComments == undefined || n.blockComments == " ") {
+ return;
+ }
+
+ length = n.blockComments.length;
+ if (length > 0) {
+ for (; i < length; i++) {
+ comment += n.blockComments[i];
+ }
+ }
+ if (comment == "") {
+ return;
+ }
+ return comment;
+
+ }
+
+};
+
+exports.freeCheck.initLicenses(licenses.licenses);
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/js_checker.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/js_checker.js
new file mode 100644
index 0000000..a96eea7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/js_checker.js
@@ -0,0 +1,513 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+const narcissusWorker = require("narcissus_parser/narcissus_worker");
+
+const nonTrivialModule = require("js_checker/nontrivial_checker");
+const freeChecker = require("js_checker/free_checker");
+const relationChecker = require("js_checker/relation_checker");
+const types = require("js_checker/constant_types");
+
+const scriptsCached = require("script_entries/scripts_cache").scriptsCached;
+var isDryRun = require("addon_management/prefchange").isDryRun;
+
+var checkTypes = types.checkTypes;
+
+const token = types.token;
+
+// for setTimeout.
+const timer = require("sdk/timers");
+
+var callbackMap = {};
+
+/**
+ * This module needs to be updated so that it is asynchronous
+ * and to reduce CPU usage --
+ *
+ * Partly already done in:
+ * https://gitorious.org/librejs/librejs/blobs/async/lib/js_checker/js_checker.js
+ * data/complain/contact_finder.js on how to proceed.
+ *
+ */
+/**
+ *
+ * Pairs a hash with a given callback
+ * method from an object.
+ *
+ */
+var setHashCallback = function(hash, callback, notification) {
+ console.debug("hash is now ", hash);
+ if (hash in callbackMap && isDryRun()) {
+ // work around for issue with dryrun after
+ // checking box.
+ // do nothing.
+ callbackMap[hash] = callback;
+ }
+ else if (hash in callbackMap) {
+ // console.debug("callback", callbackMap[hash]);
+ notification.close();
+ throw Error("already being checked.");
+ } else {
+ callbackMap[hash] = callback;
+ }
+ console.debug("callback is type: ", callback.constructor);
+ //callbackMap[hash] = callback;
+};
+
+var removeHashCallback = function(hash) {
+ if (hash in callbackMap) {
+ delete callbackMap[hash];
+ }
+};
+
+/**
+ * find callback and return result (parse tree).
+ *
+ */
+exports.callbackHashResult = function(hash, result) {
+ try {
+ callbackMap[hash](result, hash);
+ } catch (x) {
+ console.debug('error in jsChecker', x, 'hash:', hash);
+ // return tree as false.
+ console.debug("Error with", x);
+ if (typeof callbackMap[hash] == 'function') {
+ callbackMap[hash](false, hash);
+ } else {
+ console.debug('callbackHashResult Error', x);
+ }
+ }
+ // remove callback after it's been called.
+ removeHashCallback(hash);
+};
+
+var JsChecker = function() {
+ this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ this.nonTrivialChecker = null;
+ this.freeToken = false;
+ this.nontrivialness = false;
+ this.parseTree = null;
+ this.relationChecker = null;
+ this.jsCode = null;
+ this.resultReady = null;
+ this.notification = null;
+ this.walkTreeCancelled = false;
+ this.shortText = null;
+ this.hash = null;
+ this.queue = null; // will contain the nodes of the script.
+};
+
+/**
+ * searchJs
+ *
+ * Takes in some javascript code (as string).
+ * Uses Narcissus parser to build an abstract syntax tree.
+ * Checks for trivialness.
+ *
+ */
+JsChecker.prototype.searchJs = function(jsCode, resultReady, url) {
+ var that = this;
+ var bugfix = require('html_script_finder/bug_fix').narcissusBugFixLibreJS;
+ this.url = url;
+ this.resultReady = resultReady;
+ this.jsCode = jsCode;
+ this.shortText = jsCode.replace(bugfix, '').substring(0,100);
+ this.notification = require("ui/notification")
+ .createNotification(this.shortText).notification;
+
+ var verbatimCode = this.jsCode.replace(bugfix, '');
+ this.hash = scriptsCached.getHash(verbatimCode);
+ var isCached = scriptsCached.isCached(verbatimCode, this.hash);
+ if (isCached) {
+ console.debug("We have it cached indeed!");
+ // there is an existing entry for this exact copy
+ // of script text.
+ console.debug('this script result is cached', this.hash, isCached.result.type);
+ console.debug("Return right away");
+ // we are not generating a parse tree.
+ this.parseTree = {};
+ // fake the result is from parse tree.
+ this.parseTree.freeTrivialCheck = isCached.result;
+
+ this.relationChecker = isCached.relationChecker;
+ // leave without doing parsing/analysis part.
+ this.resultReady();
+ this.removeNotification();
+ return;
+ }
+
+ try {
+ // no cache, continue.
+ this.relationChecker = relationChecker.relationChecker();
+ this.freeToken = types.emptyTypeObj();
+ this.nontrivialness = types.emptyTypeObj();
+
+ // use this.hash to keep track of comments made by the nontrivial checker code
+ // about why/how the code is found to be nontrivial.
+ this.nonTrivialChecker = nonTrivialModule.nonTrivialChecker(this.hash);
+
+ // register callback and hash. So that result
+ // can be passed.
+ setHashCallback(this.hash, this.handleTree.bind(this), this.notification);
+
+ // parse using ChromeWorker.
+ narcissusWorker.parse(this.jsCode, this.hash);
+ } catch (x) {
+ console.debug('error', x);
+ this.handleTree(false, x);
+ this.removeNotification();
+ }
+};
+
+JsChecker.prototype.handleTree = function(tree, errorMessage) {
+ var that = this;
+
+ if (tree == false || tree == undefined) {
+ // error parsing tree. Just return nonfree nontrivial.
+ this.parseTree = {};
+ this.parseTree.freeTrivialCheck = types.nontrivialWithComment(
+ 'error parsing: ' + errorMessage);
+
+ // cache result with hash of script for future checks.
+ scriptsCached.addEntry(this.jsCode, this.parseTree.freeTrivialCheck,
+ this.relationChecker, true, this.url);
+ this.resultReady();
+ } else {
+ try {
+ // no need to keep parseTree in property
+ this.parseTree = {}; //tree;
+ console.debug(tree);
+ this.walkTree(tree);
+ } catch (x) {
+ console.debug(x, x.lineNumber, x.fileName);
+ }
+ }
+};
+
+/**
+ * getCheckerResult
+ *
+ * Callback to Assign result from walkTree to property.
+ * reset parse tree. create cache entry.
+ *
+ */
+JsChecker.prototype.getCheckerResult = function(result) {
+ // done with parse tree. Get rid of it.
+ this.parseTree = {};
+ this.removeNotification();
+
+ this.parseTree.nonTrivialChecker = this.nonTrivialChecker;
+
+ // actual result stored here. hack since we used parseTree before.
+ this.parseTree.freeTrivialCheck = result;
+
+ // cache result with hash of script for future checks.
+ scriptsCached.addEntry(this.jsCode, this.parseTree.freeTrivialCheck,
+ this.relationChecker, true, this.url);
+
+ this.resultReady();
+};
+
+/**
+ * trivialCheck
+ *
+ * Runs nodes through a series of conditional statements
+ * to find out whether it is trivial or not.
+ *
+ * @param {object} n. The current node being studied.
+ * @param {string} t. The type of node being studied
+ * (initializer, functionbody, try block, ...)
+ *
+ */
+JsChecker.prototype.trivialCheck = function(n) {
+ return this.nonTrivialChecker.checkNontrivial(n);
+};
+
+/**
+ * freeCheck
+ *
+ * Check if comments above current node could be a free licence.
+ * If it is, then the script will be flagged as free.
+ *
+ * @param {object} n. The current node being studied.
+ * (initializer, functionbody, try block, ...)
+ *
+ */
+JsChecker.prototype.freeCheck = function(n, ntype) {
+ var check = freeChecker.freeCheck.checkNodeFreeLicense(n, this.queue);
+ return check;
+};
+
+/**
+ * walkTree
+ *
+ * An iterative functionwalking the parse tree generated by
+ * Narcissus.
+ *
+ * @param {object} node. The original node.
+ *
+ */
+JsChecker.prototype.walkTree = function(node) {
+ var queue = [node];
+ var i,
+ len,
+ n, counter = 0,
+ result,
+ processQueue,
+ that = this;
+
+ this.queue = queue; // set as property.
+
+ // set top node as visited.
+ node.visited = true;
+
+ /**
+ * functionwalking the tree for a given
+ * amount of time, before calling itself again.
+ */
+ processQueue = function() {
+ var nodeResult, end;
+
+ // record start time of functionexecution.
+ var start = Date.now();
+
+ if (that.walkTreeCancelled) {
+ // tree walking already completed.
+ return;
+ }
+
+ while (queue.length) {
+ n = queue.shift();
+ n.counter = counter++;
+ console.debug("Under review", n.type);
+ if (n.children != undefined) {
+ // fetch all the children.
+ len = n.children.length;
+ for (i = 0; i < len; i++) {
+ if (n.children[i] != undefined &&
+ n.children[i].visited == undefined) {
+ // figure out siblings.
+ if (i > 0) {
+ n.children[i].previous = n.children[i-1];
+ }
+
+ if (i < len) {
+ n.children[i].next = n.children[i+1];
+ }
+ // set parent property.
+ n.children[i].parent = n;
+ n.children[i].visited = true;
+ queue.push(n.children[i]);
+ }
+ }
+ }
+
+ if (n.type != undefined) {
+ // fetch all properties that may have nodes.
+ for (var item in n) {
+ if (item != 'tokenizer' &&
+ item != 'children' &&
+ item != 'length' &&
+ n[item] != null &&
+ typeof n[item] === 'object' &&
+ n[item].type != undefined &&
+ n[item].visited == undefined) {
+ n[item].visited = true;
+ // set parent property
+ n[item].parent = n;
+ queue.push(n[item]);
+ }
+ }
+ }
+
+ that.checkNode(n);
+
+ if (that.freeToken.type === checkTypes.FREE ||
+ that.freeToken.type === checkTypes.FREE_SINGLE_ITEM) {
+ // nothing more to look for. We are done.
+ that.walkTreeComplete(that.freeToken);
+ return;
+ }
+ else if (that.nontrivialness.type === checkTypes.NONTRIVIAL) {
+ // nontrivial
+ // we are done.
+ that.walkTreeComplete(that.nontrivialness);
+ return;
+ }
+ // call processQueue again if needed.
+ end = Date.now();
+
+ if (queue.length) {
+ // there are more nodes in the queue.
+
+ if ((end - start) > 30) {
+
+ // been running more than 20ms, pause
+ // for 10 ms before calling processQueue
+ // again.
+ timer.setTimeout(processQueue, 8);
+ return;
+ }
+ } else {
+ // we are done.
+ that.removeNotification();
+ that.walkTreeComplete();
+ return;
+ }
+ }
+ };
+
+ if (node.type === token.SCRIPT) {
+ // this is the global scope.
+ node.global = true;
+ node.parent = null;
+
+ this.relationChecker.storeGlobalDeclarations(node);
+
+ queue.push(node);
+ processQueue();
+ }
+};
+
+/**
+ * set walk tree cancelled bool as true.
+ * the walk tree method won't run after the variable
+ * is set to true.
+ */
+JsChecker.prototype.cancelWalkTree = function() {
+ // prevent any further work on node codes.
+ this.walkTreeCancelled = true;
+};
+
+/**
+ * walkTreeComplete
+ *
+ * Trigger when the walkTree has been completed or
+ * when it has been cut short.
+ *
+ */
+JsChecker.prototype.walkTreeComplete = function(result) {
+ var that = this;
+ this.removeNotification();
+
+ if (this.walkTreeCancelled) {
+ // we already triggered complete.
+ return;
+ }
+
+ // we set the token to cancel further processing.
+ this.cancelWalkTree();
+
+ if (result != undefined) {
+ // walkTree was returned faster, use it instead.
+ this.getCheckerResult(result);
+
+ // we are done.
+ return;
+ }
+
+ // if all code was fully analyzed.
+ if (this.nontrivialness.type === checkTypes.NONTRIVIAL) {
+ this.getCheckerResult(this.nontrivialness);
+ } else if (this.freeToken.type === checkTypes.FREE) {
+ // this is free and may or may not define functions, we don't care.
+ this.getCheckerResult(this.freeToken);
+ } else if (this.nontrivialness.type ===
+ checkTypes.TRIVIAL_DEFINES_FUNCTION) {
+ // trivial scripts should become nontrivial if an external script.
+ // it may or may not be trivial if inline.
+ this.getCheckerResult(this.nontrivialness);
+ } else {
+ // found no nontrivial constructs or free license, so it's
+ // trivial.
+
+ this.getCheckerResult(
+ types.trivialFuncWithComment("This script is trivial"));
+ }
+};
+
+
+/**
+ * checkNode
+ *
+ * checks a single node.
+ *
+ */
+JsChecker.prototype.checkNode = function(n) {
+ var sub;
+ var fc = this.freeCheck(n);
+ var tc = this.trivialCheck(n);
+
+ var nodeResult;
+
+ // check if identifier may be window property (assumption).
+ this.relationChecker.checkIdentifierIsWindowProperty(n);
+
+ /*if (fc) {
+ console.debug("FC is", fc, "type is", fc.type);
+ }*/
+ if (fc && fc.type == checkTypes.FREE) {
+ // this is free!
+ // freeToken is persistent across nodes analyzed and valid
+ // for an entire script.
+ this.freeToken = types.freeWithComment(
+ "Script appears to be free under the following license: " +
+ fc.licenseName);
+ return;
+ }
+ else if (fc && fc.type == checkTypes.FREE_SINGLE_ITEM) {
+ console.debug("free single item");
+ this.freeToken = types.singleFreeWithComment(
+ "Script appears to be free under the following license: " +
+ fc.licenseName);
+ return;
+ }
+
+ if (tc) {
+ if (tc.type === checkTypes.NONTRIVIAL) {
+ // nontrivial_global is deprecated
+ this.nontrivialness = tc;
+ return;
+ }
+
+ else if (tc.type === checkTypes.TRIVIAL_DEFINES_FUNCTION) {
+ this.nontrivialness = tc;
+ return;
+ }
+ }
+};
+
+JsChecker.prototype.removeNotification = function() {
+ if (this.notification && this.notification.close) {
+ console.debug("removing", this.shortText);
+ // remove notification early on.
+ this.notification.close();
+ this.notification = null;
+ }
+};
+
+// create an instance of JsChecker
+exports.jsChecker = function() {
+ return new JsChecker();
+};
+
+exports.removeHashCallback = removeHashCallback;
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/license_definitions.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/license_definitions.js
new file mode 100644
index 0000000..36711fd
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/license_definitions.js
@@ -0,0 +1,196 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+exports.types = {
+ SHORT: 'short',
+ LAZY: 'lazy',
+ FULL: 'full'
+};
+
+var type = exports.types;
+
+/**
+ * List of all the licenses.
+ * Currently only short substrings are used with regex.
+ */
+exports.licenses = {
+ CC0: {
+ licenseName: 'Creative Commons CC0 1.0 Universal',
+ canonicalUrl: ['http://creativecommons.org/publicdomain/zero/1.0/legalcode',
+ 'magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt'],
+ identifier: 'CC0-1.0',
+ licenseFragments: []
+ },
+
+
+ gplv2: {
+ licenseName: 'GNU General Public License (GPL) version 2',
+ canonicalUrl: ['http://www.gnu.org/licenses/gpl-2.0.html',
+ 'magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt'],
+ identifier: 'GNU-GPL-2.0',
+ licenseFragments: [{text: "<THISPROGRAM> is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.", type: type.SHORT},
+ {text:"Alternatively, the contents of this file may be used under the terms of either the GNU General Public License Version 2 or later (the \"GPL\"), or the GNU Lesser General Public License Version 2.1 or later (the \"LGPL\"), in which case the provisions of the GPL or the LGPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of either the GPL or the LGPL, and not to allow others to use your version of this file under the terms of the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL or the LGPL. If you do not delete the provisions above, a recipient may use your version of this file under the terms of any one of the MPL, the GPL or the LGPL.", type: type.SHORT}]
+ },
+
+ gplv3: {
+ licenseName: 'GNU General Public License (GPL) version 3',
+ canonicalUrl: ['http://www.gnu.org/licenses/gpl-3.0.html',
+ 'magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt'],
+ identifier: 'GNU-GPL-3.0',
+ licenseFragments: [
+ {text: "The JavaScript code in this page is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License (GNU GPL) as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The code is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. As additional permission under GNU GPL version 3 section 7, you may distribute non-source (e.g., minimized or compacted) forms of that code without the copy of the GNU GPL normally required by section 4, provided you include this license notice and a URL through which recipients can access the Corresponding Source.", type: type.SHORT},
+ {text: "<THISPROGRAM> is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.", type: type.SHORT}]
+ },
+
+ gnuAllPermissive: {
+ licenseName: 'GNU All-Permissive License',
+ licenseFragments: [{text: "Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without any warranty.", type: type.SHORT}]
+ },
+
+ apache_2License: {
+ licenseName: 'Apache License, Version 2.0',
+ canonicalUrl: ['http://www.apache.org/licenses/LICENSE-2.0',
+ 'magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7&dn=apache-2.0.txt'],
+ identifier: 'Apache-2.0',
+ licenseFragments: [{text: "Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0", type: type.SHORT}]
+ },
+
+ lgpl21: {
+ licenseName: 'GNU Lesser General Public License, version 2.1',
+ canonicalUrl: ['http://www.gnu.org/licenses/lgpl-2.1.html',
+ 'magnet:?xt=urn:btih:5de60da917303dbfad4f93fb1b985ced5a89eac2&dn=lgpl-2.1.txt'],
+ identifier: 'GNU-LGPL-2.1',
+ licenseFragments: [{text: "<THISLIBRARY> is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.", type: type.SHORT}]
+ },
+
+ lgplv3: {
+ licenseName: 'GNU Lesser General Public License, version 3',
+ canonicalUrl: ['http://www.gnu.org/licenses/lgpl-3.0.html',
+ 'magnet:?xt=urn:btih:0ef1b8170b3b615170ff270def6427c317705f85&dn=lgpl-3.0.txt'],
+ identifier: 'GNU-LGPL-3.0',
+ licenseFragments: [{text: "<THISPROGRAM> is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.", type: type.SHORT}]
+ },
+
+ agplv3: {
+ licenseName: 'GNU AFFERO GENERAL PUBLIC LICENSE version 3',
+ canonicalUrl: ['http://www.gnu.org/licenses/agpl-3.0.html',
+ 'magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt'],
+ identifier: 'GNU-AGPL-3.0',
+ licenseFragments: [{text: "<THISPROGRAM> is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.", type: type.SHORT}]
+ },
+
+ boostSoftware: {
+ licenseName: 'Boost Software License',
+ canonicalUrl: ["magnet:?xt=urn:btih:89a97c535628232f2f3888c2b7b8ffd4c078cec0&dn=Boost-1.0.txt"],
+ licenseFragments: [{text: "Boost Software License <VERSION> <DATE> Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the \"Software\") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following", type: type.SHORT}]
+ },
+
+ bsd3: {
+ licenseName: "The BSD 3-Clause License",
+ canonicalUrl: ["magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt"],
+ licenseFragments: [{text: "Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.", type: type.SHORT}]
+ },
+
+ bsd2: {
+ licenseName: "The BSD 2-Clause License",
+ licenseFragments: [{text: "Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.", type: type.SHORT}]
+ },
+
+ mozillaPublicLicense_2_0: {
+ licenseName: 'Mozilla Public License Version 2.0',
+ identifier: 'MPL-2.0',
+ canonicalUrl: ['http://www.mozilla.org/MPL/2.0',
+ 'magnet:?xt=urn:btih:3877d6d54b3accd4bc32f8a48bf32ebc0901502a&dn=mpl-2.0.txt'],
+ licenseFragments: [{text: "This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.", type: type.SHORT }]
+ },
+
+ expat: {
+ licenseName: 'Expat License (sometimes called MIT Licensed)',
+ identifier: 'Expat',
+ canonicalUrl: ['http://www.jclark.com/xml/copying.txt',
+ 'magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt'],
+ licenseFragments: [{text: "Copyright <YEAR> <NAME> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", type: type.SHORT}]
+ },
+
+ X11: {
+ licenseName: 'X11 License',
+ canonicalUrl: ['magnet:?xt=urn:btih:5305d91886084f776adcf57509a648432709a7c7&dn=x11.txt'],
+ licenseFragments: [{text: "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", type: type.SHORT}]
+ },
+
+ XFree86: {
+ licenseName: "XFree86 License",
+ identifier: 'Modified-BSD',
+ canonicalUrl: ['http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3', 'http://www.xfree86.org/current/LICENSE4.html', 'magnet:?xt=urn:btih:12f2ec9e8de2a3b0002a33d518d6010cc8ab2ae9&dn=xfree86.txt'],
+ licenseFragments: [{text: "All rights reserved.\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer.\n2. 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, and in the same place and form as other copyright, license and disclaimer information.\n3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: \"This product includes software developed by The XFree86 Project, Inc (http://www.xfree86.org/) and its contributors\", in the same place and form as other third-party acknowledgments. Alternately, this acknowledgment may appear in the software itself, in the same form and location as other such third-party acknowledgments.4. Except as contained in this notice, the name of The XFree86 Project, Inc shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The XFree86 Project, Inc.", type: type.SHORT}
+ ]
+ },
+
+ FreeBSD: {
+ licenseName: "FreeBSD License",
+ canonicalUrl: ['http://www.freebsd.org/copyright/freebsd-license.html',
+ 'magnet:?xt=urn:btih:87f119ba0b429ba17a44b4bffcab33165ebdacc0&dn=freebsd.txt'],
+ licenseFragments: [{text: "Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\nRedistributions 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.", type: type.SHORT}]
+ },
+
+ ISC: {
+ licenseName: "The ISC License",
+ canonicalUrl: ['https://www.isc.org/downloads/software-support-policy/isc-license/',
+ 'magnet:?xt=urn:btih:b8999bbaf509c08d127678643c515b9ab0836bae&dn=ISC.txt'],
+ licenseFragments: [{text: "Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.", type: type.SHORT},
+ {text: "Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.", type: type.SHORT}]
+ },
+
+ jQueryTools: {
+ licenseName: "jQuery Tools",
+ licenseFragments: [{text: 'NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.', type: type.SHORT}]
+ },
+
+ ArtisticLicense2: {
+ licenseName: "Artistic License 2.0",
+ canonicalUrl: ["http://www.perlfoundation.org/artistic_license_2_0",
+ "magnet:?xt=urn:btih:54fd2283f9dbdf29466d2df1a98bf8f65cafe314&dn=artistic-2.0.txt"],
+ licenseFragments: []
+ },
+
+ PublicDomain: {
+ licenseName: "Public Domain",
+ canonicalUrl: ['magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt'],
+ licenseFragments: []
+ },
+
+ CPALv1: {
+ licenseName: 'Common Public Attribution License Version 1.0 (CPAL)',
+ canonicalUrl: [
+ 'http://opensource.org/licenses/cpal_1.0',
+ 'magnet:?xt=urn:btih:84143bc45939fc8fa42921d619a95462c2031c5c&dn=cpal-1.0.txt'
+ ],
+ identifier: 'CPAL-1.0',
+ licenseFragments: [
+ {
+ text: 'The contents of this file are subject to the Common Public Attribution License Version 1.0',
+ type: type.SHORT
+ },
+ {
+ text: 'The term "External Deployment" means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2.',
+ type: type.SHORT
+ }
+ ]
+ }
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/nontrivial_checker.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/nontrivial_checker.js
new file mode 100644
index 0000000..0f7332a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/nontrivial_checker.js
@@ -0,0 +1,389 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+const types = require("js_checker/constant_types");
+
+// constants from Narcissus for function types.
+const DECLARED_FORM = 0, EXPRESSED_FORM = 1, STATEMENT_FORM = 2;
+
+const token = types.token;
+
+var checkTypes = types.checkTypes;
+
+var utils = {
+
+ /**
+ * nodeContains
+ * Checks that node contains both a type and a value.
+ * Shortcut to check for null/undefined.
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if matching.
+ */
+ nodeContains: function (n, type, value) {
+ if (n != undefined) {
+ return n.type === type &&
+ n.value === value;
+ }
+ },
+
+
+ /**
+ * isType
+ * Checks that node is of a certain type.
+ * Shortcut to check for null/undefined.
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean}. True if it's the right type.
+ */
+ isType: function (n, type) {
+ return n != undefined && n.type === type;
+ },
+
+ isNotType: function (n, type) {
+ return n != undefined && n.type !== type;
+ },
+
+
+ /**
+ * hasChildren
+ *
+ * Checks the token on the left
+ * and on the right.
+ *
+ * @param {object} n. The current node being studied.
+ * @param {leftType} token constant. The type on the
+ * left.
+ * @param {rightType} token constant. The type of child
+ * on the right
+ *
+ */
+ hasChildren: function (n, leftType, rightType) {
+ if (types == undefined) {
+ return false;
+ }
+ return this.isType(n.children[0], leftType) &&
+ this.isType(n.children[1], rightType);
+ },
+
+
+ /**
+ * findScriptTag
+ *
+ * This method should probably be replaced with DOM testing
+ * as regex is rather insufficiant, and this wouldn't cover
+ * tricky constructs as shown in http://ha.ckers.org/xss.html.
+ */
+ findScriptTag: function (n) {
+ return n.value != undefined &&
+ /<script[^>]*?>/i.test(n.value);
+ }
+
+};
+
+var nonTrivialChecker = {
+
+ definesFunction: false,
+ hash: null,
+ /**
+ * definesFunctionFound
+ *
+ * Returns true if it finds a node of type FUNCTION
+ * that isn't a callback or an IIFE.
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if found.
+ */
+ definesFunctionFound: function (n) {
+ var isFunction = false;
+ if (n.type === token.FUNCTION &&
+ n.body != undefined) {
+
+ if (n.functionForm !== token.DECLARED_FORM &&
+ ((n.parent.type === token.LIST &&
+ n.parent.parent.type === token.CALL) ||
+ n.parent.type === token.CALL) &&
+ n.name == undefined) {
+ // this is a callback or an immediately
+ // invoked function expression "IIFE".
+ isFunction = false;
+ } else {
+ // this is a regular function declaration or
+ // function expression assigned to a variable.
+ //console.log("THIS DEFINES FUNCTION");
+ isFunction = true;
+ }
+
+ }
+
+ // look for Function constructor.
+ if (n.type === token.IDENTIFIER &&
+ n.value === 'Function' &&
+ (n.parent.type === token.NEW_WITH_ARGS ||
+ n.parent.type === token.CALL)) {
+ // this is a Function constructor.
+ //console.log("THIS DEFINES FUNCTION");
+ isFunction = true;
+ }
+
+ return isFunction;
+ },
+
+
+ /**
+ * invokesEval
+ *
+ * Returns true (nontrivial) if it finds any use of
+ * the eval function. For simplicity, we assume any
+ * use of an identifier "eval" is the eval function.
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if found.
+ */
+ invokesEval: function (n) {
+ return (n.type === token.CALL &&
+ utils.nodeContains(n.children[0], token.IDENTIFIER, 'eval') ||
+ n.type === token.IDENTIFIER && n.value === 'eval');
+ },
+
+ /**
+ * evalIdentifier
+ *
+ * Returns true (nontrivial) if it finds any use of
+ * the eval function. For simplicity, we assume any
+ * use of an identifier "eval" is the eval function.
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if found.
+ */
+ evalIdentifier: function (n) {
+ return n.type === token.IDENTIFIER &&
+ n.value === 'eval';
+ },
+
+
+ /**
+ * invokesMethodBracketSuffix
+ *
+ * Finds a method being invoked using the bracket suffix notation
+ * rather than the dot notation. It is difficult without keeping track of
+ * variable values to check for what method is actually being called.
+ * So we're just flagging any use of this construct as nontrivial.
+ * e.g., should catch: xhr[a+b]('GET', 'http://www.example.com');
+ * Should not catch other uses such as: myArray[num];
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if found.
+ */
+ invokesMethodBracketSuffix: function (n) {
+ return n.type === token.CALL && utils.isType(n.children[0], token.INDEX);
+ },
+
+
+ /**
+ * createsXhrObject
+ *
+ * Creates an xhr object.
+ * Since all "new XMLHttpRequest", "XMLHttpRequest()",
+ * and "new window.XMLHttpRequest" instantiate the xhr object,
+ * we assume (without further proof) that any use
+ * of the identifier "XMLHttpRequest" and "ActiveXObject"
+ * is an xhr object.
+ * Constructs like window[a+b]() are already caught by the
+ * bracket suffix check.
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if found.
+ */
+ createsXhrObject: function (n) {
+ return (n.type === token.IDENTIFIER) &&
+ (n.value === 'XMLHttpRequest' ||
+ n.value === 'ActiveXObject');
+ },
+
+
+ /**
+ * invokesXhrOpen
+ *
+ * Here we assume the call of an open method must be an xhr request
+ * (and not some other object) by checking the number of arguments.
+ * In most cases this method won't be used since createsXhrObject
+ * will already have caught the xhr.
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if found.
+ *
+ */
+ invokesXhrOpen: function (n) {
+ return n.type === token.CALL &&
+ utils.hasChildren(n, token.DOT, token.LIST) &&
+ utils.isType(n.children[0].children[0], token.IDENTIFIER) &&
+ utils.nodeContains(n.children[0].children[1], token.IDENTIFIER, 'open') &&
+ n.children[1].children.length > 1;
+ },
+
+
+ /**
+ * createsScriptElement
+ *
+ * Checks for document.createElement() that create a script. In the case
+ * it creates an element from a variable, we assume it's a script. In the
+ * future we might want to check for the value of that string variable
+ * (e.g., if a variable is assigned 'script', raise a flag)
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if found.
+ *
+ *
+ */
+ createsScriptElement: function (n) {
+ return n.type === token.CALL &&
+ utils.hasChildren(n, token.DOT, token.LIST) &&
+ utils.isType(n.children[0].children[0], token.IDENTIFIER) &&
+ utils.nodeContains(n.children[0].children[1], token.IDENTIFIER, 'createElement') &&
+ (utils.nodeContains(n.children[1].children[0], token.STRING, 'script') ||
+ utils.isType(n.children[1].children[0], token.IDENTIFIER));
+ },
+
+
+ /**
+ * writesScriptAsHtmlString
+ *
+ * catches myObj.write('<script></script>');
+ * or any myObj.write(myStringVariable);
+ * or concatenation such as:
+ * myObj.write('<scri' + stringVariable);
+ * or 'something' + 'somethingelse'.
+ *
+ * To check for javascript here we might want to look at the list
+ * from ha.ckers.org/xss.html for the future.
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if found.
+ *
+ */
+ writesScriptAsHtmlString: function (n) {
+ var listArg;
+
+ if (n.type === token.CALL &&
+ utils.hasChildren(n, token.DOT, token.LIST) &&
+ utils.isType(n.children[0].children[0], token.IDENTIFIER) &&
+ utils.nodeContains(n.children[0].children[1], token.IDENTIFIER, 'write')) {
+
+ if (utils.isNotType(n.children[1].children[0], token.STRING)) {
+ // return true if any operation or concatenation.
+ // We are cautious (as it could
+ // embed a script) and flag this as nontrivial.
+
+ return true;
+ }
+ return utils.findScriptTag(n.children[1].children[0]);
+ } else {
+ return false;
+ }
+ },
+
+ /**
+ * nontrivial anytime we see an identifier as innerHTML
+ */
+ innerHTMLIdentifier: function (n) {
+ if ((n.type === token.IDENTIFIER ||
+ n.type === token.STRING) &&
+ n.value === 'innerHTML') {
+ return true;
+ }
+ },
+
+
+ /**
+ * checkNontrivial
+ *
+ * Contains all the conditionals that try to identify,
+ * step by step, all code that could be flagged as
+ * nontrivial.
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if found.
+ *
+ */
+ checkNontrivial: function (n, t) {
+
+ if (n.type === token.IDENTIFIER && this.evalIdentifier(n)) {
+ //console.log("NONTRIVIAL: eval has been found in code");
+ return types.nontrivialWithComment("NONTRIVIAL: eval has been found in code");
+ }
+
+ if (this.innerHTMLIdentifier(n)) {
+ //console.log("NONTRIVIAL: innerHTML identifier");
+ return types.nontrivialWithComment("NONTRIVIAL: innerHTML identifier");
+ }
+
+ // the node is an identifier
+ if (n.type === token.IDENTIFIER && this.createsXhrObject(n)) {
+ //console.log('NONTRIVIAL: Creates an xhr object');
+ return types.nontrivialWithComment('NONTRIVIAL: Creates an xhr object');
+ }
+
+ // this is a method/function call
+ if (n.type === token.CALL) {
+
+ if (this.invokesEval(n)) {
+ //console.log("NONTRIVIAL: eval has been found in code");
+ return types.nontrivialWithComment("NONTRIVIAL: eval has been found in code");
+ }
+
+ if (this.invokesMethodBracketSuffix(n)) {
+ //console.log('NONTRIVIAL: square bracket suffix method call detected');
+ return types.nontrivialWithComment("NONTRIVIAL: eval has been found in code");
+ }
+
+ if (this.invokesXhrOpen(n)) {
+ //console.log('NONTRIVIAL: an open method similar to xhr.open is used');
+ return types.nontrivialWithComment('NONTRIVIAL: square bracket suffix method call detected');
+ }
+
+ if (this.createsScriptElement(n)) {
+ //console.log('NONTRIVIAL: creates script element dynamically.');
+ return types.nontrivialWithComment('NONTRIVIAL: an open method similar to xhr.open is used');
+ }
+
+ if (this.writesScriptAsHtmlString(n)) {
+ //console.log('NONTRIVIAL: writes script as html dynamically.');
+ return types.nontrivialWithComment('NONTRIVIAL: creates script element dynamically.');
+ }
+ }
+
+ // The node is a function definition.
+ // Most common occurence.
+ if (this.definesFunctionFound(n)) {
+ return types.trivialFuncWithComment("Script is trivial but defines one or more functions");
+ }
+
+ // found nothing else, so trivial.
+ return types.trivialWithComment("Script is trivial");
+
+ }
+};
+
+exports.nonTrivialChecker = function () {
+
+ var checker = Object.create(nonTrivialChecker);
+
+ return checker;
+}; \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/pattern_utils.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/pattern_utils.js
new file mode 100644
index 0000000..10874fc
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/pattern_utils.js
@@ -0,0 +1,40 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+exports.patternUtils = {
+ /**
+ * removeNonalpha
+ *
+ * Remove all nonalphanumeric values, except for
+ * < and >, since they are what we use for tokens.
+ *
+ */
+ removeNonalpha: function (str) {
+ var regex = /[^a-z0-9<>@]+/gi;
+ return str.replace(regex, '');
+ },
+ removeWhitespace: function (str) {
+ return str.replace(/[ \t\r\n]+/gmi,"");
+ },
+ replaceTokens: function (str) {
+ var regex = /<.*?>/gi;
+ return str.replace(regex, '.*?');
+ }
+}; \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/privacy_checker.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/privacy_checker.js
new file mode 100644
index 0000000..b5dad1b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/privacy_checker.js
@@ -0,0 +1,48 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var privacyThreatJs = require('js_checker/privacy_threat_definitions.js');
+var patternUtils = require('js_checker/pattern_utils').patternUtils;
+
+exports.privacyCheck = {
+
+ checkScriptPrivacyThreat: function (currentScript) {
+ var list = privacyThreatJs.js,
+ i,
+ jsRegexp,
+ match,
+ max,
+ check;
+
+ currentScript = patternUtils.removeWhitespace(currentScript);
+
+ for (var item in list) {
+ max = list[item].length;
+
+ for (i = 0; i < max; i++) {
+ if (list[item][i].test(currentScript)) {
+ return true;
+ }
+ }
+
+ }
+ }
+
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/privacy_threat_definitions.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/privacy_threat_definitions.js
new file mode 100644
index 0000000..ea6d279
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/privacy_threat_definitions.js
@@ -0,0 +1,40 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+exports.js = {
+ /**
+ * googleAnalytics
+ * Tracking code for Google Analytics.
+ * It corresponds to:
+ * var _gaq = _gaq || [];
+ * _gaq.push(['_setAccount', 'UA-XXXXXXX-X']);
+ * _gaq.push(['_trackPageview']);
+ *
+ * (function() {
+ * var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ * ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ * var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ * })();
+ *
+ */
+ googleAnalytics: [/var_gaq=_gaq\|\|\[\];_gaq\.push\(\['_setAccount','UA[0-9\-]*?'\]\);(_gaq.push\(\['_setDomainName','[a-z\.]*?'\]\);)?_gaq\.push\(\['_trackPageview'\]\);\(function\(\){varga=document\.createElement\('script'\);ga\.type='text\/javascript\';ga\.async=true;ga\.src=\(\'https:\'==document\.location\.protocol\?'https:\/\/ssl':'http:\/\/www'\)\+'\.google\-analytics\.com\/ga\.js';vars=document\.getElementsByTagName\('script'\)\[0\];s\.parentNode\.insertBefore\(ga,s\);}\)\(\);/ig,
+ /vargaJsHost\=\(\(\"https\:\"\=\=document\.location\.protocol\)\?\"https\:\/\/ssl\.\"\:\"http\:\/\/www\.\"\)\;document\.write\(unescape\(\"\%3Cscriptsrc\=\'\"\+gaJsHost\+\"google\-analytics\.com\/ga\.js\'type\=\'text\/javascript\'\%3E\%3C\/script\%3E\"\)\)\;/ig,
+ /try{varpageTracker\=\_gat\.\_getTracker\(\"UA[0-9\-]*?\"\)\;pageTracker\.\_trackPageview\(\)\;}catch\(err\){}/ig]
+}; \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/relation_checker.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/relation_checker.js
new file mode 100644
index 0000000..1904812
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/relation_checker.js
@@ -0,0 +1,289 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+/**
+ * relation_checker.js
+ *
+ * Finds out if two scripts are related to each other.
+ *
+ */
+const types = require("js_checker/constant_types");
+
+const token = types.token;
+
+// all predefined window properties (methods and variables).
+const windowPropertiesHash = {
+ "addEventListener": 1, "alert": 1, "applicationCache": 1,
+ "Array": 1, "ArrayBuffer": 1, "atob": 1, "back": 1, "blur": 1,
+ "Boolean": 1, "btoa": 1, "captureEvents": 1, "CharacterData": 1,
+ "clearInterval": 1, "clearTimeout": 1, "close": 1, "closed": 1,
+ "Components": 1, "confirm": 1, "console": 1, "constructor": 1,
+ "content": 1, "controllers": 1, "crypto": 1,
+ "CSSStyleDeclaration": 1, "Date": 1, "decodeURI": 1,
+ "decodeURIComponent": 1, "defaultStatus": 1,
+ "disableExternalCapture": 1, "dispatchEvent": 1, "Document": 1,
+ "document": 1, "DocumentType": 1, "dump": 1, "Element": 1,
+ "enableExternalCapture": 1, "encodeURI": 1, "encodeURIComponent": 1,
+ "Error": 1, "escape": 1, "eval": 1, "EvalError": 1, "Event": 1,
+ "find": 1, "Float32Array": 1, "Float64Array": 1, "focus": 1,
+ "forward": 1, "frameElement": 1, "frames": 1, "fullScreen": 1,
+ "Function": 1, "Generator": 1, "getComputedStyle": 1,
+ "getInterface": 1, "getSelection": 1, "globalStorage": 1,
+ "history": 1, "home": 1, "HTMLBodyElement": 1, "HTMLCollection": 1,
+ "HTMLDivElement": 1, "HTMLDocument": 1, "HTMLElement": 1,
+ "HTMLHeadElement": 1, "HTMLHeadingElement": 1, "HTMLHtmlElement": 1,
+ "HTMLStyleElement": 1, "HTMLUnknownElement": 1, "Infinity": 1,
+ "innerHeight": 1, "innerWidth": 1, "InstallTrigger": 1,
+ "Int16Array": 1, "Int32Array": 1, "Int8Array": 1, "InternalError": 1,
+ "isFinite": 1, "isNaN": 1, "isXMLName": 1, "Iterator": 1,
+ "JSON": 1, "length": 1, "localStorage": 1, "Location": 1,
+ "location": 1, "locationbar": 1, "matchMedia": 1, "Math": 1,
+ "menubar": 1, "moveBy": 1, "moveTo": 1, "mozAnimationStartTime": 1,
+ "mozIndexedDB": 1, "mozInnerScreenX": 1, "mozInnerScreenY": 1,
+ "mozPaintCount": 1, "mozRequestAnimationFrame": 1, "name": 1,
+ "Namespace": 1, "NaN": 1, "navigator": 1, "netscape": 1,
+ "Node": 1, "NodeList": 1, "Number": 1, "Object": 1, "open": 1,
+ "openDialog": 1, "opener": 1, "outerHeight": 1, "outerWidth": 1,
+ "pageXOffset": 1, "pageYOffset": 1, "parent": 1, "parseFloat": 1,
+ "parseInt": 1, "performance": 1, "personalbar": 1, "pkcs11": 1,
+ "postMessage": 1, "print": 1, "prompt": 1, "QName": 1,
+ "RangeError": 1, "ReferenceError": 1, "RegExp": 1,
+ "releaseEvents": 1, "removeEventListener": 1, "resizeBy": 1,
+ "resizeTo": 1, "routeEvent": 1, "screen": 1, "screenX": 1,
+ "screenY": 1, "scroll": 1, "scrollbars": 1, "scrollBy": 1,
+ "scrollByLines": 1, "scrollByPages": 1, "scrollMaxX": 1,
+ "scrollMaxY": 1, "scrollTo": 1, "scrollX": 1, "scrollY": 1,
+ "self": 1, "sessionStorage": 1, "setInterval": 1, "setResizable": 1,
+ "setTimeout": 1, "showModalDialog": 1, "sizeToContent": 1,
+ "status": 1, "statusbar": 1, "stop": 1, "StopIteration": 1,
+ "StorageList": 1, "String": 1, "SyntaxError": 1, "Text": 1,
+ "toolbar": 1, "top": 1, "TypeError": 1, "Uint16Array": 1,
+ "Uint32Array": 1, "Uint8Array": 1, "Uint8ClampedArray": 1,
+ "undefined": 1, "unescape": 1, "uneval": 1, "updateCommands": 1,
+ "URIError": 1, "URL": 1, "WeakMap": 1, "Window": 1, "window": 1,
+ "XML": 1, "XMLList": 1, "XPCNativeWrapper": 1};
+
+// all predefined document properties.
+const documentPropertiesHash = {'activeElement': 1, 'addBinding': 1,
+ 'addEventListener': 1, 'adoptNode': 1, 'alinkColor': 1, 'anchors': 1,
+ 'appendChild': 1, 'applets': 1, 'ATTRIBUTE_NODE': 1, 'attributes': 1,
+ 'baseURI': 1, 'bgColor': 1, 'body': 1, 'captureEvents': 1,
+ 'CDATA_SECTION_NODE': 1, 'characterSet': 1, 'childNodes': 1, 'clear':
+ 1, 'cloneNode': 1, 'close': 1, 'COMMENT_NODE': 1,
+ 'compareDocumentPosition': 1, 'compatMode': 1, 'contentType': 1,
+ 'cookie': 1, 'createAttribute': 1, 'createAttributeNS': 1,
+ 'createCDATASection': 1, 'createComment': 1, 'createDocumentFragment':
+ 1, 'createElement': 1, 'createElementNS': 1, 'createEvent': 1,
+ 'createExpression': 1, 'createNodeIterator': 1, 'createNSResolver': 1,
+ 'createProcessingInstruction': 1, 'createRange': 1, 'createTextNode':
+ 1, 'createTreeWalker': 1, 'currentScript': 1, 'defaultView': 1,
+ 'designMode': 1, 'dir': 1, 'dispatchEvent': 1, 'doctype': 1,
+ 'DOCUMENT_FRAGMENT_NODE': 1, 'DOCUMENT_NODE': 1,
+ 'DOCUMENT_POSITION_CONTAINED_BY': 1, 'DOCUMENT_POSITION_CONTAINS': 1,
+ 'DOCUMENT_POSITION_DISCONNECTED': 1, 'DOCUMENT_POSITION_FOLLOWING': 1,
+ 'DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC': 1,
+ 'DOCUMENT_POSITION_PRECEDING': 1, 'DOCUMENT_TYPE_NODE': 1,
+ 'documentElement': 1, 'documentURI': 1, 'domain': 1, 'ELEMENT_NODE':
+ 1, 'elementFromPoint': 1, 'embeds': 1, 'enableStyleSheetsForSet': 1,
+ 'ENTITY_NODE': 1, 'ENTITY_REFERENCE_NODE': 1, 'evaluate': 1,
+ 'execCommand': 1, 'execCommandShowHelp': 1, 'fgColor': 1,
+ 'firstChild': 1, 'forms': 1, 'getAnonymousElementByAttribute': 1,
+ 'getAnonymousNodes': 1, 'getBindingParent': 1, 'getElementById': 1,
+ 'getElementsByClassName': 1, 'getElementsByName': 1,
+ 'getElementsByTagName': 1, 'getElementsByTagNameNS': 1,
+ 'getSelection': 1, 'getUserData': 1, 'hasAttributes': 1,
+ 'hasChildNodes': 1, 'hasFocus': 1, 'head': 1, 'images': 1,
+ 'implementation': 1, 'importNode': 1, 'inputEncoding': 1,
+ 'insertBefore': 1, 'isDefaultNamespace': 1, 'isEqualNode': 1,
+ 'isSameNode': 1, 'isSupported': 1, 'lastChild': 1, 'lastModified': 1,
+ 'lastStyleSheetSet': 1, 'linkColor': 1, 'links': 1,
+ 'loadBindingDocument': 1, 'localName': 1, 'location': 1,
+ 'lookupNamespaceURI': 1, 'lookupPrefix': 1, 'mozSetImageElement': 1,
+ 'mozSyntheticDocument': 1, 'namespaceURI': 1, 'nextSibling': 1,
+ 'nodeName': 1, 'nodeType': 1, 'nodeValue': 1, 'normalize': 1,
+ 'NOTATION_NODE': 1, 'open': 1, 'ownerDocument': 1, 'parentNode': 1,
+ 'plugins': 1, 'preferredStyleSheetSet': 1, 'prefix': 1,
+ 'previousSibling': 1, 'PROCESSING_INSTRUCTION_NODE': 1,
+ 'queryCommandEnabled': 1, 'queryCommandIndeterm': 1,
+ 'queryCommandState': 1, 'queryCommandSupported': 1,
+ 'queryCommandText': 1, 'queryCommandValue': 1, 'querySelector': 1,
+ 'querySelectorAll': 1, 'readyState': 1, 'referrer': 1,
+ 'releaseCapture': 1, 'releaseEvents': 1, 'removeBinding': 1,
+ 'removeChild': 1, 'removeEventListener': 1, 'replaceChild': 1,
+ 'routeEvent': 1, 'selectedStyleSheetSet': 1, 'setUserData': 1,
+ 'styleSheets': 1, 'styleSheetSets': 1, 'TEXT_NODE': 1, 'textContent':
+ 1, 'title': 1, 'URL': 1, 'vlinkColor': 1, 'write': 1, 'writeln': 1,
+ 'xmlEncoding': 1, 'xmlStandalone': 1, 'xmlVersion': 1};
+
+var relationChecker = {
+
+ // identifies scripts across modules.
+ scriptId: null,
+
+ // stores all left-side identifier in 'assign' types.
+ assignments: null,
+
+ // stores var declarations in global scope.
+ variableDeclarations: null,
+
+ // stores top declarations in global scope.
+ functionDeclarations: null,
+
+ nonWindowProperties: null,
+
+ init: function (scriptId) {
+ this.scriptId = scriptId;
+ this.assignments = [];
+ this.variableDeclarations = {};
+ this.functionDeclarations = {};
+ this.nonWindowProperties = {};
+ },
+
+ isWindowProperty: function (identifier) {
+ return (identifier in windowPropertiesHash) ? true : false;
+ },
+
+ isDocumentProperty: function (identifier) {
+ return (identifier in documentPropertiesHash) ? true : false;
+ },
+
+ storeNodeVars: function (n) {
+ if (n.varDecls != undefined) {
+ var i = 0, le = n.varDecls.length;
+ for (; i < le; i++) {
+ this.variableDeclarations[n.varDecls[i].value] = 1;
+ }
+ }
+ },
+
+ storeNodeFunctions: function (n) {
+ if (n.funDecls != undefined) {
+ var i = 0, le = n.funDecls.length;
+ for (; i < le; i++) {
+ this.functionDeclarations[n.funDecls[i].name] = 1;
+ }
+ }
+ },
+ storeGlobalDeclarations: function (topNode) {
+ this.storeNodeVars(topNode);
+ this.storeNodeFunctions(topNode);
+ },
+ storeNodeGlobalDeclarations: function (n) {
+ if (n.global === true) {
+ this.storeNodeVars(n);
+ this.storeNodeFunctions(n);
+ }
+ },
+
+ storeNodeAssignments: function (n) {
+ if (n.type === token.ASSIGN &&
+ n.children != undefined &&
+ n.children[0].type === token.IDENTIFIER) {
+ this.assignments.push(n.children[0].value);
+ }
+ },
+
+ // checks the parent script is in global scope.
+ isInGlobalScope: function (n) {
+ var currentNode = n;
+
+ while (currentNode != undefined) {
+ if (currentNode.type === token.SCRIPT &&
+ currentNode.global === true) {
+ return true;
+ } else if (currentNode.type === token.SCRIPT) {
+ return false;
+ }
+ currentNode = currentNode.parent;
+ }
+ },
+
+ // looks for an identifier being declared as either a
+ // variable or a function within the scope. Currently,
+ // we don't care about assignments.
+ lookForIdentifierInAllScopes: function (n, val) {
+
+ var currentNode = n, i, le, vars, funcs;
+ while (currentNode != undefined) {
+ if (currentNode.varDecls != undefined) {
+ vars = currentNode.varDecls;
+ le = vars.length;
+ for (i = 0; i < le; i++) {
+ if (vars[i].value === val) {
+ console.debug('FOUND declaration for', val);
+ return true;
+ }
+ }
+ }
+ if (currentNode.funDecls != undefined) {
+ funcs = currentNode.funDecls;
+ le = funcs.length;
+ for (i = 0; i < le; i++) {
+ if (funcs[i].name === val) {
+ console.debug('FOUND function declaration for', val);
+ return true;
+ }
+ }
+ }
+ currentNode = currentNode.parent;
+ }
+ console.debug('did not find declaration or assignment for', val);
+ },
+
+ // Heuristic method for window properties.
+ // this doesn't prove they are window properties, but
+ // it allows to make a good guess. These variables could have
+ // been assigned to something else...
+ checkIdentifierIsWindowProperty: function (n) {
+
+ if (n.type === token.IDENTIFIER &&
+ (n.parent.type === token.CALL ||
+ (n.parent.type === token.DOT &&
+ n.previous != undefined &&
+ (n.previous.type === token.THIS ||
+ (n.previous.type === token.IDENTIFIER &&
+ n.previous.value === 'window')))) &&
+ n.value in windowPropertiesHash) {
+
+ this.lookForIdentifierInAllScopes(n, n.value);
+
+ }
+
+ else if (n.type === token.IDENTIFIER &&
+ n.parent != undefined &&
+ n.parent.type === token.DOT &&
+ n.previous != undefined &&
+ n.previous.type === token.THIS &&
+ this.isInGlobalScope(n)) {
+ console.debug(n.type, 'use of this in the global scope, seems ok.', n.value);
+ }
+ else if (n.type === token.IDENTIFIER) {
+ // not found.
+ console.debug(n.type, 'probably not a window prop', n.value);
+ this.nonWindowProperties[n.value] = 1;
+ }
+ }
+
+};
+
+exports.relationChecker = function (scriptId) {
+ var obj = Object.create(relationChecker);
+ obj.init(scriptId);
+ return obj;
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/main.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/main.js
new file mode 100644
index 0000000..3038eae
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/main.js
@@ -0,0 +1,212 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+// Uncomment the following to start debugging, or do it from about:config.
+// var name = "extensions.jid1-KtlZuoiikVfFew@jetpack.sdk.console.logLevel";
+// require("sdk/preferences/service").set(name, "all");
+
+const jsAnalyzer = require("js_checker/js_checker");
+
+var { ToggleButton } = require('sdk/ui/button/toggle');
+const panel = require("sdk/panel");
+
+const pageWorker = require("sdk/page-worker");
+
+const data = require("sdk/self").data;
+const httpObserver = require("http_observer/http_request_observer");
+
+const { Cc, Ci } = require("chrome");
+const { getMostRecentBrowserWindow } = require('sdk/window/utils');
+const jetpackID = require("sdk/self").id;
+
+const tabs = require("sdk/tabs");
+//const prefs = require("preferences/preferences");
+const simpleStorage = require("sdk/simple-storage");
+const addonManage = require("addon_management/install_uninstall");
+var removedScripts = require("script_entries/removed_scripts").removedScripts;
+var acceptedScripts = require("script_entries/accepted_scripts").acceptedScripts;
+const dryRunScripts = require("script_entries/dryrun_scripts").dryRunScripts;
+
+const types = require("js_checker/constant_types");
+
+// manage preference whitelist.
+const prefChange = require("addon_management/prefchange");
+// set whitelist at startup.
+prefChange.init();
+
+var allowedRef = require("http_observer/allowed_referrers").allowedReferrers;
+
+var urlHandler = require("url_handler/url_handler");
+
+var widgetIsOn = false;
+
+const librejsStorage = require("settings/storage").librejsStorage;
+// read storage file.
+var cachedResult = librejsStorage.init();
+librejsStorage.generateCacheFromDB();
+
+
+var uiInfo = require("ui/ui_info");
+var scriptPanel = require("ui/script_panel.js");
+const removeHashCallback = require("js_checker/js_checker").removeHashCallback;
+var panelContent = function () {
+
+ let panel = this;
+ var message, externalEntries,
+ externalScripts, urlTabIndex, tabData;
+
+ tabs.activeTab.attach({
+ contentScriptFile: [data.url('third_party/jquery-src.js'),
+ data.url('script_detector/script_detector.js')],
+ contentScriptWhen: 'ready',
+
+ onMessage: function (respData) {
+ var url = urlHandler.removeFragment(tabs.activeTab.url);
+ scriptsData = {'removed': removedScripts.getScripts(url),
+ 'accepted': acceptedScripts.getScripts(url),
+ 'dryRun': dryRunScripts.getScripts(url)};
+ panel.postMessage({'pageURL': url,
+ 'urlData': scriptsData,
+ 'isAllowed': allowedRef.urlInAllowedReferrers(url)});
+ }
+
+ });
+
+};
+
+// page mod was here.
+
+exports.main = function(options, callbacks) {
+ if (options.loadReason === 'enable' ||
+ options.loadReason === 'install') {
+ addonManage.onLoad();
+ }
+};
+
+var mainPanel = panel.Panel({
+ contentURL: data.url('display_panel/content/display-panel.html'),
+ width: 800,
+ height: 500,
+ contentScriptFile: [
+ data.url('third_party/jquery-src.js'),
+ data.url('display_panel/main_panel.js')
+ ],
+ onShow: panelContent,
+ onHide: removePanelContent
+});
+
+var toggleButton = ToggleButton({
+ id: 'librejs-toggle-switch',
+ label: 'LibreJS',
+ icon: {
+ '16': './widget/images/librejs.png',
+ '32': './widget/images/librejs.png',
+ '64': './widget/images/librejs.png'
+ },
+ contentScriptFile: [data.url('widget/widget.js')],
+ contentScriptWhen: 'end',
+ panel: mainPanel,
+ onChange: handleChange
+});
+
+var getWidgetElem = function () {
+ let { document } = getMostRecentBrowserWindow();
+ var name = "widget:" + jetpackID + '-librejs-toggle-switch';
+ var widgetElem = document.getElementById(name);
+ return widgetElem;
+};
+
+function handleChange(state) {
+ if (state.checked) {
+ mainPanel.show({
+ position: toggleButton
+ });
+ }
+}
+
+function removePanelContent() {
+ toggleButton.state('window', { checked: false });
+}
+
+mainPanel.port.on('complainButtonClicked', function () {
+ mainPanel.hide();
+});
+
+mainPanel.port.on('allowAllClicked', function (url) {
+ url = urlHandler.removeFragment(url);
+ allowedRef.addPage(url);
+ tabs.activeTab.reload();
+});
+
+mainPanel.port.on('disallowAllClicked', function (url) {
+ console.debug('url is', url);
+ url = urlHandler.removeFragment(url);
+ console.debug('before clear, url is in allowedRef', allowedRef.urlInAllowedReferrers(url));
+ allowedRef.clearSinglePageEntry(url);
+ console.debug('after clear, url is in allowedRef', allowedRef.urlInAllowedReferrers(url));
+ mainPanel.hide();
+ tabs.activeTab.reload();
+});
+
+mainPanel.port.on('openInTab', function (text) {
+ var str = generateDataURI(text);
+ tabs.open(str);
+});
+
+var generateDataURI = function (encodedText) {
+ return "data:text/html;charset=UTF-8;base64," + encodedText;
+};
+
+exports.onUnload = addonManage.onUnload;
+exports.onLoad = addonManage.onLoad;
+
+// move to sub-module later
+const scriptsCached = require("script_entries/scripts_cache").scriptsCached;
+mainPanel.port.on('whitelistByHash', function (hash, url, name, reason) {
+ console.debug("hash is", hash);
+ url = urlHandler.removeFragment(url);
+ /* var cached_result = scriptsCached.isCached(hash);
+ console.log("cached_result is", cached_result);
+ if (cached_results) {
+ reason = cached_result['reason'];
+ }*/
+ scriptsCached.addEntryByHash(hash, types.whitelisted(reason), {}, true, url);
+});
+
+mainPanel.port.on('removeFromWhitelistByHash', function (hash) {
+ scriptsCached.removeEntryByHash(hash);
+ removeHashCallback(hash);
+});
+const settings_tab = require("settings/settings_tab");
+var menuitem = require("menuitems").Menuitem({
+ id: 'librejs_settings',
+ menuid: "menu_ToolsPopup",
+ label: "LibreJS",
+ onCommand: function() {
+ settings_tab.settingsManager.open();
+ },
+ insertbefore: "menu_pageInfo"
+});
+
+mainPanel.port.on('openSesame', function () {
+ // open the settings tab.
+ settings_tab.settingsManager.open();
+});
+
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/narcissus_parser/narcissus_worker.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/narcissus_parser/narcissus_worker.js
new file mode 100644
index 0000000..5e28dbb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/narcissus_parser/narcissus_worker.js
@@ -0,0 +1,67 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var data = require("sdk/self").data;
+var {Cu} = require("chrome");
+
+var {ChromeWorker} = Cu.import("resource://gre/modules/Services.jsm", null);
+
+
+var worker = new ChromeWorker(data.url("chrome_worker/narcissus_parser/narcissus_parse.js"));
+
+worker.onmessage = function (e) {
+
+ var jsChecker = require("js_checker/js_checker");
+
+ try {
+
+ jsChecker.callbackHashResult(e.data.hash, e.data.tree);
+
+ } catch (x) {
+
+ console.debug('error on message', x);
+ jsChecker.callbackHashResult(e.data.hash, false);
+
+ }
+ jsChecker = null;
+};
+
+exports.parse = function (scriptText, hash) {
+
+ try {
+ // dont display errors for main version.
+ worker.onerror = function (e) {
+ console.debug('error', e.lineno, 'in', e.filename, 'e', e.message, 'full message', e);
+ worker.postMessage(JSON.stringify({'hash': hash}));
+ };
+
+ var obj = {'code': scriptText, 'hash': hash};
+ worker.postMessage(JSON.stringify(obj));
+
+ } catch (x) {
+ console.debug('error in lib/narcissus_worker.js', x, x.lineNumber);
+ }
+
+};
+
+exports.stopWorker = function () {
+ console.debug('stopping worker');
+ worker.postMessage('stop');
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/accepted_scripts.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/accepted_scripts.js
new file mode 100644
index 0000000..1a8ac9a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/accepted_scripts.js
@@ -0,0 +1,67 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var allScripts = require('script_entries/all_scripts').allScripts;
+
+var AcceptedScripts = function() {
+ this.scripts = {};
+ this.truncateJsData = allScripts.truncateJsData;
+ this.getScripts = allScripts.getScripts;
+ this.isFound = allScripts.isFound;
+ this.returnWhenFound = allScripts.returnWhenFound;
+ this.getOrInitScripts = allScripts.getOrInitScripts;
+ this.setHash = allScripts.setHash;
+};
+
+AcceptedScripts.prototype.clearScripts = function (url) {
+ this.scripts[url] = [];
+};
+
+/**
+ * addAScript
+ * adds a single script to the scripts array.
+ * @param {string} url - the url of the page where it is loaded.
+ * @param {object} scriptObj - Additional data regarding this script,
+ * including: inline: boolean,
+ * contents: string,
+ * removalReason: string.
+ */
+AcceptedScripts.prototype.addAScript = function (url, scriptObj) {
+ var exists;
+
+ if (this.scripts[url] === undefined) {
+ this.clearScripts(url);
+ }
+
+ // check if content is actually js code.
+ if (scriptObj.inline === true) {
+ this.setHash(scriptObj);
+ this.truncateJsData(scriptObj);
+ }
+ exists = this.isFound(url, scriptObj);
+ if (!exists) {
+ this.scripts[url].push(scriptObj);
+ return true;
+ } else {
+ return false;
+ }
+};
+
+exports.acceptedScripts = new AcceptedScripts();
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/all_scripts.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/all_scripts.js
new file mode 100644
index 0000000..c08b4ac
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/all_scripts.js
@@ -0,0 +1,108 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var crypto = require('script_entries/crypto');
+
+var AllScripts = function() {
+ this.scripts = {};
+};
+
+AllScripts.prototype.truncateJsData = function (scriptObj) {
+ if (scriptObj.contents === undefined) {
+ console.debug('this is an inline script', scriptObj.value);
+ console.debug('this is an src', scriptObj.url);
+ }
+ if (scriptObj.contents.length > 1000) {
+ scriptObj.contents = scriptObj.contents.substring(0, 1000);
+ scriptObj.contents += '…';
+ }
+};
+
+AllScripts.prototype.setHash = function (scriptObj) {
+ scriptObj.hash = crypto.sha1Encrypt(scriptObj.contents);
+ return scriptObj.hash;
+};
+
+AllScripts.prototype.getScripts = function (url) {
+ if (!this.scripts[url]) {
+ return false;
+ } else {
+ return this.scripts[url];
+ }
+};
+
+AllScripts.prototype.reverseArray = function (url) {
+ this.scripts[url].reverse();
+};
+
+AllScripts.prototype.getOrInitScripts = function (url) {
+ if (this.scripts[url] === undefined) {
+ this.scripts[url] = [];
+ }
+ return this.scripts[url];
+};
+
+AllScripts.prototype.returnWhenFound = function(url, data) {
+ var pageScripts = this.getOrInitScripts(url),
+ i = 0,
+ le = pageScripts.length;
+
+ // check that entry doesn't exist.
+ if (data.inline === false) {
+ for (; i < le; i++) {
+ if (pageScripts[i].contents === data.url) {
+ return pageScripts[i];
+ }
+ }
+ } else if (data.inline === true) {
+ for (; i < le; i++) {
+ if (pageScripts[i].hash === crypto.sha1Encrypt(data.contents)) {
+ return pageScripts[i];
+ }
+ }
+ }
+
+ return false;
+};
+
+AllScripts.prototype.isFound = function(url, data) {
+ var pageScripts = this.getOrInitScripts(url),
+ i = 0,
+ le = pageScripts.length;
+
+ // check that entry doesn't exist.
+ if (data.inline === false) {
+ for (; i < le; i++) {
+ if (pageScripts[i].url === data.url) {
+ return true;
+ }
+ }
+ } else if (data.inline === true) {
+ for (; i < le; i++) {
+ if (pageScripts[i].hash === crypto.sha1Encrypt(data.contents)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+};
+
+exports.allScripts = new AllScripts();
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/crypto.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/crypto.js
new file mode 100644
index 0000000..e8844b1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/crypto.js
@@ -0,0 +1,60 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+var CryptoString = function() {
+ this.cryptoHash = Cc["@mozilla.org/security/hash;1"]
+ .createInstance(Ci.nsICryptoHash);
+ this.converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
+ createInstance(Ci.nsIScriptableUnicodeConverter);
+ this.hashAlgorithm = null;
+};
+
+CryptoString.prototype.init = function(hashAlgorithm, charset) {
+ this.converter.charset = charset;
+ this.hashAlgorithm = hashAlgorithm;
+ this.cryptoHash.init(this.cryptoHash[this.hashAlgorithm]);
+
+};
+
+CryptoString.prototype.encryptString = function(str) {
+ var result = {};
+ var data = this.converter.convertToByteArray(str, result);
+ this.cryptoHash.update(data, data.length);
+ var hash = this.cryptoHash.finish(false);
+ return [this.toHexString(hash.charCodeAt(i)) for (i in hash)].join("");
+};
+
+CryptoString.prototype.toHexString = function(charCode) {
+ return ("0" + charCode.toString(16)).slice(-2);
+};
+
+var cryptoString = new CryptoString();
+
+exports.sha1Encrypt = function(str) {
+ cryptoString.init('SHA1', 'UTF-8');
+ return cryptoString.encryptString(str);
+};
+
+exports.sha256Encrypt = function(str) {
+ cryptoString.init('SHA256', 'UTF-8');
+ return cryptoString.encryptString(str);
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/dryrun_scripts.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/dryrun_scripts.js
new file mode 100644
index 0000000..d32263b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/dryrun_scripts.js
@@ -0,0 +1,76 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var allScripts = require('script_entries/all_scripts').allScripts;
+const urlHandler = require('url_handler/url_handler');
+
+exports.dryRunScripts = {
+ scripts: {},
+
+ truncateJsData: allScripts.truncateJsData,
+
+ getScripts: allScripts.getScripts,
+
+ isFound: allScripts.isFound,
+
+ returnWhenFound: allScripts.returnWhenFound,
+
+ getOrInitScripts: allScripts.getOrInitScripts,
+
+ reverseArray: allScripts.reverseArray,
+
+ setHash: allScripts.setHash,
+
+ clearScripts: function (url) {
+ this.scripts[url] = [];
+ },
+
+ /**
+ * addAScript
+ * adds a single script to the scripts array.
+ * @param {string} url - the url of the page where it is loaded.
+ * @param {object} scriptObj - Additional data regarding this script,
+ * including: inline: boolean,
+ * contents: string,
+ * removalReason: string.
+ */
+ addAScript: function (url, scriptObj, absoluteUrl) {
+ var exists;
+
+ if (this.scripts[url] === undefined) {
+ this.clearScripts(url);
+ }
+ if (scriptObj.inline === true) {
+ this.setHash(scriptObj);
+ this.truncateJsData(scriptObj);
+ } else if (absoluteUrl !== undefined &&
+ scriptObj.inline === false) {
+ scriptObj.contents = urlHandler.resolve(absoluteUrl, scriptObj.contents);
+ }
+ exists = this.isFound(url, scriptObj);
+
+ if (!exists) {
+ this.scripts[url].push(scriptObj);
+ return true;
+ } else {
+ return false;
+ }
+ }
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/free_libraries.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/free_libraries.js
new file mode 100644
index 0000000..5aff728
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/free_libraries.js
@@ -0,0 +1,67 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+// THIS MODULE IS DEPRECATED IN FAVOR OF THE NEW WHITELISTING MODULE (LibreJS 6.0)
+
+var relationChecker = require("js_checker/relation_checker").relationChecker;
+var checkTypes = require("js_checker/constant_types").checkTypes;
+var scriptsCached = require("./scripts_cache").scriptsCached;
+
+
+// find the json database path.
+var dbContents = require("sdk/self").data.load("script_libraries/script-libraries.json");
+
+const AUTHOR_REASON = "this script has been tagged as free software by LibreJS authors";
+
+var freeLibraries = JSON.parse(dbContents); /* a database of the free libraries recognized by default */
+
+/*
+ *
+ * List of free libraries and their SHA256 hash.
+ * This is used to recognize the most common free libraries.
+ *
+ */
+
+var init = function () {
+
+ // relationChecker, which roughly checks if variables are window
+ // variables or not, is useless in this case. Use the same
+ // object for all entries.
+ var rc = relationChecker();
+ var library, hash;
+ var freeObj = { "type": 4, "reason": AUTHOR_REASON};
+ console.debug("Building init");
+ for (hash in freeLibraries) {
+ library = freeLibraries[hash];
+
+ // assign empty relationChecker object.
+ library.relationChecker = rc;
+
+ // make them free and nontrivial.
+ library.result = freeObj;
+
+ scriptsCached.addObjectEntry(hash, library);
+ }
+};
+
+//init();
+
+exports.init = init;
+exports.AUTHOR_REASON = AUTHOR_REASON;
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/removed_scripts.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/removed_scripts.js
new file mode 100644
index 0000000..8f65c4d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/removed_scripts.js
@@ -0,0 +1,71 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var allScripts = require('script_entries/all_scripts').allScripts;
+const urlHandler = require('url_handler/url_handler');
+
+var RemovedScripts = function() {
+ this.scripts = {};
+ this.truncateJsData = allScripts.truncateJsData;
+ this.getScripts = allScripts.getScripts;
+ this.isFound = allScripts.isFound;
+ this.returnWhenFound = allScripts.returnWhenFound;
+ this.getOrInitScripts = allScripts.getOrInitScripts;
+ this.reverseArray = allScripts.reverseArray;
+ this.setHash = allScripts.setHash;
+};
+
+RemovedScripts.prototype.clearScripts = function (url) {
+ this.scripts[url] = [];
+};
+
+/**
+ * addAScript
+ * adds a single script to the scripts array.
+ * @param {string} url - the url of the page where it is loaded.
+ * @param {object} scriptObj - Additional data regarding this script,
+ * including: inline: boolean,
+ * contents: string,
+ * removalReason: string.
+ */
+RemovedScripts.prototype.addAScript = function (url, scriptObj, absoluteUrl) {
+ var exists;
+
+ if (this.scripts[url] === undefined) {
+ this.clearScripts(url);
+ }
+ if (scriptObj.inline === true) {
+ this.setHash(scriptObj);
+ this.truncateJsData(scriptObj);
+ } else if (absoluteUrl !== undefined &&
+ scriptObj.inline === false) {
+ scriptObj.contents = urlHandler.resolve(absoluteUrl, scriptObj.contents);
+ }
+ exists = this.isFound(url, scriptObj);
+
+ if (!exists) {
+ this.scripts[url].push(scriptObj);
+ return true;
+ } else {
+ return false;
+ }
+};
+
+exports.removedScripts = new RemovedScripts();
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/scripts_cache.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/scripts_cache.js
new file mode 100644
index 0000000..5bc5c8a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/scripts_cache.js
@@ -0,0 +1,182 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+var relationCheckerObj = require("js_checker/relation_checker").relationChecker;
+
+var crypto = require('script_entries/crypto');
+//const librejsStorage = require("settings/storage").librejsStorage;
+const checkTypes = require("js_checker/constant_types").checkTypes;
+
+// cachedResults contains objects with result/relationChecker for
+// scripts entries indexed by SHA1sum
+var cachedResults = {};
+
+var ScriptsCached = function() {};
+
+ScriptsCached.prototype.getHash = function(scriptText) {
+ require('ui/notification').createNotification(scriptText.substring(0,100));
+
+ return crypto.sha1Encrypt(scriptText);
+};
+
+/**
+ * resetCache
+ * Resets the full cache and re-initialize
+ * the free libraries list.
+ */
+ScriptsCached.prototype.resetCache = function () {
+ cachedResults = {};
+ free_libraries.init();
+};
+
+/**
+ *
+ * addEntry
+ *
+ * Adds a script entry to the cache by providing the results
+ * and the actual script text.
+ *
+ */
+ScriptsCached.prototype.addEntry = function(
+ scriptText, result, relationChecker, allowTrivial, url) {
+ console.debug("result addEntry is", JSON.stringify(result));
+ cachedResults[this.getHash(scriptText)] = {
+ 'result': result,
+ 'relationChecker': relationCheckerObj(),
+ 'allowTrivial': allowTrivial,
+ 'url': url
+ };
+};
+
+/**
+ *
+ * addEntry
+ *
+ * Adds a script entry to the cache by providing the results
+ * using the script's hash.
+ *
+ */
+ScriptsCached.prototype.addEntryByHash = function(
+ hash, result, relationChecker, allowTrivial, url) {
+ cachedResults[hash] = {
+ 'result': result,
+ 'relationChecker': relationCheckerObj(),
+ 'allowTrivial': allowTrivial,
+ 'url': url || ''
+ };
+};
+
+/**
+ * removeEntryByHash
+ *
+ * Remove an entry from the cache using hash key.
+ */
+ScriptsCached.prototype.removeEntryByHash = function(hash) {
+ delete cachedResults[hash];
+};
+
+/**
+ * addEntryIfNotCached
+ *
+ * Checks first if entry is cached before attempting to cache result.
+ */
+ScriptsCached.prototype.addEntryIfNotCached = function(
+ scriptText, result, relationChecker, allowTrivial, url) {
+ // save a bit of computing by getting hash once.
+ var hash = this.getHash(scriptText);
+ console.debug('hash is then', hash);
+ if (!this.isCached(scriptText, hash)) {
+ cachedResults[hash] = {
+ 'result': result,
+ 'relationChecker': relationCheckerObj(),
+ 'allowTrivial': allowTrivial,
+ 'url': url || ''
+ };
+ }
+ return hash;
+};
+
+/**
+ *
+ * addObjectEntry
+ *
+ * Adds a script entry by providing an object.
+ * Used to provide free library hashes from free_libraries.js
+ *
+ */
+ScriptsCached.prototype.addObjectEntry = function(hash, script) {
+ cachedResults[hash] = script;
+};
+
+ScriptsCached.prototype.isCached = function(scriptText, hash) {
+ var scriptHash;
+ console.debug("Is CACHED start?");
+ try {
+ if (typeof hash === 'string') {
+ scriptHash = hash;
+ } else {
+ scriptHash = this.getHash(scriptText);
+ }
+ if (typeof scriptHash === 'string') {
+ let cachedResult = cachedResults[scriptHash];
+ if (cachedResult) {
+ // exact copy of file has already been cached.
+ console.debug('scriptHash is', cachedResult);
+ if (cachedResult.relationChecker == "[rl]") {
+ cachedResult.relationChecker = {}; //relationCheckerObj();
+ }
+ console.debug("Is Cached ENd TRUE");
+ return cachedResult;
+ }
+ }
+ return false;
+ } catch (e) {
+ console.debug("an error", scriptHash, e, e.linenumber, e.filename);
+ }
+};
+
+/**
+ * Writes allowed scripts to the cache.
+ * nonfree/nontrivial scripts are not added to the cache.
+ */
+ScriptsCached.prototype.getCacheForWriting = function() {
+ var formattedResults = {};
+ for (let item in cachedResults) {
+ let type = cachedResults[item].result.type;
+ if (type != checkTypes.NONTRIVIAL &&
+ type != checkTypes.TRIVIAL_DEFINES_FUNCTION) {
+ formattedResults[item] = cachedResults[item];
+ }
+ }
+ return formattedResults;
+};
+
+/**
+ * Import data from database into cachedResults.
+ * Calling this function replaces the current cache if it exists.
+ */
+ScriptsCached.prototype.bulkImportCache = function(data) {
+ cachedResults = data;
+ console.debug("Imported data. Number of keys ISSS ", Object.keys(cachedResults).length);
+ console.debug("It looks like ", JSON.stringify(cachedResults));
+};
+
+// import free_libraries to populate the cache hash map.
+//var free_libraries = require("script_entries/free_libraries");
+exports.scriptsCached = new ScriptsCached();
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/settings/settings_tab.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/settings/settings_tab.js
new file mode 100644
index 0000000..c99deb5
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/settings/settings_tab.js
@@ -0,0 +1,84 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+const addonTab = require("addon-tab");
+const data = require("sdk/self").data;
+const storage = require("settings/storage").librejsStorage;
+const scriptsCached = require("script_entries/scripts_cache").scriptsCached;
+
+exports.settingsManager = settingsManager;
+
+
+
+let settingsManager = {
+ settings_tab: {
+ url: data.url("settings/index.html"),
+ tabStyle: {
+ 'background-color': '#898168',
+ 'background-image': 'none', // important to overwrite bckg when tab is active.
+ 'font-weight': 'normal',
+ 'font-size': '1.1em',
+ 'color': '#444'
+ },
+ onReady: function (tab) {
+ console.debug("populating form");
+ var that = this;
+ let cache_data = scriptsCached.getCacheForWriting();
+ let worker = tab.attach({contentScriptFile: [data.url('settings/js/pagescript-listener.js'),
+ data.url('settings/js/pagescript-emitter.js')]});
+ worker.port.emit("populate-form", cache_data);
+ worker.port.on("rules-form-delete", function (hash) {
+ try {
+ scriptsCached.removeEntryByHash(hash);
+ } catch (e) {
+ console.log(e, e.lineNumber, e.filename);
+ }
+ //worker.port.emit("populate-form", scriptsCached.getCacheForWriting());
+ });
+ worker.port.on("rules-form-delete-all", function () {
+ console.log("delete all triggered.");
+ scriptsCached.resetCache();
+ });
+ },
+ onActivate: function (tab) {
+ // just reload the form.
+ console.log("Tab is activated again");
+ var that = this;
+ let cache_data = scriptsCached.getCacheForWriting();
+ let worker = tab.attach({contentScriptFile: [data.url('settings/js/pagescript-listener.js'),
+ data.url('settings/js/pagescript-emitter.js')]});
+ worker.port.emit("populate-form", cache_data);
+
+ }
+ },
+
+
+ init: function () {
+ // do some first time magic.
+ settings.onLoad(function (data) {
+
+ });
+ },
+ open: function () {
+ console.debug("settings tab data url is", this.settings_tab.url);
+ addonTab.open(this.settings_tab);
+ }
+};
+
+exports.settingsManager = settingsManager;
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/settings/storage.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/settings/storage.js
new file mode 100644
index 0000000..f77bd13
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/settings/storage.js
@@ -0,0 +1,164 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+/*jshint esnext: true */
+
+const { Cc, Ci, Cu, components } = require("chrome");
+
+var { NetUtil } = Cu.import("resource://gre/modules/NetUtil.jsm");
+var { FileUtils } = Cu.import("resource://gre/modules/FileUtils.jsm");
+var relationChecker = require("js_checker/relation_checker").relationChecker;
+var rc = relationChecker(); // a dummy object for legacy module.
+const AUTHOR_REASON = require("script_entries/free_libraries").AUTHOR_REASON;
+var relationChecker = require("js_checker/relation_checker").relationChecker;
+
+const scriptsCached = require("script_entries/scripts_cache").scriptsCached;
+
+let librejsStorage = {
+
+ file: null,
+ filename: 'librejs-whitelist.json',
+ data: [],
+
+ onLoad: function (callback) {
+ // will read the json file.
+ this.init();
+ this.read(callback);
+ },
+
+
+ init: function () {
+ // get the "librejs-whitelist.json" file in the profile directory
+ this.file = FileUtils.getFile("ProfD", [this.filename]);
+ },
+ read: function (callback) {
+ // Content type hint is useful on mobile platforms where the filesystem
+ // would otherwise try to determine the content type.
+ var channel = NetUtil.newChannel(this.file);
+ var that = this;
+ channel.contentType = "application/json";
+ try {
+ NetUtil.asyncFetch(channel, function(inputStream, status) {
+
+ if (!components.isSuccessCode(status)) {
+ require("script_entries/free_libraries").init();
+ that.initialWrite();
+ }
+
+ var raw_data = NetUtil.readInputStreamToString(inputStream, inputStream.available());
+ // expand json file back to original contents.
+ var re = new RegExp("[freelib]".replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g');
+ raw_data = raw_data.replace(re, AUTHOR_REASON);
+ console.debug("raw_data is ", raw_data);
+ // The file data is contained within inputStream.
+ // You can read it into a string with
+ // get string into json also
+ that.data = JSON.parse(raw_data);
+
+ callback(that.data);
+ });
+ } catch (e) {
+ that.initialWrite();
+ }
+ },
+
+ initialWrite: function (callback) {
+ console.debug("About to write free libraries");
+ // our file is not populated with default contents.
+ // use free_libraries.js to populate.
+ require("script_entries/free_libraries").init();
+ this.writeCacheToDB(callback);
+ },
+ /**
+ * writes the contents of scriptsCached to the persistent
+ * JSON file.
+ */
+ writeCacheToDB: function (callback) {
+ console.debug("writing to db");
+ data = scriptsCached.getCacheForWriting();
+ json = JSON.stringify(data);
+
+ // make json file smaller.
+ var re = new RegExp(AUTHOR_REASON.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g');
+ json = json.replace(re, "[freelib]");
+
+ var rc = JSON.stringify(relationChecker());
+ re = new RegExp(rc.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g');
+ json = json.replace(re, "\"[rl]\"");
+ console.debug("this.data is now", this.data);
+ this.write(callback, json);
+ },
+ generateCacheFromDB: function (callback) {
+ if (callback === undefined) {
+ callback = function () {
+ // nothing to do.
+ };
+ }
+ this.read(function (data) {
+ scriptsCached.bulkImportCache(data);
+ });
+ },
+ write: function (onDataWritten, json) {
+
+ this.init();
+ var str;
+ if (json === undefined) {
+ str = JSON.stringify(this.data);
+ } else {
+ // we are passing json already formatted.
+ str = json;
+ }
+ var ostream = FileUtils.openSafeFileOutputStream(this.file);
+ var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
+ converter.charset = "UTF-8";
+ var istream = converter.convertToInputStream(str);
+ // The last argument (the callback) is optional.
+ NetUtil.asyncCopy(istream, ostream, function(status) {
+ if (!components.isSuccessCode(status)) {
+ // Handle error!
+ return;
+ }
+ if (!onDataWritten) {
+ console.debug("onDataWritten is not defined");
+ onDataWritten = function () {
+ console.debug("onDataWritten dummy callback triggered");
+ };
+ }
+ // Data has been written to the file.
+ onDataWritten();
+ });
+ },
+
+ /**
+ * getEntry -- Returns a storage entry if it is present.
+ */
+ getEntry: function (hash) {
+ var entry = this.data[hash];
+ if (entry) {
+ if (entry.result == "[freelib]") {
+ entry.result = { "type": 4, "reason": "this script has been tagged as free software by LibreJS authors" };
+ }
+ entry.relationChecker = rc;
+ return entry;
+ }
+ return false;
+ }
+};
+
+exports.librejsStorage = librejsStorage;
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/notification.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/notification.js
new file mode 100644
index 0000000..aeb279a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/notification.js
@@ -0,0 +1,77 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+// this module is used to display a notification when LibreJS
+// is running to inform the user it is indeed busy working.
+const timer = require("sdk/timers");
+const self = require("sdk/self");
+const isDisplayNotifications = require("addon_management/prefchange").isDisplayNotifications;
+
+exports.createCriticalNotification = function (text) {
+ if (text === undefined) {
+ text = "";
+ }
+ var self = require('sdk/self');
+ var randomnumber = Math.floor(Math.random()*11);
+ var notif = require("notification-box").NotificationBox({
+ 'value': 'librejs-critical-notification-js-web-labels',
+ 'label': text,
+ 'priority': 'CRITICAL_LOW',
+ 'image': self.data.url("assets/images/torchy2.png"),
+ });
+ return notif;
+};
+
+var fakeNotification = {
+ 'close': function () {
+ return;
+ }
+};
+
+exports.createNotification = function (jsValue) {
+ if (!isDisplayNotifications()) {
+ return fakeNotification;
+ }
+ if (jsValue === undefined) {
+ jsValue = "";
+ }
+ var self = require('sdk/self');
+ var randomnumber = Math.floor(Math.random()*11);
+ var notif = require("notification-box").NotificationBox({
+ 'value': 'librejs-message',
+ 'label': 'LibreJS is analyzing: ' + jsValue + " ...",
+ 'priority': 'INFO_LOW',
+ 'image': self.data.url("assets/images/torchy2.png"),
+ /*'buttons': [{'label': "Fine",
+ 'onClick': function () { }}]*/
+ });
+ timer.setTimeout(function () {
+ // ensure notifications are ALWAYS removed at some point.
+ console.debug("removing after 2 seconds");
+ try {
+ var n = notif.notificationbox
+ .getNotificationWithValue('librejs-message');
+ n.close();
+ } catch(x) {
+ // do nothing
+ }
+ }, 2000);
+ return notif;
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/script_panel.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/script_panel.js
new file mode 100644
index 0000000..85c22a4
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/script_panel.js
@@ -0,0 +1,73 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var urlHandler = require("url_handler/url_handler");
+
+/**
+ * addScriptsToPanelList
+ *
+ * Looks for scripts that are either valid or flagged with libreJS
+ *
+ */
+exports.addScriptsToPanelList = function (url, respData) {
+
+ var panelRemovedScripts = [];
+ var panelAcceptedScripts = [];
+ var panelDryRunScripts = [];
+
+ // use url. remove fragment.
+ url = urlHandler.removeFragment(url);
+ var contents, i, reason;
+
+ for (i = 0; i < respData.value.blocked.length; i++) {
+ // if external script only.
+ pathToUrl(respData.value.blocked[i], url);
+ panelRemovedScripts.push(respData.value.blocked[i]);
+ }
+
+ for (i = 0; i < respData.value.accepted.length; i++) {
+
+ // if external script only.
+ pathToUrl(respData.value.accepted[i], url);
+ panelAcceptedScripts.push(respData.value.accepted[i]);
+ }
+ for (i = 0; i < respData.value.dryRun.length; i++) {
+ // if external script only.
+ pathToUrl(respData.value.dryRun[i], url);
+ panelDryRunScripts.push(respData.value.dryRun[i]);
+ }
+
+ return {'removed': panelRemovedScripts,
+ 'accepted': panelAcceptedScripts,
+ 'dryRun': panelDryRunScripts};
+};
+
+
+/**
+ * pathToUrl
+ *
+ * convert a relative path to a url.
+ *
+ */
+var pathToUrl = function (scriptEntry, url) {
+ if (scriptEntry.inline === false) {
+ scriptEntry.url = urlHandler.resolve(url, scriptEntry.url);
+ }
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/ui_info.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/ui_info.js
new file mode 100644
index 0000000..5e0c2a8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/ui_info.js
@@ -0,0 +1,232 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+
+// page mod executing content script at every page load.
+
+var data = require("sdk/self").data;
+var pageMod = require("sdk/page-mod");
+
+var urlHandler = require("url_handler/url_handler");
+
+var pageWorker = require("sdk/page-worker");
+
+var tabs = require("sdk/tabs");
+var isComplaintTab = require("addon_management/prefchange").isComplaintTab;
+
+// contain list of recently found contact links or email addresses.
+var contactList = {};
+
+// constants. Also available in lib/ui_info.js
+const CERTAIN_EMAIL_ADDRESS_FOUND = 'certainEmailAddressFound';
+const UNCERTAIN_EMAIL_ADDRESS_FOUND = 'uncertainEmailAddresFound';
+
+// Looking for contact links
+const CERTAIN_LINK_FOUND = 'certainLinkFound';
+const PROBABLE_LINK_FOUND = 'probableLinkFound';
+const UNCERTAIN_LINK_FOUND = 'uncertainLinkFound';
+const LINK_NOT_FOUND = 'contactLinkNotFound';
+
+// Looking for identi.ca and twitter accounts.
+const TWITTER_LINK_FOUND = 'twitterLinkFound';
+const IDENTICA_LINK_FOUND = 'identicaLinkFound';
+
+// phone number and address
+const PHONE_NUMBER_FOUND = 'phoneNumberFound';
+const SNAIL_ADDRESS_FOUND = 'snailAddressFound';
+
+/**
+ * main pageMod.
+ * Find blocked script in all pages being opened.
+ * Launch the scripts that search for a complaint contact.
+ *
+ */
+
+pageMod.PageMod({
+
+ include: ['file://*','*', 'data:*', 'about:*'],
+
+ contentScriptWhen: 'end',
+
+ contentScriptFile: [
+ data.url('complain/contact_regex.js'),
+ data.url('complain/link_types.js'),
+ data.url('third_party/jquery-src.js'),
+ data.url('third_party/jquery.easing.1.3.js'),
+ data.url('complain/contact_finder.js'),
+ data.url('complain/pagemod_finder.js'),
+ data.url('script_detector/script_detector.js')
+ ],
+
+ onAttach: function onAttach(worker) {
+
+ if (worker.tab !== undefined && isComplaintTab()) {
+
+ // this is a tab.
+ if (!foundInContactList(worker.url)) {
+ // the hostname doesn't appear in the object literal.
+ // run script fetching/complaint feature if applicable.
+ tabProcess(worker);
+ } else {
+ worker.postMessage(foundInContactList(worker.url));
+ }
+ }
+
+ }
+});
+
+/**
+ * foundInContactList
+ *
+ * Provides link if contact link is found for given url, or else
+ * false.
+ */
+var foundInContactList = function (url) {
+
+ var hostname = urlHandler.getHostname(url);
+
+ if (contactList[hostname] !== undefined) {
+
+ return contactList[hostname];
+
+ } else {
+
+ return false;
+
+ }
+
+};
+
+/**
+ * tabProcess
+ * Find blocked/accepted scripts, prepare
+ * display panel and complaint panel, ...
+ *
+ */
+var tabProcess = function (worker) {
+
+ var visitedUrl = {};
+
+ // webmaster email is better than a webpage.
+ worker.emailFound = false;
+ var modUrl = '',
+ searchUrl = '';
+
+ modUrl = worker.url;
+
+ console.debug('pagemod triggered');
+
+ // send local path to complain button graphic.
+ worker.postMessage({'event': 'assets-uri', 'value': data.url('assets/')});
+ worker.postMessage({'event': 'page-url', 'value': modUrl});
+
+ worker.on('message', function (respData) {
+
+ // console.debug('worker is receiving a message', respData.event);
+
+ var pw;
+
+ worker.on('detach', function () {
+ console.debug('detaching worker');
+ if (pw) {
+ pw.destroy();
+
+ }
+ });
+ if (respData.contact !== undefined) {
+ // pass the message to the complaint display panel.
+ worker.postMessage(respData);
+ }
+
+ else if (respData.event === 'complaintSearch') {
+
+ console.debug('complaintSearch triggered');
+ console.debug('worker tab url', worker.tab.url);
+ if (!(respData.urlSearch.linkValue in visitedUrl)) {
+
+ visitedUrl[respData.urlSearch.linkValue] = 1;
+
+ respData.urlSearch.linkValue = urlHandler.addFragment(respData.urlSearch.linkValue, 'librejs=true');
+ pw = searchSecondLevelPage(this, respData.urlSearch.linkValue, this.url);
+
+ }
+ // currently not needed.
+ /*else {
+ console.debug(respData.urlSearch.linkValue, 'already visited');
+ }*/
+ }
+
+
+ });
+
+};
+
+var searchSecondLevelPage = function(
+ worker, urlToSearch, originalUrl) {
+ return;
+ var originalWorker = worker;
+
+ console.debug('url to search is', urlToSearch);
+
+ console.debug(urlToSearch, 'and', originalUrl);
+
+ if (urlHandler.haveSameHostname(urlToSearch, originalUrl)) {
+ return pageWorker.Page({
+ contentURL: urlToSearch,
+ contentScriptFile: [
+ data.url('complain/contact_regex.js'),
+ data.url('complain/link_types.js'),
+ data.url('third_party/jquery-src.js'),
+ data.url('third_party/jquery.easing.1.3.js'),
+ data.url('complain/contact_finder.js'),
+ data.url('complain/worker_finder.js')
+ ],
+ contentScriptWhen: "end",
+ onMessage: function (respData) {
+ console.debug(JSON.stringify(respData));
+ console.debug(originalWorker.url);
+ originalWorker.postMessage(respData);
+
+ if (respData.event === 'destroy') {
+ try {
+ console.debug('destroying worker', this.contentURL);
+ this.destroy();
+ } catch (e) {
+ console.debug('in worker', e);
+ }
+ }
+ }
+ });
+ }
+};
+
+
+
+
+exports.testModule = {
+
+ 'contactList': contactList,
+
+ 'foundInContactList': foundInContactList,
+
+ 'tabProcess': tabProcess
+
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_punycode.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_punycode.js
new file mode 100644
index 0000000..64d8c61
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_punycode.js
@@ -0,0 +1,219 @@
+// Copyright (C) 2011 by Ben Noordhuis <info@bnoordhuis.nl>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+exports.encode = encode;
+exports.decode = decode;
+
+var TMIN = 1;
+var TMAX = 26;
+var BASE = 36;
+var SKEW = 38;
+var DAMP = 700; // initial bias scaler
+var INITIAL_N = 128;
+var INITIAL_BIAS = 72;
+var MAX_INTEGER = Math.pow(2, 53);
+
+function adapt_bias(delta, n_points, is_first) {
+ // scale back, then increase delta
+ delta /= is_first ? DAMP : 2;
+ delta += ~~(delta / n_points);
+
+ var s = (BASE - TMIN);
+ var t = ~~((s * TMAX) / 2); // threshold=455
+
+ for (var k = 0; delta > t; k += BASE) {
+ delta = ~~(delta / s);
+ }
+
+ var a = (BASE - TMIN + 1) * delta;
+ var b = (delta + SKEW);
+
+ return k + ~~(a / b);
+}
+
+function next_smallest_codepoint(codepoints, n) {
+ var m = 0x110000; // unicode upper bound + 1
+
+ for (var i = 0, len = codepoints.length; i < len; ++i) {
+ var c = codepoints[i];
+ if (c >= n && c < m) {
+ m = c;
+ }
+ }
+
+ // sanity check - should not happen
+ if (m >= 0x110000) {
+ throw new Error('Next smallest code point not found.');
+ }
+
+ return m;
+}
+
+function encode_digit(d) {
+ return d + (d < 26 ? 97 : 22);
+}
+
+function decode_digit(d) {
+ if (d >= 48 && d <= 57) {
+ return d - 22; // 0..9
+ }
+ if (d >= 65 && d <= 90) {
+ return d - 65; // A..Z
+ }
+ if (d >= 97 && d <= 122) {
+ return d - 97; // a..z
+ }
+ throw new Error('Illegal digit #' + d);
+}
+
+function threshold(k, bias) {
+ if (k <= bias + TMIN) {
+ return TMIN;
+ }
+ if (k >= bias + TMAX) {
+ return TMAX;
+ }
+ return k - bias;
+}
+
+function encode_int(bias, delta) {
+ var result = [];
+
+ for (var k = BASE, q = delta;; k += BASE) {
+ var t = threshold(k, bias);
+ if (q < t) {
+ result.push(encode_digit(q));
+ break;
+ }
+ else {
+ result.push(encode_digit(t + ((q - t) % (BASE - t))));
+ q = ~~((q - t) / (BASE - t));
+ }
+ }
+
+ return result;
+}
+
+function encode(input) {
+ if (typeof input != 'string') {
+ throw new Error('Argument must be a string.');
+ }
+
+ input = input.split('').map(function(c) {
+ return c.charCodeAt(0);
+ });
+
+ var output = [];
+ var non_basic = [];
+
+ for (var i = 0, len = input.length; i < len; ++i) {
+ var c = input[i];
+ if (c < 128) {
+ output.push(c);
+ }
+ else {
+ non_basic.push(c);
+ }
+ }
+
+ var b, h;
+ b = h = output.length;
+
+ if (b) {
+ output.push(45); // delimiter '-'
+ }
+
+ var n = INITIAL_N;
+ var bias = INITIAL_BIAS;
+ var delta = 0;
+
+ for (var len = input.length; h < len; ++n, ++delta) {
+ var m = next_smallest_codepoint(non_basic, n);
+ delta += (m - n) * (h + 1);
+ n = m;
+
+ for (var i = 0; i < len; ++i) {
+ var c = input[i];
+ if (c < n) {
+ if (++delta == MAX_INTEGER) {
+ throw new Error('Delta overflow.');
+ }
+ }
+ else if (c == n) {
+ // TODO append in-place?
+ // i.e. -> output.push.apply(output, encode_int(bias, delta));
+ output = output.concat(encode_int(bias, delta));
+ bias = adapt_bias(delta, h + 1, b == h);
+ delta = 0;
+ h++;
+ }
+ }
+ }
+
+ return String.fromCharCode.apply(String, output);
+}
+
+function decode(input) {
+ if (typeof input != 'string') {
+ throw new Error('Argument must be a string.');
+ }
+
+ // find basic code points/delta separator
+ var b = 1 + input.lastIndexOf('-');
+
+ input = input.split('').map(function(c) {
+ return c.charCodeAt(0);
+ });
+
+ // start with a copy of the basic code points
+ var output = input.slice(0, b ? (b - 1) : 0);
+
+ var n = INITIAL_N;
+ var bias = INITIAL_BIAS;
+
+ for (var i = 0, len = input.length; b < len; ++i) {
+ var org_i = i;
+
+ for (var k = BASE, w = 1;; k += BASE) {
+ var d = decode_digit(input[b++]);
+
+ // TODO overflow check
+ i += d * w;
+
+ var t = threshold(k, bias);
+ if (d < t) {
+ break;
+ }
+
+ // TODO overflow check
+ w *= BASE - t;
+ }
+
+ var x = 1 + output.length;
+ bias = adapt_bias(i - org_i, x, org_i == 0);
+ // TODO overflow check
+ n += ~~(i / x);
+ i %= x;
+
+ output.splice(i, 0, n);
+ }
+
+ return String.fromCharCode.apply(String, output);
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_querystring.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_querystring.js
new file mode 100644
index 0000000..3314061
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_querystring.js
@@ -0,0 +1,187 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// Query String Utilities
+
+var QueryString = exports;
+//var urlDecode = process.binding('http_parser').urlDecode;
+
+
+// If obj.hasOwnProperty has been overridden, then calling
+// obj.hasOwnProperty(prop) will break.
+// See: https://github.com/joyent/node/issues/1707
+function hasOwnProperty(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+}
+
+
+function charCode(c) {
+ return c.charCodeAt(0);
+}
+
+
+// a safe fast alternative to decodeURIComponent
+QueryString.unescapeBuffer = function(s, decodeSpaces) {
+ var out = new Buffer(s.length);
+ var state = 'CHAR'; // states: CHAR, HEX0, HEX1
+ var n, m, hexchar;
+
+ for (var inIndex = 0, outIndex = 0; inIndex <= s.length; inIndex++) {
+ var c = s.charCodeAt(inIndex);
+ switch (state) {
+ case 'CHAR':
+ switch (c) {
+ case charCode('%'):
+ n = 0;
+ m = 0;
+ state = 'HEX0';
+ break;
+ case charCode('+'):
+ if (decodeSpaces) c = charCode(' ');
+ // pass thru
+ default:
+ out[outIndex++] = c;
+ break;
+ }
+ break;
+
+ case 'HEX0':
+ state = 'HEX1';
+ hexchar = c;
+ if (charCode('0') <= c && c <= charCode('9')) {
+ n = c - charCode('0');
+ } else if (charCode('a') <= c && c <= charCode('f')) {
+ n = c - charCode('a') + 10;
+ } else if (charCode('A') <= c && c <= charCode('F')) {
+ n = c - charCode('A') + 10;
+ } else {
+ out[outIndex++] = charCode('%');
+ out[outIndex++] = c;
+ state = 'CHAR';
+ break;
+ }
+ break;
+
+ case 'HEX1':
+ state = 'CHAR';
+ if (charCode('0') <= c && c <= charCode('9')) {
+ m = c - charCode('0');
+ } else if (charCode('a') <= c && c <= charCode('f')) {
+ m = c - charCode('a') + 10;
+ } else if (charCode('A') <= c && c <= charCode('F')) {
+ m = c - charCode('A') + 10;
+ } else {
+ out[outIndex++] = charCode('%');
+ out[outIndex++] = hexchar;
+ out[outIndex++] = c;
+ break;
+ }
+ out[outIndex++] = 16 * n + m;
+ break;
+ }
+ }
+
+ // TODO support returning arbitrary buffers.
+
+ return out.slice(0, outIndex - 1);
+};
+
+
+QueryString.unescape = function(s, decodeSpaces) {
+ return QueryString.unescapeBuffer(s, decodeSpaces).toString();
+};
+
+
+QueryString.escape = function(str) {
+ return encodeURIComponent(str);
+};
+
+var stringifyPrimitive = function(v) {
+ switch (typeof v) {
+ case 'string':
+ return v;
+
+ case 'boolean':
+ return v ? 'true' : 'false';
+
+ case 'number':
+ return isFinite(v) ? v : '';
+
+ default:
+ return '';
+ }
+};
+
+
+QueryString.stringify = QueryString.encode = function(obj, sep, eq, name) {
+ sep = sep || '&';
+ eq = eq || '=';
+ obj = (obj === null) ? undefined : obj;
+
+ switch (typeof obj) {
+ case 'object':
+ return Object.keys(obj).map(function(k) {
+ if (Array.isArray(obj[k])) {
+ return obj[k].map(function(v) {
+ return QueryString.escape(stringifyPrimitive(k)) +
+ eq +
+ QueryString.escape(stringifyPrimitive(v));
+ }).join(sep);
+ } else {
+ return QueryString.escape(stringifyPrimitive(k)) +
+ eq +
+ QueryString.escape(stringifyPrimitive(obj[k]));
+ }
+ }).join(sep);
+
+ default:
+ if (!name) return '';
+ return QueryString.escape(stringifyPrimitive(name)) + eq +
+ QueryString.escape(stringifyPrimitive(obj));
+ }
+};
+
+// Parse a key=val string.
+QueryString.parse = QueryString.decode = function(qs, sep, eq) {
+ sep = sep || '&';
+ eq = eq || '=';
+ var obj = {};
+
+ if (typeof qs !== 'string' || qs.length === 0) {
+ return obj;
+ }
+
+ qs.split(sep).forEach(function(kvp) {
+ var x = kvp.split(eq);
+ var k = QueryString.unescape(x[0], true);
+ var v = QueryString.unescape(x.slice(1).join(eq), true);
+
+ if (!hasOwnProperty(obj, k)) {
+ obj[k] = v;
+ } else if (!Array.isArray(obj[k])) {
+ obj[k] = [obj[k], v];
+ } else {
+ obj[k].push(v);
+ }
+ });
+
+ return obj;
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_url.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_url.js
new file mode 100644
index 0000000..6b4940f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_url.js
@@ -0,0 +1,611 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var punycode = require('url_handler/node_punycode');
+
+exports.parse = urlParse;
+exports.resolve = urlResolve;
+exports.resolveObject = urlResolveObject;
+exports.format = urlFormat;
+
+// Reference: RFC 3986, RFC 1808, RFC 2396
+
+// define these here so at least they only have to be
+// compiled once on the first module load.
+var protocolPattern = /^([a-z0-9.+-]+:)/i,
+ portPattern = /:[0-9]+$/,
+ // RFC 2396: characters reserved for delimiting URLs.
+ delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'],
+ // RFC 2396: characters not allowed for various reasons.
+ unwise = ['{', '}', '|', '\\', '^', '~', '[', ']', '`'].concat(delims),
+ // Allowed by RFCs, but cause of XSS attacks. Always escape these.
+ autoEscape = ['\''],
+ // Characters that are never ever allowed in a hostname.
+ // Note that any invalid chars are also handled, but these
+ // are the ones that are *expected* to be seen, so we fast-path
+ // them.
+ nonHostChars = ['%', '/', '?', ';', '#']
+ .concat(unwise).concat(autoEscape),
+ nonAuthChars = ['/', '@', '?', '#'].concat(delims),
+ hostnameMaxLen = 255,
+ hostnamePartPattern = /^[a-zA-Z0-9][a-z0-9A-Z_-]{0,62}$/,
+ hostnamePartStart = /^([a-zA-Z0-9][a-z0-9A-Z_-]{0,62})(.*)$/,
+ // protocols that can allow "unsafe" and "unwise" chars.
+ unsafeProtocol = {
+ 'javascript': true,
+ 'javascript:': true
+ },
+ // protocols that never have a hostname.
+ hostlessProtocol = {
+ 'javascript': true,
+ 'javascript:': true
+ },
+ // protocols that always have a path component.
+ pathedProtocol = {
+ 'http': true,
+ 'https': true,
+ 'ftp': true,
+ 'gopher': true,
+ 'file': true,
+ 'http:': true,
+ 'ftp:': true,
+ 'gopher:': true,
+ 'file:': true
+ },
+ // protocols that always contain a // bit.
+ slashedProtocol = {
+ 'http': true,
+ 'https': true,
+ 'ftp': true,
+ 'gopher': true,
+ 'file': true,
+ 'http:': true,
+ 'https:': true,
+ 'ftp:': true,
+ 'gopher:': true,
+ 'file:': true
+ },
+ querystring = require('url_handler/node_querystring');
+
+function urlParse(url, parseQueryString, slashesDenoteHost) {
+ if (url && typeof(url) === 'object' && url.href) return url;
+
+ if (typeof url !== 'string') {
+ throw new TypeError("Parameter 'url' must be a string, not " + typeof url);
+ }
+
+ var out = {},
+ rest = url;
+ out.href = "";
+ // cut off any delimiters.
+ // This is to support parse stuff like "<http://foo.com>"
+ for (var i = 0, l = rest.length; i < l; i++) {
+ if (delims.indexOf(rest.charAt(i)) === -1) break;
+ }
+ if (i !== 0) rest = rest.substr(i);
+
+
+ var proto = protocolPattern.exec(rest);
+ if (proto) {
+ proto = proto[0];
+ var lowerProto = proto.toLowerCase();
+ out.protocol = lowerProto;
+ rest = rest.substr(proto.length);
+ }
+
+ // figure out if it's got a host
+ // user@server is *always* interpreted as a hostname, and url
+ // resolution will treat //foo/bar as host=foo,path=bar because that's
+ // how the browser resolves relative URLs.
+ if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) {
+ var slashes = rest.substr(0, 2) === '//';
+ if (slashes && !(proto && hostlessProtocol[proto])) {
+ rest = rest.substr(2);
+ out.slashes = true;
+ }
+ }
+
+ if (!hostlessProtocol[proto] &&
+ (slashes || (proto && !slashedProtocol[proto]))) {
+ // there's a hostname.
+ // the first instance of /, ?, ;, or # ends the host.
+ // don't enforce full RFC correctness, just be unstupid about it.
+
+ // If there is an @ in the hostname, then non-host chars *are* allowed
+ // to the left of the first @ sign, unless some non-auth character
+ // comes *before* the @-sign.
+ // URLs are obnoxious.
+ var atSign = rest.indexOf('@');
+ if (atSign !== -1) {
+ // there *may be* an auth
+ var hasAuth = true;
+ for (var i = 0, l = nonAuthChars.length; i < l; i++) {
+ var index = rest.indexOf(nonAuthChars[i]);
+ if (index !== -1 && index < atSign) {
+ // not a valid auth. Something like http://foo.com/bar@baz/
+ hasAuth = false;
+ break;
+ }
+ }
+ if (hasAuth) {
+ // pluck off the auth portion.
+ out.auth = rest.substr(0, atSign);
+ rest = rest.substr(atSign + 1);
+ }
+ }
+
+ var firstNonHost = -1;
+ for (var i = 0, l = nonHostChars.length; i < l; i++) {
+ var index = rest.indexOf(nonHostChars[i]);
+ if (index !== -1 &&
+ (firstNonHost < 0 || index < firstNonHost)) firstNonHost = index;
+ }
+
+ if (firstNonHost !== -1) {
+ out.host = rest.substr(0, firstNonHost);
+ rest = rest.substr(firstNonHost);
+ } else {
+ out.host = rest;
+ rest = '';
+ }
+
+ // pull out port.
+ var p = parseHost(out.host);
+ var keys = Object.keys(p);
+ for (var i = 0, l = keys.length; i < l; i++) {
+ var key = keys[i];
+ out[key] = p[key];
+ }
+
+ // we've indicated that there is a hostname,
+ // so even if it's empty, it has to be present.
+ out.hostname = out.hostname || '';
+
+ // validate a little.
+ if (out.hostname.length > hostnameMaxLen) {
+ out.hostname = '';
+ } else {
+ var hostparts = out.hostname.split(/\./);
+ for (var i = 0, l = hostparts.length; i < l; i++) {
+ var part = hostparts[i];
+ if (!part) continue;
+ if (!part.match(hostnamePartPattern)) {
+ var newpart = '';
+ for (var j = 0, k = part.length; j < k; j++) {
+ if (part.charCodeAt(j) > 127) {
+ // we replace non-ASCII char with a temporary placeholder
+ // we need this to make sure size of hostname is not
+ // broken by replacing non-ASCII by nothing
+ newpart += 'x';
+ } else {
+ newpart += part[j];
+ }
+ }
+ // we test again with ASCII char only
+ if (!newpart.match(hostnamePartPattern)) {
+ var validParts = hostparts.slice(0, i);
+ var notHost = hostparts.slice(i + 1);
+ var bit = part.match(hostnamePartStart);
+ if (bit) {
+ validParts.push(bit[1]);
+ notHost.unshift(bit[2]);
+ }
+ if (notHost.length) {
+ rest = '/' + notHost.join('.') + rest;
+ }
+ out.hostname = validParts.join('.');
+ break;
+ }
+ }
+ }
+ }
+
+ // hostnames are always lower case.
+ out.hostname = out.hostname.toLowerCase();
+
+ // IDNA Support: Returns a puny coded representation of "domain".
+ // It only converts the part of the domain name that
+ // has non ASCII characters. I.e. it dosent matter if
+ // you call it with a domain that already is in ASCII.
+ var domainArray = out.hostname.split('.');
+ var newOut = [];
+ for (var i = 0; i < domainArray.length; ++i) {
+ var s = domainArray[i];
+ newOut.push(s.match(/[^A-Za-z0-9_-]/) ?
+ 'xn--' + punycode.encode(s) : s);
+ }
+ out.hostname = newOut.join('.');
+
+ out.host = (out.hostname || '') +
+ ((out.port) ? ':' + out.port : '');
+ out.href += out.host;
+ }
+
+ // now rest is set to the post-host stuff.
+ // chop off any delim chars.
+ if (!unsafeProtocol[lowerProto]) {
+
+ // First, make 100% sure that any "autoEscape" chars get
+ // escaped, even if encodeURIComponent doesn't think they
+ // need to be.
+ for (var i = 0, l = autoEscape.length; i < l; i++) {
+ var ae = autoEscape[i];
+ var esc = encodeURIComponent(ae);
+ if (esc === ae) {
+ esc = escape(ae);
+ }
+ rest = rest.split(ae).join(esc);
+ }
+
+ // Now make sure that delims never appear in a url.
+ var chop = rest.length;
+ for (var i = 0, l = delims.length; i < l; i++) {
+ var c = rest.indexOf(delims[i]);
+ if (c !== -1) {
+ chop = Math.min(c, chop);
+ }
+ }
+ rest = rest.substr(0, chop);
+ }
+
+
+ // chop off from the tail first.
+ var hash = rest.indexOf('#');
+ if (hash !== -1) {
+ // got a fragment string.
+ out.hash = rest.substr(hash);
+ rest = rest.slice(0, hash);
+ }
+ var qm = rest.indexOf('?');
+ if (qm !== -1) {
+ out.search = rest.substr(qm);
+ out.query = rest.substr(qm + 1);
+ if (parseQueryString) {
+ out.query = querystring.parse(out.query);
+ }
+ rest = rest.slice(0, qm);
+ } else if (parseQueryString) {
+ // no query string, but parseQueryString still requested
+ out.search = '';
+ out.query = {};
+ }
+ if (rest) out.pathname = rest;
+ if (slashedProtocol[proto] &&
+ out.hostname && !out.pathname) {
+ out.pathname = '/';
+ }
+
+ //to support http.request
+ if (out.pathname || out.search) {
+ out.path = (out.pathname ? out.pathname : '') +
+ (out.search ? out.search : '');
+ }
+
+ // finally, reconstruct the href based on what has been validated.
+ out.href = urlFormat(out);
+ return out;
+}
+
+// format a parsed object into a url string
+function urlFormat(obj) {
+ // ensure it's an object, and not a string url.
+ // If it's an obj, this is a no-op.
+ // this way, you can call url_format() on strings
+ // to clean up potentially wonky urls.
+ if (typeof(obj) === 'string') obj = urlParse(obj);
+
+ var auth = obj.auth || '';
+ if (auth) {
+ auth = auth.split('@').join('%40');
+ for (var i = 0, l = nonAuthChars.length; i < l; i++) {
+ var nAC = nonAuthChars[i];
+ auth = auth.split(nAC).join(encodeURIComponent(nAC));
+ }
+ auth += '@';
+ }
+
+ var protocol = obj.protocol || '',
+ host = (obj.host !== undefined) ? auth + obj.host :
+ obj.hostname !== undefined ? (
+ auth + obj.hostname +
+ (obj.port ? ':' + obj.port : '')
+ ) :
+ false,
+ pathname = obj.pathname || '',
+ query = obj.query &&
+ ((typeof obj.query === 'object' &&
+ Object.keys(obj.query).length) ?
+ querystring.stringify(obj.query) :
+ '') || '',
+ search = obj.search || (query && ('?' + query)) || '',
+ hash = obj.hash || '';
+
+ if (protocol && protocol.substr(-1) !== ':') protocol += ':';
+
+ // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.
+ // unless they had them to begin with.
+ if (obj.slashes ||
+ (!protocol || slashedProtocol[protocol]) && host !== false) {
+ host = '//' + (host || '');
+ if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;
+ } else if (!host) {
+ host = '';
+ }
+
+ if (hash && hash.charAt(0) !== '#') hash = '#' + hash;
+ if (search && search.charAt(0) !== '?') search = '?' + search;
+
+ return protocol + host + pathname + search + hash;
+}
+
+function urlResolve(source, relative) {
+ return urlFormat(urlResolveObject(source, relative));
+}
+
+function urlResolveObject(source, relative) {
+ if (!source) return relative;
+
+ source = urlParse(urlFormat(source), false, true);
+ relative = urlParse(urlFormat(relative), false, true);
+
+ // hash is always overridden, no matter what.
+ source.hash = relative.hash;
+
+ if (relative.href === '') {
+ source.href = urlFormat(source);
+ return source;
+ }
+
+ // hrefs like //foo/bar always cut to the protocol.
+ if (relative.slashes && !relative.protocol) {
+ relative.protocol = source.protocol;
+ //urlParse appends trailing / to urls like http://www.example.com
+ if (slashedProtocol[relative.protocol] &&
+ relative.hostname && !relative.pathname) {
+ relative.path = relative.pathname = '/';
+ }
+ relative.href = urlFormat(relative);
+ return relative;
+ }
+
+ if (relative.protocol && relative.protocol !== source.protocol) {
+ // if it's a known url protocol, then changing
+ // the protocol does weird things
+ // first, if it's not file:, then we MUST have a host,
+ // and if there was a path
+ // to begin with, then we MUST have a path.
+ // if it is file:, then the host is dropped,
+ // because that's known to be hostless.
+ // anything else is assumed to be absolute.
+ if (!slashedProtocol[relative.protocol]) {
+ relative.href = urlFormat(relative);
+ return relative;
+ }
+ source.protocol = relative.protocol;
+ if (!relative.host && !hostlessProtocol[relative.protocol]) {
+ var relPath = (relative.pathname || '').split('/');
+ while (relPath.length && !(relative.host = relPath.shift()));
+ if (!relative.host) relative.host = '';
+ if (!relative.hostname) relative.hostname = '';
+ if (relPath[0] !== '') relPath.unshift('');
+ if (relPath.length < 2) relPath.unshift('');
+ relative.pathname = relPath.join('/');
+ }
+ source.pathname = relative.pathname;
+ source.search = relative.search;
+ source.query = relative.query;
+ source.host = relative.host || '';
+ source.auth = relative.auth;
+ source.hostname = relative.hostname || relative.host;
+ source.port = relative.port;
+ //to support http.request
+ if (source.pathname !== undefined || source.search !== undefined) {
+ source.path = (source.pathname ? source.pathname : '') +
+ (source.search ? source.search : '');
+ }
+ source.slashes = source.slashes || relative.slashes;
+ source.href = urlFormat(source);
+ return source;
+ }
+
+ var isSourceAbs = (source.pathname && source.pathname.charAt(0) === '/'),
+ isRelAbs = (
+ relative.host !== undefined ||
+ relative.pathname && relative.pathname.charAt(0) === '/'
+ ),
+ mustEndAbs = (isRelAbs || isSourceAbs ||
+ (source.host && relative.pathname)),
+ removeAllDots = mustEndAbs,
+ srcPath = source.pathname && source.pathname.split('/') || [],
+ relPath = relative.pathname && relative.pathname.split('/') || [],
+ psychotic = source.protocol &&
+ !slashedProtocol[source.protocol];
+
+ // if the url is a non-slashed url, then relative
+ // links like ../.. should be able
+ // to crawl up to the hostname, as well. This is strange.
+ // source.protocol has already been set by now.
+ // Later on, put the first path part into the host field.
+ if (psychotic) {
+
+ delete source.hostname;
+ delete source.port;
+ if (source.host) {
+ if (srcPath[0] === '') srcPath[0] = source.host;
+ else srcPath.unshift(source.host);
+ }
+ delete source.host;
+ if (relative.protocol) {
+ delete relative.hostname;
+ delete relative.port;
+ if (relative.host) {
+ if (relPath[0] === '') relPath[0] = relative.host;
+ else relPath.unshift(relative.host);
+ }
+ delete relative.host;
+ }
+ mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');
+ }
+
+ if (isRelAbs) {
+ // it's absolute.
+ source.host = (relative.host || relative.host === '') ?
+ relative.host : source.host;
+ source.hostname = (relative.hostname || relative.hostname === '') ?
+ relative.hostname : source.hostname;
+ source.search = relative.search;
+ source.query = relative.query;
+ srcPath = relPath;
+ // fall through to the dot-handling below.
+ } else if (relPath.length) {
+ // it's relative
+ // throw away the existing file, and take the new path instead.
+ if (!srcPath) srcPath = [];
+ srcPath.pop();
+ srcPath = srcPath.concat(relPath);
+ source.search = relative.search;
+ source.query = relative.query;
+ } else if ('search' in relative) {
+ // just pull out the search.
+ // like href='?foo'.
+ // Put this after the other two cases because it simplifies the booleans
+ if (psychotic) {
+ source.hostname = source.host = srcPath.shift();
+ //occationaly the auth can get stuck only in host
+ //this especialy happens in cases like
+ //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
+ var authInHost = source.host && source.host.indexOf('@') > 0 ?
+ source.host.split('@') : false;
+ if (authInHost) {
+ source.auth = authInHost.shift();
+ source.host = source.hostname = authInHost.shift();
+ }
+ }
+ source.search = relative.search;
+ source.query = relative.query;
+ //to support http.request
+ if (source.pathname !== undefined || source.search !== undefined) {
+ source.path = (source.pathname ? source.pathname : '') +
+ (source.search ? source.search : '');
+ }
+ source.href = urlFormat(source);
+ return source;
+ }
+ if (!srcPath.length) {
+ // no path at all. easy.
+ // we've already handled the other stuff above.
+ delete source.pathname;
+ //to support http.request
+ if (!source.search) {
+ source.path = '/' + source.search;
+ } else {
+ delete source.path;
+ }
+ source.href = urlFormat(source);
+ return source;
+ }
+ // if a url ENDs in . or .., then it must get a trailing slash.
+ // however, if it ends in anything else non-slashy,
+ // then it must NOT get a trailing slash.
+ var last = srcPath.slice(-1)[0];
+ var hasTrailingSlash = (
+ (source.host || relative.host) && (last === '.' || last === '..') ||
+ last === '');
+
+ // strip single dots, resolve double dots to parent dir
+ // if the path tries to go above the root, `up` ends up > 0
+ var up = 0;
+ for (var i = srcPath.length; i >= 0; i--) {
+ last = srcPath[i];
+ if (last == '.') {
+ srcPath.splice(i, 1);
+ } else if (last === '..') {
+ srcPath.splice(i, 1);
+ up++;
+ } else if (up) {
+ srcPath.splice(i, 1);
+ up--;
+ }
+ }
+
+ // if the path is allowed to go above the root, restore leading ..s
+ if (!mustEndAbs && !removeAllDots) {
+ for (; up--; up) {
+ srcPath.unshift('..');
+ }
+ }
+
+ if (mustEndAbs && srcPath[0] !== '' &&
+ (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {
+ srcPath.unshift('');
+ }
+
+ if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {
+ srcPath.push('');
+ }
+
+ var isAbsolute = srcPath[0] === '' ||
+ (srcPath[0] && srcPath[0].charAt(0) === '/');
+
+ // put the host back
+ if (psychotic) {
+ source.hostname = source.host = isAbsolute ? '' :
+ srcPath.length ? srcPath.shift() : '';
+ //occationaly the auth can get stuck only in host
+ //this especialy happens in cases like
+ //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
+ var authInHost = source.host && source.host.indexOf('@') > 0 ?
+ source.host.split('@') : false;
+ if (authInHost) {
+ source.auth = authInHost.shift();
+ source.host = source.hostname = authInHost.shift();
+ }
+ }
+
+ mustEndAbs = mustEndAbs || (source.host && srcPath.length);
+
+ if (mustEndAbs && !isAbsolute) {
+ srcPath.unshift('');
+ }
+
+ source.pathname = srcPath.join('/');
+ //to support request.http
+ if (source.pathname !== undefined || source.search !== undefined) {
+ source.path = (source.pathname ? source.pathname : '') +
+ (source.search ? source.search : '');
+ }
+ source.auth = relative.auth || source.auth;
+ source.slashes = source.slashes || relative.slashes;
+ source.href = urlFormat(source);
+ return source;
+}
+
+function parseHost(host) {
+ var out = {};
+ var port = portPattern.exec(host);
+ if (port) {
+ port = port[0];
+ out.port = port.substr(1);
+ host = host.substr(0, host.length - port.length);
+ }
+ if (host) out.hostname = host;
+ return out;
+} \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/url_handler.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/url_handler.js
new file mode 100644
index 0000000..41ec82e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/url_handler.js
@@ -0,0 +1,120 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * url_handler
+ * A module using the url tool from Node.js to perform operations on
+ * urls at various spots (tabs, caching, ...) in the add-on.
+ *
+ */
+
+// node.js url module. Makes it easier to resole
+// urls in that datauri loaded dom
+var nodeJsUrl = require("url_handler/node_url");
+
+var urlUtils = {
+
+ getFragment: function (url) {
+ var parse = nodeJsUrl.parse(url);
+ if (parse.hash !== undefined) {
+ return(parse.hash);
+ }
+ },
+
+ removeFragment: function (url) {
+ var parse = nodeJsUrl.parse(url);
+ if (parse.hash !== undefined) {
+ // Amazon track package bug fix.
+ // when url has query string and fragment
+ // the add-on wouldn't remove cache entry
+ // properly.
+ delete parse.hash;
+ }
+ return nodeJsUrl.format(parse);
+ },
+
+ addFragment: function (url, query) {
+ var parse = nodeJsUrl.parse(url);
+
+ // replace hash if it exists.
+ parse.hash = '#' + query;
+
+ return nodeJsUrl.format(parse);
+ },
+
+ addQuery: function (url, query) {
+ var parse = nodeJsUrl.parse(url);
+ console.debug('my parse search', parse.search);
+ if (parse.search === undefined) {
+ parse.search = '?' + query;
+ } else {
+ parse.search = parse.search + '&' + query;
+ console.debug('parse search is now' + parse.search);
+ }
+ return nodeJsUrl.format(parse);
+ },
+
+ getHostname: function (url) {
+ return nodeJsUrl.parse(url).hostname;
+ },
+
+ /**
+ * remove www from hostname.
+ */
+ removeWWW: function (str) {
+ if (str !== undefined) {
+ return str.replace("www.", "", 'i');
+ }
+ return "";
+ },
+
+ /**
+ *
+ * haveSameHostname
+ * Compare that two urls have the same hostname.
+ *
+ */
+ haveSameHostname: function (url1, url2) {
+
+ try {
+
+ var host1 = this.removeWWW(this.getHostname(url1)).toLowerCase();
+ var host2 = this.removeWWW(this.getHostname(url2)).toLowerCase();
+ return host1 === host2;
+
+ } catch (x) {
+
+ console.debug('error with url_handler', x, x.fileName, x.lineNumber);
+
+ }
+ }
+};
+
+exports.parse = nodeJsUrl.parse;
+exports.resolve = nodeJsUrl.resolve;
+exports.resolveObject = nodeJsUrl.resolveObject;
+exports.format = nodeJsUrl.format;
+exports.removeFragment = urlUtils.removeFragment;
+exports.addQuery = urlUtils.addQuery;
+exports.getFragment = urlUtils.getFragment;
+exports.addFragment = urlUtils.addFragment;
+exports.getHostname = urlUtils.getHostname;
+exports.haveSameHostname = urlUtils.haveSameHostname;
+exports.removeWWW = urlUtils.removeWWW;
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/menuitems/lib/menuitems.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/menuitems/lib/menuitems.js
new file mode 100644
index 0000000..075d690
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/menuitems/lib/menuitems.js
@@ -0,0 +1,195 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+const windowUtils = require("sdk/deprecated/window-utils");
+const { Class } = require("sdk/core/heritage");
+const { validateOptions } = require("sdk/deprecated/api-utils");
+const { on, emit, once, off } = require("sdk/event/core");
+const { isBrowser } = require("sdk/window/utils");
+const { EventTarget } = require('sdk/event/target');
+const { unload } = require("unload+");
+
+const menuitemNS = require("sdk/core/namespace").ns();
+const NS_XUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
+
+function MenuitemOptions(options) {
+ return validateOptions(options, {
+ id: { is: ['string'] },
+ menuid: { is: ['undefined', 'string'] },
+ insertbefore: { is: ['undefined', 'string', 'object'] },
+ label: { is: ["string"] },
+ disabled: { is: ["undefined", "boolean"], map: function(v) !!v},
+ accesskey: { is: ["undefined", "string"] },
+ key: { is: ["undefined", "string"] },
+ checked: { is: ['undefined', 'boolean'] },
+ className: { is: ["undefined", "string"] },
+ onCommand: { is: ['undefined', 'function'] }
+ });
+}
+
+let Menuitem = Class({
+ extends: EventTarget,
+ initialize: function(options) {
+ options = menuitemNS(this).options = MenuitemOptions(options);
+ EventTarget.prototype.initialize.call(this, options);
+
+ menuitemNS(this).destroyed = false;
+ menuitemNS(this).unloaders = [];
+ menuitemNS(this).menuitems = addMenuitems(this, options).menuitems;
+ },
+ get id() menuitemNS(this).options.id,
+ get label() menuitemNS(this).options.label,
+ set label(val) updateProperty(this, 'label', val),
+ get checked() menuitemNS(this).options.checked,
+ set checked(val) updateProperty(this, 'checked', !!val),
+ get disabled() menuitemNS(this).options.disabled,
+ set disabled(val) updateProperty(this, 'disabled', !!val),
+ get key() menuitemNS(this).options.key,
+ set key(val) updateProperty(this, 'key', val),
+ clone: function (overwrites) {
+ let opts = Object.clone(menuitemNS(this).options);
+ for (let key in overwrites) {
+ opts[key] = ovrewrites[key];
+ }
+ return Menuitem(opts);
+ },
+ get menuid() menuitemNS(this).options.menuid,
+ set menuid(val) {
+ let options = menuitemNS(this).options;
+ options.menuid = val;
+
+ forEachMI(function(menuitem, i, $) {
+ updateMenuitemParent(menuitem, options, $);
+ });
+ },
+ destroy: function() {
+ if (!menuitemNS(this).destroyed) {
+ menuitemNS(this).destroyed = true;
+ menuitemNS(this).unloaders.forEach(function(u) u());
+ menuitemNS(this).unloaders = null;
+ menuitemNS(this).menuitems = null;
+ }
+ return true;
+ }
+});
+
+function addMenuitems(self, options) {
+ let menuitems = [];
+
+ // setup window tracker
+ windowUtils.WindowTracker({
+ onTrack: function (window) {
+ if (!isBrowser(window) || menuitemNS(self).destroyed) return;
+
+ // add the new menuitem to a menu
+ var menuitem = updateMenuitemAttributes(
+ window.document.createElementNS(NS_XUL, "menuitem"), options);
+ var menuitems_i = menuitems.push(menuitem) - 1;
+
+ // add the menutiem to the ui
+ updateMenuitemParent(menuitem, options, function(id) window.document.getElementById(id));
+
+ menuitem.addEventListener("command", function() {
+ if (!self.disabled)
+ emit(self, 'command');
+ }, true);
+
+ // add unloader
+ let unloader = function unloader() {
+ menuitem.parentNode && menuitem.parentNode.removeChild(menuitem);
+ menuitems[menuitems_i] = null;
+ };
+ menuitemNS(self).unloaders.push(function() {
+ remover();
+ unloader();
+ });
+ let remover = unload(unloader, window);
+ }
+ });
+ return {menuitems: menuitems};
+}
+
+function updateMenuitemParent(menuitem, options, $) {
+ // add the menutiem to the ui
+ if (Array.isArray(options.menuid)) {
+ let ids = options.menuid;
+ for (var len = ids.length, i = 0; i < len; i++) {
+ if (tryParent($(ids[i]), menuitem, options.insertbefore))
+ return true;
+ }
+ }
+ else {
+ return tryParent($(options.menuid), menuitem, options.insertbefore);
+ }
+ return false;
+}
+
+function updateMenuitemAttributes(menuitem, options) {
+ menuitem.setAttribute("id", options.id);
+ menuitem.setAttribute("label", options.label);
+
+ if (options.accesskey)
+ menuitem.setAttribute("accesskey", options.accesskey);
+
+ if (options.key)
+ menuitem.setAttribute("key", options.key);
+
+ menuitem.setAttribute("disabled", !!options.disabled);
+
+ if (options.image) {
+ menuitem.classList.add("menuitem-iconic");
+ menuitem.style.listStyleImage = "url('" + options.image + "')";
+ }
+
+ if (options.checked)
+ menuitem.setAttribute('checked', options.checked);
+
+ if (options.className)
+ options.className.split(/\s+/).forEach(function(name) menuitem.classList.add(name));
+
+ return menuitem;
+}
+
+function updateProperty(menuitem, key, val) {
+ menuitemNS(menuitem).options[key] = val;
+
+ forEachMI(function(menuitem) {
+ menuitem.setAttribute(key, val);
+ }, menuitem);
+ return val;
+}
+
+function forEachMI(callback, menuitem) {
+ menuitemNS(menuitem).menuitems.forEach(function(mi, i) {
+ if (!mi) return;
+ callback(mi, i, function(id) mi.ownerDocument.getElementById(id));
+ });
+}
+
+function tryParent(parent, menuitem, before) {
+ if (parent) parent.insertBefore(menuitem, insertBefore(parent, before));
+ return !!parent;
+}
+
+function insertBefore(parent, insertBefore) {
+ if (typeof insertBefore == "number") {
+ switch (insertBefore) {
+ case MenuitemExport.FIRST_CHILD:
+ return parent.firstChild;
+ }
+ return null;
+ }
+ else if (typeof insertBefore == "string") {
+ return parent.querySelector("#" + insertBefore);
+ }
+ return insertBefore;
+}
+
+function MenuitemExport(options) {
+ return Menuitem(options);
+}
+MenuitemExport.FIRST_CHILD = 1;
+
+exports.Menuitem = MenuitemExport;
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/notification-box/lib/notification-box.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/notification-box/lib/notification-box.js
new file mode 100644
index 0000000..94b26cd
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/notification-box/lib/notification-box.js
@@ -0,0 +1,129 @@
+/*
+ * Copyrights Loic J. Duros 2012
+ * lduros@member.fsf.org
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const { Cc, Ci } = require("chrome");
+const { getMostRecentBrowserWindow } = require('sdk/window/utils');
+/* I haven't found this sort of validation functions in the SDK,
+except for the deprecated api-utils module. */
+let isString = function (str) {
+ return typeof(str) == 'string' || str instanceof String;
+};
+
+let isArray = function (obj) {
+ return Object.prototype.toString.call(obj) === '[object Array]';
+};
+
+exports.NotificationBox = function (options) {
+ options = options || {};
+ let mainWindow = getWindow();
+ let nb = mainWindow.gBrowser.getNotificationBox();
+ let notification, priority, label, image, value, buttons = [];
+
+ if (options.value && isString(options.value)) {
+ notification = nb.getNotificationWithValue(options.value);
+ value = options.value;
+ }
+ else {
+ notification = nb.getNotificationWithValue('');
+ value = '';
+ }
+
+ // Add label or create empty notification.
+ if (options.label && isString(options.label))
+ label = options.label;
+ else
+ label = "";
+
+ // Set priority of the notification (from info low, to critical
+ // block.
+ if (options.priority && options.priority in PRIORITY)
+ priority = nb[PRIORITY[options.priority]];
+ else
+ priority = nb[PRIORITY.INFO_LOW];
+
+ // Set a custom icon for the notification or use the regular info
+ // icon.
+ if (options.image && isString(options.image))
+ image = options.image;
+ else
+ image = 'chrome://browser/skin/Info.png';
+
+ // Add buttons.
+ if (isArray(options.buttons)) {
+ for (let i = 0, length = options.buttons.length; i < length; i++) {
+ buttons.push(NotificationButton(options.buttons[i]));
+ }
+ }
+ else if (typeof(options.buttons) === 'object') {
+ // If it's not an array of buttons, then it should be a single button.
+ buttons.push(NotificationButton(options.buttons));
+ }
+ else {
+ buttons = null;
+ }
+
+ // add new notification to notificationbox.
+ nb.appendNotification(label, value,
+ image,
+ priority, buttons);
+
+ return {'notificationbox': nb, 'notification': notification};
+};
+
+
+
+var NotificationButton = function (options) {
+
+ options = options || {};
+ let accessKey, onClick, label, popup;
+
+ if (options.accessKey)
+ accessKey = options.accessKey;
+ else
+ accessKey = '';
+
+ if (options.onClick)
+ onClick = options.onClick;
+ else
+ onClick = function () {};
+
+ if (options.label)
+ label = options.label;
+ else
+ label = "";
+
+ // no popup for now... maybe we can use a panel later.
+ popup = null;
+
+ return {label: label,
+ accessKey: accessKey,
+ callback: onClick,
+ popup: popup};
+
+};
+
+const PRIORITY = {
+ 'INFO_LOW': 'PRIORITY_INFO_LOW',
+ 'INFO_MEDIUM': 'PRIORITY_INFO_MEDIUM',
+ 'INFO_HIGH': 'PRIORITY_INFO_HIGH',
+ 'WARNING_LOW': 'PRIORITY_WARNING_LOW',
+ 'WARNING_MEDIUM': 'PRIORITY_WARNING_MEDIUM',
+ 'WARNING_HIGH': 'PRIORITY_WARNING_HIGH',
+ 'CRITICAL_LOW': 'PRIORITY_CRITICAL_LOW',
+ 'CRITICAL_MEDIUM': 'PRIORITY_CRITICAL_MEDIUM',
+ 'CRITICAL_HIGH': 'PRIORITY_CRITICAL_HIGH',
+ 'CRITICAL_BLOCK': 'PRIORITY_CRITICAL_BLOCK'
+};
+
+let getWindow = function () {
+ return getMostRecentBrowserWindow();
+};
+
+exports.PRIORITY = PRIORITY;
+
diff --git a/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/vold-utils/lib/unload+.js b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/vold-utils/lib/unload+.js
new file mode 100644
index 0000000..285fd46
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/vold-utils/lib/unload+.js
@@ -0,0 +1,80 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+const { Class } = require("sdk/core/heritage");
+const unloadNS = require("sdk/core/namespace").ns();
+
+var Unloader = exports.Unloader = Class({
+ initialize: function Unloader() {
+ let unloaders = unloadNS(this).unloaders = [];
+
+ let unloadersUnlaod = unloadNS(this).unloadersUnlaod = function() {
+ unloaders.slice().forEach(function(u) u());
+ unloaders.length = 0;
+ }
+
+ require("sdk/system/unload").when(unloadersUnlaod);
+ },
+ unload: function unload(callback, container) {
+ // Calling with no arguments runs all the unloader callbacks
+ if (callback == null) {
+ unloadNS(this).unloadersUnlaod();
+ return null;
+ }
+
+ var remover = removeUnloader.bind(null, unloader, unloadNS(this).unloaders);
+
+ // The callback is bound to the lifetime of the container if we have one
+ if (container != null) {
+ // Remove the unloader when the container unloads
+ container.addEventListener("unload", remover, false);
+
+ // Wrap the callback to additionally remove the unload listener
+ let origCallback = callback;
+ callback = function() {
+ container.removeEventListener("unload", remover, false);
+ origCallback();
+ }
+ }
+
+ // Wrap the callback in a function that ignores failures
+ function unloader() {
+ try {
+ callback();
+ }
+ catch(e) {
+ console.error(e);
+ }
+ }
+ unloadNS(this).unloaders.push(unloader);
+
+ // Provide a way to remove the unloader
+ return remover;
+ }
+});
+
+function removeUnloader(unloader, unloaders) {
+ let index = unloaders.indexOf(unloader);
+ if (index != -1)
+ unloaders.splice(index, 1);
+}
+
+/**
+ * Save callbacks to run when unloading. Optionally scope the callback to a
+ * container, e.g., window. Provide a way to run all the callbacks.
+ *
+ * @usage unload(): Run all callbacks and release them.
+ *
+ * @usage unload(callback): Add a callback to run on unload.
+ * @param [function] callback: 0-parameter function to call on unload.
+ * @return [function]: A 0-parameter function that undoes adding the callback.
+ *
+ * @usage unload(callback, container) Add a scoped callback to run on unload.
+ * @param [function] callback: 0-parameter function to call on unload.
+ * @param [node] container: Remove the callback when this container unloads.
+ * @return [function]: A 0-parameter function that undoes adding the callback.
+ */
+const gUnload = Unloader();
+exports.unload = gUnload.unload.bind(gUnload);
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/bootstrap.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/bootstrap.js
new file mode 100644
index 0000000..09530b9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/bootstrap.js
@@ -0,0 +1,169 @@
+/*
+ * This file is part of the Adblock Plus build tools,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cr = Components.results;
+const Cu = Components.utils;
+
+let {Services, atob, btoa, File, TextDecoder, TextEncoder} = Cu.import("resource://gre/modules/Services.jsm", null);
+let XMLHttpRequest = Components.Constructor("@mozilla.org/xmlextras/xmlhttprequest;1", "nsIXMLHttpRequest");
+
+let addonData = null;
+
+function startup(params, reason)
+{
+ addonData = params;
+ Services.obs.addObserver(RequireObserver, "adblockplus-require", true);
+ onShutdown.add(function() Services.obs.removeObserver(RequireObserver, "adblockplus-require"));
+
+ require("main");
+}
+
+function shutdown(params, reason)
+{
+ let windowNames = ["abp:subscriptionSelection", "abp:composer", "abp:filters"];
+ for (let i = 0; i < windowNames.length; i++)
+ {
+ let enumerator = Services.wm.getEnumerator(windowNames[i]);
+ while (enumerator.hasMoreElements())
+ {
+ let window = enumerator.getNext().QueryInterface(Ci.nsIDOMWindow);
+ window.setTimeout("window.close()", 0); // Closing immediately might not work due to modal windows
+ try
+ {
+ window.close();
+ } catch(e) {}
+ }
+ }
+ onShutdown.done = true;
+ for (let i = shutdownHandlers.length - 1; i >= 0; i --)
+ {
+ try
+ {
+ shutdownHandlers[i]();
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ }
+ }
+ shutdownHandlers = null;
+
+ // Make sure to release our ties to the modules even if the sandbox cannot be
+ // released for some reason.
+ for (let key in require.scopes)
+ {
+ let scope = require.scopes[key];
+ let list = Object.keys(scope);
+ for (let i = 0; i < list.length; i++)
+ scope[list[i]] = null;
+ }
+ require.scopes = null;
+ addonData = null;
+}
+
+function install(params, reason) {}
+
+function uninstall(params, reason)
+{
+ const ADDON_UNINSTALL = 6; // https://developer.mozilla.org/en/Extensions/Bootstrapped_extensions#Reason_constants
+ if (reason == ADDON_UNINSTALL)
+ {
+ // Users often uninstall/reinstall extension to "fix" issues. Clear current
+ // version number on uninstall to rerun first-run actions in this scenario.
+ Services.prefs.clearUserPref("extensions.adblockplus.currentVersion");
+ }
+}
+let shutdownHandlers = [];
+let onShutdown =
+{
+ done: false,
+ add: function(handler)
+ {
+ if (shutdownHandlers.indexOf(handler) < 0)
+ shutdownHandlers.push(handler);
+ },
+ remove: function(handler)
+ {
+ let index = shutdownHandlers.indexOf(handler);
+ if (index >= 0)
+ shutdownHandlers.splice(index, 1);
+ }
+};
+
+function require(module)
+{
+ let scopes = require.scopes;
+ if (!(module in scopes))
+ {
+ if (module == "info")
+ {
+ let applications = {"{a23983c0-fd0e-11dc-95ff-0800200c9a66}": "fennec", "toolkit@mozilla.org": "toolkit", "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}": "firefox", "dlm@emusic.com": "emusic", "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}": "seamonkey", "{aa3c5121-dab2-40e2-81ca-7ea25febc110}": "fennec2", "{a79fe89b-6662-4ff4-8e88-09950ad4dfde}": "conkeror", "{aa5ca914-c309-495d-91cf-3141bbb04115}": "midbrowser", "songbird@songbirdnest.com": "songbird", "prism@developer.mozilla.org": "prism", "{3550f703-e582-4d05-9a08-453d09bdfdc6}": "thunderbird"};
+ let appInfo = Services.appinfo;
+
+ scopes[module] = {};
+ scopes[module].exports =
+ {
+ addonID: addonData.id,
+ addonVersion: addonData.version,
+ addonRoot: addonData.resourceURI.spec,
+ addonName: "adblockplus",
+ application: (appInfo.ID in applications ? applications[appInfo.ID] : "other"),
+ applicationVersion: appInfo.version,
+ platform: "gecko",
+ platformVersion: appInfo.platformVersion
+ };
+ }
+ else
+ {
+ let url = addonData.resourceURI.spec + "lib/" + module + ".js";
+ scopes[module] = {
+ Cc: Cc,
+ Ci: Ci,
+ Cr: Cr,
+ Cu: Cu,
+ atob: atob,
+ btoa: btoa,
+ File: File,
+ require: require,
+
+ onShutdown: onShutdown,
+
+ XMLHttpRequest: XMLHttpRequest,
+
+ exports: {}};
+ Services.scriptloader.loadSubScript(url, scopes[module]);
+ }
+ }
+ return scopes[module].exports;
+}
+require.scopes = {__proto__: null};
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+let RequireObserver =
+{
+ observe: function(subject, topic, data)
+ {
+ if (topic == "adblockplus-require")
+ {
+ subject.wrappedJSObject.exports = require(data);
+ }
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver])
+}; \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome.manifest b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome.manifest
new file mode 100644
index 0000000..9778eda
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome.manifest
@@ -0,0 +1,58 @@
+content adblockplus chrome/content/
+skin adblockplus classic/1.0 chrome/skin/
+locale adblockplus en-US chrome/locale/en-US/
+locale adblockplus ar chrome/locale/ar/
+locale adblockplus bg chrome/locale/bg/
+locale adblockplus ca chrome/locale/ca/
+locale adblockplus cs chrome/locale/cs/
+locale adblockplus da chrome/locale/da/
+locale adblockplus de chrome/locale/de/
+locale adblockplus dsb chrome/locale/dsb/
+locale adblockplus el chrome/locale/el/
+locale adblockplus en-GB chrome/locale/en-GB/
+locale adblockplus eo chrome/locale/eo/
+locale adblockplus es-AR chrome/locale/es-AR/
+locale adblockplus es-ES chrome/locale/es-ES/
+locale adblockplus es-MX chrome/locale/es-MX/
+locale adblockplus et chrome/locale/et/
+locale adblockplus eu chrome/locale/eu/
+locale adblockplus fa chrome/locale/fa/
+locale adblockplus fi chrome/locale/fi/
+locale adblockplus fr chrome/locale/fr/
+locale adblockplus fy-NL chrome/locale/fy-NL/
+locale adblockplus gl chrome/locale/gl/
+locale adblockplus he chrome/locale/he/
+locale adblockplus hr chrome/locale/hr/
+locale adblockplus hsb chrome/locale/hsb/
+locale adblockplus hu chrome/locale/hu/
+locale adblockplus hy-AM chrome/locale/hy-AM/
+locale adblockplus id chrome/locale/id/
+locale adblockplus is chrome/locale/is/
+locale adblockplus it chrome/locale/it/
+locale adblockplus ja chrome/locale/ja/
+locale adblockplus kk chrome/locale/kk/
+locale adblockplus ko chrome/locale/ko/
+locale adblockplus lt chrome/locale/lt/
+locale adblockplus lv chrome/locale/lv/
+locale adblockplus ms chrome/locale/ms/
+locale adblockplus nb-NO chrome/locale/nb-NO/
+locale adblockplus nl chrome/locale/nl/
+locale adblockplus pl chrome/locale/pl/
+locale adblockplus pt-BR chrome/locale/pt-BR/
+locale adblockplus pt-PT chrome/locale/pt-PT/
+locale adblockplus ro chrome/locale/ro/
+locale adblockplus ru chrome/locale/ru/
+locale adblockplus sk chrome/locale/sk/
+locale adblockplus sl chrome/locale/sl/
+locale adblockplus sq chrome/locale/sq/
+locale adblockplus sr chrome/locale/sr/
+locale adblockplus sv-SE chrome/locale/sv-SE/
+locale adblockplus th chrome/locale/th/
+locale adblockplus tr chrome/locale/tr/
+locale adblockplus uk chrome/locale/uk/
+locale adblockplus vi chrome/locale/vi/
+locale adblockplus zh-CN chrome/locale/zh-CN/
+locale adblockplus zh-TW chrome/locale/zh-TW/
+
+# fennec settings
+override chrome://adblockplus/content/ui/settings.xul chrome://adblockplus/content/ui/fennecSettings.xul application={a23983c0-fd0e-11dc-95ff-0800200c9a66} application={aa3c5121-dab2-40e2-81ca-7ea25febc110}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/errors.html b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/errors.html
new file mode 100644
index 0000000..5c18929
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/errors.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <title>Adblock Plus Errors</title>
+ <style type="text/css">
+ .warning, .error
+ {
+ border: 1px dashed black;
+ margin: 5px;
+ padding: 2px;
+ white-space: pre-wrap;
+ }
+
+ .error
+ {
+ background-color: #fff0f0;
+ }
+
+ .warning
+ {
+ background-color: #ffffe0;
+ }
+
+ button
+ {
+ float: right;
+ }
+ </style>
+</head>
+<body>
+ <button onclick="window.location.reload();">Refresh</button>
+ <button onclick="clearErrors();">Clear errors</button>
+
+ <script type="application/x-javascript;version=1.7">
+ let id = null;
+ try {
+ let {addonVersion, addonID} = require("info");
+
+ let text = "You are running Adblock Plus " + addonVersion;
+ text += ".";
+ document.write("<p>" + text + "</p>");
+
+ id = addonID.replace(/[\{\}]/g, "");
+ } catch (e) {}
+
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=664695 - starting with
+ // Gecko 19 this function returns the result, before that it wrote to a
+ // parameter.
+ let outparam = {};
+ let messages = Components.classes["@mozilla.org/consoleservice;1"]
+ .getService(Components.interfaces.nsIConsoleService)
+ .getMessageArray(outparam, {});
+ messages = messages || outparam.value || [];
+ messages = messages.filter(function(message)
+ {
+ return (message instanceof Components.interfaces.nsIScriptError &&
+ !/^https?:/i.test(message.sourceName) &&
+ (/adblock/i.test(message.errorMessage) || /adblock/i.test(message.sourceName) ||
+ id && (message.errorMessage.indexOf(id) >= 0 || message.sourceName && message.sourceName.indexOf(id) >= 0)));
+ });
+
+ if (messages.length)
+ {
+ document.write("<p>Errors related to Adblock Plus:</p>");
+
+ for each (let message in messages)
+ {
+ let type = (message.flags & Components.interfaces.nsIScriptError.warningFlag ? "warning" : "error");
+ let html = "<b>" + (type == "warning" ? "Warning:" : "Error:") + "</b><br>";
+ html += encodeHTML(message.errorMessage) + "<br><br>";
+ if (message.sourceLine)
+ html += "Source line: " + encodeHTML(message.sourceLine) + "<br>";
+ if (message.sourceName)
+ html += "Location: " + encodeHTML(message.sourceName) + " line " + message.lineNumber + "<br>";
+ html = html.replace(/(<br>)+$/, "");
+ document.write("<div class='" + type + "'>" +
+ html +
+ "</div>");
+ }
+ }
+ else
+ {
+ document.write("<p>No errors found.</p>");
+ }
+
+ function require(module)
+ {
+ let {Services} = Components.utils.import("resource://gre/modules/Services.jsm");
+ let result = {};
+ result.wrappedJSObject = result;
+ Services.obs.notifyObservers(result, "adblockplus-require", module);
+ return result.exports;
+ }
+
+ function encodeHTML(string)
+ {
+ return string.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
+ }
+
+ function clearErrors()
+ {
+ Components.classes["@mozilla.org/consoleservice;1"]
+ .getService(Components.interfaces.nsIConsoleService)
+ .reset();
+ window.location.reload();
+ }
+ </script>
+</body>
+</html>
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/objtabs.css b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/objtabs.css
new file mode 100644
index 0000000..ce3a830
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/objtabs.css
@@ -0,0 +1,82 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+@namespace url("http://www.w3.org/1999/xhtml");
+
+.%%CLASSVISIBLETOP%%, .%%CLASSVISIBLEBOTTOM%%, .%%CLASSHIDDEN%%
+{
+ position: fixed !important;
+ display: block !important;
+
+ width: auto !important;
+ height: auto !important;
+ right: auto !important;
+ bottom: auto !important;
+ z-index: 65535 !important;
+ float: left !important;
+ border-color: black !important;
+ border-style: solid !important;
+ background: white !important;
+ color: black !important;
+ cursor: pointer !important;
+ white-space: nowrap !important;
+ font-family: Arial,Helvetica,Sans-Serif !important;
+ font-size: 10px !important;
+ font-style: normal !important;
+ font-variant: normal !important;
+ font-weight: normal !important;
+ letter-spacing: normal !important;
+ line-height: normal !important;
+ text-align: center !important;
+ text-decoration: none !important;
+ text-indent: 0px !important;
+ text-transform: none !important;
+ direction: ltr !important;
+ padding: 0px 5px !important;
+ -moz-binding: none !important;
+ -moz-user-focus: none !important;
+ -moz-user-input: none !important;
+ -moz-user-select: none !important;
+}
+
+.%%CLASSVISIBLETOP%%, .%%CLASSHIDDEN%%
+{
+ border-width: 1px 1px 0px 1px !important;
+ border-top-left-radius: 10px !important;
+ border-top-right-radius: 10px !important;
+ border-bottom-left-radius: 0px !important;
+ border-bottom-right-radius: 0px !important;
+}
+
+.%%CLASSVISIBLEBOTTOM%%
+{
+ border-width: 0px 1px 1px 1px !important;
+ border-top-left-radius: 0px !important;
+ border-top-right-radius: 0px !important;
+ border-bottom-left-radius: 10px !important;
+ border-bottom-right-radius: 10px !important;
+}
+
+.%%CLASSVISIBLETOP%%, .%%CLASSVISIBLEBOTTOM%%
+{
+ visibility: visible !important;
+}
+
+.%%CLASSHIDDEN%%
+{
+ visibility: hidden !important;
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/composer.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/composer.js
new file mode 100644
index 0000000..f7b8087
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/composer.js
@@ -0,0 +1,412 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+let nodes = null;
+let item = null;
+let advancedMode = false;
+
+function init()
+{
+ [nodes, item] = window.arguments;
+
+ E("filterType").value = (!item.filter || item.filter.disabled || item.filter instanceof WhitelistFilter ? "filterlist" : "whitelist");
+ E("customPattern").value = item.location;
+
+ let insertionPoint = E("customPatternBox");
+ let addSuggestion = function(address)
+ {
+ // Always drop protocol and www. from the suggestion
+ address = address.replace(/^[\w\-]+:\/+(?:www\.)?/, "");
+
+ let suggestion = document.createElement("radio");
+ suggestion.setAttribute("value", address);
+ suggestion.setAttribute("label", address);
+ suggestion.setAttribute("crop", "center");
+ suggestion.setAttribute("class", "suggestion");
+ insertionPoint.parentNode.insertBefore(suggestion, insertionPoint);
+
+ return address;
+ }
+
+ let ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
+ try
+ {
+ let suggestions = [""];
+
+ let url = ioService.newURI(item.location, null, null)
+ .QueryInterface(Ci.nsIURL);
+ let suffix = (url.query ? "?*" : "");
+ url.query = "";
+ url.ref = "";
+ suggestions[1] = addSuggestion(url.spec + suffix);
+
+ let parentURL = ioService.newURI(url.fileName == "" ? ".." : ".", null, url);
+ if (!parentURL.equals(url))
+ suggestions[2] = addSuggestion(parentURL.spec + "*");
+ else
+ suggestions[2] = suggestions[1];
+
+ let rootURL = ioService.newURI("/", null, url);
+ if (!rootURL.equals(parentURL) && !rootURL.equals(url))
+ suggestions[3] = addSuggestion(rootURL.spec + "*");
+ else
+ suggestions[3] = suggestions[2];
+
+ try
+ {
+ suggestions[4] = addSuggestion(url.host.replace(/^www\./, "") + "^");
+
+ // Prefer example.com^ to example.com/*
+ let undesired = suggestions[4].replace(/\^$/, "/*");
+ for (let i = 0; i < suggestions.length - 1; i++)
+ if (suggestions[i] == undesired)
+ suggestions[i] = suggestions[4];
+
+ for (let child = insertionPoint.parentNode.firstChild; child; child = child.nextSibling)
+ {
+ if (child.localName == "radio" && child.getAttribute("value") == undesired)
+ {
+ child.parentNode.removeChild(child);
+ break;
+ }
+ }
+ }
+ catch (e)
+ {
+ suggestions[4] = suggestions[3];
+ }
+
+ try
+ {
+ let effectiveTLD = Cc["@mozilla.org/network/effective-tld-service;1"].getService(Ci.nsIEffectiveTLDService);
+ let host = url.host;
+ let baseDomain = effectiveTLD.getBaseDomainFromHost(host);
+ if (baseDomain != host.replace(/^www\./, ""))
+ suggestions[5] = addSuggestion(baseDomain + "^");
+ else
+ suggestions[5] = suggestions[4];
+ }
+ catch (e)
+ {
+ suggestions[5] = suggestions[4];
+ }
+
+ E("patternGroup").value = (Prefs.composer_default in suggestions ? suggestions[Prefs.composer_default] : suggestions[1]);
+ }
+ catch (e)
+ {
+ // IOService returned nsIURI - not much we can do with it
+ addSuggestion(item.location);
+ E("patternGroup").value = "";
+ }
+ if (Prefs.composer_default == 0)
+ E("customPattern").focus();
+ else
+ E("patternGroup").focus();
+
+ let types = [];
+ for (let type in Policy.localizedDescr)
+ {
+ types.push(parseInt(type));
+ }
+ types.sort(function(a, b) {
+ if (a < b)
+ return -1;
+ else if (a > b)
+ return 1;
+ else
+ return 0;
+ });
+
+ let docDomain = item.docDomain;
+ let thirdParty = item.thirdParty;
+
+ if (docDomain)
+ docDomain = docDomain.replace(/^www\./i, "").replace(/\.+$/, "");
+ if (docDomain)
+ E("domainRestriction").value = docDomain;
+
+ E("thirdParty").hidden = !thirdParty;
+ E("firstParty").hidden = thirdParty;
+
+ let typeGroup = E("typeGroup");
+ let defaultTypes = RegExpFilter.prototype.contentType & ~RegExpFilter.typeMap.DOCUMENT;
+ let isDefaultType = (RegExpFilter.typeMap[item.typeDescr] & defaultTypes) != 0;
+ for each (let type in types)
+ {
+ if (type == Policy.type.ELEMHIDE)
+ continue;
+
+ let typeNode = document.createElement("checkbox");
+ typeNode.setAttribute("value", Policy.typeDescr[type].toLowerCase().replace(/\_/g, "-"));
+ typeNode.setAttribute("label", Policy.localizedDescr[type].toLowerCase());
+
+ let typeMask = RegExpFilter.typeMap[Policy.typeDescr[type]];
+ typeNode._defaultType = (typeMask & defaultTypes) != 0;
+ if ((isDefaultType && typeNode._defaultType) || (!isDefaultType && item.type == type))
+ typeNode.setAttribute("checked", "true");
+
+ if (item.type == type)
+ typeNode.setAttribute("disabled", "true");
+ typeNode.addEventListener("command", function() checkboxUpdated(this), false);
+ typeGroup.appendChild(typeNode);
+ }
+
+ let collapseDefault = E("collapseDefault");
+ collapseDefault.label = collapseDefault.getAttribute(Prefs.fastcollapse ? "label_no" : "label_yes");
+ E("collapse").value = "";
+ E("collapse").setAttribute("label", collapseDefault.label);
+
+ let warning = E("disabledWarning");
+ generateLinkText(warning);
+ warning.hidden = Prefs.enabled;
+
+ updatePatternSelection();
+}
+
+function checkboxUpdated(checkbox)
+{
+ checkbox._lastChange = Date.now();
+ updateFilter();
+}
+
+function updateFilter()
+{
+ let filter = "";
+
+ let type = E("filterType").value
+ if (type == "whitelist")
+ filter += "@@";
+
+ let pattern = E("patternGroup").value;
+ if (pattern == "")
+ pattern = E("customPattern").value;
+
+ if (E("anchorStart").checked)
+ filter += E("anchorStart").flexibleAnchor ? "||" : "|";
+
+ filter += pattern;
+
+ if (E("anchorEnd").checked)
+ filter += "|";
+
+ if (advancedMode)
+ {
+ let options = [];
+
+ if (E("domainRestrictionEnabled").checked)
+ {
+ let domainRestriction = E("domainRestriction").value.replace(/[,\s]/g, "").replace(/\.+$/, "");
+ if (domainRestriction)
+ options.push([E("domainRestrictionEnabled")._lastChange || 0, "domain=" + domainRestriction]);
+ }
+
+ if (E("firstParty").checked)
+ options.push([E("firstParty")._lastChange || 0, "~third-party"]);
+ if (E("thirdParty").checked)
+ options.push([E("thirdParty")._lastChange || 0, "third-party"]);
+
+ if (E("matchCase").checked)
+ options.push([E("matchCase")._lastChange || 0, "match-case"]);
+
+ let collapse = E("collapse");
+ disableElement(collapse, type == "whitelist", "value", "");
+ if (collapse.value != "")
+ options.push([collapse._lastChange, collapse.value]);
+
+ let enabledTypes = [];
+ let disabledTypes = [];
+ let forceEnabledTypes = [];
+ for (let typeNode = E("typeGroup").firstChild; typeNode; typeNode = typeNode.nextSibling)
+ {
+ let value = typeNode.getAttribute("value");
+ if (value == "document")
+ disableElement(typeNode, type != "whitelist", "checked", false);
+
+ if (!typeNode._defaultType)
+ {
+ if (typeNode.getAttribute("checked") == "true")
+ forceEnabledTypes.push([typeNode._lastChange || 0, value]);
+ }
+ else if (typeNode.getAttribute("checked") == "true")
+ enabledTypes.push([typeNode._lastChange || 0, value]);
+ else
+ disabledTypes.push([typeNode._lastChange || 0, "~" + value]);
+ }
+ if (!forceEnabledTypes.length && disabledTypes.length < enabledTypes.length)
+ options.push.apply(options, disabledTypes);
+ else
+ options.push.apply(options, enabledTypes);
+ options.push.apply(options, forceEnabledTypes);
+
+ if (options.length)
+ {
+ options.sort(function(a, b) a[0] - b[0]);
+ filter += "$" + options.map(function(o) o[1]).join(",");
+ }
+ }
+ else
+ {
+ let defaultTypes = RegExpFilter.prototype.contentType & ~RegExpFilter.typeMap.DOCUMENT;
+ let isDefaultType = (RegExpFilter.typeMap[item.typeDescr] & defaultTypes) != 0;
+ if (!isDefaultType)
+ filter += "$" + item.typeDescr.toLowerCase().replace(/\_/g, "-");
+ }
+
+ filter = Filter.normalize(filter);
+ E("regexpWarning").hidden = !Filter.regexpRegExp.test(filter);
+
+ let isSlow = false;
+ let compiledFilter = Filter.fromText(filter);
+ if (E("regexpWarning").hidden)
+ {
+ if (compiledFilter instanceof RegExpFilter && defaultMatcher.isSlowFilter(compiledFilter))
+ isSlow = true;
+ }
+ E("shortpatternWarning").hidden = !isSlow;
+
+ E("matchWarning").hidden = compiledFilter instanceof RegExpFilter && compiledFilter.matches(item.location, item.typeDescr, item.docDomain, item.thirdParty);
+
+ E("filter").value = filter;
+}
+
+function generateLinkText(element, replacement)
+{
+ let template = element.getAttribute("textTemplate");
+ if (typeof replacement != "undefined")
+ template = template.replace(/\?1\?/g, replacement)
+
+ let [, beforeLink, linkText, afterLink] = /(.*)\[link\](.*)\[\/link\](.*)/.exec(template) || [null, "", template, ""];
+ while (element.firstChild && element.firstChild.nodeType != Node.ELEMENT_NODE)
+ element.removeChild(element.firstChild);
+ while (element.lastChild && element.lastChild.nodeType != Node.ELEMENT_NODE)
+ element.removeChild(element.lastChild);
+ if (!element.firstChild)
+ return;
+
+ element.firstChild.textContent = linkText;
+ element.insertBefore(document.createTextNode(beforeLink), element.firstChild);
+ element.appendChild(document.createTextNode(afterLink));
+}
+
+function updatePatternSelection()
+{
+ let pattern = E("patternGroup").value;
+ if (pattern == "")
+ {
+ pattern = E("customPattern").value;
+ }
+ else
+ {
+ E("anchorStart").checked = true;
+ E("anchorEnd").checked = false;
+ }
+
+ function testFilter(/**String*/ filter) /**Boolean*/
+ {
+ return RegExpFilter.fromText(filter + "$" + item.typeDescr).matches(item.location, item.typeDescr, item.docDomain, item.thirdParty);
+ }
+
+ let anchorStartCheckbox = E("anchorStart");
+ if (!/^\*/.test(pattern) && testFilter("||" + pattern))
+ {
+ disableElement(anchorStartCheckbox, false, "checked", false);
+ [anchorStartCheckbox.label, anchorStartCheckbox.accessKey] = Utils.splitLabel(anchorStartCheckbox.getAttribute("labelFlexible"));
+ anchorStartCheckbox.flexibleAnchor = true;
+ }
+ else
+ {
+ disableElement(anchorStartCheckbox, /^\*/.test(pattern) || !testFilter("|" + pattern), "checked", false);
+ [anchorStartCheckbox.label, anchorStartCheckbox.accessKey] = Utils.splitLabel(anchorStartCheckbox.getAttribute("labelRegular"));
+ anchorStartCheckbox.flexibleAnchor = false;
+ }
+ disableElement(E("anchorEnd"), /[\*\^]$/.test(pattern) || !testFilter(pattern + "|"), "checked", false);
+
+ updateFilter();
+ setAdvancedMode(document.documentElement.getAttribute("advancedMode") == "true");
+}
+
+function updateCustomPattern()
+{
+ E("patternGroup").value = "";
+ updatePatternSelection();
+}
+
+function addFilter() {
+ let filter = Filter.fromText(document.getElementById("filter").value);
+ filter.disabled = false;
+
+ FilterStorage.addFilter(filter);
+
+ if (nodes)
+ Policy.refilterNodes(nodes, item);
+
+ return true;
+}
+
+function setAdvancedMode(mode) {
+ advancedMode = mode;
+
+ var dialog = document.documentElement;
+ dialog.setAttribute("advancedMode", advancedMode);
+
+ var button = dialog.getButton("disclosure");
+ button.setAttribute("label", dialog.getAttribute(advancedMode ? "buttonlabeldisclosure_off" : "buttonlabeldisclosure_on"));
+
+ updateFilter();
+}
+
+function disableElement(element, disable, valueProperty, disabledValue) {
+ if ((element.getAttribute("disabled") == "true") == disable)
+ return;
+
+ if (disable)
+ {
+ element.setAttribute("disabled", "true");
+ element._abpStoredValue = element[valueProperty];
+ element[valueProperty] = disabledValue;
+ }
+ else
+ {
+ element.removeAttribute("disabled");
+ if ("_abpStoredValue" in element)
+ element[valueProperty] = element._abpStoredValue;
+ delete element._abpStoredValue;
+ }
+}
+
+function openPreferences()
+{
+ UI.openFiltersDialog(Filter.fromText(E("filter").value));
+}
+
+function doEnable() {
+ Prefs.enabled = true;
+ E("disabledWarning").hidden = true;
+}
+
+/**
+ * Selects or unselects all type checkboxes except those
+ * that are disabled.
+ */
+function selectAllTypes(/**Boolean*/ select)
+{
+ for (let typeNode = E("typeGroup").firstChild; typeNode; typeNode = typeNode.nextSibling)
+ if (typeNode.getAttribute("disabled") != "true")
+ typeNode.checked = select;
+ updateFilter();
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/composer.xul b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/composer.xul
new file mode 100644
index 0000000..8931e16
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/composer.xul
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<!DOCTYPE overlay SYSTEM "chrome://adblockplus/locale/composer.dtd">
+
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://adblockplus/skin/composer.css" type="text/css"?>
+
+<dialog id="abp-composer"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ title="&dialog.title;"
+ onload="init()"
+ ondialogaccept="return addFilter()"
+ ondialogdisclosure="setAdvancedMode(!advancedMode)"
+ buttons="accept,cancel,disclosure"
+ width="800px"
+ height="400px"
+ persist="screenX screenY width height sizemode advancedMode"
+ advancedMode="false"
+ buttonlabelaccept="&accept.label;"
+ buttonlabeldisclosure="&advanced.label;"
+ buttonlabeldisclosure_on="&advanced.label;"
+ buttonlabeldisclosure_off="&basic.label;"
+ windowtype="abp:composer">
+
+ <script type="application/x-javascript;version=1.7" src="utils.js"/>
+ <script type="application/x-javascript;version=1.7" src="composer.js"/>
+
+ <popupset>
+ <tooltip id="domainRestrictionHelp" label="&domainRestriction.help;"/>
+ </popupset>
+
+ <description id="disabledWarning" hidden="true" textTemplate="&disabled.warning;">
+ <label class="text-link" onclick="doEnable()"/>
+ </description>
+
+ <hbox id="filterBox" align="center">
+ <label control="filter" value="&filter.label;"/>
+ <textbox id="filter" flex="1" tabindex="-1" readonly="true"/>
+ <button id="preferences" label="&preferences.label;" oncommand="openPreferences()"/>
+ </hbox>
+
+ <radiogroup orient="horizontal" id="filterType" oncommand="updateFilter()">
+ <radio label="&type.filter.label;" value="filterlist" flex="1"/>
+ <radio label="&type.whitelist.label;" value="whitelist" flex="1"/>
+ </radiogroup>
+
+ <hbox flex="1">
+ <groupbox id="pattern" flex="1">
+ <caption label="&pattern.label;"/>
+ <radiogroup id="patternGroup" flex="1" oncommand="updatePatternSelection()" style="overflow: auto;">
+ <description id="patternExplanation">&pattern.explanation;</description>
+ <description id="regexpWarning" hidden="true">&regexp.warning;</description>
+ <description id="shortpatternWarning" hidden="true">&shortpattern.warning;</description>
+ <description id="matchWarning" hidden="true">&match.warning;</description>
+ <hbox id="customPatternBox">
+ <radio id="customPatternRadio" label="&custom.pattern.label;" value="" control="customPattern"/>
+ <textbox id="customPattern" flex="1" oninput="updateCustomPattern()"/>
+ </hbox>
+ </radiogroup>
+ <hbox id="anchorGroup" pack="start" align="baseline">
+ <label value="&anchors.label;"/>
+ <description flex="1" style="margin: 0; padding: 0;">
+ <checkbox id="anchorStart" labelRegular="&anchor.start.label;"
+ labelFlexible="&anchor.start.flexible.label;"
+ oncommand="updateFilter()"/>
+ <checkbox id="anchorEnd" label="&anchor.end.label;" oncommand="updateFilter()"/>
+ </description>
+ </hbox>
+ </groupbox>
+ <groupbox id="options">
+ <caption label="&options.label;"/>
+ <checkbox id="firstParty" label="&firstParty.label;" oncommand="checkboxUpdated(this);"/>
+ <checkbox id="thirdParty" label="&thirdParty.label;" oncommand="checkboxUpdated(this);"/>
+ <checkbox id="matchCase" label="&matchCase.label;" oncommand="checkboxUpdated(this);"/>
+ <hbox align="baseline">
+ <checkbox id="domainRestrictionEnabled" label="&domainRestriction.label;" oncommand="checkboxUpdated(this);"/>
+ <description class="help" value="?" tooltip="domainRestrictionHelp"/>
+ </hbox>
+ <textbox id="domainRestriction" oninput="updateFilter()"/>
+
+ <label id="typeGroupLabel" value="&types.label;"/>
+ <hbox>
+ <label id="selectAllTypes" class="text-link" value="&selectAllTypes.label;" onclick="selectAllTypes(true)"/>
+ <spacer flex="1"/>
+ <label id="unselectAllTypes" class="text-link" value="&unselectAllTypes.label;" onclick="selectAllTypes(false)"/>
+ </hbox>
+ <vbox flex="1" id="typeGroup"/>
+
+ <vbox>
+ <label control="collapse" value="&collapse.label;"/>
+ <menulist id="collapse" oncommand="updateFilter()">
+ <menupopup>
+ <menuitem id="collapseDefault" value="" label_yes="&collapse.default.yes.label;" label_no="&collapse.default.no.label;" selected="true"/>
+ <menuitem label="&collapse.yes.label;" value="collapse"/>
+ <menuitem label="&collapse.no.label;" value="~collapse"/>
+ </menupopup>
+ </menulist>
+ </vbox>
+ </groupbox>
+ </hbox>
+</dialog>
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/fennecSettings.xul b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/fennecSettings.xul
new file mode 100644
index 0000000..9063ba3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/fennecSettings.xul
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<!DOCTYPE vbox [
+<!ENTITY % overlayDTD SYSTEM "chrome://adblockplus/locale/overlay.dtd">
+%overlayDTD;
+<!ENTITY % filtersDTD SYSTEM "chrome://adblockplus/locale/filters.dtd">
+%filtersDTD;
+]>
+
+<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+ <setting pref="extensions.adblockplus.enabled" type="bool" inverted="true" title="&disable.label;"/>
+ <setting type="control" title="&subscriptions.tab.label;">
+ <menulist id="adblockplus-subscription-list"/>
+ </setting>
+ <setting id="adblockplus-acceptableAds" type="bool" title="&acceptableAds2.label;"
+ oncommand="/**See bug 762015*/ if (event.type == 'oncommand') {event = document.createEvent('Events'); event.initEvent('command', false, false); this.dispatchEvent(event);}"/>
+ <setting pref="extensions.adblockplus.fastcollapse" type="bool" title="&hideplaceholders.label;"
+ inverted="true"/>
+ <setting id="adblockplus-sync" type="bool" title="&sync.label;"
+ oncommand="/**See bug 762015*/ if (event.type == 'oncommand') {event = document.createEvent('Events'); event.initEvent('command', false, false); this.dispatchEvent(event);}"/>
+</vbox>
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-backup.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-backup.js
new file mode 100644
index 0000000..3ef38c6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-backup.js
@@ -0,0 +1,348 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/FileUtils.jsm");
+
+/**
+ * Implementation of backup and restore functionality.
+ * @class
+ */
+var Backup =
+{
+ /**
+ * Template for menu items to be displayed in the Restore menu (for automated
+ * backups).
+ * @type Element
+ */
+ restoreTemplate: null,
+
+ /**
+ * Element after which restore items should be inserted.
+ * @type Element
+ */
+ restoreInsertionPoint: null,
+
+ /**
+ * Regular expression to recognize checksum comments.
+ */
+ CHECKSUM_REGEXP: /^!\s*checksum[\s\-:]+([\w\+\/]+)/i,
+
+ /**
+ * Regular expression to recognize group title comments.
+ */
+ GROUPTITLE_REGEXP: /^!\s*\[(.*)\]((?:\/\w+)*)\s*$/,
+
+
+ /**
+ * Initializes backup UI.
+ */
+ init: function()
+ {
+ this.restoreTemplate = E("restoreBackupTemplate");
+ this.restoreInsertionPoint = this.restoreTemplate.previousSibling;
+ this.restoreTemplate.parentNode.removeChild(this.restoreTemplate);
+ this.restoreTemplate.removeAttribute("id");
+ this.restoreTemplate.removeAttribute("hidden");
+ },
+
+ /**
+ * Gets the default download dir, as used by the browser itself.
+ */
+ getDefaultDir: function() /**nsIFile*/
+ {
+ try
+ {
+ return Utils.prefService.getComplexValue("browser.download.lastDir", Ci.nsILocalFile);
+ }
+ catch (e)
+ {
+ // No default download location. Default to desktop.
+ return FileUtils.getDir("Desk", [], false);
+ }
+ },
+
+ /**
+ * Saves new default download dir after the user chose a different directory to
+ * save his files to.
+ */
+ saveDefaultDir: function(/**nsIFile*/ dir)
+ {
+ try
+ {
+ Utils.prefService.setComplexValue("browser.download.lastDir", Ci.nsILocalFile, dir);
+ } catch(e) {};
+ },
+
+ /**
+ * Called when the Restore menu is being opened, fills in "Automated backup"
+ * entries.
+ */
+ fillRestorePopup: function()
+ {
+ while (this.restoreInsertionPoint.nextSibling && !this.restoreInsertionPoint.nextSibling.id)
+ this.restoreInsertionPoint.parentNode.removeChild(this.restoreInsertionPoint.nextSibling);
+
+ let files = FilterStorage.getBackupFiles().reverse();
+ for (let i = 0; i < files.length; i++)
+ {
+ let file = files[i];
+ let item = this.restoreTemplate.cloneNode(true);
+ let label = item.getAttribute("label");
+ label = label.replace(/\?1\?/, Utils.formatTime(file.lastModifiedTime));
+ item.setAttribute("label", label);
+ item.addEventListener("command", function()
+ {
+ Backup.restoreAllData(file);
+ }, false);
+ this.restoreInsertionPoint.parentNode.insertBefore(item, this.restoreInsertionPoint.nextSibling);
+ }
+ },
+
+ /**
+ * Lets the user choose a file to restore filters from.
+ */
+ restoreFromFile: function()
+ {
+ let picker = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
+ picker.init(window, E("backupButton").getAttribute("_restoreDialogTitle"), picker.modeOpen);
+ picker.defaultExtension = ".ini";
+ picker.appendFilter(E("backupButton").getAttribute("_fileFilterComplete"), "*.ini");
+ picker.appendFilter(E("backupButton").getAttribute("_fileFilterCustom"), "*.txt");
+
+ if (picker.show() != picker.returnCancel)
+ {
+ this.saveDefaultDir(picker.file.parent);
+ if (picker.filterIndex == 0)
+ this.restoreAllData(picker.file);
+ else
+ this.restoreCustomFilters(picker.file);
+ }
+ },
+
+ /**
+ * Restores patterns.ini from a file.
+ */
+ restoreAllData: function(/**nsIFile*/ file)
+ {
+ let stream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
+ stream.init(file, FileUtils.MODE_RDONLY, FileUtils.PERMS_FILE, 0);
+ stream.QueryInterface(Ci.nsILineInputStream);
+
+ let lines = [];
+ let line = {value: null};
+ if (stream.readLine(line))
+ lines.push(line.value);
+ if (stream.readLine(line))
+ lines.push(line.value);
+ stream.close();
+
+ let match;
+ if (lines.length < 2 || lines[0] != "# Adblock Plus preferences" || !(match = /version=(\d+)/.exec(lines[1])))
+ {
+ Utils.alert(window, E("backupButton").getAttribute("_restoreError"), E("backupButton").getAttribute("_restoreDialogTitle"));
+ return;
+ }
+
+ let warning = E("backupButton").getAttribute("_restoreCompleteWarning");
+ let minVersion = parseInt(match[1], 10);
+ if (minVersion > FilterStorage.formatVersion)
+ warning += "\n\n" + E("backupButton").getAttribute("_restoreVersionWarning");
+
+ if (!Utils.confirm(window, warning, E("backupButton").getAttribute("_restoreDialogTitle")))
+ return;
+
+ FilterStorage.loadFromDisk(file);
+ },
+
+ /**
+ * Restores custom filters from a file.
+ */
+ restoreCustomFilters: function(/**nsIFile*/ file)
+ {
+ IO.readFromFile(file, {
+ seenHeader: false,
+ subscription: null,
+ process: function(line)
+ {
+ if (!this.seenHeader)
+ {
+ // This should be a header
+ this.seenHeader = true;
+ let match = /\[Adblock(?:\s*Plus\s*([\d\.]+)?)?\]/i.exec(line);
+ if (match)
+ {
+ let warning = E("backupButton").getAttribute("_restoreCustomWarning");
+ let minVersion = match[1];
+ if (minVersion && Utils.versionComparator.compare(minVersion, Utils.addonVersion) > 0)
+ warning += "\n\n" + E("backupButton").getAttribute("_restoreVersionWarning");
+
+ if (Utils.confirm(window, warning, E("backupButton").getAttribute("_restoreDialogTitle")))
+ {
+ let subscriptions = FilterStorage.subscriptions.filter(function(s) s instanceof SpecialSubscription);
+ for (let i = 0; i < subscriptions.length; i++)
+ FilterStorage.removeSubscription(subscriptions[i]);
+
+ return;
+ }
+ else
+ throw Cr.NS_BASE_STREAM_WOULD_BLOCK;
+ }
+ else
+ throw new Error("Invalid file");
+ }
+ else if (line === null)
+ {
+ // End of file
+ if (this.subscription)
+ FilterStorage.addSubscription(this.subscription);
+ E("tabs").selectedIndex = 1;
+ }
+ else if (Backup.CHECKSUM_REGEXP.test(line))
+ {
+ // Ignore checksums
+ }
+ else if (Backup.GROUPTITLE_REGEXP.test(line))
+ {
+ // New group start
+ if (this.subscription)
+ FilterStorage.addSubscription(this.subscription);
+
+ let [, title, options] = Backup.GROUPTITLE_REGEXP.exec(line);
+ this.subscription = SpecialSubscription.create(title);
+
+ let defaults = [];
+ if (options)
+ options = options.split("/");
+ for (let j = 0; j < options.length; j++)
+ if (options[j] in SpecialSubscription.defaultsMap)
+ defaults.push(options[j]);
+ if (defaults.length)
+ this.subscription.defaults = defaults;
+ }
+ else
+ {
+ // Regular filter
+ line = Filter.normalize(line);
+ if (line)
+ {
+ if (!this.subscription)
+ this.subscription = SpecialSubscription.create(Utils.getString("newGroup_title"));
+ this.subscription.filters.push(Filter.fromText(line));
+ }
+ }
+ }
+ }, function(e)
+ {
+ if (e && e.result != Cr.NS_BASE_STREAM_WOULD_BLOCK)
+ {
+ Cu.reportError(e);
+ Utils.alert(window, E("backupButton").getAttribute("_restoreError"), E("backupButton").getAttribute("_restoreDialogTitle"));
+ }
+ });
+ },
+
+ /**
+ * Lets the user choose a file to backup filters to.
+ */
+ backupToFile: function()
+ {
+ let picker = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
+ picker.init(window, E("backupButton").getAttribute("_backupDialogTitle"), picker.modeSave);
+ picker.defaultExtension = ".ini";
+ picker.appendFilter(E("backupButton").getAttribute("_fileFilterComplete"), "*.ini");
+ picker.appendFilter(E("backupButton").getAttribute("_fileFilterCustom"), "*.txt");
+
+ if (picker.show() != picker.returnCancel)
+ {
+ this.saveDefaultDir(picker.file.parent);
+ if (picker.filterIndex == 0)
+ this.backupAllData(picker.file);
+ else
+ this.backupCustomFilters(picker.file);
+ }
+ },
+
+ /**
+ * Writes all patterns.ini data to a file.
+ */
+ backupAllData: function(/**nsIFile*/ file)
+ {
+ FilterStorage.saveToDisk(file);
+ },
+
+ /**
+ * Writes user's custom filters to a file.
+ */
+ backupCustomFilters: function(/**nsIFile*/ file)
+ {
+ let subscriptions = FilterStorage.subscriptions.filter(function(s) s instanceof SpecialSubscription);
+ let minVersion = "2.0"
+ let list = [];
+ for (let i = 0; i < subscriptions.length; i++)
+ {
+ let subscription = subscriptions[i];
+ let typeAddition = "";
+ if (subscription.defaults)
+ typeAddition = "/" + subscription.defaults.join("/");
+ list.push("! [" + subscription.title + "]" + typeAddition);
+ for (let j = 0; j < subscription.filters.length; j++)
+ {
+ let filter = subscription.filters[j];
+ // Skip checksums
+ if (filter instanceof CommentFilter && this.CHECKSUM_REGEXP.test(filter.text))
+ continue;
+ // Skip group headers
+ if (filter instanceof CommentFilter && this.GROUPTITLE_REGEXP.test(filter.text))
+ continue;
+ list.push(filter.text);
+
+ if (filter instanceof ElemHideException && Services.vc.compare(minVersion, "2.1") < 0)
+ minVersion = "2.1";
+ }
+ }
+ list.unshift("[Adblock Plus " + minVersion + "]");
+
+ // Insert checksum. Have to add an empty line to the end of the list to
+ // account for the trailing newline in the file.
+ list.push("");
+ let checksum = Utils.generateChecksum(list);
+ list.pop();
+ if (checksum)
+ list.splice(1, 0, "! Checksum: " + checksum);
+
+ function generator()
+ {
+ for (let i = 0; i < list.length; i++)
+ yield list[i];
+ }
+
+ IO.writeToFile(file, generator(), function(e)
+ {
+ if (e)
+ {
+ Cu.reportError(e);
+ Utils.alert(window, E("backupButton").getAttribute("_backupError"), E("backupButton").getAttribute("_backupDialogTitle"));
+ }
+ });
+ }
+};
+
+window.addEventListener("load", function()
+{
+ Backup.init();
+}, false);
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-filteractions.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-filteractions.js
new file mode 100644
index 0000000..5512fda
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-filteractions.js
@@ -0,0 +1,561 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * Implementation of the various actions performed on the filters.
+ * @class
+ */
+var FilterActions =
+{
+ /**
+ * Initializes filter actions.
+ */
+ init: function()
+ {
+ let me = this;
+ this.treeElement.parentNode.addEventListener("keypress", function(event)
+ {
+ me.keyPress(event);
+ }, true);
+ this.treeElement.view = FilterView;
+
+ // Work around https://bugzilla.mozilla.org/show_bug.cgi?id=777832, don't
+ // allow the tree to receive keypress/keydown events triggered by cursor
+ // keys pressed in the editor, it will call preventDefault() on them.
+ let propagationStopper = function(event)
+ {
+ if (event.keyCode >= event.DOM_VK_PAGE_UP && event.keyCode <= event.DOM_VK_DOWN)
+ event.stopPropagation();
+ };
+
+ this.treeElement.inputField.addEventListener("keypress", propagationStopper, false);
+ this.treeElement.inputField.addEventListener("keydown", propagationStopper, false);
+
+ // Create a copy of the view menu
+ function fixId(node, newId)
+ {
+ if (node.nodeType == node.ELEMENT_NODE)
+ {
+ if (node.hasAttribute("id"))
+ node.setAttribute("id", node.getAttribute("id").replace(/\d+$/, newId));
+
+ for (let i = 0, len = node.childNodes.length; i < len; i++)
+ fixId(node.childNodes[i], newId);
+ }
+ return node;
+ }
+ E("viewMenu").appendChild(fixId(E("filters-view-menu1").cloneNode(true), "2"));
+ },
+
+ /**
+ * <tree> element containing the filters.
+ * @type XULElement
+ */
+ get treeElement() E("filtersTree"),
+
+ /**
+ * Tests whether the tree is currently visible.
+ */
+ get visible()
+ {
+ return !this.treeElement.parentNode.collapsed;
+ },
+
+ /**
+ * Tests whether the tree is currently focused.
+ * @type Boolean
+ */
+ get focused()
+ {
+ let focused = document.commandDispatcher.focusedElement;
+ while (focused)
+ {
+ if ("treeBoxObject" in focused && focused.treeBoxObject == FilterView.boxObject)
+ return true;
+ focused = focused.parentNode;
+ }
+ return false;
+ },
+
+ /**
+ * Updates visible filter commands whenever the selected subscription changes.
+ */
+ updateCommands: function()
+ {
+ E("filters-add-command").setAttribute("disabled", !FilterView.editable);
+ },
+
+ /**
+ * Called whenever filter actions menu is opened, initializes menu items.
+ */
+ fillActionsPopup: function()
+ {
+ let editable = FilterView.editable;
+ let items = FilterView.selectedItems.filter(function(i) !i.filter.dummy);
+ items.sort(function(entry1, entry2) entry1.index - entry2.index);
+ let activeItems = items.filter(function(i) i.filter instanceof ActiveFilter);
+
+ E("filters-edit-command").setAttribute("disabled", !editable || !items.length);
+ E("filters-delete-command").setAttribute("disabled", !editable || !items.length);
+ E("filters-resetHitCounts-command").setAttribute("disabled", !activeItems.length);
+ E("filters-moveUp-command").setAttribute("disabled", !editable || FilterView.isSorted() || !items.length || items[0].index == 0);
+ E("filters-moveDown-command").setAttribute("disabled", !editable || FilterView.isSorted() || !items.length || items[items.length - 1].index == FilterView.rowCount - 1);
+ E("filters-copy-command").setAttribute("disabled", !items.length);
+ E("filters-cut-command").setAttribute("disabled", !editable || !items.length);
+ E("filters-paste-command").setAttribute("disabled", !editable || !Utils.clipboard.hasDataMatchingFlavors(["text/unicode"], 1, Utils.clipboard.kGlobalClipboard));
+ },
+
+ /**
+ * Changes sort current order for the tree. Sorts by filter column if the list is unsorted.
+ * @param {String} order either "ascending" or "descending"
+ */
+ setSortOrder: function(sortOrder)
+ {
+ let col = (FilterView.sortColumn ? FilterView.sortColumn.id : "col-filter");
+ FilterView.sortBy(col, sortOrder);
+ },
+
+ /**
+ * Toggles the visibility of a tree column.
+ */
+ toggleColumn: function(/**String*/ id)
+ {
+ let col = E(id);
+ col.setAttribute("hidden", col.hidden ? "false" : "true");
+ },
+
+ /**
+ * Enables or disables all filters in the current selection.
+ */
+ selectionToggleDisabled: function()
+ {
+ if (this.treeElement.editingColumn)
+ return;
+
+ let items = FilterView.selectedItems.filter(function(i) i.filter instanceof ActiveFilter);
+ if (items.length)
+ {
+ FilterView.boxObject.beginUpdateBatch();
+ let newValue = !items[0].filter.disabled;
+ for (let i = 0; i < items.length; i++)
+ items[i].filter.disabled = newValue;
+ FilterView.boxObject.endUpdateBatch();
+ }
+ },
+
+ /**
+ * Selects all entries in the list.
+ */
+ selectAll: function()
+ {
+ if (this.treeElement.editingColumn)
+ return;
+
+ FilterView.selection.selectAll();
+ this.treeElement.focus();
+ },
+
+ /**
+ * Starts editing the current filter.
+ */
+ startEditing: function()
+ {
+ if (this.treeElement.editingColumn)
+ return;
+
+ this.treeElement.startEditing(FilterView.selection.currentIndex, FilterView.boxObject.columns.getNamedColumn("col-filter"));
+ },
+
+ /**
+ * Starts editing a new filter at the current position.
+ */
+ insertFilter: function()
+ {
+ if (!FilterView.editable || this.treeElement.editingColumn)
+ return;
+
+ FilterView.insertEditDummy();
+ this.startEditing();
+
+ let tree = this.treeElement;
+ let listener = function(event)
+ {
+ if (event.attrName == "editing" && tree.editingRow < 0)
+ {
+ tree.removeEventListener("DOMAttrModified", listener, false);
+ FilterView.removeEditDummy();
+ }
+ }
+ tree.addEventListener("DOMAttrModified", listener, false);
+ },
+
+ /**
+ * Deletes items from the list.
+ */
+ deleteItems: function(/**Array*/ items)
+ {
+ let oldIndex = FilterView.selection.currentIndex;
+ items.sort(function(entry1, entry2) entry2.index - entry1.index);
+
+ for (let i = 0; i < items.length; i++)
+ FilterStorage.removeFilter(items[i].filter, FilterView._subscription, items[i].index);
+
+ FilterView.selectRow(oldIndex);
+ },
+
+ /**
+ * Deletes selected filters.
+ */
+ deleteSelected: function()
+ {
+ if (!FilterView.editable || this.treeElement.editingColumn)
+ return;
+
+ let items = FilterView.selectedItems;
+ if (items.length == 0 || (items.length >= 2 && !Utils.confirm(window, this.treeElement.getAttribute("_removewarning"))))
+ return;
+
+ this.deleteItems(items)
+ },
+
+ /**
+ * Resets hit counts of the selected filters.
+ */
+ resetHitCounts: function()
+ {
+ if (this.treeElement.editingColumn)
+ return;
+
+ let items = FilterView.selectedItems.filter(function(i) i.filter instanceof ActiveFilter);
+ if (items.length)
+ FilterStorage.resetHitCounts(items.map(function(i) i.filter));
+ },
+
+ /**
+ * Moves items to a different position in the list.
+ * @param {Array} items
+ * @param {Integer} offset negative offsets move the items up, positive down
+ */
+ _moveItems: function(/**Array*/ items, /**Integer*/ offset)
+ {
+ if (!items.length)
+ return;
+
+ if (offset < 0)
+ {
+ items.sort(function(entry1, entry2) entry1.index - entry2.index);
+ let position = items[0].index + offset;
+ if (position < 0)
+ return;
+
+ for (let i = 0; i < items.length; i++)
+ FilterStorage.moveFilter(items[i].filter, FilterView._subscription, items[i].index, position++);
+ FilterView.selection.rangedSelect(position - items.length, position - 1, false);
+ }
+ else if (offset > 0)
+ {
+ items.sort(function(entry1, entry2) entry2.index - entry1.index);
+ let position = items[0].index + offset;
+ if (position >= FilterView.rowCount)
+ return;
+
+ for (let i = 0; i < items.length; i++)
+ FilterStorage.moveFilter(items[i].filter, FilterView._subscription, items[i].index, position--);
+ FilterView.selection.rangedSelect(position + 1, position + items.length, false);
+ }
+ },
+
+ /**
+ * Moves selected filters one line up.
+ */
+ moveUp: function()
+ {
+ if (!FilterView.editable || FilterView.isEmpty || FilterView.isSorted() || this.treeElement.editingColumn)
+ return;
+
+ this._moveItems(FilterView.selectedItems, -1);
+ },
+
+ /**
+ * Moves selected filters one line down.
+ */
+ moveDown: function()
+ {
+ if (!FilterView.editable || FilterView.isEmpty || FilterView.isSorted() || this.treeElement.editingColumn)
+ return;
+
+ this._moveItems(FilterView.selectedItems, 1);
+ },
+
+ /**
+ * Fills the context menu of the filters columns.
+ */
+ fillColumnPopup: function(/**Element*/ element)
+ {
+ let suffix = element.id.match(/\d+$/)[0] || "1";
+
+ E("filters-view-filter" + suffix).setAttribute("checked", !E("col-filter").hidden);
+ E("filters-view-slow" + suffix).setAttribute("checked", !E("col-slow").hidden);
+ E("filters-view-enabled" + suffix).setAttribute("checked", !E("col-enabled").hidden);
+ E("filters-view-hitcount" + suffix).setAttribute("checked", !E("col-hitcount").hidden);
+ E("filters-view-lasthit" + suffix).setAttribute("checked", !E("col-lasthit").hidden);
+
+ let sortColumn = FilterView.sortColumn;
+ let sortColumnID = (sortColumn ? sortColumn.id : null);
+ let sortDir = (sortColumn ? sortColumn.getAttribute("sortDirection") : "natural");
+ E("filters-sort-none" + suffix).setAttribute("checked", sortColumn == null);
+ E("filters-sort-filter" + suffix).setAttribute("checked", sortColumnID == "col-filter");
+ E("filters-sort-enabled" + suffix).setAttribute("checked", sortColumnID == "col-enabled");
+ E("filters-sort-hitcount" + suffix).setAttribute("checked", sortColumnID == "col-hitcount");
+ E("filters-sort-lasthit" + suffix).setAttribute("checked", sortColumnID == "col-lasthit");
+ E("filters-sort-asc" + suffix).setAttribute("checked", sortDir == "ascending");
+ E("filters-sort-desc" + suffix).setAttribute("checked", sortDir == "descending");
+ },
+
+ /**
+ * Fills tooltip with the item data.
+ */
+ fillTooltip: function(event)
+ {
+ let item = FilterView.getItemAt(event.clientX, event.clientY);
+ if (!item || item.filter.dummy)
+ {
+ event.preventDefault();
+ return;
+ }
+
+ function setMultilineContent(box, text)
+ {
+ while (box.firstChild)
+ box.removeChild(box.firstChild);
+
+ for (var i = 0; i < text.length; i += 80)
+ {
+ var description = document.createElement("description");
+ description.setAttribute("value", text.substr(i, 80));
+ box.appendChild(description);
+ }
+ }
+
+ setMultilineContent(E("tooltip-filter"), item.filter.text);
+
+ E("tooltip-hitcount-row").hidden = !(item.filter instanceof ActiveFilter);
+ E("tooltip-lasthit-row").hidden = !(item.filter instanceof ActiveFilter) || !item.filter.lastHit;
+ if (item.filter instanceof ActiveFilter)
+ {
+ E("tooltip-hitcount").setAttribute("value", item.filter.hitCount)
+ E("tooltip-lasthit").setAttribute("value", Utils.formatTime(item.filter.lastHit))
+ }
+
+ E("tooltip-additional").hidden = false;
+ if (item.filter instanceof InvalidFilter && item.filter.reason)
+ E("tooltip-additional").textContent = item.filter.reason;
+ else if (item.filter instanceof RegExpFilter && defaultMatcher.isSlowFilter(item.filter))
+ E("tooltip-additional").textContent = Utils.getString("filter_regexp_tooltip");
+ else
+ E("tooltip-additional").hidden = true;
+ },
+
+ /**
+ * Called whenever a key is pressed on the list.
+ */
+ keyPress: function(/**Event*/ event)
+ {
+ if (event.target != E("filtersTree"))
+ return;
+
+ let modifiers = 0;
+ if (event.altKey)
+ modifiers |= SubscriptionActions._altMask;
+ if (event.ctrlKey)
+ modifiers |= SubscriptionActions._ctrlMask;
+ if (event.metaKey)
+ modifiers |= SubscriptionActions._metaMask;
+
+ if (event.charCode == " ".charCodeAt(0) && modifiers == 0 && !E("col-enabled").hidden)
+ this.selectionToggleDisabled();
+ else if (event.keyCode == Ci.nsIDOMKeyEvent.DOM_VK_UP && modifiers == SubscriptionActions._accelMask)
+ {
+ E("filters-moveUp-command").doCommand();
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ else if (event.keyCode == Ci.nsIDOMKeyEvent.DOM_VK_DOWN && modifiers == SubscriptionActions._accelMask)
+ {
+ E("filters-moveDown-command").doCommand();
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ },
+
+ /**
+ * Copies selected items to clipboard and optionally removes them from the
+ * list after that.
+ */
+ copySelected: function(/**Boolean*/ keep)
+ {
+ let items = FilterView.selectedItems;
+ if (!items.length)
+ return;
+
+ items.sort(function(entry1, entry2) entry1.index - entry2.index);
+ let text = items.map(function(i) i.filter.text).join(IO.lineBreak);
+ Utils.clipboardHelper.copyString(text);
+
+ if (!keep && FilterView.editable && !this.treeElement.editingColumn)
+ this.deleteItems(items);
+ },
+
+ /**
+ * Pastes text from clipboard as filters at the current position.
+ */
+ paste: function()
+ {
+ if (!FilterView.editable || this.treeElement.editingColumn)
+ return;
+
+ let transferable = Cc["@mozilla.org/widget/transferable;1"].createInstance(Ci.nsITransferable);
+ transferable.addDataFlavor("text/unicode");
+
+ let data;
+ try
+ {
+ data = {};
+ Utils.clipboard.getData(transferable, Utils.clipboard.kGlobalClipboard);
+ transferable.getTransferData("text/unicode", data, {});
+ data = data.value.QueryInterface(Ci.nsISupportsString).data;
+ }
+ catch (e) {
+ return;
+ }
+
+ let item = FilterView.currentItem;
+ let position = (item ? item.index : FilterView.data.length);
+
+ let lines = data.replace(/\r/g, "").split("\n");
+ for (let i = 0; i < lines.length; i++)
+ {
+ let line = Filter.normalize(lines[i]);
+ if (line)
+ {
+ let filter = Filter.fromText(line);
+ FilterStorage.addFilter(filter, FilterView._subscription, position++);
+ }
+ }
+ },
+
+ dragItems: null,
+
+ /**
+ * Called whenever the user starts a drag operation.
+ */
+ startDrag: function(/**Event*/ event)
+ {
+ let items = FilterView.selectedItems;
+ if (!items.length)
+ return;
+
+ items.sort(function(entry1, entry2) entry1.index - entry2.index);
+ event.dataTransfer.setData("text/plain", items.map(function(i) i.filter.text).join(IO.lineBreak));
+ this.dragItems = items;
+ event.stopPropagation();
+ },
+
+ /**
+ * Called to check whether moving the items to the given position is possible.
+ */
+ canDrop: function(/**Integer*/ newPosition, /**nsIDOMDataTransfer*/ dataTransfer)
+ {
+ if (!FilterView.editable || this.treeElement.editingColumn)
+ return false;
+
+ // If we aren't dragging items then maybe we got filters as plain text
+ if (!this.dragItems)
+ return dataTransfer && dataTransfer.getData("text/plain");
+
+ if (FilterView.isEmpty || FilterView.isSorted())
+ return false;
+
+ if (newPosition < this.dragItems[0].index)
+ return true;
+ else if (newPosition > this.dragItems[this.dragItems.length - 1].index + 1)
+ return true;
+ else
+ return false;
+ },
+
+ /**
+ * Called when the user decides to drop the items.
+ */
+ drop: function(/**Integer*/ newPosition, /**nsIDOMDataTransfer*/ dataTransfer)
+ {
+ if (!FilterView.editable || this.treeElement.editingColumn)
+ return;
+
+ if (!this.dragItems)
+ {
+ // We got filters as plain text, insert them into the list
+ let data = (dataTransfer ? dataTransfer.getData("text/plain") : null);
+ if (data)
+ {
+ let lines = data.replace(/\r/g, "").split("\n");
+ for (let i = 0; i < lines.length; i++)
+ {
+ let line = Filter.normalize(lines[i]);
+ if (line)
+ {
+ let filter = Filter.fromText(line);
+ FilterStorage.addFilter(filter, FilterView._subscription, newPosition++);
+ }
+ }
+ }
+ return;
+ }
+
+ if (FilterView.isEmpty || FilterView.isSorted())
+ return;
+
+ if (newPosition < this.dragItems[0].index)
+ this._moveItems(this.dragItems, newPosition - this.dragItems[0].index);
+ else if (newPosition > this.dragItems[this.dragItems.length - 1].index + 1)
+ this._moveItems(this.dragItems, newPosition - this.dragItems[this.dragItems.length - 1].index - 1);
+ },
+
+ /**
+ * Called whenever the a drag operation finishes.
+ */
+ endDrag: function(/**Event*/ event)
+ {
+ this.dragItems = null;
+ },
+
+ /**
+ * Called if filters have been dragged into a subscription and need to be removed.
+ */
+ removeDraggedFilters: function()
+ {
+ if (!this.dragItems)
+ return;
+
+ this.deleteItems(this.dragItems);
+ }
+};
+
+window.addEventListener("load", function()
+{
+ FilterActions.init();
+}, false);
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-filterview.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-filterview.js
new file mode 100644
index 0000000..dcee183
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-filterview.js
@@ -0,0 +1,849 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+/**
+ * nsITreeView implementation to display filters of a particular filter
+ * subscription.
+ * @class
+ */
+var FilterView =
+{
+ /**
+ * Initialization function.
+ */
+ init: function()
+ {
+ // "Manually" remove access key for col-slow tooltip, Utils.splitAllLabels()
+ // won't do it.
+ let slowColumn = document.getElementById("col-slow");
+ if (slowColumn)
+ {
+ for (let attr of ["display", "tooltiptext"])
+ {
+ let value = slowColumn.getAttribute(attr);
+ if (!value)
+ continue;
+ let [label, accessKey] = Utils.splitLabel(value);
+ if (label != value)
+ slowColumn.setAttribute(attr, label);
+ }
+ }
+
+ if (this.sortProcs)
+ return;
+
+ function compareText(/**Filter*/ filter1, /**Filter*/ filter2)
+ {
+ if (filter1.text < filter2.text)
+ return -1;
+ else if (filter1.text > filter2.text)
+ return 1;
+ else
+ return 0;
+ }
+ function compareSlow(/**Filter*/ filter1, /**Filter*/ filter2)
+ {
+ let isSlow1 = filter1 instanceof RegExpFilter && defaultMatcher.isSlowFilter(filter1);
+ let isSlow2 = filter2 instanceof RegExpFilter && defaultMatcher.isSlowFilter(filter2);
+ return isSlow1 - isSlow2;
+ }
+ function compareEnabled(/**Filter*/ filter1, /**Filter*/ filter2)
+ {
+ let hasEnabled1 = (filter1 instanceof ActiveFilter ? 1 : 0);
+ let hasEnabled2 = (filter2 instanceof ActiveFilter ? 1 : 0);
+ if (hasEnabled1 != hasEnabled2)
+ return hasEnabled1 - hasEnabled2;
+ else if (hasEnabled1)
+ return (filter2.disabled - filter1.disabled);
+ else
+ return 0;
+ }
+ function compareHitCount(/**Filter*/ filter1, /**Filter*/ filter2)
+ {
+ let hasHitCount1 = (filter1 instanceof ActiveFilter ? 1 : 0);
+ let hasHitCount2 = (filter2 instanceof ActiveFilter ? 1 : 0);
+ if (hasHitCount1 != hasHitCount2)
+ return hasHitCount1 - hasHitCount2;
+ else if (hasHitCount1)
+ return filter1.hitCount - filter2.hitCount;
+ else
+ return 0;
+ }
+ function compareLastHit(/**Filter*/ filter1, /**Filter*/ filter2)
+ {
+ let hasLastHit1 = (filter1 instanceof ActiveFilter ? 1 : 0);
+ let hasLastHit2 = (filter2 instanceof ActiveFilter ? 1 : 0);
+ if (hasLastHit1 != hasLastHit2)
+ return hasLastHit1 - hasLastHit2;
+ else if (hasLastHit1)
+ return filter1.lastHit - filter2.lastHit;
+ else
+ return 0;
+ }
+
+ /**
+ * Creates a sort function from a primary and a secondary comparison function.
+ * @param {Function} cmpFunc comparison function to be called first
+ * @param {Function} fallbackFunc (optional) comparison function to be called if primary function returns 0
+ * @param {Boolean} desc if true, the result of the primary function (not the secondary function) will be reversed - sorting in descending order
+ * @result {Function} comparison function to be used
+ */
+ function createSortFunction(cmpFunc, fallbackFunc, desc)
+ {
+ let factor = (desc ? -1 : 1);
+
+ return function(entry1, entry2)
+ {
+ // Comment replacements not bound to a filter always go last
+ let isLast1 = ("origFilter" in entry1 && entry1.filter == null);
+ let isLast2 = ("origFilter" in entry2 && entry2.filter == null);
+ if (isLast1)
+ return (isLast2 ? 0 : 1)
+ else if (isLast2)
+ return -1;
+
+ let ret = cmpFunc(entry1.filter, entry2.filter);
+ if (ret == 0 && fallbackFunc)
+ return fallbackFunc(entry1.filter, entry2.filter);
+ else
+ return factor * ret;
+ }
+ }
+
+ this.sortProcs = {
+ filter: createSortFunction(compareText, null, false),
+ filterDesc: createSortFunction(compareText, null, true),
+ slow: createSortFunction(compareSlow, compareText, true),
+ slowDesc: createSortFunction(compareSlow, compareText, false),
+ enabled: createSortFunction(compareEnabled, compareText, false),
+ enabledDesc: createSortFunction(compareEnabled, compareText, true),
+ hitcount: createSortFunction(compareHitCount, compareText, false),
+ hitcountDesc: createSortFunction(compareHitCount, compareText, true),
+ lasthit: createSortFunction(compareLastHit, compareText, false),
+ lasthitDesc: createSortFunction(compareLastHit, compareText, true)
+ };
+
+ let me = this;
+ let proxy = function()
+ {
+ return me._onChange.apply(me, arguments);
+ };
+ FilterNotifier.addListener(proxy);
+ window.addEventListener("unload", function()
+ {
+ FilterNotifier.removeListener(proxy);
+ }, false);
+ },
+
+ /**
+ * Filter change processing.
+ * @see FilterNotifier.addListener()
+ */
+ _onChange: function(action, item, param1, param2, param3)
+ {
+ switch (action)
+ {
+ case "subscription.updated":
+ {
+ if (item == this._subscription)
+ this.refresh(true);
+ break;
+ }
+ case "filter.disabled":
+ case "filter.hitCount":
+ case "filter.lastHit":
+ {
+ this.updateFilter(item);
+ break;
+ }
+ case "filter.added":
+ {
+ let subscription = param1;
+ let position = param2;
+ if (subscription == this._subscription)
+ this.addFilterAt(position, item);
+ break;
+ }
+ case "filter.removed":
+ {
+ let subscription = param1;
+ let position = param2;
+ if (subscription == this._subscription)
+ this.removeFilterAt(position);
+ break;
+ }
+ case "filter.moved":
+ {
+ let subscription = param1;
+ let oldPosition = param2;
+ let newPosition = param3;
+ if (subscription == this._subscription)
+ this.moveFilterAt(oldPosition, newPosition);
+ break;
+ }
+ }
+ },
+
+ /**
+ * Box object of the tree that this view is attached to.
+ * @type nsITreeBoxObject
+ */
+ boxObject: null,
+
+ /**
+ * Map of used cell properties to the corresponding nsIAtom representations.
+ */
+ atoms: null,
+
+ /**
+ * "Filter" to be displayed if no filter group is selected.
+ */
+ noGroupDummy: null,
+
+ /**
+ * "Filter" to be displayed if the selected group is empty.
+ */
+ noFiltersDummy: null,
+
+ /**
+ * "Filter" to be displayed for a new filter being edited.
+ */
+ editDummy: null,
+
+ /**
+ * Displayed list of filters, might be sorted.
+ * @type Filter[]
+ */
+ data: [],
+
+ /**
+ * <tree> element that the view is attached to.
+ * @type XULElement
+ */
+ get treeElement() this.boxObject ? this.boxObject.treeBody.parentNode : null,
+
+ /**
+ * Checks whether the list is currently empty (regardless of dummy entries).
+ * @type Boolean
+ */
+ get isEmpty()
+ {
+ return !this._subscription || !this._subscription.filters.length;
+ },
+
+ /**
+ * Checks whether the filters in the view can be changed.
+ * @type Boolean
+ */
+ get editable()
+ {
+ return (FilterView._subscription instanceof SpecialSubscription);
+ },
+
+ /**
+ * Returns current item of the list.
+ * @type Object
+ */
+ get currentItem()
+ {
+ let index = this.selection.currentIndex;
+ if (index >= 0 && index < this.data.length)
+ return this.data[index];
+ return null;
+ },
+
+ /**
+ * Returns items that are currently selected in the list.
+ * @type Object[]
+ */
+ get selectedItems()
+ {
+ let items = []
+ for (let i = 0; i < this.selection.getRangeCount(); i++)
+ {
+ let min = {};
+ let max = {};
+ this.selection.getRangeAt(i, min, max);
+ for (let j = min.value; j <= max.value; j++)
+ if (j >= 0 && j < this.data.length)
+ items.push(this.data[j]);
+ }
+ return items;
+ },
+
+ getItemAt: function(x, y)
+ {
+ let row = this.boxObject.getRowAt(x, y);
+ if (row >= 0 && row < this.data.length)
+ return this.data[row];
+ else
+ return null;
+ },
+
+ _subscription: 0,
+
+ /**
+ * Filter subscription being displayed.
+ * @type Subscription
+ */
+ get subscription() this._subscription,
+ set subscription(value)
+ {
+ if (value == this._subscription)
+ return;
+
+ // Make sure the editor is done before we update the list.
+ if (this.treeElement)
+ this.treeElement.stopEditing(true);
+
+ this._subscription = value;
+ this.refresh(true);
+ },
+
+ /**
+ * Will be true if updates are outstanding because the list was hidden.
+ */
+ _dirty: false,
+
+ /**
+ * Updates internal view data after a change.
+ * @param {Boolean} force if false, a refresh will only happen if previous
+ * changes were suppressed because the list was hidden
+ */
+ refresh: function(force)
+ {
+ if (FilterActions.visible)
+ {
+ if (!force && !this._dirty)
+ return;
+ this._dirty = false;
+ this.updateData();
+ this.selectRow(0);
+ }
+ else
+ this._dirty = true;
+ },
+
+ /**
+ * Map of comparison functions by column ID or column ID + "Desc" for
+ * descending sort order.
+ * @const
+ */
+ sortProcs: null,
+
+ /**
+ * Column that the list is currently sorted on.
+ * @type Element
+ */
+ sortColumn: null,
+
+ /**
+ * Sorting function currently in use.
+ * @type Function
+ */
+ sortProc: null,
+
+ /**
+ * Resorts the list.
+ * @param {String} col ID of the column to sort on. If null, the natural order is restored.
+ * @param {String} direction "ascending" or "descending", if null the sort order is toggled.
+ */
+ sortBy: function(col, direction)
+ {
+ let newSortColumn = null;
+ if (col)
+ {
+ newSortColumn = this.boxObject.columns.getNamedColumn(col).element;
+ if (!direction)
+ {
+ if (this.sortColumn == newSortColumn)
+ direction = (newSortColumn.getAttribute("sortDirection") == "ascending" ? "descending" : "ascending");
+ else
+ direction = "ascending";
+ }
+ }
+
+ if (this.sortColumn && this.sortColumn != newSortColumn)
+ this.sortColumn.removeAttribute("sortDirection");
+
+ this.sortColumn = newSortColumn;
+ if (this.sortColumn)
+ {
+ this.sortColumn.setAttribute("sortDirection", direction);
+ this.sortProc = this.sortProcs[col.replace(/^col-/, "") + (direction == "descending" ? "Desc" : "")];
+ }
+ else
+ this.sortProc = null;
+
+ if (this.data.length > 1)
+ {
+ this.updateData();
+ this.boxObject.invalidate();
+ }
+ },
+
+ /**
+ * Inserts dummy entry into the list if necessary.
+ */
+ addDummyRow: function()
+ {
+ if (this.boxObject && this.data.length == 0)
+ {
+ if (this._subscription)
+ this.data.splice(0, 0, this.noFiltersDummy);
+ else
+ this.data.splice(0, 0, this.noGroupDummy);
+ this.boxObject.rowCountChanged(0, 1);
+ }
+ },
+
+ /**
+ * Removes dummy entry from the list if present.
+ */
+ removeDummyRow: function()
+ {
+ if (this.boxObject && this.isEmpty && this.data.length)
+ {
+ this.data.splice(0, 1);
+ this.boxObject.rowCountChanged(0, -1);
+ }
+ },
+
+ /**
+ * Inserts dummy row when a new filter is being edited.
+ */
+ insertEditDummy: function()
+ {
+ FilterView.removeDummyRow();
+ let position = this.selection.currentIndex;
+ if (position >= this.data.length)
+ position = this.data.length - 1;
+ if (position < 0)
+ position = 0;
+
+ this.editDummy.index = (position < this.data.length ? this.data[position].index : this.data.length);
+ this.editDummy.position = position;
+ this.data.splice(position, 0, this.editDummy);
+ this.boxObject.rowCountChanged(position, 1);
+ this.selectRow(position);
+ },
+
+ /**
+ * Removes dummy row once the edit is finished.
+ */
+ removeEditDummy: function()
+ {
+ let position = this.editDummy.position;
+ if (typeof position != "undefined" && position < this.data.length && this.data[position] == this.editDummy)
+ {
+ this.data.splice(position, 1);
+ this.boxObject.rowCountChanged(position, -1);
+ FilterView.addDummyRow();
+
+ this.selectRow(position);
+ }
+ },
+
+ /**
+ * Selects a row in the tree and makes sure it is visible.
+ */
+ selectRow: function(row)
+ {
+ if (this.selection)
+ {
+ row = Math.min(Math.max(row, 0), this.data.length - 1);
+ this.selection.select(row);
+ this.boxObject.ensureRowIsVisible(row);
+ }
+ },
+
+ /**
+ * Finds a particular filter in the list and selects it.
+ */
+ selectFilter: function(/**Filter*/ filter)
+ {
+ let index = -1;
+ for (let i = 0; i < this.data.length; i++)
+ {
+ if (this.data[i].filter == filter)
+ {
+ index = i;
+ break;
+ }
+ }
+ if (index >= 0)
+ {
+ this.selectRow(index);
+ this.treeElement.focus();
+ }
+ },
+
+ /**
+ * Updates value of data property on sorting or filter subscription changes.
+ */
+ updateData: function()
+ {
+ let oldCount = this.rowCount;
+ if (this._subscription && this._subscription.filters.length)
+ {
+ this.data = this._subscription.filters.map(function(f, i) ({index: i, filter: f}));
+ if (this.sortProc)
+ {
+ // Hide comments in the list, they should be sorted like the filter following them
+ let followingFilter = null;
+ for (let i = this.data.length - 1; i >= 0; i--)
+ {
+ if (this.data[i].filter instanceof CommentFilter)
+ {
+ this.data[i].origFilter = this.data[i].filter;
+ this.data[i].filter = followingFilter;
+ }
+ else
+ followingFilter = this.data[i].filter;
+ }
+
+ this.data.sort(this.sortProc);
+
+ // Restore comments
+ for (let i = 0; i < this.data.length; i++)
+ {
+ if ("origFilter" in this.data[i])
+ {
+ this.data[i].filter = this.data[i].origFilter;
+ delete this.data[i].origFilter;
+ }
+ }
+ }
+ }
+ else
+ this.data = [];
+
+ if (this.boxObject)
+ {
+ this.boxObject.rowCountChanged(0, -oldCount);
+ this.boxObject.rowCountChanged(0, this.rowCount);
+ }
+
+ this.addDummyRow();
+ },
+
+ /**
+ * Called to update the view when a filter property is changed.
+ */
+ updateFilter: function(/**Filter*/ filter)
+ {
+ for (let i = 0; i < this.data.length; i++)
+ if (this.data[i].filter == filter)
+ this.boxObject.invalidateRow(i);
+ },
+
+ /**
+ * Called if a filter has been inserted at the specified position.
+ */
+ addFilterAt: function(/**Integer*/ position, /**Filter*/ filter)
+ {
+ if (this.data.length == 1 && this.data[0].filter.dummy)
+ {
+ this.data.splice(0, 1);
+ this.boxObject.rowCountChanged(0, -1);
+ }
+
+ if (this.sortProc)
+ {
+ this.updateData();
+ for (let i = 0; i < this.data.length; i++)
+ {
+ if (this.data[i].index == position)
+ {
+ position = i;
+ break;
+ }
+ }
+ }
+ else
+ {
+ for (let i = 0; i < this.data.length; i++)
+ if (this.data[i].index >= position)
+ this.data[i].index++;
+ this.data.splice(position, 0, {index: position, filter: filter});
+ }
+ this.boxObject.rowCountChanged(position, 1);
+ this.selectRow(position);
+ },
+
+ /**
+ * Called if a filter has been removed at the specified position.
+ */
+ removeFilterAt: function(/**Integer*/ position)
+ {
+ for (let i = 0; i < this.data.length; i++)
+ {
+ if (this.data[i].index == position)
+ {
+ this.data.splice(i, 1);
+ this.boxObject.rowCountChanged(i, -1);
+ i--;
+ }
+ else if (this.data[i].index > position)
+ this.data[i].index--;
+ }
+ this.addDummyRow();
+ },
+
+ /**
+ * Called if a filter has been moved within the list.
+ */
+ moveFilterAt: function(/**Integer*/ oldPosition, /**Integer*/ newPosition)
+ {
+ let dir = (oldPosition < newPosition ? 1 : -1);
+ for (let i = 0; i < this.data.length; i++)
+ {
+ if (this.data[i].index == oldPosition)
+ this.data[i].index = newPosition;
+ else if (dir * this.data[i].index > dir * oldPosition && dir * this.data[i].index <= dir * newPosition)
+ this.data[i].index -= dir;
+ }
+
+ if (!this.sortProc)
+ {
+ let item = this.data[oldPosition];
+ this.data.splice(oldPosition, 1);
+ this.data.splice(newPosition, 0, item);
+ this.boxObject.invalidateRange(Math.min(oldPosition, newPosition), Math.max(oldPosition, newPosition));
+ }
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsITreeView]),
+
+ setTree: function(boxObject)
+ {
+ this.init();
+ this.boxObject = boxObject;
+
+ if (this.boxObject)
+ {
+ this.noGroupDummy = {index: 0, filter: {text: this.boxObject.treeBody.getAttribute("noGroupText"), dummy: true}};
+ this.noFiltersDummy = {index: 0, filter: {text: this.boxObject.treeBody.getAttribute("noFiltersText"), dummy: true}};
+ this.editDummy = {filter: {text: ""}};
+
+ let atomService = Cc["@mozilla.org/atom-service;1"].getService(Ci.nsIAtomService);
+ let stringAtoms = ["col-filter", "col-enabled", "col-hitcount", "col-lasthit", "type-comment", "type-filterlist", "type-whitelist", "type-elemhide", "type-elemhideexception", "type-invalid"];
+ let boolAtoms = ["selected", "dummy", "slow", "disabled"];
+
+ this.atoms = {};
+ for each (let atom in stringAtoms)
+ this.atoms[atom] = atomService.getAtom(atom);
+ for each (let atom in boolAtoms)
+ {
+ this.atoms[atom + "-true"] = atomService.getAtom(atom + "-true");
+ this.atoms[atom + "-false"] = atomService.getAtom(atom + "-false");
+ }
+
+ let columns = this.boxObject.columns;
+ for (let i = 0; i < columns.length; i++)
+ if (columns[i].element.hasAttribute("sortDirection"))
+ this.sortBy(columns[i].id, columns[i].element.getAttribute("sortDirection"));
+
+ this.refresh(true);
+ }
+ },
+
+ selection: null,
+
+ get rowCount() this.data.length,
+
+ getCellText: function(row, col)
+ {
+ if (row < 0 || row >= this.data.length)
+ return null;
+
+ col = col.id;
+ if (col != "col-filter" && col != "col-slow" && col != "col-hitcount" && col != "col-lasthit")
+ return null;
+
+ let filter = this.data[row].filter;
+ if (col == "col-filter")
+ return filter.text;
+ else if (col == "col-slow")
+ return (filter instanceof RegExpFilter && defaultMatcher.isSlowFilter(filter) ? "!" : null);
+ else if (filter instanceof ActiveFilter)
+ {
+ if (col == "col-hitcount")
+ return filter.hitCount;
+ else if (col == "col-lasthit")
+ return (filter.lastHit ? Utils.formatTime(filter.lastHit) : null);
+ }
+
+ return null;
+ },
+
+ generateProperties: function(list, properties)
+ {
+ if (properties)
+ {
+ // Gecko 21 and below: we have an nsISupportsArray parameter, add atoms
+ // to that.
+ for (let i = 0; i < list.length; i++)
+ if (list[i] in this.atoms)
+ properties.AppendElement(this.atoms[list[i]]);
+ return null;
+ }
+ else
+ {
+ // Gecko 22+: no parameter, just return a string
+ return list.join(" ");
+ }
+ },
+
+ getColumnProperties: function(col, properties)
+ {
+ return this.generateProperties(["col-" + col.id], properties);
+ },
+
+ getRowProperties: function(row, properties)
+ {
+ if (row < 0 || row >= this.data.length)
+ return "";
+
+ let list = [];
+ let filter = this.data[row].filter;
+ list.push("selected-" + this.selection.isSelected(row));
+ list.push("slow-" + (filter instanceof RegExpFilter && defaultMatcher.isSlowFilter(filter)));
+ if (filter instanceof ActiveFilter)
+ list.push("disabled-" + filter.disabled);
+ list.push("dummy-" + ("dummy" in filter));
+
+ if (filter instanceof CommentFilter)
+ list.push("type-comment");
+ else if (filter instanceof BlockingFilter)
+ list.push("type-filterlist");
+ else if (filter instanceof WhitelistFilter)
+ list.push("type-whitelist");
+ else if (filter instanceof ElemHideFilter)
+ list.push("type-elemhide");
+ else if (filter instanceof ElemHideException)
+ list.push("type-elemhideexception");
+ else if (filter instanceof InvalidFilter)
+ list.push("type-invalid");
+
+ return this.generateProperties(list, properties);
+ },
+
+ getCellProperties: function(row, col, properties)
+ {
+ return this.getRowProperties(row, properties) + " " + this.getColumnProperties(col, properties);
+ },
+
+ cycleHeader: function(col)
+ {
+ let oldDirection = col.element.getAttribute("sortDirection");
+ if (oldDirection == "ascending")
+ this.sortBy(col.id, "descending");
+ else if (oldDirection == "descending")
+ this.sortBy(null, null);
+ else
+ this.sortBy(col.id, "ascending");
+ },
+
+ isSorted: function()
+ {
+ return (this.sortProc != null);
+ },
+
+ canDrop: function(row, orientation, dataTransfer)
+ {
+ if (orientation == Ci.nsITreeView.DROP_ON || row < 0 || row >= this.data.length || !this.editable)
+ return false;
+
+ let item = this.data[row];
+ let position = (orientation == Ci.nsITreeView.DROP_BEFORE ? item.index : item.index + 1);
+ return FilterActions.canDrop(position, dataTransfer);
+ },
+
+ drop: function(row, orientation, dataTransfer)
+ {
+ if (orientation == Ci.nsITreeView.DROP_ON || row < 0 || row >= this.data.length || !this.editable)
+ return;
+
+ let item = this.data[row];
+ let position = (orientation == Ci.nsITreeView.DROP_BEFORE ? item.index : item.index + 1);
+ FilterActions.drop(position, dataTransfer);
+ },
+
+ isEditable: function(row, col)
+ {
+ if (row < 0 || row >= this.data.length || !this.editable)
+ return false;
+
+ let filter = this.data[row].filter;
+ if (col.id == "col-filter")
+ return !("dummy" in filter);
+ else
+ return false;
+ },
+
+ setCellText: function(row, col, value)
+ {
+ if (row < 0 || row >= this.data.length || col.id != "col-filter")
+ return;
+
+ let oldFilter = this.data[row].filter;
+ let position = this.data[row].index;
+ value = Filter.normalize(value);
+ if (!value || value == oldFilter.text)
+ return;
+
+ // Make sure we don't get called recursively (see https://adblockplus.org/forum/viewtopic.php?t=9003)
+ this.treeElement.stopEditing();
+
+ let newFilter = Filter.fromText(value);
+ if (this.data[row] == this.editDummy)
+ this.removeEditDummy();
+ else
+ FilterStorage.removeFilter(oldFilter, this._subscription, position);
+ FilterStorage.addFilter(newFilter, this._subscription, position);
+ },
+
+ cycleCell: function(row, col)
+ {
+ if (row < 0 || row >= this.data.length || col.id != "col-enabled")
+ return;
+
+ let filter = this.data[row].filter;
+ if (filter instanceof ActiveFilter)
+ filter.disabled = !filter.disabled;
+ },
+
+ isContainer: function(row) false,
+ isContainerOpen: function(row) false,
+ isContainerEmpty: function(row) true,
+ getLevel: function(row) 0,
+ getParentIndex: function(row) -1,
+ hasNextSibling: function(row, afterRow) false,
+ toggleOpenState: function(row) {},
+ getProgressMode: function() null,
+ getImageSrc: function() null,
+ isSeparator: function() false,
+ performAction: function() {},
+ performActionOnRow: function() {},
+ performActionOnCell: function() {},
+ getCellValue: function() null,
+ setCellValue: function() {},
+ selectionChanged: function() {},
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-search.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-search.js
new file mode 100644
index 0000000..4e817ac
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-search.js
@@ -0,0 +1,269 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * Implementation of the filter search functionality.
+ * @class
+ */
+var FilterSearch =
+{
+ /**
+ * Initializes findbar widget.
+ */
+ init: function()
+ {
+ let findbar = E("findbar");
+ findbar.browser = FilterSearch.fakeBrowser;
+
+ findbar.addEventListener("keypress", function(event)
+ {
+ // Work-around for bug 490047
+ if (event.keyCode == KeyEvent.DOM_VK_RETURN)
+ event.preventDefault();
+ }, false);
+
+ // Hack to prevent "highlight all" from getting enabled
+ findbar.toggleHighlight = function() {};
+ },
+
+ /**
+ * Performs a text search.
+ * @param {String} text text to be searched
+ * @param {Integer} direction search direction: -1 (backwards), 0 (forwards
+ * starting with current), 1 (forwards starting with next)
+ * @param {Boolean} caseSensitive if true, a case-sensitive search is performed
+ * @result {Integer} one of the nsITypeAheadFind constants
+ */
+ search: function(text, direction, caseSensitive)
+ {
+ function normalizeString(string) caseSensitive ? string : string.toLowerCase();
+
+ function findText(text, direction, startIndex)
+ {
+ let list = E("filtersTree");
+ let col = list.columns.getNamedColumn("col-filter");
+ let count = list.view.rowCount;
+ for (let i = startIndex + direction; i >= 0 && i < count; i += (direction || 1))
+ {
+ let filter = normalizeString(list.view.getCellText(i, col));
+ if (filter.indexOf(text) >= 0)
+ {
+ FilterView.selectRow(i);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ text = normalizeString(text);
+
+ // First try to find the entry in the current list
+ if (findText(text, direction, E("filtersTree").currentIndex))
+ return Ci.nsITypeAheadFind.FIND_FOUND;
+
+ // Now go through the other subscriptions
+ let result = Ci.nsITypeAheadFind.FIND_FOUND;
+ let subscriptions = FilterStorage.subscriptions.slice();
+ subscriptions.sort(function(s1, s2) (s1 instanceof SpecialSubscription) - (s2 instanceof SpecialSubscription));
+ let current = subscriptions.indexOf(FilterView.subscription);
+ direction = direction || 1;
+ for (let i = current + direction; ; i+= direction)
+ {
+ if (i < 0)
+ {
+ i = subscriptions.length - 1;
+ result = Ci.nsITypeAheadFind.FIND_WRAPPED;
+ }
+ else if (i >= subscriptions.length)
+ {
+ i = 0;
+ result = Ci.nsITypeAheadFind.FIND_WRAPPED;
+ }
+ if (i == current)
+ break;
+
+ let subscription = subscriptions[i];
+ for (let j = 0; j < subscription.filters.length; j++)
+ {
+ let filter = normalizeString(subscription.filters[j].text);
+ if (filter.indexOf(text) >= 0)
+ {
+ let list = E(subscription instanceof SpecialSubscription ? "groups" : "subscriptions");
+ let node = Templater.getNodeForData(list, "subscription", subscription);
+ if (!node)
+ break;
+
+ // Select subscription in its list and restore focus after that
+ let oldFocus = document.commandDispatcher.focusedElement;
+ E("tabs").selectedIndex = (subscription instanceof SpecialSubscription ? 1 : 0);
+ list.ensureElementIsVisible(node);
+ list.selectItem(node);
+ if (oldFocus)
+ {
+ oldFocus.focus();
+ Utils.runAsync(oldFocus.focus, oldFocus);
+ }
+
+ Utils.runAsync(findText, null, text, direction, direction == 1 ? -1 : subscription.filters.length);
+ return result;
+ }
+ }
+ }
+
+ return Ci.nsITypeAheadFind.FIND_NOTFOUND;
+ }
+};
+
+/**
+ * Fake browser implementation to make findbar widget happy - searches in
+ * the filter list.
+ */
+FilterSearch.fakeBrowser =
+{
+ finder:
+ {
+ _resultListeners: [],
+ searchString: null,
+ caseSensitive: false,
+ lastResult: null,
+
+ _notifyResultListeners: function(result, findBackwards)
+ {
+ this.lastResult = result;
+ for each (let listener in this._resultListeners)
+ listener.onFindResult(result, findBackwards);
+ },
+
+ fastFind: function(searchString, linksOnly, drawOutline)
+ {
+ this.searchString = searchString;
+ let result = FilterSearch.search(this.searchString, 0,
+ this.caseSensitive);
+ this._notifyResultListeners(result, false);
+ },
+
+ findAgain: function(findBackwards, linksOnly, drawOutline)
+ {
+ let result = FilterSearch.search(this.searchString,
+ findBackwards ? -1 : 1,
+ this.caseSensitive);
+ this._notifyResultListeners(result, findBackwards);
+ },
+
+ addResultListener: function(listener)
+ {
+ if (this._resultListeners.indexOf(listener) === -1)
+ this._resultListeners.push(listener);
+ },
+
+ removeResultListener: function(listener)
+ {
+ let index = this._resultListeners.indexOf(listener);
+ if (index !== -1)
+ this._resultListeners.splice(index, 1);
+ },
+
+ // Irrelevant for us
+ highlight: function(highlight, word) {},
+ enableSelection: function() {},
+ removeSelection: function() {},
+ focusContent: function() {},
+ keyPress: function() {}
+ },
+
+ get _lastSearchString()
+ {
+ return this.finder.searchString;
+ },
+
+ // This was used before Firefox 27 instead of the "finder" property.
+ fastFind:
+ {
+ get searchString()
+ {
+ return FilterSearch.fakeBrowser.finder.searchString;
+ },
+
+ set searchString(searchString)
+ {
+ FilterSearch.fakeBrowser.finder.searchString = searchString;
+ },
+
+ foundLink: null,
+ foundEditable: null,
+
+ get caseSensitive()
+ {
+ return FilterSearch.fakeBrowser.finder.caseSensitive;
+ },
+
+ set caseSensitive(caseSensitive)
+ {
+ FilterSearch.fakeBrowser.finder.caseSensitive = caseSensitive;
+ },
+
+ get currentWindow() FilterSearch.fakeBrowser.contentWindow,
+
+ find: function(searchString, linksOnly)
+ {
+ FilterSearch.fakeBrowser.finder.fastFind(searchString, linksOnly);
+ return FilterSearch.fakeBrowser.finder.lastResult;
+ },
+
+ findAgain: function(findBackwards, linksOnly)
+ {
+ FilterSearch.fakeBrowser.finder.findAgain(findBackwards, linksOnly);
+ return FilterSearch.fakeBrowser.finder.lastResult;
+ },
+
+ // Irrelevant for us
+ init: function() {},
+ setDocShell: function() {},
+ setSelectionModeAndRepaint: function() {},
+ collapseSelection: function() {}
+ },
+ currentURI: Utils.makeURI("http://example.com/"),
+ contentWindow:
+ {
+ focus: function()
+ {
+ E("filtersTree").focus();
+ },
+ scrollByLines: function(num)
+ {
+ E("filtersTree").boxObject.scrollByLines(num);
+ },
+ scrollByPages: function(num)
+ {
+ E("filtersTree").boxObject.scrollByPages(num);
+ },
+ },
+
+ addEventListener: function(event, handler, capture)
+ {
+ E("filtersTree").addEventListener(event, handler, capture);
+ },
+ removeEventListener: function(event, handler, capture)
+ {
+ E("filtersTree").addEventListener(event, handler, capture);
+ },
+};
+
+window.addEventListener("load", function()
+{
+ FilterSearch.init();
+}, false);
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-subscriptionactions.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-subscriptionactions.js
new file mode 100644
index 0000000..222a4a6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-subscriptionactions.js
@@ -0,0 +1,606 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * Implemetation of the various actions that can be performed on subscriptions.
+ * @class
+ */
+var SubscriptionActions =
+{
+ /**
+ * Returns the subscription list currently having focus if any.
+ * @type Element
+ */
+ get focusedList()
+ {
+ return E("tabs").selectedPanel.getElementsByTagName("richlistbox")[0];
+ },
+
+ /**
+ * Returns the currently selected and focused subscription item if any.
+ * @type Element
+ */
+ get selectedItem()
+ {
+ let list = this.focusedList;
+ return (list ? list.selectedItem : null);
+ },
+
+ /**
+ * Finds the subscription for a particular filter, selects it and selects the
+ * filter.
+ */
+ selectFilter: function(/**Filter*/ filter)
+ {
+ let node = null;
+ let tabIndex = -1;
+ let subscriptions = filter.subscriptions.slice();
+ subscriptions.sort(function(s1, s2) s1.disabled - s2.disabled);
+ for (let i = 0; i < subscriptions.length; i++)
+ {
+ let subscription = subscriptions[i];
+ let list = E(subscription instanceof SpecialSubscription ? "groups" : "subscriptions");
+ tabIndex = (subscription instanceof SpecialSubscription ? 1 : 0);
+ node = Templater.getNodeForData(list, "subscription", subscription);
+ if (node)
+ break;
+ }
+ if (node)
+ {
+ E("tabs").selectedIndex = tabIndex;
+ Utils.runAsync(function()
+ {
+ node.parentNode.ensureElementIsVisible(node);
+ node.parentNode.selectItem(node);
+ if (!FilterActions.visible)
+ E("subscription-showHideFilters-command").doCommand();
+ Utils.runAsync(FilterView.selectFilter, FilterView, filter);
+ });
+ }
+ },
+
+ /**
+ * Updates subscription commands whenever the selected subscription changes.
+ * Note: this method might be called with a wrong "this" value.
+ */
+ updateCommands: function()
+ {
+ let node = SubscriptionActions.selectedItem;
+ let data = Templater.getDataForNode(node);
+ let subscription = (data ? data.subscription : null)
+ E("subscription-editTitle-command").setAttribute("disabled", !subscription ||
+ subscription.fixedTitle);
+ E("subscription-update-command").setAttribute("disabled", !subscription ||
+ !(subscription instanceof DownloadableSubscription) ||
+ Synchronizer.isExecuting(subscription.url));
+ E("subscription-moveUp-command").setAttribute("disabled", !subscription ||
+ !node || !node.previousSibling || !!node.previousSibling.id);
+ E("subscription-moveDown-command").setAttribute("disabled", !subscription ||
+ !node || !node.nextSibling || !!node.nextSibling.id);
+ },
+
+ /**
+ * Starts title editing for the selected subscription.
+ */
+ editTitle: function()
+ {
+ let node = this.selectedItem;
+ if (node)
+ TitleEditor.start(node);
+ },
+
+ /**
+ * Triggers re-download of a filter subscription.
+ */
+ updateFilters: function(/**Node*/ node)
+ {
+ let data = Templater.getDataForNode(node || this.selectedItem);
+ if (data && data.subscription instanceof DownloadableSubscription)
+ Synchronizer.execute(data.subscription, true);
+ },
+
+ /**
+ * Triggers re-download of all filter subscriptions.
+ */
+ updateAllFilters: function()
+ {
+ for (let i = 0; i < FilterStorage.subscriptions.length; i++)
+ {
+ let subscription = FilterStorage.subscriptions[i];
+ if (subscription instanceof DownloadableSubscription)
+ Synchronizer.execute(subscription, true);
+ }
+ },
+
+ /**
+ * Sets Subscription.disabled field to a new value.
+ */
+ setDisabled: function(/**Element*/ node, /**Boolean*/ value)
+ {
+ let data = Templater.getDataForNode(node || this.selectedItem);
+ if (data)
+ data.subscription.disabled = value;
+ },
+
+ /**
+ * Enables all disabled filters in a subscription.
+ */
+ enableFilters: function(/**Element*/ node)
+ {
+ let data = Templater.getDataForNode(node);
+ if (!data)
+ return;
+
+ let filters = data.subscription.filters;
+ for (let i = 0, l = filters.length; i < l; i++)
+ if (filters[i] instanceof ActiveFilter && filters[i].disabled)
+ filters[i].disabled = false;
+ },
+
+ /**
+ * Removes a filter subscription from the list (after a warning).
+ */
+ remove: function(/**Node*/ node)
+ {
+ let data = Templater.getDataForNode(node || this.selectedItem);
+ if (data && Utils.confirm(window, Utils.getString(data.subscription instanceof SpecialSubscription ? "remove_group_warning" : "remove_subscription_warning")))
+ FilterStorage.removeSubscription(data.subscription);
+ },
+
+ /**
+ * Adds a new filter group and allows the user to change its title.
+ */
+ addGroup: function()
+ {
+ let subscription = SpecialSubscription.create();
+ FilterStorage.addSubscription(subscription);
+
+ let list = E("groups");
+ let node = Templater.getNodeForData(list, "subscription", subscription);
+ if (node)
+ {
+ list.focus();
+ list.ensureElementIsVisible(node);
+ list.selectedItem = node;
+ this.editTitle();
+ }
+ },
+
+ /**
+ * Moves a filter subscription one line up.
+ */
+ moveUp: function(/**Node*/ node)
+ {
+ node = Templater.getDataNode(node || this.selectedItem);
+ let data = Templater.getDataForNode(node);
+ if (!data)
+ return;
+
+ let previousData = Templater.getDataForNode(node.previousSibling);
+ if (!previousData)
+ return;
+
+ FilterStorage.moveSubscription(data.subscription, previousData.subscription);
+ },
+
+ /**
+ * Moves a filter subscription one line down.
+ */
+ moveDown: function(/**Node*/ node)
+ {
+ node = Templater.getDataNode(node || this.selectedItem);
+ let data = Templater.getDataForNode(node);
+ if (!data)
+ return;
+
+ let nextNode = node.nextSibling;
+ if (!Templater.getDataForNode(nextNode))
+ return;
+
+ let nextData = Templater.getDataForNode(nextNode.nextSibling);
+ FilterStorage.moveSubscription(data.subscription, nextData ? nextData.subscription : null);
+ },
+
+ /**
+ * Opens the context menu for a subscription node.
+ */
+ openMenu: function(/**Event*/ event, /**Node*/ node)
+ {
+ node.getElementsByClassName("actionMenu")[0].openPopupAtScreen(event.screenX, event.screenY, true);
+ },
+
+ _altMask: 2,
+ _ctrlMask: 4,
+ _metaMask: 8,
+ get _accelMask()
+ {
+ let result = this._ctrlMask;
+ try {
+ let accelKey = Utils.prefService.getIntPref("ui.key.accelKey");
+ if (accelKey == Ci.nsIDOMKeyEvent.DOM_VK_META)
+ result = this._metaMask;
+ else if (accelKey == Ci.nsIDOMKeyEvent.DOM_VK_ALT)
+ result = this._altMask;
+ } catch(e) {}
+ this.__defineGetter__("_accelMask", function() result);
+ return result;
+ },
+
+ /**
+ * Called when a key is pressed on the subscription list.
+ */
+ keyPress: function(/**Event*/ event)
+ {
+ let modifiers = 0;
+ if (event.altKey)
+ modifiers |= this._altMask;
+ if (event.ctrlKey)
+ modifiers |= this._ctrlMask;
+ if (event.metaKey)
+ modifiers |= this._metaMask;
+
+ if (event.charCode == " ".charCodeAt(0) && modifiers == 0)
+ {
+ // Ignore if Space is pressed on a button
+ for (let node = event.target; node; node = node.parentNode)
+ if (node.localName == "button")
+ return;
+
+ let data = Templater.getDataForNode(this.selectedItem);
+ if (data)
+ data.subscription.disabled = !data.subscription.disabled;
+ }
+ else if (event.keyCode == Ci.nsIDOMKeyEvent.DOM_VK_UP && modifiers == this._accelMask)
+ {
+ E("subscription-moveUp-command").doCommand();
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ else if (event.keyCode == Ci.nsIDOMKeyEvent.DOM_VK_DOWN && modifiers == this._accelMask)
+ {
+ E("subscription-moveDown-command").doCommand();
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ },
+
+ /**
+ * Subscription currently being dragged if any.
+ * @type Subscription
+ */
+ dragSubscription: null,
+
+ /**
+ * Called when a subscription entry is dragged.
+ */
+ startDrag: function(/**Event*/ event, /**Node*/ node)
+ {
+ let data = Templater.getDataForNode(node);
+ if (!data)
+ return;
+
+ event.dataTransfer.addElement(node);
+ event.dataTransfer.setData("text/x-moz-url", data.subscription.url);
+ event.dataTransfer.setData("text/plain", data.subscription.title);
+ this.dragSubscription = data.subscription;
+ event.stopPropagation();
+ },
+
+ /**
+ * Called when something is dragged over a subscription entry or subscriptions list.
+ */
+ dragOver: function(/**Event*/ event)
+ {
+ // Don't allow dragging onto a scroll bar
+ for (let node = event.originalTarget; node; node = node.parentNode)
+ if (node.localName == "scrollbar")
+ return;
+
+ // Don't allow dragging onto element's borders
+ let target = event.originalTarget;
+ while (target && target.localName != "richlistitem")
+ target = target.parentNode;
+ if (!target)
+ target = event.originalTarget;
+
+ let styles = window.getComputedStyle(target, null);
+ let rect = target.getBoundingClientRect();
+ if (event.clientX < rect.left + parseInt(styles.borderLeftWidth, 10) ||
+ event.clientY < rect.top + parseInt(styles.borderTopWidth, 10) ||
+ event.clientX > rect.right - parseInt(styles.borderRightWidth, 10) - 1 ||
+ event.clientY > rect.bottom - parseInt(styles.borderBottomWidth, 10) - 1)
+ {
+ return;
+ }
+
+ // If not dragging a subscription check whether we can accept plain text
+ if (!this.dragSubscription)
+ {
+ let data = Templater.getDataForNode(event.target);
+ if (!data || !(data.subscription instanceof SpecialSubscription) || !event.dataTransfer.getData("text/plain"))
+ return;
+ }
+
+ event.preventDefault();
+ event.stopPropagation();
+ },
+
+ /**
+ * Called when something is dropped on a subscription entry or subscriptions list.
+ */
+ drop: function(/**Event*/ event, /**Node*/ node)
+ {
+ if (!this.dragSubscription)
+ {
+ // Not dragging a subscription, maybe this is plain text that we can add as filters?
+ let data = Templater.getDataForNode(node);
+ if (data && data.subscription instanceof SpecialSubscription)
+ {
+ let lines = event.dataTransfer.getData("text/plain").replace(/\r/g, "").split("\n");
+ for (let i = 0; i < lines.length; i++)
+ {
+ let line = Filter.normalize(lines[i]);
+ if (line)
+ {
+ let filter = Filter.fromText(line);
+ FilterStorage.addFilter(filter, data.subscription);
+ }
+ }
+ FilterActions.removeDraggedFilters();
+ event.stopPropagation();
+ }
+ return;
+ }
+
+ // When dragging down we need to insert after the drop node, otherwise before it.
+ node = Templater.getDataNode(node);
+ if (node)
+ {
+ let dragNode = Templater.getNodeForData(node.parentNode, "subscription", this.dragSubscription);
+ if (node.compareDocumentPosition(dragNode) & node.DOCUMENT_POSITION_PRECEDING)
+ node = node.nextSibling;
+ }
+
+ let data = Templater.getDataForNode(node);
+ FilterStorage.moveSubscription(this.dragSubscription, data ? data.subscription : null);
+ event.stopPropagation();
+ },
+
+ /**
+ * Called when the drag operation for a subscription is finished.
+ */
+ endDrag: function()
+ {
+ this.dragSubscription = null;
+ }
+};
+
+/**
+ * Subscription title editing functionality.
+ * @class
+ */
+var TitleEditor =
+{
+ /**
+ * List item corresponding with the currently edited subscription if any.
+ * @type Node
+ */
+ subscriptionEdited: null,
+
+ /**
+ * Starts editing of a subscription title.
+ * @param {Node} node subscription list entry or a child node
+ * @param {Boolean} [checkSelection] if true the editor will not start if the
+ * item was selected in the preceding mousedown event
+ */
+ start: function(node, checkSelection)
+ {
+ if (this.subscriptionEdited)
+ this.end(true);
+
+ let subscriptionNode = Templater.getDataNode(node);
+ if (!subscriptionNode || (checkSelection && !subscriptionNode._wasSelected))
+ return;
+
+ let subscription = Templater.getDataForNode(subscriptionNode).subscription;
+ if (!subscription || subscription.fixedTitle)
+ return;
+
+ subscriptionNode.getElementsByClassName("titleBox")[0].selectedIndex = 1;
+ let editor = subscriptionNode.getElementsByClassName("titleEditor")[0];
+ editor.value = subscription.title;
+ editor.setSelectionRange(0, editor.value.length);
+ this.subscriptionEdited = subscriptionNode;
+ editor.focus();
+ },
+
+ /**
+ * Stops editing of a subscription title.
+ * @param {Boolean} save if true the entered value will be saved, otherwise dismissed
+ */
+ end: function(save)
+ {
+ if (!this.subscriptionEdited)
+ return;
+
+ let subscriptionNode = this.subscriptionEdited;
+ this.subscriptionEdited = null;
+
+ let newTitle = null;
+ if (save)
+ {
+ newTitle = subscriptionNode.getElementsByClassName("titleEditor")[0].value;
+ newTitle = newTitle.replace(/^\s+/, "").replace(/\s+$/, "");
+ }
+
+ let subscription = Templater.getDataForNode(subscriptionNode).subscription
+ if (newTitle && newTitle != subscription.title)
+ subscription.title = newTitle;
+ else
+ {
+ subscriptionNode.getElementsByClassName("titleBox")[0].selectedIndex = 0;
+ subscriptionNode.parentNode.focus();
+ }
+ },
+
+ /**
+ * Processes keypress events on the subscription title editor field.
+ */
+ keyPress: function(/**Event*/ event)
+ {
+ // Prevent any key presses from triggering outside actions
+ event.stopPropagation();
+
+ if (event.keyCode == event.DOM_VK_RETURN || event.keyCode == event.DOM_VK_ENTER)
+ {
+ event.preventDefault();
+ this.end(true);
+ }
+ else if (event.keyCode == event.DOM_VK_CANCEL || event.keyCode == event.DOM_VK_ESCAPE)
+ {
+ event.preventDefault();
+ this.end(false);
+ }
+ }
+};
+
+/**
+ * Methods called when choosing and adding a new filter subscription.
+ * @class
+ */
+var SelectSubscription =
+{
+ /**
+ * Starts selection of a filter subscription to add.
+ */
+ start: function(/**Event*/ event)
+ {
+ let panel = E("selectSubscriptionPanel");
+ let list = E("selectSubscription");
+ let template = E("selectSubscriptionTemplate");
+ let parent = list.menupopup;
+
+ if (panel.state == "open")
+ {
+ list.focus();
+ return;
+ }
+
+ // Remove existing entries if any
+ while (parent.lastChild)
+ parent.removeChild(parent.lastChild);
+
+ // Load data
+ let request = new XMLHttpRequest();
+ request.open("GET", "subscriptions.xml");
+ request.onload = function()
+ {
+ // Avoid race condition if two downloads are started in parallel
+ if (panel.state == "open")
+ return;
+
+ // Add subscription entries to the list
+ let subscriptions = request.responseXML.getElementsByTagName("subscription");
+ let listedSubscriptions = [];
+ for (let i = 0; i < subscriptions.length; i++)
+ {
+ let subscription = subscriptions[i];
+ let url = subscription.getAttribute("url");
+ if (!url || url in FilterStorage.knownSubscriptions)
+ continue;
+
+ let localePrefix = Utils.checkLocalePrefixMatch(subscription.getAttribute("prefixes"));
+ let node = Templater.process(template, {
+ __proto__: null,
+ node: subscription,
+ localePrefix: localePrefix
+ });
+ parent.appendChild(node);
+ listedSubscriptions.push(subscription);
+ }
+ let selectedNode = Utils.chooseFilterSubscription(listedSubscriptions);
+ list.selectedItem = Templater.getNodeForData(parent, "node", selectedNode) || parent.firstChild;
+
+ // Show panel and focus list
+ let position = (Utils.versionComparator.compare(Utils.platformVersion, "2.0") < 0 ? "after_end" : "bottomcenter topleft");
+ panel.openPopup(E("selectSubscriptionButton"), position, 0, 0, false, false, event);
+ Utils.runAsync(list.focus, list);
+ };
+ request.send();
+ },
+
+ /**
+ * Adds filter subscription that is selected.
+ */
+ add: function()
+ {
+ E("selectSubscriptionPanel").hidePopup();
+
+ let data = Templater.getDataForNode(E("selectSubscription").selectedItem);
+ if (!data)
+ return;
+
+ let subscription = Subscription.fromURL(data.node.getAttribute("url"));
+ if (!subscription)
+ return;
+
+ FilterStorage.addSubscription(subscription);
+ subscription.disabled = false;
+ subscription.title = data.node.getAttribute("title");
+ subscription.homepage = data.node.getAttribute("homepage");
+
+ // Make sure the subscription is visible and selected
+ let list = E("subscriptions");
+ let node = Templater.getNodeForData(list, "subscription", subscription);
+ if (node)
+ {
+ list.ensureElementIsVisible(node);
+ list.selectedItem = node;
+ list.focus();
+ }
+
+ // Trigger download if necessary
+ if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+ Synchronizer.execute(subscription);
+ },
+
+ /**
+ * Called if the user chooses to view the complete subscriptions list.
+ */
+ chooseOther: function()
+ {
+ E("selectSubscriptionPanel").hidePopup();
+ window.openDialog("subscriptionSelection.xul", "_blank", "chrome,centerscreen,modal,resizable,dialog=no", null, null);
+ },
+
+ /**
+ * Called for keys pressed on the subscription selection panel.
+ */
+ keyPress: function(/**Event*/ event)
+ {
+ // Buttons and text links handle Enter key themselves
+ if (event.target.localName == "button" || event.target.localName == "label")
+ return;
+
+ if (event.keyCode == event.DOM_VK_RETURN || event.keyCode == event.DOM_VK_ENTER)
+ {
+ // This shouldn't accept our dialog, only the panel
+ event.preventDefault();
+ E("selectSubscriptionAccept").doCommand();
+ }
+ }
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-subscriptionview.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-subscriptionview.js
new file mode 100644
index 0000000..a1673e4
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-subscriptionview.js
@@ -0,0 +1,330 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * Fills a list of filter groups and keeps it updated.
+ * @param {Element} list richlistbox element to be filled
+ * @param {Node} template template to use for the groups
+ * @param {Function} filter filter to decide which lists should be included
+ * @param {Function} listener function to be called on changes
+ * @constructor
+ */
+function ListManager(list, template, filter, listener)
+{
+ this._list = list;
+ this._template = template;
+ this._filter = filter;
+ this._listener = listener || function(){};
+
+ this._deck = this._list.parentNode;
+
+ this._list.listManager = this;
+ this.reload();
+
+ let me = this;
+ let proxy = function()
+ {
+ return me._onChange.apply(me, arguments);
+ };
+ FilterNotifier.addListener(proxy);
+ window.addEventListener("unload", function()
+ {
+ FilterNotifier.removeListener(proxy);
+ }, false);
+}
+ListManager.prototype =
+{
+ /**
+ * List element being managed.
+ * @type Element
+ */
+ _list: null,
+ /**
+ * Template used for the groups.
+ * @type Node
+ */
+ _template: null,
+ /**
+ * Filter function to decide which subscriptions should be included.
+ * @type Function
+ */
+ _filter: null,
+ /**
+ * Function to be called whenever list contents change.
+ * @type Function
+ */
+ _listener: null,
+ /**
+ * Deck switching between list display and "no entries" message.
+ * @type Element
+ */
+ _deck: null,
+
+ /**
+ * Completely rebuilds the list.
+ */
+ reload: function()
+ {
+ // Remove existing entries if any
+ while (this._list.firstChild)
+ this._list.removeChild(this._list.firstChild);
+
+ // Now add all subscriptions
+ let subscriptions = FilterStorage.subscriptions.filter(this._filter, this);
+ if (subscriptions.length)
+ {
+ for each (let subscription in subscriptions)
+ this.addSubscription(subscription, null);
+
+ // Make sure first list item is selected after list initialization
+ Utils.runAsync(function()
+ {
+ this._list.selectItem(this._list.getItemAtIndex(this._list.getIndexOfFirstVisibleRow()));
+ }, this);
+ }
+
+ this._deck.selectedIndex = (subscriptions.length ? 1 : 0);
+ this._listener();
+ },
+
+ /**
+ * Adds a filter subscription to the list.
+ */
+ addSubscription: function(/**Subscription*/ subscription, /**Node*/ insertBefore) /**Node*/
+ {
+ let disabledFilters = 0;
+ for (let i = 0, l = subscription.filters.length; i < l; i++)
+ if (subscription.filters[i] instanceof ActiveFilter && subscription.filters[i].disabled)
+ disabledFilters++;
+
+ let node = Templater.process(this._template, {
+ __proto__: null,
+ subscription: subscription,
+ isExternal: subscription instanceof ExternalSubscription,
+ downloading: Synchronizer.isExecuting(subscription.url),
+ disabledFilters: disabledFilters
+ });
+ if (insertBefore)
+ this._list.insertBefore(node, insertBefore);
+ else
+ this._list.appendChild(node);
+ return node;
+ },
+
+ /**
+ * Map indicating subscriptions that need their "disabledFilters" property to
+ * be updated by next updateDisabled() call.
+ * @type Object
+ */
+ _scheduledUpdateDisabled: null,
+
+ /**
+ * Updates subscriptions that had some of their filters enabled/disabled.
+ */
+ updateDisabled: function()
+ {
+ let list = this._scheduledUpdateDisabled;
+ this._scheduledUpdateDisabled = null;
+ for (let url in list)
+ {
+ let subscription = Subscription.fromURL(url);
+ let subscriptionNode = Templater.getNodeForData(this._list, "subscription", subscription);
+ if (subscriptionNode)
+ {
+ let data = Templater.getDataForNode(subscriptionNode);
+ let disabledFilters = 0;
+ for (let i = 0, l = subscription.filters.length; i < l; i++)
+ if (subscription.filters[i] instanceof ActiveFilter && subscription.filters[i].disabled)
+ disabledFilters++;
+
+ if (disabledFilters != data.disabledFilters)
+ {
+ data.disabledFilters = disabledFilters;
+ Templater.update(this._template, subscriptionNode);
+
+ if (!document.commandDispatcher.focusedElement)
+ this._list.focus();
+ }
+ }
+ }
+ },
+
+ /**
+ * Subscriptions change processing.
+ * @see FilterNotifier.addListener()
+ */
+ _onChange: function(action, item, param1, param2)
+ {
+ if ((action == "subscription.added" || action == "subscription.removed") && item.url == Prefs.subscriptions_exceptionsurl)
+ E("acceptableAds").checked = FilterStorage.subscriptions.some(function(s) s.url == Prefs.subscriptions_exceptionsurl);
+
+ if (action == "filter.disabled")
+ {
+ if (this._scheduledUpdateDisabled == null)
+ {
+ this._scheduledUpdateDisabled = {__proto__: null};
+ Utils.runAsync(this.updateDisabled, this);
+ }
+ for (let i = 0; i < item.subscriptions.length; i++)
+ this._scheduledUpdateDisabled[item.subscriptions[i].url] = true;
+ return;
+ }
+
+ if (action != "load" && !this._filter(item))
+ return;
+
+ switch (action)
+ {
+ case "load":
+ {
+ this.reload();
+ break;
+ }
+ case "subscription.added":
+ {
+ let index = FilterStorage.subscriptions.indexOf(item);
+ if (index >= 0)
+ {
+ let insertBefore = null;
+ for (index++; index < FilterStorage.subscriptions.length && !insertBefore; index++)
+ insertBefore = Templater.getNodeForData(this._list, "subscription", FilterStorage.subscriptions[index]);
+ this.addSubscription(item, insertBefore);
+ this._deck.selectedIndex = 1;
+ this._listener();
+ }
+ break;
+ }
+ case "subscription.removed":
+ {
+ let node = Templater.getNodeForData(this._list, "subscription", item);
+ if (node)
+ {
+ let newSelection = node.nextSibling || node.previousSibling;
+ node.parentNode.removeChild(node);
+ if (!this._list.firstChild)
+ {
+ this._deck.selectedIndex = 0;
+ this._list.selectedIndex = -1;
+ }
+ else if (newSelection)
+ {
+ this._list.ensureElementIsVisible(newSelection);
+ this._list.selectedItem = newSelection;
+ }
+ this._listener();
+ }
+ break
+ }
+ case "subscription.moved":
+ {
+ let node = Templater.getNodeForData(this._list, "subscription", item);
+ if (node)
+ {
+ node.parentNode.removeChild(node);
+ let insertBefore = null;
+ let index = FilterStorage.subscriptions.indexOf(item);
+ if (index >= 0)
+ for (index++; index < FilterStorage.subscriptions.length && !insertBefore; index++)
+ insertBefore = Templater.getNodeForData(this._list, "subscription", FilterStorage.subscriptions[index]);
+ this._list.insertBefore(node, insertBefore);
+ this._list.ensureElementIsVisible(node);
+ this._listener();
+ }
+ break;
+ }
+ case "subscription.title":
+ case "subscription.disabled":
+ case "subscription.homepage":
+ case "subscription.lastDownload":
+ case "subscription.downloadStatus":
+ {
+ let subscriptionNode = Templater.getNodeForData(this._list, "subscription", item);
+ if (subscriptionNode)
+ {
+ Templater.getDataForNode(subscriptionNode).downloading = Synchronizer.isExecuting(item.url);
+ Templater.update(this._template, subscriptionNode);
+
+ if (!document.commandDispatcher.focusedElement)
+ this._list.focus();
+ this._listener();
+ }
+ break;
+ }
+ case "subscription.fixedTitle":
+ {
+ SubscriptionActions.updateCommands();
+ break;
+ }
+ case "subscription.updated":
+ {
+ if (this._scheduledUpdateDisabled == null)
+ {
+ this._scheduledUpdateDisabled = {__proto__: null};
+ Utils.runAsync(this.updateDisabled, this);
+ }
+ this._scheduledUpdateDisabled[item.url] = true;
+ break;
+ }
+ }
+ }
+};
+
+/**
+ * Attaches list managers to the lists.
+ */
+ListManager.init = function()
+{
+ new ListManager(E("subscriptions"),
+ E("subscriptionTemplate"),
+ function(s) s instanceof RegularSubscription && !(ListManager.acceptableAdsCheckbox && s.url == Prefs.subscriptions_exceptionsurl),
+ SubscriptionActions.updateCommands);
+ new ListManager(E("groups"),
+ E("groupTemplate"),
+ function(s) s instanceof SpecialSubscription,
+ SubscriptionActions.updateCommands);
+ E("acceptableAds").checked = FilterStorage.subscriptions.some(function(s) s.url == Prefs.subscriptions_exceptionsurl);
+ E("acceptableAds").parentNode.hidden = !ListManager.acceptableAdsCheckbox;
+};
+
+/**
+ * Defines whether the "acceptable ads" subscription needs special treatment.
+ * @type Boolean
+ */
+ListManager.acceptableAdsCheckbox = Prefs.subscriptions_exceptionscheckbox;
+
+/**
+ * Adds or removes filter subscription allowing acceptable ads.
+ */
+ListManager.allowAcceptableAds = function(/**Boolean*/ allow)
+{
+ let subscription = Subscription.fromURL(Prefs.subscriptions_exceptionsurl);
+ if (!subscription)
+ return;
+
+ subscription.disabled = false;
+ subscription.title = "Allow non-intrusive advertising";
+ if (allow)
+ {
+ FilterStorage.addSubscription(subscription);
+ if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+ Synchronizer.execute(subscription);
+ }
+ else
+ FilterStorage.removeSubscription(subscription);
+};
+
+window.addEventListener("load", ListManager.init, false);
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters.js
new file mode 100644
index 0000000..8830fdb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters.js
@@ -0,0 +1,226 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * Initialization function, called when the window is loaded.
+ */
+function init()
+{
+ if (window.arguments && window.arguments.length)
+ {
+ let filter = window.arguments[0].wrappedJSObject;
+ if (filter instanceof Filter)
+ Utils.runAsync(SubscriptionActions.selectFilter, SubscriptionActions, filter);
+ }
+}
+
+/**
+ * Called whenever the currently selected tab changes.
+ */
+function onTabChange(/**Element*/ tabbox)
+{
+ updateSelectedSubscription();
+
+ Utils.runAsync(function()
+ {
+ let panel = tabbox.selectedPanel;
+ if (panel)
+ panel.getElementsByClassName("initialFocus")[0].focus();
+ SubscriptionActions.updateCommands();
+ });
+}
+
+/**
+ * Called whenever the selected subscription changes.
+ */
+function onSelectionChange(/**Element*/ list)
+{
+ SubscriptionActions.updateCommands();
+ updateSelectedSubscription();
+ list.focus();
+
+ // Take elements of the previously selected item out of the tab order
+ if ("previousSelection" in list && list.previousSelection)
+ {
+ let elements = list.previousSelection.getElementsByClassName("tabable");
+ for (let i = 0; i < elements.length; i++)
+ elements[i].setAttribute("tabindex", "-1");
+ }
+ // Put elements of the selected item into tab order
+ if (list.selectedItem)
+ {
+ let elements = list.selectedItem.getElementsByClassName("tabable");
+ for (let i = 0; i < elements.length; i++)
+ elements[i].removeAttribute("tabindex");
+ }
+ list.previousSelection = list.selectedItem;
+}
+
+/**
+ * Called when splitter state changes to make sure it is persisted properly.
+ */
+function onSplitterStateChange(/**Element*/ splitter)
+{
+ let state = splitter.getAttribute("state");
+ if (!state)
+ {
+ splitter.setAttribute("state", "open");
+ document.persist(splitter.id, "state");
+ }
+}
+
+/**
+ * Updates filter list when selected subscription changes.
+ */
+function updateSelectedSubscription()
+{
+ let panel = E("tabs").selectedPanel;
+ if (!panel)
+ return;
+
+ let list = panel.getElementsByTagName("richlistbox")[0];
+ if (!list)
+ return;
+
+ let data = Templater.getDataForNode(list.selectedItem);
+ FilterView.subscription = (data ? data.subscription : null);
+ FilterActions.updateCommands();
+}
+
+/**
+ * Template processing functions.
+ * @class
+ */
+var Templater =
+{
+ /**
+ * Processes a template node using given data object.
+ */
+ process: function(/**Node*/ template, /**Object*/ data) /**Node*/
+ {
+ // Use a sandbox to resolve attributes (for convenience, not security)
+ let sandbox = Cu.Sandbox(window);
+ for (let key in data)
+ sandbox[key] = data[key];
+ sandbox.formatTime = Utils.formatTime;
+
+ // Clone template but remove id/hidden attributes from it
+ let result = template.cloneNode(true);
+ result.removeAttribute("id");
+ result.removeAttribute("hidden");
+ result._data = data;
+
+ // Resolve any attributes of the for attr="{obj.foo}"
+ let conditionals = [];
+ let nodeIterator = document.createNodeIterator(result, NodeFilter.SHOW_ELEMENT, null, false);
+ for (let node = nodeIterator.nextNode(); node; node = nodeIterator.nextNode())
+ {
+ if (node.localName == "if")
+ conditionals.push(node);
+ for (let i = 0; i < node.attributes.length; i++)
+ {
+ let attribute = node.attributes[i];
+ let len = attribute.value.length;
+ if (len >= 2 && attribute.value[0] == "{" && attribute.value[len - 1] == "}")
+ {
+ let value = Cu.evalInSandbox(attribute.value.substr(1, len - 2), sandbox);
+ if (attribute.name == "condition")
+ value = value ? "true" : "false";
+ attribute.value = value;
+ }
+ }
+ }
+
+ // Process <if> tags - remove if condition is false, replace by their children
+ // if it is true
+ for each (let node in conditionals)
+ {
+ let fragment = document.createDocumentFragment();
+ let condition = node.getAttribute("condition");
+ if (condition == "false")
+ condition = false;
+ for (let i = 0; i < node.childNodes.length; i++)
+ {
+ let child = node.childNodes[i];
+ if (child.localName == "elif" || child.localName == "else")
+ {
+ if (condition)
+ break;
+ condition = (child.localName == "elif" ? child.getAttribute("condition") : true);
+ if (condition == "false")
+ condition = false;
+ }
+ else if (condition)
+ fragment.appendChild(node.childNodes[i--]);
+ }
+ node.parentNode.replaceChild(fragment, node);
+ }
+
+ return result;
+ },
+
+ /**
+ * Updates first child of a processed template if the underlying data changed.
+ */
+ update: function(/**Node*/ template, /**Node*/ node)
+ {
+ if (!("_data" in node))
+ return;
+ let newChild = Templater.process(template.firstChild, node._data);
+ delete newChild._data;
+ node.replaceChild(newChild, node.firstChild);
+ },
+
+ /**
+ * Walks up the parent chain for a node until the node corresponding with a
+ * template is found.
+ */
+ getDataNode: function(/**Node*/ node) /**Node*/
+ {
+ while (node)
+ {
+ if ("_data" in node)
+ return node;
+ node = node.parentNode;
+ }
+ return null;
+ },
+
+ /**
+ * Returns the data used to generate the node from a template.
+ */
+ getDataForNode: function(/**Node*/ node) /**Object*/
+ {
+ node = Templater.getDataNode(node);
+ if (node)
+ return node._data;
+ else
+ return null;
+ },
+
+ /**
+ * Returns a node that has been generated from a template using a particular
+ * data object.
+ */
+ getNodeForData: function(/**Node*/ parent, /**String*/ property, /**Object*/ data) /**Node*/
+ {
+ for (let child = parent.firstChild; child; child = child.nextSibling)
+ if ("_data" in child && property in child._data && child._data[property] == data)
+ return child;
+ return null;
+ }
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters.xul b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters.xul
new file mode 100644
index 0000000..ce65659
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters.xul
@@ -0,0 +1,400 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://adblockplus/skin/filters.css" type="text/css"?>
+
+<!DOCTYPE dialog SYSTEM "chrome://adblockplus/locale/filters.dtd">
+
+<dialog
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ title="&dialog.title;"
+ id="abpFiltersWindow"
+ onload="init()"
+ buttons="accept"
+ width="950"
+ height="450"
+ persist="screenX screenY width height sizemode"
+ windowtype="abp:filters">
+
+<script type="application/x-javascript;version=1.7" src="utils.js"/>
+<script type="application/x-javascript;version=1.7" src="filters.js"/>
+<script type="application/x-javascript;version=1.7" src="filters-subscriptionview.js"/>
+<script type="application/x-javascript;version=1.7" src="filters-subscriptionactions.js"/>
+<script type="application/x-javascript;version=1.7" src="filters-filterview.js"/>
+<script type="application/x-javascript;version=1.7" src="filters-filteractions.js"/>
+<script type="application/x-javascript;version=1.7" src="filters-backup.js"/>
+<script type="application/x-javascript;version=1.7" src="filters-search.js"/>
+
+<keyset id="filtersKeyset">
+ <key id="subscription-update-key" key="T" modifiers="accel" command="subscription-update-command"/>
+ <key id="subscription-update-all-key" key="T" modifiers="accel,shift" command="subscription-update-all-command"/>
+ <key id="edit-key" keycode="VK_F2" oncommand="E(FilterActions.focused ? 'filters-edit-command' : 'subscription-editTitle-command').doCommand();"/>
+ <key id="delete-key" keycode="VK_DELETE" oncommand="E(FilterActions.focused ? 'filters-delete-command' : 'subscription-delete-command').doCommand();"/>
+ <key id="subscription-showHideFilters-key" key="R" modifiers="accel" command="subscription-showHideFilters-command"/>
+ <key id="moveUp-key" keycode="VK_UP" modifiers="accel"/>
+ <key id="moveDown-key" keycode="VK_DOWN" modifiers="accel"/>
+ <key id="filters-add-key" keycode="VK_INSERT" oncommand="E('filters-add-command').doCommand();"/>
+ <key id="filters-selectAll-key" key="A" modifiers="accel" oncommand="if (FilterActions.focused) E('filters-selectAll-command').doCommand();"/>
+ <key id="filters-copy-key" key="C" modifiers="accel" oncommand="if (FilterActions.focused) E('filters-copy-command').doCommand();"/>
+ <key id="filters-cut-key" key="X" modifiers="accel" oncommand="if (FilterActions.focused) E('filters-cut-command').doCommand();"/>
+ <key id="filters-paste-key" key="V" modifiers="accel" oncommand="if (FilterActions.focused) E('filters-paste-command').doCommand();"/>
+ <key id="backup-key" key="E" modifiers="accel" oncommand="E('backup').doCommand();"/>
+ <key id="restore-key" key="I" modifiers="accel" oncommand="E('restoreOwnBackup').doCommand();"/>
+ <key id="find-key" key="F" modifiers="accel" oncommand="if (FilterActions.visible) E('find-command').doCommand();"/>
+ <key id="find-again-key" key="G" modifiers="accel" oncommand="if (FilterActions.visible) E('find-again-command').doCommand();"/>
+ <key id="find-previous-key" key="G" modifiers="accel,shift" oncommand="if (FilterActions.visible) E('find-previous-command').doCommand();"/>
+ <key id="find-again-key2" keycode="VK_F3" oncommand="if (FilterActions.visible) E('find-again-command').doCommand();"/>
+ <key id="find-previous-key2" keycode="VK_F3" modifiers="shift" oncommand="if (FilterActions.visible) E('find-previous-command').doCommand();"/>
+</keyset>
+
+<commandset id="filtersCommandset">
+ <command id="subscription-update-command" oncommand="SubscriptionActions.updateFilters();"/>
+ <command id="subscription-update-all-command" oncommand="SubscriptionActions.updateAllFilters();"/>
+ <command id="subscription-editTitle-command" oncommand="SubscriptionActions.editTitle();"/>
+ <command id="subscription-delete-command" oncommand="SubscriptionActions.remove();"/>
+ <command id="subscription-showHideFilters-command" oncommand="E('filtersGrippy').doCommand();"/>
+ <command id="subscription-moveUp-command" oncommand="SubscriptionActions.moveUp();"/>
+ <command id="subscription-moveDown-command" oncommand="SubscriptionActions.moveDown();"/>
+ <command id="subscription-add-command" oncommand="SelectSubscription.start(event);"/>
+ <command id="subscription-addSelected-command" oncommand="SelectSubscription.add();"/>
+ <command id="subscription-addOther-command" oncommand="SelectSubscription.chooseOther();"/>
+ <command id="group-add-command" oncommand="SubscriptionActions.addGroup();"/>
+ <command id="filters-selectAll-command" oncommand="FilterActions.selectAll();"/>
+ <command id="filters-edit-command" oncommand="FilterActions.startEditing();"/>
+ <command id="filters-add-command" oncommand="FilterActions.insertFilter();"/>
+ <command id="filters-delete-command" oncommand="FilterActions.deleteSelected();"/>
+ <command id="filters-resetHitCounts-command" oncommand="FilterActions.resetHitCounts();"/>
+ <command id="filters-moveUp-command" oncommand="FilterActions.moveUp();"/>
+ <command id="filters-moveDown-command" oncommand="FilterActions.moveDown();"/>
+ <command id="filters-copy-command" oncommand="FilterActions.copySelected(true);"/>
+ <command id="filters-cut-command" oncommand="FilterActions.copySelected(false);"/>
+ <command id="filters-paste-command" oncommand="FilterActions.paste();"/>
+ <command id="find-command" oncommand="E('findbar').startFind(E('findbar').FIND_NORMAL)"/>
+ <command id="find-again-command" oncommand="E('findbar').onFindAgainCommand(false)"/>
+ <command id="find-previous-command" oncommand="E('findbar').onFindAgainCommand(true)"/>
+</commandset>
+
+<popupset id="filtersPopupset">
+ <menupopup id="filters-view-menu1" onpopupshowing="FilterActions.fillColumnPopup(this);">
+ <menuitem id="filters-view-filter1" label="&filter.column;" type="checkbox" disabled="true"/>
+ <menuitem id="filters-view-slow1" label="&slow.column;" type="checkbox" oncommand="FilterActions.toggleColumn('col-slow')"/>
+ <menuitem id="filters-view-enabled1" label="&enabled.column;" type="checkbox" oncommand="FilterActions.toggleColumn('col-enabled')"/>
+ <menuitem id="filters-view-hitcount1" label="&hitcount.column;" type="checkbox" oncommand="FilterActions.toggleColumn('col-hitcount')"/>
+ <menuitem id="filters-view-lasthit1" label="&lasthit.column;" type="checkbox" oncommand="FilterActions.toggleColumn('col-lasthit')"/>
+ <menuseparator/>
+ <menu id="filters-sort-menu1" label="&sort.label;">
+ <menupopup id="filters-sort-popup1">
+ <menuitem id="filters-sort-none1" label="&sort.none.label;" type="radio" name="sortColumn" oncommand="FilterView.sortBy(null)"/>
+ <menuitem id="filters-sort-filter1" label="&filter.column;" type="radio" name="sortColumn" oncommand="FilterView.sortBy('col-filter')"/>
+ <menuitem id="filters-sort-slow1" label="&slow.column;" type="radio" name="sortColumn" oncommand="FilterView.sortBy('col-slow')"/>
+ <menuitem id="filters-sort-enabled1" label="&enabled.column;" type="radio" name="sortColumn" oncommand="FilterView.sortBy('col-enabled')"/>
+ <menuitem id="filters-sort-hitcount1" label="&hitcount.column;" type="radio" name="sortColumn" oncommand="FilterView.sortBy('col-hitcount')"/>
+ <menuitem id="filters-sort-lasthit1" label="&lasthit.column;" type="radio" name="sortColumn" oncommand="FilterView.sortBy('col-lasthit')"/>
+ <menuseparator/>
+ <menuitem id="filters-sort-asc1" label="&sort.ascending.label;" type="radio" name="sortOrder" oncommand="FilterActions.setSortOrder('ascending')"/>
+ <menuitem id="filters-sort-desc1" label="&sort.descending.label;" type="radio" name="sortOrder" oncommand="FilterActions.setSortOrder('descending')"/>
+ </menupopup>
+ </menu>
+ </menupopup>
+ <tooltip id="filtersTooltip" onpopupshowing="FilterActions.fillTooltip(event);">
+ <grid>
+ <columns>
+ <column/>
+ <column flex="1"/>
+ </columns>
+ <rows>
+ <row id="tooltip-filter-row" align="top">
+ <label class="tooltipLabel" value="&filter.column;"/>
+ <vbox id="tooltip-filter"/>
+ </row>
+ <row id="tooltip-hitcount-row">
+ <label class="tooltipLabel" value="&hitcount.column;"/>
+ <description id="tooltip-hitcount"/>
+ </row>
+ <row id="tooltip-lasthit-row">
+ <label class="tooltipLabel" value="&lasthit.column;"/>
+ <description id="tooltip-lasthit"/>
+ </row>
+ </rows>
+ </grid>
+
+ <description id="tooltip-additional"/>
+ </tooltip>
+</popupset>
+
+<hbox id="content" flex="1">
+ <tabbox id="tabs" flex="1" persist="selectedIndex">
+ <tabs onselect="onTabChange(this.parentNode);">
+ <tab label="&subscriptions.tab.label;"/>
+ <tab label="&filters.tab.label;"/>
+ </tabs>
+ <tabpanels flex="1">
+ <tabpanel id="subscriptionsTab" orient="vertical" flex="1">
+ <hbox pack="end">
+ <button id="selectSubscriptionButton" label="&addSubscription.label;…" command="subscription-add-command"/>
+ </hbox>
+
+ <panel id="selectSubscriptionPanel" type="arrow" position="bottomcenter topleft"
+ orient="vertical" onkeypress="SelectSubscription.keyPress(event);">
+ <menuitem id="selectSubscriptionTemplate" hidden="true"
+ class="{localePrefix ? 'localeMatch' : ''}"
+ label="{node.getAttribute('title')}"
+ value="{node.getAttribute('url')}">
+ <label class="selectSubscriptionItem" value="{node.getAttribute('title') + ' (' + node.getAttribute('specialization') + ')'}"/>
+ </menuitem>
+ <menulist id="selectSubscription">
+ <menupopup/>
+ </menulist>
+ <hbox align="baseline">
+ <label class="text-link" value="&addSubscriptionOther.label;" onclick="E('subscription-addOther-command').doCommand();"/>
+ <spacer flex="1"/>
+ <button id="selectSubscriptionAccept" default="true" label="&addSubscriptionAdd.label;" command="subscription-addSelected-command"/>
+ <spacer flex="1"/>
+ <button label="&addSubscriptionCancel.label;" oncommand="E('selectSubscriptionPanel').hidePopup();"/>
+ </hbox>
+ </panel>
+
+ <richlistitem id="subscriptionTemplate" class="subscription" hidden="true" orient="vertical"
+ onmousedown="this._wasSelected = (this.parentNode.selectedItem == this);"
+ ondragstart="SubscriptionActions.startDrag(event, this);"
+ ondragend="SubscriptionActions.endDrag();"
+ ondragover="SubscriptionActions.dragOver(event);"
+ ondrop="SubscriptionActions.drop(event, this);"
+ oncontextmenu="SubscriptionActions.openMenu(event, this);">
+ <vbox class="{subscription.disabled ? 'disabled' : ''}">
+ <hbox align="center">
+ <checkbox label="&subscription.enabled.label;" class="enabledCheckbox tabable" tabindex="-1"
+ checked="{subscription.disabled ? 'false' : 'true'}" oncommand="SubscriptionActions.setDisabled(this, !this.checked);"/>
+
+ <vbox flex="1">
+ <hbox align="center">
+ <deck class="titleBox" flex="1" selectedIndex="0" onselect="event.stopPropagation();">
+ <description ondblclick="if (event.button == 0) TitleEditor.start(this, true);">
+ <description class="title" value="{subscription.title}" flex="1" crop="end"/>
+ (<if condition="{isExternal}">
+ <description value="&subscription.external.label;"/>
+ <else/>
+ <if condition="{subscription.homepage}">
+ <description class="link" value="&subscription.homepage.label;"
+ _url="{subscription.homepage}" tooltiptext="{subscription.homepage}"
+ onclick="if (event.button == 0) { event.stopPropagation();UI.loadInBrowser(this.getAttribute('_url')); }"/>,&#160;
+ </if>
+ <description class="link" value="&subscription.source.label;"
+ _url="{subscription.url}" tooltiptext="{subscription.url}"
+ onclick="if (event.button == 0) { event.stopPropagation();UI.loadInBrowser(this.getAttribute('_url')); }"/>
+ </if>)
+ </description>
+ <textbox oncontextmenu="event.stopPropagation();" class="titleEditor" onkeypress="TitleEditor.keyPress(event);" onblur="TitleEditor.end(true);"/>
+ </deck>
+ </hbox>
+ <hbox align="center">
+ <description flex="1" class="status">
+ <description value="&subscription.lastDownload.label;"/>&#160;
+ <if condition="{downloading}">
+ <description value="&subscription.lastDownload.inProgress;"/>
+ <elif condition="{!subscription.lastDownload}"/>
+ <description value="&subscription.lastDownload.unknown;"/>
+ <else/>
+ <description value="{formatTime(subscription.lastDownload * 1000)}"/>
+ <if condition="{subscription.downloadStatus}">
+ <description>
+ &#160;(<if condition="{subscription.downloadStatus == 'synchronize_invalid_url'}">
+ <description value="&subscription.lastDownload.invalidURL;"/>
+ <elif condition="{subscription.downloadStatus == 'synchronize_connection_error'}"/>
+ <description value="&subscription.lastDownload.connectionError;"/>
+ <elif condition="{subscription.downloadStatus == 'synchronize_invalid_data'}"/>
+ <description value="&subscription.lastDownload.invalidData;"/>
+ <elif condition="{subscription.downloadStatus == 'synchronize_checksum_mismatch'}"/>
+ <description value="&subscription.lastDownload.checksumMismatch;"/>
+ <else/> <!-- synchronize_ok -->
+ <description value="&subscription.lastDownload.success;"/>
+ </if>)
+ </description>
+ </if>
+ </if>
+ </description>
+ </hbox>
+ </vbox>
+
+ <button class="actionButton tabable" type="menu" label="&subscription.actions.label;" tabindex="-1">
+ <menupopup class="actionMenu">
+ <menuitem label="&subscription.editTitle.label;" key="edit-key" command="subscription-editTitle-command"/>
+ <menuitem label="&subscription.update.label;" key="subscription-update-key" command="subscription-update-command"/>
+ <menuitem label="&subscription.showHideFilters.label;" key="subscription-showHideFilters-key" command="subscription-showHideFilters-command"/>
+ <menuitem label="&subscription.delete.label;…" key="delete-key" command="subscription-delete-command"/>
+ <menuseparator/>
+ <menuitem label="&subscription.moveUp.label;" key="moveUp-key" command="subscription-moveUp-command"/>
+ <menuitem label="&subscription.moveDown.label;" key="moveDown-key" command="subscription-moveDown-command"/>
+ </menupopup>
+ </button>
+ </hbox>
+
+ <description class="warning" hidden="{!subscription.upgradeRequired}">&subscription.minVersion.warning;</description>
+ <description class="warning" hidden="{!disabledFilters}">
+ &subscription.disabledFilters.warning;
+ <description class="link" value="&subscription.disabledFilters.enable;" onclick="SubscriptionActions.enableFilters(this);"/>
+ </description>
+ </vbox>
+ </richlistitem>
+
+ <deck id="noSubscriptionsDeck" flex="1">
+ <description flex="1">&noSubscriptions.text;</description>
+ <richlistbox id="subscriptions" class="initialFocus" flex="1"
+ onselect="onSelectionChange(this);"
+ ondragover="SubscriptionActions.dragOver(event);"
+ ondrop="SubscriptionActions.drop(event, null);"
+ onkeypress="SubscriptionActions.keyPress(event);">
+ </richlistbox>
+ </deck>
+
+ <!--description>
+ <checkbox id="acceptableAds" label="&acceptableAds2.label;" oncommand="ListManager.allowAcceptableAds(this.checked);"/>
+ <label class="text-link" value="&viewList.label;" onclick="UI.loadInBrowser(Prefs.subscriptions_exceptionsurl);"/>
+ <label class="text-link" value="&readMore.label;" onclick="UI.loadDocLink('acceptable_ads');"/>
+ </description-->
+ </tabpanel>
+ <tabpanel id="filtersTab" orient="vertical" flex="1">
+ <hbox pack="end">
+ <button id="addGroupButton" label="&addGroup.label;" command="group-add-command"/>
+ </hbox>
+
+ <richlistitem id="groupTemplate" class="subscription" hidden="true" orient="vertical"
+ onmousedown="this._wasSelected = (this.parentNode.selectedItem == this);"
+ ondragstart="SubscriptionActions.startDrag(event, this);"
+ ondragend="SubscriptionActions.endDrag();"
+ ondragover="SubscriptionActions.dragOver(event);"
+ ondrop="SubscriptionActions.drop(event, this);"
+ oncontextmenu="SubscriptionActions.openMenu(event, this);">
+ <hbox class="{subscription.disabled ? 'disabled' : ''}" align="center">
+ <checkbox label="&subscription.enabled.label;" class="enabledCheckbox tabable" tabindex="-1"
+ checked="{subscription.disabled ? 'false' : 'true'}" oncommand="SubscriptionActions.setDisabled(this, !this.checked);"/>
+ <hbox align="center" flex="1">
+ <deck class="titleBox" flex="1" selectedIndex="0" onselect="event.stopPropagation();">
+ <description class="title" value="{subscription.title}" crop="end" ondblclick="if (event.button == 0) TitleEditor.start(this, true);"/>
+ <textbox oncontextmenu="event.stopPropagation();" class="titleEditor" onkeypress="TitleEditor.keyPress(event);" onblur="TitleEditor.end(true);"/>
+ </deck>
+ </hbox>
+ <button class="actionButton tabable" type="menu" label="&subscription.actions.label;" tabindex="-1">
+ <menupopup class="actionMenu">
+ <menuitem label="&subscription.editTitle.label;" key="edit-key" command="subscription-editTitle-command"/>
+ <menuitem label="&subscription.showHideFilters.label;" key="subscription-showHideFilters-key" command="subscription-showHideFilters-command"/>
+ <menuitem label="&subscription.delete.label;…" key="delete-key" command="subscription-delete-command"/>
+ <menuseparator/>
+ <menuitem label="&subscription.moveUp.label;" key="moveUp-key" command="subscription-moveUp-command"/>
+ <menuitem label="&subscription.moveDown.label;" key="moveDown-key" command="subscription-moveDown-command"/>
+ </menupopup>
+ </button>
+ </hbox>
+ </richlistitem>
+
+ <deck id="noFiltersDeck" flex="1">
+ <description flex="1">&noFilters.text;</description>
+ <richlistbox id="groups" class="initialFocus" flex="1"
+ onselect="onSelectionChange(this);"
+ ondragover="SubscriptionActions.dragOver(event);"
+ ondrop="SubscriptionActions.drop(event, null);"
+ onkeypress="SubscriptionActions.keyPress(event);">
+ </richlistbox>
+ </deck>
+ </tabpanel>
+ </tabpanels>
+ </tabbox>
+
+ <splitter id="filtersSplitter" persist="state" orient="horizontal" collapse="after" state="collapsed" oncommand="FilterView.refresh();onSplitterStateChange(this);">
+ <grippy id="filtersGrippy"/>
+ </splitter>
+
+ <vbox id="filtersContainer" persist="width height" width="500">
+ <hbox pack="end">
+ <button id="findButton" label="&find.label;" command="find-command"/>
+ <button id="filterActionButton" type="menu" label="&filter.actions.label;">
+ <menupopup id="filterActionMenu" onpopupshowing="FilterActions.fillActionsPopup();">
+ <menuitem label="&filter.edit.label;" key="edit-key" command="filters-edit-command"/>
+ <menuitem label="&filter.cut.label;" key="filters-cut-key" command="filters-cut-command"/>
+ <menuitem label="&filter.copy.label;" key="filters-copy-key" command="filters-copy-command"/>
+ <menuitem label="&filter.paste.label;" key="filters-paste-key" command="filters-paste-command"/>
+ <menuitem label="&filter.delete.label;" key="delete-key" command="filters-delete-command"/>
+ <menuseparator/>
+ <menuitem label="&filter.selectAll.label;" key="filters-selectAll-key" command="filters-selectAll-command"/>
+ <menuitem label="&filter.resetHitCounts.label;" command="filters-resetHitCounts-command"/>
+ <menuseparator/>
+ <menuitem label="&filter.moveUp.label;" key="moveUp-key" command="filters-moveUp-command"/>
+ <menuitem label="&filter.moveDown.label;" key="moveDown-key" command="filters-moveDown-command"/>
+ <menuseparator/>
+ <menu id="viewMenu" label="&viewMenu.label;"/>
+ </menupopup>
+ </button>
+ <button id="addFilterButton" label="&addFilter.label;" command="filters-add-command"/>
+ </hbox>
+ <tree id="filtersTree"
+ flex="1"
+ editable="true"
+ seltype="multiple"
+ enableColumnDrag="true"
+ hidecolumnpicker="true"
+ _removewarning="&filters.remove.warning;">
+ <treecols context="filters-view-menu1">
+ <treecol id="col-enabled" label="&enabled.column;" cycler="true" flex="0" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="col-filter" label="&filter.column;" flex="10" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="col-slow" label="!" display="&slow.column;" tooltiptext="&slow.column;" flex="0" width="16" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="col-hitcount" label="&hitcount.column;" flex="0" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="col-lasthit" label="&lasthit.column;" hidden="true" flex="4" persist="width ordinal sortDirection hidden"/>
+ </treecols>
+
+ <treechildren id="filtersTreeChildren"
+ oncontextmenu="E('filterActionMenu').openPopupAtScreen(event.screenX, event.screenY, true);"
+ tooltip="filtersTooltip"
+ noGroupText="&noGroupSelected.text;"
+ noFiltersText="&noFiltersInGroup.text;"
+ ondragstart="FilterActions.startDrag(event);"
+ ondragend="FilterActions.endDrag(event);"/>
+ </tree>
+ </vbox>
+</hbox>
+
+<findbar id="findbar"/>
+
+<hbox id="buttons">
+ <button id="backupButton" type="menu"
+ label="&backupButton.label;"
+ _backupDialogTitle="&backup.label;" _restoreDialogTitle="&restore.own.label;"
+ _fileFilterComplete="&backup.complete.title;" _fileFilterCustom="&backup.custom.title;"
+ _backupError="&backup.error;" _restoreError="&restore.error;"
+ _restoreCompleteWarning="&restore.complete.warning;" _restoreCustomWarning="&restore.custom.warning;"
+ _restoreVersionWarning="&restore.minVersion.warning;"
+ oncommand="if (event.target == this) Utils.runAsync(function() this.open = true, this);">
+ <menupopup onpopupshowing="Backup.fillRestorePopup();">
+ <menuitem id="backup" key="backup-key" label="&backup.label;…" oncommand="Backup.backupToFile();"/>
+ <menuseparator/>
+ <menuitem id="restoreBackupTemplate" label="&restore.default.label;" hidden="true"/>
+ <menuitem id="restoreOwnBackup" key="restore-key" label="&restore.own.label;…" oncommand="Backup.restoreFromFile();"/>
+ </menupopup>
+ </button>
+
+ <spacer flex="1"/>
+
+ <button id="close" dlgtype="accept" label="&close.label;"/>
+</hbox>
+
+</dialog>
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/firstRun.html b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/firstRun.html
new file mode 100644
index 0000000..36f5cf7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/firstRun.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<html>
+ <head>
+ <title class="i18n_firstRun_title"></title>
+ <meta charset="utf-8">
+ <link type="text/css" href="/skin/firstRun.css" rel="stylesheet"/>
+ <script type="text/javascript" src="utils.js"></script>
+ <script type="text/javascript" src="i18n.js"></script>
+ <script type="text/javascript" src="firstRun.js"></script>
+ </head>
+ <body>
+
+
+ <header>
+ <div id="logo"></div>
+ <h1 id="title-main" class="i18n_firstRun_title"></h1>
+ </header>
+
+ <section id="legacySafariWarning" class="i18n_firstRun_legacySafariWarning warning" hidden="true"></section>
+ <section id="filterlistsReinitializedWarning" class="i18n_firstRun_filterlistsReinitializedWarning warning" hidden="true"></section>
+ <section id="dataCorruptionWarning" class="i18n_firstRun_dataCorruptionWarning warning" hidden="true"></section>
+
+ <section id="acceptable-ads">
+ <h2 class="i18n_firstRun_acceptableAdsHeadline"></h2>
+ <p id="acceptableAdsExplanation" class="i18n_firstRun_acceptableAdsExplanation"></p>
+ </section>
+
+
+ <section id="share">
+ <h2 id="share-headline" class="i18n_firstRun_share_headline"></h2>
+
+ <div id="donate-block">
+ <a id="donate" class="i18n_firstRun_donate" target="_blank"></a>
+ <span id="donate-label" class="i18n_firstRun_donate_label"></span>
+ </div>
+
+ <div id="share-block">
+ <div id="share-general" class="share-buttons">
+ <a id="share-facebook" href="https://www.facebook.com/adblockplus" target="_blank" data-script="https://facebook.com/plugins/like.php?">
+ </a>
+ <a id="share-twitter" href="https://twitter.com/adblockplus" target="_blank" data-script="https://platform.twitter.com/widgets.js">
+ </a>
+ <a id="share-gplus" href="https://www.google.com/+AdblockPlus" target="_blank" data-script="https://apis.google.com/js/plusone.js">
+ </a>
+ </div>
+
+ <!-- Chinese social networks -->
+ <div id="share-chinese" class="share-buttons">
+ <a id="share-renren" href="http://www.renren.com/601651969" target="_blank">
+ </a>
+ <a id="share-weibo" href="http://e.weibo.com/adblockplus/" target="_blank">
+ </a>
+ </div>
+ <span class="i18n_firstRun_share"></span>
+ </div>
+ </section>
+
+
+ <section id="can-do-more">
+ <h2 class="i18n_firstRun_features"></h2>
+
+ <div id="can-do-more-content">
+ <ul id="features">
+ <li id="feature-malware" class="feature">
+ <div class="feature-image feature-malware-image"></div>
+ <div class="feature-description">
+ <div class="feature-description-textblock">
+ <h3 class="i18n_firstRun_feature_malware feature-title"></h3>
+ <span class="i18n_firstRun_feature_malware_description"></span>
+ </div>
+ <div id="toggle-malware" class="toggle">
+ <div class="i18n_firstRun_toggle_on toggle-on"></div>
+ <div class="toggle-blob"></div>
+ <div class="i18n_firstRun_toggle_off toggle-off"></div>
+ </div>
+ </div>
+
+ </li>
+ <li id="feature-social" class="feature">
+ <div class="feature-image feature-social-image"></div>
+ <div class="feature-description">
+ <div class="feature-description-textblock">
+ <h3 class="i18n_firstRun_feature_social feature-title"></h3>
+ <span class="i18n_firstRun_feature_social_description"></span>
+ </div>
+ <div id="toggle-social" class="toggle">
+ <div class="i18n_firstRun_toggle_on toggle-on"></div>
+ <div class="toggle-blob"></div>
+ <div class="i18n_firstRun_toggle_off toggle-off"></div>
+ </div>
+ </div>
+ </li>
+
+ <li id="feature-tracking" class="feature">
+ <div class="feature-image feature-tracking-image"></div>
+ <div class="feature-description">
+ <div class="feature-description-textblock">
+ <h3 class="i18n_firstRun_feature_tracking feature-title"></h3>
+ <span class="i18n_firstRun_feature_tracking_description"></span>
+ </div>
+ <div id="toggle-tracking" class="toggle">
+ <div class="i18n_firstRun_toggle_on toggle-on"></div>
+ <div class="toggle-blob"></div>
+ <div class="i18n_firstRun_toggle_off toggle-off"></div>
+ </div>
+ </div>
+ </li>
+
+ </ul>
+
+ </div>
+ </section>
+
+
+ <footer>
+ <a id="contributors" class="i18n_firstRun_contributor_credits"></a>
+ </footer>
+
+
+ <div id="glass-pane">
+ <iframe id="share-popup" scrolling="no"></iframe>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/firstRun.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/firstRun.js
new file mode 100644
index 0000000..be2caa6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/firstRun.js
@@ -0,0 +1,253 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+"use strict";
+
+(function()
+{
+ // Load subscriptions for features
+ var featureSubscriptions = [
+ {
+ feature: "malware",
+ homepage: "http://malwaredomains.com/",
+ title: "Malware Domains",
+ url: "https://easylist-downloads.adblockplus.org/malwaredomains_full.txt"
+ },
+ {
+ feature: "social",
+ homepage: "https://www.fanboy.co.nz/",
+ title: "Fanboy's Social Blocking List",
+ url: "https://easylist-downloads.adblockplus.org/fanboy-social.txt"
+ },
+ {
+ feature: "tracking",
+ homepage: "https://easylist.adblockplus.org/",
+ title: "EasyPrivacy",
+ url: "https://easylist-downloads.adblockplus.org/easyprivacy.txt"
+ }
+ ];
+
+ function onDOMLoaded()
+ {
+ var locale = require("utils").Utils.appLocale;
+ document.documentElement.setAttribute("lang", locale);
+
+ // Set up URLs
+ var donateLink = E("donate");
+ donateLink.href = Utils.getDocLink("donate");
+
+ var contributors = E("contributors");
+ contributors.href = Utils.getDocLink("contributors");
+
+ setLinks("acceptableAdsExplanation", Utils.getDocLink("acceptable_ads_criteria"), openFilters);
+ setLinks("share-headline", Utils.getDocLink("contribute"));
+
+ if (typeof backgroundPage != "undefined")
+ {
+ // Show warning if data corruption was detected
+ if (backgroundPage.seenDataCorruption)
+ {
+ E("dataCorruptionWarning").removeAttribute("hidden");
+ setLinks("dataCorruptionWarning", Utils.getDocLink("knownIssuesChrome_filterstorage"));
+ }
+
+ // Show warning if filterlists settings were reinitialized
+ if (backgroundPage.filterlistsReinitialized)
+ {
+ E("filterlistsReinitializedWarning").removeAttribute("hidden");
+ setLinks("filterlistsReinitializedWarning", openFilters);
+ }
+ }
+
+ // Show warning if Safari version isn't supported
+ var info = require("info");
+ if (info.platform == "safari" && (
+ Services.vc.compare(info.platformVersion, "6.0") < 0 || // beforeload breaks websites in Safari 5
+ Services.vc.compare(info.platformVersion, "6.1") == 0 || // extensions are broken in 6.1 and 7.0
+ Services.vc.compare(info.platformVersion, "7.0") == 0
+ ))
+ E("legacySafariWarning").removeAttribute("hidden");
+
+ // Set up feature buttons linked to subscriptions
+ featureSubscriptions.forEach(setToggleSubscriptionButton);
+ var filterListener = function(action)
+ {
+ if (/^subscription\.(added|removed|disabled)$/.test(action))
+ {
+ for (var i = 0; i < featureSubscriptions.length; i++)
+ {
+ var featureSubscription = featureSubscriptions[i];
+ updateToggleButton(featureSubscription.feature, isSubscriptionEnabled(featureSubscription));
+ }
+ }
+ }
+ FilterNotifier.addListener(filterListener);
+ window.addEventListener("unload", function(event)
+ {
+ FilterNotifier.removeListener(filterListener);
+ }, false);
+
+ initSocialLinks();
+ }
+
+ function isSubscriptionEnabled(featureSubscription)
+ {
+ return featureSubscription.url in FilterStorage.knownSubscriptions
+ && !Subscription.fromURL(featureSubscription.url).disabled;
+ }
+
+ function setToggleSubscriptionButton(featureSubscription)
+ {
+ var feature = featureSubscription.feature;
+
+ var element = E("toggle-" + feature);
+ updateToggleButton(feature, isSubscriptionEnabled(featureSubscription));
+ element.addEventListener("click", function(event)
+ {
+ var subscription = Subscription.fromURL(featureSubscription.url);
+ if (isSubscriptionEnabled(featureSubscription))
+ FilterStorage.removeSubscription(subscription);
+ else
+ {
+ subscription.disabled = false;
+ subscription.title = featureSubscription.title;
+ subscription.homepage = featureSubscription.homepage;
+ FilterStorage.addSubscription(subscription);
+ if (!subscription.lastDownload)
+ Synchronizer.execute(subscription);
+ }
+ }, false);
+ }
+
+ function openSharePopup(url)
+ {
+ var iframe = E("share-popup");
+ var glassPane = E("glass-pane");
+ var popupMessageReceived = false;
+
+ var popupMessageListener = function(event)
+ {
+ var originFilter = Filter.fromText("||adblockplus.org^");
+ if (!originFilter.matches(event.origin, "OTHER", null, null))
+ return;
+
+ var width = event.data.width;
+ var height = event.data.height;
+ iframe.width = width;
+ iframe.height = height;
+ iframe.style.marginTop = -height/2 + "px";
+ iframe.style.marginLeft = -width/2 + "px";
+ popupMessageReceived = true;
+ window.removeEventListener("message", popupMessageListener);
+ };
+ // Firefox requires last parameter to be true to be triggered by unprivileged pages
+ window.addEventListener("message", popupMessageListener, false, true);
+
+ var popupLoadListener = function()
+ {
+ if (popupMessageReceived)
+ {
+ iframe.className = "visible";
+
+ var popupCloseListener = function()
+ {
+ iframe.className = glassPane.className = "";
+ document.removeEventListener("click", popupCloseListener);
+ };
+ document.addEventListener("click", popupCloseListener, false);
+ }
+ else
+ {
+ glassPane.className = "";
+ window.removeEventListener("message", popupMessageListener);
+ }
+
+ iframe.removeEventListener("load", popupLoadListener);
+ };
+ iframe.addEventListener("load", popupLoadListener, false);
+
+ iframe.src = url;
+ glassPane.className = "visible";
+ }
+
+ function initSocialLinks()
+ {
+ var networks = ["twitter", "facebook", "gplus"];
+ networks.forEach(function(network)
+ {
+ var link = E("share-" + network);
+ link.addEventListener("click", onSocialLinkClick, false);
+ });
+ }
+
+ function onSocialLinkClick(event)
+ {
+ // Don't open the share page if the sharing script would be blocked
+ var filter = defaultMatcher.matchesAny(event.target.getAttribute("data-script"), "SCRIPT", "adblockplus.org", true);
+ if (!(filter instanceof BlockingFilter))
+ {
+ event.preventDefault();
+ openSharePopup(Utils.getDocLink(event.target.id));
+ }
+ }
+
+ function setLinks(id)
+ {
+ var element = E(id);
+ if (!element)
+ {
+ return;
+ }
+
+ var links = element.getElementsByTagName("a");
+
+ for (var i = 0; i < links.length; i++)
+ {
+ if (typeof arguments[i + 1] == "string")
+ {
+ links[i].href = arguments[i + 1];
+ links[i].setAttribute("target", "_blank");
+ }
+ else if (typeof arguments[i + 1] == "function")
+ {
+ links[i].href = "javascript:void(0);";
+ links[i].addEventListener("click", arguments[i + 1], false);
+ }
+ }
+ }
+
+ function openFilters()
+ {
+ if (typeof UI != "undefined")
+ UI.openFiltersDialog();
+ else
+ {
+ backgroundPage.openOptions();
+ }
+ }
+
+ function updateToggleButton(feature, isEnabled)
+ {
+ var button = E("toggle-" + feature);
+ if (isEnabled)
+ button.classList.remove("off");
+ else
+ button.classList.add("off");
+ }
+
+ document.addEventListener("DOMContentLoaded", onDOMLoaded, false);
+})();
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/flasher.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/flasher.js
new file mode 100644
index 0000000..ddb4131
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/flasher.js
@@ -0,0 +1,108 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * Draws a blinking border for a list of matching nodes.
+ */
+
+var flasher = {
+ nodes: null,
+ count: 0,
+ timer: null,
+
+ flash: function(nodes)
+ {
+ this.stop();
+ if (nodes)
+ nodes = nodes.filter(function(node) node.nodeType == Node.ELEMENT_NODE);
+ if (!nodes || !nodes.length)
+ return;
+
+ if (Prefs.flash_scrolltoitem && nodes[0].ownerDocument)
+ {
+ // Ensure that at least one node is visible when flashing
+ let wnd = nodes[0].ownerDocument.defaultView;
+ try
+ {
+ let topWnd = Utils.getChromeWindow(wnd);
+ let {getBrowser} = require("appSupport");
+ let browser = (getBrowser ? getBrowser(topWnd) : null);
+ if (browser)
+ browser.markupDocumentViewer.scrollToNode(nodes[0]);
+ }
+ catch(e)
+ {
+ Cu.reportError(e);
+ }
+ }
+
+ this.nodes = nodes;
+ this.count = 0;
+
+ this.doFlash();
+ },
+
+ doFlash: function() {
+ if (this.count >= 12) {
+ this.stop();
+ return;
+ }
+
+ if (this.count % 2)
+ this.switchOff();
+ else
+ this.switchOn();
+
+ this.count++;
+
+ this.timer = window.setTimeout(function() {flasher.doFlash()}, 300);
+ },
+
+ stop: function() {
+ if (this.timer) {
+ window.clearTimeout(this.timer);
+ this.timer = null;
+ }
+
+ if (this.nodes) {
+ this.switchOff();
+ this.nodes = null;
+ }
+ },
+
+ setOutline: function(outline, offset)
+ {
+ for (var i = 0; i < this.nodes.length; i++)
+ {
+ if ("style" in this.nodes[i])
+ {
+ this.nodes[i].style.outline = outline;
+ this.nodes[i].style.outlineOffset = offset;
+ }
+ }
+ },
+
+ switchOn: function()
+ {
+ this.setOutline("#CC0000 dotted 2px", "-2px");
+ },
+
+ switchOff: function()
+ {
+ this.setOutline("", "");
+ }
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/i18n.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/i18n.js
new file mode 100644
index 0000000..8366268
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/i18n.js
@@ -0,0 +1,150 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+var i18n;
+
+if (typeof ext != "undefined")
+ i18n = ext.i18n;
+else if (typeof chrome != "undefined")
+ // TODO: This check only exist for backwards compatibility, while the Safari
+ // port isn't merged into the adblockpluschrome repo. So this branch should
+ // be removed when the Safari port was merged.
+ i18n = chrome.i18n;
+else
+{
+ // Using Firefox' approach on i18n instead
+
+ // Randomize URI to work around bug 719376
+ var pageName = location.pathname.replace(/.*\//, '').replace(/\..*?$/, '');
+ var stringBundle = Services.strings.createBundle("chrome://adblockplus/locale/" + pageName +
+ ".properties?" + Math.random());
+
+ function getI18nMessage(key)
+ {
+ return {
+ "message": stringBundle.GetStringFromName(key)
+ };
+ }
+
+ i18n = (function()
+ {
+ function getText(message, args)
+ {
+ var text = message.message;
+ var placeholders = message.placeholders;
+
+ if (!args || !placeholders)
+ return text;
+
+ for (var key in placeholders)
+ {
+ var content = placeholders[key].content;
+ if (!content)
+ continue;
+
+ var index = parseInt(content.slice(1), 10);
+ if (isNaN(index))
+ continue;
+
+ var replacement = args[index - 1];
+ if (typeof replacement === "undefined")
+ continue;
+
+ text = text.split("$" + key + "$").join(replacement);
+ }
+ return text;
+ }
+
+ return {
+ getMessage: function(key, args)
+ {
+ try{
+ var message = getI18nMessage(key);
+ return getText(message, args);
+ }
+ catch(e)
+ {
+ Cu.reportError(e);
+ return "Missing translation: " + key;
+ }
+ }
+ };
+ })();
+}
+
+// Inserts i18n strings into matching elements. Any inner HTML already in the element is
+// parsed as JSON and used as parameters to substitute into placeholders in the i18n
+// message.
+i18n.setElementText = function(element, stringName, arguments)
+{
+ function processString(str, element)
+ {
+ var match = /^(.*?)<(a|strong)>(.*?)<\/\2>(.*)$/.exec(str);
+ if (match)
+ {
+ processString(match[1], element);
+
+ var e = document.createElement(match[2]);
+ processString(match[3], e);
+ element.appendChild(e);
+
+ processString(match[4], element);
+ }
+ else
+ element.appendChild(document.createTextNode(str));
+ }
+
+ while (element.lastChild)
+ element.removeChild(element.lastChild);
+ processString(i18n.getMessage(stringName, arguments), element);
+}
+
+// Loads i18n strings
+function loadI18nStrings()
+{
+ var nodes = document.querySelectorAll("[class^='i18n_']");
+ for(var i = 0; i < nodes.length; i++)
+ {
+ var node = nodes[i];
+ var arguments = JSON.parse("[" + node.textContent + "]");
+ if (arguments.length == 0)
+ arguments = null;
+
+ var className = node.className;
+ if (className instanceof SVGAnimatedString)
+ className = className.animVal;
+ var stringName = className.split(/\s/)[0].substring(5);
+
+ i18n.setElementText(node, stringName, arguments);
+ }
+}
+
+// Provides a more readable string of the current date and time
+function i18n_timeDateStrings(when)
+{
+ var d = new Date(when);
+ var timeString = d.toLocaleTimeString();
+
+ var now = new Date();
+ if (d.toDateString() == now.toDateString())
+ return [timeString];
+ else
+ return [timeString, d.toLocaleDateString()];
+}
+
+// Fill in the strings as soon as possible
+window.addEventListener("DOMContentLoaded", loadI18nStrings, true);
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/overlay.xul b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/overlay.xul
new file mode 100644
index 0000000..9724859
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/overlay.xul
@@ -0,0 +1,134 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<!DOCTYPE overlay [
+ <!ENTITY % overlayDTD SYSTEM "chrome://adblockplus/locale/overlay.dtd">
+ %overlayDTD;
+ <!ENTITY % subscriptionsDTD SYSTEM "chrome://adblockplus/locale/subscriptionSelection.dtd">
+ %subscriptionsDTD;
+]>
+
+<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ imagecontextlabel="&context.image.label;…" objectcontextlabel="&context.object.label;…"
+ mediacontextlabel="&context.media.label;…" subdocumentcontextlabel="&context.frame.label;…"
+ whitelistcontextlabel="&context.removeWhitelist.label;"
+ objtabtext="&objecttab.title;…" objtabtooltip="&objecttab.tooltip;"
+ subscriptionDialogTitle="&dialog.title;"
+ subscriptionDialogMessage="&title.label; ?1?&#10;&#10;&location.label; ?2?">
+ <popupset id="abp-popupset">
+ <!-- Icon's tooltip -->
+ <tooltip id="abp-tooltip" orient="vertical">
+ <description id="abp-tooltip-action" hidden="true"/>
+ <label id="abp-tooltip-status-label" value="&status.tooltip;"/>
+ <description id="abp-tooltip-status"/>
+ <label id="abp-tooltip-blocked-label" value="&blocked.tooltip;" hidden="true"/>
+ <description id="abp-tooltip-blocked" hidden="true"/>
+ <label id="abp-tooltip-filters-label" value="&filters.tooltip;" hidden="true"/>
+ <vbox id="abp-tooltip-filters" hidden="true"/>
+ <description id="abp-tooltip-more-filters" value="…" hidden="true"/>
+ </tooltip>
+ </popupset>
+
+ <!-- Icon's context menu -->
+ <menupopup id="abp-status-popup" context="">
+ <menuitem id="abp-status-sendReport" label="&sendReport.label;…" key="abp-key-sendReport" command="abp-command-sendReport"/>
+ <menuitem id="abp-status-openbottombar" label="&opensidebar.label;" key="abp-key-sidebar" command="abp-command-sidebar"/>
+ <menuitem id="abp-status-closebottombar" label="&closesidebar.label;" key="abp-key-sidebar" command="abp-command-sidebar"/>
+ <menuitem id="abp-status-filters" label="&filters.label;…" key="abp-key-filters" command="abp-command-filters"/>
+ <menuseparator id="abp-status-whitelist-sep"/>
+ <menuitem id="abp-status-whitelistsite" labeltempl="&whitelist.site.label;" type="checkbox" command="abp-command-togglesitewhitelist"/>
+ <menuitem id="abp-status-whitelistpage" label="&whitelist.page.label;" type="checkbox" command="abp-command-togglepagewhitelist"/>
+ <menuitem id="abp-status-disabled" label="&disable.label;" type="checkbox" key="abp-key-enable" command="abp-command-enable"/>
+ <menuseparator/>
+ <menu id="abp-status-options" label="&options.label;">
+ <menupopup id="abp-status-options-popup">
+ <menuitem id="abp-status-frameobjects" label="&objecttabs.label;" type="checkbox" command="abp-command-toggleobjtabs"/>
+ <menuitem id="abp-status-slowcollapse" label="&hideplaceholders.label;" type="checkbox" command="abp-command-togglecollapse"/>
+ <menuitem id="abp-status-savestats" label="&counthits.label;" type="checkbox" command="abp-command-togglesavestats"/>
+ <menuitem id="abp-status-sync" label="&sync.label;" type="checkbox" command="abp-command-togglesync"/>
+ <menuseparator id="abp-status-iconSettingsSeparator"/>
+ <menuitem id="abp-status-showintoolbar" label="&showintoolbar.label;" type="checkbox" command="abp-command-toggleshowintoolbar"/>
+ <menuitem id="abp-status-showinstatusbar" label="&showinstatusbar.label;" type="checkbox" command="abp-command-toggleshowinstatusbar"/>
+ </menupopup>
+ </menu>
+
+ <hbox class="abp-contributebutton" id="abp-status-contributebutton" pack="center" align="center">
+ <!-- noautoclose attribute tells Australis menu that it shouldn't close when
+ these are clicked, see https://bugzilla.mozilla.org/show_bug.cgi?id=940693 -->
+ <button class="abp-contributebutton-btn" label="&contribute.label;" command="abp-command-contribute" flex="1" noautoclose="true"/>
+ <toolbarbutton class="abp-contributebutton-close" command="abp-command-contribute-hide" noautoclose="true"/>
+ </hbox>
+ </menupopup>
+
+ <keyset id="abp-keyset"/>
+
+ <!-- Dummy oncommand attributes are work-arounds for bug 371900 -->
+ <commandset id="abp-commandset">
+ <command id="abp-command-sendReport" oncommand="//"/>
+ <command id="abp-command-filters" oncommand="//"/>
+ <command id="abp-command-settings" oncommand="//"/>
+ <command id="abp-command-sidebar" oncommand="//"/>
+ <command id="abp-command-togglesitewhitelist"/>
+ <command id="abp-command-togglepagewhitelist"/>
+ <command id="abp-command-toggleobjtabs"/>
+ <command id="abp-command-togglecollapse"/>
+ <command id="abp-command-togglesavestats"/>
+ <command id="abp-command-togglesync"/>
+ <command id="abp-command-toggleshowintoolbar"/>
+ <command id="abp-command-toggleshowinstatusbar"/>
+ <command id="abp-command-enable" oncommand="//"/>
+ <command id="abp-command-contribute"/>
+ <command id="abp-command-contribute-hide"/>
+ </commandset>
+
+ <statusbarpanel id="abp-status" class="statusbarpanel-iconic"
+ tooltip="abp-tooltip"/>
+
+ <toolbarbutton id="abp-toolbarbutton" class="toolbarbutton-1" label="&toolbarbutton.label;"
+ tooltip="abp-tooltip"/>
+
+ <!-- Tools menu -->
+ <menu id="abp-menuitem" label="&toolbarbutton.label;"/>
+
+ <!-- Bottom bar -->
+ <hbox id="abp-bottombar-container">
+ <splitter id="abp-bottombar-splitter"/>
+ <vbox id="abp-bottombar">
+ <toolbox id="abp-bottombar-header">
+ <toolbar id="abp-bottombar-toolbar" align="center" grippyhidden="true" fullscreentoolbar="true">
+ <label id="abp-bottombar-title" control="abp-bottombar-browser" value="&sidebar.title;" flex="1" crop="end"/>
+ <toolbarbutton id="abp-bottombar-close" command="abp-command-sidebar" tooltiptext="&closesidebar.label;"/>
+ </toolbar>
+ </toolbox>
+ <iframe id="abp-bottombar-browser" src="chrome://adblockplus/content/ui/sidebar.xul" flex="1"/>
+ </vbox>
+ </hbox>
+
+ <!-- Notification panel -->
+ <panel id="abp-notification" type="arrow" orient="vertical"
+ xmlns:html="http://www.w3.org/1999/xhtml">
+ <label id="abp-notification-title" class="header"/>
+ <html:p id="abp-notification-message"/>
+ <hbox id="abp-notification-question">
+ <button id="abp-notification-yes" label="&notification.button.yes;"/>
+ <button id="abp-notification-no" label="&notification.button.no;"/>
+ <toolbarbutton id="abp-notification-close" label="&notification.button.close;"></toolbarbutton>
+ </hbox>
+ </panel>
+</overlay>
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/progressBar.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/progressBar.js
new file mode 100644
index 0000000..659acdd
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/progressBar.js
@@ -0,0 +1,158 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+(function()
+{
+ let progressBar, canvas, headers, isRTL;
+
+ function onLoad()
+ {
+ window.removeEventListener("load", onLoad, false);
+
+ // Init global variables
+ progressBar = document.getElementById("progressBar");
+ canvas = document.getElementById("progressBarCanvas");
+
+ headers = Array.prototype.slice.call(progressBar.getElementsByTagName("label"));
+ for (let i = 0; i < headers.length; i++)
+ canvas.parentNode.appendChild(headers[i]);
+
+ // Expose properties
+ progressBar.__defineGetter__("activeItem", getActiveItem);
+ progressBar.__defineSetter__("activeItem", setActiveItem);
+ progressBar.__defineGetter__("activeItemComplete", getActiveItemComplete);
+ progressBar.__defineSetter__("activeItemComplete", setActiveItemComplete);
+
+ isRTL = (window.getComputedStyle(document.documentElement).direction == "rtl");
+
+ // Run actual drawing delayed, once the sizes are fixed
+ window.setTimeout(init, 0);
+ };
+ window.addEventListener("load", onLoad, false);
+
+ function init()
+ {
+ const gapWidth = 5;
+ const arrowheadWidth = 5;
+
+ let width = canvas.width = canvas.offsetWidth;
+ let height = canvas.height = canvas.offsetHeight;
+
+ let context = canvas.getContext("2d");
+ context.fillStyle = window.getComputedStyle(progressBar, "").color;
+ context.strokeStyle = window.getComputedStyle(progressBar, "").color;
+ context.lineWidth = 1;
+ if (isRTL)
+ {
+ context.translate(width, 0);
+ context.scale(-1, 1);
+ }
+
+ let panelCount = headers.length;
+ let panelWidth = (width - gapWidth * (panelCount - 1) - 1) / panelCount;
+ for (let i = 0; i < panelCount; i++)
+ {
+ context.save();
+ context.translate(Math.round(i * (panelWidth + gapWidth)) + 0.5, 0.5);
+ context.beginPath();
+ if (i)
+ context.moveTo(-arrowheadWidth, 0);
+ else
+ context.moveTo(0, 0);
+ context.lineTo(panelWidth - arrowheadWidth, 0);
+ context.lineTo(panelWidth, (height - 1) / 2);
+ context.lineTo(panelWidth - arrowheadWidth, height - 1);
+ if (i)
+ {
+ context.lineTo(-arrowheadWidth, height - 1);
+ context.lineTo(0, (height - 1) / 2);
+ context.lineTo(-arrowheadWidth, 0);
+ }
+ else
+ {
+ context.lineTo(0, height - 1);
+ context.lineTo(0, 0);
+ }
+
+ context.stroke();
+ context.restore();
+
+ let childLeft = Math.round(i * (panelWidth + gapWidth) + 1);
+ let childWidth = panelWidth - arrowheadWidth - 2;
+ let child = headers[i];
+ child.style.MozMarginStart = childLeft + "px";
+ child.style.MozMarginEnd = (width - childLeft - childWidth) + "px";
+ child.style.width = childWidth + "px";
+ }
+
+ // Resize after initialization should be ignored
+ canvas.parentNode.removeAttribute("flex");
+ }
+
+ function getActiveItem()
+ {
+ for (let i = 0; i < headers.length; i++)
+ {
+ let header = headers[i];
+ if (header.classList.contains("active"))
+ return header;
+ }
+ return null;
+ }
+
+ function setActiveItem(val)
+ {
+ let complete = true;
+ for (let i = 0; i < headers.length; i++)
+ {
+ let header = headers[i];
+ if (header == val)
+ complete = false;
+
+ if (!complete && header.value[0] == "✔")
+ header.value = header.value.replace(/^✔\s*/, "");
+ else if (complete && header.value[0] != "✔")
+ header.value = "✔ " + header.value;
+
+ if (header == val)
+ header.classList.add("active");
+ else
+ header.classList.remove("active");
+ }
+ }
+
+ function getActiveItemComplete()
+ {
+ let activeItem = this.activeItem;
+ if (!activeItem)
+ return false;
+ else
+ return activeItem.value[0] == "✔";
+ }
+
+ function setActiveItemComplete(val)
+ {
+ let activeItem = this.activeItem;
+ if (!activeItem)
+ return;
+
+ if (!val && activeItem.value[0] == "✔")
+ activeItem.value = activeItem.value.replace(/^✔\s*/, "");
+ else if (val && activeItem.value[0] != "✔")
+ activeItem.value = "✔ " + activeItem.value;
+ }
+})();
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/progressBar.xul b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/progressBar.xul
new file mode 100644
index 0000000..d940e61
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/progressBar.xul
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<overlay id="progressBarOverlay"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+ <script type="application/x-javascript;version=1.7" src="progressBar.js"/>
+
+ <hbox id="progressBar" pack="center">
+ <stack flex="1">
+ <canvas xmlns="http://www.w3.org/1999/xhtml" id="progressBarCanvas" width="1" height="1"/>
+ </stack>
+ </hbox>
+</overlay>
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sendReport.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sendReport.js
new file mode 100644
index 0000000..3ccc0e6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sendReport.js
@@ -0,0 +1,1571 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+//
+// Report data template, more data will be added during data collection
+//
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/FileUtils.jsm");
+
+const MILLISECONDS_IN_SECOND = 1000;
+const SECONDS_IN_MINUTE = 60;
+const SECONDS_IN_HOUR = 60 * SECONDS_IN_MINUTE;
+const SECONDS_IN_DAY = 24 * SECONDS_IN_HOUR;
+
+let contentWindow = window.arguments[0];
+let windowURI = (window.arguments[1] instanceof Ci.nsIURI ? window.arguments[1] : null);
+
+let reportData = new DOMParser().parseFromString("<report></report>", "text/xml");
+
+// Some helper functions to work with the report data
+function reportElement(tag)
+{
+ for (let child = reportData.documentElement.firstChild; child; child = child.nextSibling)
+ if (child.nodeType == Node.ELEMENT_NODE && child.tagName == tag)
+ return child;
+ let element = reportData.createElement(tag);
+ reportData.documentElement.appendChild(element);
+ return element;
+}
+function removeReportElement(tag)
+{
+ for (let child = reportData.documentElement.firstChild; child; child = child.nextSibling)
+ if (child.nodeType == Node.ELEMENT_NODE && child.tagName == tag)
+ child.parentNode.removeChild(child);
+}
+function appendElement(parent, tag, attributes, body)
+{
+ let element = parent.ownerDocument.createElement(tag);
+ if (typeof attributes == "object" && attributes !== null)
+ for (let attribute in attributes)
+ if (attributes.hasOwnProperty(attribute))
+ element.setAttribute(attribute, attributes[attribute]);
+ if (typeof body != "undefined" && body !== null)
+ element.textContent = body;
+ parent.appendChild(element);
+ return element;
+}
+function serializeReportData()
+{
+ let result = new XMLSerializer().serializeToString(reportData);
+
+ // Insert line breaks before each new tag
+ result = result.replace(/(<[^\/]([^"<>]*|"[^"]*")*>)/g, "\n$1");
+ result = result.replace(/^\n+/, "");
+ return result;
+}
+
+let (element = reportElement("adblock-plus"))
+{
+ let {addonVersion} = require("info");
+ element.setAttribute("version", addonVersion);
+ element.setAttribute("locale", Utils.appLocale);
+};
+let (element = reportElement("application"))
+{
+ element.setAttribute("name", Services.appinfo.name);
+ element.setAttribute("vendor", Services.appinfo.vendor);
+ element.setAttribute("version", Services.appinfo.version);
+ element.setAttribute("userAgent", window.navigator.userAgent);
+};
+let (element = reportElement("platform"))
+{
+ element.setAttribute("name", "Gecko");
+ element.setAttribute("version", Services.appinfo.platformVersion);
+ element.setAttribute("build", Services.appinfo.platformBuildID);
+};
+let (element = reportElement("options"))
+{
+ appendElement(element, "option", {id: "enabled"}, Prefs.enabled);
+ appendElement(element, "option", {id: "objecttabs"}, Prefs.frameobjects);
+ appendElement(element, "option", {id: "collapse"}, !Prefs.fastcollapse);
+ appendElement(element, "option", {id: "privateBrowsing"}, PrivateBrowsing.enabledForWindow(contentWindow) || PrivateBrowsing.enabled);
+ appendElement(element, "option", {id: "subscriptionsAutoUpdate"}, Prefs.subscriptions_autoupdate);
+ appendElement(element, "option", {id: "javascript"}, Services.prefs.getBoolPref("javascript.enabled"));
+ appendElement(element, "option", {id: "cookieBehavior"}, Services.prefs.getIntPref("network.cookie.cookieBehavior"));
+};
+
+//
+// Data collectors
+//
+
+let reportsListDataSource =
+{
+ list: [],
+
+ collectData: function(wnd, windowURI, callback)
+ {
+ let data = Prefs.recentReports;
+ if (data && "length" in data)
+ {
+ for (let i = 0; i < data.length; i++)
+ {
+ let entry = data[i];
+ if (typeof entry.reportURL == "string" && entry.reportURL &&
+ typeof entry.time == "number" && Date.now() - entry.time < 30*24*60*60*1000)
+ {
+ let newEntry = {site: null, reportURL: entry.reportURL, time: entry.time};
+ if (typeof entry.site == "string" && entry.site)
+ newEntry.site = entry.site;
+ this.list.push(newEntry);
+ }
+ }
+ }
+
+ if (this.list.length > 10)
+ this.list.splice(10);
+
+ E("recentReports").hidden = !this.list.length;
+ if (this.list.length)
+ {
+ let rows = E("recentReportsRows")
+ for (let i = 0; i < this.list.length; i++)
+ {
+ let entry = this.list[i];
+ let row = document.createElement("row");
+
+ let link = document.createElement("description");
+ link.setAttribute("class", "text-link");
+ link.setAttribute("url", entry.reportURL);
+ link.textContent = entry.reportURL.replace(/^.*\/(?=[^\/])/, "");
+ row.appendChild(link);
+
+ let site = document.createElement("description");
+ if (entry.site)
+ site.textContent = entry.site;
+ row.appendChild(site);
+
+ let time = document.createElement("description");
+ time.textContent = Utils.formatTime(entry.time);
+ row.appendChild(time);
+
+ rows.appendChild(row);
+ }
+ }
+
+ callback();
+ },
+
+ addReport: function(site, reportURL)
+ {
+ this.list.unshift({site: site, reportURL: reportURL, time: Date.now()});
+ Prefs.recentReports = this.list;
+ },
+
+ clear: function()
+ {
+ this.list = [];
+ Prefs.recentReports = this.list;
+ E("recentReports").hidden = true;
+ },
+
+ handleClick: function(event)
+ {
+ if (event.button != 0 || !event.target || !event.target.hasAttribute("url"))
+ return;
+
+ UI.loadInBrowser(event.target.getAttribute("url"));
+ }
+};
+
+let requestsDataSource =
+{
+ requests: reportElement("requests"),
+ origRequests: [],
+ requestNotifier: null,
+ callback: null,
+ nodeByKey: {__proto__: null},
+
+ collectData: function(wnd, windowURI, callback)
+ {
+ this.callback = callback;
+ this.requestNotifier = new RequestNotifier(wnd, this.onRequestFound, this);
+ },
+
+ onRequestFound: function(frame, node, entry, scanComplete)
+ {
+ if (entry)
+ {
+ let key = entry.location + " " + entry.typeDescr + " " + entry.docDomain;
+ let requestXML;
+ if (key in this.nodeByKey)
+ {
+ requestXML = this.nodeByKey[key];
+ requestXML.setAttribute("count", parseInt(requestXML.getAttribute("count"), 10) + 1);
+ }
+ else
+ {
+ requestXML = this.nodeByKey[key] = appendElement(this.requests, "request", {
+ location: censorURL(entry.location),
+ type: entry.typeDescr,
+ docDomain: entry.docDomain,
+ thirdParty: entry.thirdParty,
+ count: 1
+ });
+ }
+
+ // Location is meaningless for element hiding hits
+ if (entry.filter && entry.filter instanceof ElemHideBase)
+ requestXML.removeAttribute("location");
+
+ if (entry.filter)
+ requestXML.setAttribute("filter", entry.filter.text);
+
+ if (node instanceof Element)
+ {
+ requestXML.setAttribute("node", (node.namespaceURI ? node.namespaceURI + "#" : "") + node.localName);
+
+ try
+ {
+ requestXML.setAttribute("size", node.offsetWidth + "x" + node.offsetHeight);
+ } catch(e) {}
+ }
+ this.origRequests.push(entry);
+ }
+
+ if (scanComplete)
+ {
+ this.requestNotifier.shutdown();
+ this.requestNotifier = null;
+ this.callback();
+ }
+ }
+};
+
+let filtersDataSource =
+{
+ origFilters: [],
+
+ collectData: function(wnd, windowURI, callback)
+ {
+ let wndStats = RequestNotifier.getWindowStatistics(wnd);
+ if (wndStats)
+ {
+ let filters = reportElement("filters");
+ for (let f in wndStats.filters)
+ {
+ let filter = Filter.fromText(f)
+ let hitCount = wndStats.filters[f];
+ appendElement(filters, "filter", {
+ text: filter.text,
+ subscriptions: filter.subscriptions.filter(subscriptionsDataSource.subscriptionFilter).map(function(s) s.url).join(" "),
+ hitCount: hitCount
+ });
+ this.origFilters.push(filter);
+ }
+ }
+ callback();
+ }
+};
+
+let subscriptionsDataSource =
+{
+ subscriptionFilter: function(s)
+ {
+ if (s.disabled || !(s instanceof RegularSubscription))
+ return false;
+ if (s instanceof DownloadableSubscription && !/^(http|https|ftp):/i.test(s.url))
+ return false;
+ return true;
+ },
+
+ collectData: function(wnd, windowURI, callback)
+ {
+ let subscriptions = reportElement("subscriptions");
+ let now = Math.round(Date.now() / 1000);
+ for (let i = 0; i < FilterStorage.subscriptions.length; i++)
+ {
+ let subscription = FilterStorage.subscriptions[i];
+ if (!this.subscriptionFilter(subscription))
+ continue;
+
+ let subscriptionXML = appendElement(subscriptions, "subscription", {
+ id: subscription.url,
+ disabledFilters: subscription.filters.filter(function(filter) filter instanceof ActiveFilter && filter.disabled).length
+ });
+ if (subscription.version)
+ subscriptionXML.setAttribute("version", subscription.version);
+ if (subscription.lastDownload)
+ subscriptionXML.setAttribute("lastDownloadAttempt", subscription.lastDownload - now);
+ if (subscription instanceof DownloadableSubscription)
+ {
+ if (subscription.lastSuccess)
+ subscriptionXML.setAttribute("lastDownloadSuccess", subscription.lastSuccess - now);
+ if (subscription.softExpiration)
+ subscriptionXML.setAttribute("softExpiration", subscription.softExpiration - now);
+ if (subscription.expires)
+ subscriptionXML.setAttribute("hardExpiration", subscription.expires - now);
+ subscriptionXML.setAttribute("downloadStatus", subscription.downloadStatus);
+ }
+ }
+ callback();
+ }
+};
+
+let screenshotDataSource =
+{
+ imageOffset: 10,
+
+ // Fields used for color reduction
+ _mapping: [0x00, 0x55, 0xAA, 0xFF],
+ _i: null,
+ _max: null,
+ _pixelData: null,
+ _callback: null,
+
+ // Fields used for user interaction
+ _enabled: true,
+ _canvas: null,
+ _context: null,
+ _selectionType: "mark",
+ _currentData: null,
+ _undoQueue: [],
+
+ collectData: function(wnd, windowURI, callback)
+ {
+ this._callback = callback;
+ this._canvas = E("screenshotCanvas");
+ this._canvas.width = this._canvas.offsetWidth;
+
+ // Do not resize canvas any more (no idea why Gecko requires both to be set)
+ this._canvas.parentNode.style.MozBoxAlign = "center";
+ this._canvas.parentNode.align = "center";
+
+ this._context = this._canvas.getContext("2d");
+ let wndWidth = wnd.document.documentElement.scrollWidth;
+ let wndHeight = wnd.document.documentElement.scrollHeight;
+
+ // Copy scaled screenshot of the webpage. We scale the webpage by width
+ // but leave 10px on each side for easier selecting.
+
+ // Gecko doesn't like sizes more than 64k, restrict to 30k to be on the safe side.
+ // Also, make sure height is at most five times the width to keep image size down.
+ let copyWidth = Math.min(wndWidth, 30000);
+ let copyHeight = Math.min(wndHeight, 30000, copyWidth * 5);
+ let copyX = Math.max(Math.min(wnd.scrollX - copyWidth / 2, wndWidth - copyWidth), 0);
+ let copyY = Math.max(Math.min(wnd.scrollY - copyHeight / 2, wndHeight - copyHeight), 0);
+
+ let scalingFactor = (this._canvas.width - this.imageOffset * 2) / copyWidth;
+ this._canvas.height = copyHeight * scalingFactor + this.imageOffset * 2;
+
+ this._context.save();
+ this._context.translate(this.imageOffset, this.imageOffset);
+ this._context.scale(scalingFactor, scalingFactor);
+ this._context.drawWindow(wnd, copyX, copyY, copyWidth, copyHeight, "rgb(255,255,255)");
+ this._context.restore();
+
+ // Init canvas settings
+ this._context.fillStyle = "rgb(0, 0, 0)";
+ this._context.strokeStyle = "rgba(255, 0, 0, 0.7)";
+ this._context.lineWidth = 3;
+ this._context.lineJoin = "round";
+
+ // Reduce colors asynchronously
+ this._pixelData = this._context.getImageData(this.imageOffset, this.imageOffset,
+ this._canvas.width - this.imageOffset * 2,
+ this._canvas.height - this.imageOffset * 2);
+ this._max = this._pixelData.width * this._pixelData.height * 4;
+ this._i = 0;
+ Utils.runAsync(this.run.bind(this));
+ },
+
+ run: function()
+ {
+ // Process only 5000 bytes at a time to prevent browser hangs
+ let endIndex = Math.min(this._i + 5000, this._max);
+ let i = this._i;
+ for (; i < endIndex; i++)
+ this._pixelData.data[i] = this._mapping[this._pixelData.data[i] >> 6];
+
+ if (i >= this._max)
+ {
+ // Save data back and we are done
+ this._context.putImageData(this._pixelData, this.imageOffset, this.imageOffset);
+ this._callback();
+ }
+ else
+ {
+ this._i = i;
+ Utils.runAsync(this.run.bind(this));
+ }
+ },
+
+ get enabled() this._enabled,
+ set enabled(enabled)
+ {
+ if (this._enabled == enabled)
+ return;
+
+ this._enabled = enabled;
+ this._canvas.style.opacity = this._enabled ? "" : "0.3"
+ E("screenshotMarkButton").disabled = !this._enabled;
+ E("screenshotRemoveButton").disabled = !this._enabled;
+ E("screenshotUndoButton").disabled = !this._enabled || !this._undoQueue.length;
+ },
+
+ get selectionType() this._selectionType,
+ set selectionType(type)
+ {
+ if (this._selectionType == type)
+ return;
+
+ // Abort selection already in progress
+ this.abortSelection();
+
+ this._selectionType = type;
+ },
+
+ exportData: function()
+ {
+ removeReportElement("screenshot");
+ if (this.enabled)
+ {
+ appendElement(reportData.documentElement, "screenshot", {
+ edited: (this._undoQueue.length ? 'true' : 'false')
+ }, this._canvas.toDataURL());
+ }
+ },
+
+ abortSelection: function()
+ {
+ if (this._currentData && this._currentData.data)
+ {
+ this._context.putImageData(this._currentData.data,
+ Math.min(this._currentData.anchorX, this._currentData.currentX),
+ Math.min(this._currentData.anchorY, this._currentData.currentY));
+ }
+ document.removeEventListener("keypress", this.handleKeyPress, true);
+ this._currentData = null;
+ },
+
+ handleKeyPress: function(event)
+ {
+ if (event.keyCode == Ci.nsIDOMKeyEvent.DOM_VK_ESCAPE)
+ {
+ event.stopPropagation();
+ event.preventDefault();
+ screenshotDataSource.abortSelection();
+ }
+ },
+
+ startSelection: function(event)
+ {
+ if (event.button == 2)
+ this.abortSelection(); // Right mouse button aborts selection
+
+ if (event.button != 0 || !this.enabled)
+ return;
+
+ // Abort selection already in progress
+ this.abortSelection();
+
+ let boxObject = document.getBoxObjectFor(this._canvas);
+ let [x, y] = [event.screenX - boxObject.screenX, event.screenY - boxObject.screenY];
+ this._currentData = {
+ data: null,
+ anchorX: x,
+ anchorY: y,
+ currentX: -1,
+ currentY: -1
+ };
+ this.updateSelection(event);
+
+ document.addEventListener("keypress", this.handleKeyPress, true);
+ },
+
+ updateSelection: function(event)
+ {
+ if (event.button != 0 || !this._currentData)
+ return;
+
+ let boxObject = document.getBoxObjectFor(this._canvas);
+ let [x, y] = [event.screenX - boxObject.screenX, event.screenY - boxObject.screenY];
+ if (this._currentData.currentX == x && this._currentData.currentY == y)
+ return;
+
+ if (this._currentData.data)
+ {
+ this._context.putImageData(this._currentData.data,
+ Math.min(this._currentData.anchorX, this._currentData.currentX),
+ Math.min(this._currentData.anchorY, this._currentData.currentY));
+ }
+
+ this._currentData.currentX = x;
+ this._currentData.currentY = y;
+
+ let left = Math.min(this._currentData.anchorX, this._currentData.currentX);
+ let right = Math.max(this._currentData.anchorX, this._currentData.currentX);
+ let top = Math.min(this._currentData.anchorY, this._currentData.currentY);
+ let bottom = Math.max(this._currentData.anchorY, this._currentData.currentY);
+
+ let minDiff = (this._selectionType == "mark" ? 3 : 1);
+ if (right - left >= minDiff && bottom - top >= minDiff)
+ this._currentData.data = this._context.getImageData(left, top, right - left, bottom - top);
+ else
+ this._currentData.data = null;
+
+ if (this._selectionType == "mark")
+ {
+ // all coordinates need to be moved 1.5px inwards to get the desired result
+ left += 1.5;
+ right -= 1.5;
+ top += 1.5;
+ bottom -= 1.5;
+ if (left < right && top < bottom)
+ this._context.strokeRect(left, top, right - left, bottom - top);
+ }
+ else if (this._selectionType == "remove")
+ this._context.fillRect(left, top, right - left, bottom - top);
+ },
+
+ stopSelection: function(event)
+ {
+ if (event.button != 0 || !this._currentData)
+ return;
+
+ if (this._currentData.data)
+ {
+ this._undoQueue.push(this._currentData);
+ E("screenshotUndoButton").disabled = false;
+ }
+
+ this._currentData = null;
+ document.removeEventListener("keypress", this.handleKeyPress, true);
+ },
+
+ undo: function()
+ {
+ let op = this._undoQueue.pop();
+ if (!op)
+ return;
+
+ this._context.putImageData(op.data,
+ Math.min(op.anchorX, op.currentX),
+ Math.min(op.anchorY, op.currentY));
+
+ if (!this._undoQueue.length)
+ E("screenshotUndoButton").disabled = true;
+ }
+};
+
+let framesDataSource =
+{
+ site: null,
+
+ collectData: function(wnd, windowURI, callback)
+ {
+ try
+ {
+ this.site = windowURI.host;
+ if (this.site)
+ document.title += " (" + this.site + ")";
+ }
+ catch (e)
+ {
+ // Expected exception - not all URL schemes have a host name
+ }
+
+ let window = reportElement("window");
+ window.setAttribute("url", censorURL(windowURI ? windowURI.spec : wnd.location.href));
+ if (wnd.opener && wnd.opener.location.href)
+ window.setAttribute("opener", censorURL(wnd.opener.location.href));
+ if (wnd.document.referrer)
+ window.setAttribute("referrer", censorURL(wnd.document.referrer));
+ this.scanFrames(wnd, window);
+
+ callback();
+ },
+
+ scanFrames: function(wnd, xmlList)
+ {
+ try
+ {
+ for (let i = 0; i < wnd.frames.length; i++)
+ {
+ let frame = wnd.frames[i];
+ let frameXML = appendElement(xmlList, "frame", {
+ url: censorURL(frame.location.href)
+ });
+ this.scanFrames(frame, frameXML);
+ }
+ }
+ catch (e)
+ {
+ // Don't break if something goes wrong
+ Cu.reportError(e);
+ }
+ }
+};
+
+let errorsDataSource =
+{
+ collectData: function(wnd, windowURI, callback)
+ {
+ let {addonID} = require("info");
+ addonID = addonID.replace(/[\{\}]/g, "");
+
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=664695 - starting with
+ // Gecko 19 this function returns the result, before that it wrote to a
+ // parameter.
+ let outparam = {};
+ let messages = Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService).getMessageArray(outparam, {});
+ messages = messages || outparam.value || [];
+ messages = messages.filter(function(message)
+ {
+ return (message instanceof Ci.nsIScriptError &&
+ !/^https?:/i.test(message.sourceName) &&
+ (/adblock/i.test(message.errorMessage) || /adblock/i.test(message.sourceName) ||
+ message.errorMessage.indexOf(addonID) >= 0 || message.sourceName && message.sourceName.indexOf(addonID) >= 0));
+ });
+ if (messages.length > 10) // Only the last 10 messages
+ messages = messages.slice(messages.length - 10, messages.length);
+
+ // Censor app and profile paths in error messages
+ let censored = {__proto__: null};
+ let pathList = [["ProfD", "%PROFILE%"], ["GreD", "%GRE%"], ["CurProcD", "%APP%"]];
+ for (let i = 0; i < pathList.length; i++)
+ {
+ let [pathID, placeholder] = pathList[i];
+ try
+ {
+ let file = FileUtils.getDir(pathID, [], false);
+ censored[file.path.replace(/[\\\/]+$/, '')] = placeholder;
+ let uri = Utils.ioService.newFileURI(file);
+ censored[uri.spec.replace(/[\\\/]+$/, '')] = placeholder;
+ } catch(e) {}
+ }
+
+ let errors = reportElement("errors");
+ for (let i = 0; i < messages.length; i++)
+ {
+ let message = messages[i];
+
+ let text = message.errorMessage;
+ for (let path in censored)
+ text = text.replace(path, censored[path], "gi");
+ if (text.length > 256)
+ text = text.substr(0, 256) + "...";
+
+ let file = message.sourceName;
+ for (let path in censored)
+ file = file.replace(path, censored[path], "gi");
+ if (file.length > 256)
+ file = file.substr(0, 256) + "...";
+
+ let sourceLine = message.sourceLine;
+ if (sourceLine.length > 256)
+ sourceLine = sourceLine.substr(0, 256) + "...";
+
+ appendElement(errors, "error", {
+ type: message.flags & Ci.nsIScriptError.warningFlag ? "warning" : "error",
+ text: text,
+ file: file,
+ line: message.lineNumber,
+ column: message.columnNumber,
+ sourceLine: sourceLine
+ });
+ }
+
+ callback();
+ }
+};
+
+let extensionsDataSource =
+{
+ data: reportData.createElement("extensions"),
+
+ collectData: function(wnd, windowURI, callback)
+ {
+ try
+ {
+ let AddonManager = Cu.import("resource://gre/modules/AddonManager.jsm", null).AddonManager;
+ AddonManager.getAddonsByTypes(["extension", "plugin"], function(items)
+ {
+ for (let i = 0; i < items.length; i++)
+ {
+ let item = items[i];
+ if (!item.isActive)
+ continue;
+ appendElement(this.data, "extension", {
+ id: item.id,
+ name: item.name,
+ type: item.type,
+ version: item.version
+ });
+ }
+ callback();
+ }.bind(this));
+ }
+ catch (e)
+ {
+ // No add-on manager, what's going on? Skip this step.
+ callback();
+ }
+ },
+
+ exportData: function(doExport)
+ {
+ if (doExport)
+ reportData.documentElement.appendChild(this.data);
+ else if (this.data.parentNode)
+ this.data.parentNode.removeChild(this.data);
+ }
+};
+
+let subscriptionUpdateDataSource =
+{
+ contentWnd: null,
+ type: null,
+ outdated: null,
+ needUpdate: null,
+
+ collectData: function(wnd, windowURI, callback)
+ {
+ this.contentWnd = wnd;
+ let now = Date.now() / MILLISECONDS_IN_SECOND;
+ let outdatedThreshold = now - 14 * SECONDS_IN_DAY;
+ let needUpdateThreshold = now - 1 * SECONDS_IN_HOUR;
+
+ this.outdated = [];
+ this.needUpdate = [];
+
+ let subscriptions = FilterStorage.subscriptions.filter(issuesDataSource.subscriptionFilter);
+ for (let i = 0; i < subscriptions.length; i++)
+ {
+ let lastSuccess = subscriptions[i].lastSuccess;
+ if (lastSuccess < outdatedThreshold)
+ this.outdated.push(subscriptions[i]);
+ if (lastSuccess < needUpdateThreshold)
+ this.needUpdate.push(subscriptions[i]);
+ }
+
+ callback();
+ },
+
+ updatePage: function(type)
+ {
+ this.type = type;
+ E("updateInProgress").hidden = (type != "false positive" || this.needUpdate.length == 0);
+ E("outdatedSubscriptions").hidden = !E("updateInProgress").hidden || this.outdated.length == 0;
+ if (!E("outdatedSubscriptions").hidden)
+ {
+ let template = E("outdatedSubscriptionTemplate");
+ let list = E("outdatedSubscriptionsList");
+ while (list.lastChild)
+ list.removeChild(list.lastChild);
+
+ for (let i = 0; i < this.outdated.length; i++)
+ {
+ let subscription = this.outdated[i];
+ let entry = template.cloneNode(true);
+ entry.removeAttribute("id");
+ entry.removeAttribute("hidden");
+ entry.setAttribute("_url", subscription.url);
+ entry.setAttribute("tooltiptext", subscription.url);
+ entry.textContent = subscription.title;
+ list.appendChild(entry);
+ }
+ }
+ return !E("updateInProgress").hidden || !E("outdatedSubscriptions").hidden;
+ },
+
+ showPage: function()
+ {
+ document.documentElement.canAdvance = false;
+
+ if (!E("updateInProgress").hidden)
+ {
+ document.documentElement.canRewind = false;
+
+ for (let i = 0; i < this.needUpdate.length; i++)
+ Synchronizer.execute(this.needUpdate[i], true);
+
+ let listener = function(action)
+ {
+ if (!/^subscription\./.test(action))
+ return;
+
+ for (let i = 0; i < this.needUpdate.length; i++)
+ if (Synchronizer.isExecuting(this.needUpdate[i].url))
+ return;
+
+ FilterNotifier.removeListener(listener);
+ E("updateInProgress").hidden = "true";
+
+ let filtersRemoved = false;
+ let requests = requestsDataSource.origRequests;
+ for (let i = 0; i < requests.length; i++)
+ if (requests[i].filter && !requests[i].filter.subscriptions.filter(function(s) !s.disabled).length)
+ filtersRemoved = true;
+
+ if (filtersRemoved)
+ {
+ // Force the user to reload the page
+ E("updateFixedIssue").hidden = false;
+ document.documentElement.canAdvance = true;
+
+ let nextButton = document.documentElement.getButton("next");
+ [nextButton.label, nextButton.accessKey] = Utils.splitLabel(E("updatePage").getAttribute("reloadButtonLabel"));
+ document.documentElement.addEventListener("wizardnext", function(event)
+ {
+ event.preventDefault();
+ event.stopPropagation();
+ window.close();
+ this.contentWnd.location.reload();
+ }.bind(this), true);
+ }
+ else
+ {
+ this.collectData(null, null, function() {});
+ this.needUpdate = [];
+ if (this.outdated.length)
+ {
+ document.documentElement.canRewind = true;
+
+ this.updatePage(this.type);
+ this.showPage();
+ }
+ else
+ {
+ // No more issues, make sure to remove this page from history and
+ // advance to the next page.
+ document.documentElement.canRewind = true;
+ document.documentElement.canAdvance = true;
+
+ let next = document.documentElement.currentPage.next;
+ document.documentElement.rewind();
+ document.documentElement.currentPage.next = next;
+
+ document.documentElement.advance();
+ }
+ }
+ }.bind(this);
+
+ FilterNotifier.addListener(listener);
+ window.addEventListener("unload", function()
+ {
+ FilterNotifier.removeListener(listener);
+ });
+ }
+ },
+
+ updateOutdated: function()
+ {
+ for (let i = 0; i < this.outdated.length; i++)
+ Synchronizer.execute(this.outdated[i], true);
+ }
+}
+
+let issuesDataSource =
+{
+ contentWnd: null,
+ isEnabled: Prefs.enabled,
+ whitelistFilter: null,
+ disabledFilters: [],
+ disabledSubscriptions: [],
+ ownFilters: [],
+ numSubscriptions: 0,
+ numAppliedFilters: Infinity,
+
+ subscriptionFilter: function(s)
+ {
+ if (s instanceof DownloadableSubscription)
+ return subscriptionsDataSource.subscriptionFilter(s);
+ else
+ return false;
+ },
+
+ collectData: function(wnd, windowURI, callback)
+ {
+ this.contentWnd = wnd;
+ this.whitelistFilter = Policy.isWindowWhitelisted(wnd);
+
+ if (!this.whitelistFilter && this.isEnabled)
+ {
+ // Find disabled filters in active subscriptions matching any of the requests
+ let disabledMatcher = new CombinedMatcher();
+ for each (let subscription in FilterStorage.subscriptions)
+ {
+ if (subscription.disabled)
+ continue;
+
+ for each (let filter in subscription.filters)
+ if (filter instanceof BlockingFilter && filter.disabled)
+ disabledMatcher.add(filter);
+ }
+
+ let seenFilters = {__proto__: null};
+ for each (let request in requestsDataSource.origRequests)
+ {
+ if (request.filter)
+ continue;
+
+ let filter = disabledMatcher.matchesAny(request.location, request.typeDescr, request.docDomain, request.thirdParty);
+ if (filter && !(filter.text in seenFilters))
+ {
+ this.disabledFilters.push(filter);
+ seenFilters[filter.text] = true;
+ }
+ }
+
+ // Find disabled subscriptions with filters matching any of the requests
+ let seenSubscriptions = {__proto__: null};
+ for each (let subscription in FilterStorage.subscriptions)
+ {
+ if (!subscription.disabled)
+ continue;
+
+ disabledMatcher.clear();
+ for each (let filter in subscription.filters)
+ if (filter instanceof BlockingFilter)
+ disabledMatcher.add(filter);
+
+ for each (let request in requestsDataSource.origRequests)
+ {
+ if (request.filter)
+ continue;
+
+ let filter = disabledMatcher.matchesAny(request.location, request.typeDescr, request.docDomain, request.thirdParty);
+ if (filter && !(subscription.url in seenSubscriptions))
+ {
+ this.disabledSubscriptions.push(subscription);
+ seenSubscriptions[subscription.text] = true;
+ break;
+ }
+ }
+ }
+
+ this.numSubscriptions = FilterStorage.subscriptions.filter(this.subscriptionFilter).length;
+ this.numAppliedFilters = 0;
+ for each (let filter in filtersDataSource.origFilters)
+ {
+ if (filter instanceof WhitelistFilter)
+ continue;
+
+ this.numAppliedFilters++;
+ if (filter.subscriptions.some(function(subscription) subscription instanceof SpecialSubscription))
+ this.ownFilters.push(filter);
+ }
+ }
+
+ callback();
+ },
+
+ updateIssues: function(type)
+ {
+ if (type == "other")
+ {
+ E("typeSelectorPage").next = "typeWarning";
+ return;
+ }
+
+ E("issuesWhitelistBox").hidden = !this.whitelistFilter;
+ E("issuesDisabledBox").hidden = this.isEnabled;
+ E("issuesNoFiltersBox").hidden = (type != "false positive" || this.numAppliedFilters > 0);
+ E("issuesNoSubscriptionsBox").hidden = (type != "false negative" || this.numAppliedFilters > 0 || this.numSubscriptions > 0);
+ E("issuesSubscriptionCountBox").hidden = (this.numSubscriptions < 5);
+
+ let ownFiltersBox = E("issuesOwnFilters");
+ if (this.ownFilters.length && !ownFiltersBox.firstChild)
+ {
+ let template = E("issuesOwnFiltersTemplate");
+ for each (let filter in this.ownFilters)
+ {
+ let element = template.cloneNode(true);
+ element.removeAttribute("id");
+ element.removeAttribute("hidden");
+ element.firstChild.setAttribute("value", filter.text);
+ element.firstChild.setAttribute("tooltiptext", filter.text);
+ element.abpFilter = filter;
+ ownFiltersBox.appendChild(element);
+ }
+ }
+ E("issuesOwnFiltersBox").hidden = (type != "false positive" || this.ownFilters.length == 0);
+
+ let disabledSubscriptionsBox = E("issuesDisabledSubscriptions");
+ if (this.disabledSubscriptions.length && !disabledSubscriptionsBox.firstChild)
+ {
+ let template = E("issuesDisabledSubscriptionsTemplate");
+ for each (let subscription in this.disabledSubscriptions)
+ {
+ let element = template.cloneNode(true);
+ element.removeAttribute("id");
+ element.removeAttribute("hidden");
+ element.firstChild.setAttribute("value", subscription.title);
+ element.setAttribute("tooltiptext", subscription instanceof DownloadableSubscription ? subscription.url : subscription.title);
+ element.abpSubscription = subscription;
+ disabledSubscriptionsBox.appendChild(element);
+ }
+ }
+ E("issuesDisabledSubscriptionsBox").hidden = (type != "false negative" || this.disabledSubscriptions.length == 0);
+
+ let disabledFiltersBox = E("issuesDisabledFilters");
+ if (this.disabledFilters.length && !disabledFiltersBox.firstChild)
+ {
+ let template = E("issuesDisabledFiltersTemplate");
+ for each (let filter in this.disabledFilters)
+ {
+ let element = template.cloneNode(true);
+ element.removeAttribute("id");
+ element.removeAttribute("hidden");
+ element.firstChild.setAttribute("value", filter.text);
+ element.setAttribute("tooltiptext", filter.text);
+ element.abpFilter = filter;
+ disabledFiltersBox.appendChild(element);
+ }
+ }
+ E("issuesDisabledFiltersBox").hidden = (type != "false negative" || this.disabledFilters.length == 0);
+
+ // Don't allow sending report if the page is whitelisted - we need the data.
+ // Also disallow reports without matching filters or without subscriptions,
+ // subscription authors cannot do anything about those.
+ E("issuesOverride").hidden = !E("issuesWhitelistBox").hidden ||
+ !E("issuesDisabledBox").hidden ||
+ !E("issuesNoFiltersBox").hidden ||
+ !E("issuesNoSubscriptionsBox").hidden ||
+ !E("issuesSubscriptionCountBox").hidden;
+
+ let page = E("typeSelectorPage");
+ if (subscriptionUpdateDataSource.updatePage(type))
+ {
+ page.next = "update";
+ page = E("updatePage");
+ }
+
+ if (E("issuesWhitelistBox").hidden && E("issuesDisabledBox").hidden &&
+ E("issuesNoFiltersBox").hidden && E("issuesNoSubscriptionsBox").hidden &&
+ E("issuesOwnFiltersBox").hidden && E("issuesDisabledFiltersBox").hidden &&
+ E("issuesDisabledSubscriptionsBox").hidden && E("issuesSubscriptionCountBox").hidden)
+ {
+ page.next = "screenshot";
+ }
+ else
+ {
+ page.next = "issues";
+ }
+ },
+
+ forceReload: function()
+ {
+ // User changed configuration, don't allow sending report now - page needs
+ // to be reloaded
+ E("issuesOverride").hidden = true;
+ E("issuesChangeMessage").hidden = false;
+ document.documentElement.canRewind = false;
+ document.documentElement.canAdvance = true;
+
+ let contentWnd = this.contentWnd;
+ let nextButton = document.documentElement.getButton("next");
+ [nextButton.label, nextButton.accessKey] = Utils.splitLabel(E("updatePage").getAttribute("reloadButtonLabel"));
+ document.documentElement.addEventListener("wizardnext", function(event)
+ {
+ event.preventDefault();
+ event.stopPropagation();
+ window.close();
+ contentWnd.location.reload();
+ }, true);
+ },
+
+ removeWhitelist: function()
+ {
+ if (this.whitelistFilter && this.whitelistFilter.subscriptions.length)
+ this.whitelistFilter.disabled = true;
+ E("issuesWhitelistBox").hidden = true;
+ this.forceReload();
+ },
+
+ enable: function()
+ {
+ Prefs.enabled = true;
+ E("issuesDisabledBox").hidden = true;
+ this.forceReload();
+ },
+
+ addSubscription: function()
+ {
+ let result = {};
+ openDialog("subscriptionSelection.xul", "_blank", "chrome,centerscreen,modal,resizable,dialog=no", null, result);
+ if (!("url" in result))
+ return;
+
+ let subscriptionResults = [[result.url, result.title]];
+ if ("mainSubscriptionURL" in result)
+ subscriptionResults.push([result.mainSubscriptionURL, result.mainSubscriptionTitle]);
+
+ for each (let [url, title] in subscriptionResults)
+ {
+ let subscription = Subscription.fromURL(url);
+ if (!subscription)
+ continue;
+
+ FilterStorage.addSubscription(subscription);
+
+ subscription.disabled = false;
+ subscription.title = title;
+
+ if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+ Synchronizer.execute(subscription);
+ }
+
+ E("issuesNoSubscriptionsBox").hidden = true;
+ this.forceReload();
+ },
+
+ disableFilter: function(node)
+ {
+ let filter = node.abpFilter;
+ if (filter && filter.subscriptions.length)
+ filter.disabled = true;
+
+ node.parentNode.removeChild(node);
+ if (!E("issuesOwnFilters").firstChild)
+ E("issuesOwnFiltersBox").hidden = true;
+ this.forceReload();
+ },
+
+ enableFilter: function(node)
+ {
+ let filter = node.abpFilter;
+ if (filter && filter.subscriptions.length)
+ filter.disabled = false;
+
+ node.parentNode.removeChild(node);
+ if (!E("issuesDisabledFilters").firstChild)
+ E("issuesDisabledFiltersBox").hidden = true;
+ this.forceReload();
+ },
+
+
+ enableSubscription: function(node)
+ {
+ let subscription = node.abpSubscription;
+ if (subscription)
+ subscription.disabled = false;
+
+ node.parentNode.removeChild(node);
+ if (!E("issuesDisabledSubscriptions").firstChild)
+ E("issuesDisabledSubscriptionsBox").hidden = true;
+ this.forceReload();
+ }
+};
+
+let dataCollectors = [reportsListDataSource, requestsDataSource, filtersDataSource, subscriptionsDataSource,
+ screenshotDataSource, framesDataSource, errorsDataSource, extensionsDataSource,
+ subscriptionUpdateDataSource, issuesDataSource];
+
+//
+// Wizard logic
+//
+
+function initWizard()
+{
+ // Make sure no issue type is selected by default
+ E("typeGroup").selectedItem = null;
+ document.documentElement.addEventListener("pageshow", updateNextButton, false);
+
+ // Move wizard header
+ let header = document.getAnonymousElementByAttribute(document.documentElement, "class", "wizard-header");
+ if (header)
+ {
+ document.getElementById("wizardHeaderLabel").setAttribute("value", document.documentElement.wizardPages[0].getAttribute("label"));
+ document.documentElement.insertBefore(document.getElementById("wizardHeader"), document.documentElement.firstChild);
+ document.documentElement.addEventListener("pageshow", function()
+ {
+ document.getElementById("wizardHeaderDeck").selectedIndex = (document.documentElement.pageIndex == 0 ? 0 : 1);
+ }, false);
+ }
+
+ // Move privacy link
+ let extraButton = document.documentElement.getButton("extra1");
+ extraButton.parentNode.insertBefore(E("privacyLink"), extraButton);
+}
+
+function updateNextButton()
+{
+ let nextButton = document.documentElement.getButton("next");
+ if (!nextButton)
+ return;
+
+ if (document.documentElement.currentPage.id == "commentPage")
+ {
+ if (!("_origLabel" in nextButton))
+ {
+ nextButton._origLabel = nextButton.label;
+ nextButton._origAccessKey = nextButton.accessKey;
+ [nextButton.label, nextButton.accessKey] = Utils.splitLabel(document.documentElement.getAttribute("sendbuttonlabel"));
+ }
+ }
+ else
+ {
+ if ("_origLabel" in nextButton)
+ {
+ nextButton.label = nextButton._origLabel;
+ nextButton.accessKey = nextButton._origAccessKey;
+ delete nextButton._origLabel;
+ delete nextButton._origAccessKey;
+ }
+ }
+}
+
+function initDataCollectorPage()
+{
+ document.documentElement.canAdvance = false;
+
+ let totalSteps = dataCollectors.length;
+ let initNextDataSource = function()
+ {
+ if (!dataCollectors.length)
+ {
+ // We are done, continue to next page
+ document.documentElement.canAdvance = true;
+ document.documentElement.advance();
+ return;
+ }
+
+ let progress = (totalSteps - dataCollectors.length) / totalSteps * 100;
+ if (progress > 0)
+ {
+ let progressMeter = E("dataCollectorProgress");
+ progressMeter.mode = "determined";
+ progressMeter.value = progress;
+ }
+
+ // Continue with the next data source, asynchronously to allow progress meter to update
+ let dataSource = dataCollectors.shift();
+ Utils.runAsync(function()
+ {
+ dataSource.collectData(contentWindow, windowURI, initNextDataSource);
+ });
+ };
+
+ initNextDataSource();
+}
+
+function initTypeSelectorPage()
+{
+ E("progressBar").activeItem = E("typeSelectorHeader");
+ let header = document.getAnonymousElementByAttribute(document.documentElement, "class", "wizard-header");
+ if (header)
+ header.setAttribute("viewIndex", "1");
+
+ document.documentElement.canRewind = false;
+ typeSelectionUpdated();
+}
+
+function typeSelectionUpdated()
+{
+ let selection = E("typeGroup").selectedItem;
+ document.documentElement.canAdvance = (selection != null);
+ if (selection)
+ {
+ if (reportData.documentElement.getAttribute("type") != selection.value)
+ {
+ E("screenshotCheckbox").checked = (selection.value != "other");
+ E("screenshotCheckbox").doCommand();
+ E("extensionsCheckbox").checked = (selection.value == "other");
+ E("extensionsCheckbox").doCommand();
+ }
+ reportData.documentElement.setAttribute("type", selection.value);
+
+ issuesDataSource.updateIssues(selection.value);
+ }
+}
+
+function initIssuesPage()
+{
+ updateIssuesOverride();
+}
+
+function updateIssuesOverride()
+{
+ document.documentElement.canAdvance = E("issuesOverride").checked;
+}
+
+function initTypeWarningPage()
+{
+ updateTypeWarningOverride();
+
+ let textElement = E("typeWarningText");
+ if ("abpInitialized" in textElement)
+ return;
+
+ let template = textElement.textContent.replace(/[\r\n\s]+/g, " ");
+
+ let [, beforeLink, linkText, afterLink] = /(.*)\[link\](.*)\[\/link\](.*)/.exec(template) || [null, "", template, ""];
+ while (textElement.firstChild && textElement.firstChild.nodeType != Node.ELEMENT_NODE)
+ textElement.removeChild(textElement.firstChild);
+ while (textElement.lastChild && textElement.lastChild.nodeType != Node.ELEMENT_NODE)
+ textElement.removeChild(textElement.lastChild);
+
+ if (textElement.firstChild)
+ textElement.firstChild.textContent = linkText;
+ textElement.insertBefore(document.createTextNode(beforeLink), textElement.firstChild);
+ textElement.appendChild(document.createTextNode(afterLink));
+ textElement.abpInitialized = true;
+}
+
+function updateTypeWarningOverride()
+{
+ document.documentElement.canAdvance = E("typeWarningOverride").checked;
+}
+
+function initScreenshotPage()
+{
+ document.documentElement.canAdvance = true;
+
+ E("progressBar").activeItem = E("screenshotHeader");
+}
+
+function initCommentPage()
+{
+ E("progressBar").activeItem = E("commentPageHeader");
+
+ updateEmail();
+
+ screenshotDataSource.exportData();
+ updateDataField();
+}
+
+function showDataField()
+{
+ E('dataDeck').selectedIndex = 1;
+ updateDataField();
+ E('data').focus();
+}
+
+let _dataFieldUpdateTimeout = null;
+
+function _updateDataField()
+{
+ let dataField = E("data");
+ let [selectionStart, selectionEnd] = [dataField.selectionStart, dataField.selectionEnd];
+ dataField.value = serializeReportData();
+ dataField.setSelectionRange(selectionStart, selectionEnd);
+}
+
+function updateDataField()
+{
+ // Don't do anything if data field is hidden
+ if (E('dataDeck').selectedIndex != 1)
+ return;
+
+ if (_dataFieldUpdateTimeout)
+ {
+ window.clearTimeout(_dataFieldUpdateTimeout);
+ _dataFieldUpdateTimeout = null;
+ }
+
+ _dataFieldUpdateTimeout = window.setTimeout(_updateDataField, 200);
+}
+
+function updateComment()
+{
+ removeReportElement("comment");
+
+ let value = E("comment").value;
+ appendElement(reportData.documentElement, "comment", null, value.substr(0, 1000));
+ E("commentLengthWarning").setAttribute("visible", value.length > 1000);
+ updateDataField();
+}
+
+function updateEmail()
+{
+ removeReportElement("email");
+
+ let anonymous = E("anonymousCheckbox").checked;
+
+ let value = E("email").value;
+
+ // required for persist to work on textbox, see: https://bugzilla.mozilla.org/show_bug.cgi?id=111486
+ E("email").setAttribute("value", value);
+
+ E("email").disabled = anonymous;
+ E("emailLabel").disabled = anonymous;
+ E("anonymityWarning").setAttribute("visible", anonymous);
+
+ if (!anonymous)
+ appendElement(reportData.documentElement, "email", null, value);
+
+ updateDataField();
+
+ document.documentElement.canAdvance = anonymous || /\S/.test(value);
+}
+
+function updateExtensions(attach)
+{
+ extensionsDataSource.exportData(attach);
+ updateDataField();
+}
+
+function initSendPage()
+{
+ E("progressBar").activeItem = E("sendPageHeader");
+
+ E("result").hidden = true;
+ E("sendReportErrorBox").hidden = true;
+ E("sendReportMessage").hidden = false;
+ E("sendReportProgress").hidden = false;
+ E("sendReportProgress").mode = "undetermined";
+
+ document.documentElement.canRewind = false;
+ document.documentElement.getButton("finish").disabled = true;
+
+ let guid = Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator).generateUUID().toString().replace(/[\{\}]/g, "");
+ let url = Prefs.report_submiturl.replace(/%GUID%/g, guid).replace(/%LANG%/g, Utils.appLocale);
+ let request = new XMLHttpRequest();
+ request.open("POST", url);
+ request.setRequestHeader("Content-Type", "text/xml");
+ request.setRequestHeader("X-Adblock-Plus", "1");
+ request.addEventListener("load", reportSent, false);
+ request.addEventListener("error", reportSent, false);
+ if ("upload" in request && request.upload)
+ request.upload.addEventListener("progress", updateReportProgress, false);
+ request.send(serializeReportData());
+}
+
+function updateReportProgress(event)
+{
+ if (!event.lengthComputable)
+ return;
+
+ let progress = Math.round(event.loaded / event.total * 100);
+ if (progress > 0)
+ {
+ let progressMeter = E("sendReportProgress");
+ progressMeter.mode = "determined";
+ progressMeter.value = progress;
+ }
+}
+
+function reportSent(event)
+{
+ let request = event.target;
+ let success = false;
+ let errorMessage = E("sendReportError").getAttribute("defaultError");
+ try
+ {
+ let status = request.channel.status;
+ if (Components.isSuccessCode(status))
+ {
+ success = (request.status == 200 || request.status == 0);
+ errorMessage = request.status + " " + request.statusText;
+ }
+ else
+ {
+ errorMessage = "0x" + status.toString(16);
+
+ // Try to find the name for the status code
+ let exception = Cc["@mozilla.org/js/xpc/Exception;1"].createInstance(Ci.nsIXPCException);
+ exception.initialize(null, status, null, null, null, null);
+ if (exception.name)
+ errorMessage = exception.name;
+ }
+ } catch (e) {}
+
+ let result = "";
+ try
+ {
+ result = request.responseText;
+ } catch (e) {}
+
+ result = result.replace(/%CONFIRMATION%/g, encodeHTML(E("result").getAttribute("confirmationMessage")));
+ result = result.replace(/%KNOWNISSUE%/g, encodeHTML(E("result").getAttribute("knownIssueMessage")));
+ result = result.replace(/(<html)\b/, '$1 dir="' + window.getComputedStyle(document.documentElement, "").direction + '"');
+
+ if (!success)
+ {
+ let errorElement = E("sendReportError");
+ let template = errorElement.getAttribute("textTemplate").replace(/[\r\n\s]+/g, " ");
+
+ let [, beforeLink, linkText, afterLink] = /(.*)\[link\](.*)\[\/link\](.*)/.exec(template) || [null, "", template, ""];
+ beforeLink = beforeLink.replace(/\?1\?/g, errorMessage);
+ afterLink = afterLink.replace(/\?1\?/g, errorMessage);
+
+ while (errorElement.firstChild && errorElement.firstChild.nodeType != Node.ELEMENT_NODE)
+ errorElement.removeChild(errorElement.firstChild);
+ while (errorElement.lastChild && errorElement.lastChild.nodeType != Node.ELEMENT_NODE)
+ errorElement.removeChild(errorElement.lastChild);
+
+ if (errorElement.firstChild)
+ errorElement.firstChild.textContent = linkText;
+ errorElement.insertBefore(document.createTextNode(beforeLink), errorElement.firstChild);
+ errorElement.appendChild(document.createTextNode(afterLink));
+
+ E("sendReportErrorBox").hidden = false;
+ }
+
+ E("sendReportProgress").hidden = true;
+
+ let frame = E("result");
+ frame.hidden = false;
+ frame.docShell.allowAuth = false;
+ frame.docShell.allowJavascript = false;
+ frame.docShell.allowMetaRedirects = false;
+ frame.docShell.allowPlugins = false;
+ frame.docShell.allowSubframes = false;
+
+ frame.setAttribute("src", "data:text/html;charset=utf-8," + encodeURIComponent(result));
+
+ E("sendReportMessage").hidden = true;
+
+ if (success)
+ {
+ try
+ {
+ let link = request.responseXML.getElementById("link").getAttribute("href");
+ let button = E("copyLink");
+ button.setAttribute("url", link);
+ button.removeAttribute("disabled");
+
+ if (!PrivateBrowsing.enabledForWindow(contentWindow) && !PrivateBrowsing.enabled)
+ reportsListDataSource.addReport(framesDataSource.site, link);
+ } catch (e) {}
+ E("copyLinkBox").hidden = false;
+
+ document.documentElement.getButton("finish").disabled = false;
+ document.documentElement.getButton("cancel").disabled = true;
+ E("progressBar").activeItemComplete = true;
+ }
+}
+
+function processLinkClick(event)
+{
+ event.preventDefault();
+
+ let link = event.target;
+ while (link && !(link instanceof HTMLAnchorElement))
+ link = link.parentNode;
+
+ if (link && (link.protocol == "http:" || link.protocol == "https:"))
+ UI.loadInBrowser(link.href);
+}
+
+function copyLink(url)
+{
+ Utils.clipboardHelper.copyString(url);
+}
+
+function censorURL(url)
+{
+ return url.replace(/([?;&\/#][^?;&\/#]+?=)[^?;&\/#]+/g, "$1*");
+}
+
+function encodeHTML(str)
+{
+ return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sendReport.xul b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sendReport.xul
new file mode 100644
index 0000000..54e0726
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sendReport.xul
@@ -0,0 +1,259 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://global/skin/wizard.css" type="text/css"?>
+<?xml-stylesheet href="chrome://adblockplus/skin/sendReport.css" type="text/css"?>
+
+<?xul-overlay href="progressBar.xul"?>
+
+<!DOCTYPE dialog [
+<!ENTITY % reporterDTD SYSTEM "chrome://adblockplus/locale/sendReport.dtd">
+%reporterDTD;
+<!ENTITY % filtersDTD SYSTEM "chrome://adblockplus/locale/filters.dtd">
+%filtersDTD;
+]>
+
+<wizard
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ title="&wizard.title;"
+ id="abpSendReportWizard"
+ onload="initWizard();"
+ width="800"
+ height="550"
+ sendbuttonlabel="&sendButton.label;"
+ windowtype="abp:sendReport">
+
+<script type="application/x-javascript;version=1.7" src="utils.js"/>
+<script type="application/x-javascript;version=1.7" src="sendReport.js"/>
+
+<keyset id="wizardKeys">
+ <key id="undoKey" modifiers="accel" key="Z" oncommand="if (document.documentElement.currentPage.id == 'screenshotPage') screenshotDataSource.undo();"/>
+</keyset>
+
+<box hidden="true">
+ <vbox id="wizardHeader" class="wizard-header">
+ <deck id="wizardHeaderDeck">
+ <description id="wizardHeaderLabel" class="wizard-header-label"/>
+ <hbox id="progressBar">
+ <label id="typeSelectorHeader" class="progressLabel" value="&typeSelector.heading;" crop="end"/>
+ <label id="screenshotHeader" class="progressLabel" value="&screenshot.heading;" crop="end"/>
+ <label id="commentPageHeader" class="progressLabel" value="&commentPage.heading;" crop="end"/>
+ <label id="sendPageHeader" class="progressLabel" value="&sendPage.heading;" crop="end"/>
+ </hbox>
+ </deck>
+ </vbox>
+
+ <label id="privacyLink" class="text-link" value="&privacyPolicy.label;" onclick="UI.loadDocLink('reporter_privacy');"/>
+</box>
+
+<wizardpage id="dataCollectorPage" pageid="dataCollector" next="typeSelector" label="&dataCollector.heading;" onpageshow="initDataCollectorPage();">
+ <description>&dataCollector.description;</description>
+
+ <progressmeter id="dataCollectorProgress" mode="undetermined"/>
+</wizardpage>
+
+<wizardpage id="typeSelectorPage" pageid="typeSelector" next="screenshot" label="&typeSelector.heading;" onpageshow="initTypeSelectorPage();">
+ <description>&typeSelector.description;</description>
+
+ <radiogroup id="typeGroup" oncommand="typeSelectionUpdated();">
+ <radio id="typeFalsePositive" value="false positive" label="&typeSelector.falsePositive.label;"/>
+ <description class="radioDescription">&typeSelector.falsePositive.description;</description>
+ <radio id="typeFalseNegative" value="false negative" label="&typeSelector.falseNegative.label;"/>
+ <description class="radioDescription">&typeSelector.falseNegative.description;</description>
+ <radio id="typeOther" value="other" label="&typeSelector.other.label;"/>
+ <description class="radioDescription">&typeSelector.other.description;</description>
+ </radiogroup>
+
+ <deck id="recentReports" currentIndex="0" flex="1">
+ <vbox pack="end">
+ <label class="text-link" value="&showRecentReports.label;" onclick="E('recentReports').selectedIndex = 1;"/>
+ </vbox>
+ <groupbox flex="1">
+ <caption label="&recentReports.label;"/>
+ <grid flex="1" id="recentReportsList">
+ <columns>
+ <column flex="2"/>
+ <column flex="1"/>
+ <column/>
+ </columns>
+ <rows id="recentReportsRows" onclick="reportsListDataSource.handleClick(event);"/>
+ </grid>
+
+ <hbox pack="start">
+ <button label="&recentReports.clear.label;" oncommand="reportsListDataSource.clear();"/>
+ </hbox>
+ </groupbox>
+ </deck>
+</wizardpage>
+
+<wizardpage id="updatePage" pageid="update" next="screenshot" onpageshow="subscriptionUpdateDataSource.showPage();" reloadButtonLabel="&reloadButton.label;">
+ <vbox id="updateInProgress">
+ <description>&update.inProgress.description;</description>
+ <progressmeter mode="undetermined"/>
+ </vbox>
+
+ <description id="updateFixedIssue" hidden="true">&update.fixed.description;</description>
+
+ <vbox id="outdatedSubscriptions">
+ <description>&outdatedSubscriptions.description;</description>
+
+ <description id="outdatedSubscriptionTemplate" class="text-link" onclick="UI.loadInBrowser(this.getAttribute('_url'));"/>
+
+ <vbox id="outdatedSubscriptionsList"/>
+
+ <hbox>
+ <button label="&update.start.label;" oncommand="subscriptionUpdateDataSource.updateOutdated();window.close();"/>
+ <button label="&issues.openPreferences.label;" oncommand="UI.openFiltersDialog();window.close();"/>
+ </hbox>
+ </vbox>
+</wizardpage>
+
+<wizardpage id="issuesPage" pageid="issues" next="screenshot" onpageshow="initIssuesPage();" reloadButtonLabel="&reloadButton.label;">
+ <description>&issues.description;</description>
+
+ <vbox id="issuesBox" flex="1">
+ <groupbox id="issuesWhitelistBox" hidden="true">
+ <description>&issues.whitelist.description;</description>
+ <hbox pack="end">
+ <button label="&issues.whitelist.remove.label;" oncommand="issuesDataSource.removeWhitelist();"/>
+ </hbox>
+ </groupbox>
+ <groupbox id="issuesDisabledBox" hidden="true">
+ <description>&issues.disabled.description;</description>
+ <hbox pack="end">
+ <button label="&issues.disabled.enable.label;" oncommand="issuesDataSource.enable();"/>
+ </hbox>
+ </groupbox>
+ <groupbox id="issuesNoFiltersBox" hidden="true">
+ <description>&issues.nofilters.description;</description>
+ </groupbox>
+ <groupbox id="issuesNoSubscriptionsBox" hidden="true">
+ <description>&issues.nosubscriptions.description;</description>
+ <hbox pack="end">
+ <button label="&issues.nosubscriptions.add.label;" oncommand="issuesDataSource.addSubscription();"/>
+ </hbox>
+ </groupbox>
+ <groupbox id="issuesSubscriptionCountBox" hidden="true">
+ <description>&issues.subscriptionCount.description;</description>
+ <hbox pack="end">
+ <button label="&issues.openPreferences.label;" oncommand="UI.openFiltersDialog();window.close();"/>
+ </hbox>
+ </groupbox>
+ <groupbox id="issuesOwnFiltersBox" hidden="true">
+ <description>&issues.ownfilters.description;</description>
+ <hbox id="issuesOwnFiltersTemplate" align="center" hidden="true">
+ <description flex="1" crop="end"/>
+ <button label="&issues.ownfilters.disable.label;" oncommand="issuesDataSource.disableFilter(this.parentNode);"/>
+ </hbox>
+ <vbox id="issuesOwnFilters"/>
+ </groupbox>
+ <groupbox id="issuesDisabledSubscriptionsBox" hidden="true">
+ <description>&issues.disabledgroups.description;</description>
+ <hbox id="issuesDisabledSubscriptionsTemplate" align="center" hidden="true">
+ <description flex="1" crop="end"/>
+ <button label="&issues.disabledgroups.enable.label;" oncommand="issuesDataSource.enableSubscription(this.parentNode);"/>
+ </hbox>
+ <vbox id="issuesDisabledSubscriptions"/>
+ </groupbox>
+ <groupbox id="issuesDisabledFiltersBox" hidden="true">
+ <description>&issues.disabledfilters.description;</description>
+ <hbox id="issuesDisabledFiltersTemplate" align="center" hidden="true">
+ <description flex="1" crop="end"/>
+ <button label="&issues.disabledfilters.enable.label;" oncommand="issuesDataSource.enableFilter(this.parentNode);"/>
+ </hbox>
+ <vbox id="issuesDisabledFilters"/>
+ </groupbox>
+ </vbox>
+
+ <checkbox id="issuesOverride" label="&issues.override.label;" oncommand="updateIssuesOverride();"/>
+ <description id="issuesChangeMessage" hidden="true">&issues.change.description;</description>
+</wizardpage>
+
+<wizardpage id="typeWarningPage" pageid="typeWarning" next="screenshot" onpageshow="initTypeWarningPage();">
+ <description id="typeWarningText">
+ &typeWarning.description;
+ <label id="typeWarningTextLink" class="text-link" onclick="UI.loadDocLink('reporter_other_link');"/>
+ </description>
+
+ <checkbox id="typeWarningOverride" label="&typeWarning.override.label;" oncommand="updateTypeWarningOverride();"/>
+</wizardpage>
+
+<wizardpage id="screenshotPage" pageid="screenshot" next="comment" label="&screenshot.heading;" onpageshow="initScreenshotPage();">
+ <description>&screenshot.description;</description>
+
+ <checkbox id="screenshotCheckbox" checked="true" label="&screenshot.attach.label;" oncommand="screenshotDataSource.enabled = this.checked;"/>
+ <hbox id="screenshotButtons" pack="end">
+ <button id="screenshotMarkButton" type="radio" group="selectionType" oncommand="screenshotDataSource.selectionType = 'mark';" checked="true" label="&screenshot.mark.label;"/>
+ <button id="screenshotRemoveButton" type="radio" group="selectionType" oncommand="screenshotDataSource.selectionType = 'remove';" label="&screenshot.remove.label;"/>
+ <button id="screenshotUndoButton" oncommand="screenshotDataSource.undo();" disabled="true" label="&screenshot.undo.label;"/>
+ </hbox>
+ <vbox id="screenshotBox" flex="1">
+ <canvas xmlns="http://www.w3.org/1999/xhtml" id="screenshotCanvas" onmousedown="screenshotDataSource.startSelection(event);" onmouseup="screenshotDataSource.stopSelection(event);" onmouseout="screenshotDataSource.stopSelection(event);" onmousemove="screenshotDataSource.updateSelection(event);"/>
+ </vbox>
+</wizardpage>
+
+<wizardpage id="commentPage" pageid="comment" next="send" label="&commentPage.heading;" onpageshow="initCommentPage();">
+ <description>&emailComment.label;</description>
+ <hbox class="topLabel" align="baseline">
+ <label id="emailLabel" control="email" value="&email.label;"/>
+ <textbox id="email" persist="value" flex="1" maxlength="200" oninput="updateEmail();"/>
+ </hbox>
+ <checkbox id="anonymousCheckbox" label="&anonymous.label;" oncommand="updateEmail();"/>
+ <description id="anonymityWarning" visible="false">&anonymity.warning;</description>
+
+ <description class="topLabel">&commentPage.description;</description>
+ <label class="topLabel" control="comment" value="&comment.label;"/>
+ <textbox id="comment" multiline="true" flex="1" oninput="updateComment();"/>
+ <description id="commentLengthWarning" visible="false">&comment.lengthWarning;</description>
+
+ <checkbox id="extensionsCheckbox" label="&attachExtensions.label;" oncommand="updateExtensions(this.checked);"/>
+
+ <deck id="dataDeck" selectedIndex="0" flex="2">
+ <vbox pack="start">
+ <label class="text-link" value="&showData.label;" onclick="showDataField();"/>
+ </vbox>
+ <vbox>
+ <label control="data" value="&data.label;"/>
+ <textbox id="data" readonly="true" multiline="true" wrap="off" flex="1"/>
+ </vbox>
+ </deck>
+</wizardpage>
+
+<wizardpage id="sendPage" pageid="send" label="&sendPage.heading;" onpageshow="initSendPage();">
+ <description id="sendReportMessage">&sendPage.waitMessage;</description>
+
+ <vbox id="sendReportErrorBox" align="end" hidden="true">
+ <description id="sendReportError" textTemplate="&sendPage.errorMessage;" defaultError="&subscription.lastDownload.connectionError;">
+ <label id="sendReportErrorLinks" class="text-link" onclick="UI.loadDocLink('reporter_connect_issue');"/>
+ </description>
+ <button id="sendRetryButton" label="&sendPage.retry.label;" oncommand="initSendPage();"/>
+ </vbox>
+
+ <progressmeter id="sendReportProgress" mode="undetermined"/>
+
+ <iframe id="result" type="content" flex="1" hidden="true" onclick="processLinkClick(event);"
+ confirmationMessage="&sendPage.confirmation;" knownIssueMessage="&sendPage.knownIssue;"/>
+
+ <hbox id="copyLinkBox" pack="end" hidden="true">
+ <button id="copyLink" disabled="true" label="&copyLink.label;" oncommand="copyLink(this.getAttribute('url'));"/>
+ </hbox>
+</wizardpage>
+
+</wizard>
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/settings.xul b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/settings.xul
new file mode 100644
index 0000000..4215a38
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/settings.xul
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<!DOCTYPE vbox SYSTEM "chrome://adblockplus/locale/overlay.dtd">
+
+<window
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ width="1"
+ height="1"
+ onload="window.close();"> <!-- Close window if it gets opened directly for some reason -->
+ <setting type="control">
+ <button id="adblockplus-filters" label="&filters.label;…"/>
+ </setting>
+ <setting pref="extensions.adblockplus.enabled" type="bool" inverted="true" title="&disable.label;"/>
+ <setting pref="extensions.adblockplus.frameobjects" type="bool" title="&objecttabs.label;"/>
+ <setting pref="extensions.adblockplus.fastcollapse" type="bool" inverted="true" title="&hideplaceholders.label;"/>
+ <setting id="adblockplus-savestats" type="bool" title="&counthits.label;"/>
+ <setting id="adblockplus-sync" type="bool" title="&sync.label;"/>
+ <setting id="adblockplus-showintoolbar" type="bool" title="&showintoolbar.label;"/>
+ <setting id="adblockplus-showinstatusbar" pref="extensions.adblockplus.showinstatusbar" type="bool" title="&showinstatusbar.label;"/>
+ <setting id="adblockplus-autoupdate" pref="extensions.adblockplus.subscriptions_autoupdate" type="bool" title="&subscription.update.label;"/>
+</window>
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebar.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebar.js
new file mode 100644
index 0000000..358aebe
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebar.js
@@ -0,0 +1,1246 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+// Main browser window
+var mainWin = parent;
+
+// The window handler currently in use
+var requestNotifier = null;
+
+var cacheSession = null;
+var noFlash = false;
+
+// Matcher for disabled filters
+var disabledMatcher = new CombinedMatcher();
+
+// Cached string values
+var docDomainThirdParty = null;
+var docDomainFirstParty = null;
+
+function init() {
+ docDomainThirdParty = document.documentElement.getAttribute("docDomainThirdParty");
+ docDomainFirstParty = document.documentElement.getAttribute("docDomainFirstParty");
+
+ var list = E("list");
+ list.view = treeView;
+
+ // Restore previous state
+ var params = Utils.getParams();
+ if (params && params.filter)
+ {
+ E("searchField").value = params.filter;
+ treeView.setFilter(params.filter);
+ }
+ if (params && params.focus && E(params.focus))
+ E(params.focus).focus();
+ else
+ E("searchField").focus();
+
+ var selected = null;
+ if (/sidebarDetached\.xul$/.test(parent.location.href))
+ {
+ mainWin = parent.opener;
+ mainWin.addEventListener("unload", mainUnload, false);
+ E("detachButton").hidden = true;
+ E("reattachButton").hidden = false;
+
+ let mustDetach = parent.arguments[0];
+ if (mustDetach)
+ E("reattachButton").setAttribute("disabled", "true");
+ if ("sidebar" in UI.hotkeys)
+ {
+ let {KeySelector} = require("keySelector");
+ parent.addEventListener("keypress", function(event)
+ {
+ if (KeySelector.matchesKey(event, UI.hotkeys.sidebar))
+ doClose();
+ }, false);
+ }
+
+ // Set default size/position unless already persisted
+ let defaults = {screenX: 0, screenY: 0, width: 600, height: 300};
+ if (params && params.position)
+ defaults = params.position;
+
+ let wnd = parent.document.documentElement;
+ for (let attr in defaults)
+ if (!wnd.hasAttribute(attr))
+ wnd.setAttribute(attr, defaults[attr]);
+ }
+
+ let {getBrowser, addBrowserLocationListener} = require("appSupport");
+ window.__defineGetter__("content", function() {return getBrowser(mainWin).contentWindow;});
+
+ // Initialize matcher for disabled filters
+ reloadDisabledFilters();
+ FilterNotifier.addListener(reloadDisabledFilters);
+ Prefs.addListener(onPrefChange);
+
+ // Activate flasher
+ list.addEventListener("select", onSelectionChange, false);
+
+ // Initialize data
+ handleLocationChange();
+
+ // Install a progress listener to catch location changes
+ if (addBrowserLocationListener)
+ addBrowserLocationListener(mainWin, handleLocationChange, true);
+}
+
+// To be called for a detached window when the main window has been closed
+function mainUnload() {
+ parent.close();
+}
+
+// To be called on unload
+function cleanUp() {
+ flasher.stop();
+ requestNotifier.shutdown();
+ FilterNotifier.removeListener(reloadDisabledFilters);
+ Prefs.removeListener(onPrefChange);
+ E("list").view = null;
+
+ let {removeBrowserLocationListener} = require("appSupport");
+ if (removeBrowserLocationListener)
+ removeBrowserLocationListener(mainWin, handleLocationChange);
+ mainWin.removeEventListener("unload", mainUnload, false);
+}
+
+/**
+ * Tracks preference changes, calls reloadDisabledFilters whenever Adblock Plus
+ * is enabled/disabled.
+ */
+function onPrefChange(name)
+{
+ if (name == "enabled")
+ reloadDisabledFilters();
+}
+
+let reloadDisabledScheduled = false;
+
+/**
+ * Updates matcher for disabled filters (global disabledMatcher variable),
+ * called on each filter change. Execute delayed to prevent multiple subsequent
+ * invocations.
+ */
+function reloadDisabledFilters()
+{
+ if (reloadDisabledScheduled)
+ return;
+
+ Utils.runAsync(reloadDisabledFiltersInternal);
+ reloadDisabledScheduled = true;
+}
+
+function reloadDisabledFiltersInternal()
+{
+ reloadDisabledScheduled = false;
+ disabledMatcher.clear();
+
+ if (Prefs.enabled)
+ {
+ for each (let subscription in FilterStorage.subscriptions)
+ {
+ if (subscription.disabled)
+ continue;
+
+ for each (let filter in subscription.filters)
+ if (filter instanceof RegExpFilter && filter.disabled)
+ disabledMatcher.add(filter);
+ }
+ }
+
+ treeView.updateFilters();
+}
+
+// Called whenever list selection changes - triggers flasher
+function onSelectionChange() {
+ var item = treeView.getSelectedItem();
+ if (item)
+ E("copy-command").removeAttribute("disabled");
+ else
+ E("copy-command").setAttribute("disabled", "true");
+
+ if (item && window.content)
+ {
+ let key = item.location + " " + item.type + " " + item.docDomain;
+ RequestNotifier.storeSelection(window.content, key);
+ treeView.itemToSelect = null;
+ }
+
+ if (!noFlash)
+ flasher.flash(item ? item.nodes : null);
+}
+
+function handleLocationChange()
+{
+ if (requestNotifier)
+ requestNotifier.shutdown();
+
+ treeView.clearData();
+ treeView.itemToSelect = RequestNotifier.getSelection(window.content);
+ requestNotifier = new RequestNotifier(window.content, function(wnd, node, item, scanComplete)
+ {
+ if (item)
+ treeView.addItem(node, item, scanComplete);
+ });
+}
+
+// Fills a box with text splitting it up into multiple lines if necessary
+function setMultilineContent(box, text, noRemove)
+{
+ if (!noRemove)
+ while (box.firstChild)
+ box.removeChild(box.firstChild);
+
+ for (var i = 0; i < text.length; i += 80)
+ {
+ var description = document.createElement("description");
+ description.setAttribute("value", text.substr(i, 80));
+ box.appendChild(description);
+ }
+}
+
+// Fill in tooltip data before showing it
+function fillInTooltip(e) {
+ // Prevent tooltip from overlapping menu
+ if (E("context").state == "open")
+ {
+ e.preventDefault();
+ return;
+ }
+
+ var item;
+ if (treeView.data && !treeView.data.length)
+ item = treeView.getDummyTooltip();
+ else
+ item = treeView.getItemAt(e.clientX, e.clientY);
+
+ if (!item)
+ {
+ e.preventDefault();
+ return;
+ }
+
+ let filter = ("filter" in item && item.filter ? item.filter : null);
+ let size = ("tooltip" in item ? null : getItemSize(item));
+ let subscriptions = (filter ? filter.subscriptions.filter(function(subscription) { return !subscription.disabled; }) : []);
+
+ E("tooltipDummy").hidden = !("tooltip" in item);
+ E("tooltipAddressRow").hidden = ("tooltip" in item);
+ E("tooltipTypeRow").hidden = ("tooltip" in item);
+ E("tooltipSizeRow").hidden = !size;
+ E("tooltipDocDomainRow").hidden = ("tooltip" in item || !item.docDomain);
+ E("tooltipFilterRow").hidden = !filter;
+ E("tooltipFilterSourceRow").hidden = !subscriptions.length;
+
+ if ("tooltip" in item)
+ E("tooltipDummy").setAttribute("value", item.tooltip);
+ else
+ {
+ E("tooltipAddress").parentNode.hidden = (item.typeDescr == "ELEMHIDE");
+ setMultilineContent(E("tooltipAddress"), item.location);
+
+ var type = item.localizedDescr;
+ if (filter && filter instanceof WhitelistFilter)
+ type += " " + E("tooltipType").getAttribute("whitelisted");
+ else if (filter && item.typeDescr != "ELEMHIDE")
+ type += " " + E("tooltipType").getAttribute("filtered");
+ E("tooltipType").setAttribute("value", type);
+
+ if (size)
+ E("tooltipSize").setAttribute("value", size.join(" x "));
+
+ E("tooltipDocDomain").setAttribute("value", item.docDomain + " " + (item.thirdParty ? docDomainThirdParty : docDomainFirstParty));
+ }
+
+ if (filter)
+ {
+ let filterField = E("tooltipFilter");
+ setMultilineContent(filterField, filter.text);
+ if (filter.disabled)
+ {
+ let disabledText = document.createElement("description");
+ disabledText.className = "disabledTextLabel";
+ disabledText.textContent = filterField.getAttribute("disabledText");
+ filterField.appendChild(disabledText);
+ }
+
+ if (subscriptions.length)
+ {
+ let sourceElement = E("tooltipFilterSource");
+ while (sourceElement.firstChild)
+ sourceElement.removeChild(sourceElement.firstChild);
+ for (let i = 0; i < subscriptions.length; i++)
+ setMultilineContent(sourceElement, subscriptions[i].title, true);
+ }
+ }
+
+ var showPreview = Prefs.previewimages && !("tooltip" in item);
+ showPreview = showPreview && item.typeDescr == "IMAGE";
+ showPreview = showPreview && (!item.filter || item.filter.disabled || item.filter instanceof WhitelistFilter);
+ if (showPreview)
+ {
+ // Check whether image is in cache (stolen from ImgLikeOpera)
+ if (!cacheSession)
+ {
+ var cacheService = Cc["@mozilla.org/network/cache-service;1"].getService(Ci.nsICacheService);
+ cacheSession = cacheService.createSession("HTTP", Ci.nsICache.STORE_ANYWHERE, true);
+ }
+
+ let cacheListener =
+ {
+ onCacheEntryAvailable: function(descriptor, accessGranted, status)
+ {
+ if (!descriptor)
+ return;
+
+ descriptor.close();
+ // Show preview here since this is asynchronous now
+ // and we have a valid descriptor
+ E("tooltipPreview").setAttribute("src", item.location);
+ E("tooltipPreviewBox").hidden = false;
+ },
+ onCacheEntryDoomed: function(status)
+ {
+ }
+ };
+ try
+ {
+ cacheSession.asyncOpenCacheEntry(item.location, Ci.nsICache.ACCESS_READ, cacheListener);
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ }
+ }
+
+ E("tooltipPreviewBox").hidden = true;
+}
+
+const visual = {
+ OTHER: true,
+ IMAGE: true,
+ SUBDOCUMENT: true
+}
+
+/**
+ * Updates context menu before it is shown.
+ */
+function fillInContext(/**Event*/ e)
+{
+ let item, allItems;
+ if (treeView.data && !treeView.data.length)
+ {
+ item = treeView.getDummyTooltip();
+ allItems = [item];
+ }
+ else
+ {
+ item = treeView.getItemAt(e.clientX, e.clientY);
+ allItems = treeView.getAllSelectedItems();
+ }
+
+ if (!item || ("tooltip" in item && !("filter" in item)))
+ return false;
+
+ E("contextDisableFilter").hidden = true;
+ E("contextEnableFilter").hidden = true;
+ E("contextDisableOnSite").hidden = true;
+ if ("filter" in item && item.filter)
+ {
+ let filter = item.filter;
+ let menuItem = E(filter.disabled ? "contextEnableFilter" : "contextDisableFilter");
+ menuItem.setAttribute("label", menuItem.getAttribute("labeltempl").replace(/\?1\?/, filter.text));
+ menuItem.hidden = false;
+
+ if (filter instanceof ActiveFilter && !filter.disabled && filter.subscriptions.length && !filter.subscriptions.some(function(subscription) !(subscription instanceof SpecialSubscription)))
+ {
+ let domain = null;
+ try {
+ domain = Utils.effectiveTLD.getBaseDomainFromHost(item.docDomain);
+ } catch (e) {}
+
+ if (domain && !filter.isActiveOnlyOnDomain(domain))
+ {
+ menuItem = E("contextDisableOnSite");
+ menuItem.setAttribute("label", menuItem.getAttribute("labeltempl").replace(/\?1\?/, domain));
+ menuItem.hidden = false;
+ }
+ }
+ }
+
+ E("contextWhitelist").hidden = ("tooltip" in item || !item.filter || item.filter.disabled || item.filter instanceof WhitelistFilter || item.typeDescr == "ELEMHIDE");
+ E("contextBlock").hidden = !E("contextWhitelist").hidden;
+ E("contextBlock").setAttribute("disabled", "filter" in item && item.filter && !item.filter.disabled);
+ E("contextEditFilter").setAttribute("disabled", !("filter" in item && item.filter));
+ E("contextOpen").setAttribute("disabled", "tooltip" in item || item.typeDescr == "ELEMHIDE");
+ E("contextFlash").setAttribute("disabled", "tooltip" in item || !(item.typeDescr in visual) || (item.filter && !item.filter.disabled && !(item.filter instanceof WhitelistFilter)));
+ E("contextCopyFilter").setAttribute("disabled", !allItems.some(function(item) {return "filter" in item && item.filter}));
+
+ return true;
+}
+
+/**
+ * Resets context menu data once the context menu is closed.
+ */
+function clearContextMenu(/**Event*/ event)
+{
+ if (event.eventPhase != event.AT_TARGET)
+ return;
+
+ {
+ let menuItem = E("contextDisableOnSite");
+ menuItem.item = item;
+ menuItem.filter = filter;
+ menuItem.domain = domain;
+ }
+}
+
+/**
+ * Processed mouse clicks on the item list.
+ * @param {Event} event
+ */
+function handleClick(event)
+{
+ let item = treeView.getItemAt(event.clientX, event.clientY);
+ if (event.button == 0 && treeView.getColumnAt(event.clientX, event.clientY) == "state")
+ {
+ if (item.filter)
+ enableFilter(item.filter, item.filter.disabled);
+ event.preventDefault();
+ }
+ else if (event.button == 1)
+ {
+ openInTab(item, event);
+ event.preventDefault();
+ }
+}
+
+/**
+ * Processes double-clicks on the item list.
+ * @param {Event} event
+ */
+function handleDblClick(event)
+{
+ if (event.button != 0 || treeView.getColumnAt(event.clientX, event.clientY) == "state")
+ return;
+
+ doBlock();
+}
+
+/**
+ * Opens the item in a new tab.
+ */
+function openInTab(item, /**Event*/ event)
+{
+ let items = (item ? [item] : treeView.getAllSelectedItems());
+ for each (let item in items)
+ {
+ if (item && item.typeDescr != "ELEMHIDE")
+ UI.loadInBrowser(item.location, mainWin, event);
+ }
+}
+
+function doBlock() {
+ var item = treeView.getSelectedItem();
+ if (!item || item.typeDescr == "ELEMHIDE")
+ return;
+
+ var filter = null;
+ if (item.filter && !item.filter.disabled)
+ filter = item.filter;
+
+ if (filter && filter instanceof WhitelistFilter)
+ return;
+
+ openDialog("chrome://adblockplus/content/ui/composer.xul", "_blank", "chrome,centerscreen,resizable,dialog=no,dependent", item.nodes, item.orig);
+}
+
+function editFilter()
+{
+ var item = treeView.getSelectedItem();
+ if (treeView.data && !treeView.data.length)
+ item = treeView.getDummyTooltip();
+
+ if (!("filter" in item) || !item.filter)
+ return;
+
+ if (!("location") in item)
+ item.location = undefined
+
+ UI.openFiltersDialog(item.filter);
+}
+
+function enableFilter(filter, enable) {
+ filter.disabled = !enable;
+
+ treeView.boxObject.invalidate();
+}
+
+/**
+ * Edits the filter to disable it on a particular domain.
+ */
+function disableOnSite()
+{
+ let item = treeView.getSelectedItem();
+ let filter = item.filter;
+ if (!(filter instanceof ActiveFilter) || filter.disabled || !filter.subscriptions.length || filter.subscriptions.some(function(subscription) !(subscription instanceof SpecialSubscription)))
+ return;
+
+ let domain;
+ try {
+ domain = Utils.effectiveTLD.getBaseDomainFromHost(item.docDomain).toUpperCase();
+ }
+ catch (e)
+ {
+ return;
+ }
+
+ // Generate text for new filter that excludes current domain
+ let text = filter.text;
+ if (filter instanceof RegExpFilter)
+ {
+ let match = Filter.optionsRegExp.exec(text);
+ if (match)
+ {
+ let found = false;
+ let options = match[1].toUpperCase().split(",");
+ for (let i = 0; i < options.length; i++)
+ {
+ let match = /^DOMAIN=(.*)/.exec(options[i]);
+ if (match)
+ {
+ let domains = match[1].split("|").filter(function(d) d != domain && d != "~" + domain && (d.length <= domain.length || d.lastIndexOf("." + domain) != d.length - domain.length - 1));
+ domains.push("~" + domain);
+ options[i] = "DOMAIN=" + domains.join("|");
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ options.push("DOMAIN=~" + domain);
+
+ text = text.replace(Filter.optionsRegExp, "$" + options.join(",").toLowerCase());
+ }
+ else
+ text += "$domain=~" + domain.toLowerCase();
+ }
+ else if (filter instanceof ElemHideBase)
+ {
+ let match = /^([^#]+)(#.*)/.exec(text);
+ if (match)
+ {
+ let selector = match[2];
+ let domains = match[1].toUpperCase().split(",").filter(function(d) d != domain && (d.length <= domain.length || d != "~" + domain && d.lastIndexOf("." + domain) != d.length - domain.length - 1));
+ domains.push("~" + domain);
+ text = domains.join(",").toLowerCase() + selector;
+ }
+ else
+ text = "~" + domain.toLowerCase() + text;
+ }
+
+ if (text == filter.text)
+ return; // Just in case, shouldn't happen
+
+ // Insert new filter before the old one and remove the old one then
+ let newFilter = Filter.fromText(text);
+ if (newFilter.disabled && newFilter.subscriptions.length)
+ newFilter.disabled = false;
+ else if (!newFilter.subscriptions.length)
+ {
+ newFilter.disabled = false;
+ let subscription = filter.subscriptions.filter(function(s) s instanceof SpecialSubscription)[0];
+ if (subscription)
+ FilterStorage.addFilter(newFilter, subscription, subscription.filters.indexOf(filter));
+ }
+ FilterStorage.removeFilter(filter);
+
+ // Update display
+ for (let i = 0; i < treeView.allData.length; i++)
+ if (treeView.allData[i].filter == filter)
+ treeView.allData[i].filter = null;
+ treeView.boxObject.invalidate();
+}
+
+function copyToClipboard() {
+ var items = treeView.getAllSelectedItems();
+ if (!items.length)
+ return;
+
+ Utils.clipboardHelper.copyString(items.map(function(item) {return item.location}).join(IO.lineBreak));
+}
+
+function copyFilter() {
+ var items = treeView.getAllSelectedItems().filter(function(item) {return item.filter});
+ if (treeView.data && !treeView.data.length)
+ items = [treeView.getDummyTooltip()];
+
+ if (!items.length)
+ return;
+
+ Utils.clipboardHelper.copyString(items.map(function(item) {return item.filter.text}).join(IO.lineBreak));
+}
+
+function selectAll() {
+ treeView.selectAll();
+}
+
+// Saves sidebar's state before detaching/reattaching
+function saveState() {
+ var focused = document.commandDispatcher.focusedElement;
+ while (focused && (!focused.id || !("focus" in focused)))
+ focused = focused.parentNode;
+
+ // Calculate default position for the detached window
+ var boxObject = document.documentElement.boxObject;
+ var position = {screenX: boxObject.screenX, screenY: boxObject.screenY, width: boxObject.width, height: boxObject.height};
+
+ var params = {
+ filter: treeView.filter,
+ focus: (focused ? focused.id : null),
+ position: position
+ };
+ Utils.setParams(params);
+}
+
+// closes the sidebar
+function doClose()
+{
+ mainWin.document.getElementById("abp-command-sidebar").doCommand();
+}
+
+// detaches/reattaches the sidebar
+function detach(doDetach)
+{
+ saveState();
+
+ // Store variables locally, global variables will go away when we are closed
+ let myPrefs = Prefs;
+ let myMainWin = mainWin;
+
+ // Close sidebar and open detached window
+ myMainWin.document.getElementById("abp-command-sidebar").doCommand();
+ myPrefs.detachsidebar = doDetach;
+ myMainWin.document.getElementById("abp-command-sidebar").doCommand();
+}
+
+// Returns items size in the document if available
+function getItemSize(item)
+{
+ if (item.filter && !item.filter.disabled && item.filter instanceof BlockingFilter)
+ return null;
+
+ for each (let node in item.nodes)
+ {
+ if (node instanceof HTMLImageElement && (node.naturalWidth || node.naturalHeight))
+ return [node.naturalWidth, node.naturalHeight];
+ else if (node instanceof HTMLElement && (node.offsetWidth || node.offsetHeight))
+ return [node.offsetWidth, node.offsetHeight];
+ }
+ return null;
+}
+
+// Sort functions for the item list
+function sortByAddress(item1, item2) {
+ if (item1.location < item2.location)
+ return -1;
+ else if (item1.location > item2.location)
+ return 1;
+ else
+ return 0;
+}
+
+function sortByAddressDesc(item1, item2) {
+ return -sortByAddress(item1, item2);
+}
+
+function compareType(item1, item2) {
+ if (item1.localizedDescr < item2.localizedDescr)
+ return -1;
+ else if (item1.localizedDescr > item2.localizedDescr)
+ return 1;
+ else
+ return 0;
+}
+
+function compareFilter(item1, item2) {
+ var hasFilter1 = (item1.filter ? 1 : 0);
+ var hasFilter2 = (item2.filter ? 1 : 0);
+ if (hasFilter1 != hasFilter2)
+ return hasFilter1 - hasFilter2;
+ else if (hasFilter1 && item1.filter.text < item2.filter.text)
+ return -1;
+ else if (hasFilter1 && item1.filter.text > item2.filter.text)
+ return 1;
+ else
+ return 0;
+}
+
+function compareState(item1, item2) {
+ var state1 = (!item1.filter ? 0 : (item1.filter.disabled ? 1 : (item1.filter instanceof WhitelistFilter ? 2 : 3)));
+ var state2 = (!item2.filter ? 0 : (item2.filter.disabled ? 1 : (item2.filter instanceof WhitelistFilter ? 2 : 3)));
+ return state1 - state2;
+}
+
+function compareSize(item1, item2) {
+ var size1 = getItemSize(item1);
+ size1 = size1 ? size1[0] * size1[1] : 0;
+
+ var size2 = getItemSize(item2);
+ size2 = size2 ? size2[0] * size2[1] : 0;
+ return size1 - size2;
+}
+
+function compareDocDomain(item1, item2)
+{
+ if (item1.docDomain < item2.docDomain)
+ return -1;
+ else if (item1.docDomain > item2.docDomain)
+ return 1;
+ else if (item1.thirdParty && !item2.thirdParty)
+ return -1;
+ else if (!item1.thirdParty && item2.thirdParty)
+ return 1;
+ else
+ return 0;
+}
+
+function compareFilterSource(item1, item2)
+{
+ let subs1 = item1.filter ? item1.filter.subscriptions.map(function(s) s.title).join(", ") : "";
+ let subs2 = item2.filter ? item2.filter.subscriptions.map(function(s) s.title).join(", ") : "";
+ if (subs1 < subs2)
+ return -1;
+ else if (subs1 > subs2)
+ return 1;
+ else
+ return 0;
+}
+
+function createSortWithFallback(cmpFunc, fallbackFunc, desc) {
+ var factor = (desc ? -1 : 1);
+ return function(item1, item2) {
+ var ret = cmpFunc(item1, item2);
+ if (ret == 0)
+ return fallbackFunc(item1, item2);
+ else
+ return factor * ret;
+ }
+}
+
+// Item list's tree view object
+var treeView = {
+ //
+ // nsISupports implementation
+ //
+
+ QueryInterface: function(uuid) {
+ if (!uuid.equals(Ci.nsISupports) &&
+ !uuid.equals(Ci.nsITreeView))
+ {
+ throw Cr.NS_ERROR_NO_INTERFACE;
+ }
+
+ return this;
+ },
+
+ //
+ // nsITreeView implementation
+ //
+
+ selection: null,
+
+ setTree: function(boxObject) {
+ if (!boxObject)
+ return;
+ this.boxObject = boxObject;
+ this.itemsDummy = boxObject.treeBody.getAttribute("noitemslabel");
+ this.whitelistDummy = boxObject.treeBody.getAttribute("whitelistedlabel");
+ var stringAtoms = ["col-address", "col-type", "col-filter", "col-state", "col-size", "col-docDomain", "col-filterSource", "state-regular", "state-filtered", "state-whitelisted", "state-hidden", "state-hiddenexception"];
+ var boolAtoms = ["selected", "dummy", "filter-disabled"];
+ var atomService = Cc["@mozilla.org/atom-service;1"].getService(Ci.nsIAtomService);
+ this.atoms = {};
+ for each (let atom in stringAtoms)
+ this.atoms[atom] = atomService.getAtom(atom);
+ for each (let atom in boolAtoms)
+ {
+ this.atoms[atom + "-true"] = atomService.getAtom(atom + "-true");
+ this.atoms[atom + "-false"] = atomService.getAtom(atom + "-false");
+ }
+
+ this.itemsDummyTooltip = Utils.getString("no_blocking_suggestions");
+ this.whitelistDummyTooltip = Utils.getString("whitelisted_page");
+
+ // Check current sort direction
+ var cols = document.getElementsByTagName("treecol");
+ var sortDir = null;
+ for (let i = 0; i < cols.length; i++) {
+ var col = cols[i];
+ var dir = col.getAttribute("sortDirection");
+ if (dir && dir != "natural") {
+ this.sortColumn = col;
+ sortDir = dir;
+ }
+ }
+ if (!this.sortColumn)
+ {
+ let defaultSort = E("list").getAttribute("defaultSort");
+ let match = /^(\w+)\s+(ascending|descending)$/.exec(defaultSort);
+ if (match)
+ {
+ this.sortColumn = E(match[1]);
+ if (this.sortColumn)
+ {
+ sortDir = match[2];
+ this.sortColumn.setAttribute("sortDirection", sortDir);
+ }
+ }
+ }
+
+ if (sortDir)
+ {
+ this.sortProc = this.sortProcs[this.sortColumn.id + (sortDir == "descending" ? "Desc" : "")];
+ E("list").setAttribute("defaultSort", " ");
+ }
+
+ // Make sure to update the dummy row every two seconds
+ setInterval(function(view) {
+ if (!view.data || !view.data.length)
+ view.boxObject.invalidateRow(0);
+ }, 2000, this);
+
+ // Prevent a reference through closures
+ boxObject = null;
+ },
+ get rowCount() {
+ return (this.data && this.data.length ? this.data.length : 1);
+ },
+ getCellText: function(row, col) {
+ col = col.id;
+ if (col != "type" && col != "address" && col != "filter" && col != "size" && col != "docDomain" && col != "filterSource")
+ return "";
+ if (this.data && this.data.length) {
+ if (row >= this.data.length)
+ return "";
+ if (col == "type")
+ return this.data[row].localizedDescr;
+ else if (col == "filter")
+ return (this.data[row].filter ? this.data[row].filter.text : "");
+ else if (col == "size")
+ {
+ let size = getItemSize(this.data[row]);
+ return (size ? size.join(" x ") : "");
+ }
+ else if (col == "docDomain")
+ return this.data[row].docDomain + " " + (this.data[row].thirdParty ? docDomainThirdParty : docDomainFirstParty);
+ else if (col == "filterSource")
+ {
+ if (!this.data[row].filter)
+ return "";
+
+ return this.data[row].filter.subscriptions.filter(function(s) !s.disabled).map(function(s) s.title).join(", ");
+ }
+ else
+ return this.data[row].location;
+ }
+ else {
+ // Empty list, show dummy
+ if (row > 0 || (col != "address" && col != "filter"))
+ return "";
+ if (col == "filter") {
+ var filter = Policy.isWindowWhitelisted(window.content);
+ return filter ? filter.text : "";
+ }
+
+ return (Policy.isWindowWhitelisted(window.content) ? this.whitelistDummy : this.itemsDummy);
+ }
+ },
+
+ generateProperties: function(list, properties)
+ {
+ if (properties)
+ {
+ // Gecko 21 and below: we have an nsISupportsArray parameter, add atoms
+ // to that.
+ for (let i = 0; i < list.length; i++)
+ if (list[i] in this.atoms)
+ properties.AppendElement(this.atoms[list[i]]);
+ return null;
+ }
+ else
+ {
+ // Gecko 22+: no parameter, just return a string
+ return list.join(" ");
+ }
+ },
+
+ getColumnProperties: function(col, properties)
+ {
+ return this.generateProperties(["col-" + col.id], properties);
+ },
+
+ getRowProperties: function(row, properties)
+ {
+ if (row >= this.rowCount)
+ return "";
+
+ let list = [];
+ list.push("selected-" + this.selection.isSelected(row));
+
+ let state;
+ if (this.data && this.data.length) {
+ list.push("dummy-false");
+
+ let filter = this.data[row].filter;
+ if (filter)
+ list.push("filter-disabled-" + filter.disabled);
+
+ state = "state-regular";
+ if (filter && !filter.disabled)
+ {
+ if (filter instanceof WhitelistFilter)
+ state = "state-whitelisted";
+ else if (filter instanceof BlockingFilter)
+ state = "state-filtered";
+ else if (filter instanceof ElemHideFilter)
+ state = "state-hidden";
+ else if (filter instanceof ElemHideException)
+ state = "state-hiddenexception";
+ }
+ }
+ else {
+ list.push("dummy-true");
+
+ state = "state-filtered";
+ if (this.data && Policy.isWindowWhitelisted(window.content))
+ state = "state-whitelisted";
+ }
+ list.push(state);
+ return this.generateProperties(list, properties);
+ },
+
+ getCellProperties: function(row, col, properties)
+ {
+ return this.getRowProperties(row, properties) + " " + this.getColumnProperties(col, properties);
+ },
+
+ cycleHeader: function(col) {
+ col = col.id;
+
+ col = E(col);
+ if (!col)
+ return;
+
+ var cycle = {
+ natural: 'ascending',
+ ascending: 'descending',
+ descending: 'natural'
+ };
+
+ var curDirection = "natural";
+ if (this.sortColumn == col)
+ curDirection = col.getAttribute("sortDirection");
+ else if (this.sortColumn)
+ this.sortColumn.removeAttribute("sortDirection");
+
+ curDirection = cycle[curDirection];
+
+ if (curDirection == "natural")
+ this.sortProc = null;
+ else
+ this.sortProc = this.sortProcs[col.id + (curDirection == "descending" ? "Desc" : "")];
+
+ if (this.data)
+ this.refilter();
+
+ col.setAttribute("sortDirection", curDirection);
+ this.sortColumn = col;
+
+ this.boxObject.invalidate();
+ },
+
+ isSorted: function() {
+ return this.sortProc;
+ },
+
+ isContainer: function() {return false},
+ isContainerOpen: function() {return false},
+ isContainerEmpty: function() {return false},
+ getLevel: function() {return 0},
+ getParentIndex: function() {return -1},
+ hasNextSibling: function() {return false},
+ toggleOpenState: function() {},
+ canDrop: function() {return false},
+ drop: function() {},
+ getCellValue: function() {return null},
+ getProgressMode: function() {return null},
+ getImageSrc: function() {return null},
+ isSeparator: function() {return false},
+ isEditable: function() {return false},
+ cycleCell: function() {},
+ performAction: function() {},
+ performActionOnRow: function() {},
+ performActionOnCell: function() {},
+ selectionChanged: function() {},
+
+ //
+ // Custom properties and methods
+ //
+
+ boxObject: null,
+ atoms: null,
+ filter: "",
+ data: null,
+ allData: [],
+ dataMap: {__proto__: null},
+ sortColumn: null,
+ sortProc: null,
+ resortTimeout: null,
+ itemsDummy: null,
+ whitelistDummy: null,
+ itemsDummyTooltip: null,
+ whitelistDummyTooltip: null,
+ itemToSelect: null,
+
+ sortProcs: {
+ address: sortByAddress,
+ addressDesc: sortByAddressDesc,
+ type: createSortWithFallback(compareType, sortByAddress, false),
+ typeDesc: createSortWithFallback(compareType, sortByAddress, true),
+ filter: createSortWithFallback(compareFilter, sortByAddress, false),
+ filterDesc: createSortWithFallback(compareFilter, sortByAddress, true),
+ state: createSortWithFallback(compareState, sortByAddress, false),
+ stateDesc: createSortWithFallback(compareState, sortByAddress, true),
+ size: createSortWithFallback(compareSize, sortByAddress, false),
+ sizeDesc: createSortWithFallback(compareSize, sortByAddress, true),
+ docDomain: createSortWithFallback(compareDocDomain, sortByAddress, false),
+ docDomainDesc: createSortWithFallback(compareDocDomain, sortByAddress, true),
+ filterSource: createSortWithFallback(compareFilterSource, sortByAddress, false),
+ filterSourceDesc: createSortWithFallback(compareFilterSource, sortByAddress, true)
+ },
+ clearData: function(data) {
+ var oldRows = this.rowCount;
+ this.allData = [];
+ this.dataMap = {__proto__: null};
+ this.refilter();
+
+ this.boxObject.rowCountChanged(0, -oldRows);
+ this.boxObject.rowCountChanged(0, this.rowCount);
+ },
+
+ addItem: function(/**Node*/ node, /**RequestEntry*/ item, /**Boolean*/ scanComplete)
+ {
+ // Merge duplicate entries
+ let key = item.location + " " + item.type + " " + item.docDomain;
+ if (key in this.dataMap)
+ {
+ // We know this item already - take over the filter if any and be done with it
+ let existing = this.dataMap[key];
+ if (item.filter)
+ existing.filter = item.filter;
+
+ existing.nodes.push(node);
+ this.invalidateItem(existing);
+ return;
+ }
+
+ // Add new item to the list
+ // Store original item in orig property - reading out prototype is messed up in Gecko 1.9.2
+ item = {__proto__: item, orig: item, nodes: [node]};
+ this.allData.push(item);
+ this.dataMap[key] = item;
+
+ // Show disabled filters if no other filter applies
+ if (!item.filter)
+ item.filter = disabledMatcher.matchesAny(item.location, item.typeDescr, item.docDomain, item.thirdParty);
+
+ if (!this.matchesFilter(item))
+ return;
+
+ let index = -1;
+ if (this.sortProc && this.sortColumn && this.sortColumn.id == "size")
+ {
+ // Sorting by size requires accessing content document, and that's
+ // dangerous from a content policy (and we are likely called directly
+ // from a content policy call). Size data will be inaccurate anyway,
+ // delay sorting until later.
+ if (this.resortTimeout)
+ clearTimeout(this.resortTimeout);
+ this.resortTimeout = setTimeout(function(me)
+ {
+ if (me.sortProc)
+ me.data.sort(me.sortProc);
+ me.boxObject.invalidate();
+ }, 500, this);
+ }
+ else if (this.sortProc)
+ for (var i = 0; index < 0 && i < this.data.length; i++)
+ if (this.sortProc(item, this.data[i]) < 0)
+ index = i;
+
+ if (index >= 0)
+ this.data.splice(index, 0, item);
+ else {
+ this.data.push(item);
+ index = this.data.length - 1;
+ }
+
+ if (this.data.length == 1)
+ this.boxObject.invalidateRow(0);
+ else
+ this.boxObject.rowCountChanged(index, 1);
+
+ if (this.itemToSelect == key)
+ {
+ this.selection.select(index);
+ this.boxObject.ensureRowIsVisible(index);
+ this.itemToSelect = null;
+ }
+ else if (!scanComplete && this.selection.currentIndex >= 0) // Keep selected row visible while scanning
+ this.boxObject.ensureRowIsVisible(this.selection.currentIndex);
+ },
+
+ updateFilters: function()
+ {
+ for each (let item in this.allData)
+ {
+ if (item.filter instanceof RegExpFilter && item.filter.disabled)
+ delete item.filter;
+ if (!item.filter)
+ item.filter = disabledMatcher.matchesAny(item.location, item.typeDescr, item.docDomain, item.thirdParty);
+ }
+ this.refilter();
+ },
+
+ /**
+ * Updates the list after a filter or sorting change.
+ */
+ refilter: function()
+ {
+ if (this.resortTimeout)
+ clearTimeout(this.resortTimeout);
+
+ this.data = this.allData.filter(this.matchesFilter, this);
+
+ if (this.sortProc)
+ this.data.sort(this.sortProc);
+ },
+
+ /**
+ * Tests whether an item matches current list filter.
+ * @return {Boolean} true if the item should be shown
+ */
+ matchesFilter: function(item)
+ {
+ if (!this.filter)
+ return true;
+
+ return (item.location.toLowerCase().indexOf(this.filter) >= 0 ||
+ (item.filter && item.filter.text.toLowerCase().indexOf(this.filter) >= 0) ||
+ item.typeDescr.toLowerCase().indexOf(this.filter.replace(/-/g, "_")) >= 0 ||
+ item.localizedDescr.toLowerCase().indexOf(this.filter) >= 0 ||
+ (item.docDomain && item.docDomain.toLowerCase().indexOf(this.filter) >= 0) ||
+ (item.docDomain && item.thirdParty && docDomainThirdParty.toLowerCase().indexOf(this.filter) >= 0) ||
+ (item.docDomain && !item.thirdParty && docDomainFirstParty.toLowerCase().indexOf(this.filter) >= 0));
+ },
+
+ setFilter: function(filter) {
+ var oldRows = this.rowCount;
+
+ this.filter = filter.toLowerCase();
+ this.refilter();
+
+ var newRows = this.rowCount;
+ if (oldRows != newRows)
+ this.boxObject.rowCountChanged(oldRows < newRows ? oldRows : newRows, this.rowCount - oldRows);
+ this.boxObject.invalidate();
+ },
+
+ selectAll: function() {
+ this.selection.selectAll();
+ },
+
+ getSelectedItem: function() {
+ if (!this.data || this.selection.currentIndex < 0 || this.selection.currentIndex >= this.data.length)
+ return null;
+
+ return this.data[this.selection.currentIndex];
+ },
+
+ getAllSelectedItems: function() {
+ let result = [];
+ if (!this.data)
+ return result;
+
+ let numRanges = this.selection.getRangeCount();
+ for (let i = 0; i < numRanges; i++)
+ {
+ let min = {};
+ let max = {};
+ let range = this.selection.getRangeAt(i, min, max);
+ for (let j = min.value; j <= max.value; j++)
+ {
+ if (j >= 0 && j < this.data.length)
+ result.push(this.data[j]);
+ }
+ }
+ return result;
+ },
+
+ getItemAt: function(x, y)
+ {
+ if (!this.data)
+ return null;
+
+ var row = this.boxObject.getRowAt(x, y);
+ if (row < 0 || row >= this.data.length)
+ return null;
+
+ return this.data[row];
+ },
+
+ getColumnAt: function(x, y)
+ {
+ if (!this.data)
+ return null;
+
+ let col = {};
+ this.boxObject.getCellAt(x, y, {}, col, {});
+ return (col.value ? col.value.id : null);
+ },
+
+ getDummyTooltip: function() {
+ if (!this.data || this.data.length)
+ return null;
+
+ var filter = Policy.isWindowWhitelisted(window.content);
+ if (filter)
+ return {tooltip: this.whitelistDummyTooltip, filter: filter};
+ else
+ return {tooltip: this.itemsDummyTooltip};
+ },
+
+ invalidateItem: function(item)
+ {
+ let row = this.data.indexOf(item);
+ if (row >= 0)
+ this.boxObject.invalidateRow(row);
+ }
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebar.xul b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebar.xul
new file mode 100644
index 0000000..180b3ec
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebar.xul
@@ -0,0 +1,139 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://adblockplus/skin/sidebar.css" type="text/css"?>
+
+<!DOCTYPE page SYSTEM "chrome://adblockplus/locale/sidebar.dtd">
+
+<page
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ id="abp-sidebar"
+ onload="init()"
+ onunload="cleanUp()"
+ docDomainThirdParty="&docDomain.thirdParty;"
+ docDomainFirstParty="&docDomain.firstParty;">
+
+ <script type="application/x-javascript;version=1.7" src="utils.js"/>
+ <script type="application/x-javascript;version=1.7" src="sidebar.js"/>
+ <script type="application/x-javascript;version=1.7" src="flasher.js"/>
+
+ <keyset id="sidebarKeys">
+ <key id="block-key" keycode="VK_ENTER"/>
+ <key id="copy-key" modifiers="accel" key="C" command="copy-command"/>
+ <key id="selectAll-key" modifiers="accel" key="A" command="selectAll-command"/>
+ </keyset>
+
+ <commandset id="sidebarCommands">
+ <command id="copy-command" oncommand="copyToClipboard()" disabled="true"/>
+ <command id="selectAll-command" oncommand="selectAll()"/>
+ </commandset>
+
+ <popupset id="sidebarPopups">
+ <tooltip id="tooltip" orient="vertical" onpopupshowing="fillInTooltip(event);">
+ <description id="tooltipDummy"/>
+ <hbox id="tooltipPreviewBox" pack="start">
+ <image id="tooltipPreview" validate="never"/>
+ </hbox>
+ <grid>
+ <columns>
+ <column/>
+ <column flex="1"/>
+ </columns>
+ <rows>
+ <row id="tooltipAddressRow" align="top">
+ <label value="&tooltip.address.label;"/>
+ <vbox id="tooltipAddress"/>
+ </row>
+ <row id="tooltipTypeRow">
+ <label value="&tooltip.type.label;"/>
+ <description id="tooltipType" filtered="&tooltip.type.blocked;" whitelisted="&tooltip.type.whitelisted;"/>
+ </row>
+ <row id="tooltipSizeRow">
+ <label value="&tooltip.size.label;"/>
+ <description id="tooltipSize"/>
+ </row>
+ <row id="tooltipDocDomainRow">
+ <label value="&tooltip.docDomain.label;"/>
+ <description id="tooltipDocDomain"/>
+ </row>
+ <row id="tooltipFilterRow" align="top">
+ <label value="&tooltip.filter.label;"/>
+ <vbox id="tooltipFilter" disabledText="&tooltip.filter.disabled;"/>
+ </row>
+ <row id="tooltipFilterSourceRow" align="top">
+ <label value="&tooltip.filterSource.label;"/>
+ <vbox id="tooltipFilterSource"/>
+ </row>
+ </rows>
+ </grid>
+ </tooltip>
+
+ <menupopup id="context" onpopupshowing="return fillInContext(event)">
+ <menuitem id="contextBlock" label="&context.block.label;…" oncommand="doBlock()" key="block-key"/>
+ <menuitem id="contextWhitelist" label="&context.whitelist.label;…" oncommand="doBlock()" key="block-key"/>
+ <menuitem id="contextEditFilter" label="&context.editfilter.label;…" oncommand="editFilter()"/>
+ <menuitem id="contextDisableFilter" labeltempl="&context.disablefilter.label;" oncommand="enableFilter(treeView.getSelectedItem().filter, false)"/>
+ <menuitem id="contextEnableFilter" labeltempl="&context.enablefilter.label;" oncommand="enableFilter(treeView.getSelectedItem().filter, true)"/>
+ <menuitem id="contextDisableOnSite" labeltempl="&context.disablefilteronsite.label;" oncommand="disableOnSite()"/>
+ <menuseparator id="contextOpenSep"/>
+ <menuitem id="contextOpen" label="&context.open.label;" oncommand="openInTab(null, event)"/>
+ <menuitem id="contextFlash" label="&context.flash.label;" oncommand="onSelectionChange()"/>
+ <menuitem id="contextCopy" label="&context.copy.label;" command="copy-command" key="copy-key"/>
+ <menuitem id="contextCopyFilter" label="&context.copyFilter.label;" oncommand="copyFilter()"/>
+ <menuseparator id="contextSelectSep"/>
+ <menuitem id="contextSelectAll" label="&context.selectAll.label;" command="selectAll-command" key="selectAll-key"/>
+ </menupopup>
+ </popupset>
+
+ <hbox>
+ <hbox align="center" flex="1">
+ <label value="&search.label;" control="searchField"/>
+ <textbox id="searchField" flex="1" type="search" oncommand="treeView.setFilter(this.value)"/>
+ </hbox>
+ <description id="detachButton" value="&detach.label;" onclick="detach(true)"/>
+ <description id="reattachButton" value="&reattach.label;" onclick="if (this.getAttribute('disabled') != 'true') detach(false)" hidden="true"/>
+ </hbox>
+
+ <tree id="list" context="context" flex="1" seltype="multiple" enableColumnDrag="true"
+ defaultSort="state descending" persist="defaultSort"
+ onkeypress="if (event.keyCode == event.DOM_VK_RETURN || event.keyCode == event.DOM_VK_ENTER) doBlock()">
+ <treecols>
+ <treecol id="address" label="&address.label;" flex="2" crop="center" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="filter" label="&filter.label;" flex="1" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="type" label="&type.label;" width="80" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="state" label="&state.label;" width="16" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="size" label="&size.label;" width="60" hidden="true" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="docDomain" label="&docDomain.label;" width="100" hidden="true" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="filterSource" label="&filterSource.label;" width="100" hidden="true" persist="width ordinal sortDirection hidden"/>
+ </treecols>
+ <treechildren id="treechildren"
+ tooltip="tooltip"
+ onclick="handleClick(event)"
+ ondblclick="handleDblClick(event)"
+ noitemslabel="&noitems.label;"
+ whitelistedlabel="&whitelisted.label;"/>
+ </tree>
+</page>
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebarDetached.xul b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebarDetached.xul
new file mode 100644
index 0000000..b7e117b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebarDetached.xul
@@ -0,0 +1,50 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+
+<!DOCTYPE page SYSTEM "chrome://adblockplus/locale/sidebar.dtd">
+
+<window
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ id="abpDetachedSidebar"
+ title="&detached.title;"
+ persist="screenX screenY width height sizemode"
+ onclose="document.getElementById('abp-command-sidebar').doCommand(); return false;">
+
+ <script type="application/x-javascript">
+ // Some people actually switch off browser.frames.enabled and are surprised
+ // that things stop working...
+ window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+ .getInterface(Components.interfaces.nsIWebNavigation)
+ .QueryInterface(Components.interfaces.nsIDocShell)
+ .allowSubframes = true;
+ </script>
+
+ <keyset>
+ <key keycode="VK_ESCAPE" command="command-close"/>
+ <key modifiers="accel" key="w" command="command-close"/>
+ </keyset>
+
+ <commandset>
+ <command id="command-close" oncommand="document.getElementById('sidebarFrame').contentWindow.doClose()"/>
+ </commandset>
+
+ <iframe src="sidebar.xul" id="sidebarFrame" flex="1"/>
+</window>
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptionSelection.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptionSelection.js
new file mode 100644
index 0000000..3fdcc18
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptionSelection.js
@@ -0,0 +1,308 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/FileUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+let subscriptionListLoading = false;
+
+function init()
+{
+ if (window.arguments && window.arguments.length && window.arguments[0])
+ {
+ let source = window.arguments[0];
+ setCustomSubscription(source.title, source.url,
+ source.mainSubscriptionTitle, source.mainSubscriptionURL);
+
+ E("all-subscriptions-container").hidden = true;
+ E("fromWebText").hidden = false;
+ }
+ else
+ loadSubscriptionList();
+}
+
+function updateSubscriptionInfo()
+{
+ let selectedSubscription = E("all-subscriptions").selectedItem;
+
+ E("subscriptionInfo").setAttribute("invisible", !selectedSubscription);
+ if (selectedSubscription)
+ {
+ let url = selectedSubscription.getAttribute("_url");
+ let homePage = selectedSubscription.getAttribute("_homepage")
+
+ let viewLink = E("view-list");
+ viewLink.setAttribute("_url", url);
+ viewLink.setAttribute("tooltiptext", url);
+
+ let homePageLink = E("visit-homepage");
+ homePageLink.hidden = !homePage;
+ if (homePage)
+ {
+ homePageLink.setAttribute("_url", homePage);
+ homePageLink.setAttribute("tooltiptext", homePage);
+ }
+ }
+}
+
+function reloadSubscriptionList()
+{
+ subscriptionListLoading = false;
+ loadSubscriptionList();
+}
+
+function loadSubscriptionList()
+{
+ if (subscriptionListLoading)
+ return;
+
+ E("all-subscriptions-container").selectedIndex = 0;
+ E("all-subscriptions-loading").hidden = false;
+
+ let request = new XMLHttpRequest();
+ let errorHandler = function()
+ {
+ E("all-subscriptions-container").selectedIndex = 2;
+ E("all-subscriptions-loading").hidden = true;
+ };
+ let successHandler = function()
+ {
+ if (!request.responseXML || request.responseXML.documentElement.localName != "subscriptions")
+ {
+ errorHandler();
+ return;
+ }
+
+ try
+ {
+ processSubscriptionList(request.responseXML);
+ E("all-subscriptions").selectedIndex = 0;
+ E("all-subscriptions").focus();
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ errorHandler();
+ }
+ };
+
+ request.open("GET", Prefs.subscriptions_listurl);
+ request.addEventListener("error", errorHandler, false);
+ request.addEventListener("load", successHandler, false);
+ request.send(null);
+
+ subscriptionListLoading = true;
+}
+
+function processSubscriptionList(doc)
+{
+ let list = E("all-subscriptions");
+ while (list.firstChild)
+ list.removeChild(list.firstChild);
+
+ addSubscriptions(list, doc.documentElement, 0, null, null);
+ E("all-subscriptions-container").selectedIndex = 1;
+ E("all-subscriptions-loading").hidden = true;
+}
+
+function addSubscriptions(list, parent, level, parentTitle, parentURL)
+{
+ for (let i = 0; i < parent.childNodes.length; i++)
+ {
+ let node = parent.childNodes[i];
+ if (node.nodeType != Node.ELEMENT_NODE || node.localName != "subscription")
+ continue;
+
+ if (node.getAttribute("type") != "ads" || node.getAttribute("deprecated") == "true")
+ continue;
+
+ let variants = node.getElementsByTagName("variants");
+ if (!variants.length || !variants[0].childNodes.length)
+ continue;
+ variants = variants[0].childNodes;
+
+ let isFirst = true;
+ let mainTitle = null;
+ let mainURL = null;
+ for (let j = 0; j < variants.length; j++)
+ {
+ let variant = variants[j];
+ if (variant.nodeType != Node.ELEMENT_NODE || variant.localName != "variant")
+ continue;
+
+ let item = document.createElement("richlistitem");
+ item.setAttribute("_title", variant.getAttribute("title"));
+ item.setAttribute("_url", variant.getAttribute("url"));
+ if (parentTitle && parentURL && variant.getAttribute("complete") != "true")
+ {
+ item.setAttribute("_supplementForTitle", parentTitle);
+ item.setAttribute("_supplementForURL", parentURL);
+ }
+ item.setAttribute("tooltiptext", variant.getAttribute("url"));
+ item.setAttribute("_homepage", node.getAttribute("homepage"));
+
+ let title = document.createElement("description");
+ if (isFirst)
+ {
+ if (Utils.checkLocalePrefixMatch(node.getAttribute("prefixes")))
+ title.setAttribute("class", "subscriptionTitle localeMatch");
+ else
+ title.setAttribute("class", "subscriptionTitle");
+ title.textContent = node.getAttribute("title") + " (" + node.getAttribute("specialization") + ")";
+ mainTitle = variant.getAttribute("title");
+ mainURL = variant.getAttribute("url");
+ isFirst = false;
+ }
+ title.setAttribute("flex", "1");
+ title.style.marginLeft = (20 * level) + "px";
+ item.appendChild(title);
+
+ let variantTitle = document.createElement("description");
+ variantTitle.setAttribute("class", "variant");
+ variantTitle.textContent = variant.getAttribute("title");
+ variantTitle.setAttribute("crop", "end");
+ item.appendChild(variantTitle);
+
+ list.appendChild(item);
+ }
+
+ let supplements = node.getElementsByTagName("supplements");
+ if (supplements.length)
+ addSubscriptions(list, supplements[0], level + 1, mainTitle, mainURL);
+ }
+}
+
+function onSelectionChange()
+{
+ let selectedItem = E("all-subscriptions").selectedItem;
+ if (!selectedItem)
+ return;
+
+ setCustomSubscription(selectedItem.getAttribute("_title"), selectedItem.getAttribute("_url"),
+ selectedItem.getAttribute("_supplementForTitle"), selectedItem.getAttribute("_supplementForURL"));
+
+ updateSubscriptionInfo();
+}
+
+function setCustomSubscription(title, url, mainSubscriptionTitle, mainSubscriptionURL)
+{
+ E("title").value = title;
+ E("location").value = url;
+
+ let messageElement = E("supplementMessage");
+ let addMainCheckbox = E("addMainSubscription");
+ if (mainSubscriptionURL && !hasSubscription(mainSubscriptionURL))
+ {
+ messageElement.removeAttribute("invisible");
+ addMainCheckbox.removeAttribute("invisible");
+
+ let [, beforeLink, afterLink] = /(.*)\?1\?(.*)/.exec(messageElement.getAttribute("_textTemplate")) || [null, messageElement.getAttribute("_textTemplate"), ""];
+ while (messageElement.firstChild)
+ messageElement.removeChild(messageElement.firstChild);
+ messageElement.appendChild(document.createTextNode(beforeLink));
+ let link = document.createElement("label");
+ link.className = "text-link";
+ link.setAttribute("tooltiptext", mainSubscriptionURL);
+ link.addEventListener("click", function() UI.loadInBrowser(mainSubscriptionURL), false);
+ link.textContent = mainSubscriptionTitle;
+ messageElement.appendChild(link);
+ messageElement.appendChild(document.createTextNode(afterLink));
+
+ addMainCheckbox.value = mainSubscriptionURL;
+ addMainCheckbox.setAttribute("_mainSubscriptionTitle", mainSubscriptionTitle)
+ let [label, accesskey] = Utils.splitLabel(addMainCheckbox.getAttribute("_labelTemplate"));
+ addMainCheckbox.label = label.replace(/\?1\?/g, mainSubscriptionTitle);
+ addMainCheckbox.accessKey = accesskey;
+ }
+ else
+ {
+ messageElement.setAttribute("invisible", "true");
+ addMainCheckbox.setAttribute("invisible", "true");
+ }
+}
+
+function validateURL(url)
+{
+ if (!url)
+ return null;
+ url = url.replace(/^\s+/, "").replace(/\s+$/, "");
+
+ // Is this a file path?
+ try {
+ let file = new FileUtils.File(url);
+ return Services.io.newFileURI(file).spec;
+ } catch (e) {}
+
+ // Is this a valid URL?
+ let uri = Utils.makeURI(url);
+ if (uri)
+ return uri.spec;
+
+ return null;
+}
+
+function addSubscription()
+{
+ let url = E("location").value;
+ url = validateURL(url);
+ if (!url)
+ {
+ Utils.alert(window, Utils.getString("subscription_invalid_location"));
+ E("location").focus();
+ return false;
+ }
+
+ let title = E("title").value.replace(/^\s+/, "").replace(/\s+$/, "");
+ if (!title)
+ title = url;
+
+ doAddSubscription(url, title);
+
+ let addMainCheckbox = E("addMainSubscription")
+ if (addMainCheckbox.getAttribute("invisible") != "true" && addMainCheckbox.checked)
+ {
+ let mainSubscriptionTitle = addMainCheckbox.getAttribute("_mainSubscriptionTitle");
+ let mainSubscriptionURL = validateURL(addMainCheckbox.value);
+ if (mainSubscriptionURL)
+ doAddSubscription(mainSubscriptionURL, mainSubscriptionTitle);
+ }
+
+ return true;
+}
+
+/**
+ * Adds a new subscription to the list.
+ */
+function doAddSubscription(/**String*/ url, /**String*/ title)
+{
+ let subscription = Subscription.fromURL(url);
+ if (!subscription)
+ return;
+
+ FilterStorage.addSubscription(subscription);
+
+ subscription.disabled = false;
+ subscription.title = title;
+
+ if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+ Synchronizer.execute(subscription);
+}
+
+function hasSubscription(url)
+{
+ return FilterStorage.subscriptions.some(function(subscription) subscription instanceof DownloadableSubscription && subscription.url == url);
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptionSelection.xul b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptionSelection.xul
new file mode 100644
index 0000000..17f1854
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptionSelection.xul
@@ -0,0 +1,75 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://adblockplus/skin/subscriptionSelection.css" type="text/css"?>
+
+<!DOCTYPE dialog SYSTEM "chrome://adblockplus/locale/subscriptionSelection.dtd">
+
+<dialog
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ buttons="accept,cancel"
+ buttonlabelaccept="&addSubscription.label;"
+ title="&dialog.title;"
+ id="abpSubscriptionSelection"
+ windowtype="abp:subscriptionSelection"
+ onload="init();"
+ ondialogaccept="return addSubscription();">
+
+ <script type="application/x-javascript;version=1.7" src="utils.js"/>
+ <script type="application/x-javascript;version=1.7" src="subscriptionSelection.js"/>
+
+ <deck id="all-subscriptions-container" selectedIndex="0" flex="1">
+ <vbox pack="center">
+ <progressmeter id="all-subscriptions-loading" mode="undetermined"/>
+ </vbox>
+ <vbox>
+ <richlistbox id="all-subscriptions" onselect="onSelectionChange()" flex="1"/>
+ <hbox id="subscriptionInfo" invisible="true">
+ <label id="view-list" class="text-link" value="&viewList.label;" onclick="UI.loadInBrowser(this.getAttribute('_url'))"/>
+ <spacer flex="1"/>
+ <label id="visit-homepage" class="text-link" value="&visitHomepage.label;" onclick="UI.loadInBrowser(this.getAttribute('_url'))"/>
+ </hbox>
+ </vbox>
+ <vbox pack="center" align="center">
+ <description value="&list.download.failed;"/>
+ <hbox>
+ <button label="&list.download.retry;" oncommand="reloadSubscriptionList()"/>
+ <button label="&list.download.website;" oncommand="UI.loadDocLink('subscriptions')"/>
+ </hbox>
+ </vbox>
+ </deck>
+
+ <description id="fromWebText" hidden="true">&fromWeb.description;</description>
+
+ <groupbox id="differentSubscription">
+ <label value="&title.label;" control="title"/>
+ <textbox id="title"/>
+
+ <label value="&location.label;" control="location"/>
+ <textbox id="location"/>
+ </groupbox>
+
+ <description id="supplementMessage" invisible="true" _textTemplate="&supplementMessage;">
+ &supplementMessage;
+ <label class="text-link" oncommand="">dummy dummy dummy dummy dummy dummy dummy dummy dummy dummy</label>
+ </description>
+ <checkbox id="addMainSubscription" invisible="true" checked="true" _labelTemplate="&addMain.label;" label="&addMain.label;"/>
+
+</dialog>
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptions.xml b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptions.xml
new file mode 100644
index 0000000..6a05d5e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptions.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of the Adblock Plus web scripts,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<subscriptions>
+ <subscription title="EasyList"
+ specialization="English"
+ url="https://easylist-downloads.adblockplus.org/easylist.txt"
+ homepage="https://easylist.adblockplus.org/"
+ prefixes="en"
+ author="fanboy, MonztA, Famlam, Khrin"/>
+ <subscription title="ABPindo+EasyList"
+ specialization="Bahasa Indonesia"
+ url="https://easylist-downloads.adblockplus.org/abpindo+easylist.txt"
+ homepage="http://abpindo.blogspot.com/"
+ prefixes="id"
+ author="heradhis"/>
+ <subscription title="Bulgarian list+EasyList"
+ specialization="българÑки"
+ url="https://easylist-downloads.adblockplus.org/bulgarian_list+easylist.txt"
+ homepage="http://stanev.org/abp/"
+ prefixes="bg"
+ author="ÐлекÑандър Станев"/>
+ <subscription title="EasyList China+EasyList"
+ specialization="中文"
+ url="https://easylist-downloads.adblockplus.org/easylistchina+easylist.txt"
+ homepage="http://abpchina.org/forum/"
+ prefixes="zh"
+ author="John, Li, Jiefei"/>
+ <subscription title="EasyList Czech and Slovak+EasyList"
+ specialization="ÄeÅ¡tina, slovenÄina"
+ url="https://easylist-downloads.adblockplus.org/easylistczechslovak+easylist.txt"
+ homepage="http://adblocksk.tk/"
+ prefixes="cs,sk"
+ author="tomasko126"/>
+ <subscription title="EasyList Dutch+EasyList"
+ specialization="Nederlands"
+ url="https://easylist-downloads.adblockplus.org/easylistdutch+easylist.txt"
+ homepage="https://easylist.adblockplus.org/"
+ prefixes="nl"
+ author="Famlam"/>
+ <subscription title="EasyList Germany+EasyList"
+ specialization="Deutsch"
+ url="https://easylist-downloads.adblockplus.org/easylistgermany+easylist.txt"
+ homepage="https://easylist.adblockplus.org/"
+ prefixes="de"
+ author="MonztA, Famlam"/>
+ <subscription title="EasyList Hebrew+EasyList"
+ specialization="עברית"
+ url="https://easylist-downloads.adblockplus.org/israellist+easylist.txt"
+ homepage="https://github.com/AdBlockPlusIsrael/EasyListHebrew"
+ prefixes="he"
+ author="BsT"/>
+ <subscription title="EasyList Italy+EasyList"
+ specialization="italiano"
+ url="https://easylist-downloads.adblockplus.org/easylistitaly+easylist.txt"
+ homepage="https://easylist.adblockplus.org/"
+ prefixes="it"
+ author="Khrin"/>
+ <subscription title="EasyList Lithuania+EasyList"
+ specialization="lietuvių kalba"
+ url="https://easylist-downloads.adblockplus.org/easylistlithuania+easylist.txt"
+ homepage="http://margevicius.lt/"
+ prefixes="lt"
+ author="Algimantas MargeviÄius"/>
+ <subscription title="Latvian List+EasyList"
+ specialization="latviešu valoda"
+ url="https://easylist-downloads.adblockplus.org/latvianlist+easylist.txt"
+ homepage="http://latvian-list.site11.com/"
+ prefixes="lv"
+ author="anonymous74100"/>
+ <subscription title="Liste AR+Liste FR+EasyList"
+ specialization="العربية"
+ url="https://easylist-downloads.adblockplus.org/liste_ar+liste_fr+easylist.txt"
+ homepage="https://code.google.com/p/liste-ar-adblock/"
+ prefixes="ar"
+ author="smed79"/>
+ <subscription title="Liste FR+EasyList"
+ specialization="français"
+ url="https://easylist-downloads.adblockplus.org/liste_fr+easylist.txt"
+ homepage="http://adblock-listefr.com/"
+ prefixes="fr"
+ author="Lian, Crits, smed79"/>
+ <subscription title="ROList+EasyList"
+ specialization="românesc"
+ url="https://easylist-downloads.adblockplus.org/rolist+easylist.txt"
+ homepage="http://www.zoso.ro/rolist"
+ prefixes="ro"
+ author="MenetZ, Zoso"/>
+ <subscription title="RuAdList+EasyList"
+ specialization="руÑÑкий, українÑька"
+ url="https://easylist-downloads.adblockplus.org/ruadlist+easylist.txt"
+ homepage="https://code.google.com/p/ruadlist/"
+ prefixes="ru,uk"
+ author="Lain_13"/>
+ <subscription title="Wiltteri+EasyList"
+ specialization="suomi"
+ url="https://easylist-downloads.adblockplus.org/wiltteri+easylist.txt"
+ homepage="http://wiltteri.net/"
+ prefixes="fi"
+ author="None"/>
+ </subscriptions> \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/utils.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/utils.js
new file mode 100644
index 0000000..49f6e7f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/utils.js
@@ -0,0 +1,66 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cr = Components.results;
+const Cu = Components.utils;
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+/**
+ * Imports a module from Adblock Plus core.
+ */
+function require(/**String*/ module)
+{
+ var result = {};
+ result.wrappedJSObject = result;
+ Services.obs.notifyObservers(result, "adblockplus-require", module);
+ return result.exports;
+}
+
+var {Policy} = require("contentPolicy");
+var {Filter, InvalidFilter, CommentFilter, ActiveFilter, RegExpFilter,
+ BlockingFilter, WhitelistFilter, ElemHideBase, ElemHideFilter, ElemHideException} = require("filterClasses");
+var {FilterNotifier} = require("filterNotifier");
+var {FilterStorage, PrivateBrowsing} = require("filterStorage");
+var {IO} = require("io");
+var {defaultMatcher, Matcher, CombinedMatcher} = require("matcher");
+var {Prefs} = require("prefs");
+var {RequestNotifier} = require("requestNotifier");
+var {Subscription, SpecialSubscription, RegularSubscription,
+ ExternalSubscription, DownloadableSubscription} = require("subscriptionClasses");
+var {Synchronizer} = require("synchronizer");
+var {UI} = require("ui");
+var {Utils} = require("utils");
+
+/**
+ * Shortcut for document.getElementById(id)
+ */
+function E(id)
+{
+ return document.getElementById(id);
+}
+
+/**
+ * Split up all labels into the label and access key portions.
+ */
+document.addEventListener("DOMContentLoaded", function splitAllLabelsHandler()
+{
+ document.removeEventListener("DOMContentLoaded", splitAllLabelsHandler, false);
+ Utils.splitAllLabels(document);
+}, false);
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/composer.dtd
new file mode 100644
index 0000000..54ac458
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "ÙÙŠ &amp;نهاية العنوان">
+<!ENTITY domainRestriction.label "ت&amp;قييد النطاق:">
+<!ENTITY collapse.default.no.label "استخدام Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ (لا)">
+<!ENTITY firstParty.label "الطر٠&amp;Ù†ÙØ³Ù‡ Ùقط">
+<!ENTITY preferences.label "&amp;إعرض الÙلاتر Ø§Ù„Ù…ØªÙˆÙØ±Ø©...">
+<!ENTITY pattern.label "إبحث عن نموذج">
+<!ENTITY thirdParty.label "أطرا٠أ&amp;خرى Ùقط">
+<!ENTITY filter.label "&amp;Ùلتر جديد :">
+<!ENTITY collapse.label "طوي المحجوب: (&amp;س)">
+<!ENTITY match.warning "النموذج الذي أدخلته لم يعد مواÙقا للعنوان الذي يجب أن يحجب أو يسمح به ولن يأثر Ùيه">
+<!ENTITY anchor.start.label "ÙÙŠ ب&amp;داية العنوان">
+<!ENTITY matchCase.label "م&amp;طابقة الحالة">
+<!ENTITY custom.pattern.label "مخ&amp;صص:">
+<!ENTITY unselectAllTypes.label "بدون أي اختيار">
+<!ENTITY type.whitelist.label "قاعدة است&amp;ثناء">
+<!ENTITY regexp.warning "النموذج الذي أدخلته سيتم تعبيره على أنه تعبير العادي، الكثير من التعابير العادية قد تؤدي إلى بطء ÙÙŠ Ø§Ù„ØªØµÙØ­. إن لم تكن تنوي استخدام التعابير العادية، قم Ø¨Ø¥Ø¶Ø§ÙØ© الرمز &quot;*&quot; إلى نهاية النموذج">
+<!ENTITY dialog.title "أض٠قاعدة تصÙية لآدبلوك بلس">
+<!ENTITY basic.label "العرض الأساسي">
+<!ENTITY type.filter.label "&amp;Ùلاتر حجب">
+<!ENTITY types.label "التطبيق على الأنواع:">
+<!ENTITY shortpattern.warning "النموذج الذي أدخلته قصير جداً ليتم تحسينه وقد يبطئ ØªØµÙØ­Ùƒ. ينصح باختيار قيمة أطول لهذا الÙلتر لكي يقوم آدبلوك بلس بÙلترته بطريقة Ø¨ÙƒÙØ§Ø¡Ø©.">
+<!ENTITY collapse.yes.label "نعم">
+<!ENTITY anchors.label "قبول النموذج Ùقط:">
+<!ENTITY collapse.default.yes.label "استخدام Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ (نعم)">
+<!ENTITY domainRestriction.help "استعمل هذا الخيار لتحديد نطاق واحد أو أكثر Ù…ÙØµÙˆÙ„ بالرمز &quot;|&quot;ØŒ سيطبق هذا الÙلتر على هذه النطاقات Ùقط. وضع الرمز &quot;~&quot; قبل اسم نطاق يعني أن الÙلتر يجب ألا يطبق على ذلك النطاق">
+<!ENTITY accept.label "Ø¥Ø¶Ø§ÙØ© Ùلتر">
+<!ENTITY options.label "إعدادات">
+<!ENTITY disabled.warning "آدبلوك بلس معطل حالياً. ما زال يمكنك Ø¥Ø¶Ø§ÙØ© الÙلاتر Ùˆ لكن لن يتم تطبيقهم إلا إذا قمت ب[link]Ø¨ØªÙØ¹ÙŠÙ„ آدبلوك بلس[/link].">
+<!ENTITY anchor.start.flexible.label "ÙÙŠ ب&amp;داية اسم النطاق">
+<!ENTITY collapse.no.label "لا">
+<!ENTITY selectAllTypes.label "اختيار الكل">
+<!ENTITY advanced.label "عرض متقدم">
+<!ENTITY pattern.explanation "هذا النمط يمكن أن يكون أي جزء من عنوان، الرمز (*) يستعمل كاختصار. سيتم تطبيق Ø§Ù„Ù…ØµÙØ§Ø© على العناوين المطابقة للنمط المحدد Ùقط.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/filters.dtd
new file mode 100644
index 0000000..e7691f6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "سيتم استبدال ÙƒØ§ÙØ© عوامل التصÙية المخصصة الخاصة بك بمحتويات المل٠المحدد.هل تريد المتابعه؟">
+<!ENTITY slow.column "&amp;عرض الÙلاتر">
+<!ENTITY enabled.column "مش&amp;غل">
+<!ENTITY subscription.lastDownload.checksumMismatch "ÙØ´Ù„ ØŒ عدم تطابق المجموع الاختباري">
+<!ENTITY noFiltersInGroup.text "المجموعة المختارة ÙØ§Ø±ØºØ©">
+<!ENTITY subscription.actions.label "الإجراءات">
+<!ENTITY filter.selectAll.label "اختيار الكل">
+<!ENTITY backupButton.label "ال&amp;نسخ الاحتياطية والاسترجاع">
+<!ENTITY restore.minVersion.warning "تنبيه : المل٠تم إنشاؤه بواسطة نسخة حديثة لأد بلوك بلس . يجب عليك تحديث أد بلوك بلس قبل عمليةالاستعادة من هذا الملÙ. ">
+<!ENTITY restore.error "لا يمكن معالجة بينات المل٠، من المحتمل أن هذاالمل٠ليس النسخة الاحتياطية لآد بلوك بلس ؟">
+<!ENTITY sort.ascending.label "ترتيب أبجدي (A &gt; Z) (&amp;ص)">
+<!ENTITY sort.label "ترتي&amp;ب حسب">
+<!ENTITY subscription.source.label "قائمة الÙلاتر">
+<!ENTITY hitcount.column "ال&amp;ضغطات">
+<!ENTITY noFilters.text "لا توجد لديك Ùلاتر مخصصة بعد">
+<!ENTITY backup.custom.title "الÙلاتر المخصصة Ùقط">
+<!ENTITY subscription.external.label "تم التحديث من Ø§Ø¶Ø§ÙØ© اخرى">
+<!ENTITY subscription.delete.label "ازالة">
+<!ENTITY noGroupSelected.text "ج">
+<!ENTITY filter.cut.label "قص">
+<!ENTITY restore.default.label "الاسترجاع من النسخة الاحتياطية ?1?">
+<!ENTITY subscription.lastDownload.inProgress "جاري التحميل">
+<!ENTITY subscriptions.tab.label "اشتراكات الÙلتر">
+<!ENTITY sort.descending.label "ت&amp;رتيب أبجدي (Z &gt; A)">
+<!ENTITY filters.remove.warning "أحقاً تريد ازالة الÙلاتر المختارة؟">
+<!ENTITY filter.delete.label "حذÙ">
+<!ENTITY addSubscriptionAdd.label "Ø§Ø¶Ø§ÙØ©">
+<!ENTITY viewMenu.label "عرض">
+<!ENTITY subscription.lastDownload.unknown "غير متاح">
+<!ENTITY addSubscriptionCancel.label "الغاء">
+<!ENTITY subscription.enabled.label "Ù…ÙØ¹Ù‘Ù„">
+<!ENTITY noSubscriptions.text "لم تض٠أي Ùلتر اشتراك حتى الان. لن يصد آد بلÙÙƒ بلَس
+أي شيء بدون هذه الÙلاتر, الرجاء اختيار اشتراكات الÙلاتر
+Ù„Ø§Ø¶Ø§ÙØ© أحدها">
+<!ENTITY subscription.update.label "تحدبث الÙلاتر">
+<!ENTITY dialog.title "ØªÙØ¶ÙŠÙ„ات التصÙية لآد بلÙÙƒ بلَس">
+<!ENTITY addFilter.label "Ø¥&amp;Ø¶Ø§ÙØ© Ùلتر">
+<!ENTITY subscription.minVersion.warning "يتطلب هذا الاشتراك للتصÙية أحدث إصدار آد بلÙÙƒ بلَس ØŒ يجب التحديث إلى الإصدار الأحدث">
+<!ENTITY subscription.lastDownload.invalidURL "ÙØ´Ù„ الأمر، ليس عنوان صحيح">
+<!ENTITY backup.error "حصل هناك خطأ ÙÙŠ Ø¥Ø¶Ø§ÙØ© الÙلاتر إلى المل٠. تأكد من أن المل٠قابل للتعديل Ùˆ لا يتم استخدامه ÙÙŠ برنامج آخر.">
+<!ENTITY filter.moveUp.label "الى الاعلى">
+<!ENTITY addGroup.label "Ø£Ø¶Ø§ÙØ© &amp;مجموعة تصÙية">
+<!ENTITY filter.edit.label "تحرير">
+<!ENTITY subscription.showHideFilters.label "اظهار / Ø§Ø®ÙØ§Ø¡ الÙلاتر">
+<!ENTITY acceptableAds2.label "السماح لب&amp;عض الإعلانات الغير متطÙّلة">
+<!ENTITY addSubscriptionOther.label "Ø¥Ø¶Ø§ÙØ© اشتراك آخر">
+<!ENTITY close.label "اغلاق">
+<!ENTITY sort.none.label "غي&amp;ر مرتب">
+<!ENTITY filter.actions.label "Ø£ÙØ¹Ø§Ù„ الÙلاتر">
+<!ENTITY filter.copy.label "نسخ">
+<!ENTITY filter.moveDown.label "الى الاسÙÙ„">
+<!ENTITY filter.resetHitCounts.label "استرجاع احصائيات الاصابات الصحيحة">
+<!ENTITY readMore.label "قراءة المزيد">
+<!ENTITY subscription.moveUp.label "الى الاعلى">
+<!ENTITY addSubscription.label "إضا&amp;ÙØ© اشتراك إلى Ùلتر">
+<!ENTITY subscription.homepage.label "ØµÙØ­Ø© البداية">
+<!ENTITY backup.complete.title "كل الاشتراكات والÙلاتر">
+<!ENTITY restore.own.label "الاسترجاع من النسخة الاحتياطية الذاتية">
+<!ENTITY restore.complete.warning "سيتم استبدال ÙƒØ§ÙØ© Ø§Ù„ØªÙØ¶ÙŠÙ„ات الخاصة بك ÙÙŠ تصÙية محتويات المل٠المحدد. هل تريد المتابعه؟">
+<!ENTITY filters.tab.label "الÙلاتر المخصصة">
+<!ENTITY backup.label "اعمل نسخة احتياطية جديدة">
+<!ENTITY find.label "بحث (&amp;ج)">
+<!ENTITY subscription.moveDown.label "الى الاسÙÙ„">
+<!ENTITY subscription.lastDownload.connectionError "ÙØ´Ù„ الأمر بسبب ÙØ´Ù„ التحميل">
+<!ENTITY subscription.lastDownload.success "نجاح">
+<!ENTITY subscription.lastDownload.invalidData "ÙØ´Ù„ الأمر، ليست قائمة Ùلاتر صحيحة">
+<!ENTITY filter.paste.label "لصق">
+<!ENTITY subscription.disabledFilters.enable "ØªÙØ¹ÙŠÙ„ الÙلاتر المعطّلة">
+<!ENTITY lasthit.column "&amp;آخر ضغطة">
+<!ENTITY subscription.editTitle.label "تحرير العنوان">
+<!ENTITY subscription.disabledFilters.warning "بعض الÙلاتر ÙÙŠ هذا الاشتراك معطّلة">
+<!ENTITY filter.column "قانون ال&amp;Ùلتر">
+<!ENTITY subscription.lastDownload.label "آخر تحميل">
+<!ENTITY viewList.label "اظهار القائمة">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/firstRun.properties
new file mode 100644
index 0000000..647ee0c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Ø­Ø§ÙØ¸ على خصوصيتك عند استخدام Ø§Ù„Ù…ØªØµÙØ­ بتعطيل التجسس Ùˆ أخÙÙŠ Ù†ÙØ³Ùƒ على الشركات الإعلانية اللتي تحاول أن تتبع كل تحركاتك.
+firstRun_toggle_off=إيقاÙ
+firstRun_feature_tracking=تعطيل التعقب
+firstRun_feature_malware=منع البرامج الضارة
+firstRun_title=تم تثبيت آد بلوك بلس
+firstRun_toggle_on=تشغيل
+firstRun_acceptableAdsExplanation=نود تشجيع مواقع ويب باستخدام الإعلانات واضحة وغير مزعجة. ولهذا السبب وضعنا <a>مبادئ توجيهية صارمة</a> لتحديد الإعلانات المقبولة، والتي تظهر ضمن الإعدادات Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ©. إذا كنت تريد أن تمنع كل الإعلانات يمكنك <a>تعطيل</a> هذا ÙÙŠ بضع ثوان.
+firstRun_contributor_credits=شكر للمساهمين
+firstRun_dataCorruptionWarning=هل تواصل هذه Ø§Ù„ØµÙØ­Ø© الظهور ØŸ <a>اضغط هنا !</a>
+firstRun_acceptableAdsHeadline=سيتم الآن حجب الإعلانات المزعجة
+firstRun_share=أخبر أصدقائك
+firstRun_share_headline=<a>يقدم لنا يد المساعدة</a> ÙÙŠ جعل الإنترنت مكاناً Ø£ÙØ¶Ù„
+firstRun_feature_social_description=خلص تلقائياً Ø§Ù„Ù…ØªØµÙØ­ الخاص بك من وسائل الإعلام الاجتماعية الأزرار، مثل مثل ألÙيس بوك، التي تظهر ÙÙŠ ØµÙØ­Ø§Øª الويب، وتتبع السلوك الخاص بك.
+firstRun_filterlistsReinitializedWarning=ويبدو أن خطأ تسبب ÙÙŠ إزالة جميع قوائم الÙلترات حجب الإعلانات، Ùˆ لم نتمكن من استعادة نسخة احتياطية. ولذلك اضطررنا إلى إعادة تعيين الإعدادات الخاصة بك Ùˆ قائمة الÙلاتر للوضع السابق مع "الإعلانات القبول". الرجاء التحقق من قوائم الÙلترات Ùˆ إعدادات "الإعلانات المقبولة" ÙÙŠ <a>خيارات آدبلوك بلس</a>.
+firstRun_feature_malware_description=إجعل Ø§Ù„ØªØµÙØ­ أكثر أماناً بتعطيل مواقع البرامج الضارة Ø§Ù„Ù…Ø¹Ø±ÙˆÙØ©.
+firstRun_features=آد بلوك بلس يمكنه عمل أشياء أخرى غير حجب الإعلانات
+firstRun_donate=تبرع
+firstRun_donate_label=دعم مشروعنا
+firstRun_feature_social=إزالة أزرار المواقع الإجتماعية
+firstRun_legacySafariWarning=أنت تستخدم نسخة ÙØ¯ÙŠÙ…Ø© من Ù…ØªØµÙØ­ Ø³ÙØ§Ø±Ù‰ وهذه النسخة غير مدعومة من أد بلوك بلس. بحيث من الممكن ان لا يعمل بصورة صحيحة على بعض المواقع. نحن نوصي بشدة ان تقوم بالترقية الى النسخة السادسة 6.1.1 Ù„Ù„Ù…ØªØµÙØ­ Ø³ÙØ§Ø±Ù‰ أو النسخة الأحدث (Ù…ØªÙˆÙØ± على Mac OS X 10.8 Mountain Lion) أو النسخة السابعة 7.0.1 أو الأحدث (Ù…ØªÙˆÙØ± على OS X 10.9 Mavericks) أو تستطيع ان تستخدم أحدث Ø¥ØµØ¯Ø§Ø±Ù„Ù„Ù…ØªØµÙØ­ ÙØ§ÙŠØ±Ùوكس، جوجل كروم أو أوبرا.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/global.properties
new file mode 100644
index 0000000..d626eb5
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=لا توجد عناصر للحجب ÙÙŠ هذه Ø§Ù„ØµÙØ­Ø©
+action3_tooltip=اضغط لتشغيل/تعطيل آدبلوك بلس
+notification_antiadblock_title=Ø¥Ø®ÙØ§Ø¡ الرسائل Ø§Ù„Ù…Ø³ØªÙ‡Ø¯ÙØ©ØŸ
+type_label_script=سكريبت
+filter_elemhide_nocriteria=لم يتم تحديد صيغة للتعر٠على العنصر Ù„Ø¥Ø®ÙØ§Ø¤Ù‡
+blockingGroup_title=قواعد حجب الدعاية
+whitelisted_tooltip=آدبلوك بلس ÙØ¹Ø§Ù„ الآن، Ùˆ لكنه معطل بالنسبة لهذه Ø§Ù„ØµÙØ­Ø©
+type_label_stylesheet=جدول الأنماط
+blocked_count_tooltip=?1? خارج عن ?2?
+type_label_font=الخط
+type_label_popup=Ù†Ø§ÙØ°Ø© منبثقة
+filter_regexp_tooltip=هذا الÙلتر إما "تعبير منطقي" أو أقصر من أن يتم تحسينه. الكثير من هذه الÙلاتر قد تؤدي إلى بطء ÙÙŠ Ø§Ù„ØªØµÙØ­
+action0_tooltip=اضغط لتظهر القائمة المراÙقة، اضغط بالزر الأوسط للتشغيل/التعطيل
+whitelisted_page=تم تعطيل آدبلوك بلس ÙÙŠ Ø§Ù„ØµÙØ­Ø© الحالية
+remove_group_warning=هل تريد حقاً إزالة هذه المجموعة؟
+action1_tooltip=اضغط Ù„ÙØªØ­/إغلاق العناصر المحجوبة، اضغط بالزر الأوسط للتشغيل/ التعطيل
+type_label_xmlhttprequest=طلب XML
+active_tooltip=إن آدبلوك بلس Ù…ÙØ¹Ù„. هناك ?1? اشتراك Ùلتر Ùˆ ?2? Ùلاتر مخصصة قيد الاستعمال
+type_label_document=مستند
+type_label_object_subrequest=طلب ÙØ±Ø¹ÙŠ Ù„Ù„Ø¹Ù†ØµØ±
+whitelistGroup_title=قواعد الاستثتاء
+disabled_tooltip=آدبلوك بلس معطل الآن
+filter_elemhide_duplicate_id=تعري٠واحد Ùقط للعنصر الذي سيتم Ø¥Ø®ÙØ§Ø¤Ù‡ يمكن أن يحدد
+type_label_object=عنصر
+action2_tooltip=اضغط Ù„ÙØªØ­ الخيارات، اضغط بالزر الأوسط للتشغيل/التعطيل
+type_label_subdocument=إطار
+clearStats_warning=هذا سيصÙّر كل احصاءات الÙلاتر ويعطّل تعداد اصابات الÙلاتر. هل تريد التقدم؟
+notification_antiadblock_message=لقد عر٠هذا الموقع بإظهاره رسائل موجهة إلى المستخدمين. هل تريد أن يخÙÙŠ Adblock Plus الرسائل Ø§Ù„Ù…Ø³ØªÙ‡Ø¯ÙØ©ØŸ
+blocked_count_addendum=المسموح به ?1? والمخÙÙŠ ?2?
+subscription_invalid_location=موقع قائمة الÙلتر ليس صحيح كعنوان ويب Ùˆ لا كأسم ملÙ
+type_label_image=صورة
+remove_subscription_warning=هل أنت حقاً راغب بإزالة هذا الاشتراك؟
+type_label_other=أخرى
+mobile_menu_enable=آدبلوك بلس: ØªÙØ¹ÙŠÙ„
+type_label_media=صوت/Ùيديو
+mobile_menu_disable_site=آدبلوك بلس: تعطيل على ?1?
+elemhideGroup_title=قواعد Ø§Ø®ÙØ§Ø¡ العناصر
+mobile_menu_enable_site=آدبلوك بلس: ØªÙØ¹ÙŠÙ„ على ?1?
+type_label_elemhide=مخÙÙŠ
+newGroup_title=مجموعة Ùلترة جديدة
+default_dialog_title=آدبلوك بلس
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/overlay.dtd
new file mode 100644
index 0000000..6214cda
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;نعم">
+<!ENTITY notification.button.no "&amp;لا">
+<!ENTITY sync.label "م&amp;زامنة إعدادات آدبلوك بلس">
+<!ENTITY whitelist.site.label "تعطيل ÙÙŠ ?1?">
+<!ENTITY filters.label "ت&amp;ÙØ¶ÙŠÙ„ات الÙلتر">
+<!ENTITY disable.label "تعطيل ÙÙŠ جميع الأماكن">
+<!ENTITY objecttab.title "أحجب">
+<!ENTITY objecttab.tooltip "اضغط هنا لحجب هذا العنصر بـ آدبلوك بلاس">
+<!ENTITY menuitem.label "ØªÙØ¶ÙŠÙ„ات آدبلوك بلس">
+<!ENTITY objecttabs.label "عرض &amp;تبويبات Ù„Ùلاش Ùˆ Ø¬Ø§ÙØ§">
+<!ENTITY sendReport.label "ال&amp;تبليغ عن خطأ ÙÙŠ هذه Ø§Ù„ØµÙØ­Ø©">
+<!ENTITY whitelist.page.label "تعطيل ÙÙŠ هذه Ø§Ù„ØµÙØ­Ø© Ùقط">
+<!ENTITY context.image.label "آدبلوك بلس : حجب صورة">
+<!ENTITY counthits.label "تعداد اصابات الÙلترة (&amp;Ø¥)">
+<!ENTITY opensidebar.label "ÙØªØ­ العناصر المح&amp;جوبة">
+<!ENTITY notification.button.close "&amp;اغلاق">
+<!ENTITY contribute.label "شارك ÙÙŠ آد بلÙÙƒ بلَس">
+<!ENTITY toolbarbutton.label "آدبلوك بلس">
+<!ENTITY context.frame.label "آدبلوك بلس : حجب إطار">
+<!ENTITY blocked.tooltip "العناصر المحجوبة ÙÙŠ هذه Ø§Ù„ØµÙØ­Ø©">
+<!ENTITY hideplaceholders.label "ا&amp;Ø®ÙØ§Ø¡ ماسك المكان للعناصر Ø§Ù„Ù…ÙˆÙ‚ÙˆÙØ©">
+<!ENTITY showinstatusbar.label "عرض ÙÙŠ شريط ال&amp;حالة">
+<!ENTITY sidebar.title "العناصر المحجوبة ÙÙŠ Ø§Ù„ØµÙØ­Ø© الحالية">
+<!ENTITY options.label "&amp;خيارات">
+<!ENTITY context.object.label "آدبلوك بلس : حجب عنصر">
+<!ENTITY context.removeWhitelist.label "آدبلوك بلس : إعادة Ø§Ù„ØªÙØ¹ÙŠÙ„ ÙÙŠ هذه Ø§Ù„ØµÙØ­Ø©">
+<!ENTITY filters.tooltip "المصاÙÙŠ الأكثر نشاط:">
+<!ENTITY closesidebar.label "إغلاق العناصر المح&amp;جوبة">
+<!ENTITY showintoolbar.label "عرض ÙÙŠ &amp;شريط الأدوات">
+<!ENTITY status.tooltip "الحالة">
+<!ENTITY context.media.label "آدبلوك بلس : حجب أوديوÙيديو">
+<!ENTITY subscription.update.label "تحدبث الÙلاتر">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/sendReport.dtd
new file mode 100644
index 0000000..5e7f255
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;تراجع">
+<!ENTITY issues.disabledgroups.description "اشتراكات ومجموعات الÙلاتر التالية معطلة، ولكنها قد تسبب أثرا على هذه Ø§Ù„ØµÙØ­Ø© رغم ذلك">
+<!ENTITY showData.label "إظهار بيانات التقرير">
+<!ENTITY typeSelector.falsePositive.label "آدبلوك بلس يحجب &amp;أكثر من اللازم">
+<!ENTITY issues.change.description "تم تغيير إعداداتك. الرجاء إعادة تحميل Ø§Ù„ØµÙØ­Ø© لتجربة التغييرات وإرسال تقرير بالمشكلة إن لم تكن قد حلت بهذه التغييرات">
+<!ENTITY email.label "الب&amp;ريد الإلكتروني:">
+<!ENTITY issues.openPreferences.label "ÙØªØ­ ØªÙØ¶ÙŠÙ„ات الÙلتر">
+<!ENTITY sendPage.confirmation "تم Ø­ÙØ¸ تقريرك. ستستطيع الوصول إليه عن طريق العنوان التالي:">
+<!ENTITY copyLink.label "&amp;نسخ رابط التقرير">
+<!ENTITY issues.nofilters.description "آدبلوك بلس لا يمنع أي شيء على هذه Ø§Ù„ØµÙØ­Ø©. على الأغلب أن المشكلة التي تواجهها لا تتعلق بآدبلوك بلس Ù†ÙØ³Ù‡.">
+<!ENTITY sendPage.knownIssue "على الأغلب أن المشكلة التي قمت بإرسالها Ù…Ø¹Ø±ÙˆÙØ© مسبقاً. للمزيد من المعلومات:">
+<!ENTITY typeSelector.other.description "اختر هذا الخيار إن كنت تشك أن المشكلة بآدبلوك بلس Ù†ÙØ³Ù‡ وليس بأحد الÙلاتر">
+<!ENTITY issues.disabledgroups.enable.label "ØªÙØ¹ÙŠÙ„ مجموعة اشتراك Ùلتر">
+<!ENTITY typeWarning.override.label "أتÙهم وأرغب بإر&amp;سال التقرير">
+<!ENTITY issues.disabled.enable.label "ØªÙØ¹ÙŠÙ„ آدبلوك بلس">
+<!ENTITY update.fixed.description "التحديثات لاشتراكات الÙلاتر أصلحت المشكلة التي أردت الإبلاغ عنها. رجاء أعد تحديث Ø§Ù„ØµÙØ­Ø© وأعد المحاولة، اضغط تقرير مرة أخرى إذا بقيت المشكلة.">
+<!ENTITY anonymous.label "تقرير بدون هوي&amp;ة">
+<!ENTITY reloadButton.label "إعادة ت&amp;حميل Ø§Ù„ØµÙØ­Ø©">
+<!ENTITY recentReports.clear.label "&amp;حذ٠كل التقارير">
+<!ENTITY typeSelector.description "هذه Ø§Ù„Ù†Ø§ÙØ°Ø© ستقودك خلال الخطوات المطلوبة لإرسال تبليغ بمشكلة ÙÙŠ آدبلوك بلس. ÙÙŠ البداية عليك اختيار نوع المشكلة التي تواجهها من هذه Ø§Ù„ØµÙØ­Ø©">
+<!ENTITY screenshot.remove.label "&amp;حذ٠المعلومات الحساسة">
+<!ENTITY issues.ownfilters.description "بعض الÙلاتر المطبقة على هذه Ø§Ù„ØµÙØ­Ø© من صنع المستخدم. الرجاء إلغاء ØªÙØ¹ÙŠÙ„ هذه الÙلاتر لأنها ربما تكون سبب المشكلة">
+<!ENTITY update.inProgress.description "آدبلوك بلس يحتاج لتحديث اشتراكات الÙلاتر للتأكد من أن المشكلة لم يتم إصلاحها مسبقا. الرجاء الانتظار...">
+<!ENTITY sendPage.retry.label "إرسالة مرة أخرى">
+<!ENTITY data.label "التبل&amp;يغ عن بيانات">
+<!ENTITY recentReports.label "تقاريرك المرسلة مؤخرا">
+<!ENTITY typeWarning.description "لقد أشرت إلى رغبتك بالتبليغ عن مشكلة ÙÙŠ آدبلوك بلس Ù†ÙØ³Ù‡ وليس بالÙلاتر. الرجاء الانتباه إلى أنه من Ø§Ù„Ø£ÙØ¶Ù„ التبليغ عن مثل هذه المشاكل ÙÙŠ [link]منتدى آدبلوك بلس[/link]. يجب استعمال مبلغ المشاكل Ùقط Ù„Ù„Ø¥Ø¶Ø§ÙØ© إلى مناقشة جارية أصلا لأن أحداً لن يلاحظ تقريرك إن لم تقم بوضع رابط إليه. سيتم إظهار رابط مولد لتقريرك بمجرد أن تقوم بإرسال التقرير.">
+<!ENTITY issues.disabled.description "آدبلوك بلس معطل ولن يقوم بحجب أي شيء ÙÙŠ هذه الحالة">
+<!ENTITY attachExtensions.label "إرÙ&amp;اق قائمة Ø¨Ø§Ù„Ø¥Ø¶Ø§ÙØ§Øª Ø§Ù„ÙØ¹Ø§Ù„Ø© مع التقرير">
+<!ENTITY issues.nosubscriptions.add.label "Ø¥Ø¶Ø§ÙØ© اشتراك Ùلتر">
+<!ENTITY issues.disabledfilters.enable.label "ØªÙØ¹ÙŠÙ„ Ùلتر">
+<!ENTITY issues.override.label "ال&amp;إعدادات معطلة، المتابعة بالتقرير">
+<!ENTITY issues.nosubscriptions.description "يبدو أنك لم تشترك بأي قوائم Ùلاتر جاهزة والتي ستقوم بإزالة المحتوى الغير من المواقع تلقائيا">
+<!ENTITY typeSelector.falsePositive.description "اختر هذا الخيار ان كان محتوى مهم ناقص من Ø§Ù„ØµÙØ­Ø© أو كانت Ø§Ù„ØµÙØ­Ø© تظهر بشكل خاطئ أو لا تعمل بشكل جيد. إن لم يكن باستطاعتك تحديد إن كان آدبلوك بلس هو سبب المشكلة جرب تعطيله مؤقتاً">
+<!ENTITY typeSelector.other.label "مشكلة أ&amp;خرى">
+<!ENTITY emailComment.label "نحن نشجعك لإدخال بريد إلكتروني صحيح لكي نتمكن من الاتصال بك إذا كانت هناك أسئلة.">
+<!ENTITY issues.whitelist.remove.label "إعادة ØªÙØ¹ÙŠÙ„ آدبلوك بلس على هذه Ø§Ù„ØµÙØ­Ø©">
+<!ENTITY outdatedSubscriptions.description "اشتراكات الÙلاتر التالية لم يتم تحديثها منذ أسبوعين على الأقل. الرجاء تحديث هذه الاشتراكات قبل إرسال تقرير، ربما تم إصلاح المشكلة مسبقا.">
+<!ENTITY dataCollector.description "من ÙØ¶Ù„Ùƒ انتظر بضعة دقائق ريثما يجمع آدبلوك بلس المعلومات المطلوبة">
+<!ENTITY sendButton.label "إرسا&amp;ل التقرير">
+<!ENTITY comment.label "التعلي&amp;ق (اختياري)ـ">
+<!ENTITY sendPage.errorMessage "ÙØ´Ù„ إرسال التقرير بسبب الخطأ &quot;?1?&quot;. الرجاء التأكد من صحة اتصالك بالإنترنت وإعادة المحاولة. إن استمرت المشكلة الرجاء طلب المساعدة ÙÙŠ [link]منتديات آدبلوك بلس[/link]">
+<!ENTITY showRecentReports.label "إظهار التقارير المرسلة مؤخرا">
+<!ENTITY commentPage.heading "إدخال تعليق">
+<!ENTITY update.start.label "بداية التحديث الان">
+<!ENTITY issues.disabledfilters.description "الÙلاتر التالية معطلة ولكن قد يكون لها أثر على هذه Ø§Ù„ØµÙØ­Ø© رغم ذلك">
+<!ENTITY screenshot.description "Ù†ÙØ³ Ø§Ù„ØµÙØ­Ø© قد تظهر بشكل مختل٠لأشخاص مختلÙين. قد يساعدنا Ùهم المشكلة إن قمت Ø¨Ø¥Ø±ÙØ§Ù‚ صورة لشاشتك مع تقريرك. ستستطيع حذ٠المناطق التي تحتوي معلومات حساسة وكذلك وضع علامة على المناطق التي تظهر بها المشكلة. Ù„ÙØ¹Ù„ ذلك اضغط الزر المناسب ثم اختر منطقة من الصورة باستخدام Ø§Ù„ÙØ£Ø±Ø©">
+<!ENTITY screenshot.attach.label "إر&amp;ÙØ§Ù‚ صورة Ù„Ù„ØµÙØ­Ø© مع التقرير">
+<!ENTITY issues.whitelist.description "آدبلوك بلس معطل حاليا على Ø§Ù„ØµÙØ­Ø© التي تقوم بالتبليغ عنها. الرجاء إعادة ØªÙØ¹ÙŠÙ„Ù‡ وإعادة تحميل Ø§Ù„ØµÙØ­Ø© قبل أن تقوم بإرسال التقرير للمساعدة ÙÙŠ التحقق من المشكلة">
+<!ENTITY typeSelector.falseNegative.label "آدبلوك بلس لا يقوم بحجب أحد الإ&amp;علانات">
+<!ENTITY typeSelector.heading "اختر نوع المشكلة">
+<!ENTITY anonymity.warning "لن نكون قادرين على الرجوع إليك و لن نعطي للتقرير أهمية كبيرة.">
+<!ENTITY wizard.title "مبلغ المشاكل">
+<!ENTITY issues.ownfilters.disable.label "تعطيل Ùلتر">
+<!ENTITY commentPage.description "يسمح لك الحقل التالي بإدخال تعليق ليساعدنا ÙÙŠ Ùهم المشكلة. هذه الخطوة إختيارية ولكننا نصح بها إن لم تكن المشكلة واضحة. ستستطيع أيضا مراجعة بيانات التقرير قبل إرساله">
+<!ENTITY comment.lengthWarning "طول التعليق يتجاوز 1000 حرÙ. سيتم إرسال أول 1000 حر٠Ùقط">
+<!ENTITY typeSelector.falseNegative.description "اختر هذا الخيار إن كان أحد الإعلانات ظاهرا رغم أن آدبلوك بلس Ù…ÙØ¹Ù„">
+<!ENTITY sendPage.waitMessage "الرجاء الانتظار ريثما يقوم آدبلوك بلس بإرسال تقرير">
+<!ENTITY dataCollector.heading "أهلا بك ÙÙŠ مبلغ المشاكل">
+<!ENTITY screenshot.heading "Ø¥Ø±ÙØ§Ù‚ صورة للشاشة">
+<!ENTITY sendPage.heading "إرسال التقرير">
+<!ENTITY issues.subscriptionCount.description "يبدو أنك مشترك ÙÙŠ الكثير جداً من اشتراكات الÙلاتر وهو غير Ù…ÙØ¶Ù„ لأنه قد يكون السبب ÙÙŠ المشاكل التي تعانيها. نعتذر عن قبول تقرير مشكلتك لأننا لن نستطيع تحديد الÙلتر الذي يتسبب بالمشكلة لإبلاغ مطوره. الرجاء إزالة جميع الÙلاتر وإبقاء الهام جداً منها Ùقط ثم تأكد من ذهاب المشكلة أو لا.">
+<!ENTITY screenshot.mark.label "وضع علا&amp;مة على المشكلة">
+<!ENTITY privacyPolicy.label "سياسة الخصوصية">
+<!ENTITY issues.description "قام آدبلوك بلس بتحديد مشاكل بإعداداتك قد تكون هي المسؤولة عن هذه المشكلة وسيجعل التحقق من المشكلة صعباً">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/sidebar.dtd
new file mode 100644
index 0000000..78b50fb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "إضاءة حوا٠العنصر">
+<!ENTITY address.label "العنوان">
+<!ENTITY context.open.label "ÙØªØ­ ÙÙŠ تبويب جديد">
+<!ENTITY type.label "النوع">
+<!ENTITY tooltip.filterSource.label "مصدر الÙلتر:">
+<!ENTITY noitems.label "لا عناصر محجوبة">
+<!ENTITY filter.label "الÙلتر">
+<!ENTITY tooltip.size.label "الحجم:">
+<!ENTITY reattach.label "إعادة Ø¥Ø±ÙØ§Ù‚">
+<!ENTITY search.label "بح&amp;ث">
+<!ENTITY docDomain.thirdParty "(طر٠خارجي)">
+<!ENTITY filterSource.label "Ùلترة المصدر">
+<!ENTITY tooltip.docDomain.label "مصدر الملÙ:">
+<!ENTITY context.copy.label "نسخ عنوان العنصر">
+<!ENTITY tooltip.type.label "النوع">
+<!ENTITY context.disablefilter.label "تعطيل الÙلتر ?1?">
+<!ENTITY context.copyFilter.label "نسخ الÙلتر">
+<!ENTITY context.block.label "حجب هذا العنصر">
+<!ENTITY context.enablefilter.label "إعادة ØªÙØ¹ÙŠÙ„ الÙلتر ?1?">
+<!ENTITY detach.label "ÙØµÙ„">
+<!ENTITY whitelisted.label "ØµÙØ­Ø© موثوقة">
+<!ENTITY context.disablefilteronsite.label "تعطيل هذا الÙلتر على ?1?">
+<!ENTITY detached.title "آدبلوك بلاس : العناصر المحجوبة (Ø§Ù„Ù…Ù†ÙØµÙ„Ø©)">
+<!ENTITY docDomain.firstParty "(طر٠داخلي)">
+<!ENTITY tooltip.type.whitelisted "(موثوق)">
+<!ENTITY tooltip.filter.label "الÙلتر Ø§Ù„ÙØ¹Ø§Ù„">
+<!ENTITY tooltip.filter.disabled "(معطل)">
+<!ENTITY context.editfilter.label "تعديل الÙلتر Ø§Ù„ÙØ¹Ø§Ù„">
+<!ENTITY tooltip.type.blocked "(محجوب)">
+<!ENTITY size.label "الحجم">
+<!ENTITY context.whitelist.label "Ø¥Ø¶Ø§ÙØ© قانون استثنائي إلى هذا العنصر">
+<!ENTITY context.selectAll.label "اختيار الكل">
+<!ENTITY state.label "الحالة">
+<!ENTITY docDomain.label "مصدر الملÙ">
+<!ENTITY tooltip.address.label "العنوان">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/subscriptionSelection.dtd
new file mode 100644
index 0000000..7c4938b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Ø¥Ø¶Ø§ÙØ© ا&amp;شتراك الÙلتر &quot;?1?&quot; أيضا">
+<!ENTITY list.download.failed "ÙØ´Ù„ آدبلوك بلس ÙÙŠ جلب قائمة الاشتراكات">
+<!ENTITY list.download.retry "إعادة المحاولة">
+<!ENTITY title.label "&amp;عنوان الاشتراك">
+<!ENTITY list.download.website "عرض الموقع">
+<!ENTITY supplementMessage "اشتراك الÙلتر هذا يجب أن يستخدم مع اشتراك الÙلتر &quot;?1?&quot; والذي لم تستعمله بعد">
+<!ENTITY viewList.label "عرض Ùلاتر">
+<!ENTITY visitHomepage.label "زيارة Ø§Ù„ØµÙØ­Ø© الرئيسية">
+<!ENTITY addSubscription.label "Ø¥Ø¶Ø§ÙØ© اشتراك">
+<!ENTITY dialog.title "أهلاً بك ÙÙŠ آدبلوك بلس">
+<!ENTITY location.label "&amp;موقع قائمة الÙلاتر">
+<!ENTITY fromWeb.description "الرجاء التأكد من رغبتك ÙÙŠ Ø¥Ø¶Ø§ÙØ© اشتراك الÙلتر هذا. يمكنك أن تغير عنوان أو موقع الاشتراك قبل Ø§Ø¶Ø§ÙØªÙ‡.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/composer.dtd
new file mode 100644
index 0000000..1d185af
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "в ÐºÑ€Ð°Ñ Ð½Ð° адре&amp;Ñа">
+<!ENTITY domainRestriction.label "Ог&amp;раничаване на домейн:">
+<!ENTITY collapse.default.no.label "Ползвай по подразбиране(не)">
+<!ENTITY firstParty.label "Първа Ñтрана Ñам&amp;о">
+<!ENTITY preferences.label "Покажи ÑÑŠ&amp;щеÑтвуващите филтри..">
+<!ENTITY pattern.label "ТърÑете модел">
+<!ENTITY thirdParty.label "&amp;Трети Ñтрани Ñамо">
+<!ENTITY filter.label "Ðов Филт&amp;ÑŠÑ€:">
+<!ENTITY collapse.label "Свиван&amp;е на блокирани:">
+<!ENTITY match.warning "Моделът, който Ñте въвели, вече не Ð¾Ñ‚Ð³Ð¾Ð²Ð°Ñ€Ñ Ð½Ð° адреÑа за блокиране/Ð±ÐµÐ»Ð¸Ñ ÑпиÑък и нÑма да въздейÑтвa върху него.">
+<!ENTITY anchor.start.label "в на&amp;чалото на адреÑа">
+<!ENTITY matchCase.label "Съвпадение на ре&amp;гиÑтъра">
+<!ENTITY custom.pattern.label "&amp;Избрани:">
+<!ENTITY unselectAllTypes.label "Ðе избирай нищо">
+<!ENTITY type.whitelist.label "Из&amp;ключение от правилото">
+<!ENTITY regexp.warning "Моделът който Ñте въвели ще бъде интерпретиран като регулÑрен израз, които не могат да бъдат ефективно обработени Ñ Adblock ÐŸÐ»ÑŽÑ Ð¸ могат да забавÑÑ‚ твоÑÑ‚ браузър. Ðко не възнамерÑвате да използвате регулÑрен израз, добавете звездичка (*) към ÐºÑ€Ð°Ñ Ð½Ð° модела.">
+<!ENTITY dialog.title "ДобавÑне на Adblock Plus филтър правило">
+<!ENTITY basic.label "ОÑновен изглед">
+<!ENTITY type.filter.label "&amp;Блокиране на филтър">
+<!ENTITY types.label "Прилага за типове:">
+<!ENTITY shortpattern.warning "Моделът които Ñте въвели е твърде кратък, за да бъде оптимизиран и може да забави Ð²Ð°ÑˆÐ¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÑŠÑ€. Препоръчително е да изберете по-дълъг низ за този филтър, за да позволи Adblock ÐŸÐ»ÑŽÑ Ð·Ð° по-ефективна обработка на филтъра.">
+<!ENTITY collapse.yes.label "Да">
+<!ENTITY anchors.label "Приемам Ñамо модел:">
+<!ENTITY collapse.default.yes.label "Ползвай по подразбиране(да)">
+<!ENTITY domainRestriction.help "Използвайте тази опциÑ, за да зададете една или повече облаÑти, разделени Ñ Ð±Ð°Ñ€ Ð»Ð¸Ð½Ð¸Ñ (|). Филтърът ще Ñе прилага Ñамо за избран(и) домейн(и). Ртилда (~) пред името на домейна Ñе поÑочва, че филтърът не Ñе прилага в този домейн.">
+<!ENTITY accept.label "Добави Филтър">
+<!ENTITY options.label "ÐаÑтройки">
+<!ENTITY disabled.warning "Adblock ÐŸÐ»ÑŽÑ Ðµ изключена. Ð’Ñе още можете да добавите филтри, но те нÑма да Ñе прилагат, оÑвен ако не [link]Включите Adblock ПлюÑ[/link].">
+<!ENTITY anchor.start.flexible.label "в на&amp;чалото на домейн името">
+<!ENTITY collapse.no.label "Ðе">
+<!ENTITY selectAllTypes.label "Избери вÑички">
+<!ENTITY advanced.label "Разширен изглед">
+<!ENTITY pattern.explanation "Моделът може да бъде чаÑÑ‚ от адреÑ; звездичка (*) да дейÑтва като замеÑтващи Ñимволи. Филтърът ще Ñе прилага Ñамо за адреÑите, отговарÑщи на Ð¿Ñ€ÐµÐ´Ð²Ð¸Ð´ÐµÐ½Ð¸Ñ Ð¾Ð±Ñ€Ð°Ð·ÐµÑ†.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/filters.dtd
new file mode 100644
index 0000000..28cd5e4
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Ð’Ñички ваши потребителÑки филтри ще бъде заменен от Ñъдържанието на Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð». ИÑкате ли да продължите?">
+<!ENTITY slow.column "Пока&amp;жи филтри">
+<!ENTITY enabled.column "&amp;Включен">
+<!ENTITY subscription.lastDownload.checksumMismatch "Грешка, неÑъвпадение на контролната Ñума">
+<!ENTITY noFiltersInGroup.text "Избраната група е празна">
+<!ENTITY subscription.actions.label "ДейÑтвиÑ">
+<!ENTITY filter.selectAll.label "Избери Ð’Ñички">
+<!ENTITY backupButton.label "Ðрхи&amp;вирай и ВъзÑтанови">
+<!ENTITY restore.minVersion.warning "Внимание: файлът е Ñъздаден Ñ Ð¿Ð¾-нова верÑÐ¸Ñ Ð½Ð° Adblock Plus. ТрÑбва да обновите до поÑледната верÑÐ¸Ñ Ð½Ð° Adblock Plus, преди да възÑтановите от този файл.">
+<!ENTITY restore.error "Файлът не може да Ñе обработи или не е Ñ Ð´Ð°Ð½Ð½Ð¸, може би Това не е Adblock Plus Ð°Ñ€Ñ…Ð¸Ð²Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»?">
+<!ENTITY sort.ascending.label "&amp;Ð &gt; Я Ñортиране">
+<!ENTITY sort.label "&amp;Сортирай по">
+<!ENTITY subscription.source.label "Филтър ЛиÑÑ‚">
+<!ENTITY hitcount.column "ПоÑе&amp;щениÑ">
+<!ENTITY noFilters.text "Ти нÑмаш нито един ÑобÑтвен филтър още.">
+<!ENTITY backup.custom.title "Лични филтри Ñамо">
+<!ENTITY subscription.external.label "Ъпдейтнат от друга добавка">
+<!ENTITY subscription.delete.label "Изтрий">
+<!ENTITY noGroupSelected.text "Вие трÑбва да изберете филтър група, преди тези филтри да бъдат показани.">
+<!ENTITY filter.cut.label "Изрежи">
+<!ENTITY restore.default.label "ВъзÑтанови архив от ?1?">
+<!ENTITY subscription.lastDownload.inProgress "ИзтеглÑне...">
+<!ENTITY subscriptions.tab.label "Ðбонаменти за Филтър">
+<!ENTITY sort.descending.label "&amp;Я &gt; РСортиране">
+<!ENTITY filters.remove.warning "ÐаиÑтина ли иÑкаш да изтриеш вÑички избрани филтри?">
+<!ENTITY filter.delete.label "Изтрий">
+<!ENTITY addSubscriptionAdd.label "Добави">
+<!ENTITY viewMenu.label "Изглед">
+<!ENTITY subscription.lastDownload.unknown "ÐÑма данни">
+<!ENTITY addSubscriptionCancel.label "Откажи">
+<!ENTITY subscription.enabled.label "Включен">
+<!ENTITY noSubscriptions.text "Ти не Ñи добавил никакъв абонамент за филтри. Adblock Plus нÑма да блокира
+ нищо без филтри, Ð¼Ð¾Ð»Ñ Ð¸Ð·Ð±ÐµÑ€Ð¸ &quot;Добави филтър абонаменти&quot; за да
+ добавиш нÑкакви.">
+<!ENTITY subscription.update.label "Обнови филтрите">
+<!ENTITY dialog.title "Adblock Plus ÐаÑтройки за филтър">
+<!ENTITY addFilter.label "Доб&amp;ави Филтър">
+<!ENTITY subscription.minVersion.warning "Този филтър абонамент изиÑква по-нова верÑÐ¸Ñ Ð½Ð° Adblock Plus, трÑбва да обновите до поÑледната верÑÐ¸Ñ Ð½Ð° Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Грешка, невалиден адреÑ">
+<!ENTITY backup.error "Възникна грешка при пиÑане на филтри за файла.Уверете Ñе, че файлът не е защитени или Ñе използва от друго приложение.">
+<!ENTITY filter.moveUp.label "ПремеÑти нагоре">
+<!ENTITY addGroup.label "Добави филтър &amp;група">
+<!ENTITY filter.edit.label "Промени">
+<!ENTITY subscription.showHideFilters.label "Покажи/Ñкрий филтрите">
+<!ENTITY acceptableAds2.label "ОÑтавете нÑко&amp;и не натрапчиви реклами">
+<!ENTITY addSubscriptionOther.label "Добави друг абонамент">
+<!ENTITY close.label "Затвори">
+<!ENTITY sort.none.label "&amp;ÐеÑортирани">
+<!ENTITY filter.actions.label "Филтър дейÑтвиÑ">
+<!ENTITY filter.copy.label "Копирай">
+<!ENTITY filter.moveDown.label "ПремеÑти надоло">
+<!ENTITY filter.resetHitCounts.label "РеÑтарт на Хит СтатиÑтиката">
+<!ENTITY readMore.label "Прочети повече">
+<!ENTITY subscription.moveUp.label "ПремеÑти нагоре">
+<!ENTITY addSubscription.label "Добави абонамент за &amp;филтър">
+<!ENTITY subscription.homepage.label "Лична Страница">
+<!ENTITY backup.complete.title "Ð’Ñички филтри и абонаменти">
+<!ENTITY restore.own.label "ВъзÑтанови Ñвой архив">
+<!ENTITY restore.complete.warning "Ð’Ñички ваши филтър Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð¸Ñ Ñ‰Ðµ бъдат заменени от Ñъдържанието на Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð». ИÑкате ли да продължите?">
+<!ENTITY filters.tab.label "ПотребителÑки филтри">
+<!ENTITY backup.label "Ðаправи нов архив">
+<!ENTITY find.label "&amp;Ðамери">
+<!ENTITY subscription.moveDown.label "ПремеÑти надоло">
+<!ENTITY subscription.lastDownload.connectionError "Грешка, неуÑпешно изтеглÑне">
+<!ENTITY subscription.lastDownload.success "УÑпешно">
+<!ENTITY subscription.lastDownload.invalidData "Грешка, невалиден ÑпиÑък Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸">
+<!ENTITY filter.paste.label "ПоÑтави">
+<!ENTITY subscription.disabledFilters.enable "Разреши забранените филтри">
+<!ENTITY lasthit.column "&amp;ПоÑледни ПоÑещениÑ">
+<!ENTITY subscription.editTitle.label "Промени титла">
+<!ENTITY subscription.disabledFilters.warning "ÐÑкой филтри в този абонамент Ñа забранени.">
+<!ENTITY filter.column "&amp;Филтър правило">
+<!ENTITY subscription.lastDownload.label "ПоÑледно изтеглен:">
+<!ENTITY viewList.label "Виж лиÑÑ‚">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/firstRun.properties
new file mode 100644
index 0000000..bd93321
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Сърфирайте инкогнито като забраните проÑледÑването ви - Ñъщо така прикрива вашите дейÑÑ‚Ð²Ð¸Ñ Ð¾Ñ‚ рекламните компании, които биха проÑледили вÑеки ваш ход.
+firstRun_toggle_off=Стоп
+firstRun_feature_tracking=ЗабранÑване на проÑледÑването
+firstRun_feature_malware=Блокиране на зловреден Ñофтуер
+firstRun_title=Adblock Plus е инÑталиран
+firstRun_toggle_on=Старт
+firstRun_acceptableAdsExplanation=Бихме иÑкали да наÑърчаваме уеб-Ñайтовете да използват обикновена, ненатрапчива реклама. Ето защо ние уÑтановихме <a>Ñтроги наÑоки</a>, където можете да видите кои Ñа приемливите реклами, които Ñе показват по подразбиране. Ðко вÑе още иÑкате да блокирате вÑички реклами, можете да ги <a>забраните</a> в рамките на нÑколко Ñекунди.
+firstRun_contributor_credits=Сътрудници
+firstRun_dataCorruptionWarning=Страницата продължава да Ñе показва? <a>Щракнете тук!</a>
+firstRun_acceptableAdsHeadline=ДоÑадните реклами ще бъдат блокирани
+firstRun_share=Споделете Ñ Ð¿Ñ€Ð¸Ñтелите Ñи
+firstRun_share_headline=<a>Помогнете ни</a> и направете мрежата по-добро мÑÑто
+firstRun_feature_social_description=Ðвтоматично премахва от Ñтраниците в браузъра бутоните на Ñоциалните медии, като например тези на Facebook, които Ñе поÑвÑват на нÑкои уеб Ñтраници и проÑледÑват вашето поведение.
+firstRun_filterlistsReinitializedWarning=Изглежда, че има проблем, който е изтрил вÑички филтри и не Ñме в ÑÑŠÑтоÑние да ги възÑтановим от архив. Поради тази причина Ñе наложи да нулираме Вашите филтри и наÑтройките за Приемливи реклами. МолÑ, проверете Вашите ÑпиÑъци Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸, както и наÑтройките за Приемливи реклами в <a>Adblock ÐŸÐ»ÑŽÑ Ð¾Ð¿Ñ†Ð¸Ð¸</a>.
+firstRun_feature_malware_description=Ðаправете Ñвоето Ñърфиране в Интернет по-безопаÑно чрез блокиране на зловредни домейни.
+firstRun_features=Adblock Plus може и прави повече от блокиране на реклами
+firstRun_donate=дарение
+firstRun_donate_label=Подкрепете Ð½Ð°ÑˆÐ¸Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚
+firstRun_feature_social=Премахвай бутоните на Ñоциалните мрежи
+firstRun_legacySafariWarning=Вие използвате Ñтара верÑÐ¸Ñ Ð½Ð° Safari, коÑто не Ñе поддържа от Adblock Plus. Ð’ ÑÐ»ÑƒÑ‡Ð°Ñ Adblock Plus може да не работи коректно, като е възможно да Ñе наруши работата на потребителите в нÑкои уеб Ñайтове. Ðие Ñилно препоръчваме да актуализирате Safari към верÑÐ¸Ñ 6 или по-виÑока (доÑтъпна за Mac OS X 10.8 Mountain Lion и по-виÑока), или да използвате поÑледната верÑÐ¸Ñ Ð½Ð° Mozilla Firefox, Google Chrome или Opera.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/global.properties
new file mode 100644
index 0000000..ab8ac88
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=ÐÑма блокирани позиции на текущата Ñтраница
+action3_tooltip=Щракнете за включване/изключване Adblock ПлюÑ.
+notification_antiadblock_title=Скриване на умишлените ÑъобщениÑ?
+type_label_script=Ñкрипт
+filter_elemhide_nocriteria=Ðе е зададен критерий за разпознаване на елемент за Ñкриване
+blockingGroup_title=Правила за Блокиране
+whitelisted_tooltip=Adblock ÐŸÐ»ÑŽÑ Ðµ изключен на текущата Ñтраница.
+type_label_stylesheet=интерфейÑ
+blocked_count_tooltip=?1? от ?2?
+type_label_font=шрифт
+type_label_popup=изÑкачащ прозорец
+filter_regexp_tooltip=Този филтър или е регулÑрен израз или е твърде кратък, за да Ñе оптимизира. Твърде много от тези филтри могат да забавÑÑ‚ Ñърфирането.
+action0_tooltip=Щракнете за да извадите контекÑтното меню, Ñредно щракване за включване/изключване.
+whitelisted_page=Adblock ÐŸÐ»ÑŽÑ Ð±ÐµÑˆÐµ изключен за текущата Ñтраница
+remove_group_warning=ÐаиÑтина ли иÑкате да премахнете тази група?
+action1_tooltip=Щракнете за да отворите/затворите блокираните параграфи, Ñредно щракване за включване/изключване.
+type_label_xmlhttprequest=XML заÑвка
+active_tooltip=Adblock ÐŸÐ»ÑŽÑ Ðµ включен, ?1? абонамента за филтриране и ?2? потребителÑки филтър(а) Ñе използват.
+type_label_document=документ
+type_label_object_subrequest=обект под заÑвка
+whitelistGroup_title=Изключение от правилата
+disabled_tooltip=Adblock ÐŸÐ»ÑŽÑ Ðµ изключен.
+filter_elemhide_duplicate_id=Може да бъде задаван Ñамо един ID на елемент за Ñкриване
+type_label_object=обект
+action2_tooltip=Кликнете за да отворите предпочитаниÑта, Ñредно щракване за включване/изключване.
+type_label_subdocument=рамка
+clearStats_warning=Това ще реÑтартира цÑлата ÑтатиÑтика и ще забрани броенето на филтрите. ИÑкате ли да продължите?
+notification_antiadblock_message=Този Ñайт е извеÑтен Ñ Ð¿Ð¾ÐºÐ°Ð·Ð²Ð°Ð½Ðµ на умишлени поÑÐ»Ð°Ð½Ð¸Ñ Ð¾Ñ‚ потребителите на Adblock Plus. ИÑкате ли Adblock Plus, да Ñкрие тези умишлени ÑъобщениÑ?
+blocked_count_addendum=(Ñъщо разрешени:?1?, Ñкрити: ?2?)
+subscription_invalid_location=МеÑтоположението на ÑпиÑъка Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸ или не е валиден URL или не е валидно името на файла.
+type_label_image=картинка
+remove_subscription_warning=ÐаиÑтина ли иÑкате да премахнете този абонамент?
+type_label_other=други
+mobile_menu_enable=ABP: Включване
+type_label_media=аудио/видео
+mobile_menu_disable_site=ABP: Изключване на ?1?
+elemhideGroup_title=Правила за Ñкриване на елементи
+mobile_menu_enable_site=ABP: Включване на ?1?
+type_label_elemhide=Ñкрит
+newGroup_title=Ðова група Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/overlay.dtd
new file mode 100644
index 0000000..b1efd15
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Да">
+<!ENTITY notification.button.no "&amp;Ðе">
+<!ENTITY sync.label "Син&amp;хронизирай ÐаÑтройките за Adblock Plus">
+<!ENTITY whitelist.site.label "Забрани на ?1?">
+<!ENTITY filters.label "&amp;Филтър ÐаÑтройки">
+<!ENTITY disable.label "Забрани навÑÑкъде">
+<!ENTITY objecttab.title "Блокирай">
+<!ENTITY objecttab.tooltip "Щракни тук за да блокираш този обект ÑÑŠÑ Adblock ПлюÑ">
+<!ENTITY menuitem.label "Adblock ÐŸÐ»ÑŽÑ &amp;ÐаÑтройки">
+<!ENTITY objecttabs.label "&amp;Покажи разделите за Флаш и Java">
+<!ENTITY sendReport.label "&amp;Докладване на проблем на тази Ñтраница">
+<!ENTITY whitelist.page.label "Забрани на тази Ñтраница Ñамо">
+<!ENTITY context.image.label "Adblock ПлюÑ: Блокирани Картинки">
+<!ENTITY counthits.label "Бройте &amp;филтър хитове">
+<!ENTITY opensidebar.label "Отвори &amp;блокирани предмети">
+<!ENTITY notification.button.close "&amp;Затвори">
+<!ENTITY contribute.label "Помогнете на Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock ПлюÑ">
+<!ENTITY context.frame.label "Adblock ПлюÑ:Блокирани Фреймове">
+<!ENTITY blocked.tooltip "Блокирани предмети от тази Ñтраница:">
+<!ENTITY hideplaceholders.label "Скрий контейнери на блокираните еле&amp;менти">
+<!ENTITY showinstatusbar.label "Покажи в лен&amp;тата на ÑÑŠÑтоÑнието">
+<!ENTITY sidebar.title "Блокирани предмети на тази Ñтраница">
+<!ENTITY options.label "&amp;ÐаÑтройки">
+<!ENTITY context.object.label "Adblock ПлюÑ:Блокирани Обекти">
+<!ENTITY context.removeWhitelist.label "Adblock ПлюÑ: ПуÑни за тази Ñтраница">
+<!ENTITY filters.tooltip "Ðай активни филтри:">
+<!ENTITY closesidebar.label "Затвори &amp;блокирани предмети">
+<!ENTITY showintoolbar.label "Пок&amp;ажи в лентата Ñ Ð¸Ð½Ñтрументи">
+<!ENTITY status.tooltip "СтатуÑ:">
+<!ENTITY context.media.label "Adblock ПлюÑ: Блокирани аудио/видео">
+<!ENTITY subscription.update.label "Обнови филтрите">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/sendReport.dtd
new file mode 100644
index 0000000..080b8ba
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/sendReport.dtd
@@ -0,0 +1,69 @@
+<!ENTITY screenshot.undo.label "&amp;ОтмÑна">
+<!ENTITY issues.disabledgroups.description "Следните абонаменти за филтри/групи филтри Ñа изключени. Ð’Ñе пак биха могли да имат ефект върху тази Ñтраница:">
+<!ENTITY showData.label "Показване на докладваните данни">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus блокира твърде &amp;много">
+<!ENTITY issues.change.description "Вашата ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ðµ променена. МолÑ, презаредете Ñтраницата, за да теÑтвате промените и да предÑтавите доклад, ако въпроÑÑŠÑ‚ не бъде уреден от промените.">
+<!ENTITY email.label "&amp;Ел.Поща:">
+<!ENTITY issues.openPreferences.label "Отвори наÑтройките за филтър">
+<!ENTITY sendPage.confirmation "Отчетът Ви е запазен. Можете да го намерите на ÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð°Ð´Ñ€ÐµÑ:">
+<!ENTITY copyLink.label "&amp;Копиране линк на доклада">
+<!ENTITY issues.nofilters.description "Adblock ÐŸÐ»ÑŽÑ Ð½Ðµ блокира нищо на текущата Ñтраница. ÐÐ°Ð±Ð»ÑŽÐ´Ð°Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ най-вероÑтно
+ не е Ñвързан Ñ Adblock ПлюÑ.">
+<!ENTITY sendPage.knownIssue "ДокладваниÑÑ‚ от Ð’Ð°Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ вероÑтно вече е извеÑтен. За повече информациÑ:">
+<!ENTITY typeSelector.other.description "Изберете тази наÑтройка, ако подозирате, че проблемът е Ñ Adblock Plus, а не Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸Ñ‚Ðµ му.">
+<!ENTITY issues.disabledgroups.enable.label "Включване на абонамент за филтър / група филтри">
+<!ENTITY typeWarning.override.label "Разбирам и вÑе &amp;пак иÑкам да предÑÑ‚Ð°Ð²Ñ Ð´Ð¾ÐºÐ»Ð°Ð´Ð° въпреки вÑичко">
+<!ENTITY issues.disabled.enable.label "Включи Adblock ПлюÑ">
+<!ENTITY update.fixed.description "Ðктуализациите на вашите абонаменти за филтри вероÑтно Ñа решили въпроÑа който Ñте докладвали. МолÑ, презаредете Ñтраницата и опитайте отново, Докладвайте отново, ако проблемът вÑе още го има.">
+<!ENTITY anonymous.label "&amp;Ðнонимно изпращане на информациÑ">
+<!ENTITY reloadButton.label "Пре&amp;зареждане на Ñтраницата">
+<!ENTITY recentReports.clear.label "Премах&amp;ни вÑички доклади">
+<!ENTITY typeSelector.description "Този прозорец ще ви преведе през Ñтъпките, необходими за подаване на доклад за Adblock
+ ÐŸÐ»ÑŽÑ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼. Първо, Ð¼Ð¾Ð»Ñ Ð¸Ð·Ð±ÐµÑ€ÐµÑ‚Ðµ вида на проблема, който Ñте Ñрещнали на тази Ñтраница:">
+<!ENTITY screenshot.remove.label "П&amp;ремахване на чувÑтвителните данни">
+<!ENTITY issues.ownfilters.description "ÐÑкои от филтрите, приложени на тази Ñтраница Ñа дефинирани от потребителÑ. МолÑ, деактивирайте филтрите, които може да причинÑват проблема:">
+<!ENTITY update.inProgress.description "Adblock Plus трÑбва да актуализира вашите абонаменти за филтри и да Ñе увери, че въпроÑÑŠÑ‚ не е решен вече. МолÑ, изчакайте..">
+<!ENTITY sendPage.retry.label "Изпращане отново">
+<!ENTITY data.label "&amp;Докладвани данни:">
+<!ENTITY recentReports.label "Вашите наÑкоро предÑтавените доклади">
+<!ENTITY typeWarning.description "ПоÑочили Ñте, че иÑкате да Ñъобщите за общ проблем Ñ Adblock Plus, а не проблем Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸Ñ‚Ðµ. МолÑ, обърнете внимание, че тези въпроÑи Ñа най-докладвани във [link]форума на Adblock Plus[/link]. ТрÑбва да използвате докладчика на проблеми за допълване на ÑъщеÑтвуваща диÑкуÑиÑ, тъй като никой нÑма да забележи Ð²Ð°ÑˆÐ¸Ñ Ð´Ð¾ÐºÐ»Ð°Ð´, докато не предоÑтавите връзка към него. Ðвтоматично генерирана връзка ще бъде предоÑтавена Ñлед предоÑтавÑнето на доклада.">
+<!ENTITY issues.disabled.description "Adblock Plus е изключен - нÑма да блокира нищо в неговото текущо ÑÑŠÑтоÑние.">
+<!ENTITY attachExtensions.label "Прилагане на ÑпиÑък Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ñ‚Ðµ раз&amp;ÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ ÐºÑŠÐ¼ доклада в Ñлучай че добавката причинÑва проблема">
+<!ENTITY issues.nosubscriptions.add.label "ДобавÑне на абонамент за филтър">
+<!ENTITY issues.disabledfilters.enable.label "Включи филтъра">
+<!ENTITY issues.override.label "КонфигурациÑта е &amp;правилна, продължаване Ñ Ð´Ð¾ÐºÐ»Ð°Ð´Ð°">
+<!ENTITY issues.nosubscriptions.description "Изглежда не Ñте абонирани за нÑкои от предварително направени ÑпиÑъци Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸, които автоматично премахват нежеланото Ñъдържание от Ñтраниците.">
+<!ENTITY typeSelector.falsePositive.description "Изберете тази наÑтройка, ако на Ñтраницата липÑва важно Ñъдържание, показана е некоректно или не функционира правилно. Може да определите дали Adblock ÐŸÐ»ÑŽÑ Ðµ причина за проблема, като временно го изключите.">
+<!ENTITY typeSelector.other.label "Др&amp;уг проблем">
+<!ENTITY emailComment.label "Ðие ви препоръчваме да въведете валиден емайл адреÑ, така че да можем да Ñе Ñвържем, ако има въпроÑи отноÑно Ð²Ð°ÑˆÐ¸Ñ Ð¾Ñ‚Ñ‡ÐµÑ‚. Това ще ни позволи да Ñподелим Ð²Ð°ÑˆÐ¸Ñ Ð¿Ñ€Ð¸Ð½Ð¾Ñ Ð¸ да е Ñ Ð¿Ð¾ виÑок приоритет.">
+<!ENTITY issues.whitelist.remove.label "Повторно активиране на Adblock Plus на тази Ñтраница">
+<!ENTITY outdatedSubscriptions.description "Този филтър абонамент не е бил актуализиран най-малко две Ñедмици. МолÑ, актуализирайте тези абонаменти, преди да изпратите доклад въпроÑÑŠÑ‚ може да е решен вече и да не Ñе налага да докладвате.">
+<!ENTITY dataCollector.description "МолÑ, изчакайте нÑколко Ñекунди, докато Adblock Plus Ñъбере необходимите данни.">
+<!ENTITY sendButton.label "Из&amp;пращане на доклада">
+<!ENTITY comment.label "&amp;Коментар (по избор)">
+<!ENTITY sendPage.errorMessage "Опитът за изпращане на доклада Ñе провали Ñ ÐºÐ¾Ð´ на грешка &quot;?1?&quot;. МолÑ, уверете Ñе, че Ñте Ñвързани Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð½ÐµÑ‚ и повторете. Ðко проблемът продължи, Ð¼Ð¾Ð»Ñ Ð¿Ð¾Ñ‚ÑŠÑ€Ñете помощ в [link]форума на Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Покажи наÑкоро предÑтавените доклади">
+<!ENTITY commentPage.heading "Въвеждане на коментар">
+<!ENTITY update.start.label "Започни обновÑването Ñега">
+<!ENTITY issues.disabledfilters.description "Следните филтри Ñа изключени, но въпреки това може да окажат влиÑние на тази Ñтраница:">
+<!ENTITY screenshot.description "Същата Ñтраница може да изглежда различно за различни хора. Това може да ни помогне да разберем проблема, ако прикачите Ñнимка на екрана към Ð²Ð°ÑˆÐ¸Ñ Ð´Ð¾ÐºÐ»Ð°Ð´. Можете да премахнете чаÑтите, Ñъдържащи чувÑтвителна информациÑ, както и зони, в които проблемът Ñе забелÑзва. За да направите това натиÑнете ÑÑŠÐ¾Ñ‚Ð²ÐµÑ‚Ð½Ð¸Ñ Ð±ÑƒÑ‚Ð¾Ð½ и изберете чаÑтта от изображението Ñ Ð¼Ð¸ÑˆÐºÐ°Ñ‚Ð°.">
+<!ENTITY screenshot.attach.label "Пр&amp;икачване на изображение на Ñтраницата към доклада">
+<!ENTITY issues.whitelist.description "Ð’ момента Adblock Plus е изключен за Ñтраницата, коÑто докладвате. ÐœÐ¾Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ñ€Ð°Ð¹Ñ‚Ðµ повторно
+ и презаредете Ñтраницата преди да изпратите доклада за да помогнете за откриване на проблема.">
+<!ENTITY typeSelector.falseNegative.label "Adblock ÐŸÐ»ÑŽÑ Ð½Ðµ блоки&amp;ра реклама">
+<!ENTITY typeSelector.heading "Изберете тип на проблема">
+<!ENTITY anonymity.warning "Ðие нÑма да бъдем в ÑÑŠÑтоÑние да Ñе върнем при теб и вероÑтно ще Ñвалим приоритета на на доклада най доло.">
+<!ENTITY wizard.title "Докладчик за проблеми">
+<!ENTITY issues.ownfilters.disable.label "Изключване на филтър">
+<!ENTITY commentPage.description "Полето по-долу ви позволÑва да въведете коментар да ни помогне да разберем проблема. Тази Ñтъпка не е задължителна, но Ñе препоръчва, ако проблемът не е очевиден. Можете Ñъщо да прегледате данните от доклада, преди да е изпратен.">
+<!ENTITY comment.lengthWarning "Дължината на коментара надвишава 1000 знака. Само първите 1000 знака ще бъдат изпратени.">
+<!ENTITY typeSelector.falseNegative.description "Изберете тази наÑтройка, ако Ñе показва реклама въпреки, че Adblock ÐŸÐ»ÑŽÑ Ðµ включен.">
+<!ENTITY sendPage.waitMessage "МолÑ, изчакайте докато Adblock Plus предÑÑ‚Ð°Ð²Ñ Ð’Ð°ÑˆÐ¸Ñ Ð¾Ñ‚Ñ‡ÐµÑ‚.">
+<!ENTITY dataCollector.heading "Добре дошли в докладчика за проблеми">
+<!ENTITY screenshot.heading "Прикачете екранна Ñнимка">
+<!ENTITY sendPage.heading "Изпрати доклада">
+<!ENTITY issues.subscriptionCount.description "Изглежда, че Ñте Ñе абонирали за твърде много филтри. Тази наÑтройка не Ñе препоръчва, защото ще направи вероÑтноÑтта от проблеми много по-виÑоки. Също така не може да приемем отчета за грешки защото не е ÑÑно кой филтър прави проблеми и кой автор трÑбва да предприеме дейÑтвиÑ. МолÑ, премахнете вÑички и оÑтавете Ñамо най важниÑÑ‚ филтър и пробвайте дали проблемът вÑе още ÑъщеÑтвува.">
+<!ENTITY screenshot.mark.label "&amp;Маркиране на проблема">
+<!ENTITY privacyPolicy.label "Защита на личните данни">
+<!ENTITY issues.description "Adblock Plus откри проблеми Ñ Ð²Ð°ÑˆÐ°Ñ‚Ð° конфигурациÑ, които може да причинÑват
+ този проблем или ще затрудни доклада за разÑледването.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/sidebar.dtd
new file mode 100644
index 0000000..12441c0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Рамки на флаш продукти">
+<!ENTITY address.label "ÐдреÑ">
+<!ENTITY context.open.label "Отвори в нов под прозорец">
+<!ENTITY type.label "Тип">
+<!ENTITY tooltip.filterSource.label "Източник на филтъра">
+<!ENTITY noitems.label "ÐÑма блокирани продукти">
+<!ENTITY filter.label "Филтър">
+<!ENTITY tooltip.size.label "Размер:">
+<!ENTITY reattach.label "Прикачи отново">
+<!ENTITY search.label "&amp;ТърÑи:">
+<!ENTITY docDomain.thirdParty "(трета Ñтрана)">
+<!ENTITY filterSource.label "Филтър източник">
+<!ENTITY tooltip.docDomain.label "Източник на документа:">
+<!ENTITY context.copy.label "Копирай адреÑа на продукта">
+<!ENTITY tooltip.type.label "Тип:">
+<!ENTITY context.disablefilter.label "Да изключа ли филтър ?1?">
+<!ENTITY context.copyFilter.label "Копирай филтърът">
+<!ENTITY context.block.label "Блокирай този продукт">
+<!ENTITY context.enablefilter.label "Повторно включване на филтъра ?1?">
+<!ENTITY detach.label "Отдели">
+<!ENTITY whitelisted.label "Разрешена Ñтранница">
+<!ENTITY context.disablefilteronsite.label "Да изключа ли този филтър за ?1?">
+<!ENTITY detached.title "Adblock Plus: Блокирани продукти (отделени)">
+<!ENTITY docDomain.firstParty "ОÑновни">
+<!ENTITY tooltip.type.whitelisted "(разрешен)">
+<!ENTITY tooltip.filter.label "Филтър в Ñила:">
+<!ENTITY tooltip.filter.disabled "(изключен)">
+<!ENTITY context.editfilter.label "Редактиране на филтъра в Ñила:">
+<!ENTITY tooltip.type.blocked "(блокиран)">
+<!ENTITY size.label "Размер">
+<!ENTITY context.whitelist.label "Добави изключващо правило за продукта">
+<!ENTITY context.selectAll.label "Избери вÑички">
+<!ENTITY state.label "СъÑтоÑние">
+<!ENTITY docDomain.label "Източник на документа">
+<!ENTITY tooltip.address.label "ÐдреÑ:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/subscriptionSelection.dtd
new file mode 100644
index 0000000..df9a1b7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "До&amp;бави абонамент за филтър &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock ÐŸÐ»ÑŽÑ Ð½Ðµ уÑÐ¿Ñ Ð´Ð° изтегли ÑпиÑък Ñ Ð°Ð±Ð¾Ð½Ð°Ð¼ÐµÐ½Ñ‚Ð¸.">
+<!ENTITY list.download.retry "Опитайте отново">
+<!ENTITY title.label "&amp;Заглавие на абонамента:">
+<!ENTITY list.download.website "Покажи Ñайтът">
+<!ENTITY supplementMessage "Този абонамент за филтърът е предназначен да Ñе използва Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñка за филтри &quot;?1?&quot; Които не използвате вÑе още.">
+<!ENTITY viewList.label "Покажи филтрите">
+<!ENTITY visitHomepage.label "ПоÑетете началната Ñтраница">
+<!ENTITY addSubscription.label "Добави абонамент">
+<!ENTITY dialog.title "ДобавÑне на абонамент за филтъра на Adblock ПлюÑ">
+<!ENTITY location.label "&amp;МеÑтоположение на ÑпиÑъка Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸Ñ‚Ðµ:">
+<!ENTITY fromWeb.description "МолÑ, потвърдете, че желаете да добавите този абонамент за този филтър. Може да промените заглавието или меÑтоположението преди да го добавите.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/composer.dtd
new file mode 100644
index 0000000..28e8a16
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "al &amp;final de l'adreça">
+<!ENTITY domainRestriction.label "Restringeix al &amp;domini:">
+<!ENTITY collapse.default.no.label "Utilitza per defecte (no)">
+<!ENTITY firstParty.label "N&amp;omés originals">
+<!ENTITY preferences.label "Mo&amp;stra els filtres existents...">
+<!ENTITY pattern.label "Cerca un patró">
+<!ENTITY thirdParty.label "Només de &amp;tercers">
+<!ENTITY filter.label "Filtre &amp;nou:">
+<!ENTITY collapse.label "Co&amp;l·lapsa els bloquejats:">
+<!ENTITY match.warning "El patró inserit no concorda amb l'adreça a blocar/acceptar i quedarà sense efecte.">
+<!ENTITY anchor.start.label "&amp;al començament de l'adreça">
+<!ENTITY matchCase.label "Diferen&amp;cia majúscules i minúscules">
+<!ENTITY custom.pattern.label "&amp;Personalitza:">
+<!ENTITY unselectAllTypes.label "No seleccionis res">
+<!ENTITY type.whitelist.label "E&amp;xcepció">
+<!ENTITY regexp.warning "El patró inserit serà interpretat com una expressió regular, la qual no podrà ser processada per Adblock Plus i podria comportar una ralentització de la vostra experiència de navegació. Si no volíeu emprar una expressió regular, afegiu el símbol (*) al final del patró.">
+<!ENTITY dialog.title "Afegeix una regla de filtre de l'Adblock Plus">
+<!ENTITY basic.label "Visualització bàsica">
+<!ENTITY type.filter.label "Filtre de &amp;bloqueig">
+<!ENTITY types.label "Aplicar als tipus:">
+<!ENTITY shortpattern.warning "El patró inserit és massa curt per optimitzar-lo. L'abús de patrons ralentitzaran la navegació. Es recomana una cadena de text més llarga per aquest filtre.">
+<!ENTITY collapse.yes.label "Sí">
+<!ENTITY anchors.label "Accepta només un patró:">
+<!ENTITY collapse.default.yes.label "Utilitza per defecte (sí)">
+<!ENTITY domainRestriction.help "Indica un o més dominis separats pel símbol «|». El filtre només s'aplicarà a aquests dominis. El símbol «~» abans d'un nom de domini indica que el filtre no s'ha d'aplicar en aquest domini.">
+<!ENTITY accept.label "Afegeix un filtre">
+<!ENTITY options.label "Opcions">
+<!ENTITY disabled.warning "L'Adblock Plus està actualment desactivat. Encara podeu afegir filtres però no s'aplicaran fins que no [link]activeu l'Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "al començament del &amp;nom de domini">
+<!ENTITY collapse.no.label "No">
+<!ENTITY selectAllTypes.label "Selecciona-ho tot">
+<!ENTITY advanced.label "Visualització avançada">
+<!ENTITY pattern.explanation "El patró pot ser qualsevol part de l'adreça. L'asterisc (*) serveix de comodí. El filtre només serà aplicat a adreces que concordin amb el filtre.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/filters.dtd
new file mode 100644
index 0000000..541ba03
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Tots els filtres personalitzats seràn substituits per els continguts del fitxer seleccionat. Vols seguir endavant?">
+<!ENTITY slow.column "Filtres d'aminorament (&amp;w)">
+<!ENTITY enabled.column "Activat (&amp;n)">
+<!ENTITY subscription.lastDownload.checksumMismatch "Error en la suma de verificació">
+<!ENTITY noFiltersInGroup.text "El grup seleccionat està buit.">
+<!ENTITY subscription.actions.label "Accions">
+<!ENTITY filter.selectAll.label "Selecciona-ho tot">
+<!ENTITY backupButton.label "Fe&amp;s una còpia de seguretat i restaura">
+<!ENTITY restore.minVersion.warning "Atenció : El fitxer ha estat creat amb una versió més nova d'AdBlock Plus. Hauries d'actualitzar a l'última versió de l'Adblock Plus abans de restaurar des d'aquest fitxer.">
+<!ENTITY restore.error "Les dades del fitxer no s'han pogut processar, potser aquest no és un fitxer de còpia de Seguretat de l'AdBlock Plus ?">
+<!ENTITY sort.ascending.label "Ordre &amp;A &gt; Z">
+<!ENTITY sort.label "&amp;Ordena per">
+<!ENTITY subscription.source.label "Llista de filtres">
+<!ENTITY hitcount.column "Encerts (&amp;H)">
+<!ENTITY noFilters.text "Encara no teniu cap filtre personalitzat.">
+<!ENTITY backup.custom.title "Només els filtres personalitzats">
+<!ENTITY subscription.external.label "Actualitzat per altre extensió">
+<!ENTITY subscription.delete.label "Suprimeix">
+<!ENTITY noGroupSelected.text "Necessites seleccionar un grup de filtres abans que aquests filtres puguin ser mostrats.">
+<!ENTITY filter.cut.label "Retalla">
+<!ENTITY restore.default.label "Restaura de la còpia de seguretat del ?1?">
+<!ENTITY subscription.lastDownload.inProgress "S'està baixant...">
+<!ENTITY subscriptions.tab.label "Subscripció de filtres">
+<!ENTITY sort.descending.label "Ordre &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Segur que vols eliminar tots els filtres seleccionats ?">
+<!ENTITY filter.delete.label "Suprimeix">
+<!ENTITY addSubscriptionAdd.label "Afegeix">
+<!ENTITY viewMenu.label "Visualitza">
+<!ENTITY subscription.lastDownload.unknown "N/D">
+<!ENTITY addSubscriptionCancel.label "Cancel·la">
+<!ENTITY subscription.enabled.label "Activat">
+<!ENTITY noSubscriptions.text "Encara no heu afegit cap subscripció de filtre; l'AdBlock Plus no blocarà res sense filtres. Utilitzeu l'opció &quot;Afegeix el filtre&quot; per afegir-ne.">
+<!ENTITY subscription.update.label "Actualitza els Filtres">
+<!ENTITY dialog.title "Preferències de filtre de l'AdBlock Plus">
+<!ENTITY addFilter.label "Afegeix un filt&amp;re">
+<!ENTITY subscription.minVersion.warning "Aquesta subscripció de filtre requereix una versió recent. Heu d'actualitzar l'Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Error, no és una adreça vàlida">
+<!ENTITY backup.error "Hi ha hagut un error escribint els filtres al fitxer. Assegura't que el fitxer no s'hagi escrit protegint-lo o que l'estigui fent servir una altra aplicació.">
+<!ENTITY filter.moveUp.label "Mou amunt">
+<!ENTITY addGroup.label "Afe&amp;geix un grup de filtres">
+<!ENTITY filter.edit.label "Edita">
+<!ENTITY subscription.showHideFilters.label "Mostra/amaga els filtres">
+<!ENTITY acceptableAds2.label "Permet la publ&amp;icitat no intrusiva">
+<!ENTITY addSubscriptionOther.label "Afegeix altre subscripció de filtre">
+<!ENTITY close.label "Tanca">
+<!ENTITY sort.none.label "&amp;Desordenat">
+<!ENTITY filter.actions.label "Accions de filtre">
+<!ENTITY filter.copy.label "Copia">
+<!ENTITY filter.moveDown.label "Mou avall">
+<!ENTITY filter.resetHitCounts.label "Reinicia les estadístiques">
+<!ENTITY readMore.label "Més informació">
+<!ENTITY subscription.moveUp.label "Mou amunt">
+<!ENTITY addSubscription.label "A&amp;fegeix el filtre">
+<!ENTITY subscription.homepage.label "Pàgina d'inici">
+<!ENTITY backup.complete.title "Tots els filtres i subscripcions">
+<!ENTITY restore.own.label "Restaura d'una còpia de seguretat propia">
+<!ENTITY restore.complete.warning "Totes les preferències de filtre seràn substituides amb els continguts del fitxer seleccionat. Vols seguir endavant?">
+<!ENTITY filters.tab.label "Filtres personalitzats">
+<!ENTITY backup.label "Crea una nova còpia de seguretat">
+<!ENTITY find.label "&amp;Cerca">
+<!ENTITY subscription.moveDown.label "Mou avall">
+<!ENTITY subscription.lastDownload.connectionError "Error en la baixada">
+<!ENTITY subscription.lastDownload.success "Correcte">
+<!ENTITY subscription.lastDownload.invalidData "Error, no és una llista vàlida de filtres">
+<!ENTITY filter.paste.label "Enganxa">
+<!ENTITY subscription.disabledFilters.enable "Habilita els filtres">
+<!ENTITY lasthit.column "U&amp;ltim encert">
+<!ENTITY subscription.editTitle.label "Edita el títol">
+<!ENTITY subscription.disabledFilters.warning "Alguns filtres d'aquesta subscripció no estan habilitats.">
+<!ENTITY filter.column "Regla de &amp;filtre">
+<!ENTITY subscription.lastDownload.label "Darrera baixada">
+<!ENTITY viewList.label "Mostra la llista">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/firstRun.properties
new file mode 100644
index 0000000..2eac957
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Navegar de forma privada mitjançant la desactivació del seguiment – amagant el vostre rastre a les companyies de publicitat, que us seguirien encara més.
+firstRun_toggle_off=DESACTIVAT
+firstRun_feature_tracking=Desactivar el seguiment
+firstRun_feature_malware=Bloqueig de programari maliciós
+firstRun_title=S'ha instal·lat l'AdBlock Plus
+firstRun_toggle_on=ACTIVAT
+firstRun_acceptableAdsExplanation=Ens agradaria encoratjar els llocs web a utlitzar d'ara en endavant, publicitat no intrusiva. És per això que hem establert uns <a>patrons estrictes</a> per identificar els anuncis acceptables, els quals es mostren a sota de les preferències per defecte. Si encara voleu bloquejar tots els anuncis podeu <a>desactivar</a> això en pocs segons.
+firstRun_contributor_credits=Crèdits de contribució
+firstRun_dataCorruptionWarning=Es segueix mostrant aquesta pàgina? <a>Cliqueu aquí!</a>
+firstRun_acceptableAdsHeadline=Els anuncis molestos ara es bloquejaran
+firstRun_share=Digueu-ho a les vostres amistats
+firstRun_share_headline=<a>Dóneu-nos un cop de mà</a> al fer la xarxa un lloc millor
+firstRun_feature_social_description=Eliminar automàticament de la vostra experència de navegació els botons socials, com el m'agrada de Facebook, que apareixen a les pàgines web i segueixen el vostre comportament.
+firstRun_filterlistsReinitializedWarning=Sembla que un problema ha causat que tots els filtres es suprimeixin, però hem pogut restaurar una còpia de seguretat. Durant aquest procés, també s'ha restaurat els filtres i la configuració d'anuncis acceptable. Verifiqueu que la configuració actual és la desitjada, mitjançant les <a>«Preferències del filtre»</a> de l'Adblock Plus.
+firstRun_feature_malware_description=Fer la vostra navegació més segura bloquejant els dominis de malware coneguts.
+firstRun_features=Adblock Plus pot fer molt més que bloquejar anuncis
+firstRun_donate=Feu un donatiu
+firstRun_donate_label=Recolzeu el nostre projecte
+firstRun_feature_social=Eliminar els botons de xarxes socials
+firstRun_legacySafariWarning=Estàs usant una versió antiga de Safari que no es troba suportada per Adblock Plus.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/global.properties
new file mode 100644
index 0000000..1145e04
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=La pàgina actual no conté elements bloquejables
+action3_tooltip=Clica per activar/desactivar Adblock Plus
+notification_antiadblock_title=Amagar missatges dirigits?
+type_label_script=script
+filter_elemhide_nocriteria=Cap criteri especificat per reconeixes l'element a amagar
+blockingGroup_title=Regles de blocatge d'anuncis
+whitelisted_tooltip=Adblock Plus està actiu però desactivat en la pàgina actual
+type_label_stylesheet=llista d'estils
+blocked_count_tooltip=?1? de ?2?
+type_label_font=Tipus de lletra
+type_label_popup=finestra emergent
+filter_regexp_tooltip=El filtre és una expressió regular o és massa curt per ser optimitzat. Massa d'aquests filtres poden alentir la vostra navegació.
+action0_tooltip=Clica per activar el menu contextual, clica amb el botó del mig per activar/desactivar.
+whitelisted_page=Adblock Plus ha estat desactivat per la pàgina actual
+remove_group_warning=Segur que vols eliminar aquest grup ?
+action1_tooltip=Clica per obrir/tancar els elements bloquejables, clica amb el botó del mig per activar/desactivar.
+type_label_xmlhttprequest=Petició XML
+active_tooltip=Adblock Plus està habilitat, ?1? subscripció (ns) de filtre i ?2? filtre personalitzats(s) en ús.
+type_label_document=document
+type_label_object_subrequest=Subpetició d'objecte
+whitelistGroup_title=Regles d'excepció
+disabled_tooltip=Adblock Plus està desactivat
+filter_elemhide_duplicate_id=Només un identificador de l'element pot ser especificat
+type_label_object=objecte
+action2_tooltip=Clica per obrir les preferències, clica amb el botó del mig per activar/desactivar.
+type_label_subdocument=marc
+clearStats_warning=Això reiniciarà totes les estadístiques d'ús del filtre.Vols procedir?
+notification_antiadblock_message=Aquesta web ha sigut coneguda per mostrar missatges dirigits a usuaris de Adblock Plus. Vols que Adblock Plus amague els missatges dirigits?
+blocked_count_addendum=(també a la llista blanca: ?1?, amagats: ?2?)
+subscription_invalid_location=La llista de filtres no és una URL vàlida ni un nom de fitxer vàlid.
+type_label_image=imatge
+remove_subscription_warning=Realment desitges eliminar aquesta subscripció?
+type_label_other=Un altre
+mobile_menu_enable=ABP : Activa
+type_label_media=àudio/vídeo
+mobile_menu_disable_site=ABP : Desactiva a ?1?
+elemhideGroup_title=Regles d'amagar elements
+mobile_menu_enable_site=ABP : Activa a ?1?
+type_label_elemhide=amagat
+newGroup_title=Nou grup de filtres
+default_dialog_title=AdBlock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/overlay.dtd
new file mode 100644
index 0000000..fc91e9e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Si">
+<!ENTITY notification.button.no "&amp;No">
+<!ENTITY sync.label "&amp;Sincronitza la configuració de l'AdBlock Plus">
+<!ENTITY whitelist.site.label "Inhabilita l'Adblock Plus a ?1?">
+<!ENTITY filters.label "&amp;Preferències del filtre">
+<!ENTITY disable.label "Inhabilita a tots els llocs">
+<!ENTITY objecttab.title "Bloca">
+<!ENTITY objecttab.tooltip "Feu clic aquí per blocar aquest objecte amb l'Adblock Plus">
+<!ENTITY menuitem.label "Preferències de l'Ad&amp;block Plus">
+<!ENTITY objecttabs.label "Mostra les &amp;pestanyes a Flash i Java">
+<!ENTITY sendReport.label "&amp;Informa sobre la pàgina">
+<!ENTITY whitelist.page.label "Inhabilita només en aquesta pàgina">
+<!ENTITY context.image.label "Adblock Plus: bloca la imatge">
+<!ENTITY counthits.label "Compta els cops que &amp;funciona el filtre">
+<!ENTITY opensidebar.label "Obre &amp;elements blocables">
+<!ENTITY notification.button.close "&amp;Tancar">
+<!ENTITY contribute.label "Contribueix a l'Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: bloca el marc">
+<!ENTITY blocked.tooltip "Elements bloquejats en aquesta pàgina:">
+<!ENTITY hideplaceholders.label "Amaga &amp;les localitzacions dels elements blocats">
+<!ENTITY showinstatusbar.label "Mostra a la barra d'&amp;estat">
+<!ENTITY sidebar.title "Elements blocables a la pàgina actual">
+<!ENTITY options.label "&amp;Opcions">
+<!ENTITY context.object.label "Adblock Plus: bloca l'objecte">
+<!ENTITY context.removeWhitelist.label "Adblock Plus:Rehabilita aquesta pàgina">
+<!ENTITY filters.tooltip "Filtres més actius:">
+<!ENTITY closesidebar.label "Tanca els elements &amp;blocables">
+<!ENTITY showintoolbar.label "Mostra a la &amp;barra d'eines">
+<!ENTITY status.tooltip "Estat:">
+<!ENTITY context.media.label "Adblock Plus: Bloqueja àudio/vídeo">
+<!ENTITY subscription.update.label "Actualitza els Filtres">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/sendReport.dtd
new file mode 100644
index 0000000..049bb72
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Des&amp;fés">
+<!ENTITY issues.disabledgroups.description "Els següents filtres/grups de filtres als quals estàs subscrits estan deshabilitats, tot i així podrien tenir algun efecte en aquesta pàgina:">
+<!ENTITY showData.label "Mostra les dades de l'informe">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus està bloquejant &amp;massa">
+<!ENTITY issues.change.description "Si us plau, torna a carregar la pàgina per provar els canvis i envia un informe si el problema no ha estat resolt per les alteracions.">
+<!ENTITY email.label "&amp;Email:">
+<!ENTITY issues.openPreferences.label "Obre les preferències del filtre">
+<!ENTITY sendPage.confirmation "El teu informe ha estat guardat. Pots accedir a la següent adreça:">
+<!ENTITY copyLink.label "&amp;Copia enllaç de l'informe">
+<!ENTITY issues.nofilters.description "L'Adblock Plus no està filtrant res a la pàgina actual. Segurament el problema no està relacionat amb l'Adblock Plus.">
+<!ENTITY sendPage.knownIssue "El problema del que informes probablement ja es coneix. Més informació:">
+<!ENTITY typeSelector.other.description "Selecciona aquesta opció si creieu que hi ha un error amb l'Adblock Plus que no sigui amb els filtres.">
+<!ENTITY issues.disabledgroups.enable.label "Activa filtre de subscripció / filtre de grup">
+<!ENTITY typeWarning.override.label "Ho entenc i vull pre&amp;sentar l'informe de totes maneres">
+<!ENTITY issues.disabled.enable.label "Habilita l'Adblock Plus">
+<!ENTITY update.fixed.description "L'error s'ha solucionat actualitzant els filtres existents. Torneu a carregar la pàgina i verifiqueu novament. Si el problema persisteix, envieu altre avís.">
+<!ENTITY anonymous.label "Envi&amp;ament de forma anònima">
+<!ENTITY reloadButton.label "Ac&amp;tualitza pàgina">
+<!ENTITY recentReports.clear.label "&amp;Suprimeix tots els informes">
+<!ENTITY typeSelector.description "Aquest assistent us mostrarà com enviar un Avís d'error de l'Adblock Plus. Primer seleccioneu el tipus d'error que heu trobat:">
+<!ENTITY screenshot.remove.label "Sup&amp;rimeix dades privades">
+<!ENTITY issues.ownfilters.description "Els filtres aplicats en aquesta pàgina poden ser definits per l'usuari/a. Inhabiliteu els filtres que poden causar el problema:">
+<!ENTITY update.inProgress.description "L'Adblock Plus ha d'actualitzar les subscripcions dels filtres per verificar si es pot resoldre d'aquesta manera. Espereu...">
+<!ENTITY sendPage.retry.label "Envia de nou">
+<!ENTITY data.label "Informe &amp;de dades:">
+<!ENTITY recentReports.label "Informes que heu enviat">
+<!ENTITY typeWarning.description "Has indicat que desitges informar d'algun problema general amb Adblock Plus més que d'un problema amb els filtres. Tingues en compte que aquests informes són els més complets al [link]fòrum d'Adblock Plus[/link]. Només hauries d'usar l'avisador a menys que vulguis completar una discussió existent, ja que ningú es donarà compte del teu informe si no se'ls proporciona l'enllaç al mateix. L'enllaç generat automàticament es concedirà després de la presentació de l'informe.">
+<!ENTITY issues.disabled.description "S'ha inhabilitat l'Adblock Plus i no filtrarà la publicitat no desitjada.">
+<!ENTITY attachExtensions.label "Adjunta una llista d'e&amp;xtensions actives per a l'informe en cas de que el conflicte amb les extensions sigui la causa del problema">
+<!ENTITY issues.nosubscriptions.add.label "Afegeix la subscripció a un filtre">
+<!ENTITY issues.disabledfilters.enable.label "Activa el filtre">
+<!ENTITY issues.override.label "La &amp;configuració és correcta, continua amb l'informe">
+<!ENTITY issues.nosubscriptions.description "No us heu subscrit a cap llista de filtres prefabricats per filtrar automàticament el contingut no desitjat de les pàgines web.">
+<!ENTITY typeSelector.falsePositive.description "Seleccioneu aquesta opció si a la pàgina manca contingut important, es mostra de forma incorrecta funciona deficientment. Podeu determinar si l'Adblock Plus és la causa del problema inhabilitant-lo temporalment.">
+<!ENTITY typeSelector.other.label "Altr&amp;es errors">
+<!ENTITY emailComment.label "Recomanem donar una adreça de correu electrònic vàlida per tal de contactar amb vostè si sorgeixen algunes preguntes sobre el vostre informe. També ens permetrà reconéixer les vostres contribucions i prioritzar-les.">
+<!ENTITY issues.whitelist.remove.label "Torna a habilitar l'Adblock Plus en aquesta pàgina">
+<!ENTITY outdatedSubscriptions.description "Aquestes subscripcions a filtres no s'han actualitzat en un mínim de dues setmanes i estan obsoletes. Actualitzeu-les abans d'informar d'un error, atès que ja podria estar solucionat.">
+<!ENTITY dataCollector.description "L'Adblock Plus està analitzant les dades. Espereu...">
+<!ENTITY sendButton.label "E&amp;nvia informe">
+<!ENTITY comment.label "&amp;Comentari (opcional):">
+<!ENTITY sendPage.errorMessage "Ha fallat un intent d'enviar l'informe d'error amb codi d'error &quot;?1?&quot;. Assegura't que estàs connectat/da a Internet i torna a intentar-ho. Si el problema persisteix, si us plau demana assistència al [link]fòrum d'Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Mostra els informes enviats recentment">
+<!ENTITY commentPage.heading "Escriu un comentari">
+<!ENTITY update.start.label "Actualitza ara">
+<!ENTITY issues.disabledfilters.description "Els següents filtres estan desactivats, però, podrien tenir un efecte en aquesta pàgina:">
+<!ENTITY screenshot.description "La mateixa pàgina pot ser diferent per a diferents persones. Pot ajudar-nos a entendre el problema si s'adjunta una captura de pantalla per a l'informe. Pots treure seccions que contenen informació confidencial, així com remarcar les zones on el problema és evident. Per a això fes clic al botó corresponent i selecciona una secció de la imatge amb el ratolí.">
+<!ENTITY screenshot.attach.label "Adjun&amp;ta una imatge de la pàgina amb l'informe">
+<!ENTITY issues.whitelist.description "L'Adblock Plus està desactivat per aquesta pàgina. Habiliteu-lo i verifiqueu si el problema continua abans d'enviar un informe d'error per aquest motiu.">
+<!ENTITY typeSelector.falseNegative.label "L'&amp;Adblock Plus no bloca un anunci">
+<!ENTITY typeSelector.heading "Seleccioneu el tipus d'incidència">
+<!ENTITY anonymity.warning "No podrem contestar-lo i segurament, no el prioritzarem.">
+<!ENTITY wizard.title "Avisador d'errors">
+<!ENTITY issues.ownfilters.disable.label "inhabilita el filtre">
+<!ENTITY commentPage.description "El camp de text a continuació et permet introduir un comentari que ens ajudi a comprendre el problema.Aquest pas és opcional però es recomana si el problema no és obvi.També pots revisar les dades de l'informe abans d'enviar.">
+<!ENTITY comment.lengthWarning "La longitud del teu comentari supera els 1000 caràcters. Només s'enviaran els primers 1000 caràcters.">
+<!ENTITY typeSelector.falseNegative.description "Seleccioneu aquesta opció si un anunci es mostra tot i que l'Adblock Plus està habilitat.">
+<!ENTITY sendPage.waitMessage "Espera mentre Adblock Plus fa l'enviament del teu informe.">
+<!ENTITY dataCollector.heading "Us donem la benvinguda a l'Avisador d'errors">
+<!ENTITY screenshot.heading "Adjunta Captura de pantalla">
+<!ENTITY sendPage.heading "Envia informe">
+<!ENTITY issues.subscriptionCount.description "Ja us heu subscrit a molts filtres. Aquesta configuració no és recomanable perquè podria augmentar el nombre d'errors. L'informe no serà enviat fins no verifiqueu que l'error és degut a un filtre. Inhabiliteu totes les subscripcions i comproveu afegint una subscripció alhora que l'error realment pertany a un filtre determinat.">
+<!ENTITY screenshot.mark.label "&amp;Marca el problema">
+<!ENTITY privacyPolicy.label "Política de Privadesa">
+<!ENTITY issues.description "L'Adblock Plus ha detectat problemes amb la configuració i podria ser la causa del problema o d'una anàlisi errònia.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/sidebar.dtd
new file mode 100644
index 0000000..e68a983
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Pampallugueja les vores de l'element">
+<!ENTITY address.label "Adreça">
+<!ENTITY context.open.label "Obre en una pestanya nova">
+<!ENTITY type.label "Tipus">
+<!ENTITY tooltip.filterSource.label "Filtre d'origen:">
+<!ENTITY noitems.label "Elements no bloquejables">
+<!ENTITY filter.label "Filtre">
+<!ENTITY tooltip.size.label "Mida:">
+<!ENTITY reattach.label "Reenganxa">
+<!ENTITY search.label "&amp;Cerca:">
+<!ENTITY docDomain.thirdParty "(tercers)">
+<!ENTITY filterSource.label "Filtre d'origen">
+<!ENTITY tooltip.docDomain.label "Font del document:">
+<!ENTITY context.copy.label "Copia l'adreça de l'element">
+<!ENTITY tooltip.type.label "Tipus:">
+<!ENTITY context.disablefilter.label "Inhabilita el filtre ?1?">
+<!ENTITY context.copyFilter.label "Copia el filtre">
+<!ENTITY context.block.label "Bloqueja aquest element">
+<!ENTITY context.enablefilter.label "Reactiva el filtre ?1?">
+<!ENTITY detach.label "Separa">
+<!ENTITY whitelisted.label "Pàgina a la llista de permesos">
+<!ENTITY context.disablefilteronsite.label "Inhabilita aquest filtre a ?1?">
+<!ENTITY detached.title "AdBlock Plus: Elements Blocables (Separat)">
+<!ENTITY docDomain.firstParty "(primers)">
+<!ENTITY tooltip.type.whitelisted "(a la llista de permesos)">
+<!ENTITY tooltip.filter.label "Filtre actiu">
+<!ENTITY tooltip.filter.disabled "(inhabilitat)">
+<!ENTITY context.editfilter.label "Edita el filtre actiu">
+<!ENTITY tooltip.type.blocked "(bloquejat)">
+<!ENTITY size.label "Mida">
+<!ENTITY context.whitelist.label "Afegeix una regla d'excepció per a l'element">
+<!ENTITY context.selectAll.label "Selecciona-ho tot">
+<!ENTITY state.label "Estat">
+<!ENTITY docDomain.label "Font del document">
+<!ENTITY tooltip.address.label "Adreça:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/subscriptionSelection.dtd
new file mode 100644
index 0000000..a3b3ef3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Afegeix la &amp;subscripció de filtre «?1?»">
+<!ENTITY list.download.failed "L'Adblock Plus ha fallat en trobar la llista de subscripcions.">
+<!ENTITY list.download.retry "Torna-ho a provar">
+<!ENTITY title.label "&amp;Títol de la subscripció:">
+<!ENTITY list.download.website "Vés a la pàgina web">
+<!ENTITY supplementMessage "Aquesta subscripció de filtre s'ha d'utilitzar amb «?1?» que encara no feu servir.">
+<!ENTITY viewList.label "Mostra els filtres">
+<!ENTITY visitHomepage.label "Vés a la pàgina web">
+<!ENTITY addSubscription.label "Afegeix una subscripció">
+<!ENTITY dialog.title "Afegeix la subscripció de filtre per a Adblock Plus">
+<!ENTITY location.label "&amp;Filtra la localització de la llista:">
+<!ENTITY fromWeb.description "Confirmeu que voleu afegir aquesta subscripció de filtre. Podeu canviar el títol de la subscripció o la localització abans d'afegir-la.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/composer.dtd
new file mode 100644
index 0000000..a01b809
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "na &amp;konci adresy">
+<!ENTITY domainRestriction.label "Omezit na &amp;doménu:">
+<!ENTITY collapse.default.no.label "Použít jako výchozí (ne)">
+<!ENTITY firstParty.label "Pouze vl&amp;astní filtry">
+<!ENTITY preferences.label "Zobrazit &amp;existující filtry...">
+<!ENTITY pattern.label "Vyhledat vzor">
+<!ENTITY thirdParty.label "Pouze fil&amp;try třetích stran">
+<!ENTITY filter.label "Nový &amp;filtr:">
+<!ENTITY collapse.label "M&amp;inimalizovat blokované objekty:">
+<!ENTITY match.warning "Vzor, který jste zadali, už neodpovídá adrese, kterou chcete zablokovat/povolit a nebude na ni tedy mít žádný úÄinek.">
+<!ENTITY anchor.start.label "na &amp;zaÄátku adresy">
+<!ENTITY matchCase.label "&amp;Rozlišovat velikost písmen">
+<!ENTITY custom.pattern.label "Vlast&amp;ní:">
+<!ENTITY unselectAllTypes.label "Zrušit výběr">
+<!ENTITY type.whitelist.label "&amp;Výjimka">
+<!ENTITY regexp.warning "Vzor, který jste zadali, bude interpretován jako regulární výraz. Mnoho regulárních výrazů může zpomalit vaše prohlížení stránek. Pokud jste nechěli použít regulární výraz, přidejte znak * na konec vzoru.">
+<!ENTITY dialog.title "Přidat pravidlo filtru Adblock Plus">
+<!ENTITY basic.label "Základní zobrazení">
+<!ENTITY type.filter.label "&amp;Blokující filtr">
+<!ENTITY types.label "Použít na typy:">
+<!ENTITY shortpattern.warning "Vzor, který jste zadali, je příliÅ¡ krátký, aby mohl být optimalizován. Mnoho takových výrazů může zpomalit vaÅ¡e prohlížení stránek. Je doporuÄeno, abyste pro tento filtr zadali delší Å™etÄ›zec.">
+<!ENTITY collapse.yes.label "Ano">
+<!ENTITY anchors.label "Povolit vzor pouze:">
+<!ENTITY collapse.default.yes.label "Použít jako výchozí (ano)">
+<!ENTITY domainRestriction.help "Zadejte jednu nebo více domén oddělených znakem &quot;|&quot;, filtr bude poté použit pouze na těchto doménách. Znak &quot;~&quot; před názvem domény zajistí, že filtr nebude na této doméně použit.">
+<!ENTITY accept.label "Přidat filtr">
+<!ENTITY options.label "Možnosti">
+<!ENTITY disabled.warning "Adblock Plus je momentálně zakázán. I tak můžete přidávat filtry, ale nebudou použity, dokud [link]nepovolíte Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "na &amp;zaÄátku názvu domény">
+<!ENTITY collapse.no.label "Ne">
+<!ENTITY selectAllTypes.label "Vybrat vše">
+<!ENTITY advanced.label "PokroÄilé zobrazení">
+<!ENTITY pattern.explanation "Vzor může být jakákoli Äást adresy, znak * funguje jako jakýkoliv text. Filtr bude aplikován pouze na adresy odpovídající vzoru.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/filters.dtd
new file mode 100644
index 0000000..d91d351
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "VÅ¡echny vaÅ¡e vlastní filtry budou nahrazeny obsahem vybraného souboru. Chcete pokraÄovat?">
+<!ENTITY slow.column "Po&amp;malé filtry">
+<!ENTITY enabled.column "Po&amp;volené">
+<!ENTITY subscription.lastDownload.checksumMismatch "Chyba, neodpovídá kontrolní souÄet">
+<!ENTITY noFiltersInGroup.text "Vybraná skupina je prázdná">
+<!ENTITY subscription.actions.label "Akce">
+<!ENTITY filter.selectAll.label "Vybrat vše">
+<!ENTITY backupButton.label "Zál&amp;ohování a obnova">
+<!ENTITY restore.minVersion.warning "Varování: Soubor byl vytvoÅ™en novÄ›jší verzí Adblocku Plus. MÄ›li byste jej aktualizovat na nÄ›jnovÄ›jší verzi, než budete pokraÄovat.">
+<!ENTITY restore.error "Data ze souboru nelze zpracovat, možná nejde o zálohu filtrů Adblocku Plus?">
+<!ENTITY sort.ascending.label "VzestupnÄ› (&amp;A-Z)">
+<!ENTITY sort.label "&amp;Seřadit podle">
+<!ENTITY subscription.source.label "Seznam filtrů">
+<!ENTITY hitcount.column "Zása&amp;hy">
+<!ENTITY noFilters.text "Nemáte žádné vlastnoruÄnÄ› vytvoÅ™ené filtry.">
+<!ENTITY backup.custom.title "Pouze vlastní filtry">
+<!ENTITY subscription.external.label "Aktualizováno jiným rozšířením">
+<!ENTITY subscription.delete.label "Smazat">
+<!ENTITY noGroupSelected.text "Musíte vybrat skupinu filtrů, aby byly zobrazeny nějaké filtry.">
+<!ENTITY filter.cut.label "Vyjmout">
+<!ENTITY restore.default.label "Obnovit ze zálohy z ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Stahuji...">
+<!ENTITY subscriptions.tab.label "Odebírané sady cizích filtrů">
+<!ENTITY sort.descending.label "SestupnÄ› (&amp;Z-A)">
+<!ENTITY filters.remove.warning "Opravdu chcete odebrat všechny vybrané filtry?">
+<!ENTITY filter.delete.label "Smazat">
+<!ENTITY addSubscriptionAdd.label "Přidat">
+<!ENTITY viewMenu.label "Zobrazit">
+<!ENTITY subscription.lastDownload.unknown "neznámo">
+<!ENTITY addSubscriptionCancel.label "Zrušit">
+<!ENTITY subscription.enabled.label "Povoleno">
+<!ENTITY noSubscriptions.text "Zatím jste nezaÄali odebírat žádnou sadu cizích filtrů. Adblock Plus nebude blokovat nic bez nastavených filtrů, použijte prosím &quot;PÅ™idat cizí filtry&quot;, abyste nÄ›jaké pÅ™idali.">
+<!ENTITY subscription.update.label "Aktualizovat filtry">
+<!ENTITY dialog.title "Předvolby filtrů Adblocku Plus">
+<!ENTITY addFilter.label "&amp;Přidat filtr">
+<!ENTITY subscription.minVersion.warning "Tato cizí sada filtrů vyžaduje novější verzi Adblocku Plus, měli byste jej aktualizovat na nejnovější verzi.">
+<!ENTITY subscription.lastDownload.invalidURL "Chyba, toto je nekorektní adresa.">
+<!ENTITY backup.error "Došlo k chybě při zápisu filtrů do souboru. Ujistěte se prosím, že soubor není chráněn proti zápisu nebo používán jinou aplikací.">
+<!ENTITY filter.moveUp.label "Posunout nahoru">
+<!ENTITY addGroup.label "Přidat &amp;skupinu filtrů">
+<!ENTITY filter.edit.label "Upravit">
+<!ENTITY subscription.showHideFilters.label "Zobrazit/skrýt filtry">
+<!ENTITY acceptableAds2.label "Povolit &amp;některé nerušivé reklamy">
+<!ENTITY addSubscriptionOther.label "Přidat další sadu cizích filtrů">
+<!ENTITY close.label "Zavřít">
+<!ENTITY sort.none.label "&amp;Neřadit">
+<!ENTITY filter.actions.label "Akce filtrů">
+<!ENTITY filter.copy.label "Kopírovat">
+<!ENTITY filter.moveDown.label "Posunout dolů">
+<!ENTITY filter.resetHitCounts.label "Vynulovat statistiku zásahů">
+<!ENTITY readMore.label "Zjistit více">
+<!ENTITY subscription.moveUp.label "Posunout nahoru">
+<!ENTITY addSubscription.label "Přidat cizí &amp;filtry">
+<!ENTITY subscription.homepage.label "Domovská stránka">
+<!ENTITY backup.complete.title "Všechny filtry a sady cizích filtrů">
+<!ENTITY restore.own.label "Obnovit z vlastní zálohy">
+<!ENTITY restore.complete.warning "VÅ¡echny vaÅ¡e pÅ™edvolby budou nahrazeny obsahem vybraného souboru. Chcete pokraÄovat?">
+<!ENTITY filters.tab.label "Vlastní filtry">
+<!ENTITY backup.label "Vytvořit novou zálohu">
+<!ENTITY find.label "Na&amp;jít">
+<!ENTITY subscription.moveDown.label "Posunout dolů">
+<!ENTITY subscription.lastDownload.connectionError "Chyba, nepodařilo se stáhnout soubor">
+<!ENTITY subscription.lastDownload.success "Úspěch">
+<!ENTITY subscription.lastDownload.invalidData "Chyba, stažený soubor není souborem filtrů Adblock Plus">
+<!ENTITY filter.paste.label "Vložit">
+<!ENTITY subscription.disabledFilters.enable "Povolit zakázané filtry">
+<!ENTITY lasthit.column "Pos&amp;lední zásah">
+<!ENTITY subscription.editTitle.label "Upravit název">
+<!ENTITY subscription.disabledFilters.warning "Některé filtry v této sadě jsou zakázány.">
+<!ENTITY filter.column "&amp;Pravidlo filtru">
+<!ENTITY subscription.lastDownload.label "Naposledy staženo:">
+<!ENTITY viewList.label "Zobrazit seznam">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/firstRun.properties
new file mode 100644
index 0000000..d71aea6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Zakázáním sledování si zachovejte soukromí pÅ™i prohlížení - zakryjte své stopy pÅ™ed reklamními spoleÄnostmi, které by jinak sladovali každiÄký Váš pohyb.
+firstRun_toggle_off=VYPNUTO
+firstRun_feature_tracking=Zakázat sledování
+firstRun_feature_malware=Blokování malware
+firstRun_title=Adblock Plus byl nainstalován
+firstRun_toggle_on=ZAPNUTO
+firstRun_acceptableAdsExplanation=Rádi bychom podpoÅ™ili webové stránky v používání jasné neobtěžující reklamy. Proto jsme zavedli <a>přísná pravidla</a> k urÄení pÅ™ijatelných reklam, které se pak ve výchozím nastavení zobrazují . Pokud pÅ™esto chcete blokovat veÅ¡kerou reklamu, můžete toto bÄ›hem chvilky <a>zakázat</a>.
+firstRun_contributor_credits=Zásluhy přispěvatelů
+firstRun_dataCorruptionWarning=Neustále se Vám tato stránka znovu zobrazuje? <a>Klikněte zde!</a>
+firstRun_acceptableAdsHeadline=Otravné reklamy budou nyní blokovány
+firstRun_share=Řekněte svým přátelům
+firstRun_share_headline=<a>Pomožte nám</a> uÄinit web lepším
+firstRun_feature_social_description=Automaticky zbavte své surfování od tlaÄítek sociálních médií, jako například Facebook "To se mi líbí", která se objevují na webových stránkách a sledují VaÅ¡e chování.
+firstRun_filterlistsReinitializedWarning=Zdá se, že nastal problém, který způsobil smazání všech filtrů a nebyli jsme schopni je obnovit ze zálohy. Museli jsme tudíž Vaše filtry a nastavení Přijatelných reklam resetovat. Prosím zkontrolujte si své nastavení seznamů filtrů a Přijatelných reklam v <a>předvolbách Adblocku Plus</a>.
+firstRun_feature_malware_description=Blokováním známých malwarových domén uÄiňte VaÅ¡e prohlížení webu bezpeÄnÄ›jším.
+firstRun_features=Adblock Plus toho umí více než jen blokovat reklamy
+firstRun_donate=přispějte
+firstRun_donate_label=Podpořte náš projekt
+firstRun_feature_social=Odstranit tlaÄítka sociálních médií
+firstRun_legacySafariWarning=Používáte starou verzi Safari, která není podporovaná Adblockem Plus. Nemusí to tak správnÄ› fungovat nebo to může zhorÅ¡it použitelnost na nÄ›kterých webových stránkách. DůraznÄ› doporuÄujeme buÄ aktualizovat na Safari 6.1.1 Äi vyšší (v OS X 10.8 Mountain Lion), nebo Safari 7.0.1 Äi vyšší (v OS X 10.9 Mavericks), nebo používat nejnovÄ›jší verzi Mozilla Firefoxu, Google Chrome Äi Opery.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/global.properties
new file mode 100644
index 0000000..18ffe9f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Na této stránce nebyly nalezeny prvky k zablokování
+action3_tooltip=Klepnutím povolit/zakázat Adblock Plus
+notification_antiadblock_title=Skrýt cílená hlášení?
+type_label_script=Skript
+filter_elemhide_nocriteria=Nebyla uvedena žádná kritérie pro rozpoznání elementu, který má být skryt
+blockingGroup_title=Pravidla blokování reklam
+whitelisted_tooltip=Adblock Plus je aktivní, ale pro aktuální stránku byl zakázán.
+type_label_stylesheet=Šablona kaskádových stylů
+blocked_count_tooltip=?1? z ?2?
+type_label_font=Písmo
+type_label_popup=vyskakovací okno
+filter_regexp_tooltip=Tento filtr je buÄ regulární výraz nebo je příliÅ¡ krátký, aby mohl být optimalizován. PříliÅ¡ mnoho takových filtrů může zpomalit vaÅ¡e prohlížení stránek.
+action0_tooltip=Levé tlaÄítko: Otevřít místní nabídku
+whitelisted_page=Adblock Plus byl pro aktuální stránku zakázán
+remove_group_warning=Chcete opravdu smazat tuhle skupniu?
+action1_tooltip=Levé tlaÄítko: Otevřít blokovatelné prvky
+type_label_xmlhttprequest=XML požadavek
+active_tooltip=Adblock Plus je aktivní, cizí sady filtrů: ?1?, vlastní filtry: ?2?
+type_label_document=Dokument
+type_label_object_subrequest=Subpožadavek objektu
+whitelistGroup_title=Výjimky z pravidel
+disabled_tooltip=Adblock Plus je zakázán
+filter_elemhide_duplicate_id=Může být uvedeno pouze jedno ID elementu, který má být skryt
+type_label_object=Objekt
+action2_tooltip=Levé tlaÄítko: Otevřít pÅ™edvolby
+type_label_subdocument=Rámec
+clearStats_warning=Toto smaže vÅ¡echny statistiky a vypne poÄítání zásahů filtrů. Chcete pokraÄovat?
+notification_antiadblock_message=O této stránce se ví, že zobrazuje hlášení cílená na uživatele Adblocku Plus. Chcete, aby Adblock Plus skryl tyto cílené zprávy?
+blocked_count_addendum=(povoleno výjimkou: ?1?, skryto: ?2?)
+subscription_invalid_location=Zadaná adresa seznamu cizích filtrů je buÄ nesprávná URL nebo obsahuje nesprávné jméno souboru.
+type_label_image=Obrázek
+remove_subscription_warning=SkuteÄnÄ› si pÅ™ejete odstranit tuto sadu cizích filtrů ?
+type_label_other=Ostatní
+mobile_menu_enable=ABP: povolit
+type_label_media=zvuk a video
+mobile_menu_disable_site=ABP: Zakázat na ?1?
+elemhideGroup_title=Pravidla skrývání prvků
+mobile_menu_enable_site=ABP: Povolit na ?1?
+type_label_elemhide=skryto
+newGroup_title=Nová skupina filtrů
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/overlay.dtd
new file mode 100644
index 0000000..9980b76
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Ano">
+<!ENTITY notification.button.no "&amp;Ne">
+<!ENTITY sync.label "Na&amp;stavení synchronizace Adblocku Plus">
+<!ENTITY whitelist.site.label "Vypnout na ?1?">
+<!ENTITY filters.label "&amp;Předvolby filtrů">
+<!ENTITY disable.label "Zakázat všude">
+<!ENTITY objecttab.title "Blokovat">
+<!ENTITY objecttab.tooltip "Klepněte zde pro blokování tohoto objektu pomocí Adblock Plus">
+<!ENTITY menuitem.label "Předvol&amp;by Adblock Plus">
+<!ENTITY objecttabs.label "Z&amp;obrazovat ouška u objektů Java a Flash">
+<!ENTITY sendReport.label "&amp;Nahlásit problém na této stránce">
+<!ENTITY whitelist.page.label "Vypnout pouze na této stránce">
+<!ENTITY context.image.label "Blokovat obrázek">
+<!ENTITY counthits.label "PoÄítat &amp;zásahy filtrů">
+<!ENTITY opensidebar.label "Zo&amp;brazit blokovatelné objekty">
+<!ENTITY notification.button.close "&amp;Zavřít">
+<!ENTITY contribute.label "Přispět Adblocku Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Blokovat rámec">
+<!ENTITY blocked.tooltip "Blokované prvky na této stránce:">
+<!ENTITY hideplaceholders.label "Skrýt zástupné o&amp;bjekty blokovaných prvků">
+<!ENTITY showinstatusbar.label "Zob&amp;razit ve stavovém řádku">
+<!ENTITY sidebar.title "Adblock Plus: Blokovatelné objekty na zobrazené stránce">
+<!ENTITY options.label "&amp;Možnosti">
+<!ENTITY context.object.label "Blokovat objekt">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Znovu povolit na této stránce">
+<!ENTITY filters.tooltip "NejúÄinnÄ›jší filtry:">
+<!ENTITY closesidebar.label "Skrýt seznam &amp;blokovatelných objektů">
+<!ENTITY showintoolbar.label "Zobrazit v &amp;nástrojové liště">
+<!ENTITY status.tooltip "Stav:">
+<!ENTITY context.media.label "Adblock Plus: Blokovat audio/video">
+<!ENTITY subscription.update.label "Aktualizovat filtry">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/sendReport.dtd
new file mode 100644
index 0000000..3fd5628
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Zpět">
+<!ENTITY issues.disabledgroups.description "Následující sady cizích filtrů / skupiny filtrů jsou zakázány, přesto můžou mít vliv na tuto stránku:">
+<!ENTITY showData.label "Zobrazit data hlášení">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blokuje příliš &amp;mnoho">
+<!ENTITY issues.change.description "Vaše nastavení bylo změněno. Obnovte prosím stránku pro otestování změn a odešlete hlášení problému, pokud nebyl vyřešen úpravami nastavení.">
+<!ENTITY email.label "E-&amp;mail:">
+<!ENTITY issues.openPreferences.label "Otevřít předvolby filtrů">
+<!ENTITY sendPage.confirmation "Vaše hlášení bylo odesláno. Můžete si prohlédnou hlášení na následující adrese:">
+<!ENTITY copyLink.label "&amp;Kopírovat adresu hlášení">
+<!ENTITY issues.nofilters.description "Adblock Plus na aktuální stránce nic neblokuje. Problém, který chcete nahlásit, není s největší pravděpodobností způsoben Adblockem Plus.">
+<!ENTITY sendPage.knownIssue "Problém, který jste nahlásili, je pravděpodobně již známý. Více informací:">
+<!ENTITY typeSelector.other.description "Vyberte tuto možnost, pokud máte pocit, že je chyba přímo v Adblocku Plus, ne ve jeho filtrech.">
+<!ENTITY issues.disabledgroups.enable.label "Povolit sadu cizích filtrů / skupinu filtrů">
+<!ENTITY typeWarning.override.label "&amp;Rozumím a přesto chci odeslat hlášení">
+<!ENTITY issues.disabled.enable.label "Aktivovat Adblock Plus">
+<!ENTITY update.fixed.description "Aktualizace vámi odebíraných sad filtrů pravděpodobně vyřešila problém,který jste reportovali.Prosím obnovte stránku a zkuste to znovu,klikněte na Znovu oznámit pokud problém přetrval.">
+<!ENTITY anonymous.label "&amp;Anonymní odeslání">
+<!ENTITY reloadButton.label "&amp;Obnovit stránku">
+<!ENTITY recentReports.clear.label "Odst&amp;ranit všechna hlášení">
+<!ENTITY typeSelector.description "Toto okno vás provede kroky potÅ™ebnými k oznámení problému v Adblocku Plus. ZaÄnÄ›te prosím vybráním druhu problému, se kterým jste se na této stránce setkali:">
+<!ENTITY screenshot.remove.label "&amp;Odstranit důvěrné údaje">
+<!ENTITY issues.ownfilters.description "Některé filtry použité na této stránce jsou vytvořené vámi. Zakažte prosím filtry, které mohly způsobit problém:">
+<!ENTITY update.inProgress.description "Adblock Plus potÅ™ebuje aktualizovat váš filtr odbÄ›rů aby zajistil že otázka nebyla již vyÅ™eÅ¡ena. Prosím Äekejte...">
+<!ENTITY sendPage.retry.label "Odeslat znovu">
+<!ENTITY data.label "&amp;Data hlášení:">
+<!ENTITY recentReports.label "Vaše nedávná hlášení">
+<!ENTITY typeWarning.description "Vybrali jste, že chcete nahlásit problém přímo v Adblocku Plus, nikoli chybu ve filtrech. Nejlepší způsob hlášení takovýchto chyb je na [link]fóru Adblocku Plus[/link]. Měli byste používat nástroj na hlášení chyb pouze jako doplněk existující diskuse na fóru, protože nikdo se nebude zabývat vaším hlášením, dokud neposkytnete odkaz na něj. Automaticky vygenerovaný odkaz bude zobrazet po odeslání hlášení.">
+<!ENTITY issues.disabled.description "Adblock Plus je zakázaný, v souÄasném stavu nebude blokovat nic.">
+<!ENTITY attachExtensions.label "&amp;Připojit seznam aktivních rozšíření k hlášení pro případ, že problém byl způsoben konfliktem mezi doplňky">
+<!ENTITY issues.nosubscriptions.add.label "Přidat sadu cizích filtrů">
+<!ENTITY issues.disabledfilters.enable.label "Povolit filtr">
+<!ENTITY issues.override.label "Nastavení je v &amp;pořádku, pokraÄovat v hlášení problém">
+<!ENTITY issues.nosubscriptions.description "Zdá se, že nejste přihlášeni k odběru žádných cizích sad filtrů, které automaticky odstraňují nežádoucí obsah z webových stránek.">
+<!ENTITY typeSelector.falsePositive.description "Vyberte tuto možnost, pokud na stránce chybí důležitý obsah, není zobrazena správnÄ› nebo nefunguje. Zda je Adblock Plus příÄinou problému můžete zjistit jeho doÄasným vypnutím.">
+<!ENTITY typeSelector.other.label "Jiný &amp;problém">
+<!ENTITY emailComment.label "Nabádáme vás,aby jste zadali platnou emailovou adresu,aby jsme vás mohli kontaktovat pokud budou nějaké nesrovnalosti s vašim nahlášením.Také nám to umožní rozeznat vaše příspěvky a přikládat jim vyšší prioritu.">
+<!ENTITY issues.whitelist.remove.label "Znovu povolit Adblock Plus na této stránce">
+<!ENTITY outdatedSubscriptions.description "Následující odběr filtrů nebyl aktualizován minimálně dva týdny.Prosím aktualizujte tyto odběry než reportujete chybu,problém už mohl být vyřešen.">
+<!ENTITY dataCollector.description "PoÄkejte prosím zatímco Adblock Plus sbírá potÅ™ebná data.">
+<!ENTITY sendButton.label "&amp;Odeslat hlášení">
+<!ENTITY comment.label "&amp;Komentář (nepovinný)">
+<!ENTITY sendPage.errorMessage "Pokus odeslat hlášení problému selhal s chybovým kódem &quot;?1?&quot;. Ověřte prosím, že jste připojeni k internetu a pokus opakujte. Pokud problém přetrvává, zkuste prosím vyhledat pomoc na [link]fóru Adblocku Plus[/link].">
+<!ENTITY showRecentReports.label "Ukázat nedávno odeslaná hlášení">
+<!ENTITY commentPage.heading "Vložit komentář">
+<!ENTITY update.start.label "Spustit aktualizaci">
+<!ENTITY issues.disabledfilters.description "Následující filtry jsou zakázány, přesto můžou mít vliv na tuto stránku:">
+<!ENTITY screenshot.description "Stejná stránka může být zobrazena odliÅ¡nÄ› různým lidem. Pomůže nám pochopit problém, pokud pÅ™ipojíte snímek stránky k vaÅ¡emu hlášení problému. Můžete odstranit Äásti obsahující důvÄ›rné informace i vyznaÄit místa, kde je problém vidÄ›t. Toho docílíte klepnutím na odpovídající tlaÄítko a výbÄ›rem Äásti obrázku myší.">
+<!ENTITY screenshot.attach.label "&amp;Připojit snímek stránky k hlášení">
+<!ENTITY issues.whitelist.description "Adblock Plus je aktuálně neaktivní na stránce, na které hlásíte problém. Prosím aktivujte jej a obnovte stránku předtím, než odešlete hlášení, abyste pomohli vyřešit váš problém.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus &amp;neblokuje reklamu">
+<!ENTITY typeSelector.heading "Vyberte druh problému">
+<!ENTITY anonymity.warning "Nebudeme moci vám odepsat a vašemu reportu bude pravděpodobně přikládána nižší priorita.">
+<!ENTITY wizard.title "Oznamování problémů">
+<!ENTITY issues.ownfilters.disable.label "Zakázat filtr">
+<!ENTITY commentPage.description "Do textového pole níže můžete vložit komentář vysvÄ›tlující problém, který hlásíte. Tento krok není povinný, ale je doporuÄený, pokud problém není jednoznaÄnÄ› viditelný. Můžete také prohlédnout data hlášení pÅ™ed jejich odesláním.">
+<!ENTITY comment.lengthWarning "Váš komentář přesahuje 1000 znaků. Pouze prvních 1000 znaků bude odesláno.">
+<!ENTITY typeSelector.falseNegative.description "Tuto možnost vyberte v případě, že vidíte reklamu i přesto, že je Adblock Plus aktivovaný.">
+<!ENTITY sendPage.waitMessage "Prosím poÄkejte zatímco Adblock Plus odesílá vaÅ¡e hlášení.">
+<!ENTITY dataCollector.heading "Vítejte v nástroji na oznamování problémů">
+<!ENTITY screenshot.heading "Připojit snímek">
+<!ENTITY sendPage.heading "Odeslat hlášení">
+<!ENTITY issues.subscriptionCount.description "Vypadá to, že jste pÅ™ihlášeni k odbÄ›ru příliÅ¡ mnoha sad cizích filtrů. Toto nastavení není doporuÄeno, protože výraznÄ› zvyÅ¡uje pravdÄ›podobnost výskytu problémů. Zároveň nelze pÅ™ijmout vaÅ¡e hlášení, protože není jasné, který z autorů sad cizích filtrů je za zodpovÄ›dný. OdhlaÅ¡te se prosím z odbÄ›ru vÅ¡ech nepotÅ™ebných sad cizích filtrů a vyzkouÅ¡ejte, zda se problém vyskytuje i poté.">
+<!ENTITY screenshot.mark.label "&amp;VyznaÄit problém">
+<!ENTITY privacyPolicy.label "Ochrana soukromí">
+<!ENTITY issues.description "Adblock Plus zjistil problémy s vaším nastavením, které můžou způsobovat tento problém nebo ztížit jeho řešení.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/sidebar.dtd
new file mode 100644
index 0000000..8707ce4
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Blikání obrysu objektu">
+<!ENTITY address.label "Adresa">
+<!ENTITY context.open.label "Otevřít v novém panelu">
+<!ENTITY type.label "Typ">
+<!ENTITY tooltip.filterSource.label "Zdroj filtru:">
+<!ENTITY noitems.label "Nic nebylo zablokováno">
+<!ENTITY filter.label "Filtr">
+<!ENTITY tooltip.size.label "Velikost:">
+<!ENTITY reattach.label "Připojit">
+<!ENTITY search.label "&amp;Hledat:">
+<!ENTITY docDomain.thirdParty "(externí)">
+<!ENTITY filterSource.label "Zdroj filtru">
+<!ENTITY tooltip.docDomain.label "Zdroj dokumentu:">
+<!ENTITY context.copy.label "Kopírovat adresu objektu">
+<!ENTITY tooltip.type.label "Typ:">
+<!ENTITY context.disablefilter.label "Zakázat filtr ?1?">
+<!ENTITY context.copyFilter.label "Kopírovat filtr">
+<!ENTITY context.block.label "Blokovat tento objekt">
+<!ENTITY context.enablefilter.label "Opět povolit filtr ?1?">
+<!ENTITY detach.label "Oddělit">
+<!ENTITY whitelisted.label "Adresa je na bílé listině">
+<!ENTITY context.disablefilteronsite.label "Zakázat tento filtr na ?1?">
+<!ENTITY detached.title "Adblock Plus: Blokovatelné prvky (odděleno)">
+<!ENTITY docDomain.firstParty "(vlastní)">
+<!ENTITY tooltip.type.whitelisted "(na bílé listině)">
+<!ENTITY tooltip.filter.label "Použité filtry:">
+<!ENTITY tooltip.filter.disabled "(zakázaný)">
+<!ENTITY context.editfilter.label "Upravit příslušný filtr">
+<!ENTITY tooltip.type.blocked "(blokováno)">
+<!ENTITY size.label "Velikost">
+<!ENTITY context.whitelist.label "Přidat výjimku pro tento objekt">
+<!ENTITY context.selectAll.label "Vybrat vše">
+<!ENTITY state.label "Stav">
+<!ENTITY docDomain.label "Zdroj dokumentu">
+<!ENTITY tooltip.address.label "Adresa:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/subscriptionSelection.dtd
new file mode 100644
index 0000000..a3fb375
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Přidat také cizí &amp;sadu filtrů &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblocku Plus se nepodařilo získat seznam cizích sad filtrů.">
+<!ENTITY list.download.retry "Zkusit znovu">
+<!ENTITY title.label "&amp;OznaÄení cizích filtrů:">
+<!ENTITY list.download.website "Zobrazit webovou stránku">
+<!ENTITY supplementMessage "Tato cizí sada filtrů je urÄena k používání se sadou &quot;?1?&quot;, kterou jeÅ¡tÄ› nepoužíváte.">
+<!ENTITY viewList.label "Zobrazit pravidla">
+<!ENTITY visitHomepage.label "Navštívit domovskou stránku">
+<!ENTITY addSubscription.label "Přidat cizí sadu filtrů">
+<!ENTITY dialog.title "Přidat sadu cizích filtrů Adblock Plus">
+<!ENTITY location.label "&amp;Umístění sady filtrů:">
+<!ENTITY fromWeb.description "Prosím potvrÄte, že chcete pÅ™idat tuto cizí sadu filtrů. Můžete zmÄ›nít její titulek nebo umístÄ›ní pÅ™ed jejím pÅ™idáním.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/composer.dtd
new file mode 100644
index 0000000..124473c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "i s&amp;lutningen af adressen">
+<!ENTITY domainRestriction.label "Begræns til &amp;domæne:">
+<!ENTITY collapse.default.no.label "Brug standard (nej)">
+<!ENTITY firstParty.label "Kun &amp;førsteparts">
+<!ENTITY preferences.label "Vi&amp;s eksisterende filtre...">
+<!ENTITY pattern.label "Kig efter mønster">
+<!ENTITY thirdParty.label "Kun tred&amp;jeparts">
+<!ENTITY filter.label "&amp;Nyt filter:">
+<!ENTITY collapse.label "Sammenf&amp;old blokeret:">
+<!ENTITY match.warning "Det angivne mønster matcher ikke længere den blokerede/hvidlistede adresse og har ingen effekt.">
+<!ENTITY anchor.start.label "i be&amp;gyndelsen af adressen">
+<!ENTITY matchCase.label "&amp;Versalfølsom (a/A)">
+<!ENTITY custom.pattern.label "&amp;Tilpasset:">
+<!ENTITY unselectAllTypes.label "Vælg ingen">
+<!ENTITY type.whitelist.label "&amp;Undtagelsesregel">
+<!ENTITY regexp.warning "Det indtastede mønster vil blive fortolket som et regulært udtryk. Mange regulære udtryk kan gøre din browser langsommere. Hvis det ikke var din mening at bruge et regulært udtryk, så tilføj et * i sidst i mønsteret.">
+<!ENTITY dialog.title "Tilføj Adblock Plus filterregel">
+<!ENTITY basic.label "Enkel visning">
+<!ENTITY type.filter.label "Blok&amp;eringsfilter">
+<!ENTITY types.label "Benyt på typer:">
+<!ENTITY shortpattern.warning "Det indtastede mønster er for kort til optimering, og kan sløve din browser. Det anbefales at du vælger en længere streng for dette filter.">
+<!ENTITY collapse.yes.label "Ja">
+<!ENTITY anchors.label "Accepter kun mønster:">
+<!ENTITY collapse.default.yes.label "Brug standard (ja)">
+<!ENTITY domainRestriction.help "Angiv ét eller flere domæner adskilt af symbolet &quot;|&quot;, så vil filteret kun blive anvendt på disse domæner. Symbolet &quot;~&quot; foran et domæne angiver at filteret ikke skal anvendes på dette domæne.">
+<!ENTITY accept.label "Tilføj filter">
+<!ENTITY options.label "Indstillinger">
+<!ENTITY disabled.warning "Adblock Plus er deaktiveret. Du kan stadig tilføje filtre men disse anvendes ikke før du [link]aktiverer Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "i be&amp;gyndelsen af domænenavnet">
+<!ENTITY collapse.no.label "Nej">
+<!ENTITY selectAllTypes.label "Vælg alle">
+<!ENTITY advanced.label "Avanceret visning">
+<!ENTITY pattern.explanation "Mønsteret kan være enhver del af adressen, tegnet * bruges som jokertegn. Filteret benyttes kun på adresser der matcher mønsteret.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/filters.dtd
new file mode 100644
index 0000000..3d0400b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Alle dine tilpassede filtre erstattes af indholdet i den valgte fil. Vil du fortsætte?">
+<!ENTITY slow.column "Langs&amp;omme filtre">
+<!ENTITY enabled.column "A&amp;ktiveret">
+<!ENTITY subscription.lastDownload.checksumMismatch "Fejlede, checksum matcher ikke">
+<!ENTITY noFiltersInGroup.text "Den valgte gruppe er tom">
+<!ENTITY subscription.actions.label "Handlinger">
+<!ENTITY filter.selectAll.label "Vælg alle">
+<!ENTITY backupButton.label "&amp;Backup og gendan">
+<!ENTITY restore.minVersion.warning "Advarsel: Filen er oprettet med en nyere Adblock Plus. Du bør opdatere Adblock Plus før du gendanner fra denne fil.">
+<!ENTITY restore.error "Filen kunne ikke åbnes, måske er det ikke en Adblock Plus backupfil?">
+<!ENTITY sort.ascending.label "&amp;A &gt; Z">
+<!ENTITY sort.label "&amp;Sorter efter">
+<!ENTITY subscription.source.label "Filterliste">
+<!ENTITY hitcount.column "&amp;Hits">
+<!ENTITY noFilters.text "Du har endnu ingen tilpassede filtre.">
+<!ENTITY backup.custom.title "Kun tilpassede filtre">
+<!ENTITY subscription.external.label "Opdateret af en anden tilføjelse">
+<!ENTITY subscription.delete.label "Slet">
+<!ENTITY noGroupSelected.text "Vælg en filtergruppe for at få vist filtrene.">
+<!ENTITY filter.cut.label "Klip">
+<!ENTITY restore.default.label "Gendan backup fra ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Henter...">
+<!ENTITY subscriptions.tab.label "Filterabonnementer">
+<!ENTITY sort.descending.label "&amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Vil du fjerne de valgte filtre?">
+<!ENTITY filter.delete.label "Slet">
+<!ENTITY addSubscriptionAdd.label "Tilføj">
+<!ENTITY viewMenu.label "Vis">
+<!ENTITY subscription.lastDownload.unknown "Ukendt">
+<!ENTITY addSubscriptionCancel.label "Annuller">
+<!ENTITY subscription.enabled.label "Aktiveret">
+<!ENTITY noSubscriptions.text "Du har endnu ikke tilføjet Filterabonnementer. Adblock Plus blokerer ikke
+ noget uden filtre, så brug &quot;Tilføj Filterabonnementer;
+ for at tilføje nogen.">
+<!ENTITY subscription.update.label "Opdater filtre">
+<!ENTITY dialog.title "Adblock Plus filterpræferencer">
+<!ENTITY addFilter.label "Ti&amp;lføj filter">
+<!ENTITY subscription.minVersion.warning "Dette Filterabonnement kræver en nyere udgave af Adblock Plus. Opdater venligst.">
+<!ENTITY subscription.lastDownload.invalidURL "Fejlede, ikke en gyldig adresse">
+<!ENTITY backup.error "Der opstod en skrivefejl. Kontroller at filen ikke er skrivebeskyttet eller åben i et andet program.">
+<!ENTITY filter.moveUp.label "Flyt op">
+<!ENTITY addGroup.label "Tilføj filter&amp;gruppe">
+<!ENTITY filter.edit.label "Rediger">
+<!ENTITY subscription.showHideFilters.label "Vis/skjul filtre">
+<!ENTITY acceptableAds2.label "T&amp;illad upåtrængende annoncering delvist">
+<!ENTITY addSubscriptionOther.label "Tilføj endnu et abonnement">
+<!ENTITY close.label "Luk">
+<!ENTITY sort.none.label "&amp;Usorteret">
+<!ENTITY filter.actions.label "Filterhandlinger">
+<!ENTITY filter.copy.label "Kopier">
+<!ENTITY filter.moveDown.label "Flyt ned">
+<!ENTITY filter.resetHitCounts.label "Nulstil statistikker">
+<!ENTITY readMore.label "Lær mere">
+<!ENTITY subscription.moveUp.label "Flyt op">
+<!ENTITY addSubscription.label "Til&amp;føj filterabonnement">
+<!ENTITY subscription.homepage.label "Hjemmeside">
+<!ENTITY backup.complete.title "Alle filtre og abonnementer">
+<!ENTITY restore.own.label "Gendan eget backup">
+<!ENTITY restore.complete.warning "Alle dine filterpræferencer erstattes af indholdet i den valgte fil. Vil du fortsætte?">
+<!ENTITY filters.tab.label "Tilpassede filtre">
+<!ENTITY backup.label "Opret nyt backup">
+<!ENTITY find.label "S&amp;øg">
+<!ENTITY subscription.moveDown.label "Flyt op">
+<!ENTITY subscription.lastDownload.connectionError "Fejlede, hentningsfejl">
+<!ENTITY subscription.lastDownload.success "Succes">
+<!ENTITY subscription.lastDownload.invalidData "Fejlede, ikke en gyldig liste over filtre">
+<!ENTITY filter.paste.label "Sæt ind">
+<!ENTITY subscription.disabledFilters.enable "Aktiver deaktiverede filtre">
+<!ENTITY lasthit.column "Seneste h&amp;it">
+<!ENTITY subscription.editTitle.label "Rediger titel">
+<!ENTITY subscription.disabledFilters.warning "Dette abonnement indeholder deaktiverede filtre.">
+<!ENTITY filter.column "&amp;Filterregel">
+<!ENTITY subscription.lastDownload.label "Sidst hentet:">
+<!ENTITY viewList.label "Vis liste">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/firstRun.properties
new file mode 100644
index 0000000..57c941b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Deaktiver sporing - og skjul dine netvaner fra de annoncefirmaer der holder øje med din færden.
+firstRun_toggle_off=FRA
+firstRun_feature_tracking=Deaktiver sporing
+firstRun_feature_malware=Malwareblokering
+firstRun_title=Adblock Plus blev installeret
+firstRun_toggle_on=TIL
+firstRun_acceptableAdsExplanation=Vi vil gerne tilskynde websider til at bruge enkel, diskret annoncering. Derfor har vi indført <a>strenge retningslinjer</a> for at identificere de acceptable annoncer, der vises med standardindstillingerne. Hvis du stadig vil blokere alle annoncer, kan du let <a>deaktivere</a> dette.
+firstRun_contributor_credits=Tak til
+firstRun_dataCorruptionWarning=<a>Klik her!</a> hvis denne side bliver ved med at dukke op.
+firstRun_acceptableAdsHeadline=Generende annoncer bliver nu blokeret
+firstRun_share=Fortæl det til vennerne
+firstRun_share_headline=<a>Giv en hånd</a> med at gøre internettet til et bedre sted
+firstRun_feature_social_description=Fjern automatisk de knapper fra sociale medier, f.eks Facebook Like, som vises på websider og sporer din adfærd.
+firstRun_filterlistsReinitializedWarning=Et problem har tilsyneladende fjernet alle filtre og det var ikke muligt at gendanne en backup. Dine filtre og indstillinger for upåtrængende annoncer er derfor blevet nulstillet. Kontroller dine filtre m.m. i <a>Adblock Plus præferencer</a>.
+firstRun_feature_malware_description=Gør din browsing mere sikker ved at blokere kendte malwaredomæner.
+firstRun_features=Adblock Plus kan mere end blot blokere annoncer
+firstRun_donate=donér
+firstRun_donate_label=Støt projektet
+firstRun_feature_social=Fjern knapper fra sociale medier
+firstRun_legacySafariWarning=Du bruger en gammel udgave af Safari, som ikke understøttes af Adblock Plus. Det kan fungere dårligt eller forringe brugeroplevelsen på nogle websteder. Vi anbefaler kraftigt at opdatere til minimum Safari 6.1.1 (på OS X 10,8 Mountain Lion), Safari 7.0.1 (på OS X 10.9 Mavericks) eller bruge den nyeste Firefox, Google Chrome eller Opera.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/global.properties
new file mode 100644
index 0000000..6f29187
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Ingen blokerbare elementer på aktuel side
+action3_tooltip=Klik for at aktivere/deaktivere Adblock Plus.
+notification_antiadblock_title=Skjul målrettede beskeder ?
+type_label_script=script
+filter_elemhide_nocriteria=Ingen kriterier angivet for at genkende elementet der skal skjules
+blockingGroup_title=Blokeringsregler
+whitelisted_tooltip=Adblock Plus er aktiv men slået fra på nuværende side.
+type_label_stylesheet=stilark
+blocked_count_tooltip=?1? ud af ?2?
+type_label_font=skrifttype
+type_label_popup=popup vindue
+filter_regexp_tooltip=Dette filter er enten et regulært udtryk eller for kort til at blive optimeret. For mange af disse kan gøre din browser langsommere.
+action0_tooltip=Klik for at vise kontekstmenuen, midterklik aktiverer/deaktiverer.
+whitelisted_page=Adblock Plus er slået fra for aktuel side
+remove_group_warning=Vil du virkelig fjerne denne gruppe?
+action1_tooltip=Klik for at åbne/lukke blokérbare elementer, midterklik aktiverer/deaktiverer.
+type_label_xmlhttprequest=XML-forespørgsel
+active_tooltip=Adblock Plus er aktiveret, ?1? filter-abonnementer og ?2? brugerdefinerede filtre i brug.
+type_label_document=dokument
+type_label_object_subrequest=objekt underforespørgsel
+whitelistGroup_title=Undtagelsesregler
+disabled_tooltip=Adblock Plus er deaktiveret.
+filter_elemhide_duplicate_id=Kun ét ID for elementet der skal skjules kan angives
+type_label_object=objekt
+action2_tooltip=Klik for at åbne indstillingerne, midterklik aktiverer/deaktiverer.
+type_label_subdocument=ramme
+clearStats_warning=Nulstiller hit statistikker for alle filtre og deaktiverer tælleren. Vil du fortsætte?
+notification_antiadblock_message=Denne side er kendt for målrettede beskeder til Adblock Plus brugere. Skal Adblock Plus skjule disse beskeder ?
+blocked_count_addendum=(også hvidlistet: ?1?, skjult: ?2?)
+subscription_invalid_location=Filterlistens placering er hverken en gyldig URL eller et gyldigt filnavn.
+type_label_image=billede
+remove_subscription_warning=Vil du virkelig fjerne dette abonnement?
+type_label_other=andet
+mobile_menu_enable=ABP: Aktiver
+type_label_media=audio/video
+mobile_menu_disable_site=ABP: Deaktiver på ?1?
+elemhideGroup_title=Skjul emner regler
+mobile_menu_enable_site=ABP: Aktiver på ?1?
+type_label_elemhide=skjult
+newGroup_title=Ny filtergruppe
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/overlay.dtd
new file mode 100644
index 0000000..89522f2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Ja">
+<!ENTITY notification.button.no "&amp;Nej">
+<!ENTITY sync.label "Syn&amp;k Adblock Plus indstillinger">
+<!ENTITY whitelist.site.label "Slå fra på ?1?">
+<!ENTITY filters.label "&amp;Filterpræferencer">
+<!ENTITY disable.label "Deaktiver overalt">
+<!ENTITY objecttab.title "Bloker">
+<!ENTITY objecttab.tooltip "Klik her for at blokere dette objekt med Adblock Plus">
+<!ENTITY menuitem.label "&amp;Adblock Plus indstillinger">
+<!ENTITY objecttabs.label "Vis faner på Flash og &amp;Java">
+<!ENTITY sendReport.label "Ra&amp;pporter problem">
+<!ENTITY whitelist.page.label "Slå fra på denne side">
+<!ENTITY context.image.label "Adblock billede">
+<!ENTITY counthits.label "Tæl filter&amp;hits">
+<!ENTITY opensidebar.label "Åbn bloké&amp;rbare elementer">
+<!ENTITY notification.button.close "&amp;Luk">
+<!ENTITY contribute.label "Bidrag til Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock ramme">
+<!ENTITY blocked.tooltip "Blokerede emner på denne side:">
+<!ENTITY hideplaceholders.label "Skjul blokerede emners &amp;pladsholder">
+<!ENTITY showinstatusbar.label "&amp;Vis på statuslinje">
+<!ENTITY sidebar.title "Blokérbare elementer på aktuel side">
+<!ENTITY options.label "In&amp;dstillinger">
+<!ENTITY context.object.label "Adblock objekt">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Genaktivér på denne side">
+<!ENTITY filters.tooltip "Mest aktive filtre:">
+<!ENTITY closesidebar.label "Luk bloké&amp;rbare elementer">
+<!ENTITY showintoolbar.label "Vi&amp;s på værktøjslinje">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Bloker audio/video">
+<!ENTITY subscription.update.label "Opdater filtre">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/sendReport.dtd
new file mode 100644
index 0000000..5965eed
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Fortr&amp;yd">
+<!ENTITY issues.disabledgroups.description "Følgende abonnementer/filtre er deaktiveret, men kan stadig påvirke siden:">
+<!ENTITY showData.label "Vis rapportdata">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blokerer for &amp;meget">
+<!ENTITY issues.change.description "Indstillingen blev ændret. Genindlæs siden og se om det har hjulpet. Indsend rapporten hvis problemet stadig findes.">
+<!ENTITY email.label "E&amp;mail:">
+<!ENTITY issues.openPreferences.label "Ã…ben filterindstillinger">
+<!ENTITY sendPage.confirmation "Rapporten er gemt. Den kan ses på følgende adresse:">
+<!ENTITY copyLink.label "&amp;Kopier link">
+<!ENTITY issues.nofilters.description "Adblock Plus blokerer intet på denne side. Problemet skyldes sandsynligvis ikke Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Det rapporterede problem er sandsynligvis kendt. Mere information:">
+<!ENTITY typeSelector.other.description "Vælges hvis du tror problemet skyldes Adblock Plus selv og ikke filtrene.">
+<!ENTITY issues.disabledgroups.enable.label "Aktiver abonnement/filtre">
+<!ENTITY typeWarning.override.label "&amp;Jeg forstår og vil indsende alligevel.">
+<!ENTITY issues.disabled.enable.label "Aktiver Adblock Plus">
+<!ENTITY update.fixed.description "Opdateringen af filterabonnementet har sandsynligvis løst dit problem. Genindlæs siden og prøv igen. Rapporter igen hvis problemet består.">
+<!ENTITY anonymous.label "&amp;Anonym indsendelse">
+<!ENTITY reloadButton.label "&amp;Genindlæs side">
+<!ENTITY recentReports.clear.label "&amp;Fjern alle rapporter">
+<!ENTITY typeSelector.description "Dette vindue vil føre dig gennem de trin der kræves for at rapportere et Adblock Plus problem. Vælg først hvilken problemtype du oplever på denne side:">
+<!ENTITY screenshot.remove.label "&amp;Dæk område">
+<!ENTITY issues.ownfilters.description "Der anvendes brugerdefinerede filtre på denne side. Deaktiver filtret der måske forårsager problemet:">
+<!ENTITY update.inProgress.description "Adblock Plus skal opdatere dit filterabonnement for at sikre at problemet ikke er blevet løst. Vent...">
+<!ENTITY sendPage.retry.label "Send igen">
+<!ENTITY data.label "Ra&amp;pportdata:">
+<!ENTITY recentReports.label "Dine seneste rapporter">
+<!ENTITY typeWarning.description "Du vil indsende en rapport om generelle problemer med Adblock Plus, og ikke med filtrene. Bemærk at den slags problemer behandles bedst i [link]Adblock Plus forum[/link]. Du bør kun bruge denne problemrapport som bilag til en eksisterende diskussion, da ingen bemærker den med mindre du angiver et link. Du vil modtage et link efter afsendelse af rapporten.">
+<!ENTITY issues.disabled.description "Adblock Plus er deaktiveret og blokerer ingenting.">
+<!ENTITY attachExtensions.label "&amp;Vedhæft liste med aktive tilføjelser til konstatering af eventuelle konflikter">
+<!ENTITY issues.nosubscriptions.add.label "Tilføj filterabonnement">
+<!ENTITY issues.disabledfilters.enable.label "Aktiver filter">
+<!ENTITY issues.override.label "&amp;Indstillingen er korrekt, fortsæt rapporten">
+<!ENTITY issues.nosubscriptions.description "Du abonnerer tilsyneladende ikke på nogen af de filtre der automatisk fjerner uønsket indhold fra websider.">
+<!ENTITY typeSelector.falsePositive.description "Vælges hvis siden mangler vigtigt indhold, vises forkert eller ikke fungerer rigtigt. Du kan se om problemet skyldes Adblock Plus ved at deaktivere det midlertidigt.">
+<!ENTITY typeSelector.other.label "&amp;Andet">
+<!ENTITY emailComment.label "Vi opfordrer dig til at angive en gyldig mailadresse, så vi kan kontakte dig, hvis der er spørgsmål til rapporten. Det tillader også genkendelse af dit bidrag for højere prioritet.">
+<!ENTITY issues.whitelist.remove.label "Genaktiver Adblock Plus på denne side">
+<!ENTITY outdatedSubscriptions.description "Følgende filterabonnementer er ikke opdateret i mindst to uger. Opdater før du rapporterer en fejl, problemet er muligvis løst allerede.">
+<!ENTITY dataCollector.description "Vent et øjeblik mens Adblock Plus indsamler data.">
+<!ENTITY sendButton.label "Se&amp;nd rapport">
+<!ENTITY comment.label "&amp;Kommentar (valgfri):">
+<!ENTITY sendPage.errorMessage "Afsendelse af rapporten fejlede med kode &quot;?1?&quot;. Kontroller din internetforbindelse og prøv igen. Hvis problemet fortsætter så søg hjælp i [link]Adblock Plus forum[/link].">
+<!ENTITY showRecentReports.label "Vis nyligt indsendte rapporter">
+<!ENTITY commentPage.heading "Indsæt kommentar">
+<!ENTITY update.start.label "Start opdatering">
+<!ENTITY issues.disabledfilters.description "Følgende filtre er deaktiveret, men kan stadig påvirke siden:">
+<!ENTITY screenshot.description "Samme side kan vises på forskellige måder. Det vil hjælpe os med at forstå problemet, hvis du vedhæfter et screenshot til rapporten. Du kan dække følsomme data og markere områder hvor problemet er tydeligt. Klik på den ønskede knap og vælg et område med musen.">
+<!ENTITY screenshot.attach.label "Vedhæft &amp;billede">
+<!ENTITY issues.whitelist.description "Adblock Plus er deaktiveret på siden du rapporterer. Genaktiver det og genindlæs siden før du indsender rapporten.">
+<!ENTITY typeSelector.falseNegative.label "Adbloc&amp;k Plus blokerer ikke annonce">
+<!ENTITY typeSelector.heading "Vælg problemtype">
+<!ENTITY anonymity.warning "Vi kan ikke kontakte dig, rapporten prioriteres lavere.">
+<!ENTITY wizard.title "Rapporter problem">
+<!ENTITY issues.ownfilters.disable.label "Deaktiver filter">
+<!ENTITY commentPage.description "I tekstfeltet kan du beskrive problemet nærmere. Det er valgfrit, men vil hjælpe med at forstå problemet bedre. Du kan også gennemse rapporten før du sender den.">
+<!ENTITY comment.lengthWarning "Teksten overstiger 1000 tegn. Kun de første 1000 tegn bliver sendt.">
+<!ENTITY typeSelector.falseNegative.description "Vælges hvis en annonce vises selv om Adblock Plus er aktiveret.">
+<!ENTITY sendPage.waitMessage "Vent mens Adblock Plus sender rapporten.">
+<!ENTITY dataCollector.heading "Velkommen til Rapporter problem">
+<!ENTITY screenshot.heading "Vedhæft screenshot">
+<!ENTITY sendPage.heading "Send rapport">
+<!ENTITY issues.subscriptionCount.description "Du abonnerer tilsyneladende på for mange filtre. Det anbefales ikke, da det vil forøge chancen for problemer meget. Vi kan heller ikke acceptere din rapport, da det er uklart hvilken filterudvikler der skal behandle den. Fjern alle unødvendige filtre og se om problemet stadig eksisterer.">
+<!ENTITY screenshot.mark.label "&amp;Marker problem">
+<!ENTITY privacyPolicy.label "Privatlivspolitik">
+<!ENTITY issues.description "Adblock Plus har fundet problemer i dine indstillinger der kan forårsage dette probleme eller vanskeliggøre yderligere undesøgelser.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/sidebar.dtd
new file mode 100644
index 0000000..5e93842
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Fremhæv emnets kanter">
+<!ENTITY address.label "Adresse">
+<!ENTITY context.open.label "Ã…bn i nyt faneblad">
+<!ENTITY type.label "Type">
+<!ENTITY tooltip.filterSource.label "Filterkilde:">
+<!ENTITY noitems.label "Ingen blokérbare emner">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Størrelse:">
+<!ENTITY reattach.label "Gentilkobl">
+<!ENTITY search.label "S&amp;øg:">
+<!ENTITY docDomain.thirdParty "(tredjeparts)">
+<!ENTITY filterSource.label "Filterkilde">
+<!ENTITY tooltip.docDomain.label "Dokumentkilde:">
+<!ENTITY context.copy.label "Kopier emnets adresse">
+<!ENTITY tooltip.type.label "Type:">
+<!ENTITY context.disablefilter.label "Deaktiver filter ?1?">
+<!ENTITY context.copyFilter.label "Kopier filter">
+<!ENTITY context.block.label "Blokér dette emne">
+<!ENTITY context.enablefilter.label "Genaktiver filter ?1?">
+<!ENTITY detach.label "Frakobl">
+<!ENTITY whitelisted.label "Hvidlistet side">
+<!ENTITY context.disablefilteronsite.label "Deaktiver dette filter på ?1?">
+<!ENTITY detached.title "Adblock Plus blokérbare emner (frakoblet)">
+<!ENTITY docDomain.firstParty "(førsteparts)">
+<!ENTITY tooltip.type.whitelisted "(hvidlistet)">
+<!ENTITY tooltip.filter.label "Fungerende filter:">
+<!ENTITY tooltip.filter.disabled "(deaktiveret)">
+<!ENTITY context.editfilter.label "Redigér aktuelt filter">
+<!ENTITY tooltip.type.blocked "(blokeret)">
+<!ENTITY size.label "Størrelse">
+<!ENTITY context.whitelist.label "Tilføj undtagelsesregel for emne">
+<!ENTITY context.selectAll.label "Vælg alle">
+<!ENTITY state.label "Tilstand">
+<!ENTITY docDomain.label "Dokumentkilde">
+<!ENTITY tooltip.address.label "Adresse:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/subscriptionSelection.dtd
new file mode 100644
index 0000000..cf25b98
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Tilføj og&amp;så filterabonnement &quot;?1?&quot;.">
+<!ENTITY list.download.failed "Adblock Plus kunne ikke hente abonnementslisten.">
+<!ENTITY list.download.retry "Prøv igen">
+<!ENTITY title.label "Abonnemen&amp;tstitel:">
+<!ENTITY list.download.website "Se hjemmeside">
+<!ENTITY supplementMessage "Dette filterabonnement er beregnet til brug sammen med abonnementet &quot;?1?&quot; som du endnu ikke bruger.">
+<!ENTITY viewList.label "Vis filtre">
+<!ENTITY visitHomepage.label "Besøg hjemmeside">
+<!ENTITY addSubscription.label "Tilføj abonnement">
+<!ENTITY dialog.title "Tilføj Adblock Plus filterabonnement">
+<!ENTITY location.label "Fi&amp;lterlistens placering:">
+<!ENTITY fromWeb.description "Bekræft tilføjelsen af dette abonnement. Du kan ændre titel eller placering før det tilføjes.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/composer.dtd
new file mode 100644
index 0000000..7d377e2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "am En&amp;de der Adresse">
+<!ENTITY domainRestriction.label "Auf Do&amp;main beschränken:">
+<!ENTITY collapse.default.no.label "Standardeinstellung (nein)">
+<!ENTITY firstParty.label "Nur für Elemente der Ursprungsseite">
+<!ENTITY preferences.label "Existierende Filter an&amp;zeigen ...">
+<!ENTITY pattern.label "Muster suchen">
+<!ENTITY thirdParty.label "Nur für Elemen&amp;te von Drittseiten">
+<!ENTITY filter.label "Neue &amp;Filter:">
+<!ENTITY collapse.label "Platz frei&amp;geben:">
+<!ENTITY match.warning "Das Muster, das Sie eingegeben haben, passt nicht mehr zu der Adresse, für die der Filter erstellt werden soll. Es wird keinen Einfluss mehr auf diese Adresse haben.">
+<!ENTITY anchor.start.label "am An&amp;fang der Adresse">
+<!ENTITY matchCase.label "Groß-/&amp;Kleinschreibung beachten">
+<!ENTITY custom.pattern.label "Be&amp;nutzerdefiniert:">
+<!ENTITY unselectAllTypes.label "Keine auswählen">
+<!ENTITY type.whitelist.label "&amp;Ausnahmeregel">
+<!ENTITY regexp.warning "Das Muster, das Sie eingegeben haben, wird als regulärer Ausdruck interpretiert. Zu viele reguläre Ausdrücke könnten Ihren Browser verlangsamen. Falls Sie nicht beabsichtigt haben, reguläre Ausdrücke zu verwenden, fügen Sie einfach das Symbol '*' am Ende des Musters an.">
+<!ENTITY dialog.title "Neuen Filter hinzufügen">
+<!ENTITY basic.label "Standardansicht">
+<!ENTITY type.filter.label "&amp;Blockierregel">
+<!ENTITY types.label "Auf Elementtypen anwenden:">
+<!ENTITY shortpattern.warning "Das Muster, das Sie eingegeben haben, ist zu kurz zum Optimieren. Zu viele solche Muster könnten Ihren Browser verlangsamen. Es ist deshalb empfehlenswert, nach Möglichkeit ein längeres Muster für diesen Filter zu verwenden.">
+<!ENTITY collapse.yes.label "Ja">
+<!ENTITY anchors.label "Muster nur akzeptieren:">
+<!ENTITY collapse.default.yes.label "Standardeinstellung (ja)">
+<!ENTITY domainRestriction.help "Geben Sie eine oder mehrere Domains an (Trennzeichen ist &quot;|&quot;), der Filter wird dann nur auf diesen Domains angewandt. Das Zeichen &quot;~&quot; vor einem Domainnamen bedeutet, dass der Filter auf dieser Domain nicht angewandt werden sollte.">
+<!ENTITY accept.label "Filter hinzufügen">
+<!ENTITY options.label "Optionen">
+<!ENTITY disabled.warning "Adblock Plus ist deaktiviert. Sie können trotzdem den Filter hinzufügen, dieser wird jedoch erst angewandt, wenn Sie [link]Adblock Plus aktivieren[/link].">
+<!ENTITY anchor.start.flexible.label "am An&amp;fang des Domain-Namens">
+<!ENTITY collapse.no.label "Nein">
+<!ENTITY selectAllTypes.label "Alle auswählen">
+<!ENTITY advanced.label "Erweiterte Ansicht">
+<!ENTITY pattern.explanation "Das Muster kann ein beliebiger Teil der Adresse sein, das Zeichen '*' kann dabei als Jokerzeichen verwendet werden. Der Filter wird nur auf Adressen angewandt, die auf das Muster passen.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/filters.dtd
new file mode 100644
index 0000000..7c3e0f1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/filters.dtd
@@ -0,0 +1,73 @@
+<!ENTITY restore.custom.warning "Alle Ihre eigenen Filter werden durch den Inhalt dieser Datei ersetzt. Wollen Sie fortfahren?">
+<!ENTITY slow.column "&amp;Langsame Filter">
+<!ENTITY enabled.column "A&amp;ktiviert">
+<!ENTITY subscription.lastDownload.checksumMismatch "Fehler, Prüfsumme ist falsch, möglicherweise ein Übertragungsfehler">
+<!ENTITY noFiltersInGroup.text "Die gewählte Filtergruppe ist leer.">
+<!ENTITY subscription.actions.label "Aktionen">
+<!ENTITY filter.selectAll.label "Alle auswählen">
+<!ENTITY backupButton.label "Sic&amp;hern und Wiederherstellen">
+<!ENTITY restore.minVersion.warning "Warnung: diese Datei wurde mit einer neueren Version von Adblock Plus erstellt. Sie sollten Adblock Plus auf die neueste Version aktualisieren, bevor Sie Daten von dieser Sicherung wiederherstellen.">
+<!ENTITY restore.error "Die Daten dieser Datei sind fehlerhaft, vielleicht ist es keine Sicherungsdatei von Adblock Plus?">
+<!ENTITY sort.ascending.label "&amp;Aufsteigend">
+<!ENTITY sort.label "&amp;Sortieren">
+<!ENTITY subscription.source.label "Filterliste">
+<!ENTITY hitcount.column "T&amp;reffer">
+<!ENTITY noFilters.text "Sie haben noch keine eigenen Filter.">
+<!ENTITY backup.custom.title "Nur eigene Filter">
+<!ENTITY subscription.external.label "Wird von einer anderen Erweiterung aktualisiert">
+<!ENTITY subscription.delete.label "Löschen">
+<!ENTITY noGroupSelected.text "Sie müssen eine Filtergruppe auswählen, um deren Inhalt anzuzeigen.">
+<!ENTITY filter.cut.label "Ausschneiden">
+<!ENTITY restore.default.label "Sicherung von ?1? wiederherstellen">
+<!ENTITY subscription.lastDownload.inProgress "Wird heruntergeladen ...">
+<!ENTITY subscriptions.tab.label "Filterabonnements">
+<!ENTITY sort.descending.label "A&amp;bsteigend">
+<!ENTITY filters.remove.warning "Wollen Sie wirklich alle ausgewählten Filter löschen?">
+<!ENTITY filter.delete.label "Löschen">
+<!ENTITY addSubscriptionAdd.label "Hinzufügen">
+<!ENTITY viewMenu.label "Ansicht">
+<!ENTITY subscription.lastDownload.unknown "Nie">
+<!ENTITY addSubscriptionCancel.label "Abbrechen">
+<!ENTITY subscription.enabled.label "Aktiviert">
+<!ENTITY noSubscriptions.text "Sie haben noch keine Filterabonnements hinzugefügt. Ohne Filter wird Adblock Plus
+ nichts blockieren können, bitte benutzen Sie die Schaltfläche &quot;Filterabonnement hinzufügen&quot;.">
+<!ENTITY subscription.update.label "Filter aktualisieren">
+<!ENTITY dialog.title "Filtereinstellungen von Adblock Plus">
+<!ENTITY addFilter.label "&amp;Filter hinzufügen">
+<!ENTITY subscription.minVersion.warning "Diese Filterliste benötigt eine neuere Version von Adblock Plus, Sie sollten auf die neueste Version von Adblock Plus aktualisieren.">
+<!ENTITY subscription.lastDownload.invalidURL "Fehler, ungültige Adresse">
+<!ENTITY backup.error "Beim Schreiben der Filter in die Datei ist ein Problem aufgetreten. Bitte stellen Sie sicher, dass die Datei nicht schreibgeschützt ist oder von einem anderen Programm verwendet wird.">
+<!ENTITY filter.moveUp.label "Nach oben verschieben">
+<!ENTITY addGroup.label "Filter&amp;gruppe hinzufügen">
+<!ENTITY filter.edit.label "Bearbeiten">
+<!ENTITY subscription.showHideFilters.label "Filter anzeigen/verstecken">
+<!ENTITY acceptableAds2.label "Einige nicht auf&amp;dringliche Werbung zulassen">
+<!ENTITY addSubscriptionOther.label "Anderes Abonnement hinzufügen">
+<!ENTITY close.label "Schließen">
+<!ENTITY sort.none.label "&amp;Unsortiert">
+<!ENTITY filter.actions.label "Filteraktionen">
+<!ENTITY filter.copy.label "Kopieren">
+<!ENTITY filter.moveDown.label "Nach unten verschieben">
+<!ENTITY filter.resetHitCounts.label "Trefferstatistiken zurücksetzen">
+<!ENTITY readMore.label "Mehr Information">
+<!ENTITY subscription.moveUp.label "Nach oben verschieben">
+<!ENTITY addSubscription.label "Filtera&amp;bonnement hinzufügen">
+<!ENTITY subscription.homepage.label "Webseite">
+<!ENTITY backup.complete.title "Alle Filter und alle Filterabonnements">
+<!ENTITY restore.own.label "Eigene Sicherung wiederherstellen">
+<!ENTITY restore.complete.warning "Alle Ihre Filtereinstellungen werden durch den Inhalt dieser Datei ersetzt. Wollen Sie fortfahren?">
+<!ENTITY filters.tab.label "Eigene Filter">
+<!ENTITY backup.label "Neue Sicherung erstellen">
+<!ENTITY find.label "Filter durch&amp;suchen">
+<!ENTITY subscription.moveDown.label "Nach unten verschieben">
+<!ENTITY subscription.lastDownload.connectionError "Fehler, Herunterladen fehlgeschlagen">
+<!ENTITY subscription.lastDownload.success "Erfolgreich">
+<!ENTITY subscription.lastDownload.invalidData "Fehler, keine gültige Filterliste">
+<!ENTITY filter.paste.label "Einfügen">
+<!ENTITY subscription.disabledFilters.enable "Deaktivierte Filter aktivieren">
+<!ENTITY lasthit.column "Let&amp;zter Treffer">
+<!ENTITY subscription.editTitle.label "Umbenennen">
+<!ENTITY subscription.disabledFilters.warning "Einige Filter in dieser Filterliste sind deaktiviert.">
+<!ENTITY filter.column "&amp;Filterregel">
+<!ENTITY subscription.lastDownload.label "Zuletzt aktualisiert:">
+<!ENTITY viewList.label "Liste öffnen">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/firstRun.properties
new file mode 100644
index 0000000..98089de
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Privates Surfen durch Deaktivierung der Tracker - Versteckt Ihr Surfverhalten vor Werbefirmen, die Sie sonst ausspionieren würden.
+firstRun_toggle_off=AUS
+firstRun_feature_tracking=Verfolgung ausschalten
+firstRun_feature_malware=Malware-Blockierung
+firstRun_title=Adblock Plus wurde installiert
+firstRun_toggle_on=AN
+firstRun_acceptableAdsExplanation=Wir möchten Webseiten dazu ermutigen schlichte und unaufdringliche Werbung zu verwenden. Deshalb werden durch <a>strenge Richtlinien</a> akzeptable Werbeanzeigen bestimmt, welche unter Standard-Einstellungen noch angezeigt werden. Wenn Sie jedoch alle Werbungen blockieren möchten, können Sie diese Einstellung in kurzer Zeit <a>deaktivieren</a>.
+firstRun_contributor_credits=Mitwirkende
+firstRun_dataCorruptionWarning=Wird diese Seite immer wieder angezeigt? <a>Bitte hier klicken!</a>
+firstRun_acceptableAdsHeadline=Lästige Werbung wird jetzt blockiert
+firstRun_share=Weiterempfehlen
+firstRun_share_headline=<a>Bitte unterstützen Sie uns</a> dabei, das Internet zu einem besseren Ort zu machen
+firstRun_feature_social_description=Entfernt Social-Media-Buttons (z.B. den Facebook-Like) die auf Webseiten erscheinen und Ihr Surfverhalten aufzeichnen.
+firstRun_filterlistsReinitializedWarning=Es scheint, als ob aufgrund eines Problems alle Filter entfernt wurden und wir keine Sicherung wiederherstellen konnten. Deshalb wurden alle Ihre Filter sowie Ihre Einstellungen für akzeptable Werbung zurückgesetzt werden. Überprüfen Sie bitte Ihre Filterliste und Ihre Einstellungen für akzeptable Werbung in den <a>Adblock Plus Optionen</a>.
+firstRun_feature_malware_description=Sicheres Surfen durch Blockieren von infizierten Webseiten.
+firstRun_features=Adblock Plus kann mehr als nur Werbung blockieren
+firstRun_donate=Spenden
+firstRun_donate_label=Unterstützen Sie unser Projekt
+firstRun_feature_social=Social Media-Buttons entfernen
+firstRun_legacySafariWarning=Sie verwenden eine ältere Version von Safari, die nicht von Adblock Plus unterstützt wird. Es kann sein, dass Adblock Plus damit nicht richtig funktioniert oder dass bestimmte Websites nicht richtig dargestellt werden. Wir empfehlen deshalb dringend, entweder einen Upgrade auf Safari 6.1.1 oder höher (auf OS X 10.8 Mountain Lion) oder auf Safari 7.0.1 oder höher (auf OS X 10.9 Mavericks) durchzuführen oder die neueste Version von Mozilla Firefox, Google Chrome oder Opera zu verwenden.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/global.properties
new file mode 100644
index 0000000..da3cac2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Auf der geöffneten Seite gibt es keine Elemente, die blockiert werden könnten
+action3_tooltip=Adblock Plus ein- bzw. ausschalten
+notification_antiadblock_title=Zielgerichtete Nachrichten ausblenden?
+type_label_script=Skript
+filter_elemhide_nocriteria=Keine Kriterien angegeben, um das zu versteckende Element zu erkennen
+blockingGroup_title=Blockierregeln
+whitelisted_tooltip=Adblock Plus ist auf dieser Seite deaktiviert.
+type_label_stylesheet=Stylesheet
+blocked_count_tooltip=?1? von ?2?
+type_label_font=Schriftart
+type_label_popup=Pop-up-Fenster
+filter_regexp_tooltip=Dieser Filter ist entweder ein regulärer Ausdruck oder zu kurz zum Optimieren. Zu viele solche Filter könnten Ihren Browser verlangsamen.
+action0_tooltip=Kontextmenü anzeigen. Mittlere Maustaste schaltet Adblock Plus ein und aus.
+whitelisted_page=Adblock Plus wurde für die geöffnete Seite deaktiviert
+remove_group_warning=Sind Sie sicher, dass Sie diese Filtergruppe entfernen möchten?
+action1_tooltip=Liste blockierbarer Elemente öffnen bzw. schließen. Mittlere Maustaste schaltet Adblock Plus ein und aus.
+type_label_xmlhttprequest=XML-Anfrage
+active_tooltip=Adblock Plus ist aktiv, ?1? Filterabonnement(s) und ?2? eigene Filter werden verwendet.
+type_label_document=Dokument
+type_label_object_subrequest=Objekt-Anfrage
+whitelistGroup_title=Ausnahmeregeln
+disabled_tooltip=Adblock Plus ist deaktiviert.
+filter_elemhide_duplicate_id=Nur ein ID-Wert des zu versteckenden Elements kann angegeben werden
+type_label_object=Objekt
+action2_tooltip=Adblock Plus Einstellungen öffnen. Mittlere Maustaste schaltet Adblock Plus ein und aus.
+type_label_subdocument=Frame
+clearStats_warning=Alle Trefferstatistiken werden zurückgesetzt und Filtertreffer werden in Zukunft nicht mehr gezählt. Wollen Sie fortfahren?
+notification_antiadblock_message=Diese Seite hat in der Vergangenheit Adblock Plus-Nutzern gezielt Nachrichten angezeigt. Soll Adblock Plus Nachrichten dieser Art verstecken?
+blocked_count_addendum=(außerdem Ausnahmen: ?1?, versteckte Elemente: ?2?)
+subscription_invalid_location=Die eingegebene Adresse ist weder eine gültige Web-Adresse, noch ein gültiger Dateiname.
+type_label_image=Grafik
+remove_subscription_warning=Sind Sie sicher, dass Sie dieses Abonnement entfernen möchten?
+type_label_other=Unbekannt
+mobile_menu_enable=ABP: Aktivieren
+type_label_media=Audio/Video
+mobile_menu_disable_site=ABP: Deaktivieren auf ?1?
+elemhideGroup_title=Regeln zum Verstecken von Elementen
+mobile_menu_enable_site=ABP: Aktivieren auf ?1?
+type_label_elemhide=Versteckt
+newGroup_title=Neue Filtergruppe
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/overlay.dtd
new file mode 100644
index 0000000..7007b24
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Ja">
+<!ENTITY notification.button.no "&amp;Nein">
+<!ENTITY sync.label "Adblock Plus-Einstellungen s&amp;ynchonisieren">
+<!ENTITY whitelist.site.label "Deaktivieren: auf ?1?">
+<!ENTITY filters.label "Filterein&amp;stellungen">
+<!ENTITY disable.label "Überall deaktivieren">
+<!ENTITY objecttab.title "Blockieren">
+<!ENTITY objecttab.tooltip "Klicken Sie hier, um dieses Objekt mit Adblock Plus zu blockieren">
+<!ENTITY menuitem.label "&amp;Adblock Plus - Einstellungen">
+<!ENTITY objecttabs.label "Ta&amp;b zum Blockieren von Flash und Java anzeigen">
+<!ENTITY sendReport.label "&amp;Fehler auf dieser Seite melden">
+<!ENTITY whitelist.page.label "Deaktivieren: nur auf dieser Seite">
+<!ENTITY context.image.label "Adblock Plus: Grafik blockieren">
+<!ENTITY counthits.label "Filtertreffer &amp;zählen">
+<!ENTITY opensidebar.label "&amp;Blockierbare Elemente öffnen">
+<!ENTITY notification.button.close "&amp;Schließen">
+<!ENTITY contribute.label "Zu Adblock Plus beitragen">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Frame blockieren">
+<!ENTITY blocked.tooltip "Blockierte Elemente auf dieser Seite:">
+<!ENTITY hideplaceholders.label "P&amp;latzhalter blockierter Elemente verstecken">
+<!ENTITY showinstatusbar.label "In &amp;Statusleiste anzeigen">
+<!ENTITY sidebar.title "Elemente der geöffneten Seite">
+<!ENTITY options.label "&amp;Optionen">
+<!ENTITY context.object.label "Adblock Plus: Objekt blockieren">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Auf dieser Seite wieder aktivieren">
+<!ENTITY filters.tooltip "Am meisten angewandte Filter:">
+<!ENTITY closesidebar.label "&amp;Blockierbare Elemente schließen">
+<!ENTITY showintoolbar.label "In Symbolleis&amp;te anzeigen">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Audio-/Video-Element blockieren">
+<!ENTITY subscription.update.label "Filter aktualisieren">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/sendReport.dtd
new file mode 100644
index 0000000..5dfc848
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/sendReport.dtd
@@ -0,0 +1,105 @@
+<!ENTITY screenshot.undo.label "&amp;Rückgängig">
+<!ENTITY issues.disabledgroups.description "Die folgenden Filterabonnements / Filtergruppen sind deaktiviert, hätten jedoch
+ einen Einfluss auf diese Webseite:">
+<!ENTITY showData.label "Berichtdaten anzeigen">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blockiert zu &amp;viel">
+<!ENTITY issues.change.description "Ihre Einstellungen wurden geändert. Bitte laden Sie die Seite neu, um die Änderungen
+ jetzt zu testen. Bitte melden Sie den Fehler, falls das Problem durch die
+ Änderungen nicht gelöst wurde.">
+<!ENTITY email.label "E-&amp;Mail:">
+<!ENTITY issues.openPreferences.label "Filtereinstellungen öffnen">
+<!ENTITY sendPage.confirmation "Ihr Bericht wurde gespeichert. Sie können Ihn unter der folgenden Adresse aufrufen:">
+<!ENTITY copyLink.label "Lin&amp;k zum Bericht kopieren">
+<!ENTITY issues.nofilters.description "Adblock Plus blockiert auf dieser Seite nichts. Das Problem, das Sie sehen, wurde
+ wahrscheinlich nicht von Adblock Plus verursacht.">
+<!ENTITY sendPage.knownIssue "Das Problem, das Sie berichtet haben, ist möglicherweise bereits bekannt. Zusätzliche Information:">
+<!ENTITY typeSelector.other.description "Wählen Sie diese Option, falls Sie ein Problem mit Adblock Plus selber und nicht
+ mit dessen Filtern vermuten.">
+<!ENTITY issues.disabledgroups.enable.label "Filterabonnement / Filtergruppe aktivieren">
+<!ENTITY typeWarning.override.label "Ich &amp;verstehe und will trotzdem einen Fehlerbericht einsenden">
+<!ENTITY issues.disabled.enable.label "Adblock Plus aktivieren">
+<!ENTITY update.fixed.description "Die Aktualisierung Ihrer Filterabonnements hat das Problem wahrscheinlich
+ bereits gelöst. Bitte laden Sie die Seite neu und senden Sie den Fehlerbericht
+ noch einmal ab, falls das Problem weiterhin besteht.">
+<!ENTITY anonymous.label "&amp;Anonymer Beitrag">
+<!ENTITY reloadButton.label "Seite &amp;neu laden">
+<!ENTITY recentReports.clear.label "Alle Be&amp;richte löschen">
+<!ENTITY typeSelector.description "Dieser Assistent wird Sie durch die nötigen Schritte zum Melden eines Adblock Plus-Fehlers
+ leiten. Zuerst wählen Sie bitte die Art des Fehlers, den Sie auf dieser Seite
+ beobachten:">
+<!ENTITY screenshot.remove.label "&amp;Private Informationen löschen">
+<!ENTITY issues.ownfilters.description "Einige der Filter, die auf dieser Seite angewandt wurden, sind benutzerdefiniert.
+ Bitte deaktivieren Sie Filter, die das Problem verursacht haben könnten:">
+<!ENTITY update.inProgress.description "Adblock Plus muss Ihre Filterabonnements aktualisieren, um sicherzustellen,
+ dass das Problem nicht bereits gelöst ist. Bitte warten Sie ...">
+<!ENTITY sendPage.retry.label "Noch einmal senden">
+<!ENTITY data.label "Bericht&amp;daten:">
+<!ENTITY recentReports.label "Ihre zuletzt gesendeten Fehlerberichte">
+<!ENTITY typeWarning.description "Sie haben angedeutet, dass Sie ein allgemeines Problem mit Adblock Plus melden wollen
+ und kein Filterproblem. Bitte beachten Sie, dass solche Probleme am besten im
+ [link]Adblock Plus Forum[/link] gemeldet werden sollten. Den Fehlerberichts-Assistenten
+ sollte man nur als Ergänzung zu einer vorhandenen Diskussion verwenden. Sie müssen
+ den Link zu Ihrem Fehlerbericht angeben, weil ihn sonst niemand sehen wird.
+ Diesen automatisch generierten Link bekommen Sie nach dem Senden des Berichts.">
+<!ENTITY issues.disabled.description "Adblock Plus ist deaktiviert, in diesem Zustand wird es nichts blockieren.">
+<!ENTITY attachExtensions.label "Liste aktiver Er&amp;weiterungen anhängen für den Fall, dass das Problem von einer anderen Erweiterung verursacht wird">
+<!ENTITY issues.nosubscriptions.add.label "Filterabonnement hinzufügen">
+<!ENTITY issues.disabledfilters.enable.label "Filter aktivieren">
+<!ENTITY issues.override.label "Die Einstellungen sind so &amp;korrekt, mit dem Fehlerbericht fortfahren">
+<!ENTITY issues.nosubscriptions.description "Es scheint, dass Sie keine der fertigen Filterlisten abonniert haben. Ein solches
+ kostenloses Abonnement ist jedoch erforderlich, um automatisch Werbung zu entfernen.">
+<!ENTITY typeSelector.falsePositive.description "Wählen Sie diese Option, falls auf der Seite wichtige Inhalte fehlen, die Seite
+ falsch angezeigt wird oder nicht korrekt funktioniert. Sie können feststellen,
+ ob Adblock Plus das Problem verursacht, indem Sie es vorübergehend deaktivieren.">
+<!ENTITY typeSelector.other.label "An&amp;derer Fehler">
+<!ENTITY emailComment.label "Wir empfehlen Ihnen, eine gültige e-Mail-Adresse einzugeben, damit wir Sie kontaktieren können, falls es Fragen zu Ihrem Bericht gibt. Es erlaubt uns, Ihre Beiträge zu erkennen und diesen höhere Prioritäten beizumessen.">
+<!ENTITY issues.whitelist.remove.label "Adblock Plus auf dieser Seite wieder aktivieren">
+<!ENTITY outdatedSubscriptions.description "Die folgenden Filterabonnements wurden mindesten zwei Wochen lang nicht
+ aktualisiert. Bitte aktualisieren Sie diese, bevor Sie einen Fehlerbericht
+ senden, das Problem könnte bereits gelöst sein.">
+<!ENTITY dataCollector.description "Bitte warten Sie einige Augenblicke, während Adblock Plus die benötigten Daten sammelt.">
+<!ENTITY sendButton.label "Bericht ab&amp;senden">
+<!ENTITY comment.label "&amp;Kommentar (optional):">
+<!ENTITY sendPage.errorMessage "Beim Senden des Berichts ist ein Fehler aufgetreten (Fehlercode &quot;?1?&quot;).
+ Bitte stellen Sie sicher, dass Sie mit dem Internet verbunden sind, und versuchen
+ Sie, den Bericht noch einmal zu senden. Falls das Problem bestehen bleibt, wenden
+ Sie sich an das [link]Adblock Plus Forum[/link].">
+<!ENTITY showRecentReports.label "Zuletzt gesendeten Fehlerberichte anzeigen">
+<!ENTITY commentPage.heading "Kommentar eingeben">
+<!ENTITY update.start.label "Aktualisierung starten">
+<!ENTITY issues.disabledfilters.description "Die folgenden Filter sind deaktiviert, hätten jedoch einen Einfluss auf diese Webseite:">
+<!ENTITY screenshot.description "Dieselbe Seite kann bei verschiedenen Leuten verschieden aussehen. Deswegen könnte es
+ hilfreich sein, wenn Sie zu Ihrem Bericht ein Bild der Webseite hinzufügen. Sie können
+ Teile der Seite entfernen, falls sie private Informationen enthalten. Ebenso können
+ Sie Stellen markieren, wo das Problem deutlich wird. Klicken Sie dafür die entsprechende
+ Taste und markieren Sie den Bereich auf dem Bild mit der Maus.">
+<!ENTITY screenshot.attach.label "Dieses &amp;Bild meinem Bericht hinzufügen">
+<!ENTITY issues.whitelist.description "Adblock Plus ist derzeit deaktiviert auf der Seite, für die Ihr Bericht gesendet werden
+ soll. Bitte aktivieren Sie Adblock Plus wieder und laden Sie die Seite neu, bevor Sie
+ den Fehler melden. Das wird die Untersuchung des Problems vereinfachen.">
+<!ENTITY typeSelector.falseNegative.label "Eine &amp;Werbeeinblendung wird von Adblock Plus nicht blockiert">
+<!ENTITY typeSelector.heading "Fehlerart wählen">
+<!ENTITY anonymity.warning "Es ist uns nicht möglich sich erneut an Sie zu wenden und wir werden Ihrem Bericht eine niedrigere Priorität beimessen.">
+<!ENTITY wizard.title "Fehler melden">
+<!ENTITY issues.ownfilters.disable.label "Filter deaktivieren">
+<!ENTITY commentPage.description "Unten können Sie einen Kommentar eingeben, um uns zu helfen, das Problem zu verstehen.
+ Das ist zwar optional, ist jedoch empfohlen, falls das Problem nicht offensichtlich ist.
+ Sie können auch die Daten Ihres Berichts überprüfen, bevor sie gesendet werden.">
+<!ENTITY comment.lengthWarning "Ihr Kommentar ist länger als 1000 Zeichen. Nur die ersten 1000 Zeichen werden gesendet.">
+<!ENTITY typeSelector.falseNegative.description "Wählen Sie diese Option, falls Werbung auf der Seite angezeigt wird, obwohl
+ Adblock Plus aktiviert ist.">
+<!ENTITY sendPage.waitMessage "Bitte warten Sie, während Adblock Plus Ihren Bericht sendet.">
+<!ENTITY dataCollector.heading "Willkommen zum Fehlerberichts-Assistenten">
+<!ENTITY screenshot.heading "Bildschirmfoto hinzufügen">
+<!ENTITY sendPage.heading "Bericht absenden">
+<!ENTITY issues.subscriptionCount.description "Es scheint, dass Sie zu viele Filterlisten abonniert haben. Das ist nicht
+ empfohlen, weil die Wahrscheinlichkeit von Problemen dadurch sehr stark
+ ansteigt. Wir können außerdem Ihren Fehlerbericht nicht annehmen, weil unklar
+ ist, welche Filterliste für das Problem verantwortlich ist. Bitte entfernen
+ Sie alle bis auf die wirklich notwendigen Filterabonnements und überprüfen
+ Sie dann, ob das Problem immer noch auftritt.">
+<!ENTITY screenshot.mark.label "Proble&amp;m markieren">
+<!ENTITY privacyPolicy.label "Datenschutzerklärung">
+<!ENTITY issues.description "Adblock Plus hat Probleme in Ihren Einstellungen gefunden, die für das vorliegende
+ Problem verantwortlich sein könnten oder eine Untersuchung des Problems behindern
+ würden.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/sidebar.dtd
new file mode 100644
index 0000000..cac33e3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Position des Elements aufzeigen">
+<!ENTITY address.label "Adresse">
+<!ENTITY context.open.label "Adresse in neuem Tab öffnen">
+<!ENTITY type.label "Typ">
+<!ENTITY tooltip.filterSource.label "Herkunft des Filters:">
+<!ENTITY noitems.label "Keine blockierbaren Elemente">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Größe:">
+<!ENTITY reattach.label "Ankoppeln">
+<!ENTITY search.label "&amp;Suchen:">
+<!ENTITY docDomain.thirdParty "(Anfrage zu einer Drittseite)">
+<!ENTITY filterSource.label "Filterquelle">
+<!ENTITY tooltip.docDomain.label "Ursprungsdomain:">
+<!ENTITY context.copy.label "Adresse des Elements kopieren">
+<!ENTITY tooltip.type.label "Typ:">
+<!ENTITY context.disablefilter.label "Filter ?1? deaktivieren">
+<!ENTITY context.copyFilter.label "Filter kopieren">
+<!ENTITY context.block.label "Dieses Element blockieren">
+<!ENTITY context.enablefilter.label "Filter ?1? wieder aktivieren">
+<!ENTITY detach.label "Abkoppeln">
+<!ENTITY whitelisted.label "Deaktiviert auf dieser Seite">
+<!ENTITY context.disablefilteronsite.label "Diesen Filter auf ?1? deaktivieren">
+<!ENTITY detached.title "Adblock Plus: Elemente der geöffneten Seite (abgekoppelt)">
+<!ENTITY docDomain.firstParty "(Anfrage zu derselben Domain)">
+<!ENTITY tooltip.type.whitelisted "(Ausnahmeregel aktiv)">
+<!ENTITY tooltip.filter.label "Angewandter Filter:">
+<!ENTITY tooltip.filter.disabled "(deaktiviert)">
+<!ENTITY context.editfilter.label "Angewandten Filter bearbeiten">
+<!ENTITY tooltip.type.blocked "(blockiert)">
+<!ENTITY size.label "Größe">
+<!ENTITY context.whitelist.label "Ausnahmeregel für das Element hinzufügen">
+<!ENTITY context.selectAll.label "Alles auswählen">
+<!ENTITY state.label "Status">
+<!ENTITY docDomain.label "Ursprungsdomain">
+<!ENTITY tooltip.address.label "Addresse:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/subscriptionSelection.dtd
new file mode 100644
index 0000000..ee00470
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Filterabonnement »?1?« auc&amp;h hinzufügen">
+<!ENTITY list.download.failed "Adblock Plus konnte die Liste der Filterabonnements nicht herunterladen.">
+<!ENTITY list.download.retry "Nochmal versuchen">
+<!ENTITY title.label "Be&amp;zeichnung des Abonnements:">
+<!ENTITY list.download.website "Internetseite ansehen">
+<!ENTITY supplementMessage "Dieses Filterabonnement sollte in Verbindung mit dem Filterabonnement »?1?« verwendet werden.">
+<!ENTITY viewList.label "Filter ansehen">
+<!ENTITY visitHomepage.label "Webseite der Filterliste besuchen">
+<!ENTITY addSubscription.label "Filterabonnement hinzufügen">
+<!ENTITY dialog.title "Filterabonnement für Adblock Plus hinzufügen">
+<!ENTITY location.label "Ad&amp;resse der Filterliste:">
+<!ENTITY fromWeb.description "Bitte bestätigen Sie, dass Sie dieses Filterabonnement hinzufügen möchten. Die Bezeichnung und Adresse der Abonnements können vor dem Hinzufügen geändert werden.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/composer.dtd
new file mode 100644
index 0000000..1b3fd03
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "na kóń&amp;cu adrese">
+<!ENTITY domainRestriction.label "WobgranicowaÅ› na &amp;domenu:">
+<!ENTITY collapse.default.no.label "Standard wužywaś (ně)">
+<!ENTITY firstParty.label "&amp;Jano prědny bok">
+<!ENTITY preferences.label "&amp;Eksistěrujuce filtry pokazaś...">
+<!ENTITY pattern.label "Muster pytaÅ›">
+<!ENTITY thirdParty.label "Jano &amp;tśeśi bok">
+<!ENTITY filter.label "Nowy &amp;filter:">
+<!ENTITY collapse.label "B&amp;lokěrowane złožyś:">
+<!ENTITY match.warning "Muster, kótaryž sćo zapódał, wěcej njewótpowědujo adresy, kótaraž ma se blokěrowaś/do běłeje lisćiny pśewześ a njezmějo žedno wustatkowanje na nju.">
+<!ENTITY anchor.start.label "na zac&amp;hopjeńku adrese">
+<!ENTITY matchCase.label "&amp;Na wjelikopisanje źiwaś">
+<!ENTITY custom.pattern.label "&amp;Swójski:">
+<!ENTITY unselectAllTypes.label "Žeden wubraś">
+<!ENTITY type.whitelist.label "&amp;Wuwześowe pšawidło">
+<!ENTITY regexp.warning "Muster, kótaryž sćo zapódał, buźo se ako regularny wuraz interpretěrowaś, kótaryž njedajo se pśez Adblock Plus statkownje pśeźěłaś a mógł waš wobglědowak spomałšyś. Jolic njocośo regularny wuraz wužywaś, pśidajśo gwězdku (*) ke kóńcoju mustra.">
+<!ENTITY dialog.title "Filtrowe pšawidło Adblock Plus pśidaś">
+<!ENTITY basic.label "Zakładny naglěd">
+<!ENTITY type.filter.label "&amp;Blokěrujucy filter">
+<!ENTITY types.label "Na typy nałožyś:">
+<!ENTITY shortpattern.warning "Muster, kótaryž sćo zapódał, jo za optiměrowanje pśekrotko a mógł waš wobglědowak spomałšyś. Pśiraźujo se, až wubjerjośo dlěšy znamuškowy rjeśazk za toś ten filter, aby wy Adblock Plus dowólił, filter statkownjej pśeźěłał.">
+<!ENTITY collapse.yes.label "Jo">
+<!ENTITY anchors.label "Jano muster akceptěrowaś:">
+<!ENTITY collapse.default.yes.label "Standard wužywaś (jo)">
+<!ENTITY domainRestriction.help "Wužyjśo toś tu opciju, aby wy pódał jadnu domenu abo někotare domeny, kótarež wótdźěluju se pśez wertikalnu ceru (|). Filter buźo se jano na wubrane domeny nałožowaś. Tilda (~) pśed domenowym mjenim pódawa, až filter njebuźo se na tu domenu nałožowaś.">
+<!ENTITY accept.label "Filter pśidaś">
+<!ENTITY options.label "Opcije">
+<!ENTITY disabled.warning "Adblock Plus jo tuchylu znjemóžnjony. Móžośo hyšći filtry pśidaś, ale njebudu se nałožowaś, snaźkuli [link]zmóžnijośo Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "na zac&amp;hopjeńku mjenja domeny">
+<!ENTITY collapse.no.label "NÄ›">
+<!ENTITY selectAllTypes.label "Wšykne wubraś">
+<!ENTITY advanced.label "Rozšyrjony naglěd">
+<!ENTITY pattern.explanation "Muster móžo źěl adrese byś; gwězdki (*) funkcioněruju ako zastupujuce symbole. Filter buźo se janž na adrese nałožowaś, kótarež wótpowěduju pódanemu mustroju.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/filters.dtd
new file mode 100644
index 0000000..35ed52d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Wšykne waše swójske filtry budu se pśez wopśimjeśe wubraneje dataje narownowaś. Cośo dalej cyniś?">
+<!ENTITY slow.column "&amp;Pómałe filtry">
+<!ENTITY enabled.column "Z&amp;móžnjony">
+<!ENTITY subscription.lastDownload.checksumMismatch "Njeraźiło, wopacna kontrolna suma">
+<!ENTITY noFiltersInGroup.text "Wubrana kupka jo prozna.">
+<!ENTITY subscription.actions.label "Akcije">
+<!ENTITY filter.selectAll.label "Wšykno wubraś">
+<!ENTITY backupButton.label "&amp;Zawěsćiś a wótnowiś">
+<!ENTITY restore.minVersion.warning "Warnowanje: Dataja jo se pśez nowšu wersiju Adblock Plus napórała. Wy by měł na nejnowšu wersiju Adblock Plus aktualizěrowaś, nježli až wótnowijośo toś tu dataju.">
+<!ENTITY restore.error "Daty dataje njedaju se pśeźěłaś, jo móžno, až wóna njejo zawěsćeńska dataja Adblock Plus?">
+<!ENTITY sort.ascending.label "Sortěrow&amp;ański pórěd A &gt; Z">
+<!ENTITY sort.label "&amp;Sortěrowaś pó">
+<!ENTITY subscription.source.label "Filtrowa lisćina">
+<!ENTITY hitcount.column "&amp;Trjefarje">
+<!ENTITY noFilters.text "Njejsćo žedne swójske filtry.">
+<!ENTITY backup.custom.title "Jano swójske filtry">
+<!ENTITY subscription.external.label "Pśez druge rozšyrjenje aktualizěrowany">
+<!ENTITY subscription.delete.label "Lašowaś">
+<!ENTITY noGroupSelected.text "Musyśo filtrowu kupku wubraś, nježli až jeje filtry daju se pokazaś.">
+<!ENTITY filter.cut.label "Wurězaś">
+<!ENTITY restore.default.label "Zawěsćeńsku kopiju z ?1? wótnowiś">
+<!ENTITY subscription.lastDownload.inProgress "Ześěgujo se...">
+<!ENTITY subscriptions.tab.label "Filtrowe abonementy">
+<!ENTITY sort.descending.label "Sortěrowański pórěd &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Cośo napšawdu wšykne wubrane filtry wótpóraś?">
+<!ENTITY filter.delete.label "Lašowaś">
+<!ENTITY addSubscriptionAdd.label "Pśidaś">
+<!ENTITY viewMenu.label "Naglěd">
+<!ENTITY subscription.lastDownload.unknown "Njejo nic k dispoziciji">
+<!ENTITY addSubscriptionCancel.label "Pśetergnuś">
+<!ENTITY subscription.enabled.label "Zmóžnjony">
+<!ENTITY noSubscriptions.text "Njejsćo hyšći žedne filtrowe abonementy pśidał. Adblock Plus njebuźo bjez filtrow nic blokěrowaś, pšosym wužyjśo &quot;Filtrowy abonement pśidaś&quot;, aby filter přidał.">
+<!ENTITY subscription.update.label "Filtry akutalizěrowaś">
+<!ENTITY dialog.title "Adblock Plus - filtrowe nastajenja">
+<!ENTITY addFilter.label "Filter pśi&amp;daś">
+<!ENTITY subscription.minVersion.warning "Toś ten filtrowy abonement pomina se nowšu wersiju Adblock Plus, wy by měł na nejnowšu wersiju Adblock Plus aktualizěrowaś.">
+<!ENTITY subscription.lastDownload.invalidURL "Njeraźiło, žedna płaśiwa adresa">
+<!ENTITY backup.error "Pśi pisanju filtrow do dataje jo zmólka namakała. Zawěsććo, až dataja njejo pśeśiwo pisanjeju šćitana abo njewužywa se pśez drugi program.">
+<!ENTITY filter.moveUp.label "Górjej">
+<!ENTITY addGroup.label "Filtrowu &amp;kupku pśidaś">
+<!ENTITY filter.edit.label "Wobźěłaś">
+<!ENTITY subscription.showHideFilters.label "Filtry pokazaÅ›/schowaÅ›">
+<!ENTITY acceptableAds2.label "De&amp;centne wabjenje dowóliś">
+<!ENTITY addSubscriptionOther.label "Drugi abonement pśidaś">
+<!ENTITY close.label "ZacyniÅ›">
+<!ENTITY sort.none.label "&amp;Njesortěrowany">
+<!ENTITY filter.actions.label "Filtrowe akcije">
+<!ENTITY filter.copy.label "Kopěrowaś">
+<!ENTITY filter.moveDown.label "Dołoj">
+<!ENTITY filter.resetHitCounts.label "Statistiku slědk stajiś">
+<!ENTITY readMore.label "Dalšne informacije">
+<!ENTITY subscription.moveUp.label "Górjej">
+<!ENTITY addSubscription.label "&amp;Filtrowy abonement pśidaś">
+<!ENTITY subscription.homepage.label "Startowy bok">
+<!ENTITY backup.complete.title "Wšykne filtry a abonementy">
+<!ENTITY restore.own.label "Swójsku zawěsćeńsku kopiju wótnowiś">
+<!ENTITY restore.complete.warning "Wšykne waše filtrowe nastajenja budu se pśez wopśimjeśe wubraneje dataje narownowaś. Cośo dalej cyniś?">
+<!ENTITY filters.tab.label "Swójske filtry">
+<!ENTITY backup.label "Nowu zaěsćeńsku kopiju napóraś">
+<!ENTITY find.label "&amp;PytaÅ›">
+<!ENTITY subscription.moveDown.label "Dołoj">
+<!ENTITY subscription.lastDownload.connectionError "Njeraźiło, ześěgnjeńska zmólka">
+<!ENTITY subscription.lastDownload.success "Wuspěch">
+<!ENTITY subscription.lastDownload.invalidData "Njeporaźiło, žedna płaśiwa filtrowa lisćina">
+<!ENTITY filter.paste.label "ZasunuÅ›">
+<!ENTITY subscription.disabledFilters.enable "Znjemóžnjone filtry zmóžniś">
+<!ENTITY lasthit.column "S&amp;lědny trjefaŕ">
+<!ENTITY subscription.editTitle.label "Titel wobźěłaś">
+<!ENTITY subscription.disabledFilters.warning "Někotare filtry w toś tom abonomenśe su znjemóžnjone.">
+<!ENTITY filter.column "&amp;Filtrowe pšawidło">
+<!ENTITY subscription.lastDownload.label "Slědne ześěgnjenje:">
+<!ENTITY viewList.label "Lisćinu pokazaś">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/firstRun.properties
new file mode 100644
index 0000000..fa8cf6a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Pśeglědujśo priwatnje, z tym až znjemóžnjujośo slědowanje resp. zatajaśo swóje slědy pśed wabjeńskimi pśedewześami, kótarež by rady kuždemu z wašych pógibow slědowali.
+firstRun_toggle_off=WUÅ ALTOWANY
+firstRun_feature_tracking=Slědowanje znjemóžniś
+firstRun_feature_malware=Škódnu software blokěrowaś
+firstRun_title=Adblock Plus jo se instalěrował
+firstRun_acceptableAdsExplanation=My by rady websedła pózbuźili, wuwěrne, decentne wabjenje wužywaś. Togodla smy <a>kšute směrnice</a> póstajili, aby my akceptabelne wabjenje identificěrowali, kótarež pokazujo se w standardnych nastajenjach. Jolic cośo weto wšykne wabjenje blokěrowaś, móžośo jo w běgu mało sekundow <a>znjemóžniś</a>.
+firstRun_toggle_on=ZAÅ ALTOWANY
+firstRun_contributor_credits=Źěkowanje sobustatkujucym
+firstRun_dataCorruptionWarning=Pokazujo se toś ten bok dalej? <a>Klikniśo how!</a>
+firstRun_acceptableAdsHeadline=Gramne wabjenje buźo se něnto blokěrowaś
+firstRun_share=Informěrujśo swóje pśijaśele
+firstRun_share_headline=<a>Pódajśo nam ruku</a>, aby my web k lěpšemu městnoju cynili
+firstRun_features=Adblock Plus móžo wěcej cyniś ako wabjenje blokěrowaś
+firstRun_feature_malware_description=Cyńśo swójo pśeglědowanje wěsćejše, z tym až blokěrujośo znate domeny złosneje softwary.
+firstRun_feature_social_description=Wótpórajśo swóju pśeglědowańsku aktiwitu z tłocaškow socialnych medijow, ako na pś. tłocaška "Spódoba se mě" na Facebooku, kótarež pokazuju se na webbokach a slěduju wašomu zaźaržanjeju.
+firstRun_donate=pósćiś
+firstRun_donate_label=Pódprějśo naš projekt
+firstRun_feature_social=Tłocaški za socialne medije wótpóraś
+firstRun_legacySafariWarning=Wužywaśo staru wersiju Safari, kótaraž njepódpěra se pśez Adblock Plus. Wón njebuźo snaź korektnje funkcioněrowaś abo by mógał wužywarske dožywjenje na wěstych websedłach kazyś. Pśiraźujomy wuraznje, až pak aktualizěrujośo na Safari 6.1.1 abo wušu wersiju (stoj za Mac OS X 10.8 Mountain Lion k dispoziciji) abo Safari 7.0.1 abo wušu wersiju (na OS X 10.9 Mavericks) pak wužywaśo nejnowšu wersiju Mozilla Firefox, Google Chrome abo Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/global.properties
new file mode 100644
index 0000000..3b6e734
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Žedne blokěrujobne zapiski na toś tom boku
+action3_tooltip=Kliknuś, aby se Adblock Plus zmóžnił/znjemóžnił.
+notification_antiadblock_title=Celowe powěźeńki schowaś?
+type_label_script=skript
+filter_elemhide_nocriteria=Njejsu žedne kriterije pódane, aby element spóznał, kótaryž ma se schowaś
+blockingGroup_title=Pšawidła za blokěrowanje wabjenja
+whitelisted_tooltip=Adblock Plus jo znjemóžnjony na aktualnem boku.
+type_label_stylesheet=stilowa pśedłoga
+blocked_count_tooltip=?1? z ?2?
+type_label_font=pismo
+type_label_popup=Wuskokujuce wokno
+filter_regexp_tooltip=Toś ten filter jo pak regularny wuraz pak pśekrotko za optiměrowanje. Pśewjele toś tych filtrow by mógło waš wobglědowak spomałšyś.
+action0_tooltip=Kliknuś, aby kontekstowy meni do prědka pśinjasć, ze srjejźneju tastu kliknuś, aby zmóžnił(znjemóžnił.
+whitelisted_page=Adblock Plus jo se za aktualny bok znjemóžnił
+remove_group_warning=Cośo toś tu kupku napšawdu wótpóraś?
+action1_tooltip=Kliknuś, aby se blokěrujobne zapiski wócynili/zacynili, ze srjejźneju tastu kliknuś, aby zmóžnił/znjemóžnił.
+type_label_xmlhttprequest=XML-napšašowanje
+active_tooltip=Adblock Plus jo zmóžnjony, ?1? filtrowe abonementy a ?2? swójske filtry se wužywaju.
+type_label_document=dokument
+type_label_object_subrequest=objektowe pódnapšašowanje
+whitelistGroup_title=Wuwześowe pšawidła
+disabled_tooltip=Adblock Plus jo znjemóžnjony.
+filter_elemhide_duplicate_id=Jano jaden ID elementa, kótaryž ma se schowaś, dajo se pódaś
+type_label_object=objekt
+action2_tooltip=Kliknuś, aby se nastajenja wócynili, ze srjejźneju tastu kliknuś, aby zmóžnił/znjemóžnił.
+type_label_subdocument=wobłuk
+clearStats_warning=To stajijo wšu filtrowu statistiku slědk a znjemóžnijo licenje filtrowych wótpowědnikow. Cośo pókšacowaś?
+notification_antiadblock_message=Toś to sedło jo za to znate, až pokazujo celowe powěźeńki za wužywarje Adblock Plus. Cośo, až Adblock Plus chowa celowe powěźeńki?
+blocked_count_addendum=(teke w běłej lisćinje: ?1?, schowane: ?2?)
+subscription_invalid_location=Městno filtroweje lisćiny njejo daniž płaśiwy URL daniž płaśiwe datajowe mě.
+type_label_image=wobraz
+remove_subscription_warning=Cośo toś ten abonement napšawdu wótpóraś?
+type_label_other=druge
+mobile_menu_enable=ABP: Zmóžniś
+type_label_media=awdio/wideo
+mobile_menu_disable_site=ABP: Na ?1? znjemóžniś
+elemhideGroup_title=Pšawidła za schowanje elementow
+mobile_menu_enable_site=ABP: Na ?1? zmóžniś
+type_label_elemhide=schowany
+newGroup_title=Nowa filtrowa kupka
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/overlay.dtd
new file mode 100644
index 0000000..b5e7b62
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Jo">
+<!ENTITY notification.button.no "&amp;NÄ›">
+<!ENTITY sync.label "Nastajenja za syn&amp;chronizěrowanje Adblock Plus">
+<!ENTITY whitelist.site.label "Na ?1? znjemóžniś">
+<!ENTITY filters.label "&amp;Filtrowe nastajenja">
+<!ENTITY disable.label "Wšuźi znjemóžniś">
+<!ENTITY objecttab.title "Blokěrowaś">
+<!ENTITY objecttab.tooltip "Klikniśo how, aby toś ten objekt z Adblock Plus blokěrował">
+<!ENTITY menuitem.label "Adblock Plus - &amp;Nastajenja">
+<!ENTITY objecttabs.label "&amp;Rejtarki wó Flash a Java pokazaś">
+<!ENTITY sendReport.label "&amp;Problem na toś tom boku k wěsći daś">
+<!ENTITY whitelist.page.label "Jano na toś tom boku znjemóžniś">
+<!ENTITY context.image.label "Adblock Plus: Wobraz blokěrowaś">
+<!ENTITY counthits.label "Fi&amp;ltrowe trjefarje licyÅ›">
+<!ENTITY opensidebar.label "B&amp;lokěrujobne zapiski wócyniś">
+<!ENTITY notification.button.close "&amp;ZacyniÅ›">
+<!ENTITY contribute.label "K Adblock Plus pśinosowaś">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Wobłuk blokěrowaś">
+<!ENTITY blocked.tooltip "Blokěrowane zapiski na toś tom boku:">
+<!ENTITY hideplaceholders.label "Na&amp;městniki blokěrowanych elementow schowaś">
+<!ENTITY showinstatusbar.label "W &amp;statusowej lejstwje pokazaÅ›">
+<!ENTITY sidebar.title "Blokěrujobne zapiski na aktualnem boku">
+<!ENTITY options.label "&amp;Opcije">
+<!ENTITY context.object.label "Adblock Plus: Objekt blokěrowaś">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Na toś tom boku zasej zmóžniś">
+<!ENTITY filters.tooltip "Nejaktiwnjejše filtry:">
+<!ENTITY closesidebar.label "B&amp;lokěrujobne zapiski zacyniś">
+<!ENTITY showintoolbar.label "W symbolowej rÄ›&amp;dce pokazaÅ›">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Awdio/Wideo blokěrowaś">
+<!ENTITY subscription.update.label "Filtry akutalizěrowaś">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/sendReport.dtd
new file mode 100644
index 0000000..3637b33
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Anulěrowaś">
+<!ENTITY issues.disabledgroups.description "Slědujuce filtrowe abonementy/filtrowe kupki su znjemóžnjone, weto by mógli wustatkowanje na toś ten bok měś:">
+<!ENTITY showData.label "Daty rozpšawy pokazaś">
+<!ENTITY typeSelector.falsePositive.label "Ad&amp;block Plus blokěrujo pśewjele">
+<!ENTITY issues.change.description "Waša konfiguracija jo se změniła. Pšosym zacytajśo bok znowego, aby změny testował a wótpósćelśo rozpšawu, jolic problem njejo se pśez změny rozwězał.">
+<!ENTITY email.label "&amp;E-mail:">
+<!ENTITY issues.openPreferences.label "Filtrowe nastajenja wócyniś">
+<!ENTITY sendPage.confirmation "Waša rozpšawa jo se składowała. Móžośo ju pód slědujuceju adresu namakaś:">
+<!ENTITY copyLink.label "Wót&amp;kaz rozpšawy kopěrowaś">
+<!ENTITY issues.nofilters.description "Adblock Plus njeblokěrujo nic na aktualnem boku. Problem, kótaryž sćo k wěsći dał, nejskerjej njama z Adblock Plus cyniś.">
+<!ENTITY sendPage.knownIssue "Problem, wó kótaryž sćo rozpšawił, jo nejskerjej južo znaty. Dalšne informacije:">
+<!ENTITY typeSelector.other.description "Wubjeŕśo toś tu opciju, jolic gódaśo skerjej problem z Adblock Plus samym ako z jogo filtrami.">
+<!ENTITY issues.disabledgroups.enable.label "Filtrowy abonement/filtrowu kupku zmóžniś">
+<!ENTITY typeWarning.override.label "Roz&amp;měju a cu rozpšawu weto pósłaś">
+<!ENTITY issues.disabled.enable.label "Adblock Plus zmóžniś">
+<!ENTITY update.fixed.description "Aktualizacije za waše filtrowe abonementy su nejskerjej problem rozwězali, kótaryž sćo k wěsći dał. Pšosym zacytajśo bok znowego, wopytajśo hyšći raz a klikniśo zasej na 'Hyšći raz pósłaś', jolic problem hyšći wobstoj.">
+<!ENTITY anonymous.label "&amp;Anonymne słanje">
+<!ENTITY reloadButton.label "&amp;Bok znowego zacytaÅ›">
+<!ENTITY recentReports.clear.label "&amp;Wšykne rozpšawy wótpóraś">
+<!ENTITY typeSelector.description "Toś to wokno buźo wam pśez kšace wjasć, kótarež su trěbne za słanje wopisanja problemow z Adblock Plus. Wubjeŕśo pšosym nejpjerwjej družynu problema, na kótaryž sćo na toś tom boku starcył:">
+<!ENTITY screenshot.remove.label "&amp;Sensibelne daty wótpóraś">
+<!ENTITY issues.ownfilters.description "Někotare filtry, kótarež nałožuju se na toś ten bok, su wót wužywarja definěrowane. Pšosym znjemóžniśo filtry, kótarež by mógli problem zawinowaś:">
+<!ENTITY update.inProgress.description "Adblock Plus musy waše filtrowe abonementy aktualizěrowaś, aby zawěsćił, až problem njejo se hyšći rozwězał. Pšosym cakajśo...">
+<!ENTITY sendPage.retry.label "Hyšći raz pósłaś:">
+<!ENTITY data.label "&amp;Daty rozpšawy:">
+<!ENTITY recentReports.label "Waše njedawno wótpósłane rozpšawy">
+<!ENTITY typeWarning.description "Sćo pódał, až maš skerjej powšykny problem z Adblock Plus ako problem z filtrami. Pšosym źiwajśo na to, až take problemy by měli se nejlěpjej we [link]forumje Adblock Plus[/link] k wěsći daś. Wy by měł jano rozpšawniski asistent za problemy wužywaś, aby eksistěrujucu diskusiju wudopołnił, dokulaž nichten njewopóznajo se wašu rozpšawu, snaźkuli wy by wótkaz na njo dodaś. Awtomatiski napórany wótkaz dodajo se pó słanju rozpšawy.">
+<!ENTITY issues.disabled.description "Adblock Plus jo znjemóžnjony, njebuźo blokěrowaś nic w aktualnem statusu.">
+<!ENTITY attachExtensions.label "&amp;Lisćinu aktiwnych rozšyrjenjow k rozpšawje pśipowjesás, jolic konflikt z rozšyrjenim jo pśicyna problema">
+<!ENTITY issues.nosubscriptions.add.label "Filtrowy abonement pśidaś">
+<!ENTITY issues.disabledfilters.enable.label "Filter zmóžniś">
+<!ENTITY issues.override.label "Kon&amp;figuracija jo korektna, z rozpšawu pókšacowaś">
+<!ENTITY issues.nosubscriptions.description "Zda se, až njejśco žedne gótowe lisćiny filtrow aboněrował, kótarež awtomatiski wótwónoźuju njewitane wopśimjeśe.">
+<!ENTITY typeSelector.falsePositive.description "Wubjeŕśo toś tu opciju, jolic wažne wopśimjeśe felujo bokoju, jolic bok zwobraznja se wopak abo porědnje njefunkcioněrujo. Móžośo zwěsćiś, lěc Adblock Plus jo wina na toś tom problemje, gaž znjemóžnijośo jen nachylu.">
+<!ENTITY typeSelector.other.label "D&amp;rugi problem">
+<!ENTITY emailComment.label "Pśiraźujomy wam, płaśiwu e-mailowu adresu zapódaś, aby mógli z wami do zwiska stajiś, jolic su pšašanja wó wašej rozpšawje. To zmóžnijo nam, waše pśinoski pśipóznaś a jim wušu prioritu daś.">
+<!ENTITY issues.whitelist.remove.label "Adblock Plus na toś tom boku znowego zmóžniś">
+<!ENTITY outdatedSubscriptions.description "Slědujuce filtrowe abonementy njejsu se wót nanejmjenjej dweju tyźenjowu zaktualizěrowali. Pšosym zaktualizěrujśo toś te abonementy, pjerwjej až pósćeloš powěźeńku. Problem by mógał pón južo rozwězany byś.">
+<!ENTITY dataCollector.description "Pšosym pócakajśo chylku, mjaztym až Adblock Plus wótwołujo trěbne daty.">
+<!ENTITY sendButton.label "Ro&amp;zpšawu pósłaś">
+<!ENTITY comment.label "&amp;Komentar (opcionalny)">
+<!ENTITY sendPage.errorMessage "Wopyt, rozpšawu słaś, jo se ze zmólkowym kodom &quot;?1?&quot; njeraźił. Pšosym zawěsććo, až sćo z internetom zwězany a wopytajśo hyšći raz. Jolic problem dalej eksistěrujo, pšosćo pšosym w [link]forumje Adblock Plus[/link] wó pomoc.">
+<!ENTITY showRecentReports.label "Njedawno wótpósłane rozpšawy pokazaś">
+<!ENTITY commentPage.heading "Komentar zapódaś">
+<!ENTITY update.start.label "Aktualizaciju něnto startowaś">
+<!ENTITY issues.disabledfilters.description "Slědujuce filtry su znjemóžnjone, weto by mógli wustatkowanje na toś ten bok měś:">
+<!ENTITY screenshot.description "Ten samy bok móžo rozdźělnje za rozdźělnych luźi wuglědaś. Móžo nam pomagaś, problem rozměś, jolic pśidajo wašej rozpšawje foto wobrazowki . Móžośo wótrězki wótpóraś, kótarež wopśimujo sensibelne informacije a teke wobłuki markěrowaś, źož se problem pokazujo. Aby to cynił, klikniśo na wótpowědny tłócašk a wubjeŕśo wótrězk wobraza ze swójeju myšku.">
+<!ENTITY screenshot.attach.label "W&amp;obraz boka rozpšawje pśidaś">
+<!ENTITY issues.whitelist.description "Adblock Plus jo tuchylu na boku, wó kótaremž rozpšawjaśo, znjemóžnjony. Pšosym zmóžniśo jen znowego a zacytajśo bok, nježli až wótposćelośo rozpšawu, aby analyzěrowanje toś togo problema pódprěł.">
+<!ENTITY typeSelector.falseNegative.label "Adb&amp;lock Plus njeblokěrujo wabjenje">
+<!ENTITY typeSelector.heading "Wubjeŕśo problemowy typ">
+<!ENTITY anonymity.warning "Njamóžomy se zasej a was wobrośiś a dajomy nejskerjej wašej rozpšawje nišu prioritu.">
+<!ENTITY wizard.title "Rozpšawniski asistent za problemy">
+<!ENTITY issues.ownfilters.disable.label "Filter znjemóžniś">
+<!ENTITY commentPage.description "Slědujuce tekstowe pólo zmóžnja wam, komentar zapódaś, aby wy nam pomagał, problem rozměś. Toś ten kšac jo opcionalny, ale pśiraźujo se, jolic problem njejo widobny. Móžośo teke daty rozpšawy pśeglědaś, nježli až se sćelo.">
+<!ENTITY comment.lengthWarning "Dłujkosć wašogo komentara pśekšaca 1000 znamuškow. Jano prědne 1000 znamuškow budu se słaś.">
+<!ENTITY typeSelector.falseNegative.description "Wubjeŕśo toś tu opciju, jolic wabjenje se zwobraznja, lěcrownož Adblock Plus jo zmóžnjony.">
+<!ENTITY sendPage.waitMessage "Pšosym cakajśo, mjaztym až Adblock Plus sćelo wašu rozpšawu.">
+<!ENTITY dataCollector.heading "Witajśo do rozpšawniskego asistenta za problemy">
+<!ENTITY screenshot.heading "Foto wobrazowki pśidaś">
+<!ENTITY sendPage.heading "Rozpšawu słaś">
+<!ENTITY issues.subscriptionCount.description "Zda se, až sćo pśewjele filtrowych abonementow aboněrował. Toś to nastajenje se njepśiraźujo, dokulaž wjelgin pówušujo wěrjepódobnosć problemow. Teke njamóžomy waš problemowe wopisanje akceptěrowaś, dokulaž jo njejasnje, kótary awtor filtrowego abonementa ma jadnaś. Pšosym wótwónoźćo wšykne mimo napšawdu trěbnych filtrowych abonementow a testujśo, lěc problem daleje nastawa.">
+<!ENTITY screenshot.mark.label "&amp;Problem markěrowaś">
+<!ENTITY privacyPolicy.label "Pšawidła priwatnosći">
+<!ENTITY issues.description "Adblock Plus jo problemy z wašeju konfiguraciju namakał, kótarež by mógli na toś ten problem wina byś abo póśěźuju analyzěrowanje problema.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/sidebar.dtd
new file mode 100644
index 0000000..edbbdb6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Kšomy zapiska pokazaś">
+<!ENTITY address.label "Adresa">
+<!ENTITY context.open.label "W nowem rejtarku wócyniś">
+<!ENTITY type.label "Typ">
+<!ENTITY tooltip.filterSource.label "Filtrowe žrědło:">
+<!ENTITY noitems.label "Žedne blokěrujobne zapiski">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Wjelikosć:">
+<!ENTITY reattach.label "Zasej pśipowjesyś">
+<!ENTITY search.label "&amp;PytaÅ›:">
+<!ENTITY docDomain.thirdParty "(tśeśi part)">
+<!ENTITY filterSource.label "Filtrowe žrědło">
+<!ENTITY tooltip.docDomain.label "Dokumentowe žrědło:">
+<!ENTITY context.copy.label "Adresu zapiska kopěrowaś">
+<!ENTITY tooltip.type.label "Typ:">
+<!ENTITY context.disablefilter.label "Filter ?1? znjemóžniś">
+<!ENTITY context.copyFilter.label "Filter kopěrowaś">
+<!ENTITY context.block.label "Toś ten zapisk blokěrowaś">
+<!ENTITY context.enablefilter.label "Filter ?1? zasej zmóžniś">
+<!ENTITY detach.label "Wótpowjesyś">
+<!ENTITY whitelisted.label "Bok w běłej lisćinje">
+<!ENTITY context.disablefilteronsite.label "Toś ten filter na ?1? znjemóžniś">
+<!ENTITY detached.title "Adblock Plus: Blokěrujobne zapiski (wótpowjesone)">
+<!ENTITY docDomain.firstParty "(prědny part)">
+<!ENTITY tooltip.type.whitelisted "(w běłej lisćinje)">
+<!ENTITY tooltip.filter.label "Aktiwny filter:">
+<!ENTITY tooltip.filter.disabled "(znjemóžnjony)">
+<!ENTITY context.editfilter.label "Aktiwny filter wobźěłaś">
+<!ENTITY tooltip.type.blocked "(blokěrowany)">
+<!ENTITY size.label "Wjelikosć">
+<!ENTITY context.whitelist.label "Wuwześowe pšawidło za toś ten zapisk pśidaś">
+<!ENTITY context.selectAll.label "Wšykno wubraś">
+<!ENTITY state.label "Status">
+<!ENTITY docDomain.label "Dokumentowe žrědło">
+<!ENTITY tooltip.address.label "Adresa:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/subscriptionSelection.dtd
new file mode 100644
index 0000000..334b3de
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "&amp;Filtrowy abonement &quot;?1?&quot; teke pśidaś">
+<!ENTITY list.download.failed "Adblock Plus njejo mógał lisćiny abonementow wótwołaś.">
+<!ENTITY list.download.retry "Hyšći raz wopytaś">
+<!ENTITY title.label "&amp;Titel abonementa:">
+<!ENTITY list.download.website "Websedło se woglědaś">
+<!ENTITY supplementMessage "Toś ten filtrowy abonement jo za to myslony, se z filtrowym abonementom &quot;?1?&quot; wužywaś, kótaryž hyšći njewužywaśo.">
+<!ENTITY viewList.label "Filtry se woglědaś">
+<!ENTITY visitHomepage.label "K startowemu bokoju woglědaś">
+<!ENTITY addSubscription.label "Abonement pśidaś">
+<!ENTITY dialog.title "Filtrowy abonement Adblock Plus pśidaś">
+<!ENTITY location.label "&amp;Městno filtroweje lisćiny:">
+<!ENTITY fromWeb.description "Pšosym wobkšuśćo, až cośo toś ten filtrowy abonement pśidaś. Móžośo titel abo městno abonementa změniś, nježli až jen pśidajośo.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/composer.dtd
new file mode 100644
index 0000000..8ea8aee
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "στο τέ&amp;λος της διεÏθυνσης">
+<!ENTITY domainRestriction.label "ΠεÏιοÏισ&amp;μός στον τομέα:">
+<!ENTITY collapse.default.no.label "ΧÏήση Ï€ÏοκαθοÏισμένου (όχι)">
+<!ENTITY firstParty.label "&amp;Εκτός από Ï„Ïίτους">
+<!ENTITY preferences.label "ΠÏοβολή υπαÏχόντων φίλτÏων...">
+<!ENTITY pattern.label "Αναζήτηση μοτίβου">
+<!ENTITY thirdParty.label "Από &amp;Ï„Ïίτους μόνο">
+<!ENTITY filter.label "Îέο φίλτÏο:">
+<!ENTITY collapse.label "ΣÏμπτυξη φÏαγμένων:">
+<!ENTITY match.warning "Το μοτίβο που εισάγατε δεν ταιÏιάζει πλέον στην διεÏθυνση που θέλετε να φÏαγεί και δεν θα έχει κανένα αποτέλεσμα.">
+<!ENTITY anchor.start.label "στην &amp;αÏχή της διεÏθυνσης">
+<!ENTITY matchCase.label "ΤαίÏιασμα μικÏών-κεφαλαίων">
+<!ENTITY custom.pattern.label "ΠÏο&amp;σαÏμογή:">
+<!ENTITY unselectAllTypes.label "Επιλογή κανενός">
+<!ENTITY type.whitelist.label "Κανόνας εξαίÏεσης">
+<!ENTITY regexp.warning "Το μοτίβο που εισάγατε θα εÏμηνευτεί σαν regular expression. Πολλά regular expressions μποÏεί να μειώσουν την ταχÏτητα πλοήγησης. Αν σκοπός σας δεν ήταν να χÏησιμοποιήσετε regular expressions, Ï€Ïοσθέστε το σÏμβολο * στο τέλος του μοτίβου.">
+<!ENTITY dialog.title "ΠÏοσθήκη κανόνα φίλτÏου του Adblock Plus">
+<!ENTITY basic.label "Βασική Ï€Ïοβολή">
+<!ENTITY type.filter.label "Φίλτ&amp;Ïο φÏαγής">
+<!ENTITY types.label "ΕφαÏμογή στους Ï„Ïπους:">
+<!ENTITY shortpattern.warning "Το μοτίβο που εισάγατε είναι Ï€Î¿Î»Ï ÎºÎ¿Î½Ï„ÏŒ για να βελτιστοποιηθεί· πολλά τέτοια μοτίβα μποÏεί να μειώσουν την ταχÏτητα πλοήγησης. ΠÏοτείνεται να επιλέξετε ένα μακÏÏτεÏο μοτίβο για το φίλτÏο.">
+<!ENTITY collapse.yes.label "Îαι">
+<!ENTITY anchors.label "Αποδοχή του μοτίβου μόνο:">
+<!ENTITY collapse.default.yes.label "ΧÏήση Ï€ÏοκαθοÏισμένου (ναι)">
+<!ENTITY domainRestriction.help "Δηλώστε έναν ή πεÏισσότεÏους τομείς (domain) διαχωÏισμένους με το σÏμβολο &quot;|&quot;, και το φίλτÏο θα εφαÏμοστεί μόνο σε αυτοÏÏ‚. Το σÏμβολο &quot;~&quot; Ï€Ïιν από τον τομέα σημαίνει πως το φίλτÏο δεν θα εφαÏμοστεί στο συγκεκÏιμένο τομέα.">
+<!ENTITY accept.label "ΠÏοσθήκη φίλτÏου">
+<!ENTITY options.label "Επιλογές">
+<!ENTITY disabled.warning "Το Adblock Plus είναι απενεÏγοποιημένο. ΜποÏείτε να Ï€Ïοσθέσετε φίλτÏα αλλά αυτά θα εφαÏμοστοÏν μόλις [link]ενεÏγοποιήσετε το Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "στην &amp;αÏχή του ονόματος τομέα">
+<!ENTITY collapse.no.label "Όχι">
+<!ENTITY selectAllTypes.label "Επιλογή όλων">
+<!ENTITY advanced.label "Για Ï€ÏοχωÏημένους">
+<!ENTITY pattern.explanation "Το μοτίβο μποÏεί να είναι οποιοδήποτε μέÏος της διεÏθυνσης, το σÏμβολο * δÏα ως wildcard. Το φίλτÏο θα εφαÏμοστεί μόνο στις διευθÏνσεις που ταιÏιάζουν στο μοτίβο.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/filters.dtd
new file mode 100644
index 0000000..006871b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Όλα τα Ï€ÏοσαÏμοσμένα φίλτÏα σας θα αντικατασταθοÏν από τα πεÏιεχόμενα του επιλεγμένου αÏχείου. θέλετε να συνεχίσετε;">
+<!ENTITY slow.column "&amp;Εμφάνιση φίλτÏων">
+<!ENTITY enabled.column "Ε&amp;νεÏγοποιημένο">
+<!ENTITY subscription.lastDownload.checksumMismatch "Απέτυχε, απόκλιση στον έλεγχο checksum">
+<!ENTITY noFiltersInGroup.text "Η επιλεγμένη ομάδα είναι άδεια">
+<!ENTITY subscription.actions.label "ΕνέÏγειες">
+<!ENTITY filter.selectAll.label "Επιλογή όλων">
+<!ENTITY backupButton.label "&amp;ΑντίγÏαφα ασφαλείας και επαναφοÏά">
+<!ENTITY restore.minVersion.warning "ΠÏοειδοποίηση: το αÏχείο έχει δημιουÏγηθεί με μια νεότεÏη έκδοση του Adblock Plus. Θα Ï€Ïέπει να αναβαθμίσετε το Adblock Plus στην τελευταία του έκδοση Ï€Ïιν ανακτήσετε από αυτό το αÏχείο.">
+<!ENTITY restore.error "Τα δεδομένα του αÏχείου δεν μποÏοÏν να επεξεÏγαστοÏν, μήπως αυτός δεν είναι αντίγÏαφο ασφαλείας του Adblock Plus;">
+<!ENTITY sort.ascending.label "&amp;ΑÏξουσα">
+<!ENTITY sort.label "&amp;Ταξινόμηση κατά">
+<!ENTITY subscription.source.label "Λίστα φίλτÏων">
+<!ENTITY hitcount.column "Επιτυ&amp;χίες">
+<!ENTITY noFilters.text "Δεν έχετε κάποιο Ï€ÏοσαÏμοσμένο φίλτÏο ακόμα.">
+<!ENTITY backup.custom.title "Μόνο τα Ï€ÏοσαÏμοσμένα φίλτÏα">
+<!ENTITY subscription.external.label "ΕνημεÏώθηκε από άλλο Ï€Ïόσθετο">
+<!ENTITY subscription.delete.label "ΔιαγÏαφή">
+<!ENTITY noGroupSelected.text "ΠÏέπει να επιλέξετε μια ομάδα φίλτÏων ώστε να εμφανιστοÏν τα φίλτÏα της.">
+<!ENTITY filter.cut.label "Αποκοπή">
+<!ENTITY restore.default.label "ΕπαναφοÏά αντιγÏάφου ασφαλείας από την ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Σε εξέλιξη...">
+<!ENTITY subscriptions.tab.label "ΣυνδÏομές φίλτÏων">
+<!ENTITY sort.descending.label "Φ&amp;θίνουσα">
+<!ENTITY filters.remove.warning "Θέλετε να απομακÏÏνετε όλα τα επιλεγμένα φίλτÏα;">
+<!ENTITY filter.delete.label "ΔιαγÏαφή">
+<!ENTITY addSubscriptionAdd.label "ΠÏοσθήκη">
+<!ENTITY viewMenu.label "ΠÏοβολή">
+<!ENTITY subscription.lastDownload.unknown "Μ/Δ">
+<!ENTITY addSubscriptionCancel.label "ΑκÏÏωση">
+<!ENTITY subscription.enabled.label "ΕνεÏγοποιημένη">
+<!ENTITY noSubscriptions.text "Δεν έχετε Ï€Ïοσθέσει κάποια συνδÏομή φίλτÏων. Το Adblock Plus δεν μποÏεί να μπλοκάÏει κάτι χωÏίς φίλτÏα· παÏακαλώ χÏησιμοποιήστε την &quot;ΠÏοσθήκη συνδÏομής&quot; για να οÏίσετε μια.">
+<!ENTITY subscription.update.label "ΕνημέÏωση φίλτÏων">
+<!ENTITY dialog.title "ΠÏοτιμήσεις φίλτÏων του Adblock Plus">
+<!ENTITY addFilter.label "ΠÏοσθήκη &amp;φίλτÏου">
+<!ENTITY subscription.minVersion.warning "Αυτή η συνδÏομή φίλτÏων απαιτεί μια νεότεÏη έκδοση του Adblock Plus· θα Ï€Ïέπει να αναβαθμίσετε το Adblock Plus στην τελευταία έκδοση.">
+<!ENTITY subscription.lastDownload.invalidURL "Απέτυχε, μη έγκυÏη διεÏθυνση">
+<!ENTITY backup.error "ΥπήÏξε κάποιο Ï€Ïόβλημα στην εγγÏαφή των φίλτÏων στο αÏχείο. ΣιγουÏευτείτε ότι το αÏχείο δεν Ï€ÏοστατεÏεται από εγγÏαφή ή ότι δεν χÏησιμοποιείται από κάποια άλλη εφαÏμογή.">
+<!ENTITY filter.moveUp.label "Μετακίνηση επάνω">
+<!ENTITY addGroup.label "ΠÏ&amp;οσθήκη ομάδας φίλτÏων">
+<!ENTITY filter.edit.label "ΕπεξεÏγασία">
+<!ENTITY subscription.showHideFilters.label "Εμφάνιση/απόκÏυψη φίλτÏων">
+<!ENTITY acceptableAds2.label "Îα επιτÏέπονται &amp;μεÏικές μη-παÏεμβατικές διαφημίσεις">
+<!ENTITY addSubscriptionOther.label "ΠÏοσθήκη άλλης συνδÏομής">
+<!ENTITY close.label "Κλείσιμο">
+<!ENTITY sort.none.label "Χ&amp;ωÏίς ταξινόμηση">
+<!ENTITY filter.actions.label "ΕνέÏγειες φίλτÏων">
+<!ENTITY filter.copy.label "ΑντιγÏαφή">
+<!ENTITY filter.moveDown.label "Μετακίνηση κάτω">
+<!ENTITY filter.resetHitCounts.label "Μηδενισμός στατιστικών επιτυχιών">
+<!ENTITY readMore.label "Διαβάστε πεÏισσότεÏα">
+<!ENTITY subscription.moveUp.label "Μετακίνηση επάνω">
+<!ENTITY addSubscription.label "ΠÏο&amp;σθήκη συνδÏομής">
+<!ENTITY subscription.homepage.label "Ιστοσελίδα">
+<!ENTITY backup.complete.title "Όλα τα φίλτÏα και οι συνδÏομές">
+<!ENTITY restore.own.label "ΕπαναφοÏά Î´Î¹ÎºÎ¿Ï ÏƒÎ±Ï‚ αντιγÏάφου ασφαλείας">
+<!ENTITY restore.complete.warning "Όλες οι Ï€Ïοτιμήσεις των φίλτÏων σας θα αντικατασταθοÏν από τα πεÏιεχόμενα του επιλεγμένου αÏχείου. θέλετε να συνεχίσετε;">
+<!ENTITY filters.tab.label "ΠÏοσαÏμοσμένα φίλτÏα">
+<!ENTITY backup.label "ΔημιουÏγία νέου αντιγÏάφου ασφαλείας">
+<!ENTITY find.label "ΕÏ&amp;Ïεση">
+<!ENTITY subscription.moveDown.label "Μετακίνηση κάτω">
+<!ENTITY subscription.lastDownload.connectionError "Απέτυχε, σφάλμα κατά τη λήψη">
+<!ENTITY subscription.lastDownload.success "Επιτυχής">
+<!ENTITY subscription.lastDownload.invalidData "Απέτυχε, μη έγκυÏη λίστα φίλτÏων">
+<!ENTITY filter.paste.label "Επικόλληση">
+<!ENTITY subscription.disabledFilters.enable "ΕνεÏγοποίηση απενεÏγοποιημένων φίλτÏων">
+<!ENTITY lasthit.column "Τε&amp;λευταία επιτυχία">
+<!ENTITY subscription.editTitle.label "ΕπεξεÏγασία τίτλου">
+<!ENTITY subscription.disabledFilters.warning "Κάποια φίλτÏα σε αυτή την συνδÏομή είναι απενεÏγοποιημένα.">
+<!ENTITY filter.column "Κανόνας &amp;φίλτÏου">
+<!ENTITY subscription.lastDownload.label "Τελευταία ενημέÏωση:">
+<!ENTITY viewList.label "Δείτε την λίστα">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/firstRun.properties
new file mode 100644
index 0000000..5ca81f3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=ΠεÏιηγηθείτε ιδιωτικά απενεÏγοποιώντας την παÏακολοÏθηση - αποκÏÏπτοντας τα ίχνη σας από εταιÏείες διαφημίσεων που μποÏοÏν να παÏακολουθοÏν κάθε κίνησή σας.
+firstRun_toggle_off=ΑνενεÏγό
+firstRun_feature_tracking=ΑπενεÏγοποίηση της παÏακολοÏθησης
+firstRun_feature_malware=ΦÏαγή κακόβουλου λογισμικοÏ
+firstRun_title=Το Adblock Plus έχει εγκατασταθεί
+firstRun_acceptableAdsExplanation=Θα θέλαμε να ενθαÏÏÏνουμε τις ιστοσελίδες να χÏησιμοποιοÏν ξεκάθαÏες, διακÏιτικές διαφημίσεις. Γι' αυτό το λόγο έχουμε οÏίσει <a>αυστηÏές κατευθυντήÏιες γÏαμμές</a> για τον Ï€ÏοσδιοÏισμό των αποδεκτών διαφημίσεων, οι οποίες εμφανίζονται στις Ï€Ïοεπιλεγμένες Ïυθμίσεις. Εάν εξακολουθείτε να θέλετε να αποκλείσετε όλες τις διαφημίσεις μποÏείτε να <a>απενεÏγοποιήσετε</a> αυτήν την επιλογή σε λίγα δευτεÏόλεπτα.
+firstRun_toggle_on=ΕνεÏγό
+firstRun_contributor_credits=Μνεία συντελεστών
+firstRun_dataCorruptionWarning=Αυτή η σελίδα συνεχίζει να εμφανίζεται; <a>Κάντε κλικ εδώ!</a>
+firstRun_acceptableAdsHeadline=Οι ενοχλητικές διαφημίσεις τώÏα θα αποκλειστοÏν
+firstRun_share=Πείτε το στους φίλους σας
+firstRun_share_headline=<a>Δώστε μας ένα χεÏάκι</a> στο να κάνουμε το διαδίκτυο ένα καλÏτεÏο μέÏος
+firstRun_features=Το Adblock Plus μποÏεί να κάνει πεÏισσότεÏα από το φιλτÏάÏισμα διαφημίσεων
+firstRun_feature_malware_description=Κάνετε την πεÏιήγηση σας πιο ασφαλή φÏάσσοντας γνωστές διευθÏνσεις κακόβουλου λογισμικοÏ.
+firstRun_feature_social_description=Απαλλάξετε αυτομάτως την πεÏιήγησή σας από κουμπιά των μέσων κοινωνικής δικτÏωσης, όπως το Like του Facebook, που εμφανίζονται σε ιστοσελίδες και παÏακολουθοÏν τη συμπεÏιφοÏά σας.
+firstRun_donate=δωÏίστε
+firstRun_donate_label=ΥποστηÏίξτε το έÏγο μας
+firstRun_feature_social=ΑφαίÏεση κουμπιών μέσων κοινωνικής δικτÏωσης
+firstRun_legacySafariWarning=ΧÏησιμοποιείτε μια παλιά έκδοση του Safari, η οποία δεν υποστηÏίζεται από το Adblock Plus. ΜποÏεί να μην λειτουÏγεί σωστά ή να αλλοιώσει την εμπειÏία χÏήστη σε οÏισμένες ιστοσελίδες. Σας συνιστοÏμε είτε να ενημεÏώσετε την έκδοση του φυλλομετÏητή σε Safari 6.1.1 ή νεότεÏη (σε Mac OS X 10.8 Mountain Lion), ή σε Safari 7.0.1 ή νεότεÏη (σε OS X 10.9 Mavericks) ή να χÏησιμοποιήσετε την τελευταία έκδοση του Mozilla Firefox, Google Chrome ή Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/global.properties
new file mode 100644
index 0000000..bdd9d06
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Δεν υπάÏχουν αντικείμενα Ï€Ïος φÏαγή σε αυτή τη σελίδα
+action3_tooltip=Κλικ για ενεÏγοποίηση/απενεÏγοποίηση.
+notification_antiadblock_title=ΑπόκÏυψη στοχευμένων μηνυμάτων;
+type_label_script=σενάÏιο εντολών
+filter_elemhide_nocriteria=Δεν καθοÏίστηκαν κÏιτήÏια ώστε να αναγνωÏιστεί το στοιχείο που θα φιλτÏαÏιστεί
+blockingGroup_title=Κανόνες φÏαγής διαφημίσεων
+whitelisted_tooltip=Το Adblock Plus είναι ενεÏγό αλλά απενεÏγοποιημένο για την Ï„Ïέχουσα σελίδα.
+type_label_stylesheet=stylesheet
+blocked_count_tooltip=?1? από τα ?2?
+type_label_font=γÏαμματοσειÏά
+type_label_popup=αναδυόμενο παÏάθυÏο
+filter_regexp_tooltip=Αυτό το φίλτÏο είναι ένα regular expression ή είναι Ï€Î¿Î»Ï ÎºÎ¿Î½Ï„ÏŒ ώστε να βελτιστοποιηθεί. Πολλά από αυτά τα φίλτÏα μποÏεί να μειώσουν την ταχÏτητα πλοήγησης.
+action0_tooltip=Κλικ για το Î¼ÎµÎ½Î¿Ï Ï€ÎµÏιεχομένου, μεσαίο κλικ για ενεÏγοποίηση/απενεÏγοποίηση.
+whitelisted_page=Το Adblock Plus απενεÏγοποιήθηκε για την Ï„Ïέχουσα σελίδα
+remove_group_warning=Θέλετε σίγουÏα να διαγÏάψετε αυτή την ομάδα;
+action1_tooltip=Κλικ για να ανοίξετε/κλείσετε τα στοιχεία Ï€Ïος φÏαγή, μεσαίο κλικ για ενεÏγοποίηση/απενεÏγοποίηση.
+type_label_xmlhttprequest=αίτημα XML
+active_tooltip=Το Adblock Plus είναι ενεÏγό, ?1? συνδÏομή(ές) φίλτÏων και ?2? Ï€ÏοσαÏμοσμένο(α) φίλτÏο(α) σε χÏήση.
+type_label_document=κείμενο
+type_label_object_subrequest=object subrequest
+whitelistGroup_title=Κανόνες εξαίÏεσης
+disabled_tooltip=Το Adblock Plus είναι ανενεÏγό.
+filter_elemhide_duplicate_id=Μόνο μια ταυτότητα του στοιχείου Ï€Ïος απόκÏυψη Ï€Ïέπει να καθοÏιστεί
+type_label_object=αντικείμενο
+action2_tooltip=Κλικ για τις επιλογές, μεσαίο κλικ για ενεÏγοποίηση/απενεÏγοποίηση.
+type_label_subdocument=πλαίσιο
+clearStats_warning=Αυτό θα μηδενίσει τα στατιστικά και θα απενεÏγοποιήσει τις επιτυχίες των φίλτÏων. Θέλετε να συνεχίσετε;
+notification_antiadblock_message=Αυτή η σελίδα είναι γνωστό ότι Ï€Ïοβάλει στοχευμένα μηνÏματα στους χÏήστες του Adblock Plus. Θέλετε το Adblock Plus να αποκÏÏπτει στοχευμένα μηνÏματα;
+blocked_count_addendum=(λευκή λίστα: ?1?, κÏυφά: ?2?)
+subscription_invalid_location=Η τοποθεσία της λίστας φίλτÏων δεν είναι έγκυÏη URL οÏτε και όνομα αÏχείου.
+type_label_image=εικόνα
+remove_subscription_warning=Θέλετε να απομακÏÏνετε αυτή τη συνδÏομή;
+type_label_other=άλλο
+mobile_menu_enable=ABP: ΕνεÏγοποίηση
+type_label_media=ήχος/βίντεο
+mobile_menu_disable_site=ABP: ΑπενεÏγοποίηση στο ?1?
+elemhideGroup_title=Κανόνες απόκÏυψης στοιχείων
+mobile_menu_enable_site=ABP: ΕνεÏγοποίηση στο ?1?
+type_label_elemhide=κÏυφό
+newGroup_title=Îέα ομάδα φίλτÏων
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/overlay.dtd
new file mode 100644
index 0000000..0d3fe6e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Îαι">
+<!ENTITY notification.button.no "&amp;Όχι">
+<!ENTITY sync.label "Συγ&amp;χÏονισμός των Ïυθμίσεων του Adblock Plus">
+<!ENTITY whitelist.site.label "ΑπενεÏγοποίηση στο ?1?">
+<!ENTITY filters.label "ΠÏοτιμήσεις &amp;φίλτÏων">
+<!ENTITY disable.label "ΑπενεÏγοποίηση παντοÏ">
+<!ENTITY objecttab.title "ΦÏαγή">
+<!ENTITY objecttab.tooltip "Κλικ εδώ για να φιλτÏάÏετε αυτό το αντικείμενο με το Adblock Plus">
+<!ENTITY menuitem.label "Ad&amp;block Plus">
+<!ENTITY objecttabs.label "Εμφάνιση ετικέτ&amp;ας σε αντικείμενα Flash και Java">
+<!ENTITY sendReport.label "Αναφο&amp;Ïά Ï€Ïοβλήματος σε αυτή την σελίδα">
+<!ENTITY whitelist.page.label "ΑπενεÏγοποίηση σε αυτή τη σελίδα μόνο">
+<!ENTITY context.image.label "Adblock Plus: φÏαγή εικόνας">
+<!ENTITY counthits.label "Κα&amp;ταμέτÏηση επιτυχιών φίλτÏων">
+<!ENTITY opensidebar.label "Άνοιγμ&amp;α των φιλτÏαÏισμένων στοιχείων">
+<!ENTITY notification.button.close "&amp;Κλείσιμο">
+<!ENTITY contribute.label "ΣυνεισφέÏετε στο Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: φÏαγή πλαισίου">
+<!ENTITY blocked.tooltip "Στοιχεία που έχουν φÏαχθεί σε αυτή τη σελίδα:">
+<!ENTITY hideplaceholders.label "ΑπόκÏυψη πλα&amp;ισίων των φιλτÏαÏισμένων στοιχείων">
+<!ENTITY showinstatusbar.label "Εμφάνιση στην γÏαμμή &amp;κατάστασης">
+<!ENTITY sidebar.title "Στοιχεία Ï€Ïος φιλτÏάÏισμα στην Ï„Ïέχουσα σελίδα">
+<!ENTITY options.label "Επι&amp;λογές">
+<!ENTITY context.object.label "Adblock Plus: φÏαγή αντικειμένου">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: ΕνεÏγοποίηση σ' αυτή την σελίδα">
+<!ENTITY filters.tooltip "ΦίλτÏα με τις πεÏισσότεÏες επιτυχίες:">
+<!ENTITY closesidebar.label "Κλείσιμο των φιλτÏ&amp;αÏισμένων στοιχείων">
+<!ENTITY showintoolbar.label "Εμφάνιση στην εÏγαλειο&amp;θήκη">
+<!ENTITY status.tooltip "Κατάσταση:">
+<!ENTITY context.media.label "Adblock Plus: φÏαγή ήχου/βίντεο">
+<!ENTITY subscription.update.label "ΕνημέÏωση φίλτÏων">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/sendReport.dtd
new file mode 100644
index 0000000..642b03a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Αναί&amp;Ïεση">
+<!ENTITY issues.disabledgroups.description "Οι ακόλουθες συνδÏομές φίλτÏων / ομάδες φίλτÏων είναι απενεÏγοποιημένες, παÏόλα αυτά μποÏεί να έχουν επίδÏαση σε αυτή την σελίδα:">
+<!ENTITY showData.label "Εμφάνιση δεδομένων αναφοÏάς">
+<!ENTITY typeSelector.falsePositive.label "Το Adblock Plus φÏάζει πάÏα πολλά &amp;στοιχεία">
+<!ENTITY issues.change.description "Οι Ïυθμίσεις σας έχουν αλλάξει. ΠαÏακαλώ ανανεώστε την σελίδα για να δοκιμάσετε τις αλλαγές και υποβάλλετε μια αναφοÏά αν το ζήτημα δεν έχει λυθεί από τις Ï„Ïοποποιήσεις.">
+<!ENTITY email.label "Email: (&amp;μ)">
+<!ENTITY issues.openPreferences.label "ΠÏοτιμήσεις φίλτÏων">
+<!ENTITY sendPage.confirmation "Η αναφοÏά σας έχει αποθηκευτεί. ΠÏόσβαση σε αυτήν έχετε από την ακόλουθη διεÏθυνση:">
+<!ENTITY copyLink.label "&amp;ΑντιγÏαφή διεÏθυνσης αναφοÏάς">
+<!ENTITY issues.nofilters.description "Το Adblock Plus δεν φιλτÏάÏει τίποτα στην Ï„Ïέχουσα σελίδα. Το ζήτημα το οποίο παÏατηÏείτε πιθανώς δεν σχετίζεται με το Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Το ζήτημα που αναφέÏατε είναι πιθανώς ήδη γνωστό. ΠεÏισσότεÏες πληÏοφοÏίες:">
+<!ENTITY typeSelector.other.description "Επιλέξτε αυτό αν υποπτεÏεστε κάποιο ζήτημα με το Adblock Plus το ίδιο, παÏά με τα φίλτÏα που χÏησιμοποιοÏνται.">
+<!ENTITY issues.disabledgroups.enable.label "ΕνεÏγοποίηση της συνδÏομής φίλτÏων / ομάδας φίλτÏων">
+<!ENTITY typeWarning.override.label "&amp;Κατανοώ και επιθυμώ να υποβάλω την αναφοÏά όπως και να έχει">
+<!ENTITY issues.disabled.enable.label "ΕνεÏγοποίηση του Adblock Plus">
+<!ENTITY update.fixed.description "Οι ενημεÏώσεις στις συνδÏομές φίλτÏων πιθανώς επιλÏουν το Ï€Ïόβλημα το οποίο αναφέÏετε. ΠαÏακαλώ ανανεώστε την σελίδα και Ï€Ïοσπαθήστε ξανά. Κάντε μια αναφοÏά αν το Ï€Ïόβλημα παÏαμένει.">
+<!ENTITY anonymous.label "&amp;Ανώνυμη υποβολή">
+<!ENTITY reloadButton.label "Α&amp;νανέωση σελίδας">
+<!ENTITY recentReports.clear.label "&amp;ΑφαίÏεση όλων των αναφοÏών">
+<!ENTITY typeSelector.description "Σε αυτό το παÏάθυÏο θα βÏείτε βοήθεια για τα βήματα που Ï€Ïέπει να ακολουθηθοÏν ώστε να υποβληθεί μια αναφοÏά για κάποιο ζήτημα που αντιμετωπίζετε σχετικά με το Adblock Plus. ΠαÏακαλώ Ï€Ïώτα επιλέξτε τον Ï„Ïπο του ζητήματος που αντιμετωπίζετε σε αυτή την σελίδα:">
+<!ENTITY screenshot.remove.label "ΑφαίÏεση ευαίσθητων &amp;δεδομένων">
+<!ENTITY issues.ownfilters.description "ΜεÏικά από τα φίλτÏα έχουν οÏιστεί από εσάς. ΠαÏακαλώ απενεÏγοποιήστε τα φίλτÏα που πιθανώς έχουν Ï€Ïοκαλέσει το ζήτημα:">
+<!ENTITY update.inProgress.description "Το Adblock Plus θα Ï€Ïέπει να ενημεÏώσει τις συνδÏομές φίλτÏων ώστε να βεβαιωθεί ότι το Ï€Ïόβλημα δεν έχει ήδη επιλυθεί. ΠαÏακαλώ πεÏιμένετε...">
+<!ENTITY sendPage.retry.label "Αποστολή ξανά">
+<!ENTITY data.label "Δεδομένα ανα&amp;φοÏάς">
+<!ENTITY recentReports.label "Οι αναφοÏές που υποβάλλατε Ï€Ïόσφατα">
+<!ENTITY typeWarning.description "Δηλώσατε πως θέλετε να αναφέÏετε ένα γενικό ζήτημα σχετικά με το Adblock Plus παÏά ένα Ï€Ïόβλημα με τα φίλτÏα. ΠαÏακαλώ έχετε στο νου σας ότι τέτοιου είδους ζητήματα ταιÏιάζουν καλÏτεÏα στο [link]forum του Adblock Plus[/link]. Θα Ï€Ïέπει να χÏησιμοποιείτε την αναφοÏά ζητήματος επιπÏόσθετα μιας υπάÏχουσας συζήτησης στο forum, καθώς κανένας δεν θα Ï€Ïοσέξει την αναφοÏά σας εκτός αν πεÏιέχει δεσμό Ï€Ïος την συζήτηση. Ο αυτόματα δημιουÏγημένος δεσμός θα εμφανιστεί μετά την υποβολή της αναφοÏάς.">
+<!ENTITY issues.disabled.description "Το Adblock Plus είναι απενεÏγοποιημένο, δεν θα φιλτÏάÏει τίποτα στην παÏοÏσα κατάσταση.">
+<!ENTITY attachExtensions.label "ΕπισÏναψε την &amp;λίστα με τα ενεÏγά Ï€Ïόσθετα στην αναφοÏά, σε πεÏίπτωση που κάποια ασυμβατότητα Î¼ÎµÏ„Î±Î¾Ï Î±Ï…Ï„ÏŽÎ½ είναι το Ï€Ïόβλημα">
+<!ENTITY issues.nosubscriptions.add.label "ΠÏοσθήκη συνδÏομής φίλτÏων">
+<!ENTITY issues.disabledfilters.enable.label "ΕνεÏγοποίηση φίλτÏου">
+<!ENTITY issues.override.label "Οι Ïυθμί&amp;σεις είναι σωστές, συνεχίστε με την αναφοÏά">
+<!ENTITY issues.nosubscriptions.description "Φαίνεται πως δεν είστε συνδÏομητής σε καμιά από τις Ï€Ïοεγκατεστημένες λίστες φίλτÏων που αυτόματα αφαιÏοÏν ανεπιθÏμητο πεÏιεχόμενο από τις σελίδες.">
+<!ENTITY typeSelector.falsePositive.description "Επιλέξτε αυτό, αν η σελίδα στεÏείται βασικό πεÏιεχόμενο, εμφανίζεται λαθεμένα ή δεν λειτουÏγεί σωστά. Για να διαγνώσετε αν το Adblock Plus είναι η αιτία του Ï€Ïοβλήματός σας, απενεÏγοποιήστε το Ï€ÏοσωÏινά.">
+<!ENTITY typeSelector.other.label "Ά&amp;λλο ζήτημα">
+<!ENTITY emailComment.label "Σας συνιστοÏμε να εισάγετε μια έγκυÏη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου, ώστε να επικοινωνήσουμε μαζί σας εάν υπάÏχουν εÏωτήσεις σχετικά με την αναφοÏά σας. Θα μας επιτÏέψει επίσης, να αναγνωÏίζουμε τις συνεισφοÏές σας και να τις δώσουμε υψηλότεÏη Ï€ÏοτεÏαιότητα.">
+<!ENTITY issues.whitelist.remove.label "ΕνεÏγοποίηση του Adblock Plus σε αυτή την σελίδα">
+<!ENTITY outdatedSubscriptions.description "Οι ακόλουθες συνδÏομές φίλτÏων δεν έχουν ενημεÏωθεί για δÏο τουλάχιστο εβδομάδες. ΠαÏακαλώ ενημεÏώστε αυτές τις συνδÏομές Ï€Ïιν υποβάλετε την αναφοÏά, μιας και το ζήτημα μποÏεί ήδη να έχει επιλυθεί.">
+<!ENTITY dataCollector.description "ΠαÏακαλώ πεÏιμένετε καθώς το Adblock Plus συλλέγει τα απαÏαίτητα δεδομένα.">
+<!ENTITY sendButton.label "Απο&amp;στολή αναφοÏάς">
+<!ENTITY comment.label "Σ&amp;χόλιο (Ï€ÏοαιÏετικό):">
+<!ENTITY sendPage.errorMessage "Η Ï€Ïοσπάθεια αποστολής της αναφοÏάς απέτυχε με κωδικό λάθους &quot;?1?&quot;. ΠαÏακαλώ βεβαιωθείτε ότι έχετε Ï€Ïόσβαση στο ίντεÏνετ και Ï€Ïοσπαθήστε ξανά. Εάν το Ï€Ïόβλημα παÏαμείνει, παÏακαλώ ζητήστε βοήθεια στο [link]forum του Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Εμφάνιση Ï€Ïόσφατα υποβληθέντων αναφοÏών">
+<!ENTITY commentPage.heading "Εισαγωγή σχολίου">
+<!ENTITY update.start.label "Ξεκινήστε την ενημέÏωση">
+<!ENTITY issues.disabledfilters.description "Τα ακόλουθα φίλτÏα είναι απενεÏοποιημένα, παÏόλα αυτά μποÏεί να έχουν επίδÏαση σε αυτή την σελίδα:">
+<!ENTITY screenshot.description "Η ίδια σελίδα μποÏεί να εμφανίζεται διαφοÏετικά για διαφοÏετικοÏÏ‚ χÏήστες. Εάν επισυνάψετε ένα στιγμιότυπο οθόνης στην αναφοÏά σας μποÏεί να μας βοηθήσει να κατανοήσουμε το Ï€Ïόβλημα. ΜποÏείτε να αφαιÏέσετε τμήματα τα οποία πεÏιέχουν ευαίσθητες πληÏοφοÏίες όπως και να επισημάνετε πεÏιοχές στις οποίες εντοπίζεται το Ï€Ïόβλημα. Για να το πετÏχετε, επιλέξτε το αντίστοιχο κουμπί και επιλέξτε ένα τμήμα του στιγμιότυπου με το ποντίκι.">
+<!ENTITY screenshot.attach.label "ΕπισÏναψη στιγμιότυπου ο&amp;θόνης στην αναφοÏά">
+<!ENTITY issues.whitelist.description "Το Adblock Plus είναι απενεÏγοποιημένο στην σελίδα που αναφέÏετε. ΠαÏακαλώ ενεÏγοποιήστε το και ανανεώστε την σελίδα Ï€Ïιν υποβάλλετε την αναφοÏά.">
+<!ENTITY typeSelector.falseNegative.label "Το Adblock Plus δεν &amp;φÏάζει μια διαφήμιση">
+<!ENTITY typeSelector.heading "ΤÏπος ζητήματος">
+<!ENTITY anonymity.warning "Δεν θα μποÏέσουμε να επικοινωνήσουμε μαζί σας και πιθανώς η αναφοÏά σας να θεωÏηθεί χαμηλής Ï€ÏοτεÏαιότητας.">
+<!ENTITY wizard.title "ΑναφοÏά ζητήματος">
+<!ENTITY issues.ownfilters.disable.label "ΑπενεÏγοποίηση φίλτÏου">
+<!ENTITY commentPage.description "Το πεδίο κειμένου παÏακάτω σας επιτÏέπει να εισάγετε κάποιο σχόλιο το οποίο θα μας βοηθήσει να κατανοήσουμε το ζήτημα που αντιμετωπίζετε. Το παÏόν βήμα είναι Ï€ÏοαιÏετικό αλλά Ï€Ïοτείνεται να συμπληÏωθεί αν το Ï€Ïόβλημα δεν είναι Ï€Ïοφανές. ΜποÏείτε να αναθεωÏήσετε την αναφοÏά Ï€Ïιν την αποστείλετε.">
+<!ENTITY comment.lengthWarning "Το μέγεθος του σχολίου υπεÏβαίνει τους 1000 χαÏακτήÏες. Μόνο οι Ï€Ïώτοι 1000 θα αποσταλοÏν.">
+<!ENTITY typeSelector.falseNegative.description "Επιλέξτε αυτό αν μια διαφήμιση εμφανίζεται παÏόλο που το Adblock Plus είναι ενεÏγοποιημένο.">
+<!ENTITY sendPage.waitMessage "ΠαÏακαλώ πεÏιμένετε καθώς το Adblock Plus υποβάλει την αναφοÏά.">
+<!ENTITY dataCollector.heading "Καλώς ήÏθατε στον βοηθό αναφοÏάς ζητήματος">
+<!ENTITY screenshot.heading "Στιγμιότυπο οθόνης">
+<!ENTITY sendPage.heading "Αποστολή αναφοÏάς">
+<!ENTITY issues.subscriptionCount.description "Φαίνεται ότι είστε συνδÏομητής σε πάÏα πολλές λίστες φίλτÏων. Αυτή η επιλογή δεν συνιστάται. Δεν μποÏοÏμε να δεχτοÏμε την αναφοÏά Ï€Ïοβλήματος διότι δεν είναι σαφές ποιος από τους συγγÏαφείς των φίλτÏων Ï€Ïέπει να Ï€Ïοβεί σε κάποια ενέÏγεια ώστε να διοÏθοθεί αυτό. ΠαÏακαλώ αφαιÏέστε όλες εκτός από τις απαÏαίτητες λίστες φίλτÏων, και δοκιμάστε πάλι για να εξακÏιβώσετε αν το Ï€Ïόβλημα συνεχιστεί.">
+<!ENTITY screenshot.mark.label "Επισή&amp;μανση του Ï€Ïοβλήματος">
+<!ENTITY privacyPolicy.label "Πολιτική αποÏÏήτου">
+<!ENTITY issues.description "Εντοπίστηκαν κάποια ζητήματα στις Ïυθμίσεις σας που πιθανώς να είναι υπεÏθυνες για αυτό το ζήτημα, ή που θα δυσκολέψουν την έÏευνα της αναφοÏάς.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/sidebar.dtd
new file mode 100644
index 0000000..76fe125
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Πλαίσιο στοιχείου Flash">
+<!ENTITY address.label "ΔιεÏθυνση">
+<!ENTITY context.open.label "Άνοιγμα σε νέα καÏτέλα">
+<!ENTITY type.label "ΤÏπος">
+<!ENTITY tooltip.filterSource.label "Πηγή φίλτÏου:">
+<!ENTITY noitems.label "Δεν υπάÏχουν στοιχεία Ï€Ïος φιλτÏάÏισμα">
+<!ENTITY filter.label "ΦίλτÏο">
+<!ENTITY tooltip.size.label "Μέγεθος:">
+<!ENTITY reattach.label "ΠÏοσάÏτηση">
+<!ENTITY search.label "Ανα&amp;ζήτηση:">
+<!ENTITY docDomain.thirdParty "(Ï„Ïίτων)">
+<!ENTITY filterSource.label "Πηγή φίλτÏου">
+<!ENTITY tooltip.docDomain.label "Πηγή εγγÏάφου:">
+<!ENTITY context.copy.label "ΑντιγÏαφή τοποθεσίας του στοιχείου">
+<!ENTITY tooltip.type.label "ΤÏπος:">
+<!ENTITY context.disablefilter.label "ΑπενεÏγοποίηση φίλτÏου ?1?">
+<!ENTITY context.copyFilter.label "ΑντιγÏαφή φίλτÏου">
+<!ENTITY context.block.label "ΦÏαγή του στοιχείου">
+<!ENTITY context.enablefilter.label "ΕνεÏγοποίηση φίλτÏου ?1?">
+<!ENTITY detach.label "Αποκόλληση">
+<!ENTITY whitelisted.label "Η σελίδα ανήκει στην άσπÏη λίστα">
+<!ENTITY context.disablefilteronsite.label "ΑπενεÏγοποίηση του φίλτÏου στο ?1?">
+<!ENTITY detached.title "Adblock Plus: Στοιχεία Ï€Ïος φÏαγή">
+<!ENTITY docDomain.firstParty "(Ï€ÏωτεÏον)">
+<!ENTITY tooltip.type.whitelisted "(στην άσπÏη λίστα)">
+<!ENTITY tooltip.filter.label "ΦίλτÏο εν δÏάση:">
+<!ENTITY tooltip.filter.disabled "(απενεÏγοποιημένο)">
+<!ENTITY context.editfilter.label "ΕπεξεÏγασία του φίλτÏου εν δÏάση">
+<!ENTITY tooltip.type.blocked "(φιλτÏαÏισμένο)">
+<!ENTITY size.label "Μέγεθος">
+<!ENTITY context.whitelist.label "ΠÏοσθήκη κανόνα εξαίÏεσης για το στοιχείο">
+<!ENTITY context.selectAll.label "Επιλογή όλων">
+<!ENTITY state.label "Κατάσταση">
+<!ENTITY docDomain.label "Πηγή εγγÏάφου">
+<!ENTITY tooltip.address.label "ΔιεÏθυνση:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/subscriptionSelection.dtd
new file mode 100644
index 0000000..054b6e9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "ΠÏοσ&amp;θήκη και της συνδÏομής φίλτÏων &quot;?1?&quot;">
+<!ENTITY list.download.failed "Το Adblock Plus απέτυχε να λάβει την λίστα με τις συνδÏομές.">
+<!ENTITY list.download.retry "ΠÏοσπαθήστε ξανά">
+<!ENTITY title.label "Τίτλος &amp;συνδÏομής:">
+<!ENTITY list.download.website "ΠÏοβολή της ιστοσελίδας">
+<!ENTITY supplementMessage "Αυτή η συνδÏομή φίλτÏων μποÏεί να χÏησιμοποιηθεί μαζί με την συνδÏομή &quot;?1?&quot; την οποία δεν χÏησιμοποιείτε.">
+<!ENTITY viewList.label "ΠÏοβολή φίλτÏων">
+<!ENTITY visitHomepage.label "Ιστοσελίδα της συνδÏομής">
+<!ENTITY addSubscription.label "ΠÏοσθήκη συνδÏομής">
+<!ENTITY dialog.title "ΣυνδÏομές φίλτÏων του Adblock Plus">
+<!ENTITY location.label "&amp;Τοποθεσία λίστας φίλτÏων:">
+<!ENTITY fromWeb.description "ΠαÏακαλώ επιβεβαιώστε ότι θέλετε να Ï€Ïοσθέσετε αυτή την λίστα φίλτÏων. ΜποÏείτε να Ï„Ïοποποιήσετε τον τίτλο ή την τοποθεσία Ï€Ïιν την Ï€Ïοσθήκη.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/composer.dtd
new file mode 100644
index 0000000..00d84ba
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "at the end of the address">
+<!ENTITY domainRestriction.label "Restrict to domain:">
+<!ENTITY collapse.default.no.label "Use default (no)">
+<!ENTITY firstParty.label "First-party only">
+<!ENTITY preferences.label "Show existing filters...">
+<!ENTITY pattern.label "Look for pattern">
+<!ENTITY thirdParty.label "Third-party only">
+<!ENTITY filter.label "New filter:">
+<!ENTITY collapse.label "Collapse blocked:">
+<!ENTITY match.warning "The pattern you entered no longer matches the address to be blocked/whitelisted and will have no effect on it.">
+<!ENTITY anchor.start.label "at the beginning of the address">
+<!ENTITY matchCase.label "Match case">
+<!ENTITY custom.pattern.label "Custom:">
+<!ENTITY unselectAllTypes.label "Select none">
+<!ENTITY type.whitelist.label "Exception rule">
+<!ENTITY regexp.warning "The pattern you entered will be interpreted as a regular expression; this cannot be efficiently processed by Adblock Plus and may slow down your browsing experience. If you didn't intend to use a regular expression, add an asterisk (*) to the end of the pattern.">
+<!ENTITY dialog.title "Add Adblock Plus filter rule">
+<!ENTITY basic.label "Basic view">
+<!ENTITY type.filter.label "Blocking filter">
+<!ENTITY types.label "Apply to types:">
+<!ENTITY shortpattern.warning "The pattern you entered is too short to be optimised; this may slow down your browsing experience. It is recommended that you choose a longer string for this filter to allow Adblock Plus to process the filter more efficiently.">
+<!ENTITY collapse.yes.label "Yes">
+<!ENTITY anchors.label "Accept pattern only:">
+<!ENTITY collapse.default.yes.label "Use default (yes)">
+<!ENTITY domainRestriction.help "Use this option to specify one or more domains separated by a bar line (|). The filter will only be applied on the domain(s) selected. A tilde (~) before a domain name indicates that the filter will not be applied on that domain.">
+<!ENTITY accept.label "Add filter">
+<!ENTITY options.label "Options">
+<!ENTITY disabled.warning "Adblock Plus is currently disabled. You can still add filters but they will not be applied unless you [link]enable Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "at the beginning of the domain name">
+<!ENTITY collapse.no.label "No">
+<!ENTITY selectAllTypes.label "Select all">
+<!ENTITY advanced.label "Advanced view">
+<!ENTITY pattern.explanation "The pattern can be any part of the address; asterisks (*) act as wildcards. The filter will only be applied to addresses matching the pattern provided.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/filters.dtd
new file mode 100644
index 0000000..fa14794
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "All your custom filters will be replaced by the contents of the selected file. Do you want to proceeed?">
+<!ENTITY slow.column "Slow filters">
+<!ENTITY enabled.column "Enabled">
+<!ENTITY subscription.lastDownload.checksumMismatch "Failed: checksum mismatch">
+<!ENTITY noFiltersInGroup.text "The selected group is empty">
+<!ENTITY subscription.actions.label "Actions">
+<!ENTITY filter.selectAll.label "Select All">
+<!ENTITY backupButton.label "Backup and Restore">
+<!ENTITY restore.minVersion.warning "Warning: the file has been created with a newer Adblock Plus version. You should update to the latest Adblock Plus version before restoring from this file.">
+<!ENTITY restore.error "The file's data could not be processed, maybe this isn't an Adblock Plus backup file?">
+<!ENTITY sort.ascending.label "A &gt; Z sort order">
+<!ENTITY sort.label "Sort by">
+<!ENTITY subscription.source.label "Filter list">
+<!ENTITY hitcount.column "Hits">
+<!ENTITY noFilters.text "You don't have any custom filters yet.">
+<!ENTITY backup.custom.title "Custom filters only">
+<!ENTITY subscription.external.label "Updated by another extension">
+<!ENTITY subscription.delete.label "Delete">
+<!ENTITY noGroupSelected.text "You need to select a filter group before its filters can be displayed.">
+<!ENTITY filter.cut.label "Cut">
+<!ENTITY restore.default.label "Restore backup from ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Downloading...">
+<!ENTITY subscriptions.tab.label "Filter subscriptions">
+<!ENTITY sort.descending.label "Z &gt; A sort order">
+<!ENTITY filters.remove.warning "Do you really want to remove all selected filters?">
+<!ENTITY filter.delete.label "Delete">
+<!ENTITY addSubscriptionAdd.label "Add">
+<!ENTITY viewMenu.label "View">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY addSubscriptionCancel.label "Cancel">
+<!ENTITY subscription.enabled.label "Enabled">
+<!ENTITY noSubscriptions.text "You haven't added any filter subscriptions yet. Adblock Plus won't block
+ anything without filters, please use &quot;Add filter subscription&quot; to
+ add some.">
+<!ENTITY subscription.update.label "Update filters">
+<!ENTITY dialog.title "Adblock Plus Filter Preferences">
+<!ENTITY addFilter.label "Add filter">
+<!ENTITY subscription.minVersion.warning "This filter subscription requires a newer Adblock Plus version; you should update to the latest Adblock Plus version.">
+<!ENTITY subscription.lastDownload.invalidURL "Failed: not a valid address">
+<!ENTITY backup.error "There was an error writing filters to the file. Make sure that the file isn't write protected or in use by another application.">
+<!ENTITY filter.moveUp.label "Move up">
+<!ENTITY addGroup.label "Add filter group">
+<!ENTITY filter.edit.label "Edit">
+<!ENTITY subscription.showHideFilters.label "Show/hide filters">
+<!ENTITY acceptableAds2.label "Allow some non-intrusive advertising">
+<!ENTITY addSubscriptionOther.label "Add a different subscription">
+<!ENTITY close.label "Close">
+<!ENTITY sort.none.label "Unsorted">
+<!ENTITY filter.actions.label "Filter actions">
+<!ENTITY filter.copy.label "Copy">
+<!ENTITY filter.moveDown.label "Move down">
+<!ENTITY filter.resetHitCounts.label "Reset hit statistics">
+<!ENTITY readMore.label "Read more">
+<!ENTITY subscription.moveUp.label "Move up">
+<!ENTITY addSubscription.label "Add filter subscription">
+<!ENTITY subscription.homepage.label "Homepage">
+<!ENTITY backup.complete.title "All filters and subscriptions">
+<!ENTITY restore.own.label "Restore own backup">
+<!ENTITY restore.complete.warning "All your filter preferences will be replaced by the contents of the selected file. Do you want to proceeed?">
+<!ENTITY filters.tab.label "Custom filters">
+<!ENTITY backup.label "Create new backup">
+<!ENTITY find.label "Find">
+<!ENTITY subscription.moveDown.label "Move down">
+<!ENTITY subscription.lastDownload.connectionError "Failed: download failure">
+<!ENTITY subscription.lastDownload.success "Success">
+<!ENTITY subscription.lastDownload.invalidData "Failed: not a valid filters list">
+<!ENTITY filter.paste.label "Paste">
+<!ENTITY subscription.disabledFilters.enable "Enable disabled filters">
+<!ENTITY lasthit.column "Last hit">
+<!ENTITY subscription.editTitle.label "Edit title">
+<!ENTITY subscription.disabledFilters.warning "Some filters in this subscription are disabled.">
+<!ENTITY filter.column "Filter rule">
+<!ENTITY subscription.lastDownload.label "Last download:">
+<!ENTITY viewList.label "View list">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/firstRun.properties
new file mode 100644
index 0000000..971a702
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Browse privately by disabling tracking - hiding your tracks from ad companies that would track your every move.
+firstRun_toggle_off=OFF
+firstRun_feature_tracking=Disable Tracking
+firstRun_feature_malware=Malware Blocking
+firstRun_title=Adblock Plus has been installed
+firstRun_acceptableAdsExplanation=We'd like to encourage websites to use straightforward, unobtrusive advertising. That's why we've established <a>strict guidelines</a> to identify positive ads, which are shown under default settings. If you still wish to block every ad you can <a>disable</a> this in a few seconds.
+firstRun_toggle_on=ON
+firstRun_contributor_credits=Contributor Credits
+firstRun_dataCorruptionWarning=Does this page keep showing up? <a>Click here!</a>
+firstRun_acceptableAdsHeadline=Annoying ads will now be blocked.
+firstRun_share=Tell your friends
+firstRun_share_headline=<a>Help us</a> in making the web a better place
+firstRun_features=Adblock Plus can do more than block ads
+firstRun_feature_malware_description=Make your browsing more secure by blocking known malware domains.
+firstRun_feature_social_description=Automatically rid your browsing experience of social media buttons (such as the Facebook Like) which appear on web pages and track your behaviour.
+firstRun_donate=Donate
+firstRun_donate_label=Support our project
+firstRun_feature_social=Remove Social Media Buttons
+firstRun_legacySafariWarning=You are using an old version of Safari which is not supported by Adblock Plus. It might not work correctly or impair the user experience on some websites. We strongly recommend to either update to Safari 6.1.1 or higher (on OS X 10.8 Mountain Lion), or Safari 7.0.1 or higher (on OS X 10.9 Mavericks), or to use the latest version of Mozilla Firefox, Google Chrome or Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/global.properties
new file mode 100644
index 0000000..6d3b8c6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=No blockable items on the current page
+action3_tooltip=Click to enable/disable Adblock Plus.
+notification_antiadblock_title=Hide targeted messages?
+type_label_script=script
+filter_elemhide_nocriteria=No criteria specified to recognise the element to be hidden
+blockingGroup_title=Ad Blocking Rules
+whitelisted_tooltip=Adblock Plus is active but disabled on current page.
+type_label_stylesheet=stylesheet
+blocked_count_tooltip=?1? out of ?2?
+type_label_font=font
+type_label_popup=popup window
+filter_regexp_tooltip=This filter is either a regular expression or too short to be optimised. Too many of these filters might slow down your browsing.
+action0_tooltip=Click to bring up context menu; middle-click to enable/disable.
+whitelisted_page=Adblock Plus has been disabled for the current page
+remove_group_warning=Do you really want to remove this group?
+action1_tooltip=Click to open/close blockable items; middle-click to enable/disable.
+type_label_xmlhttprequest=XML request
+active_tooltip=Adblock Plus is enabled, ?1? filter subscription(s) and ?2? custom filter(s) in use.
+type_label_document=document
+type_label_object_subrequest=object sub-request
+whitelistGroup_title=Exception Rules
+disabled_tooltip=Adblock Plus is disabled.
+filter_elemhide_duplicate_id=Only one ID of the element to be hidden can be specified
+type_label_object=object
+action2_tooltip=Click to open preferences; middle-click to enable/disable.
+type_label_subdocument=frame
+clearStats_warning=This will reset all filter hit statistics and disable counting filter hits. Do you want to proceed?
+notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages?
+blocked_count_addendum=(also whitelisted: ?1?, hidden: ?2?)
+subscription_invalid_location=Filter list location is neither a valid URL nor a valid file name.
+type_label_image=image
+remove_subscription_warning=Do you really want to remove this subscription?
+type_label_other=other
+mobile_menu_enable=ABP: Enable
+type_label_media=audio/video
+mobile_menu_disable_site=ABP: Disable on ?1?
+elemhideGroup_title=Element Hiding Rules
+mobile_menu_enable_site=ABP: Enable on ?1?
+type_label_elemhide=hidden
+newGroup_title=New filter group
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/overlay.dtd
new file mode 100644
index 0000000..f916e9a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "Yes">
+<!ENTITY notification.button.no "No">
+<!ENTITY sync.label "Syn&amp;chronise Adblock Plus settings">
+<!ENTITY whitelist.site.label "Disable on ?1?">
+<!ENTITY filters.label "Filter preferences">
+<!ENTITY disable.label "Disable everywhere">
+<!ENTITY objecttab.title "Block">
+<!ENTITY objecttab.tooltip "Block this object with Adblock Plus">
+<!ENTITY menuitem.label "Adblock Plus Preferences">
+<!ENTITY objecttabs.label "Show tabs on Flash and Java">
+<!ENTITY sendReport.label "Report issue on this page">
+<!ENTITY whitelist.page.label "Disable on this page only">
+<!ENTITY context.image.label "Adblock Plus: Block image">
+<!ENTITY counthits.label "Count filter hits">
+<!ENTITY opensidebar.label "Open blockable items">
+<!ENTITY notification.button.close "Close">
+<!ENTITY contribute.label "Contribute to Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Block frame">
+<!ENTITY blocked.tooltip "Blocked items on this page:">
+<!ENTITY hideplaceholders.label "Hide placeholders of blocked elements">
+<!ENTITY showinstatusbar.label "Show in status bar">
+<!ENTITY sidebar.title "Blockable items on current page">
+<!ENTITY options.label "Options">
+<!ENTITY context.object.label "Adblock Plus: Block object">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Re-enable on this page">
+<!ENTITY filters.tooltip "Most active filters:">
+<!ENTITY closesidebar.label "Close blockable items">
+<!ENTITY showintoolbar.label "Show in toolbar">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Block audio/video">
+<!ENTITY subscription.update.label "Update filters">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/sendReport.dtd
new file mode 100644
index 0000000..1dec6f7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/sendReport.dtd
@@ -0,0 +1,71 @@
+<!ENTITY screenshot.undo.label "Undo">
+<!ENTITY issues.disabledgroups.description "The following filter subscriptions / filter groups are disabled, yet they might have an effect on this page:">
+<!ENTITY showData.label "Show report data">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus is blocking too much">
+<!ENTITY issues.change.description "Your configuration has been changed. Please reload the page to test the changes and submit a report if the issue hasn't been resolved by the alterations.">
+<!ENTITY email.label "Email:">
+<!ENTITY issues.openPreferences.label "Open filter preferences">
+<!ENTITY sendPage.confirmation "Your report has been saved. You can access it at the following address:">
+<!ENTITY copyLink.label "Copy report link">
+<!ENTITY issues.nofilters.description "Adblock Plus isn't blocking anything on the current page. The issue you are observing is probably unrelated to Adblock Plus.">
+<!ENTITY sendPage.knownIssue "The issue you reported is probably already known. More information:">
+<!ENTITY typeSelector.other.description "Select this option if you suspect an issue with Adblock Plus itself rather than its filters.">
+<!ENTITY issues.disabledgroups.enable.label "Enable filter subscription / filter group">
+<!ENTITY typeWarning.override.label "I understand and want to submit the report anyway">
+<!ENTITY issues.disabled.enable.label "Enable Adblock Plus">
+<!ENTITY update.fixed.description "The updates to your filter subscriptions likely resolved the issue that you
+ were reporting. Please reload the page and retry, hit Report again if the
+ problem remains.">
+<!ENTITY anonymous.label "Anonymous submission">
+<!ENTITY reloadButton.label "Reload page">
+<!ENTITY recentReports.clear.label "Remove all reports">
+<!ENTITY typeSelector.description "This window will guide you through the steps required for the submission of an Adblock Plus issue report. First, please select the type of issue that you are experiencing on this page:">
+<!ENTITY screenshot.remove.label "Remove sensitive data">
+<!ENTITY issues.ownfilters.description "Some of the filters applied on this page are user-defined. Please disable the filters that might have caused the issue:">
+<!ENTITY update.inProgress.description "Adblock Plus needs to update your filter subscriptions to make sure that the
+ issue hasn't been resolved already. Please wait...">
+<!ENTITY sendPage.retry.label "Send again">
+<!ENTITY data.label "Report data:">
+<!ENTITY recentReports.label "Your recently submitted reports">
+<!ENTITY typeWarning.description "You have indicated that you want to report a general issue with Adblock Plus rather than a problem with the filters. Please note that such issues are best reported in the [link]Adblock Plus forum[/link]. You should only use the issue reporter to supplement an existing discussion, as nobody will notice your report unless you provide them with the link to it. The automatically generated link will be provided after submitting the report.">
+<!ENTITY issues.disabled.description "Adblock Plus is disabled, it will not block anything in its current state.">
+<!ENTITY attachExtensions.label "Attach a list of active extensions to the report in case add-on conflict is the cause of the problem">
+<!ENTITY issues.nosubscriptions.add.label "Add filter subscription">
+<!ENTITY issues.disabledfilters.enable.label "Enable filter">
+<!ENTITY issues.override.label "The configuration is correct, continue with the report">
+<!ENTITY issues.nosubscriptions.description "You do not appear to be subscribed to any of the pre-made filter lists that automatically remove unwanted content from websites.">
+<!ENTITY typeSelector.falsePositive.description "Select this option if the page lacks important content, displays incorrectly or fails to function properly. You can determine whether Adblock Plus is the cause of the problem by disabling it temporarily.">
+<!ENTITY typeSelector.other.label "Other issue">
+<!ENTITY emailComment.label "We encourage you to enter a valid email address so that we can contact you if there are questions
+ about your report. It will also allow us to recognize your contributions and to prioritize them higher.">
+<!ENTITY issues.whitelist.remove.label "Re-enable Adblock Plus on this page">
+<!ENTITY outdatedSubscriptions.description "The following filter subscriptions haven't been updated for at least two
+ weeks. Please update these subscriptions before submitting a report, the
+ issue might be resolved already.">
+<!ENTITY dataCollector.description "Please wait a few moments while Adblock Plus gathers the required data.">
+<!ENTITY sendButton.label "Send report">
+<!ENTITY comment.label "Comment (optional):">
+<!ENTITY sendPage.errorMessage "An attempt to send the report failed with error code &quot;?1?&quot;. Please ensure you are connected to the Internet and retry. If the problem persists please request assistance in the [link]Adblock Plus forum[/link].">
+<!ENTITY showRecentReports.label "Show recently submitted reports">
+<!ENTITY commentPage.heading "Enter comment">
+<!ENTITY update.start.label "Start update now">
+<!ENTITY issues.disabledfilters.description "The following filters are disabled, yet they might have an effect on this page:">
+<!ENTITY screenshot.description "The same page can look different for different people. It may help us to understand the problem if you attach a screenshot to your report. You can remove sections containing sensitive information as well as mark areas where the problem is noticeable. To do that click the corresponding button and select a section of the image with your mouse.">
+<!ENTITY screenshot.attach.label "Attach a page image to the report">
+<!ENTITY issues.whitelist.description "Adblock Plus is currently disabled on the page you are reporting. Please re-enable it and reload the page before submitting the report to assist the investigation of this issue.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus doesn't block an advertisement">
+<!ENTITY typeSelector.heading "Select issue type">
+<!ENTITY anonymity.warning "We won't be able to come back to you and will likely prioritize the report lower.">
+<!ENTITY wizard.title "Issue reporter">
+<!ENTITY issues.ownfilters.disable.label "Disable filter">
+<!ENTITY commentPage.description "The text field below allows you to enter a comment to help us understand the issue. This step is optional but recommended if the problem isn't obvious. You can also review the report data before it is sent.">
+<!ENTITY comment.lengthWarning "The length of your comment exceeds 1000 characters. Only the first 1000 characters will be sent.">
+<!ENTITY typeSelector.falseNegative.description "Select this option if an advertisement is displayed despite Adblock Plus being enabled.">
+<!ENTITY sendPage.waitMessage "Please wait while Adblock Plus is submitting your report.">
+<!ENTITY dataCollector.heading "Welcome to the issue reporter">
+<!ENTITY screenshot.heading "Attach screenshot">
+<!ENTITY sendPage.heading "Send report">
+<!ENTITY issues.subscriptionCount.description "It seems that you are subscribed to too many filter subscriptions. This setup is not recommended because it will make the likeliness of issues much higher. We also cannot accept your issue report because it is unclear which filter subscription author needs to take action. Please remove all but the really necessary filter subscriptions and test whether the issue still occurs then.">
+<!ENTITY screenshot.mark.label "Mark the problem">
+<!ENTITY privacyPolicy.label "Privacy policy">
+<!ENTITY issues.description "Adblock Plus has detected issues with your configuration that might be responsible for this issue or will make investigating the report difficult.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/sidebar.dtd
new file mode 100644
index 0000000..32cb7e1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Flash item's borders">
+<!ENTITY address.label "Address">
+<!ENTITY context.open.label "Open in New Tab">
+<!ENTITY type.label "Type">
+<!ENTITY tooltip.filterSource.label "Filter source:">
+<!ENTITY noitems.label "No blockable items">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Size">
+<!ENTITY reattach.label "Reattach">
+<!ENTITY search.label "Search:">
+<!ENTITY docDomain.thirdParty "(third party)">
+<!ENTITY filterSource.label "Filter source">
+<!ENTITY tooltip.docDomain.label "Document source:">
+<!ENTITY context.copy.label "Copy item's address">
+<!ENTITY tooltip.type.label "Type:">
+<!ENTITY context.disablefilter.label "Disable filter ?1?">
+<!ENTITY context.copyFilter.label "Copy filter">
+<!ENTITY context.block.label "Block this item">
+<!ENTITY context.enablefilter.label "Re-enable filter ?1?">
+<!ENTITY detach.label "Detach">
+<!ENTITY whitelisted.label "Whitelisted page">
+<!ENTITY context.disablefilteronsite.label "Disable this filter on ?1?">
+<!ENTITY detached.title "Adblock Plus: Blockable items (detached)">
+<!ENTITY docDomain.firstParty "(first party)">
+<!ENTITY tooltip.type.whitelisted "(whitelisted)">
+<!ENTITY tooltip.filter.label "Filter in effect:">
+<!ENTITY tooltip.filter.disabled "(disabled)">
+<!ENTITY context.editfilter.label "Edit filter in effect">
+<!ENTITY tooltip.type.blocked "(blocked)">
+<!ENTITY size.label "Size">
+<!ENTITY context.whitelist.label "Add exception rule for item">
+<!ENTITY context.selectAll.label "Select all">
+<!ENTITY state.label "State">
+<!ENTITY docDomain.label "Document source">
+<!ENTITY tooltip.address.label "Address:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/subscriptionSelection.dtd
new file mode 100644
index 0000000..10ba808
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Add filter subscription &quot;?1?&quot; as well">
+<!ENTITY list.download.failed "Adblock Plus failed to retrieve the list of subscriptions.">
+<!ENTITY list.download.retry "Try again">
+<!ENTITY title.label "Subscription title:">
+<!ENTITY list.download.website "View website">
+<!ENTITY supplementMessage "This filter subscription is meant to be used with the filter subscription &quot;?1?&quot; which you are not using yet.">
+<!ENTITY viewList.label "View filters">
+<!ENTITY visitHomepage.label "Visit home page">
+<!ENTITY addSubscription.label "Add subscription">
+<!ENTITY dialog.title "Add Adblock Plus filter subscription">
+<!ENTITY location.label "Filter list location:">
+<!ENTITY fromWeb.description "Please confirm that you want to add this filter subscription. You can change the subscription title or location before adding it.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/composer.dtd
new file mode 100644
index 0000000..bba41e3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/composer.dtd
@@ -0,0 +1,38 @@
+<!ENTITY dialog.title "Add Adblock Plus filter rule">
+<!ENTITY accept.label "Add filter">
+<!ENTITY advanced.label "Advanced view">
+<!ENTITY basic.label "Basic view">
+
+<!ENTITY disabled.warning "Adblock Plus is currently disabled. You can still add filters but they will not be applied unless you [link]enable Adblock Plus[/link].">
+
+<!ENTITY filter.label "New &amp;filter:">
+<!ENTITY preferences.label "&amp;Show existing filters...">
+<!ENTITY type.filter.label "&amp;Blocking filter">
+<!ENTITY type.whitelist.label "E&amp;xception rule">
+<!ENTITY pattern.label "Look for pattern">
+<!ENTITY pattern.explanation "The pattern can be any part of the address; asterisks (*) act as wildcards. The filter will only be applied to addresses matching the pattern provided.">
+<!ENTITY regexp.warning "The pattern you entered will be interpreted as a regular expression which cannot be efficiently processed by Adblock Plus and may slow down your browsing experience. If you didn't intend to use a regular expression, add an asterisk (*) to the end of the pattern.">
+<!ENTITY shortpattern.warning "The pattern you entered is too short to be optimized and may slow down your browsing experience. It is recommended that you choose a longer string for this filter to allow Adblock Plus to process the filter more efficiently.">
+<!ENTITY match.warning "The pattern you entered no longer matches the address to be blocked/whitelisted and will have no effect on it.">
+<!ENTITY custom.pattern.label "&amp;Custom:">
+<!ENTITY anchors.label "Accept pattern only:">
+<!ENTITY anchor.start.label "at the be&amp;ginning of the address">
+<!-- Note: This access key should usually be the same as anchor.start.flexible.accesskey. It is the same checkbox with different label depending on suggested filter.-->
+<!ENTITY anchor.start.flexible.label "at the be&amp;ginning of the domain name">
+<!-- Note: This access key should usually be the same as anchor.start.accesskey. It is the same checkbox with different label depending on suggested filter.-->
+<!ENTITY anchor.end.label "at the e&amp;nd of the address">
+<!ENTITY options.label "Options">
+<!ENTITY domainRestriction.label "Restrict to &amp;domain:">
+<!ENTITY domainRestriction.help "Use this option to specify one or more domains separated by a bar line (|). The filter will only be applied on the domain(s) selected. A tilde (~) before a domain name indicates that the filter will not be applied on that domain.">
+<!ENTITY firstParty.label "Fi&amp;rst-party only">
+<!ENTITY thirdParty.label "&amp;Third-party only">
+<!ENTITY matchCase.label "&amp;Match case">
+<!ENTITY types.label "Apply to types:">
+<!ENTITY selectAllTypes.label "Select all">
+<!ENTITY unselectAllTypes.label "Select none">
+
+<!ENTITY collapse.label "Co&amp;llapse blocked:">
+<!ENTITY collapse.default.yes.label "Use default (yes)">
+<!ENTITY collapse.default.no.label "Use default (no)">
+<!ENTITY collapse.yes.label "Yes">
+<!ENTITY collapse.no.label "No">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/filters.dtd
new file mode 100644
index 0000000..1ab4720
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/filters.dtd
@@ -0,0 +1,92 @@
+<!ENTITY dialog.title "Adblock Plus Filter Preferences">
+
+<!ENTITY subscriptions.tab.label "Filter subscriptions">
+<!ENTITY filters.tab.label "Custom filters">
+
+<!ENTITY addSubscription.label "Add &amp;filter subscription">
+<!ENTITY addSubscriptionAdd.label "Add">
+<!ENTITY addSubscriptionCancel.label "Cancel">
+<!ENTITY addSubscriptionOther.label "Add a different subscription">
+
+<!ENTITY noSubscriptions.text "
+ You haven't added any filter subscriptions yet. Adblock Plus won't block
+ anything without filters, please use &quot;Add filter subscription&quot; to
+ add some.
+">
+<!ENTITY subscription.homepage.label "Homepage">
+<!ENTITY subscription.external.label "Updated by another extension">
+<!ENTITY subscription.source.label "Filter list">
+<!ENTITY subscription.enabled.label "Enabled">
+<!ENTITY subscription.lastDownload.label "Last download:">
+<!ENTITY subscription.lastDownload.inProgress "Downloading…">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY subscription.lastDownload.invalidURL "Failed, not a valid address">
+<!ENTITY subscription.lastDownload.connectionError "Failed, download failure">
+<!ENTITY subscription.lastDownload.invalidData "Failed, not a valid filters list">
+<!ENTITY subscription.lastDownload.checksumMismatch "Failed, checksum mismatch">
+<!ENTITY subscription.lastDownload.success "Success">
+<!ENTITY subscription.minVersion.warning "This filter subscription requires a newer Adblock Plus version, you should update to the latest Adblock Plus version.">
+<!ENTITY subscription.disabledFilters.warning "Some filters in this subscription are disabled.">
+<!ENTITY subscription.disabledFilters.enable "Enable disabled filters">
+
+<!ENTITY subscription.actions.label "Actions">
+<!ENTITY subscription.update.label "Update filters">
+<!ENTITY subscription.editTitle.label "Edit title">
+<!ENTITY subscription.delete.label "Delete">
+<!ENTITY subscription.showHideFilters.label "Show/hide filters">
+<!ENTITY subscription.moveUp.label "Move up">
+<!ENTITY subscription.moveDown.label "Move down">
+
+<!ENTITY acceptableAds2.label "Allow some non-&amp;intrusive advertising">
+<!ENTITY viewList.label "View list">
+<!ENTITY readMore.label "Read more">
+
+<!ENTITY addGroup.label "Add filter &amp;group">
+<!ENTITY noFilters.text "
+ You don't have any custom filters yet.
+">
+
+<!ENTITY addFilter.label "A&amp;dd filter">
+<!ENTITY filter.actions.label "Filter actions">
+<!ENTITY filter.edit.label "Edit">
+<!ENTITY filter.cut.label "Cut">
+<!ENTITY filter.copy.label "Copy">
+<!ENTITY filter.paste.label "Paste">
+<!ENTITY filter.delete.label "Delete">
+<!ENTITY filter.selectAll.label "Select All">
+<!ENTITY filter.resetHitCounts.label "Reset hit statistics">
+<!ENTITY filter.moveUp.label "Move up">
+<!ENTITY filter.moveDown.label "Move down">
+<!ENTITY viewMenu.label "View">
+
+<!ENTITY filter.column "&amp;Filter rule">
+<!ENTITY slow.column "Slo&amp;w filters">
+<!ENTITY enabled.column "E&amp;nabled">
+<!ENTITY hitcount.column "&amp;Hits">
+<!ENTITY lasthit.column "&amp;Last hit">
+<!ENTITY sort.label "&amp;Sort by">
+<!ENTITY sort.none.label "&amp;Unsorted">
+<!ENTITY sort.ascending.label "&amp;A > Z sort order">
+<!ENTITY sort.descending.label "&amp;Z > A sort order">
+<!ENTITY noGroupSelected.text "You need to select a filter group before its filters can be displayed.">
+<!ENTITY noFiltersInGroup.text "The selected group is empty.">
+
+<!ENTITY filters.remove.warning "Do you really want to remove all selected filters?">
+
+<!ENTITY backupButton.label "&amp;Backup and Restore">
+<!ENTITY backup.label "Create new backup">
+<!-- Note: the placeholder ?1? will be replaced by date/time of the automatic backup -->
+<!ENTITY restore.default.label "Restore backup from ?1?">
+<!ENTITY restore.own.label "Restore own backup">
+
+<!ENTITY backup.complete.title "All filters and subscriptions">
+<!ENTITY backup.custom.title "Custom filters only">
+
+<!ENTITY backup.error "There was an error writing filters to the file. Make sure that the file isn't write protected or in use by another application.">
+<!ENTITY restore.error "The file's data could not be processed, maybe this isn't an Adblock Plus backup file?">
+<!ENTITY restore.complete.warning "All your filter preferences will be replaced by the contents of the selected file. Do you want to proceeed?">
+<!ENTITY restore.custom.warning "All your custom filters will be replaced by the contents of the selected file. Do you want to proceeed?">
+<!ENTITY restore.minVersion.warning "Warning: the file has been created with a newer Adblock Plus version. You should update to the latest Adblock Plus version before restoring from this file.">
+
+<!ENTITY find.label "Fi&amp;nd">
+<!ENTITY close.label "Close">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/firstRun.properties
new file mode 100644
index 0000000..21438b1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/firstRun.properties
@@ -0,0 +1,24 @@
+firstRun_title=Adblock Plus has been installed
+firstRun_dataCorruptionWarning=Does this page keep showing up? <a>Click here!</a>
+firstRun_acceptableAdsHeadline=Annoying ads will now be blocked
+firstRun_acceptableAdsExplanation=We'd like to encourage websites to use straightforward, unobtrusive advertising. That's why we've established <a>strict guidelines</a> to identify acceptable ads, which are shown under default settings. If you still want to block every ad you can <a>disable</a> this in a few seconds.
+firstRun_legacySafariWarning=You are using an old version of Safari which is not supported by Adblock Plus. It might not work correctly or impair the user experience on some websites. We strongly recommend to either update to Safari 6.1.1 or higher (on OS X 10.8 Mountain Lion), or Safari 7.0.1 or higher (on OS X 10.9 Mavericks), or to use the latest version of Mozilla Firefox, Google Chrome or Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
+
+firstRun_toggle_on=ON
+firstRun_toggle_off=OFF
+
+firstRun_features=Adblock Plus can do more than block ads
+firstRun_feature_malware=Malware Blocking
+firstRun_feature_malware_description=Make your browsing more secure by blocking known malware domains.
+firstRun_feature_social=Remove Social Media Buttons
+firstRun_feature_social_description=Automatically rid your browsing experience of social media buttons, such as the Facebook Like, which appear on web pages and track your behavior.
+firstRun_feature_tracking=Disable Tracking
+firstRun_feature_tracking_description=Browse privately by disabling tracking - hiding your tracks from ad companies that would track your every move.
+
+firstRun_share_headline=<a>Give us a hand</a> in making the web a better place
+firstRun_donate=donate
+firstRun_donate_label=Support our project
+firstRun_share=Tell your friends
+
+firstRun_contributor_credits=Contributor Credits
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/global.properties
new file mode 100644
index 0000000..59de9cb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/global.properties
@@ -0,0 +1,58 @@
+default_dialog_title=Adblock Plus
+
+action0_tooltip=Click to bring up context menu, middle-click to enable/disable.
+action1_tooltip=Click to open/close blockable items, middle-click to enable/disable.
+action2_tooltip=Click to open preferences, middle-click to enable/disable.
+action3_tooltip=Click to enable/disable Adblock Plus.
+
+disabled_tooltip=Adblock Plus is disabled.
+# Note: the placeholder ?1? will be replaced by the number of active filter subscriptions, the placeholder ?2? by the number of custom filters
+active_tooltip=Adblock Plus is enabled, ?1? filter subscription(s) and ?2? custom filter(s) in use.
+whitelisted_tooltip=Adblock Plus is disabled on current page.
+
+# Note: the placeholder ?1? will be replaced by the number of blocked items, the placeholder ?2? by the total number of items on current page
+blocked_count_tooltip=?1? out of ?2?
+# Note: the placeholder ?1? will be replaced by the number of whitelisted items, the placeholder ?2? by the number of hidden items on current page
+blocked_count_addendum=(also whitelisted: ?1?, hidden: ?2?)
+
+no_blocking_suggestions=No blockable items on the current page
+whitelisted_page=Adblock Plus has been disabled for the current page
+
+newGroup_title=New filter group
+whitelistGroup_title=Exception Rules
+blockingGroup_title=Ad Blocking Rules
+elemhideGroup_title=Element Hiding Rules
+
+remove_subscription_warning=Do you really want to remove this subscription?
+remove_group_warning=Do you really want to remove this group?
+clearStats_warning=This will reset all filter hit statistics and disable counting filter hits. Do you want to proceed?
+
+filter_regexp_tooltip=This filter is either a regular expression or too short to be optimized. Too many of these filters might slow down your browsing.
+filter_elemhide_duplicate_id=Only one ID of the element to be hidden can be specified
+filter_elemhide_nocriteria=No criteria specified to recognize the element to be hidden
+
+subscription_invalid_location=Filter list location is neither a valid URL nor a valid file name.
+
+type_label_other=other
+type_label_script=script
+type_label_image=image
+type_label_stylesheet=stylesheet
+type_label_object=object
+type_label_subdocument=frame
+type_label_document=document
+type_label_elemhide=hidden
+type_label_popup=pop-up window
+
+type_label_xmlhttprequest=XML request
+type_label_object_subrequest=object subrequest
+type_label_media=audio/video
+type_label_font=font
+
+mobile_menu_enable=ABP: Enable
+# Note: the placeholder ?1? will be replaced by the site name. Ideally it should be at the end of the string (space is limited and site names can be long).
+mobile_menu_enable_site=ABP: Enable on ?1?
+# Note: the placeholder ?1? will be replaced by the site name. Ideally it should be at the end of the string (space is limited and site names can be long).
+mobile_menu_disable_site=ABP: Disable on ?1?
+
+notification_antiadblock_title=Hide targeted messages?
+notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages?
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/overlay.dtd
new file mode 100644
index 0000000..895ff80
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/overlay.dtd
@@ -0,0 +1,41 @@
+<!ENTITY status.tooltip "Status:">
+<!ENTITY blocked.tooltip "Blocked items on this page:">
+<!ENTITY filters.tooltip "Most active filters:">
+
+<!ENTITY menuitem.label "Ad&amp;block Plus Preferences">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+
+<!ENTITY context.image.label "Adblock Plus: Block image">
+<!ENTITY context.object.label "Adblock Plus: Block object">
+<!ENTITY context.frame.label "Adblock Plus: Block frame">
+<!ENTITY context.media.label "Adblock Plus: Block audio/video">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Re-enable on this page">
+
+<!ENTITY sidebar.title "Blockable items on current page">
+
+<!ENTITY sendReport.label "&amp;Report issue on this page">
+<!ENTITY filters.label "&amp;Filter preferences">
+<!ENTITY opensidebar.label "Open &amp;blockable items">
+<!-- Note: This access key should usually be the same as closesidebar.accesskey. It is the same menu item with different label depending on whether the sidebar is currently open.-->
+<!ENTITY closesidebar.label "Close &amp;blockable items">
+<!-- Note: This access key should usually be the same as opensidebar.accesskey. It is the same menu item with different label depending on whether the sidebar is currently open.-->
+<!-- Note: the placeholder ?1? will be replaced by the domain name of the current page -->
+<!ENTITY whitelist.site.label "Disable on ?1?">
+<!ENTITY whitelist.page.label "Disable on this page only">
+<!ENTITY disable.label "Disable everywhere">
+<!ENTITY options.label "&amp;Options">
+<!ENTITY contribute.label "Contribute to Adblock Plus">
+
+<!ENTITY showintoolbar.label "Show in tool&amp;bar">
+<!ENTITY showinstatusbar.label "&amp;Show in status bar">
+<!ENTITY objecttabs.label "Show &amp;tabs on Flash and Java">
+<!ENTITY hideplaceholders.label "Hide p&amp;laceholders of blocked elements">
+<!ENTITY counthits.label "Count filter &amp;hits">
+<!ENTITY sync.label "Syn&amp;c Adblock Plus settings">
+<!ENTITY objecttab.title "Block">
+<!ENTITY objecttab.tooltip "Click here to block this object with Adblock Plus">
+
+<!ENTITY notification.button.yes "&amp;Yes">
+<!ENTITY notification.button.no "&amp;No">
+<!ENTITY notification.button.close "&amp;Close">
+<!ENTITY subscription.update.label "Update filters">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/sendReport.dtd
new file mode 100644
index 0000000..49621ec
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/sendReport.dtd
@@ -0,0 +1,181 @@
+<!ENTITY wizard.title "Issue reporter">
+<!ENTITY privacyPolicy.label "Privacy policy">
+
+<!ENTITY dataCollector.heading "Welcome to the issue reporter">
+<!ENTITY dataCollector.description "Please wait a few moments while Adblock Plus gathers the required data.">
+
+<!-- Please keep typeSelector.heading short - it is shown in the progress bar, not much space there -->
+<!ENTITY typeSelector.heading "Select issue type">
+
+<!ENTITY typeSelector.description "
+ This window will guide you through the steps required for the submission of an Adblock
+ Plus issue report. First, please select the type of issue that you are experiencing
+ on this page:
+">
+
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus is blocking too &amp;much">
+<!ENTITY typeSelector.falsePositive.description "
+ Select this option if the page lacks important content, displays incorrectly or
+ fails to function properly. You can determine whether Adblock Plus is the cause
+ of the problem by disabling it temporarily.
+">
+
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus doesn't block an ad&amp;vertisement">
+<!ENTITY typeSelector.falseNegative.description "
+ Select this option if an advertisement is displayed despite
+ Adblock Plus being enabled.
+">
+
+<!ENTITY typeSelector.other.label "O&amp;ther issue">
+<!ENTITY typeSelector.other.description "
+ Select this option if you suspect an issue with Adblock Plus itself rather
+ than its filters.
+">
+
+<!ENTITY showRecentReports.label "Show recently submitted reports">
+<!ENTITY recentReports.label "Your recently submitted reports">
+<!ENTITY recentReports.clear.label "&amp;Remove all reports">
+<!ENTITY update.inProgress.description "
+ Adblock Plus needs to update your filter subscriptions to make sure that the
+ issue hasn't been resolved already. Please wait...
+">
+
+<!ENTITY update.fixed.description "
+ The updates to your filter subscriptions likely resolved the issue that you
+ were reporting. Please reload the page and retry, hit Report again if the
+ problem remains.
+">
+
+<!ENTITY outdatedSubscriptions.description "
+ The following filter subscriptions haven't been updated for at least two
+ weeks. Please update these subscriptions before submitting a report, the
+ issue might be resolved already.
+">
+
+<!ENTITY update.start.label "Start update now">
+
+<!ENTITY issues.description "
+ Adblock Plus has detected issues with your configuration that might be responsible
+ for this issue or will make investigating the report difficult.
+">
+
+<!ENTITY issues.whitelist.description "
+ Adblock Plus is currently disabled on the page you are reporting. Please re-enable
+ it and reload the page before submitting the report to assist the investigation of
+ this issue.
+">
+<!ENTITY issues.whitelist.remove.label "Re-enable Adblock Plus on this page">
+
+<!ENTITY issues.disabled.description "
+ Adblock Plus is disabled, it will not block anything in its current state.
+">
+<!ENTITY issues.disabled.enable.label "Enable Adblock Plus">
+
+<!ENTITY issues.nofilters.description "
+ Adblock Plus isn't blocking anything on the current page. The issue you are
+ observing is most likely unrelated to Adblock Plus.
+">
+
+<!ENTITY issues.nosubscriptions.description "
+ You do not appear to be subscribed to any of the pre-made filter lists that
+ automatically remove unwanted content from websites.
+">
+<!ENTITY issues.nosubscriptions.add.label "Add filter subscription">
+
+<!ENTITY issues.subscriptionCount.description "
+ It seems that you are subscribed to too many filter subscriptions. This
+ setup is not recommended because it will make the likeliness
+ of issues much higher. We also cannot accept your issue report because it
+ is unclear which filter subscription author needs to take action. Please
+ remove all but the really necessary filter subscriptions and test whether
+ the issue still occurs then.
+">
+<!ENTITY issues.openPreferences.label "Open filter preferences">
+
+<!ENTITY issues.ownfilters.description "
+ Some of the filters applied on this page are user-defined. Please disable
+ the filters that might have caused the issue:
+">
+<!ENTITY issues.ownfilters.disable.label "Disable filter">
+
+<!ENTITY issues.disabledgroups.description "
+ The following filter subscriptions / filter groups are disabled, yet they might have
+ an effect on this page:
+">
+<!ENTITY issues.disabledgroups.enable.label "Enable filter subscription / filter group">
+
+<!ENTITY issues.disabledfilters.description "
+ The following filters are disabled, yet they might have an effect on this page:
+">
+<!ENTITY issues.disabledfilters.enable.label "Enable filter">
+
+<!ENTITY issues.override.label "The &amp;configuration is correct, continue with the report">
+<!ENTITY issues.change.description "
+ Your configuration has been changed. Please reload the page to test the changes
+ and submit a report if the issue hasn't been resolved by the alterations.
+">
+
+<!ENTITY typeWarning.description "
+ You have indicated that you want to report a general issue with Adblock Plus rather
+ than a problem with the filters. Please note that such issues are best reported
+ in the [link]Adblock Plus forum[/link]. You should only use the issue reporter to
+ supplement an existing discussion, as nobody will notice your report
+ unless you provide them with the link to it. The automatically generated link
+ will be provided after submitting the report.
+">
+
+<!ENTITY typeWarning.override.label "I under&amp;stand and want to submit the report anyway">
+<!ENTITY reloadButton.label "&amp;Reload page">
+<!-- Please keep screenshot.heading short - it is shown in the progress bar, not much space there -->
+<!ENTITY screenshot.heading "Attach screenshot">
+
+<!ENTITY screenshot.description "
+ The same page can look different for different people. It may help us to
+ understand the problem if you attach a screenshot to your report. You can remove
+ sections containing sensitive information as well as mark areas where the
+ problem is noticeable. To do that click the corresponding button and select
+ a section of the image with your mouse.
+">
+
+<!ENTITY screenshot.attach.label "A&amp;ttach a page image to the report">
+<!ENTITY screenshot.mark.label "&amp;Mark the problem">
+<!ENTITY screenshot.remove.label "&amp;Remove sensitive data">
+<!ENTITY screenshot.undo.label "&amp;Undo">
+<!-- Please keep commentPage.heading short - it is shown in the progress bar, not much space there -->
+<!ENTITY commentPage.heading "Enter comment">
+
+<!ENTITY commentPage.description "
+ The text field below allows you to enter a comment to help us understand the issue.
+ This step is optional but recommended if the problem isn't obvious.
+ You can also review the report data before it is sent.
+">
+
+<!ENTITY emailComment.label "
+ We encourage you to enter a valid email address so that we can contact you if there are questions
+ about your report. It will also allow us to recognize your contributions and to prioritize them higher.
+">
+<!ENTITY comment.label "&amp;Comment (optional):">
+<!ENTITY comment.lengthWarning "The length of your comment exceeds 1000 characters. Only the first 1000 characters will be sent.">
+<!ENTITY email.label "E&amp;mail:">
+<!ENTITY anonymous.label "&amp;Anonymous submission">
+<!ENTITY anonymity.warning "We won't be able to come back to you and will likely prioritize the report lower.">
+
+<!ENTITY attachExtensions.label "Attach a list of active e&amp;xtensions to the report in case add-on conflict is the cause of the problem">
+<!ENTITY sendButton.label "Se&amp;nd report">
+<!ENTITY showData.label "Show report data">
+<!ENTITY data.label "Re&amp;port data:">
+<!-- Please keep sendPage.heading short - it is shown in the progress bar, not much space there -->
+<!ENTITY sendPage.heading "Send report">
+<!ENTITY sendPage.waitMessage "Please wait while Adblock Plus is submitting your report.">
+<!ENTITY sendPage.confirmation "Your report has been saved. You can access it at the following address:">
+<!ENTITY sendPage.knownIssue "The issue you reported is probably already known. More information:">
+
+<!-- Note: the placeholder ?1? will be replaced by the error code -->
+<!ENTITY sendPage.errorMessage "
+ An attempt to send the report failed with error code &quot;?1?&quot;. Please ensure you are
+ connected to the Internet and retry. If the problem persists please request
+ assistance in the [link]Adblock Plus forum[/link].
+">
+<!ENTITY sendPage.retry.label "Send again">
+
+<!ENTITY copyLink.label "&amp;Copy report link">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/sidebar.dtd
new file mode 100644
index 0000000..f612047
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/sidebar.dtd
@@ -0,0 +1,41 @@
+<!ENTITY detached.title "Adblock Plus: Blockable items (detached)">
+
+<!ENTITY detach.label "Detach">
+<!ENTITY reattach.label "Reattach">
+
+<!ENTITY search.label "&amp;Search:">
+<!ENTITY type.label "Type">
+<!ENTITY address.label "Address">
+<!ENTITY filter.label "Filter">
+<!ENTITY state.label "State">
+<!ENTITY size.label "Size">
+<!ENTITY filterSource.label "Filter source">
+<!ENTITY docDomain.label "Document source">
+<!ENTITY docDomain.thirdParty "(third party)">
+<!ENTITY docDomain.firstParty "(first party)">
+<!ENTITY noitems.label "No blockable items">
+<!ENTITY whitelisted.label "Whitelisted page">
+<!ENTITY tooltip.address.label "Address:">
+<!ENTITY tooltip.type.label "Type:">
+<!ENTITY tooltip.type.blocked "(blocked)">
+<!ENTITY tooltip.type.whitelisted "(whitelisted)">
+<!ENTITY tooltip.size.label "Size:">
+<!ENTITY tooltip.docDomain.label "Document source:">
+<!ENTITY tooltip.filter.label "Filter in effect:">
+<!ENTITY tooltip.filter.disabled "(disabled)">
+<!ENTITY tooltip.filterSource.label "Filter source:">
+
+<!ENTITY context.block.label "Block this item">
+<!ENTITY context.editfilter.label "Edit filter in effect">
+<!ENTITY context.whitelist.label "Add exception rule for item">
+<!-- Note: the placeholder ?1? will be replaced by the filter text -->
+<!ENTITY context.disablefilter.label "Disable filter ?1?">
+<!-- Note: the placeholder ?1? will be replaced by the filter text -->
+<!ENTITY context.enablefilter.label "Re-enable filter ?1?">
+<!-- Note: the placeholder ?1? will be replaced by the domain name of the current page -->
+<!ENTITY context.disablefilteronsite.label "Disable this filter on ?1?">
+<!ENTITY context.open.label "Open in New Tab">
+<!ENTITY context.flash.label "Flash item's borders">
+<!ENTITY context.copy.label "Copy item's address">
+<!ENTITY context.copyFilter.label "Copy filter">
+<!ENTITY context.selectAll.label "Select all">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/subscriptionSelection.dtd
new file mode 100644
index 0000000..78444d1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/subscriptionSelection.dtd
@@ -0,0 +1,19 @@
+<!ENTITY dialog.title "Add Adblock Plus filter subscription">
+
+<!ENTITY viewList.label "View filters">
+<!ENTITY visitHomepage.label "Visit home page">
+
+<!ENTITY addSubscription.label "Add subscription">
+
+<!ENTITY list.download.failed "Adblock Plus failed to retrieve the list of subscriptions.">
+<!ENTITY list.download.retry "Try again">
+<!ENTITY list.download.website "View website">
+
+<!ENTITY fromWeb.description "Please confirm that you want to add this filter subscription. You can change the subscription title or location before adding it.">
+
+<!ENTITY title.label "Subscrip&amp;tion title:">
+<!ENTITY location.label "Fi&amp;lter list location:">
+<!-- Note: the placeholder (?1?) will be replaced by the name of the filter subscription required -->
+<!ENTITY supplementMessage "This filter subscription is meant to be used with the filter subscription &quot;?1?&quot; which you are not using yet.">
+<!-- Note: the placeholder (?1?) will be replaced by the name of the filter subscription required -->
+<!ENTITY addMain.label "Add filter &amp;subscription &quot;?1?&quot; as well">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/composer.dtd
new file mode 100644
index 0000000..20fc48a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "en la fi&amp;no de la adreso">
+<!ENTITY domainRestriction.label "&amp;Limigi al retregiono:">
+<!ENTITY collapse.default.no.label "Uzi apriorojn (ne)">
+<!ENTITY firstParty.label "Nu&amp;r de unua liveranto">
+<!ENTITY preferences.label "Montri &amp;ekzistantajn filtrilojn...">
+<!ENTITY pattern.label "Serĉi modelon">
+<!ENTITY thirdParty.label "Nur de &amp;tria liveranto">
+<!ENTITY filter.label "Nova &amp;filtrilo:">
+<!ENTITY collapse.label "Ma&amp;letendi blokitajn:">
+<!ENTITY match.warning "La modelo, kiun vi enigis, ne plu konformas kun la adreso, kiu estu blokata/transprenata en la blankan liston kaj ne havos efikon al Äi.">
+<!ENTITY anchor.start.label "en la &amp;komenco de la adreso">
+<!ENTITY matchCase.label "&amp;Atenti usklecon">
+<!ENTITY custom.pattern.label "&amp;Propraj:">
+<!ENTITY unselectAllTypes.label "Elekti nenion">
+<!ENTITY type.whitelist.label "Es&amp;ceptoregulo">
+<!ENTITY regexp.warning "La modelo, kiun vi enigis, estos interpretata kiel regula esprimo, kiu ne povas esti traktata oer Adblock Plus kaj povas malrapidigi vian retumadon. Se vi ne intencas uzi regulan esprimon, aldonu asteriskon (*) al la fino de la modelo.">
+<!ENTITY dialog.title "Aldoni filtrilregulon al Adblock Plus">
+<!ENTITY basic.label "Baza vido">
+<!ENTITY type.filter.label "&amp;Blokanta filtrilo">
+<!ENTITY types.label "Apliki al specoj:">
+<!ENTITY shortpattern.warning "La modelo, kiun vi enigis, estas tro mallonga por optimigo kaj povas malrapidigi vian retumadon. RekomendiÄas, ke vi elektas pli longan signoĉenon por ĉi tiu filtrilo por permesi Adblock Plus trakti la filtrilon pli efike.">
+<!ENTITY collapse.yes.label "Jes">
+<!ENTITY anchors.label "Akcepti modelon nur:">
+<!ENTITY collapse.default.yes.label "Uzi apriorojn (jes)">
+<!ENTITY domainRestriction.help "Uzu ĉi tiun opcion por specifi unu retregionon aŭ plurajn retregionojn, separitajn per strekosigno (|). La filtrilo estos nur aplikata al elektita(j) retregiono(j). Tildo (~) antaŭ retregiona nomo indikas, ke la filtrilo ne estos aplikata al tiu retregiono.">
+<!ENTITY accept.label "Aldoni filtrilon">
+<!ENTITY options.label "Opcioj">
+<!ENTITY disabled.warning "Addblock Plus estas nun malÅaltita. Vi povas ankoraÅ­ aldoni filtrilojn sed ili ne estos aplikataj, Äis vi [link]enÅaltas Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "en la komenco de la retre&amp;giona nomo">
+<!ENTITY collapse.no.label "Ne">
+<!ENTITY selectAllTypes.label "Elekti ĉion">
+<!ENTITY advanced.label "Detala vido">
+<!ENTITY pattern.explanation "La modelo povas esti parto de la adreso; asteriskoj (*) funkcias kiel ĵokeroj. La filtrilo estos nur aplikata al adresoj, kiuj konformas kun la specifita modelo.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/filters.dtd
new file mode 100644
index 0000000..a7c498c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Ĉiuj viaj propraj filtriloj estos anstataŭigataj per la enhavo de la elektita dosiero. Ĉu vi volas daŭrigi?">
+<!ENTITY slow.column "&amp;Malrapidaj filtriloj">
+<!ENTITY enabled.column "Ebl&amp;igita">
+<!ENTITY subscription.lastDownload.checksumMismatch "Malsukcesis, kontrolsuma miskongruo">
+<!ENTITY noFiltersInGroup.text "La elektita grupo estas malplena.">
+<!ENTITY subscription.actions.label "Agoj">
+<!ENTITY filter.selectAll.label "Elekti ĉion">
+<!ENTITY backupButton.label "Se&amp;kurkopii kaj restaÅ­ri">
+<!ENTITY restore.minVersion.warning "Averto: la dosiero estas kreita per pli nova versio de Adblock Plus. Vi Äisdatigu al la plej nova versio de Adblock Plus antaÅ­ ol vi restaÅ­ri ion el ĉi tiu dosiero.">
+<!ENTITY restore.error "La dosieraj datumoj ne povis traktitaj, ĉu tio eble ne estas sekurkopia dosiero de Adblock Plus?">
+<!ENTITY sort.ascending.label "Ordigo &amp;A &gt; Z">
+<!ENTITY sort.label "&amp;Ordigi laÅ­">
+<!ENTITY subscription.source.label "Filtrila listo">
+<!ENTITY hitcount.column "&amp;Trafoj">
+<!ENTITY noFilters.text "Vi ankoraÅ­ ne havas proprajn filtrilojn.">
+<!ENTITY backup.custom.title "Nur propraj filtriloj">
+<!ENTITY subscription.external.label "Ĝisdatigita per alia etendaĵo">
+<!ENTITY subscription.delete.label "ForviÅi">
+<!ENTITY noGroupSelected.text "Vi devas elekti filtrilgrupon antaÅ­ ol filtriloj povas esti vidigataj.">
+<!ENTITY filter.cut.label "Eltondi">
+<!ENTITY restore.default.label "RestaÅ­ri sekurkopion de ?1?">
+<!ENTITY subscription.lastDownload.inProgress "ElÅutanta...">
+<!ENTITY subscriptions.tab.label "Filtrilabonoj">
+<!ENTITY sort.descending.label "Ordigo &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Ĉu vi vere volas forigi ĉiujn elektitajn filtrilojn?">
+<!ENTITY filter.delete.label "ForviÅi">
+<!ENTITY addSubscriptionAdd.label "Aldoni">
+<!ENTITY viewMenu.label "Vidi">
+<!ENTITY subscription.lastDownload.unknown "Neniu">
+<!ENTITY addSubscriptionCancel.label "Nuligi">
+<!ENTITY subscription.enabled.label "Ebligita">
+<!ENTITY noSubscriptions.text "Vi ankoraÅ­ ne aldonis filtrilabonojn. Adblock Plus blokos enion sen filtriloj, bonvolu uzu &quot;Aldoni filtrilabonon&quot; por aldoni abonon.">
+<!ENTITY subscription.update.label "Äœisdatigi filtrilojn">
+<!ENTITY dialog.title "Filtrilaj agordoj de Adblock Plus">
+<!ENTITY addFilter.label "Al&amp;doni filtrilon">
+<!ENTITY subscription.minVersion.warning "Ĉi tiu filtrilabono bezonas pli novan version de Adblock Plus, vi Äisdatigu al la plej nova versio de Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Malsukcesis, tio ne estas valida adreso">
+<!ENTITY backup.error "Okazis eraro dum skribado de filtriloj en dosieron. Kontrolu, ke la dosiero ne estas kontraŭskribe protektita aŭ uzate per alia aplikaĵo.">
+<!ENTITY filter.moveUp.label "Supren">
+<!ENTITY addGroup.label "Aldoni filtril&amp;grupon">
+<!ENTITY filter.edit.label "Redakti">
+<!ENTITY subscription.showHideFilters.label "Montri/KaÅi filtrilojn">
+<!ENTITY acceptableAds2.label "Permesi neal&amp;trudiÄantan reklamon">
+<!ENTITY addSubscriptionOther.label "Aldoni alian abonon">
+<!ENTITY close.label "Fermi">
+<!ENTITY sort.none.label "&amp;Nenio">
+<!ENTITY filter.actions.label "Filtrilaj agoj">
+<!ENTITY filter.copy.label "Kopii">
+<!ENTITY filter.moveDown.label "Malsupren">
+<!ENTITY filter.resetHitCounts.label "Rekomencigi trafostatistikon">
+<!ENTITY readMore.label "Legu pli">
+<!ENTITY subscription.moveUp.label "Supren">
+<!ENTITY addSubscription.label "Aldoni &amp;filtrilabonon">
+<!ENTITY subscription.homepage.label "HejmpaÄo">
+<!ENTITY backup.complete.title "Ĉiuj filtriloj kaj abonoj">
+<!ENTITY restore.own.label "RestaÅ­ri propran sekurkopion">
+<!ENTITY restore.complete.warning "Ĉiuj viaj filtrilaj agordoj estos anstataŭigataj per la enhavo de la elektita dosiero. Ĉu vi volas daŭrigi?">
+<!ENTITY filters.tab.label "Propraj filtriloj">
+<!ENTITY backup.label "Krei novan sekurkopion">
+<!ENTITY find.label "&amp;Serĉi">
+<!ENTITY subscription.moveDown.label "Malsupren">
+<!ENTITY subscription.lastDownload.connectionError "Malsukcesis, elÅuta eraro">
+<!ENTITY subscription.lastDownload.success "Sukceso">
+<!ENTITY subscription.lastDownload.invalidData "Malsukcesis, tio ne estas listo de validaj filtriloj">
+<!ENTITY filter.paste.label "Alglui">
+<!ENTITY subscription.disabledFilters.enable "Ebligi malebligitajn filtrilojn">
+<!ENTITY lasthit.column "&amp;Lasta trafo">
+<!ENTITY subscription.editTitle.label "Redakti titolon">
+<!ENTITY subscription.disabledFilters.warning "Kelkaj filtriloj en ĉi tiu abono estas malebligitaj.">
+<!ENTITY filter.column "&amp;Filtrilregulo">
+<!ENTITY subscription.lastDownload.label "Lasta elÅuto:">
+<!ENTITY viewList.label "Montri liston">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/firstRun.properties
new file mode 100644
index 0000000..64666ee
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Retumu private malebligante spuradon resp. kaÅante viajn spurojn antaÅ­ reklamfirmaoj, kiuj volonte spurus ĉiun el viaj movoj.
+firstRun_toggle_off=MalÅaltita
+firstRun_feature_tracking=Malebligi spuradon
+firstRun_feature_malware=Bloki fiprogramaron
+firstRun_title=Adblock Plus instaliÄis
+firstRun_acceptableAdsExplanation=Ni volonte kuraÄigus retejojn uzi sinceran, nealtrudiÄeman varbadon. Tial ni fiksis <a>striktajn direktivojn</a> por identigi akcepteblan reklamon, kiujn vi trovas en la defaÅ­ltaj agordoj. Se vi ankoraÅ­ volas bloki ĉian reklamon, vi povas <a>malebligi</a> tion dum malmultaj sekundoj.
+firstRun_toggle_on=Åœaltita
+firstRun_contributor_credits=Danko al kontribuintoj
+firstRun_dataCorruptionWarning=Ĉu la paÄo estas plumontrata? <a>Klaku ĉi tie!</a>
+firstRun_acceptableAdsHeadline=AltrudiÄema reklamo estos nun blokata
+firstRun_share=Informu viajn amikojn
+firstRun_share_headline=<a>Donu al ni manon</a>, por ke ni faru la reton pli bona loko
+firstRun_features=Adblock Plus povas fari pli multe ol bloki reklamon
+firstRun_feature_malware_description=Faru vian retumadon pli sekura blokante konatajn domajnojn de fiprogramaro.
+firstRun_feature_social_description=AÅ­tomate forigi vian retan agadon faritan pere de butonoj de sociaj medioj, kiel la butono "Åœati" en Fejsbuko, kiuj aperas en retpaÄoj kaj spuras vian konduton.
+firstRun_donate=donaci
+firstRun_donate_label=Subtenu nian projekton
+firstRun_feature_social=Forigi butonojn de sociaj aŭdvidaĵoj
+firstRun_legacySafariWarning=Vi uzas malnovan version de Safari, kiun Adblock Plus ne subtenas. Eble Äi ne korekte funkcios aÅ­ Äenas la travivaĵon de uzanto sur kelkaj retejoj. Ni eksplicite rekomendas aÅ­ Äisdatigi al Safari 6.1.1 aÅ­ pli alta versio (estas je dispono por Mac OS X 10.8 Mountain Lion) aÅ­ Safari 7.0.1 aÅ­ pli alta versio (estas je dispono por OS X 10.9 Mavericks) aÅ­ uzi la plej novan version de Mozilla Firefox, Google Chrome aÅ­ Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/global.properties
new file mode 100644
index 0000000..f37a94d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Neniuj blokeblaj elementoj en ĉi tiu paÄo
+action3_tooltip=Klaku por ebligi/malebligi Adblock Plus.
+notification_antiadblock_title=Ĉu kaÅi celmesaÄojn?
+type_label_script=skripto
+filter_elemhide_nocriteria=Neniuj kriterioj specifitaj por ekkoni la kaÅotan elementon
+blockingGroup_title=Reguloj por bloki reklamon
+whitelisted_tooltip=Adblock Plus estas malebligita sur ĉi tiu paÄo.
+type_label_stylesheet=stilfolio
+blocked_count_tooltip=?1? el ?2?
+type_label_font=tiparo
+type_label_popup=Åprucfenestro
+filter_regexp_tooltip=Ĉi tiu filtrilo estas aŭ regula esprimo aŭ tro mallonga por optimigo. Tro multe da ĉi tiuj filtriloj povus malrapidigi vian retumadon.
+action0_tooltip=Klaku por vidigi la kuntekstan menuon, klaku per la meza musklavo por ebligi/malebligi Äin.
+whitelisted_page=Adblock Plus estas malebligita por ĉi tiu paÄo
+remove_group_warning=Ĉu vi vere volas forigi ĉi tiun grupon?
+action1_tooltip=Klaku por malfermi/fermi blokeblajn elementojn, klaku per la meza musklavo por ebligi/malebligi Äin.
+type_label_xmlhttprequest=XML-peto
+active_tooltip=Adblock Plus estas ebligita, ?1? filtrilabonoj kaj ?2? propraj filtriloj estas uzataj.
+type_label_document=dokumento
+type_label_object_subrequest=objekta subpeto
+whitelistGroup_title=Esceptoreguloj
+disabled_tooltip=Adblock Plus estas malebligita.
+filter_elemhide_duplicate_id=Nur unu el la kaÅotaj elementoj povas esti specifata
+type_label_object=objekto
+action2_tooltip=Klaku por malfermi agordojn, klaku per la meza musklavo por ebligi/malebligi Äin.
+type_label_subdocument=kadro
+clearStats_warning=Tio rekomencigos la statistikon de filtrilaj trafoj kaj malebligos la nombradon de filtrilaj trafoj. Ĉu vi volas daŭrigi?
+notification_antiadblock_message=Estas konate, ke ĉi tiu retejo montras celmesaÄojn por uzantoj de Adblock Plus. Ĉu vi volas, ke Adblock Plus kaÅu celmesaÄojn?
+blocked_count_addendum=(ankaÅ­ en blanka listo: ?1?, kaÅita: ?2?)
+subscription_invalid_location=La loko de la listo de filtriloj estas nek valida URL nek valida dosiernomo.
+type_label_image=bildo
+remove_subscription_warning=Ĉu vi efektive volas fini ĉi tiun abonon?
+type_label_other=alia
+mobile_menu_enable=ABP: Ebligi
+type_label_media=aÅ­dio/video
+mobile_menu_disable_site=ABP: Malebligi en ?1?
+elemhideGroup_title=Reguloj por kaÅi elementojn
+mobile_menu_enable_site=ABP: Ebligi en ?1?
+type_label_elemhide=kaÅita
+newGroup_title=Nova grupo de filtriloj
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/overlay.dtd
new file mode 100644
index 0000000..6c1bb4f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Jes">
+<!ENTITY notification.button.no "&amp;Ne">
+<!ENTITY sync.label "&amp;Sinkronigi agordojn de Adblock Plus">
+<!ENTITY whitelist.site.label "Malebligi sur ?1?">
+<!ENTITY filters.label "&amp;Filtrilaj agordoj">
+<!ENTITY disable.label "Ĉie malebligi">
+<!ENTITY objecttab.title "Bloki">
+<!ENTITY objecttab.tooltip "Klaku ĉi tien por bloki ĉi tiun objekton per Adblock Plus">
+<!ENTITY menuitem.label "&amp;Agordoj de Adblock Plus">
+<!ENTITY objecttabs.label "&amp;Montri langetojn de Flash kaj Äœavo">
+<!ENTITY sendReport.label "&amp;Raporti problemon pri ĉi tiu paÄo">
+<!ENTITY whitelist.page.label "Malebligi nur sur ĉi tiu paÄo">
+<!ENTITY context.image.label "Adblock Plus: Bloki bildon">
+<!ENTITY counthits.label "&amp;Nombri filtriltrafojn">
+<!ENTITY opensidebar.label "Malfermi &amp;blokeblajn elementojn">
+<!ENTITY notification.button.close "&amp;Fermi">
+<!ENTITY contribute.label "Kontribuu al Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Bloki kadron">
+<!ENTITY blocked.tooltip "Blokitaj elementoj sur ĉi tiu paÄo:">
+<!ENTITY hideplaceholders.label "KaÅi &amp;lokokupilojn de blokitaj elementoj">
+<!ENTITY showinstatusbar.label "Vidi&amp;gi en statstrio">
+<!ENTITY sidebar.title "Blokeblaj elementoj sur la nuna paÄo">
+<!ENTITY options.label "&amp;Opcioj">
+<!ENTITY context.object.label "Adblock Plus: Bloki objekton">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Reebligi sur ĉi tiu paÄo">
+<!ENTITY filters.tooltip "Plej aktivaj filtriloj:">
+<!ENTITY closesidebar.label "Fermi &amp;blokeblajn elementojn">
+<!ENTITY showintoolbar.label "&amp;Vidigi en ilobreto">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Bloki aÅ­dion/videon">
+<!ENTITY subscription.update.label "Äœisdatigi filtrilojn">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/sendReport.dtd
new file mode 100644
index 0000000..5e145e7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Malfari">
+<!ENTITY issues.disabledgroups.description "La sekvontaj filtrilabonoj/filtrilgrupoj estas malebligitaj, sed ili povus havi efikon al ĉi tiu paÄo:">
+<!ENTITY showData.label "Montri raportodatumojn">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blokas tro &amp;multe">
+<!ENTITY issues.change.description "Via konfiguro estas ÅanÄita. Bonvolu reÅargi la paÄon por testi la ÅanÄojn kaj sendu la raporton, se la problemo ne solviÄos per la ÅanÄoj.">
+<!ENTITY email.label "&amp;RetpoÅto:">
+<!ENTITY issues.openPreferences.label "Malfermi filtrilagordojn">
+<!ENTITY sendPage.confirmation "Via raporto estas konservita. Vi povas atingi Äin ĉe sekvonta adreso:">
+<!ENTITY copyLink.label "&amp;Kopii raportligilon">
+<!ENTITY issues.nofilters.description "Adblock Plus blokas nenion sur ĉi tiu paÄo. La problemo, kiun vi observas, plej verÅajne ne rilatas al Adblock Plus.">
+<!ENTITY sendPage.knownIssue "La problemo, kiun vi raportis, eble estas jam konata. Pliaj informoj:">
+<!ENTITY typeSelector.other.description "Elektu ĉi tiun opcion, se vi kredas problemon kun Adblock Plus mem pli verÅajna ol kun Äiaj filtriloj.">
+<!ENTITY issues.disabledgroups.enable.label "Ebligi filtrilabonon/filtrilgrupon">
+<!ENTITY typeWarning.override.label "Mi komprena&amp;s kaj volas sendi la raporton malgraÅ­ tio">
+<!ENTITY issues.disabled.enable.label "Ebligi Adblock Plus">
+<!ENTITY update.fixed.description "La Äisdatigoj de viaj filtrilabonoj verÅajne solvis la problemon, kiun vi sciigis. Bonvolu reÅargi la paÄon kaj alklaku denoe 'Sendi denove', se la problemo ankoraÅ­ ekzistas.">
+<!ENTITY anonymous.label "&amp;Anonima sendado">
+<!ENTITY reloadButton.label "&amp;ReÅargi paÄon">
+<!ENTITY recentReports.clear.label "&amp;Forigi ĉiujn raportojn">
+<!ENTITY typeSelector.description "Ĉi tiu fenestro gvidos vin tra la paÅoj, kiuj estas bezonataj por sendi la problemraporton de Adblock Plus. Unue bonvolu elekti la problemtipon, kiun vi renkontis sur ĉi tiu paÄo:">
+<!ENTITY screenshot.remove.label "&amp;Forigi gravajn datumojn">
+<!ENTITY issues.ownfilters.description "Kelkaj filtriloj aplikataj al ĉi tiu paÄo estas propre difinitaj. Bonvolu malebligi la filtrilojn, kiuj povus kaÅ­zi la problemon:">
+<!ENTITY update.inProgress.description "Adblock Plus devas Äisdatigi viajn fitrilabonojn por certigi, ke la problemo ne estas jam solvita. Bonvolu atendi...">
+<!ENTITY sendPage.retry.label "Denove sendi">
+<!ENTITY data.label "Ra&amp;portodatumoj:">
+<!ENTITY recentReports.label "Viaj antaÅ­ nelonge senditaj raportoj">
+<!ENTITY typeWarning.description "Vi indikis, ke vi volas raporti Äeneralan problemon kun Adblock Plus opiniante tion pli verÅajna ol problemo kun la filtriloj. Bonvolu atenti, ke tia problemo estu plej bone raportata en [link]forumo de Adblock Plus[/link]. Vi nur uzu la problemraportilon por kompletigi ekzistantan diskuton, ĉar neniu rimarkos via raporton, escepte, se vi donas al ili la ligilon al Äi. La aÅ­tomate generita ligilo estos provizita post sendado de la raporto.">
+<!ENTITY issues.disabled.description "Adblock Plus estas malebligita, Äi blokos nenion en sia aktuala stato.">
+<!ENTITY attachExtensions.label "Kun&amp;sendi liston de aktivaj etendaĵoj kun la raporto, se etendaĵa konflikto estas la kaŭzo de la problemo">
+<!ENTITY issues.nosubscriptions.add.label "Aldoni filtrilabonon">
+<!ENTITY issues.disabledfilters.enable.label "Ebligi filtrilon">
+<!ENTITY issues.override.label "La &amp;konfiguro estas korekta, daÅ­rigi la raporton">
+<!ENTITY issues.nosubscriptions.description "Åœajnas, ke vi ne abonis preparitan liston de filtriloj, kiuj aÅ­tomate forigas nedeziratan enhavon de retejoj.">
+<!ENTITY typeSelector.falsePositive.description "Elektu ĉi tiun opcion, se la paÄo malhavas gravan enhavon, ne estas vidigata korekte abo malsukcesas korekte funkcii. Vi povas determini, ĉu Adblock Plus estas la kaÅ­zo de la problemo malebligante Äin provizore.">
+<!ENTITY typeSelector.other.label "&amp;Alia problemo">
+<!ENTITY emailComment.label "Ni rekomendas al vi enigi validan retpoÅtan adreson, por ke ni povu kontakti vin, se estos demandoj pri via raporto. Tio ankaÅ­ ebligas al ni agnoski viajn kontribuojn kaj doni pli altan prioritaton al ili.">
+<!ENTITY issues.whitelist.remove.label "Denove ebligi Adblock Plus sur ĉi tiu paÄo">
+<!ENTITY outdatedSubscriptions.description "La sekvontaj filtrilabonoj ne ÄisdatiÄis de almenaÅ­ du semajnoj. Bonvolu Äisdatigi ĉi tiujn abonojn, antaÅ­ ol vi sendas raporton, la problemo estas eble jam solvita.">
+<!ENTITY dataCollector.description "Bonvolu atendi kelkajn momentojn dum Adblock Plus akiras la necesajn datumojn.">
+<!ENTITY sendButton.label "Se&amp;ndi raporton">
+<!ENTITY comment.label "&amp;Komento (laÅ­vole):">
+<!ENTITY sendPage.errorMessage "Provo por sendi la raporton malsukcesis kun erarkodo &quot;?1?&quot;. Bonvolu certiÄu, ke vi estas konektita al la interreto kaj provu denove. Se la problemo pluekzistas, bonvolu peti pri helpo en la [link]forumo de Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Montri antaÅ­ nelonge senditajn raportojn">
+<!ENTITY commentPage.heading "Enigi komenton">
+<!ENTITY update.start.label "Startigu nun Äisdatigon">
+<!ENTITY issues.disabledfilters.description "La sekvontaj filtriloj estas malebligitaj, sed ili povus havi efikon al ĉi tiu paÄo:">
+<!ENTITY screenshot.description "La sama paÄo povas aspekti alie por diferencaj homoj. Helpus kompreni la problemon, se vi aldonas ekrankopion al via raporto. Vi povas forigi sekciojn, kiuj enhavas konfidencajn informojn kaj marki lokojn, kie la problemo estas rimarkebla. Por fari tion, alklaku la respektivan butonon kaj elektu la sekcion de la bildo per via muso.">
+<!ENTITY screenshot.attach.label "Kunsendi paÄobi&amp;ldon kun la raporto">
+<!ENTITY issues.whitelist.description "Adblock Plus estas nun malebligita sur la paÄo, pri kiu vi raportas. Bonvolu ebligi Äin denove kaj reÅargu la paÄon antaÅ­ ol vi sendas la raporton por helpi analizi ĉi tiun problemon.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus ne blokas &amp;reklamon">
+<!ENTITY typeSelector.heading "Elekti problemtipon">
+<!ENTITY anonymity.warning "Ni ne povas turni nin al vi denove kaj ni donos verÅajne pli malaltan prioritaton al via raporto.">
+<!ENTITY wizard.title "Problemraportilo">
+<!ENTITY issues.ownfilters.disable.label "Malebligi filtrilon">
+<!ENTITY commentPage.description "La tekstokampo malsupre ebligas al vi enigi komenton por helpi al ni kompreni la problemon. Ĉi tiu paÅo estas laÅ­vola, sed rekomendata, se la problemo ne estas evidenta. Vi povas ankaÅ­ kontroli la raportodatumojn, antaÅ­ ol Äi estas forsendata.">
+<!ENTITY comment.lengthWarning "Via komento havas pli ol 1000 signojn. Nur la unuaj 1000 signoj estos sendataj:">
+<!ENTITY typeSelector.falseNegative.description "Elektu ĉi tiun opcion, se reklamo estas vidigata, kvankam Adblock Plus estas ebligita.">
+<!ENTITY sendPage.waitMessage "Bonvolu atendi, dum Adblock Plus sendas vian raporton.">
+<!ENTITY dataCollector.heading "Bonvenon al la problemraportilo">
+<!ENTITY screenshot.heading "Kunsendi ekrankopion">
+<!ENTITY sendPage.heading "Sendi raporton">
+<!ENTITY issues.subscriptionCount.description "Åœajnas, ke vi abonis tro multajn filtrilabonojn. Ĉi tiu agordo ne rekomendiÄas, ĉar Äi plialtigas la probablecon de problemoj. Ni ankaÅ­ ne povas akcepti vian problemraporton, ĉar estas malklare, kiu filtrilabona aÅ­toro devas agi. Bonvolu forigi ĉion, escepte de la vere necesaj filtrilabonoj kaj testu, ĉu la problemo poste ankoraÅ­ ekzistas.">
+<!ENTITY screenshot.mark.label "Ma&amp;rki la problemon">
+<!ENTITY privacyPolicy.label "Reguloj de privateco">
+<!ENTITY issues.description "Adblock Plus malkovris problemojn kun via konfiguro, kiu eble estas kulpa pri ĉi tiu problemo aŭ malfaciligas la analizadon de la raporto.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/sidebar.dtd
new file mode 100644
index 0000000..949e6ac
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Borderoj de elementoj de Flash">
+<!ENTITY address.label "Adreso">
+<!ENTITY context.open.label "Malfermi en nova langeto">
+<!ENTITY type.label "Tipo">
+<!ENTITY tooltip.filterSource.label "Fonto de la filtrilo:">
+<!ENTITY noitems.label "Neniuj blokeblaj elementoj">
+<!ENTITY filter.label "Filtrilo">
+<!ENTITY tooltip.size.label "Grandeco:">
+<!ENTITY reattach.label "Denove kunligi">
+<!ENTITY search.label "&amp;Serĉi:">
+<!ENTITY docDomain.thirdParty "(de tria liveranto)">
+<!ENTITY filterSource.label "Fonto de la filtrilo">
+<!ENTITY tooltip.docDomain.label "Fonto de la dokumento:">
+<!ENTITY context.copy.label "Kopii la adreson de la elemento">
+<!ENTITY tooltip.type.label "Tipo:">
+<!ENTITY context.disablefilter.label "Malebligi filtrilon ?1?">
+<!ENTITY context.copyFilter.label "Kopii filtrilon">
+<!ENTITY context.block.label "Bloki ĉi tiun elementon">
+<!ENTITY context.enablefilter.label "Denove ebligi filtrilon ?1?">
+<!ENTITY detach.label "Malligi">
+<!ENTITY whitelisted.label "PaÄo en blanka listo">
+<!ENTITY context.disablefilteronsite.label "Malebligi ĉi tiun filtrilon sur ?1?">
+<!ENTITY detached.title "Adblock Plus: Blokeblaj elementoj (malligitaj)">
+<!ENTITY docDomain.firstParty "(de unua liveranto)">
+<!ENTITY tooltip.type.whitelisted "(en blanka listo)">
+<!ENTITY tooltip.filter.label "Efika filtrilo:">
+<!ENTITY tooltip.filter.disabled "(malebligita)">
+<!ENTITY context.editfilter.label "Redakti efikan filtrilon">
+<!ENTITY tooltip.type.blocked "(blokita)">
+<!ENTITY size.label "Grandeco">
+<!ENTITY context.whitelist.label "Aldoni esceptoregulon por elemento">
+<!ENTITY context.selectAll.label "Elekti ĉion">
+<!ENTITY state.label "Stato">
+<!ENTITY docDomain.label "Fonto de la dokumento">
+<!ENTITY tooltip.address.label "Adreso:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/subscriptionSelection.dtd
new file mode 100644
index 0000000..b28ca3b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "AnkaÅ­ aldoni &amp;filtrilabonon &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plus malsukcesis akiri la liston de abonoj.">
+<!ENTITY list.download.retry "AnkoraÅ­foje provi">
+<!ENTITY title.label "&amp;Titolo de la abono:">
+<!ENTITY list.download.website "Rigardi retejon">
+<!ENTITY supplementMessage "Ĉi tiu filtrilabono estu uzata kun la filtrilabono &quot;?1?&quot;, kiun vi ankoraŭ ne uzas.">
+<!ENTITY viewList.label "Rigardi filtrilojn">
+<!ENTITY visitHomepage.label "Viziti hejmpaÄon">
+<!ENTITY addSubscription.label "Redakti abonon">
+<!ENTITY dialog.title "Aldoni filtrilabonon de Adblock Plus">
+<!ENTITY location.label "&amp;Loko de la listo de filtriloj:">
+<!ENTITY fromWeb.description "Bonvolu konfirmi, ke vi volas aldoni ĉi tiun filtrilabonon. Vi povas ÅanÄi la abonan titolon aÅ­ lokon antaÅ­ ol vi aldonas Äin.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/composer.dtd
new file mode 100644
index 0000000..935f034
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "al &amp;final de la dirección">
+<!ENTITY domainRestriction.label "Restringir al d&amp;ominio:">
+<!ENTITY collapse.default.no.label "Usar predeterminado (no)">
+<!ENTITY firstParty.label "Solamente pe&amp;rsonal">
+<!ENTITY preferences.label "&amp;Mostrar filtros existentes…">
+<!ENTITY pattern.label "Buscar patrón">
+<!ENTITY thirdParty.label "Solamen&amp;te de terceros">
+<!ENTITY filter.label "Nuevo fi&amp;ltro:">
+<!ENTITY collapse.label "&amp;Colapsar los bloqueados:">
+<!ENTITY match.warning "El patrón que ingresaste no coincide más con la dirección bloqueada o segura, y no surtirá ningún efecto.">
+<!ENTITY anchor.start.label "al com&amp;ienzo de la dirección">
+<!ENTITY matchCase.label "Coincidir m&amp;ayúsculas">
+<!ENTITY custom.pattern.label "&amp;Personalizado:">
+<!ENTITY unselectAllTypes.label "No seleccionar nada">
+<!ENTITY type.whitelist.label "Regla de &amp;excepción">
+<!ENTITY regexp.warning "El patrón que ingresés será interpretado como una expresión constante. Demasiadas expresiones constantes podrían ralentizar tu navegación web. Si no preferís usar expresiones constantes, agregá un asterisco (&quot;*&quot;) al final del patrón.">
+<!ENTITY dialog.title "Agregar regla de filtro de Adblock Plus">
+<!ENTITY basic.label "Vista básica">
+<!ENTITY type.filter.label "Filtros de &amp;bloqueo">
+<!ENTITY types.label "Aplicar a tipos:">
+<!ENTITY shortpattern.warning "El patrón que ingresaste es demasiado corto para poder ser optimizado. Varios patrones similares podrían ralentizar tu navegación web. Te recomendamos que elijás una cadena más larga para este filtro.">
+<!ENTITY collapse.yes.label "Sí">
+<!ENTITY anchors.label "Aceptar solamente patrón:">
+<!ENTITY collapse.default.yes.label "Usar predeterminado (sí)">
+<!ENTITY domainRestriction.help "Especificá uno o más dominios, separados por el símbolo tubería &quot;|&quot;, así el filtro se aplica solamente sobre estos dominios. El símbolo ñuflo &quot;~&quot; adelante de un nombre de dominio significa que el filtro no se aplicaría sobre ese dominio.">
+<!ENTITY accept.label "Agregar filtro">
+<!ENTITY options.label "Opciones">
+<!ENTITY disabled.warning "Adblock Plus está deshabilitado. Podés seguir agregando filtros, pero no se aplicarán hasta que no actives los [link]filtros de Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "al comienzo del nombre de &amp;dominio">
+<!ENTITY collapse.no.label "No">
+<!ENTITY selectAllTypes.label "Seleccionar todo">
+<!ENTITY advanced.label "Vista avanzada">
+<!ENTITY pattern.explanation "El patrón puede ser cualquier parte de la dirección. El asterisco (&quot;*&quot;) funciona como un comodín. El filtro sólo será aplicado a aquellas direcciones que coincidan con el patrón.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/filters.dtd
new file mode 100644
index 0000000..4c0cf83
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Todos tus filtros personalizados serán reemplazados por los contenidos del archivo seleccionado. ¿Querés continuar?">
+<!ENTITY slow.column "Filtros &amp;lentos">
+<!ENTITY enabled.column "Ha&amp;bilitado">
+<!ENTITY subscription.lastDownload.checksumMismatch "Falló, el archivo de suma de comprobación no coincide">
+<!ENTITY noFiltersInGroup.text "El grupo seleccionado está vacío.">
+<!ENTITY subscription.actions.label "Acciones">
+<!ENTITY filter.selectAll.label "Seleccionar todo">
+<!ENTITY backupButton.label "Resg&amp;uardar y restaurar">
+<!ENTITY restore.minVersion.warning "ADVERTENCIA: este archivo fue creado por una versión más reciente de Adblock Plus. Deberías actualizarte a la última versión de Adblock Plus antes de restaurar este archivo.">
+<!ENTITY restore.error "No se pudo procesar los datos del archivo. ¿Este es un archivo de resguardo de Adblock Plus?">
+<!ENTITY sort.ascending.label "Ordenar de la &quot;&amp;A&quot; a la &quot;Z&quot;">
+<!ENTITY sort.label "&amp;Ordenar por">
+<!ENTITY subscription.source.label "Lista de filtros">
+<!ENTITY hitcount.column "V&amp;eces usado">
+<!ENTITY noFilters.text "Todavía no tenés ningún filtro personalizado.">
+<!ENTITY backup.custom.title "Solamente filtros personalizados">
+<!ENTITY subscription.external.label "Actualizado por otra extensión">
+<!ENTITY subscription.delete.label "Eliminar">
+<!ENTITY noGroupSelected.text "Necesitás seleccionar un grupo de filtros antes de que sus filtros puedan ser visualizados.">
+<!ENTITY filter.cut.label "Cortar">
+<!ENTITY restore.default.label "¿Restaurar resguardo de ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Descargando…">
+<!ENTITY subscriptions.tab.label "Suscripciones de filtro">
+<!ENTITY sort.descending.label "Ordenar de la &quot;&amp;Z&quot; a la &quot;A&quot;">
+<!ENTITY filters.remove.warning "¿Estás seguro que querés quitar todos los filtros seleccionados?">
+<!ENTITY filter.delete.label "Eliminar">
+<!ENTITY addSubscriptionAdd.label "Agregar">
+<!ENTITY viewMenu.label "Ver">
+<!ENTITY subscription.lastDownload.unknown "No disponible">
+<!ENTITY addSubscriptionCancel.label "Cancelar">
+<!ENTITY subscription.enabled.label "Habilitado">
+<!ENTITY noSubscriptions.text "Todavía no agregaste ninguna suscripción de filtro. Adblock Plus no bloqueará nada sin filtros. Por favor, andá a &quot;Agregar suscripción de filtro&quot; para agregar alguno.">
+<!ENTITY subscription.update.label "Actualizar filtros">
+<!ENTITY dialog.title "Preferencia de filtro de Adblock Plus">
+<!ENTITY addFilter.label "&amp;Agregar filtro">
+<!ENTITY subscription.minVersion.warning "Esta suscripción de filtro necesita de una versión más reciente de Adblock Plus. Deberías actualizar a la última versión de Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Falló, no es una dirección válida">
+<!ENTITY backup.error "Hubo un error al escribir filtros al archivo. Asegurate de que el archivo no esté protegido contra escritura o siendo usado por otro programa.">
+<!ENTITY filter.moveUp.label "Subir">
+<!ENTITY addGroup.label "Agregar &amp;grupo de filtros">
+<!ENTITY filter.edit.label "Editar">
+<!ENTITY subscription.showHideFilters.label "Mostrar/ocultar filtros">
+<!ENTITY acceptableAds2.label "Permitir publicidad no &amp;hostigadora">
+<!ENTITY addSubscriptionOther.label "Agregar un filtro de suscripción">
+<!ENTITY close.label "Cerrar">
+<!ENTITY sort.none.label "Sin or&amp;denar">
+<!ENTITY filter.actions.label "Acciones de filtro">
+<!ENTITY filter.copy.label "Copiar">
+<!ENTITY filter.moveDown.label "Bajar">
+<!ENTITY filter.resetHitCounts.label "Restablecer estadísticas de uso">
+<!ENTITY readMore.label "Leer más">
+<!ENTITY subscription.moveUp.label "Subir">
+<!ENTITY addSubscription.label "Agregar suscri&amp;pción de filtros">
+<!ENTITY subscription.homepage.label "Página principal">
+<!ENTITY backup.complete.title "Todos los filtros y suscripciones">
+<!ENTITY restore.own.label "Restaurar tu propio resguardo">
+<!ENTITY restore.complete.warning "Todas tus preferencias de filtros serán reemplazadas por los contenidos del archivo seleccionado. ¿Querés continuar?">
+<!ENTITY filters.tab.label "Filtros personalizados">
+<!ENTITY backup.label "Crear nuevo resguardo">
+<!ENTITY find.label "Bus&amp;car">
+<!ENTITY subscription.moveDown.label "Bajar">
+<!ENTITY subscription.lastDownload.connectionError "Falló, error en la descarga">
+<!ENTITY subscription.lastDownload.success "Se realizó exitosamente">
+<!ENTITY subscription.lastDownload.invalidData "Falló, no es una lista de filtros válida">
+<!ENTITY filter.paste.label "Pegar">
+<!ENTITY subscription.disabledFilters.enable "Habilitar filtros deshabilitados">
+<!ENTITY lasthit.column "Úl&amp;tima vez usado">
+<!ENTITY subscription.editTitle.label "Editar título">
+<!ENTITY subscription.disabledFilters.warning "Algunos filtros en esta suscripción están deshabilitados.">
+<!ENTITY filter.column "&amp;Regla de filtro">
+<!ENTITY subscription.lastDownload.label "Última descarga:">
+<!ENTITY viewList.label "Ver lista">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/firstRun.properties
new file mode 100644
index 0000000..3973073
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Navegá privadamente deshabilitando el rastreo; esto es: ocultarle a las agencias de publicidad tus visitas, las cuales, de otro modo, registrarían todos tus movimientos.
+firstRun_toggle_off=DESACTIVAR
+firstRun_feature_tracking=Deshabilitá el rastreo
+firstRun_feature_malware=Bloqueá malware
+firstRun_title=Se instaló Adblock Plus
+firstRun_toggle_on=ACTIVAR
+firstRun_acceptableAdsExplanation=Nos gustaría alentar a que los sitios web usen publicidad más directa y menos hostigadora. Es por eso que establecimos unas <a>pautas estrictas</a> para identificar publicidades aceptables, las cuales se muestran en la configuración predeterminada. Si aún así querés seguir bloqueando todas las publicidades, podés <a>deshabilitar</a> esto en segundos.
+firstRun_contributor_credits=Créditos
+firstRun_dataCorruptionWarning=¿Sigue apareciendo esta página? <a>¡Hacé clic acá!</a>
+firstRun_acceptableAdsHeadline=Las molestas publicidades ahora serán bloqueadas
+firstRun_share=Contáselo a tus amigos
+firstRun_share_headline=<a>Danos una mano</a> para hacer de la web un lugar mejor
+firstRun_feature_social_description=Deshacé automáticamente, en tu experiencia al navegar, botones de medios sociales, como el "Me gusta" de Facebook, el cual aparece en miles de páginas web y rastrean tu comportamiento.
+firstRun_filterlistsReinitializedWarning=Parece que hay un problema que causa que todos los filtros se quiten y que no se pueda restaurar desde una copia de seguridad. Por lo tanto tuvimos que restablecer tus filtros y la configuración de publicidades aceptadas. Por favor, revisá tus listas de filtros y la configuración de publicidades aceptadas en las <a>opciones de Adblock Plus</a>.
+firstRun_feature_malware_description=Hacé tu navegación web más segura bloqueando dominios identificados como malware.
+firstRun_features=Adblock Plus puede bloquear más que publicidades
+firstRun_donate=doná
+firstRun_donate_label=Apoyá nuestro proyecto
+firstRun_feature_social=Quitá botones de redes sociales
+firstRun_legacySafariWarning=Estás usando una versión vieja de Safari, la cual no soporta Adblock Plus. Puede que no funcione correctamente o que perjudique la experiencia del usuario en algunos sitios web. Te recomendamos encarecidamente que, o bien actualicés a Safari 6.1. o más reciente (en Mac OS X 10.8 Mountain Lion), o Safari 7.0.1 o más reciente (en Mac OS X 10.9 Mavericks), o bien usés la última versión de Mozilla Firefox, Google Chrome u Opera.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/global.properties
new file mode 100644
index 0000000..fb119dc
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=No hay elementos bloqueables en la página actual
+action3_tooltip=Clic para habilitar/deshabilitar Adblock Plus.
+notification_antiadblock_title=¿Ocultar mensajes de usuario?
+type_label_script=script
+filter_elemhide_nocriteria=No se especificó el criterio para reconocer el elemento a ser ocultado
+blockingGroup_title=Reglas de bloqueo de publicidad
+whitelisted_tooltip=Adblock Plus está deshabilitado en la página actual.
+type_label_stylesheet=hoja de estilo
+blocked_count_tooltip=?1? de un total de ?2?
+type_label_font=tipografía
+type_label_popup=ventana emergente
+filter_regexp_tooltip=Este filtro, o bien es una expresión constante, o bien es demasiado corto para ser optimizado. Demasiados filtros similares podrían ralentizar tu navegación web.
+action0_tooltip=Clic para ver el menú contextual, clic con el botón del medio para habilitarlo/deshabilitarlo.
+whitelisted_page=Adblock Plus fue deshabilitado para la página actual
+remove_group_warning=¿Estás seguro que querés quitar este grupo?
+action1_tooltip=Clic para abrir/cerrar los elementos bloqueables, clic con el botón del medio para habilitarlos/deshabilitarlos.
+type_label_xmlhttprequest=petición XML
+active_tooltip=Adblock Plus está activo. En uso: ?1? suscripción/es de filtros y ?2? filtro/s personalizado/s.
+type_label_document=documento
+type_label_object_subrequest=subpetición de objeto
+whitelistGroup_title=Reglas de excepción
+disabled_tooltip=Adblock Plus está deshabilitado.
+filter_elemhide_duplicate_id=Se puede especificar solamente un identificador del elemento a ser ocultado.
+type_label_object=objeto
+action2_tooltip=Clic para abrir el menú de preferencias, clic con el botón del medio para habilitarlo/deshabilitarlo.
+type_label_subdocument=marco
+clearStats_warning=Esto restablecerá todas las estadísticas de conteo y las deshabilitará. ¿Querés continuar?
+notification_antiadblock_message=Este sitio web es conocido por mostrar mensajes a los usuarios de Adblock Plus. ¿Querés que Adblock Plus los oculte?
+blocked_count_addendum=(también en la lista segura: ?1?, ocultos: ?2?)
+subscription_invalid_location=La ubicación de lista de filtros no es válida, o no es válido el nombre de archivo.
+type_label_image=imagen
+remove_subscription_warning=¿Estás seguro que querés quitar esta suscripción?
+type_label_other=otro
+mobile_menu_enable=ABP: Habilitar
+type_label_media=audio/video
+mobile_menu_disable_site=ABP: Deshabilitar en ?1?
+elemhideGroup_title=Reglas de elementos colapsados
+mobile_menu_enable_site=ABP: Habilitar en ?1?
+type_label_elemhide=oculto
+newGroup_title=Nuevo grupo de filtros
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/overlay.dtd
new file mode 100644
index 0000000..1ba864e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Sí">
+<!ENTITY notification.button.no "&amp;No">
+<!ENTITY sync.label "Si&amp;ncronizar la configuración de Adblock Plus">
+<!ENTITY whitelist.site.label "Deshabilitar en ?1?">
+<!ENTITY filters.label "P&amp;referencias de filtro">
+<!ENTITY disable.label "Deshabilitar en todos lados">
+<!ENTITY objecttab.title "Bloquear">
+<!ENTITY objecttab.tooltip "Hacé clic acá para bloquear este objeto con Adblock Plus">
+<!ENTITY menuitem.label "&amp;Preferencias de Adblock Plus">
+<!ENTITY objecttabs.label "Mostrar pe&amp;stañas en Flash y Java">
+<!ENTITY sendReport.label "&amp;Informar de problemas en esta página">
+<!ENTITY whitelist.page.label "Deshabilitar solamente en esta página">
+<!ENTITY context.image.label "Adblock Plus: bloquear imagen">
+<!ENTITY counthits.label "&amp;Veces usado">
+<!ENTITY opensidebar.label "&amp;Abrir elementos bloqueables">
+<!ENTITY notification.button.close "&amp;Cerrar">
+<!ENTITY contribute.label "Contribuí a Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: bloquear marco">
+<!ENTITY blocked.tooltip "Elementos bloqueados en esta página:">
+<!ENTITY hideplaceholders.label "Co&amp;lapsar elementos bloqueados">
+<!ENTITY showinstatusbar.label "Mostrar en la barra de &amp;estado">
+<!ENTITY sidebar.title "Elementos bloqueables en la página actual">
+<!ENTITY options.label "&amp;Opciones">
+<!ENTITY context.object.label "Adblock Plus: bloquear objeto">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: rehabilitar en esta página">
+<!ENTITY filters.tooltip "Filtros más activos:">
+<!ENTITY closesidebar.label "&amp;Cerrar elementos bloqueables">
+<!ENTITY showintoolbar.label "Mostrar en la barra de &amp;herramientas">
+<!ENTITY status.tooltip "Estado:">
+<!ENTITY context.media.label "Adblock Plus: bloquear audio/video">
+<!ENTITY subscription.update.label "Actualizar filtros">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/sendReport.dtd
new file mode 100644
index 0000000..cda41df
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Deshacer">
+<!ENTITY issues.disabledgroups.description "Las siguientes suscripciones de filtros / grupos de filtros están deshabilitados, aunque aún podrían tener algún efecto sobre esta página web:">
+<!ENTITY showData.label "Mostrar datos del informe">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus bloquea &amp;demasiado">
+<!ENTITY issues.change.description "Tu configuración cambió. Por favor, recargá la página para probar los cambios y enviar el informe si el problema no se resolvió después de estos cambios.">
+<!ENTITY email.label "Dirección de correo e&amp;lectrónico:">
+<!ENTITY issues.openPreferences.label "Abrir preferencias de filtros">
+<!ENTITY sendPage.confirmation "Tu informe se guardó exitosamente. Podés acceder al mismo desde esta dirección:">
+<!ENTITY copyLink.label "Cop&amp;iar enlace del informe">
+<!ENTITY issues.nofilters.description "Adblock Plus no está bloqueando nada de la página actual. Este problema específico probablemente no tenga que ver con Adblock Plus.">
+<!ENTITY sendPage.knownIssue "El problema que enviaste probablemente es un inconveniente ya informado. Más información:">
+<!ENTITY typeSelector.other.description "Seleccioná esta opción si pensás que el problema está relacionado más con Adblock Plus mismo que con sus filtros.">
+<!ENTITY issues.disabledgroups.enable.label "Habilitar suscripción de filtro / grupo de filtro">
+<!ENTITY typeWarning.override.label "Lo &amp;entiendo, y quiero enviar el informe de todas maneras">
+<!ENTITY issues.disabled.enable.label "Habilitar Adblock Plus">
+<!ENTITY update.fixed.description "Las actualizaciones a tus suscripciones de filtros probablemente resolvieron el problema que informaste. Por favor, recargá la página y reintentá. Hacé clic en &quot;Informar&quot; si el problema persiste.">
+<!ENTITY anonymous.label "Envío a&amp;nónimo">
+<!ENTITY reloadButton.label "&amp;Recargar la página">
+<!ENTITY recentReports.clear.label "&amp;Quitar todos los informes">
+<!ENTITY typeSelector.description "Esta ventana te va a guiar a través de los pasos necesarios para el envío de informes de problemas de Adblock Plus. Por favor, primero elegí el tipo de problema que estás experimentando en esta página web:">
+<!ENTITY screenshot.remove.label "Q&amp;uitar datos sensibles">
+<!ENTITY issues.ownfilters.description "Algunos de los filtros aplicados en esta página están definidos por el usuario. Por favor, deshabilitá los filtros que podrían causar el inconveniente:">
+<!ENTITY update.inProgress.description "Adblock Plus necesita actualizar tus suscripciones de filtros para asegurarse de que el problema no ha sido solucionado aún. Por favor, esperá…">
+<!ENTITY sendPage.retry.label "Enviar de nuevo">
+<!ENTITY data.label "Datos del &amp;informe:">
+<!ENTITY recentReports.label "Tus informes enviados recientemente">
+<!ENTITY typeWarning.description "Indicaste que querés informar de un problema general de Adblock Plus mismo más que un problema con los filtros. Por favor, tené en cuenta que tal clase de problemas se informan de mejor modo en el [link]foro de Adblock Plus[/link]. Deberías usar el informe de problemas solamente para complementar un debate existente, ya que nadie sabrá de tu informe, a menos que les ofrezcas el enlace hacia el mismo. El enlace generado automáticamente será otorgado luego de enviar el informe.">
+<!ENTITY issues.disabled.description "Adblock Plus se encuentra deshabilitado, no bloqueará nada en este estado actual.">
+<!ENTITY attachExtensions.label "Adjuntá una lista de las e&amp;xtensiones activas al informe, en caso de que sea alguno de los complementos el causante del problema">
+<!ENTITY issues.nosubscriptions.add.label "Agregar suscripción de filtro">
+<!ENTITY issues.disabledfilters.enable.label "Habilitar filtro">
+<!ENTITY issues.override.label "La &amp;configuración es correcta, podés continuar con el informe">
+<!ENTITY issues.nosubscriptions.description "Parece que no estás suscripto a ninguna de las listas de filtro preestablecidas que automáticamente quita contenido no deseado de sitios web.">
+<!ENTITY typeSelector.falsePositive.description "Seleccioná esta opción si falta contenido importante, si la página se visualiza incorrectamente o si no funciona apropiadamente. Podés determinar si Adblock Plus es el causante del problema, deshabilitándolo temporalmente.">
+<!ENTITY typeSelector.other.label "&amp;Otro problema">
+<!ENTITY emailComment.label "Te alentamos a que ingresés una dirección válida de correo electrónico, así podemos contactarte si tenemos dudas sobre tu informe. También nos permitirá reconocer tus contribuciones y priorizarlas por sobre el resto.">
+<!ENTITY issues.whitelist.remove.label "Rehabilitar Adblock Plus en esta página.">
+<!ENTITY outdatedSubscriptions.description "Las siguientes suscripciones de filtros no fueron actualizadas por, al menos, dos semanas. Por favor, actualizá estas suscripciones antes de enviar un informe; el problema ya podría haberse resuelto.">
+<!ENTITY dataCollector.description "Por favor, esperá unos instantes mientras Adblock Plus recolecta los datos requeridos.">
+<!ENTITY sendButton.label "En&amp;viar informe">
+<!ENTITY comment.label "Com&amp;entarios (opcional):">
+<!ENTITY sendPage.errorMessage "Se intentó enviar el reporte, pero falló y devolvió un error de código &quot;?1?&quot;. Por favor, asegurate que estás conectado a Internet e intentá nuevamente. Si el problema persiste, por favor, pedí ayuda en el [link]foro de Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Mostrar informes enviados recientemente">
+<!ENTITY commentPage.heading "Ingresar comentarios">
+<!ENTITY update.start.label "Comenzar con la actualización ahora">
+<!ENTITY issues.disabledfilters.description "Los siguientes filtros están deshabilitados, aunque aún podrían tener algún efecto sobre esta página web:">
+<!ENTITY screenshot.description "La misma página web puede lucir diferente para distintas personas. Si adjuntás una captura de pantalla a tu informe, nos sería de mucha ayuda para entender el inconveniente. Por supuesto, podés quitar fragmentos conteniendo información sensible, así como marcar áreas en donde el problema es más explícito. Para hacer eso, hacé clic en el botón correspondiente y seleccioná un fragmento de la imagen con el mouse.">
+<!ENTITY screenshot.attach.label "&amp;Adjuntar al informe una captura de la página web">
+<!ENTITY issues.whitelist.description "Adblock Plus se encuentra deshabilitado en la página que estás informando. Por favor, rehabilitalo y recargá la página antes de enviar el informe para colaborar con la investigación de este problema.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus no bloquea una &amp;publicidad">
+<!ENTITY typeSelector.heading "Seleccioná el tipo de problema">
+<!ENTITY anonymity.warning "No podremos contactarte y tu informe seguramente tendrá poca prioridad.">
+<!ENTITY wizard.title "Informe de problemas">
+<!ENTITY issues.ownfilters.disable.label "Deshabilitar filtro">
+<!ENTITY commentPage.description "El campo de texto, debajo, te permite ingresar algún comentario para ayudarnos a entender el problema. Este paso es opcional, pero encarecidamente recomendado si el problema no resulta tan obvio. También podés revisar los datos del informe antes de enviarlo.">
+<!ENTITY comment.lengthWarning "La longitud de tu comentario excede los 1.000 caracteres. Sólo los primeros 1.000 caracteres serán enviados.">
+<!ENTITY typeSelector.falseNegative.description "Seleccioná esta opción si una publicidad es mostrada, estando Adblock Plus habilitado.">
+<!ENTITY sendPage.waitMessage "Por favor, esperá mientras Adblock Plus envía tu informe.">
+<!ENTITY dataCollector.heading "Bienvenido al informe de problemas">
+<!ENTITY screenshot.heading "Adjuntar captura">
+<!ENTITY sendPage.heading "Enviar informe">
+<!ENTITY issues.subscriptionCount.description "Parece que estás suscripto a demasiadas suscripciones de filtros. Esta configuración no es recomendada, ya que potenciará sobre manera la aparición de problemas. Tampoco podemos aceptar tu reporte por inconvenientes, porque no quedaría claro qué autor de todos esos filtros es el que debe corregir algo. Por favor, quitá todas las suscripciones de filtros, dejando sólo las que considerés elementales, y luego fijate si el problema continúa.">
+<!ENTITY screenshot.mark.label "&amp;Marcar el problema">
+<!ENTITY privacyPolicy.label "Política de privacidad">
+<!ENTITY issues.description "Adblock Plus detectó problemas con tu configuración, la cual podría ser la causante de este inconveniente.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/sidebar.dtd
new file mode 100644
index 0000000..4648a04
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Bordes de los elementos Flash">
+<!ENTITY address.label "Dirección">
+<!ENTITY context.open.label "Abrir en nueva pestaña">
+<!ENTITY type.label "Tipo">
+<!ENTITY tooltip.filterSource.label "Fuente del filtro">
+<!ENTITY noitems.label "Sin elementos bloqueables">
+<!ENTITY filter.label "Filtro">
+<!ENTITY tooltip.size.label "Tamaño:">
+<!ENTITY reattach.label "Rejuntar">
+<!ENTITY search.label "&amp;Buscar:">
+<!ENTITY docDomain.thirdParty "(de terceros)">
+<!ENTITY filterSource.label "Fuente de filtro">
+<!ENTITY tooltip.docDomain.label "Fuente del documento:">
+<!ENTITY context.copy.label "Copiar dirección del elemento">
+<!ENTITY tooltip.type.label "Tipo:">
+<!ENTITY context.disablefilter.label "Deshabilitar filtro ?1?">
+<!ENTITY context.copyFilter.label "Copiar filtro">
+<!ENTITY context.block.label "Bloquear este elemento">
+<!ENTITY context.enablefilter.label "Rehabilitar filtro ?1?">
+<!ENTITY detach.label "Separar">
+<!ENTITY whitelisted.label "Página segura">
+<!ENTITY context.disablefilteronsite.label "Deshabilitar este filtro en ?1?">
+<!ENTITY detached.title "Adblock Plus: elementos bloqueables (separados)">
+<!ENTITY docDomain.firstParty "(personal)">
+<!ENTITY tooltip.type.whitelisted "(segura)">
+<!ENTITY tooltip.filter.label "Filtro en efecto:">
+<!ENTITY tooltip.filter.disabled "(deshabilitado)">
+<!ENTITY context.editfilter.label "Editar filtro en efecto">
+<!ENTITY tooltip.type.blocked "(bloqueada)">
+<!ENTITY size.label "Tamaño">
+<!ENTITY context.whitelist.label "Agregar regla de excepción por elemento">
+<!ENTITY context.selectAll.label "Seleccionar todo">
+<!ENTITY state.label "Estado">
+<!ENTITY docDomain.label "Fuente del documento">
+<!ENTITY tooltip.address.label "Dirección:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/subscriptionSelection.dtd
new file mode 100644
index 0000000..099f80a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Agregá también la suscripción de filtros &quot;?1?&quot;.">
+<!ENTITY list.download.failed "Hubo un error al recuperar la lista de suscripciones.">
+<!ENTITY list.download.retry "Intentar de nuevo">
+<!ENTITY title.label "&amp;Título de suscripción:">
+<!ENTITY list.download.website "Ver sitio web">
+<!ENTITY supplementMessage "Esta suscripción está diseñada para ser usada conjuntamente con la suscripción de filtros &quot;?1?&quot;, que aún no agregaste.">
+<!ENTITY viewList.label "Ver filtros">
+<!ENTITY visitHomepage.label "Visitar la página oficial">
+<!ENTITY addSubscription.label "Agregar suscripción">
+<!ENTITY dialog.title "Agregar suscripción de filtro de Adblock Plus">
+<!ENTITY location.label "&amp;Ubicación de la lista de filtros:">
+<!ENTITY fromWeb.description "Por favor, confirmá que querés agregar esta suscripción de filtros. Podés cambiar el título de la suscripción o la ubicación antes de agregarla.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/composer.dtd
new file mode 100644
index 0000000..1785209
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "al &amp;final de la dirección">
+<!ENTITY domainRestriction.label "&amp;Restringir al dominio:">
+<!ENTITY collapse.default.no.label "Usar predeterminado (no)">
+<!ENTITY firstParty.label "Sólo para conteni&amp;dos del dominio">
+<!ENTITY preferences.label "&amp;Mostrar filtros existentes…">
+<!ENTITY pattern.label "Buscar patrón">
+<!ENTITY thirdParty.label "Sólo para con&amp;tenidos de terceros">
+<!ENTITY filter.label "&amp;Nuevo filtro:">
+<!ENTITY collapse.label "C&amp;olapsar elementos bloqueados:">
+<!ENTITY match.warning "El patrón introducido no coincide con la dirección a bloquear o incluir en la lista blanca, y no tendrá ningún efecto sobre ella.">
+<!ENTITY anchor.start.label "al &amp;inicio de la dirección">
+<!ENTITY matchCase.label "&amp;Coincidir MAY/minús">
+<!ENTITY custom.pattern.label "&amp;Personalizar:">
+<!ENTITY unselectAllTypes.label "No seleccionar ninguno">
+<!ENTITY type.whitelist.label "Regla de e&amp;xcepción">
+<!ENTITY regexp.warning "El patrón que ha introducido se interpretará como expresión regular. Si usa muchas expresiones regulares su navegación podría volverse más lenta. Si no quería usar una expresión regular, añada un carácter &quot;*&quot; al final del patrón.">
+<!ENTITY dialog.title "Añadir regla de filtrado de Adblock Plus">
+<!ENTITY basic.label "Vista básica">
+<!ENTITY type.filter.label "Filtro de &amp;bloqueo">
+<!ENTITY types.label "Aplicar a estos tipos:">
+<!ENTITY shortpattern.warning "El patrón que ha introducido es demasiado corto para ser optimizado, si usa muchos patrones como este su navegación podría volverse más lenta. Le recomendamos elegir una cadena más larga para este filtro.">
+<!ENTITY collapse.yes.label "Sí">
+<!ENTITY anchors.label "Sólo aceptar patrones:">
+<!ENTITY collapse.default.yes.label "Usar predeterminado (sí)">
+<!ENTITY domainRestriction.help "Si especifica uno o varios dominios separados por el símbolo &quot;|&quot;, el filtro sólo se aplicará a dichos dominios. El símbolo &quot;~&quot; antes del nombre de un dominio indica que el filtro no se aplicará en ese dominio.">
+<!ENTITY accept.label "Añadir filtro">
+<!ENTITY options.label "Opciones">
+<!ENTITY disabled.warning "Adblock Plus está desactivado. Puede añadir filtros, pero no se aplicarán a menos que [link]active Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "al &amp;inicio del nombre de dominio">
+<!ENTITY collapse.no.label "No">
+<!ENTITY selectAllTypes.label "Seleccionar todos">
+<!ENTITY advanced.label "Vista avanzada">
+<!ENTITY pattern.explanation "El patrón puede ser cualquier parte de la dirección, el carácter &quot;*&quot; actúa como comodín. El filtro sólo se aplicará a las direcciones que se correspondan con el patrón.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/filters.dtd
new file mode 100644
index 0000000..27f587b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Todas sus filtros personalizados se sustituirán por los contenidos del archivo seleccionado ¿Desea continuar?">
+<!ENTITY slow.column "Filtros l&amp;entos">
+<!ENTITY enabled.column "Acti&amp;vado">
+<!ENTITY subscription.lastDownload.checksumMismatch "Error, el checksum no coincide">
+<!ENTITY noFiltersInGroup.text "El grupo seleccionado está vacío">
+<!ENTITY subscription.actions.label "Acciones">
+<!ENTITY filter.selectAll.label "Seleccionar todos">
+<!ENTITY backupButton.label "&amp;Copias de seguridad y restauración">
+<!ENTITY restore.minVersion.warning "Atención: el archivo se creó con una versión más reciente de Adblock Plus. Debería actualizar a la última versión de Adblock Plus antes de hacer una restauración desde este archivo.">
+<!ENTITY restore.error "No se pudieron procesar los datos del archivo. ¿Es posible que no sea un archivo de copia de seguridad de Adblock Plus?">
+<!ENTITY sort.ascending.label "Ordenar &amp;A &gt; Z">
+<!ENTITY sort.label "&amp;Listar">
+<!ENTITY subscription.source.label "Lista de filtros">
+<!ENTITY hitcount.column "&amp;Contador">
+<!ENTITY noFilters.text "Aún no tiene filtros personalizados.">
+<!ENTITY backup.custom.title "Sólo los filtros personalizados">
+<!ENTITY subscription.external.label "Actualizado por otra extensión">
+<!ENTITY subscription.delete.label "Eliminar">
+<!ENTITY noGroupSelected.text "Tiene que seleccionar un grupo de filtros para que se muestren sus filtros.">
+<!ENTITY filter.cut.label "Cortar">
+<!ENTITY restore.default.label "Restaurar copia de seguridad de ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Descargando…">
+<!ENTITY subscriptions.tab.label "Suscripciones de filtros">
+<!ENTITY sort.descending.label "Ordenar &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "¿Está seguro de querer eliminar todos los filtros seleccionados?">
+<!ENTITY filter.delete.label "Eliminar">
+<!ENTITY addSubscriptionAdd.label "Añadir">
+<!ENTITY viewMenu.label "Ver">
+<!ENTITY subscription.lastDownload.unknown "N/D">
+<!ENTITY addSubscriptionCancel.label "Cancelar">
+<!ENTITY subscription.enabled.label "Activada">
+<!ENTITY noSubscriptions.text "Aún no ha añadido ninguna suscripción de filtros. Adblock Plus no bloquea nada si no tiene filtros, por favor use &quot;Añadir suscripción de filtros&quot; para añadir alguna.">
+<!ENTITY subscription.update.label "Actualizar filtros">
+<!ENTITY dialog.title "Preferencias de filtros de Adblock Plus">
+<!ENTITY addFilter.label "A&amp;ñadir filtro">
+<!ENTITY subscription.minVersion.warning "Esta suscripción de filtros necesita una versión más reciente de Adblock Plus, debería actualizar a la última versión de Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Error: dirección no válida">
+<!ENTITY backup.error "Se produjo un error al escribir filtros en el archivo. Asegúrese que el archivo no está protegido contra escritura o siendo utilizado por otra aplicación.">
+<!ENTITY filter.moveUp.label "Subir">
+<!ENTITY addGroup.label "Añadir &amp;grupo de filtros">
+<!ENTITY filter.edit.label "Editar">
+<!ENTITY subscription.showHideFilters.label "Mostrar/ocultar filtros">
+<!ENTITY acceptableAds2.label "&amp;Permitir cierta publicidad no intrusiva">
+<!ENTITY addSubscriptionOther.label "Añadir otra suscripción">
+<!ENTITY close.label "Cerrar">
+<!ENTITY sort.none.label "&amp;Sin ordenar">
+<!ENTITY filter.actions.label "Acciones de filtros">
+<!ENTITY filter.copy.label "Copiar">
+<!ENTITY filter.moveDown.label "Bajar">
+<!ENTITY filter.resetHitCounts.label "Reiniciar estadísticas de uso">
+<!ENTITY readMore.label "Leer más">
+<!ENTITY subscription.moveUp.label "Subir">
+<!ENTITY addSubscription.label "Añadir &amp;suscripción de filtros">
+<!ENTITY subscription.homepage.label "Página de inicio">
+<!ENTITY backup.complete.title "Todos los filtros y suscripciones">
+<!ENTITY restore.own.label "Restaurar copia de seguridad propia">
+<!ENTITY restore.complete.warning "Todas sus preferencias de filtros se sustituirán por los contenidos del archivo seleccionado ¿Desea continuar?">
+<!ENTITY filters.tab.label "Filtros personalizados">
+<!ENTITY backup.label "Crear nueva copia de seguridad">
+<!ENTITY find.label "&amp;Buscar">
+<!ENTITY subscription.moveDown.label "Bajar">
+<!ENTITY subscription.lastDownload.connectionError "Error: error de descarga">
+<!ENTITY subscription.lastDownload.success "Correcto">
+<!ENTITY subscription.lastDownload.invalidData "Error: lista de filtros no válida">
+<!ENTITY filter.paste.label "Pegar">
+<!ENTITY subscription.disabledFilters.enable "Activar filtros desactivados">
+<!ENTITY lasthit.column "Último &amp;uso">
+<!ENTITY subscription.editTitle.label "Editar título">
+<!ENTITY subscription.disabledFilters.warning "En esta suscripción hay filtros desactivados.">
+<!ENTITY filter.column "&amp;Regla de filtrado">
+<!ENTITY subscription.lastDownload.label "Última descarga:">
+<!ENTITY viewList.label "Ver lista">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/firstRun.properties
new file mode 100644
index 0000000..83ba3ff
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Navegue con intimidad desactivando el rastreo - ocultando su rastro a las empresas de publicidad que espían cada uno de sus movimientos.
+firstRun_toggle_off=DESACTIVAR
+firstRun_feature_tracking=Desactivar el rastreo
+firstRun_feature_malware=Bloquear malware
+firstRun_title=Se ha instalado Adblock Plus
+firstRun_toggle_on=ACTIVAR
+firstRun_acceptableAdsExplanation=Nos gustaría fomentar el uso de una publicidad más directa y menos agresiva en los sitios web. Por eso hemos establecido unas <a>directrices estrictas</a> para identificar la publicidad aceptable, que se muestra en modo predeterminado. Si sigue queriendo bloquear toda la publicidad puede <a>desactivar</a> este modo en unos pocos segundos.
+firstRun_contributor_credits=Colaboradores
+firstRun_dataCorruptionWarning=¿Sigue apareciendo esta página? <a>Pulse aquí</a>
+firstRun_acceptableAdsHeadline=Ahora se bloqueará la publicidad molesta
+firstRun_share=Dígaselo a sus amigos
+firstRun_share_headline=<a>Ayúdenos</a> a conseguir una web mejor
+firstRun_feature_social_description=Elimine automáticamente de su navegación los botones de redes sociales, como los "Me gusta" de Facebook, incluidos en las paginas web y que rastrean sus hábitos.
+firstRun_filterlistsReinitializedWarning=Parece que un problema provocó que se eliminasen todos los filtros y no se pudo restaurar una copia de seguridad. Por ello ha sido necesario reiniciar los filtros y predisposiciones de publicidad aceptable. Por favor, revise sus listas de filtros y predisposiciones de publicidad aceptable en <a>Opciones de Adblock Plus</a>.
+firstRun_feature_malware_description=Navegue con más seguridad bloqueando dominios identificados como malware.
+firstRun_features=Adblock Plus no sólo bloquea anuncios, puede hacer más cosas
+firstRun_donate=Donar
+firstRun_donate_label=Apoye nuestro proyecto
+firstRun_feature_social=Eliminar botones de redes sociales
+firstRun_legacySafariWarning=Está utilizando una versión antigua de Safari no soportada por Adblock Plus, por lo que podría funcionar incorrectamente o afectar a su experiencia de usuario en algunos sitios web. Le recomendamos actualizar a Safari 6.1.1 o posterior (para Mac OS X 10.8 Mountain Lion), o a Safari 7.0.1 o superior (para Mac OS X 10.9 Mavericks), o usar la última versión de Mozilla Firefox, Google Chrome u Opera.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/global.properties
new file mode 100644
index 0000000..f1f432e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=No hay elementos que se puedan bloquear en la página actual
+action3_tooltip=Pulse para activar/desactivar Adblock Plus.
+notification_antiadblock_title=¿Ocultar mensajes dirigidos a usuarios de Adblock Plus?
+type_label_script=script
+filter_elemhide_nocriteria=No se especificó ningún criterio para identificar el elemento a ocultar
+blockingGroup_title=Reglas de bloqueo de publicidad
+whitelisted_tooltip=Adblock Plus activado pero deshabilitado en la página actual.
+type_label_stylesheet=hoja de estilo
+blocked_count_tooltip=?1? de un total de ?2?
+type_label_font=fuente
+type_label_popup=ventana emergente
+filter_regexp_tooltip=Este filtro es una expresión regular o demasiado corto para ser optimizado. Demasiados filtros de este tipo podrían hacer más lenta su navegación.
+action0_tooltip=Pulse para abrir el menú contextual, botón central para activar/desactivar.
+whitelisted_page=Se ha deshabilitado Adblock Plus para la página actual
+remove_group_warning=¿Está seguro de querer eliminar este grupo?
+action1_tooltip=Pulse para abrir/cerrar elementos para bloquear, botón central para activar/desactivar.
+type_label_xmlhttprequest=solicitud XML
+active_tooltip=Adblock Plus activado, ?1? suscripciones de filtros y ?2? filtros personalizados en uso.
+type_label_document=documento
+type_label_object_subrequest=solicitud de objeto
+whitelistGroup_title=Reglas de excepción
+disabled_tooltip=Adblock Plus está desactivado.
+filter_elemhide_duplicate_id=Sólo puede especificarse una ID del elemento a ocultar
+type_label_object=objeto
+action2_tooltip=Pulse para abrir las preferencias, botón central para activar/desactivar.
+type_label_subdocument=marco
+clearStats_warning=Se reiniciarán todas las estadísticas de uso de filtros y se desactivarán dichas estadísticas de uso de filtros. ¿Desea continuar con la acción?
+notification_antiadblock_message=Se sabe que este sitio ha mostrado en el pasado mensajes dirigidos a los usuarios de Adblock Plus. ¿Quiere que Adblock Plus oculte esos mensajes?
+blocked_count_addendum=(en lista blanca: ?1?, ocultos: ?2?)
+subscription_invalid_location=La dirección de la lista de filtros no es una URL ni una ruta de archivo válida.
+type_label_image=imagen
+remove_subscription_warning=¿Está seguro de querer eliminar esta suscripción?
+type_label_other=otro
+mobile_menu_enable=ABP: Activar
+type_label_media=audio/vídeo
+mobile_menu_disable_site=ABP: Desactivar en ?1?
+elemhideGroup_title=Reglas de ocultación de elementos
+mobile_menu_enable_site=ABP: Activar en ?1?
+type_label_elemhide=oculto
+newGroup_title=Nuevo grupo de filtros
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/overlay.dtd
new file mode 100644
index 0000000..7820c11
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp; Sí">
+<!ENTITY notification.button.no "&amp; No">
+<!ENTITY sync.label "Sincroni&amp;zar predisposiciones de Adblock Plus">
+<!ENTITY whitelist.site.label "Desactivar en ?1?">
+<!ENTITY filters.label "&amp;Preferencias de filtros">
+<!ENTITY disable.label "Desactivar globalmente">
+<!ENTITY objecttab.title "Bloquear">
+<!ENTITY objecttab.tooltip "Pulse aquí para bloquear este objeto con Adblock Plus">
+<!ENTITY menuitem.label "&amp;Adblock Plus">
+<!ENTITY objecttabs.label "&amp;Mostrar pestañas en Flash y Java">
+<!ENTITY sendReport.label "&amp;Informar de un problema en esta página">
+<!ENTITY whitelist.page.label "Desactivar sólo en esta página">
+<!ENTITY context.image.label "ABP - Bloquear imagen">
+<!ENTITY counthits.label "Contar &amp;usos de filtros">
+<!ENTITY opensidebar.label "Abrir &amp;ventana elementos bloqueables">
+<!ENTITY notification.button.close "&amp;Cerrar">
+<!ENTITY contribute.label "Ayudar a Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "ABP - Bloquear marco">
+<!ENTITY blocked.tooltip "Elementos bloqueados en esta página:">
+<!ENTITY hideplaceholders.label "O&amp;cultar posicionadores de elementos bloqueados">
+<!ENTITY showinstatusbar.label "Mostrar en la barra &amp;de estado">
+<!ENTITY sidebar.title "Elementos bloqueables en la página actual">
+<!ENTITY options.label "&amp;Opciones">
+<!ENTITY context.object.label "ABP - Bloquear objeto">
+<!ENTITY context.removeWhitelist.label "ABP - Reactivar en esta página">
+<!ENTITY filters.tooltip "Filtros más activos:">
+<!ENTITY closesidebar.label "Cerrar &amp;ventana elementos bloqueables">
+<!ENTITY showintoolbar.label "Mostrar en la barra de &amp;herramientas">
+<!ENTITY status.tooltip "Estado:">
+<!ENTITY context.media.label "ABP - Bloquear vídeo/audio">
+<!ENTITY subscription.update.label "Actualizar filtros">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/sendReport.dtd
new file mode 100644
index 0000000..63a2bcc
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Deshacer">
+<!ENTITY issues.disabledgroups.description "Están desactivadas las siguientes suscripciones de filtros/grupos de filtros, que podrían tener algún tipo de efecto sobre la página:">
+<!ENTITY showData.label "Mostrar datos del informe">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus está bloqueando de&amp;masiado">
+<!ENTITY issues.change.description "Se ha cambiado su configuración. Por favor, recargue la página para probar los cambios y enviar un informe si el problema no se ha resuelto con las modificaciones.">
+<!ENTITY email.label "Co&amp;rreo electrónico:">
+<!ENTITY issues.openPreferences.label "Abrir preferencias de filtros">
+<!ENTITY sendPage.confirmation "Su informe ha sido guardado. Puede acceder a él en la siguiente dirección:">
+<!ENTITY copyLink.label "&amp;Copiar enlace del informe">
+<!ENTITY issues.nofilters.description "Adblock Plus no está bloqueando nada en esta página. El problema que observa muy probablemente no tenga nada que ver con Adblock Plus.">
+<!ENTITY sendPage.knownIssue "El problema del que informó probablemente ya fuera conocido. Más información:">
+<!ENTITY typeSelector.other.description "Seleccione esta opción si cree que es un problema del mismo Adblock Plus, y no de sus filtros.">
+<!ENTITY issues.disabledgroups.enable.label "Activar suscripción de filtros/grupo de filtros">
+<!ENTITY typeWarning.override.label "Lo &amp;entiendo pero quiero enviar el informe de todas formas">
+<!ENTITY issues.disabled.enable.label "Activar Adblock Plus">
+<!ENTITY update.fixed.description "La actualización de sus suscripciones de filtros probablemente resolvió el problema del que estaba informando. Por favor, recargue la página y vuelva a probar. Pulse de nuevo Informar de un problema si no se ha solucionado.">
+<!ENTITY anonymous.label "Envío &amp;anónimo">
+<!ENTITY reloadButton.label "&amp;Recargar página">
+<!ENTITY recentReports.clear.label "Eliminar &amp;todos los informes">
+<!ENTITY typeSelector.description "Esta ventana le guiará en el proceso necesario para enviar un informe de fallo de Adblock Plus. Primero, seleccione el tipo de problema que ha detectado en esta página:">
+<!ENTITY screenshot.remove.label "&amp;Eliminar datos sensibles">
+<!ENTITY issues.ownfilters.description "Algunos de los filtros aplicados en esta página son filtros personales de usuario. Por favor, desactive los filtros que podrían haber causado el problema:">
+<!ENTITY update.inProgress.description "Adblock Plus necesita actualizar sus suscripciones de filtros para asegurarse de que el problema aún no se ha resuelto. Espere, por favor…">
+<!ENTITY sendPage.retry.label "Enviar de nuevo">
+<!ENTITY data.label "&amp;Datos del informe:">
+<!ENTITY recentReports.label "Sus informes más recientes">
+<!ENTITY typeWarning.description "Usted ha indicado que quiere informar de un problema atribuible a Adblock Plus y no a los filtros utilizados. Tenga en cuenta que suele ser mejor informar de este tipo de problemas en el [link]foro de Adblock Plus[/link], y utilizar el generador de informes de problemas sólo como añadido en una discusión ya existente, puesto que nadie se apercibirá de su informe a menos que aporte un enlace al mismo. Tras enviar el informe se le mostrará el enlace generado automáticamente.">
+<!ENTITY issues.disabled.description "Adblock Plus está desactivado, no bloqueará nada en este estado.">
+<!ENTITY attachExtensions.label "Adjuntar una lista de e&amp;xtensiones activas al informe por si la causa del problema es un conflicto entre extensiones">
+<!ENTITY issues.nosubscriptions.add.label "Añadir suscripción de filtros">
+<!ENTITY issues.disabledfilters.enable.label "Activar filtro">
+<!ENTITY issues.override.label "La &amp;configuración es correcta, puede seguir con el informe">
+<!ENTITY issues.nosubscriptions.description "Aparentemente usted no está suscrito a ninguna de las listas de filtros ya existentes que eliminan automáticamente el contenido no deseado de los sitios web.">
+<!ENTITY typeSelector.falsePositive.description "Seleccione esta opción si en la página falta contenido importante, se muestra incorrectamente o no funciona adecuadamente. Puede confirmar si el problema lo está provocando Adblock Plus desactivándolo temporalmente.">
+<!ENTITY typeSelector.other.label "&amp;Otros problemas">
+<!ENTITY emailComment.label "Le recomendamos que introduzca una dirección válida de correo electrónico para que podamos contactar si surgen dudas sobre tu informe. También nos permitirá reconocer tus contribuciones y darles mayor prioridad.">
+<!ENTITY issues.whitelist.remove.label "Reactivar Adblock Plus en esta página">
+<!ENTITY outdatedSubscriptions.description "Las siguientes suscripciones de filtros no se han actualizado desde hace más de dos semanas. Por favor, actualícelas antes de enviar un informe de error, el problema podría estar ya resuelto.">
+<!ENTITY dataCollector.description "Por favor espere un momento mientras Adblock Plus reúne los datos necesarios.">
+<!ENTITY sendButton.label "E&amp;nviar informe">
+<!ENTITY comment.label "&amp;Comentario (opcional):">
+<!ENTITY sendPage.errorMessage "Un intento de enviar el informe produjo un fallo con código de error &quot;?1?&quot;. Por favor, asegúrese de que está conectado a Internet y vuelva a intentarlo. Si el problema persiste por favor pida ayuda en el [link]foro de Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Mostrar informes más recientes">
+<!ENTITY commentPage.heading "Comentario">
+<!ENTITY update.start.label "Iniciar actualización ahora">
+<!ENTITY issues.disabledfilters.description "Están desactivados los siguientes filtros, que podrían tener algún tipo de efecto sobre la página:">
+<!ENTITY screenshot.description "La misma página puede tener diferente apariencia para diferentes personas. Puede resultar útil para comprender el problema si adjunta una captura de pantalla a su informe. Puede eliminar las partes que contengan información sensible y marcar las zonas en las que se aprecia el problema. Para conseguirlo pulse el botón correspondiente y seleccione con el ratón un área de la imagen.">
+<!ENTITY screenshot.attach.label "A&amp;ñadir al informe una imagen de la página">
+<!ENTITY issues.whitelist.description "Adblock Plus está ahora mismo desactivado en la página a la que se refiere el informe. Por favor, reactívelo y recargue la página antes de enviar el informe para ayudar en la investigación del problema.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Pl&amp;us no bloquea un anuncio">
+<!ENTITY typeSelector.heading "Elegir tipo error">
+<!ENTITY anonymity.warning "No podremos comunicar con usted y es probable que le demos una prioridad inferior a su informe.">
+<!ENTITY wizard.title "Creador de informes de errores">
+<!ENTITY issues.ownfilters.disable.label "Desactivar filtro">
+<!ENTITY commentPage.description "El campo de texto de la parte inferior le permite introducir un comentario para ayudarnos comprender el problema. Es algo opcional, pero recomendable si el problema no resulta evidente. Puede revisar los datos del informe antes de que se envíen.">
+<!ENTITY comment.lengthWarning "La longitud se su comentario supera los 1.000 caracteres. Sólo se enviarán los 1.000 primeros.">
+<!ENTITY typeSelector.falseNegative.description "Seleccione esta opción si se muestra un anuncio a pesar de que Adblock Plus está activado.">
+<!ENTITY sendPage.waitMessage "Por favor, espere mientras Adblock Plus envía su informe.">
+<!ENTITY dataCollector.heading "Bienvenido al creador de informes de errores">
+<!ENTITY screenshot.heading "Adjuntar vista">
+<!ENTITY sendPage.heading "Enviar informe">
+<!ENTITY issues.subscriptionCount.description "Parece que se ha suscrito a demasiadas suscripciones de filtros. Eso no es recomendable porque aumenta mucho la probabilidad de que aparezcan problemas y hace que no se pueda procesar su informe de error porque no puede saberse qué autor de suscripción de filtros tiene que actuar. Por favor, borre todas las suscripciones que no sean realmente necesarias y compruebe si el problema persiste.">
+<!ENTITY screenshot.mark.label "&amp;Marcar el problema">
+<!ENTITY privacyPolicy.label "Política de privacidad">
+<!ENTITY issues.description "Adblock Plus ha detectado problemas con su configuración que podrían ser la causa del fallo o que están dificultando la investigación del mismo.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/sidebar.dtd
new file mode 100644
index 0000000..ef28209
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Resaltar los bordes del elemento">
+<!ENTITY address.label "Dirección">
+<!ENTITY context.open.label "Abrir en nueva pestaña">
+<!ENTITY type.label "Tipo">
+<!ENTITY tooltip.filterSource.label "Procedencia del filtro:">
+<!ENTITY noitems.label "Ningún elemento bloqueable">
+<!ENTITY filter.label "Filtro">
+<!ENTITY tooltip.size.label "Tamaño:">
+<!ENTITY reattach.label "Unir">
+<!ENTITY search.label "&amp;Buscar:">
+<!ENTITY docDomain.thirdParty "(terceros)">
+<!ENTITY filterSource.label "Origen filtro">
+<!ENTITY tooltip.docDomain.label "Origen del documento:">
+<!ENTITY context.copy.label "Copiar la dirección del elemento">
+<!ENTITY tooltip.type.label "Tipo:">
+<!ENTITY context.disablefilter.label "Desactivar filtro ?1?">
+<!ENTITY context.copyFilter.label "Copiar filtro">
+<!ENTITY context.block.label "Bloquear este elemento">
+<!ENTITY context.enablefilter.label "Reactivar filtro ?1?">
+<!ENTITY detach.label "Separar">
+<!ENTITY whitelisted.label "Página de lista blanca">
+<!ENTITY context.disablefilteronsite.label "Desactivar este filtro en ?1?">
+<!ENTITY detached.title "Adblock Plus: Elementos bloqueables (separado)">
+<!ENTITY docDomain.firstParty "(dominio)">
+<!ENTITY tooltip.type.whitelisted "(en lista blanca)">
+<!ENTITY tooltip.filter.label "Filtro en efecto:">
+<!ENTITY tooltip.filter.disabled "(desactivado)">
+<!ENTITY context.editfilter.label "Editar el filtro en uso">
+<!ENTITY tooltip.type.blocked "(bloqueado)">
+<!ENTITY size.label "Tamaño">
+<!ENTITY context.whitelist.label "Añadir regla de excepción para el elemento">
+<!ENTITY context.selectAll.label "Seleccionar todo">
+<!ENTITY state.label "Estado">
+<!ENTITY docDomain.label "Origen documento">
+<!ENTITY tooltip.address.label "Dirección:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/subscriptionSelection.dtd
new file mode 100644
index 0000000..2b0a803
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "A&amp;ñadir también la suscripción &quot;?1?&quot;.">
+<!ENTITY list.download.failed "Error al recuperar la lista de suscripciones.">
+<!ENTITY list.download.retry "Intentar de nuevo">
+<!ENTITY title.label "&amp;Título de la suscripción:">
+<!ENTITY list.download.website "Ver página web">
+<!ENTITY supplementMessage "Esta suscripción de filtros está pensada para usarse junto a la suscripción &quot;?1?&quot; que aún no ha instalado.">
+<!ENTITY viewList.label "Ver filtros">
+<!ENTITY visitHomepage.label "Visitar su página web">
+<!ENTITY addSubscription.label "Añadir suscripción">
+<!ENTITY dialog.title "Añadir suscripción de filtros para Adblock Plus">
+<!ENTITY location.label "&amp;Ubicación de la lista de filtros:">
+<!ENTITY fromWeb.description "Por favor, confirme que quiere añadir está suscripción de filtros. Puede cambiar su título o ubicación antes de añadirla.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/composer.dtd
new file mode 100644
index 0000000..00bc242
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "ir al &amp;final de la dirección">
+<!ENTITY domainRestriction.label "&amp;Restringir al dominio:">
+<!ENTITY collapse.default.no.label "Usar por defecto (no)">
+<!ENTITY firstParty.label "So&amp;lo propietarios">
+<!ENTITY preferences.label "&amp;Mostrar filtros existentes...">
+<!ENTITY pattern.label "Buscar un patrón">
+<!ENTITY thirdParty.label "&amp;Solo terceros">
+<!ENTITY filter.label "&amp;Nuevo filtro:">
+<!ENTITY collapse.label "C&amp;olapso bloqueado">
+<!ENTITY match.warning "El patrón que ha ingresado ya no concuerda con la dirección a ser Bloqueada/Permitida y no tendrá efecto en la misma.">
+<!ENTITY anchor.start.label "&amp;ir al principio de la dirección">
+<!ENTITY matchCase.label "&amp;Coincidir Mayus/Minus">
+<!ENTITY custom.pattern.label "&amp;Personalizar:">
+<!ENTITY unselectAllTypes.label "Seleccionar ninguno">
+<!ENTITY type.whitelist.label "Regla de e&amp;xcepción">
+<!ENTITY regexp.warning "El patrón que ha escrito se interpretará como una expresión regular, la cual no puede ser eficientemente procesada por Adblock Plus y podría ralentizar su experiencia al navegar. Si no tenía la intención de usar una expresión regular, agregue un asterisco (*) al final del patrón.">
+<!ENTITY dialog.title "Agregar una regla de filtro de Adblock Plus">
+<!ENTITY basic.label "Vista básica">
+<!ENTITY type.filter.label "Filtro de &amp;bloqueo">
+<!ENTITY types.label "Se aplica a tipos:">
+<!ENTITY shortpattern.warning "El patrón que ha ingresado es muy corto para ser optimizado y podría ralentizar su experiencia al navegar. Es recomendable que elija una cadena más larga para este filtro para permitir a Adblock Plus procesar el filtro con mayor eficacia.">
+<!ENTITY collapse.yes.label "Si">
+<!ENTITY anchors.label "Solo aceptar patrones:">
+<!ENTITY collapse.default.yes.label "Usar por defecto (si)">
+<!ENTITY domainRestriction.help "Use esta opción para especificar uno o más dominios separados por una barra (|). El filtro solo se aplicará en dominio(s) seleccionados. Una tilde (~) antes del nombre del dominio indica que el filtro no se aplicará en ese dominio.">
+<!ENTITY accept.label "Agregar filtro">
+<!ENTITY options.label "Opciones">
+<!ENTITY disabled.warning "Adblock Plus se encuentra desactivado. Puedes continuar agregando filtros pero no serán aplicados hasta que [link]habilites Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "&amp;ir al principio del nombre de dominio">
+<!ENTITY collapse.no.label "No">
+<!ENTITY selectAllTypes.label "Seleccionar todos">
+<!ENTITY advanced.label "Vista Avanzada">
+<!ENTITY pattern.explanation "El patrón puede ser cualquier parte de una dirección; asteriscos(*) actuan como comodines. El filtro solo se aplicara a direcciones que igualen el patrón proporcionado.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/filters.dtd
new file mode 100644
index 0000000..5e9cc80
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Todos tus filtros personalizados serán reemplazados con el contenido del archivo seleccionado. Deseas continuar con el proceso?">
+<!ENTITY slow.column "Filtros lentos">
+<!ENTITY enabled.column "Habilitado">
+<!ENTITY subscription.lastDownload.checksumMismatch "Falló, comprobación(checksum) no concuerda">
+<!ENTITY noFiltersInGroup.text "El grupo seleccionado esta vacio">
+<!ENTITY subscription.actions.label "Comportamiento/Acciones">
+<!ENTITY filter.selectAll.label "Seleccionar Todo">
+<!ENTITY backupButton.label "&amp;Salvar/Copia de Seguridad y Restaurar">
+<!ENTITY restore.minVersion.warning "Advertencia: el archivo ha sido creado con una versión mas actual de Adblock Plus. Deberias actualizar Adblock Plus a la versión mas reciente antes de restaurar desde este archivo.">
+<!ENTITY restore.error "Los datos de archivo no se pudierón procesar, tal vez esta no sea una copia de seguridad de Adblock Plus?">
+<!ENTITY sort.ascending.label "Ordern&amp;ar de la A &gt; Z">
+<!ENTITY sort.label "Ordenar &amp;por">
+<!ENTITY subscription.source.label "Lista de filtros">
+<!ENTITY hitcount.column "&amp;Contador">
+<!ENTITY noFilters.text "Usted no tiene ningún filtro personalizado aún.">
+<!ENTITY backup.custom.title "Solo filtros personalizados">
+<!ENTITY subscription.external.label "Actualizado por otro complemento">
+<!ENTITY subscription.delete.label "Eliminar">
+<!ENTITY noGroupSelected.text "Necesitas seleccionar un grupo de filtros antes para que su contenido de filtros se puedan mostrar.">
+<!ENTITY filter.cut.label "Cortar">
+<!ENTITY restore.default.label "Restaurar copia de seguridad desde ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Descargando...">
+<!ENTITY subscriptions.tab.label "Suscripciones de Filtro">
+<!ENTITY sort.descending.label "Ordernar de la &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Realmente deseas quitar todos los filtros seleccionados?">
+<!ENTITY filter.delete.label "Eliminar">
+<!ENTITY addSubscriptionAdd.label "Agregar">
+<!ENTITY viewMenu.label "Vista">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY addSubscriptionCancel.label "Cancelar">
+<!ENTITY subscription.enabled.label "Activado">
+<!ENTITY noSubscriptions.text "Usted no ha agregado ninguna subscripción de filtros aun. Adblock Plus no bloqueará
+ nada sin filtros, por favor use &quot;Agregar subscripción de filtros&quot; para
+ agregar algunos.">
+<!ENTITY subscription.update.label "Actualizar filtros">
+<!ENTITY dialog.title "Preferencias de Filtro de Adblock Plus">
+<!ENTITY addFilter.label "Agregar &amp;filtro">
+<!ENTITY subscription.minVersion.warning "Esta suscripción de filtro necesita una versión actualizada de Adblock Plus, debes actualizar tu versión de Adblock Plus a la más reciente.">
+<!ENTITY subscription.lastDownload.invalidURL "Falló, no es una dirección valida">
+<!ENTITY backup.error "Hubo un error escribiendo los filtros en el archivo. Asegurese que el archivo no esta protegido o que no se encuentre en uso por otra aplicación.">
+<!ENTITY filter.moveUp.label "Mover arriba">
+<!ENTITY addGroup.label "Agregar grupo de filtros">
+<!ENTITY filter.edit.label "Editar">
+<!ENTITY subscription.showHideFilters.label "Mostrar/Ocultar filtros">
+<!ENTITY acceptableAds2.label "Permitir algo de publicidad no intrusiva">
+<!ENTITY addSubscriptionOther.label "Agregar una suscripción diferente">
+<!ENTITY close.label "Cerrar">
+<!ENTITY sort.none.label "&amp;Sin clasificar">
+<!ENTITY filter.actions.label "Comportamiento/Acción de filtros">
+<!ENTITY filter.copy.label "Copiar">
+<!ENTITY filter.moveDown.label "Mover abajo">
+<!ENTITY filter.resetHitCounts.label "Reiniciar estadísticas">
+<!ENTITY readMore.label "Leer más">
+<!ENTITY subscription.moveUp.label "Mover arriba">
+<!ENTITY addSubscription.label "&amp;Agregar suscripción de filtro">
+<!ENTITY subscription.homepage.label "Página de inicio">
+<!ENTITY backup.complete.title "Todos los filtros y suscripciones">
+<!ENTITY restore.own.label "Restaurar copia de seguridad propia">
+<!ENTITY restore.complete.warning "Todas tus preferencias de filtros se reemplazarán con el contenido del archivo seleccionado. Deseas continuar con el proceso?">
+<!ENTITY filters.tab.label "Filtros personalizados">
+<!ENTITY backup.label "Crear nueva copia de seguridad">
+<!ENTITY find.label "&amp;Buscar">
+<!ENTITY subscription.moveDown.label "Mover abajo">
+<!ENTITY subscription.lastDownload.connectionError "Falló, La descarga ha fracasado">
+<!ENTITY subscription.lastDownload.success "Éxito">
+<!ENTITY subscription.lastDownload.invalidData "Falló, no es una lista de filtros válida">
+<!ENTITY filter.paste.label "Pegar">
+<!ENTITY subscription.disabledFilters.enable "Activar filtros desactivados">
+<!ENTITY lasthit.column "&amp;Ultima visita">
+<!ENTITY subscription.editTitle.label "Editar título">
+<!ENTITY subscription.disabledFilters.warning "Algunos filtros en esta suscripción se encuentran desactivados.">
+<!ENTITY filter.column "Regla de &amp;filtro">
+<!ENTITY subscription.lastDownload.label "Ultima descarga:">
+<!ENTITY viewList.label "Ver lista">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/firstRun.properties
new file mode 100644
index 0000000..bc70db1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Navega de forma privada desactivando el rastreo, ocultando así tu actividad de compañías de publicidad que te rastrearían en cada momento.
+firstRun_toggle_off=NO
+firstRun_feature_tracking=Desactivar el Rastreo
+firstRun_feature_malware=Bloquear Malware
+firstRun_title=Adblock Plus ha sido instalado
+firstRun_toggle_on=SÃ
+firstRun_acceptableAdsExplanation=Nos gustaría fomentar en los sitios web, el uso de publicidad discreta y directa. Es por eso que hemos establecido <a>lineamientos estrictos</a> para identificar anuncios aceptables, que son mostrados bajo las configuraciones predeterminadas. Si aun así deseas bloquear todos los anuncios, puedes <a>desactivar</a> esta opción en pocos segundos.
+firstRun_contributor_credits=Colaboradores
+firstRun_dataCorruptionWarning=¿Se sigue mostrando esta página? <a>¡Haz clic acá!</a>
+firstRun_acceptableAdsHeadline=Anuncios molestos serán bloqueados
+firstRun_share=Cuéntale a tus amigos
+firstRun_share_headline=<a>Ayúdanos</a> haciendo el internet un mejor lugar
+firstRun_feature_social_description=Libérate automáticamente de los botones de redes sociales, como el "Me gusta" de Facebook, el cual aparece en páginas web y rastrea tu actividad en línea.
+firstRun_filterlistsReinitializedWarning=Parece que un problema provocó que todos los filtros fueron removidos y fuimos incapaces de restaurar una copia de seguridad. Por lo tanto tuvimos que restaurar tus filtros y configuraciones de anuncios aceptables. Por favor revisa tu lista de filtros y configuración de anuncios aceptables en las <a>Opciones de Adblock Plus</a>.
+firstRun_feature_malware_description=Haz tu navegación más segura bloqueando dominios maliciosos conocidos.
+firstRun_features=Adblock Plus puede hacer más que bloquear anuncios
+firstRun_donate=donar
+firstRun_donate_label=Apoya nuestro proyecto
+firstRun_feature_social=Quitar Botones de Redes Sociales
+firstRun_legacySafariWarning=Está utilizando una versión antigua de Safari no soportada por Adblock Plus, por lo que podría funcionar incorrectamente o afectar a su experiencia de usuario en algunos sitios web. Le recomendamos actualizar a Safari 6.1.1 o superior (para Mac OS X 10.8 Mountain Lion), o a Safari 7.0.1 o superior (para Mac OS X 10.9 Mavericks), o usar la última versión de Mozilla Firefox, Google Chrome u Opera.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/global.properties
new file mode 100644
index 0000000..fe253c1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=No hay elementos bloqueables en la página actual
+action3_tooltip=Click para activar/desactivar Adblock Plus.
+notification_antiadblock_title=¿Ocultar mensajes dirigidos?
+type_label_script=script
+filter_elemhide_nocriteria=No hay criterios específicos para reconocer el elemento que se oculta
+blockingGroup_title=Reglas de Bloqueo de Anuncios
+whitelisted_tooltip=Adblock Plus esta desactivado en la página actual.
+type_label_stylesheet=estilo de hoja
+blocked_count_tooltip=?1? del total de ?2?
+type_label_font=fuente
+type_label_popup=ventana emergente
+filter_regexp_tooltip=Este filtro o bien es una expresión regular o es demasiado corto para ser optimizado. Demasiados de estos filtros podrian relentizar su experiencia al navegar.
+action0_tooltip=Haga clic para abrir el menú contextual, click medio para activar/desactivar.
+whitelisted_page=Adblock Plus ha sido desactivado para la página actual
+remove_group_warning=¿Realmente desea eliminar este grupo?
+action1_tooltip=Click para abrir/cerrar elementos bloqueables, click medio para activar/desactivar.
+type_label_xmlhttprequest=Solicitud XML
+active_tooltip=Adblock Plus esta activado, ?1? suscripción(es) de filtro(s) y ?2? filtro(s) personalizado(s) en uso.
+type_label_document=documento
+type_label_object_subrequest=Solicitud de objeto
+whitelistGroup_title=Reglas de excepción
+disabled_tooltip=Adblock Plus está desactivado.
+filter_elemhide_duplicate_id=Solo una ID de el elemento oculto puede ser especificado
+type_label_object=objeto
+action2_tooltip=Click para abrir las Preferencias, click medio para activar/desactivar.
+type_label_subdocument=marco
+clearStats_warning=Esto reiniciará todas las estadísticas de filtros afectados y desactivará el conteo de accesos de los filtros. ¿Deseas proceder?
+notification_antiadblock_message=Es sabido que este sitio muestra mensajes dirigidos a los usuarios de Adblock Plus. ¿Quieres que Adblock plus oculte estos mensajes?
+blocked_count_addendum=(tambien permitidos: ?1?, ocultos: ?2?)
+subscription_invalid_location=La ubicación de la lista de filtros no es ni una dirección URL válida, ni un nombre de archivo válido.
+type_label_image=imagen
+remove_subscription_warning=¿Realmente deseas quitar esta subscripción?
+type_label_other=otro
+mobile_menu_enable=ABP: activar
+type_label_media=sonido/video
+mobile_menu_disable_site=¿ABP: Deshabilitar en ?1?
+elemhideGroup_title=Reglas para Ocultar Elementos
+mobile_menu_enable_site=¿ABP: Habilitar en ?1?
+type_label_elemhide=oculto
+newGroup_title=Nuevo grupo de filtros
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/overlay.dtd
new file mode 100644
index 0000000..ffa1dc3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Sí">
+<!ENTITY notification.button.no "&amp;No">
+<!ENTITY sync.label "&amp;Sincronizar configuración de Adblock Plus">
+<!ENTITY whitelist.site.label "Desactivar en ?1?">
+<!ENTITY filters.label "&amp;Preferencias de filtro">
+<!ENTITY disable.label "Desactivado en cualquier lugar">
+<!ENTITY objecttab.title "Bloquear">
+<!ENTITY objecttab.tooltip "Click aquí para bloquear este objeto con Adblock Plus">
+<!ENTITY menuitem.label "Pr&amp;eferencias de Adblock Plus">
+<!ENTITY objecttabs.label "Mostrar pestañas sobre Flash y Java">
+<!ENTITY sendReport.label "Reportar problema en esta página">
+<!ENTITY whitelist.page.label "Deshabilitar solo en esta página">
+<!ENTITY context.image.label "Adblock Plus: Bloquear imagen">
+<!ENTITY counthits.label "Contar accesos de &amp;filtro">
+<!ENTITY opensidebar.label "Abrir elementos bloqueables">
+<!ENTITY notification.button.close "&amp;Cerrar">
+<!ENTITY contribute.label "Desactivar con Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock plus">
+<!ENTITY context.frame.label "Adblock Plus: Bloquear marco">
+<!ENTITY blocked.tooltip "Elementos bloqueados en esta pagina:">
+<!ENTITY hideplaceholders.label "&amp;Ocultar marcadores de posición de elementos bloqueados">
+<!ENTITY showinstatusbar.label "&amp;Mostrar en la barra de estado">
+<!ENTITY sidebar.title "Elementos bloqueables en la página actual">
+<!ENTITY options.label "&amp;Opciones">
+<!ENTITY context.object.label "Adblock Plus: Bloquear objeto">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Re-habilitar en esta página">
+<!ENTITY filters.tooltip "Filtros mas activos:">
+<!ENTITY closesidebar.label "Cerrar elementos bloqueables">
+<!ENTITY showintoolbar.label "Mostrar barra de &amp;complementos">
+<!ENTITY status.tooltip "Estado:">
+<!ENTITY context.media.label "Adblock Plus: Bloquear sonido/video">
+<!ENTITY subscription.update.label "Actualizar filtros">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/sendReport.dtd
new file mode 100644
index 0000000..eb5b334
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Deshacer">
+<!ENTITY issues.disabledgroups.description "La siguiente subscripcion/Grupo de filtros se encuentra desactivada, aun asi pueden tener efectos en esta página:">
+<!ENTITY showData.label "Mostrar datos del reporte">
+<!ENTITY typeSelector.falsePositive.label "&amp;Adblock Plus está bloqueando demasiado">
+<!ENTITY issues.change.description "Su configuración ha sido cambiada. Por favor recargue la página para probar los cambios y presentar un reporte si el problema no ha sido resuelto por las alteraciones.">
+<!ENTITY email.label "Co&amp;rreo electrónico:">
+<!ENTITY issues.openPreferences.label "Abrir preferencias de filtro">
+<!ENTITY sendPage.confirmation "Su reporte ha sido salvado. Puede acceder al mismo en la siguiente direccion:">
+<!ENTITY copyLink.label "&amp;Copiar dirección del reporte">
+<!ENTITY issues.nofilters.description "Adblock Plus no está bloqueando nada en la página actual. El problema que esta observando es probable que no se encuentre relacionado con Adblock Plus.">
+<!ENTITY sendPage.knownIssue "El problema que ha reportado probablemente ya sea conocido. Mas información:">
+<!ENTITY typeSelector.other.description "Seleccione esta opción si usted sospecha un problema con Adblock Plus específicamente en lugar de sus filtros.">
+<!ENTITY issues.disabledgroups.enable.label "Activar subscripción/Grupo de filtros">
+<!ENTITY typeWarning.override.label "&amp;Entiendo y deseo presentar el reporte de todos modos">
+<!ENTITY issues.disabled.enable.label "Activar Adblock Plus">
+<!ENTITY update.fixed.description "Las actualizaciones de sus suscripciones de filtro probablemente resolvieron el problema sobre el que está usted informando. Por favor vuelva a cargar la página y vuelva a intentarlo. Informe nuevamente si el problema persiste.">
+<!ENTITY anonymous.label "Envío &amp;Anónimo">
+<!ENTITY reloadButton.label "&amp;Recargar página">
+<!ENTITY recentReports.clear.label "&amp;Quitar todos los reportes">
+<!ENTITY typeSelector.description "Esta ventana lo guiará por pasos, necesarios para el envio de un reporte de problemas de Adblock Plus. Primero, por favor seleccione el tipo de problema que esta experimentando en esta página:">
+<!ENTITY screenshot.remove.label "Q&amp;uitar datos sensitivos/privados">
+<!ENTITY issues.ownfilters.description "Alguno de los filtros aplicados en esta página se encuentran definidos por el usuarios. Por favor desactive los filtros que pueden causar el problema:">
+<!ENTITY update.inProgress.description "AdBlock Plus necesita actualizar sus suscripciones de filtro para asegurarse de que el problema no ha sido resuelto ya. Por favor, espere...">
+<!ENTITY sendPage.retry.label "Enviar otra vez">
+<!ENTITY data.label "Da&amp;tos de Reporte">
+<!ENTITY recentReports.label "Tus reportes recientemente enviados">
+<!ENTITY typeWarning.description "Ha indicado que desea reportar un problema general con Adblock Plus en lugar de un problema con los filtros. Por favor tenga en cuenta que estos problemas son mejor reportados en el [link]Foro de Adblock Plus[/link]. Solo deberia usar el reportero de problemas para complementar una discución existente, ya que nadie se percatará de su informe a menos que se les proporcione el enlace a la misma. El enlace generado automáticamente sera proporcionado después de presentar el reporte respectivo.">
+<!ENTITY issues.disabled.description "Adblock Plus esta desactivado, no bloqueará nada en su estado actual.">
+<!ENTITY attachExtensions.label "A&amp;djuntar una lista de extensiones activas a el repote en caso de que un conflicto de complementos sea la causa del problema">
+<!ENTITY issues.nosubscriptions.add.label "Agregar filtro de suscripción">
+<!ENTITY issues.disabledfilters.enable.label "Activar filtro">
+<!ENTITY issues.override.label "&amp;La configuración es correcta, continue con el reporte">
+<!ENTITY issues.nosubscriptions.description "Usted no parece estar suscrito a ninguna lista de filtro pre-desarrollado que automáticamente quita contenido no deseado de los sitios web.">
+<!ENTITY typeSelector.falsePositive.description "Seleccione esta opción si la página carece de contenido importante, muestra incorrectamente o falla al funcionar como debe. Puede determinar si Adblock Plus es el causante del problema desactivándolo temporalmente.">
+<!ENTITY typeSelector.other.label "&amp;Otro problema">
+<!ENTITY emailComment.label "Te sugerimos que ingreses una dirección válida de correo electrónico para que podamos contactarte si hay preguntas sobre tu informe. También nos permitirá reconocer tus contribuciones y darles mayor prioridad.">
+<!ENTITY issues.whitelist.remove.label "Re-activar Adblock Plus en esta página">
+<!ENTITY outdatedSubscriptions.description "Las siguientes suscripciones de filtro no han sido actualizadas desde hace al menos dos semanas. Por favor, actualícelas antes de enviar un informe de error, el problema quizá esté ya resuelto.">
+<!ENTITY dataCollector.description "Por favor espere un momento mientras Adblock Plus reúne los datos necesarios.">
+<!ENTITY sendButton.label "En&amp;viar reporte">
+<!ENTITY comment.label "Come&amp;ntario (opcional):">
+<!ENTITY sendPage.errorMessage "Un intento de enviar el reporte ha fallado con el código de error &quot;?1?&quot;. Por favor asegúrese de que se encuentra conectado a internet y vuelva a intentarlo. Si el problema persiste por favor solicite asistencia en el [link]Foro de Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Mostrar reportes enviados recientemente">
+<!ENTITY commentPage.heading "Comentar">
+<!ENTITY update.start.label "Iniciar actualización ahora">
+<!ENTITY issues.disabledfilters.description "Los siguientes filtros están desactivados, aun así pueden tener efectos en esta página:">
+<!ENTITY screenshot.description "La misma página puede parecer diferente para cada persona. Puede ayudarnos a entender el problema si adjunta una captura de pantalla a su reporte. Puede quitar partes que contengan informacion sensitiva/privada asi mismo marcar áreas donde el problema se note. Para hacerlo click en el botón correspondiente y seleccione una parte de la imagen con su cursor/puntero.">
+<!ENTITY screenshot.attach.label "Adjuntar una &amp;imagen de la página al reporte">
+<!ENTITY issues.whitelist.description "Adblock Plus se encuentra desactivado en la página que esta reportando. Por favor vuelva a activarlo y recargue la página antes de presentar el informe para ayudar a la investigación de este problema.">
+<!ENTITY typeSelector.falseNegative.label "Ad&amp;block Plus no bloquea una publicidad">
+<!ENTITY typeSelector.heading "Elija tipo de problema">
+<!ENTITY anonymity.warning "No podremos comunicarnos contigo y es probable que le demos una prioridad inferior a tu informe.">
+<!ENTITY wizard.title "Reportero de problemas">
+<!ENTITY issues.ownfilters.disable.label "Desactivar filtro">
+<!ENTITY commentPage.description "El campo de texto a continuación le permite escribir un comentario para ayudarnos a entender el problema. Este paso es opcional pero recomendado si el problema no es obvio. Puede tambien revisar el reporte de datos antes de que sea enviado.">
+<!ENTITY comment.lengthWarning "El tamaño de su comentario excede los 1000 caracteres. Solo los primeros 1000 caracteres seran enviados.">
+<!ENTITY typeSelector.falseNegative.description "Seleccione esta opción si una publicidad continua mostrándose a pesar que Adblock Plus se encuentra activado.">
+<!ENTITY sendPage.waitMessage "Por favor espere mientras Adblock Plus envía su reporte.">
+<!ENTITY dataCollector.heading "Bienvenido al reportero de problemas">
+<!ENTITY screenshot.heading "Adjuntar captura de pantalla">
+<!ENTITY sendPage.heading "Enviar reporte">
+<!ENTITY issues.subscriptionCount.description "Parece que usted se encuentra inscrito en demasiadas suscripciones de filtro. Esta configuración no se recomienda porque causará una verosimilitud con problemas mucho mas grandes. Tampoco podemos aceptar su reporte de problemas porque en el mismo no se encuentra claro qué autor de suscripción de filtro necesita tomar acciones. Por favor quite todo menos las suscripciones realmente necesarias y compruebe si el problema aun persiste.">
+<!ENTITY screenshot.mark.label "&amp;Marcar el problema">
+<!ENTITY privacyPolicy.label "Política de Privacidad">
+<!ENTITY issues.description "Adblock Plus ha detectado problemas con su configuración que puede ser la causa de este problema o que podria dificultar la investigación del problema.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/sidebar.dtd
new file mode 100644
index 0000000..a7eb86f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Elementos flash en bordes">
+<!ENTITY address.label "Dirección">
+<!ENTITY context.open.label "Abrir en Nueva Pestaña">
+<!ENTITY type.label "Tipo">
+<!ENTITY tooltip.filterSource.label "Fuente del filtro:">
+<!ENTITY noitems.label "No hay elementos bloqueables">
+<!ENTITY filter.label "Filtro">
+<!ENTITY tooltip.size.label "Tamaño:">
+<!ENTITY reattach.label "Unir">
+<!ENTITY search.label "&amp;Buscar:">
+<!ENTITY docDomain.thirdParty "(terceros)">
+<!ENTITY filterSource.label "Fuente de filtro">
+<!ENTITY tooltip.docDomain.label "Fuente del Documento:">
+<!ENTITY context.copy.label "Copiar dirección de elementos">
+<!ENTITY tooltip.type.label "Tipo:">
+<!ENTITY context.disablefilter.label "Desactivar filtro ?1?">
+<!ENTITY context.copyFilter.label "Copiar filtro">
+<!ENTITY context.block.label "Bloquear este elemento">
+<!ENTITY context.enablefilter.label "Re-Habilitar filtro ?1?">
+<!ENTITY detach.label "Separar">
+<!ENTITY whitelisted.label "Página de lista de Permitidos">
+<!ENTITY context.disablefilteronsite.label "Desactivar este filtro en ?1?">
+<!ENTITY detached.title "Adblock Plus: Elementos bloqueables (Separados)">
+<!ENTITY docDomain.firstParty "(propietario)">
+<!ENTITY tooltip.type.whitelisted "(permitido)">
+<!ENTITY tooltip.filter.label "Filtro en uso:">
+<!ENTITY tooltip.filter.disabled "(desactivado)">
+<!ENTITY context.editfilter.label "Editar filtro en uso">
+<!ENTITY tooltip.type.blocked "(bloqueado)">
+<!ENTITY size.label "Tamaño">
+<!ENTITY context.whitelist.label "Agregar una regla de excepción para el elemento">
+<!ENTITY context.selectAll.label "Seleccionar todo">
+<!ENTITY state.label "Estado">
+<!ENTITY docDomain.label "Fuente del documento">
+<!ENTITY tooltip.address.label "Dirección:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/subscriptionSelection.dtd
new file mode 100644
index 0000000..c43540e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "A&amp;gregar suscripción de filtro &quot;?1?&quot; también">
+<!ENTITY list.download.failed "Adblock Plus ha fallado al recuperar la lista de subscripciones.">
+<!ENTITY list.download.retry "Intente de nuevo">
+<!ENTITY title.label "&amp;Titulo de la Suscripción:">
+<!ENTITY list.download.website "Ver sitio web">
+<!ENTITY supplementMessage "Esta suscripción de filtros está orientada a ser usada con la subscripción de filtro &quot;?1?&quot; la cual aun no está usando.">
+<!ENTITY viewList.label "Ver filtros">
+<!ENTITY visitHomepage.label "Visitar pagina principal">
+<!ENTITY addSubscription.label "Agregar subscripción">
+<!ENTITY dialog.title "Agregar subscripción de filtro de Adblock Plus">
+<!ENTITY location.label "&amp;Ubicación de la lista de filtros:">
+<!ENTITY fromWeb.description "Por favor confirme que desea agregar esta subscripción de filtro. Usted puede cambiar el titulo de la subscripción o la localización antes de agregarla.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/composer.dtd
new file mode 100644
index 0000000..5a0ceac
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "aadressi &amp;lõpus">
+<!ENTITY domainRestriction.label "Kehtib ainult domeenis:">
+<!ENTITY collapse.default.no.label "Kasuta vaikeväärtust (ei)">
+<!ENTITY firstParty.label "Ainult &amp;põhilehel">
+<!ENTITY preferences.label "Näita olemasolevaid filtreid...">
+<!ENTITY pattern.label "Otsitav avaldis">
+<!ENTITY thirdParty.label "Ainult &amp;väljaspoolsed">
+<!ENTITY filter.label "Uus filter:">
+<!ENTITY collapse.label "A&amp;henda blokeeritavad:">
+<!ENTITY match.warning "Sisestatud avaldis ei leia aadressist ühtegi vastet ja seega ei oma sellele mingit mõju.">
+<!ENTITY anchor.start.label "aadressi alguses">
+<!ENTITY matchCase.label "&amp;Tõstutundlik">
+<!ENTITY custom.pattern.label "L&amp;oo ise:">
+<!ENTITY unselectAllTypes.label "Tühista valik">
+<!ENTITY type.whitelist.label "&amp;Erandi reegel">
+<!ENTITY regexp.warning "Sisestatud avaldis loetakse regulaaravaldiseks, mida Adblock Plus ei suuda efektiivselt töödelda ja mis võib muuta interneti lehitsemise aeglasemaks. Kui sa tegelikult ei soovinud luua regulaaravaldist, siis lisa selle lõppu tärn (*).">
+<!ENTITY dialog.title "Lisa Adblock Plusi filtreerimisreegel">
+<!ENTITY basic.label "Tavaline vaade">
+<!ENTITY type.filter.label "Blokeeriv filter">
+<!ENTITY types.label "Rakenda tüüpidele:">
+<!ENTITY shortpattern.warning "Sisestatud avaldis on optimeerimiseks liiga lühike ja võib muuta interneti lehitsemise aeglasemaks. Soovitatav oleks valida selle filtri jaoks pikem string, mida Adblock Plusi töötleb efektiivsemalt.">
+<!ENTITY collapse.yes.label "Jah">
+<!ENTITY anchors.label "Otsitav võib olla ainult:">
+<!ENTITY collapse.default.yes.label "Kasuta vaikeväärtust (jah)">
+<!ENTITY domainRestriction.help "Sisesta üks või enam püstkriipsuga (|) eraldatud domeeninime. See filter kehtib ainult nendele domeenidele. Tilde (~) domeeninime ees näitab, et seda filtrit ei rakendata antud domeenile.">
+<!ENTITY accept.label "Lisa filter">
+<!ENTITY options.label "Valikud">
+<!ENTITY disabled.warning "Adblock Plus on hetkel keelatud olekus. Sa võid lisada filtreid, kuid neid ei rakendu enne, kui [link]lubad Adblock Plusi[/link].">
+<!ENTITY anchor.start.flexible.label "domeeninime alguses">
+<!ENTITY collapse.no.label "Ei">
+<!ENTITY selectAllTypes.label "Vali kõik">
+<!ENTITY advanced.label "Detailne vaade">
+<!ENTITY pattern.explanation "Otsitavaks võib olla aadressi suvaline osa; tärnid (*) toimivad metamärkidena. Filter kehtib ainult aadresside puhul, mis sobivad antud otsingu avaldisega.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/filters.dtd
new file mode 100644
index 0000000..29d8bc5
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Kõik su isetehtud filtrid asendatakse valitud faili sisuga. Kas soovid jätkata?">
+<!ENTITY slow.column "A&amp;eglased filtrid">
+<!ENTITY enabled.column "L&amp;ubatud">
+<!ENTITY subscription.lastDownload.checksumMismatch "Nurjus, kontrollsumma ei klapi">
+<!ENTITY noFiltersInGroup.text "Valitud grupp on tühi">
+<!ENTITY subscription.actions.label "Tegevused">
+<!ENTITY filter.selectAll.label "Vali kõik">
+<!ENTITY backupButton.label "&amp;Varundamine ja taastamine">
+<!ENTITY restore.minVersion.warning "Hoiatus: see fail on loodud uuema Adblock Plus versiooniga. Enne selle taastamist peaksid sa Adblock Plus'i uuendama viimasele versioonile.">
+<!ENTITY restore.error "Faili andmeid ei õnnestu töödelda. Kas see on ikka Adblock Plus varundusfail?">
+<!ENTITY sort.ascending.label "A &gt; Z sortimiskord">
+<!ENTITY sort.label "Sortimine">
+<!ENTITY subscription.source.label "Filtrite loetelu">
+<!ENTITY hitcount.column "&amp;Tabamusi">
+<!ENTITY noFilters.text "Sul ei ole ühtegi isetehtud filtrit.">
+<!ENTITY backup.custom.title "Ainult isetehtud filtrid">
+<!ENTITY subscription.external.label "Uuendatud mingi teise lisa poolt">
+<!ENTITY subscription.delete.label "Kustuta">
+<!ENTITY noGroupSelected.text "Enne kui filtreid saab näidata pead valima filtrite grupi.">
+<!ENTITY filter.cut.label "Lõika">
+<!ENTITY restore.default.label "Taasta andmed varukoopiast ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Laen alla...">
+<!ENTITY subscriptions.tab.label "Filtrite tellimused">
+<!ENTITY sort.descending.label "Z &gt; A sortimiskord">
+<!ENTITY filters.remove.warning "Kas soovid tõesti eemaldada kõik valitud filtrid?">
+<!ENTITY filter.delete.label "Kustuta">
+<!ENTITY addSubscriptionAdd.label "Lisa">
+<!ENTITY viewMenu.label "Vaade">
+<!ENTITY subscription.lastDownload.unknown "Pole teada">
+<!ENTITY addSubscriptionCancel.label "Loobu">
+<!ENTITY subscription.enabled.label "Lubatud">
+<!ENTITY noSubscriptions.text "Sa ei ole veel lisanud ühtegi filtrite tellimust. Adblock Plus ei blokeeri midagi ilma filtriteta. Filtrite tellimiseks klõpsa nupul &quot;Lisa filtrite tellimus&quot;.">
+<!ENTITY subscription.update.label "Uuenda filtreid">
+<!ENTITY dialog.title "Adblock Plus filtrite sätted">
+<!ENTITY addFilter.label "&amp;Lisa filter">
+<!ENTITY subscription.minVersion.warning "See filtrite tellimus nõuab uuemat Adblock Plus versiooni. Sa peaksid uuendama Adblock Plus'i.">
+<!ENTITY subscription.lastDownload.invalidURL "Nurjus, vale aadress">
+<!ENTITY backup.error "Viga filtrite faili kirjutamisel. Kontrolli, et fail ei oleks avatud mingi teise rakenduse poolt ja et fail ei oleks kirjutuskaitstud.">
+<!ENTITY filter.moveUp.label "Liiguta üles">
+<!ENTITY addGroup.label "Lisa filtrite grupp">
+<!ENTITY filter.edit.label "Muuda">
+<!ENTITY subscription.showHideFilters.label "Näita/peida filtreid">
+<!ENTITY acceptableAds2.label "Luba mõned mittepealetükkivad reklaamid">
+<!ENTITY addSubscriptionOther.label "Lisa muu tellimus">
+<!ENTITY close.label "Sulge">
+<!ENTITY sort.none.label "S&amp;ortimata">
+<!ENTITY filter.actions.label "Filtri tegevused">
+<!ENTITY filter.copy.label "Kopeeri">
+<!ENTITY filter.moveDown.label "Liiguta alla">
+<!ENTITY filter.resetHitCounts.label "Nullista tabamuste statistika">
+<!ENTITY readMore.label "Loe lisaks">
+<!ENTITY subscription.moveUp.label "Liiguta üles">
+<!ENTITY addSubscription.label "Lisa filtrite tellimus">
+<!ENTITY subscription.homepage.label "Koduleht">
+<!ENTITY backup.complete.title "Kõik filtrid ja tellimused">
+<!ENTITY restore.own.label "Taasta andmed mujalt">
+<!ENTITY restore.complete.warning "Kõik filtrite sätted asendatakse valitud faili sisuga. Kas soovid jätkata?">
+<!ENTITY filters.tab.label "Isetehtud filtrid">
+<!ENTITY backup.label "Loo uus varukoopia">
+<!ENTITY find.label "&amp;Otsi">
+<!ENTITY subscription.moveDown.label "Liiguta alla">
+<!ENTITY subscription.lastDownload.connectionError "Nurjus, allalaadimise viga">
+<!ENTITY subscription.lastDownload.success "Õnnestus">
+<!ENTITY subscription.lastDownload.invalidData "Nurjus, vale filtrite nimekiri">
+<!ENTITY filter.paste.label "Aseta">
+<!ENTITY subscription.disabledFilters.enable "Luba keelatud filtrid">
+<!ENTITY lasthit.column "&amp;Viimane tabamus">
+<!ENTITY subscription.editTitle.label "Muuda pealkirja">
+<!ENTITY subscription.disabledFilters.warning "Mõned selle tellimuse filtrid on keelatud.">
+<!ENTITY filter.column "Filtri reegel">
+<!ENTITY subscription.lastDownload.label "Viimati alla laaditud:">
+<!ENTITY viewList.label "Vaata loetelu">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/firstRun.properties
new file mode 100644
index 0000000..fdc591a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_toggle_off=VÄLJAS
+firstRun_feature_tracking=Keela Jälgimine
+firstRun_title=Adblock Plus on paigaldatud
+firstRun_toggle_on=SEES
+firstRun_feature_malware=Viiruste blokeerimine
+firstRun_feature_social=Eemalde sotsiaalse meedia nuppe
+firstRun_acceptableAdsHeadline=Tüütud kuulutused on nüüd blokeeritud
+firstRun_share=Räägi oma sõpradele
+firstRun_share_headline=<a>Anna meile käsi</a> veebi muutmises paremaks kohaks
+firstRun_donate=anneta
+firstRun_donate_label=Toeta meie projekti
+firstRun_feature_tracking_description=Browse privately by disabling tracking - hiding your tracks from ad companies that would track your every move.
+firstRun_acceptableAdsExplanation=We'd like to encourage websites to use straightforward, unobtrusive advertising. That's why we've established <a>strict guidelines</a> to identify acceptable ads, which are shown under default settings. If you still want to block every ad you can <a>disable</a> this in a few seconds.
+firstRun_contributor_credits=Contributor Credits
+firstRun_dataCorruptionWarning=Does this page keep showing up? <a>Click here!</a>
+firstRun_feature_social_description=Automatically rid your browsing experience of social media buttons, such as the Facebook Like, which appear on web pages and track your behavior.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
+firstRun_feature_malware_description=Make your browsing more secure by blocking known malware domains.
+firstRun_features=Adblock Plus can do more than block ads
+firstRun_legacySafariWarning=You are using an old version of Safari which is not supported by Adblock Plus. It might not work correctly or impair the user experience on some websites. We strongly recommend to either update to Safari 6.1.1 or higher (on OS X 10.8 Mountain Lion), or Safari 7.0.1 or higher (on OS X 10.9 Mavericks), or to use the latest version of Mozilla Firefox, Google Chrome or Opera.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/global.properties
new file mode 100644
index 0000000..7802c1e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Antud lehel ei leidu blokeeritavaid elemente
+action3_tooltip=Hiireklõps lubab/keelab Adblock Plusi.
+type_label_script=skript
+filter_elemhide_nocriteria=Pole antud ühtegi kriteeriumit peidetava elemendi äratundmiseks
+blockingGroup_title=Blokeerivad reeglid
+whitelisted_tooltip=Antud lehel on Adblock Plus keelatud.
+type_label_stylesheet=laaditabel
+blocked_count_tooltip=?1?, elemente kokku ?2?
+type_label_font=font
+type_label_popup=hüpikaken
+filter_regexp_tooltip=Antud filter on kas regulaaravaldis või optimeerimiseks liiga lühike. Selliste filtrite suur hulk võib muuta interneti lehitsemine aeglaseks.
+action0_tooltip=Hiireklõps avab kontekstimenüü, klõps keskmisel nupul lubab/keelab lisa.
+whitelisted_page=Adblock Plus on antud lehel keelatud
+remove_group_warning=Kas oled kindel, et soovid seda gruppi kustutada?
+action1_tooltip=Hiireklõps avab/sulgeb blokeeritavad elemendid, klõps keskmisel nupul lubab/keelab lisa.
+type_label_xmlhttprequest=XML päring
+active_tooltip=Adblock Plus on lubatud, kasutusel on ?1? filtrite tellimus(t) ja ?2? isetehtud filtrit.
+type_label_document=dokument
+type_label_object_subrequest=objekti alampäring
+whitelistGroup_title=Erandite reeglid
+disabled_tooltip=Adblock Plus on keelatud.
+filter_elemhide_duplicate_id=Määratleda saab ainult ühe peidetava elemendi ID
+type_label_object=objekt
+action2_tooltip=Hiireklõps avab sätted, klõps keskmisel nupul lubab/keelab lisa.
+type_label_subdocument=raam
+clearStats_warning=See nullistab kõigi filtrite tabamuste statistika ja keelab filtrite tabamuste loendamise. Kas soovid jätkata?
+blocked_count_addendum=(valges nimekirjas: ?1?, peidetud: ?2?)
+subscription_invalid_location=Filtrite nimekirja asukoht on kas vigane URL või failinimi.
+type_label_image=pilt
+remove_subscription_warning=Kas oled kindel, et soovid selle tellimuse eemaldata?
+type_label_other=muu
+mobile_menu_enable=ABP: Luba
+type_label_media=heli/video
+mobile_menu_disable_site=ABP: Keela saidil ?1?
+elemhideGroup_title=Elemendi peitmise reeglid
+mobile_menu_enable_site=ABP: Luba saidil ?1?
+type_label_elemhide=peidetud
+newGroup_title=Uus filtrite grupp
+default_dialog_title=Adblock Plus
+notification_antiadblock_title=Hide targeted messages?
+notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages?
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/overlay.dtd
new file mode 100644
index 0000000..4750c46
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY sync.label "Sün&amp;kroniseeri Adblock Plus sätted">
+<!ENTITY whitelist.site.label "Keela domeenis ?1?">
+<!ENTITY filters.label "Filtrite sätted">
+<!ENTITY disable.label "Keela kõikjal">
+<!ENTITY objecttab.title "Blokeeri">
+<!ENTITY objecttab.tooltip "Klõpsa siia selle objekti blokeerimiseks Adblock Plusi abil">
+<!ENTITY menuitem.label "Adblock Plusi sätted">
+<!ENTITY objecttabs.label "Näita Flash ja Java objektidel sakke">
+<!ENTITY sendReport.label "&amp;Teata probleemist antud lehel">
+<!ENTITY whitelist.page.label "Keela ainult antud lehel">
+<!ENTITY context.image.label "Adblock Plus: Blokeeri pilt">
+<!ENTITY counthits.label "Loenda &amp;filtrite tabamusi">
+<!ENTITY opensidebar.label "Ava blokeeritavad elemendid">
+<!ENTITY contribute.label "Toeta Adblock Plus'i">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Blokeeri raam">
+<!ENTITY blocked.tooltip "Blokeeritud elemendid antud lehel:">
+<!ENTITY hideplaceholders.label "Peida blokeeritud elementide kohatäitjad">
+<!ENTITY showinstatusbar.label "Näita &amp;olekuribal">
+<!ENTITY sidebar.title "Blokeeritavad elemendid antud lehel">
+<!ENTITY options.label "V&amp;alikud">
+<!ENTITY context.object.label "Adblock Plus: Blokeeri objekt">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Luba uuesti antud lehel">
+<!ENTITY filters.tooltip "Kõige aktiivsemad filtrid:">
+<!ENTITY closesidebar.label "Sulge blokeeritavad elemendid">
+<!ENTITY showintoolbar.label "Nä&amp;ita tööriistade menüüs">
+<!ENTITY status.tooltip "Olek:">
+<!ENTITY context.media.label "Adblock Plus: Blokeeri audio/video">
+<!ENTITY subscription.update.label "Uuenda filtreid">
+<!ENTITY notification.button.yes "&amp;Yes">
+<!ENTITY notification.button.no "&amp;No">
+<!ENTITY notification.button.close "&amp;Close">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/sendReport.dtd
new file mode 100644
index 0000000..ca6e99a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Tü&amp;hista">
+<!ENTITY issues.disabledgroups.description "Järgnevad filtrite tellimused/filtrigrupid on keelatud, ent nad võivad siiski veel sellel lehel toimida:">
+<!ENTITY showData.label "Näita teate andmeid">
+<!ENTITY typeSelector.falsePositive.label "Adblock &amp;Plus blokeerib liiga palju">
+<!ENTITY issues.change.description "Seadistust on muudetud. Palun laadi leht uuesti muudatuste testimiseks ja teata probleemist, kui see muudatus ei lahendanud probleemi.">
+<!ENTITY email.label "E-&amp;post:">
+<!ENTITY issues.openPreferences.label "Ava filtri sätted">
+<!ENTITY sendPage.confirmation "Su teade on salvestatud. Sa võid sellele ligi pääseda järgneval aadressil:">
+<!ENTITY copyLink.label "&amp;Kopeeri teate link">
+<!ENTITY issues.nofilters.description "Adblock Plus ei blokeeri praegusel lehel midagi. See probleem ei ole tõenäoliselt Adblock Plusiga seotud.">
+<!ENTITY sendPage.knownIssue "Seda probleemi tõenäoliselt juba teatakse. Rohkem infot:">
+<!ENTITY typeSelector.other.description "Vali see variant juhul kui sa kahtlustad, et probleem on pigem Adblock Plusis kui selle filtrites.">
+<!ENTITY issues.disabledgroups.enable.label "Luba filtrite tellimus/filtrigrupp">
+<!ENTITY typeWarning.override.label "&amp;Ma mõistan ja soovin siiski probleemist teada anda">
+<!ENTITY issues.disabled.enable.label "Luba Adblock Plus">
+<!ENTITY update.fixed.description "Filtrite tellimuste uuendused lahendasid tõenäoliselt selle probleemi, millest sa teatasid. Palun lae leht uuesti ja ürita uuesti. Teata uuesti, kui probleemid jäid alles.">
+<!ENTITY anonymous.label "&amp;Anonüümne esitamine">
+<!ENTITY reloadButton.label "&amp;Laadi leht uuesti">
+<!ENTITY recentReports.clear.label "&amp;Kustuta kõik teated">
+<!ENTITY typeSelector.description "Antud aknas saab teatada Adblock Plusi probleemidest, tehes läbi vajalikud sammud. Kõigepealt tuleb valida probleemi liik, millega sa antud lehel kokku puutud:">
+<!ENTITY screenshot.remove.label "Eema&amp;lda tundlikud andmed">
+<!ENTITY issues.ownfilters.description "Mõned sellel lehel kehtivad filtrid on loonud kasutaja. Palun keela need filtrid mis võiksid põhjustada seda probleemi:">
+<!ENTITY update.inProgress.description "Adblock Plus peab uuendama filtrite tellimusi, olemaks kindel, et see probleem ei ole juba lahendatud. Palun oota...">
+<!ENTITY sendPage.retry.label "Saada uuesti">
+<!ENTITY data.label "T&amp;eate andmed:">
+<!ENTITY recentReports.label "Sinu viimati esitatud teated">
+<!ENTITY typeWarning.description "Sa märkisid, et soovid teatada Adblock Plusi üldisest probleemist ja mitte probleemist filtritega. Pane tähele, et selliseid probleeme on kõige parem teatada [link]Adblock Plusi foorumis[/link]. Sa peaksid kasutama probleemist teatamise abivahendit ainult selleks, et täiendada olemasolevat arutelu, sest mitte keegi ei märka su teadet kui sa ei pane selle juurde linki. Automaatselt genereeritud link luuakse peale probleemi edastamist.">
+<!ENTITY issues.disabled.description "Adblock Plus on keelatud, see ei blokeeri hetkel midagi.">
+<!ENTITY attachExtensions.label "Pa&amp;ne teatele kaasa aktiivsete lisade nimekiri juhuks, kui probleemi põhjuseks on lisade konflikt">
+<!ENTITY issues.nosubscriptions.add.label "Lisa filtrite tellimus">
+<!ENTITY issues.disabledfilters.enable.label "Luba filter">
+<!ENTITY issues.override.label "Antud seadistus &amp;on õige. Jätka aruandmist">
+<!ENTITY issues.nosubscriptions.description "Sa ei paista olevat tellinud ühtegi filtrite nimekirja, mis eemaldavad automaatselt veebilehtedelt soovimata sisu.">
+<!ENTITY typeSelector.falsePositive.description "Vali see variant juhul kui lehel on kaduma läinud oluline sisu, lehte kuvatakse valesti või kui see ei tööta korralikult. Et teha kindlaks, kas Adblock Plus on selle probleemi põhjustaja, võid ta ajutiselt ära keelata.">
+<!ENTITY typeSelector.other.label "&amp;Muu probleem">
+<!ENTITY emailComment.label "Me soovitame sul sisestada oma kehtiva meiliaadressi, et saaksime küsimuste tekkimisel antud teate kohta sinuga ühendust võtta. Samuti aitab see suurendada sinu teadete prioriteeti.">
+<!ENTITY issues.whitelist.remove.label "Luba uuesti Adblock Plus sellel lehel">
+<!ENTITY outdatedSubscriptions.description "Järgmisi filtrite tellimusi ei ole uuendatud vähemalt kahe nädala jooksul. Palun uuenda neid tellimusi enne veaaruande esitamist, sest probleem võib olla juba lahendatud.">
+<!ENTITY dataCollector.description "Palun oota mõni hetk kuni Adblock Plus kogub vajalikke andmeid.">
+<!ENTITY sendButton.label "S&amp;aada teade">
+<!ENTITY comment.label "&amp;Kommentaar (valikuline):">
+<!ENTITY sendPage.errorMessage "Teate saatmine ebaõnnestus. Veakood &quot;?1?&quot;. Palun kontrolli, et su internetiühendus töötab ja proovi uuesti. Kui see probleem kordub, siis küsi abi [link]Adblock Plus foorumist[/link].">
+<!ENTITY showRecentReports.label "Näita viimati esitatud teateid">
+<!ENTITY commentPage.heading "Kommenteeri">
+<!ENTITY update.start.label "Alusta kohe uuendamist">
+<!ENTITY issues.disabledfilters.description "Järgnevad filtrid on keelatud, ent nad võivad siiski veel sellel lehel toimida:">
+<!ENTITY screenshot.description "Sama lehekülg võib erinevatel inimestel paista erinevalt. Teatele ekraanipildi lisamine võib aidata meil probleemist aru saada. Sa võid välja lõigata osad, mis sisaldavad tundlikku informatsiooni ja samuti ära märkida piirkonnad, kus probleem on märgatav. Selle tegemiseks klõpsa vastavale nupule ja vali hiirega pildi osa.">
+<!ENTITY screenshot.attach.label "P&amp;ane teatele kaasa pilt leheküljest">
+<!ENTITY issues.whitelist.description "Adblock Plus on praegu keelatud sinu poolt teatataval lehel. Palun luba see uuesti ja laadi leht uuesti enne teate saatmist, et hõlbustada selle probleemi lahendamist.">
+<!ENTITY typeSelector.falseNegative.label "Ad&amp;block Plus ei blokeeri reklaami">
+<!ENTITY typeSelector.heading "Vali probleemi liik">
+<!ENTITY anonymity.warning "Meil ei ole võimalik sinu poole tagasi pöörduda ja tõenäoliselt omistame sellele teatele madamala prioriteedi.">
+<!ENTITY wizard.title "Probleemidest teatamine">
+<!ENTITY issues.ownfilters.disable.label "Keela filter">
+<!ENTITY commentPage.description "Järgnevasse tekstivälja saad lisada oma kommentaari, et aidata meil probleemist aru saada. See ei ole kohustuslik, kuid on soovitatav kui probleem ei ole selgelt arusaadav. Sa võid samuti üle vaadata aruande andmed enne kui need ära saadetakse.">
+<!ENTITY comment.lengthWarning "Kommentaari pikkus ületab 1000 tähemärki. Ära saadetakse ainult esimesed 1000 tähemärki.">
+<!ENTITY typeSelector.falseNegative.description "Vali see variant juhul kui reklaami kuvatakse hoolimata sellest, et Adblock Plus on lubatud.">
+<!ENTITY sendPage.waitMessage "Palun oota kuni Adblock Plus edastab teadet.">
+<!ENTITY dataCollector.heading "Tere tulemast kasutama probleemidest teatamise abivahendit">
+<!ENTITY screenshot.heading "Lisa ekraanipilt">
+<!ENTITY sendPage.heading "Saada teade">
+<!ENTITY issues.subscriptionCount.description "Paistab, et sul on liiga palju filtrite tellimusi. Selline seadistus ei ole soovitatav, sest vigade tekkimise tõenäosus on nüüd palju suurem. Me ei saa ka vastu võta sinu probleemist teatamise aruannet, sest pole selge, millise filtrite tellimuse autor peab selle probleemiga tegelema. Palun kustuta kõik filtrite tellimused ja jäta alles ainult hädavajalikud ning kontrolli, kas probleem on ikka veel alles.">
+<!ENTITY screenshot.mark.label "&amp;Märgista probleem">
+<!ENTITY privacyPolicy.label "Privaatsus">
+<!ENTITY issues.description "Adblock Plus on kindlaks teinud probleemid su praeguses seadistuses, mis võivad seda probleemi põhjustada või teha selle teate uurimise keeruliseks.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/sidebar.dtd
new file mode 100644
index 0000000..3043e96
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Flash elemendi piirid">
+<!ENTITY address.label "Aadress">
+<!ENTITY context.open.label "Ava uuel kaardil">
+<!ENTITY type.label "Tüüp">
+<!ENTITY tooltip.filterSource.label "Filtri asukoht:">
+<!ENTITY noitems.label "Blokeeritavaid elemendid puuduvad">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Suurus:">
+<!ENTITY reattach.label "Haagi tagasi">
+<!ENTITY search.label "Ot&amp;sing:">
+<!ENTITY docDomain.thirdParty "(väljaspoolt)">
+<!ENTITY filterSource.label "Filtri allikas">
+<!ENTITY tooltip.docDomain.label "Dokumendi allikas:">
+<!ENTITY context.copy.label "Kopeeri elemendi aadress">
+<!ENTITY tooltip.type.label "Tüüp:">
+<!ENTITY context.disablefilter.label "Keela filter ?1?">
+<!ENTITY context.copyFilter.label "Kopeeri filter">
+<!ENTITY context.block.label "Blokeeri see element">
+<!ENTITY context.enablefilter.label "Luba taas filter ?1?">
+<!ENTITY detach.label "Haagi lahti">
+<!ENTITY whitelisted.label "Lehekülg on valges nimekirjas">
+<!ENTITY context.disablefilteronsite.label "Keela see filter domeenis ?1?">
+<!ENTITY detached.title "Adblock Plus: Blokeeritavad elemendid (lahti haagitud)">
+<!ENTITY docDomain.firstParty "(põhileht)">
+<!ENTITY tooltip.type.whitelisted "(valges nimekirjas)">
+<!ENTITY tooltip.filter.label "Kehtiv filter:">
+<!ENTITY tooltip.filter.disabled "(keelatud)">
+<!ENTITY context.editfilter.label "Muuda kehtivat filtrit">
+<!ENTITY tooltip.type.blocked "(blokeeritud)">
+<!ENTITY size.label "Suurus">
+<!ENTITY context.whitelist.label "Lisa antud elemendile erandi reegel">
+<!ENTITY context.selectAll.label "Vali kõik">
+<!ENTITY state.label "Olek">
+<!ENTITY docDomain.label "Dokumendi allikas">
+<!ENTITY tooltip.address.label "Aadress:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/subscriptionSelection.dtd
new file mode 100644
index 0000000..082ab98
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Lisa ka filtrite tellimus &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plusil ei õnnestunud alla laadida tellimuste nimekirja.">
+<!ENTITY list.download.retry "Proovi uuesti">
+<!ENTITY title.label "Tellimuse &amp;pealkiri:">
+<!ENTITY list.download.website "Külasta kodulehte">
+<!ENTITY supplementMessage "See filtrite tellimus on mõeldud kasutamiseks koos filtrite tellimusega &quot;?1?&quot; mida sa veel ei kasuta.">
+<!ENTITY viewList.label "Vaata filtreid">
+<!ENTITY visitHomepage.label "Külasta kodulehte">
+<!ENTITY addSubscription.label "Lisa tellimus">
+<!ENTITY dialog.title "Lisa Adblock Plus filtrite tellimus">
+<!ENTITY location.label "Filtrite nimekirja asukoht:">
+<!ENTITY fromWeb.description "Palun kinnita, et soovid lisada selle filtrite tellimuse. Enne lisamist saad muuta tellimuse pealkirja või asukohta.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/composer.dtd
new file mode 100644
index 0000000..ae82d94
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "helbidearen &amp;bukaeran">
+<!ENTITY domainRestriction.label "Mugatu &amp;domeinu honetara:">
+<!ENTITY collapse.default.no.label "Erabili lehenetsitakoa (ez)">
+<!ENTITY firstParty.label "Lehen es&amp;kukoa soilik">
+<!ENTITY preferences.label "&amp;Erakutsi dauden iragazkiak...">
+<!ENTITY pattern.label "Bilatu eredua">
+<!ENTITY thirdParty.label "Ka&amp;npotik jasoa soilik">
+<!ENTITY filter.label "&amp;Iragazki berria:">
+<!ENTITY collapse.label "Ko&amp;lapso blokeatuta:">
+<!ENTITY match.warning "Sartu duzun ereduak ez du blokeatu/desblokeatu nahi duzun helbidearekin bat egiten eta ez du inolako eraginik izango.">
+<!ENTITY anchor.start.label "helbidearen &amp;hasieran">
+<!ENTITY matchCase.label "Bereizi letra &amp;Larriak/xeheak">
+<!ENTITY custom.pattern.label "&amp;Pertsonalizatua:">
+<!ENTITY unselectAllTypes.label "Ez aukeratu bat ere ez">
+<!ENTITY type.whitelist.label "&amp;Salbuespen-araua">
+<!ENTITY regexp.warning "Sartu duzun eredua adierazpen erregulartzat hartuko da, Adblock Plusek ezin ditu azkar prozesatu eta honek zure nabigazioa moteldu dezake. Zure asmoa ez bazen adierazpen erregular bat erabiltzea, gehitu izarño bat (*) ereduaren bukaeran.">
+<!ENTITY dialog.title "Gehitu Adblock Plus iragazki-araua">
+<!ENTITY basic.label "Oinarrizko ikuspegia">
+<!ENTITY type.filter.label "&amp;Blokeatzeko iragazkia">
+<!ENTITY types.label "Aplikatu mota hauei:">
+<!ENTITY shortpattern.warning "Sartu duzun eredua laburregia da optimizatu ahal izateko eta zure nabigazioa moteldu dezake. Testu kate luzeago bat aukeratzea aholkatzen da Adblock Plusek azkarrago prozesatu dezan.">
+<!ENTITY collapse.yes.label "Bai">
+<!ENTITY anchors.label "Onartu eredua soilik:">
+<!ENTITY collapse.default.yes.label "Erabili lehenetsitakoa (bai)">
+<!ENTITY domainRestriction.help "Erabili aukera hau domeinu bat edo gehiago zehazteko marra bertikal batez banatuta (|). Iragazkia aukeratutako domeinuetan erabiliko da soilik. Gehitu tilet bat (~) domeinuaren aurretik domeinu horretan iragazkia ez erabiltzeko.">
+<!ENTITY accept.label "Gehitu iragazkia">
+<!ENTITY options.label "Aukerak">
+<!ENTITY disabled.warning "Adblock Plus orain desgaituta dago. Iragazkiak gehitu ditzakezu baina ez dira aplikatuko ez baduzu [link]Adblock Plus gaitzen[/link].">
+<!ENTITY anchor.start.flexible.label "domeinu izenaren &amp;hasieran">
+<!ENTITY collapse.no.label "Ez">
+<!ENTITY selectAllTypes.label "Aukeratu denak">
+<!ENTITY advanced.label "Ikuspegi aurreratua">
+<!ENTITY pattern.explanation "Eredua helbidearen edozein atal izan daiteke; izarñoa (*) komodin lanak egiten ditu, zernahitarako balio du. Iragazkia soilik aplikatuko da ereduarekin bat datozen helbideetan.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/filters.dtd
new file mode 100644
index 0000000..71aabc9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/filters.dtd
@@ -0,0 +1,73 @@
+<!ENTITY restore.custom.warning "Zure iragazki pertsonal guztiak aukeratutako fitxategiko edukiarekin ordeztuko dira. Aurrera jarraitu nahi duzu?">
+<!ENTITY slow.column "Iraga&amp;zki motelak">
+<!ENTITY enabled.column "&amp;Gaituta">
+<!ENTITY subscription.lastDownload.checksumMismatch "Errorea; kontrol-baturak ez datoz bat">
+<!ENTITY noFiltersInGroup.text "Aukeratutako taldea hutsik dago">
+<!ENTITY subscription.actions.label "Ekintzak">
+<!ENTITY filter.selectAll.label "Denak aukeratu">
+<!ENTITY backupButton.label "Segu&amp;rtasun kopia eta berrezartzea">
+<!ENTITY restore.minVersion.warning "Oharra: fitxategi hau Adblock Plusen bertsio berriago batekin sortu da. Adblock Plus azken bertsiora eguneratu beharko zenuke fitxategi hau berrezarri aurretik.">
+<!ENTITY restore.error "Fitxategiko datuak ezin dira prozesatu, agian ez da Adblock Plus segurtasun kopia bat?">
+<!ENTITY sort.ascending.label "&amp;A &gt; Z ordena">
+<!ENTITY sort.label "Ordenatu honen ara&amp;bera">
+<!ENTITY subscription.source.label "Iragazki zerrenda">
+<!ENTITY hitcount.column "&amp;Bategiteak">
+<!ENTITY noFilters.text "Ez duzu pertsonalizatutako iragazkirik oraindik.">
+<!ENTITY backup.custom.title "Iragazki pertsonalak soilik">
+<!ENTITY subscription.external.label "Beste gehigarri batek eguneratua">
+<!ENTITY subscription.delete.label "Ezabatu">
+<!ENTITY noGroupSelected.text "Iragazki talde bat aukeratu behar duzu bere iragazkiak ikusi ahal izateko">
+<!ENTITY filter.cut.label "Moztu">
+<!ENTITY restore.default.label "?1? segurtasun kopiatik berrezarri">
+<!ENTITY subscription.lastDownload.inProgress "Deskargatzen...">
+<!ENTITY subscriptions.tab.label "Iragazki harpidetzak">
+<!ENTITY sort.descending.label "&amp;Z &gt; A ordena">
+<!ENTITY filters.remove.warning "Benetan ezabatu nahi dituzu aukeratutako iragazkiak?">
+<!ENTITY filter.delete.label "Ezabatu">
+<!ENTITY addSubscriptionAdd.label "Gehitu">
+<!ENTITY viewMenu.label "Ikusi">
+<!ENTITY subscription.lastDownload.unknown "Ez erabilgarri">
+<!ENTITY addSubscriptionCancel.label "Utzi bertan behera">
+<!ENTITY subscription.enabled.label "Gaituta">
+<!ENTITY noSubscriptions.text "Ez duzu harpidetzarik gehitu oraindik. Adblock Plusek du ezer blokeatuko iragazkirik gabe; mesedez, erabili &quot;Gehitu iragazki harpidetza&quot;
+ iragazkiak gehitzeko.">
+<!ENTITY subscription.update.label "Eguneratu iragazkiak">
+<!ENTITY dialog.title "Adblock Plus iragazki hobespenak">
+<!ENTITY addFilter.label "Gehitu iraga&amp;zkia">
+<!ENTITY subscription.minVersion.warning "Iragazki harpidetzak Adblock Plus bertsio berria behar du, azken bertsiora eguneratu beharko zenuke Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Huts egin du; ez da helbide baliagarria">
+<!ENTITY backup.error "Iragazkiak fitxategira idazteak errore bat gertatu da. Egiaztatu fitxategian idaztea dagoela eta ez duela beste aplikazio batek blokeatu.">
+<!ENTITY filter.moveUp.label "Igo">
+<!ENTITY addGroup.label "Gehitu &amp;talde iragazkia">
+<!ENTITY filter.edit.label "Editatu">
+<!ENTITY subscription.showHideFilters.label "Erakutsi/ezkutatu iragazkiak">
+<!ENTITY acceptableAds2.label "Baimendu publizitate ez &amp;intrusiboa">
+<!ENTITY addSubscriptionOther.label "Gehitu beste harpidetza bat">
+<!ENTITY close.label "Itxi">
+<!ENTITY sort.none.label "Ordenatu &amp;gabe">
+<!ENTITY filter.actions.label "Iragazki ekintzak">
+<!ENTITY filter.copy.label "Kopiatu">
+<!ENTITY filter.moveDown.label "Jaitsi">
+<!ENTITY filter.resetHitCounts.label "Garbitu bategite estatistikak">
+<!ENTITY readMore.label "Gehiago irakurri">
+<!ENTITY subscription.moveUp.label "Igo">
+<!ENTITY addSubscription.label "Geh&amp;itu iragazki harpidetza">
+<!ENTITY subscription.homepage.label "Hasiera orria">
+<!ENTITY backup.complete.title "Iragazki eta harpidetza guztiak">
+<!ENTITY restore.own.label "Segurtasun kopia propioa berrezarri">
+<!ENTITY restore.complete.warning "Zure iragazki hobespen guztiak aukeratutako fitxategiko edukiarekin ordeztuko dira. Aurrera jarraitu nahi duzu?">
+<!ENTITY filters.tab.label "Pertsonalizatutako iragazkiak">
+<!ENTITY backup.label "Sortu segurtasun kopia berria">
+<!ENTITY find.label "&amp;Bilatu">
+<!ENTITY subscription.moveDown.label "Jaitsi">
+<!ENTITY subscription.lastDownload.connectionError "Huts egin du; deskarga errorea">
+<!ENTITY subscription.lastDownload.success "Ongi">
+<!ENTITY subscription.lastDownload.invalidData "Huts egin du; ez da iragazki zerrenda baliagarria">
+<!ENTITY filter.paste.label "Itsatsi">
+<!ENTITY subscription.disabledFilters.enable "Gaitu desgaitutako iragazkiak">
+<!ENTITY lasthit.column "&amp;Azken bategitea">
+<!ENTITY subscription.editTitle.label "Editatu izenburua">
+<!ENTITY subscription.disabledFilters.warning "Harpidetza honetako iragazki batzuk desgaituta daude.">
+<!ENTITY filter.column "&amp;Iragazki araua">
+<!ENTITY subscription.lastDownload.label "Azken deskarga:">
+<!ENTITY viewList.label "Ikusi zerrenda">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/firstRun.properties
new file mode 100644
index 0000000..86b4926
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Jarraitzea blokeatuz pribatuki nabigatu - Zure nondik norakoak dena jakin nahi duten publizitate konpainiei ezkutatuz.
+firstRun_toggle_off=EZGAITUA
+firstRun_feature_tracking=Ezgaitu jarraipena
+firstRun_feature_malware=Programa kaltegarriak geldiarazi
+firstRun_title=Adblock Plus instalatu da
+firstRun_acceptableAdsExplanation=Webguneak publizitate zintzoa eta ez intrusiboa erabiltzera bultzatu nahi ditugu. Horregatik <a>arau zorrotzak</a> ezarri ditugu iragarki onargarriak bereizteko, lehenetsitako hobespenetan daude ikusgai. Iragarki guztiak blokeatu nahi badituzu aukera hau <a>desgaitu</a> dezakezu.
+firstRun_toggle_on=GAITUA
+firstRun_contributor_credits=Parte-hartzaileen kredituak
+firstRun_dataCorruptionWarning=Orri hau behin eta berriro agertzen dela? <a>Egin klik hemen!</a>
+firstRun_acceptableAdsHeadline=Iragarki gogaikarriak blokeatuko dira orain
+firstRun_share=Esan zure lagunei
+firstRun_share_headline=<a>Lagundu gaitzazu</a> web-a hobetzen
+firstRun_features=Adblock Plus iragarkiak blokeatzea baino gehiago egin dezake
+firstRun_feature_malware_description=Malware domeinuak blokeatuz zure nabigazioa ziurragoa egin.
+firstRun_feature_social_description=Automatikoki kendu gizarte sare botoiak webguneetatik, Facebook Like kasu, zure nondik norakoak gordetzen dituzten webguneetan agertu ohi dira.
+firstRun_donate=diruz lagundu
+firstRun_donate_label=Babestu gure proiektua
+firstRun_feature_social=Kendu gizarte-sareetako botoiak
+firstRun_legacySafariWarning=Adblock Plus-ekin bateragarria ez den Safari nabigatzailearen bertsio zahar bat erabiltzen ari zara. Agian ez da behar bezala ibiliko, edo webgune batzuen erabilera oztopatuko du. Mesedez Safari 6.11 edo berriagoa den bertsio batetara eguneratu (Mac OS X 10.8 Mountain Lion bertsiotik aurrera eskuragarri dago) edo Safari 7.0.1 (OS X 10.9 Mavericks bertsioan), edo erabili Mozilla Firefox, Google Chrome edo Opera nabigatzaileen azken bertsioa.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/global.properties
new file mode 100644
index 0000000..1dc9c84
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Ez dago elementu blokeagarririk uneko orrian
+action3_tooltip=Egin klik Adblock Plus gaitzeko/desgaitzeko.
+type_label_script=scripta
+filter_elemhide_nocriteria=Ez da zehaztu ezkutatu beharreko elementua aurkitzeko irizpiderik
+blockingGroup_title=Publizitatea blokeatzeko arauak
+whitelisted_tooltip=Adblock Plus orri honetan desgaituta dago.
+type_label_stylesheet=estilo orria
+blocked_count_tooltip=?1? / ?2?
+type_label_font=letra-tipoa
+type_label_popup=pop-up leihoa
+filter_regexp_tooltip=Iragazki hau adierazpen erregular bat da edo optimizatzeko laburregia da. Honelako iragazki gehiegik nabigazioa motelduko dute.
+action0_tooltip=Egin klik testuinguru menua atera dadin; egin erdiko klika gaitzeko/desgaitzeko.
+whitelisted_page=Adblock Plus ezgaitu egin da uneko orrirako
+remove_group_warning=Ziur talde hau ezabatu nahi duzula?
+action1_tooltip=Egin klik elementu blokeagarriak irekitzeko/ixteko; egin erdiko klika gaitzeko/desgaitzeko.
+type_label_xmlhttprequest=XML eskakizuna
+active_tooltip=Adblock Plus gaituta dago, ?1? iragazki harpidetza eta ?2? iragazki pertsonal erabiliz.
+type_label_document=dokumentua
+type_label_object_subrequest=objektu azpieskakizuna
+whitelistGroup_title=Salbuespen arauak
+disabled_tooltip=Adblock Plus ezgaituta dago.
+filter_elemhide_duplicate_id=Ezkutatu beharreko elementuaren ID bakarra zehaztu daiteke
+type_label_object=objektua
+action2_tooltip=Egin klik hobespenak irekitzeko, egin erdiko klika gaitzeko/desgaitzeko.
+type_label_subdocument=markoa
+clearStats_warning=Honek bategite estatistika guztiak ezabatuko ditu eta iragazkien bategiteak zenbatzeari utziko zaio. Aurrera jarraitu nahi duzu?
+blocked_count_addendum=(baita baimenduta: ?1?, ezkutuan: ?2?)
+subscription_invalid_location=Iragazki zerrendaren kokagunea ez da balio duen URLa, ezta fitxategi baten izena ere.
+type_label_image=irudia
+remove_subscription_warning=Ziur harpidetza hau ezabatu nahi duzula?
+type_label_other=beste bat
+mobile_menu_enable=ABP: Gaitua
+type_label_media=audioa/bideoa
+mobile_menu_disable_site=ABP: Desgaitua ?1? horretan
+elemhideGroup_title=Elementuak ezkutatzeko arauak
+mobile_menu_enable_site=ABP: Gaitua ?1? horretan
+type_label_elemhide=ezkutuan
+newGroup_title=Iragazki talde berria
+default_dialog_title=Adblock Plus
+notification_antiadblock_title=Hide targeted messages?
+notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages?
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/overlay.dtd
new file mode 100644
index 0000000..21efd6c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY sync.label "&amp;Sinkronizatu Adblock Plus ezarpenak">
+<!ENTITY whitelist.site.label "Ezgaitu hemen: ?1?">
+<!ENTITY filters.label "&amp;Iragazki hobespenak">
+<!ENTITY disable.label "Ezgaitu edonon">
+<!ENTITY objecttab.title "Blokeatu">
+<!ENTITY objecttab.tooltip "Egin klik hemen objektu hau Adblock Plusekin blokeatzeko">
+<!ENTITY menuitem.label "Adbloc&amp;k Plus hobespenak">
+<!ENTITY objecttabs.label "Erakutsi &amp;fitxak Flash eta Javan">
+<!ENTITY sendReport.label "Orri hone&amp;tan sortutako arazo bati buruzko txostena egin">
+<!ENTITY whitelist.page.label "Ezgaitu orri honetan soilik">
+<!ENTITY context.image.label "Adblock Plus: Irudia blokeatu">
+<!ENTITY counthits.label "Zenbatu iragazkien &amp;bategiteak">
+<!ENTITY opensidebar.label "Ire&amp;ki elementu blokeagarriak">
+<!ENTITY contribute.label "Adblock Plus-en parte hartu">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Markoa blokeatu">
+<!ENTITY blocked.tooltip "Orri honetan blokeatutako elementuak:">
+<!ENTITY hideplaceholders.label "Ezkutatu blokeatutako elementuen &amp;kokagunea">
+<!ENTITY showinstatusbar.label "Erakutsi &amp;egoera-barran">
+<!ENTITY sidebar.title "Elementu blokeagarriak uneko orrialdean">
+<!ENTITY options.label "&amp;Aukerak">
+<!ENTITY context.object.label "Adblock Plus: Objektua blokeatu">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Bergaitu orri honetan">
+<!ENTITY filters.tooltip "Iragazki aktiboenak:">
+<!ENTITY closesidebar.label "Itxi elementu blo&amp;keagarriak">
+<!ENTITY showintoolbar.label "Erakutsi &amp;tresna-barran">
+<!ENTITY status.tooltip "Egoera:">
+<!ENTITY context.media.label "Adblock Plus: audio/bideoa blokeatu">
+<!ENTITY subscription.update.label "Eguneratu iragazkiak">
+<!ENTITY notification.button.yes "&amp;Yes">
+<!ENTITY notification.button.no "&amp;No">
+<!ENTITY notification.button.close "&amp;Close">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/sendReport.dtd
new file mode 100644
index 0000000..91e07fb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/sendReport.dtd
@@ -0,0 +1,66 @@
+<!ENTITY screenshot.undo.label "&amp;Desegin">
+<!ENTITY issues.disabledgroups.description "Hurrengo iragazki harpidetzak / iragazki taldeak ezgaituta daude, hala ere orri honetan eragina izan dezakete:">
+<!ENTITY showData.label "Erakutsi txostenaren informazioa">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus gehigarria behar baino gehia&amp;go blokeatzen ari da">
+<!ENTITY issues.change.description "Zure konfigurazioa aldatu da. Mesedez birkargatu orria aldaketak egiaztatzeko eta bidali txostena arazoa konpondu ez bada.">
+<!ENTITY email.label "E-&amp;Posta:">
+<!ENTITY issues.openPreferences.label "Ireki iragazki hobespenak">
+<!ENTITY sendPage.confirmation "Zure txostena gorde egin da. Honako helbidean eskuratu dezakezu:">
+<!ENTITY copyLink.label "Ko&amp;piatu txostenaren lotura">
+<!ENTITY issues.nofilters.description "Adblock Plus ez dago ezer blokeatzen oraingo orrian. Ikusten duzun arazoa ziurrenez ez du Adblock Plusekin erlaziorik.">
+<!ENTITY sendPage.knownIssue "Aipatu duzun arazoa ziur aski ezaguna da jada. Informazio gehiago:">
+<!ENTITY typeSelector.other.description "Aukeratu hau arazoa Adblock Plus berak duela uste baduzu, eta ez iragazkiek.">
+<!ENTITY issues.disabledgroups.enable.label "Gaitu iragazki harpidetza / iragazki taldea">
+<!ENTITY typeWarning.override.label "Ulertzen dut eta txostena bidali na&amp;hi dut hala ere">
+<!ENTITY issues.disabled.enable.label "Gaitu Adblock Plus">
+<!ENTITY update.fixed.description "Baliteke zure iragazki harpidetzak eguneratzeak arazoa konpondu izana. Mesedez birkargatu orria eta berriro saiatu, arazoa berean badirau berriro zapaldu Berri eman botoia.">
+<!ENTITY anonymous.label "Bidalketa anonimoa">
+<!ENTITY reloadButton.label "Bi&amp;rkargatu orria">
+<!ENTITY recentReports.clear.label "E&amp;zabatu txosten guztiak">
+<!ENTITY typeSelector.description "Leiho honek Adblock Plus arazo txosten bat bidaltzeko beharrezkoak diren urratsetan zehar gidatuko zaitu. Hasteko, mesedez aukeratu orri honetan pairatzen duzun arazo mota aukeratu:">
+<!ENTITY screenshot.remove.label "Kendu info&amp;rmazio sentsiblea">
+<!ENTITY issues.ownfilters.description "Orri honetan erabilitako iragazki batzuk erabiltzaileak sortutakoak dira. Mesedez ezgaitu arazoa sor lezaketen iragazkiak:">
+<!ENTITY update.inProgress.description "Adblock Plusek zure iragazki harpidetzak eguneratu behar ditu arazoa dagoeneko konponduta dagoen egiaztatzeko. Mesedez itxaron...">
+<!ENTITY sendPage.retry.label "Bidali berriro">
+<!ENTITY data.label "Txostenaren informa&amp;zioa:">
+<!ENTITY recentReports.label "Orain dela gutxi bidalitako txostenak">
+<!ENTITY typeWarning.description "Adblock Plusen arazo orokor, baten txostena egin nahi duzula esan duzu, ez iragazkiena. Jabetu zaitez arazo horien berri emateko hobe dela [link]Adblock Plus forum[/link] foroa erabiltza. Arazoen txosten bidalketa erabili soilik badagoen eztabaida bati eransteko, inork ez duelako zure txostena ikusiko lotura bat ematen ez baduzu. Automatikoki sortutako lotura bat emango zaizu txostena bidali eta gero.">
+<!ENTITY issues.disabled.description "Adblock Plus ezgaituta dago, ez du ezer blokeatuko oraingo egoeran.">
+<!ENTITY attachExtensions.label "Erant&amp;si gehigarri aktiboen zerrenda bat txostenera hauen arteko konfliktoak arazoa sor balezakete">
+<!ENTITY issues.nosubscriptions.add.label "Gehitu iragazki harpidetza">
+<!ENTITY issues.disabledfilters.enable.label "Gaitu iragazkia">
+<!ENTITY issues.override.label "&amp;Konfigurazioa zuzena da, jarraitu txostenarekin">
+<!ENTITY issues.nosubscriptions.description "Antza denez ez zara harpidetu webguneetatik nahi ez dituzun edukiak automatikoki ezabatzen duten aurrez egindako zerrendetara.">
+<!ENTITY typeSelector.falsePositive.description "Aukeratu hau orrian informazio garrantzitsua falta bada, gaizki ikusten bada edo ez badabil behar bezala .
+ Adblock Plus une batez desgaituz erruduna den egiaztatu dezakezu.">
+<!ENTITY typeSelector.other.label "Beste zerba&amp;it">
+<!ENTITY emailComment.label "Eposta helbide zuzen bat idaztea aholkatzen dizugu, zurekin kontaktuan jarri ahal izateko galderarik badugu. Zure parte hartze orokorra antzeman eta lehentasunez tratatzea baimentzen digu ere.">
+<!ENTITY issues.whitelist.remove.label "Birgaitu Adblock Plus orri honetan">
+<!ENTITY outdatedSubscriptions.description "Hurrengo iragazki harpidetzak ez dira eguneratu bi astetan gutxienez. Mesedez eguneratu harpidetza hauek txosten bat bidali aurretik, baliteke arazoa jada konponduta egotea.">
+<!ENTITY dataCollector.description "Mesedez itxaron Adblock Plusek beharrezko informazioa jaso bitartean.">
+<!ENTITY sendButton.label "Txostena &amp;bidali">
+<!ENTITY comment.label "&amp;Iruzkina (aukerazkoa):">
+<!ENTITY sendPage.errorMessage "Txostena bidaltzeko saiakerak huts egin du hurrengo errore kodearekin &quot;?1?&quot;. Mesedez egiaztatu Internetera konektatuta zaudela eta saia zaitez berriro. Arazoa ez bada konpontzen eskatu laguntza [link]Adblock Plus forum[/link] foroan.">
+<!ENTITY showRecentReports.label "Erakutsi orain dela gutxi bidalitako txostenak">
+<!ENTITY commentPage.heading "Sartu iruzkina">
+<!ENTITY update.start.label "Hasi eguneraketa orain">
+<!ENTITY issues.disabledfilters.description "Hurrego iragazkiak ezgaituta daude, hala ere orri honetan eragina izan dezakete:">
+<!ENTITY screenshot.description "Orri bera ez dute berdin ikusiko pertsona guztiek. Pantaila argazki bat eransteak arazoa ulertzen lagundu ahal digu. Ken ditzakezu Informazio sentsiblea duten atalak eta markatu arazoa nabaria duten atalak. Hori egiteko, egin klik dagokion botoian eta aukeratu zonaldea saguarekin.">
+<!ENTITY screenshot.attach.label "Geh&amp;itu irudia txostenera">
+<!ENTITY issues.whitelist.description "Adblock Plus orain desgaituta dago txosnenaren orrian. Mesedez berriz gaitu eta orria birkargatu txostena bidali aurretik arazoaren ikerketa errazteko.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plusek ez du &amp;iragarki bat blokeatzen">
+<!ENTITY typeSelector.heading "Aukeratu arazo mota">
+<!ENTITY anonymity.warning "Ezin izango gara zurekin kontatuan jarri eta ziurrenez lehentasun gutxiago emango diogu txosten honi.">
+<!ENTITY wizard.title "Arazoaren txostena bidali da">
+<!ENTITY issues.ownfilters.disable.label "Iragazkia ezgaitu">
+<!ENTITY commentPage.description "Beheko testu eremuak guk arazoa hobeto ulertzeko iruzkin bat sartzea baimentzen dizu. Hau aukerazkoa da baina gomendagarria arazoa begi-bistakoa ez bada. Gainera, txostenaren informazioa gainbegiratu dezakezu bidali aurretik.">
+<!ENTITY comment.lengthWarning "Iruzkinak 1000 karaktere baino gehiago ditu. Lehen 1000 karaktereak bidaliko dira soilik.">
+<!ENTITY typeSelector.falseNegative.description "Aukeratu hau publizitatea agertzen bada Adblock Plus gaituta egonda ere.">
+<!ENTITY sendPage.waitMessage "Mesedez itxaron Adblock Plus zure txostena bidaltzen duen bitartean.">
+<!ENTITY dataCollector.heading "Ongi etorri arazoen txosten bidalketara">
+<!ENTITY screenshot.heading "Erantsi pantaila argazkia">
+<!ENTITY sendPage.heading "Bidali txostena">
+<!ENTITY issues.subscriptionCount.description "Antza denez iragazki harpidetza gehiegitara harpidetu zara. hau ez da gomendagarria arazoak izateko aukera geihago suposatzen duelako. Gainera ezin dugu zure txostena onartu ez dagoelako argi zein iragazki egilek egin behar duen ezer. Mesedez ezabatu ezinbestekoak ez diren iragazki harpidetzak eta egiaztatu arazoa oraindik gertatzen den.">
+<!ENTITY screenshot.mark.label "Arazoa &amp;markatu">
+<!ENTITY privacyPolicy.label "Pribatutasun politika">
+<!ENTITY issues.description "Adblock Plusek arazo honen errudun izan daitezken edo txosten hau ikerkertzea zaildu dezaketen arazoak aurkitu ditu zure konfigurazioan.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/sidebar.dtd
new file mode 100644
index 0000000..9fd57a8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Flash elementuaren ertzak">
+<!ENTITY address.label "Helbidea">
+<!ENTITY context.open.label "Ireki fitxa berri batean">
+<!ENTITY type.label "Mota">
+<!ENTITY tooltip.filterSource.label "Iragazki iturria:">
+<!ENTITY noitems.label "Ez dago elementu blokeagarririk">
+<!ENTITY filter.label "Iragazkia">
+<!ENTITY tooltip.size.label "Tamaina:">
+<!ENTITY reattach.label "Lotu">
+<!ENTITY search.label "&amp;Bilatu:">
+<!ENTITY docDomain.thirdParty "(kanpo iturria)">
+<!ENTITY filterSource.label "Iragazki iturria">
+<!ENTITY tooltip.docDomain.label "Dokumentuaren iturria:">
+<!ENTITY context.copy.label "Kopiatu elementuaren helbidea">
+<!ENTITY tooltip.type.label "Mota:">
+<!ENTITY context.disablefilter.label "Ezgaitu ?1? iragazkia">
+<!ENTITY context.copyFilter.label "Kopiatu iragazkia">
+<!ENTITY context.block.label "Blokeatu elementu hau">
+<!ENTITY context.enablefilter.label "Gaitu ?1? iragazkia">
+<!ENTITY detach.label "Askatu">
+<!ENTITY whitelisted.label "Onartutako orria">
+<!ENTITY context.disablefilteronsite.label "Ezgaitu iragazki hau ?1? domeinuan">
+<!ENTITY detached.title "Adblock Plus: Elementu blokeagarriak (askatua)">
+<!ENTITY docDomain.firstParty "(lehen eskukoa)">
+<!ENTITY tooltip.type.whitelisted "(onartua)">
+<!ENTITY tooltip.filter.label "Iragazki aktiboa:">
+<!ENTITY tooltip.filter.disabled "(ezgaitua)">
+<!ENTITY context.editfilter.label "Editatu iragazki aktiboa">
+<!ENTITY tooltip.type.blocked "(blokeatuta)">
+<!ENTITY size.label "Tamaina">
+<!ENTITY context.whitelist.label "Gehitu salbuespen-araua elementuarentzat">
+<!ENTITY context.selectAll.label "Aukeratu denak">
+<!ENTITY state.label "Egoera">
+<!ENTITY docDomain.label "Dokumentu iturria">
+<!ENTITY tooltip.address.label "Helbidea:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/subscriptionSelection.dtd
new file mode 100644
index 0000000..0442e3f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Ge&amp;hitu &quot;?1?&quot; iragazki harpidetza ere">
+<!ENTITY list.download.failed "Adblock Plusek ezin izan du harpidetza zerrenda eskuratu">
+<!ENTITY list.download.retry "Saiatu berriro">
+<!ENTITY title.label "Harp&amp;idetza izenburua:">
+<!ENTITY list.download.website "Ikusi webgunea">
+<!ENTITY supplementMessage "Iragazki harpidetza hau &quot;?1?&quot; iragazki harpidetzarekin batera erabiltzekoa da eta zuk ez duzu oraindik erabiltzen.">
+<!ENTITY viewList.label "Ikusi iragazkiak">
+<!ENTITY visitHomepage.label "Bisitatu hasiera orria">
+<!ENTITY addSubscription.label "Gehitu harpidetza">
+<!ENTITY dialog.title "Gehitu Adblock Plus iragazki harpidetza">
+<!ENTITY location.label "Iragaz&amp;ki zerrendaren kokagunea:">
+<!ENTITY fromWeb.description "Mesedez berretsi iragazki harpidetza hau gehitu nahi duzula. Harpidetza izenburua eta kokagunea aldatu ditzakezu gehitu aurretik.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/composer.dtd
new file mode 100644
index 0000000..dc68759
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "در پایا&amp;ن نشانی">
+<!ENTITY domainRestriction.label "مح&amp;دود به دامنه :">
+<!ENTITY collapse.default.no.label "Ø§Ø³ØªÙØ§Ø¯Ù‡ Ù¾ÛŒØ´ÙØ±Ø¶ (خیر)">
+<!ENTITY firstParty.label "Ùقط او&amp;لین عضو">
+<!ENTITY preferences.label "نمایش پالایه های موجود...">
+<!ENTITY pattern.label "جستجو برای الگوی">
+<!ENTITY thirdParty.label "Ùقط سو&amp;مین عضو">
+<!ENTITY filter.label "پالایه جدید:">
+<!ENTITY collapse.label "بس&amp;تن مسدود شده ها:">
+<!ENTITY match.warning "الگویی Ú©Ù‡ وارد کرده اید دیگر با نشانی Ú©Ù‡ قصد مسدود کردن/Ø§ÙØ²ÙˆØ¯Ù† به Ùهرست سÙید آن را داشته اید مطابقت ندارد Ùˆ روی آن تاثیر نمی گزارد.">
+<!ENTITY anchor.start.label "در آ&amp;غاز نشانی">
+<!ENTITY matchCase.label "م&amp;طابقت حالت (بزرگی کوچکی)">
+<!ENTITY custom.pattern.label "س&amp;ÙØ§Ø±Ø´ÛŒ:">
+<!ENTITY unselectAllTypes.label "انتخاب هیچکدام">
+<!ENTITY type.whitelist.label "قاعده است&amp;ثنا">
+<!ENTITY regexp.warning "الگویی Ú©Ù‡ شما وارد کرده اید یک نویسه مرتب ØªÙØ³ÛŒØ± Ù…ÛŒ شود Ú©Ù‡ نمی تواند به صورت بهینه توسط Ùوق تبلیغ Ø´Ú©Ù† پردازش شود Ùˆ ممکن است مرور ØµÙØ­Ø§Øª شمار را کند کند. اگر شما قصد Ø§Ø³ØªÙØ§Ø¯Ù‡ کردن از یک نویسه مرتب را نداشته اید، یک ستار (*) به انتهای الگوی خود اضاÙÙ‡ کنید.">
+<!ENTITY dialog.title "اضاÙÙ‡ کردن قاعد Ùیلتر ادبلاک پلاس">
+<!ENTITY basic.label "نمایش پایه">
+<!ENTITY type.filter.label "Ùیلتر Ù…&amp;سدود کننده">
+<!ENTITY types.label "اعمال به انواع:">
+<!ENTITY shortpattern.warning "الگویی Ú©Ù‡ وارد کردید بسیار کوتاه تر از آن است Ú©Ù‡ بهینه باشد Ùˆ ممکن است سرعت مرور ØµÙØ­Ø§Øª شما را کند کند. توصیه Ù…ÛŒ شود Ú©Ù‡ جمله طویل تری را وارد کنید Ú©Ù‡ Ùوق تبلیغ Ø´Ú©Ù† بهتر بتواند آن را پردازش کند.">
+<!ENTITY collapse.yes.label "بله">
+<!ENTITY anchors.label "Ùقط پذیرش الگو:">
+<!ENTITY collapse.default.yes.label "Ø§Ø³ØªÙØ§Ø¯Ù‡ Ù¾ÛŒØ´ÙØ±Ø¶ (بله)">
+<!ENTITY domainRestriction.help "از این گزینه برای مشخص کردن یک یا چند دامنه از هم جدا شده توسط نوار خط (|) Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید. پالایه تنها برای دامنه(ها)ÛŒ انتخاب شده اعمال Ù…ÛŒ شود. علامت مد (~) قبل از نام دامنه نشاندهنده آن است Ú©Ù‡ پالایه در آن دامنه اعمال نشود.">
+<!ENTITY accept.label "Ø§ÙØ²ÙˆØ¯Ù† Ùیلتر">
+<!ENTITY options.label "گزینه ها">
+<!ENTITY disabled.warning "Ùوق تبلیغ Ø´Ú©Ù† هم اکنون غیر ÙØ¹Ø§Ù„ Ù…ÛŒ یاشد. شما هنوز Ù…ÛŒ توانید پالایه اضاÙÙ‡ کنید، اما آنها اعمال نمی شوند مگر [link]Ùوق تبلیغ Ø´Ú©Ù† را ÙØ¹Ø§Ù„ کنید[/link].">
+<!ENTITY anchor.start.flexible.label "در آ&amp;غاز نام دامنه">
+<!ENTITY collapse.no.label "خیر">
+<!ENTITY selectAllTypes.label "انتخاب همه">
+<!ENTITY advanced.label "نمایش Ù¾ÛŒØ´Ø±ÙØªÙ‡">
+<!ENTITY pattern.explanation "الگو Ù…ÛŒ تواند هر قسمتی از نشانی باشد; ستاره (*) بعنوان نویسه عام عمل Ù…ÛŒ کند. پالایه Ùقط به نشانی مطابق الگوی ارائه شده اعمال Ù…ÛŒ شود.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/filters.dtd
new file mode 100644
index 0000000..2f4d957
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "میخواهید تمامی Ùیلترهای Ø³ÙØ§Ø±Ø´ÛŒ خود را با محتویات ÙØ§ÛŒÙ„ انتخاب شده جایگزین Ù…ÛŒ شود؟">
+<!ENTITY slow.column "&amp;نمایش Ùیلترها">
+<!ENTITY enabled.column "Ù&amp;عال‌">
+<!ENTITY subscription.lastDownload.checksumMismatch "ناموÙÙ‚, عدم تطابق کنترلی">
+<!ENTITY noFiltersInGroup.text "گروه انتخاب شده خالی می باشد.">
+<!ENTITY subscription.actions.label "اقدامات">
+<!ENTITY filter.selectAll.label "انتخاب همه">
+<!ENTITY backupButton.label "پشتیبان گیری و بازیابی (&amp;B)">
+<!ENTITY restore.minVersion.warning "هشدار: این ÙØ§ÛŒÙ„ با نسخه جدیدتری از برنامه ایجاد شده است. قبل از بازگرداندن از این ÙØ§ÛŒÙ„ شما باید برنامه را بروز کنید.">
+<!ENTITY restore.error "ÙØ§ÛŒÙ„ اطلاعات قابل پردازش نیست، شاید این ÙØ§ÛŒÙ„ پشتیبان برنامه نمی باشد؟">
+<!ENTITY sort.ascending.label "ترتیب حرو٠&amp;ال٠با از ابتدا">
+<!ENTITY sort.label "مرتب کردن بر ا&amp;ساس">
+<!ENTITY subscription.source.label "لیست Ùیلتر">
+<!ENTITY hitcount.column "بر&amp;خورد ها">
+<!ENTITY noFilters.text "شما هیچ Ùیلتر شخصی ایجاد نکرده اید.">
+<!ENTITY backup.custom.title "Ùقط Ùیلتر های Ø³ÙØ§Ø±Ø´ÛŒ">
+<!ENTITY subscription.external.label "با پسوند دیگری به روز شده">
+<!ENTITY subscription.delete.label "حذÙ">
+<!ENTITY noGroupSelected.text "شما قبل ازاین Ú©Ù‡ Ùیلترها نمایش داده شوند نیاز به انتخاب گروه Ùیلتر دارید.">
+<!ENTITY filter.cut.label "برش">
+<!ENTITY restore.default.label "بازیابی پشتیبان از ?1?">
+<!ENTITY subscription.lastDownload.inProgress "در حال Ø¯Ø±ÛŒØ§ÙØª...">
+<!ENTITY subscriptions.tab.label "Ùیلتر زیرنوشت ها">
+<!ENTITY sort.descending.label "&amp;ترتیب حرو٠ال٠با از انتها">
+<!ENTITY filters.remove.warning "آیا واقعاً Ù…ÛŒ خواهید تمامی Ùیلترهای انتخابی را حذ٠کنید؟">
+<!ENTITY filter.delete.label "حذÙ">
+<!ENTITY addSubscriptionAdd.label "اضاÙÙ‡">
+<!ENTITY viewMenu.label "نما">
+<!ENTITY subscription.lastDownload.unknown "(تعری٠نشده)">
+<!ENTITY addSubscriptionCancel.label "لغو">
+<!ENTITY subscription.enabled.label "ÙØ¹Ø§Ù„ شده">
+<!ENTITY noSubscriptions.text "شما هنوز هیچ اشتراک Ùیلتری را اضاÙÙ‡ نکردید. Adblock Plus هیچ چیزی را بدون Ùیلترها مسدود نمی کند, Ù„Ø·ÙØ§ با Ø§Ø³ØªÙØ§Ø¯Ù‡ از &quot;Ø§ÙØ²ÙˆØ¯Ù† اشتراک Ùیلتر&quot; چند Ùیلتر اضاÙÙ‡ کنید.">
+<!ENTITY subscription.update.label "به روز رسانی Ùیلتر">
+<!ENTITY dialog.title "تنظیمات Ùیلتر Adblock Plus">
+<!ENTITY addFilter.label "Ø§ÙØ²ÙˆØ¯Ù† Ùیلتر (&amp;d)">
+<!ENTITY subscription.minVersion.warning "این Ùیلتر اشتراک نیاز به نسخه جدید برنامه دارد، شما باید برنامه را به آخرین نگارش به روز کنید.">
+<!ENTITY subscription.lastDownload.invalidURL "ناموÙÙ‚ØŒ نشانی معتبر نیست">
+<!ENTITY backup.error "خطایی هنگام نوشتن Ùیلتر به ÙØ§ÛŒÙ„ دیده شد. اطمینان حاصل کنید Ú©Ù‡ ÙØ§ÛŒÙ„ نسبت به نوشتن Ø­ÙØ§Ø¸Øª شده نیست Ùˆ یا توسط برنامه کاربردی دیگری Ø§Ø³ØªÙØ§Ø¯Ù‡ نمی شود.">
+<!ENTITY filter.moveUp.label "حرکت به بالا">
+<!ENTITY addGroup.label "Ø§ÙØ²ÙˆØ¯Ù† گروه Ùیلتر">
+<!ENTITY filter.edit.label "ویرایش">
+<!ENTITY subscription.showHideFilters.label "نمایش/پنهان کردن Ùیلترها">
+<!ENTITY acceptableAds2.label "اجازه دادن به تبلیغات ناخواسته (&amp;i)">
+<!ENTITY addSubscriptionOther.label "یک اشتراک ديگر اضاÙÙ‡ کنید">
+<!ENTITY close.label "بستن">
+<!ENTITY sort.none.label "نا م&amp;رتب">
+<!ENTITY filter.actions.label "اقدامات Ùیلتر">
+<!ENTITY filter.copy.label "رونوشت">
+<!ENTITY filter.moveDown.label "حرکت به پایین">
+<!ENTITY filter.resetHitCounts.label "تنظیم مجدد آمار">
+<!ENTITY readMore.label "بیشتر بخوانید">
+<!ENTITY subscription.moveUp.label "حرکت به بالا">
+<!ENTITY addSubscription.label "اضاÙÙ‡ کردن اشتراک Ùیلتر (&amp;f)">
+<!ENTITY subscription.homepage.label "ØµÙØ­Ù‡ اصلی">
+<!ENTITY backup.complete.title "تمام Ùیلترها Ùˆ اشتراک ها">
+<!ENTITY restore.own.label "بازیابی پشتیبان خود">
+<!ENTITY restore.complete.warning "تمام تنظیمات Ùیلتر با محتویات ÙØ§ÛŒÙ„ انتخاب شده جایگزین Ù…ÛŒ شود. Ù…ÛŒ خواهید انجام دهید؟">
+<!ENTITY filters.tab.label "Ùیلترهای Ø³ÙØ§Ø±Ø´ÛŒ">
+<!ENTITY backup.label "نسخه پشتیبان جدید بسازید">
+<!ENTITY find.label "ÛŒØ§ÙØªÙ† (&amp;n)">
+<!ENTITY subscription.moveDown.label "حرکت به پایین">
+<!ENTITY subscription.lastDownload.connectionError "ناموÙÙ‚ØŒ ÙØ±Ø¢ÛŒÙ†Ø¯ Ø¯Ø±ÛŒØ§ÙØª شکست خورد">
+<!ENTITY subscription.lastDownload.success "موÙÙ‚">
+<!ENTITY subscription.lastDownload.invalidData "ناموÙÙ‚ØŒ Ùهرست پالایه ها نامعتبر است">
+<!ENTITY filter.paste.label "جای گذاری">
+<!ENTITY subscription.disabledFilters.enable "ÙØ¹Ø§Ù„ کردن Ùیلتر های غیر ÙØ¹Ø§Ù„">
+<!ENTITY lasthit.column "آخرین برخ&amp;ورد">
+<!ENTITY subscription.editTitle.label "ویرایش عنوان">
+<!ENTITY subscription.disabledFilters.warning "برخی از Ùیلترها برای این اشتراک غیر ÙØ¹Ø§Ù„ Ù…ÛŒ باشد.">
+<!ENTITY filter.column "&amp;قواعد Ùیلتر">
+<!ENTITY subscription.lastDownload.label "آخرین Ø¯Ø±ÛŒØ§ÙØª:">
+<!ENTITY viewList.label "مشاهده لیست">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/firstRun.properties
new file mode 100644
index 0000000..0ee991a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=با غیر ÙØ¹Ø§Ù„ کردن ردیابی با امنیت کامل به گشت Ùˆ گذار اینترنتی بپردازید وخود را از شرکت هایی Ú©Ù‡ Ù…ÛŒ توانند هر لحظه زیر نظر داشته باشند مخÙÛŒ کنید.
+firstRun_toggle_off=خاموش
+firstRun_feature_tracking=غیر ÙØ¹Ø§Ù„ کردن ردیابی
+firstRun_feature_malware=مسدود کردن نرم Ø§ÙØ²Ø§Ø±Ù‡Ø§ÛŒ مخرب
+firstRun_title=Adblock Plus با موÙقیت نصب شد
+firstRun_toggle_on=روشن
+firstRun_acceptableAdsExplanation=من Ù…ÛŒ خواهم وب سایت ها را تشویق کنم تا از تبلیغات درست Ùˆ حسابی بدون مزاحمت Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند. این دلیل ساختن <a> دستورالعمل های دقیق </a> است تا بتواند تبلیغات قابل قبول را بپذیرد Ùˆ آن ها را به شما نشان دهد ØŒ تبلیغاتی Ú©Ù‡ در شرایط استاندارد صدق کنند. اگر شما Ù…ÛŒ خواهید هر تبلیغی را از هر ØµÙØ­Ù‡ ای مسدود کنید Ù…ÛŒ توانید آن را در عرض چند ثانیه <a>غیر ÙØ¹Ø§Ù„</a> کنید.
+firstRun_contributor_credits=اعتبار نویسندگان
+firstRun_dataCorruptionWarning=آیا این ØµÙØ­Ù‡ در حال رویت Ù†Ú¯Ù‡ داشته شده؟ <a>اینجا کلیک Ú©Ù†!</a>
+firstRun_acceptableAdsHeadline=تبلیغات آزار دهنده در حال حاضر مسدود خواهد شد
+firstRun_share=به دوستان خود بگویید
+firstRun_share_headline=<a>بیایید</a> اینترنت را بهتر کنیم
+firstRun_feature_social_description=به طور خودکار مانند like در Ùیس بوک ØŒ تجربه وبگردی از رسانه های اجتماعی را Ø¨ÙØ±Ø³ØªÛŒØ¯ Ùˆ وضعیت کارهای خود را دنبال کنید.
+firstRun_filterlistsReinitializedWarning=به نظر Ù…ÛŒ رسد Ú©Ù‡ ناشی از موضوع همه Ùیلتر به حذ٠می شود Ùˆ ما قادر به بازگرداندن پشتیبان. بنابراین ما مجبور به تنظیم مجدد Ùیلتر Ùˆ تنظیمات تبلیغات قابل قبول. Ù„Ø·ÙØ§ لیست Ùیلتر Ùˆ تنظیمات تبلیغات قابل قبول در <a>Adblock پلاس گزینه های</a> خود را.
+firstRun_feature_malware_description=مرور خود رابا مسدود کردن دامنه های مخرب شناخته شده امن تر کنید.
+firstRun_features=Adblock Plus می تواند تبلیغات بیشتری را مسدود کند
+firstRun_donate=کمک مالی
+firstRun_donate_label=پروژه ما را حمایت کنید
+firstRun_feature_social=حذ٠دکمه های رسانه های اجتماعی
+firstRun_legacySafariWarning=شما در حال حاضر از يك نسخه قديمي تر مرورگر Safari Ø§Ø³ØªÙØ§Ø¯Ù‡ ميكنيد كه توسط Adblock Plus پشتيباني نميشود. اين موضوع احتمال دارد بر روي تجربه وب گردي كاربر تأثير منÙÙŠ گذاشته Ùˆ يا باعث درست عمل نكردن پلاگين شود. ما قوياً توصيه مي كنيم كه مرورگر خود را به Safari 6.1.1 يا بالاتربه روز رساني كنيد (براي نسخه Mountain Lion ورژن OS X 10.8 در سيستم عامل مكينتاش)ØŒ Ùˆ يا به روز رساني به Safari 7.0.1 (براي نسخه Mavericks ورژن OS X 10.9 در سيستم عامل مكينتاش). Ùˆ يا اينكه ازآخرين ورژن مرورگرهايي مانند: Google Chrome ØŒMozilla Firefox Ùˆ يا Opera Ø§Ø³ØªÙØ§Ø¯Ù‡ كنيد.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/global.properties
new file mode 100644
index 0000000..6ada4e9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=مورد مسدود شده ای در این ØµÙØ­Ù‡ موجود نیست
+action3_tooltip=برای ÙØ¹Ø§Ù„ یا ØºÛŒØ±ÙØ¹Ø§Ù„‌کردن Adblock Plus کلیک کنید.
+notification_antiadblock_title=آیا مایلید پیام های هدÙمند برای کاربران Adblock Plus را مخÙÛŒ نمایید؟
+type_label_script=نویسه
+filter_elemhide_nocriteria=هیچ ضابطه ای برای شناسایی عناصری که می بایست پنهان شوند مشخص نشد.
+blockingGroup_title=قوانین مسدود کردن تبلیغ
+whitelisted_tooltip=Adblock Plus برای این ØµÙØ­Ù‡ ØºÛŒØ±ÙØ¹Ø§Ù„ شده است.
+type_label_stylesheet=شیوه نامه (stylesheet)
+blocked_count_tooltip=?1? از میان ?2?
+type_label_font=قلم
+type_label_popup=پنجره پاپ آپ
+filter_regexp_tooltip=این Ùیلتر یا نوشته مرتب است یا این Ú©Ù‡ خیلی کوچکتر از آن است Ú©Ù‡ یک Ùیلتر مناسب باشد. تعداد زیادی از این نوشته ها Ù…ÛŒ تواند سرعت مرورگر شما را کاهش دهد.
+action0_tooltip=برای نمایش Ùهرست کلیک کنید. کلیک-وسط برای ÙØ¹Ø§Ù„ یا ØºÛŒØ±ÙØ¹Ø§Ù„ کردن است.
+whitelisted_page=Adblock Plus برای ØµÙØ­Ù‡ جاری ØºÛŒØ±ÙØ¹Ø§Ù„ شده است.
+remove_group_warning=واقعا می خواهید این گروه را حذ٠کنید؟
+action1_tooltip=برای گشودن یا بستن موارد مسدود شده کلیک کنید. کلیک-وسط برای ÙØ¹Ø§Ù„ یا ØºÛŒØ±ÙØ¹Ø§Ù„ کردن است.
+type_label_xmlhttprequest=XML خواسته شده
+active_tooltip=Ùوق تبلیغ Ø´Ú©Ù† یا Adblock Plus ÙØ¹Ø§Ù„ است, ?1? اشتراک(های) Ùیلتر Ùˆ ?2? Ùیلتر(ها)ÛŒ Ø³ÙØ§Ø±Ø´ÛŒ در حال Ø§Ø³ØªÙØ§Ø¯Ù‡ هستند.
+type_label_document=سند
+type_label_object_subrequest=اشیاء زیرخواسته
+whitelistGroup_title=قوانین استثنا
+disabled_tooltip=Adblock Plus ØºÛŒØ±ÙØ¹Ø§Ù„ است.
+filter_elemhide_duplicate_id=Ùقط یک شناسه از عنصری Ú©Ù‡ قرار است پنهان شود را Ù…ÛŒ توان مشخص کرد.
+type_label_object=شیء
+action2_tooltip=برای گشودن ترجیحات کلیک کنید. کلیک-وسط برای ÙØ¹Ø§Ù„ یا ØºÛŒØ±ÙØ¹Ø§Ù„ کردن است.
+type_label_subdocument=قابک
+clearStats_warning=این کار تمام آمار ها را پاک کرده و آمارگیری را متوق٠می کند. آیا مایل به توق٠هستید؟
+notification_antiadblock_message=این سایت پیام های هدÙمند برای کاربران Adblock Plus نشان Ù…ÛŒ دهد. آیا مایلید Ú©Ù‡ Adblock Plus پیام های هدÙمند را از دید شما مخÙÛŒ کند؟
+blocked_count_addendum=(همچنین Ùهرست سÙید: ?1?, پنهان: ?2?)
+subscription_invalid_location=مکان وارد شده برای Ùهرست Ùیلترها نامعتبر است.
+type_label_image=تصویر
+remove_subscription_warning=آیا برای حذ٠اشتراک مطمئن هستید؟
+type_label_other=دیگر
+mobile_menu_enable=ABP: ÙØ¹Ø§Ù„
+type_label_media=چند رسانه ای
+mobile_menu_disable_site=ABP: غیر ÙØ¹Ø§Ù„ کردن در ?1?
+elemhideGroup_title=قوانبن Ø§Ø®ØªÙØ§ عناصر
+mobile_menu_enable_site=ABP: ÙØ¹Ø§Ù„ کردن در ?1?
+type_label_elemhide=پنهان
+newGroup_title=گروه Ùیلتر جدید
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/overlay.dtd
new file mode 100644
index 0000000..c2a0e52
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "ب&amp;له">
+<!ENTITY notification.button.no "&amp;نه">
+<!ENTITY sync.label "همگام سازی تن&amp;ظیمات Adblock Plus">
+<!ENTITY whitelist.site.label "ØºÛŒØ±ÙØ¹Ø§Ù„ در ?1?">
+<!ENTITY filters.label "&amp; تنظیمات Ùیلتر">
+<!ENTITY disable.label "غیر ÙØ¹Ø§Ù„ کردن در همه جا">
+<!ENTITY objecttab.title "مسدود کردن">
+<!ENTITY objecttab.tooltip "جهت مسدود کردن با Adblock Plus اینجا کلیک کنید">
+<!ENTITY menuitem.label "ترجیحات Ùوق ت&amp;بلیغ Ø´Ú©Ù† (Adblock Plus)">
+<!ENTITY objecttabs.label "نمایش زبانه در موارد Ùلش Ùˆ &amp;جاوا">
+<!ENTITY sendReport.label "گزارش مشکل در این &amp;ØµÙØ­Ù‡">
+<!ENTITY whitelist.page.label "ØºÛŒØ±ÙØ¹Ø§Ù„ Ùقط در این ØµÙØ­Ù‡">
+<!ENTITY context.image.label "Adblock Plus: سد تصاویر">
+<!ENTITY counthits.label "شمارش &amp;تعداد Ùیلتر شده ها">
+<!ENTITY opensidebar.label "باز کردن موارد &amp;قابل مسدود سازی">
+<!ENTITY notification.button.close "&amp;بستن">
+<!ENTITY contribute.label "کمک کردن به Adblock Plus">
+<!ENTITY toolbarbutton.label "Ùوق تبلیغ Ø´Ú©Ù† یا Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus:سد قابک">
+<!ENTITY blocked.tooltip "موارد رد شده در این ØµÙØ­Ù‡:">
+<!ENTITY hideplaceholders.label "پنهان کردن &amp;متغیرها از عناصر مسدود شده">
+<!ENTITY showinstatusbar.label "نمایش در ن&amp;وار وضعیت">
+<!ENTITY sidebar.title "موارد قابل مسدود شدن در ØµÙØ­Ù‡ جاری">
+<!ENTITY options.label "&amp;گزینه ها">
+<!ENTITY context.object.label "Adblock Plus: سد شیء">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: ÙØ¹Ø§Ù„ شدن مجدد در این ØµÙØ­Ù‡">
+<!ENTITY filters.tooltip "ÙØ¹Ø§Ù„ ترین Ùیلترها:">
+<!ENTITY closesidebar.label "بستن موارد &amp;قابل مسدود سازی">
+<!ENTITY showintoolbar.label "نمایش در نوار ا&amp;بزار">
+<!ENTITY status.tooltip "وضعیت:">
+<!ENTITY context.media.label "Adblock Plus: سد داده های چند رسانه ای">
+<!ENTITY subscription.update.label "به روز رسانی Ùیلتر">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/sendReport.dtd
new file mode 100644
index 0000000..d8c2300
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/sendReport.dtd
@@ -0,0 +1,66 @@
+<!ENTITY screenshot.undo.label "&amp;برگشت">
+<!ENTITY issues.disabledgroups.description "اشتراک های Ùیلتر / دسته های Ùیلتر روبرو غیر ÙØ¹Ø§Ù„ هستند، آنها ممکن است هنوز روی ØµÙØ­Ù‡ تاثیر داشته باشند:">
+<!ENTITY showData.label "نمایش داده های گزارش">
+<!ENTITY typeSelector.falsePositive.label "Ùوق تبلیغ Ø´Ú©Ù† بیش از &amp;حد موارد را مسدود Ù…ÛŒ کند.">
+<!ENTITY issues.change.description "پیکربندی شما تغییر ÛŒØ§ÙØª. Ù„Ø·ÙØ§ ØµÙØ­Ù‡ را برای بررسی تغییرات تازه سازی کنید Ùˆ اگر هنوز با وجود تغییرات انجام شده مشکل پابرجا بود اقدام به ارسال گزارش کنید.">
+<!ENTITY email.label "پ&amp;ست الکترونیکی:">
+<!ENTITY issues.openPreferences.label "باز کردن تنظیمات Ùیلتر">
+<!ENTITY sendPage.confirmation "گزارش شما ذخیره شد. شما می توانید در نشانی زیر به آن دسترسی پیدا کنید:">
+<!ENTITY copyLink.label "رو&amp;نوشت از پیوند گزارش">
+<!ENTITY issues.nofilters.description "Ùوق تبلیغ Ø´Ú©Ù† هیچ موردی را در ØµÙØ­Ù‡ جاری مسدود نکرده. مشکلی Ú©Ù‡ شما مشاهده کرده اید به احتمال زیاد به Ùوق تبلیغ Ø´Ú©Ù† ربطی ندارد.">
+<!ENTITY sendPage.knownIssue "گزارشی که شما ارسال کردید هم اکنون شناخته شده است. اطلاعات بیشتر:">
+<!ENTITY typeSelector.other.description "اگر شما مشکوک هستید Ú©Ù‡ این مشکل از خود Ùوق تبلیغ Ø´Ú©Ù† Ù…ÛŒ باشد نه از Ùیلترها، این گزینه را انتخاب کنید.">
+<!ENTITY issues.disabledgroups.enable.label "ÙØ¹Ø§Ù„ سازی اشتراک های Ùیلتر / دسته های Ùیلتر">
+<!ENTITY typeWarning.override.label "من متو&amp;جه هستم و می خواهم که گزارش را در هر صورت ارسال کنم">
+<!ENTITY issues.disabled.enable.label "ÙØ¹Ø§Ù„ کردن Ùوق تبلیغ Ø´Ú©Ù†">
+<!ENTITY update.fixed.description "به روز رسانی های Ùیلتر احتمالاً مشکلی را Ú©Ù‡ شما گزارش داده اید را حل کرده. Ù„Ø·ÙØ§Ù‹ دوباره ØµÙØ­Ù‡ را باز کنید،اگر مشکل حل نشد دوباره روی دکمه گزارش کلیک کنید.">
+<!ENTITY anonymous.label "ا&amp;رسال ناشناس">
+<!ENTITY reloadButton.label "تا&amp;زه سازی ØµÙØ­Ù‡">
+<!ENTITY recentReports.clear.label "پاک کردن تمامی &amp;گزارشات">
+<!ENTITY typeSelector.description "این پنجره شما را برای ارائه یک گزارش خطا Ùوق تبلیغ Ø´Ú©Ù† راهنمایی Ù…ÛŒ کند. ابتدا نوع مشکلی را Ú©Ù‡ در این ØµÙØ­Ù‡ با آن روبرو هستید را انتخاب کنید:">
+<!ENTITY screenshot.remove.label "&amp;پاک کردن داده های حساس">
+<!ENTITY issues.ownfilters.description "بعضی از پالایه های اعمالی در ØµÙØ­Ù‡ توسط کاربر تعری٠شده اند. Ù„Ø·ÙØ§ پالایه های Ú©Ù‡ ممکن است باعث بروز مشکل شود را ØºÛŒØ±ÙØ¹Ø§Ù„ کنید:">
+<!ENTITY update.inProgress.description "Adblock Plus باید اشتراکات Ùیلتر را بررسی نماید تا مطمئن شود مشکل حل شده است. Ù„Ø·ÙØ§Ù‹ منتظر بمانید...">
+<!ENTITY sendPage.retry.label "ارسال مجدد">
+<!ENTITY data.label "داده های &amp;گزارش:">
+<!ENTITY recentReports.label "گزارشات به تازگی ارسال شده شما">
+<!ENTITY typeWarning.description "شما Ù…ÛŒ خواهید Ú©Ù‡ مشکلی Ú©Ù„ÛŒ در مورد Ùوق تبلیغ Ø´Ú©Ù† را گزارش دهید به جای اینکه مشکلی در رابطه با Ùیلتر گزارش دهید. Ù„Ø·ÙØ§ توجه داشته باشید Ú©Ù‡ این طور مسائل بهتر است در [link]تالار Ú¯ÙØªÙ…ان Ùوق تبلیغ Ø´Ú©Ù†[/link] بحث شوند. شما باید Ùقط در صورتی از گزارش گر مشکلات Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید Ú©Ù‡ مکمل بحث موجود باشد, چونکه (در تالار Ú¯ÙØªÙ…ان) هیچ کس به گزارش شما توجه نمی کند مگر این Ú©Ù‡ برای آن یک پیوند ارائه کنید. وقتی Ú©Ù‡ گزارش را ارسال Ù…ÛŒ کنید پیوند به طور خودکار ساخته Ùˆ مهیا Ù…ÛŒ شود.">
+<!ENTITY issues.disabled.description "Ùوق تبلیغ Ø´Ú©Ù† هم اکنون ØºÛŒØ±ÙØ¹Ø§Ù„ است. در این وضعیت هیچ موردی را مسدود نمی کند.">
+<!ENTITY attachExtensions.label "ضمیمه کردن Ùهرستی ا&amp;ز Ø§ÙØ²ÙˆÙ†Ù‡ ها به گزارش در مواردی Ú©Ù‡ Ø§ÙØ²ÙˆÙ†Ù‡ های دیگر باعث ایجاد مشکل باشند.">
+<!ENTITY issues.nosubscriptions.add.label "Ø§ÙØ²ÙˆØ¯Ù† اشتراک Ùیلتر">
+<!ENTITY issues.disabledfilters.enable.label "ÙØ¹Ø§Ù„ کردن Ùیلتر">
+<!ENTITY issues.override.label "تنظیمات &amp;پیکربندی صحیح است، ادامه گزارش">
+<!ENTITY issues.nosubscriptions.description "شما در هیچ Ùهرست پالایه پیش ساخته ای مشترک نشده اید Ú©Ù‡ به طور خود کار محتوای ناخواسته را پاک Ù…ÛŒ کنند.">
+<!ENTITY typeSelector.falsePositive.description "اگر ØµÙØ­Ù‡ خالی از محتوای مهم Ù…ÛŒ شود یا نادرست نمایش داده Ù…ÛŒ شود یا موÙÙ‚ به عملکرد درست نیست این گزینه را انتخاب کنید.">
+<!ENTITY typeSelector.other.label "سایر مشکلا&amp;ت">
+<!ENTITY emailComment.label "ما شما را تشویق می کنیم که یک آدرس ایمیل معتبر از خود وارد کنید تا اگر سوالی بود ما بتوانیم در آینده با شما ارتباط برقرار کنیم
+در مورد گزارش شما. این به ما اجازه می دهد که میزان همکاری شما را بسنجیم و اولویت کار شما به مراحل بالاتر برسد.">
+<!ENTITY issues.whitelist.remove.label "ÙØ¹Ø§Ù„ کردن مجدد Ùوق تبلیغ Ø´Ú©Ù† در این ØµÙØ­Ù‡">
+<!ENTITY outdatedSubscriptions.description "اشتراک Ùیلتر زیر برای حداقل دو Ù‡ÙØªÙ‡ به روز نشده است. Ù„Ø·ÙØ§Ù‹ این اشتراک را قبل از ارسال گزارش به روز کنید, شاید مشکل حل شود.">
+<!ENTITY dataCollector.description "Ù„Ø·ÙØ§ برای چند لحظه صبر کنید تا Ùوق تبلیغ Ø´Ú©Ù† داده های درخواستی شما را جمع آوری کند.">
+<!ENTITY sendButton.label "ارسا&amp;ل گزارش">
+<!ENTITY comment.label "ن&amp;ظر (اختیاری):">
+<!ENTITY sendPage.errorMessage "تلاش برای ارسال گزارش شکست خورد، شماره خطا &quot;?1?&quot;. Ù„Ø·ÙØ§ مطمئن شوید Ú©Ù‡ به اینترنت متصل هستید Ùˆ مجددا سعی کنید. اگر مشکل همچنان ادامه دارد Ù…ÛŒ توانید در [link]تالار Ú¯ÙØªÙ…ان Ùوق تبلیغ Ø´Ú©Ù†[/link] در خواست Ú©Ù…Ú© کنید.">
+<!ENTITY showRecentReports.label "نمایش گزارشات ارسال شده اخیر">
+<!ENTITY commentPage.heading "وارد کردن نظر">
+<!ENTITY update.start.label "در حال به روز رسانی">
+<!ENTITY issues.disabledfilters.description "Ùیلترهای روبرو غیر ÙØ¹Ø§Ù„ هستند، آنها ممکن است هنوز روی ØµÙØ­Ù‡ تاثیر داشته باشند:">
+<!ENTITY screenshot.description "ØµÙØ­Ø§Øª مشابه امکان دارد برای هر ÙØ±Ø¯ به صورتی نامشابه نمایش داده شوند. ضمیمه کردن یک تصویر Ù…ÛŒ تواند Ú©Ù…Ú© زیادی در Ùهم مشکل به ما بکند. شما Ù…ÛŒ توانید بخش هایی Ú©Ù‡ حاوی اطلاعات حساس Ù…ÛŒ باشد را پاک کنید Ùˆ همچنین بخش هایی Ú©Ù‡ مشکل در آنها نمودار شده را علامت گزاری کنید. برای این کار کلید متناظر را کلیک کنید Ùˆ بخشی از تصویر را با موشواره انتخاب کنید.">
+<!ENTITY screenshot.attach.label "Ø§ÙØ²ÙˆØ¯Ù† ت&amp;صویر ØµÙØ­Ù‡ به گزارش">
+<!ENTITY issues.whitelist.description "Ùوق تبلیغ Ø´Ú©Ù† هم اکنون روی ØµÙØ­Ù‡ ای Ú©Ù‡ شما در مورد آن گزارش Ù…ÛŒ دهید غیر ÙØ¹Ø§Ù„ است. ابتدا آن را دوباره ÙØ¹Ø§Ù„ کنید Ùˆ پس از تازه سازی ØµÙØ­Ù‡ØŒ مشکل را مجددا بررسی کنید.">
+<!ENTITY typeSelector.falseNegative.label "Ùوق تبلیغ Ø´Ú©Ù† &amp;هیچ تبلیغی را مسدود نمی کند.">
+<!ENTITY typeSelector.heading "انتخاب نوع اشکال">
+<!ENTITY anonymity.warning "ما قادر نخواهیم بود که دوباره بیاییم و احتمالاً این گزارش را در اولویت های پایین تر قرار می دهیم.">
+<!ENTITY wizard.title "گزارش گر اشکالات">
+<!ENTITY issues.ownfilters.disable.label "غیر ÙØ¹Ø§Ù„ کردن Ùیلتر">
+<!ENTITY commentPage.description "جعبه متن زیر به شما اجازه می دهد که نظر خود را برای کمک به درک ما در مورد مشکل وارد کنید. این مورد اختیاری می باشد ولی در صورتی که مشکل آشکار نیست توصیه می شود. شما همچنین می توانید قبل از ارسال گزارش داده ها را بررسی کنید.">
+<!ENTITY comment.lengthWarning "حد اکثر طول نظر 1000 حر٠می باشد. Ùقط 1000 حر٠اولی ÙØ±Ø³ØªØ§Ø¯Ù‡ Ù…ÛŒ شود.">
+<!ENTITY typeSelector.falseNegative.description "اگر تبلیغات همچنان مشاهده Ù…ÛŒ شوند با وجود این Ú©Ù‡ Ùوق تبلیغ Ø´Ú©Ù† ÙØ¹Ø§Ù„ است این گزینه را انتخاب کنید">
+<!ENTITY sendPage.waitMessage "Ù„Ø·ÙØ§ صبر کنید تا Ùوق تبلیغ Ø´Ú©Ù† گزارش شما را ارسال کند.">
+<!ENTITY dataCollector.heading "به گزارشگر اشکالات خوش آمدید">
+<!ENTITY screenshot.heading "Ø§ÙØ²ÙˆØ¯Ù† تصویر از ØµÙØ­Ù‡">
+<!ENTITY sendPage.heading "ارسال گزارش">
+<!ENTITY issues.subscriptionCount.description "به نظر Ù…ÛŒ رسد Ú©Ù‡ شما در اشتراک های بسیار زیادی عضو هستید. این عمل توصیه نمی شود زیرا Ú©Ù‡ شانس ایجاد مشکل بیشتر Ù…ÛŒ شود. بنابرین ما نمی توانیم گزارش های شما را قبول کنیم چرا Ú©Ù‡ معلوم نیست Ú©Ù‡ کدام اشتراک Ùیلتر نیاز به بررسی دارد. Ù„Ø·ÙØ§ همه آنها را به جز اشتراک های واقعا لازم حذ٠کنید Ùˆ سپس امتحان کنید Ú©Ù‡ آیا این مسئله هنوز هم پس از آن رخ Ù…ÛŒ دهد.">
+<!ENTITY screenshot.mark.label "&amp;علامت گزاری مشکل">
+<!ENTITY privacyPolicy.label "سیاست Ø­ÙØ¸ اسرار">
+<!ENTITY issues.description "Ùوق تبلیغ Ø´Ú©Ù† مشکلی را در پیکربندی های شما پیدا کرده Ú©Ù‡ ممکن است مشکل شما ناشی از آن باشد Ùˆ یا این Ú©Ù‡ ممکن است در رسیدگی به مشکل شما اشکال ایجاد کند.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/sidebar.dtd
new file mode 100644
index 0000000..757ed0a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "مرز های اقلام Ùلش">
+<!ENTITY address.label "نشانی">
+<!ENTITY context.open.label "گشودن در زبانه نو">
+<!ENTITY type.label "نوع">
+<!ENTITY tooltip.filterSource.label "متن Ùیلتر:">
+<!ENTITY noitems.label "هیچ مورد قابل انسدادی نیست">
+<!ENTITY filter.label "Ùیلتر">
+<!ENTITY tooltip.size.label "اندازه:">
+<!ENTITY reattach.label "وصل کردن دوباره">
+<!ENTITY search.label "جستجو:">
+<!ENTITY docDomain.thirdParty "(شخص ثالث)">
+<!ENTITY filterSource.label "منبع Ùیلتر">
+<!ENTITY tooltip.docDomain.label "منبع نوشتار:">
+<!ENTITY context.copy.label "کپی آدرس مورد">
+<!ENTITY tooltip.type.label "نوع:">
+<!ENTITY context.disablefilter.label "غیر ÙØ¹Ø§Ù„ کردن Ùیلتر ?1?">
+<!ENTITY context.copyFilter.label "رونوشت Ùیلتر">
+<!ENTITY context.block.label "مسدود کردن این مورد">
+<!ENTITY context.enablefilter.label "ÙØ¹Ø§Ù„ کردن Ùیلتر ?1?">
+<!ENTITY detach.label "قطع کردن">
+<!ENTITY whitelisted.label "ØµÙØ­Ù‡ Ùهرست سÙید">
+<!ENTITY context.disablefilteronsite.label "غیر ÙØ¹Ø§Ù„ کردن این Ùیلتر در ?1?">
+<!ENTITY detached.title "Ùوق تبلیغ Ø´Ú©Ù†: موارد قابل انسداد (قطع شده)">
+<!ENTITY docDomain.firstParty "(شخص اول)">
+<!ENTITY tooltip.type.whitelisted "(در Ùهرست سÙید)">
+<!ENTITY tooltip.filter.label "Ùیلترهای مؤثر:">
+<!ENTITY tooltip.filter.disabled "(غیر ÙØ¹Ø§Ù„)">
+<!ENTITY context.editfilter.label "ویرایش Ùیلتر مؤثر">
+<!ENTITY tooltip.type.blocked "(مسدود شده)">
+<!ENTITY size.label "اندازه">
+<!ENTITY context.whitelist.label "Ø§ÙØ²ÙˆØ¯Ù† قانون استثنا برای این مورد">
+<!ENTITY context.selectAll.label "انتخاب همه">
+<!ENTITY state.label "وضعیت">
+<!ENTITY docDomain.label "منبع نوشتار">
+<!ENTITY tooltip.address.label "نشانی:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/subscriptionSelection.dtd
new file mode 100644
index 0000000..18f3a61
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Ø§ÙØ²ÙˆØ¯Ù† اشتراک Ùیلتر &quot;?1?&quot; هم&amp;چنین">
+<!ENTITY list.download.failed "Ùوق تبلیغ Ø´Ú©Ù† موÙÙ‚ نشد Ú©Ù‡ Ùهرست اشتراکات را بازیابی کند.">
+<!ENTITY list.download.retry "تلاش مجدد">
+<!ENTITY title.label "عنوان ا&amp;شتراک:">
+<!ENTITY list.download.website "دیدن پایگاه تحت شبکه">
+<!ENTITY supplementMessage "این اشتراک Ùیلتر به معنی آن است Ú©Ù‡ با اشتراک Ùیلتر &quot;?1?&quot; Ø§Ø³ØªÙØ§Ø¯Ù‡ Ù…ÛŒ شود Ú©Ù‡ شما هنوز در آن مشترک نشده اید.">
+<!ENTITY viewList.label "دیدن Ùیلترها">
+<!ENTITY visitHomepage.label "بازدید از ØµÙØ­Ù‡ خانگی">
+<!ENTITY addSubscription.label "Ø§ÙØ²ÙˆØ¯Ù† اشتراک">
+<!ENTITY dialog.title "Ø§ÙØ²ÙˆØ¯Ù† اشتراک پالایه Ùوق تبلیغ Ø´Ú©Ù†">
+<!ENTITY location.label "نشانی &amp;Ùهرست Ùیلترها:">
+<!ENTITY fromWeb.description "Ù„Ø·ÙØ§ تایید کنید Ú©Ù‡ قصد Ø§ÙØ²ÙˆØ¯Ù† این اشتراک Ùیلتر را دارید. شما Ù…ÛŒ توانید قبل از Ø§ÙØ²ÙˆØ¯Ù†ØŒ نام Ùˆ مسیر اشتراک را تغییر دهید.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/composer.dtd
new file mode 100644
index 0000000..2713052
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "osoitteen &amp;lopussa">
+<!ENTITY domainRestriction.label "R&amp;ajoita verkkotunnukseen:">
+<!ENTITY collapse.default.no.label "Käytä oletusta (ei)">
+<!ENTITY firstParty.label "Va&amp;in sivun ylläpitäjän">
+<!ENTITY preferences.label "&amp;Näytä nykyiset suodattimet...">
+<!ENTITY pattern.label "Merkkijonon löytäminen">
+<!ENTITY thirdParty.label "Vain &amp;muiden kuin sivun ylläpitäjän">
+<!ENTITY filter.label "Uusi &amp;suodatin:">
+<!ENTITY collapse.label "&amp;Romahduta estetyt:">
+<!ENTITY match.warning "Syöttämäsi merkkijono ei enää täsmää estettävän/sallittavan osoitteen kanssa; se ei vaikuta kyseiseen osoitteeseen.">
+<!ENTITY anchor.start.label "osoi&amp;tteen alussa">
+<!ENTITY matchCase.label "&amp;Huomioi kirjainkoko">
+<!ENTITY custom.pattern.label "&amp;Oma muokkaus:">
+<!ENTITY unselectAllTypes.label "Älä valitse mitään">
+<!ENTITY type.whitelist.label "&amp;Sallimisehto">
+<!ENTITY regexp.warning "Syöttämäsi merkkijono tulkitaan säännölliseksi lausekkeeksi. Monet säännölliset lausekkeet saattavat hidastaa selailua. Jos tarkoituksena ei ollut käyttää säännöllistä lauseketta, lisää tähtimerkki (*) lauseen loppuun.">
+<!ENTITY dialog.title "Lisää Adblock Plus -suodatusehto">
+<!ENTITY basic.label "Perusnäkymä">
+<!ENTITY type.filter.label "&amp;Estävä suodatin">
+<!ENTITY types.label "Käytä tyypeissä:">
+<!ENTITY shortpattern.warning "Syöttämäsi merkkijono on liian lyhyt optimoitavaksi. Useat tällaiset merkkijonot saattavat hidastaa selailua. On suositeltavaa, että valitset tälle suodattimelle pidemmän merkkijonon.">
+<!ENTITY collapse.yes.label "Kyllä">
+<!ENTITY anchors.label "Hyväksy merkkijono vain:">
+<!ENTITY collapse.default.yes.label "Käytä oletusta (kyllä)">
+<!ENTITY domainRestriction.help "Määrittele yksi tai useampia verkkotunnuksia &quot;|&quot;-merkilla eroteltuna. Suodatin on käytössä vain näissä verkkotunnuksissa. Suodatinta ei käytetä verkkotunnuksella, jos sen edessä on &quot;~&quot;-merkki.">
+<!ENTITY accept.label "Lisää suodatin">
+<!ENTITY options.label "Asetukset">
+<!ENTITY disabled.warning "Adblock Plus on tällä hetkellä poistettu käytöstä. Voit silti lisätä suodattimia mutta ne otetaan käyttöön vasta kun, [link]otat Adblockin Plussan käyttöön[/link].">
+<!ENTITY anchor.start.flexible.label "verkko&amp;tunnuksen alussa.">
+<!ENTITY collapse.no.label "Ei">
+<!ENTITY selectAllTypes.label "Valitse kaikki">
+<!ENTITY advanced.label "Edistyneempi näkymä">
+<!ENTITY pattern.explanation "Merkkijono voi olla mikä tahansa osoitteen osa. Tähtimerkki (*) toimii jokerimerkkinä. Suodatin toimii vain osoitteissa, joita merkkijono vastaa.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/filters.dtd
new file mode 100644
index 0000000..5535b40
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Kaikki omat suodattimet korvataan valitun tiedoston sisällöllä. Haluatko varmasti jatkaa?">
+<!ENTITY slow.column "&amp;Hitaat suodattimet">
+<!ENTITY enabled.column "Kä&amp;ytössä">
+<!ENTITY subscription.lastDownload.checksumMismatch "Epäonnistui, tarkistussumma ei täsmää">
+<!ENTITY noFiltersInGroup.text "Valittu ryhmä on tyhjä">
+<!ENTITY subscription.actions.label "Toiminnot">
+<!ENTITY filter.selectAll.label "Valitse kaikki">
+<!ENTITY backupButton.label "&amp;Varmuuskopioi ja palauta">
+<!ENTITY restore.minVersion.warning "Varoitus: tiedosto on luotu uudemmalla Adblock Plussan versiolla. Ennen kuin palautat tästä tiedostosta, on suositeltavaa päivittää uusimpaan Adblock Plussan versioon.">
+<!ENTITY restore.error "Tiedoston tietoja ei voida käsitellä. Ehkä tämä ei ole Adblock Plus -varmuuskopiotiedosto?">
+<!ENTITY sort.ascending.label "&amp;A &gt; Z lajittelu">
+<!ENTITY sort.label "Lajitt&amp;eluperuste">
+<!ENTITY subscription.source.label "Suodatintilaus">
+<!ENTITY hitcount.column "&amp;Osumat">
+<!ENTITY noFilters.text "Omia suodattimia ei ole vielä.">
+<!ENTITY backup.custom.title "Vain omat suodattimet">
+<!ENTITY subscription.external.label "Toisen laajennuksen päivättävä">
+<!ENTITY subscription.delete.label "Poista">
+<!ENTITY noGroupSelected.text "Suodatinryhmä on valittava, ennen kuin sen suodattimia voidaan näyttää.">
+<!ENTITY filter.cut.label "Leikkaa">
+<!ENTITY restore.default.label "Palauta varmuuskopio: ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Lataa...">
+<!ENTITY subscriptions.tab.label "Suodatintilaukset">
+<!ENTITY sort.descending.label "&amp;Z &gt; A lajittelu">
+<!ENTITY filters.remove.warning "Haluatko varmasti poistaa kaikki valitut suodattimet?">
+<!ENTITY filter.delete.label "Poista">
+<!ENTITY addSubscriptionAdd.label "Lisää">
+<!ENTITY viewMenu.label "Näytä">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY addSubscriptionCancel.label "Peruuta">
+<!ENTITY subscription.enabled.label "Käytössä">
+<!ENTITY noSubscriptions.text "Suodatintilauksia ei ole vielä lisätty. Adblock Plus ei estä mitään
+ ilman suodattimia. Käytä &quot;Lisää suodatintilaus&quot; -painiketta lisätäksesi
+ joitakin.">
+<!ENTITY subscription.update.label "Päivitä suodattimet">
+<!ENTITY dialog.title "Adblock Plus -suodatinasetukset">
+<!ENTITY addFilter.label "&amp;Lisää suodatin">
+<!ENTITY subscription.minVersion.warning "Tämä suodatintilaus vaatii uudemman Adblock Plus -version, on suositeltavaa päivittää uusimpaan Adblock Plussan versioon.">
+<!ENTITY subscription.lastDownload.invalidURL "Epäonnistui, kelvoton osoite">
+<!ENTITY backup.error "Tapahtui virhe kirjoitettaessa suodattimia tiedostoon. Varmista että tiedosto ei ole kirjoitussuojattu tai jonkin muun ohjelman käytössä.">
+<!ENTITY filter.moveUp.label "Siirrä ylös">
+<!ENTITY addGroup.label "Li&amp;sää suodatinryhmä">
+<!ENTITY filter.edit.label "Muokkaa">
+<!ENTITY subscription.showHideFilters.label "Näytä/piilota suodattimet">
+<!ENTITY acceptableAds2.label "S&amp;alli osa ei-häiritsevästä mainonnasta">
+<!ENTITY addSubscriptionOther.label "Lisää jokin muu tilaus">
+<!ENTITY close.label "Sulje">
+<!ENTITY sort.none.label "Ei &amp;lajiteltu">
+<!ENTITY filter.actions.label "Suodatintoiminnot">
+<!ENTITY filter.copy.label "Kopioi">
+<!ENTITY filter.moveDown.label "Siirrä alas">
+<!ENTITY filter.resetHitCounts.label "Nollaa osumatilastot">
+<!ENTITY readMore.label "Lue lisää">
+<!ENTITY subscription.moveUp.label "Siirrä ylös">
+<!ENTITY addSubscription.label "L&amp;isää suodatintilaus">
+<!ENTITY subscription.homepage.label "Kotisivu">
+<!ENTITY backup.complete.title "Kaikki suodattimet ja tilaukset">
+<!ENTITY restore.own.label "Palauta oma varmuuskopio">
+<!ENTITY restore.complete.warning "Kaikki suodatinasetukset korvataan valitun tiedoston sisällöllä. Haluatko varmasti jatkaa?">
+<!ENTITY filters.tab.label "Omat suodattimet">
+<!ENTITY backup.label "Luo uusi varmuuskopio">
+<!ENTITY find.label "&amp;Etsi">
+<!ENTITY subscription.moveDown.label "Siirrä alas">
+<!ENTITY subscription.lastDownload.connectionError "Epäonnistui, latausvirhe">
+<!ENTITY subscription.lastDownload.success "Onnistui">
+<!ENTITY subscription.lastDownload.invalidData "Epäonnistui, kelvoton suodatinlista">
+<!ENTITY filter.paste.label "Liitä">
+<!ENTITY subscription.disabledFilters.enable "Ota käytöstä poistetut suodattimet käyttöön">
+<!ENTITY lasthit.column "&amp;Viimeisin osuma">
+<!ENTITY subscription.editTitle.label "Muokkaa otsikkoa">
+<!ENTITY subscription.disabledFilters.warning "Jotkin tämän suodatintilauksen suodattimista on poistettu käytössä.">
+<!ENTITY filter.column "&amp;Suodatusehto">
+<!ENTITY subscription.lastDownload.label "Viimeisin lataus:">
+<!ENTITY viewList.label "Näytä lista">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/firstRun.properties
new file mode 100644
index 0000000..3e6d9bb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Selaa yksityisesti estämällä seuraaminen - piilota jälkesi mainosyhtiöiltä, jotka muuten seuraavat jokaista liikettäsi.
+firstRun_toggle_off=OFF
+firstRun_feature_tracking=Seuraamisen estäminen
+firstRun_feature_malware=Haittaohjelmien estäminen
+firstRun_title=Adblock Plus on asennettu
+firstRun_toggle_on=ON
+firstRun_acceptableAdsExplanation=Kannustamme verkkosivuja käyttämään yksinkertaisia mainoksia, jotka eivät häiritse. Tämän vuoksi olemme luoneet <a>tiukat ohjesäännöt</a> hyväksyttävien mainosten tunnistamiseksi, jotka näytetään oletusasetuksilla. Jos silti haluat estää kaikki mainokset, voit ottaa tämän <a>pois käytöstä</a> käden käänteessä.
+firstRun_contributor_credits=Avustajat:
+firstRun_dataCorruptionWarning=Näetkö tämän sivun koko ajan? <a>Napsauta tätä!</a>
+firstRun_acceptableAdsHeadline=Häiritsevät mainokset estetään
+firstRun_share=Kerro ystävillesi
+firstRun_share_headline=<a>Auta meitä</a> tekemään verkosta parempi paikka
+firstRun_feature_social_description=Poista sivustoilta automaattisesti sosiaalisen median painikkeet, kuten Facebookin tykkää -painikkeet, jotka seuraavat verkkokäyttäytymistäsi.
+firstRun_filterlistsReinitializedWarning=Näyttäisi siltä, että ongelman takia kaikki suodattimet on poistettu ja niiden palauttaminen varmuuskopiosta epäonnistui. Tämän vuoksi kaikki suodattimien ja hyväksyttävien mainoksien asetukset on palautettu alkuarvoihin. Tarkasta suodatinlistat ja hyväksyttävien mainosten asetukset <a>Adblock Plussan asetuksista</a>.
+firstRun_feature_malware_description=Tee selaimestasi turvallisempi estämällä verkko-osoitteita, joiden tiedetään sisältävän haitallisia ohjelmia.
+firstRun_features=Adblock Plus voi tehdä muutakin kuin vain estää mainoksia
+firstRun_donate=lahjoita
+firstRun_donate_label=Tue projektiamme
+firstRun_feature_social=Sosiaalisen median painikkeiden poistaminen
+firstRun_legacySafariWarning=Käytössäsi on Safarin vanha versio, jota Adblock Plus ei tue. Se ei välttämättä toimi oikein tai saattaa heikentää joidenkin sivustojen käyttökokemusta. Suosittelemme vahvasti päivittämään Safari 6.1.1:een tai uudempaan (OSX 10.8 Mountain Lion), tai Safari 7.0.1:een tai uudempaan (OSX 10.9 Mavericks), tai käyttämään Mozilla Firefoxin, Google Chromen tai Operan uusinta versiota.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/global.properties
new file mode 100644
index 0000000..843c5e6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Ei estettäviä elementtejä avoimella sivulla
+action3_tooltip=Napsauttamalla Adblock Plus otetaan käyttöön/poistetaan käytöstä.
+notification_antiadblock_title=Piilotetaanko kohdennetut viestit?
+type_label_script=komento
+filter_elemhide_nocriteria=Piilotettavaa elementtiä määrittelevää tunnistetta ei annettu
+blockingGroup_title=Estoehdot
+whitelisted_tooltip=Adblock Plus on poistettu käytöstä tämänhetkisellä sivustolla.
+type_label_stylesheet=tyyliohje
+blocked_count_tooltip=?1? / ?2?
+type_label_font=kirjaisin
+type_label_popup=ponnahdusikkuna
+filter_regexp_tooltip=Tämä suodatin on joko säännöllinen lauseke tai liian lyhyt optimoitavaksi. Liian monta tällaista suodatinta saattaa hidastaa selailuasi.
+action0_tooltip=Napsautus avaa ponnahdusvalikon. Keskinapsautus ottaa käyttöön/poistaa käytöstä.
+whitelisted_page=Adblock Plus on poistettu käytöstä avoimella sivulla
+remove_group_warning=Haluatko varmasti poistaa tämän ryhmän?
+action1_tooltip=Napsautus avaa/sulkee elementtilistan. Keskinapsautus ottaa käyttöön/poistaa käytöstä.
+type_label_xmlhttprequest=XML-pyyntö
+active_tooltip=Adblock Plus on aktiivinen, ?1? kpl suodatintilauksia ja ?2? kpl omia suodattimia käytössä.
+type_label_document=dokumentti
+type_label_object_subrequest=objektin alipyyntö
+whitelistGroup_title=Poikkeusehdot
+disabled_tooltip=Adblock Plus ei ole käytössä.
+filter_elemhide_duplicate_id=Piilotettavalle elementille voidaan määritellä vain yksi tunniste (ID)
+type_label_object=objekti
+action2_tooltip=Napsautus avaa asetukset. Keskinapsautus ottaa käyttöön/poistaa käytöstä.
+type_label_subdocument=kehys
+clearStats_warning=Tämä nollaa kaikki osumatilastot ja poistaa osumien laskemisen käytöstä. Haluatko jatkaa?
+notification_antiadblock_message=Tämän sivun tiedetään näyttäneen kohdennettuja viestejä Adblock Plussan käyttäjille. Haluatko, että Adblock Plus piilottaa kohdennetut viestit?
+blocked_count_addendum=(sallituja: ?1?, piilotettuja: ?2?)
+subscription_invalid_location=Suodatinlistan sijainti on joko kelvoton osoite tai tiedoston nimi.
+type_label_image=kuva
+remove_subscription_warning=Haluatko varmasti poistaa tämän tilauksen?
+type_label_other=muu
+mobile_menu_enable=ABP: Ota käyttöön
+type_label_media=ääni/video
+mobile_menu_disable_site=ABP: Ei käytössä osoitteessa ?1?
+elemhideGroup_title=Elementtien piilotusehdot
+mobile_menu_enable_site=ABP: Käytä osoitteessa ?1?
+type_label_elemhide=piilotettu
+newGroup_title=Uusi suodatinryhmä
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/overlay.dtd
new file mode 100644
index 0000000..a123135
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Kyllä">
+<!ENTITY notification.button.no "&amp;Ei">
+<!ENTITY sync.label "&amp;Synkronoi Adblock Plussan asetukset">
+<!ENTITY whitelist.site.label "Ei käytössä osoitteessa ?1?">
+<!ENTITY filters.label "&amp;Suodatinasetukset">
+<!ENTITY disable.label "Poista käytöstä kaikkialla">
+<!ENTITY objecttab.title "Estä">
+<!ENTITY objecttab.tooltip "Estä tämä objekti Adblock Plussalla">
+<!ENTITY menuitem.label "A&amp;dblock Plus - Asetukset">
+<!ENTITY objecttabs.label "&amp;Korvake Flashin ja Javan yhteydessä">
+<!ENTITY sendReport.label "Raportoi onge&amp;lma tällä sivulla">
+<!ENTITY whitelist.page.label "Ei käytössä tällä sivulla">
+<!ENTITY context.image.label "Adblock Plus: Estä kuva">
+<!ENTITY counthits.label "&amp;Laske suodattimen osumat">
+<!ENTITY opensidebar.label "Näytä &amp;elementit">
+<!ENTITY notification.button.close "&amp;Sulje">
+<!ENTITY contribute.label "Avusta Adblock Plussaa">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Estä kehys">
+<!ENTITY blocked.tooltip "Tämän sivun estetyt elementit:">
+<!ENTITY hideplaceholders.label "P&amp;iilota elementit, jotka sisältävät estettyjä elementtejä">
+<!ENTITY showinstatusbar.label "&amp;Näytä tilarivillä">
+<!ENTITY sidebar.title "Estettävät elementit avoimella sivulla">
+<!ENTITY options.label "&amp;Valinnat">
+<!ENTITY context.object.label "Adblock Plus: Estä kohde">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Ota tämä sivu uudestaan käyttöön">
+<!ENTITY filters.tooltip "Aktiivisimmat suodattimet:">
+<!ENTITY closesidebar.label "Sulj&amp;e elementit">
+<!ENTITY showintoolbar.label "Nä&amp;ytä työkalupalkilla">
+<!ENTITY status.tooltip "Tila:">
+<!ENTITY context.media.label "Adblock Plus: Estä ääni/kuva">
+<!ENTITY subscription.update.label "Päivitä suodattimet">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/sendReport.dtd
new file mode 100644
index 0000000..8c58fdc
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "K&amp;umoa">
+<!ENTITY issues.disabledgroups.description "Seuraavat suodatintilaukset / suodatinryhmät ovat poistettu käytöstä mutta niillä saatta silti olla vaikutusta tällä sivulla:">
+<!ENTITY showData.label "Näytä raportin tiedot">
+<!ENTITY typeSelector.falsePositive.label "Adb&amp;lock Plus estää liikaa">
+<!ENTITY issues.change.description "Asetuksia on muutettu. Päivitä sivu testataksesi muutokset ja raportoi, jos muutokset eivät ratkaisseet ongelmaa.">
+<!ENTITY email.label "Sä&amp;hköposti:">
+<!ENTITY issues.openPreferences.label "Avaa suodatinasetukset">
+<!ENTITY sendPage.confirmation "Rapotti on tallennettu. Se löytyy tästä osoitteesta:">
+<!ENTITY copyLink.label "&amp;Kopioi raportin linkki">
+<!ENTITY issues.nofilters.description "Adblock Plus ei estä mitään tällä sivulla. Kohdattu ongelma on todennäköisesti riippumaton Adblock Plussasta.">
+<!ENTITY sendPage.knownIssue "Raportoimasi ongelma on todennäköisesti jo tiedossa. Lisätietoa:">
+<!ENTITY typeSelector.other.description "Valitse tämä vaihtoehto, jos epäilet ongelman olevan ennemminkin Adblock Plussassa kuin sen suodattimissa.">
+<!ENTITY issues.disabledgroups.enable.label "Ota suodatintilaus / suodatinlista käyttöön">
+<!ENTITY typeWarning.override.label "&amp;Ymmärrän ja haluan silti raportoida">
+<!ENTITY issues.disabled.enable.label "Ota Adblock Plus käyttöön tällä sivulla">
+<!ENTITY update.fixed.description "Suodatintilausten päivitykset todennäköisesti ratkaisivat raportoitavan ongelman. Päivitä sivusto ja yritä uudelleen. Mikäli ongelma säilyy, raportoi se.">
+<!ENTITY anonymous.label "&amp;Lähetä nimettömänä">
+<!ENTITY reloadButton.label "&amp;Päivitä sivu">
+<!ENTITY recentReports.clear.label "Poista kaikki &amp;raportit">
+<!ENTITY typeSelector.description "Tämä ikkuna ohjeistaa tarvittavat vaiheet Adblockin Plussan ongelmaraportin lähettämiseksi. Aluksi valitse onhelmatyyppi, jollaisen koet tällä sivulla:">
+<!ENTITY screenshot.remove.label "&amp;Poista arkaluontoista tietoa">
+<!ENTITY issues.ownfilters.description "Osa tämän sivun suodattimista on käyttäjän määrittelemiä. Poista käytöstä suodattimet, jotka saattavat aiheuttaa ongelmia:">
+<!ENTITY update.inProgress.description "Adblock Plussan pitää päivittää suodatintilaukset varmistaakseen, että ongelmaa ei ole jo ratkottu. Odota hetki...">
+<!ENTITY sendPage.retry.label "Lähetä uudelleen">
+<!ENTITY data.label "Raportin tie&amp;dot:">
+<!ENTITY recentReports.label "Näytä viimeksi lähetemäsi raportit">
+<!ENTITY typeWarning.description "Olet antanut ymmärtää halukkuutesi raportoida yleisestä virheestä Adblock Plussassa suodattimien sijaan. Huomaa että tällaiset raportit olisi parasta jättää [link]Adblock Plussan foorumeille[/link]. Ongelmaraportteria tulisi käyttää vain täydentämään olevassa olevaa keskutelua, sillä kukaan ei huomioi raporttiasi, jos et anna siihen linkitystä. Rapotoidessa annetaan automaattisesti luotu linkki.">
+<!ENTITY issues.disabled.description "Adblock Plus on poissa käytöstö tällä sivulla, se ei estä mitään.">
+<!ENTITY attachExtensions.label "L&amp;iitä lista aktiivisista laajennuksista rapottiin siltä varalta, että jokin niistä on ongelma syy">
+<!ENTITY issues.nosubscriptions.add.label "Lisää suodatintilaus">
+<!ENTITY issues.disabledfilters.enable.label "Ota suodatin käyttöön">
+<!ENTITY issues.override.label "Asetukset ovat oikein, &amp;jatka raportoimista">
+<!ENTITY issues.nosubscriptions.description "Näyttäisi siltä, että et ole tilannut yhtään valmiiksi tehtyä suodatinlistaa, jotka poistavat automaattisesti sivuilta epämieluisaa sisältöä.">
+<!ENTITY typeSelector.falsePositive.description "Valitse tämä vaihtoehto, jos sivulta puuttu olennaista sisältöä tai se näkyy väärin. Voit päätellä onko Adblock Plus syy ongelmaan ottamalla sen väliaikaisesti pois kaytöstä.">
+<!ENTITY typeSelector.other.label "&amp;Muu ongelma">
+<!ENTITY emailComment.label "On suositeltavaa antaa voimassa oleva sähköpostiosoite, jotta sinuun voidaan ottaa yhteyttä raporttiin liittyvissä kysymyksissä. Tämä mahdollistaa myös avustuksiesi tunnistamisen ja priorisoinnin korkeammalle.">
+<!ENTITY issues.whitelist.remove.label "Ota Adblock Plus uudestaan käyttöön tällä sivulla">
+<!ENTITY outdatedSubscriptions.description "Seuraavia suodatintilauksia ei ole päivitetty ainakaan kahteen viikkoon. Päivitä nämä tilaukset ennen raportin lähettämistä, sillä ongelma on saattaanut jo ratketa.">
+<!ENTITY dataCollector.description "Odota hetki, kun Adblock Plus kerää tarvittavia tietoja.">
+<!ENTITY sendButton.label "&amp;Lähetä raportti">
+<!ENTITY comment.label "Kommentti (&amp;valinnainen):">
+<!ENTITY sendPage.errorMessage "Raportin lähettäminen epäonnistui virhekoodilla &quot;?1?&quot;. Varmista että olet yhteydessä Internettiin ja yritä uudelleen. Mikäli ongelma ei katoa, pyydä apua osoitteesta [link]Adblock Plus forum[/link].">
+<!ENTITY showRecentReports.label "Näytä viimeksi lähetetyt raportit">
+<!ENTITY commentPage.heading "Lisää kommentti">
+<!ENTITY update.start.label "Aloita päivittäminen nyt">
+<!ENTITY issues.disabledfilters.description "Seuraavat suodattimet on poistettu käytöstä mutta niillä saatta silti olla vaikutusta tällä sivulla:">
+<!ENTITY screenshot.description "Sama sivu saattaa näyttää erilaiselta eri ihmisillä. Ongelman ymmärtämistä saattaa helpottaa, jos liität raporttiisi kuvakaappauksen. Voit myös poistaa arkaluontoista tietoa tai merkitä ongelman kannalta huomattavia kohtia. Tehdäksesi tämän napsauta vastaava painiketta ja valitse kuvan kohta hiirellä.">
+<!ENTITY screenshot.attach.label "&amp;Liitä sivun kuva raporttiin">
+<!ENTITY issues.whitelist.description "Adblock Plus on tällä hetkellä poistettu käytöstä sivulla, jota olet raportoimassa. Ota se käyttöön ja ennen raportointia päivitä sivu. Tämä auttaa rapotin tutkimista.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus &amp;ei estä mainosta">
+<!ENTITY typeSelector.heading "Valitse ongelman tyyppi">
+<!ENTITY anonymity.warning "Sinuun ei voida ottaa yhteyttä ja todennäköisesti priorisoimme raportin alemmas.">
+<!ENTITY wizard.title "Ongelman raportointi">
+<!ENTITY issues.ownfilters.disable.label "Poista suodatin käytöstä">
+<!ENTITY commentPage.description "Alla olevaan tekstikenttään voit syöttää kommentin (englanniksi) helpottaaksesi meitä ymmärtämään ongelman. Tämä vaihe on valinnainen mutta suositeltava, jos ongelma ei ole ilmiselvä. Voit myös käydä läpi raportin tiedot ennen sen lähettämistä.">
+<!ENTITY comment.lengthWarning "Kommentin pituus ylittää 1000 merkkiä. Vain ensimmäiset 1000 merkkiä lähetetään.">
+<!ENTITY typeSelector.falseNegative.description "Valitse tämä vaihtoehto, jos mainos näkyy vaikka Adblock Plus on käytössä.">
+<!ENTITY sendPage.waitMessage "Odota, Adblock Plus lähettää raporttia.">
+<!ENTITY dataCollector.heading "Tervetuloa ongelman raportoijaan">
+<!ENTITY screenshot.heading "Liitä kuvakaappaus">
+<!ENTITY sendPage.heading "Raportin lähettäminen">
+<!ENTITY issues.subscriptionCount.description "Näyttäisi siltä, että liian monta suodatintilausta on tilattuna. Tällainen järjestely ei ole suositeltavaa, sillä se nostaa ongelmien todennäköisyyttä. Emme voi hyväksyä ongelmaraporttia, koska jää epäselväksi kenen suodatintilauksen tekijän on ryhdyttävä korjaustoimiin. Poista kaikki paitsi välttämättömät suodatintilaukset ja kokeile esiintyykö ongelma yhä.">
+<!ENTITY screenshot.mark.label "&amp;Merkkaa ongelma">
+<!ENTITY privacyPolicy.label "Yksityisyyskäytäntö">
+<!ENTITY issues.description "Adblock Plus on havainnut ongelmia asetuksissa, jotka saattavat aiheuttaa tämän ongelman tai tehdä raportin tutkimisesta vaikeaa.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/sidebar.dtd
new file mode 100644
index 0000000..5a6c4d0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Välkytä reunoja">
+<!ENTITY address.label "Osoite">
+<!ENTITY context.open.label "Avaa uuteen välilehteen">
+<!ENTITY type.label "Tyyppi">
+<!ENTITY tooltip.filterSource.label "Suodattimen lähde:">
+<!ENTITY noitems.label "Ei estettäviä elementtejä">
+<!ENTITY filter.label "Suodatin">
+<!ENTITY tooltip.size.label "Koko:">
+<!ENTITY reattach.label "Kiinnitä">
+<!ENTITY search.label "&amp;Etsi:">
+<!ENTITY docDomain.thirdParty "(kolmas osapuoli)">
+<!ENTITY filterSource.label "Suodattimen lähde">
+<!ENTITY tooltip.docDomain.label "Dokumentin lähde:">
+<!ENTITY context.copy.label "Kopioi osoite">
+<!ENTITY tooltip.type.label "Tyyppi:">
+<!ENTITY context.disablefilter.label "Poista käytöstä suodatin: ?1?">
+<!ENTITY context.copyFilter.label "Kopioi suodatin">
+<!ENTITY context.block.label "Estä elementti">
+<!ENTITY context.enablefilter.label "Palauta suodatin: ?1?">
+<!ENTITY detach.label "Irrota">
+<!ENTITY whitelisted.label "Sallittu sivu">
+<!ENTITY context.disablefilteronsite.label "Poista tämä suodatin käytöstä osoiteessa ?1?">
+<!ENTITY detached.title "Adblock Plus: Estettävien elementtien lista (irrotettu)">
+<!ENTITY docDomain.firstParty "(ensimmäinen osapuoli)">
+<!ENTITY tooltip.type.whitelisted "(sallittu)">
+<!ENTITY tooltip.filter.label "Vaikuttava suodatin:">
+<!ENTITY tooltip.filter.disabled "(poistettu käytöstä)">
+<!ENTITY context.editfilter.label "Muokkaa suodatinta">
+<!ENTITY tooltip.type.blocked "(estetty)">
+<!ENTITY size.label "Koko">
+<!ENTITY context.whitelist.label "Lisää poikkeusehto">
+<!ENTITY context.selectAll.label "Valitse kaikki">
+<!ENTITY state.label "Tila">
+<!ENTITY docDomain.label "Dokumentin lähde">
+<!ENTITY tooltip.address.label "Osoite:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/subscriptionSelection.dtd
new file mode 100644
index 0000000..694748c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Lisää myös suodatintilaus &quot;?1?&quot;">
+<!ENTITY list.download.failed "Suodatinlistan noutaminen epäonnistui.">
+<!ENTITY list.download.retry "Yritä uudestaan">
+<!ENTITY title.label "Tilauksen nimi:">
+<!ENTITY list.download.website "Näytä verkkosivu">
+<!ENTITY supplementMessage "Tämä suodatintilaus on tarkoitettu käytettäväksi yhdessä suodatintilauksen &quot;?1?&quot; kanssa, jota et vielä käytä.">
+<!ENTITY viewList.label "Näytä suodattimet">
+<!ENTITY visitHomepage.label "Vieraile kotisivulla">
+<!ENTITY addSubscription.label "Lisää suodatintilaus">
+<!ENTITY dialog.title "Lisää Adblock Plus -suodatintilaus">
+<!ENTITY location.label "Suodatinlistan sijainti:">
+<!ENTITY fromWeb.description "Vahvista tämän suodatintilauksen lisääminen. Voit muuttaa tilauksen nimeä tai sijaintia ennen sen lisäämistä.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/composer.dtd
new file mode 100644
index 0000000..285f961
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "e&amp;n fin d'adresse">
+<!ENTITY domainRestriction.label "Restrein&amp;dre au domaine :">
+<!ENTITY collapse.default.no.label "Utiliser le comportement par défaut (non)">
+<!ENTITY firstParty.label "Provenant unique&amp;ment du même domaine">
+<!ENTITY preferences.label "&amp;Afficher les filtres existants…">
+<!ENTITY pattern.label "Proposition de motifs">
+<!ENTITY thirdParty.label "Provenan&amp;t uniquement d'autres domaines">
+<!ENTITY filter.label "Nouveau &amp;filtre :">
+<!ENTITY collapse.label "&amp;Réutiliser l'espace de l'élément filtré :">
+<!ENTITY match.warning "Le motif que vous avez saisi ne correspondra plus à l'adresse devant être bloquée/autorisée et n'aura plus aucun effet sur elle.">
+<!ENTITY anchor.start.label "en déb&amp;ut d'adresse">
+<!ENTITY matchCase.label "Sensible à la &amp;casse">
+<!ENTITY custom.pattern.label "&amp;Personnalisé :">
+<!ENTITY unselectAllTypes.label "Ne rien sélectionner">
+<!ENTITY type.whitelist.label "Règle d'e&amp;xception">
+<!ENTITY regexp.warning "Le motif que vous avez indiqué sera interprété comme une expression régulière qui ne peut être traitée efficacement par Adblock Plus et ralentira votre navigation. Si vous ne souhaitiez pas utiliser d'expression régulière, veuillez ajouter un * à la fin du motif.">
+<!ENTITY dialog.title "Ajouter une règle de filtrage Adblock Plus">
+<!ENTITY basic.label "Affichage standard">
+<!ENTITY type.filter.label "Filtre &amp;bloquant">
+<!ENTITY types.label "Appliquer aux types suivants :">
+<!ENTITY shortpattern.warning "Le motif que vous avez indiqué est trop court pour être optimisé et ralentira votre navigation. Nous vous recommandons de choisir une chaîne de caractères plus longue pour ce filtre afin de permettre à Adblock Plus de le traiter plus efficacement.">
+<!ENTITY collapse.yes.label "Oui">
+<!ENTITY anchors.label "Accepter le motif uniquement :">
+<!ENTITY collapse.default.yes.label "Utiliser le comportement par défaut (oui)">
+<!ENTITY domainRestriction.help "Spécifiez un ou plusieurs domaines séparés par le symbole « | », le filtre ne s'appliquera alors qu'aux domaines indiqués. Le symbole « ~ » précédant un nom de domaine signifie que le filtre ne devra pas être appliqué à ce domaine.">
+<!ENTITY accept.label "Ajouter le filtre">
+<!ENTITY options.label "Options">
+<!ENTITY disabled.warning "Adblock Plus est actuellement désactivée. Vous pouvez continuer à ajouter des filtres mais ils ne seront pas appliqués tant que vous n'aurez pas [link]activé Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "a&amp;u début du nom de domaine">
+<!ENTITY collapse.no.label "Non">
+<!ENTITY selectAllTypes.label "Tout sélectionner">
+<!ENTITY advanced.label "Affichage avancé">
+<!ENTITY pattern.explanation "Le motif peut être une partie de l'adresse ; le symbole * jouant le rôle de joker. Le filtre ne sera appliqué qu'aux adresses coïncidant avec le motif.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/filters.dtd
new file mode 100644
index 0000000..6583fd9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Tous vos filtres personnalisés seront remplacés par le contenu du fichier sélectionné. Voulez-vous continuer ?">
+<!ENTITY slow.column "Fi&amp;ltres lents">
+<!ENTITY enabled.column "A&amp;ctivé">
+<!ENTITY subscription.lastDownload.checksumMismatch "Échec, le checksum ne correspond pas !">
+<!ENTITY noFiltersInGroup.text "Le groupe sélectionné est vide.">
+<!ENTITY subscription.actions.label "Actions">
+<!ENTITY filter.selectAll.label "Tout sélectionner">
+<!ENTITY backupButton.label "&amp;Sauvegarde et restauration">
+<!ENTITY restore.minVersion.warning "Attention : le fichier a été créé avec une nouvelle version d'Adblock Plus. Vous devriez mettre à jour et passer à la dernière version d'Adblock Plus avant de restaurer vos données avec ce fichier.">
+<!ENTITY restore.error "Les données de ce fichier ne peuvent être traitées, il est possible qu'il ne s'agisse pas d'un fichier de données d'Adblock Plus.">
+<!ENTITY sort.ascending.label "Ordre de &amp;A &gt; Z">
+<!ENTITY sort.label "&amp;Trier par">
+<!ENTITY subscription.source.label "Liste de filtres">
+<!ENTITY hitcount.column "Co&amp;mpteur">
+<!ENTITY noFilters.text "Vous n'avez pas encore de filtres personnalisés.">
+<!ENTITY backup.custom.title "Uniquement les filtres personnalisés">
+<!ENTITY subscription.external.label "Mis à jour par une autre extension">
+<!ENTITY subscription.delete.label "Supprimer">
+<!ENTITY noGroupSelected.text "Vous devez choisir un groupe de filtres avant de pouvoir afficher ses filtres.">
+<!ENTITY filter.cut.label "Couper">
+<!ENTITY restore.default.label "Restaurer la sauvegarde du ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Téléchargement en cours…">
+<!ENTITY subscriptions.tab.label "Abonnements à des filtres">
+<!ENTITY sort.descending.label "Ordre de &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Souhaitez-vous vraiment supprimer tous les filtres sélectionnés ?">
+<!ENTITY filter.delete.label "Supprimer">
+<!ENTITY addSubscriptionAdd.label "Ajouter">
+<!ENTITY viewMenu.label "Affichage">
+<!ENTITY subscription.lastDownload.unknown "Inconnu">
+<!ENTITY addSubscriptionCancel.label "Annuler">
+<!ENTITY subscription.enabled.label "Activé">
+<!ENTITY noSubscriptions.text "Vous n'avez pas encore ajouté d'abonnement. Adblock Plus ne bloquera rien sans filtres, veuillez utiliser « Ajouter un abonnement » pour en ajouter.">
+<!ENTITY subscription.update.label "Mettre à jour les filtres">
+<!ENTITY dialog.title "Préférences Adblock Plus">
+<!ENTITY addFilter.label "Ajouter u&amp;n filtre">
+<!ENTITY subscription.minVersion.warning "Cet abonnement nécessite une version plus récente d'Adblock Plus, vous devriez installer la dernière version d'Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Échec, ceci n'est pas une adresse valide !">
+<!ENTITY backup.error "Une erreur s'est produite lors de l'écriture des filtres dans le fichier. Assurez-vous que ce fichier n'est pas protégé en écriture ou utilisé par une autre application.">
+<!ENTITY filter.moveUp.label "Monter">
+<!ENTITY addGroup.label "Ajouter un &amp;groupe de filtres">
+<!ENTITY filter.edit.label "Modifier">
+<!ENTITY subscription.showHideFilters.label "Afficher/masquer les filtres">
+<!ENTITY acceptableAds2.label "Autor&amp;iser certaines publicités non-intrusives">
+<!ENTITY addSubscriptionOther.label "Ajouter un autre abonnement">
+<!ENTITY close.label "Fermer">
+<!ENTITY sort.none.label "&amp;Non trié">
+<!ENTITY filter.actions.label "Actions sur filtre">
+<!ENTITY filter.copy.label "Copier">
+<!ENTITY filter.moveDown.label "Descendre">
+<!ENTITY filter.resetHitCounts.label "Réinitialiser le compteur">
+<!ENTITY readMore.label "En apprendre davantage">
+<!ENTITY subscription.moveUp.label "Monter">
+<!ENTITY addSubscription.label "S'abonner à la liste de &amp;filtres">
+<!ENTITY subscription.homepage.label "Page d'accueil">
+<!ENTITY backup.complete.title "Tous les filtres et abonnements">
+<!ENTITY restore.own.label "Restaurer une sauvegarde personnelle">
+<!ENTITY restore.complete.warning "Toutes vos préférences pour les filtres seront remplacées par le contenu du fichier sélectionné. Voulez-vous continuer ?">
+<!ENTITY filters.tab.label "Filtres personnalisés">
+<!ENTITY backup.label "Créer une nouvelle sauvegarde">
+<!ENTITY find.label "Re&amp;chercher">
+<!ENTITY subscription.moveDown.label "Descendre">
+<!ENTITY subscription.lastDownload.connectionError "Échec, erreur lors du téléchargement !">
+<!ENTITY subscription.lastDownload.success "Réussie">
+<!ENTITY subscription.lastDownload.invalidData "Échec, ceci n'est pas une liste de filtres valide !">
+<!ENTITY filter.paste.label "Coller">
+<!ENTITY subscription.disabledFilters.enable "Activer les filtres désactivés">
+<!ENTITY lasthit.column "&amp;Dernière utilisation">
+<!ENTITY subscription.editTitle.label "Modifier le nom">
+<!ENTITY subscription.disabledFilters.warning "Certains filtres de cet abonnement sont désactivés.">
+<!ENTITY filter.column "Règle de &amp;filtrage">
+<!ENTITY subscription.lastDownload.label "Dernière mise à jour :">
+<!ENTITY viewList.label "Afficher la liste">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/firstRun.properties
new file mode 100644
index 0000000..ddc8c7b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Naviguer incognito en désactivant le suivi, en masquant vos traces aux publicistes qui traqueraient vos faits et gestes.
+firstRun_toggle_off=INACTIF
+firstRun_feature_tracking=Désactiver l'espionnage
+firstRun_feature_malware=Blocage des logiciels malveillants
+firstRun_title=Adblock Plus a été installée
+firstRun_toggle_on=ACTIF
+firstRun_acceptableAdsExplanation=Nous aimerions encourager les sites Web à utiliser de la publicité honnête et discrète. C'est pourquoi nous avons établi <a>des lignes directrices strictes</a> afin d'identifier les annonces acceptables, par défaut. Si vous souhaitez tout de même bloquer toutes les publicités, vous pouvez <a>désactiver</a> cela dans les paramètres en quelques secondes.
+firstRun_contributor_credits=Crédits des contributeurs
+firstRun_dataCorruptionWarning=Cette page s'affiche-t-elle encore ? <a>Cliquez ici !</a>
+firstRun_acceptableAdsHeadline=Les pubs seront à présent bloquées
+firstRun_share=Parlez-en à vos amis
+firstRun_share_headline=<a>Donnez-nous un coup de main</a> à rendre le Web meilleur
+firstRun_feature_social_description=Se débarrasser automatiquement des boutons de réseaux sociaux tels que les « J'aime » Facebook qui apparaissent sur les pages Web et suivent votre comportement.
+firstRun_filterlistsReinitializedWarning=Il semblerait qu'à cause d'un problème, tous les filtres aient été supprimés et que nous n'ayons été en mesure de rétablir une sauvegarde. C'est pourquoi nous avons été contraints de réinitialiser vos filtres et les paramètres des publicités acceptables. Veuillez vérifier vos listes de filtres et les paramètres de publicités acceptables dans les <a>options d'Adblock Plus</a>.
+firstRun_feature_malware_description=Rendre votre navigation plus sécurisée en bloquant les domaines malveillants connus.
+firstRun_features=Adblock Plus peut faire plus que bloquer les pubs
+firstRun_donate=Faire un don
+firstRun_donate_label=Soutenir notre projet
+firstRun_feature_social=Supprimer les boutons des réseaux sociaux
+firstRun_legacySafariWarning=Vous utilisez une vieille version de Safari incompatible avec Adblock Plus. Elle pourra ne pas bien fonctionner ou nuire à l'expérience utilisateur sur certains sites Web. Nous recommandons fortement de mettre à jour Safari, soit vers la version 6.1.1 ou supérieure (sur OS X 10.8 Mountain Lion), soit vers la version 7.0.1 ou supérieure (sur OS X 10.9 Mavericks) ou d'utiliser la dernière version de Mozilla Firefox, Google Chrome ou Opera.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/global.properties
new file mode 100644
index 0000000..351b82d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Aucun élément filtrable sur cette page
+action3_tooltip=Cliquez pour activer/désactiver Adblock Plus.
+notification_antiadblock_title=Cacher les messages ciblés ?
+type_label_script=script
+filter_elemhide_nocriteria=Aucun critère spécifié pour reconnaître l'élément à masquer
+blockingGroup_title=Règles de blocage de publicités
+whitelisted_tooltip=Adblock Plus est désactivée pour cette page.
+type_label_stylesheet=feuille de styles
+blocked_count_tooltip=?1? bloqués sur ?2?
+type_label_font=police
+type_label_popup=Fenêtre popup
+filter_regexp_tooltip=Ce filtre est soit une expression régulière, soit trop court pour être optimisé. Un excès de ce genre de filtres pourrait ralentir votre navigation.
+action0_tooltip=Cliquez pour afficher le menu contextuel, clic du milieu pour activer/désactiver.
+whitelisted_page=Adblock Plus a été désactivée pour cette page
+remove_group_warning=Souhaitez-vous vraiment supprimer ce groupe ?
+action1_tooltip=Cliquez pour ouvrir/fermer la liste des éléments filtrables, clic du milieu pour activer/désactiver.
+type_label_xmlhttprequest=requête XML
+active_tooltip=Adblock Plus est active, ?1? abonnement(s) et ?2? filtre(s) personnel(s) utilisé(s).
+type_label_document=document
+type_label_object_subrequest=sous-requête objet
+whitelistGroup_title=Règles d'exceptions
+disabled_tooltip=Adblock Plus est désactivée.
+filter_elemhide_duplicate_id=Il n'est possible de spécifier qu'une ID de l'élément à masquer
+type_label_object=objet
+action2_tooltip=Cliquez pour ouvrir les préférences, clic du milieu pour activer/désactiver.
+type_label_subdocument=cadre
+clearStats_warning=Cela va remettre à zéro les statistiques d'utilisation de filtre et désactiver le comptage d'utilisation de filtre. Souhaitez-vous vraiment faire cela ?
+notification_antiadblock_message=Ce site est connu pour afficher des messages destinés aux utilisateurs d'Adblock Plus. Voulez-vous qu'Adblock Plus cache ces messages ?
+blocked_count_addendum=(également en liste blanche : ?1?, masqué(s) : ?2?)
+subscription_invalid_location=L'adresse indiquant l'emplacement de la liste de filtres n'est ni une URL valide, ni un nom de fichier valide.
+type_label_image=image
+remove_subscription_warning=Souhaitez-vous vraiment supprimer cet abonnement ?
+type_label_other=autre
+mobile_menu_enable=ABP : Activer
+type_label_media=audio/vidéo
+mobile_menu_disable_site=ABP : Désactiver pour ?1?
+elemhideGroup_title=Règles de masquage d'éléments
+mobile_menu_enable_site=ABP : Activer pour ?1?
+type_label_elemhide=masqué
+newGroup_title=Nouveau groupe de filtres
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/overlay.dtd
new file mode 100644
index 0000000..c07c593
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Oui">
+<!ENTITY notification.button.no "&amp;Non">
+<!ENTITY sync.label "S&amp;ynchroniser les paramètres d'Adblock Plus">
+<!ENTITY whitelist.site.label "Désactiver pour ?1?">
+<!ENTITY filters.label "Pré&amp;férences de filtre">
+<!ENTITY disable.label "Désactiver partout">
+<!ENTITY objecttab.title "Bloquer">
+<!ENTITY objecttab.tooltip "Cliquer ici afin qu'Adblock Plus bloque cet objet">
+<!ENTITY menuitem.label "Préférences d'Ad&amp;block Plus">
+<!ENTITY objecttabs.label "Afficher une étiquette pour Flash et &amp;Java">
+<!ENTITY sendReport.label "&amp;Signaler un problème sur cette page">
+<!ENTITY whitelist.page.label "Désactiver pour cette page uniquement">
+<!ENTITY context.image.label "Bloquer l'image avec Adblock Plus">
+<!ENTITY counthits.label "Co&amp;mpter la fréquence d'utilisation de filtre">
+<!ENTITY opensidebar.label "Ouvrir la liste des élé&amp;ments filtrables">
+<!ENTITY notification.button.close "&amp;Fermer">
+<!ENTITY contribute.label "Contribuer à Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Bloquer le cadre avec Adblock Plus">
+<!ENTITY blocked.tooltip "Éléments bloqués sur cette page :">
+<!ENTITY hideplaceholders.label "Ré&amp;utiliser l'espace laissé par les éléments bloqués">
+<!ENTITY showinstatusbar.label "Afficher da&amp;ns la barre d'état">
+<!ENTITY sidebar.title "Éléments filtrables dans la page courante">
+<!ENTITY options.label "&amp;Options">
+<!ENTITY context.object.label "Bloquer l'objet avec Adblock Plus">
+<!ENTITY context.removeWhitelist.label "Activer à nouveau Adblock Plus pour cette page">
+<!ENTITY filters.tooltip "Filtres les plus utilisés :">
+<!ENTITY closesidebar.label "Fer&amp;mer la liste des éléments filtrables">
+<!ENTITY showintoolbar.label "Afficher dans la barre d'&amp;outils">
+<!ENTITY status.tooltip "État :">
+<!ENTITY context.media.label "Bloquer les vidéos/audios avec Adblock Plus">
+<!ENTITY subscription.update.label "Mettre à jour les filtres">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/sendReport.dtd
new file mode 100644
index 0000000..ee5069b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "A&amp;nnuler">
+<!ENTITY issues.disabledgroups.description "Les abonnements/groupes de filtres suivants sont désactivés, ils ne peuvent pas encore avoir d'effet sur cette page :">
+<!ENTITY showData.label "Afficher les données du signalement">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus bloque &amp;trop">
+<!ENTITY issues.change.description "Votre configuration a été modifiée. Veuillez actualiser la page pour tester les modifications et soumettez un signalement si le problème n'a pas été résolu en effectuant cette modification.">
+<!ENTITY email.label "&amp;Courriel :">
+<!ENTITY issues.openPreferences.label "Ouvrir les préférences de filtre">
+<!ENTITY sendPage.confirmation "Votre signalement a été envoyé. Vous pouvez y accéder à l'adresse suivante :">
+<!ENTITY copyLink.label "Co&amp;pier le lien du signalement">
+<!ENTITY issues.nofilters.description "Adblock Plus ne bloque rien sur la page courante. Le problème que vous observez n'est probablement pas à mettre en relation avec Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Le problème que vous signalez est probablement déjà connu. Davantage d'informations :">
+<!ENTITY typeSelector.other.description "Choisissez cette option si vous pensez qu'Adblock Plus elle-même est la cause du problème plutôt que ses filtres.">
+<!ENTITY issues.disabledgroups.enable.label "Activer l'abonnement/le groupe de filtres">
+<!ENTITY typeWarning.override.label "Je comprend&amp;s et souhaite soumettre le signalement tout de même">
+<!ENTITY issues.disabled.enable.label "Activer Adblock Plus">
+<!ENTITY update.fixed.description "Les mises à jour de vos abonnements de filtres ont probablement résolu le problème que vous avez signalé. Veuillez recharger la page et réessayer, appuyez à nouveau sur « Signaler » si le problème persiste.">
+<!ENTITY anonymous.label "Soumission &amp;anonyme">
+<!ENTITY reloadButton.label "&amp;Actualiser la page">
+<!ENTITY recentReports.clear.label "&amp;Supprimer tous les signalements">
+<!ENTITY typeSelector.description "Cette fenêtre vous guidera à travers les étapes nécessaires à la soumission d'un problème Adblock Plus. Dans un premier temps, veuillez choisir le type de problème rencontré sur cette page :">
+<!ENTITY screenshot.remove.label "&amp;Supprimer les données sensibles">
+<!ENTITY issues.ownfilters.description "Certains des filtres utilisés sur cette page ont été définis par l'utilisateur. Veuillez désactiver les filtres qui ont pu avoir été à l'origine du problème :">
+<!ENTITY update.inProgress.description "Adblock Plus doit mettre à jour vos abonnements de filtres pour s'assurer que le problème n'a pas déjà été résolu. Veuillez patienter…">
+<!ENTITY sendPage.retry.label "Envoyer à nouveau">
+<!ENTITY data.label "&amp;Données du signalement :">
+<!ENTITY recentReports.label "Vos signalements récemment soumis">
+<!ENTITY typeWarning.description "Vous avez indiqué que vous voulez signaler un problème général concernant Adblock Plus plutôt qu'un problème de filtres. Veuillez prendre note que ce type de problèmes est plutôt signalé dans le [link]forum d'Adblock Plus[/link]. Vous devriez utiliser la soumission de signalement uniquement pour ajouter un point à une discussion existante, puisque personne n'en prendra connaissance à moins que vous leur fournissiez le lien pointant vers la discussion. Le lien automatiquement généré sera fourni après la soumission du signalement.">
+<!ENTITY issues.disabled.description "Adblock Plus est désactivée, elle ne bloquera rien dans cet état.">
+<!ENTITY attachExtensions.label "Joindre une liste d'e&amp;xtensions actives au signalement au cas où il y aurait un problème de conflit d'extension">
+<!ENTITY issues.nosubscriptions.add.label "Ajouter un abonnement">
+<!ENTITY issues.disabledfilters.enable.label "Activer le filtre">
+<!ENTITY issues.override.label "La &amp;configuration est correcte, poursuivre le signalement">
+<!ENTITY issues.nosubscriptions.description "Vous ne semblez pas être abonné à une liste de filtres prédéfinis qui suppriment automatiquement des contenus indésirables de sites Web.">
+<!ENTITY typeSelector.falsePositive.description "Choisissez cette option si le contenu de la page est sévèrement tronqué, est mal affiché ou ne fonctionne pas correctement. Vous pouvez vérifier si Adblock Plus en est la cause en la désactivant temporairement.">
+<!ENTITY typeSelector.other.label "&amp;Autre problème">
+<!ENTITY emailComment.label "Nous vous encourageons à saisir un courriel valide afin que nous puissions vous contacter pour toute question concernant votre signalement. Cela nous permettra également de reconnaître vos contributions et de les traiter prioritairement.">
+<!ENTITY issues.whitelist.remove.label "Activer à nouveau Adblock Plus sur cette page">
+<!ENTITY outdatedSubscriptions.description "Les abonnements de filtres suivants n'ont pas été mis à jour depuis au moins deux semaines. Veuillez mettre à jour ces abonnements avant de signaler un problème, il se pourrait qu'il ait déjà été résolu.">
+<!ENTITY dataCollector.description "Veuillez patienter quelques instants pendant qu'Adblock Plus réunit les données nécessaires.">
+<!ENTITY sendButton.label "Envo&amp;yer le signalement">
+<!ENTITY comment.label "&amp;Commentaire (facultatif) :">
+<!ENTITY sendPage.errorMessage "Une tentative d'envoi du signalement a échoué avec le code erreur « ?1? ». Veuillez vérifier que vous êtes bien connecté à Internet et réessayer. Si le problème persiste, veuillez demander assistance dans le [link]forum d'Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Afficher les signalements soumis récemment">
+<!ENTITY commentPage.heading "Commentaire">
+<!ENTITY update.start.label "Mettre à jour maintenant">
+<!ENTITY issues.disabledfilters.description "Les filtres suivants sont désactivés, ils ne peuvent pas encore avoir d'effet sur cette page :">
+<!ENTITY screenshot.description "La même page peut s'afficher différemment pour différentes personnes. Cela pourrait être utile de joindre une copie d'écran à votre signalement. Vous pouvez enlever les parties contenant des informations sensibles et mettre en évidence les zones où le problème est visible. Pour cela, cliquez sur le bouton correspondant et sélectionnez une zone de l'image avec votre souris.">
+<!ENTITY screenshot.attach.label "&amp;Joindre une image de la page au signalement">
+<!ENTITY issues.whitelist.description "Adblock Plus est actuellement désactivée sur la page que vous signalez. Veuillez l'activer à nouveau et actualiser la page avant de soumettre le signalement pour qu'une recherche de solutions soit entamée.">
+<!ENTITY typeSelector.falseNegative.label "Ad&amp;block Plus ne bloque pas une publicité">
+<!ENTITY typeSelector.heading "Choisir le type de problème">
+<!ENTITY anonymity.warning "Nous ne serons pas en mesure de vous recontacter et votre signalement ne sera probablement pas traité prioritairement.">
+<!ENTITY wizard.title "Signalement de problèmes">
+<!ENTITY issues.ownfilters.disable.label "Désactiver le filtre">
+<!ENTITY commentPage.description "Le champ ci-dessous vous permet de saisir un commentaire pour nous aider à comprendre le problème. Cette étape est facultative mais recommandée si le problème n'est pas évident à détecter. Vous pouvez également revoir les données du signalement avant l'envoi.">
+<!ENTITY comment.lengthWarning "Votre commentaire comporte plus de 1000 caractères. Seuls les 1000 premiers caractères seront envoyés.">
+<!ENTITY typeSelector.falseNegative.description "Choisissez cette option si une publicité est tout de même affichée bien qu'Adblock Plus soit activée.">
+<!ENTITY sendPage.waitMessage "Veuillez patienter pendant qu'Adblock Plus soumet votre signalement.">
+<!ENTITY dataCollector.heading "Bienvenue dans l'assistant de signalement de problèmes">
+<!ENTITY screenshot.heading "Joindre une copie d'écran">
+<!ENTITY sendPage.heading "Envoyer le signalement">
+<!ENTITY issues.subscriptionCount.description "Il semblerait que vous soyez abonné(e) à trop de listes de filtres. Cette configuration n'est pas recommandée car elle augmentera la probabilité de rencontrer des problèmes. Nous ne pouvons également pas accepter votre signalement parce qu'il ne sera pas facile de définir quel auteur d'abonnement devra entreprendre quelque chose. Veuillez supprimer tous les abonnements exceptés ceux qui sont absolument nécessaires et vérifier si le problème se produit encore.">
+<!ENTITY screenshot.mark.label "&amp;Mettre en évidence le problème">
+<!ENTITY privacyPolicy.label "Politique de confidentialité">
+<!ENTITY issues.description "Adblock Plus a détecté que votre configuration est mal paramétrée, cela pourrait être la cause du problème ou rendra la recherche de solution au signalement difficile.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/sidebar.dtd
new file mode 100644
index 0000000..ffdafff
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Faire clignoter les bordures de l'élément">
+<!ENTITY address.label "Adresse">
+<!ENTITY context.open.label "Ouvrir dans un nouvel onglet">
+<!ENTITY type.label "Type">
+<!ENTITY tooltip.filterSource.label "Source du filtre :">
+<!ENTITY noitems.label "Aucun élément filtrable">
+<!ENTITY filter.label "Filtre">
+<!ENTITY tooltip.size.label "Taille :">
+<!ENTITY reattach.label "Rattacher">
+<!ENTITY search.label "&amp;Rechercher :">
+<!ENTITY docDomain.thirdParty "(tierce partie)">
+<!ENTITY filterSource.label "Source du filtre">
+<!ENTITY tooltip.docDomain.label "Source du document :">
+<!ENTITY context.copy.label "Copier l'adresse de l'élément">
+<!ENTITY tooltip.type.label "Type :">
+<!ENTITY context.disablefilter.label "Désactiver le filtre ?1?">
+<!ENTITY context.copyFilter.label "Copier le filtre">
+<!ENTITY context.block.label "Bloquer cet élément">
+<!ENTITY context.enablefilter.label "Réactiver le filtre ?1?">
+<!ENTITY detach.label "Détacher">
+<!ENTITY whitelisted.label "Page dans la liste blanche">
+<!ENTITY context.disablefilteronsite.label "Désactiver ce filtre pour ?1?">
+<!ENTITY detached.title "Adblock Plus : éléments filtrables (détaché)">
+<!ENTITY docDomain.firstParty "(première partie)">
+<!ENTITY tooltip.type.whitelisted "(autorisée)">
+<!ENTITY tooltip.filter.label "Filtre utilisé :">
+<!ENTITY tooltip.filter.disabled "(désactivé)">
+<!ENTITY context.editfilter.label "Modifier le filtre actif">
+<!ENTITY tooltip.type.blocked "(bloquée)">
+<!ENTITY size.label "Taille">
+<!ENTITY context.whitelist.label "Ajouter à la liste blanche">
+<!ENTITY context.selectAll.label "Tout sélectionner">
+<!ENTITY state.label "État">
+<!ENTITY docDomain.label "Source du document">
+<!ENTITY tooltip.address.label "Adresse :">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/subscriptionSelection.dtd
new file mode 100644
index 0000000..56b935b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "&amp;Ajouter également l'abonnement « ?1? »">
+<!ENTITY list.download.failed "Adblock Plus n'a pu récupérer la liste des abonnements.">
+<!ENTITY list.download.retry "Essayer à nouveau">
+<!ENTITY title.label "&amp;Nom de l'abonnement :">
+<!ENTITY list.download.website "Afficher le site Web">
+<!ENTITY supplementMessage "Cet abonnement est prévu pour être utilisé avec l'abonnement &quot;?1?&quot; que vous n'utilisez pas encore.">
+<!ENTITY viewList.label "Afficher les filtres">
+<!ENTITY visitHomepage.label "Se rendre au site Web">
+<!ENTITY addSubscription.label "Ajouter l'abonnement">
+<!ENTITY dialog.title "Ajouter un abonnement à une liste de filtres Adblock Plus">
+<!ENTITY location.label "&amp;Emplacement de la liste :">
+<!ENTITY fromWeb.description "Veuillez confirmer que vous souhaitez ajouter cet abonnement. Vous pouvez modifier le titre ou l'emplacement de l'abonnement avant de l'ajouter.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/composer.dtd
new file mode 100644
index 0000000..79d4830
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "oan it ein fan it a&amp;dres">
+<!ENTITY domainRestriction.label "Behein ta do&amp;mein">
+<!ENTITY collapse.default.no.label "Brûk standert (nee)">
+<!ENTITY firstParty.label "Allinnich earst diel">
+<!ENTITY preferences.label "&amp;Toan besteande filters...">
+<!ENTITY pattern.label "Sykje nei patroan">
+<!ENTITY thirdParty.label "&amp;Allinnich tredde diel">
+<!ENTITY filter.label "Nije filter:">
+<!ENTITY collapse.label "Blokkearre ynklappe:">
+<!ENTITY match.warning "It patroan dy't jo opjûn hawwe is net lyk oan it adres om te blokkearjen/wytlisten en sil gjin effekt op it hawwe.">
+<!ENTITY anchor.start.label "oan it begjin fan it adres">
+<!ENTITY matchCase.label "&amp;Haadlettergefoelich">
+<!ENTITY custom.pattern.label "&amp;Oanpast:">
+<!ENTITY unselectAllTypes.label "Selektearje neat">
+<!ENTITY type.whitelist.label "&amp;Utsûnderingsrigel">
+<!ENTITY regexp.warning "It patroan dy't jo opjûn hawwe sil ynterpretearre wurde as reguliere ekspresje. In protte reguliere ekspresjes kinne it sneupjen fertrage. As jo net fan plan wienen om reguliere ekspresje te brûken, foegje in symboal * ta oan it ein fan it patroan.">
+<!ENTITY dialog.title "Foegje Adblock Plus filterrigel ta">
+<!ENTITY basic.label "Basisbyld">
+<!ENTITY type.filter.label "Blokkearfilter">
+<!ENTITY types.label "Tapasse op types:">
+<!ENTITY shortpattern.warning "It patroan dy't jo opjûn hawwe is te koart om te optimalisearjen, in protte reguliere ekspresje kinne it sneupjen fertrage. It wurdt oanret dat jo in langere útdrukking kieze foar dit filter.">
+<!ENTITY collapse.yes.label "Ja">
+<!ENTITY anchors.label "Akseptearje allinnich patroan:">
+<!ENTITY collapse.default.yes.label "Brûk standert (ja)">
+<!ENTITY domainRestriction.help "Spesifisearje ien of mear domeinen skieden troch it symboal &quot;|&quot;, it filter sil allinnich op dizze domeinen tapast wurden. It symboal &quot;~&quot; foar in domeinnamme betsjut dat it filter net tapast wurde moat op dat domein.">
+<!ENTITY accept.label "Filter tafoegje">
+<!ENTITY options.label "Opsjes">
+<!ENTITY disabled.warning "Adblock Plus is op dit stuit útskeakele. Jo kinne noch hieltyd filters tafoegje, mar dy sille net earder aktyf wêze as jo [link]Adblock Plus ynskeakelje[/link].">
+<!ENTITY anchor.start.flexible.label "oan it begjin fan de domeinnamme">
+<!ENTITY collapse.no.label "Nee">
+<!ENTITY selectAllTypes.label "Selektearje alles">
+<!ENTITY advanced.label "Avansearre byld">
+<!ENTITY pattern.explanation "It patroan kin elk part fan it adres wêze, symboal * wurket as joker. It filter sil allinnich tapast wurde op adressen neffens it patroan.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/filters.dtd
new file mode 100644
index 0000000..3ef491d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Alle foarkearen fan dyn eigen filters wurde ferfangen troch de data fan it selekteare bestand. Troch gean?">
+<!ENTITY slow.column "Lan&amp;gsame filters">
+<!ENTITY enabled.column "Yns&amp;keakele">
+<!ENTITY subscription.lastDownload.checksumMismatch "Mislearre, checksum komt net oerien">
+<!ENTITY noFiltersInGroup.text "Dizze groep is leech.">
+<!ENTITY subscription.actions.label "Akties">
+<!ENTITY filter.selectAll.label "Selekt alles">
+<!ENTITY backupButton.label "&amp;Feilich sette en werom sette">
+<!ENTITY restore.minVersion.warning "Warskouwing: Dit bestand is makke my in nije fersy fan Adblock Plus. Update dyn eigen Adblock Plus foardast dit bestand brûkst.">
+<!ENTITY restore.error "De data in dit bestand koe net brûkt wurde. Miskien is it gjin Adblock Plus backup bestand?">
+<!ENTITY sort.ascending.label "A &gt; Z sortearoarder">
+<!ENTITY sort.label "Sortearje op">
+<!ENTITY subscription.source.label "Filterlist">
+<!ENTITY hitcount.column "&amp;Hits">
+<!ENTITY noFilters.text "Do hast noch gjin eigen filters.">
+<!ENTITY backup.custom.title "Allinnich oanpasse filters">
+<!ENTITY subscription.external.label "Fernijd troch in oar útwreiding">
+<!ENTITY subscription.delete.label "furt goaie">
+<!ENTITY noGroupSelected.text "Do moast yn filter groep selektere foardast it filter sjen kist.">
+<!ENTITY filter.cut.label "Knippe">
+<!ENTITY restore.default.label "Backup werom sette fan ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Ynlade...">
+<!ENTITY subscriptions.tab.label "Filterabonneminten">
+<!ENTITY sort.descending.label "Z &gt; A sortearoarder">
+<!ENTITY filters.remove.warning "Wolst echt alle filters furt smite?">
+<!ENTITY filter.delete.label "Fuortsmite">
+<!ENTITY addSubscriptionAdd.label "Tafoegje">
+<!ENTITY viewMenu.label "Byld">
+<!ENTITY subscription.lastDownload.unknown "n.f.t.">
+<!ENTITY addSubscriptionCancel.label "Annulearje">
+<!ENTITY subscription.enabled.label "Ynskeakele">
+<!ENTITY noSubscriptions.text "Jo hawwe gjin ien filter tafoege. Adblock Plus sil neat blokkearje
+ sûnder filters, brûk &quot;Filterabonnemint tafoegje&quot; om
+ ta te foegjen.">
+<!ENTITY subscription.update.label "Update filters">
+<!ENTITY dialog.title "Adblock Plus Filterfoarkarren">
+<!ENTITY addFilter.label "Tafoegje">
+<!ENTITY subscription.minVersion.warning "Dit filter abonnemint had in nijere fersy fan Adblok Plus nedich. Update dyn Adblock nar de nijste fersy.">
+<!ENTITY subscription.lastDownload.invalidURL "Mislearre, gjin jildich adres">
+<!ENTITY backup.error "Der wy in probleem my it skriuwen fan de filters. Soarch der foar dast it wol skriuwe meist en dat it net troch in oar programma brûkt wurdt.">
+<!ENTITY filter.moveUp.label "Omheech">
+<!ENTITY addGroup.label "Filter groep tafoege">
+<!ENTITY filter.edit.label "feroarje">
+<!ENTITY subscription.showHideFilters.label "Sjen/Ferstopje filters">
+<!ENTITY acceptableAds2.label "Let sommige net skreauwende advertinsjes ta">
+<!ENTITY addSubscriptionOther.label "In oar abonnemint tafoegje">
+<!ENTITY close.label "sluten">
+<!ENTITY sort.none.label "&amp;Net sortearre">
+<!ENTITY filter.actions.label "Filter aksjes">
+<!ENTITY filter.copy.label "Kopiearje">
+<!ENTITY filter.moveDown.label "Omleech">
+<!ENTITY filter.resetHitCounts.label "Reset statistysken">
+<!ENTITY readMore.label "Lês mear">
+<!ENTITY subscription.moveUp.label "omheech">
+<!ENTITY addSubscription.label "Filterabonnemint tafoegje">
+<!ENTITY subscription.homepage.label "Startside">
+<!ENTITY backup.complete.title "Alle filters en abonneminten">
+<!ENTITY restore.own.label "Eigen backup werom sette">
+<!ENTITY restore.complete.warning "Alle filter foarkearen wurde ferfangen troch de data fan it selekteare bestand. Troch gean?">
+<!ENTITY filters.tab.label "Oanpaste filters">
+<!ENTITY backup.label "Meitsje nije backup">
+<!ENTITY find.label "Sykje">
+<!ENTITY subscription.moveDown.label "omleech">
+<!ENTITY subscription.lastDownload.connectionError "Mislearre, ynlaadprobleem">
+<!ENTITY subscription.lastDownload.success "Slagge">
+<!ENTITY subscription.lastDownload.invalidData "Mislearre, gjin jildige filterlist">
+<!ENTITY filter.paste.label "Plakke">
+<!ENTITY subscription.disabledFilters.enable "Set filters oan">
+<!ENTITY lasthit.column "Lêste hit">
+<!ENTITY subscription.editTitle.label "Namme oanpasse">
+<!ENTITY subscription.disabledFilters.warning "Sommige filters in dit abonnemint stean út.">
+<!ENTITY filter.column "Filterrigel">
+<!ENTITY subscription.lastDownload.label "Lêste ynlaad:">
+<!ENTITY viewList.label "Lyst sjen">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/firstRun.properties
new file mode 100644
index 0000000..98c1128
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Ynternette mear privaat troch it útsetten fan tracking. Ferstopje dyn surf gedrach fan reklame bedriuwen dy't dy graach in de gaten wolle hâlde.
+firstRun_toggle_off=út
+firstRun_feature_tracking=Folgje út
+firstRun_feature_malware=Troep blokkeare
+firstRun_title=Adblock is no ynstalleare
+firstRun_acceptableAdsExplanation=Wy wolle graach dat websiden simpele net skreauwende advertinsjes brûke. Derom hawwe wy <a>stringe regels</a> om akseptabele advertinsjes te werkennen. Dit stiet ûnder standert settings. Ast noch steeds alle advertinsjes blokkeare wolst, dan kist dat <a>Út sette</a> yn in pear sekonden.
+firstRun_toggle_on=Oan
+firstRun_contributor_credits=Meiwurker Nammen
+firstRun_dataCorruptionWarning=Bliuwst dizze side sjen? <a>Klik hjir!</a>
+firstRun_acceptableAdsHeadline=ferfelende advertinsjes wurde no tsjin hâlden
+firstRun_share=sis it tsjin freonen
+firstRun_share_headline=<a>Jou ús in hantsje</a> om it web in moaiere plak te meitsjen
+firstRun_features=Adblock kin mear dwaan dan advertinsjes stopje
+firstRun_feature_malware_description=Meitsje dyn browser mear feiliger troch it blokkearen fan bekende rotsoai domeinen.
+firstRun_feature_social_description=Meitsje dyn ynternetten moaier en helje automatysk de knoppen furt as de Facebook Like, dy't op websiden stean om dyn gedrach by te hâlden.
+firstRun_donate=Donneare
+firstRun_donate_label=Support ús projekt
+firstRun_feature_social=Sociale Media knop fuorthelje
+firstRun_legacySafariWarning=Do brûkst in âlde fersy fan Safari dy net mear troch Adblock Plus understeunt wurdt. Miskien wurket it net goed of liket it soms wat raar. Wij adviseare om Safari 6.1.1 of heger (op OS X 10.8 Mountain Lion), of Safari 7.0.1 of heger (op OS X 10.9 Mavericks) te brûken, of de lêste fersy van Mozilla Firefox, Google Chrome of Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/global.properties
new file mode 100644
index 0000000..6e5bfc1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Gjin blokkearbere ûnderdielen op dizze side
+action3_tooltip=Klik om Adblock Plus yn/út te skeakeljen.
+type_label_script=skript
+filter_elemhide_nocriteria=Gjin kritearia spesifisearre om it te ferstoppen elemint te ûntdekken
+blockingGroup_title=Blokkearregels tafoegje
+whitelisted_tooltip=Adblock Plus is ynskeakele mar stiet út foar dizze side.
+type_label_stylesheet=stylside
+blocked_count_tooltip=?1? fan de ?2?
+type_label_font=lettertype
+type_label_popup=pop-up finster
+filter_regexp_tooltip=Dit filter is of in reguliere ekspresje of te koart om optimalisearre te wurden. Te folle fan dizze filters kinne it sneupjen fertrage.
+action0_tooltip=Klik om it kontekst-menu te iepenjen, midden-klik om yn/út te skeakeljen.
+whitelisted_page=Adblock Plus is útskeakele foar dizze side
+remove_group_warning=Wolst do dizze groep echt furt helje?
+action1_tooltip=Klik om blokkearbere ûnderdielen te iepenjen/sluten, midden-klik om yn/út te skeakeljen.
+type_label_xmlhttprequest=XML fersyk
+active_tooltip=Adblock Plus is ynskeakele, ?1? filter abonnemint(en) en ?2? oanpaste filter(s) yn gebrûk.
+type_label_document=dokumint
+type_label_object_subrequest=objekt subfersyk
+whitelistGroup_title=Utsûnderingsregels
+disabled_tooltip=Adblock Plus is útskeakele.
+filter_elemhide_duplicate_id=Der kin allinnich ien ID fan it te ferstoppen elemint spesifisearre wurde
+type_label_object=objekt
+action2_tooltip=Klik om foarkarren te iepenjen, midden-klik om yn/út te skeakeljen.
+type_label_subdocument=dielfinster
+clearStats_warning=Dit sil alle filterhitstatistiken opnij ynstelle en it tellen fan filterhits útskeakelje. Wolle jo trochgean?
+blocked_count_addendum=(ek wytliste: ?1?, ferstoppe: ?2?)
+subscription_invalid_location=Dizze lokaasje foar in filterlist is gjin jildige URL of gjin jildige bestânsnamme.
+type_label_image=ôfbylding
+remove_subscription_warning=Witte jo seker dat jo dit abonnemint fuortsmite wolle?
+type_label_other=oars
+mobile_menu_enable=ABP: Oan sette
+type_label_media=audio/fideo
+mobile_menu_disable_site=ABP: Út sette op ?1?
+elemhideGroup_title=Elemint ferstopregels
+mobile_menu_enable_site=ABP: Oan sette op ?1?
+type_label_elemhide=ferstoppe
+newGroup_title=Nije filtergroep
+default_dialog_title=Adblock Plus
+notification_antiadblock_title=Hide targeted messages?
+notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages?
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/overlay.dtd
new file mode 100644
index 0000000..57e9f9e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Ja">
+<!ENTITY notification.button.no "&amp;Nee">
+<!ENTITY sync.label "Sync Adblock Plus opsjes">
+<!ENTITY whitelist.site.label "Utskeakelje op ?1?">
+<!ENTITY filters.label "Filterfoarkarren">
+<!ENTITY disable.label "Oeral útskeakelje">
+<!ENTITY objecttab.title "Blokkearje">
+<!ENTITY objecttab.tooltip "Klik hjir om dit objekt te blokkearjen mei Adblock Plus">
+<!ENTITY menuitem.label "&amp;Adblock Plus">
+<!ENTITY objecttabs.label "Ljepblêden sjen li&amp;tte op Flash en Java">
+<!ENTITY sendReport.label "Rapportearje probleem op dizze side">
+<!ENTITY whitelist.page.label "Allinnich op dizze side útskeakelje">
+<!ENTITY context.image.label "Ofbylding blokkearje">
+<!ENTITY counthits.label "Tel filterhits">
+<!ENTITY opensidebar.label "&amp;Blokkearbere ûnderdielen iepenje">
+<!ENTITY notification.button.close "&amp;Slûte">
+<!ENTITY contribute.label "Donearje oan Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Dielfinster blokkearje">
+<!ENTITY blocked.tooltip "Blokkearre ûnderdielen:">
+<!ENTITY hideplaceholders.label "Ferstop placeholders fan blokkearre eleminten">
+<!ENTITY showinstatusbar.label "Toane yn steatbalke">
+<!ENTITY sidebar.title "Blokkearbere ûnderdelen op dizze side">
+<!ENTITY options.label "Opsjes">
+<!ENTITY context.object.label "Objekt blokkearje">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: opnij ynskeakelje op dizze side">
+<!ENTITY filters.tooltip "Meast aktive filters:">
+<!ENTITY closesidebar.label "&amp;Blokkearbere ûnderdielen slute">
+<!ENTITY showintoolbar.label "To&amp;ane yn arkbalke">
+<!ENTITY status.tooltip "Steat:">
+<!ENTITY context.media.label "Adblock Plus: Blokkearje audio/fideo">
+<!ENTITY subscription.update.label "Update filters">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/sendReport.dtd
new file mode 100644
index 0000000..a4cdc9c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Ûngedien meitsje">
+<!ENTITY issues.disabledgroups.description "De folgjende filterabonneminten/filtergroepen binne útskeakele, dochs it kin wêze dat se effekt hawwe op dizze side:">
+<!ENTITY showData.label "Toan rapportgegevens">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blokkearret te &amp;folle">
+<!ENTITY issues.change.description "Jo konfiguraasje is wizige. Laad de side op 'e nij om de wizigings te testen en in rapport te stjoeren as it probleem net oplost is.">
+<!ENTITY email.label "E-mail:">
+<!ENTITY issues.openPreferences.label "Iepenje filteropsjes">
+<!ENTITY sendPage.confirmation "Jo rapport is bewarre. Jo kinne it besjen op it folgjende adres:">
+<!ENTITY copyLink.label "&amp;Kopiearje rapportkeppeling">
+<!ENTITY issues.nofilters.description "Adblock Plus blokkearret no neat op dizze side. It probleem dat jo sjogge hat wierskienlik neat fan dwaan mei Adblock Plus.">
+<!ENTITY sendPage.knownIssue "It probleem dat jo rapportearre hawwe is miskien al bekend. Mear ynformaasje:">
+<!ENTITY typeSelector.other.description "Selektearje dizze opsje as jo tinke dat it in probleem mei Adblock Plus sels is yn stee fan syn filters.">
+<!ENTITY issues.disabledgroups.enable.label "Filterabonnemint / filtergroep ynskeakelje">
+<!ENTITY typeWarning.override.label "Ik &amp;begryp it en wol it rapport wol ynstjoere">
+<!ENTITY issues.disabled.enable.label "Adblock Plus ynskeakelje">
+<!ENTITY update.fixed.description "De updates foar dyn abonneminten losse dyn probleem wierskynlik op. Laad de webside opnij. Hast dan noch steed yn probleem, rapportearje it dan.">
+<!ENTITY anonymous.label "Anonym Bydrage">
+<!ENTITY reloadButton.label "Side opnij &amp;lade">
+<!ENTITY recentReports.clear.label "&amp;Smyt alle rapporten fuort">
+<!ENTITY typeSelector.description "Dit finster sil jo begeliede troch de stappen nedich foar it yntsjinjen fan in Adblock Plus probleemrapport. Earst, selektearje it type probleem wat jo tsjinkommen binne op dizze side:">
+<!ENTITY screenshot.remove.label "Sensitive &amp;gegevens fuortsmite">
+<!ENTITY issues.ownfilters.description "Sommige fan de filters tapast op dizze side binne brûker-definiearre. Skeakel de filters út dy't miskien dit probleem feroarsake hawwe:">
+<!ENTITY update.inProgress.description "Adblock Plus moat dyn filter abonnemint bywurkje om der seker fan te wêzen dat er noch gjin oplossing bekend is. Wacht efkes...">
+<!ENTITY sendPage.retry.label "Ferstjoer op 'e nij">
+<!ENTITY data.label "&amp;Rapportgegevens:">
+<!ENTITY recentReports.label "Jo resint ynstjoerde rapporten">
+<!ENTITY typeWarning.description "Jo hawwe oanjûn dat jo in algemien probleem mei Adblock Plus rapportearej wolle yn stee fan in probleem mei de filters. It is it bêste dat jo soksoartige fan problemen rapportearje yn it [link]Adblock Plus foarum[/link]. Jo soene allinnich dizze rapportearder brûke moatte as tafoeging oan in besteande diskusje, oars sil net ien jo rapport sjen útsein as jo in keppeling opjouwe. De automatysk generearre keppeling sil jûn wurde as it rapport ynstjoerd is.">
+<!ENTITY issues.disabled.description "Adblock Plus is útskeakele, it sil no neat blokkearje.">
+<!ENTITY attachExtensions.label "Foegje in list mei aktive útwreidings ta oan it ra&amp;pport foar it gefal as in tafoeging it probleem feroarsaket">
+<!ENTITY issues.nosubscriptions.add.label "Foegje filterabonnemint ta">
+<!ENTITY issues.disabledfilters.enable.label "Filter ynskeakelje">
+<!ENTITY issues.override.label "De &amp;konfiguraasje is korrekt, fierder mei it rapport">
+<!ENTITY issues.nosubscriptions.description "It liket der op dat jo net abonnearre binne op ien fan de yn-it-foar makke filterlisten dy't automatysk net-winske ynhâld fan websteeën fuortsmyt.">
+<!ENTITY typeSelector.falsePositive.description "Selektearje dizze opsje as de side wichtige ynhâld mist, net goed toant wurd of net goed funksjonearret. Jo kinne útfine oft Adblock Plus de oarsaak is fan it probleem troch it tydlik út te skeakeljen.">
+<!ENTITY typeSelector.other.label "O&amp;ar probleem">
+<!ENTITY emailComment.label "It soe moai wêze ast in goed mail adres kist opjaan sa dat wy kontakt my die kinne opnimme as der fragen binne oer dyn rapport. It jout ús ek de mooglikheid om minsken te werkennen en mear prioriteit te jaan.">
+<!ENTITY issues.whitelist.remove.label "Skeakel Adblock Plus op dizze side wer yn">
+<!ENTITY outdatedSubscriptions.description "De folgjende filters binne al in tiid net bywurke. Wurkje dizze by foardast in rapport ynstjoerst. Miskien is it al oplost.">
+<!ENTITY dataCollector.description "In amerijke wylst Adblock Plus de nedige gegevens sammelt.">
+<!ENTITY sendButton.label "&amp;Ferstjoer rapport">
+<!ENTITY comment.label "&amp;Kommentaar (opsjoneel):">
+<!ENTITY sendPage.errorMessage "It is net slagge om it rapport te ferstjoeren, flaterkoade &quot;?1?&quot;. Wês wis dat jo ferbûn binne mei it ynternet en probearje nochris. As it probleem bliuwt freegje dan assistinsje yn it [link]Adblock Plus foarum[/link].">
+<!ENTITY showRecentReports.label "Toan resint ynstjoerde rapporten">
+<!ENTITY commentPage.heading "Kommentaar">
+<!ENTITY update.start.label "No bywurkje">
+<!ENTITY issues.disabledfilters.description "De folgjende filters binne útskeakele, dochs it kin wêze dat se effekt hawwe op dizze side:">
+<!ENTITY screenshot.description "Deselde side kin der ferskillend útsjen foar ferskillende minsken. It kin ús helpe om it probleem te begripen as jo in skerôfdruk meistjoere. Jo kinne seksjes mei sensitive ynformaasje fuortsmite en ek ûnderdielen markearje dêr't it probleem te sjen is. Om dat te dwaan klik de knop en selektearje in seksje fan de ôfbylding mei jo mûs.">
+<!ENTITY screenshot.attach.label "Foegje in ôfbylding ta oan it rapport">
+<!ENTITY issues.whitelist.description "Adblock Plus is no útskeakele op de side dy't jo rapportearje. Skeakel it yn en laad de side op 'e nij eardat it rapport ynstjoerd wurd om it ûndersyk fan dit probleem te helpen.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus blokkearret in advertinsje net">
+<!ENTITY typeSelector.heading "Selektearje probleemtype">
+<!ENTITY anonymity.warning "We kinnen dy gjin kommentaar jaan en sille wierskynlik in leage prioriteit oan dyn rapport jaan.">
+<!ENTITY wizard.title "Probleemrapportearder">
+<!ENTITY issues.ownfilters.disable.label "Filter útskeakelje">
+<!ENTITY commentPage.description "It tekstfjild hjirûnder jout de mooglikheid om kommentaar te jaan. Dizze stap is opsjoneel, mar oanrikkemandearre as it in frjemd probleem is. Jo kinne ek de gegevens besjen eardat it ferstjoerd wurd.">
+<!ENTITY comment.lengthWarning "De lingte fan jo kommentaar hat mear as 1000 karakters. Allinnich de earste 1000 karakters sille ferstjoerd wurde.">
+<!ENTITY typeSelector.falseNegative.description "Selektearje dizze opsje as in advertinsje toant wurd wylst Adblock Plus ynskeakele is.">
+<!ENTITY sendPage.waitMessage "Wachtsje wylst Adblock Plus jo rapport ynstjoerd.">
+<!ENTITY dataCollector.heading "Wolkom by de probleemrapportearder">
+<!ENTITY screenshot.heading "Skermôfdruk tafoegje">
+<!ENTITY sendPage.heading "Ferstjoer rapport">
+<!ENTITY issues.subscriptionCount.description "It liket as jo abonnearre binne op te folle filters. Dizze opset is net oanrikkemandearre omdat it wierskienlik faker problemen feroarsaakje kin. Wy kinne ek jo probleemrapport net akseptearje omdat it net dúdlik is hokker filterabonnemint auteur aksje ûndernimme moat. Helje alle net needsaaklike filters fuort en test oft de problemen wer barre.">
+<!ENTITY screenshot.mark.label "Markearje it probleem">
+<!ENTITY privacyPolicy.label "Privacybelied">
+<!ENTITY issues.description "Adblock Plus hat problemen ûntdekt mei jo konfiguraasje dy't miskien ferantwurdlik binne foar dit probleem of sil it sier meitsje om it te ûndersykjen.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/sidebar.dtd
new file mode 100644
index 0000000..4280a2d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Lit rannen knipperje">
+<!ENTITY address.label "Adres">
+<!ENTITY context.open.label "Iepen yn in nij ljepblêd">
+<!ENTITY type.label "Type">
+<!ENTITY tooltip.filterSource.label "Filterboarne:">
+<!ENTITY noitems.label "Gjin blokkearbere items">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Grutte:">
+<!ENTITY reattach.label "Fêstmeitsje">
+<!ENTITY search.label "Sykje:">
+<!ENTITY docDomain.thirdParty "(tredde partij)">
+<!ENTITY filterSource.label "Filterboarne">
+<!ENTITY tooltip.docDomain.label "Dokumintboarne:">
+<!ENTITY context.copy.label "Kopiearje">
+<!ENTITY tooltip.type.label "Type:">
+<!ENTITY context.disablefilter.label "Filter útskeakelje ?1?">
+<!ENTITY context.copyFilter.label "Filter kopiearje">
+<!ENTITY context.block.label "Blokkearje dit item">
+<!ENTITY context.enablefilter.label "Filter ynskeakelje ?1?">
+<!ENTITY detach.label "Losmeitsje">
+<!ENTITY whitelisted.label "Tastiene side">
+<!ENTITY context.disablefilteronsite.label "Skeakel dit filter út op ?1?">
+<!ENTITY detached.title "Adblock Plus: Blokkearbere ûnderdielen (los)">
+<!ENTITY docDomain.firstParty "(earste partij)">
+<!ENTITY tooltip.type.whitelisted "(tastien)">
+<!ENTITY tooltip.filter.label "Tapast filter:">
+<!ENTITY tooltip.filter.disabled "(útskeakele)">
+<!ENTITY context.editfilter.label "Bewurkje tapaste filter">
+<!ENTITY tooltip.type.blocked "(blokkearre)">
+<!ENTITY size.label "Grutte">
+<!ENTITY context.whitelist.label "Meitsje in útsûnderingsrigel foar dit ûnderdiel">
+<!ENTITY context.selectAll.label "Selektearje alles">
+<!ENTITY state.label "Steat">
+<!ENTITY docDomain.label "Dokumintboarne">
+<!ENTITY tooltip.address.label "Adres:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/subscriptionSelection.dtd
new file mode 100644
index 0000000..374db56
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "&amp;Filterabonnemint &quot;?1?&quot; ek tafoegje">
+<!ENTITY list.download.failed "It is Adblock Plus net slagge om de list mei abonneminten te krijen.">
+<!ENTITY list.download.retry "Op 'e nij besykje">
+<!ENTITY title.label "A&amp;bonnemintnamme:">
+<!ENTITY list.download.website "Toan webstee">
+<!ENTITY supplementMessage "Dit filterabonnemint is bedoeld om brûkt te wurden mei it filterabonnemint &quot;?1?&quot; dy't jo no noch net brûke.">
+<!ENTITY viewList.label "Toan filters">
+<!ENTITY visitHomepage.label "Besykje thússide">
+<!ENTITY addSubscription.label "Abonnemint tafoegje">
+<!ENTITY dialog.title "Foegje Adblock Plus filterabonnemint ta">
+<!ENTITY location.label "Fi&amp;lterlist lokaasje:">
+<!ENTITY fromWeb.description "Befestigje asjobleaft dat jo dit filterabonnemint tafoegje wolle. Jo kinne de abonneminttitel of lokaasje wizigje foardat jo it tafoegje.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/composer.dtd
new file mode 100644
index 0000000..fb550c7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "ao final &amp;do enderezo">
+<!ENTITY domainRestriction.label "&amp;Restrinxir ao dominio:">
+<!ENTITY collapse.default.no.label "Uso por defecto (non)">
+<!ENTITY firstParty.label "Só de or&amp;ixe">
+<!ENTITY preferences.label "Amo&amp;sar os filtros existentes...">
+<!ENTITY pattern.label "Buscar unha pauta">
+<!ENTITY thirdParty.label "Só de &amp;terceiros">
+<!ENTITY filter.label "&amp;Filtro novo:">
+<!ENTITY collapse.label "Pr&amp;egar bloqueados:">
+<!ENTITY match.warning "A pauta que inseriches non coincide co enderezo que queres bloquear ou pór na lista branca, polo que non terá efecto ningún.">
+<!ENTITY anchor.start.label "ao come&amp;zo do enderezo">
+<!ENTITY matchCase.label "&amp;Caso coincidente">
+<!ENTITY custom.pattern.label "&amp;Personalizado:">
+<!ENTITY unselectAllTypes.label "Non marcar ningún">
+<!ENTITY type.whitelist.label "E&amp;xcepción">
+<!ENTITY regexp.warning "A pauta que inseriches interprétase como unha expresión regular, e de usares moitas poderíase facer máis lenta a navegación. Se non tes a intención de utilizar expresións regulares, engade un símbolo * ao final da pauta.">
+<!ENTITY dialog.title "Engadir regra de filtrado do Adblock Plus">
+<!ENTITY basic.label "Vista básica">
+<!ENTITY type.filter.label "Filtro de &amp;bloqueo">
+<!ENTITY types.label "Aplicar aos tipos:">
+<!ENTITY shortpattern.warning "A pauta que inseriches é demasiado curta como para ser optimizada, e de haber moitas así poderíase retardar a navegación. Recomendámosche escoller unha cadea máis longa para este filtro.">
+<!ENTITY collapse.yes.label "Si">
+<!ENTITY anchors.label "Aceptar só a pauta:">
+<!ENTITY collapse.default.yes.label "Uso por defecto (si)">
+<!ENTITY domainRestriction.help "Especifica un ou máis dominios separándoos polo símbolo &quot;|&quot;. O filtro só se aplicará nestes dominios. O símbolo &quot;~&quot; antes dun nome de dominio significa que o filtro non debe aplicarse sobre o devandito dominio.">
+<!ENTITY accept.label "Engadir filtro">
+<!ENTITY options.label "Opcións">
+<!ENTITY disabled.warning "O Adblock Plus agora mesmo está desactivado. Aínda podes engadir os filtros, mais non se aplicarán a menos que [link]actives o Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "ao come&amp;zo do nome do dominio">
+<!ENTITY collapse.no.label "Non">
+<!ENTITY selectAllTypes.label "Marcar todos">
+<!ENTITY advanced.label "Vista avanzada">
+<!ENTITY pattern.explanation "A pauta pode ser calquera parte do enderezo, o símbolo * úsase como comodín. O filtro só se aplicará ós enderezos que coincidan coa pauta.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/filters.dtd
new file mode 100644
index 0000000..23e3259
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Tódalos os teus filtros persoalizados serán cambiados polo contido do arquivo que seleccionaches. Estás seguro?">
+<!ENTITY slow.column "Filtros le&amp;ntos">
+<!ENTITY enabled.column "A&amp;ctivada">
+<!ENTITY subscription.lastDownload.checksumMismatch "Erro: a proba do &quot;checksum&quot; seica non cadrou ben">
+<!ENTITY noFiltersInGroup.text "Seica o grupo que seleccionaches está baleiro.">
+<!ENTITY subscription.actions.label "Accións">
+<!ENTITY filter.selectAll.label "Seleccionalo Todo">
+<!ENTITY backupButton.label "&amp;Copia de Seguridade e Recuperación">
+<!ENTITY restore.minVersion.warning "Ollo: este arquivo foi creado cunha versión máis moderna do Adblock Plus. Debes actualizar a túa versión antes de recuperar o arquivo.">
+<!ENTITY restore.error "Os datos do arquivo non puideron ser procesados, seica este arquivo non é unha copia de seguridade do Adblock Plus?">
+<!ENTITY sort.ascending.label "Orden&amp;ar do &quot;A&quot; ao &quot;Z&quot;">
+<!ENTITY sort.label "&amp;Ordenar por">
+<!ENTITY subscription.source.label "Lista dos filtros">
+<!ENTITY hitcount.column "&amp;Veces usado">
+<!ENTITY noFilters.text "Seica aínda non tes feito ningún filtro persoalizado.">
+<!ENTITY backup.custom.title "Só filtros persoalizados">
+<!ENTITY subscription.external.label "Actualizado por outro complemento">
+<!ENTITY subscription.delete.label "Borrar">
+<!ENTITY noGroupSelected.text "Precisas de seleccionar un grupo antes de que se podan amosar os filtros.">
+<!ENTITY filter.cut.label "Cortar">
+<!ENTITY restore.default.label "Recuperar a copia de seguridade do ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Baixando...">
+<!ENTITY subscriptions.tab.label "Suscricións aos filtros">
+<!ENTITY sort.descending.label "Ordenar do &quot;&amp;Z&quot; ao &quot;A&quot;">
+<!ENTITY filters.remove.warning "De verdade que queres eliminar tódolos filtros que seleccionaches?">
+<!ENTITY filter.delete.label "Borrar">
+<!ENTITY addSubscriptionAdd.label "Engadir">
+<!ENTITY viewMenu.label "Ver">
+<!ENTITY subscription.lastDownload.unknown "Non disponible">
+<!ENTITY addSubscriptionCancel.label "Cancelar">
+<!ENTITY subscription.enabled.label "Activado">
+<!ENTITY noSubscriptions.text "Aínda non engadiches ningunha suscrición. O Adblock Plus non che bloqueará nada se non tes filtros, por favor dalle a &quot;Engadir suscripción ós filtros&quot; para engadir algún.">
+<!ENTITY subscription.update.label "Actualizar os filtros">
+<!ENTITY dialog.title "Preferencias dos filtros do Adblock Plus">
+<!ENTITY addFilter.label "Enga&amp;dir filtro">
+<!ENTITY subscription.minVersion.warning "Esta suscripción ao filtro precisa dunha versión máis moderna do Adblock Plus. Deberías baixarte a última versión.">
+<!ENTITY subscription.lastDownload.invalidURL "Erro: enderezo non válido">
+<!ENTITY backup.error "Seica houbo un erro ao escribir os filtros no arquivo. Mira a ver se o arquivo non está protexido contra a escritura ou está sendo uso por outro programa.">
+<!ENTITY filter.moveUp.label "Subir para arriba">
+<!ENTITY addGroup.label "En&amp;gadir grupo de filtros">
+<!ENTITY filter.edit.label "Editar">
+<!ENTITY subscription.showHideFilters.label "Amosar/agochar os filtros">
+<!ENTITY acceptableAds2.label "Perm&amp;itir publicidade non invasiva">
+<!ENTITY addSubscriptionOther.label "Engadir outra subscrición">
+<!ENTITY close.label "Pechar">
+<!ENTITY sort.none.label "Dei&amp;xalo todo atrapallado">
+<!ENTITY filter.actions.label "Accións dos filtros">
+<!ENTITY filter.copy.label "Copiar">
+<!ENTITY filter.moveDown.label "Baixar para abaixo">
+<!ENTITY filter.resetHitCounts.label "Resetear as estatísticas de uso">
+<!ENTITY readMore.label "Ler máis">
+<!ENTITY subscription.moveUp.label "Subir para arriba">
+<!ENTITY addSubscription.label "Engadir subscrición de &amp;filtros">
+<!ENTITY subscription.homepage.label "Páxina">
+<!ENTITY backup.complete.title "Tódolos filtros e suscricións">
+<!ENTITY restore.own.label "Recuperar a copia de seguridade propia">
+<!ENTITY restore.complete.warning "Tódalas as túas preferencias serán cambiadas polo contido do arquivo que seleccionaches. Estás seguro?">
+<!ENTITY filters.tab.label "Filtros persoalizados">
+<!ENTITY backup.label "Facer unha nova copia de seguridade">
+<!ENTITY find.label "Busca&amp;r">
+<!ENTITY subscription.moveDown.label "Baixar para abaixo">
+<!ENTITY subscription.lastDownload.connectionError "Erro: fallo na descarga">
+<!ENTITY subscription.lastDownload.success "Valeu">
+<!ENTITY subscription.lastDownload.invalidData "Erro: lista de filtros non válida">
+<!ENTITY filter.paste.label "Pegar">
+<!ENTITY subscription.disabledFilters.enable "Activar os filtros inactivos">
+<!ENTITY lasthit.column "Ú&amp;ltimo uso">
+<!ENTITY subscription.editTitle.label "Editar o título">
+<!ENTITY subscription.disabledFilters.warning "Algúns filtros desta suscrición estanche desactivados.">
+<!ENTITY filter.column "Regra de &amp;filtro">
+<!ENTITY subscription.lastDownload.label "Baixado o:">
+<!ENTITY viewList.label "Qué publicidade?">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/firstRun.properties
new file mode 100644
index 0000000..bb33050
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Navega de xeito privado ó desactivar o seguemento - agochando as túas trazas das compañías de publicidade que doutro xeito rexistrarían os teus movementos.
+firstRun_toggle_off=DESACTIVADO
+firstRun_feature_tracking=Desactivar o seguimento
+firstRun_feature_malware=Bloquear malware
+firstRun_title=O Adblock Plus foiche instalado
+firstRun_toggle_on=ACTIVADO
+firstRun_acceptableAdsExplanation=Queremos animar ás páxinas web para que empreguen a publicidade dun xeito mais directo e non invasivo. É polo que fixemos unhas <a>regras moi estrictas</a> co fin de identificar a publicidade aceptable, a cal é mostrada coas opcións por defecto. Se aínda queres bloquear tódala publicidade, podes <a>desactivar</a> isto deseguido.
+firstRun_contributor_credits=Coa colaboración de...
+firstRun_dataCorruptionWarning=Segue a aparecer a páxina esta? <a>Fai click aquí!</a>
+firstRun_acceptableAdsHeadline=A partir de agora os anuncios anoxantes seranche bloqueados
+firstRun_share=Cóntalle ós teus amigos
+firstRun_share_headline=<a>Bótanos unha man</a> para facer da rede un sitio mellor
+firstRun_feature_social_description=Eliminar de xeito automático os botóns de redes sociais como o "gústame" do Facebook, que aparecen nás páxinas web e rexistran o teu comportamento.
+firstRun_filterlistsReinitializedWarning=Semella que un problema facía que tódolos filtros fosen borrados e imposibles de restaurar. Polo tanto, tivemos que resetear os filtros e a configuración da "Publicidade Aceptable". Por favor bótalle un ollo á tua lista de filtros e á configuración de "Publicidade Aceptable" nas <a>opcións do Adblock Plus</a>.
+firstRun_feature_malware_description=Fai mais seguro o teu navegador ó bloquear dominios con "malware".
+firstRun_features=O Adblock Plus faiche mais cousas que bloquear publicidade
+firstRun_donate=fai unha doazón
+firstRun_donate_label=Apoia ó noso proxecto
+firstRun_feature_social=Eliminar os botóns das redes sociais
+firstRun_legacySafariWarning=Estás a empregar unha versión vella do Safari que xa non está mantida polo Adblock Plus. Podería non funcionar correctamente ou alterar a experiencia do usuario nalgunhas webs. Aconsellámosche que ou ben actualices ó Safari 6.1.1 ou superior (no OS X 10.8 Mountain Lion), ou ó Safari 7.0.1 ou superior (no OSX 10.9 Mavericks), ou empregues a última versión do Mozilla Firefox, do Google Chrome ou do Opera.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/global.properties
new file mode 100644
index 0000000..2fbc69c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Non che hai elementos bloqueables nesta páxina
+action3_tooltip=Preme para activar/desactivar o Adblock Plus.
+notification_antiadblock_title=Agochar mensaxes dirixidas?
+type_label_script=script
+filter_elemhide_nocriteria=Non se especificaron criterios para recoñecer o elemento que se quere agochar
+blockingGroup_title=Reglas de bloqueo de publicidade
+whitelisted_tooltip=O Adblock Plus está activo mais está desactivado nesta páxina.
+type_label_stylesheet=folla de estilo
+blocked_count_tooltip=?1? de ?2?
+type_label_font=fonte
+type_label_popup=Xanela emerxente
+filter_regexp_tooltip=Este filtro é ben unha expresión regular ben é demasiado curto para ser optimizado. Se tes moitos filtros así, o navegador pode volverse máis lento.
+action0_tooltip=Preme para abrir o menú contextual, e click no medio para activar/desactivar.
+whitelisted_page=O Adblock Plus foi desactivado nesta páxina
+remove_group_warning=É verdade que queres borrar este grupo?
+action1_tooltip=Preme para abrir/pechar elementos bloqueables, e click no medio para activar/desactivar.
+type_label_xmlhttprequest=solicitude XML
+active_tooltip=O Adblock Plus está activo, ?1? o filtro de suscrición(s) ?2? e o(s) filtro(s) persoalizado(s) están en uso.
+type_label_document=documento
+type_label_object_subrequest=sub-solicitude de obxecto
+whitelistGroup_title=Excepcións
+disabled_tooltip=O Adblock Plus está desactivado.
+filter_elemhide_duplicate_id=Só pode especificarse un ID do elemento que se quere agochar
+type_label_object=obxecto
+action2_tooltip=Preme para abrir as preferencias, e click no medio para activar/desactivar.
+type_label_subdocument=marco
+clearStats_warning=Isto vai resetear as estatísticas dos filtros e a desactivar a contabilidade do uso dos filtros. Estás seguro que o queres facer?
+notification_antiadblock_message=Este sitio é coñecido por amosar mensaxes dirixidas ós usuarios do Adblock Plus. Queres que o Adblock plus agoche estas mensaxes dirixidas?
+blocked_count_addendum=(tamén na Lista Branca: ?1?, agochados: ?2?)
+subscription_invalid_location=Esa localización da lista de filtros non é nin unha URL válida nin un nome de arquivo válido.
+type_label_image=imaxe
+remove_subscription_warning=De seguro de que queres darche de baixa nesta subscrición?
+type_label_other=outro
+mobile_menu_enable=ABP - Activar
+type_label_media=audio/vídeo
+mobile_menu_disable_site=ABP - Desactivar en ?1?
+elemhideGroup_title=Reglas ao agochar elementos
+mobile_menu_enable_site=ABP - Activar en ?1?
+type_label_elemhide=agochado
+newGroup_title=Novo grupo de filtros
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/overlay.dtd
new file mode 100644
index 0000000..7a68f62
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Sí">
+<!ENTITY notification.button.no "&amp;Non">
+<!ENTITY sync.label "Sin&amp;cronizar as opcións do Adblock Plus">
+<!ENTITY whitelist.site.label "Desactivar en ?1?">
+<!ENTITY filters.label "Pre&amp;ferencias dos filtros">
+<!ENTITY disable.label "Desactivar en tódalas páxinas">
+<!ENTITY objecttab.title "Bloquear">
+<!ENTITY objecttab.tooltip "Fai click aquí para bloquear este obxecto co Adblock Plus">
+<!ENTITY menuitem.label "Preferencias do Ad&amp;block Plus">
+<!ENTITY objecttabs.label "Amo&amp;sar os separadores en Flash e Java">
+<!ENTITY sendReport.label "&amp;Informar dun problema nesta páxina">
+<!ENTITY whitelist.page.label "Desactivar só nesta páxina">
+<!ENTITY context.image.label "ABP - Bloquear a imaxe">
+<!ENTITY counthits.label "Co&amp;ntabilizar as veces que se usa cada filtro">
+<!ENTITY opensidebar.label "A&amp;brir temas bloqueables">
+<!ENTITY notification.button.close "&amp;Pechar">
+<!ENTITY contribute.label "Apoquinar ó Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "ABP - Bloquear o marco">
+<!ENTITY blocked.tooltip "Elementos bloqueados nesta páxina:">
+<!ENTITY hideplaceholders.label "Agochar o espacio deixado po&amp;los elementos bloqueados">
+<!ENTITY showinstatusbar.label "Amosar na barra d&amp;e estado">
+<!ENTITY sidebar.title "Temas bloqueables na páxina actual">
+<!ENTITY options.label "&amp;Opcións">
+<!ENTITY context.object.label "ABP - Bloquear o obxecto">
+<!ENTITY context.removeWhitelist.label "ABP - Reactivado nesta páxina">
+<!ENTITY filters.tooltip "Filtros máis activos:">
+<!ENTITY closesidebar.label "Pechar temas &amp;bloqueables">
+<!ENTITY showintoolbar.label "Amosar na barra &amp;Ferramentas">
+<!ENTITY status.tooltip "Estado:">
+<!ENTITY context.media.label "ABP - Bloquear o audio/vídeo">
+<!ENTITY subscription.update.label "Actualizar os filtros">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/sendReport.dtd
new file mode 100644
index 0000000..e2c4b96
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Desfacer">
+<!ENTITY issues.disabledgroups.description "As seguintes suscricións/grupos de filtros están desactivadas, pero poderían aínda ter efecto nesta páxina:">
+<!ENTITY showData.label "Amosar os datos do informe">
+<!ENTITY typeSelector.falsePositive.label "Seica o Adblock Plus está a bloquear de &amp;máis">
+<!ENTITY issues.change.description "A túa configuración cambiou. Tenta recargar a páxina para probar os cambios e envía un informe se o problema aínda así non foi arranxado.">
+<!ENTITY email.label "E-&amp;mail:">
+<!ENTITY issues.openPreferences.label "Abrir as preferencias dos filtros">
+<!ENTITY sendPage.confirmation "O teu informe foi gardado. Podes acceder a él no seguinte enderezo:">
+<!ENTITY copyLink.label "&amp;Copiar ligazón ao informe">
+<!ENTITY issues.nofilters.description "O Adblock Plus non está a bloquear nada na páxina da que informas. Seica o problema que observaches non ten relación co Adblock Plus.">
+<!ENTITY sendPage.knownIssue "O problema do que informas é coñecido. Máis información:">
+<!ENTITY typeSelector.other.description "Escolle esta opción se sospeitas que o que che da problemas é o Adblock Plus e non os seus filtros.">
+<!ENTITY issues.disabledgroups.enable.label "Activar suscrición/grupos de filtros">
+<!ENTITY typeWarning.override.label "Comprendido, pero aínda a&amp;sí quero mandar o informe">
+<!ENTITY issues.disabled.enable.label "Activar o Adblock Plus">
+<!ENTITY update.fixed.description "Se cadra a actualización dos filtros resolveu o problema do que informabas. Tenta recargar a páxina e se o problema mantense, dalle de novo a Informar.">
+<!ENTITY anonymous.label "Informe &amp;anónimo">
+<!ENTITY reloadButton.label "&amp;Recargar a páxina">
+<!ENTITY recentReports.clear.label "Bo&amp;rrar tódolos informes">
+<!ENTITY typeSelector.description "Esta xanela vaiche guiar a través dos pasos necesarios para a presentación dun informe de problema no Adblock Plus. Primeiro, selecciona o tipo de problema que atopaches nesta páxina:">
+<!ENTITY screenshot.remove.label "&amp;Borrar información persoal">
+<!ENTITY issues.ownfilters.description "Algúns dos filtros que se aplican nesta páxina foron definidos polo usuario. Desactiva os filtros que poidan ter causado o problema:">
+<!ENTITY update.inProgress.description "O Adblock Plus precisa de actualizar as túas suscricións para estar seguros de que este tema aínda non fora resolto. Acouga un intre...">
+<!ENTITY sendPage.retry.label "Mandar de novo">
+<!ENTITY data.label "Datos do in&amp;forme:">
+<!ENTITY recentReports.label "Informes que mandaches fai pouco">
+<!ENTITY typeWarning.description "Indicaches que queres informar dun problema co Adblock Plus e non cos filtros. Ten en conta que estos temas é mellor comentalos na [link]conferencia do Adblock Plus[/link]. Só deberías usar o xerador de informes de problemas para aportar a unha discusión xa existente, xa que ninguén verá o teu informe a non ser que inclúas a ligazón ó mesmo. A ligazón xerada automáticamente serache dada tras mandar o reporte.">
+<!ENTITY issues.disabled.description "O Adblock Plus estache desactivado e non vai facer nada mentres o manteñas deste xeito.">
+<!ENTITY attachExtensions.label "Engadir ó informe unha lista das e&amp;xtensións activas, por se unha incompatibilidade con outra extensión é a causa do problema">
+<!ENTITY issues.nosubscriptions.add.label "Engadir suscrición de filtro">
+<!ENTITY issues.disabledfilters.enable.label "Activar filtro">
+<!ENTITY issues.override.label "A &amp;configuración está ben, podes continuar tranquilo co informe">
+<!ENTITY issues.nosubscriptions.description "Non semellas estar suscrito a ningunha lista de filtros, as cales bloquean automáticamente contido non deseado nas páxinas.">
+<!ENTITY typeSelector.falsePositive.description "Selecciona esta opción se a páxina non ten contido importante, se ésta amósase incorrectamente ou non funciona correctamente. Podes determinar se Adblock Plus é a causa do problema desactivándoo temporalmente.">
+<!ENTITY typeSelector.other.label "Ou&amp;tro problema">
+<!ENTITY emailComment.label "Recomenámosche que poñas un e-mail válido, para que deste xeito poidamos contactar contigo se temos algunha pregunta sobre o teu informe. Isto tamén nos permite recoñecer as túas contribucións e darlles unha prioridade mais alta.">
+<!ENTITY issues.whitelist.remove.label "Reactivar o Adblock Plus nesta páxina">
+<!ENTITY outdatedSubscriptions.description "As seguintes suscricións de filtros non foron actualizadas en alomenos dúas semanas. Tenta actualizalas antes de mandarnos un informe, xa que o problema podería estar xa arranxado.">
+<!ENTITY dataCollector.description "Agarda un intre mentres Adblock Plus reúne os datos necesarios.">
+<!ENTITY sendButton.label "Ma&amp;ndar o informe">
+<!ENTITY comment.label "&amp;Comentario (opcional):">
+<!ENTITY sendPage.errorMessage "O intento de envio fallou co código de erro &quot;?1?&quot;. Por favor asegurate que estás conectado a Internet e volta a intentalo. Se segue o problema, pide axuda na [link]conferencia do Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Amosar os informes que mandaches fai pouco">
+<!ENTITY commentPage.heading "Comentar">
+<!ENTITY update.start.label "Comezar coa actualización">
+<!ENTITY issues.disabledfilters.description "Os seguintes filtros están desactivados, aínda que poderían ter efecto nesta páxina:">
+<!ENTITY screenshot.description "A mesma páxina pode parecer diferente según quen a mire. Para axudarnos a comprender o problema, estaría ben se nos mandases un pantallazo no teu informe. Podes borrar as partes da imaxe que teñan información privada e tamén salientar as partes na que o problema é visible. Para facer isto, fai click co botón correspondente e selecciona unha parte da imaxe co rato.">
+<!ENTITY screenshot.attach.label "Engadir un pan&amp;tallazo ó informe">
+<!ENTITY issues.whitelist.description "Tes desactivado o Adblock Plus na páxina da que informas. Por favor reactívao e dalle a recargar a páxina antes de mandar o informe para axudarnos a investigar o problema.">
+<!ENTITY typeSelector.falseNegative.label "O Ad&amp;block Plus non está a bloquear ningún elemento">
+<!ENTITY typeSelector.heading "Selecciona o tipo de problema">
+<!ENTITY anonymity.warning "Non poderemos responderche, polo que lle daremos unha prioridade máis baixa.">
+<!ENTITY wizard.title "Xerador de informes de problemas">
+<!ENTITY issues.ownfilters.disable.label "Desactivar filtro">
+<!ENTITY commentPage.description "O campo de texto xusto debaixo permíteche comentar o problema. Este paso é opcional pero o recomendamos se o problema non che é claro. Poderás revisar os datos do informe antes de envialo.">
+<!ENTITY comment.lengthWarning "O teu comentario ten mais de 1000 caracteres, e só os primeiros 1000 serán enviados.">
+<!ENTITY typeSelector.falseNegative.description "Escolla esta opción se aparece publicidade aínda a pesar de estar activado o Adblock Plus.">
+<!ENTITY sendPage.waitMessage "Agarda namentres o Adblock Plus manda o teu informe.">
+<!ENTITY dataCollector.heading "Benvido ao Xerador de Informes de Problemas">
+<!ENTITY screenshot.heading "Engadir pantallazo">
+<!ENTITY sendPage.heading "Mandar o informe">
+<!ENTITY issues.subscriptionCount.description "Seica tes suscricións de máis. Isto non é nada recomendable, xa que aumenta a posibilidade de erro. Tampouco aceptamos o teu informe xa que non está claro cal é a suscripción que está a causar o problema. Tenta eliminar os filtros que non sexan necesarios e olla se aínda segues a ter o problema.">
+<!ENTITY screenshot.mark.label "&amp;Marcar o problema">
+<!ENTITY privacyPolicy.label "Política de privacidade">
+<!ENTITY issues.description "Adblock Plus detectou uns problemiñas coa túa configuración que poderían ser a causa deste erro ou facer a investigación do problema mais difícil.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/sidebar.dtd
new file mode 100644
index 0000000..f32368a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Salientar os bordos do elemento">
+<!ENTITY address.label "Enderezo">
+<!ENTITY context.open.label "Abrir nunha lapela nova">
+<!ENTITY type.label "Tipo">
+<!ENTITY tooltip.filterSource.label "Fonte do filtro:">
+<!ENTITY noitems.label "Non che hai temas bloqueables">
+<!ENTITY filter.label "Filtro">
+<!ENTITY tooltip.size.label "Tamaño:">
+<!ENTITY reattach.label "Unir de novo">
+<!ENTITY search.label "&amp;Procurar:">
+<!ENTITY docDomain.thirdParty "(terceiros)">
+<!ENTITY filterSource.label "Fonte do filtro">
+<!ENTITY tooltip.docDomain.label "Documento fonte:">
+<!ENTITY context.copy.label "Copiar o enderezo do elemento">
+<!ENTITY tooltip.type.label "Tipo">
+<!ENTITY context.disablefilter.label "Desactivar o filtro ?1?">
+<!ENTITY context.copyFilter.label "Copiar o filtro">
+<!ENTITY context.block.label "Bloquear este elemento">
+<!ENTITY context.enablefilter.label "Activar o filtro ?1?">
+<!ENTITY detach.label "Separar">
+<!ENTITY whitelisted.label "Páxina da Lista Branca">
+<!ENTITY context.disablefilteronsite.label "Desactivar este filtro en ?1?">
+<!ENTITY detached.title "Adblock Plus: Temas bloqueables (separados)">
+<!ENTITY docDomain.firstParty "(orixinal)">
+<!ENTITY tooltip.type.whitelisted "(engadido á lista branca)">
+<!ENTITY tooltip.filter.label "Filtro activo:">
+<!ENTITY tooltip.filter.disabled "(desactivado)">
+<!ENTITY context.editfilter.label "Editar o filtro activo">
+<!ENTITY tooltip.type.blocked "(bloqueado)">
+<!ENTITY size.label "Tamaño">
+<!ENTITY context.whitelist.label "Engadir excepción para este elemento">
+<!ENTITY context.selectAll.label "Seleccionalo todo">
+<!ENTITY state.label "Estado">
+<!ENTITY docDomain.label "Documento fonte">
+<!ENTITY tooltip.address.label "Enderezo:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/subscriptionSelection.dtd
new file mode 100644
index 0000000..5664d19
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Engadir tamén a &amp;suscrición de filtro &quot;?1?&quot;">
+<!ENTITY list.download.failed "Fallo na recuperación da lista de suscricións.">
+<!ENTITY list.download.retry "Téntao de novo">
+<!ENTITY title.label "&amp;Título da suscrición:">
+<!ENTITY list.download.website "Ver páxina web">
+<!ENTITY supplementMessage "Esta suscrición de filtro está feita para ser usada en conxunto coa suscrición de filtro &quot;?1?&quot; que aínda non engadiches.">
+<!ENTITY viewList.label "Ver os filtros">
+<!ENTITY visitHomepage.label "Visita a páxina de inicio">
+<!ENTITY addSubscription.label "Engadir suscrición">
+<!ENTITY dialog.title "Engadir a suscrición aos filtros do Adblock Plus">
+<!ENTITY location.label "&amp;Localización da lista dos Filtros:">
+<!ENTITY fromWeb.description "Por favor, confirma que queres engadir esta suscrición de filtro. Podes cambiar o título ou a situación da suscrición antes de engadila.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/composer.dtd
new file mode 100644
index 0000000..bad38a4
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "&amp;בסוף הכתובת">
+<!ENTITY domainRestriction.label "&amp;הגבלה ×œ×©× ×ž×¨×—×‘:">
+<!ENTITY collapse.default.no.label "שימוש בברירת מחדל (ל×)">
+<!ENTITY firstParty.label "צד-ר×שון (יוצר) בלבד">
+<!ENTITY preferences.label "&amp;הצגת ×”×ž×¡× × ×™× ×”×§×™×™×ž×™×...">
+<!ENTITY pattern.label "חיפוש ×חר דפוס">
+<!ENTITY thirdParty.label "&amp;צד-שלישי בלבד">
+<!ENTITY filter.label "&amp;מסנן חדש:">
+<!ENTITY collapse.label "&amp;×¦×ž×¦×•× ×”×—×¡×•×ž×™×:">
+<!ENTITY match.warning "הדפוס שהוזן ×יננו תו×× ×™×•×ª×¨ לכתובת החסימה/הרשימות הלבנות ו×יננו משפיע עוד.">
+<!ENTITY anchor.start.label "&amp;בתחילת הכתובת">
+<!ENTITY matchCase.label "&amp;הת×מת ×ותיות גדולות/קטנות">
+<!ENTITY custom.pattern.label "&amp;מות××:">
+<!ENTITY unselectAllTypes.label "×œ× ×œ×‘×—×•×¨ דבר">
+<!ENTITY type.whitelist.label "&amp;חוק חריג">
+<!ENTITY regexp.warning "הדפוס שהוזן יפורש כביטוי רגיל. ×‘×™×˜×•×™×™× ×¨×’×™×œ×™× ×¨×‘×™× ×¢×©×•×™×™× ×œ×”×ט ×ת הגלישה. ×× ×ין כוונה להשתמש ×‘×‘×™×˜×•×™×™× ×¨×’×™×œ×™×, יש להוסיף ×ת הסמל * בסוף התבנית.">
+<!ENTITY dialog.title "הוספת חוק סינון Adblock Plus">
+<!ENTITY basic.label "תצוגה בסיסית">
+<!ENTITY type.filter.label "&amp;מסנן חסימה">
+<!ENTITY types.label "החלה על הסוגי×:">
+<!ENTITY shortpattern.warning "הדפוס שהוזן קצר מדי בכדי להיות יעיל, ×“×¤×•×¡×™× ×¨×‘×™× ×ž×¡×•×’ ×–×” ×¢×©×•×™×™× ×œ×”×ט ×ת הגלישה. מומלץ לבחור מחרוזת ×רוכה יותר למסנן ×–×”.">
+<!ENTITY collapse.yes.label "כן">
+<!ENTITY anchors.label "הסכמה לדפוס בלבד:">
+<!ENTITY collapse.default.yes.label "שימוש בברירת מחדל (כן)">
+<!ENTITY domainRestriction.help "מרחב ×חד ×ו יותר ×ž×•×¤×¨×“×™× ×¢×œ ידי הסמל &quot;|&quot;, המסנן ×™×פשר ×ž×¨×—×‘×™× ×לו בלבד. הסמל &quot;~&quot; לפני ×©× ×”×ž×¨×—×‘ משמעותו שמסנן ×–×” מנוטרל על מרחב ×–×”.">
+<!ENTITY accept.label "הוספת מסנן">
+<!ENTITY options.label "×פשרויות">
+<!ENTITY disabled.warning "Adblock Plus מנוטרל כרגע. ניתן עדיין להוסיף ×ž×¡× × ×™× ×œ×¨×©×™×ž×”, ×בל ×”× ×œ× ×™×—×•×œ×• ××œ× ×× [link]Adblock Plus מ×פשר [/link].">
+<!ENTITY anchor.start.flexible.label "&amp;בתחילת ×©× ×”×ž×ª×—×">
+<!ENTITY collapse.no.label "ל×">
+<!ENTITY selectAllTypes.label "בחירת הכל">
+<!ENTITY advanced.label "תצוגה מתקדמת">
+<!ENTITY pattern.explanation "הדפוס יכול להיות כל חלק מהכתובת, סמל * משמש כתו חופשי ש×חריו יכול ×œ×‘×•× ×›×œ תו ×חר. המסנן יכול להחיל רק על כתובות המת×ימות לתבנית.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/filters.dtd
new file mode 100644
index 0000000..54dfd2f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "כל ×”×ž×¡× × ×™× ×”××™×©×™×™× ×©×œ×š יוחלפו בתוכן הקובץ הנבחר. ×”×× ×œ×”×ž×©×™×š?">
+<!ENTITY slow.column "&amp;×ž×¡× × ×™× ×טיי×">
+<!ENTITY enabled.column "&amp;מ×פשר">
+<!ENTITY subscription.lastDownload.checksumMismatch "נכשל, ביקורת ×”×¡×™×›×•× ×œ×ª×§×™× ×•×ª ×œ× ×”×ª×ימה בצורה טובה">
+<!ENTITY noFiltersInGroup.text "הקבוצה הנבחרת ריקה">
+<!ENTITY subscription.actions.label "פעולות">
+<!ENTITY filter.selectAll.label "בחירת הכל">
+<!ENTITY backupButton.label "&amp;גיבוי ושחזור">
+<!ENTITY restore.minVersion.warning "×זהרה: הקובץ נוצר על-ידי גרסה חדשה יותר של Adblock Plus. כדי לשדרג לגרסה ×”×חרונה של Adblock Plus לפני שחזור מקובץ ×–×”.">
+<!ENTITY restore.error "×œ× × ×™×ª×Ÿ לעבד המידע בקובץ. ×ולי ×–×” ×œ× ×§×•×‘×¥ גיבוי של Adblock Plus?">
+<!ENTITY sort.ascending.label "&amp;מיון מ- × &gt; עד ת">
+<!ENTITY sort.label "&amp;מיון לפי">
+<!ENTITY subscription.source.label "רשימת מסנני×">
+<!ENTITY hitcount.column "&amp;לחיצות">
+<!ENTITY noFilters.text "עדיין ×œ× ×”×•×¡×¤×• ×ž×¡× × ×™× ×ישיי×.">
+<!ENTITY backup.custom.title "×ž×¡× × ×™× ×ž×•×ª××ž×™× ×‘×œ×‘×“">
+<!ENTITY subscription.external.label "התעדכן על ידי הרחבה ×חרת">
+<!ENTITY subscription.delete.label "מחיקה">
+<!ENTITY noGroupSelected.text "צריך לבחור קבוצת סינון לפני ×©×”×ž×¡× × ×™× ×©×œ×” יוצגו.">
+<!ENTITY filter.cut.label "גזירה">
+<!ENTITY restore.default.label "שחזור הגיבוי מ- ?1?">
+<!ENTITY subscription.lastDownload.inProgress "מוריד...">
+<!ENTITY subscriptions.tab.label "הרשמות מסנני×">
+<!ENTITY sort.descending.label "&amp;מיון מ- ת &gt; עד ×">
+<!ENTITY filters.remove.warning "×”×× ×œ×”×¡×™×¨ ×ת כל ×”×ž×¡× × ×™× ×”× ×‘×—×¨×™×?">
+<!ENTITY filter.delete.label "מחיקה">
+<!ENTITY addSubscriptionAdd.label "הוספה">
+<!ENTITY viewMenu.label "תצוגה">
+<!ENTITY subscription.lastDownload.unknown "×œ× ×–×ž×™×Ÿ">
+<!ENTITY addSubscriptionCancel.label "ביטול">
+<!ENTITY subscription.enabled.label "מ×פשר">
+<!ENTITY noSubscriptions.text "עדיין ×œ× ×”×•×¡×¤×ª הרשמות למסנני×. Adblock Plus ×œ× ×™×—×¡×•× ×“×‘×¨ ×œ×œ× ×ž×¡× × ×™×, ×× × ×”×©×ª×ž×©×• ב-&quot;הוספת הרשמה למסנני×&quot; להוספת מסנני×.">
+<!ENTITY subscription.update.label "עדכון מסנני×">
+<!ENTITY dialog.title "העדפות סינון Adblock Plus">
+<!ENTITY addFilter.label "&amp;הוספת מסנן">
+<!ENTITY subscription.minVersion.warning "הרשמת ×ž×¡× × ×™× ×–×ת דורשת גרסה חדשה יותר של Adblock Plus, צריך לשדרג לגרסה ×”×חרונה של Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "נכשל, הכתובת שגויה">
+<!ENTITY backup.error "×ירעה שגי××” ברשימת ×”×ž×¡× × ×™× ×œ×§×•×‘×¥. יש ×œ×•×•×“× ×›×™ הקובץ ×œ× ×ž×•×’×Ÿ לכתיבה ×ו בשימוש על-ידי ×™×™×©×•× ×חר.">
+<!ENTITY filter.moveUp.label "הזזה מעלה">
+<!ENTITY addGroup.label "הוספת &amp;קבוצת סינון">
+<!ENTITY filter.edit.label "עריכה">
+<!ENTITY subscription.showHideFilters.label "הצגת/הסתרת מסנני×">
+<!ENTITY acceptableAds2.label "&amp;×פשור קצת ×¤×¨×¡×•× ×œ× ×¤×•×œ×©× ×™">
+<!ENTITY addSubscriptionOther.label "הוספת הרשמה ×חרת">
+<!ENTITY close.label "סגירה">
+<!ENTITY sort.none.label "&amp;×œ× ×ž×ž×•×™×Ÿ">
+<!ENTITY filter.actions.label "פעולות מסנן">
+<!ENTITY filter.copy.label "העתקה">
+<!ENTITY filter.moveDown.label "הזזה מטה">
+<!ENTITY filter.resetHitCounts.label "×יפוס סטטיסטיקות לחיצה">
+<!ENTITY readMore.label "×œ×§×¨×•× ×¢×•×“">
+<!ENTITY subscription.moveUp.label "הזזה מעלה">
+<!ENTITY addSubscription.label "&amp;הוספת הרשמת מסנן">
+<!ENTITY subscription.homepage.label "עמוד בית">
+<!ENTITY backup.complete.title "כל ×”×ž×¡× × ×™× ×•×”×”×¨×©×ž×•×ª">
+<!ENTITY restore.own.label "שחזור גיבוי משלי">
+<!ENTITY restore.complete.warning "כל הגדרות ×”×ž×¡× × ×™× ×©×œ×š יוחלפו בתוכן הקובץ הנבחר. ×”×× ×œ×”×ž×©×™×š?">
+<!ENTITY filters.tab.label "×ž×¡× × ×™× ×ž×•×ª×מי×">
+<!ENTITY backup.label "יצירת גיבוי חדש">
+<!ENTITY find.label "&amp;חיפוש">
+<!ENTITY subscription.moveDown.label "הזזה מטה">
+<!ENTITY subscription.lastDownload.connectionError "נכשל, ההורדה נכשלה">
+<!ENTITY subscription.lastDownload.success "הצליח">
+<!ENTITY subscription.lastDownload.invalidData "נכשל, רשימת ×”×ž×¡× × ×™× ×œ× ×—×•×§×™×ª">
+<!ENTITY filter.paste.label "הדבקה">
+<!ENTITY subscription.disabledFilters.enable "×פשר ×ž×¡× × ×™× ×ž× ×•×˜×¨×œ×™×">
+<!ENTITY lasthit.column "&amp;לחיצה ×חרונה">
+<!ENTITY subscription.editTitle.label "עריכת הכותרת">
+<!ENTITY subscription.disabledFilters.warning "כמה ×ž×”×ž×¡× × ×™× ×‘×”×¨×©×ž×” ×–×ת מנוטרלי×.">
+<!ENTITY filter.column "חוק &amp;סינון">
+<!ENTITY subscription.lastDownload.label "הורדה ×חרונה:">
+<!ENTITY viewList.label "הצגת רשימה">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/firstRun.properties
new file mode 100644
index 0000000..b1b4799
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=גלשו ב×נונימיות בעזרת נטרול מעקב - הסתרת ×¢×§×‘×•×ª×™×›× ×ž×—×‘×¨×•×ª המודעות ×שר עוקבות ×חר כל פעולה שלכ×.
+firstRun_toggle_off=מכובה
+firstRun_feature_tracking=נטרול מעקב
+firstRun_feature_malware=חסימת תוכנות זדוניות
+firstRun_title=Adblock Plus הותקן
+firstRun_acceptableAdsExplanation=×נחנו ×¨×•×¦×™× ×œ×¢×•×“×“ ××ª×¨×™× ×œ×”×©×ª×ž×© ×‘×¤×¨×¡×•× ×¤×©×•×˜ ×•×œ× ×‘×•×œ×˜. ×–×ת מדוע ביססנו <a>×§×•×•×™× ×ž× ×—×™× × ×•×§×©×™×</a> כדי לזהות מודעות מתקבלות, ×שר מופיעות בהגדרות ברירת המחדל. ×× ×‘×¨×¦×•× ×›× ×œ×—×¡×•× ×‘×›×œ ×–×ת ×ת כל המודעות ניתן <a>לנטרל</a> ×–×ת במספר שניות.
+firstRun_toggle_on=מופעל
+firstRun_contributor_credits=×§×¨×“×™×˜×™× ×œ×ª×•×¨×ž×™×
+firstRun_dataCorruptionWarning=עמוד ×–×” ממשיך להופיע ? <a>לחצו ×›×ן!</a>
+firstRun_acceptableAdsHeadline=מודעות מציקות ייחסמו מעכשיו
+firstRun_share=ספרו ×œ×—×‘×¨×™×›× ×•×ž×©×¤×—×ª×›×
+firstRun_share_headline=<a>תנו לנו יד</a> בהפיכת הרשת ×œ×ž×§×•× ×˜×•×‘ יותר
+firstRun_features=Adblock Plus יכול לעשות יותר מרק ×œ×—×¡×•× ×¤×¨×¡×•×ž×•×ª
+firstRun_feature_malware_description=הפכו ×ת הגלישה ×©×œ×›× ×œ×ž×ובטחת יותר על ידי חסימת ××ª×¨×™× ×”×ž×›×™×œ×™× ×ª×•×›× ×” זדונית.
+firstRun_feature_social_description=שחררו ×וטומטית ×ת חווית הגלישה ×©×œ×›× ×ž×›×¤×ª×•×¨×™ מדיה חברתית, כגון Facebook Like, ×שר ×ž×•×¤×™×¢×™× ×‘×¢×ž×•×“×™ ×ינטרנט ×•×ž× ×ª×¨×™× ×ת התנהגותכ×.
+firstRun_donate=תרומה
+firstRun_donate_label=תמיכה בפרויקט שלנו
+firstRun_feature_social=הסרת כפתורי מדיה חברתיי×
+firstRun_legacySafariWarning=×”× ×›× ×ž×©×ª×ž×©×™× ×‘×’×™×¨×¡×” ישנה של Safari ×©×œ× × ×ª×ž×›×ª על ידי Adblock Plus. ×–×” עלול ×œ× ×œ×¢×‘×•×“ כר×וי ×ו לשבש ×ת חווית המשתמש בחלק מה×תרי×. ×נו ×ž×ž×œ×™×¦×™× ×œ×›× ×œ×¢×“×›×Ÿ ×ת Safari לגרסה 6.1.1 ומעלה (OS X 10.8 Mountain Lion) ×ו Safari 7.0.1 ומעלה (OS X 10.9 Mavericks) ×ו להשתמש בגרסה ×”×חרונה של Mozilla Firefox, Google Chrome or Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/global.properties
new file mode 100644
index 0000000..eee273a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=×ין ×¤×¨×™×˜×™× ×œ×—×¡×™×ž×” בעמוד הנוכחי
+action3_tooltip=לחיצה כדי ל×פשר/לנטרל ×ת Adblock Plus.
+notification_antiadblock_title=הסתרת הודעות מוכוונות?
+type_label_script=תסריט
+filter_elemhide_nocriteria=×œ× ×¦×•×™×Ÿ קריטריון לזיהוי ×”×למנט שיוסתר
+blockingGroup_title=כללי חסימת מודעות
+whitelisted_tooltip=Adblock Plus עובד ×בל ×”×•× ×ž× ×•×˜×¨×œ בעמוד הנוכחי.
+type_label_stylesheet=סגנון
+blocked_count_tooltip=?1? מתוך ?2?
+type_label_font=גופן
+type_label_popup=חלון קופץ
+filter_regexp_tooltip=מסנן ×–×” ×”×•× ×‘×™×˜×•×™ רגיל ×ו קצר מדי מכדי להיות מיטבי. יותר מדי ×ž×¡× × ×™× ×ž×¡×•×’ ×–×” ×™×›×•×œ×™× ×œ×”×ט ×ת הגלישה.
+action0_tooltip=לחיצה כדי להציג ×ת תפריט הלחצן הימני, לחיצה ×מצעית כדי ל×פשר/לנטרל.
+whitelisted_page=Adblock Plus מנוטרל עבור העמוד הנוכחי
+remove_group_warning=×”×× ×‘×מת ברצונך להסיר קבוצה זו?
+action1_tooltip=לחיצה כדי לפתוח/לסגור ×ת רשימת ×”×¤×¨×™×˜×™× ×œ×—×¡×™×ž×”, לחיצה ×מצעית כדי ל×פשר/לנטרל.
+type_label_xmlhttprequest=בקשת XML
+active_tooltip=Adblock Plus מ×פשר, ?1? הרשמת(ות) ×ž×¡× × ×™× ×• ?2? מסנן(×™×) מות××ž×™× ×‘×©×™×ž×•×©.
+type_label_document=מסמך
+type_label_object_subrequest=תת-דרישת ×ובייקט
+whitelistGroup_title=×›×œ×œ×™× ×—×¨×™×’×™×
+disabled_tooltip=Adblock Plus מנוטרל.
+filter_elemhide_duplicate_id=רק זהות ×חת של ×”×למנט שיוסתר ניתנת לציון
+type_label_object=×ובייקט
+action2_tooltip=לחיצה כדי לפתוח ×ת המ×פייני×, לחיצה ×מצעית כדי ל×פשר/לנטרל.
+type_label_subdocument=מסגרת
+clearStats_warning=×–×” ×™×פס ×ת כל סטטיסטיקות הלחיצה של ×”×ž×¡× × ×™× ×•×™× ×˜×¨×œ ×ת מניית הלחיצה של המסנן. ×”×× ×œ×”×ž×©×™×š?
+notification_antiadblock_message=×תר ×–×” ידוע בהצגת הודעות מכוונות למשתמשי Adblock Plus. ×”×× ×‘×¨×¦×•× ×›× ×©-Adblock Plus יסתיר הודעות מוכוונות?
+blocked_count_addendum=(×’× ×›×Ÿ ברשימת המורשי×: ?1?, מוסתר: ?2?)
+subscription_invalid_location=×ž×™×§×•× ×¨×©×™×ž×ª הסינון ×יננו כתובת ×תר חוקית ×•×œ× ×©× ×§×•×‘×¥ חוקי.
+type_label_image=תמונה
+remove_subscription_warning=×”×× ×œ×”×¡×™×¨ ×ת ההרשמה ×”×–×ת?
+type_label_other=×חר
+mobile_menu_enable=ABP: מ×פשר
+type_label_media=×ודיו/ויד×ו
+mobile_menu_disable_site=ABP: מנטרל ב-?1?
+elemhideGroup_title=כללי הסתרת ×למנטי×
+mobile_menu_enable_site=ABP: מ×פשר ב-?1?
+type_label_elemhide=מוסתר
+newGroup_title=קבוצת ×ž×¡× × ×™× ×—×“×©×”
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/overlay.dtd
new file mode 100644
index 0000000..96b0652
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;כן">
+<!ENTITY notification.button.no "&amp;ל×">
+<!ENTITY sync.label "&amp;סנכרון הגדרות Adblock Plus">
+<!ENTITY whitelist.site.label "נטרול ב-?1?">
+<!ENTITY filters.label "&amp;העדפות סינון">
+<!ENTITY disable.label "נטרול בכל מקו×">
+<!ENTITY objecttab.title "חסימה">
+<!ENTITY objecttab.tooltip "לחיצה ×›×ן לחסימת פריט ×–×” ×¢× Adblock Plus">
+<!ENTITY menuitem.label "&amp;העדפות Adblock Plus">
+<!ENTITY objecttabs.label "הצגת &amp;לשוניות על פל×ש וג'×ווה">
+<!ENTITY sendReport.label "&amp;דיווח על בעיה בעמוד זה">
+<!ENTITY whitelist.page.label "נטרול בעמוד הזה בלבד">
+<!ENTITY context.image.label "Adblock Plus: חסימת תמונה">
+<!ENTITY counthits.label "מנה &amp;לחיצות מסנן">
+<!ENTITY opensidebar.label "&amp;פתיחת רשימת ×”×¤×¨×™×˜×™× ×œ×—×¡×™×ž×”">
+<!ENTITY notification.button.close "&amp;סגירה">
+<!ENTITY contribute.label "×ª×¨×•× ×œ-Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: חסימת מסגרת (פריי×)">
+<!ENTITY blocked.tooltip "×¤×¨×™×˜×™× ×—×¡×•×ž×™× ×‘×¢×ž×•×“ ×–×”:">
+<!ENTITY hideplaceholders.label "הסתרת &amp;מצייני ×ž×§×•× ×©×œ ××œ×ž× ×˜×™× ×—×¡×•×ž×™×">
+<!ENTITY showinstatusbar.label "&amp;הצגה בשורת המצב">
+<!ENTITY sidebar.title "×¤×¨×™×˜×™× ×œ×—×¡×™×ž×” בעמוד הנוכחי">
+<!ENTITY options.label "&amp;×פשרויות">
+<!ENTITY context.object.label "Adblock Plus: חסימת פריט">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: מ×פשר מחדש בעמוד ×–×”">
+<!ENTITY filters.tooltip "×”×ž×¡× × ×™× ×”×¤×¢×™×œ×™× ×‘×™×•×ª×¨:">
+<!ENTITY closesidebar.label "&amp;סגירת הרשימה של ×”×¤×¨×™×˜×™× ×œ×—×¡×™×ž×”">
+<!ENTITY showintoolbar.label "&amp;הצגה בסרגל הכלי×">
+<!ENTITY status.tooltip "מצב:">
+<!ENTITY context.media.label "Adblock Plus: חסימת וויד×ו/×ודיו">
+<!ENTITY subscription.update.label "עדכון מסנני×">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/sendReport.dtd
new file mode 100644
index 0000000..7a042c1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/sendReport.dtd
@@ -0,0 +1,66 @@
+<!ENTITY screenshot.undo.label "&amp;ביטול">
+<!ENTITY issues.disabledgroups.description "קבוצות ההרשמה/×”×ž×¡× × ×™× ×”×‘×ות מנוטרלות, לפי שעה ×ולי יש ×œ×”× ×”×©×¤×¢×” על עמוד ×–×”:">
+<!ENTITY showData.label "הצגת מידע של הדיווח">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus ×—×•×¡× ×™×•×ª×¨ &amp;מדי">
+<!ENTITY issues.change.description "התצורה ×©×œ×›× ×©×•× ×ª×”. יש לרענן ×ת העמוד כדי לבחון ×ת ×”×©×™× ×•×™×™× ×•×œ×”×–×™×Ÿ דיווח ×× ×”×‘×¢×™×” ×œ× × ×¤×ª×¨×” בעקבות השינוי.">
+<!ENTITY email.label "&amp;דו×&quot;ל:">
+<!ENTITY issues.openPreferences.label "פתיחת העדפות סינון">
+<!ENTITY sendPage.confirmation "הדיווח ×©×œ×›× × ×©×ž×¨. ניתן לגשת ×ליו בכתובת הב××”:">
+<!ENTITY copyLink.label "&amp;העתקת הקישור לדיווח">
+<!ENTITY issues.nofilters.description "Adblock Plus ×œ× ×—×•×¡× ×“×‘×¨ בעמוד הנוכחי. הבעיה ×שר ×ž×‘×—×™× ×™× ×§×¨×•×‘ לווד××™ ××™× × ×” קשורה ל-Adblock Plus.">
+<!ENTITY sendPage.knownIssue "הבעיה שדווחה קרוב לווד××™ שידועה כבר. מידע נוסף:">
+<!ENTITY typeSelector.other.description "בחירת ×פשרות זו בחשד לבעיה ×¢× Adblock Plus עצמו ×•×œ× ×‘×ž×¡× × ×™× ×©×œ×•.">
+<!ENTITY issues.disabledgroups.enable.label "×פשור ההרשמה/קבוצת המסנני×">
+<!ENTITY typeWarning.override.label "×× ×™ &amp;מבין ורוצה לשלוח ×ת הדיווח בכל ×–×ת">
+<!ENTITY issues.disabled.enable.label "×פשור Adblock Plus">
+<!ENTITY update.fixed.description "×פשרי שעדכון הרשמות ×”×ž×¡× × ×™× ×©×œ×›× ×™×¤×ª×•×¨ ×ת הבעיה שדווחה. ×× × ×¨×¢× × ×• ×ת העמוד ונסו שוב, לחצו על דיווח שוב ×× ×”×‘×¢×™×” נש×רת.">
+<!ENTITY anonymous.label "הגשה &amp;×נונימית">
+<!ENTITY reloadButton.label "&amp;רענון העמוד">
+<!ENTITY recentReports.clear.label "&amp;הסרת כל הדיווחי×">
+<!ENTITY typeSelector.description "חלון ×–×” ידריך ××ª×›× ×“×¨×š ×”×¦×¢×“×™× ×”×“×¨×•×©×™× ×œ×”×–× ×ª דיווח בעיה עבור Adblock Plus. ר×שית, ×× × ×‘×—×¨×• ×ת סוג הבעיה ×שר ××ª× ×—×•×•×™× ×‘×¢×ž×•×“ ×–×”:">
+<!ENTITY screenshot.remove.label "&amp;הסרת מידע רגיש">
+<!ENTITY issues.ownfilters.description "חלק ×ž×”×ž×¡× × ×™× ×©×—×œ×™× ×¢×œ עמוד ×–×” ×”× ×ž×•×’×“×¨×™-משתמש. יש לנטרל ×ת ×”×ž×¡× × ×™× ×שר ×ולי ×”× ×”×’×•×¨×ž×™× ×œ×‘×¢×™×”:">
+<!ENTITY update.inProgress.description "Adblock Plus צריך לעדכן ×ת הרשמות ×”×ž×¡× × ×™× ×›×“×™ ×œ×•×•×“× ×©×”×‘×¢×™×” ×œ× × ×¤×ª×¨×” כבר. ×× × ×× × ×”×ž×ª×™× ×•...">
+<!ENTITY sendPage.retry.label "שלח שוב">
+<!ENTITY data.label "&amp;מידע הדיווח:">
+<!ENTITY recentReports.label "×“×™×•×•×—×™× ××—×¨×•× ×™× ×©×œ×š שנשלחו">
+<!ENTITY typeWarning.description "×¦×™×™× ×ª× ×©××ª× ×ž×¢×•× ×™×™× ×™× ×œ×“×•×•×— על בעיה כללית ×¢× Adblock Plus מ×שר בעיה ×¢× ×”×ž×¡× × ×™×. שימו לב שבעיות ×›×לו עדיף לדווח ב[link]×¤×•×¨×•× Adblock Plus[/link]. יש להשתמש במדווח הבעיות רק בנוסף לדיון ×§×™×™×, כיוון ש××£ ×חד ×œ× ×™×©×™× ×œ×‘ לדיווח ×©×œ×›× ××œ× ×× ×™×¡×•×¤×§ קישור ×ליו. הקישור שנוצר ×וטומטית יסופק ל×חר הזנת הדיווח.">
+<!ENTITY issues.disabled.description "Adblock Plus מנוטרל, ×–×” ×œ× ×™×—×¡×•× ×“×‘×¨ במצב הנוכחי.">
+<!ENTITY attachExtensions.label "סיפוח רשימת &amp;ההרחבות הפעילות ×ל הדיווח במקרה וניגוד תוספות ×”×•× ×”×’×•×¨× ×œ×‘×¢×™×”">
+<!ENTITY issues.nosubscriptions.add.label "הוספת הרשמת מסנן">
+<!ENTITY issues.disabledfilters.enable.label "×פשור מסנן">
+<!ENTITY issues.override.label "&amp;התצורה נכונה, ×פשר להמשיך ×¢× ×”×“×™×•×•×—">
+<!ENTITY issues.nosubscriptions.description "נר××” ש××™× ×›× ×¨×©×•×ž×™× ×œ×©×•× ×ž×¡× ×Ÿ שהוכן מר×ש ×שר מופיע ברשימה שמסיר ×וטומטית תוכן ×œ× ×¨×¦×•×™ מ×תרי ×ינטרנט.">
+<!ENTITY typeSelector.falsePositive.description "בחר ב×פשרות זו ×× ×—×¡×¨ בעמוד תוכן חשוב ×ו שמוצג בצורה ×œ× × ×›×•× ×” ×ו כושל לתפקד כר×וי. ניתן לקבוע ×”×× Adblock Plus ×”×•× ×”×’×•×¨× ×œ×‘×¢×™×” על ידי נטרולו זמנית.">
+<!ENTITY typeSelector.other.label "בעיה &amp;×חרת">
+<!ENTITY emailComment.label "×נו ×ž×ž×œ×™×¦×™× ×œ×”×–×™×Ÿ כתובת דו×&quot;ל תקפה, כך שנוכל ליצור ×יתך קשר ×× ×§×™×™×ž×•×ª ש×לות לגבי הדוח שלך.
+כמו כן, כתובתך ת×פשר לנו לזהות ×ת תרומותייך ולתעדף ×ותן בצורה גבוהה יותר.">
+<!ENTITY issues.whitelist.remove.label "×פשור מחדש של Adblock Plus בעמוד ×–×”">
+<!ENTITY outdatedSubscriptions.description "הרשמות ×”×ž×¡× × ×™× ×”×‘×ות ×œ× ×¢×•×“×›× ×• לפחות שבועיי×. ×× × ×¢×“×›× ×• הרשמות ×לו לפני שליחת הדיווח, יכול להיות שהבעיה נפתרה כבר.">
+<!ENTITY dataCollector.description "×× × ×”×ž×ª×™× ×• מספר ×¨×’×¢×™× ×¢×“ ×שר Adblock Plus ×™×סוף ×ת המידע הדרוש.">
+<!ENTITY sendButton.label "&amp;שליחת דיווח">
+<!ENTITY comment.label "&amp;הערה (×œ× ×—×•×‘×”):">
+<!ENTITY sendPage.errorMessage "נכשל ניסיון השליחה של הדיווח ×¢× ×§×•×“ השגי××” &quot;?1?&quot;. ×× × ×•×•×“×ו ש××ª× ×ž×—×•×‘×¨×™× ×œ×ינטרנט ונסו שוב. ×× ×”×‘×¢×™×” נמשכת, ×× × ×‘×§×©×• סיוע ב[link]×¤×•×¨×•× Adblock Plus[/link]LL.">
+<!ENTITY showRecentReports.label "הצגת ×”×“×™×•×•×—×™× ×”××—×¨×•× ×™× ×©× ×©×œ×—×•">
+<!ENTITY commentPage.heading "הזנת תגובה">
+<!ENTITY update.start.label "התחל לעדכן כעת">
+<!ENTITY issues.disabledfilters.description "×”×ž×¡× × ×™× ×”×‘××™× ×ž× ×•×˜×¨×œ×™×, לפי שעה ×ולי יש ×œ×”× ×”×©×¤×¢×” על עמוד ×–×”:">
+<!ENTITY screenshot.description "עמוד ×–×”×” יכול להר×ות שונה ל×× ×©×™× ×©×•× ×™×. ×× ×ª×¦×•×¨×£ תמונת מסך לדיווח, ×–×” ×ולי יעזור לנו להבין ×ת הבעיה. ניתן להסיר ×—×œ×§×™× ×”×ž×›×™×œ×™× ×ž×™×“×¢ רגיש וכמו כן לסמן ××–×•×¨×™× ×©×‘×”× ×”×‘×¢×™×” מובחנת. כדי לעשות ×–×ת יש ללחוץ על כפתור ההתכתבות ולבחור ×¢× ×”×¢×›×‘×¨ חלק מהתמונה.">
+<!ENTITY screenshot.attach.label "&amp;צרף תמונת דף לדיווח">
+<!ENTITY issues.whitelist.description "Adblock Plus מנוטרל כעת בעמוד ×שר מדווח. יש ל×פשר ×ותו מחדש ולרענן ×ת העמוד לפני הזנת הדיווח על מנת לסייע בחקירת בעיה זו.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus ×יננו ×—×•×¡× &amp;פרסומות">
+<!ENTITY typeSelector.heading "בחירת סוג הבעיה">
+<!ENTITY anonymity.warning "×œ× × ×•×›×œ לחזור ×ליך, וסביר שנתעדף ×ת הדוח בצורה נמוכה יותר.">
+<!ENTITY wizard.title "מדווח הבעיות">
+<!ENTITY issues.ownfilters.disable.label "נטרול מסנן">
+<!ENTITY commentPage.description "שדה הטקסט שמתחת מ×פשר הזנת תגובה כדי לסייע לנו בהבנת הבעיה. צעד ×–×” ×יננו בגדר חובה ×ך מומלץ ×× ×”×‘×¢×™×” ××™× × ×” מובנת מ×ליה. ניתן ×’× ×œ×¡×§×•×¨ ×ת נתוני הדיווח לפני ×©×”×•× × ×©×œ×—.">
+<!ENTITY comment.lengthWarning "×ורך ההודעה חרג מ-1000 תווי×. רק 1000 ×”×ª×•×•×™× ×”×¨××©×•× ×™× ×™×©×œ×—×•.">
+<!ENTITY typeSelector.falseNegative.description "בחירת ×פשרות זו ×× ×ž×•×¦×’×ª פרסומת למרות ש-Adblock Plus מ×פשר.">
+<!ENTITY sendPage.waitMessage "×× × ×”×ž×ª×™× ×• בזמן ש-Adblock Plus מזין ×ת הדיווח שלכ×.">
+<!ENTITY dataCollector.heading "×‘×¨×•×›×™× ×”×‘××™× ×œ×ž×“×•×•×— הבעיות">
+<!ENTITY screenshot.heading "צירוף ×¦×™×œ×•× ×ž×¡×š">
+<!ENTITY sendPage.heading "שליחת דיווח">
+<!ENTITY issues.subscriptionCount.description "נר××” ש××ª× ×¨×©×•×ž×™× ×œ×™×•×ª×¨ מדי הרשמות מסנני×. מערך ×–×” ×יננו מומלץ מכיוון שזה ×™×’×¨×•× ×œ×¡×™×›×•×™ לבעיות להיות הרבה יותר גבוה. ×נחנו ×’× ×œ× × ×•×›×œ לקבל ×ת דיווחי הבעיות ×©×œ×›× ×ž×›×™×•×•×Ÿ ×©×œ× ×‘×¨×•×¨ ××™×–×” מחבר הרשמות מסנן צריך לנקוט בפעולה. ×× × ×”×¡×™×¨×• ×ת כל הרשמות ×”×ž×¡× × ×™× ×¤×¨×˜ ל×לו שב×מת נחוצות ובדקו ×”×× ××– הבעיה עדיין מתרחשת.">
+<!ENTITY screenshot.mark.label "&amp;סמן ×ת הבעיה">
+<!ENTITY privacyPolicy.label "הצהרת פרטיות">
+<!ENTITY issues.description "Adblock Plus ×–×™×”×” בעיות ×¢× ×”×ª×¦×•×¨×” ×©×œ×›× ×©×ולי ×חר×ית לבעיה זו ×ו ×©×™×’×¨×•× ×œ×—×§×™×¨×ª הדיווח לקשה.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/sidebar.dtd
new file mode 100644
index 0000000..3cac07a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "גבולות פריט הפל×ש">
+<!ENTITY address.label "כתובת">
+<!ENTITY context.open.label "פתיחה בלשונית חדשה">
+<!ENTITY type.label "סוג">
+<!ENTITY tooltip.filterSource.label "מקור מסנן">
+<!ENTITY noitems.label "×ין ×¤×¨×™×˜×™× ×”× ×™×ª× ×™× ×œ×—×¡×™×ž×”">
+<!ENTITY filter.label "מסנן">
+<!ENTITY tooltip.size.label "גודל:">
+<!ENTITY reattach.label "חיבור">
+<!ENTITY search.label "&amp;חיפוש:">
+<!ENTITY docDomain.thirdParty "(צד שלישי)">
+<!ENTITY filterSource.label "מקור המסנן">
+<!ENTITY tooltip.docDomain.label "מקור המסמך:">
+<!ENTITY context.copy.label "העתקת כתובת הפריט">
+<!ENTITY tooltip.type.label "סוג:">
+<!ENTITY context.disablefilter.label "נטרול המסנן ?1?">
+<!ENTITY context.copyFilter.label "העתקת המסנן">
+<!ENTITY context.block.label "חסימת פריט זה">
+<!ENTITY context.enablefilter.label "×פשור המסנן מחדש ?1?">
+<!ENTITY detach.label "הפרדה">
+<!ENTITY whitelisted.label "העמוד × ×ž×¦× ×‘×¨×©×™×ž×” הלבנה">
+<!ENTITY context.disablefilteronsite.label "נטרול מסנן זה ב ?1?">
+<!ENTITY detached.title "(×¤×¨×™×˜×™× ×œ×—×¡×™×ž×” (מופרד :Adblock Plus">
+<!ENTITY docDomain.firstParty "(צד ר×שון)">
+<!ENTITY tooltip.type.whitelisted "(ברשימה הלבנה)">
+<!ENTITY tooltip.filter.label "השפעת המסנן:">
+<!ENTITY tooltip.filter.disabled "(מנוטרל)">
+<!ENTITY context.editfilter.label "עריכת המסנן שמשפיע">
+<!ENTITY tooltip.type.blocked "(חסו×)">
+<!ENTITY size.label "גודל">
+<!ENTITY context.whitelist.label "הוספת כלל חריג עבור פריט">
+<!ENTITY context.selectAll.label "בחירת הכל">
+<!ENTITY state.label "מצב">
+<!ENTITY docDomain.label "מקור המסמך">
+<!ENTITY tooltip.address.label "כתובת:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/subscriptionSelection.dtd
new file mode 100644
index 0000000..eaa7959
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "הוספת &amp;הרשמת ×”×ž×¡× × ×™× &quot;?1?&quot; ×’× ×›×Ÿ">
+<!ENTITY list.download.failed "Adblock Plus נכשל ב×חזור רשימת ההרשמות.">
+<!ENTITY list.download.retry "נסה שנית">
+<!ENTITY title.label "&amp;כותרת ההרשמה:">
+<!ENTITY list.download.website "הצגת ×”×תר">
+<!ENTITY supplementMessage "מסנן הרשמה ×–×” נועד לשימוש ×¢× ×ž×¡× ×Ÿ ההרשמה &quot;?1?&quot; ×שר ×œ× × ×¢×©×” בו שימוש עדיין.">
+<!ENTITY viewList.label "הצגת מסנני×">
+<!ENTITY visitHomepage.label "ביקור ב×תר הבית">
+<!ENTITY addSubscription.label "הוספת הרשמה">
+<!ENTITY dialog.title "הוספת הרשמת ×ž×¡× × ×™× ×œ-Adblock Plus">
+<!ENTITY location.label "×ž×™×§×•× ×¨×©×™×ž×ª &amp;המסנני×:">
+<!ENTITY fromWeb.description "יש ×œ×•×•×“× ×”×•×¡×¤×ª מסנן הרשמה ×–×”. ניתן לשנות ×ת כותרת ×ו ×ž×™×§×•× ×”×”×¨×©×ž×” לפני הוספתה.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/composer.dtd
new file mode 100644
index 0000000..5f131ff
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "&amp;na kraju adrese">
+<!ENTITY domainRestriction.label "OgraniÄi na &amp;domenu:">
+<!ENTITY collapse.default.no.label "Koriati uobiÄajeno (ne)">
+<!ENTITY firstParty.label "Samo od p&amp;rve strane">
+<!ENTITY preferences.label "Pri&amp;kaži postojeće filtere...">
+<!ENTITY pattern.label "Traži ponavljajući uzorak">
+<!ENTITY thirdParty.label "Samo od &amp;treće strane">
+<!ENTITY filter.label "Novi &amp;filter:">
+<!ENTITY collapse.label "&amp;Sažeti blokirano:">
+<!ENTITY match.warning "Uneseni uzorak više se ne poklapa sa adresom za blokeiranje/odblokiranje i neće imati nikakvog utjecaja na nju.">
+<!ENTITY anchor.start.label "na &amp;poÄetku adrese">
+<!ENTITY matchCase.label "ToÄan i&amp;zraz">
+<!ENTITY custom.pattern.label "Prila&amp;gođeno:">
+<!ENTITY unselectAllTypes.label "Odaberi ništa">
+<!ENTITY type.whitelist.label "Prav&amp;ilo iznimke">
+<!ENTITY regexp.warning "Uzorak koji ste unijeli biti će protumaÄen kao obiÄni izraz kojeg Adblock Plus ne može efikasno obraditi i može usporiti vaÅ¡e surfanje. Ako niste namjeravali koristiti obiÄni izraz, dodajte asterisk (*) na kraju uzorka.">
+<!ENTITY dialog.title "Dodaj Adblock Plus pravilo filtera">
+<!ENTITY basic.label "Osnovni pregled">
+<!ENTITY type.filter.label "&amp;Blokirani filter">
+<!ENTITY types.label "Primjeniti na vrste:">
+<!ENTITY shortpattern.warning "Uneseni uzorak je prekratak za optimizaciju i može usporiti vaÅ¡e surfanje. PreporuÄamo da odaberete duži niz za ovaj filter kako biste omogućili da Adblock Plus efikasnije obradi taj filter.">
+<!ENTITY collapse.yes.label "Da">
+<!ENTITY anchors.label "Prihvati samo uzorak:">
+<!ENTITY collapse.default.yes.label "Koristi uobiÄajeno (da)">
+<!ENTITY domainRestriction.help "Koristite ovu mogućnost za odabir jedne ili više domena odvojenih okomitom linijom (|). Filter će biti primjenjen samo na odabrane domene. Tilda (~) prije naziva domene pokazuje da filter neće biti primjenjen na toj domeni.">
+<!ENTITY accept.label "Dodaj filter">
+<!ENTITY options.label "Mogućnosti">
+<!ENTITY disabled.warning "Adblock Plus je trenutno onemogućen. Možete dodavati filtere ali oni se neće primjenjivati ako ne [link]omogućite Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "na &amp;poÄetku naziva domene">
+<!ENTITY collapse.no.label "Ne">
+<!ENTITY selectAllTypes.label "Odaberi sve">
+<!ENTITY advanced.label "Napredni pregled">
+<!ENTITY pattern.explanation "Uzorak može biti bilo koji dio adrese, asterisk (*) služi kao zamjena. Filter će biti samo primjenjen na adrese koje se podudaraju sa naznaÄenim uzorkom.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/filters.dtd
new file mode 100644
index 0000000..efbb24b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Svi vaši prilagođeni filteri biti će zamijenjene sadržajem odabrane datoteke. Želite li nastaviti?">
+<!ENTITY slow.column "Spori filteri (&amp;w)">
+<!ENTITY enabled.column "O&amp;mogućeno">
+<!ENTITY subscription.lastDownload.checksumMismatch "Neuspješno, neusklađenost checksum-a.">
+<!ENTITY noFiltersInGroup.text "Odabrana grupa je prazna.">
+<!ENTITY subscription.actions.label "Radnje">
+<!ENTITY filter.selectAll.label "Odaberi sve">
+<!ENTITY backupButton.label "&amp;Sigurnosne kopije i vraćanje">
+<!ENTITY restore.minVersion.warning "Upozorenje: datoteka je stvorena novijom inaÄicom Adblock Plus-a. Trebali biste ažurirati na posljednju inaÄicu Adblock Plus-a prije vraćanja ove datoteke.">
+<!ENTITY restore.error "Podaci datoteka ne mogu biti obrađeni, možda to nije Adblock Plus datoteka sigurnosne kopije?">
+<!ENTITY sort.ascending.label "&amp;A &gt; Z red slaganja">
+<!ENTITY sort.label "Po&amp;složiti po">
+<!ENTITY subscription.source.label "Popis filtera">
+<!ENTITY hitcount.column "Pogoci (&amp;H)">
+<!ENTITY noFilters.text "Još nemate prilagođenih filtera.">
+<!ENTITY backup.custom.title "Samo prilagođeni filteri">
+<!ENTITY subscription.external.label "Ažurirano drugim prikljuÄkom">
+<!ENTITY subscription.delete.label "Obriši">
+<!ENTITY noGroupSelected.text "Morate odabrati grupu filtera prije nego filteri mogu biti prikazani.">
+<!ENTITY filter.cut.label "Izreži">
+<!ENTITY restore.default.label "Vrati sigurnosnu kopiju od ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Preuzimanje...">
+<!ENTITY subscriptions.tab.label "Pretplate filtera">
+<!ENTITY sort.descending.label "&amp;Z &gt; A red slaganja">
+<!ENTITY filters.remove.warning "Sigurno želite ukloniti sve odabrane filtere?">
+<!ENTITY filter.delete.label "Obriši">
+<!ENTITY addSubscriptionAdd.label "Dodaj">
+<!ENTITY viewMenu.label "Pogledaj">
+<!ENTITY subscription.lastDownload.unknown "nepoznato">
+<!ENTITY addSubscriptionCancel.label "Poništi">
+<!ENTITY subscription.enabled.label "Omogućen">
+<!ENTITY noSubscriptions.text "Još niste dodali nijednu pretplatu filtera. Adblock Plus neće blokirati
+ ništa bez filtera, molim koristite &quot;Dodaj pretplatu filtera&quot; za
+ dodavanje filtera.">
+<!ENTITY subscription.update.label "Ažuriraj filtere">
+<!ENTITY dialog.title "Adblock Plus postavke filtera">
+<!ENTITY addFilter.label "&amp;Dodaj filter">
+<!ENTITY subscription.minVersion.warning "Ova pretplata filtera zahtijeva noviju inaÄicu Adblock Plus-a, ažurirajte na posljednju Adblock Plus inaÄicu.">
+<!ENTITY subscription.lastDownload.invalidURL "Neuspješno, neispravna adresa">
+<!ENTITY backup.error "Dogodila se greÅ¡ka pri zapisivanja filtera u datoteku. Pobrinite se da datoteka nije postavljena na -samo Äitanje- ili ju koristi druga aplikacija.">
+<!ENTITY filter.moveUp.label "Pomakni gore">
+<!ENTITY addGroup.label "Dodaj &amp;grupu filtera">
+<!ENTITY filter.edit.label "Uredi">
+<!ENTITY subscription.showHideFilters.label "Prikaži/sakrij filtere">
+<!ENTITY acceptableAds2.label "Dopust&amp;i neke nenametljive reklame">
+<!ENTITY addSubscriptionOther.label "Dodaj drugu pretplatu">
+<!ENTITY close.label "Zatvori">
+<!ENTITY sort.none.label "&amp;Neposloženo">
+<!ENTITY filter.actions.label "Radnje filtera">
+<!ENTITY filter.copy.label "Kopiraj">
+<!ENTITY filter.moveDown.label "Pomakni gore">
+<!ENTITY filter.resetHitCounts.label "Vrati na poÄetno statistiku pogodaka">
+<!ENTITY readMore.label "ProÄitaj viÅ¡e">
+<!ENTITY subscription.moveUp.label "Pomakni gore">
+<!ENTITY addSubscription.label "Dodaj pretplatu &amp;filtera">
+<!ENTITY subscription.homepage.label "PoÄetna stranica">
+<!ENTITY backup.complete.title "Svi filteri i pretplate">
+<!ENTITY restore.own.label "Vratite vlastitu sigurnosnu kopiju">
+<!ENTITY restore.complete.warning "Sve vaše postavke filtera biti će zamijenjene sadržajem odabrane datoteke. Želite li nastaviti?">
+<!ENTITY filters.tab.label "Prilagođeni filteri">
+<!ENTITY backup.label "Stvori novu sigurnosnu kopiju">
+<!ENTITY find.label "&amp;Traži">
+<!ENTITY subscription.moveDown.label "Pomakni dolje">
+<!ENTITY subscription.lastDownload.connectionError "Neuspješno, greška preuzimanja">
+<!ENTITY subscription.lastDownload.success "Uspješno">
+<!ENTITY subscription.lastDownload.invalidData "Neuspješno, neispravan popis filtera">
+<!ENTITY filter.paste.label "Zalijepi">
+<!ENTITY subscription.disabledFilters.enable "Omogući onemogućene filtere">
+<!ENTITY lasthit.column "Pos&amp;ljednji pogodak">
+<!ENTITY subscription.editTitle.label "Uredi naziv">
+<!ENTITY subscription.disabledFilters.warning "Neki filteri u ovoj pretplati su onemogućeni.">
+<!ENTITY filter.column "Pravilo &amp;filtera">
+<!ENTITY subscription.lastDownload.label "Zadnje preuzimanje:">
+<!ENTITY viewList.label "Pogledaj popis">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/firstRun.properties
new file mode 100644
index 0000000..dad411a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Surfajte privatno tako što ćete onemogućiti praćenje - skrivanjem od reklamnih kompanija koje prate vaš svaki pokret.
+firstRun_toggle_off=ISKLJUÄŒI
+firstRun_feature_tracking=Onemogućavanje praćenja
+firstRun_feature_malware=Blokiranje malwara
+firstRun_title=Adblock Plus je instaliran
+firstRun_toggle_on=UKLJUÄŒI
+firstRun_acceptableAdsExplanation=Želimo podupirati web stranice da koriste poÅ¡teno, nenametljivo reklamiranje. Zato smo uspostavili <a>toÄne smjernice</a> za prepoznavanje reklama, koje su prikazane prema uobiÄajenim postavkama. Ako joÅ¡ uvijek želite blokirati svaku reklamu to možete <a>onemogućiti</a> za nekoliko sekuondis.
+firstRun_contributor_credits=Zasluge doprinositelja
+firstRun_dataCorruptionWarning=Nastavlja li se ova stranica pojavljivati? <a>Kliknite ovdje!</a>
+firstRun_acceptableAdsHeadline=Naporni oglasi će sada biti blokirani
+firstRun_share=Recite svojim prijateljima
+firstRun_share_headline=<a>Pomognite nam</a> pri stvaranju Interneta boljim mjestom
+firstRun_feature_social_description=Automatski oslobodite svoje surfanje internetom od napornih tipki društvenih mreža poput Facebook 'Sviđa mi se' tipke, koji se pojavljuju na web stranicama i prati vaše ponašanje.
+firstRun_filterlistsReinitializedWarning=Izgleda da je greÅ¡ka uzrokovala uklanjanje svih filtra, a mi smo u nemogućnosti da ih vratimo. Zato smo postavili na poÄetne postavke vaÅ¡ih filtra i prihvatljivih reklama. Provjerite postavke vaÅ¡ih popisa filtra i prihvatljivih reklama u <a>Adblock Plus mogućnostima</a>.
+firstRun_feature_malware_description=UÄinite vaÅ¡e surfanje Internetom sigurnijim blokiranjem poznatih malvare domena.
+firstRun_features=Adblock Plus može uÄiniti mnogo viÅ¡e nego samo blokirati reklame
+firstRun_donate=donirajte
+firstRun_donate_label=Podržite naš projekt
+firstRun_feature_social=Uklanjanje tipki društvenih mreža
+firstRun_legacySafariWarning=Koristite stariju inaÄicu Safarija koja ne podržava Adblock Plus. Možda neće ispravno raditi ili može naruÅ¡iti korisniÄko iskustvo na nekim web stranicama. Stoga vam preporuÄamo nadogradnju na Safari 6.1.1 ili noviju inaÄicu (dostupnu za Mac OS X 10.8 Mountain Lion), ili Safari 7.0.1 ili noviju inaÄicu (za OS X 10.9 Mavericks), ili koristite najnoviju inaÄicu Mozilla Firefoxa, Google Chroma ili Opere.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/global.properties
new file mode 100644
index 0000000..4e368c9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Na trenutnoj stranici nema stavki koje se mogu blokirati
+action3_tooltip=Kliknite za omogućavanje/onemogućavanje Adblock Plus-a.
+notification_antiadblock_title=Sakrij ciljane poruke?
+type_label_script=skripta
+filter_elemhide_nocriteria=Nema kriterija za prepoznavanje elementa koji će biti skriven
+blockingGroup_title=Ad Blocking pravila
+whitelisted_tooltip=Adblock Plus je onemogućen na trenutnoj stranici.
+type_label_stylesheet=stil
+blocked_count_tooltip=?1? od ?2?
+type_label_font=slovo
+type_label_popup=skoÄni prozor
+filter_regexp_tooltip=Ovaj filter je ili regularan izraz ili je prekatak za optimizacju. Previše ovakvih filtera vam može usporiti surfanje.
+action0_tooltip=Kliknite za otvaranje kontekstnog izbornika, srednji klik za omogućavanje/onemogućavanje.
+whitelisted_page=Adblock Plus je onemogućen za trenutnu stranicu
+remove_group_warning=Želite li stvarno ukloniti ovu grupu?
+action1_tooltip=Kliknite za otvaranje/zatvaranje blokiranih stavki, srednji klik za omogućavanje/onemogućavanje.
+type_label_xmlhttprequest=XML zahtjev
+active_tooltip=Adblock Plus je omogućen, ?1? pretplata na filtere i ?2? prilagođenih filtera je u upotrebi.
+type_label_document=dokument
+type_label_object_subrequest=podzahtjev objekta
+whitelistGroup_title=Pravila iznimka
+disabled_tooltip=Adblock Plus je onemogućen.
+filter_elemhide_duplicate_id=Samo jedan ID elementa za skrivanje može biti odabran.
+type_label_object=objekt
+action2_tooltip=Kliknite za otvaranje postavki, srednji klik za omogućavanje/onemogućavanje.
+type_label_subdocument=okvir
+clearStats_warning=Ovo će poništiti svu statistiku pogodaka filtera i onemogućiti brojanje pogodaka filtera. Želite li nastaviti?
+notification_antiadblock_message=Za ovu stranicu je poznato da prikazuje ciljane poruke Adblock Plus korisnicima. Želite li da Adblock Plus sakrije ciljane poruke?
+blocked_count_addendum=(dopušteni: ?1?, skriveni: ?2?)
+subscription_invalid_location=Lokacija popisa filtera nije niti valjana web adresa niti naziv datoteke.
+type_label_image=slika
+remove_subscription_warning=Želite li stvarno ukloniti ovu pretplatu?
+type_label_other=drugi
+mobile_menu_enable=ABP: Omogući
+type_label_media=zvuÄni/video zapisi
+mobile_menu_disable_site=ABP: Onemogući na ?1?
+elemhideGroup_title=Pravila elementa sakrivanja
+mobile_menu_enable_site=ABP: Omogući na ?1?
+type_label_elemhide=skriveno
+newGroup_title=Nova grupa filtera
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/overlay.dtd
new file mode 100644
index 0000000..cf53e9f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Da">
+<!ENTITY notification.button.no "&amp;Ne">
+<!ENTITY sync.label "Sinkroniziraj Adblo&amp;ck Plus postavke">
+<!ENTITY whitelist.site.label "Onemogući na ?1?">
+<!ENTITY filters.label "Postavke &amp;filtera">
+<!ENTITY disable.label "Onemogući posvuda">
+<!ENTITY objecttab.title "Blokiraj">
+<!ENTITY objecttab.tooltip "Kliknite ovdje za blokiranje ovog objekta s Adblock Plus-om">
+<!ENTITY menuitem.label "Ad&amp;block Plus postavke">
+<!ENTITY objecttabs.label "Pri&amp;kaži kartice s Flashom i Javom">
+<!ENTITY sendReport.label "P&amp;rijavite problem na ovoj stranici">
+<!ENTITY whitelist.page.label "Onemogući samo na ovoj stranici">
+<!ENTITY context.image.label "Blokiraj sliku s Adblock Plus-om">
+<!ENTITY counthits.label "Broji pogodke fil&amp;tera">
+<!ENTITY opensidebar.label "Otvori &amp;blokirane stavke">
+<!ENTITY notification.button.close "&amp;Zatvori">
+<!ENTITY contribute.label "Doprinesite Adblock Plus-u">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Blokiraj okvir s Adblock Plus-om">
+<!ENTITY blocked.tooltip "Blokirane stavke na ovoj stranici:">
+<!ENTITY hideplaceholders.label "Sakrij rezervirana mjesta b&amp;lokiranih elemenata">
+<!ENTITY showinstatusbar.label "Prikaži u &amp;statusnoj traci">
+<!ENTITY sidebar.title "Stavke koje se mogu blokirati na trenutnoj stranici">
+<!ENTITY options.label "M&amp;ogućnosti">
+<!ENTITY context.object.label "Blokiraj objekt s Adblock Plus-om">
+<!ENTITY context.removeWhitelist.label "Ponovno omogući na ovoj stranici Adblock Plus">
+<!ENTITY filters.tooltip "Najaktivniji filteri:">
+<!ENTITY closesidebar.label "Zatvori &amp;blokirane stavke">
+<!ENTITY showintoolbar.label "Prik&amp;aži u alatnoj traci">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Blokiraj audio/video s Adblock Plus-om">
+<!ENTITY subscription.update.label "Ažuriraj filtere">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/sendReport.dtd
new file mode 100644
index 0000000..61195b8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/sendReport.dtd
@@ -0,0 +1,102 @@
+<!ENTITY screenshot.undo.label "&amp;Vrati">
+<!ENTITY issues.disabledgroups.description "Sljedeća pretplata filtera / grupe filtera su onemogućene, koje možda
+ utjeÄu na ovu stranicu:">
+<!ENTITY showData.label "Prikaži podatke izvješća">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus prev&amp;iše blokira">
+<!ENTITY issues.change.description "VaÅ¡e postavke su promijenjene. Ponovno uÄitajte stranicu za testiranje promjena
+ i pošaljite izvješće ako problem nije't riješen testiranjem promjene.">
+<!ENTITY email.label "&amp;E-pošta:">
+<!ENTITY issues.openPreferences.label "Otvori postavke filtera">
+<!ENTITY sendPage.confirmation "Vaše izvješće je spremljeno. Možete mu pristupiti na sljedećoj adresi:">
+<!ENTITY copyLink.label "Kopiraj povezni&amp;cu izvješća">
+<!ENTITY issues.nofilters.description "Adblock Plus ništa ne blokira na ovoj trenutnoj stranici. Problem koji ste
+ opazili zacijelo nije povezan s Adblock Plus-om.">
+<!ENTITY sendPage.knownIssue "Problem koji ste prijavili već je poznat. Više informacija:">
+<!ENTITY typeSelector.other.description "Odaberite ovu mogućnost ako mislite da je problem sa Adblock Plus-om,
+ a ne sa filterima.">
+<!ENTITY issues.disabledgroups.enable.label "Omogući pretplatu filtera / grupe filtera">
+<!ENTITY typeWarning.override.label "Razumijem i ipak želim podnije&amp;ti izvješće">
+<!ENTITY issues.disabled.enable.label "Omogući Adblock Plus">
+<!ENTITY update.fixed.description "Ažuriranje vaših pretplata na filtere je vjerovatno riješila problem koji ste
+ prijavljivali. Ponovno uÄitajte stranicu i pokuÅ¡ajte ponovno, pritisnite Prijavi ponovno ako
+ problem nije rješen.">
+<!ENTITY anonymous.label "&amp;Anoniman prijavak">
+<!ENTITY reloadButton.label "Ponovno uÄitaj st&amp;ranicu">
+<!ENTITY recentReports.clear.label "&amp;Ukloni sva izvješća">
+<!ENTITY typeSelector.description "Ovaj prozor će vas voditi kroz korake potrebne za prijavu Adblock
+ Plus izvještaja problema. Prvo odaberite vrstu problema koju ste doživjeli
+ na ovoj stranici:">
+<!ENTITY screenshot.remove.label "&amp;Ukloni osjetljive podatke">
+<!ENTITY issues.ownfilters.description "Neki od filtera primjenjenih na ovoj stranici je definirao korisnik. Onemogućite
+ filtere koji možda uzrokuju problem:">
+<!ENTITY update.inProgress.description "Adblock Plus treba ažurirati vaše pretplate na filtere kako bi bili sigurni da
+ problem već nije rijeÅ¡en. PriÄekajte...">
+<!ENTITY sendPage.retry.label "Pošalji ponovno">
+<!ENTITY data.label "&amp;Podaci izvješća:">
+<!ENTITY recentReports.label "Vaša nedavno podnesena izvješća">
+<!ENTITY typeWarning.description "NaznaÄili ste da želite prijaviti općeniti problem sa Adblock Plus-om a ne
+ problem sa filterima. Takav problem najbolje je prijaviti
+ na [link]Adblock Plus forumu[/link]. Trebali biste koristiti prijavu problema
+ za dopunu postojeće rasprave, jer nitko neće zapaziti vaše izvješće
+ osim ako im ne date poveznicu na to izvješće. Automatski generirana poveznica
+ biti će dostupna nakon prijave izvješća.">
+<!ENTITY issues.disabled.description "Adblock Plus je onemogućen, neće ništa blokirati u ovom trenutnom stanju.">
+<!ENTITY attachExtensions.label "Dodaj popis aktivnih dodataka u izvješće u sluÄaju da je dodatak &amp;razlog problema">
+<!ENTITY issues.nosubscriptions.add.label "Dodaj pretplatu filtera">
+<!ENTITY issues.disabledfilters.enable.label "Omogući filter">
+<!ENTITY issues.override.label "P&amp;ostavke su ispravne, nastavi s podnošenjem izvješća">
+<!ENTITY issues.nosubscriptions.description "Čini se da niste pretplaćeni na nijedan od unaprijed izrađenih popisa filtera koji
+ automatski uklanjaju neželjeni sadržaj sa web stranica.">
+<!ENTITY typeSelector.falsePositive.description "Odaberite ovu mogućnost ako stranica važan sadržaj prikazuje neispravno ili
+ ne radi ispravno. Možete odrediti da li Adblock Plus uzrokuje
+ taj problem, tako da ga privremeno onemogućite.">
+<!ENTITY typeSelector.other.label "Os&amp;tali problemi">
+<!ENTITY emailComment.label "Molimo vas da upišete valjanu adresu e-pošte, da vas možemo kontaktirati ako ćemo imati pitanja o vašem izvješću problema. To će nam isto tako omogućiti da prepoznamo vaš doprinos i damo mu veći prioritet.">
+<!ENTITY issues.whitelist.remove.label "Ponovno omogućite Adblock Plus na ovoj stranici">
+<!ENTITY outdatedSubscriptions.description "Sljedeće pretplate na filtere nisu ažurirane najmanje dva tjedna.
+ Ažurirajte ove pretplate prije slanja prijave, problem je možda
+ već riješen.">
+<!ENTITY dataCollector.description "PriÄekajte nekoliko minuta dok Adblock Plus prikuplja potrebne podatke.">
+<!ENTITY sendButton.label "Poša&amp;lji izvješće">
+<!ENTITY comment.label "&amp;Komentar (neobavezno):">
+<!ENTITY sendPage.errorMessage "Neuspjelo slanje izvješća sa greškom &quot;?1?&quot;. Provjerite jeste li
+ spojeni na internet i pokušajte ponovno. Ako se problem ponovi zatražite
+ pomoć na [link]Adblock Plus forumu[/link].">
+<!ENTITY showRecentReports.label "Prikaži nedavno podnesena izvješća">
+<!ENTITY commentPage.heading "Dodaj komentar">
+<!ENTITY update.start.label "Pokreni ažuriranje sada">
+<!ENTITY issues.disabledfilters.description "Sljedeći filteri su onemogućeni, koji možda utjeÄu na ovu stranicu:">
+<!ENTITY screenshot.description "Ista stranica može izgledati drugaÄije svakoj osobi. To nam može pomoći
+ u razumijevanju problema ako priložite snimku zaslona u izvješće. Možete uklonit
+ dio koji sadrži osjetljive informacije i oznaÄiti podruÄje gdje je
+ problem uoÄen. Da bi to uÄinili kliknite na odgovarajuću tipku i odaberite
+ odabrani dio slike mišem.">
+<!ENTITY screenshot.attach.label "Priloži&amp;te sliku stranice u izvješće">
+<!ENTITY issues.whitelist.description "Adblock Plus je trenutno onemogućen na stranici za koju šaljete izvješće. Ponovno ga omogućite
+ i uÄitajte stranicu prije podnoÅ¡enja izvješća za pomoć u istraživanju of
+ ovog problema.">
+<!ENTITY typeSelector.falseNegative.label "Adblo&amp;ck Plus ne blokira reklame">
+<!ENTITY typeSelector.heading "Odaberite vrstu problema">
+<!ENTITY anonymity.warning "Nećemo vas moći kontaktirati i najvjerojatnije izvješće problema će imati niži prioritet.">
+<!ENTITY wizard.title "Izvještaj problema">
+<!ENTITY issues.ownfilters.disable.label "Onemogući filter">
+<!ENTITY commentPage.description "Polje teksta ispod omogućuje vam dodavanje komentara, što nam olakšava razumijenvanje problema.
+ Ovaj korak je neobevezan ali preporuÄljiv ako problem nije jasan.
+ Provjerite ovo izvješće prije nego što ga pošaljete.">
+<!ENTITY comment.lengthWarning "Duljina vašeg komentara je veća od 1000 znakova. Samo prvih 1000 znakova biti će poslano.">
+<!ENTITY typeSelector.falseNegative.description "Odaberite ovu mogućnost ako su reklame prikazane iako
+ je Adblock Plus omogućen.">
+<!ENTITY sendPage.waitMessage "PriÄekajte dok Adblock Plus prijavljuje vaÅ¡e izvješće.">
+<!ENTITY dataCollector.heading "Dobrodošli u izvještaj problema">
+<!ENTITY screenshot.heading "Priložite snimak zaslona">
+<!ENTITY sendPage.heading "Pošalji izvješće">
+<!ENTITY issues.subscriptionCount.description "Čini se da ste pretplaćeni na previše filter pretplata. Ovakvo
+ podeÅ¡avanje nije preporuÄeno zato jer će povećati vjerojatnost
+ za nastanak problema. Ne možemo prihvatiti vaš izvještaj problema zato it
+ jer nije jasno koji autor filtera pretplate mora pogledat problem. Uklonite
+ sve osim stvarno neophodnih filter pretplata i testirajte je li
+ se problem još pojavljuje.">
+<!ENTITY screenshot.mark.label "OznaÄite proble&amp;m">
+<!ENTITY privacyPolicy.label "Pravila privatnosti">
+<!ENTITY issues.description "Adblock Plus je otkrio problem sa vašim postavkama koje su možda odgovorne
+ za ovaj problem ili će istražiti poteškoću izvještaja.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/sidebar.dtd
new file mode 100644
index 0000000..6d885c7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Osvijetli granice stavke">
+<!ENTITY address.label "Adresa">
+<!ENTITY context.open.label "Otvori u novoj kartici">
+<!ENTITY type.label "Vrsta">
+<!ENTITY tooltip.filterSource.label "Izvor filtera:">
+<!ENTITY noitems.label "Nema stavki za blokiranje">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "VeliÄina:">
+<!ENTITY reattach.label "Ponovno spoji">
+<!ENTITY search.label "&amp;Pretraži:">
+<!ENTITY docDomain.thirdParty "(treća strana)">
+<!ENTITY filterSource.label "Izvor filtera">
+<!ENTITY tooltip.docDomain.label "Izvor dokumenta:">
+<!ENTITY context.copy.label "Kopiraj adresu stavke">
+<!ENTITY tooltip.type.label "Vrsta:">
+<!ENTITY context.disablefilter.label "Onemogućiti filter ?1?">
+<!ENTITY context.copyFilter.label "Kopiraj filter">
+<!ENTITY context.block.label "Blokiraj ovu stavku">
+<!ENTITY context.enablefilter.label "Ponovno omogućiti filter ?1?">
+<!ENTITY detach.label "Odvoji">
+<!ENTITY whitelisted.label "Stranica koja je na dopuštenom popisu">
+<!ENTITY context.disablefilteronsite.label "Onemogućiti ovaj filter na ?1?">
+<!ENTITY detached.title "Adblock Plus: stavke za blokiranje (odvojene)">
+<!ENTITY docDomain.firstParty "(prva strana)">
+<!ENTITY tooltip.type.whitelisted "(na dozvoljenom popisu)">
+<!ENTITY tooltip.filter.label "Filter u upotrebi:">
+<!ENTITY tooltip.filter.disabled "(onemogućen)">
+<!ENTITY context.editfilter.label "Uredi filter u upotrebi">
+<!ENTITY tooltip.type.blocked "(blokiran)">
+<!ENTITY size.label "VeliÄina">
+<!ENTITY context.whitelist.label "Dodaj pravilo izuzimanja za stavku">
+<!ENTITY context.selectAll.label "Odaberi sve">
+<!ENTITY state.label "Status">
+<!ENTITY docDomain.label "Izvor dokumenta">
+<!ENTITY tooltip.address.label "Adresa:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/subscriptionSelection.dtd
new file mode 100644
index 0000000..1ad21bb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Također &amp;dodajte pretplatu na filter &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plus nije uspio preuzeti popis pretplata.">
+<!ENTITY list.download.retry "Pokušajte ponovno">
+<!ENTITY title.label "Naslov &amp;pretplate:">
+<!ENTITY list.download.website "Pogledaj stranicu">
+<!ENTITY supplementMessage "Ova pretplata na filter je namjenjena korištenju sa pretplatom na filter &quot;?1?&quot; koju još ne koristite.">
+<!ENTITY viewList.label "Pogledaj filtere">
+<!ENTITY visitHomepage.label "Posjetite poÄetnu stranicu">
+<!ENTITY addSubscription.label "Dodaj pretplatu">
+<!ENTITY dialog.title "Dodaj Adblock Plus pretplate filtera">
+<!ENTITY location.label "Lokaci&amp;ja popisa filtera:">
+<!ENTITY fromWeb.description "Potvrdite želite li dodati ovu pretplatu na filter. Možete promijeniti naziv ili lokaciju pretplate prije nego što je dodate.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/composer.dtd
new file mode 100644
index 0000000..c0234a0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "na kón&amp;cu adresy">
+<!ENTITY domainRestriction.label "Wob&amp;mjezować na domenu:">
+<!ENTITY collapse.default.no.label "Standard wužiwać (ně)">
+<!ENTITY firstParty.label "&amp;Jenož prěni bok">
+<!ENTITY preferences.label "&amp;Eksistowace filtry pokazać…">
+<!ENTITY pattern.label "Muster pytać">
+<!ENTITY thirdParty.label "Jenož &amp;třeći bok">
+<!ENTITY filter.label "Nowy &amp;filter:">
+<!ENTITY collapse.label "Zabl&amp;okowane fałdować:">
+<!ENTITY match.warning "Muster, kotryž sće zapodał, wjace adresy njewotpowěduje, kotraž ma so blokować/do běłeje lisćiny přewzać a njezměje žadyn wuskutk na nju.">
+<!ENTITY anchor.start.label "na spoÄatku a&amp;dresy">
+<!ENTITY matchCase.label "&amp;Wulkopisanje wobkedźbować">
+<!ENTITY custom.pattern.label "&amp;Swójski:">
+<!ENTITY unselectAllTypes.label "Žadyn wubrać">
+<!ENTITY type.whitelist.label "W&amp;uwzaćne prawidło">
+<!ENTITY regexp.warning "Muster, kotryž sće zapodał, budźe so jako regularny wuraz interpretować, kotryž njehodźi so přez Adblock Plus skutkownje předźěłać a móhł waš wobhladowak spomałšić. Jeli nochceće regularny wuraz wužiwać, přidajće hwěžku (*) ke kóncej mustra.">
+<!ENTITY dialog.title "Filtrowe prawidło Adblock Plus přidać">
+<!ENTITY basic.label "Zakładny napohlad">
+<!ENTITY type.filter.label "&amp;Blokowanski filter">
+<!ENTITY types.label "Nałožić na typy:">
+<!ENTITY shortpattern.warning "Muster, kotryž sće zapodaÅ‚, je za optimowanje pÅ™ekrótko a móhÅ‚ waÅ¡ wobhladowak spomałšić. PoruÄa so, zo wubjerjeće dlěši znamjeÅ¡kowy rjećazk za tutón filter, zo byšće Adblock Plus dowoliÅ‚, filter bóle skutkownje pÅ™edźěłaÅ‚.">
+<!ENTITY collapse.yes.label "Haj">
+<!ENTITY anchors.label "Jenož muster akceptować:">
+<!ENTITY collapse.default.yes.label "Standard wužiwać (haj)">
+<!ENTITY domainRestriction.help "Wužijće tutu opciju, zo byšće jednu domenu abo wjacore domeny podał, kotrež přez wertikalnu smužku (|) wotdźělić. Filter budźe so jenož na wubrane domeny nałožować. Tilda (~) před domenowym mjenom podawa, zo filter njebudźe so na tu domenu nałožować.">
+<!ENTITY accept.label "Filter přidać">
+<!ENTITY options.label "Opcije">
+<!ENTITY disabled.warning "Adblock Plus je tuchwilu znjemóžnjeny. Móžeće hišće filtry přidać, ale njebudu so nałožować, chibazo [link]zmóžnjeće Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "na spoÄatku &amp;domenoweho mjena">
+<!ENTITY collapse.no.label "NÄ›">
+<!ENTITY selectAllTypes.label "Wšě wubrać">
+<!ENTITY advanced.label "Rozšěrjeny napohlad">
+<!ENTITY pattern.explanation "Muster móže dźěl adresy być; hwěžki (*) funguja jako zastupowace symbole. Filter budźe so jenož na adresy nałožować, kotrež podatemu mustrej wotpowěduja.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/filters.dtd
new file mode 100644
index 0000000..18f33fa
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Wšě waÅ¡e swójske filtry budu so pÅ™ez wobsah wubraneje dataje narunować. Chceće pokroÄować?">
+<!ENTITY slow.column "P&amp;omałe filtry">
+<!ENTITY enabled.column "Z&amp;móžnjeny">
+<!ENTITY subscription.lastDownload.checksumMismatch "NjeporadźiÅ‚o, wopaÄna kontrolna suma">
+<!ENTITY noFiltersInGroup.text "Wubrana skupina je prózdna.">
+<!ENTITY subscription.actions.label "Akcije">
+<!ENTITY filter.selectAll.label "Wšo wubrać">
+<!ENTITY backupButton.label "&amp;Zawěsćić a wobnowić">
+<!ENTITY restore.minVersion.warning "Warnowanje: Dataja je so pÅ™ez nowÅ¡u wersiju Adblock Plus wutworiÅ‚a. Wy měł na najnowÅ¡u wersiju Adblock Plus aktualizować, prjedy haÄ tutu dataju wobnowiće.">
+<!ENTITY restore.error "Daty dataje njedadźa so předźěłać, je móžno, zo wona zawěsćenska dataja Adblock Plus njeje?">
+<!ENTITY sort.ascending.label "Porj&amp;ad A &gt; Z">
+<!ENTITY sort.label "&amp;Sortěrować po">
+<!ENTITY subscription.source.label "Filtrowa lisćina">
+<!ENTITY hitcount.column "&amp;Wotpowědniki">
+<!ENTITY noFilters.text "Nimaće hišće žane swójske filtry.">
+<!ENTITY backup.custom.title "Jenož swójske filtry">
+<!ENTITY subscription.external.label "Přez druhe rozšěrjenje zaktualizowany">
+<!ENTITY subscription.delete.label "Zhašeć">
+<!ENTITY noGroupSelected.text "Dyrbiće filtrowu skupinu wubrać, prjedy haÄ filtry dadźa so zwobraznić.">
+<!ENTITY filter.cut.label "Wutřihać">
+<!ENTITY restore.default.label "Zawěsćensku kopiju wot ?1? wobnowić">
+<!ENTITY subscription.lastDownload.inProgress "Sćahuje so…">
+<!ENTITY subscriptions.tab.label "Filtrowe abonementy">
+<!ENTITY sort.descending.label "Porjad &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Chceće woprawdźe wšě wubrane filtry wotstronić?">
+<!ENTITY filter.delete.label "Zhašeć">
+<!ENTITY addSubscriptionAdd.label "Přidać">
+<!ENTITY viewMenu.label "Napohlad">
+<!ENTITY subscription.lastDownload.unknown "NiÄo k dispoziciji">
+<!ENTITY addSubscriptionCancel.label "Přetorhnyć">
+<!ENTITY subscription.enabled.label "Zmóžnjeny">
+<!ENTITY noSubscriptions.text "Njejsće hišće žane filtrowe abonementy pÅ™idaÅ‚. Adblock Plus njebudźe bjez filtrow niÄo blokować, proÅ¡u wužijće &quot;Filtrowy abonement pÅ™idać&quot;, zo byšće filter pÅ™idaÅ‚.">
+<!ENTITY subscription.update.label "Filtry aktualizować">
+<!ENTITY dialog.title "Adblock Plus - filtrowe nastajenja">
+<!ENTITY addFilter.label "Filter při&amp;dać">
+<!ENTITY subscription.minVersion.warning "Tutón filtrowy abonement wužaduje sej nowšu wersiju Adblock Plus, wy měł na najnowšu wersiju Adblock Plus aktualizować.">
+<!ENTITY subscription.lastDownload.invalidURL "Njeporadźiło, žana płaćiwa adresa">
+<!ENTITY backup.error "Při pisanju filtrow do dataje je zmylk wustupił. Zawěsćće, zo dataja njeje přećiwo pisanju škitana abo so přez druhi program njewužiwa.">
+<!ENTITY filter.moveUp.label "Horje">
+<!ENTITY addGroup.label "Filtrowu &amp;skupinu přidać">
+<!ENTITY filter.edit.label "Wobdźěłać">
+<!ENTITY subscription.showHideFilters.label "Filtry pokazać/schować">
+<!ENTITY acceptableAds2.label "&amp;Njenadběhawe wabjenje dowolić">
+<!ENTITY addSubscriptionOther.label "Druhi abonement přidać">
+<!ENTITY close.label "ZaÄinić">
+<!ENTITY sort.none.label "Njeso&amp;rtěrowany">
+<!ENTITY filter.actions.label "Filtrowe akcije">
+<!ENTITY filter.copy.label "Kopěrować">
+<!ENTITY filter.moveDown.label "Dele">
+<!ENTITY filter.resetHitCounts.label "Statistiku wróćo stajić">
+<!ENTITY readMore.label "Dalše informacije">
+<!ENTITY subscription.moveUp.label "Horje">
+<!ENTITY addSubscription.label "&amp;Filtrowy abonement přidać">
+<!ENTITY subscription.homepage.label "Startowa strona">
+<!ENTITY backup.complete.title "Wšě filtry a abonementy">
+<!ENTITY restore.own.label "Swójsku zawěsćensku kopiju wobnowić">
+<!ENTITY restore.complete.warning "Wšě waÅ¡e filtrowe nastajenja budu so pÅ™ez wobsah wubraneje dataje narunować. Chceće pokroÄować?">
+<!ENTITY filters.tab.label "Swójske filtry">
+<!ENTITY backup.label "Nowu zawěsćensku kopiju wutworić">
+<!ENTITY find.label "&amp;Pytać">
+<!ENTITY subscription.moveDown.label "Dele">
+<!ENTITY subscription.lastDownload.connectionError "Njeporadźiło, sćahowanski zmylk">
+<!ENTITY subscription.lastDownload.success "Wuspěch">
+<!ENTITY subscription.lastDownload.invalidData "Njeporadźiło, žana płaćiwa filtrowa lisćina">
+<!ENTITY filter.paste.label "Zasunyć">
+<!ENTITY subscription.disabledFilters.enable "Znjemóžnjene filtry zmóžnić">
+<!ENTITY lasthit.column "&amp;Posledni wotpowědnik">
+<!ENTITY subscription.editTitle.label "Titul wobdźěłać">
+<!ENTITY subscription.disabledFilters.warning "Někotre filtry w tutym abonemenće su znjemóžnjene.">
+<!ENTITY filter.column "&amp;Filtrowe prawidło">
+<!ENTITY subscription.lastDownload.label "Poslednje sćehnjenje:">
+<!ENTITY viewList.label "Lisćinu pokazać">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/firstRun.properties
new file mode 100644
index 0000000..de870d3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Přehladujće priwatnje znjemóžnjejo slědowanje resp. chowajo swoje slědy před wabjenskimi předewzaćemi, kotrež bychu rady kóždy z wašich pohibow slědowali.
+firstRun_toggle_off=WUPINJENY
+firstRun_feature_tracking=Slědowanje znjemóžnić
+firstRun_feature_malware=Škódnu softwaru blokować
+firstRun_title=Adblock Plus je so instalował
+firstRun_acceptableAdsExplanation=Bychmy rady websydła pozbudźili, sprawne, decentne wabjenje wužiwać. Tohodla smy <a>krute směrnicy</a> postajili, zo bychmy akceptabelne wabjenje identifikowali, kotrež so w standardnych nastajenjach pokazuje. Jeli chceće najebać toho wšo wabjenje blokować, móžeće jo wob mało sekundow <a>znjemóžnić</a>.
+firstRun_toggle_on=ZAPINJENY
+firstRun_contributor_credits=Dźakprajenje sobuskutkowacym
+firstRun_dataCorruptionWarning=Pokazuje so tuta strona dale? <a>Klikńće tu!</a>
+firstRun_acceptableAdsHeadline=Mjerzaca reklama budźe so nětko blokować
+firstRun_share=Informujće swojich přećelow
+firstRun_share_headline=<a>Podajće nam ruku</a>, zo bychmy web k lÄ›pÅ¡emu mÄ›stnu Äinili
+firstRun_features=Adblock Plus móže wjace Äinić haÄ wabjenje blokować
+firstRun_feature_malware_description=Čińće swoje přehladowanje wěsćiše blokujo znate domeny złomyslneje softwary.
+firstRun_feature_social_description=Wotstrońće swoju pÅ™ehladowansku aktiwitu z tłóÄatkow socialnych medijow, kaž na pÅ™. tłóÄatka "Lubi so mi" na Facebooku, kotrež so na webstronach jewja a waÅ¡e zadźerženje slÄ›duja.
+firstRun_donate=darić
+firstRun_donate_label=Podpěrajće naš projekt
+firstRun_feature_social=TłóÄatka za socialne medije wotstronić
+firstRun_legacySafariWarning=Wužiwaće staru wersiju Safari, kotraž se pÅ™ez Adblock Plus njepodpÄ›ruje. Wón njebudźe snano korektnje fungować abo wužiwarske dožiwjenje na wÄ›stach websydÅ‚ach kazyć. PoruÄujemy wuraznje, zo pak aktualizujeće na Safari 6.1.1 abo wyÅ¡i (k dispoziciji za Mac OS X 10.8 Lion) abo na Safari 7.0.1 abo wyÅ¡i (na OS X 10.9 Mavericks) pak wužiwaće najnowÅ¡u wersiju Mozilla Firefox, Google Chrome abo Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/global.properties
new file mode 100644
index 0000000..71491fe
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Žane blokujomne zapiski na tutej stronje
+action3_tooltip=Klikńće, zo byšće Adblock Plus zmóžnił/znjemóžnił.
+notification_antiadblock_title=Cilowe zdźělenki schować?
+type_label_script=skript
+filter_elemhide_nocriteria=Žane kriterije podate, zo by element spóznało, kotryž ma so schować
+blockingGroup_title=Prawidła za blokowanje reklamy
+whitelisted_tooltip=Adblock Plus je na tutej stronje znjemóžnjeny.
+type_label_stylesheet=stilowa předłoha
+blocked_count_tooltip=?1? z ?2?
+type_label_font=pismo
+type_label_popup=wuskakowace wokno
+filter_regexp_tooltip=Tutón filter je pak regularny wuraz pak překrótko za optimizowanje. Přewjele tutych filtrow móhło waš wobhladowak spomałšić.
+action0_tooltip=Klikńće, zo byšće kontekstowy meni zwobraznił, klikńće ze srjedźnej tastu myše, zo by zmóžniło/znjemóžniło.
+whitelisted_page=Adblock Plus je so za tutu stronu znjemóžnił
+remove_group_warning=Chceće tutu skupinu woprawdźe wotstronić?
+action1_tooltip=Klikńće, zo byšće blokujomne zapiski woÄiniÅ‚/zaÄiniÅ‚, klikńće ze srjedźnej tastu myÅ¡e, zo by zmóžniÅ‚o/znjemóžniÅ‚o.
+type_label_xmlhttprequest=XML-naprašowanje
+active_tooltip=Adblock Plus je zmóžnjeny, ?1? filtrowe abonementy a ?2? swójske filtry so wužiwaja.
+type_label_document=dokument
+type_label_object_subrequest=objektowe naprašowanje
+whitelistGroup_title=Wuwzaćne prawidła
+disabled_tooltip=Adblock Plus je znjemóžnjeny.
+filter_elemhide_duplicate_id=Jenož jedyn ID elementa, kotryž ma so schować, hodźi so podać
+type_label_object=objekt
+action2_tooltip=Klikńće, zo byšće nastajenja woÄiniÅ‚, klikńće ze srjedźnej tastu myÅ¡e, zo by zmóžniÅ‚o/znjemóžniÅ‚o.
+type_label_subdocument=wobłuk
+clearStats_warning=To staji wÅ¡u filtrowu statistiku wróćo a znjemóžni liÄenje filtrowych wotpowÄ›dnikow. Chceće pokoroÄować?
+notification_antiadblock_message=Tute sydło je za to znate, zo cilowe zdźělenki za wužiwarjow Adblock Plus pokazuje. Chceće, zo Adblock Plus cilowe zdźělenki chowa?
+blocked_count_addendum=(tež w běłej lisćinje: ?1?, schowane: ?2?)
+subscription_invalid_location=Městno filtroweje lisćiny njeje ani płaćiwy URL ani płaćiwe datajowe mjeno.
+type_label_image=wobraz
+remove_subscription_warning=Chceće woprawdźe tutón abonement wotstronić?
+type_label_other=druhi
+mobile_menu_enable=ABP: Zmóžnić
+type_label_media=awdio/widejo
+mobile_menu_disable_site=ABP: Na ?1? znjemóžnić
+elemhideGroup_title=Prawidła za schowanje elementow
+mobile_menu_enable_site=ABP: Na ?1? zmóžnić
+type_label_elemhide=schowany
+newGroup_title=Nowa filtrowa skupina
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/overlay.dtd
new file mode 100644
index 0000000..1b480b2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Haj">
+<!ENTITY notification.button.no "&amp;NÄ›">
+<!ENTITY sync.label "Nastajenja Adblo&amp;ck Plus synchronizować">
+<!ENTITY whitelist.site.label "Na ?1? znjemóžnić">
+<!ENTITY filters.label "&amp;Filtrowe nastajenja">
+<!ENTITY disable.label "Wšudźe znjemóžnić">
+<!ENTITY objecttab.title "Blokować">
+<!ENTITY objecttab.tooltip "Klikńće sem, zo byšće tutón objekt z pomcu Adblock Plus blokował">
+<!ENTITY menuitem.label "Na&amp;stajenja Adblock Plus">
+<!ENTITY objecttabs.label "Rajtarki wo Flash a Ja&amp;va pokazać">
+<!ENTITY sendReport.label "&amp;Problem na tutej stronje zdźělić">
+<!ENTITY whitelist.page.label "Jenož na tutej stronje znjemóžnić">
+<!ENTITY context.image.label "Adblock Plus: Wobraz blokować">
+<!ENTITY counthits.label "&amp;Filtrowe wotpowÄ›dniki liÄić">
+<!ENTITY opensidebar.label "Blo&amp;kujomne elementy woÄinić">
+<!ENTITY notification.button.close "&amp;ZaÄinić">
+<!ENTITY contribute.label "K Adblock Plus přinošować">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Wobłuk blokować">
+<!ENTITY blocked.tooltip "Zablokowane elementy na tutej stronje:">
+<!ENTITY hideplaceholders.label "&amp;Městodźeržićele zablokowanych elementow schować">
+<!ENTITY showinstatusbar.label "W &amp;statusowej lajsće pokazać">
+<!ENTITY sidebar.title "Blokujomne elementy na aktualnej stronje">
+<!ENTITY options.label "&amp;Opcije">
+<!ENTITY context.object.label "Adblock Plus: Objekt blokować">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Na tutej stronje zaso zmóžnić">
+<!ENTITY filters.tooltip "Najaktiwniše filtry:">
+<!ENTITY closesidebar.label "Blo&amp;kujomne elementy zaÄinić">
+<!ENTITY showintoolbar.label "W gratowej &amp;lajsće pokazać">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Awdio/Widejo blokować">
+<!ENTITY subscription.update.label "Filtry aktualizować">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/sendReport.dtd
new file mode 100644
index 0000000..00a413b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Cofnyć">
+<!ENTITY issues.disabledgroups.description "Slědowace filtrowe abonementy/filtrowe skupiny su znjemóžnjene, najebać toho móhli wuskutk na tutu stronu měć:">
+<!ENTITY showData.label "Daty zdźělenki pokazać">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus pře&amp;wjele blokuje">
+<!ENTITY issues.change.description "WaÅ¡a konfiguracija je so zmÄ›niÅ‚a. ProÅ¡u zaÄitajće stronu znowa, zo byšće zmÄ›ny testowaÅ‚ a wotpósćelće zdźělenje, jeli problem njeje so pÅ™ez zmÄ›ny rozrisaÅ‚.">
+<!ENTITY email.label "E-&amp;mejl:">
+<!ENTITY issues.openPreferences.label "Filtrowe nastajenja woÄinić">
+<!ENTITY sendPage.confirmation "Waša zdźělenka je so składowała. Móžeš pod slědowacej adresu na njo přistup měć:">
+<!ENTITY copyLink.label "&amp;Wotkaz zdźělenki kopěrować">
+<!ENTITY issues.nofilters.description "Adblock Plus na aktualnej stronje niÄo njeblokuje. Problem, kotryž sće zwÄ›sćiÅ‚, najskerje z Adblock Plus Äinić nima.">
+<!ENTITY sendPage.knownIssue "Problem, kotryž sće zdźělił, je hižo znaty. Dalše informacije:">
+<!ENTITY typeSelector.other.description "Wubjerće tutu opciju, jeli skerje na problem z Adblock Plus samym haÄ z jeho filtrami tukaće.">
+<!ENTITY issues.disabledgroups.enable.label "Filtrowy abonement/filtrowu skupinu zmóžnić">
+<!ENTITY typeWarning.override.label "Ro&amp;zumju a chcu zdźělenje najebać toho pósłać">
+<!ENTITY issues.disabled.enable.label "Adblock Plus zmóžnić">
+<!ENTITY update.fixed.description "Aktualizacije za waÅ¡e filtrowe abonementy su najskerje problem rozrisali, kotryž sće zdźěliÅ‚. ProÅ¡u zaÄitajće stronu znowa, spytajće hišće raz a klikńće zaso na 'Hišće raz pósÅ‚ać', jeli problem hišće wobsteji.">
+<!ENTITY anonymous.label "&amp;Anonymne słanje">
+<!ENTITY reloadButton.label "&amp;Stronu znowa zaÄitać">
+<!ENTITY recentReports.clear.label "Wšě &amp;zdźělenki wotstronić">
+<!ENTITY typeSelector.description "Tute wokno budźe wam pÅ™ez kroki wjesć, kotrež su trÄ›bne za sÅ‚anje wopisanja problemow Adblock Plus. Wubjerće proÅ¡u najprjedy družinu problema, na kotryž sće na tutej stronje storÄiÅ‚:">
+<!ENTITY screenshot.remove.label "&amp;Dowěrne daty wotstronić">
+<!ENTITY issues.ownfilters.description "Někotre filtry, kotrež so na tutu stronu nałožuja, su wot wužiwarja definowane. Prošu znjemóžńće filtry, kotrež móhli problem zawinować:">
+<!ENTITY update.inProgress.description "Adblock Plus dyrbi waÅ¡e filtrowe abonementy aktualizować, zo by zawÄ›sćiÅ‚, zo problem njeje so hišće rozrisaÅ‚. ProÅ¡u Äakajće...">
+<!ENTITY sendPage.retry.label "Hišće raz pósłać">
+<!ENTITY data.label "Da&amp;ty zdźělenki:">
+<!ENTITY recentReports.label "Waše njedawno pósłane zdźělenki">
+<!ENTITY typeWarning.description "Sće podaÅ‚, zo maće skerje powÅ¡itkowny problem z Adblock Plus haÄ problem z filtrami. ProÅ¡u dźiwajće na to, zo tajke problemy mÄ›li so najlÄ›pje w [link]forumje Adblock Plus[/link] zdźělić. Wy měł jenož problemowy rozuprawnik wužiwać, zo byšće eksistowacu diskusiju wudospoÅ‚niÅ‚, dokelž nichtó waÅ¡e zdźělenje k wÄ›domje njewozmje, chibazo byšće wotkaz na njo dodaÅ‚. Awtomatisce wutworjeny wotkaz so po sÅ‚anju zdźělenja doda.">
+<!ENTITY issues.disabled.description "Adblock Plus je znjemóžnjeny, w jeho tuchwilnym stawje niÄo njeblokuje.">
+<!ENTITY attachExtensions.label "Lisćinu aktiwnych &amp;rozšěrjenjow k zdźělence pÅ™ipowÄ›snyć, jeli konflikt z rozšěrjenjom je pÅ™iÄina problema">
+<!ENTITY issues.nosubscriptions.add.label "Filtrowy abonement přidać">
+<!ENTITY issues.disabledfilters.enable.label "Filter zmóžnić">
+<!ENTITY issues.override.label "&amp;Konfiguracija je korektna, ze zdźělenjom pokroÄować">
+<!ENTITY issues.nosubscriptions.description "Zda so, zo njejśce žane hotowe lisćiny filtrow abonował, kotrež njewitany wobsah z websydło awtomatisce wotstronjeja.">
+<!ENTITY typeSelector.falsePositive.description "Wubjerće tutu opciju, jeli stronje wažny wobsah faluje, so strona wopak zwobraznja abo porjadnje njefunguje. Móžeće zwÄ›sćić, haÄ Adblock Plus je wina na tutym problemje, hdyž jón nachwilu znjemóžnjeće.">
+<!ENTITY typeSelector.other.label "Dr&amp;uhi problem">
+<!ENTITY emailComment.label "PoruÄamy was, pÅ‚aćiwu e-mejlowu adresu zapodać, zo bychmy móhli z wami do zwiska stajić, jeli su praÅ¡enja wo waÅ¡ej rozprawje. Budźe nam tež zmóžnić, waÅ¡e pÅ™inoÅ¡ki pÅ™ipóznać a jim wyÅ¡u prioritu dać.">
+<!ENTITY issues.whitelist.remove.label "Adblock Plus na tutej stronje zaso zmóžnić">
+<!ENTITY outdatedSubscriptions.description "SlÄ›dowace filtrowe abonementy njejsu so wot znajmjeńša dweju njedźelow zaktualizowali. ProÅ¡u zaktualizujće tute abonementy, prjedy haÄ pósćeleÅ¡ zdźělenku. Problem móhÅ‚ potom hižo rozrisany być.">
+<!ENTITY dataCollector.description "ProÅ¡u poÄakńće, mjeztym zo Adblock Plus trÄ›bne daty hromadźi.">
+<!ENTITY sendButton.label "Zdźě&amp;lenku pósłać">
+<!ENTITY comment.label "&amp;Komentar (opcionalny):">
+<!ENTITY sendPage.errorMessage "Pospyt, zdźělenku pósłać, je so ze zmylkowym kodom &quot;?1?&quot; njeporadźił. Prošu zawěsćće, zo sće z internetom zwjazany a spytajće hišće raz. Jeli problem dale eksistuje, poprošće prošu w [link]forumje Adblock Plus[/link] wo pomoc.">
+<!ENTITY showRecentReports.label "Njedawno pósłane zdźělenki">
+<!ENTITY commentPage.heading "Komentar zapodać">
+<!ENTITY update.start.label "Aktualizaciju nětko startować">
+<!ENTITY issues.disabledfilters.description "Slědowace filtry su znjemóžnjene, najebać toho móhli wuskutk na tutu stronu měć:">
+<!ENTITY screenshot.description "Samsna strona móže rozdźělnje za rozdźělnych ludźi wupadać. Móže nam pomhać, problem rozumić, jeli k waÅ¡ej zdźělence foto wobrazowki pÅ™ipowÄ›snjeće. Móžeće wotrÄ›zki wotstronić, kotrež sensibelne informacije wobsahuje kaž tež wobÅ‚uki markÄ›rować, hdźež so problem pokazuje. Zo byšće to ÄiniÅ‚, klikńće na wotpowÄ›dne tłóÄatko a wubjerće wotrÄ›zk wobraza ze swojej myÅ¡u.">
+<!ENTITY screenshot.attach.label "Wo&amp;braz strony k zdźělence připowěsnyć">
+<!ENTITY issues.whitelist.description "Adblock Plus je tuchwilu na stronje, wo kotrejž rozprawjeće, znjemóžnjeny. ProÅ¡u zmóžńće jón znowa a zaÄitajće stronu, prjedy haÄ zdźělenku wotpósćeleće, zo byšće analyzowanje tutoho problema podpÄ›raÅ‚.">
+<!ENTITY typeSelector.falseNegative.label "Ad&amp;block Plus wabjenje njeblokuje">
+<!ENTITY typeSelector.heading "Problemowy typ wubrać">
+<!ENTITY anonymity.warning "Njemóžemy so zaso na was wobroćić a damy najskerje wašej rozprawje nisku prioritu.">
+<!ENTITY wizard.title "Problemowy rozprawnik">
+<!ENTITY issues.ownfilters.disable.label "Filter znjemóžnić">
+<!ENTITY commentPage.description "Tekstowe polo deleka zmóžnja wam, komentar zapodać, zo byšće nam pomhaÅ‚, problem rozumić. Tutón krok je opcionalny, ale poruÄa so, jeli problem woÄiwidny njeje. Móžeće tež daty zdźělenki pÅ™epruwować, prjedy haÄ so sćele.">
+<!ENTITY comment.lengthWarning "DoÅ‚hosć waÅ¡eho komentar pÅ™ekroÄuje 1000 znamjeÅ¡kow. Jenož prÄ›nje 1000 znamjeÅ¡kow budu so sÅ‚ać.">
+<!ENTITY typeSelector.falseNegative.description "Wubjerće tutu opciju, jeli wabjenje so zwobraznjuje, haÄrunjež Adblock Plus je zmóžnjeny.">
+<!ENTITY sendPage.waitMessage "ProÅ¡u poÄakńće, doniž Adblock Plus waÅ¡u zdźělenku njewotesyÅ‚a.">
+<!ENTITY dataCollector.heading "Witajće do problemoweho rozprawnika">
+<!ENTITY screenshot.heading "Foto wobrazowki připowěsnyć">
+<!ENTITY sendPage.heading "Zdźělenku pósłać">
+<!ENTITY issues.subscriptionCount.description "Zda so, zo sće pÅ™ewjele filtrowych abonementow abonowaÅ‚. Tute nastajenje so njeporuÄa, dokelž prawdźepodobnosć problemow jara zwyÅ¡i. Ani njemóžemy waÅ¡ problemowe wopisanje akceptować, dokelž je njejasnje, kotry awtor filtroweho abonementa ma jednać. ProÅ¡u wotstrońće wšě nimo woprawdźe trÄ›bnych filtrowych abonementow a testujće, haÄ problem dale wustupuje.">
+<!ENTITY screenshot.mark.label "&amp;Problem markěrować">
+<!ENTITY privacyPolicy.label "Prawidła priwatnosće">
+<!ENTITY issues.description "Adblock Plus je problemy z wašej konfiguraciju wotkrył, kotrež móhli na tutón problem wina być abo analyzowanje problema poćežuja.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/sidebar.dtd
new file mode 100644
index 0000000..71d6ef1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Ramiki elementa pokazać">
+<!ENTITY address.label "Adresa">
+<!ENTITY context.open.label "W nowym rajtarku woÄinić">
+<!ENTITY type.label "Typ">
+<!ENTITY tooltip.filterSource.label "Žórło filtra:">
+<!ENTITY noitems.label "Žane blokujomne elementy">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Wulkosć:">
+<!ENTITY reattach.label "Zaso připowěsnyć">
+<!ENTITY search.label "&amp;Pytać:">
+<!ENTITY docDomain.thirdParty "(třeći bok)">
+<!ENTITY filterSource.label "Žórło filtrow">
+<!ENTITY tooltip.docDomain.label "Žórło dokumenta:">
+<!ENTITY context.copy.label "Adresu elementa kopěrować">
+<!ENTITY tooltip.type.label "Typ:">
+<!ENTITY context.disablefilter.label "Filter ?1? znjemóžnić">
+<!ENTITY context.copyFilter.label "Filter kopěrować">
+<!ENTITY context.block.label "Tutón element blokować">
+<!ENTITY context.enablefilter.label "Filter ?1? zaso zmóžnić">
+<!ENTITY detach.label "Wotpowěsnyć">
+<!ENTITY whitelisted.label "Strona w běłej lisćinje">
+<!ENTITY context.disablefilteronsite.label "Tutón filter na ?1? znjemóžnić">
+<!ENTITY detached.title "Adblock Plus: Blokujomne elementy (wotpowěsnjene)">
+<!ENTITY docDomain.firstParty "(prěni bok)">
+<!ENTITY tooltip.type.whitelisted "(w běłej lisćinje)">
+<!ENTITY tooltip.filter.label "Aktiwny filter:">
+<!ENTITY tooltip.filter.disabled "(znjemóžnjeny)">
+<!ENTITY context.editfilter.label "Aktiwny filter wobdźěłać">
+<!ENTITY tooltip.type.blocked "(zablokowany)">
+<!ENTITY size.label "Wulkosć">
+<!ENTITY context.whitelist.label "Wuwzaćne prawidło za element přidać">
+<!ENTITY context.selectAll.label "Wšitko wubrać">
+<!ENTITY state.label "Staw">
+<!ENTITY docDomain.label "Žórło dokumenta">
+<!ENTITY tooltip.address.label "Adresa:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/subscriptionSelection.dtd
new file mode 100644
index 0000000..80511a2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Filtrowy a&amp;bonement &quot;?1?&quot; tež přidać">
+<!ENTITY list.download.failed "Adblock Plus njemóžeše lisćiny abonementow wotwołać.">
+<!ENTITY list.download.retry "Hišće raz spytać">
+<!ENTITY title.label "&amp;Titul abonementa:">
+<!ENTITY list.download.website "Websydło sej wobhladać">
+<!ENTITY supplementMessage "Tutón filtrowy abonement je za to mysleny, so z filtrowym abonementom &quot;?1?&quot; wužiwać, kotryž hišće njewužiwaće.">
+<!ENTITY viewList.label "Filtry sej wobhladać">
+<!ENTITY visitHomepage.label "Startowu stronu wopytać">
+<!ENTITY addSubscription.label "Abonement přidać">
+<!ENTITY dialog.title "Filtrowy abonement Adblock Plus přidać">
+<!ENTITY location.label "&amp;Městno filtroweje lisćiny:">
+<!ENTITY fromWeb.description "ProÅ¡u wobkrućće, zo chceće tutón filtrowy abonement pÅ™idać. Móžeće titul abo mÄ›stno abonementa zmÄ›nić, prjedy haÄ jón pÅ™idaće.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/composer.dtd
new file mode 100644
index 0000000..6292ed7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "a cím &amp;végén">
+<!ENTITY domainRestriction.label "Korlá&amp;tozás tartományra:">
+<!ENTITY collapse.default.no.label "Alapértelmezett (nem)">
+<!ENTITY firstParty.label "Csak &amp;belső címhez">
+<!ENTITY preferences.label "&amp;Meglévő szűrők megjelenítése...">
+<!ENTITY pattern.label "Minta">
+<!ENTITY thirdParty.label "Csak külső cím&amp;hez">
+<!ENTITY filter.label "Ú&amp;j szűrő:">
+<!ENTITY collapse.label "Bl&amp;okkolt elem összecsukása:">
+<!ENTITY match.warning "A megadott minta nem egyezik a blokkolt/engedélyezett címek listájával, így annak használata nem jár eredménnyel.">
+<!ENTITY anchor.start.label "a cím &amp;elején">
+<!ENTITY matchCase.label "K&amp;is- és nagy betűk megkülönböztetése">
+<!ENTITY custom.pattern.label "E&amp;gyedi:">
+<!ENTITY unselectAllTypes.label "Kijelölés törlése">
+<!ENTITY type.whitelist.label "&amp;Kivételszabály">
+<!ENTITY regexp.warning "A megadott minta reguláris kifejezésként fog szerepelni. Sok ilyen kifejezés lassíthatja a böngészést. Ha nem akar használni ilyen kifejezéseket, a minta végére írja a * jelet.">
+<!ENTITY dialog.title "Adblock Plus szűrőszabály hozzáadása">
+<!ENTITY basic.label "Alap nézet">
+<!ENTITY type.filter.label "Blokkoló &amp;szűrő">
+<!ENTITY types.label "Alkalmazás típusokra:">
+<!ENTITY shortpattern.warning "A megadott minta nem optimalizálható, mert túl rövid. Sok ilyen minta lassíthatja a böngészést. Ajánlott ehhez a szűrőhöz egy hosszabb karakterlánc használata.">
+<!ENTITY collapse.yes.label "Igen">
+<!ENTITY anchors.label "Minta elfogadása csak:">
+<!ENTITY collapse.default.yes.label "Alapértelmezett (igen)">
+<!ENTITY domainRestriction.help "Adjon meg egy vagy több tartományt a &quot;|&quot; jellel elválasztva, a szűrő csak ezeken a tartományokon lesz alkalmazva. A &quot;~&quot; jellel a tartománynév elején letilthatja a szűrő használatát az adott tartományon.">
+<!ENTITY accept.label "Szűrő hozzáadása">
+<!ENTITY options.label "Beállítások">
+<!ENTITY disabled.warning "Az Adblock Plus jelenleg le van tiltva. Szűrőket hozzáadhat, de azok nem fognak működni, amíg nem [link]engedélyezi az Adblock Plust[/link].">
+<!ENTITY anchor.start.flexible.label "a tartománynév &amp;elején">
+<!ENTITY collapse.no.label "Nem">
+<!ENTITY selectAllTypes.label "Minden kijelölése">
+<!ENTITY advanced.label "Haladó nézet">
+<!ENTITY pattern.explanation "A minta lehet egy webcím bármely része, amelyben a * szimbólum helyettesítő karakterként szerepelhet. A szűrő csak azokra címekre lesz alkalmazva, amelyekre a minta illeszkedik.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/filters.dtd
new file mode 100644
index 0000000..5059863
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Az összes saját szűrője le lesz cserélve a kiválasztott fájlban lévőkre. Biztosan folytatni szeretné?">
+<!ENTITY slow.column "&amp;Lassú szűrők">
+<!ENTITY enabled.column "&amp;Engedélyezve">
+<!ENTITY subscription.lastDownload.checksumMismatch "Sikertelen, érvénytelen ellenőrző összeg">
+<!ENTITY noFiltersInGroup.text "A kiválasztott csoport üres.">
+<!ENTITY subscription.actions.label "Műveletek">
+<!ENTITY filter.selectAll.label "Az összes kijelölése">
+<!ENTITY backupButton.label "&amp;Biztonsági mentés és visszaállítás">
+<!ENTITY restore.minVersion.warning "Figyelmeztetés: a fájlt az Adblock Plus újabb verziójával készült. Frissítsen az Adblock Plus legújabb verziójára, mielőtt visszaállítaná ezt a fájlt.">
+<!ENTITY restore.error "A fájlt nem sikerült feldolgozni, lehetséges, hogy nem egy Adblock Plus biztonsági mentést tartalmaz.">
+<!ENTITY sort.ascending.label "Rendezés &amp;A &gt; Z">
+<!ENTITY sort.label "&amp;Rendezés">
+<!ENTITY subscription.source.label "Szűrő lista">
+<!ENTITY hitcount.column "&amp;Találatok">
+<!ENTITY noFilters.text "Nincsenek saját szűrők.">
+<!ENTITY backup.custom.title "Csak saját szűrők">
+<!ENTITY subscription.external.label "Másik kiterjesztés frissíti">
+<!ENTITY subscription.delete.label "Törlés">
+<!ENTITY noGroupSelected.text "Ki kell választania egy szűrő csoportot a benne lévő szűrők megjelenítéséhez.">
+<!ENTITY filter.cut.label "Kivágás">
+<!ENTITY restore.default.label "Visszaállítás ?1?-i állapotra">
+<!ENTITY subscription.lastDownload.inProgress "Letöltés...">
+<!ENTITY subscriptions.tab.label "Külső szűrők">
+<!ENTITY sort.descending.label "Rendezés &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Biztosan eltávolítja az összes kiválasztott szűrőt?">
+<!ENTITY filter.delete.label "Törlés">
+<!ENTITY addSubscriptionAdd.label "Hozzáadás">
+<!ENTITY viewMenu.label "Nézet">
+<!ENTITY subscription.lastDownload.unknown "ismeretlen">
+<!ENTITY addSubscriptionCancel.label "Mégse">
+<!ENTITY subscription.enabled.label "Engedélyezve">
+<!ENTITY noSubscriptions.text "Nincs felvéve egyetlen külső szűrőt sem. Az Adblock Plus nem fog semmit szűrni szűrők nélkül. Kérem használja a &quot;Külső szűrő felvétele&quot; funkciót új szűrők felvételéhez.">
+<!ENTITY subscription.update.label "Szűrők frissítése">
+<!ENTITY dialog.title "Adblock Plus szűrő beállítások">
+<!ENTITY addFilter.label "Szűrő &amp;hozzáadása">
+<!ENTITY subscription.minVersion.warning "A külső szűrő újabb Adblock Plus verzióhoz készült, frissítenie kell az Adblock Plust a legújabb verzióra.">
+<!ENTITY subscription.lastDownload.invalidURL "Sikertelen, érvénytelen cím">
+<!ENTITY backup.error "Hiba történt a szűrők fájlba mentésekor. Ellenőrizze, hogy a fájl nem írásvédett vagy nem használja-e egy másik alkalmazás.">
+<!ENTITY filter.moveUp.label "Mozgatás fel">
+<!ENTITY addGroup.label "Szűrő &amp;csoport felvétele">
+<!ENTITY filter.edit.label "Szerkesztés">
+<!ENTITY subscription.showHideFilters.label "Szűrők megjelenítése/elrejtése">
+<!ENTITY acceptableAds2.label "Néhány nem &amp;tolakodó hirdetés engedélyezése">
+<!ENTITY addSubscriptionOther.label "Külső szűrő hozzáadása">
+<!ENTITY close.label "Bezárás">
+<!ENTITY sort.none.label "Ren&amp;dezetlen">
+<!ENTITY filter.actions.label "Szűrő műveletek">
+<!ENTITY filter.copy.label "Másolás">
+<!ENTITY filter.moveDown.label "Mozgatás le">
+<!ENTITY filter.resetHitCounts.label "Találati statisztika törlése">
+<!ENTITY readMore.label "Mi ez?">
+<!ENTITY subscription.moveUp.label "Mozgatás fel">
+<!ENTITY addSubscription.label "Kül&amp;ső szűrő hozzáadása">
+<!ENTITY subscription.homepage.label "Honlap">
+<!ENTITY backup.complete.title "Az összes szűrő és feliratkozás">
+<!ENTITY restore.own.label "Saját mentés visszaállítása">
+<!ENTITY restore.complete.warning "Az összes szűrő beállítása le lesz cserélve a kiválasztott fájlban lévőkre. Biztosan folytatni szeretné?">
+<!ENTITY filters.tab.label "Saját szűrők">
+<!ENTITY backup.label "Új biztonsági mentés">
+<!ENTITY find.label "&amp;Keresés">
+<!ENTITY subscription.moveDown.label "Mozgatás le">
+<!ENTITY subscription.lastDownload.connectionError "Sikertelen, letöltési hiba">
+<!ENTITY subscription.lastDownload.success "Sikeres">
+<!ENTITY subscription.lastDownload.invalidData "Sikertelen, érvénytelen szűrőlista">
+<!ENTITY filter.paste.label "Beillesztés">
+<!ENTITY subscription.disabledFilters.enable "Letiltott szűrők engedélyezése">
+<!ENTITY lasthit.column "&amp;Utolsó találat">
+<!ENTITY subscription.editTitle.label "Cím szerkesztése">
+<!ENTITY subscription.disabledFilters.warning "Néhány szűrő ebben a listában le van tiltva.">
+<!ENTITY filter.column "&amp;Szűrő szabály">
+<!ENTITY subscription.lastDownload.label "Legutóbb letöltve:">
+<!ENTITY viewList.label "Lista megtekintése">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/firstRun.properties
new file mode 100644
index 0000000..8a3d609
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Böngésszen privátban azáltal, hogy letiltja a követést - elrejtheti nyomait a reklámcégek elől, amelyek egyébként figyelnék minden lépését.
+firstRun_toggle_off=KIKAPCSOLVA
+firstRun_feature_tracking=Követés letiltása
+firstRun_feature_malware=Rosszindulatú kódok blokkolása
+firstRun_title=Sikeresen telepítette az Adblock Plus-t
+firstRun_toggle_on=BEKAPCSOLVA
+firstRun_acceptableAdsExplanation=Szeretnénk arra biztatni a weboldalakat, hogy egyértelmű, nem tolakodó hirdetéseket használjanak. Ezért hoztunk létre <a>szigorú irányelveket</a>, amelyek segítségével azonosíthatók az elfogadható hirdetések, amelyek az alapbeállítások között találhatók meg. Ha ennek ellenére minden hirdetést <a>blokkolni</a> szeretne, ezt továbbra is megteheti mindössze néhány másodperc alatt.
+firstRun_contributor_credits=Hozzájárulók névsora
+firstRun_dataCorruptionWarning=Ãllandóan megjelenik ez az oldal? <a>Kattintson ide!</a>
+firstRun_acceptableAdsHeadline=A bosszantó hirdetések mostantól blokkolva lesznek
+firstRun_share=Mondja el barátainak
+firstRun_share_headline=<a>Segítsen nekünk</a> jobb hellyé tenni a világhálót
+firstRun_feature_social_description=Automatikusan szabaduljon meg a közösségi médiával kapcsolatos gomboktól, mint például a facebook "Tetszik" gombja, amelyek a weboldalakon jelennek meg és figyelik az Ön szokásait.
+firstRun_filterlistsReinitializedWarning=Egy hiba miatt az összes szűrő eltávolításra került és a biztonsági másolatot sem sikerült visszaállítani. Az összes szűrő és az elfogadható hirdetések beállításai alapállapotba kerültek. Kérem ellenőrizze a szűrő listákat és az elfogadható hirdetések beállításait az <a>Adblock Plus opció</a> közt.
+firstRun_feature_malware_description=Tegye a böngészést biztonságosabbá azáltal, hogy letiltja az ismert malware címeket.
+firstRun_features=Az Adblock Plus a reklámok blokkolásánál többre is képes
+firstRun_donate=adományozás
+firstRun_donate_label=A projekt támogatása
+firstRun_feature_social=Közösségi oldalak gombjainak eltávolítása
+firstRun_legacySafariWarning=A Safari egy régi verzióját használja, amelyet nem támogat az Adblock Plus. Lehetséges, hogy nem fog megfelelően működni vagy lelassítja a működést egyes weboldalakon. Erősen ajánlott frissíteni a Safari 6.1.1-es (Mac OS X 10.8 Mountain Lion operációs rendszeren) , vagy a Safari 7.0.1-es és újabb verzióira (OS X 10.9 Maverics operációs rendszertől) vagy használja a Mozilla Firefox, Google Chrome vagy Opera legújabb verzióját.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/global.properties
new file mode 100644
index 0000000..3b32ac6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Nincsenek blokkolható elemek az aktuális oldalon.
+action3_tooltip=Kattintson ide az Adblock Plus ki/bekapcsolásához.
+notification_antiadblock_title=Célzott üzenetek elrejtése
+type_label_script=szkript
+filter_elemhide_nocriteria=Nincs megadva feltétel az elrejtendő elemre
+blockingGroup_title=Reklám szűrő szabályok
+whitelisted_tooltip=Az Adblock be van kapcsolva, de a szűrés le van tiltva az aktuális oldalon.
+type_label_stylesheet=stíluslap
+blocked_count_tooltip=?1?/?2?
+type_label_font=betűtípus
+type_label_popup=felugró ablak
+filter_regexp_tooltip=Ez a szűrő vagy reguláris kifejezés vagy túl rövid az optimalizációhoz. Túl sok ilyen szűrő lelassíthatja a böngészést.
+action0_tooltip=Kattintson ide a környezeti menühöz, középső gombbal a ki/bekapcsoláshoz.
+whitelisted_page=Az Adblock Plus le van tiltva az aktuális oldalon
+remove_group_warning=Biztosan eltávolítja ezt a csoportot?
+action1_tooltip=Kattintson ide a blokkolható elemek megnyitásához/bezárásához, középső gombbal a ki/bekapcsoláshoz.
+type_label_xmlhttprequest=XML kérés
+active_tooltip=Az Adblock Plus aktív, ?1? szűrő(k) és ?2? saját szűrő(k) van használatban.
+type_label_document=dokumentum
+type_label_object_subrequest=objektum alkérés
+whitelistGroup_title=Kivétel szabályok
+disabled_tooltip=Az Adblock Plus ki van kapcsolva.
+filter_elemhide_duplicate_id=Csak egy ID-ját lehet megadni az elrejtendő elemnek
+type_label_object=objektum
+action2_tooltip=Kattintson ide a beállítások megnyitásához, középső gombbal a ki/bekapcsoláshoz.
+type_label_subdocument=keret
+clearStats_warning=Ezzel letörli az összes találati statisztikát és letiltja a mentésüket. Biztosan folytatja?
+notification_antiadblock_message=Ezen az oldalon célzott üzeneteket jelenítenek meg az Adblock Plus felhasználóinak. Szeretné, ha az Adblock Plus elrejtené ezeket az üzeneteket?
+blocked_count_addendum=(fehér listán: ?1?, rejtett: ?2?)
+subscription_invalid_location=A megadott külső szűrőt tartalmazó cím helytelen, vagy hibás fájlnevet tartalmaz.
+type_label_image=kép
+remove_subscription_warning=Valóban el kívánja távolítani ezt a szűrőt?
+type_label_other=egyéb
+mobile_menu_enable=ABP: Engedélyezés
+type_label_media=hang/videó
+mobile_menu_disable_site=ABP: Letiltja itt: ?1?
+elemhideGroup_title=Elem elrejtési szabályok
+mobile_menu_enable_site=ABP: Engedélyezi itt: ?1?
+type_label_elemhide=rejtett
+newGroup_title=Új szűrő csoport
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/overlay.dtd
new file mode 100644
index 0000000..f60fae1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Igen">
+<!ENTITY notification.button.no "&amp;Nem">
+<!ENTITY sync.label "Adblock Plus beállítások s&amp;zinkronizálása">
+<!ENTITY whitelist.site.label "Szűrés tiltása itt: ?1?">
+<!ENTITY filters.label "Szűrő &amp;beállítások">
+<!ENTITY disable.label "Letiltás mindenhol">
+<!ENTITY objecttab.title "Blokkolás">
+<!ENTITY objecttab.tooltip "Kattintson ide a blokkoláshoz (Adblock Plus)">
+<!ENTITY menuitem.label "Ad&amp;block Plus beállítások">
+<!ENTITY objecttabs.label "&amp;Fülek megjelenítése Java és Flash objektumoknál">
+<!ENTITY sendReport.label "Hibás webhel&amp;y bejelentése">
+<!ENTITY whitelist.page.label "Szűrés tiltása csak ezen az aloldalon">
+<!ENTITY context.image.label "Kép blokkolása">
+<!ENTITY counthits.label "&amp;Szűrő találati statisztika mentése">
+<!ENTITY opensidebar.label "Blokkolható ob&amp;jektumok megjelenítése">
+<!ENTITY notification.button.close "&amp;Bezárás">
+<!ENTITY contribute.label "Közreműködés az Adblock Plus-hoz">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Keret blokkolása">
+<!ENTITY blocked.tooltip "Blokkolt objektumok ezen az oldalon:">
+<!ENTITY hideplaceholders.label "Letiltott elemek &amp;helyőrzőinek elrejtése">
+<!ENTITY showinstatusbar.label "Megje&amp;lenítés az állapotsoron">
+<!ENTITY sidebar.title "Blokkolható objektumok">
+<!ENTITY options.label "&amp;Opciók">
+<!ENTITY context.object.label "Objektum blokkolása">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Újra-engedélyezés ezen az oldalon">
+<!ENTITY filters.tooltip "Legaktívabb szűrők:">
+<!ENTITY closesidebar.label "Blokkolható ob&amp;jektumok elrejtése">
+<!ENTITY showintoolbar.label "M&amp;egjelenítés az eszköztáron">
+<!ENTITY status.tooltip "Ãllapot:">
+<!ENTITY context.media.label "Adblock Plus: videó/audió blokkolása">
+<!ENTITY subscription.update.label "Szűrők frissítése">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/sendReport.dtd
new file mode 100644
index 0000000..e9477ed
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Visszavonás">
+<!ENTITY issues.disabledgroups.description "Az alábbi szűrő listák/csoportok le vannak tiltva, de hatással lehetnének az alábbi oldalra:">
+<!ENTITY showData.label "Jelentés adatainak megtekintése">
+<!ENTITY typeSelector.falsePositive.label "Az Adblock Plus &amp;túl sok mindent letilt">
+<!ENTITY issues.change.description "A konfiguráció megváltozott. Kérem töltse újra az oldalt és próbálja ki a változásokat és csak akkor küldje el a jelentést, ha a módosítások hatására nem szűnt meg a probléma.">
+<!ENTITY email.label "&amp;Email:">
+<!ENTITY issues.openPreferences.label "Szűrő beállítások megnyitása">
+<!ENTITY sendPage.confirmation "Az Ön jelentése el lett mentve. Az alábbi címen érheti el a későbbiekben:">
+<!ENTITY copyLink.label "Jelentés &amp;címének másolása">
+<!ENTITY issues.nofilters.description "Az Adblock Plus jelenleg nem blokkol semmit az aktuális oldalon. A tapasztalt hibajelenség valószínűleg nem köthető az Adblock Plus-hoz.">
+<!ENTITY sendPage.knownIssue "Az Ön által bejelentett hiba már ismert. További információk:">
+<!ENTITY typeSelector.other.description "Válassza ezt a lehetőséget, ha Ön szerint a probléma magával az Adblock Plus-szal van és nem a szűrőkkel.">
+<!ENTITY issues.disabledgroups.enable.label "Szűrő lista/csoport engedélyezése">
+<!ENTITY typeWarning.override.label "Megértettem é&amp;s így is szeretném elküldeni a jelentést">
+<!ENTITY issues.disabled.enable.label "Az Adblock Plus engedélyezése">
+<!ENTITY update.fixed.description "A szűrőlisták frissítése nagy valószínűséggel megoldja a bejelentett hibát. Kérem frissítse az oldalt és próbálja újra, csak akkor küldjön bejelentést, ha a probléma továbbra is fennáll.">
+<!ENTITY anonymous.label "Né&amp;vtelen beküldendő">
+<!ENTITY reloadButton.label "&amp;Oldal újratöltése">
+<!ENTITY recentReports.clear.label "Az összes &amp;jelentés eltávolítása">
+<!ENTITY typeSelector.description "Ez az ablak végigvezeti az Adblock Plus hiba bejelentési lépésein. Először kérem válassza ki a webhelyen jelentkező hiba jellegét:">
+<!ENTITY screenshot.remove.label "&amp;Kényes adatok eltávolítása">
+<!ENTITY issues.ownfilters.description "Ezen az oldalon néhány alkalmazott szűrőt a felhasználó definiált. Kérem tiltsa le az alábbi szűrők közül azokat, amelyeket a problémát okozhatták.">
+<!ENTITY update.inProgress.description "Az Adblock Plusnak frissítenie kell a szűrőlistákat, hogy megbizonyosodjon róla, hogy a probléma még mindig fennáll. Kérem várjon…">
+<!ENTITY sendPage.retry.label "Újraküldés">
+<!ENTITY data.label "Jelentés a&amp;datai:">
+<!ENTITY recentReports.label "Legutóbb beküldött jelentések">
+<!ENTITY typeWarning.description "Ön azt a lehetőséget választotta, hogy a hiba az Adblock Plus-szal van és nem a szűrőkkel. Kérem vegye figyelembe, hogy az ilyen hibákat célszerűbb az [link]Adblock Plus fórumon[/link] bejelenteni. Csak akkor használja így a hibajelentőt, ha egy meglévő szálhoz szeretne hozzátenni, és a jelentésben tüntesse fel a hozzá tartozó hivatkozást is. Az automatikusan generált hivatkozás a jelentés beküldése után áll majd rendelkezésre.">
+<!ENTITY issues.disabled.description "Az Adblock Plus le van tiltva, így nem tud semmit blokkolni.">
+<!ENTITY attachExtensions.label "Engedélyezett k&amp;iterjesztések listájának csatolása, arra az esetre, ha a kiterjesztések közti ütközésekből adódik a probléma">
+<!ENTITY issues.nosubscriptions.add.label "Feliratkozás szűrőre">
+<!ENTITY issues.disabledfilters.enable.label "Szűrő engedélyezése">
+<!ENTITY issues.override.label "A kon&amp;figuráció megfelelő, bejelentés folytatása">
+<!ENTITY issues.nosubscriptions.description "Úgy tűnik, hogy nincs feliratkozva egyetlen előre elkészített szűrőlistára sem, amellyel automatikusan eltávolíthatja a nem kívánt tartalmakat a webhelyekről.">
+<!ENTITY typeSelector.falsePositive.description "Válassza ezt a lehetőséget, ha a webhelyről hiányoznak lényeges tartalmak, rosszul jelenik meg, vagy hibásan működik. Úgy bizonyosodhat meg arról, hogy az Adblock Plus okozza a problémát, ha ideiglenesen letiltja azt.">
+<!ENTITY typeSelector.other.label "E&amp;gyéb">
+<!ENTITY emailComment.label "Javasoljuk, hogy érvényes e-mail címet adjon meg, így fel tudjuk venni Önnel a kapcsolatot, ha kérdés merül fel a jelentésével kapcsolatban. Ezzel azt is lehetővé teszi, hogy felismerjük az Ön hozzájárulásait, és azok magasabb prioritást kapjanak.">
+<!ENTITY issues.whitelist.remove.label "Adblock Plus újraengedélyezése az oldalon">
+<!ENTITY outdatedSubscriptions.description "Az alábbi szűrőlistákat legalább két hete nem frissítette. Kérem frissítse a listákat mielőtt jelentést küld róluk, lehetséges, hogy a probléma időközben megoldódott.">
+<!ENTITY dataCollector.description "Kérem várjon pár pillanatot, amíg az Adblock Plus összegyűjti a szükséges adatokat.">
+<!ENTITY sendButton.label "Jelentés &amp;küldése">
+<!ENTITY comment.label "&amp;Megjegyzés (nem kötelező):">
+<!ENTITY sendPage.errorMessage "A jelentés elküldése közben hiba történt, melynek kódja: &quot;?1?&quot;. Kérem ellenőrizze, hogy megfelelően csatlakozik-e az Internethez és próbálja újra. Ha a probléma nem szűnik meg, kérem kérjen segítséget az [link]Adblock Plus fórumon[/link].">
+<!ENTITY showRecentReports.label "Legutóbb beküldött jelentések">
+<!ENTITY commentPage.heading "Megjegyzés hozzáadása">
+<!ENTITY update.start.label "Frissítés most">
+<!ENTITY issues.disabledfilters.description "Az alábbi szűrők le vannak tiltva, de hatással lehetnének az oldalra:">
+<!ENTITY screenshot.description "Ugyanaz az oldal máshogy is kinézhet mások számítógépén. Segíthet a probléma megoldásában, ha csatol egy képernyőképet a jelentéshez. A képről eltávolíthatja a kényes információt tartalmazó részeket, valamint kiemelheti a problémás területeket. Ehhez nyomja meg a megfelelő gombot és jelölje ki az adott területet az egérrel.">
+<!ENTITY screenshot.attach.label "Oldal képének &amp;csatolása a jelentéshez">
+<!ENTITY issues.whitelist.description "Az Adblock Plus jelenleg le van tiltva az oldalon, amelyet be szeretne jelenteni. Kérem engedélyezze újra a bejelentés előtt, hogy több segédinformáció álljon rendelkezésre a hiba kivizsgálásánál.">
+<!ENTITY typeSelector.falseNegative.label "Az Adblock Plus nem tiltott le egy hi&amp;rdetést">
+<!ENTITY typeSelector.heading "Vállasszon típust">
+<!ENTITY anonymity.warning "Nem fogunk tudni kapcsolatba lépni Önnel, és valószínű, hogy a jelentése alacsonyabb prioritást kap.">
+<!ENTITY wizard.title "Hibajelentő">
+<!ENTITY issues.ownfilters.disable.label "Szűrő letiltása">
+<!ENTITY commentPage.description "Az alábbi szöveges mezőbe beírhat egy megjegyzést, ami segíthet megérteni a problémát. Ez a lépés kihagyható, de ajánlott, ha a probléma nem egyértelmű. A jelentés elküldése előtt még lesz lehetősége átnézni a megadott adatokat.">
+<!ENTITY comment.lengthWarning "A megjegyzés hossza meghaladja az 1000 karaktert. Csak az első 1000 karakter lesz elküldve.">
+<!ENTITY typeSelector.falseNegative.description "Válassza ezt a lehetőséget, ha hirdetések jelennek meg az oldalon annak ellenére, hogy az Adblock Plus engedélyezve van.">
+<!ENTITY sendPage.waitMessage "Kérem várjon, amíg az Adblock Plus elküldi a jelentését.">
+<!ENTITY dataCollector.heading "Üdvözli a hibajelentő">
+<!ENTITY screenshot.heading "Képernyőkép csatolása">
+<!ENTITY sendPage.heading "Jelentés küldése">
+<!ENTITY issues.subscriptionCount.description "Úgy tűnik, hogy túl sok szűrőre van feliratkozva. Ez azért nem ajánlott, mivel ilyenkor gyakrabban fordulnak elő problémák. Emiatt nem fogadhatjuk el a hiba bejelentését, mivel nem tisztázott, hogy melyik szűrő készítőjének kell továbbítani. Kérem távolítsa el azokat a szűrőket, amelyek nem feltétlenül szükségesek és próbálja meg újra előidézni a hibajelenséget.">
+<!ENTITY screenshot.mark.label "&amp;Problémás rész jelölése">
+<!ENTITY privacyPolicy.label "Adatvédelmi elvek">
+<!ENTITY issues.description "Az Adblock Plus konfigurációs problémákat észlelt, amelyek okozhatják a bejelentendő hibát vagy megnehezíthetik a bejelentés elküldését.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/sidebar.dtd
new file mode 100644
index 0000000..4446fff
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Objektum széleinek villogtatása">
+<!ENTITY address.label "Cím">
+<!ENTITY context.open.label "Megnyitás új fülön">
+<!ENTITY type.label "Típus">
+<!ENTITY tooltip.filterSource.label "Szűrő forrása:">
+<!ENTITY noitems.label "Nincs blokkolható objektum">
+<!ENTITY filter.label "Szűrő">
+<!ENTITY tooltip.size.label "Méret:">
+<!ENTITY reattach.label "Oldalsávba">
+<!ENTITY search.label "&amp;Keresés:">
+<!ENTITY docDomain.thirdParty "(3. fél)">
+<!ENTITY filterSource.label "Szűrő forrása">
+<!ENTITY tooltip.docDomain.label "Dokumentum forrás:">
+<!ENTITY context.copy.label "Objektum címének másolása">
+<!ENTITY tooltip.type.label "Típus:">
+<!ENTITY context.disablefilter.label "Szűrő letiltása ?1?">
+<!ENTITY context.copyFilter.label "Szűrő másolása">
+<!ENTITY context.block.label "Objektum blokkolása">
+<!ENTITY context.enablefilter.label "Szűrő engedélyezése ?1?">
+<!ENTITY detach.label "Leválaszt">
+<!ENTITY whitelisted.label "A cím 'fehér listán' van">
+<!ENTITY context.disablefilteronsite.label "Szűrő letiltása itt: ?1?">
+<!ENTITY detached.title "Adblock Plus: Blokkolható objektumok (leválasztva)">
+<!ENTITY docDomain.firstParty "(első fél)">
+<!ENTITY tooltip.type.whitelisted "(fehér listán)">
+<!ENTITY tooltip.filter.label "Alkalmazott szűrők:">
+<!ENTITY tooltip.filter.disabled "(letiltva)">
+<!ENTITY context.editfilter.label "Alkalmazott szűrő szerkesztése">
+<!ENTITY tooltip.type.blocked "(blokkolva)">
+<!ENTITY size.label "Méret">
+<!ENTITY context.whitelist.label "Kivétel megadása objektumhoz">
+<!ENTITY context.selectAll.label "Minden kijelölése">
+<!ENTITY state.label "Ãllapot">
+<!ENTITY docDomain.label "Dokumentum forrás">
+<!ENTITY tooltip.address.label "Cím:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/subscriptionSelection.dtd
new file mode 100644
index 0000000..435a5fd
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Szűrő &amp;hozzáadása: &quot;?1?&quot;">
+<!ENTITY list.download.failed "Hiba a szűrők betöltésekor.">
+<!ENTITY list.download.retry "Próbálja újra">
+<!ENTITY title.label "Külső szűrő &amp;neve:">
+<!ENTITY list.download.website "Weboldal megtekintése">
+<!ENTITY supplementMessage "Ez a szűrő a(z) &quot;?1?&quot; szűrővel együtt használható csak, amely jelenleg nincs a szűrőkhöz hozzáadva.">
+<!ENTITY viewList.label "Szűrők megtekintése">
+<!ENTITY visitHomepage.label "Honlap meglátogatása">
+<!ENTITY addSubscription.label "Szűrő hozzáadása">
+<!ENTITY dialog.title "Adblock Plus szűrő felvétele">
+<!ENTITY location.label "Szűrőlista &amp;címe:">
+<!ENTITY fromWeb.description "Kérem erősítse meg a szűrő hozzáadását. Módosíthatja a szűrő címét és helyét a hozzáadás előtt.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/composer.dtd
new file mode 100644
index 0000000..8fc62bb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "Õ°Õ¡Õ½ÖÕ¥Õ« &amp;Õ¾Õ¥Ö€Õ»Õ¸Ö‚Õ´">
+<!ENTITY domainRestriction.label "Ô±Ö€Õ£Õ¥Õ¬Õ¥Õ¬ &amp;Õ¤Õ¸Õ´Õ¥ÕµÕ¶Õ¸Ö‚Õ´`">
+<!ENTITY collapse.default.no.label "Ô¼Õ¼Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ (Õ¸Õ¹)">
+<!ENTITY firstParty.label "Õ„Õ«Õ¡ÕµÕ¶ &amp;Õ°Õ«Õ´Õ¶Õ¡Õ¯Õ¡Õ¶">
+<!ENTITY preferences.label "Õ†Õ¡ÕµÕ¥Õ¬ Õ¡&amp;Õ¼Õ¯Õ¡ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨...">
+<!ENTITY pattern.label "ÕˆÖ€Õ¸Õ¶Õ¥Õ¬ Õ·Õ¡Õ¢Õ¬Õ¸Õ¶">
+<!ENTITY thirdParty.label "Õ„Õ«Õ¡ÕµÕ¶ &amp;Õ¥Ö€Ö€Õ¸Ö€Õ¤ Õ¯Õ¸Õ²Õ´Õ«Ö">
+<!ENTITY filter.label "Õ†Õ¸Ö€ &amp;Õ–Õ«Õ¬Õ¿Ö€.">
+<!ENTITY collapse.label "Ô¹Õ¡Ö„ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¾Õ¡&amp;Õ®Õ¶Õ¥Ö€Õ¨`">
+<!ENTITY match.warning "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¾Õ¡Õ® Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ¨ Õ¡ÕµÕ¬Ö‡Õ½ Õ¹Õ« Õ°Õ¡Õ´Õ¡ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶Õ¸Ö‚Õ´ Õ°Õ¡Õ½ÖÕ¥Õ«Õ¶ Ö‡ Õ¸Õ¹ Õ´Õ« Õ¡Õ¦Õ¤Õ¥ÖÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¹Õ« Õ¸Ö‚Õ¶Õ¥Õ¶Õ¡Õ¬Õ¸Ö‚.">
+<!ENTITY anchor.start.label "Õ°Õ¡&amp;Õ½ÖÕ¥Õ« Õ½Õ¯Õ¦Õ¢Õ¸Ö‚Õ´">
+<!ENTITY matchCase.label "Õ€Õ¡Õ·Õ¾Õ« Õ¡Õ¼Õ¶Õ¥Õ¬ &amp;Õ¿Õ¡Õ¼Õ¡Õ¿Õ¥Õ½Õ¡Õ¯Õ¨">
+<!ENTITY custom.pattern.label "ÕÕ¥&amp;ÖƒÕ¡Õ¯Õ¡Õ¶.">
+<!ENTITY unselectAllTypes.label "Õ‰Õ¨Õ¶Õ¿Ö€Õ¥Õ¬ Õ¸Õ¹Õ«Õ¶Õ¹">
+<!ENTITY type.whitelist.label "Ô²Õ¡&amp;ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶">
+<!ENTITY regexp.warning "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¾Õ¡Õ® Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ¨ Õ¨Õ¶Õ¯Õ¡Õ¬Õ¾Õ¥Õ¬Õ¸Ö‚ Õ§ Õ¸Ö€ÕºÕ¥Õ½ Õ¼Õ¥Õ£Õ¸Ö‚Õ¬ÕµÕ¡Ö€ Õ¡Ö€Õ¿Õ¡Õ°Õ¡ÕµÕ¿Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶(regexp): Ռեգուլյար Õ¡Ö€Õ¿Õ¡Õ°Õ¡ÕµÕ¿Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ´Õ¥Õ® Ö„Õ¡Õ¶Õ¡Õ¯Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¤Õ¡Õ¶Õ¤Õ¡Õ²Õ¥ÖÕ¶Õ¥Õ¬ Õ®Ö€Õ¡Õ£Ö€Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨: ÔµÕ©Õ¥ Õ¤Õ¸Ö‚Ö„ Õ¹Õ¥Ö„ ÕºÕ¡Õ¿Ö€Õ¡Õ½Õ¿Õ¾Õ¸Ö‚Õ´ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¼Õ¥Õ£Õ¸Ö‚Õ¬ÕµÕ¡Ö€ Õ¡Ö€Õ¿Õ¡Õ°Õ¡ÕµÕ¿Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶, Õ¡Õ¾Õ¥Õ¬Õ¡ÖÖ€Õ¥Ö„ * Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ« Õ¾Õ¥Ö€Õ»Õ¸Ö‚Õ´:">
+<!ENTITY dialog.title "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ «Adblock Plus» Ö†Õ«Õ¬Õ¿Ö€Õ´Õ¡Õ¶ Õ¯Õ¡Õ¶Õ¸Õ¶">
+<!ENTITY basic.label "ÕŠÕ¡Ö€Õ¦ Õ¿Õ¥Õ½Ö„">
+<!ENTITY type.filter.label "&amp;Ô±Ö€Õ£Õ¥Õ¬Õ¸Õ² Ö†Õ«Õ¬Õ¿Ö€">
+<!ENTITY types.label "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ Õ¿Õ«ÕºÕ¥Ö€Õ«Õ¶`">
+<!ENTITY shortpattern.warning "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¾Õ¡Õ® Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ¨ Õ·Õ¡Õ¿ Õ¯Õ¡Ö€Õ³ Õ§ Õ¸Ö‚ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Ö…ÕºÕ¿Õ«Õ´Õ«Õ¦Õ¡ÖÕ¾Õ¥Õ¬, Õ¡ÕµÕ½ÕºÕ«Õ½Õ« Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ¶Õ¥Ö€Õ« Õ´Õ¥Õ® Ö„Õ¡Õ¶Õ¡Õ¯Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¤Õ¡Õ¶Õ¤Õ¡Õ²Õ¥ÖÕ¶Õ¥Õ¬ Õ®Ö€Õ¡Õ£Ö€Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨: Ô½Õ¸Ö€Õ°Õ¸Ö‚Ö€Õ¤ Õ§ Õ¿Ö€Õ¾Õ¸Ö‚Õ´ Ö†Õ«Õ¬Õ¿Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¡Õ¾Õ¥Õ¬Õ« Õ¥Ö€Õ¯Õ¡Ö€ Õ¿Õ¸Õ²:">
+<!ENTITY collapse.yes.label "Ô±ÕµÕ¸">
+<!ENTITY anchors.label "Õ‡Õ¡Õ¢Õ¬Õ¸Õ¶Õ¶Õ¥Ö€Õ¶ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¥Õ¬ Õ´Õ«Õ¡ÕµÕ¶.">
+<!ENTITY collapse.default.yes.label "Ô¼Õ¼Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ (Õ¡ÕµÕ¸)">
+<!ENTITY domainRestriction.help "ÕÕ¡Õ°Õ´Õ¡Õ¶Õ¥Ö„ Õ´Õ¥Õ¯ Õ¯Õ¡Õ´ Õ¡Õ¾Õ¥Õ¬ Õ¤Õ¸Õ´Õ¥ÕµÕ¶Õ¥Ö€ Õ¢Õ¡ÕªÕ¡Õ¶Õ¾Õ¡Õ® &quot;|&quot; Õ¶Õ·Õ¡Õ¶Õ¸Õ¾, Ö†Õ«Õ¬Õ¿Ö€Õ¨ Õ¯Õ¡Õ·Õ­Õ¡Õ¿Õ« Õ´Õ«Õ¡ÕµÕ¶ Õ¡ÕµÕ¤ Õ¤Õ¸Õ´Õ¥ÕµÕ¶Õ¥Ö€Õ¸Ö‚Õ´: Ô´Õ¸Õ´Õ¥ÕµÕ¶Õ« Õ¡Õ¶Õ¾Õ¡Õ¶ Õ¡Õ¼Õ¡Õ» &quot;~&quot; Õ¶Õ·Õ¡Õ¶Õ¨ Õ¡Ö€Õ£Õ¥Õ¬Õ¸Ö‚Õ´ Õ§ Ö†Õ«Õ¬Õ¿Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´Õ¨ Õ¡ÕµÕ¤ Õ¤Õ¸Õ´Õ¥ÕµÕ¶Õ¸Ö‚Õ´:">
+<!ENTITY accept.label "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€">
+<!ENTITY options.label "Ô¸Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€">
+<!ENTITY disabled.warning "«Adblock Plus»ը Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§: Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€, Õ¢Õ¡ÕµÖ Õ¤Ö€Õ¡Õ¶Ö Õ£Õ¸Ö€Õ®Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ ÕºÕ¥Õ¿Ö„ Õ§ [link]Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ «Adblock Plus»ը[/link]:">
+<!ENTITY anchor.start.flexible.label "Õ¤Õ¸Õ´Õ¥ÕµÕ¶Õ« Õ¡Õ¶Õ¾Õ¡Õ¶ &amp;Õ½Õ¯Õ¦Õ¢Õ¸Ö‚Õ´">
+<!ENTITY collapse.no.label "ÕˆÕ¹">
+<!ENTITY selectAllTypes.label "Ô¼Ö€Õ«Õ¾ Ô¸Õ¶Õ¿Ö€Õ¥Õ¬">
+<!ENTITY advanced.label "Ô¸Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¾Õ¡Õ® Õ¿Õ¥Õ½Ö„">
+<!ENTITY pattern.explanation "Õ†Õ´Õ¸Ö‚Õ·Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¬Õ«Õ¶Õ¥Õ¬ Õ°Õ¡Õ½ÖÕ¥Õ« ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ´Õ¡Õ½, *-Õ¨ Õ¶Õ·Õ¡Õ¶Õ¡Õ¯Õ¸Ö‚Õ´ Õ§ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ½Õ«Õ´Õ¾Õ¸Õ¬: Ô¿Ö†Õ«Õ¬Õ¿Ö€Õ¾Õ¥Õ¶ Õ´Õ«Õ¡ÕµÕ¶ Õ¶Õ´Õ¸Ö‚Õ·Õ«Õ¶ Õ¢Õ¡Õ¾Õ¡Ö€Õ¡Ö€Õ¸Õ² Õ°Õ¡Õ½ÖÕ¥Õ¶Õ¥Ö€Õ¨:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/filters.dtd
new file mode 100644
index 0000000..f098c8f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Ô²Õ¸Õ¬Õ¸Ö€ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨ Õ¯ÖƒÕ¸Õ­Õ¡Ö€Õ«Õ¶Õ¾Õ¥Õ¶ Õ¶Õ¸Ö€Õ¥Ö€Õ¸Õ¾:Õ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸ÕžÖ‚Õ´ Õ¥Ö„ Õ¯Õ«Ö€Õ¡Õ¼Õ¥Õ¬:">
+<!ENTITY slow.column "Ô´Õ¡Õ¶Õ¤Õ¡Õ² Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€ (&amp;w)">
+<!ENTITY enabled.column "&amp;Õ„Õ«Õ¡ÖÕ¡Õ® Õ§">
+<!ENTITY subscription.lastDownload.checksumMismatch "Ô±Õ¶Õ°Õ¡Õ»Õ¸Õ².">
+<!ENTITY noFiltersInGroup.text "Ô¸Õ¶Õ¿Ö€Õ¾Õ¡Õ® Õ­Õ¸Ö‚Õ´Õ¢Õ¨ Õ¤Õ¡Õ¿Õ¡Ö€Õ¯ Õ§:">
+<!ENTITY subscription.actions.label "Ô³Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€">
+<!ENTITY filter.selectAll.label "Õ†Õ·Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€Õ¨">
+<!ENTITY backupButton.label "ÕŠÕ¡Õ°Õ¸Ö‚Õ½Õ¿ Ö‡ ÕŽÕ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¸Ö‚Õ´ (&amp;B)">
+<!ENTITY restore.minVersion.warning "ÕˆÖ‚Õ·Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶:Õ–Õ¡ÕµÕ¬Õ¨ Õ½Õ¿Õ¥Õ²Õ·Õ¾Õ¥Õ¬ Õ§ Õ¡Õ¾Õ¥Õ¬Õ« Õ¶Õ¸Ö€ Adblock Plus-Õ« Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¸Õ¾:Ô¹Õ¡Ö€Õ´Õ¡ÖÖ€Õ¥Õ›Ö„ Adblock Plus-Õ¨Õ Õ¡ÕµÕ¤ Ö†Õ¡ÕµÕ¬Õ«Ö Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:">
+<!ENTITY restore.error "Ô±Õ¶Õ°Õ¡Õ¶Õ¡Ö€ Õ§ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬:Õ€Õ¶Õ¡Ö€Õ¡Õ¾Õ¸ÕžÖ€ Õ§, Õ¸Ö€ Õ¤Õ¡ Adblock Plus-Õ« Õ¡Ö€Õ­Õ«Õ¾ Õ¹Õ§:">
+<!ENTITY sort.ascending.label "&amp;Ô± &gt; Õ– Õ¯Õ¡Ö€Õ£Õ¸Õ¾">
+<!ENTITY sort.label "&amp;Ô´Õ¡Õ½Õ¡Õ¾Õ¸Ö€Õ¥Õ¬">
+<!ENTITY subscription.source.label "Õ–Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« ÖÕ¸Ö‚ÖÕ¡Õ¯">
+<!ENTITY hitcount.column "Ô±Õ¦Õ¤ (&amp;Õ€)">
+<!ENTITY noFilters.text "Ô´Õ¸Ö‚Ö„ Õ¤Õ¥Õ¼Ö‡Õ½ Õ¹Õ¸Ö‚Õ¶Õ¥Ö„ Õ¸Ö€Ö‡Õ§ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶ Ö†Õ«Õ¬Õ¿Ö€:">
+<!ENTITY backup.custom.title "Õ„Õ«Õ¡ÕµÕ¶ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨">
+<!ENTITY subscription.external.label "Ô¹Õ¡Ö€Õ´Õ¡ÖÕ¾Õ¥Ö Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Õ¯Õ¸Õ²Õ´Õ«Ö">
+<!ENTITY subscription.delete.label "Õ‹Õ¶Õ»Õ¥Õ¬">
+<!ENTITY noGroupSelected.text "ÕŠÕ«Õ¿Õ« Õ¨Õ¶Õ¿Ö€Õ¥Ö„ Ö†Õ¡Õ«Õ¬Õ¿Ö€Õ« Õ­Õ¸Ö‚Õ´Õ¢Õ Õ¡ÕµÕ¶ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬Õ¸Ö‚Ö Õ¡Õ¼Õ¡Õ»:">
+<!ENTITY filter.cut.label "Ô¿Õ¿Ö€Õ¥Õ¬">
+<!ENTITY restore.default.label "ÕŽÕ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬ ?1?-Õ« ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¨">
+<!ENTITY subscription.lastDownload.inProgress "Ô²Õ¥Õ¼Õ¶Õ¸Ö‚Õ´...">
+<!ENTITY subscriptions.tab.label "Ô²Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¾Õ¡Õ® Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€">
+<!ENTITY sort.descending.label "&amp;Õ– &gt; Ô± Õ¯Õ¡Ö€Õ£Õ¸Õ¾">
+<!ENTITY filters.remove.warning "Ô±Ö€Õ¤ÕµÕ¸ÕžÖ„ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ»Õ¶Õ»Õ¥Õ¬ Õ¶Õ·Õ¾Õ¡Õ® Õ¾Õ¸Õ¬Õ¸Ö€ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨:">
+<!ENTITY filter.delete.label "Õ‹Õ¶Õ»Õ¥Õ¬">
+<!ENTITY addSubscriptionAdd.label "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬">
+<!ENTITY viewMenu.label "ÕÕ¥Õ½Ö„">
+<!ENTITY subscription.lastDownload.unknown "Õ‰Ô¿Ô±">
+<!ENTITY addSubscriptionCancel.label "Õ‰Õ¥Õ²Õ¡Ö€Õ¯Õ¥Õ¬">
+<!ENTITY subscription.enabled.label "Õ„Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§">
+<!ENTITY noSubscriptions.text "Ô´Õ¸Ö‚Ö„ Õ¤Õ¥Õ¼Ö‡Õ½ Õ¹Õ¥Ö„ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¾Õ¥Õ¬ Õ¸Ö€Ö‡Õ§ Ö†Õ«Õ¬Õ¿Ö€Õ«: Adblock Plus-Õ¨ Õ¸Õ¹Õ«Õ¶Õ¹ Õ¹Õ« Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ« Õ¡Õ¼Õ¡Õ¶Ö Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ«, Õ¡ÕµÕ¤ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¸Õ¾ Õ­Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¯Õ«Ö€Õ¡Õ¼Õ¥Õ¬ «ԱվելաÖÕ¶Õ¥Õ¬ բաժանորդագրություն» Õ¯Õ¸Õ³Õ¡Õ¯Õ¨:">
+<!ENTITY subscription.update.label "Ô¹Õ¡Ö€Õ´Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨">
+<!ENTITY dialog.title "Adblock Plus Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Ö‚Õ´">
+<!ENTITY addFilter.label "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ–Õ«Õ¬Õ¿Ö€ (&amp;d)">
+<!ENTITY subscription.minVersion.warning "Ô±ÕµÕ½ Ö†Õ«Õ¬Õ¿Ö€Õ«Õ¶ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¾Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ§ Adblock Plus-Õ« Õ¡Õ¾Õ¥Õ¬Õ« Õ¶Õ¸Ö€ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¨, Õ¤Õ¸Ö‚Ö„ ÕºÕ¥Õ¿Ö„ Õ§ Õ©Õ¡Ö€Õ´Õ¡ÖÕ¶Õ¥Ö„ Adblock Plus-Õ¨:">
+<!ENTITY subscription.lastDownload.invalidURL "Ô±Õ¶Õ°Õ¡Õ»Õ¸Õ². ÕÕ­Õ¡Õ¬ Õ°Õ¡Õ½ÖÕ¥">
+<!ENTITY backup.error "Ô±Õ¶Õ°Õ¡Õ¶Õ¡Ö€ Õ§ ÕºÕ¡Õ°Õ¥Õ¬ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨:Õ€Õ¡Õ´Õ¸Õ¦Õ¾Õ¥Õ›Ö„, Õ¸Ö€ Ö†Õ¡ÕµÕ¬Õ¨ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ§ ÖƒÕ¸Õ­Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¹Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¾Õ¸Ö‚Õ´ Õ¡ÕµÕ¬ Õ®Ö€Õ¡Õ£Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö:">
+<!ENTITY filter.moveUp.label "Ô²Õ¡Ö€Õ±Ö€Õ¡ÖÕ¶Õ¥Õ¬ Õ¾Õ¥Ö€Ö‡">
+<!ENTITY addGroup.label "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ­Õ¸Ö‚Õ´Õ¢">
+<!ENTITY filter.edit.label "Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬">
+<!ENTITY subscription.showHideFilters.label "Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬/Ô¹Õ¡Ö„ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨">
+<!ENTITY acceptableAds2.label "Ô¹Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬ Õ¸Ö€Õ¸Õ· Õ¹Õ¯ÕºÕ¹Õ¸Ö‚Õ¶ Õ£Õ¸Õ¾Õ¡Õ¦Õ¤ (&amp;!)">
+<!ENTITY addSubscriptionOther.label "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¡ÕµÕ¬ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶">
+<!ENTITY close.label "Õ“Õ¡Õ¯Õ¥Õ¬">
+<!ENTITY sort.none.label "Ô±&amp;Õ¶Õ¯Õ¡Õ¶Õ¸Õ¶">
+<!ENTITY filter.actions.label "Ô³Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ°Õ¥Õ¿">
+<!ENTITY filter.copy.label "Ô¿Ö€Õ¯Õ¶Õ¥Õ¬">
+<!ENTITY filter.moveDown.label "Ô²Õ¡Ö€Õ±Ö€Õ¡ÖÕ¶Õ¥Õ¬ Õ¶Õ¥Ö€Ö„Ö‡">
+<!ENTITY filter.resetHitCounts.label "Õ‹Õ¶Õ»Õ¥Õ¬ Õ½Õ¿Õ¡Õ¿Õ«Õ½Õ¿Õ«Õ¯Õ¡Õ¶">
+<!ENTITY readMore.label "ÕÕ¥Õ²Õ¥Õ¯Õ¡Õ¶Õ¡Õ¬ Õ¡Õ¾Õ¥Õ¬Õ«Õ¶">
+<!ENTITY subscription.moveUp.label "Ô²Õ¡Ö€Õ±Ö€Õ¡ÖÕ¶Õ¥Õ¬ Õ¾Õ¥Ö€Ö‡">
+<!ENTITY addSubscription.label "Ô²Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¾Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« (&amp;f)">
+<!ENTITY subscription.homepage.label "Õ¿Õ¶Õ§Õ»">
+<!ENTITY backup.complete.title "Ô²Õ¸Õ¬Õ¸Ö€ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨ Ö‡ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨">
+<!ENTITY restore.own.label "ÕŽÕ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶ Õ¡Ö€Õ­Õ«Õ¾Õ¨">
+<!ENTITY restore.complete.warning "Ô²Õ¸Õ¬Õ¸Ö€ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨ Õ¯ÖƒÕ¸Õ­Õ¡Ö€Õ«Õ¶Õ¾Õ¥Õ¶ Õ¶Õ¸Ö€Õ¥Ö€Õ¸Õ¾:Õ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸ÕžÖ‚Õ´ Õ¥Ö„ Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬:">
+<!ENTITY filters.tab.label "ÕÕ¥ÖƒÕ¡Õ¯Õ¡Õ¶ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€">
+<!ENTITY backup.label "ÕÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¶Õ¸Ö€ ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿">
+<!ENTITY find.label "Õ“Õ¶Õ¿Ö€Õ¥Õ¬ (&amp;n)">
+<!ENTITY subscription.moveDown.label "Ô»Õ»Õ¡ÖÕ¶Õ¥Õ¬ Õ¶Õ¥Ö€Ö‡">
+<!ENTITY subscription.lastDownload.connectionError "Ô±Õ¶Õ°Õ¡Õ»Õ¸Õ². Ô²Õ¥Õ¼Õ¶Õ´Õ¡Õ¶ Õ½Õ­Õ¡Õ¬">
+<!ENTITY subscription.lastDownload.success "Õ€Õ¡Õ»Õ¸Õ²">
+<!ENTITY subscription.lastDownload.invalidData "Ô±Õ¶Õ°Õ¡Õ»Õ¸Õ². ÕÕ­Õ¡Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« ÖÕ¸Ö‚ÖÕ¡Õ¯">
+<!ENTITY filter.paste.label "ÕÕ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬">
+<!ENTITY subscription.disabledFilters.enable "Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨">
+<!ENTITY lasthit.column "ÕŽÕ¥Ö€&amp;Õ»Õ«Õ¶Õ¨">
+<!ENTITY subscription.editTitle.label "Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬ Õ¡Õ¶Õ¾Õ¡Õ¶Õ¸Ö‚Õ´Õ¨">
+<!ENTITY subscription.disabledFilters.warning "Ô±ÕµÕ½ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¸Ö€Õ¸Õ· Ö†Õ«Õ¬Õ¿Õ¶Õ¥Ö€ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ¥Õ¶:">
+<!ENTITY filter.column "Õ–Õ«&amp;Õ¬Õ¿Ö€">
+<!ENTITY subscription.lastDownload.label "ÕŽÕ¥Ö€Õ»Õ«Õ¶ Õ¢Õ¥Õ¼Õ¶Õ¸Ö‚Õ´.">
+<!ENTITY viewList.label "Ô´Õ«Õ¿Õ¥Õ¬ ÖÕ¡Õ¶Õ¯Õ¨">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/firstRun.properties
new file mode 100644
index 0000000..6206ba5
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Ô±ÕµÖÕ¥Õ¬Õ¥Ö„ Õ«Õ¶Õ¿Õ¥Ö€Õ¶Õ¥Õ¿ Õ¡Õ¶Õ¡Õ¶Õ¸Ö‚Õ¶Õ Õ©Õ¡Ö„ÖÕ¶Õ¥Õ¬Õ¸Õ¾ ÕÕ¥Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Õ¸Ö€Õ¸Õ¶ÖÕ«Ö Ö…Õ£Õ¿Õ¾Õ¸Ö‚Õ´ Õ¥Õ¶ Õ¸Ö€Õ¸Õ· Õ¯Õ¡Õ¦Õ´Õ¡Õ¯Õ¥Ö€ÕºÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Ö‰
+firstRun_toggle_off=Ô±Õ†Õ‹
+firstRun_feature_tracking=Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ©Ö€Õ¥Ö„Õ«Õ¶Õ£Õ¨
+firstRun_feature_malware=ÕŽÕ«Ö€Õ¸Ö‚Õ½Õ« Õ¡Ö€Õ£Õ¥Õ¬Õ¸Ö‚Õ´
+firstRun_title=ÕŽÕ¥Ö€Õ»! Õ¯Õ¡Ö€Õ¸Õ² Õ§Ö„ Ö…Õ£Õ¿Õ¾Õ¥Õ¬ Adblock-Õ«Ö
+firstRun_acceptableAdsExplanation=Õ„Õ¥Õ¶Ö„ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ <a>Õ¸Ö€Õ¸Õ· Õ¯Õ¡ÕµÖ„Õ¥Ö€Õ«</a> Õ£Õ¸Õ¾Õ¡Õ¦Õ¤Õ¨, Õ¸Ö€Õ¸Õ¾Õ°Õ¥Õ¿Ö‡ Õ£Õ«Õ¿Õ¥Õ¶Ö„, Õ¸Ö€ Õ¶Ö€Õ¡Õ¶Ö„ Õ°Õ¡Õ³Õ¥Õ¬Õ« Õ£Õ¸Õ¾Õ¡Õ¦Õ¤ Õ¥Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´Ö‰ ÔµÕ©Õ¥ Ô´Õ¸Ö‚Ö„ Õ¹Õ¥Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¤Ö€Õ¡Õ¶Ö„ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬, Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ <a>Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬</a> Õ¤Ö€Õ¡Õ¶Ö„ Õ·Õ¡Õ¿ Õ°Õ¥Õ·Õ¿Ö‰
+firstRun_toggle_on=Õ„Ô»Ô±Õ‘
+firstRun_contributor_credits=Ô¾Ö€Õ¡Õ£Ö€Õ« Õ°Õ¥Õ²Õ«Õ¶Õ¡Õ¯Õ¶Õ¥Ö€Õ¨
+firstRun_dataCorruptionWarning=Ô±Ö€Õ¤ÕµÕ¸Ö„ Õ¡ÕµÕ½ Õ§Õ»Õ¨ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¾Õ¸Ö‚Õ´ Õ§? <a>ÕÕ¥Õ²Õ´Õ¥Ö„ Õ¡ÕµÕ½Õ¿Õ¥Õ²!</a>
+firstRun_acceptableAdsHeadline=ÕŽÕ¡Õ¿ Õ£Õ¸Õ¾Õ¡Õ¦Õ¤Õ¶Õ¥Ö€Õ¶ Õ¡ÕµÕªÕ´ Õ¡Ö€Õ£Õ¥Õ¬Õ¾Õ¡Õ® Õ¥Õ¶
+firstRun_share=ÕŠÕ¡Õ¿Õ´Õ¥Ö„ Õ¨Õ¶Õ¯Õ¥Ö€Õ¶Õ¥Ö€Õ«Õ¶
+firstRun_share_headline=<a>Õ„Õ¥Õ¦ Ö…Õ£Õ¶Õ¥Ö„</a> Õ¤Õ¡Ö€Õ±Õ¶Õ¥Õ¬Õ¸Ö‚ Õ«Õ¶Õ¿Õ¥Ö€Õ¶Õ¥Õ¿Õ¶ Õ¡Õ¾Õ¥Õ¬Õ« Õ¬Õ¡Õ¾ Õ¾Õ¡ÕµÖ€
+firstRun_features=Adblock Plus Õ¡Õ¾Õ¥Õ¬Õ«Õ¶ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¡Õ¶Õ¥Õ¬
+firstRun_feature_malware_description=Ô±Õ¶Õ¾Õ¿Õ¡Õ¶Õ£ Õ¤Õ¡Ö€Õ±Õ¶Õ¥Õ¬ ÕÕ¥Ö€ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ«Õ¹Õ¶ Õ¡Ö€Õ£Õ¥Õ¬Õ¥Õ¬Õ¸Õ¾ Õ¾Õ«Ö€Õ¸Ö‚Õ½-Õ¤Õ¸Õ´Õ¥Õ¶Õ¶Õ¥Ö€Õ¨Ö‰
+firstRun_feature_social_description=Ô±Õ¾Õ¿Õ¸Õ´Õ¡Õ¿ Õ¡Ö€Õ¡Õ£Õ¡ÖÕ¶Õ¥Õ¬ Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¥Õ¬Õ¸Õ¾ Õ½Õ¸Ö․ ÖÕ¡Õ¶ÖÕ¥Ö€Õ« Õ¯Õ¸Õ³Õ¡Õ¯Õ¶Õ¥Ö€Õ¨, Ö…Ö€Õ«Õ¶Õ¡Õ¯Õ Facebook Like, Õ¸Ö€Õ¨ Õ£Õ¡Õ¬Õ«Õ½ Õ§ Õ¯Õ¡ÕµÖ„Õ¥Ö€Õ¸Ö‚Õ´ Ö‡ Õ°Õ¥Õ¿Ö‡Õ¸Ö‚Õ´ ÕÕ¥Õ¦Ö‰
+firstRun_donate=Õ¶Õ¾Õ«Ö€Õ¡Õ¢Õ¥Ö€Õ¥Õ¬
+firstRun_donate_label=Õ•Õ£Õ¶Õ¥Ö„ Õ´Õ¥Ö€ Õ®Ö€Õ¡Õ£Ö€Õ«Õ¶
+firstRun_feature_social=Õ€Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ½Õ¸Ö․ ÖÕ¡Õ¶ÖÕ¥Ö€Õ« Õ¯Õ¸Õ³Õ¡Õ¯Õ¶Õ¥Ö€Õ¨
+firstRun_legacySafariWarning=Ô´Õ¸Ö‚Ö„ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´ Õ¥Ö„ Safari Õ°Õ«Õ¶ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯, Õ¸Ö€Õ¿Õ¥Õ² Adblock Plus Õ¹Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¸Ö‚Õ´ Õ¯Õ¡Õ´ Õ¾Õ¡Õ¿ Õ§ Õ¡Õ·Õ­Õ¡Õ¿Õ¸Ö‚Õ´Ö‰ Õ„Õ¥Õ¶Ö„ Õ­Õ¸Ö€Õ°Õ¸Ö‚Ö€Õ¤ Õ¥Õ¶Ö„ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬ Safari 6.1.1 Õ¯Õ¡Õ´ Õ¡Õ¾Õ¥Õ¬Õ« Õ¢Õ¡Ö€Õ±Ö€ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯ (OS X 10.8 Mountain Lion-Õ¸Ö‚Õ´) Õ¯Õ¡Õ´ Safari 7.0.1 Ö‡ Õ¢Õ¡Ö€Õ±Ö€ (OS X 10.9 Mavericks-Õ¸Ö‚Õ´), Õ«Õ½Õ¯ Õ¥Õ©Õ¥ Õ¸Õ¹ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Ö„ Mozilla Firefox, Google Chrome Õ¯Õ¡Õ´ OperaÖ‰
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/global.properties
new file mode 100644
index 0000000..69bb1c4
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Ô±ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´ Ö†Õ«Õ¬Õ¿Ö€Õ¾Õ¾Õ¸Õ² Õ¿Õ¡Ö€Ö€Õ¥Ö€ Õ¹Õ¯Õ¡Õ¶
+action3_tooltip=Ô¿Õ¬Õ«Õ¯Õ¸Õ¾` Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬/Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ «Adblock Plus»ը:
+notification_antiadblock_title=Ô¹Õ¡Ö„ÖÕ¶Õ¥ÕžÕ¬ Õ¶Õ¡Õ´Õ¡Õ¯Õ¶Õ¥Ö€Õ¨
+type_label_script=Õ½Õ¯Ö€Õ«ÕºÕ¿
+filter_elemhide_nocriteria=ÕÕ¡Ö€Ö€Õ¨ Õ©Õ¡Ö„ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ¸Õ¹ Õ´Õ« Õ¹Õ¡ÖƒÕ¡Õ¶Õ«Õ· Õ¿Ö€Õ¾Õ¡Õ® Õ¹Õ§
+blockingGroup_title=Ô³Õ¸Õ¾Õ¡Õ¦Õ¤Õ« Õ¡Ö€Õ£Õ¥Õ¬Õ´Õ¡Õ¶ Õ¯Õ¡Õ¶Õ¸Õ¶Õ¶Õ¥Ö€
+whitelisted_tooltip=«Adblock Plus»ը Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§, Õ¢Õ¡ÕµÖ Õ¡Ö€Õ£Õ¥Õ¬Õ¾Õ¡Õ® Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´
+type_label_stylesheet=Õ¸Õ³Õ¥Ö€
+blocked_count_tooltip=?1? Õ°Õ¡Õ¿ ` ?2? Õ°Õ¡Õ¿Õ«Ö
+type_label_font=Ö†Õ¸Õ¶Õ¿
+type_label_popup=pop-up ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶
+filter_regexp_tooltip=Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¾Õ¡Õ® Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ¨ Õ¯Õ¡Õ´ Õ¼Õ¥Õ£Õ¸Ö‚Õ¬ÕµÕ¡Ö€ Õ¡Ö€Õ¿Õ¡Õ°Õ¡ÕµÕ¿Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ , Õ¯Õ¡Õ´ Õ·Õ¡Õ¿ Õ¯Õ¡Ö€Õ³ Õ§ Õ¸Ö‚ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Ö…ÕºÕ¿Õ«Õ´Õ«Õ¦Õ¡ÖÕ¾Õ¥Õ¬, Õ¡ÕµÕ½ÕºÕ«Õ½Õ« Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ¶Õ¥Ö€Õ« Õ´Õ¥Õ® Ö„Õ¡Õ¶Õ¡Õ¯Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¤Õ¡Õ¶Õ¤Õ¡Õ²Õ¥ÖÕ¶Õ¥Õ¬ Õ®Ö€Õ¡Õ£Ö€Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨:
+action0_tooltip=ÕÕ¥Õ²Õ´Õ¥Ö„ Õ´Õ¥Õ¶ÕµÕ¸Ö‚Õ« Õ°Õ¡Õ´Õ¡Ö€, Õ¯Õ¥Õ¿Õ¶Õ¿Ö€Õ¸Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¯Õ¸Õ³Õ¡Õ¯Õ¸Õ¾` Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬/Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬
+whitelisted_page=«Adblock Plus»ը անջատված է այս էջի համար
+remove_group_warning=Ô´Õ¸Ö‚Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸ÕžÖ‚Õ´ Õ¥Ö„ Õ»Õ¶Õ»Õ¥Õ¬ Õ¡ÕµÕ½ Õ­Õ¸Ö‚Õ´Õ¢Õ¨:
+action1_tooltip=Ô¿Õ¬Õ«Õ¯Õ¸Õ¾` Õ¢Õ¡ÖÕ¥Õ¬/ÖƒÕ¡Õ¯Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¾Õ¾Õ¸Õ² Õ¿Õ¡Ö€Ö€Õ¥Ö€Õ¨; Õ¯Õ¥Õ¿Õ¶Õ¿Ö€Õ¸Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¯Õ¸Õ³Õ¡Õ¯Õ¸Õ¾` Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬/Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬
+type_label_xmlhttprequest=XML Õ¯Õ¡Õ¶Õ¹
+active_tooltip=«Adblock Plus»ը Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§, Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¾Õ¸Ö‚Õ´ Õ§ ?1? Ö†Õ«Õ¬Õ¿Ö€Õ« Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¥Ö‚ ?2? Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¾Õ¡Õ® Ö†Õ«Õ¬Õ¿Ö€
+type_label_document=ÖƒÕ¡Õ½Õ©Õ¡Õ©Õ¸Ö‚Õ²Õ©
+type_label_object_subrequest=Ö…Õ¢ÕµÕ¥Õ¯Õ¿Õ« Õ¯Õ¡Õ¶Õ¹
+whitelistGroup_title=Ô²Õ¡ÖÕ¡Õ¼Õ¡Õ¯Õ¡Õ¶ Õ¯Õ¡Õ¶Õ¸Õ¶Õ¶Õ¥Ö€
+disabled_tooltip=«Adblock Plus»ը անջատված է
+filter_elemhide_duplicate_id=ÕÕ¡Ö€Ö€Õ¨ Õ©Õ¡Ö„ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ¯Õ¡Ö€Õ¥Õ¬Õ« Õ§ Õ¿Õ¡Õ¬ Õ´Õ«Õ¡ÕµÕ¶ Õ´Õ¥Õ¯ ID
+type_label_object=Ö…Õ¢ÕµÕ¥Õ¯Õ¿
+action2_tooltip=Ô¿Õ¬Õ«Õ¯Õ¸Õ¾` Õ†Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€; Õ¯Õ¥Õ¿Õ¶Õ¿Ö€Õ¸Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¯Õ¸Õ³Õ¡Õ¯Õ¸Õ¾` Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬/Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬
+type_label_subdocument=Ö†Ö€Õ¥ÕµÕ´
+clearStats_warning=Ô±ÕµÕ½ Õ¯Õ»Õ¶Õ»Õ« Õ½Õ¿Õ¡Õ¿Õ«Õ½Õ¿Õ«Õ¯Õ¡Õ¶ Ö‡ Õ¯Õ¡Õ¶Õ»Õ¡Õ¿Õ« Õ¡ÕµÕ¶:Õ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸ÕžÖ‚Õ´ Õ¥Ö„ Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬:
+notification_antiadblock_message=Ô±ÕµÕ½ Õ¯Õ¡ÕµÖ„Õ¨ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¸Ö‚Õ´ Õ§ Õ¶Õ¡Õ´Õ¡Õ¯Õ¶Õ¥Ö€ Adblock Plus-Õ« Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ¶Õ¥Ö€Õ«Õ¶Ö‰ ÕˆÖ‚Õ¦Õ¸ÕžÖ‚Õ´ Õ¥Ö„ Õ©Õ¡Ö„ÖÕ¶Õ¥Õ¬ Õ¤Ö€Õ¡Õ¶Ö„Ö‰
+blocked_count_addendum=?1?-Õ¨ ?2?-Õ«Ö
+subscription_invalid_location=Õ–Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯Õ« Õ°Õ¡Õ½ÖÕ¥Õ¶ Õ¯Õ¡Õ´ Õ½Õ­Õ¡Õ¬ URL Õ§, Õ¯Õ¡Õ´ Õ½Õ­Õ¡Õ¬ Ö†Õ¡ÕµÕ¬Õ« Õ¡Õ¶Õ¸Ö‚Õ¶:
+type_label_image=Õ¶Õ¯Õ¡Ö€
+remove_subscription_warning=Ô»Ö€Õ¸ÕžÖ„ Õ¸Ö‚Õ¦Õ¸Ö‚Õ´ Õ¥Ö„ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ¡ÕµÕ½ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨:
+type_label_other=Õ¡Õ¶Õ°Õ¡ÕµÕ¿
+mobile_menu_enable=ABP: Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬
+type_label_media=Õ¡Õ¸Ö‚Õ¤Õ«Õ¸/Õ¾Õ«Õ¤Õ¥Õ¸
+mobile_menu_disable_site=ABP: Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ ?1?-Õ¸Ö‚Õ´
+elemhideGroup_title=Ô·Õ¬Õ¥Õ´Õ¥Õ¶Õ¿Õ¨ Õ©Õ¡Ö„ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ¯Õ¡Õ¶Õ¸Õ¶Õ¶Õ¥Ö€
+mobile_menu_enable_site=ABP: Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ ?1?-Õ¸Ö‚Õ´
+type_label_elemhide=Õ©Õ¡Ö„Õ¶Õ¾Õ¡Õ®
+newGroup_title=Õ†Õ¸Ö€ Ö†Õ«Õ¬Õ¿Ö€Õ« Õ­Õ¸Ö‚Õ´Õ¢
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/overlay.dtd
new file mode 100644
index 0000000..23482ce
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Ô±ÕµÕ¸">
+<!ENTITY notification.button.no "&amp;ÕˆÕ¹">
+<!ENTITY sync.label "&amp;ÕÕ«Õ¶Ö„Ö€Õ¸Õ¶Õ¡ÖÕ¶Õ¥Õ¬ Adblock Plus-Õ« Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€Õ¨">
+<!ENTITY whitelist.site.label "Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ ?1?-Õ¸Ö‚Õ´">
+<!ENTITY filters.label "Õ–Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´ (&amp;F)">
+<!ENTITY disable.label "Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ¡Õ´Õ¥Õ¶Õ¸Ö‚Ö€">
+<!ENTITY objecttab.title "Õ–Õ«Õ¬Õ¿Ö€Õ¥Õ¬">
+<!ENTITY objecttab.tooltip "ÕÕ¥Õ²Õ´Õ¥Õ¬ «Adblock Plus»ով Õ¡ÕµÕ½ Ö…Õ¢ÕµÕ¥Õ¯Õ¿Õ¨ Ö†Õ«Õ¬Õ¿Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€">
+<!ENTITY menuitem.label "Ad&amp;block Plus">
+<!ENTITY objecttabs.label "Õ–Õ«Õ¬Õ¿Ö€Õ¥Õ¬Õ¸Ö‚ &amp;Õ¯Õ¸Õ³Õ¡Õ¯Õ¶Õ¥Ö€ Flash-Õ« Ö‡ Java-Õ« Õ°Õ¡Õ´Õ¡Ö€">
+<!ENTITY sendReport.label "ÕÕ¥Õ²Õ¥Õ¯Õ¡ÖÕ¶Õ¥Õ¬ Õ¡ÕµÕ½ Õ§Õ»Õ« ÕºÖ€Õ¸Õ¢Õ¬Õ¥Õ´Õ« Õ´Õ¡Õ½Õ«Õ¶ (&amp;R)">
+<!ENTITY whitelist.page.label "Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ´Õ«Õ¡ÕµÕ¶ Õ¡ÕµÕ½ Õ§Õ»Õ« Õ°Õ¡Õ´Õ¡Ö€">
+<!ENTITY context.image.label "Adblock` Õ–Õ«Õ¬Õ¿Ö€Õ¥Õ¬ Õ†Õ¯Õ¡Ö€Õ¨">
+<!ENTITY counthits.label "Õ€Õ¡Õ·Õ¾Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ« Õ½Õ¿Õ¡Õ¿Õ«Õ½Õ¿Õ«Õ¯Õ¡Õ¶ (&amp;h)">
+<!ENTITY opensidebar.label "Ô²Õ¡ÖÕ¥Õ¬ Ö†Õ«Õ¬&amp;Õ¿Ö€Õ¾Õ¸Õ² Õ¿Õ¡Ö€Ö€Õ¥Ö€Õ¨">
+<!ENTITY notification.button.close "&amp;Õ“Õ¡Õ¯Õ¥Õ¬">
+<!ENTITY contribute.label "Ô±Õ»Õ¡Õ¯ÖÕ¥Õ¬ Adblock Plus-Õ«Õ¶">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock` Õ–Õ«Õ¬Õ¿Ö€Õ¥Õ¬ Õ–Ö€Õ¥ÕµÕ´Õ¨">
+<!ENTITY blocked.tooltip "Ô±ÕµÕ½ Õ§Õ»Õ« Ö†Õ«Õ¬Õ¿Ö€Õ¾Õ¡Õ® Õ¿Õ¡Ö€Ö€Õ¥Ö€Õ¨`">
+<!ENTITY hideplaceholders.label "Õ‘Õ¸Ö‚ÕµÖ Õ¹Õ¿Õ¡Õ¬ Õ¡Ö€Õ£Õ¥Õ¬Õ¾Õ¡Õ® Õ§Õ¬Õ¥Õ´Õ¥Õ¶Õ¿Õ¶Õ¥Ö€Õ« Õ¿Õ¥Õ²Õ¨">
+<!ENTITY showinstatusbar.label "Õ‘Õ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ &amp;Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ¿Õ¸Õ²Õ¸Ö‚Õ´">
+<!ENTITY sidebar.title "Ô±ÕµÕ½ Õ§Õ»Õ« Ö†Õ«Õ¬Õ¿Ö€Õ¾Õ¸Õ² Õ¿Õ¡Ö€Ö€Õ¥Ö€Õ¨">
+<!ENTITY options.label "&amp;Ô¸Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€">
+<!ENTITY context.object.label "Adblock` Õ–Õ«Õ¬Õ¿Ö€Õ¥Õ¬ Õ•Õ¢ÕµÕ¥Õ¯Õ¿Õ¨">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: ÕŽÕ¥Ö€Õ¡Õ¯Õ¿Õ«Õ¾Õ¡ÖÕ¶Õ¥Õ¬ Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´">
+<!ENTITY filters.tooltip "Ô±Õ´Õ¥Õ¶Õ¡Õ¡Õ¯Õ¿Õ«Õ¾ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨`">
+<!ENTITY closesidebar.label "Õ“Õ¡Õ¯Õ¥Õ¬ Ö†Õ«Õ¬&amp;Õ¿Ö€Õ¾Õ¸Õ² Õ¿Õ¡Ö€Ö€Õ¥Ö€Õ¨">
+<!ENTITY showintoolbar.label "Õ‘Õ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ &amp;Õ£Õ¸Ö€Õ®Õ«Ö„Õ¡Õ·Õ¡Ö€Õ¸Ö‚Õ´">
+<!ENTITY status.tooltip "ÕŽÕ«Õ³Õ¡Õ¯Õ¨.">
+<!ENTITY context.media.label "Adblock` Õ–Õ«Õ¬Õ¿Ö€Õ¥Õ¬ Ô±Õ¸Ö‚Õ¤Õ«Õ¸/ÕŽÕ«Õ¤Õ¥Õ¸">
+<!ENTITY subscription.update.label "Ô¹Õ¡Ö€Õ´Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/sendReport.dtd
new file mode 100644
index 0000000..28dfde3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Õ€Õ¥Õ¿Ö„Õ¡ÕµÕ¬ (&amp;U)">
+<!ENTITY issues.disabledgroups.description "Õ€Õ¥Õ¿Õ¥Ö‚ÕµÕ¡Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨/Õ­Õ´Õ¢Õ¥Ö€Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ¥Õ¶, Õ½Õ¡Õ¯Õ¡ÕµÕ¶ Õ¶Ö€Õ¡Õ¶Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¡Õ¦Õ¤Õ¥ÖÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¸Ö‚Õ¶Õ¥Õ¶Õ¡Õ¬ Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´:">
+<!ENTITY showData.label "Õ‘Õ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus-Õ¨ Õ·Õ¡Õ¿ Õ§ Õ¡Ö€Õ£Õ¥Õ¬Õ¸Ö‚Õ´">
+<!ENTITY issues.change.description "ÕÕ¥Ö€ Õ¯Õ¸Õ¶Ö†Õ«Õ£Õ¸Ö‚Ö€Õ¡ÖÕ«Õ¡Õ¶ ÖƒÕ¸Õ­Õ¾Õ¥Õ¬ Õ§: Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¾Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ Õ§Õ»Õ¨ Ö‡ Õ©Õ¥Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ¥Ö‚ Õ°Õ¡ÕµÕ¿Õ¶Õ¥Õ¬, Õ¥Õ©Õ¥ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ«Ö ÕºÖ€Õ¸Õ¢Õ¬Õ¥Õ´Õ¨ Õ¹Õ« Õ¬Õ¸Ö‚Õ®Õ¾Õ¸Ö‚Õ´:">
+<!ENTITY email.label "E&amp;mailÕ">
+<!ENTITY issues.openPreferences.label "Ô²Õ¡ÖÕ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€Õ¨">
+<!ENTITY sendPage.confirmation "ÕÕ¥Ö€ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨ ÕºÕ¡Õ°ÕºÕ¡Õ¶Õ¾Õ¥Õ¬ Õ§: Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¡ÕµÕ¶ Õ°Õ¥Õ¿Õ¥Ö‚ÕµÕ¡Õ¬ Õ°Õ¡Õ½ÖÕ¥Õ¸Õ¾Õ">
+<!ENTITY copyLink.label "Ô¿Ö€Õ¯Õ¶Õ¡Õ¯Õ¥Õ¬ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ« Õ°Õ²Õ¸Ö‚Õ´Õ¨">
+<!ENTITY issues.nofilters.description "Adblock Plus-Õ¨ Õ¹Õ« Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¸Ö‚Õ´ Õ¸Õ¹Õ«Õ¶Õ¹ Õ¨Õ¶Õ©Õ¡ÖÕ«Õ¯ Õ§Õ»Õ¸Ö‚Õ´: ÕŠÖ€Õ¸Õ¢Õ¬Õ¥Õ´Õ¨ Õ¸Ö€Õ¨ Õ¥Ö„ Õ¡Õ´Õ¥Õ¶Õ¡ÕµÕ¶ Õ°Õ¡Õ¾Õ¡Õ¶Õ¡Õ¯Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢, Õ¯Õ¡ÕºÕ¾Õ¡Õ® Õ¹Õ§ Adblock Plus.">
+<!ENTITY sendPage.knownIssue "ÕÕ¥Ö€ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ® Õ°Õ¡Ö€ÖÕ¨ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ§ Õ¡Ö€Õ¤Õ¥Õ¶ Õ°Õ¡ÕµÕ¿Õ¶Õ« Õ§: Ô¼Ö€Õ¡ÖÕ¸Ö‚ÖÕ«Õ¹ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ">
+<!ENTITY typeSelector.other.description "Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ¡ÕµÕ½ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¨, Õ¥Õ©Õ¥ Õ¯Õ¡Õ½Õ¯Õ¡Õ®Õ¸Ö‚Õ´ Õ¥Ö„, Õ´Õ« ÕºÖ€Õ¸Õ¢Õ¬Õ¥Õ´Õ¨ Adblock Plus-Õ« Õ°Õ¥Õ¿ Õ§ Õ¸Õ¹ Õ©Õ¥ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ«:">
+<!ENTITY issues.disabledgroups.enable.label "Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ / Õ­Õ¸Ö‚Õ´Õ¢Õ¨">
+<!ENTITY typeWarning.override.label "ÔµÕ½ Õ°Õ¡Õ½Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¥Õ´ Õ¥Ö‚ Õ¸Ö‚Õ¦Õ¸Ö‚Õ´ Õ¥Õ´ Õ¡ÕµÕ¶Õ¸Ö‚Õ¡Õ´Õ¥Õ¶Õ¡ÕµÕ¶Õ«Õ¾ Õ¶Õ¥Ö€Õ¯Õ¡ÕµÕ¡ÖÕ¶Õ¥Õ¬ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨ (&amp;s)">
+<!ENTITY issues.disabled.enable.label "Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Adblock Plus-Õ¨">
+<!ENTITY update.fixed.description "Õ–Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ©Õ¡Ö€Õ´Õ¡ÖÕ¸Ö‚Õ´Õ¨ Õ¬Õ¸Ö‚Õ®Õ¥Ö ÕÕ¥Ö€ Õ­Õ¶Õ¤Õ«Ö€Õ¨:Ô¹Õ¡Ö€Õ´Õ¡ÖÖ€Õ¥Õ›Ö„ Õ§Õ»Õ¨Õ Õ°Õ¡Õ´Õ¸Õ¦Õ¾Õ¥Õ¬Õ¸Ö‚ Õ¤Ö€Õ¡Õ¶Õ¸Ö‚Õ´:Ô½Õ¶Õ¤Ö€Õ« Õ¯Ö€Õ¯Õ¶Õ¾Õ¥Õ¬Õ¸Ö‚ Õ¤Õ¥ÕºÖ„Õ¸Ö‚Õ´ Õ¤Õ«Õ´Õ¥Õ›Ö„ Õ¯Ö€Õ¯Õ«Õ¶:">
+<!ENTITY anonymous.label "Ô±Õ¶Õ°Õ¡ÕµÕ¿ Ö†Õ«Õ¬Õ¿Õ¥Ö€">
+<!ENTITY reloadButton.label "ÕŽÕ¥Ö€Õ¡Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ Õ§Õ»Õ¨">
+<!ENTITY recentReports.clear.label "Õ€Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ (&amp;R)">
+<!ENTITY typeSelector.description "Ô±ÕµÕ½ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶Õ¨ Ö…Õ£Õ¶Õ¸Ö‚Õ´ Õ§ Õ¯Õ¡Õ¿Õ¡Ö€Õ¥Õ¬ Adblock Plus-Õ« Õ­Õ¶Õ¤Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Ö„Õ¡ÕµÕ¬Õ¥Ö€Õ¶. Õ†Õ¡Õ­ Õ¨Õ¶Õ¿Ö€Õ¥Ö„ Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´ Õ±Õ¥Ö€ Õ¸Ö‚Õ¶Õ¥ÖÕ¡Õ® Õ­Õ¶Õ¤Ö€Õ« Õ¿Õ¥Õ½Õ¡Õ¯Õ¨">
+<!ENTITY screenshot.remove.label "Õ€Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ¡Õ¶ÖÕ¡Õ¶Õ¯Õ¡Õ¬Õ« Õ¢Õ¡ÕªÕ«Õ¶Õ¶Õ¥Ö€ (&amp;R)">
+<!ENTITY issues.ownfilters.description "Ô±ÕµÕ½ Õ§Õ»Õ«Õ¶ Õ¯Õ«Ö€Õ¡Õ¼Õ¾Õ¡Õ® Õ¸Ö€Õ¸Õ· Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¾Õ¡Õ® Õ¥Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Õ²Õ« Õ¯Õ¸Õ²Õ´Õ«Ö: Ô±Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Ö„ Õ¤Ö€Õ¡Õ¶Ö„ Õ¡ÕµÕ¤ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨, Õ¸Ö€Õ¸Õ¶Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¡Õ¼Õ¡Õ»Õ¡ÖÖ€Õ¥Õ¬ ÕºÖ€Õ¸Õ¢Õ¬Õ¥Õ´Õ¨:">
+<!ENTITY update.inProgress.description "Adblock Plus-Õ¨ ÕºÕ«Õ¿Õ« Õ©Õ¡Ö€Õ´Õ¡ÖÕ¶Õ« ÕÕ¥Ö€ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨Õ Õ°Õ¡Õ´Õ¸Õ¦Õ¾Õ¥Õ¬Õ¸Ö‚, Õ¸Ö€ Õ­Õ¶Õ¤Õ«Ö€Õ¨ Õ¹Õ« Õ¬Õ¸Ö‚Õ®Õ¾Õ¸Ö‚Õ´:Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ½ÕºÕ¡Õ½Õ¥Ö„...">
+<!ENTITY sendPage.retry.label "Õ†Õ¸Ö€Õ«Ö Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬">
+<!ENTITY data.label "ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ (&amp;p)">
+<!ENTITY recentReports.label "ÕÕ¥Ö€ Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ¶Õ¥Ö€Õ¯Õ¡ÕµÕ¡ÖÕ¾Õ¡Õ® Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨">
+<!ENTITY typeWarning.description "Ô´Õ¸Ö‚Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ°Õ¡ÕµÕ¿Õ¶Õ¥Õ¬ Adblock Plus-Õ« ÕºÖ€Õ¸Õ¢Õ¬Õ¥Õ«Õ´Õ« Õ´Õ¡Õ½Õ«Õ¶, Õ¸Õ¹ Õ©Õ¥ Õ¯Õ¡ÕºÕ¾Õ¡Õ® Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ°Õ¥Õ¿: Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¶Õ¯Õ¡Õ¿Õ« Õ¸Ö‚Õ¶Õ¥Õ¶Õ¡Õ¬, Õ¸Ö€ Õ¶Õ´Õ¡Õ¶ Õ°Õ¡Ö€ÖÕ¥Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ¬Õ¡Õ¾Õ¡Õ£Õ¸Ö‚ÕµÕ¶ Õ¿Õ¥Õ²Õ¨ [link]Adblock Plus Ö†Õ¸Ö€Õ¸Ö‚Õ´[/link]-Õ¶ Õ§: Ô´Õ¸Ö‚Ö„ ÕºÕ¥Õ¿Ö„ Õ§ Ö…Õ£Õ¿Õ¾Õ¥Ö„ Õ¡ÕµÕ½ Õ´Õ«Õ»Õ¸ÖÕ«Ö Õ´Õ«Õ¡ÕµÕ¶ Ö„Õ¶Õ¶Õ¡Ö€Õ¯Õ¸Ö‚Õ´Õ¨ Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€, Ö„Õ¡Õ¶Õ« Õ¸Ö€ Õ¸Õ¹ Õ¸Ö„ Õ¹Õ« Õ¶Õ¯Õ¡Õ¿Õ« ÕÕ¥Ö€ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨ Õ¥Õ©Õ¥ Ô´Õ¸Ö‚Ö„ Õ¹Õ¿Ö€Õ¡Õ´Õ¡Õ¤Ö€Õ¥Ö„ Õ°Õ²Õ¸Ö‚Õ´ Õ¥Õ¶ Õ¤Õ¥ÕºÕ« Õ¡ÕµÕ¶: Ô±Õ¾Õ¿Õ¸Õ´Õ¡Õ¿ Õ¯Õ¥Ö€ÕºÕ¸Õ¾ Õ£Õ¥Õ¶Õ¥Ö€Õ¡ÖÕ¾Õ¡Õ® Õ°Õ²Õ¸Ö‚Õ´ Õ¯Õ¿Ö€Õ¡Õ´Õ¡Õ¤Ö€Õ¾Õ« Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨ Õ¶Õ¥Ö€Õ¯Õ¡ÕµÕ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚Ö Õ°Õ¥Õ¿Õ¸:">
+<!ENTITY issues.disabled.description "Adblock Plus-Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§, Õ¡ÕµÕ¶ Õ¹Õ« Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¸Ö‚Õ´ Õ¸Ö€Õ¥Ö‚Õ§ Õ¢Õ¡Õ¶ Õ¡ÕµÕ½ Õ¾Õ«Õ³Õ¡Õ¯Õ¸Ö‚Õ´:">
+<!ENTITY attachExtensions.label "Ô±Õ´Ö€Õ¡ÖÕ¶Õ¥Õ¬ Õ¡Õ¯Õ¿Õ«Õ¾ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« ÖÕ¸Ö‚ÖÕ¡Õ¯Õ¨ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ«Õ¶, Õ¡ÕµÕ¶ Õ¤Õ¥ÕºÖ„Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Õ©Õ¥ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ­Õ¶Õ¤Ö€Õ« ÕºÕ¡Õ¿Õ³Õ¡Õ¼ Õ¥Õ¶:">
+<!ENTITY issues.nosubscriptions.add.label "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ« Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶">
+<!ENTITY issues.disabledfilters.enable.label "Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¨">
+<!ENTITY issues.override.label "Ô¿Õ¸Õ¶Ö†Õ«Õ£Õ¸Ö‚Ö€Õ¡ÖÕ«Õ¡Õ¶ Õ³Õ«Õ·Õ¿ Õ§, Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬ Õ°Õ¡ÕµÕ¿Õ¶Õ¥Õ¬ Õ­Õ¶Õ¤Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶">
+<!ENTITY issues.nosubscriptions.description "Ô´Õ¸Ö‚Ö„, Õ¨Õ½Õ¿ Õ¥Ö€Õ¥Ö‚Õ¸Ö‚ÕµÕ©Õ«, Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¾Õ¡Õ® Õ¹Õ¥Ö„ Õ¸Ö€Õ¥Ö‚Õ§ ÕºÕ¡Õ¿Ö€Õ¡Õ½Õ¿Õ« Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« ÖÕ¸Ö‚ÖÕ¡Õ¯Õ«, Õ¸Ö€Õ¨ Õ¡Õ¾Õ¿Õ¸Õ´Õ¡Õ¿ Õ¯Õ¥Ö€ÕºÕ¸Õ¾ Õ¯Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ« Õ¡Õ¶ÖÕ¡Õ¶Õ¯Õ¡Õ¬Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¯Õ¡ÕµÖ„Õ¥Ö€Õ¸Ö‚Õ´:">
+<!ENTITY typeSelector.falsePositive.description "Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ¡ÕµÕ½ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¨, Õ¥Õ©Õ¥ Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´ Õ¯Õ¸Ö€Õ¥Õ¬ Õ§ Õ¯Õ¡Ö€Õ¥Ö‚Õ¸Ö€ Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶, Õ¡ÕµÕ¶ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¾Õ¸Ö‚Õ´ Õ§ Õ½Õ­Õ¡Õ¬ Õ¯Õ¡Õ´ Õ¹Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¸Ö‚Õ´: Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¸Ö€Õ¸Õ·Õ¥Õ¬, Õ©Õ¥ Õ¡Ö€Õ¤ÕµÕ¸Ö„ Adblock Plus-Õ¶ Õ§ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¡Õ¾Õ¸Ö€Õ¡ÕºÕ¥Õ½ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬Õ¸Õ¾ Õ¡ÕµÕ¶:">
+<!ENTITY typeSelector.other.label "Ô±ÕµÕ¬ Õ­Õ¶Õ¤Õ«Ö€">
+<!ENTITY emailComment.label "Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ£Ö€Õ¥Õ›Ö„ Õ³Õ«Õ·Õ¿ email Õ°Õ¡Õ½ÖÕ¥Õ ÕÕ¥Õ¦ Õ°Õ¥Õ¿ Õ¯Õ¡ÕºÕ¶Õ¾Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Ö‡ Õ­Õ¶Õ¤Õ«Ö€Õ¨ Õ¬Õ¸Ö‚Õ®Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:">
+<!ENTITY issues.whitelist.remove.label "Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Adblock Plus-Õ¨ Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´">
+<!ENTITY outdatedSubscriptions.description "Ô±ÕµÕ½ Ö†Õ«Õ¬Õ¿Ö€Õ¨ Õ¹Õ« Õ©Õ¡Ö€Õ´Õ¡ÖÕ¾Õ¥Õ¬ Õ´Õ¸Õ¿ 2 Õ·Õ¡Õ¢Õ¡Õ©:Ô¹Õ¡Ö€Õ´Õ¡ÖÖ€Õ¥Õ›Ö„, Ö„Õ¡Õ¶Õ« Õ¸Ö€ Õ¤Õ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¬Õ¸Ö‚Õ®Õ¥Õ¬ Õ­Õ¶Õ¤Õ«Ö€Õ¨:Ô½Õ¶Õ¤Ö€Õ« Õ¹Õ¬Õ¸Ö‚Õ®Õ´Õ¡Õ¶ Õ¤Õ¥ÕºÖ„Õ¸Ö‚Õ´ Õ¤Õ«Õ´Õ¥Õ›Ö„ Õ¯Ö€Õ¯Õ«Õ¶:">
+<!ENTITY dataCollector.description "ÕÕºÕ¡Õ½Õ¥Ö„ Õ´Õ«Õ¶Õ¹Ö‡ Adblock Plus-Õ¨ Õ°Õ¡Õ¾Õ¡Ö„Õ« Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ տվյալներ…">
+<!ENTITY sendButton.label "ÕˆÖ‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨">
+<!ENTITY comment.label "Õ„Õ¥Õ¯Õ¶Õ¡Õ¢Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ (ÕºÕ¡Ö€Õ¿Õ¡Õ¤Õ«Ö€ Õ¹Õ§)Õ">
+<!ENTITY sendPage.errorMessage "Ô¶Õ¥Õ¯Õ¸Ö‚ÕµÖÕ« Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ´Õ¡Õ¶ ÖƒÕ¸Ö€Õ±Õ¨ Õ±Õ¡Õ­Õ¸Õ²Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ Õ½Õ­Õ¡Õ¬Õ« Õ¯Õ¸Õ¤Õ¸Õ¾Õ &quot;?1?&quot;: ÕÕ¿Õ¸Ö‚Õ£Õ¥Ö„ Õ´Õ«Õ¡ÖÕ¸Ö‚Õ´Õ¨ Õ«Õ¶Õ¿Õ¥Ö€Õ¶Õ¥Õ¿Õ«Õ¶ Õ¥Ö‚ Õ¯Ö€Õ¯Õ¶Õ¥Ö„: ÔµÕ©Õ¥ Õ­Õ¶Õ¤Õ«Ö€Õ¨ Õ¹Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¾Õ«, Õ­Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¤Õ«Õ´Õ¥Õ¬ [link]Adblock Plus Õ–Õ¸Ö€Õ¸Ö‚Õ´[/link] Õ¡Õ»Õ¡Õ¯ÖÕ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€:">
+<!ENTITY showRecentReports.label "Õ‘Õ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ¶Õ¥Ö€Õ¯Õ¡ÕµÕ¡ÖÕ¾Õ¡Õ® Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨">
+<!ENTITY commentPage.heading "Õ„Õ¥Õ¯Õ¶Õ¡Õ¢Õ¡Õ¶Õ¥Õ¬">
+<!ENTITY update.start.label "ÕÕ¯Õ½Õ¥Õ¬ Õ©Õ¡Ö€Õ´Õ¡ÖÕ¸Ö‚Õ´Õ¨ Õ°Õ«Õ´Õ¡">
+<!ENTITY issues.disabledfilters.description "Õ€Õ¥Õ¿Õ¥Ö‚ÕµÕ¡Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ¥Õ¶, Õ½Õ¡Õ¯Õ¡ÕµÕ¶ Õ¶Ö€Õ¡Õ¶Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¡Õ¦Õ¤Õ¥ÖÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¸Ö‚Õ¶Õ¥Õ¶Õ¡Õ¬ Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´:">
+<!ENTITY screenshot.description "Õ†Õ¸Ö‚ÕµÕ¶ Õ§Õ»Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¿Õ¡Ö€Õ¢Õ¥Ö€ Õ¶Õ¡ÕµÕ¾Õ¥Õ¬ Õ¿Õ¡Ö€Õ¢Õ¥Ö€ Õ´Õ¡Ö€Õ¤Õ¯Õ¡Õ¶Ö: ÔµÕ©Õ¥ Õ¤Õ¸Ö‚Ö„ ÕÕ¥Ö€ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ«Õ¶ Õ¯ÖÕ¥Ö„ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ¶Õ¯Õ¡Ö€Õ¨ Õ¤Õ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Ö…Õ£Õ¶Õ¥Õ¬ Õ´Õ¥Õ¦ Õ°Õ¡Õ½Õ¯Õ¡Õ¶Õ¡Õ¬ Õ­Õ¶Õ¤Õ«Ö€Õ¨: Ô´Õ¸Ö‚Ö„ Õ¶Õ¸Ö‚ÕµÕ¶ÕºÕ¥Õ½ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ¡Õ¶ÖÕ¡Õ¶Õ¯Õ¡Õ¬Õ« Õ¢Õ¡ÕªÕ«Õ¶Õ¶Õ¥Ö€, Õ«Õ¶Õ¹ÕºÕ¥Õ½ Õ¶Õ¡Õ¥Ö‚ Õ¶Õ·Õ¥Õ¬ Õ¡ÕµÕ¶ Õ¿Õ¡Ö€Õ¡Õ®Ö„Õ¶Õ¥Ö€Õ¨, Õ¸Ö€Õ¿Õ¥Õ² Õ¥Ö€Õ¥Ö‚Õ¸Ö‚Õ´ Õ§ Õ­Õ¶Õ¤Õ«Ö€Õ¨: Ô´Õ¡ Õ¡Õ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ½Õ¥Õ²Õ´Õ¥Ö„ Õ°Õ¡Õ´Õ¡ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶ Õ¯Õ¸Õ³Õ¡Õ¯Õ¨ Õ¥Ö‚ Õ´Õ¯Õ¶Õ«Õ¯Õ¸Õ¾ Õ¨Õ¶Õ¿Ö€Õ¥Ö„ ÕºÕ¡Õ¿Õ¯Õ¥Ö€Õ« Õ°Õ¡Õ¿Õ¾Õ¡Õ®Õ¨:">
+<!ENTITY screenshot.attach.label "Ô¿ÖÕ¥Õ¬ Õ§Õ»Õ« Õ¶Õ¯Õ¡Ö€Õ¨">
+<!ENTITY issues.whitelist.description "Adblock Plus-Õ¨ Õ¡ÕµÕªÕ´ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§ Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´: Õ„Õ«Õ¡ÖÖ€Õ¥Ö„ Õ¡ÕµÕ¶ Õ¥Ö‚ Õ¾Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¥Ö„ Õ¡ÕµÕ½ Õ§Õ»Õ¨ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬Õ¸Ö‚Ö Õ¡Õ¼Õ¡Õ» Õ­Õ¶Õ¤Ö€Õ« Õ¬Õ¸Ö‚Õ®Õ¸Ö‚Õ´Õ¡Õ¶Õ¨ Õ¡Õ»Õ¡Õ¯ÖÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus-Õ¨ Õ¹Õ« ÖƒÕ¡Õ¯Õ¸Ö‚Õ´ Õ£Õ¸Õ¾Õ¡Õ¦Õ¤Õ¨ (&amp;v)">
+<!ENTITY typeSelector.heading "Ô½Õ¶Õ¤Ö€Õ« Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ´">
+<!ENTITY anonymity.warning "Õ„Õ¥Õ¶Ö„ Õ¹Õ¥Õ¶Ö„ Õ¯Õ¡Ö€Õ¸Õ²Õ¡Õ¶Õ¡Õ¬Õ¸Ö‚ Õ¥Õ¿ Õ£Õ¡Õ¬ ÕÕ¥Õ¦ Õ´Õ¸Õ¿ Ö‡ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨ ÖÕ¡Õ®Ö€ Õ¯Õ°Õ¡Õ´Õ¡Ö€Õ¥Õ¶Ö„:">
+<!ENTITY wizard.title "ÕÕ¥Õ²Õ¥Õ¯Õ¡ÖÕ¶Õ¥Õ¬">
+<!ENTITY issues.ownfilters.disable.label "Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€(Õ¥Ö€)Õ¨">
+<!ENTITY commentPage.description "ÕÕ¥Ö„Õ½Õ¿Õ¡ÕµÕ«Õ¶ Õ¤Õ¡Õ·Õ¿Õ« Õ½Õ¿Õ¸Ö€Õ¥Ö‚ Õ©Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬ Õ´Õ¥Õ¯Õ¶Õ¡Õ¢Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ´Õ¥Õ¦ Ö…Õ£Õ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Õ Õ°Õ¡Õ½Õ¯Õ¡Õ¶Õ¡Õ¬ Õ­Õ¶Õ¤Õ«Ö€Õ¨&quot; Ô±ÕµÕ½ Ö„Õ¡ÕµÕ¬Õ¨ ÕºÕ¡Ö€Õ¿Õ¡Õ¤Õ«Ö€ Õ¹Õ§, Õ½Õ¡Õ¯Õ¡ÕµÕ¶ Õ­Õ¸Ö€Õ°Õ¸Ö‚Ö€Õ¤ Õ§ Õ¿Ö€Õ¾Õ¸Ö‚Õ´, Õ¥Õ©Õ¥ Ô½Õ¶Õ¤Õ«Ö€Õ¨ Õ¡Õ¯Õ¶Õ°Õ¡ÕµÕ¿ Õ¹Õ§: Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¶Õ¡Õ¥Ö‚ Õ¾Õ¥Ö€Õ¡Õ¶Õ¡ÕµÕ¥Õ¬ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ´Õ«Õ¶Õ¹ Õ¤Ö€Õ¡ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¸Ö‚Õ´Õ¨:">
+<!ENTITY comment.lengthWarning "Õ„Õ¥Õ¯Õ¶Õ¡Õ¢Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¥Ö€Õ¯Õ¡Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ£Õ¥Ö€Õ¡Õ¦Õ¡Õ¶ÖÕ¸Ö‚Õ´ Õ§ 1000 Õ½Õ«Õ´Õ¾Õ¸Õ¬: Õ„Õ«Õ¡ÕµÕ¶ Õ¡Õ¼Õ¡Õ»Õ«Õ¶ 1000 Õ½Õ«Õ´Õ¾Õ¸Õ¬Õ¨ Õ¯Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¾Õ«:">
+<!ENTITY typeSelector.falseNegative.description "Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ¡ÕµÕ½ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¨, Õ¥Õ©Õ¥ Õ£Õ¸Õ¾Õ¡Õ¦Õ¤Õ¨ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¾Õ¸Ö‚Õ´ Õ§, Õ¹Õ¶Õ¡ÕµÕ¡Õ® Adblock Plus Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§:">
+<!ENTITY sendPage.waitMessage "Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ½ÕºÕ¡Õ½Õ¥Õ¬, Õ´Õ«Õ¶Õ¹ Adblock Plus-Õ¨, Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ« ÕÕ¥Ö€ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨:">
+<!ENTITY dataCollector.heading "Ô²Õ¡Ö€Õ« Õ£Õ¡Õ¬Õ¸Ö‚Õ½Õ¿ ÕºÖ€Õ¸Õ¢Õ¬Õ¥Õ´Õ¶Õ¥Ö€Õ« Õ°Õ¥Õ¿Ö‡Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£">
+<!ENTITY screenshot.heading "Ô¿ÖÕ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ¶Õ¯Õ¡Ö€Õ¨">
+<!ENTITY sendPage.heading "ÕˆÖ‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨">
+<!ENTITY issues.subscriptionCount.description "Ô´Õ¸Ö‚Ö„ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¾Õ¡Õ® Õ¥Ö„ Õ¹Õ¡ÖƒÕ«Ö Õ·Õ¡Õ¿ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ«: ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ­Õ¶Õ¤Ö€Õ« ÕºÕ¡Õ¿Õ³Õ¡Õ¼ Õ¤Õ¡Õ¼Õ¶Õ¡Õ¬: Õ„Õ¥Õ¶Ö„ Õ¹Õ¥Õ¶Ö„ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ« Õ±Õ¥Ö€ Õ¢Õ¡Õ²Õ¸Ö„Õ¨ Õ­Õ¶Õ¤Ö€Õ« Õ°Õ¥Õ¿ Õ¯Õ¡ÕºÕ¾Õ¡Õ®, Ö„Õ¡Õ¶Õ« Õ¸Ö€ Õ¡Õ¶Õ°Õ¶Õ¡Ö€ Õ§ Õ¬Õ«Õ¶Õ¥Õ¬Õ¸Ö‚ ÕºÕ¡Ö€Õ¦Õ¥Õ¬ Õ¤Ö€Õ¡ Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¨: Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨, Õ©Õ¸Õ²Õ¶Õ¥Õ¬Õ¸Õ¾ Õ´Õ«Õ¡ÕµÕ¶ Õ¡Õ´Õ¥Õ¶Õ¡Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿Õ¶Õ¥Ö€Õ¨ Ö‡ Õ½Õ¿Õ¸Ö‚Õ£Õ¥Õ¬ Õ¡Ö€Õ¤ÕµÕ¸Ö„ Õ­Õ¶Õ¤Õ«Ö€Õ¨ Õ¤Õ¥Õ¼ Õ¯Õ¡:">
+<!ENTITY screenshot.mark.label "Õ†Õ·Õ¥Õ¬ Õ­Õ¶Õ¤Ö€Õ« Õ¿Õ¥Õ²Õ¨">
+<!ENTITY privacyPolicy.label "Ô±Õ¶Õ±Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« ÕºÕ¡Õ°ÕºÕ¡Õ¶Õ¸Ö‚Õ´">
+<!ENTITY issues.description "Adblock Plus-Õ¨ Õ°Õ¡ÕµÕ¿Õ¶Õ¡Õ¢Õ¥Ö€Õ¥Õ¬ Õ§ ÕºÖ€Õ¸Õ¢Õ¬Õ¥Õ´Õ¶Õ¥Ö€ Õ±Õ¥Ö€ Õ¯Õ¸Õ¶Ö†Õ«Õ£Õ¸Ö‚Ö€Õ¡ÖÕ«Õ¡ÕµÕ« Õ°Õ¥Õ¿, Õ¸Ö€Õ¸Õ¶Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ­Õ¶Õ¤Ö€Õ« ÕºÕ¡Õ¿Õ³Õ¡Õ¼ Õ¬Õ«Õ¶Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¢Õ¡Ö€Õ¤Õ¡ÖÕ¶Õ« Õ¬Õ¸Ö‚Õ®Õ¸Ö‚Õ´Õ¨:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/sidebar.dtd
new file mode 100644
index 0000000..d185321
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Õ‘Õ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ Ö…Õ¢ÕµÕ¥Õ¯Õ¿Õ¨ Õ§Õ»Õ¸Ö‚Õ´">
+<!ENTITY address.label "Õ€Õ¡Õ½ÖÕ¥Õ¶">
+<!ENTITY context.open.label "Ô²Õ¡ÖÕ¥Õ¬ Õ¶Õ¸Ö€ Ô¹Õ¡Õ¢Õ¸Ö‚Õ´">
+<!ENTITY type.label "ÕÕ¥Õ½Õ¡Õ¯Õ¨">
+<!ENTITY tooltip.filterSource.label "Õ–Õ«Õ¬Õ¿Ö€Õ« Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¨`">
+<!ENTITY noitems.label "Õ–Õ«Õ¬Õ¿Ö€Õ¾Õ¾Õ¸Õ² Õ¿Õ¡Ö€Ö€Õ¥Ö€ Õ¹Õ¯Õ¡Õ¶">
+<!ENTITY filter.label "Ô±Õ¦Õ¤Õ¸Õ² Ö†Õ«Õ¬Õ¿Ö€Õ¨">
+<!ENTITY tooltip.size.label "Õ‰Õ¡ÖƒÕ¨`">
+<!ENTITY reattach.label "Ô±Õ´Ö€Õ¡ÖÕ¶Õ¥Õ¬">
+<!ENTITY search.label "&amp;Õ“Õ¶Õ¿Ö€Õ¥Õ¬">
+<!ENTITY docDomain.thirdParty "(Õ¥Ö€Ö€Õ¸Ö€Õ¤ Õ¯Õ¸Õ²Õ´Õ«)">
+<!ENTITY filterSource.label "Õ–Õ«Õ¬Õ¿Ö€Õ« Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¨`">
+<!ENTITY tooltip.docDomain.label "Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ« Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¨`">
+<!ENTITY context.copy.label "Ô¿Ö€Õ¯Õ¶Õ¥Õ¬ Õ¿Õ¡Ö€Ö€Õ« Õ°Õ¡Õ½ÖÕ¥Õ¶">
+<!ENTITY tooltip.type.label "ÕÕ¥Õ½Õ¡Õ¯Õ¨`">
+<!ENTITY context.disablefilter.label "Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¨ ?1?">
+<!ENTITY context.copyFilter.label "Ô¿Ö€Õ¯Õ¶Õ¡Õ¯Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¨">
+<!ENTITY context.block.label "Õ–Õ«Õ¬Õ¿Ö€Õ¥Õ¬ Õ¡ÕµÕ½ Õ¿Õ¡Ö€Ö€Õ¨">
+<!ENTITY context.enablefilter.label "ÕŽÕ¥Ö€Õ¡Õ¯Õ¿Õ«Õ¾Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¨ ?1?">
+<!ENTITY detach.label "Ô±Õ¶Õ»Õ¡Õ¿ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶">
+<!ENTITY whitelisted.label "Ô²Õ¡ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶">
+<!ENTITY context.disablefilteronsite.label "Ô±Ö€Õ£Õ¥Õ¬Õ¥Õ¬ Õ¡ÕµÕ½ Ö†Õ«Õ¬Õ¿Ö€Õ¨ ?1? -Õ¸Ö‚Õ´">
+<!ENTITY detached.title "Adblock Plus - Õ–Õ«Õ¬Õ¿Ö€Õ¾Õ¾Õ¸Õ² Õ¿Õ¡Ö€Ö€Õ¥Ö€ (Ô±Õ¶Õ»Õ¡Õ¿)">
+<!ENTITY docDomain.firstParty "(Õ¸Ö‚Õ²Õ«Õ² Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€)">
+<!ENTITY tooltip.type.whitelisted "(Õ¢Õ¡ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶)">
+<!ENTITY tooltip.filter.label "Ô±Õ¦Õ¤Õ¸Õ² Ö†Õ«Õ¬Õ¿Ö€Õ¨`">
+<!ENTITY tooltip.filter.disabled "(Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ®)">
+<!ENTITY context.editfilter.label "Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬ Ô±Õ¦Õ¤Õ¸Õ² Ö†Õ«Õ¬Õ¿Ö€Õ¨">
+<!ENTITY tooltip.type.blocked "(Ö†Õ«Õ¬Õ¿Ö€Õ¾Õ¡Õ®)">
+<!ENTITY size.label "Õ‰Õ¡ÖƒÕ¨">
+<!ENTITY context.whitelist.label "Ô±ÕµÕ½ Õ¿Õ¡Ö€Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Ô²Õ¡ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬">
+<!ENTITY context.selectAll.label "Ô¼Ö€Õ«Õ¾ Ô¸Õ¶Õ¿Ö€Õ¥Õ¬">
+<!ENTITY state.label "ÕŽÕ«Õ³Õ¡Õ¯Õ¨">
+<!ENTITY docDomain.label "Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ« Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¨">
+<!ENTITY tooltip.address.label "Õ€Õ¡Õ½ÖÕ¥Õ¶`">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/subscriptionSelection.dtd
new file mode 100644
index 0000000..77ecf84
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Ô±Õ¾Õ¥Õ¬Õ¡Ö&amp;Õ¶Õ¥Õ¬ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¶Õ¡Ö‡ &quot;?1?&quot; Ö†Õ«Õ¬Õ¿Ö€Õ«Õ¶">
+<!ENTITY list.download.failed "«Adblock Plus»-Õ¨ Õ¹Õ¯Õ¡Ö€Õ¸Õ²Õ¡ÖÕ¡Õ¾ Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ¢Õ¡ÕªÕ¡Õ¶Õ¡Ö€Õ¤Õ¸Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« ÖÕ¸Ö‚ÖÕ¡Õ¯Õ¨">
+<!ENTITY list.download.retry "Ô¿Ö€Õ¯Õ«Õ¶ Õ“Õ¸Ö€Õ±Õ¥Õ¬">
+<!ENTITY title.label "Ô²&amp;Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¡Õ¾Õ¡Õ¶Õ¸Ö‚Õ´Õ¨`">
+<!ENTITY list.download.website "Ô±ÕµÖÕ¥Õ¬Õ¥Õ¬ Õ¯Õ¡ÕµÖ„">
+<!ENTITY supplementMessage "Ô±ÕµÕ½ Ö†Õ«Õ¬Õ¿Ö€Õ« Õ¢Õ¡ÕªÕ¡Õ¶Õ¡Ö€Õ¤Õ¸Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ°Õ¡Õ³Õ¡Õ­ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¾Õ¸Ö‚Õ´ Õ§ &quot;?1?&quot;-Õ« Õ°Õ¥Õ¿, Õ¸Ö€Õ¨ Õ¤Õ¸Ö‚Ö„ Õ¹Õ¥Ö„ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´:">
+<!ENTITY viewList.label "Õ†Õ¡ÕµÕ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨">
+<!ENTITY visitHomepage.label "Ô±ÕµÖÕ¥Õ¬Õ¥Õ¬ Õ¯Õ¡ÕµÖ„">
+<!ENTITY addSubscription.label "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶">
+<!ENTITY dialog.title "Ô²Õ¡Ö€Õ« Õ£Õ¡Õ¬Õ¸Ö‚Õ½Õ¿ Adblock Plus">
+<!ENTITY location.label "Õ–Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« &amp;Õ°Õ¡Õ½ÖÕ¥Õ¶`">
+<!ENTITY fromWeb.description "Õ€Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Ö„ Õ¸Ö€ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶: Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ ÖƒÕ¸Õ²Õ¥Õ¬ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¾Õ¥Ö€Õ¶Õ¡Õ£Õ«Ö€Õ¨ Õ¯Õ¡Õ´ Õ°Õ¡Õ½ÖÕ¥Õ¶ Õ´Õ«Õ¹Ö‡ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬Õ¨:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/composer.dtd
new file mode 100644
index 0000000..867e6ca
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "&amp;pada akhir dari alamat">
+<!ENTITY domainRestriction.label "Membatasi pada &amp; domain:">
+<!ENTITY collapse.default.no.label "Gunakan default (tidak)">
+<!ENTITY firstParty.label "&amp;Hanya untuk pihak pertama">
+<!ENTITY preferences.label "&amp;Tampilkan filter yang ada...">
+<!ENTITY pattern.label "Mencari pola">
+<!ENTITY thirdParty.label "Hanya pihak ke&amp;tiga">
+<!ENTITY filter.label "&amp;Tapis baru:">
+<!ENTITY collapse.label "&amp;tutup yang diblokir:">
+<!ENTITY match.warning "Pola yang Anda masukkan tidak lagi cocok dengan masuk daftar alamat yang akan diblokir/daftar putih dan tidak akan berpengaruh sama sekali.">
+<!ENTITY anchor.start.label "&amp;pada awal alamat">
+<!ENTITY matchCase.label "&amp;Sama persis">
+<!ENTITY custom.pattern.label "&amp;Kustom:">
+<!ENTITY unselectAllTypes.label "Tidak memilih apapun">
+<!ENTITY type.whitelist.label "Aturan p&amp;engabaian">
+<!ENTITY regexp.warning "Pola yang Anda masukkan akan dianggap sebagai regular expression yang tidak akan efisien untuk dapat diproses oleh Adblock Plus dan mungkin akan memperlambat pengalaman browsing Anda. Jika Anda tidak berniat untuk menggunakan regular expression, tambahkan tanda bintang (*) diakhir pola.">
+<!ENTITY dialog.title "Tambah aturan filter Adblock Plus">
+<!ENTITY basic.label "Tampilan dasar">
+<!ENTITY type.filter.label "&amp;Filter yang diblokir">
+<!ENTITY types.label "Terapkan untuk jenis:">
+<!ENTITY shortpattern.warning "Pola yang Anda masukkan terlalu pendek untuk dapat disempurnakan dan mungkin memperlambat pengalaman berselancar Anda. Anda disarankan untuk memilih lagi karakter yang lebih panjang untuk saringan ini untuk memungkinkan Adblock Plus mengolah saringan agar lebih efisien.">
+<!ENTITY collapse.yes.label "Ya">
+<!ENTITY anchors.label "Hanya menerima pola:">
+<!ENTITY collapse.default.yes.label "Gunakan default (Ya)">
+<!ENTITY domainRestriction.help "Gunakan pilihan ini untuk menentukan satu atau lebih domain yang dipisahkan oleh sebuah garis bar(|). Filter hanya akan diterapkan pada domain yang dipilih. Sebuah tilde (~) sebelum nama domain menunjukkan bahwa filter tidak akan diterapkan pada domain tersebut.">
+<!ENTITY accept.label "Tambahkan filter">
+<!ENTITY options.label "Pilihan">
+<!ENTITY disabled.warning "Adblock Plus sedang dimatikan. Anda masih dapat menambahkan filter tetapi mereka tidak akan diterapkan kecuali Anda [link] mengaktifkan Adblock Plus [/link].">
+<!ENTITY anchor.start.flexible.label "&amp;pada awal nama domain">
+<!ENTITY collapse.no.label "Tidak">
+<!ENTITY selectAllTypes.label "Pilih Semua">
+<!ENTITY advanced.label "Tampilan lanjutan">
+<!ENTITY pattern.explanation "Pola dapat menjadi bagian dari alamat; tanda bintang (*) bertindak sebagai wildcard. Filter hanya akan diterapkan ke alamat yang cocok dengan pola yang diberikan.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/filters.dtd
new file mode 100644
index 0000000..6136b99
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Semua penyesuaian penyaring Anda akan digantikan oleh isi berkas yang dipilih. Apakah Anda ingin memproses?">
+<!ENTITY slow.column "Penyaring Slo&amp;w">
+<!ENTITY enabled.column "Hidupka&amp;n">
+<!ENTITY subscription.lastDownload.checksumMismatch "Gagal, checksum berbeda">
+<!ENTITY noFiltersInGroup.text "Kelompok yang dipilih kosong.">
+<!ENTITY subscription.actions.label "Tindakan">
+<!ENTITY filter.selectAll.label "Pilih semua">
+<!ENTITY backupButton.label "&amp;Cadangan dan Pengembalian">
+<!ENTITY restore.minVersion.warning "Peringatan: berkas telah dibuat dengan versi Adblock Plus yang lebih baru. Anda harus memperbarui ke versi Adblock Plus terbaru sebelum mengembalikan dari berkas ini.">
+<!ENTITY restore.error "Data berkas tidak bisa diproses, mungkin ini bukan berkas cadangan Adblock Plus?">
+<!ENTITY sort.ascending.label "Urutkan dari A &gt; Z">
+<!ENTITY sort.label "&amp;Urutkan dari">
+<!ENTITY subscription.source.label "Daftar penyaring">
+<!ENTITY hitcount.column "Sasaran">
+<!ENTITY noFilters.text "Anda belum memiliki penyesuaian penyaring apapun.">
+<!ENTITY backup.custom.title "Hanya penyesuaian penyaring">
+<!ENTITY subscription.external.label "Diperbarui oleh ekstensi lain">
+<!ENTITY subscription.delete.label "Hapus">
+<!ENTITY noGroupSelected.text "Anda perlu memilih kelompok penyaring sebelum penyaring dapat ditampilkan.">
+<!ENTITY filter.cut.label "Potong">
+<!ENTITY restore.default.label "Mengembalikan cadangan dari ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Mengunduh…">
+<!ENTITY subscriptions.tab.label "Penyaring langganan">
+<!ENTITY sort.descending.label "Urutkan dari Z &gt; A">
+<!ENTITY filters.remove.warning "Apakah Anda sungguh ingin menghapus semua penyaring yang dipilih?">
+<!ENTITY filter.delete.label "Hapus">
+<!ENTITY addSubscriptionAdd.label "Tambahkan">
+<!ENTITY viewMenu.label "Lihat">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY addSubscriptionCancel.label "Batal">
+<!ENTITY subscription.enabled.label "Diaktifkan">
+<!ENTITY noSubscriptions.text "Anda belum menambahkan penyaring langganan apapun. Adblock Plus tidak akan memblok apapun tanpa penyaring, silahkan gunakan &quot;Tambahkan penyaring langganan&quot; untuk menambahkan.">
+<!ENTITY subscription.update.label "Perbarui penyaring">
+<!ENTITY dialog.title "Preferensi Penyaring Adblock Plus">
+<!ENTITY addFilter.label "Tambahkan penyaring">
+<!ENTITY subscription.minVersion.warning "Penyaring langganan memerlukan versi Adblock Plus yang lebih baru, Anda harus memperbarui ke versi Adblock Plus terbaru.">
+<!ENTITY subscription.lastDownload.invalidURL "Gagal, bukan alamat yang benar">
+<!ENTITY backup.error "Ada kesalahan penulisan penyaring ke berkas. Pastikan berkas tidak diproteksi atau sedang digunakan aplikasi lain.">
+<!ENTITY filter.moveUp.label "Ke atas">
+<!ENTITY addGroup.label "Tambahkan penyaring dan kelompok">
+<!ENTITY filter.edit.label "Sunting">
+<!ENTITY subscription.showHideFilters.label "Tampilkan/sembunyikan penyaring">
+<!ENTITY acceptableAds2.label "Ijinkan beberapa iklan yang bukan dan mengganggu">
+<!ENTITY addSubscriptionOther.label "Tambahkan skrip yang berbeda">
+<!ENTITY close.label "Tutup">
+<!ENTITY sort.none.label "&amp;Belum diurutkan">
+<!ENTITY filter.actions.label "Tindakan penyaring">
+<!ENTITY filter.copy.label "Salin">
+<!ENTITY filter.moveDown.label "Ke bawah">
+<!ENTITY filter.resetHitCounts.label "Reset kembali statistik kunjungan">
+<!ENTITY readMore.label "Baca lebih lanjut">
+<!ENTITY subscription.moveUp.label "Ke atas">
+<!ENTITY addSubscription.label "Tambahkan penyaring">
+<!ENTITY subscription.homepage.label "Beranda">
+<!ENTITY backup.complete.title "Semua penyaring dan langganan">
+<!ENTITY restore.own.label "Mengembalikan cadangan sendiri">
+<!ENTITY restore.complete.warning "Semua preferensi penyaring Anda akan digantikan oleh isi berkas yang dipilih. Apakah Anda ingin memproses?">
+<!ENTITY filters.tab.label "Penyesuaian penyaring">
+<!ENTITY backup.label "Membuat cadangan baru">
+<!ENTITY find.label "Cari">
+<!ENTITY subscription.moveDown.label "Ke bawah">
+<!ENTITY subscription.lastDownload.connectionError "Gagal, gagal mengunduh">
+<!ENTITY subscription.lastDownload.success "Sukses">
+<!ENTITY subscription.lastDownload.invalidData "Gagal, bukan daftar penyaring yang benar">
+<!ENTITY filter.paste.label "Tempel">
+<!ENTITY subscription.disabledFilters.enable "Aktifkan penyaring yang dinonaktifkan">
+<!ENTITY lasthit.column "Sasaran terakhir">
+<!ENTITY subscription.editTitle.label "Sunting judul">
+<!ENTITY subscription.disabledFilters.warning "Beberapa penyaring di layanan langganan ini dinonaktifkan.">
+<!ENTITY filter.column "Aturan penyaring">
+<!ENTITY subscription.lastDownload.label "Unduhan terakhir:">
+<!ENTITY viewList.label "Lihat daftar">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/firstRun.properties
new file mode 100644
index 0000000..573f16c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Menjelajah secara rahasia dengan menonaktifkan pelacakan - menyembunyikan jejak Anda dari perusahaan iklan yang akan melacak setiap langkah Anda.
+firstRun_toggle_off=OFF
+firstRun_feature_tracking=Nonaktifkan Pelacakan
+firstRun_feature_malware=Memblokir malware
+firstRun_title=Adblock Plus telah diinstal
+firstRun_acceptableAdsExplanation=Kami ingin mendorong situs web untuk menggunakan iklan langsung yang tidak mengganggu. Itu sebabnya kami telah menetapkan <a>Peraturan ketat</a> untuk mengenali iklan yang bisa diterima, yang akan ditampilkan di dalam pengaturan default. Jika Anda masih ingin memblokir setiap iklan, Anda dapat <a>menonaktifkan</a> ini dalam beberapa detik.
+firstRun_toggle_on=ON
+firstRun_contributor_credits=Kredit Kontributor
+firstRun_dataCorruptionWarning=Apakah halaman ini tetap muncul? <a>Klik disini!</a>
+firstRun_acceptableAdsHeadline=Sekarang iklan yang mengganggu akan diblokir
+firstRun_share=Beritahu teman Anda
+firstRun_share_headline=<a>Bantulah kami</a> dalam membuat web menjadi tempat yang lebih baik
+firstRun_features=Adblock Plus dapat melakukan lebih dari sekedar pemblokiran iklan
+firstRun_feature_malware_description=Membuat penjelajahan Anda lebih aman dengan cara memblokir domain yang dikenal sebagai malware.
+firstRun_feature_social_description=Secara otomatis membersihkan tombol media sosial, seperti Facebook Like, yang muncul pada halaman web dan melacak perilaku Anda.
+firstRun_donate=donasi
+firstRun_donate_label=Dukung proyek ini
+firstRun_feature_social=Hapus Tombol Media Sosial
+firstRun_legacySafariWarning=Anda menggunakan versi lama Safari yang tidak didukung oleh Adblock Plus. Mungkin tidak akan bekerja dengan baik atau bahkan mengganggu pengalaman pengguna di beberapa website. Kami sangat menyarankan sebaiknya memperbarui ke Safari 6.1.1 atau lebih tinggi (pada OS X 10.8 Mountain Lion), atau Safari 7.0.1 atau lebih tinggi (pada OS X 10.9 Mavericks), atau gunakan versi terbaru dari Mozilla Firefox, Google Chrome atau Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/global.properties
new file mode 100644
index 0000000..42fbf15
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Tidak ada item yang dapat diblok di halaman ini
+action3_tooltip=Klik untuk mengaktifkan/menonaktifkan Adblock Plus.
+notification_antiadblock_title=Sembunyikan pesan yang dipilih?
+type_label_script=script
+filter_elemhide_nocriteria=Tidak ada kriteria yang ditentukan untuk mengenali unsur yang disembunyikan
+blockingGroup_title=Aturan pemblokiran iklan
+whitelisted_tooltip=Adblock Plus dinonaktifkan pada halaman ini.
+type_label_stylesheet=stylesheet
+blocked_count_tooltip=?1? dari ?2?
+type_label_font=font
+type_label_popup=Jendela pop-up
+filter_regexp_tooltip=Filter ini adalah regular expression atau terlalu pendek untuk dioptimalkan. Penggunaan filter yang terlalu banyak akan memperlambat browsing Anda.
+action0_tooltip=Klik untuk memunculkan menu, klik tengah untuk mengaktifkan/menonaktifkan.
+whitelisted_page=Adblock Plus telah dinonaktifkan untuk halaman ini
+remove_group_warning=Anda benar-benar ingin menghapus kelompok ini?
+action1_tooltip=Klik untuk membuka/menutup item yang dapat diblok, klik tengah untuk mengaktifkan/menonaktifkan.
+type_label_xmlhttprequest=permintaan XML
+active_tooltip=Adblock Plus diaktifkan, ?1? filter subscription(s) dan ?2? custom filter(s) digunakan.
+type_label_document=dokumen
+type_label_object_subrequest=objek subrequest
+whitelistGroup_title=Aturan pengecualian
+disabled_tooltip=Adblock Plus dinonaktifkan.
+filter_elemhide_duplicate_id=Hanya satu ID dari unsur yang akan disembunyikan dapat ditentukan
+type_label_object=Obyek
+action2_tooltip=Klik untuk membuka preferensi, klik tengah untuk mengaktifkan/menonaktifkan.
+type_label_subdocument=bingkai
+clearStats_warning=Ini akan menyetel ulang semua filter statistik kunjungan dan menonaktifkan filter penghitung kunjungan. Apakah Anda ingin melanjutkan?
+notification_antiadblock_message=Situs ini dikenal sebagai penunjuk pesan yang dipilih terhadap pengguna Adblock Plus. Apakah anda ingin Adblock Plus menyembunyikan pesan yang dipilih?
+blocked_count_addendum=(Dalam daftar putih:?1?, tersembunyi:?2?)
+subscription_invalid_location=Filter daftar lokasi bukanlah URL valid maupun nama file yang valid.
+type_label_image=gambar
+remove_subscription_warning=Apakah anda yakin ingin menghapus langganan ini?
+type_label_other=Lainnya
+mobile_menu_enable=ABP: Aktifkan
+type_label_media=audio/video
+mobile_menu_disable_site=ABP: Menonaktifkan pada ?1?
+elemhideGroup_title=Aturan penyembunyian elemen
+mobile_menu_enable_site=ABP: Aktifkan pada ?1?
+type_label_elemhide=tersembunyi
+newGroup_title=Kelompok penyaring baru
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/overlay.dtd
new file mode 100644
index 0000000..0cb31d3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Iya">
+<!ENTITY notification.button.no "&amp;Tidak">
+<!ENTITY sync.label "Syn&amp;c pengaturan Adblock Plus">
+<!ENTITY whitelist.site.label "Non aktifkan pada ?1?">
+<!ENTITY filters.label "&amp;Preferensi penyaring">
+<!ENTITY disable.label "Non aktifkan disemua tempat">
+<!ENTITY objecttab.title "Blokir">
+<!ENTITY objecttab.tooltip "Klik disini untuk memblokir objek ini dengan Adblock Plus">
+<!ENTITY menuitem.label "Preferensi Ad&amp;block Plus">
+<!ENTITY objecttabs.label "&amp;Tunjukkan tab pada Flash dan Java">
+<!ENTITY sendReport.label "&amp;Laporkan masalah pada halaman ini">
+<!ENTITY whitelist.page.label "Non aktifkan pada halaman ini saja">
+<!ENTITY context.image.label "Adblock Plus: Blokir gambar">
+<!ENTITY counthits.label "Menghitung filter &amp;kunjungan">
+<!ENTITY opensidebar.label "Buka &amp;item yang dapat diblok">
+<!ENTITY notification.button.close "&amp;Tutup">
+<!ENTITY contribute.label "Kontribusi untuk Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Blokir bingkai">
+<!ENTITY blocked.tooltip "Blokir item pada halaman ini:">
+<!ENTITY hideplaceholders.label "Sembunyikan p&amp;laceholders dari unsur pemblokiran">
+<!ENTITY showinstatusbar.label "Tunjukkan di &amp;status bar">
+<!ENTITY sidebar.title "Item yang dapat diblok di halaman ini">
+<!ENTITY options.label "&amp;Pilihan">
+<!ENTITY context.object.label "Adblock Plus: Blokir objek">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Mengaktifkan ulang pada halaman ini">
+<!ENTITY filters.tooltip "Filter paling aktif:">
+<!ENTITY closesidebar.label "Tutup &amp;item yang dapat diblok">
+<!ENTITY showintoolbar.label "Tunjukkan di tool&amp;bar">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Blokir audio/video">
+<!ENTITY subscription.update.label "Perbarui penyaring">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/sendReport.dtd
new file mode 100644
index 0000000..98a4903
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Batalkan">
+<!ENTITY issues.disabledgroups.description "Filter langganan / kelompok filter ini dinonaktifkan, namun mungkin tetap akan memliki efek pada halaman ini:">
+<!ENTITY showData.label "Tunjukkan data laporan">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus memblokir terlalu &amp;banyak">
+<!ENTITY issues.change.description "Konfigurasi Anda telah diubah. Silahkan muat ulang halaman untuk menguji perubahan dan kirimkan laporan jika masalah belum terselesaikan oleh perubahan tersebut.">
+<!ENTITY email.label "Email:">
+<!ENTITY issues.openPreferences.label "Buka preferensi filter">
+<!ENTITY sendPage.confirmation "Laporan Anda telah disimpan. Anda dapat mengaksesnya pada alamat berikut:">
+<!ENTITY copyLink.label "&amp;Copy link laporan">
+<!ENTITY issues.nofilters.description "Adblock Plus tidak memblokir apapun pada halaman ini. Masalah yang Anda alami tidak ada kaitannya dengan Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Masalah yang Anda laporkan mungkin sudah dikenal. Informasi selanjutnya:">
+<!ENTITY typeSelector.other.description "Pilih opsi ini jika Anda mencurigai masalah dengan Adblock Plus sendiri daripada filter nya.">
+<!ENTITY issues.disabledgroups.enable.label "Aktifkan filter langganan / kelompok filter">
+<!ENTITY typeWarning.override.label "Saya mengerti dan ingin mengirim laporan">
+<!ENTITY issues.disabled.enable.label "Aktifkan Adblock Plus">
+<!ENTITY update.fixed.description "Pembaharuan filter langganan Anda sepertinya menyelesaikan masalah yang Anda laporkan. Silahkan buka kembali halaman dan coba kembali, klik Laporkan lagi jika masih terdapat masalah.">
+<!ENTITY anonymous.label "&amp;Penyerahan anonim">
+<!ENTITY reloadButton.label "&amp;Muat ulang halaman">
+<!ENTITY recentReports.clear.label "&amp;Hapus semua laporan">
+<!ENTITY typeSelector.description "Jendela ini akan memandu Anda melalui langkah-langkah yang diperlukan untuk penyerahan laporan masalah Adblock plus. Pertama, silakan pilih jenis masalah yang Anda alami di halaman ini:">
+<!ENTITY screenshot.remove.label "&amp;Hapus semua data sensitif">
+<!ENTITY issues.ownfilters.description "Beberapa dari filter yang diterapkan pada halaman ini ditetapkan oleh pengguna. Silahkan nonaktifkan filter yang mungkin menyebabkan masalah:">
+<!ENTITY update.inProgress.description "Adblock Plus perlu memperbaharui langganan filter Anda untuk memastikan bahwa masalah belum bisa diselesaikan. Harap tunggu...">
+<!ENTITY sendPage.retry.label "Kirim kembali">
+<!ENTITY data.label "Data laporan:">
+<!ENTITY recentReports.label "Anda baru saja mengirimkan laporan">
+<!ENTITY typeWarning.description "Anda menyatakan bahwa Anda ingin melaporkan masalah umum dengan Adblock Plus daripada masalah filter. Silahkan catat bahwa masalah seperti ini lebih baik dilaporkan pada [link]Forum Adblock Plus[/link]. Anda hanya perlu menggunakan pelaporan masalah untuk melengkapi diskusi yang ada, karena tidak ada seorangpun yang melihat laporan Anda kecuali Anda memberi mereka link untuk masalah tersebut. Link otomatis akan diberikan setelah mengirimkan laporan.">
+<!ENTITY issues.disabled.description "Adblock Plus dinonaktifkan, ini tidak akan memblokir apapun dalam keadaan ini.">
+<!ENTITY attachExtensions.label "Lampirkan daftar ekstensi aktif pada laporan jika konflik pengaya adalah penyebab dari masalah tersebut">
+<!ENTITY issues.nosubscriptions.add.label "Tambahkan filter langganan">
+<!ENTITY issues.disabledfilters.enable.label "Aktifkan filter">
+<!ENTITY issues.override.label "&amp;Konfigurasi benar, lanjutkan dengan laporkan">
+<!ENTITY issues.nosubscriptions.description "Anda tidak berlangganan satupun dari filter bawaan yang secara otomatis menghapus konten yang tidak diinginkan pada situs web.">
+<!ENTITY typeSelector.falsePositive.description "Pilih opsi ini jika halaman kurang memiliki konten penting, salah menampilkan atau tidak berfungsi dengan benar. Anda dapat menentukan apakah Adblock Plus adalah penyebab masalah dengan menonaktifkannya untuk sementara.">
+<!ENTITY typeSelector.other.label "Masalah lainnya">
+<!ENTITY emailComment.label "Kami menganjurkan Anda untuk memasukkan alamat email yang valid sehingga kami dapat menghubungi Anda jika terdapat pertanyaan tentang laporan Anda. Ini juga akan memungkinkan kami untuk mengetahui kontribusi Anda dan meninggikan prioritas.">
+<!ENTITY issues.whitelist.remove.label "Aktifkan kembali Adblock Plus pada halaman ini">
+<!ENTITY outdatedSubscriptions.description "Filter langganan ini belum diperbaharui setidaknya dua minggu. Silahkan perbaharui langganan ini sebelum mengirimkan laporan masalah yang mungkin sudah terselesaikan sebelumnya.">
+<!ENTITY dataCollector.description "Silahkan tunggu beberapa saat sementara Adblock Plus mengumpulkan data yang dibutuhkan.">
+<!ENTITY sendButton.label "Kirim laporan">
+<!ENTITY comment.label "&amp;Komentar (pilihan):">
+<!ENTITY sendPage.errorMessage "Upaya mengirimkan laporan gagal dengan kode kesalahan &quot;?1?&quot;. Silahkan pastikan Anda terhubung ke Internet dan coba kembali. Jika masalah berlanjut, silahkan meminta bantuan pada [link]Forum Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Tampilkan laporan yang baru disampaikan">
+<!ENTITY commentPage.heading "Masukkan Komentar">
+<!ENTITY update.start.label "Mulai pembaharuan sekarang">
+<!ENTITY issues.disabledfilters.description "Filter ini dinonaktifkan, namun mungkin masih mempunyai efek pada halaman ini:">
+<!ENTITY screenshot.description "Halaman yang sama dapat terlihat berbeda untuk berbagai orang. Ini dapat membantu kami untuk memahami masalah jika Anda melampirkan sebuah screenshot pada laporan Anda. Anda dapat menghapus bagian yang mengandung informasi sensitif serta tandai daerah dimana masalah tersebut terjadi. Untuk melakukannya klik sesuai tombol dan pilih bagian dari gambar dengan mouse Anda.">
+<!ENTITY screenshot.attach.label "Lampirkan gambar halaman untuk melaporkan">
+<!ENTITY issues.whitelist.description "Adblock Plus sedang dinonaktifkan pada halaman yang Anda laporkan. Silahkan aktifkan dan muat ulang halaman sebelum mengirimkan laporan untuk membantu peyelidikan masalah ini.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus tidak memblokir sebuah &amp;iklan">
+<!ENTITY typeSelector.heading "Pilih tipe laporan">
+<!ENTITY anonymity.warning "Kami tidak dapat menghubungi Anda kembali dan akan menurunkan prioritas laporan ini.">
+<!ENTITY wizard.title "Pelaporan">
+<!ENTITY issues.ownfilters.disable.label "Nonaktifkan filter">
+<!ENTITY commentPage.description "Kotak teks di bawah ini memungkinkan Anda untuk memasukkan komentar untuk membantu kami memahami masalah. Langkah ini bersifat pilihan tetapi dianjurkan jika masalahnya tidak jelas. Anda juga dapat memeriksa data laporan sebelum dikirim.">
+<!ENTITY comment.lengthWarning "Panjang komentar Anda melebihi 1000 karakter. Hanya 1000 karakter pertama yang akan dikirim.">
+<!ENTITY typeSelector.falseNegative.description "Pilih opsi ini jika iklan ditampilkan meskipun Adblock Plus telah diaktifkan.">
+<!ENTITY sendPage.waitMessage "Silahkan tunggu sementara Adblock Plus mengirimkan laporan Anda.">
+<!ENTITY dataCollector.heading "Selama datang di pelaporan masalah">
+<!ENTITY screenshot.heading "Lampirkan screenshot">
+<!ENTITY sendPage.heading "Kirim laporan">
+<!ENTITY issues.subscriptionCount.description "Tampaknya Anda berlangganan filter langganan terlalu banyak. Pengaturan ini tidak dianjurkan karena akan membuat masalah semakin tinggi. Kami juga tidak dapat menerima laporan masalah karena tidak jelas filter langganan mana yang pembuat butuhkan untuk menindak lanjuti. Silahkan hapus semua selain yang benar-benar dibutuhkan dan uji apakah masalah masih terjadi.">
+<!ENTITY screenshot.mark.label "&amp;Tandai masalah">
+<!ENTITY privacyPolicy.label "Kebijakan privasi">
+<!ENTITY issues.description "Adblock Plus mendeteksi masalah pada pengaturan Anda yang mungkin adalah penyebab dari masalah atau akan membuat laporan penyelidikan menjadi sulit.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/sidebar.dtd
new file mode 100644
index 0000000..a6f02e1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Border item yang ber-flash">
+<!ENTITY address.label "Alamat">
+<!ENTITY context.open.label "Buka di tab baru">
+<!ENTITY type.label "Ketik">
+<!ENTITY tooltip.filterSource.label "Sumber filter:">
+<!ENTITY noitems.label "Tidak ada item yang bisa diblok">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Ukuran:">
+<!ENTITY reattach.label "Sertakan kembali">
+<!ENTITY search.label "&amp;Cari:">
+<!ENTITY docDomain.thirdParty "(pihak ketiga)">
+<!ENTITY filterSource.label "Sumber filter">
+<!ENTITY tooltip.docDomain.label "Sumber dokumen:">
+<!ENTITY context.copy.label "Salin alamat item">
+<!ENTITY tooltip.type.label "Tipe:">
+<!ENTITY context.disablefilter.label "Nonaktifkan filter ?1?">
+<!ENTITY context.copyFilter.label "Salin filter">
+<!ENTITY context.block.label "Blokir item ini">
+<!ENTITY context.enablefilter.label "Hidupkan ulang filter ?1?">
+<!ENTITY detach.label "Lepas">
+<!ENTITY whitelisted.label "Halaman yang dibebaskan">
+<!ENTITY context.disablefilteronsite.label "Nonaktifkan filter ini pada ?1?">
+<!ENTITY detached.title "Adblock Plus: Item yang bisa diblok (dilepaskan)">
+<!ENTITY docDomain.firstParty "(pihak pertama)">
+<!ENTITY tooltip.type.whitelisted "(dibebaskan)">
+<!ENTITY tooltip.filter.label "Efek filter:">
+<!ENTITY tooltip.filter.disabled "(dinonaktifkan)">
+<!ENTITY context.editfilter.label "Edit efek filter">
+<!ENTITY tooltip.type.blocked "(diblokir)">
+<!ENTITY size.label "Ukuran">
+<!ENTITY context.whitelist.label "Tambahkan Aturan pengecualian untuk item">
+<!ENTITY context.selectAll.label "Pilih semua">
+<!ENTITY state.label "Bagian">
+<!ENTITY docDomain.label "Sumber dokumen">
+<!ENTITY tooltip.address.label "Alamat:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/subscriptionSelection.dtd
new file mode 100644
index 0000000..4092dd2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Tambahkan filter &amp;langganan &quot;?1?&quot; juga">
+<!ENTITY list.download.failed "Adblock Plus gagal untuk mengambil daftar langganan.">
+<!ENTITY list.download.retry "Coba lagi">
+<!ENTITY title.label "&amp;Judul langganan:">
+<!ENTITY list.download.website "Lihat situs">
+<!ENTITY supplementMessage "Filter langganan ini dimaksudkan untuk digunakan dengan filter langganan &quot;?1?&quot; yang Anda tidak menggunakannya lagi.">
+<!ENTITY viewList.label "Lihat filter">
+<!ENTITY visitHomepage.label "Kunjungi situs web">
+<!ENTITY addSubscription.label "Tambahkan langganan">
+<!ENTITY dialog.title "Tambahkan filter langganan Adblock Plus">
+<!ENTITY location.label "&amp;Lokasi daftar filter:">
+<!ENTITY fromWeb.description "Silahkan konfirmasi bahwa Anda ingin menambahkan filter langganan. Anda dapat merubah judul langganan atau lokasi sebelum menambahkannya.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/composer.dtd
new file mode 100644
index 0000000..1e7a125
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "í en&amp;da netfangs">
+<!ENTITY domainRestriction.label "&amp;Takmarka við lén:">
+<!ENTITY collapse.default.no.label "Nota sjálfgefið (nei)">
+<!ENTITY firstParty.label "Aðeins fy&amp;rsta aðila">
+<!ENTITY preferences.label "Sýna nú&amp;verandi síur...">
+<!ENTITY pattern.label "Leita að mynstri">
+<!ENTITY thirdParty.label "&amp;Aðeins þriðja aðila">
+<!ENTITY filter.label "Ný &amp;sía:">
+<!ENTITY collapse.label "Fella sa&amp;man lokaða hluti:">
+<!ENTITY match.warning "Mynstrið sem þú slóst inn passar ekki ekki við veffangið sem á að loka á/hvítlista og mun ekki hafa nein áhrif á það.">
+<!ENTITY anchor.start.label "í &amp;byrjun netfangs">
+<!ENTITY matchCase.label "&amp;Passa við stafstöðu">
+<!ENTITY custom.pattern.label "Sérs&amp;nið:">
+<!ENTITY unselectAllTypes.label "Velja ekkert">
+<!ENTITY type.whitelist.label "&amp;Frávikregla">
+<!ENTITY regexp.warning "Mynstrið sem þú slóst inn verður túlkað sem regluleg segð. Margar reglulegar segðir gætu haft þau áhrif að hægja á vöfrun. Ef þú ætlar ekki að nota reglulega segðir, bættu þá * tákni við enda mynstursins.">
+<!ENTITY dialog.title "Bæta við Adblock Plus síureglu">
+<!ENTITY basic.label "Einföld sýn">
+<!ENTITY type.filter.label "&amp;Lokunarsía">
+<!ENTITY types.label "Virkja fyrir tegundir:">
+<!ENTITY shortpattern.warning "Mynstrið sem þú slóst inn er of stutt til að hægt sé að nota það, of mörg svona mynstur geta hægt á vöfrun. Mælt er með að þú notir lengri streng fyrir þessa síu.">
+<!ENTITY collapse.yes.label "Já">
+<!ENTITY anchors.label "Aðeins samþykkja mynstur:">
+<!ENTITY collapse.default.yes.label "Nota sjálfgefið (já)">
+<!ENTITY domainRestriction.help "Sláðu inn eitt eða fleiri lén aðskilið með tákninu (|). Sían verður aðeins beitt á þessi lén. Táknið (~) fyrir framan lén þýðir að ekki ætti að beita síunni á það lén.">
+<!ENTITY accept.label "Bæta við síu">
+<!ENTITY options.label "Valkostir">
+<!ENTITY disabled.warning "Adblock Plus er óvirkt eins og er. Þú getur samt bætt við síum en síurnar munu ekki vera virkar nema þú [link]virkjir Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "í &amp;byrjun lénsins">
+<!ENTITY collapse.no.label "Nei">
+<!ENTITY selectAllTypes.label "Velja allt">
+<!ENTITY advanced.label "Ãtarleg sýn">
+<!ENTITY pattern.explanation "Mynstrið getur verið hvaða hluti sem er í netfanginu; táknið (*) virkar sem algildisstafur. Síunni verður aðeins beitt á þau netföng sem passa við mynstrið.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/filters.dtd
new file mode 100644
index 0000000..d22adad
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Allar sérsniðnar síur verða yfirskrifaðar af skrá. Viltu halda áfram?">
+<!ENTITY slow.column "H&amp;ægar síur">
+<!ENTITY enabled.column "&amp;Virkt">
+<!ENTITY subscription.lastDownload.checksumMismatch "Mistókst, prófsumma stemmir ekki">
+<!ENTITY noFiltersInGroup.text "Valinn hópur er tómur.">
+<!ENTITY subscription.actions.label "Aðgerðir">
+<!ENTITY filter.selectAll.label "Velja allt">
+<!ENTITY backupButton.label "&amp;Afrita og endurheimta">
+<!ENTITY restore.minVersion.warning "Aðvörun: skráin var búin til að nýrri útgáfu af Adblock Plus. Þú ættir að uppfæra í nýjustu útgáfu af Adblock Plus áður en þú endurheimtir þessa skrá.">
+<!ENTITY restore.error "Ekki tókst að lesa skráargögn, kannski er skráin ekki Adblock Plus afritunarskrá?">
+<!ENTITY sort.ascending.label "&amp;A &gt; Ö röðun">
+<!ENTITY sort.label "Raða e&amp;ftir">
+<!ENTITY subscription.source.label "Sía lista">
+<!ENTITY hitcount.column "&amp;Notkun">
+<!ENTITY noFilters.text "Þú ert ekki ennþá með neina sérsniðna síu.">
+<!ENTITY backup.custom.title "Aðeins sérsniðnar síur">
+<!ENTITY subscription.external.label "Uppfært af annarri viðbót">
+<!ENTITY subscription.delete.label "Eyða">
+<!ENTITY noGroupSelected.text "Þú verður að velja síuhóp áður en hægt er að birta síur.">
+<!ENTITY filter.cut.label "Klippa">
+<!ENTITY restore.default.label "Endurheimta afrit frá ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Hleður…">
+<!ENTITY subscriptions.tab.label "Síu áskriftir">
+<!ENTITY sort.descending.label "&amp;Ö &gt; A röðun">
+<!ENTITY filters.remove.warning "Viltu örugglega fjarlægja alla valdar síur?">
+<!ENTITY filter.delete.label "Eyða">
+<!ENTITY addSubscriptionAdd.label "Bæta við">
+<!ENTITY viewMenu.label "Skoða">
+<!ENTITY subscription.lastDownload.unknown "Óþekkt">
+<!ENTITY addSubscriptionCancel.label "Hætta við">
+<!ENTITY subscription.enabled.label "Virkt">
+<!ENTITY noSubscriptions.text "Þú hefur ekki ennþá bætt við áskrift að síu. Adblock Plus virkar ekki
+ án þess að vera með síur, notaðu &quot;Bæta við síuáskrift&quot; til
+ að bæta við síuáskrift.">
+<!ENTITY subscription.update.label "Uppfæra síur">
+<!ENTITY dialog.title "Adblock Plus síu stillingar">
+<!ENTITY addFilter.label "Bæta við sí&amp;u">
+<!ENTITY subscription.minVersion.warning "Þessi síuáskrift þarfnast nýrri útáfu af Adblock Plus, þú ættir að uppfæra í nýjustu útgáfu.">
+<!ENTITY subscription.lastDownload.invalidURL "Mistókst, ekki gilt netfang">
+<!ENTITY backup.error "Upp kom villa við að skrifa síur í skránna. Gakktu úr skugga um að skráin sé ekki ritvarin eða í notkun af öðru forriti.">
+<!ENTITY filter.moveUp.label "Færa upp">
+<!ENTITY addGroup.label "Bæta við síu&amp;hóp">
+<!ENTITY filter.edit.label "Breyta">
+<!ENTITY subscription.showHideFilters.label "Sýna/fela síur">
+<!ENTITY acceptableAds2.label "Leyfa auglýs&amp;ingar sem eru ekki uppáþrengjandi">
+<!ENTITY addSubscriptionOther.label "Bæta við öðruvísi áskrift">
+<!ENTITY close.label "Loka">
+<!ENTITY sort.none.label "Ó&amp;raðað">
+<!ENTITY filter.actions.label "Síu aðgerðir">
+<!ENTITY filter.copy.label "Afrita">
+<!ENTITY filter.moveDown.label "Færa niður">
+<!ENTITY filter.resetHitCounts.label "Endurstilla síu teljara">
+<!ENTITY readMore.label "Lesa meira">
+<!ENTITY subscription.moveUp.label "Færa upp">
+<!ENTITY addSubscription.label "&amp;Bæta við síuáskrift">
+<!ENTITY subscription.homepage.label "Heimasíða">
+<!ENTITY backup.complete.title "Allar síur og áskriftir">
+<!ENTITY restore.own.label "Endurheimta eigið afrit">
+<!ENTITY restore.complete.warning "Allar síustillingar verða yfirskrifaðar af skrá. Viltu halda áfram?">
+<!ENTITY filters.tab.label "Sérsniðnar síur">
+<!ENTITY backup.label "Búa til nýtt afrit">
+<!ENTITY find.label "&amp;Leita">
+<!ENTITY subscription.moveDown.label "Færa niður">
+<!ENTITY subscription.lastDownload.connectionError "Mistókst, gat ekki niðurhalað">
+<!ENTITY subscription.lastDownload.success "Tókst">
+<!ENTITY subscription.lastDownload.invalidData "Mistókst, ekki gildur síulisti">
+<!ENTITY filter.paste.label "Líma">
+<!ENTITY subscription.disabledFilters.enable "Virkja óvirkar síur">
+<!ENTITY lasthit.column "Seinast &amp;heimsótt">
+<!ENTITY subscription.editTitle.label "Breyta titli">
+<!ENTITY subscription.disabledFilters.warning "Sumar síur í þessari áskrift eru óvirkar.">
+<!ENTITY filter.column "Síu re&amp;gla">
+<!ENTITY subscription.lastDownload.label "Seinasta niðurhal:">
+<!ENTITY viewList.label "Skoða lista">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/firstRun.properties
new file mode 100644
index 0000000..a337e72
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Vafraðu örugglega með því að loka á að fylgst sé með þér - feldu þig frá auglýsinga fyrirtækjum sem geta fylgst með þér í hverju skrefi.
+firstRun_toggle_off=ÓVIRKT
+firstRun_feature_tracking=Slökkva á rakningu
+firstRun_feature_malware=Loka á spilliforrit
+firstRun_title=Adblock Plus var sett inn
+firstRun_toggle_on=VIRKT
+firstRun_acceptableAdsExplanation=Við viljum hvetja vefsvæði til að nota einfaldar auglýsingar, sem eru ekki uppáþrengjandi. Þess vegna höfum við sett fram <a>ákveðnar reglur</a> til að skilgreina ásættanlegar auglýsingar, sem eru birtar með venjulegum stillingum. Ef þú vilt loka á allar auglýsingar geturðu gert þetta <a>óvirkt</a> á einfaldan hátt.
+firstRun_contributor_credits=Stuðningsaðilar
+firstRun_dataCorruptionWarning=Er þessi síða alltaf að birtast? <a>Smelltu hér!</a>
+firstRun_acceptableAdsHeadline=Lokað verður á uppáþrengjandi auglýsingar
+firstRun_share=Láttu vini þína vita
+firstRun_share_headline=<a>Hjálpaðu okkur</a> í því að gera vefinn betri
+firstRun_feature_social_description=Taktu sjálfkrafa út samfélags hnappa, eins og Facebook hnappa, sem birtast á vefsíðum og fylgjast með þér.
+firstRun_filterlistsReinitializedWarning=Svo virðist sem að upp hafi komið vandamál sem gerði það að verkum að öllum síum var eytt og ekki var hægt að endurheimta. Þar af leiðandi þurfti að endurstilla allar síur og stillingar fyrir ásættanlegar auglýsingar. Athugaðu síu listana og stillingar fyrir ásættanlegar auglýsingar í <a>Adblock Plus stillingum</a>.
+firstRun_feature_malware_description=Gerðu netvafur öruggara með því að loka á þekkt hættuleg vefsvæði.
+firstRun_features=Adblock Plus getur gert meira heldur en að loka á auglýsingar
+firstRun_donate=gefa
+firstRun_donate_label=Styðja verkefnið
+firstRun_feature_social=Fjarlægja hnappa fyrir netsamfélög
+firstRun_legacySafariWarning=Þú ert að nota gamla útgáfu af Safari sem er ekki með stuðning frá Adblock Plus. Hugsanlega virkar hún ekki eða virkar illa á sumum vefsvæðum. Við mælum með að þú annað hvort uppfærir í Safari 6.1.1 eða hærri útgáfu (á Mac OS X 10.8 Mountain Lion), eða Safari 7.0.1 eða hærri (á OS X 10.9 Mavericks), eða notir nýjustu útgáfu af Mozilla Firefox, Google Chrome eða Opera.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/global.properties
new file mode 100644
index 0000000..775228d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Engir lokaðir hlutir á núverandi síðu
+action3_tooltip=Smelltu til að virkja/gera óvirkt Adblock Plus.
+notification_antiadblock_title=Fela áhugamiðuð skilaboð?
+type_label_script=skrifta
+filter_elemhide_nocriteria=Engin viðmiðun skilgreind til þess að bera kennsl á hlut til að fela
+blockingGroup_title=Lokunarreglur
+whitelisted_tooltip=Adblock Plus er í gangi en er óvirkur á núverandi síðu.
+type_label_stylesheet=stílblað
+blocked_count_tooltip=?1? af ?2?
+type_label_font=leturgerð
+type_label_popup=sprettigluggi
+filter_regexp_tooltip=Sían er annaðhvort regluleg segð eða of stutt til að hægt sé að nota. Of margar af svona síum gætu hægt á vöfrun.
+action0_tooltip=Smelltu til að birta valmynd, miðju smelltu á músinni til að virkja/gera óvirkt.
+whitelisted_page=Búið er að gera Adblock Plus óvirkt fyrir núverandi síðu
+remove_group_warning=Viltu fjarlægja þennan hóp?
+action1_tooltip=Smelltu til að opna/loka hlutum, miðju smella til að virkja/gera óvirkt.
+type_label_xmlhttprequest=XML beiðni
+active_tooltip=Adblock Plus er virkur, ?1? síu áskriftir og ?2? sérsniðnar síur í notkun.
+type_label_document=skjal
+type_label_object_subrequest=undiraðgerð hlutar
+whitelistGroup_title=Undantekningarreglur
+disabled_tooltip=Adblock Plus er óvirkur.
+filter_elemhide_duplicate_id=Aðeins er hægt að skilgreina eitt auðkenni fyrir hlut sem á að fela
+type_label_object=hlutur
+action2_tooltip=Smelltu til að opna stillingar, miðju smelltu til að virkja/gera óvirkt.
+type_label_subdocument=rammi
+clearStats_warning=Þetta mun endurstilla alla teljara á síunotkun og hætta að telja síunotkun. Viltu halda áfram?
+notification_antiadblock_message=Þetta vefsvæði er þekkt fyrir að sýna áhugamiðuð skilaboð til Adblock Plus notenda. Viltu að Adblock Plus feli þessi áhugamiðuð skilaboð?
+blocked_count_addendum=(einnig á hvítlista: ?1?, falið: ?2?)
+subscription_invalid_location=Staðsetning síu er ekki gilt URL eða gilt skráarnafn.
+type_label_image=mynd
+remove_subscription_warning=Viltu fjarlægja þessa áskrift?
+type_label_other=annað
+mobile_menu_enable=ABP: Virkja
+type_label_media=hljóð/mynd
+mobile_menu_disable_site=ABP: Óvirkt fyrir ?1?
+elemhideGroup_title=Felureglur
+mobile_menu_enable_site=ABP: Virkja fyrir ?1?
+type_label_elemhide=falið
+newGroup_title=Ný síu regla
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/overlay.dtd
new file mode 100644
index 0000000..6f94a02
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Já">
+<!ENTITY notification.button.no "&amp;Nei">
+<!ENTITY sync.label "Sa&amp;mstilla Adblock Plus stillingar">
+<!ENTITY whitelist.site.label "Gera óvirkt á ?1?">
+<!ENTITY filters.label "&amp;Síu stillingar">
+<!ENTITY disable.label "Slökkva á allstaðar">
+<!ENTITY objecttab.title "Loka á">
+<!ENTITY objecttab.tooltip "Smelltu hér til að loka á þennan hlut með Adblock Plus">
+<!ENTITY menuitem.label "Ad&amp;block Plus stillingar">
+<!ENTITY objecttabs.label "Sýna &amp;flipa fyrir Flass og Java">
+<!ENTITY sendReport.label "Tilkynna vandamál á þessa&amp;ri síðu">
+<!ENTITY whitelist.page.label "Gera óvirkt aðeins á þessari síðu">
+<!ENTITY context.image.label "Adblock Plus: Loka auglýsingamynd">
+<!ENTITY counthits.label "Telja síu &amp;notkun">
+<!ENTITY opensidebar.label "Skoða h&amp;luti">
+<!ENTITY notification.button.close "&amp;Loka">
+<!ENTITY contribute.label "Taka þátt í Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Loka auglýsingaramma">
+<!ENTITY blocked.tooltip "Lokaðir hlutir á þessari síðu:">
+<!ENTITY hideplaceholders.label "Fela staðgeng&amp;itákn á lokuðum einindum">
+<!ENTITY showinstatusbar.label "&amp;Sýna í stöðuslá">
+<!ENTITY sidebar.title "Hlutir á núverandi síðu sem hægt er að loka á">
+<!ENTITY options.label "&amp;Valkostir">
+<!ENTITY context.object.label "Adblock Plus: Loka auglýsingahlut">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Endurvirkja á þessari síðu">
+<!ENTITY filters.tooltip "Mest notaðar síur:">
+<!ENTITY closesidebar.label "&amp;Loka hlutum">
+<!ENTITY showintoolbar.label "Sýna í &amp;tækjaslá">
+<!ENTITY status.tooltip "Staða:">
+<!ENTITY context.media.label "Adblock Plus: Loka á myndefni/hljóð">
+<!ENTITY subscription.update.label "Uppfæra síur">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/sendReport.dtd
new file mode 100644
index 0000000..6c28bec
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/sendReport.dtd
@@ -0,0 +1,97 @@
+<!ENTITY screenshot.undo.label "Aft&amp;urkalla">
+<!ENTITY issues.disabledgroups.description "Eftirfarandi síuáskriftir / síuhópar eru óvirkar, samt sem áður gætu þær haft haft
+ áhrif á þessari síðu:">
+<!ENTITY showData.label "Sýna skýrslugögn">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus lokar á of &amp;mikið">
+<!ENTITY issues.change.description "Búið er að breyta stillingum. Vinsamlega endurnýjaðu síðuna til að prófa breytingarnar
+ og sendu skýrslu ef vandamálið leystist ekki vegna breytinganna.">
+<!ENTITY email.label "&amp;Tölvupóstfang:">
+<!ENTITY issues.openPreferences.label "Opna síuvalkosti">
+<!ENTITY sendPage.confirmation "Búið er að vista skýrsluna. Þú getur séð hana á eftirfarandi veffangi:">
+<!ENTITY copyLink.label "&amp;Afrita skýrslutengil">
+<!ENTITY issues.nofilters.description "Adblock Plus er ekki að loka á neitt á núverandi síðu. Vandamálið sem þú ert að
+ sjá er líklega ótengt Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Vandamálið sem þú tilkynntir er öllum líkindum þegar þekkt. Meiri upplýsingar:">
+<!ENTITY typeSelector.other.description "Veldu þennan möguleika ef þú heldur að vandamálið sé hjá Adblock Plus sjálfu frekar
+ en í síu.">
+<!ENTITY issues.disabledgroups.enable.label "Virkja síuáskrift / síuhópur">
+<!ENTITY typeWarning.override.label "Ég &amp;skil og vill samt senda skýrslu">
+<!ENTITY issues.disabled.enable.label "Virkja Adblock Plus">
+<!ENTITY update.fixed.description "Uppfærslur á síuáskriftum lagfærðu að öllum líkindum vandamálið. Endurnýjaðu síðun og reyndu aftur, smelltu á tilkynna aftur ef vandamálið er enn til staðar.">
+<!ENTITY anonymous.label "N&amp;afnlaus sending">
+<!ENTITY reloadButton.label "Endu&amp;rnýja síðu">
+<!ENTITY recentReports.clear.label "Fja&amp;rlægja allar skýrslur">
+<!ENTITY typeSelector.description "Þessi gluggi hjálpar þér í gegnum þau skref sem þarf til að tilkynna Adblock
+ Plus vandamála. Veldu fyrst, hverskonar tegund af vandamáli þú ert að lenda í
+ á þessari síðu:">
+<!ENTITY screenshot.remove.label "Fja&amp;rlægja viðkvæm gögn">
+<!ENTITY issues.ownfilters.description "Sumar af síunum sem eru virkar á þessari síðu eru stilltar af notanda. Vinsamlega gerðu þær síur óvirkar
+ sem hugsanlega gætu hafa valdið vandræðunum:">
+<!ENTITY update.inProgress.description "Adblock Plus þarf að uppfæra síuáskriftir til að ganga úr skugga um að vandamálið hafi ekki þegar verið lagað. Bíddu aðeins…">
+<!ENTITY sendPage.retry.label "Senda aftur">
+<!ENTITY data.label "&amp;Skýrslugögn:">
+<!ENTITY recentReports.label "Nýlegar sendar skýrslur">
+<!ENTITY typeWarning.description "Þú hefur gefið til kynna að þú viljir tilkynna almennt vandamál á Adblock Plus frekar
+ en vandamál með síurnar. Vinsamlega athugaðu að svoleiðis vandamál er best að tilkynna
+ á [link]Adblock Plus umræðusvæðinu[/link]. Þú ættir aðeins að tilkynna vandamál sem
+ viðauka við umræðu sem er til fyrir, þar sem enginn tekur eftir tilkynningunni
+ nema þú setjir tengil með. Sjálfvirki tengillinn
+ verður aðgengilegur eftir að skýrslan hefur verið send.">
+<!ENTITY issues.disabled.description "Adblock Plus er óvirkt, það mun ekki loka á neitt í núverandi ástandi.">
+<!ENTITY attachExtensions.label "Láta fylgja með lista af &amp;virkum viðbótum í skýrslunni ef svo vildi til að vandamálið væri vegna þeirra">
+<!ENTITY issues.nosubscriptions.add.label "Bæta við síuáskrift">
+<!ENTITY issues.disabledfilters.enable.label "Virkja síu">
+<!ENTITY issues.override.label "&amp;Stillingarnar eru réttar, halda áfram með skýrsluna">
+<!ENTITY issues.nosubscriptions.description "Þú ert ekki áskrifandi að neinum af forskilgreindum síulistum sem fjarlægja
+ sjálfvirkt óæskilegt efni frá vefsvæðum.">
+<!ENTITY typeSelector.falsePositive.description "Veldu þennan möguleika ef á síðuna vantar mikilvæg gögn, birtist rangt eða
+ virkar ekki eðlilega. Þú getur gengið úr skugga um hvort Adblock Plus sé vandamálið
+ með því að gera það óvirkt tímabundið.">
+<!ENTITY typeSelector.other.label "A&amp;nnað vandamál">
+<!ENTITY emailComment.label "Við mælum með að þú sláir inn gilt tölvupóstfang svo hægt að hafa samband við þig ef það eru spurningar um skýrsluna þína. Einnig gerir það okkur kleyft að bera kennsl á það sem þú sendir inn og hægt er að forgangsraða því hærra.">
+<!ENTITY issues.whitelist.remove.label "Virkja Adblock Plus á þessari síðu">
+<!ENTITY outdatedSubscriptions.description "Eftirfarandi síuáskriftir hafa ekki verið uppfærðar í að minnsta kosti tvær vikur. Uppfærðu síuáskriftirnar áður en þú tilkynnir vandamál, hugsanlega er þegar búið að leysa vandamálið.">
+<!ENTITY dataCollector.description "Bíddu aðeins á meðan Adblock Plus tekur saman nauðsynleg gögn.">
+<!ENTITY sendButton.label "Se&amp;nda skýrslu">
+<!ENTITY comment.label "&amp;Athugasemd (valfrjálst):">
+<!ENTITY sendPage.errorMessage "Tilraun til að senda skýrsluna mistókst með villukóða &quot;?1?&quot;. Gakktu úr skugga um þú sért
+ tengdur við netið og reyndu aftur. Ef vandamálið er viðvarandi fáðu þá
+ hjálp í [link]Adblock Plus umræðusvæðinu[/link].">
+<!ENTITY showRecentReports.label "Sýna nýlegar sendar skýrslur">
+<!ENTITY commentPage.heading "Sláðu inn athugasemd">
+<!ENTITY update.start.label "Byrja uppfærslu">
+<!ENTITY issues.disabledfilters.description "Eftirfarandi síur eru óvirkar, en gætu samt sem áður haft áhrif á þessari síðu:">
+<!ENTITY screenshot.description "Sama síðan getur birst á mismunandi hátt fyrir mismunandi fólk. Það gæti hjálpað okkur
+ að skilja vandamálið ef þú setur skjáskot með skýrslunni. Þú getur fjarlægt
+ svæði sem innihalda persónulegar upplýsingar og merkt einnig þau svæði þar sem
+ vandamálið sést. Til að merkja svæði smelltu á viðkomandi hnapp og veldu
+ svæði á myndinni með músinni.">
+<!ENTITY screenshot.attach.label "&amp;Hengja mynd af síðu við skýrsluna">
+<!ENTITY issues.whitelist.description "Adblock Plus er óvirkt á síðunni sem þú ert að senda skýrslu um. Vinsamlega virkjaðu
+ það og endurnýjaðu síðuna áður en þú sendir skýrsluna til að hjálpa til með að rannsaka
+ þetta vandamál.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus lokar &amp;ekki á auglýsingu">
+<!ENTITY typeSelector.heading "Veldu tegund skýrslu">
+<!ENTITY anonymity.warning "Við munum ekki geta haft samband við þig og munum að öllum líkindum þess vegna setja þína skýrslu í lægri forgang.">
+<!ENTITY wizard.title "Höfundur tilkynningar">
+<!ENTITY issues.ownfilters.disable.label "Slökkva á síu">
+<!ENTITY commentPage.description "Þú getur slegið inn athugasemd í textasvæðið hér fyrir neðan til að hjálpa okkur að skilja vandamálið.
+ Þetta skref er valkvæmt en mælt er með því ef vandamálið er ekki augljóst.
+ Þú getur einnig forskoðað skýrsluna áður en þú hún er send.">
+<!ENTITY comment.lengthWarning "Lengdin á athugasemd er yfir 1000 stafir. Aðeins verða sendir fyrstu 1000 stafirnir.">
+<!ENTITY typeSelector.falseNegative.description "Veldu þennan möguleika ef auglýsing birtist jafnvel
+ þótt Adblock Plus sé virkt.">
+<!ENTITY sendPage.waitMessage "Bíddu aðeins meðan Adblock Plus sendir skýrsluna.">
+<!ENTITY dataCollector.heading "Velkominn í tilkynna vandamál">
+<!ENTITY screenshot.heading "Hengja skjámynd við">
+<!ENTITY sendPage.heading "Senda skýrslu">
+<!ENTITY issues.subscriptionCount.description "Svo virðist sem þú sért áskrifandi að of mörgum síuáskriftum. Ekki
+ er mælt með þessu þar sem líklegt er að
+ vandamál verði of mörg. Ekki er heldur hægt að taka á móti tilkynningu um villu
+ vegna þess að ekki er augljóst hvaða síu þarf að laga. Vinsamlega
+ fjarlægðu allar síur nema þær allra nauðsynlegustu og prófaðu aftur hvort
+ vandamálið sé enn til staðar.">
+<!ENTITY screenshot.mark.label "&amp;Merkja vandamálið">
+<!ENTITY privacyPolicy.label "Persónuverndarstefna">
+<!ENTITY issues.description "Adblock Plus uppgötvaði vandamál með stillingar sem gætu verið ástæða
+ fyrir þessu vandamáli eða gæti haft áhrif á rannsókn vandamálsins.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/sidebar.dtd
new file mode 100644
index 0000000..68608a7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Rammi Flash hlutar">
+<!ENTITY address.label "Netfang">
+<!ENTITY context.open.label "Opna í nýjum flipa">
+<!ENTITY type.label "Tegund">
+<!ENTITY tooltip.filterSource.label "Sía frumkóða:">
+<!ENTITY noitems.label "Engir hlutir til að loka á">
+<!ENTITY filter.label "Sía">
+<!ENTITY tooltip.size.label "Stærð:">
+<!ENTITY reattach.label "Festa aftur">
+<!ENTITY search.label "&amp;Leita:">
+<!ENTITY docDomain.thirdParty "(þriðja aðila)">
+<!ENTITY filterSource.label "Síu uppruni">
+<!ENTITY tooltip.docDomain.label "Netfang síðu:">
+<!ENTITY context.copy.label "Afrita vefslóð hlutar">
+<!ENTITY tooltip.type.label "Tegund:">
+<!ENTITY context.disablefilter.label "Aftengja síu ?1?">
+<!ENTITY context.copyFilter.label "Afrita síu">
+<!ENTITY context.block.label "Loka á þennan hlut">
+<!ENTITY context.enablefilter.label "Virkja aftur síu ?1?">
+<!ENTITY detach.label "Aftengja">
+<!ENTITY whitelisted.label "Síða fyrir hvítlista">
+<!ENTITY context.disablefilteronsite.label "Aftengja síu fyrir ?1?">
+<!ENTITY detached.title "Adblock Plus: Lokaðir hlutir (aðskildir)">
+<!ENTITY docDomain.firstParty "(frumaðili)">
+<!ENTITY tooltip.type.whitelisted "(hvítlisti)">
+<!ENTITY tooltip.filter.label "Sía í notkun:">
+<!ENTITY tooltip.filter.disabled "(óvirkt)">
+<!ENTITY context.editfilter.label "Breyta núverandi síu">
+<!ENTITY tooltip.type.blocked "(stöðvað)">
+<!ENTITY size.label "Stærð">
+<!ENTITY context.whitelist.label "Bæta við undantekningu fyrir hlut">
+<!ENTITY context.selectAll.label "Velja allt">
+<!ENTITY state.label "Ríki">
+<!ENTITY docDomain.label "Netfang síðu">
+<!ENTITY tooltip.address.label "Netfang:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/subscriptionSelection.dtd
new file mode 100644
index 0000000..8d2a550
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Bæta einnig við &amp;síu áskrift &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plus gat ekki náð í lista af áskriftum.">
+<!ENTITY list.download.retry "Reyndu aftur">
+<!ENTITY title.label "Ãskrif&amp;tartitill:">
+<!ENTITY list.download.website "Skoða vefsvæði">
+<!ENTITY supplementMessage "Þessi síu áskrift er ætluð til þess að vera notuð með síu áskrift &quot;?1?&quot; sem þú hefur ekki ennþá bætt við.">
+<!ENTITY viewList.label "Skoða síur">
+<!ENTITY visitHomepage.label "Heimsækja heimasíðu">
+<!ENTITY addSubscription.label "Bæta við áskrift">
+<!ENTITY dialog.title "Bæta við Adblock Plus síu áskrift">
+<!ENTITY location.label "Staðsetning síu&amp;lista:">
+<!ENTITY fromWeb.description "Staðfestu að þú viljir bæta við þessari síu áskrift. Þú getur breytt titlinum eða staðsetningu áður en þú bætir við.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/composer.dtd
new file mode 100644
index 0000000..ad05b55
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "alla f&amp;ine dell'indirizzo web">
+<!ENTITY domainRestriction.label "Limita al &amp;dominio:">
+<!ENTITY collapse.default.no.label "Utilizza predefiniti (no)">
+<!ENTITY firstParty.label "Solo dominii di p&amp;rimo livello">
+<!ENTITY preferences.label "&amp;Mostra i filtri esistenti…">
+<!ENTITY pattern.label "Modelli">
+<!ENTITY thirdParty.label "&amp;Solo domini di terza parte">
+<!ENTITY filter.label "&amp;Nuovo filtro:">
+<!ENTITY collapse.label "&amp;Contrai bloccati:">
+<!ENTITY match.warning "Il modello inserito non corrisponde più all'indirizzo web da bloccare/permettere e non avrà quindi alcun effetto">
+<!ENTITY anchor.start.label "all'i&amp;nizio dell'indirizzo web">
+<!ENTITY matchCase.label "Mai&amp;uscole/minuscole">
+<!ENTITY custom.pattern.label "&amp;Personalizza:">
+<!ENTITY unselectAllTypes.label "Deseleziona">
+<!ENTITY type.whitelist.label "Eccezione">
+<!ENTITY regexp.warning "Il modello inserito verrà interpretato come espressione regolare. Un numero eccessivo di tali modelli potrebbe rallentare la navigazione. Se non si intende utilizzare le espressioni regolari aggiungere il carattere * alla fine del modello">
+<!ENTITY dialog.title "Nuovo filtro di Adblock Plus">
+<!ENTITY basic.label "&lt;&lt; Generali">
+<!ENTITY type.filter.label "Filtro &amp;per bloccare">
+<!ENTITY types.label "Applica ai tipi:">
+<!ENTITY shortpattern.warning "Il modello inserito è troppo breve per essere ottimizzato. Un numero eccessivo di tali modelli potrebbe rallentare la navigazione. Sarebbe preferibile utilizzare una stringa più lunga">
+<!ENTITY collapse.yes.label "Sì">
+<!ENTITY anchors.label "Accetta modelli solo:">
+<!ENTITY collapse.default.yes.label "Utilizza predefiniti (sì)">
+<!ENTITY domainRestriction.help "È possibile specificare uno o più dominii separandoli con il carattere &quot;|&quot;: il filtro verrà applicato solamente a tali dominii (si noti che il carattere &quot;~&quot; prima del nome di un dominio significa che il filtro non verrà applicato per tale dominio)">
+<!ENTITY accept.label "Aggiungi filtro">
+<!ENTITY options.label "Opzioni">
+<!ENTITY disabled.warning "Adblock Plus è attualmente disattivata. È comunque possibile aggiungere filtri, ma questi verranno applicati solo dopo la [link]riattivazione di Adblock Plus[/link]">
+<!ENTITY anchor.start.flexible.label "all'i&amp;nizio del nome del dominio">
+<!ENTITY collapse.no.label "No">
+<!ENTITY selectAllTypes.label "Seleziona tutti">
+<!ENTITY advanced.label "Avanzate &gt;&gt;">
+<!ENTITY pattern.explanation "Il modello può corrispondere a qualsiasi parte dell'indirizzo web, il carattere * corrisponde ad un carattere jolly. Il filtro verrà applicato ai soli indirizzi web corrispondenti al modello">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/filters.dtd
new file mode 100644
index 0000000..77200a0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Tutti i filtri personalizzati verranno sostituiti dal contenuto del file selezionato. Procedere comunque?">
+<!ENTITY slow.column "Fi&amp;ltri lenti">
+<!ENTITY enabled.column "A&amp;ttivato">
+<!ENTITY subscription.lastDownload.checksumMismatch "Sincronizzazione non riuscita, checksum non corrispondente">
+<!ENTITY noFiltersInGroup.text "Il gruppo di filtri selezionato è vuoto">
+<!ENTITY subscription.actions.label "Azioni">
+<!ENTITY filter.selectAll.label "Seleziona tutto">
+<!ENTITY backupButton.label "&amp;Backup e ripristino">
+<!ENTITY restore.minVersion.warning "Attenzione: il file di backup è stato creato con una versione più recente di Adblock Plus. Installare l'ultima versione di Adblock Plus per poter effettuare il ripristino da tale file">
+<!ENTITY restore.error "Impossibile effettuare il ripristino del backup poiché il file selezionato probabilmente non è un file di backup di Adblock Plus">
+<!ENTITY sort.ascending.label "Ordin&amp;a A &gt; Z">
+<!ENTITY sort.label "&amp;Ordina">
+<!ENTITY subscription.source.label "Lista di filtri">
+<!ENTITY hitcount.column "Acce&amp;ssi">
+<!ENTITY noFilters.text "Non è stato ancora aggiunto alcun filtro personalizzato">
+<!ENTITY backup.custom.title "Solo filtri personalizzati">
+<!ENTITY subscription.external.label "Sottoscrizione aggiornata da un'altra estensione">
+<!ENTITY subscription.delete.label "Elimina">
+<!ENTITY noGroupSelected.text "Selezionare un gruppo di filtri per visualizzarne i filtri">
+<!ENTITY filter.cut.label "Taglia">
+<!ENTITY restore.default.label "Ripristina il backup datato ?1?">
+<!ENTITY subscription.lastDownload.inProgress "download in corso…">
+<!ENTITY subscriptions.tab.label "Sottoscrizioni di filtri">
+<!ENTITY sort.descending.label "Ordina &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Eliminare tutti i filtri selezionati?">
+<!ENTITY filter.delete.label "Elimina">
+<!ENTITY addSubscriptionAdd.label "Aggiungi">
+<!ENTITY viewMenu.label "Visualizza">
+<!ENTITY subscription.lastDownload.unknown "sconosciuto">
+<!ENTITY addSubscriptionCancel.label "Annulla">
+<!ENTITY subscription.enabled.label "Attiva">
+<!ENTITY noSubscriptions.text "Non è stata ancora aggiunta alcuna sottoscrizione di filtri, senza cui Adblock Plus non
+ bloccherà alcun elemento; fare clic sul pulsante &quot;Aggiungi sottoscrizione…&quot;
+ per aggiungerne una">
+<!ENTITY subscription.update.label "Aggiorna i filtri">
+<!ENTITY dialog.title "Gestione dei filtri di Adblock Plus">
+<!ENTITY addFilter.label "Aggiungi &amp;filtro">
+<!ENTITY subscription.minVersion.warning "Per questa sottoscrizione di filtri è necessaria una versione di Adblock Plus aggiornata. È necessario installare l'ultima versione di Adblock Plus">
+<!ENTITY subscription.lastDownload.invalidURL "Sincronizzazione non riuscita, indirizzo web non valido">
+<!ENTITY backup.error "Si è verificato un errore durante la creazione del file di backup. Verificare i permessi di scrittura per il file e/o che non sia già utilizzato da un'altra applicazione">
+<!ENTITY filter.moveUp.label "Sposta su">
+<!ENTITY addGroup.label "A&amp;ggiungi gruppo di filtri">
+<!ENTITY filter.edit.label "Modifica">
+<!ENTITY subscription.showHideFilters.label "Mostra/nascondi i filtri">
+<!ENTITY acceptableAds2.label "&amp;Permetti alcune pubblicità non inopportune">
+<!ENTITY addSubscriptionOther.label "Altre sottoscrizioni">
+<!ENTITY close.label "Chiudi">
+<!ENTITY sort.none.label "Non or&amp;dinare">
+<!ENTITY filter.actions.label "Opzioni del filtro">
+<!ENTITY filter.copy.label "Copia">
+<!ENTITY filter.moveDown.label "Sposta giù">
+<!ENTITY filter.resetHitCounts.label "Ripristina le statistiche di accesso">
+<!ENTITY readMore.label "Ulteriori informazioni…">
+<!ENTITY subscription.moveUp.label "Sposta su">
+<!ENTITY addSubscription.label "&amp;Aggiungi sottoscrizione">
+<!ENTITY subscription.homepage.label "Sito web">
+<!ENTITY backup.complete.title "Tutti i filtri e le sottoscrizioni">
+<!ENTITY restore.own.label "Backup personale da ripristinare">
+<!ENTITY restore.complete.warning "Tutte le impostazioni dei filtri verranno sostituite dal contenuto del file selezionato. Procedere comunque?">
+<!ENTITY filters.tab.label "Filtri personalizzati">
+<!ENTITY backup.label "Nuovo backup">
+<!ENTITY find.label "Tro&amp;va">
+<!ENTITY subscription.moveDown.label "Sposta giù">
+<!ENTITY subscription.lastDownload.connectionError "Sincronizzazione non riuscita, errore durante il download">
+<!ENTITY subscription.lastDownload.success "Sincronizzazione effettuata con successo">
+<!ENTITY subscription.lastDownload.invalidData "Sincronizzazione non riuscita, lista dei filtri non valida">
+<!ENTITY filter.paste.label "Incolla">
+<!ENTITY subscription.disabledFilters.enable "Attiva i filtri disattivati">
+<!ENTITY lasthit.column "&amp;Ultimo accesso">
+<!ENTITY subscription.editTitle.label "Modifica il titolo">
+<!ENTITY subscription.disabledFilters.warning "Alcuni filtri di questa sottoscrizione sono disattivati.">
+<!ENTITY filter.column "&amp;Ruolo del filtro">
+<!ENTITY subscription.lastDownload.label "Ultimo aggiornamento:">
+<!ENTITY viewList.label "Visualizza la lista…">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/firstRun.properties
new file mode 100644
index 0000000..bd96e56
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Naviga privatamente disattivando il tracciamento, nascondendo alle compagnie pubblicitarie quali siti web vengono visitati
+firstRun_toggle_off=Disattivato
+firstRun_feature_tracking=Disattiva il tracciamento
+firstRun_feature_malware=Blocco del malware
+firstRun_title=Adblock Plus è stata installata
+firstRun_toggle_on=Attivo
+firstRun_acceptableAdsExplanation=Vorremmo incoraggiare i siti web ad utilizzare pubblicità semplici e discrete. Ecco perché sono state stabilite <a>severe linee guida</a> per identificare pubblicità accettabili, che saranno visualizzate con le impostazioni predefinite. Per bloccare comunque tutte le pubblicità è possibile <a>disattivare</a> l'opzione rapidamente
+firstRun_contributor_credits=Lista dei collaboratori
+firstRun_dataCorruptionWarning=Questa pagina continua ad essere visualizzata? <a>Fai clic qui</a>
+firstRun_acceptableAdsHeadline=Le pubblicità fastidiose verranno bloccate
+firstRun_share=Dillo ai tuoi amici
+firstRun_share_headline=<a>Aiuta</a> a rendere il web un luogo migliore
+firstRun_feature_social_description=Elimina automaticamente i pulsanti social media, come Facebook Like, che compaiono sulle pagine web e tracciano poi quali siti vengono visitati
+firstRun_filterlistsReinitializedWarning=Sembra che un problema abbia causato la rimozione di tutti i filtri e non siamo stati in grado di ripristinare un backup. Quindi abbiamo dovuto azzerare i filtri e le impostazioni per la pubblicità accettabile. Si prega di controllare le impostazioni per la pubblicità accettabile e gli elenchi dei filtri nelle <a>opzioni di Adblock Plus</a>.
+firstRun_feature_malware_description=Rendi la tua navigazione più sicura bloccando domini pericolosi conosciuti
+firstRun_features=Adblock Plus può fare di più, oltre a bloccare pubblicità
+firstRun_donate=dona
+firstRun_donate_label=Sostieni il nostro progetto
+firstRun_feature_social=Elimina i pulsanti Social Media
+firstRun_legacySafariWarning=Si sta utilizzando una vecchia versione di Safari che non è supportato da Adblock Plus. Potrebbe non funzionare correttamente o compromettere l'esperienza dell'utente su alcuni siti Web. Si consiglia vivamente di aggiornare a Safari 6.1.1 o superiore (disponibile per Mac OS X 10.8 Mountain Lion), or Safari 7.0.1 (per OS X 10.9 Maveriscks), o di utilizzare l'ultima versione di Mozilla Firefox, Google Chrome o Opera.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/global.properties
new file mode 100644
index 0000000..7c4f1fb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Nessun elemento bloccabile nella pagina attuale
+action3_tooltip=Fare clic per attivare/disattivare Adblock Plus
+notification_antiadblock_title=Nascondere messaggi mirati?
+type_label_script=script
+filter_elemhide_nocriteria=Non è stato specificato alcun criterio per rilevare l'elemento da nascondere
+blockingGroup_title=Gruppo di filtri per bloccare elementi
+whitelisted_tooltip=Adblock Plus è attiva ma è stata disattivata per la pagina attuale
+type_label_stylesheet=foglio di stile
+blocked_count_tooltip=?1? di ?2?
+type_label_font=carattere
+type_label_popup=finestra a pop-up
+filter_regexp_tooltip=Il filtro inserito verrà interpretato come un'espressione regolare. Un numero eccessivo di tali filtri potrebbe rallentare la navigazione
+action0_tooltip=Fare clic per visualizzare il menu contestuale, clic centrale per attivare/disattivare
+whitelisted_page=Adblock Plus è stata disattivata per la pagina attuale
+remove_group_warning=Eliminare il gruppo di filtri?
+action1_tooltip=Fare clic per aprire/chiudere la finestra degli elementi bloccabili, clic centrale per attivare/disattivare
+type_label_xmlhttprequest=richiesta XML
+active_tooltip=Adblock Plus è attiva (sottoscrizioni di filtri in uso: ?1?, filtri in uso: ?2?)
+type_label_document=documento
+type_label_object_subrequest=oggetto sottorichiesto
+whitelistGroup_title=Gruppo di filtri per permettere elementi
+disabled_tooltip=Adblock Plus è disattivata
+filter_elemhide_duplicate_id=È possibile specificare solo un ID dell'elemento da nascondere
+type_label_object=oggetto
+action2_tooltip=Fare clic per aprire la finestra di gestione dei filtri, clic centrale per attivare/disattivare
+type_label_subdocument=riquadro
+clearStats_warning=Azzerare le statistiche per tutti i filtri e disattivarne il futuro conteggio?
+notification_antiadblock_message=Questo sito è noto per mostrare messaggi mirati agli utenti di Adblock Plus. Vuoi che Adblock Plus nasconda i messaggi mirati (pubblicità)?
+blocked_count_addendum=(elementi permessi: ?1?, elementi nascosti: ?2?)
+subscription_invalid_location=Attenzione: per poter aggiungere una sottoscrizione è necessario che i campi 'Titolo della sottoscrizione:' ed 'Indirizzo della lista dei filtri:' non siano lasciati vuoti e corrispondano a nomi di file validi. Inserire tali dati e ripetere la procedura
+type_label_image=immagine
+remove_subscription_warning=Eliminare la sottoscrizione di filtri?
+type_label_other=altro
+mobile_menu_enable=Attiva ABP
+type_label_media=audio/video
+mobile_menu_disable_site=ABP è disattivata per ?1?
+elemhideGroup_title=Gruppo di filtri per nascondere elementi
+mobile_menu_enable_site=ABP è attivata per ?1?
+type_label_elemhide=nascosto
+newGroup_title=Nuovo gruppo di filtri
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/overlay.dtd
new file mode 100644
index 0000000..3bd3482
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "Sì">
+<!ENTITY notification.button.no "No">
+<!ENTITY sync.label "Sincronizza le impostazioni di Adbloc&amp;k Plus">
+<!ENTITY whitelist.site.label "Disattiva per ?1?">
+<!ENTITY filters.label "Gestione dei &amp;filtri">
+<!ENTITY disable.label "Disattiva per tutte le pagine">
+<!ENTITY objecttab.title "Blocca">
+<!ENTITY objecttab.tooltip "Fare clic qui per bloccare l'oggetto con Adblock Plus">
+<!ENTITY menuitem.label "Gestione dei filtri di &amp;Adblock Plus">
+<!ENTITY objecttabs.label "Mos&amp;tra linguetta 'Blocca…' per elementi Flash e Java">
+<!ENTITY sendReport.label "&amp;Segnala problemi nella pagina attuale">
+<!ENTITY whitelist.page.label "Disattiva solo per la pagina attuale">
+<!ENTITY context.image.label "Blocca immagine con Adblock Plus">
+<!ENTITY counthits.label "&amp;Effettua le statistiche di accesso">
+<!ENTITY opensidebar.label "Apri l'elenco degli elementi &amp;bloccabili">
+<!ENTITY notification.button.close "Chiudi">
+<!ENTITY contribute.label "Contribuisci ad Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Blocca riquadro con Adblock Plus">
+<!ENTITY blocked.tooltip "Elementi attualmente bloccati">
+<!ENTITY hideplaceholders.label "&amp;Nascondi gli elementi bloccati">
+<!ENTITY showinstatusbar.label "Vi&amp;sualizza nella barra di stato">
+<!ENTITY sidebar.title "Elenco degli elementi bloccabili con Adblock Plus">
+<!ENTITY options.label "&amp;Opzioni di Adblock Plus">
+<!ENTITY context.object.label "Blocca oggetto con Adblock Plus">
+<!ENTITY context.removeWhitelist.label "Riattiva Adblock Plus nella pagina attuale">
+<!ENTITY filters.tooltip "Filtri di Adblock Plus maggiormente attivi">
+<!ENTITY closesidebar.label "Chiudi l'elenco degli elementi &amp;bloccabili">
+<!ENTITY showintoolbar.label "Visualizza nella &amp;barra degli strumenti">
+<!ENTITY status.tooltip "Stato di Adblock Plus">
+<!ENTITY context.media.label "Blocca video/audio con Adblock Plus">
+<!ENTITY subscription.update.label "Aggiorna i filtri">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/sendReport.dtd
new file mode 100644
index 0000000..5d83af1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/sendReport.dtd
@@ -0,0 +1,97 @@
+<!ENTITY screenshot.undo.label "&amp;Annulla">
+<!ENTITY issues.disabledgroups.description "Gruppi/sottoscrizioni di filtri sono stati disattivati, ma potrebbero avere effetto
+ nella seguente pagina web:">
+<!ENTITY showData.label "Mostra i dati della segnalazione">
+<!ENTITY typeSelector.falsePositive.label "Adblock &amp;Plus sta bloccando troppi elementi">
+<!ENTITY issues.change.description "Le impostazioni di Adblock Plus sono state modificate. Ricaricare la pagina web per testare le
+ modifiche e se il problema dovesse persistere inviare la segnalazione">
+<!ENTITY email.label "Indirizzo e-&amp;mail:">
+<!ENTITY issues.openPreferences.label "Apri la finestra di 'Gestione dei filtri di Adblock Plus'…">
+<!ENTITY sendPage.confirmation "Segnalazione inviata correttamente, per visualizzarne i dati fare clic sul seguente link:">
+<!ENTITY copyLink.label "Copia il lin&amp;k della segnalazione">
+<!ENTITY issues.nofilters.description "Adblock Plus attualmente non sta bloccando alcun elemento. Il problema che si è
+ verificato è più probabile che non sia relativo ad Adblock Plus">
+<!ENTITY sendPage.knownIssue "Problema segnalato precedentemente noto. Ulteriori informazioni:">
+<!ENTITY typeSelector.other.description "Selezionare questa opzione se nella pagina web si sta verificando un problema di altro tipo
+ che si sospetta relativo all'estensione stessa piuttosto che ai suoi filtri">
+<!ENTITY issues.disabledgroups.enable.label "Attiva gruppi/sottoscrizioni di filtri">
+<!ENTITY typeWarning.override.label "Comprendo e &amp;voglio inviare la segnalazione comunque">
+<!ENTITY issues.disabled.enable.label "Attiva Adblock Plus">
+<!ENTITY update.fixed.description "L'aggiornamento della sottoscrizione di filtri potrebbe aver risolto il problema che si stava segnalando. Ricaricare la pagina e riprovare; se il problema persiste inviare nuovamente la segnalazione">
+<!ENTITY anonymous.label "Seg&amp;nalazione anonima">
+<!ENTITY reloadButton.label "Ricarica la &amp;pagina web">
+<!ENTITY recentReports.clear.label "Elimina &amp;tutte le segnalazioni">
+<!ENTITY typeSelector.description "La configurazione guidata permette passo a passo di raccogliere ed inviare i dati necessari per effettuare la
+ segnalazione di Adblock Plus di problemi in una pagina web. Come primo passo, selezionare il tipo di problema
+ che si è verificato">
+<!ENTITY screenshot.remove.label "&amp;Elimina i dati sensibili">
+<!ENTITY issues.ownfilters.description "Alcuni dei filtri che vengono applicati nella pagina web attuale sono personalizzati;
+ disattivare tali filtri che potrebbero essere la causa del seguente problema:">
+<!ENTITY update.inProgress.description "È necessario aggiornare la sottoscrizione di filtri per verificare che il problema non sia già stato risolto. Attendere…">
+<!ENTITY sendPage.retry.label "Riprova ad inviare">
+<!ENTITY data.label "&amp;Dati della segnalazione:">
+<!ENTITY recentReports.label "Segnalazioni recentemente inviate">
+<!ENTITY typeWarning.description "È stato indicato che si vuole segnalare un problema generico relativo all'estensione
+ stessa piuttosto che ai suoi filtri. Poiché tali problemi sono riportati meglio sul
+ [link]forum di Adblock Plus[/link], si suggerisce di utilizzare la segnalazione di
+ problemi solo come integrazione di una discussione già esistente, visto che nessuno noterà
+ una segnalazione priva di relativo link alla pagina web dove si verifica appunto il problema.
+ Il link generato automaticamente verrà fornito dopo l'invio della segnalazione">
+<!ENTITY issues.disabled.description "Adblock Plus è attualmente disattivata e quindi non bloccherà alcun elemento">
+<!ENTITY attachExtensions.label "A&amp;llega la lista di estensioni e plugin attivi">
+<!ENTITY issues.nosubscriptions.add.label "Aggiungi una sottoscrizione di filtri…">
+<!ENTITY issues.disabledfilters.enable.label "Attiva i filtri">
+<!ENTITY issues.override.label "&amp;Le impostazioni di Adblock Plus sono corrette, proseguire con la raccolta dei dati per la segnalazione">
+<!ENTITY issues.nosubscriptions.description "Non sembra essere attiva alcuna sottoscrizione di filtri che permette l'eliminazione
+ automatica di banner e/o pubblicità presenti nei siti web">
+<!ENTITY typeSelector.falsePositive.description "Selezionare questa opzione se nella pagina web manca parte del contenuto importante, se la pagina web viene
+ visualizzata non correttamente oppure se non funziona come dovrebbe. È possibile determinare se sia Adblock Plus
+ la causa del problema disattivando temporaneamente l'estensione">
+<!ENTITY typeSelector.other.label "&amp;Si è verificato un problema di altro tipo">
+<!ENTITY emailComment.label "Inserire un indirizzo e-mail valido per poter essere ricontattati in caso di domande su questa segnalazione, per riconoscerne i contributi e per aumentare l'ordine di priorità">
+<!ENTITY issues.whitelist.remove.label "Riattiva Adblock Plus nella pagina attuale">
+<!ENTITY outdatedSubscriptions.description "Le seguenti sottoscrizioni di filtri non sono state aggiornate per almeno due settimane. È necessario aggiornarle prima di inviare una segnalazione, poiché il problema potrebbe esser già stato risolto">
+<!ENTITY dataCollector.description "Attendere mentre vengono raccolti i dati necessari per la segnalazione di Adblock Plus di problemi in una pagina web">
+<!ENTITY sendButton.label "Invia la segnala&amp;zione">
+<!ENTITY comment.label "C&amp;ommento (opzionale):">
+<!ENTITY sendPage.errorMessage "Il tentativo di inviare la segnalazione non è riuscito a causa del seguente errore: &quot;?1?&quot;.
+ Accertarsi di essere collegati ad internet e riprovare. Se il problema persiste inviare una richiesta
+ di assistenza nel [link]forum di Adblock Plus[/link]">
+<!ENTITY showRecentReports.label "Mostra le segnalazioni recentemente inviate">
+<!ENTITY commentPage.heading "Invio di un commento">
+<!ENTITY update.start.label "Avvia l'aggiornamento ora">
+<!ENTITY issues.disabledfilters.description "I filtri sono stati disattivati, ma potrebbero avere effetto nella seguente pagina web:">
+<!ENTITY screenshot.description "Una stessa pagina web può apparire in modo differente a più persone. Potrebbe essere di aiuto per
+ meglio comprendere il problema allegare un'immagine della pagina web alla segnalazione. È
+ possibile eliminare le sezioni contenenti dati sensibili nonché contrassegnare le aree dove il
+ problema è evidente facendo prima clic sui relativi pulsanti ed in seguito selezionando le parti
+ interessate dell'immagine della pagina web con il mouse">
+<!ENTITY screenshot.attach.label "Allega &amp;un'immagine della pagina web alla segnalazione">
+<!ENTITY issues.whitelist.description "Adblock Plus è attualmente disattivata per la pagina web che si sta segnalando. Riattivare
+ l'estensione e ricaricare la pagina prima di inviare la segnalazione del problema per
+ rinvenirne le cause">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus &amp;non sta bloccando alcun elemento">
+<!ENTITY typeSelector.heading "Selezione del problema">
+<!ENTITY anonymity.warning "Nota: è impossibile rispondere a segnalazioni anonime alle quali viene probabilmente dato un ordine di priorità inferiore">
+<!ENTITY wizard.title "Configurazione guidata per segnalare problemi in una pagina web">
+<!ENTITY issues.ownfilters.disable.label "Disattiva i filtri">
+<!ENTITY commentPage.description "È possibile digitare nel relativo campo di testo qui sotto un commento per comprendere meglio
+ il problema segnalato. Questo passo è opzionale ma raccomandato se il problema non è ovvio.
+ È inoltre possibile visualizzare i dati della segnalazione prima di inviarla">
+<!ENTITY comment.lengthWarning "La lunghezza massima del testo del commento è di 1000 caratteri; quelli eccedenti non verranno inviati">
+<!ENTITY typeSelector.falseNegative.description "Selezionare questa opzione se nella pagina web vengono visualizzati banner e/o pubblicità nonostante
+ Adblock Plus sia attiva">
+<!ENTITY sendPage.waitMessage "Attendere mentre la segnalazione di Adblock Plus viene inviata">
+<!ENTITY dataCollector.heading "Benvenuti alla configurazione guidata per segnalare problemi in una pagina web">
+<!ENTITY screenshot.heading "Immagine da allegare">
+<!ENTITY sendPage.heading "Invio della segnalazione">
+<!ENTITY issues.subscriptionCount.description "Sembra che siano state aggiunte troppe sottoscrizioni di filtri. Ciò non è
+ raccomandato poiché aumenta considerevolmente la possibilità che si verifichino
+ dei problemi. È inoltre impossibile accettare tale segnalazione in quanto non
+ è chiaro quale autore di sottoscrizioni di filtri debba controllare; eliminare
+ tutte le sottoscrizioni superflue lasciando solo quella necessaria e verificare
+ se il problema persiste ancora">
+<!ENTITY screenshot.mark.label "&amp;Contrassegna l'area del problema">
+<!ENTITY privacyPolicy.label "Informativa sulla privacy">
+<!ENTITY issues.description "Sono stati rilevati dei problemi con le impostazioni di Adblock Plus che potrebbero essere responsabili
+ del problema da segnalare oppure potrebbero rendere difficile rinvenirne le cause">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/sidebar.dtd
new file mode 100644
index 0000000..2ae120b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Fai lampeggiare il contorno dell'elemento selezionato">
+<!ENTITY address.label "Indirizzo web">
+<!ENTITY context.open.label "Apri in una nuova scheda">
+<!ENTITY type.label "Tipo">
+<!ENTITY tooltip.filterSource.label "Sorgente del filtro:">
+<!ENTITY noitems.label "Nessun elemento bloccabile">
+<!ENTITY filter.label "Filtro">
+<!ENTITY tooltip.size.label "Dimensione:">
+<!ENTITY reattach.label "Riunisci">
+<!ENTITY search.label "&amp;Cerca:">
+<!ENTITY docDomain.thirdParty "(terza parte)">
+<!ENTITY filterSource.label "Sorgente del filtro">
+<!ENTITY tooltip.docDomain.label "Sorgente del documento:">
+<!ENTITY context.copy.label "Copia l'indirizzo web dell'elemento">
+<!ENTITY tooltip.type.label "Tipo:">
+<!ENTITY context.disablefilter.label "Disattiva il filtro ?1?">
+<!ENTITY context.copyFilter.label "Copia il filtro">
+<!ENTITY context.block.label "Blocca questo elemento">
+<!ENTITY context.enablefilter.label "Riattiva il filtro ?1?">
+<!ENTITY detach.label "Separa">
+<!ENTITY whitelisted.label "Pagina in lista di siti permessi">
+<!ENTITY context.disablefilteronsite.label "Disattiva il filtro per ?1?">
+<!ENTITY detached.title "Elementi bloccabili con Adblock Plus (separati)">
+<!ENTITY docDomain.firstParty "(prima parte)">
+<!ENTITY tooltip.type.whitelisted "(in lista di elementi permessi)">
+<!ENTITY tooltip.filter.label "Filtro effettivo:">
+<!ENTITY tooltip.filter.disabled "(disattivato)">
+<!ENTITY context.editfilter.label "Modifica il filtro in effetto">
+<!ENTITY tooltip.type.blocked "(in lista di elementi bloccati)">
+<!ENTITY size.label "Dimensione">
+<!ENTITY context.whitelist.label "Aggiungi un'eccezione per l'elemento">
+<!ENTITY context.selectAll.label "Seleziona tutto">
+<!ENTITY state.label "Stato">
+<!ENTITY docDomain.label "Sorgente">
+<!ENTITY tooltip.address.label "Indirizzo web:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/subscriptionSelection.dtd
new file mode 100644
index 0000000..36af5cd
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Aggiungere la &amp;sottoscrizione di filtri &quot;?1?&quot;">
+<!ENTITY list.download.failed "Recupero della lista di sottoscrizioni non riuscito">
+<!ENTITY list.download.retry "Riprova">
+<!ENTITY title.label "&amp;Titolo della sottoscrizione:">
+<!ENTITY list.download.website "Visita il sito web delle sottoscrizioni">
+<!ENTITY supplementMessage "Questa sottoscrizione di filtri verrà utilizzata insieme a quella chiamata &quot;?1?&quot; (ancora non aggiunta).">
+<!ENTITY viewList.label "Visualizza i filtri della sottoscrizione">
+<!ENTITY visitHomepage.label "Visita il sito web">
+<!ENTITY addSubscription.label "Aggiungi sottoscrizione">
+<!ENTITY dialog.title "Sottoscrizione di filtri di Adblock Plus">
+<!ENTITY location.label "Indiri&amp;zzo web della lista dei filtri:">
+<!ENTITY fromWeb.description "Confermare l'aggiunta della sottoscrizione di filtri. È possibile modificare il titolo della sottoscrizione oppure l'URL/percorso della lista dei filtri prima di aggiungerla">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/composer.dtd
new file mode 100644
index 0000000..0c162d5
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "アドレス末尾(&amp;N)">
+<!ENTITY domainRestriction.label "ドメイン制é™:(&amp;D)">
+<!ENTITY collapse.default.no.label "デフォルト (ã„ã„ãˆ)">
+<!ENTITY firstParty.label "ファーストパーティ制é™(&amp;R)">
+<!ENTITY preferences.label "既存ã®ãƒ•ィルタを表示...(&amp;S)">
+<!ENTITY pattern.label "ãƒ‘ã‚¿ãƒ¼ãƒ³ã‚’é¸æŠž">
+<!ENTITY thirdParty.label "サードパーティ制é™(&amp;T)">
+<!ENTITY filter.label "新フィルタ:(&amp;F)">
+<!ENTITY collapse.label "ブロック後ã®ç©ºãスペースを詰ã‚ã‚‹:(&amp;L)">
+<!ENTITY match.warning "入力ã—ãŸãƒ‘ターンã¯ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ä¸€è‡´ã—ãªã„ã®ã§åŠ¹æžœãŒã‚りã¾ã›ã‚“。">
+<!ENTITY anchor.start.label "アドレス先頭(&amp;G)">
+<!ENTITY matchCase.label "å¤§æ–‡å­—å°æ–‡å­—を区別(&amp;M)">
+<!ENTITY custom.pattern.label "自作:(&amp;C)">
+<!ENTITY unselectAllTypes.label "é¸æŠžè§£é™¤">
+<!ENTITY type.whitelist.label "ホワイトリスト(&amp;X)">
+<!ENTITY regexp.warning "入力ã•れãŸãƒ‘ã‚¿ãƒ¼ãƒ³ã¯æ­£è¦è¡¨ç¾ã¨ã—ã¦è§£é‡ˆã•れるãŸã‚ Adblock Plus ãŒåŠ¹çŽ‡ã‚ˆã処ç†ã§ããšã€ãƒ–ラウジング速度低下ã®åŽŸå› ã«ãªã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ã‚‚ã—æ­£è¦è¡¨ç¾ã®ä½¿ç”¨ã‚’æ„図ã—ã¦ã„ãªã‹ã£ãŸå ´åˆã¯ã€ãƒ‘ターン末尾ã«åŠè§’アスタリスク (*) を追加ã—ã¦ãã ã•ã„。">
+<!ENTITY dialog.title "Adblock Plus フィルタを追加">
+<!ENTITY basic.label "基本表示">
+<!ENTITY type.filter.label "ブロックフィルタ(&amp;B)">
+<!ENTITY types.label "é©ç”¨ç¨®åˆ¥:">
+<!ENTITY shortpattern.warning "入力ã—ãŸãƒ‘ã‚¿ãƒ¼ãƒ³ã¯æœ€é©åŒ–ã™ã‚‹ã«ã¯çŸ­ã™ãŽã‚‹ãŸã‚ブラウジング速度ãŒä½Žä¸‹ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚Adblock Plus ã®å‡¦ç†ã‚’効率化ã™ã‚‹ãŸã‚ã«ã€ã‚ˆã‚Šé•·ã„文字列をé¸ã¶ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚">
+<!ENTITY collapse.yes.label "ã¯ã„">
+<!ENTITY anchors.label "パターンé©ç”¨ã®èµ·ç‚¹:">
+<!ENTITY collapse.default.yes.label "デフォルト (ã¯ã„)">
+<!ENTITY domainRestriction.help "フィルタé©ç”¨å¯¾è±¡ã«ã™ã‚‹ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚複数指定ã—ãŸã„å ´åˆã¯ç¸¦ç·š(|)ã§åˆ†ã‘ã¦ãã ã•ã„。ドメインåã®å‰ã«ãƒãƒ«ãƒ€(~)を付ã‘ã‚‹ã“ã¨ã§ã€é©ç”¨å¤–ドメインã¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™">
+<!ENTITY accept.label "フィルタを追加">
+<!ENTITY options.label "オプション">
+<!ENTITY disabled.warning "ç¾åœ¨ Adblock Plus ã¯ç„¡åйã«ãªã£ã¦ã„ã¾ã™ã€‚フィルタを追加ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã™ãŒã€ãれら㯠[link]Adblock Plus を有効ã«ã™ã‚‹[/link] ã¾ã§é©ç”¨ã•れã¾ã›ã‚“。">
+<!ENTITY anchor.start.flexible.label "ドメインå先頭(&amp;G)">
+<!ENTITY collapse.no.label "ã„ã„ãˆ">
+<!ENTITY selectAllTypes.label "ã™ã¹ã¦é¸æŠž">
+<!ENTITY advanced.label "詳細表示">
+<!ENTITY pattern.explanation "パターンã¨ã¯ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ä»»æ„ã®ä¸€éƒ¨ã®ã“ã¨ã§ã™ã€‚åŠè§’アスタリスク (*) をワイルドカードã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚指定ã—ãŸãƒ‘ターンã«ä¸€è‡´ã—ãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã®ã¿ãƒ•ィルタãŒé©ç”¨ã•れã¾ã™ã€‚">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/filters.dtd
new file mode 100644
index 0000000..b5d5270
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "å…¨ã¦ã®è‡ªä½œãƒ•ã‚£ãƒ«ã‚¿ã¯æŒ‡å®šã—ãŸãƒ•ァイルã®å†…容ã«ç½®æ›ã•れã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ">
+<!ENTITY slow.column "低速フィルタ(&amp;W)">
+<!ENTITY enabled.column "有効(&amp;N)">
+<!ENTITY subscription.lastDownload.checksumMismatch "更新失敗: ãƒã‚§ãƒƒã‚¯ã‚µãƒ ä¸ä¸€è‡´">
+<!ENTITY noFiltersInGroup.text "é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã«ãƒ•ィルタã¯ã‚りã¾ã›ã‚“">
+<!ENTITY subscription.actions.label "アクション">
+<!ENTITY filter.selectAll.label "ã™ã¹ã¦é¸æŠž">
+<!ENTITY backupButton.label "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¨å¾©å…ƒ(&amp;B)">
+<!ENTITY restore.minVersion.warning "警告: ã“ã®ãƒ•ァイルã¯ã‚ˆã‚Šæ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® Adblock Plus ã§ä½œæˆã•れã¦ã„ã¾ã™ã€‚ã“ã®ãƒ•ァイルã‹ã‚‰å¾©å…ƒã™ã‚‹å‰ã« Adblock Plus ã‚’æœ€æ–°ç‰ˆã«æ›´æ–°ã—ã¦ãã ã•ã„。">
+<!ENTITY restore.error "ファイルデータãŒå‡¦ç†ã§ãã¾ã›ã‚“。ã“ã®ãƒ•ァイル㯠Adblock Plus ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã§ãªã„ã®ã§ã¯ï¼Ÿ">
+<!ENTITY sort.ascending.label "&amp;A &gt; Z é †ã«ã‚½ãƒ¼ãƒˆ">
+<!ENTITY sort.label "ソート(&amp;S)">
+<!ENTITY subscription.source.label "フィルタリスト">
+<!ENTITY hitcount.column "ヒット数(&amp;H)">
+<!ENTITY noFilters.text "ã¾ã è‡ªä½œãƒ•ィルタã¯ã‚りã¾ã›ã‚“。">
+<!ENTITY backup.custom.title "自作フィルタã®ã¿">
+<!ENTITY subscription.external.label "ä»–ã®æ‹¡å¼µã«ã‚ˆã‚Šæ›´æ–°">
+<!ENTITY subscription.delete.label "削除">
+<!ENTITY noGroupSelected.text "フィルタを表示ã™ã‚‹ã«ã¯ã€ã¾ãšãƒ•ã‚£ãƒ«ã‚¿ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„">
+<!ENTITY filter.cut.label "切りå–り">
+<!ENTITY restore.default.label "?1? ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‹ã‚‰å¾©å…ƒ">
+<!ENTITY subscription.lastDownload.inProgress "ダウンロード中...">
+<!ENTITY subscriptions.tab.label "購読ã—ã¦ã„るフィルタ">
+<!ENTITY sort.descending.label "&amp;Z &gt; A é †ã«ã‚½ãƒ¼ãƒˆ">
+<!ENTITY filters.remove.warning "é¸æŠžã—ãŸãƒ•ィルタを本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ">
+<!ENTITY filter.delete.label "削除">
+<!ENTITY addSubscriptionAdd.label "追加">
+<!ENTITY viewMenu.label "表示">
+<!ENTITY subscription.lastDownload.unknown "䏿˜Ž">
+<!ENTITY addSubscriptionCancel.label "キャンセル">
+<!ENTITY subscription.enabled.label "有効">
+<!ENTITY noSubscriptions.text "フィルタをã¾ã è³¼èª­ã—ã¦ã„ã¾ã›ã‚“。Adblock Plus ã¯ãƒ•ィルタãªã—ã§ä½•もブロックã§ããªã„ã®ã§ã€Œè³¼èª­ã™ã‚‹ãƒ•ィルタを追加ã€ã—ã¦ãã ã•ã„。">
+<!ENTITY subscription.update.label "フィルタを更新">
+<!ENTITY dialog.title "Adblock Plus フィルタ設定">
+<!ENTITY addFilter.label "フィルタを追加(&amp;D)">
+<!ENTITY subscription.minVersion.warning "購読ã—ã¦ã„るフィルタã¯ã‚ˆã‚Šæ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® Adblock Plus ã‚’è¦æ±‚ã—ã¦ã„ã‚‹ã®ã§ã€æœ€æ–°ã® Adblock Plus ã«æ›´æ–°ã—ã¦ãã ã•ã„。">
+<!ENTITY subscription.lastDownload.invalidURL "更新失敗: アドレス無効">
+<!ENTITY backup.error "ファイル出力エラー。ファイル書ãè¾¼ã¿ç¦æ­¢ï¼ä»–ã®ã‚¢ãƒ—リケーションã§ä½¿ç”¨ä¸­ ã¨ãªã£ã¦ã„ãªã„ã‹ç¢ºèªã—ã¦ãã ã•ã„。">
+<!ENTITY filter.moveUp.label "上ã«ç§»å‹•">
+<!ENTITY addGroup.label "フィルタグループを追加(&amp;G)">
+<!ENTITY filter.edit.label "編集">
+<!ENTITY subscription.showHideFilters.label "フィルタを表示ï¼éžè¡¨ç¤º">
+<!ENTITY acceptableAds2.label "控ãˆã‚ãªåºƒå‘Šã‚’許å¯(&amp;I)">
+<!ENTITY addSubscriptionOther.label "別ã®è³¼èª­ã™ã‚‹ãƒ•ィルタを追加">
+<!ENTITY close.label "é–‰ã˜ã‚‹">
+<!ENTITY sort.none.label "ソートã—ãªã„(&amp;U)">
+<!ENTITY filter.actions.label "フィルタアクション">
+<!ENTITY filter.copy.label "コピー">
+<!ENTITY filter.moveDown.label "下ã«ç§»å‹•">
+<!ENTITY filter.resetHitCounts.label "ヒット数をリセット">
+<!ENTITY readMore.label "詳細説明ページを開ã">
+<!ENTITY subscription.moveUp.label "上ã«ç§»å‹•">
+<!ENTITY addSubscription.label "購読ã™ã‚‹ãƒ•ィルタを追加(&amp;F)">
+<!ENTITY subscription.homepage.label "ホームページ">
+<!ENTITY backup.complete.title "自作åŠã³è³¼èª­ã—ã¦ã„るフィルタ">
+<!ENTITY restore.own.label "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ファイルを指定ã—ã¦å¾©å…ƒ">
+<!ENTITY restore.complete.warning "å…¨ã¦ã®ãƒ•ã‚£ãƒ«ã‚¿è¨­å®šã¯æŒ‡å®šã—ãŸãƒ•ァイルã®å†…容ã«ç½®æ›ã•れã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ">
+<!ENTITY filters.tab.label "自作フィルタ">
+<!ENTITY backup.label "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’æ–°è¦ä½œæˆ">
+<!ENTITY find.label "検索(&amp;N)">
+<!ENTITY subscription.moveDown.label "下ã«ç§»å‹•">
+<!ENTITY subscription.lastDownload.connectionError "更新失敗: 接続エラー">
+<!ENTITY subscription.lastDownload.success "æ›´æ–°æˆåŠŸ">
+<!ENTITY subscription.lastDownload.invalidData "更新失敗: フィルタリスト無効">
+<!ENTITY filter.paste.label "貼り付ã‘">
+<!ENTITY subscription.disabledFilters.enable "無効ã«ãªã£ã¦ã„るフィルタを有効化">
+<!ENTITY lasthit.column "最終ヒット日時(&amp;L)">
+<!ENTITY subscription.editTitle.label "タイトルを編集">
+<!ENTITY subscription.disabledFilters.warning "購読ã—ã¦ã„るフィルタã®ä¸€éƒ¨ãŒç„¡åŠ¹åŒ–ã•れã¦ã„ã¾ã™">
+<!ENTITY filter.column "フィルタ(&amp;F)">
+<!ENTITY subscription.lastDownload.label "更新日時:">
+<!ENTITY viewList.label "フィルタファイルを開ã„ã¦ç¢ºèª">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/firstRun.properties
new file mode 100644
index 0000000..776b9e7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=追跡を無効化ã—ã¦ãƒ—ライãƒã‚·ãƒ¼ã‚’確ä¿ã—ã¤ã¤ãƒ–ラウジング - ã‚ãªãŸã®ã‚らゆる動é™ã‚’追跡ã™ã‚‹åºƒå‘Šä¼šç¤¾ã‹ã‚‰è¶³è·¡ã‚’éš ã—ã¾ã™ã€‚
+firstRun_toggle_off=OFF
+firstRun_feature_tracking=トラッキングを無効化
+firstRun_feature_malware=マルウェアをブロック
+firstRun_title=Adblock Plus ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¾ã—ãŸ
+firstRun_toggle_on=ON
+firstRun_acceptableAdsExplanation=我々ã¯ã‚¦ã‚§ãƒ–サイトãŒç°¡ç´ ã§æŽ§ãˆã‚ãªåºƒå‘Šã‚’使用ã™ã‚‹ã‚ˆã†å¾ŒæŠ¼ã—ã—ãŸã„ã¨è€ƒãˆã¦ã„ã¾ã™ã€‚ãã®ãŸã‚控ãˆã‚ãªåºƒå‘Šã‚’区別ã™ã‚‹ãŸã‚ã®<a>厳格ãªã‚¬ã‚¤ãƒ‰ãƒ©ã‚¤ãƒ³</a>を策定ã—ã€ãƒ‡ãƒ•ォルトã§è¨±å¯ã™ã‚‹ã‚ˆã†ã«ã—ã¾ã—ãŸã€‚ã™ã¹ã¦ã®åºƒå‘Šã‚’ブロックã—ãŸã„å ´åˆã¯æ•°ç§’ã§æŽ§ãˆã‚ãªåºƒå‘Šã®è¨±å¯ã‚’<a>無効ã«ã™ã‚‹</a>ã“ã¨ãŒã§ãã¾ã™ 。
+firstRun_contributor_credits=貢献ã—ãŸäºº
+firstRun_dataCorruptionWarning=ã“ã®ãƒšãƒ¼ã‚¸ãŒä½•度もå†è¡¨ç¤ºã•れる場åˆã¯ <a>ã“ã“ã‚’å‚ç…§ï¼</a>
+firstRun_acceptableAdsHeadline=迷惑ãªåºƒå‘Šã¯ãƒ–ロックã•れã¾ã™
+firstRun_share=å‹é”ã«æ•™ãˆã‚‹
+firstRun_share_headline=Web をより良ã„場所ã«ã™ã‚‹ãŸã‚ã«<a>å”力ã™ã‚‹</a>
+firstRun_feature_social_description=Web ページã«è¨­ç½®ã•れã¦ã„ã¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®è¡Œå‹•を追跡ã™ã‚‹ã‚½ãƒ¼ã‚·ãƒ£ãƒ«ãƒ¡ãƒ‡ã‚£ã‚¢ãƒœã‚¿ãƒ³ï¼ˆä¾‹ãˆã° Facebook ã®ã€Œã„ã„ã­ï¼ã€ï¼‰ã‚’自動的ã«å–り除ãã¾ã™ã€‚
+firstRun_filterlistsReinitializedWarning=ã™ã¹ã¦ã®ãƒ•ィルタãŒå‰Šé™¤ã•れã¦ã—ã¾ã†å•題ãŒç™ºç”Ÿã—ãŸã‚ˆã†ã§ã™ã€‚ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‹ã‚‰å¾©å…ƒã™ã‚‹ã“ã¨ãŒã§ããšã€ãŠä½¿ã„ã®ãƒ•ã‚£ãƒ«ã‚¿ã¨æŽ§ãˆã‚ãªåºƒå‘Šã®è¨­å®šã‚’リセットã™ã‚‹å¿…è¦ãŒã‚りã¾ã—ãŸã€‚ <a>Adblock Plus ã®ã‚ªãƒ—ション</a>ã‹ã‚‰ã€ãŠä½¿ã„ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒªã‚¹ãƒˆã¨æŽ§ãˆã‚ãªåºƒå‘Šã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„。
+firstRun_feature_malware_description=既知ã®ãƒžãƒ«ã‚¦ã‚§ã‚¢é…布ドメインをブロックã™ã‚‹ã“ã¨ã§ã€ã‚ˆã‚Šå®‰å…¨ãªãƒ–ラウジングをå¯èƒ½ã«ã—ã¾ã™ã€‚
+firstRun_features=Adblock Plus ã¯å˜ã«åºƒå‘Šã‚’ブロックã™ã‚‹ã ã‘ã§ã¯ã‚りã¾ã›ã‚“
+firstRun_donate=寄付
+firstRun_donate_label=プロジェクトを支æ´
+firstRun_feature_social=ソーシャルメディアã®ãƒœã‚¿ãƒ³ã‚’消ã™
+firstRun_legacySafariWarning=Adblock Plus ãŒã‚µãƒãƒ¼ãƒˆã—ã¦ã„ãªã„å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® Safari を利用ã—ã¦ã„ã‚‹ãŸã‚ã€æ­£å¸¸ã«å‹•作ã—ãªã‹ã£ãŸã‚Šãƒ¦ãƒ¼ã‚¶ãƒ¼ä½“験をæãªã† Web サイトãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。Mac OS X 10.8 Mountain Lion ãªã‚‰ Safari 6.1.1 以é™ã€Mac OS X 10.9 Mavericks ãªã‚‰ Safari 7.0.1 以é™ã«æ›´æ–°ã™ã‚‹ã‹ã€Mozilla Firefoxï¼Google Chromeï¼Opera ã„ãšã‚Œã‹æœ€æ–°ç‰ˆã®åˆ©ç”¨ã‚’å¼·ãæŽ¨å¥¨ã—ã¾ã™ã€‚
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/global.properties
new file mode 100644
index 0000000..842af8e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=ç¾åœ¨ã®ãƒšãƒ¼ã‚¸ã«ãƒ–ロックå¯èƒ½é …ç›®ã¯ã‚りã¾ã›ã‚“
+action3_tooltip=クリック㧠Adblock Plus 有効ï¼ç„¡åŠ¹ã‚’åˆ‡ã‚Šæ›¿ãˆ
+notification_antiadblock_title=Adblock Plus ユーザーå‘ã‘ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’éžè¡¨ç¤ºã«ã—ã¾ã™ã‹ï¼Ÿ
+type_label_script=スクリプト
+filter_elemhide_nocriteria=è¦ç´ ã‚’éžè¡¨ç¤ºã«ã™ã‚‹æ¡ä»¶ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“
+blockingGroup_title=広告ブロックルール
+whitelisted_tooltip=Adblock Plus ã¯ç¾åœ¨ã®ãƒšãƒ¼ã‚¸ã§ç„¡åй
+type_label_stylesheet=スタイルシート
+blocked_count_tooltip=ブロック済: ?1?ï¼ãƒ–ロックå¯èƒ½ :?2?
+type_label_font=フォント
+type_label_popup=ãƒãƒƒãƒ—アップ
+filter_regexp_tooltip=ã“ã®ãƒ•ã‚£ãƒ«ã‚¿ã¯æ­£è¦è¡¨ç¾ã‚’使用ã—ã¦ã„ã‚‹ã€ã‚‚ã—ãã¯æœ€é©åŒ–ã™ã‚‹ã®ã«çŸ­éŽãŽã¾ã™ã€‚ã“ã®ã‚ˆã†ãªãƒ•ィルタãŒå¤šã„ã¨ãƒ–ラウザãŒé…ããªã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚
+action0_tooltip=クリックã§ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’表示ã€ä¸­ã‚¯ãƒªãƒƒã‚¯ã§æœ‰åйï¼ç„¡åŠ¹ã‚’åˆ‡ã‚Šæ›¿ãˆ
+whitelisted_page=Adblock Plus ã¯ç¾åœ¨ã®ãƒšãƒ¼ã‚¸ã§ç„¡åйã«è¨­å®šã•れã¦ã„ã¾ã™
+remove_group_warning=本当ã«ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を削除ã—ã¾ã™ã‹ï¼Ÿ
+action1_tooltip=クリックã§ãƒ–ロックå¯èƒ½é …目一覧を開ï¼é–‰ã€ä¸­ã‚¯ãƒªãƒƒã‚¯ã§æœ‰åйï¼ç„¡åŠ¹ã‚’åˆ‡ã‚Šæ›¿ãˆ
+type_label_xmlhttprequest=XML リクエスト
+active_tooltip=Adblock Plus 有効 (フィルタ購読数: ?1?ï¼è‡ªä½œãƒ•ィルタ数: ?2?)
+type_label_document=ドキュメント
+type_label_object_subrequest=オブジェクトã®ã‚µãƒ–リクエスト
+whitelistGroup_title=ホワイトリスト
+disabled_tooltip=Adblock Plus 無効
+filter_elemhide_duplicate_id=è¦ç´ ã‚’éžè¡¨ç¤ºã«ã™ã‚‹ ID ã¯ï¼‘ã¤ã ã‘指定ã§ãã¾ã™
+type_label_object=オブジェクト
+action2_tooltip=クリックã§è¨­å®šã‚’オープンã€ä¸­ã‚¯ãƒªãƒƒã‚¯ã§æœ‰åйï¼ç„¡åŠ¹ã‚’åˆ‡ã‚Šæ›¿ãˆ
+type_label_subdocument=フレーム
+clearStats_warning=全フィルタã®ãƒ’ット数をリセットã—ã€ãƒ’ット数記録機能を無効化ã—ã¾ã™ã‹ï¼Ÿ
+notification_antiadblock_message=ã“ã®ã‚µã‚¤ãƒˆã¯ Adblock Plus ユーザーを対象ã¨ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã“ã¨ã§çŸ¥ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚Adblock Plus ã§ã“れらã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’éžè¡¨ç¤ºã«ã—ã¾ã™ã‹ï¼Ÿ
+blocked_count_addendum=(ホワイトリスト: ?1?ï¼è¦ç´ éžè¡¨ç¤º: ?2?)
+subscription_invalid_location=購読ã™ã‚‹ãƒ•ィルタ㮠URL ãŒç„¡åйã€ã‚‚ã—ãã¯ä¸æ­£ãªãƒ•ァイルåã§ã™ã€‚
+type_label_image=ç”»åƒ
+remove_subscription_warning=本当ã«ã“ã®ãƒ•ィルタã®è³¼èª­ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ
+type_label_other=ãã®ä»–
+mobile_menu_enable=ABP: 有効
+type_label_media=オーディオï¼ãƒ“デオ
+mobile_menu_disable_site=ABP: ?1? ã§ç„¡åй
+elemhideGroup_title=è¦ç´ éžè¡¨ç¤ºãƒ«ãƒ¼ãƒ«
+mobile_menu_enable_site=ABP: ?1? ã§æœ‰åй
+type_label_elemhide=è¦ç´ éžè¡¨ç¤º
+newGroup_title=æ–°ã—ã„フィルタグループ
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/overlay.dtd
new file mode 100644
index 0000000..660a2df
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "ã¯ã„(&amp;Y)">
+<!ENTITY notification.button.no "ã„ã„ãˆ(&amp;N)">
+<!ENTITY sync.label "Adblock Plus 設定を Sync ã§åŒæœŸ(&amp;C)">
+<!ENTITY whitelist.site.label "?1? ã§ç„¡åй">
+<!ENTITY filters.label "フィルタ設定(&amp;F)">
+<!ENTITY disable.label "全ページã§ç„¡åй">
+<!ENTITY objecttab.title "ブロックã™ã‚‹">
+<!ENTITY objecttab.tooltip "クリックã—ã¦ã‚ªãƒ–ジェクトをブロック (Adblock Plus)">
+<!ENTITY menuitem.label "Adblock Plus 設定(&amp;B)">
+<!ENTITY objecttabs.label "Flash 㨠Java ã§ã‚¿ãƒ–を表示(&amp;T)">
+<!ENTITY sendReport.label "ã“ã®ãƒšãƒ¼ã‚¸ã§ã®ä¸å…·åˆã‚’報告(&amp;R)">
+<!ENTITY whitelist.page.label "ã“ã®ãƒšãƒ¼ã‚¸ã ã‘無効">
+<!ENTITY context.image.label "Adblock Plus: ç”»åƒã‚’ブロック">
+<!ENTITY counthits.label "フィルタã®ãƒ’ット数を数ãˆã‚‹(&amp;H)">
+<!ENTITY opensidebar.label "ブロックå¯èƒ½é …目一覧を開ã(&amp;B)">
+<!ENTITY notification.button.close "é–‰ã˜ã‚‹(&amp;C)">
+<!ENTITY contribute.label "Adblock Plus ã«è²¢çŒ®ã™ã‚‹">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: フレームをブロック">
+<!ENTITY blocked.tooltip "ã“ã®ãƒšãƒ¼ã‚¸ã§ãƒ–ロック中ã®é …ç›®:">
+<!ENTITY hideplaceholders.label "ブロックã—ãŸå ´æ‰€ã«æ®‹ã‚‹ç©ºãスペースを詰ã‚ã‚‹(&amp;L)">
+<!ENTITY showinstatusbar.label "ステータスãƒãƒ¼ã«è¡¨ç¤º(&amp;S)">
+<!ENTITY sidebar.title "ã“ã®ãƒšãƒ¼ã‚¸ã®ãƒ–ロックå¯èƒ½é …目一覧">
+<!ENTITY options.label "オプション(&amp;O)">
+<!ENTITY context.object.label "Adblock Plus: オブジェクトをブロック">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: ã“ã®ãƒšãƒ¼ã‚¸ã§æœ‰åŠ¹ã«æˆ»ã™">
+<!ENTITY filters.tooltip "有効ãªãƒ•ィルタ:">
+<!ENTITY closesidebar.label "ブロックå¯èƒ½é …目一覧を閉ã˜ã‚‹(&amp;B)">
+<!ENTITY showintoolbar.label "ツールãƒãƒ¼ã«è¡¨ç¤º(&amp;B)">
+<!ENTITY status.tooltip "ステータス:">
+<!ENTITY context.media.label "Adblock Plus: オーディオï¼ãƒ“デオをブロック">
+<!ENTITY subscription.update.label "フィルタを更新">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/sendReport.dtd
new file mode 100644
index 0000000..d8a54eb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "å…ƒã«æˆ»ã™(&amp;U)">
+<!ENTITY issues.disabledgroups.description "購読ã—ã¦ã„る次ã®ãƒ•ィルタï¼ãƒ•ィルタグループã¯ç„¡åйã«ãªã£ã¦ã„ã¾ã™ãŒã€ã“ã®ãƒšãƒ¼ã‚¸ã«å½±éŸ¿ãŒã‚ã£ãŸã‹ã‚‚ã—れã¾ã›ã‚“:">
+<!ENTITY showData.label "ä¸å…·åˆå ±å‘Šãƒ‡ãƒ¼ã‚¿ã‚’表示">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus ã®ãƒ–ロックãŒéŽå‰° (&amp;M)">
+<!ENTITY issues.change.description "設定ãŒå¤‰æ›´ã•れã¾ã—ãŸã€‚確èªã®ãŸã‚ã«ãƒšãƒ¼ã‚¸ã‚’å†èª­ã¿è¾¼ã¿ã—ã€ã‚‚ã—ä¸å…·åˆãŒè§£æ±ºã—ãªã‘れã°ä¸å…·åˆå ±å‘Šã‚’æå‡ºã—ã¦ãã ã•ã„">
+<!ENTITY email.label "Email:(&amp;M)">
+<!ENTITY issues.openPreferences.label "フィルタ設定を開ã">
+<!ENTITY sendPage.confirmation "ã‚ãªãŸã®ä¸å…·åˆå ±å‘Šã¯ä¿å­˜ã•れã¾ã—ãŸã€‚次ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™:">
+<!ENTITY copyLink.label "ä¸å…·åˆå ±å‘Šã®ãƒªãƒ³ã‚¯ã‚’コピー(&amp;C)">
+<!ENTITY issues.nofilters.description "Adblock Plus ã¯ã“ã®ãƒšãƒ¼ã‚¸ã§ä½•もブロックã—ã¦ã„ãªã„ã®ã§ã€ãŠæ°—付ãã®ä¸å…·åˆã¯æã‚‰ã Adblock Plus ã¨ã¯é–¢ä¿‚ã‚りã¾ã›ã‚“。">
+<!ENTITY sendPage.knownIssue "æã‚‰ãã€ã‚ãªãŸã®å ±å‘Šã—ãŸä¸å…·åˆã¯æ—¢çŸ¥ã®å•題ã§ã™ã€‚詳細:">
+<!ENTITY typeSelector.other.description "フィルタã§ã¯ãªã Adblock Plus 自体ã®ä¸å…·åˆãŒç–‘ã‚れる場åˆã¯ã“ã®é¸æŠžè‚¢ã€‚">
+<!ENTITY issues.disabledgroups.enable.label "購読ã—ã¦ã„るフィルタï¼ãƒ•ィルタグループを有効化">
+<!ENTITY typeWarning.override.label "ç†è§£ã—ãŸä¸Šã§ã€ãれã§ã‚‚ä¸å…·åˆå ±å‘Šã‚’æå‡ºã—ãŸã„(&amp;S)">
+<!ENTITY issues.disabled.enable.label "Adblock Plus を有効化">
+<!ENTITY update.fixed.description "報告ã—よã†ã¨ã—ã¦ã„ãŸä¸å…·åˆã¯ã€è³¼èª­ã—ã¦ã„ã‚‹ãƒ•ã‚£ãƒ«ã‚¿ã®æ›´æ–°ã§è§£æ±ºã—ãã†ã§ã™ã€‚ページをå†èª­ã¿è¾¼ã¿ã—ã¦å†ç¢ºèªã—ã¦ã¿ã¦ãã ã•ã„。ãれã§ã‚‚解決ã—ãªã„å ´åˆã¯å†åº¦ä¸å…·åˆã‚’報告願ã„ã¾ã™ã€‚">
+<!ENTITY anonymous.label "匿åã§å ±å‘Š(&amp;A)">
+<!ENTITY reloadButton.label "ページをå†èª­ã¿è¾¼ã¿(&amp;R)">
+<!ENTITY recentReports.clear.label "ã™ã¹ã¦ã®ä¸å…·åˆå ±å‘Šã‚’削除(&amp;R)">
+<!ENTITY typeSelector.description "ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã§ä¸å…·åˆã®å ±å‘Šã«å¿…è¦ãªã‚¹ãƒ†ãƒƒãƒ—ã‚’ã”æ¡ˆå†…ã—ã¾ã™ã€‚ã¾ãšæœ€åˆã«ã€é­é‡ã—ãŸä¸å…·åˆã®ç¨®åˆ¥ã‚’é¸æŠžã—ã¦ãã ã•ã„:">
+<!ENTITY screenshot.remove.label "機密情報等を黒塗りã—ã¦éš ã™(&amp;R)">
+<!ENTITY issues.ownfilters.description "ã“ã®ãƒšãƒ¼ã‚¸ã«ã¯è‡ªä½œãƒ•ィルタãŒé©ç”¨ã•れã¦ã„ã¾ã™ã€‚ãれãŒä¸å…·åˆã®åŽŸå› ã¨ãªã£ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ã®ã§ã€ã¾ãšãれらを無効ã«ã—ã¦ãã ã•ã„:">
+<!ENTITY update.inProgress.description "ä¸å…·åˆãŒè§£æ±ºã—ãŸã‹ç¢ºã‹ã‚ã‚‹ãŸã‚ã€Adblock Plus ã§è³¼èª­ã—ã¦ã„るフィルタを更新ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„...">
+<!ENTITY sendPage.retry.label "å†é€ä¿¡">
+<!ENTITY data.label "ä¸å…·åˆå ±å‘Šãƒ‡ãƒ¼ã‚¿:(&amp;P)">
+<!ENTITY recentReports.label "最近é€ä¿¡ã—ãŸä¸å…·åˆå ±å‘Š">
+<!ENTITY typeWarning.description "フィルタã«ã¤ã„ã¦ã§ã¯ãªã Adblock Plus 全般ã®ä¸å…·åˆã‚’報告ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®ã‚ˆã†ãªä¸å…·åˆã¯é€šå¸¸ [link]Adblock Plus フォーラム[/link] ã§å ±å‘Šã•れã¦ã„ã¾ã™ã€‚ã¾ãŸã€ä¸å…·åˆå ±å‘Šã¸ã®ãƒªãƒ³ã‚¯ã‚’自らæä¾›ã—ãªã„é™ã‚Šãƒ•ォーラムã®èª°ã‚‚ã‚ãªãŸã®ä¸å…·åˆå ±å‘Šã®å­˜åœ¨ã«æ°—付ã‘ãªã„ã®ã§ã€æ—¢å­˜ã®è­°è«–を補完ã™ã‚‹ãŸã‚ã ã‘ã«ä½¿ç”¨ã—ã¦ãã ã•ã„。ä¸å…·åˆå ±å‘Šã¸ã®ãƒªãƒ³ã‚¯ã¯ãƒ¬ãƒãƒ¼ãƒˆé€ä¿¡å¾Œã«æä¾›ã•れã¾ã™ã€‚">
+<!ENTITY issues.disabled.description "Adblock Plus ãŒç„¡åйãªã®ã§ã€ä½•もブロックã•れã¦ã„ã¾ã›ã‚“">
+<!ENTITY attachExtensions.label "アドオンã®ç«¶åˆãŒä¸å…·åˆã®åŽŸå› ã§ã‚ã‚‹å ´åˆãŒã‚ã‚‹ã®ã§ã€å‹•作ã—ã¦ã„るアドオンã®ãƒªã‚¹ãƒˆã‚’ä¸å…·åˆå ±å‘Šã«æ·»ä»˜ã™ã‚‹(&amp;X)">
+<!ENTITY issues.nosubscriptions.add.label "購読ã™ã‚‹ãƒ•ィルタを追加">
+<!ENTITY issues.disabledfilters.enable.label "フィルタを有効化">
+<!ENTITY issues.override.label "設定ã«é–“é•ã„ã¯ãªã‹ã£ãŸã®ã§å ±å‘Šã‚’ç¶šã‘ã¾ã™(&amp;C)">
+<!ENTITY issues.nosubscriptions.description "ウェブサイトã®ä¸è¦ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„を自動削除ã™ã‚‹ã€æ—¢å­˜ã®ãƒ•ィルタをã¾ã è³¼èª­ã—ã¦ã„ãªã„よã†ã§ã™ã€‚">
+<!ENTITY typeSelector.falsePositive.description "ã‚ã‚‹ã¹ãコンテンツãŒãªã„ã€è¡¨ç¤ºãŒãŠã‹ã—ã„ã€ãƒ•ィルタãŒé©åˆ‡ã«æ©Ÿèƒ½ã—ã¦ãªã„å ´åˆã¯ã“ã®é¸æŠžè‚¢ã€‚ (ヒント: Adblock Plus を一時的ã«ç„¡åйã«ã™ã‚Œã°ã€åŽŸå› ã« Adblock Plus ãŒé–¢ã‚ã£ã¦ã„ã‚‹ã‹ç¢ºèªã§ãã¾ã™)">
+<!ENTITY typeSelector.other.label "ãã®ä»–ã®ä¸å…·åˆ(&amp;T)">
+<!ENTITY emailComment.label "報告ã«ä¸æ˜Žãªç‚¹ãŒã‚ã£ãŸéš›ã«é€£çµ¡ãŒå–れるよã†ã€ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å…¥åŠ›ã‚’ãŠå‹§ã‚ã—ã¦ã„ã¾ã™ã€‚ã“ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã‚ˆã‚Šã€å ±å‘Šã®å—信者ãŒå ±å‘Šè€…別ã«ã“れã¾ã§ã®è²¢çŒ®ã‚’考慮ã—ã€å„ªå…ˆåº¦ã‚’調整ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚">
+<!ENTITY issues.whitelist.remove.label "ã“ã®ãƒšãƒ¼ã‚¸ã§ Adblock Plus ã‚’å†åº¦æœ‰åйã«ã™ã‚‹">
+<!ENTITY outdatedSubscriptions.description "購読ã—ã¦ã„る次ã®ãƒ•ィルタã¯ï¼’週間以上更新ã•れã¦ã„ã¾ã›ã‚“。既ã«ä¸å…·åˆã¯è§£æ±ºæ¸ˆã¿ã‹ã‚‚ã—れãªã„ã®ã§ã€å…ˆã«æ‰‹å‹•æ›´æ–°ã—ã¦ã‹ã‚‰ä¸å…·åˆã‚’報告ã—ã¦ãã ã•ã„。">
+<!ENTITY dataCollector.description "Adblock Plus ãŒå¿…è¦ãªãƒ‡ãƒ¼ã‚¿ã‚’集ã‚ã¦ã„ã¾ã™ã€‚ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。">
+<!ENTITY sendButton.label "ä¸å…·åˆå ±å‘Šã‚’é€ä¿¡(&amp;N)">
+<!ENTITY comment.label "コメント(ä»»æ„入力):(&amp;C)">
+<!ENTITY sendPage.errorMessage "ä¸å…·åˆå ±å‘Šã®é€ä¿¡ãŒã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ &quot;?1?&quot; ã§å¤±æ•—ã—ã¾ã—ãŸã€‚インターãƒãƒƒãƒˆã«æŽ¥ç¶šã•れã¦ã„ã‚‹ã‹ç¢ºèªã—å†è©¦è¡Œã—ã¦ãã ã•ã„。å•題ãŒè§£æ±ºã—ãªã„å ´åˆã¯ [link]Adblock Plus フォーラム[/link] ã§åŠ©ã‘を求ã‚ã¦ãã ã•ã„。">
+<!ENTITY showRecentReports.label "最近é€ä¿¡ã—ãŸä¸å…·åˆå ±å‘Šã‚’表示">
+<!ENTITY commentPage.heading "コメントを入力">
+<!ENTITY update.start.label "今ã™ãæ›´æ–°">
+<!ENTITY issues.disabledfilters.description "次ã®ãƒ•ィルタã¯ç„¡åйã«ãªã£ã¦ã„ã¾ã™ãŒã€ã“ã®ãƒšãƒ¼ã‚¸ã«å½±éŸ¿ãŒã‚ã£ãŸã‹ã‚‚ã—れã¾ã›ã‚“:">
+<!ENTITY screenshot.description "åŒã˜ãƒšãƒ¼ã‚¸ã§ã‚‚別ã®äººã«ã¯ç•°ãªã£ã¦è¡¨ç¤ºã•れるã“ã¨ãŒã‚ã‚‹ã®ã§ã€ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆæ·»ä»˜ã¯ä¸å…·åˆã‚’ç†è§£ã™ã‚‹åŠ©ã‘ã¨ãªã‚Šã¾ã™ã€‚ボタンをクリックã—ã¦ã‹ã‚‰ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆä¸Šã§ãƒ‰ãƒ©ãƒƒã‚°ã™ã‚‹ã“ã¨ã§ã€ä¸å…·åˆç®‡æ‰€ã«å°ã‚’ã¤ã‘ãŸã‚Šå€‹äººæƒ…報を隠ã™ã“ã¨ãŒã§ãã¾ã™ã€‚">
+<!ENTITY screenshot.attach.label "ä¸å…·åˆå ±å‘Šã«ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚’添付(&amp;T)">
+<!ENTITY issues.whitelist.description "報告ã—よã†ã¨ã—ã¦ã„るページ㧠Adblock Plus ãŒç„¡åйã«ãªã£ã¦ã„ã¾ã™ã€‚調査ã®å¦¨ã’ã«ãªã‚‹ã®ã§ Adblock Plus ã‚’æœ‰åŠ¹ã«æˆ»ã—ã€å†èª­ã¿è¾¼ã¿ã—ã¦ã‹ã‚‰ä¸å…·åˆå ±å‘Šã‚’作æˆã—ã¦ãã ã•ã„。">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus ãŒåºƒå‘Šã‚’ブロックã—ã¦ã„ãªã„(&amp;V)">
+<!ENTITY typeSelector.heading "ä¸å…·åˆç¨®åˆ¥ã‚’é¸æŠž">
+<!ENTITY anonymity.warning "匿åã§å ±å‘Šã®éš›ã¯å ±å‘Šè€…を個別ã«è­˜åˆ¥ã§ããªã„ã®ã§å„ªå…ˆåº¦ãŒä¸‹ãŒã‚Šã¾ã™ã€‚">
+<!ENTITY wizard.title "ä¸å…·åˆå ±å‘Š">
+<!ENTITY issues.ownfilters.disable.label "フィルタを無効化">
+<!ENTITY commentPage.description "コメントãŒã‚ã‚‹ã¨ä¸å…·åˆã‚’ç†è§£ã™ã‚‹ã®ã«åŠ©ã‹ã‚Šã¾ã™ï¼ˆç—‡çжã€å†ç¾æ‰‹é †ã€åŽŸå› ã‚’ç‰¹å®šã—ãŸæ ¹æ‹ ã€ä¸å…·åˆç™ºç”Ÿé–‹å§‹æ™‚æœŸã€æ­£å¸¸å‹•作ã¨ã®é•ã„ã€ä¸å…·åˆç™ºç”Ÿå ´æ‰€ï¼‰ã€‚報告ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã¯é€ä¿¡å‰ã«å†æ¤œè¨Žã§ãã¾ã™ã€‚">
+<!ENTITY comment.lengthWarning "コメント㌠1000 文字を超ãˆã¦ã„ã‚‹ã®ã§ã€å…ˆé ­ã‹ã‚‰ 1000 文字ã ã‘é€ä¿¡ã—ã¾ã™">
+<!ENTITY typeSelector.falseNegative.description "Adblock Plus ãŒæœ‰åйã§ã‚‚広告ãŒè¡¨ç¤ºã•れる場åˆã¯ã“ã®é¸æŠžè‚¢ã€‚">
+<!ENTITY sendPage.waitMessage "Adblock Plus ãŒä¸å…·åˆå ±å‘Šã‚’é€ä¿¡ã™ã‚‹é–“ã€ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„">
+<!ENTITY dataCollector.heading "ä¸å…·åˆå ±å‘Šã¸ã‚ˆã†ã“ã">
+<!ENTITY screenshot.heading "スクリーンショットを添付">
+<!ENTITY sendPage.heading "ä¸å…·åˆå ±å‘Šã‚’é€ä¿¡">
+<!ENTITY issues.subscriptionCount.description "購読ã—ã¦ã„るフィルタãŒå¤šéŽãŽã§ã™ã€‚ã“ã®ã‚ˆã†ãªè¨­å®šã¯å•題解決を難ã—ãã™ã‚‹ã®ã§æŽ¨å¥¨ã•れã¾ã›ã‚“。ã¾ãŸã€ã©ã®ãƒ•ィルタ作者ãŒã“ã®ä¸å…·åˆã«å¯¾å‡¦ã™ã¹ãã‹ä¸æ˜Žãªã®ã§ãƒ¬ãƒãƒ¼ãƒˆã‚’å—ç†ã§ãã¾ã›ã‚“。本当ã«å¿…è¦ãªãƒ•ィルタ以外を削除ã—ã€ä¸å…·åˆãŒå†ç¾ã™ã‚‹ã‹ç¢ºèªé¡˜ã„ã¾ã™ã€‚">
+<!ENTITY screenshot.mark.label "ä¸å…·åˆç®‡æ‰€ã«å°ã‚’ã¤ã‘ã‚‹(&amp;M)">
+<!ENTITY privacyPolicy.label "プライãƒã‚·ãƒ¼ãƒ»ãƒãƒªã‚·ãƒ¼">
+<!ENTITY issues.description "Adblock Plus ã¯ã“ã®ä¸å…·åˆã«é–¢ä¿‚ã€ã‚‚ã—ãã¯èª¿æŸ»ã‚’困難ã«ã—ã¦ã„る設定を発見ã—ã¾ã—ãŸã€‚">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/sidebar.dtd
new file mode 100644
index 0000000..2d4fd84
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "ボーダーを点滅">
+<!ENTITY address.label "アドレス">
+<!ENTITY context.open.label "æ–°è¦ã‚¿ãƒ–ã§é–‹ã">
+<!ENTITY type.label "種別">
+<!ENTITY tooltip.filterSource.label "フィルタ帰属:">
+<!ENTITY noitems.label "ブロックå¯èƒ½é …ç›®ã¯ã‚りã¾ã›ã‚“">
+<!ENTITY filter.label "フィルタ">
+<!ENTITY tooltip.size.label "サイズ:">
+<!ENTITY reattach.label "ウィンドウ内表示">
+<!ENTITY search.label "検索:(&amp;S)">
+<!ENTITY docDomain.thirdParty "(サードパーティ)">
+<!ENTITY filterSource.label "フィルタ帰属">
+<!ENTITY tooltip.docDomain.label "ドキュメント帰属:">
+<!ENTITY context.copy.label "アドレスをコピー">
+<!ENTITY tooltip.type.label "種別:">
+<!ENTITY context.disablefilter.label "フィルタ ?1? を無効化">
+<!ENTITY context.copyFilter.label "フィルタをコピー">
+<!ENTITY context.block.label "ã“ã®é …目をブロック">
+<!ENTITY context.enablefilter.label "å†åº¦ãƒ•ィルタ ?1? を有効化">
+<!ENTITY detach.label "別ウィンドウ表示">
+<!ENTITY whitelisted.label "ホワイトリストã•れãŸãƒšãƒ¼ã‚¸">
+<!ENTITY context.disablefilteronsite.label "フィルタを ?1? ã§ç„¡åŠ¹åŒ–">
+<!ENTITY detached.title "Adblock Plus: ブロックå¯èƒ½é …目一覧 (別ウィンドウ表示中)">
+<!ENTITY docDomain.firstParty "(ファーストパーティ)">
+<!ENTITY tooltip.type.whitelisted "(ホワイトリスト中)">
+<!ENTITY tooltip.filter.label "é©ç”¨ä¸­ã®ãƒ•ィルタ:">
+<!ENTITY tooltip.filter.disabled "(無効中)">
+<!ENTITY context.editfilter.label "フィルタを編集">
+<!ENTITY tooltip.type.blocked "(ブロック中)">
+<!ENTITY size.label "サイズ">
+<!ENTITY context.whitelist.label "ã“ã®é …目用ã®ãƒ›ãƒ¯ã‚¤ãƒˆãƒªã‚¹ãƒˆã‚’追加">
+<!ENTITY context.selectAll.label "ã™ã¹ã¦é¸æŠž">
+<!ENTITY state.label "状態">
+<!ENTITY docDomain.label "ドキュメント帰属">
+<!ENTITY tooltip.address.label "アドレス:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/subscriptionSelection.dtd
new file mode 100644
index 0000000..0595ef8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "&quot;?1?&quot; も追加ã™ã‚‹(&amp;S)">
+<!ENTITY list.download.failed "Adblock Plus ã¯è³¼èª­ç”¨ãƒ•ィルタ一覧ã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸã€‚">
+<!ENTITY list.download.retry "å†è©¦è¡Œ">
+<!ENTITY title.label "購読ã™ã‚‹ãƒ•ィルタã®åç§°:(&amp;T)">
+<!ENTITY list.download.website "ウェブサイトをå‚ç…§">
+<!ENTITY supplementMessage "ã“ã®ãƒ•ィルタ㯠&quot;?1?&quot; ã¨ä½µç”¨ã™ã‚‹ã“ã¨ãŒå‰æã«ãªã£ã¦ã„ã¾ã™ã€‚">
+<!ENTITY viewList.label "フィルタファイルを開ã„ã¦ç¢ºèª">
+<!ENTITY visitHomepage.label "作者ã®ãƒšãƒ¼ã‚¸ã‚’é–‹ã">
+<!ENTITY addSubscription.label "購読ã™ã‚‹ãƒ•ィルタを追加">
+<!ENTITY dialog.title "購読ã™ã‚‹ Adblock Plus 用フィルタを追加">
+<!ENTITY location.label "購読ã™ã‚‹ãƒ•ィルタã®å ´æ‰€:(&amp;L)">
+<!ENTITY fromWeb.description "購読ã™ã‚‹ãƒ•ィルタを確èªã—ã¦ãã ã•ã„。追加å‰ã«åç§°ã¨å ´æ‰€ã‚’変更ã§ãã¾ã™ã€‚">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/composer.dtd
new file mode 100644
index 0000000..f22d365
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "Ð°Ð´Ñ€ÐµÑ Ñоң&amp;ында">
+<!ENTITY domainRestriction.label "Доменмен шек&amp;теу:">
+<!ENTITY collapse.default.no.label "БаÑтапқыÑын қолдану (жоқ)">
+<!ENTITY firstParty.label "Тек Ñол Ñайт өз құрамаÑÑ‹ Ò¯&amp;шін">
+<!ENTITY preferences.label "Бар фильтрлерді &amp;көрÑету...">
+<!ENTITY pattern.label "Шаблон">
+<!ENTITY thirdParty.label "Тек б&amp;аÑқа Ñайт құрамаÑÑ‹ үшін">
+<!ENTITY filter.label "Жаңа &amp;фильтр:">
+<!ENTITY collapse.label "Блокталған құраманы &amp;жинау:">
+<!ENTITY match.warning "Сіз енгізген шаблон енді блокталатын не блокталмайтын адреÑке ÑÓ™Ð¹ÐºÐµÑ ÐºÐµÐ»Ð¼ÐµÐ¹Ð´Ñ–, Ñол үшін оның Ó™Ñері жоқ.">
+<!ENTITY anchor.start.label "а&amp;Ð´Ñ€ÐµÑ Ð±Ð°Ñында">
+<!ENTITY matchCase.label "&amp;РегиÑтрді еÑкеру">
+<!ENTITY custom.pattern.label "Ө&amp;зіңіздің:">
+<!ENTITY unselectAllTypes.label "Ерекшелеуді таÑтау">
+<!ENTITY type.whitelist.label "&amp;Ерекше ереже">
+<!ENTITY regexp.warning "Сіз енгізген шаблон, регулÑрлы өрнек ретінде өңделеді. ОÑындай шаблондардың көп Ñаны браузеріңіздің жұмыÑын тежей алады. РегулÑрлы өрнекті қолданғыңыз келмеÑе, шаблон Ñоңына жұлдызшаны қоÑыңыз.">
+<!ENTITY dialog.title "Adblock Plus фильтр ережеÑін қоÑу">
+<!ENTITY basic.label "Ðегізгі көрініÑÑ–">
+<!ENTITY type.filter.label "&amp;Блоктаушы фильтр">
+<!ENTITY types.label "Қолдану үшін құрама түрі:">
+<!ENTITY shortpattern.warning "Сіз енгізген Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ò¯ÑˆÑ–Ð½ тым қыÑқа, оÑындай шаблондардың көп Ñаны браузеріңіздің жұмыÑын тежей алады. ОÑÑ‹ фильтр үшін ұзынырақ шаблонды қолдану Ò±Ñынылады.">
+<!ENTITY collapse.yes.label "Иә">
+<!ENTITY anchors.label "Шаблонды тек келеÑіде қолдану:">
+<!ENTITY collapse.default.yes.label "БаÑтапқыÑын қолдану (иә)">
+<!ENTITY domainRestriction.help "Бір немеÑе &quot;|&quot; таңбаÑымен ажыратылған бірнеше доменді көрÑетіңіз, фильтр тек оÑÑ‹ домендер үшін орындалады. Домен атының алдыңдағы &quot;~&quot; таңбаÑÑ‹ оÑÑ‹ доменде фильтр орындалмайтынын көрÑетеді.">
+<!ENTITY accept.label "Фильтрді қоÑу">
+<!ENTITY options.label "Баптаулар">
+<!ENTITY disabled.warning "Adblock Plus қазір Ñөндірулі. Фильтрлерді қазір де қоÑа алаÑыз, бірақ олар Ð¶Ò±Ð¼Ñ‹Ñ Ñ–Ñтемейді, Ñіз [link]Adblock Plus қоÑқанға дейін[/link].">
+<!ENTITY anchor.start.flexible.label "&amp;домен атынын баÑында">
+<!ENTITY collapse.no.label "Жоқ">
+<!ENTITY selectAllTypes.label "Барлығын ерекшелеу">
+<!ENTITY advanced.label "Кеңейтілген көрініÑÑ–">
+<!ENTITY pattern.explanation "Шаблон адреÑтің кез-келген бөлігі бола алады, мұндағы жұлдызша (*) таңбалардың кез-келген Ñанын белгілейді. Фильтр тек оған ÑÓ™Ð¹ÐºÐµÑ ÐºÐµÐ»ÐµÑ‚Ñ–Ð½ адреÑтер үшін қолданылады.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/filters.dtd
new file mode 100644
index 0000000..cf794ce
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Сіздің барлық пайдаланушы фильтрлер баптаулары таңдалған файлдың құрамаÑымен алмаÑтырылады. ЖалғаÑтыруды қалайÑыз ба?">
+<!ENTITY slow.column "БаÑу фил&amp;ьтрлер">
+<!ENTITY enabled.column "ҚоÑу&amp;лы">
+<!ENTITY subscription.lastDownload.checksumMismatch "Қате, текÑеру ÑомаÑÑ‹ ÑÓ™Ð¹ÐºÐµÑ ÐµÐ¼ÐµÑ">
+<!ENTITY noFiltersInGroup.text "Таңдалған топ боÑ.">
+<!ENTITY subscription.actions.label "Әрекеттер">
+<!ENTITY filter.selectAll.label "Барлығын таңдау">
+<!ENTITY backupButton.label "Сақтау мен қал&amp;пына келтіру">
+<!ENTITY restore.minVersion.warning "ЕÑкерту: Файл жаңалау Adblock Plus нұÑқаÑымен жаÑалған. Бұл файлдан қалпына келтіру үшін Ñізге Adblock Plus-тың Ñоңғы нұÑқаÑын орнату керек.">
+<!ENTITY restore.error "Файл мәліметін өңдеу мүмкін емеÑ, мүмкін ол Adblock Plus-тің көшірме файлы ÐµÐ¼ÐµÑ ÑˆÑ‹Ò“Ð°Ñ€?">
+<!ENTITY sort.ascending.label "&amp;Ð &gt; Я Ñұрыптау">
+<!ENTITY sort.label "&amp;Сұрыптау">
+<!ENTITY subscription.source.label "Фильтлер тізімі">
+<!ENTITY hitcount.column "Х&amp;иттер">
+<!ENTITY noFilters.text "Сізде әлі пайдаланушы фильтрлері жоқ.">
+<!ENTITY backup.custom.title "Тек пайланушы фильтрлері">
+<!ENTITY subscription.external.label "БаÑқа кеңейтумен жаңартылған">
+<!ENTITY subscription.delete.label "Өшіру">
+<!ENTITY noGroupSelected.text "Ðлдымен фильтрлер тобын таңдаңыз, кейін ғана оның фильтрлері көрÑетіледі.">
+<!ENTITY filter.cut.label "Қиып алу">
+<!ENTITY restore.default.label "Көшірмені қалпына келтіру ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Жүктелуде...">
+<!ENTITY subscriptions.tab.label "Фильтрлерге жазылулар">
+<!ENTITY sort.descending.label "&amp;Я &gt; Ð Ñұрыптау">
+<!ENTITY filters.remove.warning "Таңдалған фильтрлердің барлығын өшіру керек пе?">
+<!ENTITY filter.delete.label "Жою">
+<!ENTITY addSubscriptionAdd.label "ҚоÑу">
+<!ENTITY viewMenu.label "Түрі">
+<!ENTITY subscription.lastDownload.unknown "Ешқашан">
+<!ENTITY addSubscriptionCancel.label "Ð‘Ð°Ñ Ñ‚Ð°Ñ€Ñ‚Ñƒ">
+<!ENTITY subscription.enabled.label "ІÑке қоÑулы">
+<!ENTITY noSubscriptions.text "Сіз әлі фильтрге жазылуларды қоÑқан жоқÑыз. ФильтрлерÑіз
+ Adblock Plus ешнәрÑені блоктамайды, оларды қоÑу үшін
+ &quot;Фильтрге жазылуды қоÑу&quot; қолданыңыз.">
+<!ENTITY subscription.update.label "Фильтрлерді жаңарту">
+<!ENTITY dialog.title "Adblock Plus фильтр баптаулары">
+<!ENTITY addFilter.label "Фильтрді қо&amp;Ñу">
+<!ENTITY subscription.minVersion.warning "Бұл фильтрге жазылу Adblock Plus-тің жаңа нұÑқаÑын талап етеді, оңы жаңартыңыз.">
+<!ENTITY subscription.lastDownload.invalidURL "Қате, Ð´Ò±Ñ€Ñ‹Ñ Ð°Ð´Ñ€ÐµÑ ÐµÐ¼ÐµÑ">
+<!ENTITY backup.error "Фильтрлерді файлға жазу кезінде қате орын алды. Файл жазу үшін қолжетерлік және баÑқа қолданбаның қолданыÑында болмағанына көз жеткізіңіз.">
+<!ENTITY filter.moveUp.label "Жоғары жылжыту">
+<!ENTITY addGroup.label "Фильтрлер тоб&amp;ын қоÑу">
+<!ENTITY filter.edit.label "Түзету">
+<!ENTITY subscription.showHideFilters.label "Фильтрлерді көрÑету/жаÑыру">
+<!ENTITY acceptableAds2.label "ЗиÑнке&amp;Ñ ÐµÐ¼ÐµÑ ÐºÐµÐ¹Ð±Ñ–Ñ€ жарнаманы Ñ–Ñке қоÑу">
+<!ENTITY addSubscriptionOther.label "БаÑқа жазылуды қоÑу">
+<!ENTITY close.label "Жабу">
+<!ENTITY sort.none.label "СұрыптауÑÑ‹&amp;з">
+<!ENTITY filter.actions.label "Фильтр әрекеттері">
+<!ENTITY filter.copy.label "Көшіру">
+<!ENTITY filter.moveDown.label "Төмен жылжыту">
+<!ENTITY filter.resetHitCounts.label "Хит ÑтатиÑтикаÑын таÑтау">
+<!ENTITY readMore.label "Көбірек оқу">
+<!ENTITY subscription.moveUp.label "Жоғары жылжыту">
+<!ENTITY addSubscription.label "Фильтрге жазыл&amp;уды қоÑу">
+<!ENTITY subscription.homepage.label "Үй парағы">
+<!ENTITY backup.complete.title "Фильтрлер мен жазылуларды қоÑу">
+<!ENTITY restore.own.label "Өз көшірмені қалпына келтіру">
+<!ENTITY restore.complete.warning "Сіздің барлық фильтрлер баптаулары таңдалған файлдың құрамаÑымен алмаÑтырылады. ЖалғаÑтыруды қалайÑыз ба?">
+<!ENTITY filters.tab.label "Пайдаланушы фильтрлері">
+<!ENTITY backup.label "Жаңа көшірмені жаÑау">
+<!ENTITY find.label "І&amp;здеу">
+<!ENTITY subscription.moveDown.label "Төмен жылжыту">
+<!ENTITY subscription.lastDownload.connectionError "Қате, жүктеу мүмкін емеÑ">
+<!ENTITY subscription.lastDownload.success "Сәтті аÑқталды">
+<!ENTITY subscription.lastDownload.invalidData "Қате, Ð´Ò±Ñ€Ñ‹Ñ Ñүзгілер файлы емеÑ">
+<!ENTITY filter.paste.label "КіріÑтіру">
+<!ENTITY subscription.disabledFilters.enable "Сөндірулі фильтрлерді Ñ–Ñке қоÑу">
+<!ENTITY lasthit.column "Соңғ&amp;ы хит">
+<!ENTITY subscription.editTitle.label "Ðтауын түзету">
+<!ENTITY subscription.disabledFilters.warning "Бұл жазылудағы кейбір фильтрлер Ñөндірулі.">
+<!ENTITY filter.column "Фильтр &amp;ережеÑÑ–:">
+<!ENTITY subscription.lastDownload.label "Соңғы жаңарту:">
+<!ENTITY viewList.label "Тізімді көру">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/firstRun.properties
new file mode 100644
index 0000000..fac03ce
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Бақылауды Ñөндіру арқылы шолуды жеке қылыңыз - Ñіздің әр қимылыңызды бақылайтын жарнамалық компаниÑлардан ізіңізді жаÑыру арқылы.
+firstRun_toggle_off=OFF
+firstRun_feature_tracking=Бақылауды Ñөндіру
+firstRun_feature_malware=ЗиÑÐ½ÐºÐµÑ Ð±Ð°Ò“Ð´Ð°Ñ€Ð»Ð°Ð¼Ð°Ð»Ð°Ñ€Ð´Ñ‹ блоктау
+firstRun_title=Adblock Plus орнатылды
+firstRun_toggle_on=ON
+firstRun_acceptableAdsExplanation=Біз вебÑайттарды тура, мазаңызды алмайтын жарнаманы қолдануын қалаймыз. Сондықтан біз жарамды жарнаманы анықтаудың <a>қатаң нұÑқаулығын</a> орнаттық, ол жарнамма баÑтапқы баптаулармен көрÑетілетін болады. Егер Ñіз Ñонда да барлық жарнаманы <a>блоктағыңыз</a> келÑе, оÑыны тез арада Ñөндіре алаÑыз.
+firstRun_contributor_credits=Ò®Ð»ÐµÑ Ò›Ð¾Ñқандар
+firstRun_dataCorruptionWarning=Бұл парақ көрÑетіле бере ме? <a>ОÑында шертіңіз!</a>
+firstRun_acceptableAdsHeadline=Мазаңызды алатын жарнама блокталатын болады
+firstRun_share=ДоÑтарыңызға айтыңыз
+firstRun_share_headline=Интернетті жақÑырақ қылу үшін <a>бізге көмек қолын Ñозыңыз</a>
+firstRun_feature_social_description=Интернетті шолуды әлеуметтік желілер батырмаларынан құтылу арқылы жақÑартыңыз, ол батырмалар, Facebook Like ÑиÑқты, веб парақтарда көрÑетіледі және Ñіздің жұмыÑыңызды бақылайды.
+firstRun_filterlistsReinitializedWarning=Қандай да бір мәÑеле Ñалдарынан барлық Ñүзгілер өшіріліп, біз оларды қор көшірмеден қалпына келтіре алмайтын ÑиÑқтымыз. Сондықтан, барлық Ñүзгілер өшіріледі және жарамды жарнама баптаулары Ñ–Ñке аÑырылады. Өзіңіздің Ñүзгілер тізімін және жарамды жарнама баптауларын <a>Adblock Plus баптауларында</a> текÑеріңіз.
+firstRun_feature_malware_description=Интернетті шолуды кейбір белгілі зиÑÐ½ÐºÐµÑ Ð´Ð¾Ð¼ÐµÐ½Ð´ÐµÑ€Ð´Ñ– блоктау арқылы қауіпÑіздеу қылыңыз.
+firstRun_features=Adblock Plus тек жарнаманы блоктаудан баÑқа көбірек нәрÑені Ñ–Ñтей алады
+firstRun_donate=ақшалай көмектеÑу
+firstRun_donate_label=Жобамызды қолдаңыз
+firstRun_feature_social=Әлеуметтік Ñайттар батырмаларын алып таÑтау
+firstRun_legacySafariWarning=Сіз қолданып отырған Safari нұÑқаÑÑ‹ еÑкі, және оны Adblock Plus қолдамайды. Ол Ð´Ò±Ñ€Ñ‹Ñ Ð¶Ò±Ð¼Ñ‹Ñ Ð¶Ð°Ñамауы мүмкін, немеÑе кейбір вебÑайттарда пайдаланушы жұмыÑын нашарлау қылуы мүмкін. Біз қатаң түрде Safari нұÑқаÑÑ‹ 6.1.1 не одан жаңалау (OS X 10.8 Mountain Lion жүйеÑінде), немеÑе Safari нұÑқаÑÑ‹ 7.0.1 не одан жаңалау (OS X 10.9 Mavericks жүйеÑінде) дейін жаңартуды Ò±Ñынамыз, немеÑе Mozilla Firefox, Google Chrome не Opera браузерлерінің Ñоңғы нұÑқаларын қолдануды Ò±Ñынамыз.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/global.properties
new file mode 100644
index 0000000..dae6af2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Ðғымдағы парақта блоктауға болатын құрама жоқ
+action3_tooltip=Adblock Plus қоÑу/Ñөндіру үшін шертіңіз.
+notification_antiadblock_title=МақÑатталған хабарламаларды жаÑыру керек пе?
+type_label_script=Скрипт
+filter_elemhide_nocriteria=Элементті жаÑыру үшін бірде-бір шарт анықталмады
+blockingGroup_title=Жарнаманы блоктау ережелері
+whitelisted_tooltip=Adblock Plus қоÑулы, бірақ оÑÑ‹ парақ үшін Ñөндірулі.
+type_label_stylesheet=Стильдер кеÑтеÑÑ–
+blocked_count_tooltip=?1? келеÑіден ?2?
+type_label_font=қаріп
+type_label_popup=атып шығатын терезе
+filter_regexp_tooltip=Бұл Ñүзгі не регулÑрлы өрнек, не Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ò¯ÑˆÑ–Ð½ тым қыÑқа. ОÑындай Ñүзгілер көп болÑа, браузеріңіздің жұмыÑын тежеу мүмкін.
+action0_tooltip=КонтекÑті мәзірін ашу үшін шертіңіз, тышқанның орта батырмаÑÑ‹ - қоÑу/Ñөндіру үшін.
+whitelisted_page=Adblock Plus ағымдағы парақ үшін Ñөндірулі тұр
+remove_group_warning=Бұл топты өшіруді шынымен қалайÑыз ба?
+action1_tooltip=Блокталған құраманы ашу/жабу үшін шертіңіз, тышқанның орта батырмаÑÑ‹ - қоÑу/Ñөндіру үшін.
+type_label_xmlhttprequest=XML-Ñұранымы
+active_tooltip=Adblock Plus қоÑулы тұр, ?1? Ñүзгілерге жазылу мен ?2? пайдаланушы Ñүзгілері қолданылуда.
+type_label_document=Құжат
+type_label_object_subrequest=объект Ñұранымы
+whitelistGroup_title=Ережеден тыÑ
+disabled_tooltip=Adblock Plus Ñөндірулі тұр.
+filter_elemhide_duplicate_id=ЖаÑыралатын Ñлементтің идентификаторы тек біреу болу керек.
+type_label_object=Объект
+action2_tooltip=Баптауларды ашу үшін шертіңіз, тышқанның орта батырмаÑÑ‹ - қоÑу/Ñөндіру үшін.
+type_label_subdocument=Фрейм
+clearStats_warning=Бұл әрекет барлық фильтрлерді хит ÑтатиÑтикаÑын таÑтап, фильтр хиттерін Ñанауды Ñөндіреді. ЖалғаÑтыруды қалайÑыз ба?
+notification_antiadblock_message=Бұл Ñайт Adblock Plus пайдаланушыларына мақÑатталған хабарламаларды көрÑететіні белгілі. Adblock Plus мақÑатталған хабарламаларды жаÑыруы керек пе?
+blocked_count_addendum=(Ñүзгіден тыÑ: ?1?, жаÑырын: ?2?)
+subscription_invalid_location=Енгізілген Ð°Ð´Ñ€ÐµÑ Ð½Ðµ интернет адреÑÑ–, не файл мекен-жайы ретінде анықталмады.
+type_label_image=Сурет
+remove_subscription_warning=ОÑÑ‹ жазылуды өшіруды шынымен қалайÑыз ба?
+type_label_other=БаÑқа
+mobile_menu_enable=ABP: ІÑке қоÑу
+type_label_media=Ðудио/видео
+mobile_menu_disable_site=ABP: КелеÑÑ– үшін Ñөндіру: ?1?
+elemhideGroup_title=Элементтерді жаÑыру ережелері
+mobile_menu_enable_site=ABP: КелеÑÑ– үшін Ñ–Ñке қоÑу: ?1?
+type_label_elemhide=ЖаÑырын
+newGroup_title=Жаңа фильтрлер тобы
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/overlay.dtd
new file mode 100644
index 0000000..85523ea
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Иә">
+<!ENTITY notification.button.no "&amp;Жоқ">
+<!ENTITY sync.label "Adblock Plus баптауларын Sync Ñ–&amp;шіне қоÑу">
+<!ENTITY whitelist.site.label "КелеÑÑ– үшін Ñөндіру: ?1?">
+<!ENTITY filters.label "Фильт&amp;р баптаулары">
+<!ENTITY disable.label "Әр жерде Ñөндіру">
+<!ENTITY objecttab.title "Блоктау">
+<!ENTITY objecttab.tooltip "Adblock Plus көмегімен оÑÑ‹ объектті блоктау үшін шертіңіз">
+<!ENTITY menuitem.label "Adblock Plus ба&amp;птаулары">
+<!ENTITY objecttabs.label "Flash пен Java-ға Ñілтеме қал&amp;дыру">
+<!ENTITY sendReport.label "Бұл парақтағы мәÑеле туралы &amp;хабарлау">
+<!ENTITY whitelist.page.label "Тек оÑÑ‹ парақ үшін Ñөндіру">
+<!ENTITY context.image.label "Adblock Plus: Суретті блоктау">
+<!ENTITY counthits.label "Ф&amp;ильтрлер хиттерін Ñанау">
+<!ENTITY opensidebar.label "Блокталған құраманы аш&amp;у">
+<!ENTITY notification.button.close "Ж&amp;абу">
+<!ENTITY contribute.label "Adblock Plus-қа Ò¯Ð»ÐµÑ Ò›Ð¾Ñу">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Фреймді блоктау">
+<!ENTITY blocked.tooltip "Бұл парақтағы блокталған құрама:">
+<!ENTITY hideplaceholders.label "Блокталған &amp;Ñлементтер шектерін жаÑыру">
+<!ENTITY showinstatusbar.label "Қалып-&amp;күй жолағында көрÑету">
+<!ENTITY sidebar.title "Ðғымдағы парақ құрамаÑÑ‹">
+<!ENTITY options.label "&amp;Баптаулар">
+<!ENTITY context.object.label "Adblock Plus: Объектті блоктау">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: ОÑÑ‹ парақта қайта қоÑу">
+<!ENTITY filters.tooltip "Көп қолданылатын фильтрлер:">
+<!ENTITY closesidebar.label "Блокталған құраманы жаб&amp;у">
+<!ENTITY showintoolbar.label "&amp;Панельде көрÑету">
+<!ENTITY status.tooltip "Күйі:">
+<!ENTITY context.media.label "Adblock Plus: Ðудио/Видеоны блоктау">
+<!ENTITY subscription.update.label "Фильтрлерді жаңарту">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/sendReport.dtd
new file mode 100644
index 0000000..1e14564
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/sendReport.dtd
@@ -0,0 +1,66 @@
+<!ENTITY screenshot.undo.label "Б&amp;олдырмау">
+<!ENTITY issues.disabledgroups.description "КелеÑÑ– фильтрлер/тізімдер Ñөндірілген, бірақ олар ағымдағы параққа өз Ó™Ñерлерін тигізуі мүмкін:">
+<!ENTITY showData.label "Хабарлама мәліметін көрÑету">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus &amp;тым көп блоктайды">
+<!ENTITY issues.change.description "Баптауларыңыз өзгертілді. Парақты қайта жүктеп, өзгеріÑтерді Ñынап көріңіз, егер олар қайталанатын болÑа, хабарламаны жіберіңіз.">
+<!ENTITY email.label "&amp;Эл. пошта:">
+<!ENTITY issues.openPreferences.label "Фильтр баптауларын ашу">
+<!ENTITY sendPage.confirmation "Хабарламаңыз Ñақталды. Оны келеÑÑ– адреÑтен көре алаÑыз:">
+<!ENTITY copyLink.label "Хабарлама ÑілтемеÑін &amp;көшіру">
+<!ENTITY issues.nofilters.description "Adblock Plus бұл парақта ешнәрÑені блоктап тұрған жоқ. Бұл мәÑеле Adblock Plus-ке байланыÑты ÐµÐ¼ÐµÑ ÑиÑқты.">
+<!ENTITY sendPage.knownIssue "Сіз хабарлаған мәÑеле белгілі ÑиÑқты. Көбірек біліңіз:">
+<!ENTITY typeSelector.other.description "Егер мәÑеле Adblock Plus өзімен, оның фильтлерімен ÐµÐ¼ÐµÑ Ð±Ð¾Ð»Ñ‹Ð¿ тұр деп ойлаÑаңыз, бұл опциÑны таңдаңыз.">
+<!ENTITY issues.disabledgroups.enable.label "Фильтрге жазылу/фильтрлер тобын Ñ–Ñке қоÑу">
+<!ENTITY typeWarning.override.label "Мен түÑініп тұрмын, және хабарламаны жібергім &amp;келеді">
+<!ENTITY issues.disabled.enable.label "Adblock Plus Ñ–Ñке қоÑу">
+<!ENTITY update.fixed.description "Cіз хабарлаған мәÑеле фильтрлерге жаңартылумен шешілген ÑиÑқты. Парақты қайта жүктеп, қайталап көріңіз, мәÑеле жоғалмаÑа, Хабарлау батырмаÑын баÑыңыз.">
+<!ENTITY anonymous.label "&amp;Ðнонимды жіберу">
+<!ENTITY reloadButton.label "Па&amp;рақты қайта жүктеу">
+<!ENTITY recentReports.clear.label "Барлық хабарламаларды ө&amp;шіру">
+<!ENTITY typeSelector.description "Бұл терезе Ñізге Adblock Plus мәÑелеÑÑ– туралы хабарламаны дайындауға көмектеÑеді. Біріншіден, бұл парақта кездеÑкен мәÑеле түрін таңдаңыз:">
+<!ENTITY screenshot.remove.label "Жеке ақ&amp;паратты өшіру">
+<!ENTITY issues.ownfilters.description "Бұл параққа Ñ–Ñке аÑырылған кейбір фильтрлерді Ñіз қолмен көрÑеткенÑіз. МәÑелені туғызуы мүмкін фильтрлерді Ñөндіріңіз:">
+<!ENTITY update.inProgress.description "Adblock Plus мәÑеле шешілген бе, Ñоны текÑеру үшін фильтрлерге жазылуларыңызды жаңартуы тиіÑ. Күте тұрыңыз...">
+<!ENTITY sendPage.retry.label "Қайта жіберу">
+<!ENTITY data.label "Хабарла&amp;ма мәліметі:">
+<!ENTITY recentReports.label "Сіздің Ñоңғы жіберген хабарламаларыңыз">
+<!ENTITY typeWarning.description "Сіз хабарламаны Adblock Plus-пен болған мәÑеле, фильтрлермен ÐµÐ¼ÐµÑ Ð´ÐµÐ¿ белгіледіңіз. Ондай мәÑелелер жөнінде [link]Adblock Plus форумына[/link] хабарлау жөн. ОÑÑ‹ хабарлаушыны тек форумдағы темаға толықтыру ретінде қолданыңыз, Ñғни, хабарламаңыздың ÑілтемеÑін бермеÑеңіз, оны ешкім де байқамайды. ÐвтожаÑалған Ñілтеме хабарламаны жіберуден кейін қолжетерлік болады.">
+<!ENTITY issues.disabled.description "Adblock Plus қазір Ñөндірулі тұр, Ñондықтан ол ешнәрÑені блоктамайды.">
+<!ENTITY attachExtensions.label "Бел&amp;Ñенді кеңейтулер тізімін жіберу, мүмкін, өзара мәÑелелер пайда болған шығар">
+<!ENTITY issues.nosubscriptions.add.label "Фильтрлерге жазылуды қоÑу">
+<!ENTITY issues.disabledfilters.enable.label "Фильтрді Ñ–Ñке қоÑу">
+<!ENTITY issues.override.label "Баптаулар дұр&amp;Ñ‹Ñ, хабарламаны жалғаÑтыру">
+<!ENTITY issues.nosubscriptions.description "Веб Ñайттардан керек ÐµÐ¼ÐµÑ Ò›Ò±Ñ€Ð°Ð¼Ð°Ð½Ñ‹ өшіретін алдын-ала әзірленген фильтрлердің біреуіне де жазылмаған ÑиÑқтыÑыз.">
+<!ENTITY typeSelector.falsePositive.description "Парақта маңызды құрама жоқ болÑа, қате көрÑетілÑе не Ð´Ò±Ñ€Ñ‹Ñ Ñ–ÑтемеÑе, бұл опциÑны таңдаңыз. Ол мәÑеле Adblock Plus Ñалдарынан пайда болатынын текÑеру үшін, оны уақытша Ñөндіріңіз.">
+<!ENTITY typeSelector.other.label "Ба&amp;Ñқа мәÑеле">
+<!ENTITY emailComment.label "Біз Ñізден шын Ñл. пошта адреÑін енгізуді Ñұраймыз, өйткені еÑептемеңіз жөнінде Ñұрақтар бар болÑа, біз Ñізге
+ хабарлаÑа алатын боламыз. Сонымен бірге қоÑқан үлеÑіңізді танып, оның маңыздылығын көтере алуға жол ашады.">
+<!ENTITY issues.whitelist.remove.label "Adblock Plus оÑÑ‹ парақта қайта қоÑу">
+<!ENTITY outdatedSubscriptions.description "КелеÑÑ– фильтрге жазылу кем дегенде екі апта бойы жаңартылмады. Хабарламаны жіберу алдында фильтрге жазылуды жаңартыңыз, мәÑеле шешілген болуы мүмкін.">
+<!ENTITY dataCollector.description "Adblock Plus керек ақпаратты жинағанша, күте тұрыңыз.">
+<!ENTITY sendButton.label "Хабарлама&amp;ны жіберу">
+<!ENTITY comment.label "ТүÑіндірме (Ñ‚&amp;иіÑті емеÑ):">
+<!ENTITY sendPage.errorMessage "Хабарламаны жіберу талабы &quot;?1?&quot; қате кодымен аÑқталды. Интернетпен байланыÑыңызды текÑеріп, қайталаңыз. Егер ол көмектеÑпеÑе, [link]Adblock Plus форумынан[/link] көмек Ñұраңыз.">
+<!ENTITY showRecentReports.label "Соңғы жіберілген хабарламаларды қарау">
+<!ENTITY commentPage.heading "ТүÑіндірмені енгізу">
+<!ENTITY update.start.label "Жаңартуды қазір баÑтау">
+<!ENTITY issues.disabledfilters.description "КелеÑÑ– фильтрлер Ñөндірілген, бірақ олар ағымдағы параққа өз Ó™Ñерлерін тигізуі мүмкін:">
+<!ENTITY screenshot.description "Бірдей парақ әр түрлі адамдар үшін әр түрлі көрінуі мүмкін. Скриншотты қоÑып жіберÑеңіз, ол бізге көмектеÑуі мүмкін. Жеке ақпаратыңыз бар бөлігін өшіріп, мәÑеле пайда болған аймақтарды белгілей алаÑыз. Ол үшін төмендегі батырманы баÑып, тышқанмен керек аймақты таңдаңыз.">
+<!ENTITY screenshot.attach.label "Парақ Ñкриншо&amp;тын хабарламаға қоÑып жіберу">
+<!ENTITY issues.whitelist.description "Хабарлап тұрған парағыңыз үшін Adblock Plus қазір Ñөндірілген. МәÑелені анықтауға көмектеÑу үшін, хабарламаны жіберу алдында оны Ñ–Ñке қоÑып, парақты қайта жүктеңіз.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus жарна&amp;маны блоктамайды">
+<!ENTITY typeSelector.heading "МәÑеле түрін таңдаңыз">
+<!ENTITY anonymity.warning "Біз Ñізге кері хабарлаÑа алмаймыз, және еÑептемеңізді маңыздылығы төмендеу деп Ñанауымыз мүмкін.">
+<!ENTITY wizard.title "Хабарлаушы">
+<!ENTITY issues.ownfilters.disable.label "Фильтрді Ñөндіру">
+<!ENTITY commentPage.description "Төмендегі мәтін өріÑіне мәÑелені түÑіндіретін түÑіндірмені жаза алаÑыз. Бұл қадам тиіÑті емеÑ, бірақ мәÑеле күрделі болÑа, көмегі тиеді. Жіберу алдында мәліметті текÑере алаÑыз.">
+<!ENTITY comment.lengthWarning "ТүÑіндірмеңіздің ұзындығы 1000 таңбадан аÑты. Тек алғашқы 1000 таңба жіберіледі.">
+<!ENTITY typeSelector.falseNegative.description "Егер Adblock Plus қоÑулы тұрÑа, ал жарнама Ñонда да көрÑетілÑе, бұл опциÑны таңдаңыз.">
+<!ENTITY sendPage.waitMessage "Adblock Plus хабарламаңызды жібергенше күте тұрыңыз.">
+<!ENTITY dataCollector.heading "МәÑелелер туралы хабарлауға қош келдіңіз">
+<!ENTITY screenshot.heading "Скриншотты қоÑып жіберу">
+<!ENTITY sendPage.heading "Хабарламаны жіберу">
+<!ENTITY issues.subscriptionCount.description "Сізде фильтрлерге жазылулар Ñаны тым көп ÑиÑқты. Ондай жағдай қолдануға Ò±Ñынылмайды. Сонымен қатар біз Ñіздің хабарлауыңызды қабылдай алмаймыз, өйткені мәÑеле қай жазылудың Ñалдарынан пайда болғаны түÑінікÑіз. Тек маңызды жазылуларды қалдырып, баÑқаларды өшіріңіз, және мәÑеле қайталана ма, Ñоны көріңіз.">
+<!ENTITY screenshot.mark.label "Хабарламаны бел&amp;гілеу">
+<!ENTITY privacyPolicy.label "Жекелік ÑаÑÑаиы">
+<!ENTITY issues.description "Adblock Plus бұл мәÑеле үшін жауапты бола алатын, немеÑе тергеуді қиындататын Ñіздің баптауларыңызды анықтады.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/sidebar.dtd
new file mode 100644
index 0000000..7374b17
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Flash құрамаÑының шектері">
+<!ENTITY address.label "ÐдреÑÑ–">
+<!ENTITY context.open.label "Жаңа бетте ашу">
+<!ENTITY type.label "Түрі">
+<!ENTITY tooltip.filterSource.label "Фильтр көзі:">
+<!ENTITY noitems.label "Блокталатын құрама жоқ">
+<!ENTITY filter.label "Фильтр">
+<!ENTITY tooltip.size.label "Көлемі:">
+<!ENTITY reattach.label "ҚоÑып қою">
+<!ENTITY search.label "І&amp;здеу:">
+<!ENTITY docDomain.thirdParty "(үшінші жақты)">
+<!ENTITY filterSource.label "Фильтр көзі">
+<!ENTITY tooltip.docDomain.label "Құжат көзі:">
+<!ENTITY context.copy.label "Элемент адреÑін көшіру">
+<!ENTITY tooltip.type.label "Түрі:">
+<!ENTITY context.disablefilter.label "Фильтрді Ñөндіру ?1?">
+<!ENTITY context.copyFilter.label "Фильтрді көшіру">
+<!ENTITY context.block.label "Бұл Ñлементті блоктау">
+<!ENTITY context.enablefilter.label "Фильтрді қайта қоÑу ?1?">
+<!ENTITY detach.label "Бөліп жіберу">
+<!ENTITY whitelisted.label "Ережеден Ñ‚Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ò›">
+<!ENTITY context.disablefilteronsite.label "КелеÑÑ– үшін фильтрді өшіру ?1?">
+<!ENTITY detached.title "Adblock Plus: ағымдағы парақ құрамаÑÑ‹ (бөлінген)">
+<!ENTITY docDomain.firstParty "(бірінші жақты)">
+<!ENTITY tooltip.type.whitelisted "(ережеден тыÑ)">
+<!ENTITY tooltip.filter.label "Қолданудағы фильтр:">
+<!ENTITY tooltip.filter.disabled "(Ñөндірулі)">
+<!ENTITY context.editfilter.label "Қолданудағы фильтрді түзету">
+<!ENTITY tooltip.type.blocked "(блокталған)">
+<!ENTITY size.label "Көлемі">
+<!ENTITY context.whitelist.label "Элемент үшін ерекше ереже жаÑау">
+<!ENTITY context.selectAll.label "Барлығын ерекшелеу">
+<!ENTITY state.label "Күйі">
+<!ENTITY docDomain.label "Құжат көзі">
+<!ENTITY tooltip.address.label "ÐдреÑÑ–:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/subscriptionSelection.dtd
new file mode 100644
index 0000000..131c081
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "&quot;?1?&quot; Ñүзгі жазыл&amp;уын да қоÑу">
+<!ENTITY list.download.failed "Adblock Plus жазылулар тізімін жүктеп ала алмаған.">
+<!ENTITY list.download.retry "Қайтадан көру">
+<!ENTITY title.label "Жа&amp;зылудың аты:">
+<!ENTITY list.download.website "Веб Ñайтты шолу">
+<!ENTITY supplementMessage "Бұл фильтрге жазылу Ñізде әлі қоÑылмаған &quot;?1?&quot; Ñүзгімен бірге қолданылуы тиіÑ.">
+<!ENTITY viewList.label "Сүзгілерді қарап шығу">
+<!ENTITY visitHomepage.label "Үй парағын шолу">
+<!ENTITY addSubscription.label "Жазылуды қоÑу">
+<!ENTITY dialog.title "Adblock Plus фильтрлерге жазылуды қоÑу">
+<!ENTITY location.label "Фильтр тізім а&amp;дреÑÑ–:">
+<!ENTITY fromWeb.description "Сүзгі жазылуын қоÑуды раÑтаңыз. ҚоÑу алдында оның атауын не орналаÑуын өзгерте алаÑыз.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/composer.dtd
new file mode 100644
index 0000000..4cf4c74
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "주소 ë ë¶€ë¶„ì— ì¼ì¹˜ (&amp;n)">
+<!ENTITY domainRestriction.label "ì§€ì •ëœ ë„ë©”ì¸ì—ë§Œ ì ìš©(&amp;D) :">
+<!ENTITY collapse.default.no.label "기본값 (아니요)">
+<!ENTITY firstParty.label "ë‚´ë¶€ 요청ì—ë§Œ ì ìš© (&amp;r)">
+<!ENTITY preferences.label "í•„í„° ëª©ë¡ (&amp;S)">
+<!ENTITY pattern.label "유형 찾기">
+<!ENTITY thirdParty.label "외부 요청ì—ë§Œ ì ìš© (&amp;T)">
+<!ENTITY filter.label "새 필터 (&amp;f)">
+<!ENTITY collapse.label "ì°¨ë‹¨ëœ ìš”ì†Œì˜ ì˜ì—­ 숨기기 (&amp;l)">
+<!ENTITY match.warning "입력한 유형과 ì¼ì¹˜í•˜ëŠ” 주소가 없으며, 차단/허용할 ì£¼ì†Œì— ì˜í–¥ì„ 미치지 않ìŒ.">
+<!ENTITY anchor.start.label "주소 시작 ë¶€ë¶„ì— ì¼ì¹˜ (&amp;g)">
+<!ENTITY matchCase.label "대/ì†Œë¬¸ìž êµ¬ë¶„ (&amp;M)">
+<!ENTITY custom.pattern.label "ì‚¬ìš©ìž ì§€ì • (&amp;C)">
+<!ENTITY unselectAllTypes.label "ì„ íƒ í•´ì œ">
+<!ENTITY type.whitelist.label "예외 규칙 (&amp;x)">
+<!ENTITY regexp.warning "[ëŠë¦° í•„í„°] 유형 ëì— ìž„ì˜ ë¬¸ìž(*)ê°€ 없으면 ì •ê·œ 표현ì‹ìœ¼ë¡œ í•´ì„ë˜ë©°, 웹 페ì´ì§€ë¥¼ 불러오는 ì†ë„ê°€ ëŠë ¤ì§.">
+<!ENTITY dialog.title "필터 추가">
+<!ENTITY basic.label "기본 보기">
+<!ENTITY type.filter.label "차단 필터 (&amp;B)">
+<!ENTITY types.label "ì ìš© 형ì‹">
+<!ENTITY shortpattern.warning "[ëŠë¦° í•„í„°] ìœ í˜•ì˜ ê¸¸ì´ê°€ 너무 짧으면 í•„í„°ê°€ 비효율ì ìœ¼ë¡œ 처리ë˜ë©°, 웹 페ì´ì§€ë¥¼ 불러오는 ì†ë„ê°€ ëŠë ¤ì§.">
+<!ENTITY collapse.yes.label "예">
+<!ENTITY anchors.label "유형 ì¼ì¹˜ ì¡°ê±´ :">
+<!ENTITY collapse.default.yes.label "기본값 (예)">
+<!ENTITY domainRestriction.help "1. 파ì´í”„ 기호(|)를 ì´ìš©í•´ 여러 ë„ë©”ì¸ì— ì ìš© (예시 : site1.com|site2.net). 2. 물결 기호(~)를 ì´ìš©í•´ 필터를 ì ìš©í•˜ì§€ ì•Šì„ ë„ë©”ì¸ ì§€ì • (예시 : ~site.com)">
+<!ENTITY accept.label "추가">
+<!ENTITY options.label "옵션">
+<!ENTITY disabled.warning "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ëŠ” 현재 ë¹„í™œì„±í™”ëœ ìƒíƒœìž…니다. 필터는 여전히 추가할 수 있지만 [link]애드블ë¡í”ŒëŸ¬ìŠ¤ë¥¼ 활성화[/link]하지 않으면 추가한 필터는 ì ìš©ë˜ì§€ 않습니다.">
+<!ENTITY anchor.start.flexible.label "ë„ë©”ì¸ ì‹œìž‘ ë¶€ë¶„ì— ì¼ì¹˜ (&amp;g)">
+<!ENTITY collapse.no.label "아니요">
+<!ENTITY selectAllTypes.label "ëª¨ë‘ ì„ íƒ">
+<!ENTITY advanced.label "고급 보기">
+<!ENTITY pattern.explanation "ìœ í˜•ì€ ì¼ì¹˜í•˜ëŠ” 주소를 검색하는 í…스트 문ìžì—´ì´ë©°, ìž„ì˜ ë¬¸ìž(*)로 ì ìš© 범위를 조절할 수 있습니다.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/filters.dtd
new file mode 100644
index 0000000..b099db4
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "ì„ íƒëœ ë³µì› íŒŒì¼ì— ì˜í•´ 모든 ì‚¬ìš©ìž í•„í„°ê°€ êµì²´ë©ë‹ˆë‹¤. 진행하시겠습니까?">
+<!ENTITY slow.column "ëŠë¦° í•„í„°(!) (&amp;w)">
+<!ENTITY enabled.column "사용 (&amp;n)">
+<!ENTITY subscription.lastDownload.checksumMismatch "실패함 : 검사합 불ì¼ì¹˜">
+<!ENTITY noFiltersInGroup.text "í•„í„° ì—†ìŒ">
+<!ENTITY subscription.actions.label "ë™ìž‘">
+<!ENTITY filter.selectAll.label "ëª¨ë‘ ì„ íƒ">
+<!ENTITY backupButton.label "백업/ë³µì› (&amp;B)">
+<!ENTITY restore.minVersion.warning "경고 : ì´ íŒŒì¼ì€ 보다 ë†’ì€ ë²„ì „ì˜ ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì— ì˜í•´ ìƒì„±ë˜ì—ˆìŠµë‹ˆë‹¤. ì´ íŒŒì¼ë¡œ ë³µì›í•˜ê¸° ì „ì— ìµœì‹  ë²„ì „ì˜ ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ë¡œ ì—…ë°ì´íŠ¸í•˜ì‹­ì‹œì˜¤.">
+<!ENTITY restore.error "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì˜ ë°±ì—… 파ì¼ì´ 아니므로 ë³µì›ì„ í•  수 없습니다.">
+<!ENTITY sort.ascending.label "오름차순 (&amp;A ⇒ Z)">
+<!ENTITY sort.label "ì •ë ¬ (&amp;S)">
+<!ENTITY subscription.source.label "í•„í„° 목ë¡">
+<!ENTITY hitcount.column "ì ìš© 횟수 (&amp;H)">
+<!ENTITY noFilters.text "ì‚¬ìš©ìž í•„í„°ê°€ 없습니다.">
+<!ENTITY backup.custom.title "ì‚¬ìš©ìž í•„í„°ë§Œ 백업">
+<!ENTITY subscription.external.label "다른 확장 í”„ë¡œê·¸ëž¨ì— ì˜í•´ ì—…ë°ì´íЏë¨">
+<!ENTITY subscription.delete.label "삭제">
+<!ENTITY noGroupSelected.text "í•„í„° 목ë¡ì„ 보려면 í•„í„° ê·¸ë£¹ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤.">
+<!ENTITY filter.cut.label "잘ë¼ë‚´ê¸°">
+<!ENTITY restore.default.label "ë³µì› ë‚ ì§œ - ?1?">
+<!ENTITY subscription.lastDownload.inProgress "다운로드 중...">
+<!ENTITY subscriptions.tab.label "êµ¬ë… í•„í„°">
+<!ENTITY sort.descending.label "내림차순 (&amp;Z ⇒ A)">
+<!ENTITY filters.remove.warning "ì„ íƒí•œ 모든 필터를 제거하시겠습니까?">
+<!ENTITY filter.delete.label "삭제">
+<!ENTITY addSubscriptionAdd.label "추가">
+<!ENTITY viewMenu.label "보기">
+<!ENTITY subscription.lastDownload.unknown "알 수 ì—†ìŒ">
+<!ENTITY addSubscriptionCancel.label "취소">
+<!ENTITY subscription.enabled.label "사용">
+<!ENTITY noSubscriptions.text "êµ¬ë… í•„í„°ë¥¼ ì•„ì§ ì¶”ê°€í•˜ì§€ 않았습니다. ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ëŠ” í•„í„° ì—†ì´ëŠ” ì•„ë¬´ê²ƒë„ ì°¨ë‹¨í•  수 없으므로 &quot;êµ¬ë… í•„í„° 추가&quot; ë²„íŠ¼ì„ ëˆŒëŸ¬ êµ¬ë… í•„í„°ë¥¼ 추가하십시오.">
+<!ENTITY subscription.update.label "ì—…ë°ì´íЏ">
+<!ENTITY dialog.title "필터 설정">
+<!ENTITY addFilter.label "필터 추가 (&amp;d)">
+<!ENTITY subscription.minVersion.warning "ì´ êµ¬ë… í•„í„°ëŠ” 보다 ë†’ì€ ë²„ì „ì˜ ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ê°€ 필요합니다. 최신 ë²„ì „ì˜ ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ë¥¼ 설치하십시오.">
+<!ENTITY subscription.lastDownload.invalidURL "실패함 : 올바르지 ì•Šì€ ì£¼ì†Œ">
+<!ENTITY backup.error "백업 파ì¼ì— í•„í„° 작성 오류가 있습니다. ì´ íŒŒì¼ì€ 쓰기 ë°©ì§€ ìƒíƒœì´ê±°ë‚˜ 다른 ì‘ìš© 프로그램ì—서 사용 중ì¸ì§€ 확ì¸í•˜ì‹­ì‹œì˜¤.">
+<!ENTITY filter.moveUp.label "위로 ì´ë™">
+<!ENTITY addGroup.label "필터 그룹 추가 (&amp;g)">
+<!ENTITY filter.edit.label "편집">
+<!ENTITY subscription.showHideFilters.label "í•„í„° ëª©ë¡ ë³´ê¸°/숨기기">
+<!ENTITY acceptableAds2.label "비침입형 광고 허용 (&amp;i)">
+<!ENTITY addSubscriptionOther.label "다른 êµ¬ë… í•„í„° 추가 (F)">
+<!ENTITY close.label "닫기">
+<!ENTITY sort.none.label "정렬 안 함 (&amp;U)">
+<!ENTITY filter.actions.label "í•„í„° ë™ìž‘">
+<!ENTITY filter.copy.label "복사">
+<!ENTITY filter.moveDown.label "아래로 ì´ë™">
+<!ENTITY filter.resetHitCounts.label "í•„í„° ì ìš© 횟수 초기화">
+<!ENTITY readMore.label "ìžì„¸ížˆ 보기">
+<!ENTITY subscription.moveUp.label "위로 ì´ë™">
+<!ENTITY addSubscription.label "êµ¬ë… í•„í„° 추가 (&amp;f)">
+<!ENTITY subscription.homepage.label "홈페ì´ì§€">
+<!ENTITY backup.complete.title "사용ìž/êµ¬ë… í•„í„° 백업">
+<!ENTITY restore.own.label "백업 파ì¼ë¡œ ë³µì›">
+<!ENTITY restore.complete.warning "ì„ íƒëœ ë³µì› íŒŒì¼ì— ì˜í•´ 모든 í•„í„° ì„¤ì •ì´ êµì²´ë©ë‹ˆë‹¤. 진행하시겠습니까?">
+<!ENTITY filters.tab.label "ì‚¬ìš©ìž í•„í„°">
+<!ENTITY backup.label "백업 íŒŒì¼ ì €ìž¥">
+<!ENTITY find.label "찾기 (&amp;n)">
+<!ENTITY subscription.moveDown.label "아래로 ì´ë™">
+<!ENTITY subscription.lastDownload.connectionError "실패함 : 다운로드 실패">
+<!ENTITY subscription.lastDownload.success "ë™ê¸°í™” 성공">
+<!ENTITY subscription.lastDownload.invalidData "실패함 : 올바르지 ì•Šì€ í•„í„°">
+<!ENTITY filter.paste.label "붙여넣기">
+<!ENTITY subscription.disabledFilters.enable "필터 다시 사용">
+<!ENTITY lasthit.column "마지막 ì ìš© ë‚ ì§œ (&amp;L)">
+<!ENTITY subscription.editTitle.label "필터 그룹명 편집">
+<!ENTITY subscription.disabledFilters.warning "ì´ êµ¬ë… í•„í„°ì˜ ì¼ë¶€ 필터는 사용 중지ë˜ì—ˆìŠµë‹ˆë‹¤.">
+<!ENTITY filter.column "í•„í„° (&amp;F)">
+<!ENTITY subscription.lastDownload.label "마지막 다운로드 :">
+<!ENTITY viewList.label "í•„í„° ëª©ë¡ ë³´ê¸°">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/firstRun.properties
new file mode 100644
index 0000000..10a0ba9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=ê´‘ê³  회사가 수집하는 ì‚¬ìš©ìž ì¶”ì  ì •ë³´ë¥¼ 유출ë˜ì§€ 않게 하여 ê°œì¸ ì •ë³´ë¥¼ 보호합니다.
+firstRun_toggle_off=ë„기
+firstRun_feature_tracking=ì¶”ì  ì°¨ë‹¨
+firstRun_feature_malware=맬웨어 차단
+firstRun_title=ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ê°€ 설치ë˜ì—ˆìŠµë‹ˆë‹¤.
+firstRun_toggle_on=켜기
+firstRun_acceptableAdsExplanation=우리는 비침입ì ì´ë©° ì´ìš©ìž 친화ì ì¸ ê´‘ê³  ë°©ì‹ì„ 채íƒí•œ 웹사ì´íŠ¸ë¥¼ ê²©ë ¤í•˜ê³ ìž í•©ë‹ˆë‹¤. 특정 광고를 허용하기 위한 <a>ê´‘ê³  허용 지침</a>ì„ ìˆ˜ë¦½í•˜ì˜€ìœ¼ë©°, 기본 설정으로 그러한 광고는 í™”ë©´ì— í‘œì‹œë©ë‹ˆë‹¤. 모든 광고를 차단하려면 ì´ ê¸°ëŠ¥ì˜ <a>ì‚¬ìš©ì„ ì¤‘ì§€</a>í•  수 있습니다.
+firstRun_contributor_credits=ê³µí—Œìž ëª…ë‹¨
+firstRun_dataCorruptionWarning=ì´ íŽ˜ì´ì§€ë¥¼ 계ì†í•´ì„œ 보시겠습니까? <a>여기 í´ë¦­!</a>
+firstRun_acceptableAdsHeadline=ì¸í„°ë„· ì´ìš©ì„ 방해하거나 불법·유해한 광고는 ì´ì œ ì°¨ë‹¨ë  ê²ƒìž…ë‹ˆë‹¤
+firstRun_share=í™ë³´
+firstRun_share_headline=ë” ë‚˜ì€ ì›¹ì„ ë§Œë“¤ê¸° 위해 <a>공헌하기</a>
+firstRun_feature_social_description=웹페ì´ì§€ìƒì— ì¸í„°ë„· 사용 행태를 ì¶”ì í•˜ëŠ” ì‚¬íšŒê´€ê³„ë§ ì„œë¹„ìŠ¤ ë²„íŠ¼ì„ ìžë™ìœ¼ë¡œ 제거해ì¤ë‹ˆë‹¤.
+firstRun_filterlistsReinitializedWarning=문제가 ë°œìƒí•˜ì—¬ 모든 í•„í„°ê°€ 제거ë˜ê³ , ë°±ì—…ì„ ë³µì›í•  수 없습니다. 그러므로 ì‚¬ìš©ìž í•„í„°ì™€ 허용 ê´‘ê³  ì„¤ì •ì„ ì´ˆê¸°í™”í–ˆì–´ì•¼ 합니다. <a>ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 옵션</a>ì—서 구ë…필터와 허용 ê´‘ê³  ì„¤ì •ì„ í™•ì¸í•˜ì‹­ì‹œì˜¤.
+firstRun_feature_malware_description=ë„리 알려진 맬웨어 ë„ë©”ì¸ì„ ì°¨ë‹¨í•¨ìœ¼ë¡œì¨ ì›¹ì„ ë” ì•ˆì „í•˜ê²Œ ì´ìš©í•©ë‹ˆë‹¤.
+firstRun_features=ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ëŠ” ê´‘ê³  차단 ì´ì™¸ 다양한 ê¸°ëŠ¥ì´ ìžˆìŠµë‹ˆë‹¤
+firstRun_donate=기부
+firstRun_donate_label=프로ì íЏ ì§€ì›
+firstRun_feature_social=ì‚¬íšŒê´€ê³„ë§ ì„œë¹„ìŠ¤ 버튼 제거
+firstRun_legacySafariWarning=ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì—서 ì§€ì›í•˜ì§€ 않는 구버전 사파리를 사용하고 있습니다. 그래서 ì¼ë¶€ 사ì´íЏì—서 ì •ìƒì ì¸ ìž‘ë™ì„ 하지 않거나 ì‚¬ìš©ìž ê²½í—˜ì— ì†ìƒì„ 줄 수 있습니다. 사파리 6.6.1 ì´ìƒ(OS X 10.8 Mountain Lion), ë˜ëŠ” 사파리 7.0.1 ì´ìƒ(OS X 10.9 Mavericks) ë˜ëŠ” ëª¨ì§ˆë¼ íŒŒì´ì–´í­, 구글 í¬ë¡¬, 오페ë¼ì˜ 최신 ë²„ì „ì„ ì‚¬ìš©í•  ê²ƒì„ ê¶Œìž¥í•©ë‹ˆë‹¤.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/global.properties
new file mode 100644
index 0000000..bbd9425
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=현재 페ì´ì§€ì— 차단 가능한 í•­ëª©ì´ ì—†ìŠµë‹ˆë‹¤.
+action3_tooltip=ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용/중지
+notification_antiadblock_title=í‘œì  ë©”ì‹œì§€ë¥¼ 숨기겠습니까?
+type_label_script=스í¬ë¦½íЏ
+filter_elemhide_nocriteria=숨기려는 요소를 ì¸ì‹í•˜ê¸° 위한 ê¸°ì¤€ì´ ì§€ì •ë˜ì§€ 않았습니다.
+blockingGroup_title=요청 차단 필터
+whitelisted_tooltip=ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용 (í—ˆìš©ëœ íŽ˜ì´ì§€)
+type_label_stylesheet=스타ì¼ì‹œíЏ
+blocked_count_tooltip=차단 : ?1?개, 전체 항목 : ?2?개
+type_label_font=글꼴
+type_label_popup=íŒì—…ì°½
+filter_regexp_tooltip=ì´ í•„í„°ëŠ” ì •ê·œ 표현ì‹ì´ê±°ë‚˜ 최ì í™”í•˜ê¸°ì— ê¸¸ì´ê°€ 너무 짧으므로 웹 페ì´ì§€ë¥¼ 불러오는 ì†ë„ê°€ 저하ë©ë‹ˆë‹¤.
+action0_tooltip=마우스 ê°€ìš´ë° ë²„íŠ¼ - ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용/중지
+whitelisted_page=í—ˆìš©ëœ íŽ˜ì´ì§€
+remove_group_warning=ì´ ê·¸ë£¹ì„ ì •ë§ ì œê±°í•˜ì‹œê² ìŠµë‹ˆê¹Œ?
+action1_tooltip=마우스 ê°€ìš´ë° ë²„íŠ¼ - ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용/중지
+type_label_xmlhttprequest=XML 요청
+active_tooltip=ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용 [êµ¬ë… í•„í„° : ?1?ê°œ, ì‚¬ìš©ìž í•„í„° : ?2?ê°œ ]
+type_label_document=문서
+type_label_object_subrequest=하위 ê°ì²´ 요청
+whitelistGroup_title=허용 필터
+disabled_tooltip=ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용 중지
+filter_elemhide_duplicate_id=숨기려는 ìš”ì†Œì˜ ID는 한 개만 지정할 수 있습니다.
+type_label_object=ê°ì²´
+action2_tooltip=마우스 ê°€ìš´ë° ë²„íŠ¼ - ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용/중지
+type_label_subdocument=프레임
+clearStats_warning=모든 í•„í„° ì ìš© 횟수가 초기화ë˜ê³ , ì´ í†µê³„ ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ì§€ 않습니다. 진행하시겠습니까?
+notification_antiadblock_message=ì´ ì‚¬ì´íŠ¸ëŠ” ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용ìžì—게 í‘œì  ë©”ì‹œì§€ë¥¼ 보여주는 것으로 알려져 있습니다. ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ë¡œ í‘œì  ë©”ì‹œì§€ë¥¼ 숨기겠습니까?
+blocked_count_addendum=(허용 : ?1?개, 요소 숨김 : ?2?개)
+subscription_invalid_location=êµ¬ë… í•„í„°ì˜ ìœ„ì¹˜ì— ìž…ë ¥í•˜ëŠ” URL ë˜ëŠ” 파ì¼ëª…ì´ ì˜¬ë°”ë¥´ì§€ 않습니다.
+type_label_image=ì´ë¯¸ì§€
+remove_subscription_warning=ì´ êµ¬ë… í•„í„°ë¥¼ 제거하시겠습니까?
+type_label_other=기타
+mobile_menu_enable=ABP:사용
+type_label_media=오디오/비디오
+mobile_menu_disable_site=ABP:해제 - ?1?
+elemhideGroup_title=요소 숨김 필터
+mobile_menu_enable_site=ABP:사용 - ?1?
+type_label_elemhide=숨겨진 요소
+newGroup_title=새 필터 그룹
+default_dialog_title=ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/overlay.dtd
new file mode 100644
index 0000000..2b84e5e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;예">
+<!ENTITY notification.button.no "&amp;아니요">
+<!ENTITY sync.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 설정 ë™ê¸°í™” (&amp;c)">
+<!ENTITY whitelist.site.label "사ì´íЏ 허용 : ?1?">
+<!ENTITY filters.label "필터 설정 (&amp;F)">
+<!ENTITY disable.label "사용 중지">
+<!ENTITY objecttab.title "차단">
+<!ENTITY objecttab.tooltip "ì´ ê°ì²´ë¥¼ 차단하려면 차단 íƒ­ì„ í´ë¦­í•˜ì‹­ì‹œì˜¤.">
+<!ENTITY menuitem.label "필터 설정 (&amp;B)">
+<!ENTITY objecttabs.label "플래시/ìžë°”ì— ì°¨ë‹¨ 탭 표시 (&amp;T)">
+<!ENTITY sendReport.label "현재 페ì´ì§€ì˜ 문제 ë³´ê³  (&amp;R)">
+<!ENTITY whitelist.page.label "현재 페ì´ì§€ 허용">
+<!ENTITY context.image.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ : ì´ë¯¸ì§€ 차단">
+<!ENTITY counthits.label "í•„í„° ì ìš© 횟수 ê¸°ë¡ (&amp;h)">
+<!ENTITY opensidebar.label "차단 가능 ëª©ë¡ (&amp;B)">
+<!ENTITY notification.button.close "&amp;닫기">
+<!ENTITY contribute.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì— ê³µí—Œí•˜ê¸°">
+<!ENTITY toolbarbutton.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤">
+<!ENTITY context.frame.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ : 프레임 차단">
+<!ENTITY blocked.tooltip "ì ìš©ëœ í•„í„° 개수">
+<!ENTITY hideplaceholders.label "ì°¨ë‹¨ëœ ìš”ì†Œì˜ ì˜ì—­ 숨기기 (&amp;l)">
+<!ENTITY showinstatusbar.label "ìƒíƒœ í‘œì‹œì¤„ì— ì•„ì´ì½˜ ë³´ì´ê¸° (&amp;S)">
+<!ENTITY sidebar.title "현재 페ì´ì§€ì˜ 차단 가능한 항목">
+<!ENTITY options.label "옵션 (&amp;O)">
+<!ENTITY context.object.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ : ê°ì²´ 차단">
+<!ENTITY context.removeWhitelist.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ : 사ì´íЏ/페ì´ì§€ 허용 í•´ì œ">
+<!ENTITY filters.tooltip "ì ìš©ëœ 주요 í•„í„°">
+<!ENTITY closesidebar.label "차단 가능 ëª©ë¡ ë‹«ê¸° (&amp;B)">
+<!ENTITY showintoolbar.label "íˆ´ë°”ì— ì•„ì´ì½˜ ë³´ì´ê¸° (&amp;B)">
+<!ENTITY status.tooltip "ìƒíƒœ">
+<!ENTITY context.media.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ : 비디오/오디오 차단">
+<!ENTITY subscription.update.label "ì—…ë°ì´íЏ">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/sendReport.dtd
new file mode 100644
index 0000000..2e06d78
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "ë˜ëŒë¦¬ê¸° (&amp;U)">
+<!ENTITY issues.disabledgroups.description "ë‹¤ìŒ êµ¬ë… í•„í„°/í•„í„° ê·¸ë£¹ì„ ì‚¬ìš©í•˜ì§€ 않지만 ì´ íŽ˜ì´ì§€ì— ì˜í–¥ì„ 줄 수 있습니다.">
+<!ENTITY showData.label "ë³´ê³ í•  ìžë£Œ 보기">
+<!ENTITY typeSelector.falsePositive.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ê°€ 콘í…츠를 ê³¼ë„하게 차단함 (&amp;m)">
+<!ENTITY issues.change.description "ì„¤ì •ì´ ë³€ê²½ë˜ì—ˆìŠµë‹ˆë‹¤. 웹 페ì´ì§€ë¥¼ 다시 불러온 후 문제가 í•´ê²°ë˜ì§€ 않는다면 보고서를 제출하십시오.">
+<!ENTITY email.label "ë©”ì¼ ì£¼ì†Œ: (&amp;m)">
+<!ENTITY issues.openPreferences.label "필터 설정 열기">
+<!ENTITY sendPage.confirmation "보고서가 ì„œë²„ì— ì €ìž¥ë˜ì—ˆê³ , ë‹¤ìŒ ì£¼ì†Œë¡œ 보고서를 확ì¸í•  수 있습니다. í•„í„° 유지ìžê°€ 보고를 접수하면 ë³´ê³ ì„œì˜ Status 항목ì—는 unknown ëŒ€ì‹ ì— ì²˜ë¦¬ 결과가 표시ë©ë‹ˆë‹¤.">
+<!ENTITY copyLink.label "ë³´ê³  ë§í¬ 복사 (&amp;C)">
+<!ENTITY issues.nofilters.description "ì´ ë¬¸ì œëŠ” ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ê°€ ì•„ë¬´ê²ƒë„ ì°¨ë‹¨í•˜ì§€ ì•Šì€ ìƒíƒœì—서 ë°œìƒí•´ì„œ ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì™€ ê´€ë ¨ì´ ì—†ìŠµë‹ˆë‹¤.">
+<!ENTITY sendPage.knownIssue "보고한 문제는 다른 사용ìžë“¤ì— ì˜í•´ ì´ë¯¸ ë§Žì´ ë³´ê³ ë˜ì—ˆìŠµë‹ˆë‹¤. ë” ë§Žì€ ì •ë³´ :">
+<!ENTITY typeSelector.other.description "í•„í„° 문제가 아닌 ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ ìžì²´ì˜ 문제로 ì˜ì‹¬í•œë‹¤ë©´ ì´ ì˜µì…˜ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤.">
+<!ENTITY issues.disabledgroups.enable.label "êµ¬ë… í•„í„°/í•„í„° 그룹 사용">
+<!ENTITY typeWarning.override.label "ìœ„ì˜ ë‚´ìš©ì„ ì´í•´í–ˆìœ¼ë©°, 보고서 ìž‘ì„±ì„ ê³„ì† ì§„í–‰í•¨ (&amp;s)">
+<!ENTITY issues.disabled.enable.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용">
+<!ENTITY update.fixed.description "ì—…ë°ì´íŠ¸ì— ì˜í•´ ë³´ê³ ëœ ì´ìŠˆê°€ í•´ê²°ëœ ê²ƒ 같습니다. 페ì´ì§€ 새로 ê³ ì¹¨ì„ í•˜ì‹  후 ìž¬ì‹œë„ í•˜ì‹­ì‹œì˜¤. ì•„ì§ ë¬¸ì œê°€ ë” ìžˆìœ¼ë©´ 다시 ë³´ê³ í•´ 주십시오.">
+<!ENTITY anonymous.label "ìµëª… 전송 (&amp;a)">
+<!ENTITY reloadButton.label "페ì´ì§€ 새로고침 (&amp;R)">
+<!ENTITY recentReports.clear.label "모든 보고서 제거 (&amp;R)">
+<!ENTITY typeSelector.description "문제 ë³´ê³  마법사는 ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì˜ ë¬¸ì œë¥¼ í•„í„° 유지ìžì—게 보고하기 위해 필요한 단계를 안내합니다. 먼저 현재 페ì´ì§€ì˜ 문제 ìœ í˜•ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤.">
+<!ENTITY screenshot.remove.label "민ê°í•œ ì˜ì—­ 숨김 (&amp;R)">
+<!ENTITY issues.ownfilters.description "현재 페ì´ì§€ì— ì ìš©ëœ í•„í„°ì˜ ì¼ë¶€ëŠ” 사용ìžê°€ 지정했습니다. ì´ ë¬¸ì œì— ì˜í–¥ì„ 줄 수 있는 ì‚¬ìš©ìž í•„í„°ëŠ” 사용하지 마십시오.">
+<!ENTITY update.inProgress.description "ì•„ì§ í•´ê²°ë˜ì§€ ì•Šì€ ì´ìŠˆë¡œ ì¸í•´ ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì˜ í•„í„°ë¥¼ ì—…ë°ì´íЏ 해야 합니다. 잠시만 기다려 주십시오...">
+<!ENTITY sendPage.retry.label "다시 전송">
+<!ENTITY data.label "ë³´ê³ í•  ìžë£Œ (&amp;p)">
+<!ENTITY recentReports.label "ìµœê·¼ì— ì œì¶œí•œ 보고서">
+<!ENTITY typeWarning.description "í•„í„° 문제가 아닌 ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì˜ ì¼ë°˜ì ì¸ 문제는 [link]ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ í¬ëŸ¼[/link]ì— ë³´ê³ í•˜ëŠ” ê²ƒì´ ìµœì„ ì±…ìž…ë‹ˆë‹¤. í¬ëŸ¼ì—서 ì´ë¯¸ ë…¼ì˜ëœ 문제를 보충하기 위해 문제 ë³´ê³  마법사를 ì´ìš©í•´ì•¼ 합니다. 보고서를 확ì¸í•  수 있는 ë§í¬ë¥¼ 제공하지 않으면 ì•„ë¬´ë„ ë³´ê³ ë¥¼ 확ì¸í•  수 없기 때문입니다. 보고서를 제출하면 ìžë™ìœ¼ë¡œ ìƒì„±ëœ ë§í¬ê°€ 제공ë©ë‹ˆë‹¤.">
+<!ENTITY issues.disabled.description "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ë¥¼ 사용하지 않는 ìƒíƒœì´ë¯€ë¡œ ì•„ë¬´ê²ƒë„ ì°¨ë‹¨í•˜ì§€ 않습니다.">
+<!ENTITY attachExtensions.label "사용하고 있는 부가 í”„ë¡œê·¸ëž¨ì˜ ëª©ë¡ì„ ë³´ê³ ì„œì— ì¶”ê°€ (다른 부가 프로그램과 ì¶©ëŒì´ ì›ì¸ì¸ 경우) (&amp;x)">
+<!ENTITY issues.nosubscriptions.add.label "êµ¬ë… í•„í„° 추가">
+<!ENTITY issues.disabledfilters.enable.label "필터 사용">
+<!ENTITY issues.override.label "설정ì—는 ì´ìƒì´ 없으며, 보고서 ìž‘ì„±ì„ ê³„ì† ì§„í–‰í•¨ (&amp;c)">
+<!ENTITY issues.nosubscriptions.description "웹 사ì´íŠ¸ì˜ ì›í•˜ì§€ 않는 광고를 ìžë™ 차단하는 êµ¬ë… í•„í„°ë¥¼ 추가하지 않았습니다.">
+<!ENTITY typeSelector.falsePositive.description "중요한 콘í…츠 누ë½, 웹 페ì´ì§€ê°€ 잘못 표시ë¨, ì˜¤ìž‘ë™ ë“± 차단 오류가 있으면 ì´ ì˜µì…˜ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤. ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì˜ ì‚¬ìš©ì„ ìž„ì‹œë¡œ 중지하여 ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ê°€ ë¬¸ì œì˜ ì›ì¸ì¸ì§€ 먼저 확ì¸í•˜ì‹­ì‹œì˜¤.">
+<!ENTITY typeSelector.other.label "다른 문제 (&amp;t)">
+<!ENTITY emailComment.label "ì „ìžìš°íޏ 주소를 입력할 ê²ƒì„ ê¶Œìž¥í•©ë‹ˆë‹¤. 만약 ë³´ê³ ëœ ë¬¸ì œì— ëŒ€í•´ 문ì˜í•´ì•¼ í•  때 ì—°ë½ì„ í•  수 있기 때문입니다.">
+<!ENTITY issues.whitelist.remove.label "사ì´íЏ/페ì´ì§€ 허용 필터를 사용 중지">
+<!ENTITY outdatedSubscriptions.description "아래 í•„í„°ê°€ ì ì–´ë„ 2주 ì´ìƒ ì—…ë°ì´íЏë˜ì§€ 않았습니다. 보고하기 ì´ì „ì— ë¨¼ì € 필터를 ì—…ë°ì´íŠ¸í•˜ì—¬ 주십시오. ì—…ë°ì´íŠ¸ë¥¼ 하면 문제가 í•´ê²°ë  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.">
+<!ENTITY dataCollector.description "필요한 ìžë£Œë¥¼ 수집하는 ë™ì•ˆ 잠시만 기다려주십시오.">
+<!ENTITY sendButton.label "보고서 전송 (&amp;n)">
+<!ENTITY comment.label "보고 내용 (필수 항목) : (&amp;C)">
+<!ENTITY sendPage.errorMessage "오류 코드 &quot;?1?&quot;ì— ì˜í•´ ë³´ê³  ì „ì†¡ì„ ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤. ì¸í„°ë„·ì´ ì ‘ì†ë˜ì—ˆëŠ”ì§€ 확ì¸í•œ 후 다시 시ë„하십시오. 만약 문제가 계ì†í•´ì„œ ë°œìƒí•œë‹¤ë©´ [link]ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ í¬ëŸ¼[/link]ì— ë„ì›€ì„ ìš”ì²­í•˜ì‹­ì‹œì˜¤.">
+<!ENTITY showRecentReports.label "ìµœê·¼ì— ì œì¶œí•œ 보고서 보기">
+<!ENTITY commentPage.heading "ë³´ê³  ë‚´ìš© ìž…ë ¥">
+<!ENTITY update.start.label "지금 ì—…ë°ì´íЏ 시작하기">
+<!ENTITY issues.disabledfilters.description "ë‹¤ìŒ í•„í„°ëŠ” 사용하지 않지만 현재 페ì´ì§€ì— ì˜í–¥ì„ 줄 수 있습니다.">
+<!ENTITY screenshot.description "ê°™ì€ íŽ˜ì´ì§€ë„ 다른 사람들ì—게는 다르게 ë³´ì¼ ìˆ˜ 있습니다. 그래서 ë³´ê³ ì„œì— í™”ë©´ ê°ˆë¬´ë¦¬ì„ ì²¨ë¶€í•˜ë©´ 문제를 ì´í•´í•˜ëŠ”ë° ë„ì›€ì´ ë©ë‹ˆë‹¤. 문제 ì˜ì—­ì„ ë¶€ê°í•˜ê¸° 위해 페ì´ì§€ ì´ë¯¸ì§€ì— 표시를 하고, 민ê°í•œ ì •ë³´ ì˜ì—­ì€ 숨길 수 있습니다. ì›í•˜ëŠ” ë²„íŠ¼ì„ ëˆ„ë¥´ê³ , ì´ë¯¸ì§€ì— 마우스로 ì˜ì—­ì„ 표시하십시오.">
+<!ENTITY screenshot.attach.label "ë³´ê³ ì„œì— íŽ˜ì´ì§€ ì´ë¯¸ì§€ 첨부 (&amp;t)">
+<!ENTITY issues.whitelist.description "현재 페ì´ì§€ì— 허용 필터를 ì ìš©í•˜ì—¬ 콘í…츠가 차단ë˜ì§€ 않았습니다. 현재 페ì´ì§€ì— ì ìš©ëœ 허용 í•„í„°ì˜ ì‚¬ìš©ì„ ì¤‘ì§€í•œ ìƒíƒœì—서 웹 페ì´ì§€ë¥¼ 다시 불러오십시오.">
+<!ENTITY typeSelector.falseNegative.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ê°€ 광고를 차단 안 함 (&amp;v)">
+<!ENTITY typeSelector.heading "문제 유형 ì„ íƒ">
+<!ENTITY anonymity.warning "우리가 ë‹¹ì‹ ì— ê²Œ ëŒì•„올 수 ì—†ì„ ê³  ê°€ëŠ¥ì„±ì´ ë³´ê³ ì„œ ë‚®ì€ ìš°ì„  순위를 지정 합니다.">
+<!ENTITY wizard.title "문제 보고 마법사">
+<!ENTITY issues.ownfilters.disable.label "필터 사용 중지">
+<!ENTITY commentPage.description "모든 언어로 ìž…ë ¥ 가능 + 페ì´ì§€ ì „ì²´ URL : í‰ì†Œ 사용하거나 설명하기 쉬운 언어로 ë³´ê³ í•  ë‚´ìš©ì„ ìž…ë ¥í•˜ì‹­ì‹œì˜¤. 그런 후 주소 í‘œì‹œì¤„ì˜ íŽ˜ì´ì§€ ì „ì²´ URLì„ ë³µì‚¬í•´ 입력한 ë‚´ìš© ì•„ëž˜ì— ë°˜ë“œì‹œ 붙여넣으십시오.">
+<!ENTITY comment.lengthWarning "ì„¤ëª…ì˜ ê¸¸ì´ê°€ 1000ìžë¥¼ 초과하여 1000ìžê¹Œì§€ë§Œ 전송ë©ë‹ˆë‹¤.">
+<!ENTITY typeSelector.falseNegative.description "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ë¥¼ 사용함ì—ë„ ë¶ˆêµ¬í•˜ê³  ê´‘ê³ ê°€ ë³´ì´ë©´ ì´ ì˜µì…˜ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤.">
+<!ENTITY sendPage.waitMessage "보고서를 제출하는 ë™ì•ˆ 잠시만 기다려주십시오.">
+<!ENTITY dataCollector.heading "문제 ë³´ê³  마법사를 ì´ìš©í•´ì£¼ì…”서 고맙습니다!">
+<!ENTITY screenshot.heading "화면 갈무리 첨부">
+<!ENTITY sendPage.heading "보고서 전송">
+<!ENTITY issues.subscriptionCount.description "너무 ë§Žì€ êµ¬ë… í•„í„°ë¥¼ 구ë…하고 있습니다. ì´ ì„¤ì •ì€ ë” ë§Žì€ ë¬¸ì œë¥¼ ë°œìƒì‹œí‚¬ 수 있기 ë•Œë¬¸ì— ê¶Œìž¥í•˜ì§€ 않습니다. ë˜í•œ 필요한 조치를 취할 êµ¬ë… í•„í„° 유지ìžê°€ 명확하지 않기 ë•Œë¬¸ì— ì´ ë¬¸ì œ 보고를 ë°›ì•„ë“¤ì¼ ìˆ˜ 없습니다. 실제로 필요한 êµ¬ë… í•„í„°ë¥¼ 제외한 모든 êµ¬ë… í•„í„°ë¥¼ 제거하고, 그런 후ì—ë„ ë¬¸ì œê°€ ë°œìƒí•˜ëŠ”ì§€ë¥¼ 테스트하십시오.">
+<!ENTITY screenshot.mark.label "문제 ì˜ì—­ 표시 (&amp;M)">
+<!ENTITY privacyPolicy.label "ê°œì¸ ì •ë³´ 보호 ì •ì±…">
+<!ENTITY issues.description "ì´ ë¬¸ì œì— ì˜í–¥ì„ 줄 수 있는 설정 ë˜ëŠ” ìžë£Œ 조사를 어렵게 하는 ìš”ì¸ì„ íƒì§€í–ˆìŠµë‹ˆë‹¤.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/sidebar.dtd
new file mode 100644
index 0000000..48d280d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "항목 위치 확ì¸">
+<!ENTITY address.label "주소">
+<!ENTITY context.open.label "새 탭으로 열기">
+<!ENTITY type.label "형ì‹">
+<!ENTITY tooltip.filterSource.label "필터 그룹 :">
+<!ENTITY noitems.label "차단 가능한 항목 ì—†ìŒ">
+<!ENTITY filter.label "í•„í„°">
+<!ENTITY tooltip.size.label "í¬ê¸° :">
+<!ENTITY reattach.label "통합">
+<!ENTITY search.label "검색 (&amp;S)">
+<!ENTITY docDomain.thirdParty "(외부 요청)">
+<!ENTITY filterSource.label "필터 위치">
+<!ENTITY tooltip.docDomain.label "문서 위치 :">
+<!ENTITY context.copy.label "주소 복사">
+<!ENTITY tooltip.type.label "í˜•ì‹ :">
+<!ENTITY context.disablefilter.label "필터 사용 중지 : ?1?">
+<!ENTITY context.copyFilter.label "필터 복사">
+<!ENTITY context.block.label "차단 필터 추가">
+<!ENTITY context.enablefilter.label "필터 다시 사용 : ?1?">
+<!ENTITY detach.label "분리">
+<!ENTITY whitelisted.label "í—ˆìš©ëœ íŽ˜ì´ì§€">
+<!ENTITY context.disablefilteronsite.label "ì§€ì •ëœ ë„ë©”ì¸ì—ë§Œ ì ìš© 중지 : ?1?">
+<!ENTITY detached.title "차단 가능 ëª©ë¡ (분리ë¨)">
+<!ENTITY docDomain.firstParty "(내부 요청)">
+<!ENTITY tooltip.type.whitelisted "(허용ë¨)">
+<!ENTITY tooltip.filter.label "í•„í„° :">
+<!ENTITY tooltip.filter.disabled "(사용 중지)">
+<!ENTITY context.editfilter.label "필터 편집">
+<!ENTITY tooltip.type.blocked "(차단ë¨)">
+<!ENTITY size.label "í¬ê¸°">
+<!ENTITY context.whitelist.label "허용 필터 추가">
+<!ENTITY context.selectAll.label "ëª¨ë‘ ì„ íƒ">
+<!ENTITY state.label "ìƒíƒœ">
+<!ENTITY docDomain.label "문서 위치">
+<!ENTITY tooltip.address.label "주소 :">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/subscriptionSelection.dtd
new file mode 100644
index 0000000..2374e0d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "&quot;?1?&quot; êµ¬ë… í•„í„°ë„ í•¨ê»˜ 추가 (&amp;s)">
+<!ENTITY list.download.failed "êµ¬ë… í•„í„° 목ë¡ì˜ 검색 실패">
+<!ENTITY list.download.retry "다시 시ë„">
+<!ENTITY title.label "ì´ë¦„ (&amp;T)">
+<!ENTITY list.download.website "웹 사ì´íЏ">
+<!ENTITY supplementMessage "ì„ íƒí•œ êµ¬ë… í•„í„°ëŠ” &quot;?1?&quot;와(ê³¼) 함께 추가할 ê²ƒì„ ê¶Œìž¥í•©ë‹ˆë‹¤.">
+<!ENTITY viewList.label "í•„í„° ëª©ë¡ ë³´ê¸°">
+<!ENTITY visitHomepage.label "홈페ì´ì§€">
+<!ENTITY addSubscription.label "추가">
+<!ENTITY dialog.title "êµ¬ë… í•„í„° 추가">
+<!ENTITY location.label "위치 (&amp;L)">
+<!ENTITY fromWeb.description "추가하려는 êµ¬ë… í•„í„°ì¸ì§€ 확ì¸í•˜ì‹­ì‹œì˜¤. 추가하기 ì „ì— ì´ë¦„ ë˜ëŠ” 위치를 변경할 수 있습니다.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/composer.dtd
new file mode 100644
index 0000000..13efa60
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "adreso &amp;pabaigoje">
+<!ENTITY domainRestriction.label "Apribojimai &amp;domenui:">
+<!ENTITY collapse.default.no.label "Naudoti numatytÄ… (ne)">
+<!ENTITY firstParty.label "Tik &amp;pagrindinių">
+<!ENTITY preferences.label "&amp;Rodyti esamus filtrus...">
+<!ENTITY pattern.label "Ieškoti atitikmens">
+<!ENTITY thirdParty.label "&amp;Tik treÄiųjų Å¡alių">
+<!ENTITY filter.label "Naujas &amp;filtras:">
+<!ENTITY collapse.label "&amp;Suskleisti užblokuotus:">
+<!ENTITY match.warning "Atitikmuo kurį įvedėte nebeatitinka adreso kurį reikia įdėti į baltąjį/juodąjį sąrašą todėl jis nebeturės jokio efekto.">
+<!ENTITY anchor.start.label "a&amp;dreso pradžioje">
+<!ENTITY matchCase.label "&amp;Skirti didžiąsias ir mažąsias raides">
+<!ENTITY custom.pattern.label "&amp;Pasirinktas:">
+<!ENTITY unselectAllTypes.label "Nieko nepasirinkti">
+<!ENTITY type.whitelist.label "I&amp;šimties taisyklė">
+<!ENTITY regexp.warning "Atitikmuo kurį įvedėte bus interpretuojamas kaip reguliarioji išraiška, Adblock Plus negali jo efektyviai pritaikyti, todėl gali sulėtėti naršymas. Jei nenorėjote naudoti reguliariųjų išraiškų, atitikmens pabaigoje pridėkite žvaigždutę (*).">
+<!ENTITY dialog.title "PridÄ—ti Adblock Plus filtravimo taisyklÄ™">
+<!ENTITY basic.label "Paprastas konfigūravimas">
+<!ENTITY type.filter.label "&amp;Blokavimo filtrai">
+<!ENTITY types.label "Pritaikyti tipams:">
+<!ENTITY shortpattern.warning "Atitikmuo kurį įvedėte yra per trumpas, kad būtų galima optimizuoti ir gali sulėtinti naršymą. Rekomenduojama šiam filtrui pasirinkti ilgesnę eilutę, kad Adblock Plus galėtų efektyviau išnaudoti šį filtrą.">
+<!ENTITY collapse.yes.label "Taip">
+<!ENTITY anchors.label "Priimti tik atitikmenį:">
+<!ENTITY collapse.default.yes.label "Naudoti numatytÄ… (taip)">
+<!ENTITY domainRestriction.help "Naudokite šią pasirinkty nurodyti vieną ar kelis domenus atskirtus |. Filtras bus pritaikytas tik pasirinktiems domenams. ~ prieš domeną parodo jog filtras nebus pritaikytas tam domenui.">
+<!ENTITY accept.label "PridÄ—ti filtrÄ…">
+<!ENTITY options.label "Parinktys">
+<!ENTITY disabled.warning "Adblock Plus šiuo metu yra išjungtas. Vistiek galite pridėti filtrus, bet jie neveiks kol [link]neįjungsite Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "&amp;domeno pradžioje">
+<!ENTITY collapse.no.label "Ne">
+<!ENTITY selectAllTypes.label "Pasirinkti visus">
+<!ENTITY advanced.label "Sudėtingesnis konfigūravimas">
+<!ENTITY pattern.explanation "Atitikmuo gali būti betkuri adreso dalis; žvaigždutė (*) veiks kaip „wildcards“. Filtras bus pritaikytas tik tuo atveju jei adrese bus rastas atitikmuo.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/filters.dtd
new file mode 100644
index 0000000..630e8cc
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Visi jūsų pasirinktiniai filtrai bus pakeisti pasirinkto failo turiniu. Ar norite tęsti?">
+<!ENTITY slow.column "&amp;LÄ—ti filtrai">
+<!ENTITY enabled.column "Įju&amp;ngta">
+<!ENTITY subscription.lastDownload.checksumMismatch "Nepavyko, bloga kontrolinÄ— suma">
+<!ENTITY noFiltersInGroup.text "Pasirinkta grupÄ— yra tuÅ¡Äia">
+<!ENTITY subscription.actions.label "Veiksmai">
+<!ENTITY filter.selectAll.label "Pasirinkti visas">
+<!ENTITY backupButton.label "&amp;Atsarginių kopijų kūrimas ir atkūrimas">
+<!ENTITY restore.minVersion.warning "Įspėjimas: failas sukurtas naudojant naujesnę Adblock Plus versiją. Prieš atstatant iš šio failo, turėtumėte atnaujinti savo Adblock Plus iki naujausios versijos.">
+<!ENTITY restore.error "Neįmanoma panaudoti failo duomenų, gal tai ne Adblock PLus atsarginės kopijos failas?">
+<!ENTITY sort.ascending.label "Riki&amp;avimo tvarka „A &gt; Z“">
+<!ENTITY sort.label "&amp;Rikiuoti pagal">
+<!ENTITY subscription.source.label "Filtrų sąrašas">
+<!ENTITY hitcount.column "&amp;Blokavimai">
+<!ENTITY noFilters.text "Kol kas jūs neturite jokių pasirinktinių filtrų.">
+<!ENTITY backup.custom.title "Tik pasirinktiniai filtrai">
+<!ENTITY subscription.external.label "Atnaujino kitas plÄ—tinys">
+<!ENTITY subscription.delete.label "Ištrinti">
+<!ENTITY noGroupSelected.text "Jūs turite pasirinkti filtrų grupę, tik tada bus galima parodyti tos grupės filtrus.">
+<!ENTITY filter.cut.label "Iškirpti">
+<!ENTITY restore.default.label "Atstatyti atsarginę kopiją iš ?1?">
+<!ENTITY subscription.lastDownload.inProgress "AtsiunÄiama...">
+<!ENTITY subscriptions.tab.label "Filtrų prenumeratos">
+<!ENTITY sort.descending.label "Rikiavimo tvarka „&amp;Z &gt; A“">
+<!ENTITY filters.remove.warning "Ar tikrai norite pašalinti visus pasirinktus filtrus?">
+<!ENTITY filter.delete.label "Pašalinti">
+<!ENTITY addSubscriptionAdd.label "PridÄ—ti">
+<!ENTITY viewMenu.label "Rodymas">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY addSubscriptionCancel.label "Atšaukti">
+<!ENTITY subscription.enabled.label "Įjungta">
+<!ENTITY noSubscriptions.text "Kol kas jūs nepridėjote jokių filtrų prenumeratų. Be filtrų Adblock Plus nieko neblokuos,
+norÄ—dami pridÄ—ti kelis naudokite
+&quot;Pridėti filtrų prenumeratą&quot;.">
+<!ENTITY subscription.update.label "Atnaujinti filtrus">
+<!ENTITY dialog.title "Adblock Plus filtrų nustatymai">
+<!ENTITY addFilter.label "Pri&amp;dÄ—ti filtrÄ…">
+<!ENTITY subscription.minVersion.warning "Ši filtrų prenumerata reikalauja naujesnės Adblock Plus versijos, turėtume atsinaujinti savo Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Nepavyko, netinkamas adresas">
+<!ENTITY backup.error "Įvyko klaida rašant filtrus į failą. Įsitikinkite jog tas failas neapsaugotas nuo rašymo ir jo nenaudoja kita programa.">
+<!ENTITY filter.moveUp.label "Pakelti aukštyn">
+<!ENTITY addGroup.label "Pridėti filtrų &amp;grupę">
+<!ENTITY filter.edit.label "Keisti">
+<!ENTITY subscription.showHideFilters.label "Rodyti/slėpti filtrų taisykles">
+<!ENTITY acceptableAds2.label "Leisti &amp;neįkyrias reklamas">
+<!ENTITY addSubscriptionOther.label "PridÄ—ti kitÄ… prenumeratÄ…">
+<!ENTITY close.label "Užverti">
+<!ENTITY sort.none.label "&amp;Nerikiuojama">
+<!ENTITY filter.actions.label "Filtro veiksmai">
+<!ENTITY filter.copy.label "Kopijuoti">
+<!ENTITY filter.moveDown.label "Perkelti žemyn">
+<!ENTITY filter.resetHitCounts.label "Atstatyti blokavimų statistiką">
+<!ENTITY readMore.label "PlaÄiau">
+<!ENTITY subscription.moveUp.label "Pakelti aukštyn">
+<!ENTITY addSubscription.label "&amp;PridÄ—ti filtro prenumeratÄ…">
+<!ENTITY subscription.homepage.label "Namų puslapis">
+<!ENTITY backup.complete.title "Visi filtrai ir prenumeratos">
+<!ENTITY restore.own.label "Atstatyti savo atsarginÄ™ kopijÄ…">
+<!ENTITY restore.complete.warning "Visi jūsų filtrų nustatymai bus pakeisti pasirinkto failo turiniu. Ar norite tęsti?">
+<!ENTITY filters.tab.label "Pasirinktiniai filtrai">
+<!ENTITY backup.label "Sukurti naujÄ… atsarginÄ™ kopijÄ…">
+<!ENTITY find.label "Ra&amp;sti">
+<!ENTITY subscription.moveDown.label "Perkelti žemyn">
+<!ENTITY subscription.lastDownload.connectionError "Nepavyko, atsiuntimo klaida">
+<!ENTITY subscription.lastDownload.success "SÄ—kmingai">
+<!ENTITY subscription.lastDownload.invalidData "Nepavyko, netinkamas filtrų sąrašas">
+<!ENTITY filter.paste.label "Įdėti">
+<!ENTITY subscription.disabledFilters.enable "Įjungti išjungtus filtrus">
+<!ENTITY lasthit.column "Paskutinis b&amp;lokavimas">
+<!ENTITY subscription.editTitle.label "Pervadinti">
+<!ENTITY subscription.disabledFilters.warning "Kai kurie filtrai, šioje prenumeratoje, išjungti.">
+<!ENTITY filter.column "Filtro &amp;taisyklÄ—">
+<!ENTITY subscription.lastDownload.label "Paskutinis atsiuntimas:">
+<!ENTITY viewList.label "Peržiūrėti sąrašą">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/firstRun.properties
new file mode 100644
index 0000000..18f17b1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=IÅ¡junkite sekimÄ… ir paverskite savo narÅ¡ymÄ… privaÄiu - paslÄ—pkite savo pÄ—dsakus nuo reklamos įmonių kurios galbÅ«t seka kiekvienÄ… jÅ«sų žingsnį.
+firstRun_toggle_off=IÅ J.
+firstRun_feature_tracking=Išjungti sekimą
+firstRun_feature_malware=Kenkėjiškų programų blokavimas
+firstRun_title=AdBlock Plus sėkmingai įdiegta
+firstRun_acceptableAdsExplanation=Mes norÄ—tume paskatinti svetaines naudoti paprastas, nekrentanÄias į akis reklamas. TodÄ—l nustatÄ—me <a>griežtas gaires</a> priimtinų reklamų nustatymui, jos bus rodomos pagal nutylÄ—jimÄ…. Jei vis tiek norite visas reklamas galite <a>iÅ¡jungti</a> Å¡iÄ… galimybÄ™ per kelias sekundes.
+firstRun_toggle_on=Įj.
+firstRun_contributor_credits=PadÄ—kos prisidÄ—jusiems
+firstRun_dataCorruptionWarning=Ar Å¡is puslapis pastoviai rodomas? <a>Paspauskite Äia</a>
+firstRun_acceptableAdsHeadline=Nuo Å¡iol erzinanÄios reklamos bus užblokuotos
+firstRun_share=Papasakokite savo draugams
+firstRun_share_headline=<a>PadÄ—kite mums</a> paversti internetÄ… geresne vieta
+firstRun_features=Adblock Plus gali daugiau nei tik blokuoti reklamas
+firstRun_feature_malware_description=Padarykite savo naršymą saugesniu užblokuodami žinomas kenkėjiškas svetaines.
+firstRun_feature_social_description=Automatiškai pašalinkite socialinių tinklų mygtukus, tokius kaip „Facebook Like“, kurie seka jūsų elgesį.
+firstRun_donate=paaukoti
+firstRun_donate_label=Paremkite mūsų projektą
+firstRun_feature_social=Pašalinti socialinių puslapių mygtukus
+firstRun_legacySafariWarning=Jūs naudojate seną Safari versiją, kurios Adblock Plus nepalaiko. Adblock plus gali veikti netinkamai ar sukelti problemų. Rekomenduojame naudoti Safari 6.1.1 ar naujesnę versiją (prieinama Mac OS X 10.9 Mavericks) arba naudokite naujausią Mozilla Firefox, Google Chrome ar Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/global.properties
new file mode 100644
index 0000000..8480dda
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Šiame puslapyje nėra jokių blokuojamų elementų
+action3_tooltip=Spragtelėkite, norėdami įjungti/išjungti „Adblock Plus“.
+notification_antiadblock_title=Paslėpti tikslinius pranešimus?
+type_label_script=scenarijus
+filter_elemhide_nocriteria=Nėra kriterijaus pagal kurį galima būtų nuspręsti kurį elementą paslėpti
+blockingGroup_title=Reklamų blokavimo taisyklės
+whitelisted_tooltip=„Adblock Plus“ aktyvus, bet išjungtas dabartiniam tinklalapiui.
+type_label_stylesheet=stilius
+blocked_count_tooltip=?1? iš ?2?
+type_label_font=šriftas
+type_label_popup=iššokantis langas
+filter_regexp_tooltip=Šis filtras yra reguliarioji išraiška arba per trumpas, kad būtų galima optimizuoti. Jei yra daug tokių filtrų jie gali sulėtinti naršymą.
+action0_tooltip=Spragtelėkite, norėdami iškviesti kontekstinį meniu; spragtelėkite viduriniuoju klavišu norėdami įjungti/išjungti.
+whitelisted_page=„Adblock Plus“ yra išjungtas dabartiniam tinklalapiui
+remove_group_warning=Ar tikrai norite pašalinti šią grupę?
+action1_tooltip=Spragtelėkite, norėdami atverti/užverti blokuojamus elementus; spragtelėkite viduriniuoju klavišu norėdami įjungti/išjungti.
+type_label_xmlhttprequest=XML užklausa
+active_tooltip=Adblock Plus įjungtas, naudojamos ?1? filtrų prenumeratos ir ?2? pasirinktiniai filtrai.
+type_label_document=dokumentas
+type_label_object_subrequest=papildoma objekto užklausa
+whitelistGroup_title=IÅ¡imÄių taisyklÄ—s
+disabled_tooltip=„Adblock Plus“ išjungtas.
+filter_elemhide_duplicate_id=Gali būti nurodytas tik vienas elemento ID kurį reikia paslėpti
+type_label_object=objektas
+action2_tooltip=Spragtelėkite, norėdami atverti nustatymus; spragtelėkite viduriniuoju klavišu norėdami įjungti/išjungti.
+type_label_subdocument=kadras
+clearStats_warning=Bus atstatyta visų filtrų blokavimų statistika ir iÅ¡jungtas blokavimų skaiÄiavimas. Ar norite tÄ™sti?
+notification_antiadblock_message=Šioje svetainėje rodomi tiksliniai pranešimai Adblock Plus naudotojams. Ar norite jog Adblock Plus paslėptų tikslinius pranešimus?
+blocked_count_addendum=(baltajame sąraše: ?1?, paslėpta: ?2?)
+subscription_invalid_location=Filtrų sąrašo adresas nėra taisyklingas URL ar failo vardas.
+type_label_image=paveikslÄ—lis
+remove_subscription_warning=Ar tikrai norite atsisakyti šios prenumeratos?
+type_label_other=kita
+mobile_menu_enable=ABP: Įjungti
+type_label_media=audio/video
+mobile_menu_disable_site=ABP: Išjungti ?1?
+elemhideGroup_title=Elementų slėpimo taisyklės
+mobile_menu_enable_site=ABP: Įjungti ?1?
+type_label_elemhide=paslÄ—pta
+newGroup_title=Nauja filtrų grupė
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/overlay.dtd
new file mode 100644
index 0000000..8e2f332
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Taip">
+<!ENTITY notification.button.no "&amp;Ne">
+<!ENTITY sync.label "Adblo&amp;ck Plus Sync nustatymai">
+<!ENTITY whitelist.site.label "Išjungti ?1?">
+<!ENTITY filters.label "&amp;Filtrų nustatymai">
+<!ENTITY disable.label "Išjungti visur">
+<!ENTITY objecttab.title "Blokuoti">
+<!ENTITY objecttab.tooltip "SpragtelÄ—kite Äia norÄ—dami užblokuoti šį objektÄ… su „Adblock Plus“">
+<!ENTITY menuitem.label "„&amp;Adblock Plus“ nustatymai">
+<!ENTITY objecttabs.label "Rodyti korteles &amp;Flash ir Java elementams">
+<!ENTITY sendReport.label "P&amp;ranešti apie problemą šiame puslapyje">
+<!ENTITY whitelist.page.label "Išjungti šiam tinklalapiui">
+<!ENTITY context.image.label "„Adblock Plus“: Blokuoti paveikslėlį">
+<!ENTITY counthits.label "Sus&amp;kaiÄiuoti filtro blokavimus">
+<!ENTITY opensidebar.label "Atverti &amp;blokuojamus elementus">
+<!ENTITY notification.button.close "&amp;Uždaryti">
+<!ENTITY contribute.label "PrisidÄ—ti prie Adblock Plus">
+<!ENTITY toolbarbutton.label "„Adblock Plus“">
+<!ENTITY context.frame.label "„Adblock Plus“: Blokuoti kadrą">
+<!ENTITY blocked.tooltip "Šiame tinklalapyje užblokuoti elementai:">
+<!ENTITY hideplaceholders.label "S&amp;lėpti užblokuotų elementų vietos laikiklius">
+<!ENTITY showinstatusbar.label "Rodyti &amp;būsenos juostoje">
+<!ENTITY sidebar.title "Blokuojami elementai dabartiniame tinklalapyje">
+<!ENTITY options.label "&amp;Pasirinktys">
+<!ENTITY context.object.label "„Adblock Plus“: Blokuoti objektą">
+<!ENTITY context.removeWhitelist.label "„Adblock Plus“: iš naujo įjungti šiame puslapyje">
+<!ENTITY filters.tooltip "Aktyviausi filtrai:">
+<!ENTITY closesidebar.label "Užverti &amp;blokuojamus elementus">
+<!ENTITY showintoolbar.label "&amp;Rodyti priemonių juostoje">
+<!ENTITY status.tooltip "Būsena:">
+<!ENTITY context.media.label "„Adblock Plus“: Blokuoti audio/video">
+<!ENTITY subscription.update.label "Atnaujinti filtrus">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/sendReport.dtd
new file mode 100644
index 0000000..9a832cd
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/sendReport.dtd
@@ -0,0 +1,96 @@
+<!ENTITY screenshot.undo.label "&amp;Atšaukti">
+<!ENTITY issues.disabledgroups.description "Šios filtrų prenumeratos / filtrų grupės yra išjungtos, nors jos gali
+turėti įtakos šiam puslapiui:">
+<!ENTITY showData.label "Rodyti pranešimo duomenis">
+<!ENTITY typeSelector.falsePositive.label "A&amp;dblock Plus blokuoja per daug">
+<!ENTITY issues.change.description "Jūsų konfigūracija pakeista. Perkraukite puslapį ir išbandykite keitimus
+ir jei problema neišsisprendė praneškite apie ją.">
+<!ENTITY email.label "El. paš&amp;tas:">
+<!ENTITY issues.openPreferences.label "Atverti filtro nustatymus">
+<!ENTITY sendPage.confirmation "Jūsų pranešimas išsaugotas. Jį pasiekti galite šiuo adresu:">
+<!ENTITY copyLink.label "&amp;Kopijuoti pranešimo nuorodą">
+<!ENTITY issues.nofilters.description "Adblock Plus dabartiniame puslapyje nieko neblokuoja. Problema kuriÄ… matote
+tikriausiai nÄ—ra susijusi su Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Pranešta klaida turbūt žinoma. Daugiau informacijos:">
+<!ENTITY typeSelector.other.description "Pasirinkite Å¡iÄ… pasirinkty jei manote jog tai paÄio Adblock Plus bÄ—da, o ne filtrų.">
+<!ENTITY issues.disabledgroups.enable.label "Įjungti filtro prenumeratą / filtrų grupę">
+<!ENTITY typeWarning.override.label "&amp;Aš suprantu ir vistiek noriu pranešti">
+<!ENTITY issues.disabled.enable.label "Įjungti Adblock Plus">
+<!ENTITY update.fixed.description "Atnaujinimai greiÄiausiai iÅ¡sprendÄ— bÄ—dÄ… apie kuriÄ… jÅ«s norÄ—jote praneÅ¡ti. Ä®kraukite puslapį iÅ¡ naujo, jei problema vis dar yra paspauskite „PraneÅ¡ti“.">
+<!ENTITY anonymous.label "&amp;Anoniminis pranešimas">
+<!ENTITY reloadButton.label "&amp;Įkelti iš naujo">
+<!ENTITY recentReports.clear.label "&amp;Pašalinti visus pranešimus">
+<!ENTITY typeSelector.description "Šis langas padės įvykdyti kelis žingsnius kurie reikalingi pranešti apie Adblock Plus
+problemą. Pirmiausia, šiame puslapyje, pasirinkite problemos su kuria susidūrėte
+tipÄ…:">
+<!ENTITY screenshot.remove.label "&amp;Pašalinti neviešus duomenis">
+<!ENTITY issues.ownfilters.description "Kai kurie filtrai pritaikyti šiam puslapiui yra sukurti naudotojo. Išjunkite
+filtrus kurie galÄ—jo sukelti problemÄ…:">
+<!ENTITY update.inProgress.description "Adblock Plus turi atnaujinti jūsų filtrų prenumeratas ir įsitikinti jog problema dar neišspręsta. Palaukite...">
+<!ENTITY sendPage.retry.label "Siųsti dar kartą">
+<!ENTITY data.label "Praneš&amp;imo duomenys:">
+<!ENTITY recentReports.label "Jūsų nesenai praneštos problemos">
+<!ENTITY typeWarning.description "Jūs pareiškėte jog problemą sukėlė Adblock Plus, o ne filtrai.
+Turėkite omeny jog tokias problemas geriausia pranešti
+[link]Adblock Plus forume[/link]. Šį problemų pranešėją turėtumėte naudoti
+tik papildyti esamas diskusijas, niekas nepastebės jūsų pranešimo
+nebent duosite nuorodą į jį. Automatiškai sukurta nuoroda
+bus parodyta kai išsiųsite pranešimą.">
+<!ENTITY issues.disabled.description "Adblock Plus yra išjungtas, tokioje būsenoje jis nieko neužblokuos.">
+<!ENTITY attachExtensions.label "Prie pranešimo pri&amp;segti aktyvių plėtinių sąrašą, jei kartais problema kilo dėl plėtinių nesuderinamumo">
+<!ENTITY issues.nosubscriptions.add.label "PridÄ—ti filtro prenumeratÄ…">
+<!ENTITY issues.disabledfilters.enable.label "Įjungti filtrą">
+<!ENTITY issues.override.label "Konfi&amp;gūracija teisinga, tęskite su pranešimu">
+<!ENTITY issues.nosubscriptions.description "Atrodo jūs neprenumeruojate jokių sukurtų filtrų sąrašų kurie automatiškai
+šalintų nepageidaujamą turinį iš puslapių.">
+<!ENTITY typeSelector.falsePositive.description "Pasirinkite šią pasirinkty jei puslapyje trūksta svarbaus turinio, jei atvaizduojama netinkamai ar
+puslapis nefunkcionuoja taip kaip turėtų. Norėdami įsitikinti jog problemą sukėlė Adblock Plus galite
+trumpam išjungti Adblock Plus.">
+<!ENTITY typeSelector.other.label "Ki&amp;ta bÄ—da">
+<!ENTITY emailComment.label "Mes raginame įvesti veikiantį el. pašto adresą, tada jei turėsime klausimų galėsime jums juos užduoti. Taipogi tai padės atpažinti jūsų pranešimus ir suteikti jiems aukštesnį prioritetą.">
+<!ENTITY issues.whitelist.remove.label "Šiame puslapyje pakartotinai įjungti Adblock Plus">
+<!ENTITY outdatedSubscriptions.description "Šios filtrų prenumeratos nebuvo atnaujintos bent dvi savaites. Prieš siųsdami pranešimą atnaujinkite šias prenumeratas, gali būti jog problema jau išspręsta.">
+<!ENTITY dataCollector.description "Palaukite kelias akimirkas, kol Adblock Plus surinks reikalingus duomenis.">
+<!ENTITY sendButton.label "Siųsti p&amp;ranešimą">
+<!ENTITY comment.label "&amp;Komentaras (nebūtinas):">
+<!ENTITY sendPage.errorMessage "Bandymas išsiųsti pranešimą nepavyko, buvo gauta klaida &quot;?1?&quot;. Įsitikinkite jog
+esate prisijungę prie interneto ir bandykite dar kartą. Jei problema vis dar yra paprašykite
+pagalbos forume [link]Adblock Plus forumas[/link].">
+<!ENTITY showRecentReports.label "Rodyti nesenai praneštas problemas">
+<!ENTITY commentPage.heading "Parašykite komentarą">
+<!ENTITY update.start.label "PradÄ—ti atnaujinimÄ…">
+<!ENTITY issues.disabledfilters.description "Šie filtrai yra išjungti, nors jie gali turėti įtakos šiam puslapiui:">
+<!ENTITY screenshot.description "Tas pats puslapis skirtingiems žmonėms, atrodo skirtingai. Mums gali padėti
+prisegtas ekrano vaizdas. Jūs galite pašalinti sritis kuriose
+gali būti neviešos informacijos, taip pat ir tas kuriose
+nesimato problemos. Norint tai padaryti paspauskite atitinkamÄ… mygtukÄ… ir pasirinkite
+reikalingą paveiksliuko dalį su pele.">
+<!ENTITY screenshot.attach.label "P&amp;rie pranešimo pridėti puslapio vaizdą">
+<!ENTITY issues.whitelist.description "Šiuo metu, šiame puslapyje Adblock Plus yra išjungtas. Prašau įjungti jį
+ir perkrauti puslapį prieš pranešant apie problemą kuriai
+spręsti norite pagalbos.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus neblokuoja &amp;reklamų">
+<!ENTITY typeSelector.heading "Pasirinkite tipÄ…">
+<!ENTITY anonymity.warning "Mes negalÄ—sime grįžti prie jÅ«sų ir greiÄiausiai jÅ«sų ataskaitai bus priskirtas žemas prioritetas.">
+<!ENTITY wizard.title "Klaidos pranešimas">
+<!ENTITY issues.ownfilters.disable.label "Išjungti filtrą">
+<!ENTITY commentPage.description "Teksto įvedimo laukelis leidžia jums įvesti komentarą kuris mums padės suprasti jūsų problemą.
+Šis žingsnis nebūtinas, bet rekomenduojamas jei problema neaiški.
+Taipogi galite peržiÅ«rÄ—ti praneÅ¡imÄ… prieÅ¡ jį siunÄiant.">
+<!ENTITY comment.lengthWarning "Jūsų komentaras ilgesnis nei 1000 simbolių. Bus išsiųsti tik pirmi 1000 simbolių.">
+<!ENTITY typeSelector.falseNegative.description "Pasirinkite šią pasirinkty jei reklama rodoma, net ir
+įjungus Adblock Plus.">
+<!ENTITY sendPage.waitMessage "Palaukite kol Adblock Plus siunÄia jÅ«sų praneÅ¡imÄ….">
+<!ENTITY dataCollector.heading "Sveiki atvykę į klaidų pranešėją">
+<!ENTITY screenshot.heading "Pridėti ekranvaizdį">
+<!ENTITY sendPage.heading "Siųsti pranešimą">
+<!ENTITY issues.subscriptionCount.description "Atrodo jūs prenumeruojate perdaug filtrų prenumeratų. Tokie nustatymai
+rekomenduojami, nes tai sumažins problemų tikimybes.
+Taipogi mes negalime priimti jūsų pranešimo, nes
+neaišku kurio filtro autorius turėtų imtis veiksmų. Prašome
+pašalinti visus tikrai reikalingas filtrų prenumeratas ir
+patikrinti ar problema vis dar yra.">
+<!ENTITY screenshot.mark.label "Paž&amp;ymėti problemą">
+<!ENTITY privacyPolicy.label "Privatumo politika">
+<!ENTITY issues.description "Adblock Plus nustatė klaidų jūsų konfigūracijoje kurios gali būti atsakingos
+dėl šios problemos arba gali apsunkinti problemų sprendimą.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/sidebar.dtd
new file mode 100644
index 0000000..4649d2e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Paryškinti elemento rėmelį">
+<!ENTITY address.label "Adresas">
+<!ENTITY context.open.label "Atverti naujoje kortelÄ—je">
+<!ENTITY type.label "Tipas">
+<!ENTITY tooltip.filterSource.label "Filtro šaltinis:">
+<!ENTITY noitems.label "Nėra blokuojamų elementų">
+<!ENTITY filter.label "Filtras">
+<!ENTITY tooltip.size.label "Dydis:">
+<!ENTITY reattach.label "Iš naujo įkelti">
+<!ENTITY search.label "&amp;Ieškoti:">
+<!ENTITY docDomain.thirdParty "(treÄioji Å¡alis)">
+<!ENTITY filterSource.label "Filtruoti pirminį kodą">
+<!ENTITY tooltip.docDomain.label "Dokumento šaltinis:">
+<!ENTITY context.copy.label "Kopijuoti elemento adresÄ…">
+<!ENTITY tooltip.type.label "Tipas:">
+<!ENTITY context.disablefilter.label "Išjungti filtrą ?1?">
+<!ENTITY context.copyFilter.label "Kopijuoti filtrÄ…">
+<!ENTITY context.block.label "Blokuoti šį elementą">
+<!ENTITY context.enablefilter.label "Iš naujo įjungti filtrą ?1?">
+<!ENTITY detach.label "Iškelti">
+<!ENTITY whitelisted.label "Tinklalapis įtrauktas į išimtis">
+<!ENTITY context.disablefilteronsite.label "Išjungti šį filtrą tinklalapiui ?1?">
+<!ENTITY detached.title "„Adblock Plus“ blokuojami elementai (iškelta)">
+<!ENTITY docDomain.firstParty "(pagrindinis)">
+<!ENTITY tooltip.type.whitelisted "(įtraukta į išimtis)">
+<!ENTITY tooltip.filter.label "Galiojantys filtrai:">
+<!ENTITY tooltip.filter.disabled "(išjungta)">
+<!ENTITY context.editfilter.label "Redaguoti aktyvų filtrą">
+<!ENTITY tooltip.type.blocked "(užblokuota)">
+<!ENTITY size.label "Dydis">
+<!ENTITY context.whitelist.label "Pridėti išimties taisyklę šiam elementui">
+<!ENTITY context.selectAll.label "Pažymėti viską">
+<!ENTITY state.label "Būsena">
+<!ENTITY docDomain.label "Dokumento šaltinis">
+<!ENTITY tooltip.address.label "Adresas:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/subscriptionSelection.dtd
new file mode 100644
index 0000000..dfcc0f7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "T&amp;aip pat pridÄ—ti filtro prenumeratÄ… &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plus nepavyko gauti prenumeratų sąrašo.">
+<!ENTITY list.download.retry "Bandykite dar kartÄ…">
+<!ENTITY title.label "&amp;Prenumeratos pavadinimas:">
+<!ENTITY list.download.website "Rodyti tinklalapį">
+<!ENTITY supplementMessage "Ši filtrų prenumerata skirta naudoti kartu su &quot;?1?&quot; filtrų prenumerata, kurios jūs kol kas nenaudojate.">
+<!ENTITY viewList.label "Rodyti filtrus">
+<!ENTITY visitHomepage.label "Aplankyti tinklalapį">
+<!ENTITY addSubscription.label "PridÄ—ti prenumeratÄ…">
+<!ENTITY dialog.title "Pridėti „Adblock Plus“ filtro prenumeratą">
+<!ENTITY location.label "Filtrų sąrašo &amp;vieta:">
+<!ENTITY fromWeb.description "Patvirtinkite jog norite pridėti šią prenumeratą. Prieš įdedant prenumeratą jūs galite pakeisti jos pavadinimą ar vietą.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/composer.dtd
new file mode 100644
index 0000000..08bd7d8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "adreses beigÄs">
+<!ENTITY domainRestriction.label "Ierobežot līdz domēnam:">
+<!ENTITY collapse.default.no.label "Lietot noklusēto vērtību (nē)">
+<!ENTITY firstParty.label "Tikai pirmÄs puses">
+<!ENTITY preferences.label "RÄdÄ«t esoÅ¡os filtrus...">
+<!ENTITY pattern.label "Meklēt paraugu">
+<!ENTITY thirdParty.label "Tikai treÅ¡Äs puses">
+<!ENTITY filter.label "Jauns filtrs:">
+<!ENTITY collapse.label "Bloķēts sabrukums:">
+<!ENTITY match.warning "Modeli ko jus ievadijat vairs neatbilst adresei bloketiem/baltulistetiem un neizveidos nekad effektu uz ta.">
+<!ENTITY anchor.start.label "adreses sÄkumÄ">
+<!ENTITY matchCase.label "Saderīgs gadījums">
+<!ENTITY custom.pattern.label "PielÄgots:">
+<!ENTITY unselectAllTypes.label "Izvēlēties nevienu">
+<!ENTITY type.whitelist.label "Izņēmuma nosacījums">
+<!ENTITY regexp.warning "Modelis kuru jÅ«s ievadÄ«jÄt tika interpretÄ“ts kÄ regulÄra izteiksme, ko Adblock Plus nevar efektÄ«vi apstrÄdÄt un tas var palÄ“ninÄt jÅ«su pÄrlÅ«koÅ¡anas Ätrumu. Ja jÅ«s neplÄnojat izmantot regulÄru izteiksmi, pievienojiet zvaigznÄ«ti (*) parauga beigÄs.">
+<!ENTITY dialog.title "Pievienot Adblock Plus filtra nosacījumu">
+<!ENTITY basic.label "Pamata skatījums">
+<!ENTITY type.filter.label "Bloķēšanas filtrs">
+<!ENTITY types.label "Pielietot tipiem:">
+<!ENTITY shortpattern.warning "Paraugs, kuru jÅ«s ievadÄ«jÄt, ir pÄrÄk Ä«ss, lai bÅ«tu optimizÄ“ts un tas var palÄ“ninÄt jÅ«su pÄrlÅ«koÅ¡anu. Ieteicams izvÄ“lÄ“ties garÄku virkni Å¡im filtram, lai Adblock Plus varÄ“tu apstrÄdÄt filtru efektÄ«vÄk.">
+<!ENTITY collapse.yes.label "JÄ">
+<!ENTITY anchors.label "ApstiprinÄt tiaki paraugus:">
+<!ENTITY collapse.default.yes.label "Lietot noklusÄ“to vÄ“rtÄ«bu (jÄ)">
+<!ENTITY domainRestriction.help "Izmantojiet Å¡o opciju, lai precizÄ“tu vienu vai vairÄkus domÄ“nus, atdalÄ«tus ar joslu lÄ«niju (|). Filtrs tiks attiecinÄts tikai uz izvÄ“lÄ“to domÄ“nu(-iem). Tilde (~) pirms domÄ“na vÄrda norÄda, ka filtrs netiek piemÄ“rots attiecÄ«bÄ uz Å¡o domÄ“nu.">
+<!ENTITY accept.label "Pievienot filtru">
+<!ENTITY options.label "Opcijas">
+<!ENTITY disabled.warning "Adblock Plus Å¡obrÄ«d ir atspÄ“jots. JÅ«s joprojÄm varat pievienot filtrus, bet tie netiks piemÄ“roti tik ilgi, kamÄ“r jÅ«s [link]neiespÄ“josiet Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "domÄ“na vÄrda sÄkumÄ">
+<!ENTITY collapse.no.label "NÄ“">
+<!ENTITY selectAllTypes.label "Izvēlēties visu">
+<!ENTITY advanced.label "PaplaÅ¡inÄts skatÄ«jums">
+<!ENTITY pattern.explanation "Paraugs var bÅ«t jebkura daļa no adreses, zvaigznÄ«te (*) darbojas kÄ aizstÄjÄ“jzÄ«me. Filtrs var tikt piemÄ“rots tikai adresei, kas atbilst paredzÄ“tajam modelim.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/filters.dtd
new file mode 100644
index 0000000..f7c466f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Visi JÅ«su pielÄgotie filtri tiks aizvietori ar izvÄ“lÄ“tÄ faila saturu. Vai vÄ“laties turpinÄt?">
+<!ENTITY slow.column "Lēni filtri">
+<!ENTITY enabled.column "Iespējots">
+<!ENTITY subscription.lastDownload.checksumMismatch "NeizdevÄs, kontrolsummas neatbilstÄ«ba">
+<!ENTITY noFiltersInGroup.text "IzvÄ“lÄ“tÄ grupa ir tukÅ¡sa.">
+<!ENTITY subscription.actions.label "Darbības">
+<!ENTITY filter.selectAll.label "Izvēlēties visu">
+<!ENTITY backupButton.label "Dublējumkopiju izveide un atjaunošana">
+<!ENTITY restore.minVersion.warning "BrÄ«dinÄjums: fails ir izveidots, izmantojot jaunÄku Adblock Plus versiju. Jums nepiecieÅ¡ams atjauninÄt Adblock Plus, pirms turpinÄt atjaunoÅ¡anu no šī faila.">
+<!ENTITY restore.error "Faila dati nevar tikt apstrÄdÄti, varbÅ«t tas nav Adblock Plus rezerves kopijas fails?">
+<!ENTITY sort.ascending.label "A &gt; Z kÄrtoÅ¡anas secÄ«ba">
+<!ENTITY sort.label "KÄrtot pÄ“c">
+<!ENTITY subscription.source.label "Filtru saraksts">
+<!ENTITY hitcount.column "Klikšķi">
+<!ENTITY noFilters.text "Jums vēl nav pielagotus filtrus.">
+<!ENTITY backup.custom.title "Tikai pielÄgotie filtri">
+<!ENTITY subscription.external.label "AtjauninÄts ar citu paplaÅ¡inÄjumu">
+<!ENTITY subscription.delete.label "Dzēst">
+<!ENTITY noGroupSelected.text "Jums ir nepiecieÅ¡ams izvÄ“lÄ“ties filtra grupu pirms tÄs filtrus var parÄdÄ«t.">
+<!ENTITY filter.cut.label "Izgriezt">
+<!ENTITY restore.default.label "Atjaunot rezerves kopiju no ?1?">
+<!ENTITY subscription.lastDownload.inProgress "LejupielÄdÄ“...">
+<!ENTITY subscriptions.tab.label "Filtra abonementi">
+<!ENTITY sort.descending.label "Z &gt; A kÄrtoÅ¡anas secÄ«ba">
+<!ENTITY filters.remove.warning "Vai tieÅ¡Äm vÄ“laties noņemt visus atlasÄ«tos filtrus?">
+<!ENTITY filter.delete.label "Dzēst">
+<!ENTITY addSubscriptionAdd.label "Pievienot">
+<!ENTITY viewMenu.label "Skatīt">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY addSubscriptionCancel.label "Atcelt">
+<!ENTITY subscription.enabled.label "Iespējota">
+<!ENTITY noSubscriptions.text "Jūs līdz šim neesat pievienojis nevienu filra abonementu. Adblock Plus neko nebloķēs bez filtriem, lūdzam lietot &quot;Pievienot filtra abonementu&quot;, lai tos pievienotu.">
+<!ENTITY subscription.update.label "AtjauninÄt filtrus">
+<!ENTITY dialog.title "Adblock Plus filtra prioritÄtes">
+<!ENTITY addFilter.label "Pievienot Filtru">
+<!ENTITY subscription.minVersion.warning "Å o filtru abonēšanai nepiecieÅ¡ama jaunÄka versija Adblock Plus, tadel jums vajadzÄ“tu atjauninÄt ar jaunÄko Adblock Plus versiju.">
+<!ENTITY subscription.lastDownload.invalidURL "NeizdevÄs, nav derÄ«ga adrese">
+<!ENTITY backup.error "RadÄs kļūda, ierakstot filtrus failÄ. PÄrliecinieties, ka fails nav aizsargÄts pret ierakstu vai netiek izmantots citÄ lietojumprogrammÄ.">
+<!ENTITY filter.moveUp.label "PÄrvietot uz augÅ¡u">
+<!ENTITY addGroup.label "Pievienot filtra grupu">
+<!ENTITY filter.edit.label "Rediģēt">
+<!ENTITY subscription.showHideFilters.label "RÄdÄ«t/paslÄ“pt filtrus">
+<!ENTITY acceptableAds2.label "Atļaut dažas neuzbÄzÄ«gas reklÄmas">
+<!ENTITY addSubscriptionOther.label "Pievienot citu abonementu">
+<!ENTITY close.label "Aizvērt">
+<!ENTITY sort.none.label "NesakÄrtots">
+<!ENTITY filter.actions.label "Filtra darbību">
+<!ENTITY filter.copy.label "Kopēt">
+<!ENTITY filter.moveDown.label "PÄrvietot uz leju">
+<!ENTITY filter.resetHitCounts.label "Atiestatīt izmantojumu statistiku">
+<!ENTITY readMore.label "LasÄ«t vairÄk">
+<!ENTITY subscription.moveUp.label "PÄrvietot uz augÅ¡u">
+<!ENTITY addSubscription.label "Pievienot filtra abonēšanu">
+<!ENTITY subscription.homepage.label "MÄjas lapa">
+<!ENTITY backup.complete.title "Visi filtri un abonementi">
+<!ENTITY restore.own.label "Atjaunot paša rezerves kopiju">
+<!ENTITY restore.complete.warning "Visas JÅ«su filtru prioritÄtes tiks aizvietotas ar izvÄ“lÄ“tÄ faila saturu. Vai vÄ“laties turpinÄt?">
+<!ENTITY filters.tab.label "PielÄgoti filtrus">
+<!ENTITY backup.label "Izveidot jaunu rezerves kopiju">
+<!ENTITY find.label "Meklēt">
+<!ENTITY subscription.moveDown.label "PÄrvietot uz leju">
+<!ENTITY subscription.lastDownload.connectionError "NeizdevÄs, lejupielÄde neizdevÄs">
+<!ENTITY subscription.lastDownload.success "IzdevÄs">
+<!ENTITY subscription.lastDownload.invalidData "NeizdevÄs, nav derÄ«gs filtru saraksts">
+<!ENTITY filter.paste.label "Ielīmēt">
+<!ENTITY subscription.disabledFilters.enable "Iespējot atspējotie filtri">
+<!ENTITY lasthit.column "Pēdējai klikšķis">
+<!ENTITY subscription.editTitle.label "Rediģēt nosaukumu">
+<!ENTITY subscription.disabledFilters.warning "Daži filtri šo abonementu ir atspējotas.">
+<!ENTITY filter.column "Filtra noteikumi">
+<!ENTITY subscription.lastDownload.label "PÄ“dÄ“jÄ lejupielÄde:">
+<!ENTITY viewList.label "Skatīt sarakstu">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/firstRun.properties
new file mode 100644
index 0000000..efbd94e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=PÄrlÅ«kot privÄti, atspÄ“jojot izsekoÅ¡anu - slÄ“pjot JÅ«su pÄ“das no reklÄmas kompÄnijÄm, kuras varÄ“tu izsekot katru JÅ«su kustÄ«bu.
+firstRun_toggle_off=IZSLÄ’GTS
+firstRun_feature_tracking=Atspējot izsekošanu
+firstRun_feature_malware=Bloķēt ļaundabīgas programmas
+firstRun_title=AdblockPlus ir uzstÄdÄ«ts
+firstRun_acceptableAdsExplanation=MÄ“s vÄ“lÄ“tos veicinÄt vienkÄrÅ¡u, neuzbÄzÄ«gu reklÄmu lietoÅ¡anu vietnÄ“s. TÄpÄ“c esam izveidojuÅ¡i <a>stingras vadlÄ«nijas</a> pieņemamo reklÄmu noteikÅ¡anai, kuras parÄdÄ«tas noklusÄ“juma iestatÄ«jumos. Ja JÅ«s joprojÄm vÄ“laties bloÄ·Ä“t pilnÄ«gi visas reklÄmas, JÅ«s varat <a>atspÄ“jot</a> Å¡o pÄ“c dažÄm sekundÄ“m.
+firstRun_toggle_on=IESLÄ’GTS
+firstRun_contributor_credits=ZiedotÄju saraksts
+firstRun_dataCorruptionWarning=Vai šī lapa turpina attēloties? <a>Spied šeit!</a>
+firstRun_acceptableAdsHeadline=UzmÄcÄ«gas reklÄmas turpmÄk tiks bloÄ·Ä“tas
+firstRun_share=PastÄsti saviem draugiem
+firstRun_share_headline=<a>PalÄ«dzi mums</a> padarÄ«t tÄ«klu par labÄku vietu
+firstRun_features=AdblockPlus var izdarÄ«t vairÄk, ne tikai bloÄ·Ä“t reklÄmas
+firstRun_feature_malware_description=PadarÄ«t JÅ«su pÄrlÅ«koÅ¡anu droÅ¡Äku, bloÄ·Ä“jot zinÄmos ļaundabÄ«go programmu avotus.
+firstRun_feature_social_description=AutomÄtiski atbrÄ«vot JÅ«su pÄrlÅ«koÅ¡anas procesu no tÄdÄm sociÄlo mediju pogÄm kÄ Facebook Live, kas parÄdÄs interneta lapÄs un izseko JÅ«su darbÄ«bu.
+firstRun_donate=ziedot
+firstRun_donate_label=Atbalstīt mūsu projektu
+firstRun_feature_social=Noņemt sociÄlo mediju pogas
+firstRun_legacySafariWarning=JÅ«s izmantojat novecojuÅ¡u Safari versiju, kuru Adblock Plus neatbalsta. Tas var nedarboties pareizi vai pasliktinÄt lietotÄja pieredzi dažÄs vietnÄ“s. MÄ“s uzstÄjÄ«gi iesakÄm Jums atjauninÄt Safari lÄ«dz 6. vai vÄ“l jaunÄkai versijai (pieejama Mac OS X 10.8 Mountain Lion un augstÄk) jeb lietot Mozilla Firefox, Google Chrome vai Opera jaunÄkÄs versijas.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/global.properties
new file mode 100644
index 0000000..4eb9bdf
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=PaÅ¡reizÄ“jÄ lapÄ nav bloÄ·Ä“jamu vienÄ«bu
+action3_tooltip=Noklikšķiniet, lai aktivizētu/deaktivizētu Adblock Plus.
+notification_antiadblock_title=slēpt mērķtiecīgas ziņas?
+type_label_script=skripts
+filter_elemhide_nocriteria=Elementa paslÄ“pÅ¡anai nav norÄdÄ«ts neviens kritÄ“rijs
+blockingGroup_title=ReklÄmu bloķēšanas noteikumi
+whitelisted_tooltip=PaÅ¡reizÄ“jÄ lapÄ Adblock Plus ir deaktivizÄ“ts.
+type_label_stylesheet=stila lapa
+blocked_count_tooltip=?1? no ?2?
+type_label_font=fonts
+type_label_popup=uzlecošais logs
+filter_regexp_tooltip=Å is filtrs ir vai nu regulÄrÄ izteiksme vai arÄ« pÄrÄk Ä«ss, lai tiktu optimizÄ“ts. PÄrÄk daudz Å¡Ädu filtru var palÄ“ninÄt JÅ«su parlÅ«koÅ¡anu.
+action0_tooltip=Noklikšķiniet, lai parÄdÄ«tu konteksta izvÄ“lni, vidÄ“jais klikšķis, lai aktivizÄ“tu/deaktivizÄ“tu.
+whitelisted_page=PaÅ¡reizÄ“jÄ lapÄ Adblock Plus ir ticis deaktivizÄ“ts.
+remove_group_warning=Vai tieÅ¡Äm vÄ“laties noņemt Å¡o grupu?
+action1_tooltip=Noklikšķiniet, lai atvÄ“rtu aizvÄ“rtu bloÄ·Ä“jamÄs vienÄ«bas, vidÄ“jais klikšķis, lai aktivizÄ“tu/deaktivizÄ“tu.
+type_label_xmlhttprequest=XML pieprasījums
+active_tooltip=Adblock Plus ir aktivizÄ“ts, ?1? filtru abonementi un ?2? pielÄgotie filtri tiek izmantoti.
+type_label_document=dokuments
+type_label_object_subrequest=objekta apakš-pieprasījums
+whitelistGroup_title=Izņēmuma noteikumi
+disabled_tooltip=Adblock Plus ir deaktivizēts.
+filter_elemhide_duplicate_id=Tikai viens paslÄ“pjamÄ elementa ID drÄ«kst tikt norÄdÄ«ts.
+type_label_object=objekts
+action2_tooltip=Noklikšķiniet, lai atvērtu iestatījumus, vidējais klikšķis, lai aktivizētu/deaktivizētu.
+type_label_subdocument=rÄmis
+clearStats_warning=Å Ä« darbÄ«ba atiestatÄ«s visu filtra izmantojumu statistiku un atspÄ“jos tÄs uzskaiti. Vai vÄ“laties turpinÄt?
+notification_antiadblock_message=Å Ä« vietne ir zinÄma, lai parÄdÄ«tu mÄ“rÄ·tiecÄ«gas ziņas Adblock Plus lietotÄjiem. Vai jÅ«s vÄ“laties, Adblock Plus slÄ“pt mÄ“rÄ·tiecÄ«gas ziņas?
+blocked_count_addendum=(arÄ«, baltajÄ sarakstÄ: ?1?, slÄ“pti: ?2?)
+subscription_invalid_location=Filtru saraksta atraÅ¡anÄs vieta nav ne derÄ«gs URL ne arÄ« derÄ«gs faila nosaukums.
+type_label_image=attēls
+remove_subscription_warning=Vai JÅ«s tieÅ¡Äm vÄ“laties noņemt Å¡o abonementu?
+type_label_other=cits
+mobile_menu_enable=ABP: Ieslēgts
+type_label_media=audio/video
+mobile_menu_disable_site=ABP: Atspējotu uz ?1?
+elemhideGroup_title=Elementu paslēpšanas noteikumi
+mobile_menu_enable_site=ABP: Iespējot uz ?1?
+type_label_elemhide=paslēpts
+newGroup_title=Jaunu filtru grupas
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/overlay.dtd
new file mode 100644
index 0000000..030d111
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp; JÄ">
+<!ENTITY notification.button.no "&amp; NÄ“">
+<!ENTITY sync.label "Sinhronizet Adblock Plus uzstÄdÄ«jumus">
+<!ENTITY whitelist.site.label "Atspējot uz ?1?">
+<!ENTITY filters.label "Filtra preferences">
+<!ENTITY disable.label "Atspējot visur">
+<!ENTITY objecttab.title "Bloķēt">
+<!ENTITY objecttab.tooltip "Noklikšķiniet šeit, lai bloķētu šo objektu ar Adblock Plus">
+<!ENTITY menuitem.label "Adblock Plus Iestatījumi">
+<!ENTITY objecttabs.label "RÄdÄ«&amp;t cilnes Flash un Java">
+<!ENTITY sendReport.label "&amp;Ziņot par problÄ“mÄm Å¡ajÄ lapÄ">
+<!ENTITY whitelist.page.label "AtspÄ“jot tikai Å¡ajÄ lapÄ">
+<!ENTITY context.image.label "Adblock Plus: Bloķēt attēlu">
+<!ENTITY counthits.label "Skaitīt filtra izmantojumus">
+<!ENTITY opensidebar.label "AtvÄ“rt bloÄ·Ä“jamÄs vienÄ«bas">
+<!ENTITY notification.button.close "&amp; Aizvērt">
+<!ENTITY contribute.label "Palīdziet Adblock Plus veidošanai, tulkošanai...">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: BloÄ·Ä“t rÄmi">
+<!ENTITY blocked.tooltip "BloÄ·Ä“tÄs vienÄ«bas Å¡ajÄ lapÄ:">
+<!ENTITY hideplaceholders.label "Noslēpt bloķēto elementu vietturus">
+<!ENTITY showinstatusbar.label "RÄdÄ«t stÄvokļa joslÄ">
+<!ENTITY sidebar.title "BloÄ·Ä“jamÄs vienÄ«bas Å¡ajÄ lapÄ">
+<!ENTITY options.label "Iespējas">
+<!ENTITY context.object.label "Adblock Plus: Bloķēt objektu">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: IespÄ“jot Å¡ajÄ lapÄ">
+<!ENTITY filters.tooltip "VisaktÄ«vÄkie filtri:">
+<!ENTITY closesidebar.label "AizvÄ“rt bloÄ·Ä“jamÄs vienÄ«bas">
+<!ENTITY showintoolbar.label "RÄdÄ«t rÄ«kjoslÄ">
+<!ENTITY status.tooltip "Statuss:">
+<!ENTITY context.media.label "Adblock Plus: Bloķēt audio/video">
+<!ENTITY subscription.update.label "AtjauninÄt filtrus">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/sendReport.dtd
new file mode 100644
index 0000000..5881de0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Atsa&amp;ukt">
+<!ENTITY issues.disabledgroups.description "Sekojošie filtru abonementi / filtru grupas ir atslēgti, tomēr tiem ir ietekme uz šo lapu:">
+<!ENTITY showData.label "RÄdÄ«t ziņojuma datus">
+<!ENTITY typeSelector.falsePositive.label "A&amp;dblock Plus bloÄ·Ä“ pÄrÄk daudz">
+<!ENTITY issues.change.description "JÅ«su konfigurÄcija ir izmanÄ«ta. LÅ«dzu pÄrlÄdÄ“jiet lapu, lai pÄrbaudÄ«tu izmaiņas un nosÅ«tÄ«tu ziņojumu, ja izmaiņas nav novÄ“rsuÅ¡as problÄ“mu.">
+<!ENTITY email.label "E-&amp;pasts:">
+<!ENTITY issues.openPreferences.label "Atvērt filtru iestatījumus">
+<!ENTITY sendPage.confirmation "JÅ«su ziņojums ir saglabÄts. JÅ«s tam varat piekļūt sekojoÅ¡ajÄ adresÄ“:">
+<!ENTITY copyLink.label "&amp;Kopēt ziņojuma saiti">
+<!ENTITY issues.nofilters.description "PaÅ¡reizÄ“jÄ lapÄ Adblock Plus neko nebloÄ·Ä“. ProblÄ“ma, ko JÅ«s pieredzat visticamÄk ir nesaistÄ«ta ar Adblock Plus.">
+<!ENTITY sendPage.knownIssue "JÅ«su nosÅ«tÄ«tais problÄ“ma iespÄ“jams jau ir zinÄma. VairÄk informÄcija:">
+<!ENTITY typeSelector.other.description "IzvÄ“laties Å¡o opciju ja JÅ«s nojauÅ¡at problÄ“mu ar paÅ¡u Adblock Plus nevis tÄ filtriem.">
+<!ENTITY issues.disabledgroups.enable.label "Ievadīt filtru abonementu / filtru grupu">
+<!ENTITY typeWarning.override.label "Es saprotu un vienalga vēlos nosūtīt ziņojumu">
+<!ENTITY issues.disabled.enable.label "Iespējot Adblock Plus">
+<!ENTITY update.fixed.description "JÅ«su filtru abonementu atjauninÄjums acÄ«mredzot atrisinÄja problÄ“mu, par kuru ziņojÄt. LÅ«dzu, pÄrlÄdÄ“jiet lapu un mēģiniet vÄ“lreiz. Ziņojiet atkÄrtoti, ja problÄ“ma saglabÄjas.">
+<!ENTITY anonymous.label "Anonīms iesniegums">
+<!ENTITY reloadButton.label "PÄr&amp;lÄdÄ“t lapu">
+<!ENTITY recentReports.clear.label "&amp;Noņemt visus ziņojumus">
+<!ENTITY typeSelector.description "Å is log JÅ«s vedÄ«s cauri nepiecieÅ¡amajiem soļiem, lai nosÅ«tÄ«tu Adblock Plus problÄ“mu ziņojumu. Vispirms, lÅ«dzu izvÄ“lieties tipu problÄ“mai, ko JÅ«s pieredzat Å¡ajÄ lapÄ:">
+<!ENTITY screenshot.remove.label "&amp;Noņemt jÅ«tÄ«gu informÄciju">
+<!ENTITY issues.ownfilters.description "Daži no Å¡ajÄ lapÄ pielietotajiem filtriem ir lietotÄja izveidoti. LÅ«dzu atslÄ“dziet filtrus, kas varÄ“ja izraisÄ«t Å¡o problÄ“mu:">
+<!ENTITY update.inProgress.description "Adblock Plus ir nepiecieÅ¡ams atjauninÄt filtru abonementus, lai pÄrliecinÄtos, vai jau nav atrisinÄts jautÄjums. LÅ«dzu, uzgaidiet...">
+<!ENTITY sendPage.retry.label "Sūtīt vēlreiz">
+<!ENTITY data.label "&amp;Ziņojuma dati:">
+<!ENTITY recentReports.label "Jūsu nesen nosūtītie ziņojumi">
+<!ENTITY typeWarning.description "JÅ«s norÄdÄ«jÄt, ka vÄ“laties ziņot par vispÄrÄ“ju Adblock Plus problÄ“mu nevis problÄ“mu ar filtriem. Par Å¡ÄdÄm problÄ“mÄm vislabÄk ir paziņot [link]Adblock Plus forumÄ[/link]. Å o problÄ“mu ziņotÄju vajadzÄ“tu izmantot tikai lai papildinÄtu esoÅ¡u diskusiju, jo neviens neredzÄ“s JÅ«su ziņojumu, ja JÅ«s nenodroÅ¡inÄs viņus ar saiti uz to. AutomÄtiski Ä£enerÄ“tÄ saite tiks nodroÅ¡inÄta pÄ“c ziņojuma nosÅ«tīšanas.">
+<!ENTITY issues.disabled.description "Adblock Plus ir atspÄ“jots, paÅ¡reizÄ“jÄ stÄvoklÄ« tas nebloÄ·Ä“s neko.">
+<!ENTITY attachExtensions.label "Pievienot ziņojumam sarakstu ar aktÄ«viem papil&amp;dinÄjumiem, gadÄ«jumÄ, ja kÄds papildinÄjums izraisa problÄ“mu">
+<!ENTITY issues.nosubscriptions.add.label "Pievienot filtru abonementu">
+<!ENTITY issues.disabledfilters.enable.label "Iespējot filtru">
+<!ENTITY issues.override.label "&amp;KonfigurÄcija ir pareiza, varat turpinÄt ziņojumu">
+<!ENTITY issues.nosubscriptions.description "IzskatÄs, ka JÅ«s neabonÄ“jat nevienu no gatavajiem sarakstiem, kuri automÄtiski noņem nevajadzÄ«go saturu no mÄjas lapÄm.">
+<!ENTITY typeSelector.falsePositive.description "IzvÄ“laties Å¡o opciju, ja lai trÅ«kst svarÄ«ga saturam tÄ tiek nepareizi attÄ“lota vai nefunkcionÄ“ pareizi. JÅ«s varat noteikt vai to izraisa Adblock Plus, to Ä«slaicÄ«gi atslÄ“dzot.">
+<!ENTITY typeSelector.other.label "&amp;Cita problēma">
+<!ENTITY emailComment.label "MÄ“s aicinÄm JÅ«s ievadÄ«t derÄ«gu e-pasta adresi, lai mÄ“s varÄ“tu ar Jums kontaktÄ“ties, ja radÄ«sies papildus jautÄjumi par JÅ«su ziņojumu. TÄ palÄ«dzÄ“s mums arÄ« atpazÄ«t JÅ«su ieguldÄ«jumu un piešķirt tam augstÄku prioritÄti.">
+<!ENTITY issues.whitelist.remove.label "IespÄ“jot Adblock Plus Å¡ajÄ lapÄ">
+<!ENTITY outdatedSubscriptions.description "SekojoÅ¡ie filtru abonementi nav atjauninÄti vismaz divas nedēļas. LÅ«dzu, atjauniniet Å¡os abonementus pirms ziņojuma apstiprinÄÅ¡anas, jo problÄ“ma jau var bÅ«t atrisinÄta.">
+<!ENTITY dataCollector.description "Uzgaidiet pÄris mirkļus, kamÄ“r Adblock Plus apkopo nepiecieÅ¡amos datus.">
+<!ENTITY sendButton.label "&amp;Sūtīt ziņojumu">
+<!ENTITY comment.label "&amp;KomentÄrs (nav obligÄti):">
+<!ENTITY sendPage.errorMessage "MēģinÄjums sÅ«tÄ«t ziņojumu neizdevÄs. Kļūdas kods &quot;?1?&quot;. LÅ«dzu pÄrliecinieties, ka Jums ir savienojums ar internetu un mēģiniet vÄ“lreiz. Ja problÄ“ma atkÄrtojas, lÅ«dzu prasiet palÄ«dzÄ«bu [link]Adblock Plus forumÄ[/link].">
+<!ENTITY showRecentReports.label "ParÄdÄ«t nesen nosÅ«tÄ«tos ziņojumus">
+<!ENTITY commentPage.heading "Pievienojiet komentÄru">
+<!ENTITY update.start.label "Tagad sÄktu atjauninÄÅ¡anu">
+<!ENTITY issues.disabledfilters.description "Sekojošie filtri ir atslēgt, tomēr tiem var būt ietekme uz šo lapu:">
+<!ENTITY screenshot.description "TÄ pati lapa var izskatÄ«ties atšķirÄ«gi dažÄdiem cilvÄ“kiem. Ja JÅ«s pievienosiet ekrÄn-Å¡Äviņu, tas mums palÄ«dzÄ“s izprast problÄ“mu. JÅ«s varat noņemt apgabalus, kas satur jÅ«tÄ«gu informÄciju kÄ arÄ« iezÄ«mÄ“t vietas, kur ir redzama problÄ“ma. Lai to izdarÄ«tu, noklikšķiniet uz atbilstoÅ¡Äs pogas un izvÄ“lieties apgabalu ar peli.">
+<!ENTITY screenshot.attach.label "&amp;Pievienot ziņojumam lapas attēlu">
+<!ENTITY issues.whitelist.description "Adblock Plus paÅ¡reiz ir atslÄ“gt lapÄ par kuru JÅ«s ziņojat. Lai palÄ«dzÄ“tu problÄ“mas izmeklēšanÄ, pirms ziņojuma sÅ«tīšanas lÅ«dzu ieslÄ“dziet to un atsvaidziniet lapu.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus nebloÄ·Ä“ &amp;reklÄmu">
+<!ENTITY typeSelector.heading "Izvēlieties problēmas tipu">
+<!ENTITY anonymity.warning "MÄ“s nevarÄ“sim ar Jums sazinÄties un visdrÄ«zÄk piešķirsim JÅ«su ziņojumam zemÄku prioritÄti.">
+<!ENTITY wizard.title "ProblÄ“mu ziņotÄjs">
+<!ENTITY issues.ownfilters.disable.label "Atspējot filtru">
+<!ENTITY commentPage.description "Teksta laukums ļauj Jums ierakstÄ«t komentÄru, lai palÄ«dzÄ“tu mums saprast problÄ“mu. Å is solis nav obligÄts, bet ir rekomendÄ“ts, ja problÄ“ma nav acÄ«mredzama. JÅ«s arÄ« varat pÄrskatÄ«t ziņojuma datus, pirms nosÅ«tīšanas.">
+<!ENTITY comment.lengthWarning "JÅ«su komentÄra garums pÄrsniedz 1000 simbolus. Tikai pirmie 1000 simboli tiks nosÅ«tÄ«ti.">
+<!ENTITY typeSelector.falseNegative.description "IzvÄ“laties Å¡o opciju ja reklÄma tiek attÄ“lota neskatoties uz to ka Adblock Plus ir ieslÄ“gts.">
+<!ENTITY sendPage.waitMessage "Lūdzu uzgaidiet kamēr Adblock Plus sūta Jūsu ziņojumu.">
+<!ENTITY dataCollector.heading "Laipni lÅ«dzu problÄ“mu ziņotÄjÄ">
+<!ENTITY screenshot.heading "Pievienojiet ekrÄn-Å¡Äviņu">
+<!ENTITY sendPage.heading "Sūtīt ziņojumu">
+<!ENTITY issues.subscriptionCount.description "IzskatÄs, ka JÅ«s abonÄ“jat pÄrÄk daudz abonementu. Å Äda konfigurÄcija netiek rekomendÄ“ta, jo tas palielina problÄ“mu iespÄ“jamÄ«bu. MÄ“s nespÄ“jam pieņemt ziņojumu, jo nav skaidrs kuram filtru abonementam ir jÄrÄ«kojas. LÅ«dzu noņemiet visu izņemot tieÅ¡Äm nepiecieÅ¡amos abonementus un pÄrbaudiet vai problÄ“ma joprojÄm pastÄv.">
+<!ENTITY screenshot.mark.label "Ie&amp;zīmēt problēmu">
+<!ENTITY privacyPolicy.label "PrivÄtuma politika">
+<!ENTITY issues.description "Adblock Plus ir atradis problÄ“mu JÅ«su konfigurÄcijÄ, kas varÄ“tu bÅ«t atbildÄ«ga par Å¡o problÄ“mu vai arÄ« apgrÅ«tinÄs ziņojuma izmeklēšanu.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/sidebar.dtd
new file mode 100644
index 0000000..97a127a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Flash vienības malas">
+<!ENTITY address.label "Adrese">
+<!ENTITY context.open.label "AtvÄ“rt jaunÄ cilnÄ“">
+<!ENTITY type.label "Tips">
+<!ENTITY tooltip.filterSource.label "Filtra avots:">
+<!ENTITY noitems.label "Nav bloķējamu vienību">
+<!ENTITY filter.label "Filtrs">
+<!ENTITY tooltip.size.label "Izmērs:">
+<!ENTITY reattach.label "Pievienot atpakaļ">
+<!ENTITY search.label "&amp;Meklēt:">
+<!ENTITY docDomain.thirdParty "(treÅ¡Ä puse)">
+<!ENTITY filterSource.label "Filtra avots">
+<!ENTITY tooltip.docDomain.label "Dokumenta avots:">
+<!ENTITY context.copy.label "Kopēt vienības adresi">
+<!ENTITY tooltip.type.label "Tips:">
+<!ENTITY context.disablefilter.label "Atspējot filtru ?1?">
+<!ENTITY context.copyFilter.label "Kopēt filtru">
+<!ENTITY context.block.label "Bloķēt šo vienību">
+<!ENTITY context.enablefilter.label "Iespējot filtru ?1?">
+<!ENTITY detach.label "Atdalīt">
+<!ENTITY whitelisted.label "Lapa ir baltajÄ sarakstÄ">
+<!ENTITY context.disablefilteronsite.label "Atspējot šo filtru ?1?">
+<!ENTITY detached.title "Adblock Plus: BloÄ·Ä“jamÄs vienÄ«bas (atdalÄ«ts)">
+<!ENTITY docDomain.firstParty "(pirmÄ puse)">
+<!ENTITY tooltip.type.whitelisted "(baltajÄ sarakstÄ)">
+<!ENTITY tooltip.filter.label "Aktīvais filtrs:">
+<!ENTITY tooltip.filter.disabled "(atspējots)">
+<!ENTITY context.editfilter.label "Rediģēt aktīvo filtru">
+<!ENTITY tooltip.type.blocked "(bloķēts)">
+<!ENTITY size.label "Izmērs">
+<!ENTITY context.whitelist.label "Pievienot izņēmuma noteikumu šai vienībai">
+<!ENTITY context.selectAll.label "Iezīmēt visu">
+<!ENTITY state.label "StÄvoklis">
+<!ENTITY docDomain.label "Dokumenta avots">
+<!ENTITY tooltip.address.label "Adrese:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/subscriptionSelection.dtd
new file mode 100644
index 0000000..dca19de
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Pievienot arī filtra abonementu &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plus neizdevÄs ielÄdÄ“t abonentu sarakstu.">
+<!ENTITY list.download.retry "Mēģiniet vēlreiz">
+<!ENTITY title.label "Abonemen&amp;ta nosaukums:">
+<!ENTITY list.download.website "Skatīt tīmekļa vietni">
+<!ENTITY supplementMessage "Å Ä« filtra abonements ir paredzÄ“ts lietoÅ¡anai kopÄ ar filtra abonementu &quot;?1?&quot; kuru jÅ«s vÄ“l neizmantojat.">
+<!ENTITY viewList.label "Skatīt filtrus">
+<!ENTITY visitHomepage.label "ApmeklÄ“t mÄjaslapu">
+<!ENTITY addSubscription.label "Pievienot abonementu">
+<!ENTITY dialog.title "Pievienot Adblock Plus filtra abonementu">
+<!ENTITY location.label "Fi&amp;ltru saraksta atraÅ¡anÄs vieta:">
+<!ENTITY fromWeb.description "LÅ«dzu, apstipriniet, ka vÄ“laties pievienot šī filtra abonementu. JÅ«s varat mainÄ«t abonementa nosaukumu vai atraÅ¡anÄs vietu pirms pievienoÅ¡anas.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/composer.dtd
new file mode 100644
index 0000000..5b2264c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "p&amp;ada akhir alamat">
+<!ENTITY domainRestriction.label "Terhad pada domain: (&amp;s)">
+<!ENTITY collapse.default.no.label "Gunakan default (tidak)">
+<!ENTITY firstParty.label "Pihak per&amp;tama sahaja">
+<!ENTITY preferences.label "Papar penapi&amp;s sedia ada...">
+<!ENTITY pattern.label "Lihat pola">
+<!ENTITY thirdParty.label "Pihak keti&amp;ga sahaja">
+<!ENTITY filter.label "Penapis &amp;baru:">
+<!ENTITY collapse.label "&amp;Jatuhkan yang disekat:">
+<!ENTITY match.warning "Pola yang anda masukkan tidak lagi memadani alamat yang akan disekat/dikecualikan dan tidak akan berkesan kepadanya.">
+<!ENTITY anchor.start.label "pada per&amp;mulaan alamat">
+<!ENTITY matchCase.label "&amp;Kes sepadan">
+<!ENTITY custom.pattern.label "&amp;Ubah suai:">
+<!ENTITY unselectAllTypes.label "Tidak pilih">
+<!ENTITY type.whitelist.label "Peraturan penge&amp;cualian">
+<!ENTITY regexp.warning "Pola yang anda masukkan akan diinterpretasi sebagai ungkapan biasa di mana ia boleh melambatkan penjelajahan web. Jika anda tidak berniat untuk menggunakan ungkapan biasa, tambah simbol (*) diakhir pola.">
+<!ENTITY dialog.title "Tambah peraturan penapis Adblock Plus">
+<!ENTITY basic.label "Paparan biasa">
+<!ENTITY type.filter.label "&amp;Penapis penyekat">
+<!ENTITY types.label "Gunakan pada jenis:">
+<!ENTITY shortpattern.warning "Pola yang anda masukkan terlalu pendek untuk dioptimumkan dan kemungkinan boleh melambatkan penjelajahan web. Anda digalakkan memilih masukan yang lebih panjang untuk penapis ini supaya Adbolck Plus dapat memproses penapis ini dengan lebih berkesan.">
+<!ENTITY collapse.yes.label "Ya">
+<!ENTITY anchors.label "Terima pola sahaja:">
+<!ENTITY collapse.default.yes.label "Gunakan default (ya)">
+<!ENTITY domainRestriction.help "Gunakan pilihan ini untuk tentukan satu atau lebih domain secara berasingan dengan simbol &quot;|&quot;. Penapis hanya akan digunakan pada domain terpilih sahaja. Simbol &quot;~&quot; sebelum domain bermaksud penapis tidak akan digunakan pada domain tersebut.">
+<!ENTITY accept.label "Tambah penapis">
+<!ENTITY options.label "Pilihan">
+<!ENTITY disabled.warning "Adblock Plus telah dinyahaktifkan. Anda masih boleh menambah penapis tetapi ia tidak akan aktif sehingga anda [link]aktifkan Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "pada per&amp;mulaan nama domain">
+<!ENTITY collapse.no.label "Tidak">
+<!ENTITY selectAllTypes.label "Pilih semua">
+<!ENTITY advanced.label "Paparan mahir">
+<!ENTITY pattern.explanation "Pola boleh jadi mana-mana bahagian alamat; simbol (*) bertujuan sebagai wildcards. Penapis hanya digunakan pada alamat yang sepadan dengan pola.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/filters.dtd
new file mode 100644
index 0000000..9d3541d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/filters.dtd
@@ -0,0 +1,73 @@
+<!ENTITY restore.custom.warning "Semua penapis khas anda akan digantikan dengan kandungan fail yang dipilih. Adakah anda pasti?">
+<!ENTITY slow.column "&amp;Lambatkan penapis">
+<!ENTITY enabled.column "&amp;Diaktifkan">
+<!ENTITY subscription.lastDownload.checksumMismatch "Gagal, checksum tidak sepadan">
+<!ENTITY noFiltersInGroup.text "Kumpulan yang dipilih adalah kosong.">
+<!ENTITY subscription.actions.label "Aksi-aksi">
+<!ENTITY filter.selectAll.label "Pilih Semua">
+<!ENTITY backupButton.label "Backup dan Re&amp;store">
+<!ENTITY restore.minVersion.warning "Amaran: fail ini dibuat menggunakan versi Adblock Plus terbaru. Anda harus mendapatkan versi Adblock Plus terbaru sebelum anda restore dari fail ini.">
+<!ENTITY restore.error "Data fail tidak dapat diprosese, mungkin ini bukan fail backup Adblock Plus?">
+<!ENTITY sort.ascending.label "Susun&amp;an A &gt; Z">
+<!ENTITY sort.label "Susun &amp;dengan">
+<!ENTITY subscription.source.label "Senarai penapis">
+<!ENTITY hitcount.column "&amp;Hit">
+<!ENTITY noFilters.text "Anda tiada penapis khas.">
+<!ENTITY backup.custom.title "Penapis khas sahaja">
+<!ENTITY subscription.external.label "Dikemaskini oleh extension lain">
+<!ENTITY subscription.delete.label "Buang">
+<!ENTITY noGroupSelected.text "Anda perlu memilih satu kumpulan penapis sebelum penapisnya dapat dipaparkan.">
+<!ENTITY filter.cut.label "Potong">
+<!ENTITY restore.default.label "Restore backup dari ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Memuat-turun...">
+<!ENTITY subscriptions.tab.label "Langganan penapis">
+<!ENTITY sort.descending.label "Susunan &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Adakah anda pasti mahu membuang semua penapis yang dipilih?">
+<!ENTITY filter.delete.label "Padam">
+<!ENTITY addSubscriptionAdd.label "Tambah">
+<!ENTITY viewMenu.label "Papar">
+<!ENTITY subscription.lastDownload.unknown "tiada maklumat">
+<!ENTITY addSubscriptionCancel.label "Batal">
+<!ENTITY subscription.enabled.label "Diaktifkan">
+<!ENTITY noSubscriptions.text "Anda belum menambah langganan penapis. Adblock Plus tidak akan menapis
+ apa-apa tanpa penapis, sila guna &quot;Tambah langganan penapis&quot; untuk menambah.">
+<!ENTITY subscription.update.label "Kemaskini penapis">
+<!ENTITY dialog.title "Pilihan Penapis Adblock Plus">
+<!ENTITY addFilter.label "&amp;Tambah penapis">
+<!ENTITY subscription.minVersion.warning "Langganan penapis ini memerlukan versi Adblock Plus terbaru, anda perlu mendapatkan versi Adblock Plus terbaru.">
+<!ENTITY subscription.lastDownload.invalidURL "Gagal, bukan alamat yang sah">
+<!ENTITY backup.error "Terdapat ralat semasa menulis penapis pada fail. Sila pastikan fail tidak write protected atau digunakan oleh aplikasi lain.">
+<!ENTITY filter.moveUp.label "Pindah atas">
+<!ENTITY addGroup.label "Tambah &amp;kumpulan penapis">
+<!ENTITY filter.edit.label "Ubahsuai">
+<!ENTITY subscription.showHideFilters.label "Tunjuk/sembunyi penapis">
+<!ENTITY acceptableAds2.label "Benarkan iklan yan&amp;g tidak mengganggu">
+<!ENTITY addSubscriptionOther.label "Tambah langganan lain">
+<!ENTITY close.label "Tutup">
+<!ENTITY sort.none.label "&amp;Tidak disusun">
+<!ENTITY filter.actions.label "Aksi penapis">
+<!ENTITY filter.copy.label "Salin">
+<!ENTITY filter.moveDown.label "Pindah bawah">
+<!ENTITY filter.resetHitCounts.label "Reset statistik">
+<!ENTITY readMore.label "Baca lebih">
+<!ENTITY subscription.moveUp.label "Pindah ke atas">
+<!ENTITY addSubscription.label "Tambah &amp;langganan penapis">
+<!ENTITY subscription.homepage.label "Laman rumah">
+<!ENTITY backup.complete.title "Semua penapis dan langganan">
+<!ENTITY restore.own.label "Restore backup sendiri">
+<!ENTITY restore.complete.warning "Semua pilihan penapis anda akan digantikan dengan kandungan fail yang dipilih. Adakah anda pasti?">
+<!ENTITY filters.tab.label "Penapis khas">
+<!ENTITY backup.label "Buat backup baru">
+<!ENTITY find.label "&amp;Cari">
+<!ENTITY subscription.moveDown.label "Pindah ke bawah">
+<!ENTITY subscription.lastDownload.connectionError "Gagal, kegagalan memuat-turun">
+<!ENTITY subscription.lastDownload.success "Berjaya">
+<!ENTITY subscription.lastDownload.invalidData "Gagal, bukan senarai penapis yang sah">
+<!ENTITY filter.paste.label "Tampal">
+<!ENTITY subscription.disabledFilters.enable "Aktifkan penapis yang telah dinyaktifkan.">
+<!ENTITY lasthit.column "Hit t&amp;erakhir">
+<!ENTITY subscription.editTitle.label "Ubahsuai tajuk">
+<!ENTITY subscription.disabledFilters.warning "Sesetengah penapis dalam langganan ini telah dinyahaktifkan.">
+<!ENTITY filter.column "Pe&amp;raturan penapis">
+<!ENTITY subscription.lastDownload.label "Muat-turun terakhir:">
+<!ENTITY viewList.label "Lihat senarai">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/firstRun.properties
new file mode 100644
index 0000000..d119e0b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Lihat secara peribadi dengan menyahdayakan pengesanan - menyembunyikan trek anda dari syarikat-syarikat iklan yang akan menjejaki setiap langkah anda.
+firstRun_toggle_off=TUTUP
+firstRun_feature_tracking=Menyahdayakan pengesanan
+firstRun_feature_malware=Menyekat perisian berniat jahat
+firstRun_title=Adblock Plus telah dipasang
+firstRun_acceptableAdsExplanation=Kami ingin menggalakkan Laman web untuk menggunakan pengiklanan terus-terang, tidak mengganggu. Itulah sebabnya mengapa kita telah menetapkan <a>garis panduan yang ketat</a> untuk mengenalpasti iklan yang boleh diterima, yang ditunjukkan di bawah seting lalai. Jika anda masih mahu menyekat iklan setiap anda boleh <a>menyahdayakan</a> ini dalam beberapa saat.
+firstRun_toggle_on=Pada
+firstRun_contributor_credits=Kredit sebagai penyumbang
+firstRun_dataCorruptionWarning=Adakah laman ini muncul tidak terhenti-henti? <a>Klik di sini!</a>
+firstRun_acceptableAdsHeadline=Annoying iklan akan kini menjadi disekat
+firstRun_share=Beritahu rakan-rakan anda
+firstRun_share_headline=<a>Berikan tangan</a> dalam membuat laman web yang lebih baik
+firstRun_features=Adblock Plus boleh melakukan lebih daripada iklan yang menghalang
+firstRun_feature_malware_description=Membuat pelayaran anda lebih selamat dengan menyekat domain dikenali perisian berniat jahat.
+firstRun_feature_social_description=Secara automatik membuang pengalaman menyemak lalu anda daripada butang media sosial, seperti Facebook Like, yang muncul di laman web dan mengesan tingkah laku anda.
+firstRun_donate=mendermakan
+firstRun_donate_label=Menyokong projek kami
+firstRun_feature_social=Mengalih keluar butang Media sosial
+firstRun_legacySafariWarning=Anda menggunakan versi lama Safari yang tidak disokong oleh Adblock Plus. Ia mungkin tidak berfungsi dengan betul atau menjejaskan pengalaman pengguna di sesetengah tapak web. Kami amat mengesyorkan sama ada mengemaskini Safari 6 atau lebih tinggi (yang tersedia untuk Mac OS X 10.8 Mountain Lion) dan lebih tinggi(OS X 10.9 Mavericks), atau untuk menggunakan versi terkini pelayar Mozilla Firefox, Google Chrome atau Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/global.properties
new file mode 100644
index 0000000..54428fe
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Tiada item yang boleh disekat pada laman semasa
+action3_tooltip=Klik untuk aktifkan/nyahaktifkan Adblock Plus.
+notification_antiadblock_title=Sembunyi Mesej-mesej yang disasarkan?
+type_label_script=skrip
+filter_elemhide_nocriteria=Tiada kriteria yang dinyatakan untuk mengenal pasti elemen untuk disembunyikan
+blockingGroup_title=Peraturan Penapisan Iklan
+whitelisted_tooltip=Adblock Plus dinyahaktifkan pada laman semasa.
+type_label_stylesheet=lembaran stail
+blocked_count_tooltip=?1? daripada ?2?
+type_label_font=font
+type_label_popup=tetingkap pop-up
+filter_regexp_tooltip=Penapis ini hanya ungkapan biasa atau terlalu pendek untuk dioptimumkan. Terlalu banyak penapis mungkin akan melambatkan penjelajahan web.
+action0_tooltip=Klik untuk mengeluarkan menu konteks, klik tengah untuk aktifkan/nyahaktifkan.
+whitelisted_page=Adblock Plus telah dinyahaktifkan untuk laman semasa
+remove_group_warning=Adakah anda pasti mahu membuang kumpulan ini?
+action1_tooltip=Klik untuk membuka/menutup item yang boleh disekat, klik tengah untuk aktifkan/nyahaktifkan.
+type_label_xmlhttprequest=permintaan XML
+active_tooltip=Adblock Plus telah diaktifkan, ?1? langganan penapis dan ?2? penapis sendiri digunakan.
+type_label_document=dokumen
+type_label_object_subrequest=subpermintaan objek
+whitelistGroup_title=Peraturan Pengecualian
+disabled_tooltip=Adblock Plus telah dinyahaktifkan.
+filter_elemhide_duplicate_id=Hanya satu ID elemen untuk disembunyikan boleh dinyatakan
+type_label_object=objek
+action2_tooltip=Klik untuk buka tatarajah, klik tengah untuk aktifkan/nyahaktifkan.
+type_label_subdocument=bingkai
+clearStats_warning=Ini akan mengreset semua statistik dan menyahaktifkan kiraan penapis. Teruskan?
+notification_antiadblock_message=Laman web ini telah dikenali untuk menunjukkan mesej yang disasarkan kepada pengguna Adblock Plus. Adakah anda mahu Adblock Plus untuk menyembunyikan mesej yang disasarkan?
+blocked_count_addendum=(juga dikecualikan: ?1?, disembunyikan: ?2?
+subscription_invalid_location=Lokasi senarai penapis sama ada URL atau nama fail adalah tidak sah.
+type_label_image=imej
+remove_subscription_warning=Adakah anda mahu membuang langganan ini?
+type_label_other=lain
+mobile_menu_enable=ABP:Aktifkan
+type_label_media=audio/video
+mobile_menu_disable_site=ABP:Nyahaktifkan untuk ?1?
+elemhideGroup_title=Peraturan Penyembunyian Elemen
+mobile_menu_enable_site=ABP:Nyahaktifkan untuk ?1?
+type_label_elemhide=disembunyikan
+newGroup_title=Kumpulan penapis baru
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/overlay.dtd
new file mode 100644
index 0000000..5fc0085
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Ya">
+<!ENTITY notification.button.no "&amp;Tiada">
+<!ENTITY sync.label "Syn&amp;c tatacara Adblock Plus">
+<!ENTITY whitelist.site.label "Nyahaktifkan pada ?1?">
+<!ENTITY filters.label "&amp;Tatarajah penapis">
+<!ENTITY disable.label "Nyahaktif di semua tempat">
+<!ENTITY objecttab.title "Sekat">
+<!ENTITY objecttab.tooltip "Klik di sini untuk menyekat objek ini dengan Adblock Plus">
+<!ENTITY menuitem.label "&amp;Pilihan Adblock Plus">
+<!ENTITY objecttabs.label "Paparkan &amp;tab pada Flash dan Java">
+<!ENTITY sendReport.label "&amp;Lapor isu pada laman ini">
+<!ENTITY whitelist.page.label "Nyahaktifkan pada laman ini sahaja">
+<!ENTITY context.image.label "Adblock Plus: Sekat imej">
+<!ENTITY counthits.label "&amp;Kira kiraan penapis">
+<!ENTITY opensidebar.label "Buka &amp;item yang boleh disekat">
+<!ENTITY notification.button.close "&amp;Tutup">
+<!ENTITY contribute.label "Sumbang kepada Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Sekat bingkai">
+<!ENTITY blocked.tooltip "Item yang disekat pada laman ini:">
+<!ENTITY hideplaceholders.label "Sembun&amp;yikan placeholders elemen tersembunyi">
+<!ENTITY showinstatusbar.label "Papar&amp;kan di bar status">
+<!ENTITY sidebar.title "Item yang boleh disekat pada laman semasa">
+<!ENTITY options.label "Piliha&amp;n">
+<!ENTITY context.object.label "Adblock Plus: Sekat objek">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Aktifkan semula pada laman ini">
+<!ENTITY filters.tooltip "Penapis yang paling aktif:">
+<!ENTITY closesidebar.label "Tutup &amp;item yang boleh disekat">
+<!ENTITY showintoolbar.label "Papa&amp;rkan di bar alatan">
+<!ENTITY status.tooltip "Keadaan:">
+<!ENTITY context.media.label "Adblock Plus: Sekat audio/video">
+<!ENTITY subscription.update.label "Kemaskini penapis">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/sendReport.dtd
new file mode 100644
index 0000000..ae861c6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Undur (&amp;K)">
+<!ENTITY issues.disabledgroups.description "Langganan penapis/kumpulan penapis berikut telah dinyahaktifkan, tetapi ia mungkin masih membawa kesan pada laman ini:">
+<!ENTITY showData.label "Tunjuk data laporan">
+<!ENTITY typeSelector.falsePositive.label "Terlalu &amp;banyak disekat Adblock Plus">
+<!ENTITY issues.change.description "Konfigurasi anda telah diubah. Sila reload laman tersebut untuk menguji perubahan yang dilakukan dan hantar laporan jika isu tersebut masih tidak diselesaikan oleh perubahan yang dilakukan.">
+<!ENTITY email.label "&amp;E-mel:">
+<!ENTITY issues.openPreferences.label "Buka tatarajah penapis">
+<!ENTITY sendPage.confirmation "Laporan anda telah disimpan. Anda boleh mengaksesnya di alamat berikut:">
+<!ENTITY copyLink.label "&amp;Salin pautan laporan">
+<!ENTITY issues.nofilters.description "Adblock Plus tidak menyekat apa-apa pada laman semasa. Isu yang diperhatikan ini kemungkinan besar tidak berkaitan dengan Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Isu yang dilaporkan kemungkinan telah dikenalpasti. Maklumat lanjut:">
+<!ENTITY typeSelector.other.description "Pilih pilihan ini jika anda mencurigai isu pada Adblock Plus sendiri dan bukan disebabkan langganan.">
+<!ENTITY issues.disabledgroups.enable.label "Aktifkan langganan penapis/kumpula penapis">
+<!ENTITY typeWarning.override.label "Saya &amp;faham dan ingin menghantar laporan juga">
+<!ENTITY issues.disabled.enable.label "Aktifkan Adblock Plus">
+<!ENTITY update.fixed.description "Langganan anda yang dikemaskini kemungkinan besar telahpun menyelesaikan masalah yang anda laporkan. Sila reload halaman tersebut dan cuba sekali lagi. Laporkan sekali lagi jika masalah tetap ada.">
+<!ENTITY anonymous.label "Penyerahan &amp;tanpa nama">
+<!ENTITY reloadButton.label "Reload laman (&amp;t)">
+<!ENTITY recentReports.clear.label "&amp;Padam semua laporan">
+<!ENTITY typeSelector.description "Tingkap ini akan membimbing anda dengan langkah-langkah yang diperlukan untuk mengemukakan laporan isu Adblock Plus. Pertama sekali, sila pilih jenis isu yang dialami pada laman ini:">
+<!ENTITY screenshot.remove.label "Pa&amp;dam data sensitif">
+<!ENTITY issues.ownfilters.description "Sebahagian penapis yang digunakan pada laman ini ditentukan pengguna. Sila nyahaktifkan penapis tersebut yang mungkin menyebabkan isu itu.">
+<!ENTITY update.inProgress.description "Adblock Plus perlu mengemaskini langganan penapis anda untuk memastikan isu tersebut belum diselesaikan. Sila tunggu&quot;...&quot;">
+<!ENTITY sendPage.retry.label "Hantar sekali lagi">
+<!ENTITY data.label "&amp;Lapor data">
+<!ENTITY recentReports.label "Laporan yang dihantar baru-baru ini oleh saya">
+<!ENTITY typeWarning.description "Anda didapati ingin melaporkan isu berkaitan Adblock Plus dan bukan masalah dengan penapis. Sila ambil perhatian bahawa isu sebegini paling bagus dilaporkan di [link]Adblock Plus[/link]. Anda patut hanya menggunakan pelapor isu untuk menambah info pada perbincangan yang sedia ada, kerana tiada siapa akan perasan laporan itu kecuali anda membekalkan mereka dengan pautannya. Pautan yang dihasilkan secara automatik akan dibekalkan selepas laporan dihantar.">
+<!ENTITY issues.disabled.description "Adblock Plus telah dinyahaktifkan, ia tidak akan menyekat apa-apa.">
+<!ENTITY attachExtensions.label "Lampirkan senarai e&amp;xtension aktif pada laporan untuk menentukan samada masalah disebabkan konflik add-on">
+<!ENTITY issues.nosubscriptions.add.label "Tambah langganan penapis">
+<!ENTITY issues.disabledfilters.enable.label "Aktifkan penapis">
+<!ENTITY issues.override.label "&amp;Konfigurasi adalah betul, sila teruskan dengan laporan">
+<!ENTITY issues.nosubscriptions.description "Anda didapati tidak melanggan mana-mana penapis yang direka khas untuk membuang isi yang tidak diperlukan pada laman web secara automatik.">
+<!ENTITY typeSelector.falsePositive.description "Pilih pilihan ini jika laman tersebut kekurangan isi penting, salah paparannya atau gagal berfungsi dengan betul. Anda boleh menentukan sama ada Adblock Plus ialah penyebab masalah tersebut dengan menyahaktifkannya buat sementara waktu.">
+<!ENTITY typeSelector.other.label "&amp;Isu lain">
+<!ENTITY emailComment.label "Kami menggalakkan anda memasukkan alamat email yang sah supaya kami boleh menghubungi anda jika ada pertanyaan tentang laporan anda. Ia juga akan membolehkan kita untuk mengiktiraf sumbangan anda dan memberi keutamaan kepada mereka dengan lebih tinggi.">
+<!ENTITY issues.whitelist.remove.label "Aktifkan kembali Adblock Plus pada laman ini">
+<!ENTITY outdatedSubscriptions.description "Langganan penapis yang disenaraikan belum dikemaskini sekurang-kurangnya 2 minggu. Sila kemaskini langganan tersebut sebelum menghantar laporan, isu tersebut mungkin telahpun diselesaikan.">
+<!ENTITY dataCollector.description "Sila tunggu sebentar sementara Adblock Plus mengumpul data yang diperlukan.">
+<!ENTITY sendButton.label "&amp;Hantar laporan">
+<!ENTITY comment.label "K&amp;omen(optional)">
+<!ENTITY sendPage.errorMessage "Cubaan untuk menghantar laporan gagal dengan kod error &quot;?1?&quot;. Sila pastikan internet anda berfungsi dan cuba lagi. Jika masalah berterusan sila minta bantuan di [link]Adblock Plus forum[/link].">
+<!ENTITY showRecentReports.label "Paparkan laporan yang dihantar baru-baru ini">
+<!ENTITY commentPage.heading "Masukkan komen">
+<!ENTITY update.start.label "Mulakan kemaskini sekarang">
+<!ENTITY issues.disabledfilters.description "Penapis berikut telah dinyahaktifkan, tetapi ia mungkin masih membawa kesan pada laman ini:">
+<!ENTITY screenshot.description "Laman yang sama mungkin kelihatan berbeza untuk individu yang berbeza. Ia mungkin membantu kami memahami masalahnya jika screenshot dilampirkan bersama laporan anda. Anda boleh memadam bahagian-bahagian yang mengandungi info sensitif di samping menanda bahagian-bahagian di mana masalah itu jelas kelihatan. Untuk berbuat demikian klik butang berkaitan dan pilih sebahagian imej dengan tetikus anda.">
+<!ENTITY screenshot.attach.label "La&amp;mpir imej laman pada laporan">
+<!ENTITY issues.whitelist.description "Adblock Plus telah dinyahaktifkan pada laman yang anda ingin laporkan. Sila aktifkannya kembali dan reload laman tersebut sebelum menghantar laporan.">
+<!ENTITY typeSelector.falseNegative.label "Adbloc&amp;k Plus tidak menyekat iklan">
+<!ENTITY typeSelector.heading "Pilih jenis isu">
+<!ENTITY anonymity.warning "Kita tidak akan dapat kembali kepada anda dan mungkin akan mengutamakan laporan yang lebih rendah.">
+<!ENTITY wizard.title "Pelapor isu">
+<!ENTITY issues.ownfilters.disable.label "Nyahaktifkan penapis">
+<!ENTITY commentPage.description "Bahagian di bawah membenarkan anda memasukkan komen untuk membantu kami memahami isu tersebut. Langkah ini adalah optional tetapi disyorkan jika masalah tersebut tidak jelas. Anda juga boleh memeriksa data laporan sebelum menghantarnya.">
+<!ENTITY comment.lengthWarning "Panjang komen anda melebihi 1000 huruf. Hanya 1000 huruf pertama sahaja akan dihantar.">
+<!ENTITY typeSelector.falseNegative.description "Pilih pilihan ini jika iklan dipaparkan walaupun Adblock Plus telah diaktifkan.">
+<!ENTITY sendPage.waitMessage "Sila tunggu sementara Adblock Plus menghantar laporan anda.">
+<!ENTITY dataCollector.heading "Selamat datang ke pelapor isu">
+<!ENTITY screenshot.heading "Lampir screenshot">
+<!ENTITY sendPage.heading "Hantar laporan">
+<!ENTITY issues.subscriptionCount.description "Didapati anda melanggan terlalu banyak langganan penapis. Ini tidak disyorkan kerana ia mungkin akan mewujudkan masalah. Kami juga tidak dapat menerima laporan anda kerana ia kurang jelas penulis langganan penapis mana yang perlu mengambil tindakan. Sila buang semua langganan penapis kecuali yang diperlukan dan uji samada masalah masih berterusan.">
+<!ENTITY screenshot.mark.label "&amp;Tanda masalah tersebut">
+<!ENTITY privacyPolicy.label "Polisi privasi">
+<!ENTITY issues.description "Adblock Plus telah mengesan isu pada konfigurasi anda yang mungkin penyebab isu ini atau akan menyukarkan penyiasatan laporan.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/sidebar.dtd
new file mode 100644
index 0000000..c2f2cd8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Jelaskan sempadan item">
+<!ENTITY address.label "Alamat">
+<!ENTITY context.open.label "Buka dalam Tab Baru">
+<!ENTITY type.label "Jenis">
+<!ENTITY tooltip.filterSource.label "Sumber penapis:">
+<!ENTITY noitems.label "Tiada item yang boleh disekat">
+<!ENTITY filter.label "Penapis">
+<!ENTITY tooltip.size.label "Saiz:">
+<!ENTITY reattach.label "Lampir semula">
+<!ENTITY search.label "&amp;Cari:">
+<!ENTITY docDomain.thirdParty "(pihak ketiga)">
+<!ENTITY filterSource.label "Sumber penapis">
+<!ENTITY tooltip.docDomain.label "Sumber dokumen:">
+<!ENTITY context.copy.label "Salin alamat item">
+<!ENTITY tooltip.type.label "Jenis:">
+<!ENTITY context.disablefilter.label "Nyahaktif penapis ?1?">
+<!ENTITY context.copyFilter.label "Salin penapis">
+<!ENTITY context.block.label "Sekat item ini">
+<!ENTITY context.enablefilter.label "Aktifkan kembali penapis ?1?">
+<!ENTITY detach.label "Asingkan">
+<!ENTITY whitelisted.label "Laman yang disenarai putih">
+<!ENTITY context.disablefilteronsite.label "Nyahaktif penapis ini pada ?1?">
+<!ENTITY detached.title "Adblock Plus: Item yang boleh disekat (diasingkan)">
+<!ENTITY docDomain.firstParty "(pihak pertama)">
+<!ENTITY tooltip.type.whitelisted "(senarai putih)">
+<!ENTITY tooltip.filter.label "Penapis yang digunakan:">
+<!ENTITY tooltip.filter.disabled "(dinyahaktifkan)">
+<!ENTITY context.editfilter.label "Ubah penapis yang digunakan">
+<!ENTITY tooltip.type.blocked "(disekat)">
+<!ENTITY size.label "Saiz">
+<!ENTITY context.whitelist.label "Tambah peraturan pengecualian untuk item">
+<!ENTITY context.selectAll.label "Pilih semua">
+<!ENTITY state.label "Keadaan">
+<!ENTITY docDomain.label "Sumber dokumen">
+<!ENTITY tooltip.address.label "Alamat:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/subscriptionSelection.dtd
new file mode 100644
index 0000000..cdf6791
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Tam&amp;bah langganan penapis &quot;?1?&quot; juga">
+<!ENTITY list.download.failed "Adblock Plus gagal memuat-turun senarai langganan.">
+<!ENTITY list.download.retry "Cuba lagi">
+<!ENTITY title.label "Ta&amp;juk langganan">
+<!ENTITY list.download.website "Papar laman web">
+<!ENTITY supplementMessage "Langganan penapis ini bertujuan untuk digunakan bersama langganan penapis &quot;?1?&quot; yang tidak digunakan oleh anda lagi.">
+<!ENTITY viewList.label "Papar penapis">
+<!ENTITY visitHomepage.label "Lawat laman web Adblock Plus">
+<!ENTITY addSubscription.label "Tambah langganan">
+<!ENTITY dialog.title "Tambah langganan penapis Adblock Plus">
+<!ENTITY location.label "L&amp;okasi senarai penapis:">
+<!ENTITY fromWeb.description "Sila pastikan anda mahu menambah langganan penapis ini. Anda boleh mengubah tajuk langganan atau lokasi sebelum menambahnya.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/composer.dtd
new file mode 100644
index 0000000..3292cd0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "på slutte&amp;n av adressen">
+<!ENTITY domainRestriction.label "Begrens til &amp;domene:">
+<!ENTITY collapse.default.no.label "Bruk standard (nei)">
+<!ENTITY firstParty.label "Kun elementer fra hovedsiden">
+<!ENTITY preferences.label "Vi&amp;s eksisterende filtre...">
+<!ENTITY pattern.label "Se etter mønster">
+<!ENTITY thirdParty.label "Kun &amp;tredjeparts">
+<!ENTITY filter.label "Nytt &amp;filter:">
+<!ENTITY collapse.label "Minimer b&amp;lokkerte:">
+<!ENTITY match.warning "Mønsteret du laget stemmer ikke lenger overens med adressen som skal blokkeres/hvitelistes, og vil ikke ha noen effekt.">
+<!ENTITY anchor.start.label "på starten av adressen (&amp;g)">
+<!ENTITY matchCase.label "&amp;Ta hensyn til stor og liten forbokstav (A/a)">
+<!ENTITY custom.pattern.label "Egendefinert: (&amp;C)">
+<!ENTITY unselectAllTypes.label "Velg ingen">
+<!ENTITY type.whitelist.label "Unntaksregel (&amp;x)">
+<!ENTITY regexp.warning "Mønsteret du har laget vil bli tolket som et standarduttrykk, og kan ikke behandles effektivt av Adblock Plus, som igjen vil gjøre nettleseren din tregere. Hvis du ikke hadde tenkt til å lage et standarduttrykk, kan du legge til en stjerne (*) på slutten av mønsteret.">
+<!ENTITY dialog.title "Legg til filtreringsregel for Adblock Plus">
+<!ENTITY basic.label "Grunnleggende visning">
+<!ENTITY type.filter.label "&amp;Blokkeringsfilter">
+<!ENTITY types.label "Bruk på:">
+<!ENTITY shortpattern.warning "Mønsteret du skrev inn er for kort til å bli optimert, og kan gjøre nettleseren din tregere. Vi anbefaler at du lager en lengre tekstsekvens for dette filteret, slik at Adblock Plus kan behandle filteret mer effektivt.">
+<!ENTITY collapse.yes.label "Ja">
+<!ENTITY anchors.label "Aksepter kun mønster:">
+<!ENTITY collapse.default.yes.label "Bruk standard (ja)">
+<!ENTITY domainRestriction.help "Bruk dette valget til å spesifisere ett domene eller flere domener, separert med vertikalstreker (|). Filteret vil kun brukes på domenet eller domenene som er valgt. En tilde (~) foran et domenenavn indikerer at filteret ikke skal brukes på det domenet.">
+<!ENTITY accept.label "Legg til filter">
+<!ENTITY options.label "Alternativer">
+<!ENTITY disabled.warning "Adblock Plus er deaktivert. Du kan fremdeles legge til filtre, men de blir ikke aktivert med mindre du [link]aktiverer Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "på starten av domenenavnet (&amp;g)">
+<!ENTITY collapse.no.label "Nei">
+<!ENTITY selectAllTypes.label "Velg alle">
+<!ENTITY advanced.label "Avansert visning">
+<!ENTITY pattern.explanation "Mønsteret kan være hvilken som helst del av adressen; stjerner (*) fungerer som frie symboler. Filteret vil kun bli aktivert for adresser som stemmer overens med sekvensen du har definert.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/filters.dtd
new file mode 100644
index 0000000..ac2bc21
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Alle dine egenkomponerte filtre vil bli erstattet av innholdet i filen du har valgt. Vil du fortsette?">
+<!ENTITY slow.column "Trege filtre (&amp;w)">
+<!ENTITY enabled.column "Aktivert (&amp;n)">
+<!ENTITY subscription.lastDownload.checksumMismatch "Mislyktes - kontrollsummen stemmer ikke">
+<!ENTITY noFiltersInGroup.text "Den valgte gruppen er tom.">
+<!ENTITY subscription.actions.label "Handlinger">
+<!ENTITY filter.selectAll.label "Velg alle">
+<!ENTITY backupButton.label "Sikkerhetskopier og gjenopprett (&amp;B)">
+<!ENTITY restore.minVersion.warning "Advarsel: Filen har blitt laget med en nyere versjon av Adblock Plus. Du bør oppdatere til nyeste versjon av Adblock Plus før du bruker denne filen.">
+<!ENTITY restore.error "Informasjonen i filen kunne ikke bli behandlet. Kanskje dette ikke er en backup-fil for Adblock Plus?">
+<!ENTITY sort.ascending.label "&amp;Sortér fra A til Å">
+<!ENTITY sort.label "&amp;Sorter etter">
+<!ENTITY subscription.source.label "Filterliste">
+<!ENTITY hitcount.column "Treff (&amp;H)">
+<!ENTITY noFilters.text "Du har ingen egendefinerte filtre ennå.">
+<!ENTITY backup.custom.title "Kun egendefinerte filtre">
+<!ENTITY subscription.external.label "Oppdatert av et annet tillegg">
+<!ENTITY subscription.delete.label "Slett">
+<!ENTITY noGroupSelected.text "Du må velge en filtergruppe før tilhørende filtre kan vises.">
+<!ENTITY filter.cut.label "Klipp ut">
+<!ENTITY restore.default.label "Gjenopprett sikkerhetskopi fra ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Laster ned...">
+<!ENTITY subscriptions.tab.label "Filterabonnementer">
+<!ENTITY sort.descending.label "&amp;Sortér fra Å til A">
+<!ENTITY filters.remove.warning "Ønsker du virkelig å fjerne alle valgte filtre?">
+<!ENTITY filter.delete.label "Slett">
+<!ENTITY addSubscriptionAdd.label "Legg til">
+<!ENTITY viewMenu.label "Vis">
+<!ENTITY subscription.lastDownload.unknown "Ikke tilgjengelig">
+<!ENTITY addSubscriptionCancel.label "Avbryt">
+<!ENTITY subscription.enabled.label "Aktivert">
+<!ENTITY noSubscriptions.text "Du har ikke lagt til noen filterabonnementer ennå. Adblock Plus blokkerer ikke noe uten filtre. Vennligst bruk &quot;Legg til filterabonnement&quot; for å legge til filtre.">
+<!ENTITY subscription.update.label "Oppdater filtre">
+<!ENTITY dialog.title "Filtervalg for Adblock Plus">
+<!ENTITY addFilter.label "Legg til filter (&amp;d)">
+<!ENTITY subscription.minVersion.warning "Dette filterabonnementet krever en nyere versjon av Adblock Plus. Du bør oppdatere til nyeste versjon av Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Feilet, ikke en gyldig adresse">
+<!ENTITY backup.error "Det oppstod en feil under lagring av filtrene til filen. Sjekk at ikke filen er skrivebeskyttet, eller at den brukes av et annet program.">
+<!ENTITY filter.moveUp.label "Flytt opp">
+<!ENTITY addGroup.label "Le&amp;gg til filtergruppe">
+<!ENTITY filter.edit.label "Rediger">
+<!ENTITY subscription.showHideFilters.label "Vis/skjul filtre">
+<!ENTITY acceptableAds2.label "Tillat noen ikke-påtrengende annonser">
+<!ENTITY addSubscriptionOther.label "Legg til et annet abonnement">
+<!ENTITY close.label "Lukk">
+<!ENTITY sort.none.label "&amp;Usortert">
+<!ENTITY filter.actions.label "Filterhandlinger">
+<!ENTITY filter.copy.label "Kopier">
+<!ENTITY filter.moveDown.label "Flytt ned">
+<!ENTITY filter.resetHitCounts.label "Nullstill treffstatistikker">
+<!ENTITY readMore.label "Les mer">
+<!ENTITY subscription.moveUp.label "Flytt opp">
+<!ENTITY addSubscription.label "Legg til &amp;filterabonnement">
+<!ENTITY subscription.homepage.label "Hjemmeside">
+<!ENTITY backup.complete.title "Alle filtre og abonnenter">
+<!ENTITY restore.own.label "Gjenopprett egen sikkerhetskopi">
+<!ENTITY restore.complete.warning "Alle filtervalgene dine vil bli erstattet av innholdet i filen du har valgt. Vil du fortsette?">
+<!ENTITY filters.tab.label "Egendefinerte filtre">
+<!ENTITY backup.label "Opprett ny sikkerhetskopi">
+<!ENTITY find.label "Fi&amp;nn">
+<!ENTITY subscription.moveDown.label "Flytt ned">
+<!ENTITY subscription.lastDownload.connectionError "Feilet, nedlastingsfeil">
+<!ENTITY subscription.lastDownload.success "Vellykket">
+<!ENTITY subscription.lastDownload.invalidData "Feilet, ikke en gyldig filterliste">
+<!ENTITY filter.paste.label "Lim inn">
+<!ENTITY subscription.disabledFilters.enable "Aktiver deaktiverte filtre">
+<!ENTITY lasthit.column "Siste treff (&amp;L)">
+<!ENTITY subscription.editTitle.label "Rediger tittel">
+<!ENTITY subscription.disabledFilters.warning "Noen filtre i dette abonnementet er deaktivert.">
+<!ENTITY filter.column "&amp;Filterregel">
+<!ENTITY subscription.lastDownload.label "Siste nedlasting:">
+<!ENTITY viewList.label "Vis liste">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/firstRun.properties
new file mode 100644
index 0000000..dc51602
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Vær privat på nettet ved å hindre sporing - gjem sporene dine fra reklameselskaper som ellers registrerer alt du gjør.
+firstRun_toggle_off=AV
+firstRun_feature_tracking=Slå av sporing
+firstRun_feature_malware=Blokkering av skadeprogram
+firstRun_title=Adblock Plus har blitt installert
+firstRun_toggle_on=PÃ…
+firstRun_acceptableAdsExplanation=Vi vil oppfordre nettsider til å bruke standard, ikke-påtrengende annonser. Derfor har vi laget <a>strenge retningslinjer</a> for å identifisere akseptable annonser, som vises når man har aktivert standardinnstillingene. Hvis du ønsker å blokkere alle annonser, kan du <a>velge bort</a> dette straks.
+firstRun_contributor_credits=Takk til
+firstRun_dataCorruptionWarning=Dukker denne siden stadig opp? <a>Klikk her!</a>
+firstRun_acceptableAdsHeadline=Irriterende annonser blir fra nå av blokkert
+firstRun_share=Fortell dette til vennene dine
+firstRun_share_headline=<a>Hjelp oss</a> med å gjøre Internett til et bedre sted
+firstRun_feature_social_description=Bli kvitt knapper for sosiale medier, slik som "Liker" fra Facebook, som dukker opp på nettsider og sporer handlingene dine.
+firstRun_filterlistsReinitializedWarning=Det kan se ut som at en feil i systemet gjorde at alle filtrene ble fjernet, og vi var ute av stand til å gjenopprette sikkerhetskopien. Vi har derfor måttet nullstille alle filtrene og innstillingene for Akseptable annonser. Vennligst kontroller filterlistene dine og innstillingene for Akseptable annonser i valgalternativene til <a>Adblock Plus options</a>.
+firstRun_feature_malware_description=Gjør nettlesingen din tryggere ved å blokkere domener som er kjent for å være skadelige.
+firstRun_features=Adblock Plus kan gjøre mer enn å bare blokkere annonser
+firstRun_donate=donér
+firstRun_donate_label=Støtt prosjektet vårt
+firstRun_feature_social=Fjern sosiale media-knapper
+firstRun_legacySafariWarning=Du bruker en gammel versjon av Safari som ikke støttes av Adblock Plus, og det kan hende Adblock Plus ikke fungerer, eller forverrer brukeropplevelsen på enkelte nettsteder. Vi anbefaler sterkt at du enten oppdaterer til Safari 6.1.1 eller nyere (tilgjengelig for Mac OS X 10.8 Mountain Lion), Safari 7.0.1 (tilgjengelig for OS X 10.9 Mavericks) eller nyere, eller bruker den nyeste versjonen av Mozilla Firefox, Google Chrome eller Opera.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/global.properties
new file mode 100644
index 0000000..45be984
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Ingen blokkerbare elementer på nåværende side
+action3_tooltip=Klikk for å aktivere/deaktivere Adblock Plus.
+notification_antiadblock_title=Skjul meldinger til Adblock Plus brukere?
+type_label_script=script
+filter_elemhide_nocriteria=Du har ikke spesifisert kriterier for å gjenkjenne elementet som skal skjules
+blockingGroup_title=Regler for annonseblokkering
+whitelisted_tooltip=Adblock Plus er deaktivert på nåværende side.
+type_label_stylesheet=stilark
+blocked_count_tooltip=?1? av ?2?
+type_label_font=font
+type_label_popup=sprettoppvindu
+filter_regexp_tooltip=Dette filteret er enten et standarduttrykk eller er for kort til å bli optimalisert. For mange slike filtre kan gjøre nettleseren din tregere.
+action0_tooltip=Trykk her for å vise kontekstmenyen. Midtklikk for å aktivere/deaktivere.
+whitelisted_page=Adblock Plus har blitt deaktivert for nåværende side
+remove_group_warning=Ønsker du virkelig å fjerne denne gruppen?
+action1_tooltip=Klikk her for å åpne/lukke elementer som kan blokkeres. Midtklikk for å aktivere/deaktivere.
+type_label_xmlhttprequest=XML-forespørsel
+active_tooltip=Adblock Plus er aktivert. ?1? filterabonnementer og ?2? egendefinerte filtre i bruk.
+type_label_document=dokument
+type_label_object_subrequest=underforespørsel fra objektet
+whitelistGroup_title=Unntaksregler
+disabled_tooltip=Adblock Plus er deaktivert.
+filter_elemhide_duplicate_id=Du kan kun angi ett ID for elementet som skal skjules
+type_label_object=objekt
+action2_tooltip=Klikk her for å åpne innstillingsvalgene. Midtklikk for å aktivere/deaktivere.
+type_label_subdocument=ramme
+clearStats_warning=Dette vil nullstille alle treffstatistikker for filtre og deaktivere telleren. Vil du fortsette?
+notification_antiadblock_message=Dette området er kjent for å vise meldinger som henvender seg til AdBlock Plus brukere. Vil du at Adblock Plus skal skjule disse meldingene?
+blocked_count_addendum=(også hvitelistet: ?1?, skjult: ?2?)
+subscription_invalid_location=Filterlistens plassering er verken en gyldig URL eller et gyldig filnavn.
+type_label_image=bilde
+remove_subscription_warning=Ønsker du virkelig å fjerne dette abonnementet?
+type_label_other=annet
+mobile_menu_enable=ABP: Aktiver
+type_label_media=lyd/video
+mobile_menu_disable_site=ABP: Deaktiver på ?1?
+elemhideGroup_title=Regler for å skjule elementer
+mobile_menu_enable_site=ABP: Aktiver på ?1?
+type_label_elemhide=skjult
+newGroup_title=Ny filtergruppe
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/overlay.dtd
new file mode 100644
index 0000000..9d89b41
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Ja">
+<!ENTITY notification.button.no "&amp;Nei">
+<!ENTITY sync.label "Synkroniser innstillinger for Adblo&amp;ck Plus">
+<!ENTITY whitelist.site.label "Deaktiver på ?1?">
+<!ENTITY filters.label "&amp;Filterinnstillinger">
+<!ENTITY disable.label "Deaktiver overalt">
+<!ENTITY objecttab.title "Blokker">
+<!ENTITY objecttab.tooltip "Klikk her for å blokkere dette elementet med Adblock Plus">
+<!ENTITY menuitem.label "Adblock Plus innstillinger">
+<!ENTITY objecttabs.label "Vis faner på Flash og Java">
+<!ENTITY sendReport.label "&amp;Rapporter problem på denne siden">
+<!ENTITY whitelist.page.label "Deaktiv kun på denne siden">
+<!ENTITY context.image.label "Adblock Plus: Blokker bilde">
+<!ENTITY counthits.label "Tell filtertreff (&amp;h)">
+<!ENTITY opensidebar.label "Ã…pne &amp;blokkerbare elementer">
+<!ENTITY notification.button.close "&amp;Lukk">
+<!ENTITY contribute.label "Bidra til Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Blokker ramme">
+<!ENTITY blocked.tooltip "Blokkerte elementer på denne siden:">
+<!ENTITY hideplaceholders.label "Skjul plassbeholder for blokkerte elementer">
+<!ENTITY showinstatusbar.label "Vis i statuslinjen">
+<!ENTITY sidebar.title "Blokkerbare elementer på nåværende side">
+<!ENTITY options.label "Alternativer (&amp;O)">
+<!ENTITY context.object.label "Adblock Plus: Blokker objekt">
+<!ENTITY context.removeWhitelist.label "Reaktiver på denne siden">
+<!ENTITY filters.tooltip "Mest aktive filtre:">
+<!ENTITY closesidebar.label "Lukk &amp;blokkérbare elementer">
+<!ENTITY showintoolbar.label "Vis på verktøylinje (&amp;b)">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Blokker lyd/video">
+<!ENTITY subscription.update.label "Oppdater filtre">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/sendReport.dtd
new file mode 100644
index 0000000..1cc95f1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Angre (&amp;U)">
+<!ENTITY issues.disabledgroups.description "Disse filterabonnementene/filtergruppene er deaktivert, men de kan ha en effekt på denne siden likevel:">
+<!ENTITY showData.label "Vis rapportdata">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blokkerer for &amp;mye">
+<!ENTITY issues.change.description "Konfigurasjonene dine er endret. Last inn siden på nytt for å teste forandringene, og send inn en ny rapport hvis problemene er vedvarende.">
+<!ENTITY email.label "E-post: (&amp;m)">
+<!ENTITY issues.openPreferences.label "Ã…pne filterinnstillinger">
+<!ENTITY sendPage.confirmation "Rapporten er lagret. Du kan få tilgang til den ved følgende internettadresse:">
+<!ENTITY copyLink.label "Kopier rapportlink (&amp;C)">
+<!ENTITY issues.nofilters.description "Adblock Plus blokkerer ingenting på denne siden. Problemer du opplever er trolig urelatert til Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Problemet du rapporterte inn er allerede kjent for oss. Mer informasjon:">
+<!ENTITY typeSelector.other.description "Velg dette alternativet hvis du mistenker at det er et problem med Adblock Plus som program, i motsetning til filterene.">
+<!ENTITY issues.disabledgroups.enable.label "Aktiver filterabonnement / filtergruppe">
+<!ENTITY typeWarning.override.label "Jeg for&amp;står og ønsker likevel å sende rapporten">
+<!ENTITY issues.disabled.enable.label "Aktiver Adblock Plus">
+<!ENTITY update.fixed.description "Oppdateringen av filterabonnemenetene dine løste trolig problemet du rapporterte inn. Vennligst last inn siden på nytt. Rapporter inn problemet på nytt hvis problemet fremdeles eksisterer.">
+<!ENTITY anonymous.label "&amp;Anonym innsending">
+<!ENTITY reloadButton.label "Last side på nytt (&amp;R)">
+<!ENTITY recentReports.clear.label "Fje&amp;rn alle rapporter">
+<!ENTITY typeSelector.description "Dette vinduet vil veilede deg gjennom de nødvendige stegene som trengs for å sende inn en problemrapport til Adblock Plus. Velg først hvilket type problem du har på denne siden:">
+<!ENTITY screenshot.remove.label "Fje&amp;rn sensitive data">
+<!ENTITY issues.ownfilters.description "Noen av filterene som er aktivert på denne siden er brukerdefinerte. Vennligst deaktiver filterene som kan ha forårsaket problemet:">
+<!ENTITY update.inProgress.description "Adblock Plus behøver å oppdatere filterabonnementene for å forsikre seg at problemet ikke har blitt løst allerede. Vennligst vent...">
+<!ENTITY sendPage.retry.label "Send på nytt">
+<!ENTITY data.label "Ra&amp;pportdata:">
+<!ENTITY recentReports.label "Dine nylig innsendte rapporter">
+<!ENTITY typeWarning.description "Du har angitt at du vil rapportere inn et generelt problem vedrørende Adblock Plus, istedenfor et problem vedrørende filtrene. Vennligst legg merke til at slike problemer helst bør rapporteres inn på [link]Adblock Plus forum[/link]. Du burde kun bruke rapportingsfunksjonen til å supplementere til en eksisterende diskusjon, siden ingen vil legge merke til din rapport såfremt du ikke legger ved en link. En automatisk generert link vil bli gitt deg etter at du har sendt inn en rapport.">
+<!ENTITY issues.disabled.description "Adblock Plus er deaktivert, og vil ikke blokkere noenting i denne tilstanden.">
+<!ENTITY attachExtensions.label "Legg ved en liste over aktive tillegg til rapporten, i tilfelle det er en &quot;add-on&quot; som er grunnen til problemet">
+<!ENTITY issues.nosubscriptions.add.label "Legg til filterabonnement">
+<!ENTITY issues.disabledfilters.enable.label "Aktiver filter">
+<!ENTITY issues.override.label "Følgende konfigurasjon er korrekt; fortsetter med rapporteringen">
+<!ENTITY issues.nosubscriptions.description "Det virker som om du ikke har abonnert på noen av de forhåndsdefinerte listene som fjerner uønsket innhold fra internettsider.">
+<!ENTITY typeSelector.falsePositive.description "Velg dette alternativet hvis siden mangler viktig innhold, vises feil eller ikke fungerer sånn det skal. Du kan finne ut om Adblock Plus er roten til problemet ved å deaktivere Adblock Plus midlertidig.">
+<!ENTITY typeSelector.other.label "Anne&amp;t problem">
+<!ENTITY emailComment.label "Vi oppfordrer deg til å oppgi en gyldig e-postadresse, slik at vi kan kontakte deg hvis vi har spørsmål angående denne rapporten. Det vil også gjøre at vi kan gjenkjenne dine bidrag, og prioritere dem høyere.">
+<!ENTITY issues.whitelist.remove.label "Reaktiver Adblock Plus for denne siden">
+<!ENTITY outdatedSubscriptions.description "Disse filterabonnementene har ikke blitt oppdatert på minst to uker. Vennligst oppdater disse filterabonnementene før du sender inn en problemrapport; problemet kan ha blitt løst allerede.">
+<!ENTITY dataCollector.description "Vennligst vent på at Adblock Plus samler inn de nødvendige data.">
+<!ENTITY sendButton.label "Se&amp;nd rapport">
+<!ENTITY comment.label "Kommentar (valgfritt): (&amp;C)">
+<!ENTITY sendPage.errorMessage "Et forsøk på å sende inn rapporten feilet, med feilkoden &quot;?1?&quot;. Vennligst kontrollér at du har internettilgang, og prøv på nytt. Hvis problemet vedvarer kan du be om hjelp i [link]Adblock Plus forum[/link].">
+<!ENTITY showRecentReports.label "Vis nylig innsendte rapporter">
+<!ENTITY commentPage.heading "Skriv inn kommentar">
+<!ENTITY update.start.label "Start oppdatering nå">
+<!ENTITY issues.disabledfilters.description "Følgende filter er deaktiver, men det kan alikevell ha en effekt på denne siden:">
+<!ENTITY screenshot.description "En internettside kan se annerledes ut for forskjellige personer. Det vil muligens hjelpe oss til å forstå problemet hvis du du sender med en skjermdump, sammen med rapporten. Du kan fjerne sensitiv informasjon, såvell som markere området hvor problemet er merkbart. For å gjøre dette må du klikke tilsvarende knapp, og velge området du vil markere med datamusen.">
+<!ENTITY screenshot.attach.label "Legg ved et bilde til rapporten">
+<!ENTITY issues.whitelist.description "Adblock Plus er for tiden deaktivert for siden du ønkser å rapportere inn. Vennligst reaktiver Adblock Plus for denne siden, og last inn siden på nytt før sender inn rapporten.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus blokkerer ikke et reklameelement">
+<!ENTITY typeSelector.heading "Velg type problem">
+<!ENTITY anonymity.warning "Vi vil ikke kunne svare deg, og det vil sannsynligvis gjøre at rapporten får lavere prioritet.">
+<!ENTITY wizard.title "Problemrapporterer">
+<!ENTITY issues.ownfilters.disable.label "Deaktiver filter">
+<!ENTITY commentPage.description "I tekstfeltet nedenfor kan du skrive en kommentar som kan hjelpe oss til å forstå problemet. Dette er valgfritt, men anbefalt hvis problemet ikke åpenbart. Du kan også se på rapportdataene før de sendes.">
+<!ENTITY comment.lengthWarning "Lengden på din kommentar er lenger enn 1000 bokstav. Bare de første 1000 bokstavene vil bli inkludert i rapporten.">
+<!ENTITY typeSelector.falseNegative.description "Velg dette alternativet hvis et reklameelement vises, selv om Adblock Plus er aktivert.">
+<!ENTITY sendPage.waitMessage "Vennligst vent mens Adblock Plus sender inn din rapport.">
+<!ENTITY dataCollector.heading "Velkommen til problemrapportereren">
+<!ENTITY screenshot.heading "Legg ved skjermdump">
+<!ENTITY sendPage.heading "Send rapport">
+<!ENTITY issues.subscriptionCount.description "Det virker som om du har abonnert på for mange filterabonnementer. Dette oppsettet er ikke oppsettet er ikke anbefalt, da det ofte vil resultere i at du opplever flere problemer med Adblock plus. Vi kan heller ikke ta imot din rapport, siden det er usikkert hvilken filterforfatter det er som eventuelt må fikse filteret sitt. Vennligst fjern alle ikke-nødvendige filtere, og se om samme problem oppstår da.">
+<!ENTITY screenshot.mark.label "Markèr problemet">
+<!ENTITY privacyPolicy.label "Personvern">
+<!ENTITY issues.description "Adblock Plus oppdaget problemer med konfigurasjonene som kan være grunnen til problemet, eller som kan gjøre det vanskelig å undersøke problemet.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/sidebar.dtd
new file mode 100644
index 0000000..1e4e45b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Fremhév elementets kanter">
+<!ENTITY address.label "Adresse">
+<!ENTITY context.open.label "Ã…pne i ny fane">
+<!ENTITY type.label "Type">
+<!ENTITY tooltip.filterSource.label "Filterkilde:">
+<!ENTITY noitems.label "Ingen blokkerbare elementer">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Størrelse:">
+<!ENTITY reattach.label "Gjentilkoble">
+<!ENTITY search.label "&amp;Søk:">
+<!ENTITY docDomain.thirdParty "(tredjeparts)">
+<!ENTITY filterSource.label "Filterkilde">
+<!ENTITY tooltip.docDomain.label "Dokumentkilde:">
+<!ENTITY context.copy.label "Kopier elementets adresse">
+<!ENTITY tooltip.type.label "Type:">
+<!ENTITY context.disablefilter.label "Deaktiver filter ?1?">
+<!ENTITY context.copyFilter.label "Kopier filter">
+<!ENTITY context.block.label "Blokker dette elementet">
+<!ENTITY context.enablefilter.label "Reaktiver filter ?1?">
+<!ENTITY detach.label "Frakoble">
+<!ENTITY whitelisted.label "Hvitelistet side">
+<!ENTITY context.disablefilteronsite.label "Deaktiver dette filteret på ?1?">
+<!ENTITY detached.title "Adblock Plus: Blokkérbare elementer(frittstående)">
+<!ENTITY docDomain.firstParty "(førsteparts)">
+<!ENTITY tooltip.type.whitelisted "(hvitelistet)">
+<!ENTITY tooltip.filter.label "Gjeldende filter:">
+<!ENTITY tooltip.filter.disabled "(deaktivert)">
+<!ENTITY context.editfilter.label "Redigér gjeldende filter">
+<!ENTITY tooltip.type.blocked "(blokkert)">
+<!ENTITY size.label "Størrelse">
+<!ENTITY context.whitelist.label "Legg til unntaksregel for elementet">
+<!ENTITY context.selectAll.label "Velg alle">
+<!ENTITY state.label "Tilstand">
+<!ENTITY docDomain.label "Dokumentkilde">
+<!ENTITY tooltip.address.label "Adresse:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/subscriptionSelection.dtd
new file mode 100644
index 0000000..14ae574
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Legg til filterabonnement &quot;?1?&quot; også">
+<!ENTITY list.download.failed "Adblock Plus mislyktes i å hente listen med abonnementene.">
+<!ENTITY list.download.retry "Prøv igjen">
+<!ENTITY title.label "Abonnemen&amp;tstittel:">
+<!ENTITY list.download.website "Vis nettside">
+<!ENTITY supplementMessage "Dette filter abonnementet er ment å brukes sammen med filter abonnementet &quot;?1?&quot; som du ikke bruker ennå.">
+<!ENTITY viewList.label "Vis filtre">
+<!ENTITY visitHomepage.label "Besøk hjemmeside">
+<!ENTITY addSubscription.label "Legg til abonnement">
+<!ENTITY dialog.title "Legg til filterabonnement for Adblock Plus">
+<!ENTITY location.label "Filterabonnementets plassering:">
+<!ENTITY fromWeb.description "Vennligst bekreft at du vil legge til dette filterabonnementet. Du kan forandre tittelen på abonnementet, eller plasseringen til abonnementet, før det legges til.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/composer.dtd
new file mode 100644
index 0000000..1ae748e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "aan het e&amp;ind van het adres">
+<!ENTITY domainRestriction.label "Tot domein be&amp;perken:">
+<!ENTITY collapse.default.no.label "Standaard gebruiken (nee)">
+<!ENTITY firstParty.label "A&amp;lleen van eigen website">
+<!ENTITY preferences.label "Bestaande filters &amp;weergeven…">
+<!ENTITY pattern.label "Naar patroon zoeken">
+<!ENTITY thirdParty.label "Alleen van &amp;derden">
+<!ENTITY filter.label "&amp;Nieuwe filter:">
+<!ENTITY collapse.label "&amp;Geblokkeerd onderdeel inklappen:">
+<!ENTITY match.warning "Het door u ingegeven patroon komt niet meer overeen met het te blokkeren/op de witte lijst te plaatsen adres en zal er geen effect op hebben.">
+<!ENTITY anchor.start.label "aan &amp;het begin van het adres">
+<!ENTITY matchCase.label "H&amp;oofdlettergevoelig">
+<!ENTITY custom.pattern.label "&amp;Aangepast:">
+<!ENTITY unselectAllTypes.label "Niets selecteren">
+<!ENTITY type.whitelist.label "&amp;Uitzonderingsregel">
+<!ENTITY regexp.warning "Het patroon dat u heeft gegeven zal worden behandeld als een reguliere expressie. Deze kunnen niet efficiënt worden verwerkt door Adblock Plus en kunnen uw browser traag maken. Als het niet uw bedoeling was een reguliere expressie te schrijven, voeg dan een asterisk (*) aan het eind van het patroon toe.">
+<!ENTITY dialog.title "Adblock Plus-filterregel toevoegen">
+<!ENTITY basic.label "Eenvoudige weergave">
+<!ENTITY type.filter.label "&amp;Blokkeringsfilter">
+<!ENTITY types.label "Toepassen op types:">
+<!ENTITY shortpattern.warning "Het patroon dat u heeft gegeven is te kort om te worden geoptimaliseerd en kan uw browser traag maken. U kunt beter een langere regel voor dit filter kiezen, zodat Adblock Plus het filter efficiënter kan toepassen.">
+<!ENTITY collapse.yes.label "Ja">
+<!ENTITY anchors.label "Alleen patronen accepteren:">
+<!ENTITY collapse.default.yes.label "Standaard gebruiken (ja)">
+<!ENTITY domainRestriction.help "Gebruik deze optie om één of meer domeinen te specificeren, gescheiden door een lijn (|). Het filter zal alleen op deze domeinen worden toegepast. Een tilde (~) voor een domein betekent dat het filter niet moet worden toegepast op dat domein.">
+<!ENTITY accept.label "Filter toevoegen">
+<!ENTITY options.label "Opties">
+<!ENTITY disabled.warning "Adblock Plus is momenteel uitgeschakeld. U kunt nog wel filters toevoegen, maar ze worden niet toegepast tenzij u [link]Adblock Plus weer inschakelt[/link].">
+<!ENTITY anchor.start.flexible.label "aan &amp;het begin van de domeinnaam">
+<!ENTITY collapse.no.label "Nee">
+<!ENTITY selectAllTypes.label "Alles selecteren">
+<!ENTITY advanced.label "Geavanceerde weergave">
+<!ENTITY pattern.explanation "Het patroon kan ieder gedeelte zijn van het adres, waarbij een asterisk (*) als wildcard geldt. Het filter wordt alleen toegepast op adressen die met het patroon overeenkomen.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/filters.dtd
new file mode 100644
index 0000000..f04172e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Al uw aangepaste filters worden vervangen door de inhoud van het geselecteerde bestand. Wilt u doorgaan?">
+<!ENTITY slow.column "T&amp;rage filters">
+<!ENTITY enabled.column "&amp;Ingeschakeld">
+<!ENTITY subscription.lastDownload.checksumMismatch "Mislukt, afwijkend controlecijfer">
+<!ENTITY noFiltersInGroup.text "De geselecteerde groep is leeg.">
+<!ENTITY subscription.actions.label "Acties">
+<!ENTITY filter.selectAll.label "Alles selecteren">
+<!ENTITY backupButton.label "&amp;Back-up en herstel">
+<!ENTITY restore.minVersion.warning "Waarschuwing: het bestand is gemaakt met een nieuwere versie van Adblock Plus. U dient bij te werken naar de laatste versie voordat u kunt herstellen vanuit dit bestand.">
+<!ENTITY restore.error "De gegevens in het bestand kunnen niet worden verwerkt, wellicht is het geen back-up-bestand van Adblock Plus?">
+<!ENTITY sort.ascending.label "&amp;A &gt; Z sortering">
+<!ENTITY sort.label "&amp;Sorteren op">
+<!ENTITY subscription.source.label "Filterlijst">
+<!ENTITY hitcount.column "&amp;Treffers">
+<!ENTITY noFilters.text "U heeft nog geen aangepaste filters.">
+<!ENTITY backup.custom.title "Alleen aangepaste filters">
+<!ENTITY subscription.external.label "Bijgewerkt door een andere extensie">
+<!ENTITY subscription.delete.label "Verwijderen">
+<!ENTITY noGroupSelected.text "U dient een filtergroep te selecteren voordat de filters kunnen worden weergegeven.">
+<!ENTITY filter.cut.label "Knippen">
+<!ENTITY restore.default.label "Back-up van ?1? terugzetten">
+<!ENTITY subscription.lastDownload.inProgress "Downloaden…">
+<!ENTITY subscriptions.tab.label "Filterabonnementen">
+<!ENTITY sort.descending.label "&amp;Z &gt; A sortering">
+<!ENTITY filters.remove.warning "Wilt u echt alle geselecteerde filters verwijderen?">
+<!ENTITY filter.delete.label "Verwijderen">
+<!ENTITY addSubscriptionAdd.label "Toevoegen">
+<!ENTITY viewMenu.label "Beeld">
+<!ENTITY subscription.lastDownload.unknown "Onbekend">
+<!ENTITY addSubscriptionCancel.label "Annuleren">
+<!ENTITY subscription.enabled.label "Ingeschakeld">
+<!ENTITY noSubscriptions.text "U heeft nog geen filterabonnementen toegevoegd. Adblock Plus blokkeert niets zonder filters, gebruik ‘Filterabonnement toevoegen’ om er één toe te voegen.">
+<!ENTITY subscription.update.label "Filters bijwerken">
+<!ENTITY dialog.title "Adblock Plus-filtervoorkeuren">
+<!ENTITY addFilter.label "Fil&amp;ter toevoegen">
+<!ENTITY subscription.minVersion.warning "Dit filterabonnement vereist een nieuwere versie van Adblock Plus, u dient bij te werken naar de nieuwste versie.">
+<!ENTITY subscription.lastDownload.invalidURL "Mislukt, geen geldig adres">
+<!ENTITY backup.error "Er is een fout opgetreden bij het wegschrijven van de filters. Zorg ervoor dat het bestand niet tegen schrijven beveiligd is of wordt gebruikt door een andere toepassing.">
+<!ENTITY filter.moveUp.label "Omhoog">
+<!ENTITY addGroup.label "&amp;Filtergroep toevoegen">
+<!ENTITY filter.edit.label "Bewerken">
+<!ENTITY subscription.showHideFilters.label "Filters weergeven/verbergen">
+<!ENTITY acceptableAds2.label "&amp;Enkele niet-opdringerige advertenties toestaan">
+<!ENTITY addSubscriptionOther.label "Een ander abonnement toevoegen">
+<!ENTITY close.label "Sluiten">
+<!ENTITY sort.none.label "&amp;Ongesorteerd">
+<!ENTITY filter.actions.label "Filteracties">
+<!ENTITY filter.copy.label "Kopiëren">
+<!ENTITY filter.moveDown.label "Omlaag">
+<!ENTITY filter.resetHitCounts.label "Trefferstatistieken opnieuw instellen">
+<!ENTITY readMore.label "Lees meer">
+<!ENTITY subscription.moveUp.label "Omhoog">
+<!ENTITY addSubscription.label "&amp;Filterabonnement toevoegen">
+<!ENTITY subscription.homepage.label "Startpagina">
+<!ENTITY backup.complete.title "Alle filters en abonnementen">
+<!ENTITY restore.own.label "Eigen back-up terugzetten">
+<!ENTITY restore.complete.warning "Al uw filtervoorkeuren worden vervangen door de inhoud van het geselecteerde bestand. Wilt u doorgaan?">
+<!ENTITY filters.tab.label "Aangepaste filters">
+<!ENTITY backup.label "Nieuwe back-up maken">
+<!ENTITY find.label "Z&amp;oeken">
+<!ENTITY subscription.moveDown.label "Omlaag">
+<!ENTITY subscription.lastDownload.connectionError "Mislukt, downloadprobleem">
+<!ENTITY subscription.lastDownload.success "Gelukt">
+<!ENTITY subscription.lastDownload.invalidData "Mislukt, geen geldige filterlijst">
+<!ENTITY filter.paste.label "Plakken">
+<!ENTITY subscription.disabledFilters.enable "Uitgeschakelde filters inschakelen">
+<!ENTITY lasthit.column "&amp;Laatste treffer">
+<!ENTITY subscription.editTitle.label "Titel bewerken">
+<!ENTITY subscription.disabledFilters.warning "Enkele filters in dit abonnement zijn uitgeschakeld.">
+<!ENTITY filter.column "&amp;Filterregel">
+<!ENTITY subscription.lastDownload.label "Laatste download:">
+<!ENTITY viewList.label "Lijst bekijken">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/firstRun.properties
new file mode 100644
index 0000000..309fdcd
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Browse privé door 'tracking' uit te schakelen - verberg uw gegevens voor advertentiebedrijven die al uw surfgedrag zouden volgen.
+firstRun_toggle_off=UIT
+firstRun_feature_tracking=Tracking uitschakelen
+firstRun_feature_malware=Malware Blokkering
+firstRun_title=Adblock plus is geïnstalleerd
+firstRun_acceptableAdsExplanation=Wij zouden websites willen aanmoedigen eenvoudige, niet-opdringerige advertenties te gebruiken. Daarom hebben we <a>strikte richtlijnen</a> opgesteld om acceptabele advertenties te identificeren, die worden getoond onder Standaardinstellingen. Als u alsnog alle advertenties wilt blokkeren, kunt u dit in een paar seconden <a>uitschakelen</a>.
+firstRun_toggle_on=AAN
+firstRun_contributor_credits=Bijdrager Credits
+firstRun_dataCorruptionWarning=Blijft deze pagina verschijnen? <a>Klik hier!</a>
+firstRun_acceptableAdsHeadline=Vervelende advertenties zullen nu worden geblokkeerd
+firstRun_share=Vertel uw vrienden
+firstRun_share_headline=<a>Help ons</a> om van het web een betere plek te maken
+firstRun_features=Adblock Plus kan meer doen dan advertenties blokkeren
+firstRun_feature_malware_description=Maak het browsen veiliger door het blokkeren van bekende malware domeinen.
+firstRun_feature_social_description=Verwijder social media-knoppen (zoals de Facebook "Like" knop) automatisch, omdat die op webpagina's verschijnen en uw surfgedrag volgen.
+firstRun_donate=doneren
+firstRun_donate_label=Steun ons project
+firstRun_feature_social=Verwijder Social Media knoppen
+firstRun_legacySafariWarning=U gebruikt een oude versie van Safari die niet wordt ondersteund door Adblock Plus. Sommige websites kunnen daardoor onjuist worden weergegeven. Wij raden u aan een update uit te voeren naar Safari versie 6.1.1 of hoger (voor Mac OS X 10.8 Mountain Lion), Safari versie 7.0.1 of hoger (voor Mac OS X 10.9 Mavericks) of de laatste versie van Mozilla Firefox, Google Chrome of Opera te gebruiken.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/global.properties
new file mode 100644
index 0000000..15b65fd
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Geen blokkeerbare onderdelen op deze pagina
+action3_tooltip=Klik om Adblock Plus in/uit te schakelen.
+notification_antiadblock_title=Gerichte berichten verbergen?
+type_label_script=script
+filter_elemhide_nocriteria=Geen criteria opgegeven om het te verbergen element te herkennen
+blockingGroup_title=Advertentieblokkaderegels
+whitelisted_tooltip=Adblock Plus is ingeschakeld maar staat uit voor deze pagina.
+type_label_stylesheet=stylesheet
+blocked_count_tooltip=?1? van de ?2?
+type_label_font=lettertype
+type_label_popup=pop-upvenster
+filter_regexp_tooltip=Dit filter is een reguliere expressie of te kort om te kunnen worden geoptimaliseerd. Te veel van dit soort filters kan uw browser traag maken.
+action0_tooltip=Klik om het contextmenu te openen, middelklik om in/uit te schakelen.
+whitelisted_page=Adblock Plus is uitgeschakeld voor deze pagina
+remove_group_warning=Wilt u echt deze groep verwijderen?
+action1_tooltip=Klik om blokkeerbare onderdelen te openen/sluiten, middelklik om in/uit te schakelen.
+type_label_xmlhttprequest=XML-verzoek
+active_tooltip=Adblock Plus is actief, ?1? filterabonnement(en) en ?2? aangepast(e) filter(s) in gebruik.
+type_label_document=document
+type_label_object_subrequest=object-subverzoek
+whitelistGroup_title=Uitzonderingsregels
+disabled_tooltip=Adblock Plus is uitgeschakeld.
+filter_elemhide_duplicate_id=Er kan slechts één ID van het te verbergen element worden opgegeven
+type_label_object=object
+action2_tooltip=Klik om voorkeuren te openen, middelklik om in/uit te schakelen.
+type_label_subdocument=frame
+clearStats_warning=Dit stelt alle filtertrefferstatistieken opnieuw in en schakelt het tellen van filtertreffers uit. Wilt u doorgaan?
+notification_antiadblock_message=Deze website staat er om bekend dat ze berichten laat zien die op Adblock plus gebruikers gericht zijn. Wilt u dat Adblock Plus deze verbergt?
+blocked_count_addendum=(ook op witte lijst: ?1?, verborgen: ?2?)
+subscription_invalid_location=Deze filterlijstlocatie is geen geldige URL en ook geen geldige bestandsnaam.
+type_label_image=afbeelding
+remove_subscription_warning=Weet u zeker dat u dit abonnement wilt verwijderen?
+type_label_other=anders
+mobile_menu_enable=ABP: Inschakelen
+type_label_media=audio/video
+mobile_menu_disable_site=ABP: Uitschakelen op ?1?
+elemhideGroup_title=Elementverbergingsregels
+mobile_menu_enable_site=ABP: Inschakelen op ?1?
+type_label_elemhide=verborgen
+newGroup_title=Nieuwe filtergroep
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/overlay.dtd
new file mode 100644
index 0000000..9537253
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Ja">
+<!ENTITY notification.button.no "&amp;Nee">
+<!ENTITY sync.label "Syn&amp;chroniseer Adblock Plus instellingen">
+<!ENTITY whitelist.site.label "Uitschakelen op ?1?">
+<!ENTITY filters.label "&amp;Filtervoorkeuren">
+<!ENTITY disable.label "Overal uitschakelen">
+<!ENTITY objecttab.title "Blokkeren">
+<!ENTITY objecttab.tooltip "Klik hier om dit object te blokkeren met Adblock Plus">
+<!ENTITY menuitem.label "&amp;Adblock Plus-voorkeuren">
+<!ENTITY objecttabs.label "&amp;Tabs weergeven op Flash en Java">
+<!ENTITY sendReport.label "&amp;Probleem op deze pagina rapporteren">
+<!ENTITY whitelist.page.label "Alleen op deze pagina uitschakelen">
+<!ENTITY context.image.label "Adblock Plus: Afbeelding blokkeren">
+<!ENTITY counthits.label "&amp;Filtertreffers tellen">
+<!ENTITY opensidebar.label "&amp;Blokkeerbare onderdelen openen">
+<!ENTITY notification.button.close "&amp;Sluit">
+<!ENTITY contribute.label "Draag bij aan Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Deelvenster blokkeren">
+<!ENTITY blocked.tooltip "Geblokkeerde onderdelen op deze pagina:">
+<!ENTITY hideplaceholders.label "P&amp;laatshouders van geblokkeerde elementen verbergen">
+<!ENTITY showinstatusbar.label "In &amp;statusbalk weergeven">
+<!ENTITY sidebar.title "Blokkeerbare onderdelen op deze pagina">
+<!ENTITY options.label "&amp;Opties">
+<!ENTITY context.object.label "Adblock Plus: Object blokkeren">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Opnieuw inschakelen op deze pagina">
+<!ENTITY filters.tooltip "Meest actieve filters:">
+<!ENTITY closesidebar.label "&amp;Blokkeerbare onderdelen sluiten">
+<!ENTITY showintoolbar.label "In werk&amp;balk weergeven">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Audio/video blokkeren">
+<!ENTITY subscription.update.label "Filters bijwerken">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/sendReport.dtd
new file mode 100644
index 0000000..90265fb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Onge&amp;daan maken">
+<!ENTITY issues.disabledgroups.description "De volgende filterabonnementen / filtergroepen zijn uitgeschakeld, maar ze hebben mogelijk wel een effect op deze pagina:">
+<!ENTITY showData.label "Rapportgegevens weergeven">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blokkeert te &amp;veel">
+<!ENTITY issues.change.description "Uw configuratie is gewijzigd. Laad de pagina opnieuw om de wijzigingen te testen en een rapport in te dienen als het probleem niet is opgelost door de wijzigingen.">
+<!ENTITY email.label "E-&amp;mailadres:">
+<!ENTITY issues.openPreferences.label "Filtervoorkeuren openen">
+<!ENTITY sendPage.confirmation "Uw rapport is opgeslagen. U kunt het bekijken op het volgende adres:">
+<!ENTITY copyLink.label "Rapport&amp;koppeling kopiëren">
+<!ENTITY issues.nofilters.description "Adblock Plus blokkeert niets op de huidige pagina. Het door u ervaren probleem hangt hoogstwaarschijnlijk niet samen met Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Het door u gemelde probleem is waarschijnlijk al bekend. Meer informatie:">
+<!ENTITY typeSelector.other.description "Selecteer deze optie als u een probleem met Adblock Plus zelf vermoedt in plaats van met de filters.">
+<!ENTITY issues.disabledgroups.enable.label "Filterabonnement / filtergroep inschakelen">
+<!ENTITY typeWarning.override.label "Ik be&amp;grijp het en wil het rapport toch indienen">
+<!ENTITY issues.disabled.enable.label "Adblock Plus inschakelen">
+<!ENTITY update.fixed.description "De updates voor uw filterabonnementen hebben waarschijnlijk het door u gerapporteerde probleem verholpen. Laad de pagina opnieuw en probeer het nog eens, en druk opnieuw op Rapporteren als het probleem aanhoudt.">
+<!ENTITY anonymous.label "&amp;Anonieme bijdrage">
+<!ENTITY reloadButton.label "Pagina opnie&amp;uw laden">
+<!ENTITY recentReports.clear.label "Alle rappor&amp;ten verwijderen">
+<!ENTITY typeSelector.description "Dit venster leidt u door de stappen die nodig zijn voor het indienen van een Adblock Plus-probleemrapport. Selecteer eerst het probleemtype dat u ervaart op deze pagina:">
+<!ENTITY screenshot.remove.label "Gevoelige gegevens ver&amp;wijderen">
+<!ENTITY issues.ownfilters.description "Enkele van de op deze pagina toegepaste filters zijn door een gebruiker gedefinieerd. Schakel de filters uit die mogelijk het probleem hebben veroorzaakt:">
+<!ENTITY update.inProgress.description "Adblock Plus dient uw filterabonnementen bij te werken om te controleren of het probleem niet al is opgelost. Een ogenblik…">
+<!ENTITY sendPage.retry.label "Opnieuw verzenden">
+<!ENTITY data.label "Ra&amp;pportgegevens:">
+<!ENTITY recentReports.label "Uw onlangs ingediende rapporten">
+<!ENTITY typeWarning.description "U hebt aangegeven dat u een algemeen probleem met Adblock Plus wilt rapporteren in plaats van een probleem met de filters. Merk op dat dergelijke problemen het beste kunnen worden gerapporteerd in het [link]Adblock Plus-forum[/link]. U dient de probleemrapportage alleen te gebruiken om een bestaande discussie aan te vullen, aangezien niemand uw rapport zal opmerken tenzij u een koppeling ernaartoe geeft. De automatisch aangemaakte koppeling wordt weergegeven na indienenvan het rapport.">
+<!ENTITY issues.disabled.description "Adblock Plus is uitgeschakeld, in de huidige staat zal het niets blokkeren.">
+<!ENTITY attachExtensions.label "Voeg een lijst met actieve e&amp;xtensies toe aan het rapport voor het geval conflicterende add-ons de oorzaak van het probleem zijn">
+<!ENTITY issues.nosubscriptions.add.label "Filterabonnement toevoegen">
+<!ENTITY issues.disabledfilters.enable.label "Filter inschakelen">
+<!ENTITY issues.override.label "De &amp;configuratie is juist, doorgaan met rapportage">
+<!ENTITY issues.nosubscriptions.description "Het lijkt er op dat u geen abonnement heeft op een filterlijst die automatisch ongewenste inhoud van websites verwijdert.">
+<!ENTITY typeSelector.falsePositive.description "Selecteer deze optie als de pagina belangrijke inhoudt niet weergeeft, onjuist wordt weergegeven of niet goed werkt. U kunt bepalen of Adblock Plus de oorzaak hiervan is door het tijdelijk uit te schakelen.">
+<!ENTITY typeSelector.other.label "&amp;Overige problemen">
+<!ENTITY emailComment.label "We raden u aan een geldig e-mailadres in te voeren, zodat we contact met u op kunnen nemen als er vragen zijn over uw verslag. Hierdoor kunnen wij uw bijdragen ook herkennen en ze hoger prioriteren.">
+<!ENTITY issues.whitelist.remove.label "Adblock Plus weer inschakelen op deze pagina">
+<!ENTITY outdatedSubscriptions.description "De volgende filterabonnementen zijn ten minste twee weken niet meer bijgewerkt. Werk ze eerst bij voordat u een rapport indient, het probleem is mogelijk al verholpen.">
+<!ENTITY dataCollector.description "Wacht enkele momenten terwijl Adblock Plus de benodigde gegevens verzamelt.">
+<!ENTITY sendButton.label "Rapport ver&amp;zenden">
+<!ENTITY comment.label "Opme&amp;rking (optioneel):">
+<!ENTITY sendPage.errorMessage "De poging om het rapport te verzenden is mislukt met foutcode ‘?1?’. Controleer uw internetverbinding en probeer het opnieuw. Als het probleem aanhoudt, vraag dan om hulp op het [link]Adblock Plus-forum[/link].">
+<!ENTITY showRecentReports.label "Onlangs ingediende rapporten weergeven">
+<!ENTITY commentPage.heading "Opmerking toevoegen">
+<!ENTITY update.start.label "Nu bijwerken">
+<!ENTITY issues.disabledfilters.description "De volgende filters zijn uitgeschakeld, maar ze hebben mogelijk wel een effect op deze pagina:">
+<!ENTITY screenshot.description "Dezelfde pagina kan er verschillend uitzien voor verschillende personen. We begrijpen het probleem misschien beter als u een schermafbeelding toevoegt aan uw rapport. U kunt secties met gevoelige informatie verwijderen en gebieden waar het probleem zich voordoet markeren. Klik op de bijbehorende knop om dit te doen en selecteer een sectie van de afbeelding met uw muis.">
+<!ENTITY screenshot.attach.label "Een pagina-afbeelding bi&amp;j het rapport bijvoegen">
+<!ENTITY issues.whitelist.description "Adblock Plus is momenteel uitgeschakeld op de door u gerapporteerde pagina. Schakel het weer in en herlaad de pagina voordat u het rapport indient om te helpen bij het onderzoeken van dit probleem.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus blokk&amp;eert een advertentie niet">
+<!ENTITY typeSelector.heading "Selecteer probleemtype">
+<!ENTITY anonymity.warning "We kunnen niet met u in contact komen en zullen uw verslag daarom waarschijnlijk lager prioriteren.">
+<!ENTITY wizard.title "Probleemrapportage">
+<!ENTITY issues.ownfilters.disable.label "Filter uitschakelen">
+<!ENTITY commentPage.description "In het onderstaande tekstveld kunt u een opmerking toevoegen om ons te helpen het probleem te begrijpen. Deze stap is optioneel maar wordt aanbevolen als het probleem niet evident is. U kunt de rapportgegevens ook nakijken voordat u het rapport verstuurt.">
+<!ENTITY comment.lengthWarning "De lengte van uw opmerking overschrijdt 1000 tekens. Alleen de eerste 1000 tekens worden verzonden.">
+<!ENTITY typeSelector.falseNegative.description "Selecteer deze optie als een advertentie wordt weergegeven ondanks het feit dat Adblock Plus is ingeschakeld.">
+<!ENTITY sendPage.waitMessage "Een ogenblik terwijl Adblock Plus uw rapport indient.">
+<!ENTITY dataCollector.heading "Welkom bij de probleemrapportage">
+<!ENTITY screenshot.heading "Schermafbeelding toevoegen">
+<!ENTITY sendPage.heading "Rapport verzenden">
+<!ENTITY issues.subscriptionCount.description "Het lijkt er op dat u op te veel filterabonnementen geabonneerd bent. Dit is niet aanbevolen, want het verhoogt de kans op problemen. Wij kunnen ook geen probleemmeldingen accepteren, omdat het niet duidelijk is van welk filterabonnement de auteur actie dient te ondernemen. Verwijder alstublieft alle filterabonnementen op de hoogst nodige na en controleer of het probleem dan nog steeds optreedt.">
+<!ENTITY screenshot.mark.label "Het problee&amp;m markeren">
+<!ENTITY privacyPolicy.label "Privacybeleid">
+<!ENTITY issues.description "Adblock plus heeft problemen met uw configuratie gedetecteerd die mogelijk verantwoordelijk zijn voor dit probleem of het onderzoeken van het rapport bemoeilijken.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/sidebar.dtd
new file mode 100644
index 0000000..d715dff
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Randen laten knipperen">
+<!ENTITY address.label "Adres">
+<!ENTITY context.open.label "Openen in een nieuw tabblad">
+<!ENTITY type.label "Type">
+<!ENTITY tooltip.filterSource.label "Filterbron:">
+<!ENTITY noitems.label "Geen blokkeerbare onderdelen">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Grootte:">
+<!ENTITY reattach.label "Vastkoppelen">
+<!ENTITY search.label "&amp;Zoeken:">
+<!ENTITY docDomain.thirdParty "(derden)">
+<!ENTITY filterSource.label "Filterbron">
+<!ENTITY tooltip.docDomain.label "Documentbron:">
+<!ENTITY context.copy.label "Adres kopiëren">
+<!ENTITY tooltip.type.label "Type:">
+<!ENTITY context.disablefilter.label "Filter ?1? uitschakelen">
+<!ENTITY context.copyFilter.label "Filter kopiëren">
+<!ENTITY context.block.label "Dit onderdeel blokkeren">
+<!ENTITY context.enablefilter.label "Filter ?1? inschakelen">
+<!ENTITY detach.label "Loskoppelen">
+<!ENTITY whitelisted.label "Toegestane pagina">
+<!ENTITY context.disablefilteronsite.label "Filter uitschakelen op ?1?">
+<!ENTITY detached.title "Adblock Plus: Blokkeerbare onderdelen (losgekoppeld)">
+<!ENTITY docDomain.firstParty "(rechtstreeks)">
+<!ENTITY tooltip.type.whitelisted "(toegestaan)">
+<!ENTITY tooltip.filter.label "Toegepast filter:">
+<!ENTITY tooltip.filter.disabled "(uitgeschakeld)">
+<!ENTITY context.editfilter.label "Toegepast filter bewerken">
+<!ENTITY tooltip.type.blocked "(geblokkeerd)">
+<!ENTITY size.label "Grootte">
+<!ENTITY context.whitelist.label "Uitzonderingsregel voor dit onderdeel toevoegen">
+<!ENTITY context.selectAll.label "Alles selecteren">
+<!ENTITY state.label "Status">
+<!ENTITY docDomain.label "Documentbron">
+<!ENTITY tooltip.address.label "Adres:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/subscriptionSelection.dtd
new file mode 100644
index 0000000..cfc0f76
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Filterabonnement “?1?†oo&amp;k toevoegen">
+<!ENTITY list.download.failed "Adblock Plus kan de lijst met abonnementen niet ophalen.">
+<!ENTITY list.download.retry "Opnieuw proberen">
+<!ENTITY title.label "A&amp;bonnementstitel:">
+<!ENTITY list.download.website "Website bekijken">
+<!ENTITY supplementMessage "Dit filterabonnement is bedoeld om samen gebruikt te worden met het filterabonnement “?1?â€, dat u nog niet gebruikt.">
+<!ENTITY viewList.label "Filters bekijken">
+<!ENTITY visitHomepage.label "Startpagina bezoeken">
+<!ENTITY addSubscription.label "Abonneren">
+<!ENTITY dialog.title "Adblock Plus filterabonnement toevoegen">
+<!ENTITY location.label "Fi&amp;lterlijstlocatie:">
+<!ENTITY fromWeb.description "Bevestig a.u.b. dat u dit filterabonnement wilt toevoegen. U kunt de abonnementstitel of -locatie wijzigen voor toevoegen.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/composer.dtd
new file mode 100644
index 0000000..37e1edc
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "na &amp;końcu adresu">
+<!ENTITY domainRestriction.label "Ogranicz do dom&amp;eny:">
+<!ENTITY collapse.default.no.label "Użyj domyślnej (nie)">
+<!ENTITY firstParty.label "Tylko pie&amp;rwszy człon">
+<!ENTITY preferences.label "Wyświetl istniejące &amp;filtry…">
+<!ENTITY pattern.label "Poszukaj wzorca">
+<!ENTITY thirdParty.label "Tylko trze&amp;ci człon">
+<!ENTITY filter.label "&amp;Nowy filtr:">
+<!ENTITY collapse.label "&amp;Zwiń zablokowane:">
+<!ENTITY match.warning "Podany wzorzec nie pasuje do żadnego blokowanego/dozwolonego adresu i nie będzie miał zastosowania.">
+<!ENTITY anchor.start.label "na &amp;poczÄ…tku adresu">
+<!ENTITY matchCase.label "&amp;Uwzględniaj wielkość liter">
+<!ENTITY custom.pattern.label "Wła&amp;sny:">
+<!ENTITY unselectAllTypes.label "Odznacz wszystko">
+<!ENTITY type.whitelist.label "Reguła &amp;wyjątku">
+<!ENTITY regexp.warning "Podany wzorzec będzie interpretowany jako wyrażenie regularne, które nie może być skutecznie przetwarzane przez Adblock Plusa i może powodować spowolnienie działania przeglądarki. Jeśli nie zamierzasz używać wyrażenia regularnego, dodaj gwiazdkę (*) na końcu wzorca.">
+<!ENTITY dialog.title "Dodawanie reguły filtra">
+<!ENTITY basic.label "WyglÄ…d podstawowy">
+<!ENTITY type.filter.label "Filtr &amp;blokujÄ…cy">
+<!ENTITY types.label "Zastosuj do typów:">
+<!ENTITY shortpattern.warning "Podany wzorzec jest zbyt krótki, by go zoptymalizować i może spowolnić działanie przeglądarki. Zaleca się dla tego filtra wybrać dłuższy ciąg znaków, by umożliwić Adblock Plusowi bardziej efektywne zastosowanie tego filtra.">
+<!ENTITY collapse.yes.label "Tak">
+<!ENTITY anchors.label "Akceptuj tylko wzorzec:">
+<!ENTITY collapse.default.yes.label "Użyj domyślnej (tak)">
+<!ENTITY domainRestriction.help "Użyj tej opcji do określania jednej lub kilku domen, oddzielając ich nazwy znakiem (|). Filtr będzie stosowany jedynie dla wybranych domen. Znak tyldy (~) umieszczony przed nazwą domeny wskazuje, że filtr nie zostanie zastosowany w tej domenie.">
+<!ENTITY accept.label "Dodaj filtr">
+<!ENTITY options.label "Opcje">
+<!ENTITY disabled.warning "Adblock Plus jest aktualnie wyłączony. Możesz nadal dodawać filtry, ale nie będą one działały do czasu [link]włączenia Adblock Plusa[/link].">
+<!ENTITY anchor.start.flexible.label "na p&amp;oczÄ…tku nazwy domeny">
+<!ENTITY collapse.no.label "Nie">
+<!ENTITY selectAllTypes.label "Zaznacz wszystko">
+<!ENTITY advanced.label "WyglÄ…d zaawansowany">
+<!ENTITY pattern.explanation "Wzorzec może być częścią adresu – gwiazdka (*) działa jako wieloznacznik. Filtr będzie stosowany tylko w adresach pasujących do tego wzorca.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/filters.dtd
new file mode 100644
index 0000000..3d08e0f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Wszystkie własne filtry zostaną zastąpione zawartością wybranego pliku. Czy chcesz kontynuować?">
+<!ENTITY slow.column "&amp;Wolne filtry">
+<!ENTITY enabled.column "A&amp;ktywny">
+<!ENTITY subscription.lastDownload.checksumMismatch "Nie powiodło się – niepoprawna suma kontrolna">
+<!ENTITY noFiltersInGroup.text "Wybrana grupa jest pusta">
+<!ENTITY subscription.actions.label "Czynności">
+<!ENTITY filter.selectAll.label "Zaznacz wszystko">
+<!ENTITY backupButton.label "&amp;Tworzenie i odtwarzanie kopii">
+<!ENTITY restore.minVersion.warning "Ostrzeżenie! Plik został utworzony za pomocą najnowszej wersji Adblock Plusa. Przed odtworzeniem zawartości tego pliku, należy zainstalować najnowszą wersję Adblock Plusa.">
+<!ENTITY restore.error "Nie można przetworzyć danych filtra. Może to nie jest plik kopii zapasowej Adblock Plusa?">
+<!ENTITY sort.ascending.label "Kierunek sortow&amp;ania A &gt; Z">
+<!ENTITY sort.label "&amp;Sortuj wg">
+<!ENTITY subscription.source.label "Zawartość zestawu">
+<!ENTITY hitcount.column "&amp;Użycie">
+<!ENTITY noFilters.text "Nie masz jeszcze żadnych własnych filtrów.">
+<!ENTITY backup.custom.title "Tylko własne filtry">
+<!ENTITY subscription.external.label "Zaktualizowany przez inne rozszerzenie">
+<!ENTITY subscription.delete.label "Usuń">
+<!ENTITY noGroupSelected.text "Aby filtry mogły być wyświetlane, należy najpierw wybrać grupę.">
+<!ENTITY filter.cut.label "Wytnij">
+<!ENTITY restore.default.label "Odtwórz kopię z dnia ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Pobieranie…">
+<!ENTITY subscriptions.tab.label "Zestawy filtrów">
+<!ENTITY sort.descending.label "Kierunek sortowania &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Czy na pewno chcesz usunąć wszystkie wybrane filtry?">
+<!ENTITY filter.delete.label "Usuń">
+<!ENTITY addSubscriptionAdd.label "Dodaj">
+<!ENTITY viewMenu.label "Widok">
+<!ENTITY subscription.lastDownload.unknown "nieznane">
+<!ENTITY addSubscriptionCancel.label "Anuluj">
+<!ENTITY subscription.enabled.label "Aktywny">
+<!ENTITY noSubscriptions.text "Jeszcze nie dodano żadnego zestawu filtrów. Adblock Plus nie może nic blokować bez filtrów. NaciÅ›nij przycisk „Dodaj zestaw filtrów…â€, by dodać jakiÅ› filtr.">
+<!ENTITY subscription.update.label "Aktualizuj filtry">
+<!ENTITY dialog.title "Add Adblock Plus – ustawienia filtrów">
+<!ENTITY addFilter.label "Dodaj fi&amp;ltr">
+<!ENTITY subscription.minVersion.warning "Ten zestaw filtrów działa z najnowszą wersją Adblock Plusa. Zaktualizuj Adblock Plusa.">
+<!ENTITY subscription.lastDownload.invalidURL "Nie powiodło się – nieprawidłowy adres">
+<!ENTITY backup.error "W trakcie zapisu filtrów wystąpił błąd. Sprawdź, czy czasami plik nie ma zabezpieczenia przed zapisem lub nie jest używany przez inną aplikację.">
+<!ENTITY filter.moveUp.label "Przenieś w górę">
+<!ENTITY addGroup.label "Dodaj &amp;grupę filtrów">
+<!ENTITY filter.edit.label "Edytuj">
+<!ENTITY subscription.showHideFilters.label "Wyświetl/ukryj filtry">
+<!ENTITY acceptableAds2.label "Zezwalaj na nie natrętne rekla&amp;my">
+<!ENTITY addSubscriptionOther.label "Wybierz inny zestaw">
+<!ENTITY close.label "Zamknij">
+<!ENTITY sort.none.label "Ni&amp;eposortowane">
+<!ENTITY filter.actions.label "Czynności filtrów">
+<!ENTITY filter.copy.label "Kopiuj">
+<!ENTITY filter.moveDown.label "Przenieś w dół">
+<!ENTITY filter.resetHitCounts.label "Resetuj statystyki użycia">
+<!ENTITY readMore.label "Dowiedz się więcej">
+<!ENTITY subscription.moveUp.label "Przenieś w górę">
+<!ENTITY addSubscription.label "&amp;Dodaj zestaw filtrów">
+<!ENTITY subscription.homepage.label "Strona domowa">
+<!ENTITY backup.complete.title "Wszystkie filtry i zestawy">
+<!ENTITY restore.own.label "Odtwórz własną kopię">
+<!ENTITY restore.complete.warning "Wszystkie ustawienia filtrów zostaną zastąpione zawartością wybranego pliku. Czy chcesz kontynuować?">
+<!ENTITY filters.tab.label "Własne filtry">
+<!ENTITY backup.label "Utwórz nową kopię">
+<!ENTITY find.label "Z&amp;najdź">
+<!ENTITY subscription.moveDown.label "Przenieś w dół">
+<!ENTITY subscription.lastDownload.connectionError "Nie powiodło się – błąd pobierania">
+<!ENTITY subscription.lastDownload.success "Zakończono pomyślnie">
+<!ENTITY subscription.lastDownload.invalidData "Nie powiodło się – nieprawidłowy zestaw filtrów">
+<!ENTITY filter.paste.label "Wklej">
+<!ENTITY subscription.disabledFilters.enable "Włącz wyłączone filtry">
+<!ENTITY lasthit.column "&amp;Ostatnie użycie">
+<!ENTITY subscription.editTitle.label "Edytuj nazwÄ™ zestawu">
+<!ENTITY subscription.disabledFilters.warning "Niektóre filtry w tym zestawie są wyłączone.">
+<!ENTITY filter.column "&amp;Reguła filtru">
+<!ENTITY subscription.lastDownload.label "Ostatnie pobieranie:">
+<!ENTITY viewList.label "Zobacz listÄ™">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/firstRun.properties
new file mode 100644
index 0000000..dee4d0f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Przeglądaj, zachowując prywatność poprzez wyłączenie śledzenia, ukrywając swoje ślady przed firmami reklamowymi, które chciałyby śledzić każdy twój ruch.
+firstRun_toggle_off=WYÅ.
+firstRun_feature_tracking=Wyłączenie śledzenia
+firstRun_feature_malware=Blokowanie złośliwego oprogramowania
+firstRun_title=Adblock Plus został zainstalowany
+firstRun_toggle_on=WÅ.
+firstRun_acceptableAdsExplanation=Chcielibyśmy zachęcić witryny do używania prostych, dyskretnych reklam. Dlatego mamy zdefiniowane<a> ścisłe wytyczne </ a>określające akceptowalne reklamy wyświetlane na podstawie tych ustawień. Jeśli chcesz blokować każdą reklamę, możesz tę funkcję <a> wyłączyć </ a> w ciągu kilku sekund.
+firstRun_contributor_credits=Podziękowania dla współtwórców
+firstRun_dataCorruptionWarning=Czy ta strona ma być wyświetlana? <a>Kliknij tutaj!</a>
+firstRun_acceptableAdsHeadline=Irytujące reklamy będą teraz blokowane
+firstRun_share=Powiedz znajomym
+firstRun_share_headline=<a>Pomóż nam</a> uczynić internet lepszym miejscem
+firstRun_feature_social_description=Automatycznie pozbÄ…dź siÄ™ przycisków dodawanych przez media spoÅ‚ecznoÅ›ciowe, takich jak facebookowy „LubiÄ™ to!â€, które Å›ledzÄ… twoje zachowanie.
+firstRun_filterlistsReinitializedWarning=Wygląda na to, że w wyniku błędu wszystkie filtry zostały usunięte i nie udało się ich przywrócić z kopii zapasowej, dlatego twoje filtry i ustawienia akceptowalnych reklam zostały zresetowane. Sprawdź swoje listy filtrów i ustawienia akceptowalnych reklam w <a>opcjach Adblock Plusa</a>.
+firstRun_feature_malware_description=Spraw, by twoje przeglądanie było bardziej bezpieczne, blokując znane domeny ze złośliwym oprogramowaniem.
+firstRun_features=Adblock Plus umożliwia więcej niż blokowanie reklam
+firstRun_donate=Wspomóż nas
+firstRun_donate_label=Wesprzyj nasz projekt
+firstRun_feature_social=Usuwanie przycisków serwisów społecznościowych
+firstRun_legacySafariWarning=Używasz starej, nie obsługiwanej już przez Adblock Plusa wersji Safari. Może to powodować nieprawidłowe działanie lub zakłócać przeglądanie niektórych witryn. Zalecamy uaktualnienie Safari w systemie OS X Mountain Lion do wersji 6.1.1 lub nowszej, lub do wersji 7.0.1 lub nowszej w systemie OS X 10.9 Maverick. Możesz także użyć najnowszych wersji przeglądarek Firefox, Chrome lub Opera.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/global.properties
new file mode 100644
index 0000000..36c805e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Nieblokowalne elementy na aktywnej stronie
+action3_tooltip=Kliknij l.p.m., aby włączyć/wyłączyć Adblock Plus
+notification_antiadblock_title=Ukrywanie ukierunkowanych informacji
+type_label_script=skrypt
+filter_elemhide_nocriteria=Nie określono kryteriów rozpoznania elementu do ukrycia
+blockingGroup_title=Reguły blokowania reklam
+whitelisted_tooltip=Adblock Plus jest aktywny, ale wyłączony na oglądanej stronie.
+type_label_stylesheet=arkusz stylów
+blocked_count_tooltip=?1? z ?2?
+type_label_font=czcionka
+type_label_popup=wyskakujÄ…ce okno
+filter_regexp_tooltip=Ten filtr jest wyrażeniem regularnym albo jest za krótki, aby go zoptymalizować. Zbyt dużo filtrów tego rodzaju może powodować spowolnienie przeglądania internetu.
+action0_tooltip=Kliknij l.p.m., aby otworzyć menu kontekstowe, ś.p.m., aby włączyć/wyłączyć
+whitelisted_page=Adblock Plus został wyłączony dla tej strony
+remove_group_warning=Czy na pewno chcesz usunąć tę grupę?
+action1_tooltip=Kliknij l.p.m., aby otworzyć/zamknąć listę blokowalnych elementów, ś.p.m., aby włączyć/wyłączyć
+type_label_xmlhttprequest=żądanie XML
+active_tooltip=Adblock Plus jest aktywny. Subskrybowane zestawy: ?1? i własne filtry: ?2?.
+type_label_document=dokument
+type_label_object_subrequest=subżądanie obiektu
+whitelistGroup_title=Reguły wyjątków
+disabled_tooltip=Adblock Plus jest wyłączony
+filter_elemhide_duplicate_id=Może być określony tylko jeden ID elementu do ukrycia
+type_label_object=obiekt
+action2_tooltip=Kliknij l.p.m., aby otworzyć opcje, ś.p.m., aby włączyć/wyłączyć
+type_label_subdocument=ramka
+clearStats_warning=Spowoduje to zresetowanie wszystkich statystyk użycia filtra i wyłączenie zliczania kolejnych użyć. Czy chcesz kontynuować?
+notification_antiadblock_message=Ta witryna wyświetla użytkownikom Adblock Plusa ukierunkowane dla nich informacje. Czy chcesz, by Adblock Plus ukrywał tego typu informacje?
+blocked_count_addendum=(dozwolone:?1?, ukryte:?2?)
+subscription_invalid_location=Lokalizacja zestawu filtrów ma niewłaściwą nazwę pliku, albo adres URL
+type_label_image=obrazek
+remove_subscription_warning=Czy chcesz usunąć ten zestaw?
+type_label_other=inne
+mobile_menu_enable=ABP:Włącz
+type_label_media=audio/wideo
+mobile_menu_disable_site=ABP:Wyłącz na ?1?
+elemhideGroup_title=Reguły ukrywania elementów
+mobile_menu_enable_site=ABP:Włącz na ?1?
+type_label_elemhide=ukryty
+newGroup_title=Nowa grupa filtrów
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/overlay.dtd
new file mode 100644
index 0000000..115752e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Tak">
+<!ENTITY notification.button.no "&amp;Nie">
+<!ENTITY sync.label "&amp;Synchronizuj ustawienia Adblock Plusa">
+<!ENTITY whitelist.site.label "Wyłącz blokowanie na ?1?">
+<!ENTITY filters.label "&amp;Ustawienia filtra">
+<!ENTITY disable.label "Wyłącz wszędzie">
+<!ENTITY objecttab.title "Zablokuj">
+<!ENTITY objecttab.tooltip "Kliknij tutaj, aby zablokować ten obiekt">
+<!ENTITY menuitem.label "&amp;Adblock Plus - ustawienia">
+<!ENTITY objecttabs.label "Wyświetlaj przycis&amp;ki blokowania na elementach Flasha i Javy">
+<!ENTITY sendReport.label "&amp;Zgłoś problem na tej stronie">
+<!ENTITY whitelist.page.label "Wyłącz blokowanie tylko na tej stronie">
+<!ENTITY context.image.label "Zablokuj obrazek">
+<!ENTITY counthits.label "Zli&amp;czaj użycie filtra">
+<!ENTITY opensidebar.label "Otwórz listę &amp;blokowalnych elementów">
+<!ENTITY notification.button.close "&amp;Zamknij">
+<!ENTITY contribute.label "Wspomóż Adblock Plusa">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Zablokuj ramkÄ™">
+<!ENTITY blocked.tooltip "Zablokowane elementy na tej stronie:">
+<!ENTITY hideplaceholders.label "Ukrywaj za&amp;mienniki blokowanych elementów">
+<!ENTITY showinstatusbar.label "&amp;Wyświetlaj ikonę Adblock Plusa na pasku stanu">
+<!ENTITY sidebar.title "Blokowalne elementy na aktywnej stronie">
+<!ENTITY options.label "&amp;Opcje">
+<!ENTITY context.object.label "Zablokuj obiekt">
+<!ENTITY context.removeWhitelist.label "Włącz ponownie na tej stronie">
+<!ENTITY filters.tooltip "Najczęściej stosowane filtry:">
+<!ENTITY closesidebar.label "Zamknij listę blokowal&amp;nych elementów">
+<!ENTITY showintoolbar.label "Wyświetlaj ikonę Adblock Plusa na pasku na&amp;rzędzi">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Zablokuj wideo/audio">
+<!ENTITY subscription.update.label "Aktualizuj filtry">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/sendReport.dtd
new file mode 100644
index 0000000..7ab04d9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Cofnij">
+<!ENTITY issues.disabledgroups.description "Następujące zestawy filtrów/grupy filtrów są wyłączone, ale mogą oddziaływać na tę stronę:">
+<!ENTITY showData.label "Wyświetl dane zgłoszenia">
+<!ENTITY typeSelector.falsePositive.label "&amp;Adblock Plus zbyt dużo blokuje">
+<!ENTITY issues.change.description "Twoja konfiguracja została zmieniona. By wykonać test zmian, odśwież stronę i wyślij zgłoszenie, jeśli dokonane zmiany nie rozwiązały problemu.">
+<!ENTITY email.label "Em&amp;ail:">
+<!ENTITY issues.openPreferences.label "Otwórz ustawienia filtra">
+<!ENTITY sendPage.confirmation "Zgłoszenie zostało zapisane. Możesz zobaczyć je pod następującym adresem:">
+<!ENTITY copyLink.label "&amp;Kopiuj odnośnik zgłoszenia">
+<!ENTITY issues.nofilters.description "Na aktualnej stronie Adblock Plus nic nie blokuje. Obserwowany problem najprawdopodobniej nie jest zwiÄ…zany z Adblock Plusem.">
+<!ENTITY sendPage.knownIssue "Prawdopodobnie zgłaszany problem jest już znany. Więcej informacji:">
+<!ENTITY typeSelector.other.description "Wybierz tę opcję, jeśli podejrzewasz, że problem związany jest z samym Adblock Plusem, a nie z filtrami.">
+<!ENTITY issues.disabledgroups.enable.label "Włącz zestawy filtrów/grupy filtrów">
+<!ENTITY typeWarning.override.label "Rozu&amp;miem i mimo wszystko chcę wysłać zgłoszenie">
+<!ENTITY issues.disabled.enable.label "Włącz Adblock Plusa">
+<!ENTITY update.fixed.description "Aktualizacja zestawu filtrów prawdopodobnie rozwiązała zgłaszany problem. Odśwież stronę i spróbuj ponownie, naciśnij przycisk Zgłoś, jeśli problem nadal występuje.">
+<!ENTITY anonymous.label "&amp;Wyślij anonimowo">
+<!ENTITY reloadButton.label "&amp;Odśwież stronę">
+<!ENTITY recentReports.clear.label "&amp;Usuń wszystkie zgłoszenia">
+<!ENTITY typeSelector.description "Tutaj możesz wykonać czynności niezbędne do wysłania zgłoszenia problemu związanego z Adblock Plusem. Najpierw wybierz typ problemu, jaki występuje na tej stronie:">
+<!ENTITY screenshot.remove.label "&amp;Ukryj poufne dane">
+<!ENTITY issues.ownfilters.description "Część filtrów stosowanych na tej stronie jest zdefiniowanych przez ciebie. Wyłącz filtry, które mogły spowodować problem:">
+<!ENTITY update.inProgress.description "Aby upewnić się, że problem został już rozwiązany, Adblock Plus musi zaktualizować twój zestaw filtrów. Proszę czekać…">
+<!ENTITY sendPage.retry.label "Wyślij ponownie">
+<!ENTITY data.label "Dan&amp;e zgłoszenia">
+<!ENTITY recentReports.label "Twoje ostatnio wysłane zgłoszenia">
+<!ENTITY typeWarning.description "Chcesz zgłosić ogólny problem dotyczący Adblock Plusa, a nie problem z filtrami. Tego rodzaju problemy najlepiej jest zgłaszać na [link]forum Adblock Plusa[/link]. Reportera błędów powinno się używać do uzupełnienia dyskusji na forum, ponieważ nikt nie zauważy zgłoszenia, chyba że dołączysz do niego odnośnik. Automatycznie generowany odnośnik zostanie dołączony po wysłaniu zgłoszenia.">
+<!ENTITY issues.disabled.description "Adblock Plus jest wyłączony. Obecnie nic nie będzie blokował.">
+<!ENTITY attachExtensions.label "Dołącz do zgłoszenia listę aktywnych &amp;rozszerzeń, gdy przyczyną problemu jest konflikt z innym rozszerzeniem.">
+<!ENTITY issues.nosubscriptions.add.label "Subskrybuj filtry">
+<!ENTITY issues.disabledfilters.enable.label "Włącz filtr">
+<!ENTITY issues.override.label "&amp;Konfiguracja jest prawidłowa – kontynuuj zgłoszenie">
+<!ENTITY issues.nosubscriptions.description "Wygląda na to, że nie subskrybujesz żadnej gotowej listy filtrów, które automatycznie usuwają niepożądaną zawartość ze stron internetowych.">
+<!ENTITY typeSelector.falsePositive.description "Wybierz tę opcję, jeśli strona nie zawiera ważnych treści, jest wyświetlana nieprawidłowo lub działa niepoprawnie. Możesz określić, czy Adblock Plus jest przyczyną problemu, wyłączając go chwilowo.">
+<!ENTITY typeSelector.other.label "&amp;Inny problem">
+<!ENTITY emailComment.label "Zachęcamy do podania prawidłowego adresu e-mail, abyśmy mogli skontaktować się z tobą w przypadku, gdy może to ułatwić rozwiązanie problemu. Pozwoli to również rozpoznać naszych współpracowników i nadać ich raportom wyższy priorytet.">
+<!ENTITY issues.whitelist.remove.label "Włącz ponownie Adblock Plusa na tej stronie">
+<!ENTITY outdatedSubscriptions.description "Od dwóch tygodni następujące zestawy filtrów nie były aktualizowane. Przed wysłaniem zgłoszenia zaktualizuj te zestawy. Być może rozwiąże to twój problem.">
+<!ENTITY dataCollector.description "Proszę poczekać kilka chwil, aż Adblock Plus zbierze wymagane dane.">
+<!ENTITY sendButton.label "&amp;Wyślij zgłoszenie">
+<!ENTITY comment.label "O&amp;bjaśnienia (opcjonalne):">
+<!ENTITY sendPage.errorMessage "Próba wysłania zgłoszenia nie powiodła się z powodu „?1?†Sprawdź połączenie z Internetem i ponów próbę. Jeśli problem będzie nadal występował, poproś o pomoc na [link]forum Adblock Plusa[/link].">
+<!ENTITY showRecentReports.label "Wyświetl ostatnio wysłane zgłoszenia">
+<!ENTITY commentPage.heading "Dodaj objaśnienie">
+<!ENTITY update.start.label "Aktualizuj teraz">
+<!ENTITY issues.disabledfilters.description "Następujące filtry są wyłączone, ale mogą oddziaływać na tę stronę:">
+<!ENTITY screenshot.description "Ta sama strona może wyglądać różnie dla różnych osób. Dołączenie zrzutu ekranu do zgłoszenia może pomóc nam w zrozumieniu problemu. Możesz usunąć miejsca, gdzie występują informacje poufne, jak również zaznaczyć obszary, gdzie problem jest zauważalny. W tym celu naciśnij odpowiedni przycisk i wybierz fragment obrazka za pomocą myszy.">
+<!ENTITY screenshot.attach.label "Dołącz obrazek &amp;strony do zgłoszenia">
+<!ENTITY issues.whitelist.description "Adblock Plus jest obecne wyłączony na zgłaszanej stronie. By ułatwić zbadanie tego problemu, przed jego zgłoszeniem włącz ponownie Adblock Plusa i odśwież stronę.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus nie blokuje &amp;reklam">
+<!ENTITY typeSelector.heading "Wybierz typ problemu">
+<!ENTITY anonymity.warning "Nie będziemy w stanie się z tobą skontaktować, co może spowodować nadanie raportowi niższego priorytetu.">
+<!ENTITY wizard.title "Reporter problemów">
+<!ENTITY issues.ownfilters.disable.label "Wyłącz filtr">
+<!ENTITY commentPage.description "W poniższym polu tekstowym możesz podać objaśnienie, które pomoże nam zrozumieć problem. Jest to opcjonalne, ale zalecane, jeśli problem nie jest oczywisty. Możesz również sprawdzić dane zawarte w zgłoszeniu przed jego wysłaniem.">
+<!ENTITY comment.lengthWarning "Treść objaśnienia przekroczyła dopuszczalny limit 1000 znaków. Zostanie wysłane tylko pierwsze 1000 znaków.">
+<!ENTITY typeSelector.falseNegative.description "Wybierz tę opcję, jeśli reklama jest wyświetlana pomimo tego, że Adblock Plus jest włączony.">
+<!ENTITY sendPage.waitMessage "Wysyłanie zgłoszenia… Proszę czekać.">
+<!ENTITY dataCollector.heading "Witamy w reporterze problemów">
+<!ENTITY screenshot.heading "Dołącz zrzut ekranu">
+<!ENTITY sendPage.heading "Wyślij zgłoszenie">
+<!ENTITY issues.subscriptionCount.description "Wydaje się, że wybrano subskrypcje zbyt dużej liczby filtrów. Nie jest to zalecane, ponieważ zwiększy prawdopodobieństwo wystąpienia problemów. Jeśli w związku z tym wystąpią problemy, nie będziemy przyjmowali zgłoszeń tych problemów, ponieważ nie będziemy w stanie rozpoznać autora filtrów i powiadomić go, by podjął odpowiednie działania. Usuń wszystkie subskrybowane filtry i sprawdź czy problem nadal występuje.">
+<!ENTITY screenshot.mark.label "O&amp;znacz problem">
+<!ENTITY privacyPolicy.label "Zasady ochrony prywatności">
+<!ENTITY issues.description "Adblock Plus wykrył problemy z twoją konfiguracją, które mogą być odpowiedzialne za powstanie tego problemu lub mogą utrudniać jego zbadanie.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/sidebar.dtd
new file mode 100644
index 0000000..bbb27b6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Pokaż element w mrugającej ramce">
+<!ENTITY address.label "Adres">
+<!ENTITY context.open.label "Otwórz w nowej karcie">
+<!ENTITY type.label "Typ">
+<!ENTITY tooltip.filterSource.label "Źródło filtra:">
+<!ENTITY noitems.label "Elementy nieblokowalne">
+<!ENTITY filter.label "Filtr">
+<!ENTITY tooltip.size.label "Rozmiar:">
+<!ENTITY reattach.label "Przyłącz">
+<!ENTITY search.label "&amp;Szukaj:">
+<!ENTITY docDomain.thirdParty "(trzeci człon adresu)">
+<!ENTITY filterSource.label "Źródło filtra">
+<!ENTITY tooltip.docDomain.label "Źródło dokumentu:">
+<!ENTITY context.copy.label "Kopiuj adres elementu">
+<!ENTITY tooltip.type.label "Typ:">
+<!ENTITY context.disablefilter.label "Wyłącz filtr ?1?">
+<!ENTITY context.copyFilter.label "Kopiuj filtr">
+<!ENTITY context.block.label "Zablokuj ten element">
+<!ENTITY context.enablefilter.label "Włącz filtr ?1?">
+<!ENTITY detach.label "Odłącz">
+<!ENTITY whitelisted.label "Nieblokowana strona">
+<!ENTITY context.disablefilteronsite.label "Wyłącz ten filtr na ?1?">
+<!ENTITY detached.title "Adblock Plus – elementy blokowalne (odłączony)">
+<!ENTITY docDomain.firstParty "(pierwszy człon adresu)">
+<!ENTITY tooltip.type.whitelisted "(nieblokowane)">
+<!ENTITY tooltip.filter.label "Działające filtry:">
+<!ENTITY tooltip.filter.disabled "(wyłączony)">
+<!ENTITY context.editfilter.label "Edytuj filtr w rzeczywistości">
+<!ENTITY tooltip.type.blocked "(zablokowany)">
+<!ENTITY size.label "Rozmiar">
+<!ENTITY context.whitelist.label "Dodaj regułę wyjątku dla elementu">
+<!ENTITY context.selectAll.label "Zaznacz filtr">
+<!ENTITY state.label "Stan">
+<!ENTITY docDomain.label "Źródło elementu">
+<!ENTITY tooltip.address.label "Adres:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/subscriptionSelection.dtd
new file mode 100644
index 0000000..18c1b41
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Dodaj także ze&amp;staw „?1?â€">
+<!ENTITY list.download.failed "Nie udało się pobrać listy zestawów.">
+<!ENTITY list.download.retry "Spróbuj jeszcze raz">
+<!ENTITY title.label "&amp;Nazwa zestawu:">
+<!ENTITY list.download.website "Zobacz witrynÄ™">
+<!ENTITY supplementMessage "Ten zestaw filtrów musi być używany z zestawem „?1?â€, który nie jest jeszcze subskrybowany.">
+<!ENTITY viewList.label "Zobacz filtry">
+<!ENTITY visitHomepage.label "Przejdź na stronę zestawu">
+<!ENTITY addSubscription.label "Subskrybuj zestaw">
+<!ENTITY dialog.title "Add Adblock Plus – zestawy filtrów">
+<!ENTITY location.label "&amp;Lokalizacja zestawu:">
+<!ENTITY fromWeb.description "Potwierdź zamiar dodania tego zestawu filtrów. Przed dodaniem zestawu możesz zmienić jego nazwę lub lokalizację.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/composer.dtd
new file mode 100644
index 0000000..d8b038d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "no f&amp;inal do endereço">
+<!ENTITY domainRestriction.label "Restringir domínio:">
+<!ENTITY collapse.default.no.label "Usar padrão (não)">
+<!ENTITY firstParty.label "So&amp;mente mesmo domínio">
+<!ENTITY preferences.label "Mostrar filtros existentes...">
+<!ENTITY pattern.label "Procurar padrão">
+<!ENTITY thirdParty.label "So&amp;mente de terceiros">
+<!ENTITY filter.label "Novo &amp;filtro:">
+<!ENTITY collapse.label "Es&amp;tado de crise bloqueado:">
+<!ENTITY match.warning "O padrão que você digitou não corresponde mais ao endereço a ser bloqueado/liberado e não terá efeito sobre ele.">
+<!ENTITY anchor.start.label "no &amp;começo do endereço">
+<!ENTITY matchCase.label "&amp;Diferenciar maiúsculas/minúsculas">
+<!ENTITY custom.pattern.label "&amp;Personalizado:">
+<!ENTITY unselectAllTypes.label "Desmarcar todos">
+<!ENTITY type.whitelist.label "E&amp;xceção">
+<!ENTITY regexp.warning "O padrão que você digitou será interpretado como uma expressão regular que pode não ser eficientemente processada pelo Adblock Plus e pode retardar sua experiência de navegação. Se você não pretende usar uma expressão regular, adicione um asterisco (*) até o fim do padrão.">
+<!ENTITY dialog.title "Adicionar regra de filtro do Adblock Plus">
+<!ENTITY basic.label "Visualização básica">
+<!ENTITY type.filter.label "&amp;Filtro de Bloqueio">
+<!ENTITY types.label "Aplicar a tipos:">
+<!ENTITY shortpattern.warning "O padrão digitado é curto demais para ser otimizado e poderá causar lentidão na sua experiência de navegação. É recomendável que você escolha uma &quot;string&quot;(sequência de caracteres) mais longa para esse filtro para permitir que o Adblock Plus processe o filtro mais eficientemente.">
+<!ENTITY collapse.yes.label "Sim">
+<!ENTITY anchors.label "Aceitar somente padrão:">
+<!ENTITY collapse.default.yes.label "Usar padrão (sim)">
+<!ENTITY domainRestriction.help "Use esta opção para especificar um ou mais domínios separados pelo símbolo &quot;|&quot;. O filtro será aplicado somente nos domínios selecionados. O símbolo &quot;~&quot; antes de um domínio significa que o filtro não deve ser aplicado naquele domínio.">
+<!ENTITY accept.label "Adicionar filtro">
+<!ENTITY options.label "Opções">
+<!ENTITY disabled.warning "O Adblock Plus está desativado atualmente. Você pode adicionar filtros mesmo assim, mas eles não serão aplicados até que você [link]ative o Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "no &amp;começo do nome do domínio">
+<!ENTITY collapse.no.label "Não">
+<!ENTITY selectAllTypes.label "Selecionar todos">
+<!ENTITY advanced.label "Visualização avançada">
+<!ENTITY pattern.explanation "O padrão pode ser qualquer parte do endereço; o símbolo * funciona como curinga. O filtro somente será aplicado se o endereço corresponder ao padrão.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/filters.dtd
new file mode 100644
index 0000000..9db67d1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Todos os seus filtros personalizados serão substituídos pelo conteúdo do arquivo selecionado. Você deseja continuar?">
+<!ENTITY slow.column "Filtros l&amp;entos">
+<!ENTITY enabled.column "&amp;Ativado">
+<!ENTITY subscription.lastDownload.checksumMismatch "Falhou, checksum deu errado">
+<!ENTITY noFiltersInGroup.text "O grupo selecionado está vazio.">
+<!ENTITY subscription.actions.label "Ações">
+<!ENTITY filter.selectAll.label "Selecionar tudo">
+<!ENTITY backupButton.label "&amp;Backup e restauração">
+<!ENTITY restore.minVersion.warning "Atenção! O arquivo foi criado com um versão mais nova do Adblock Plus. Por favor, atualize o Adblock Plus para a versão mais recente antes de restaurar esse arquivo.">
+<!ENTITY restore.error "Não foi possível processar os dados desse arquivo. Talvez ele não seja um arquivo de backup do Adblock Plus.">
+<!ENTITY sort.ascending.label "Ordenar &amp;A &gt; Z">
+<!ENTITY sort.label "&amp;Organizar por">
+<!ENTITY subscription.source.label "lista de filtros">
+<!ENTITY hitcount.column "A&amp;certos">
+<!ENTITY noFilters.text "Você ainda não tem nenhum filtro personalizado.">
+<!ENTITY backup.custom.title "Somente filtros personalizados">
+<!ENTITY subscription.external.label "Atualizado por outra extensão">
+<!ENTITY subscription.delete.label "Excluir">
+<!ENTITY noGroupSelected.text "Você precisa selecionar um grupo de filtros antes para que os filtros sejam mostrados.">
+<!ENTITY filter.cut.label "Recortar">
+<!ENTITY restore.default.label "Restaurar backup de ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Fazendo download...">
+<!ENTITY subscriptions.tab.label "Inscrições de filtros">
+<!ENTITY sort.descending.label "Ordenar &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Você realmente deseja remover todos os filtros selecionados?">
+<!ENTITY filter.delete.label "Excluir">
+<!ENTITY addSubscriptionAdd.label "Adicionar">
+<!ENTITY viewMenu.label "Visualizar">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY addSubscriptionCancel.label "Cancelar">
+<!ENTITY subscription.enabled.label "Ativado">
+<!ENTITY noSubscriptions.text "Você ainda não adicionou nenhuma inscrição de filtros. O Adblock Plus não vai bloquear nada sem filtros. Por favor, clique em &quot;Adicionar inscrição de filtros&quot;.">
+<!ENTITY subscription.update.label "Atualizar filtros">
+<!ENTITY dialog.title "Opções de Filtros do Adblock Plus">
+<!ENTITY addFilter.label "A&amp;dicionar filtro">
+<!ENTITY subscription.minVersion.warning "Esta inscrição de filtros exige uma versão mais nova do Adblock Plus. Por favor, atualize o Adblock Plus para a versão mais recente.">
+<!ENTITY subscription.lastDownload.invalidURL "Falhou, não é um endereço válido">
+<!ENTITY backup.error "Ocorreu um erro ao gravar os filtros no arquivo. Verifique se o arquivo está protegido contra gravação ou se está em uso por outro programa.">
+<!ENTITY filter.moveUp.label "Para cima">
+<!ENTITY addGroup.label "Adicionar &amp;grupo de filtros">
+<!ENTITY filter.edit.label "Editar">
+<!ENTITY subscription.showHideFilters.label "Exibir/ocultar filtros">
+<!ENTITY acceptableAds2.label "Permitir algumas propagandas não-&amp;invasivas">
+<!ENTITY addSubscriptionOther.label "Adicionar outra inscrição">
+<!ENTITY close.label "Fechar">
+<!ENTITY sort.none.label "&amp;Não Organizado">
+<!ENTITY filter.actions.label "Ações de filtros">
+<!ENTITY filter.copy.label "Copiar">
+<!ENTITY filter.moveDown.label "Mover para baixo">
+<!ENTITY filter.resetHitCounts.label "Limpar estatística de acertos">
+<!ENTITY readMore.label "Saiba mais">
+<!ENTITY subscription.moveUp.label "Para cima">
+<!ENTITY addSubscription.label "Adicionar inscrição de &amp;filtros">
+<!ENTITY subscription.homepage.label "página da inscrição">
+<!ENTITY backup.complete.title "Todos os filtros e inscrições">
+<!ENTITY restore.own.label "Restaurar backup próprio">
+<!ENTITY restore.complete.warning "Todas as suas opções de filtros serão substituídas pelo conteúdo do arquivo selecionado. Você deseja continuar?">
+<!ENTITY filters.tab.label "Filtros personalizados">
+<!ENTITY backup.label "Criar novo backup">
+<!ENTITY find.label "&amp;Localizar">
+<!ENTITY subscription.moveDown.label "Para baixo">
+<!ENTITY subscription.lastDownload.connectionError "Falhou, falha no download">
+<!ENTITY subscription.lastDownload.success "Êxito">
+<!ENTITY subscription.lastDownload.invalidData "Falhou, não é uma lista de filtros válida">
+<!ENTITY filter.paste.label "Colar">
+<!ENTITY subscription.disabledFilters.enable "Ativar filtros desativados">
+<!ENTITY lasthit.column "Ú&amp;ltimo acerto">
+<!ENTITY subscription.editTitle.label "Editar título">
+<!ENTITY subscription.disabledFilters.warning "Alguns filtros nesta inscrição estão desativados.">
+<!ENTITY filter.column "Regra de &amp;Filtro">
+<!ENTITY subscription.lastDownload.label "Último download:">
+<!ENTITY viewList.label "Ver lista">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/firstRun.properties
new file mode 100644
index 0000000..19fb73f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Navegar em modo privado desabilitando o acompanhamento - esconde seus rastros de empresas de anúncio que iria acompanhar cada movimento seu.
+firstRun_toggle_off=DESLIGADO
+firstRun_feature_tracking=Desativa o Rastreamento
+firstRun_feature_malware=Bloqueio de Malware
+firstRun_title=O Adblock Plus foi instalado
+firstRun_toggle_on=LIGADO
+firstRun_acceptableAdsExplanation=Gostaríamos de incentivar sites com publicidade discreta, é simples de usar. É por isso que estabelecemos <a>diretrizes rígidas</a> para identificarmos anúncios aceitáveis, que são mostrados em configurações padrão. Se você ainda deseja bloquear todos os anúncios você pode <a>desativar</a> isso em poucos segundos.
+firstRun_contributor_credits=Créditos dos contribuidores
+firstRun_dataCorruptionWarning=Esta página continua aparecendo? <a>Clique aqui!</a>
+firstRun_acceptableAdsHeadline=Anúncios chatos serão bloqueados
+firstRun_share=Indique a seus amigos
+firstRun_share_headline=<a>Ajude-nos</a> a tornar a web um lugar melhor
+firstRun_feature_social_description=Automaticamente melhore sua experiência de navegação livrando-se de botões de redes sociais, como o Like do Facebook, que aparecem em páginas da web e que controlam seu comportamento.
+firstRun_filterlistsReinitializedWarning=Parece que algum um problema causou a remoção de todos os filtros e fomos incapazes de restaurá-los por backup. Portanto tivemos que resetar seus filtros e as configurações de anúncios toleráveis. Por favor verifique a lista de filtros a as configurações de anúncios aceitáveis em <a>Opções do Adblock Plus</a>.
+firstRun_feature_malware_description=Tornar sua navegação mais segura através do bloqueio de sites conhecidos com malwares.
+firstRun_features=O Adblock Plus pode fazer mais do que bloquear anúncios
+firstRun_donate=Doar
+firstRun_donate_label=Apoiar o projeto
+firstRun_feature_social=Remove Botões de Redes Sociais
+firstRun_legacySafariWarning=Você está usando uma versão antiga do Safari não suportada pelo Adblock Plus. Ele pode não funcionar corretamente ou prejudicar a experiência do usuário em alguns sites. Recomendamos fortemente atualizar para o Safari 6.1.1 ou superior (no OS X 10.8 Mountain Lion) ou Safari 7.0.1 ou superior (no OS X 10.9 Mavericks), ou usar a última versão do Mozilla Firefox, Google Chrome ou Opera.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/global.properties
new file mode 100644
index 0000000..1a882de
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Nenhum item bloqueável na página atual
+action3_tooltip=Clique para ativar/desativar o Adblock Plus.
+notification_antiadblock_title=Ocultar mensagens direcionadas?
+type_label_script=script
+filter_elemhide_nocriteria=Nenhum critério especificado para reconhecer o elemento a ser ocultado
+blockingGroup_title=Regras de bloqueio de propaganda
+whitelisted_tooltip=O Adblock Plus está ativo, mas desativado na página atual.
+type_label_stylesheet=folha de estilos
+blocked_count_tooltip=?1? de ?2?
+type_label_font=fonte
+type_label_popup=janela popup
+filter_regexp_tooltip=Este filtro é também uma expressão regular ou curta demais para ser otimizada. Muitos desses filtros podem causar lentidão na navegação.
+action0_tooltip=Clique para mostrar o menu de contexto, e com o botão do meio para ativar/desativar.
+whitelisted_page=O Adblock Plus foi desativado para a página atual
+remove_group_warning=Você realmente deseja remover este grupo?
+action1_tooltip=Clique para abrir/fechar itens bloqueáveis, e com o botão do meio para ativar/desativar.
+type_label_xmlhttprequest=requisição XML
+active_tooltip=O Adblock Plus está ativado, com ?1? inscrições de filtros e ?2? filtros personalizados.
+type_label_document=documento
+type_label_object_subrequest=sub-requisição do objeto
+whitelistGroup_title=Regras de exceção
+disabled_tooltip=O Adblock Plus está desativado.
+filter_elemhide_duplicate_id=Somente uma ID do elemento a ser ocultado pode ser especificada
+type_label_object=objeto
+action2_tooltip=Clique para abrir as preferências, e com o botão do meio para ativar/desativar.
+type_label_subdocument=frame
+clearStats_warning=Isso vai reiniciar todas as estatísticas de acertos dos filtros e desativar o contador de acertos dos filtros. Você deseja continuar?
+notification_antiadblock_message=Este site é conhecido por mostrar mensagens direcionadas a usuários do Adblock Plus. Você quer que o Adblock Plus esconda mensagens direcionadas?
+blocked_count_addendum=(e também liberados: ?1?, ocultos: ?2?)
+subscription_invalid_location=O local da lista de filtros não é nem uma URL válida nem um nome válido de arquivo.
+type_label_image=imagem
+remove_subscription_warning=Você realmente deseja remover esta inscrição?
+type_label_other=outro
+mobile_menu_enable=ABP: Ativado
+type_label_media=áudio/vídeo
+mobile_menu_disable_site=ABP: Desativado em ?1?
+elemhideGroup_title=Regras de ocultamento de elementos
+mobile_menu_enable_site=ABP: Ativado em ?1?
+type_label_elemhide=oculto
+newGroup_title=Novo grupo de filtros
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/overlay.dtd
new file mode 100644
index 0000000..58def63
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Sim">
+<!ENTITY notification.button.no "&amp;Não">
+<!ENTITY sync.label "S&amp;incronizar configurações do Adblock Plus">
+<!ENTITY whitelist.site.label "Desativar em ?1?">
+<!ENTITY filters.label "Opções de &amp;filtros">
+<!ENTITY disable.label "Desativar em todas as páginas">
+<!ENTITY objecttab.title "Bloquear">
+<!ENTITY objecttab.tooltip "Clique aqui para bloquear este objeto com o Adblock Plus">
+<!ENTITY menuitem.label "Preferências do Ad&amp;block Plus">
+<!ENTITY objecttabs.label "Mostrar abas em Flash e &amp;Java">
+<!ENTITY sendReport.label "&amp;Reportar problema nesta página">
+<!ENTITY whitelist.page.label "Desativar somente nesta página">
+<!ENTITY context.image.label "Adblock Plus: Bloquear imagem">
+<!ENTITY counthits.label "Cont&amp;ar acertos de filtros">
+<!ENTITY opensidebar.label "A&amp;brir itens bloqueáveis">
+<!ENTITY notification.button.close "&amp;Fechar">
+<!ENTITY contribute.label "Contribuir com o Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Bloquear quadro">
+<!ENTITY blocked.tooltip "Itens bloqueados nesta página:">
+<!ENTITY hideplaceholders.label "Ocultar &amp;marcadores de elementos bloqueados">
+<!ENTITY showinstatusbar.label "&amp;Mostrar na barra de status">
+<!ENTITY sidebar.title "Itens bloqueáveis na página atual">
+<!ENTITY options.label "&amp;Opções">
+<!ENTITY context.object.label "Adblock Plus: Bloquear objeto">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Reativar nessa página">
+<!ENTITY filters.tooltip "Filtros mais ativos:">
+<!ENTITY closesidebar.label "Fechar itens &amp;bloqueáveis">
+<!ENTITY showintoolbar.label "Mostrar na barra de &amp;ferramentas">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Bloquear áudio/vídeo">
+<!ENTITY subscription.update.label "Atualizar filtros">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/sendReport.dtd
new file mode 100644
index 0000000..4f2bfd5
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Desfazer">
+<!ENTITY issues.disabledgroups.description "Os seguintes grupos e inscrições de filtros está desativados, mas eles podem estar afetando essa página:">
+<!ENTITY showData.label "Exibir os dados do relatório">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus está bloqueando de&amp;mais">
+<!ENTITY issues.change.description "Sua configuração foi alterada. Por favor, atualize a página para testar as alterações e enviar um relatório caso o erro continue a ocorrer.">
+<!ENTITY email.label "E&amp;mail:">
+<!ENTITY issues.openPreferences.label "Abrir configuração de filtros">
+<!ENTITY sendPage.confirmation "Seu relatório foi salvo. Você pode acessá-lo no seguinte endereço:">
+<!ENTITY copyLink.label "&amp;Copiar endereço do relatório">
+<!ENTITY issues.nofilters.description "O Adblock Plus não está bloqueando nada nessa página. É improvável que o erro observado esteja relacionado com o Adblock Plus.">
+<!ENTITY sendPage.knownIssue "O problema que você informou provavelmente já é conhecido. Mais informações:">
+<!ENTITY typeSelector.other.description "Escolha esta opção se você suspeita que há um erro no próprio Adblock Plus e não nos filtros.">
+<!ENTITY issues.disabledgroups.enable.label "Ativar grupo ou inscrição de filtros">
+<!ENTITY typeWarning.override.label "&amp;Eu entendo e quero enviar o relatório mesmo assim">
+<!ENTITY issues.disabled.enable.label "Ativar o Adblock Plus">
+<!ENTITY update.fixed.description "A atualização de suas inscrições de filtros provavelmente resolveu o problema que você estava reportando. Por favor, atualize a página e verifique. Se o problema persistir, clique novamente em &quot;Reportar problema com esta página&quot;.">
+<!ENTITY anonymous.label "Envio &amp;anônimo">
+<!ENTITY reloadButton.label "&amp;Recarregar a página">
+<!ENTITY recentReports.clear.label "&amp;Remover todos os relatórios">
+<!ENTITY typeSelector.description "Este assistente conduzirá você pelos passos necessários para enviar um relatório de erro do Adblock Plus. Primeiro, selecione o tipo de erro que você está tendo nessa página:">
+<!ENTITY screenshot.remove.label "&amp;Remove dados confidenciais">
+<!ENTITY issues.ownfilters.description "Alguns dos filtros aplicados nesta página foram definidos pelo usuário. Por favor, desative os filtros que podem ter causado o problema:">
+<!ENTITY update.inProgress.description "O Adblock Plus precisa atualizar suas inscrições de filtros para ter certeza que o problema não foi resolvido ainda. Por favor, aguarde...">
+<!ENTITY sendPage.retry.label "Enviar novamente">
+<!ENTITY data.label "&amp;Dados do relatório:">
+<!ENTITY recentReports.label "Seus relatórios enviados recentemente">
+<!ENTITY typeWarning.description "Você indicou que deseja comunicar um erro geral no Adblock Plus em vez de um problema com os filtros. Por favor, note que problemas desse tipo devem ser tratados no [link]fórum do Adblock Plus[/link]. Envie um relatório apenas para complementar uma discussão existente no fórum, pois ninguém vai notá-lo a menos que você informe o endereço do relatório. O endereço gerado automaticamente será apresentado após o envio do relatório.">
+<!ENTITY issues.disabled.description "O Adblock Plus está desativado; ele não vai bloquear nada no seu estado atual.">
+<!ENTITY attachExtensions.label "Ane&amp;xar ao relatório uma lista de extensões ativas caso haja um conflito entre elas">
+<!ENTITY issues.nosubscriptions.add.label "Adicionar inscrição de filtros">
+<!ENTITY issues.disabledfilters.enable.label "Ativar filtro">
+<!ENTITY issues.override.label "A &amp;configuração está correta, continue com o relatório">
+<!ENTITY issues.nosubscriptions.description "Parece que você não adicionou nenhuma das inscrições de filtros que removem automaticamente os conteúdos indesejados dos sites.">
+<!ENTITY typeSelector.falsePositive.description "Escolha esta opção se a página carece de algum conteúdo importante, se aparece de forma incorreta ou se não funciona corretamente. Você pode verificar se o Adblock Plus é a causa do problema desativando-o temporariamente.">
+<!ENTITY typeSelector.other.label "Ou&amp;tro problema">
+<!ENTITY emailComment.label "Nós encorajamos você a digitar um endereço de e-mail válido para que possamos entrar em contato se houverem quaisquer dúvidas sobre o seu relatório. A inserção de um e-mail válido também irá permitir-nos reconhecer suas contribuições e dar-lhes uma prioridade maior.">
+<!ENTITY issues.whitelist.remove.label "Reativar o Adblock Plus nessa página">
+<!ENTITY outdatedSubscriptions.description "As seguintes inscrições de filtros não foram atualizadas há pelo menos duas semanas. Por favor, atualize essas inscrições antes de enviar um relatório de erro, pois o problema pode já ter sido resolvido.">
+<!ENTITY dataCollector.description "Por favor, aguarde um momento enquanto Adblock Plus coleta os dados necessários.">
+<!ENTITY sendButton.label "E&amp;nviar relatório">
+<!ENTITY comment.label "&amp;Comentário (opcional):">
+<!ENTITY sendPage.errorMessage "Uma tentativa de enviar o relatório falhou com código de erro &quot;?1?&quot;. Por favor, assegure que você está conectado à Internet e tente novamente. Se o problema persistir, por favor, solicite ajuda no [link]fórum do Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Exibir relatórios enviados recentemente">
+<!ENTITY commentPage.heading "Digitar comentário">
+<!ENTITY update.start.label "Atualizar agora">
+<!ENTITY issues.disabledfilters.description "Os seguintes filtros estão desativados, mas eles podem estar afetando essa página:">
+<!ENTITY screenshot.description "Uma mesma página pode parecer diferente para diferentes pessoas. Pode nos ajudar a compreender o problema, você pode anexar uma imagem ao seu relatório. Você pode remover partes da imagem contendo informações confidenciais, bem como marcar áreas onde se encontra o problema. Para isso, clique no botão correspondente e selecione com o mouse uma área da imagem.">
+<!ENTITY screenshot.attach.label "Ane&amp;xar uma imagem da página ao relatório">
+<!ENTITY issues.whitelist.description "O Adblock Plus está desativado atualmente nessa página. Para ajudar na investigação do problema, por favor, reative o Adblock Plus e atualize a página antes de enviar o relatório.">
+<!ENTITY typeSelector.falseNegative.label "O Adblock Plus &amp;não está bloqueando uma propaganda">
+<!ENTITY typeSelector.heading "Selecionar tipo de erro">
+<!ENTITY anonymity.warning "Nós não vamos ser capazes de entrar em contato com você e, portanto, seus relatórios terão baixa prioridade.">
+<!ENTITY wizard.title "Relatório de erro">
+<!ENTITY issues.ownfilters.disable.label "Desativar filtro">
+<!ENTITY commentPage.description "O campo abaixo permite você digitar um comentário para nos ajudar a entender o problema. Este passo é opcional mas é recomendado se o problema não for óbvio. Você também pode verificar os dados do relatório antes de enviar.">
+<!ENTITY comment.lengthWarning "O tamanho do seu comentário excedeu 1000 caracteres. Apenas os primeiros 1000 caracteres serão enviadas.">
+<!ENTITY typeSelector.falseNegative.description "Escolha esta opção se uma propaganda é exibida mesmo com o Adblock Plus ativado.">
+<!ENTITY sendPage.waitMessage "Por favor aguarde enquanto o Adblock Plus está enviando seu relatório.">
+<!ENTITY dataCollector.heading "Bem-vindo ao relatório de erro">
+<!ENTITY screenshot.heading "Anexar imagem">
+<!ENTITY sendPage.heading "Enviar relatório">
+<!ENTITY issues.subscriptionCount.description "Parece que você adicionou inscrições de filtros em excesso. Essa configuração não é recomendada porque aumenta a possibilidade de ocorrência de erros. Não podemos aceitar o seu relatório porque não é possível determinar qual autor de inscrição de filtros deve tratar o problema. Por favor, remova todos as inscrições exceto as realmente necessárias e verifique se o problema ainda ocorre.">
+<!ENTITY screenshot.mark.label "&amp;Marcar o problema">
+<!ENTITY privacyPolicy.label "Política de privacidade">
+<!ENTITY issues.description "O Adblock Plus detectou problemas com a configuração atual que podem ser a causa do erro ou que podem dificultar a análise do relatório.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/sidebar.dtd
new file mode 100644
index 0000000..dd8262b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Realçar bordas do item">
+<!ENTITY address.label "Endereço">
+<!ENTITY context.open.label "Abrir em nova aba">
+<!ENTITY type.label "Tipo">
+<!ENTITY tooltip.filterSource.label "Fonte do filtro:">
+<!ENTITY noitems.label "Nenhum item bloqueável">
+<!ENTITY filter.label "Filtro">
+<!ENTITY tooltip.size.label "Tamanho:">
+<!ENTITY reattach.label "Ancorar">
+<!ENTITY search.label "&amp;Localizar:">
+<!ENTITY docDomain.thirdParty "(domínio diferente)">
+<!ENTITY filterSource.label "Fonte do filtro">
+<!ENTITY tooltip.docDomain.label "Origem do documento:">
+<!ENTITY context.copy.label "Copiar endereço do item">
+<!ENTITY tooltip.type.label "Tipo:">
+<!ENTITY context.disablefilter.label "Desativar filtro ?1?">
+<!ENTITY context.copyFilter.label "Copiar filtro">
+<!ENTITY context.block.label "Bloquear este item">
+<!ENTITY context.enablefilter.label "Reativar filtro ?1?">
+<!ENTITY detach.label "Destacar">
+<!ENTITY whitelisted.label "Página na lista branca">
+<!ENTITY context.disablefilteronsite.label "Desativar esse filtro em ?1?">
+<!ENTITY detached.title "Adblock Plus: Itens bloqueáveis (destacada)">
+<!ENTITY docDomain.firstParty "(mesmo domínio)">
+<!ENTITY tooltip.type.whitelisted "(na lista branca)">
+<!ENTITY tooltip.filter.label "Filtro em ação:">
+<!ENTITY tooltip.filter.disabled "(desativado)">
+<!ENTITY context.editfilter.label "Editar filtro em efeito">
+<!ENTITY tooltip.type.blocked "(bloqueado)">
+<!ENTITY size.label "Tamanho">
+<!ENTITY context.whitelist.label "Adicionar exceção para o item">
+<!ENTITY context.selectAll.label "Selecionar todos">
+<!ENTITY state.label "Estado">
+<!ENTITY docDomain.label "Origem do documento">
+<!ENTITY tooltip.address.label "Endereço:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/subscriptionSelection.dtd
new file mode 100644
index 0000000..7982acb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Adicionar também a inscrição de &amp;filtros &quot;?1?&quot;">
+<!ENTITY list.download.failed "O Adblock Plus não conseguiu obter a lista de inscrições.">
+<!ENTITY list.download.retry "Tentar novamente">
+<!ENTITY title.label "&amp;Título da inscrição:">
+<!ENTITY list.download.website "Abrir página da lista de inscrições">
+<!ENTITY supplementMessage "Essa inscrição de filtros foi feita para ser usada com inscrição de filtros &quot;?1?&quot;, que você ainda não está usando.">
+<!ENTITY viewList.label "Visualizar filtros">
+<!ENTITY visitHomepage.label "Abrir página da inscrição">
+<!ENTITY addSubscription.label "Adicionar inscrição">
+<!ENTITY dialog.title "Adicionar inscrição de filtros do Adblock Plus">
+<!ENTITY location.label "&amp;Endereço da lista de filtros:">
+<!ENTITY fromWeb.description "Por favor, confirme que você deseja adicionar essa inscrição de filtros. Você pode alterar o título ou o endereço da inscrição antes de adicionar.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/composer.dtd
new file mode 100644
index 0000000..c864644
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "&amp;no final do endereço">
+<!ENTITY domainRestriction.label "Restringir ao domínio:">
+<!ENTITY collapse.default.no.label "Usar por defeito (não)">
+<!ENTITY firstParty.label "Apenas primários">
+<!ENTITY preferences.label "Mostrar filtros existentes">
+<!ENTITY pattern.label "Procurar um padrão">
+<!ENTITY thirdParty.label "De &amp;terceiros">
+<!ENTITY filter.label "Novo &amp;filtro:">
+<!ENTITY collapse.label "Colapsar bloqueados:">
+<!ENTITY match.warning "O padrão que inseriu já não corresponde ao endereço a ser bloqueado/desbloqueado e não surtirá efeito.">
+<!ENTITY anchor.start.label "no &amp;início do endereço">
+<!ENTITY matchCase.label "Maiúsculas/ minúsculas">
+<!ENTITY custom.pattern.label "&amp;Personalização:">
+<!ENTITY unselectAllTypes.label "Desseleccionar">
+<!ENTITY type.whitelist.label "Regra de e&amp;xceção">
+<!ENTITY regexp.warning "O padrão inserido será interpretado como expressão regular e não será processado corretamente pelo Adblock Plus e pode tornar o navegador mais lento. Se não pretendia utilizar expressões regulares adicione um asterisco (*) no final do padrão.">
+<!ENTITY dialog.title "Adicionar regra de filtro ao Adblock Plus">
+<!ENTITY basic.label "Vista básica">
+<!ENTITY type.filter.label "Filtro bloqueador">
+<!ENTITY types.label "Aplicar aos tipos:">
+<!ENTITY shortpattern.warning "O padrão inserido é demasiado curto para ser otimizado e pode tornar o navegador mais lento. Deve utilizar um padrão mais extenso para este filtro de modo a que o Adblock Plus processe o filtro de forma correta.">
+<!ENTITY collapse.yes.label "Sim">
+<!ENTITY anchors.label "Aceitar o padrão apenas:">
+<!ENTITY collapse.default.yes.label "Usar por defeito (sim)">
+<!ENTITY domainRestriction.help "Especificar um ou mais domínios separados pelo símbolo &quot;|&quot;, o filtro será aplicado apenas a estes domínios. O símbolo &quot;~&quot; antes de um domínio implica que o filtro não seja aplicado nesse domínio.">
+<!ENTITY accept.label "Adicionar filtro">
+<!ENTITY options.label "Opções">
+<!ENTITY disabled.warning "O Adblock Plus está inativo. Pode adicionar filtros mas estes não serão aplicados até que [link]ative o Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "no &amp;início do nome de domínio">
+<!ENTITY collapse.no.label "Não">
+<!ENTITY selectAllTypes.label "Seleccionar todos">
+<!ENTITY advanced.label "Vista avançada">
+<!ENTITY pattern.explanation "O padrão pode ser qualquer parte do endereço; o asterisco (*) funciona como wildcard. O filtro só será aplicado ao(s) endereço(s) que correspondam ao padrão indicado.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/filters.dtd
new file mode 100644
index 0000000..3466a3d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Todas os seus filtros personalizados serão substituídos pelo conteúdo do ficheiro selecionado. Continuar?">
+<!ENTITY slow.column "Fi&amp;ltros lentos">
+<!ENTITY enabled.column "A&amp;tivo">
+<!ENTITY subscription.lastDownload.checksumMismatch "Erro de verificação (checksum)">
+<!ENTITY noFiltersInGroup.text "O grupo selecionado está vazio.">
+<!ENTITY subscription.actions.label "Ações">
+<!ENTITY filter.selectAll.label "Selecionar tudo">
+<!ENTITY backupButton.label "&amp;Backup e restauro">
+<!ENTITY restore.minVersion.warning "Atenção: o ficheiro foi criado com uma versão mais recente do Adblock Plus. Deve atualizar para a versão mais recente do Adblock Plus antes de restaurar este ficheiro.">
+<!ENTITY restore.error "A informação do ficheiro não foi processada com sucesso. Tem a certeza que é um ficheiro válido?">
+<!ENTITY sort.ascending.label "Ordenar &amp;A &gt; Z">
+<!ENTITY sort.label "&amp;Ordenar por">
+<!ENTITY subscription.source.label "Lista de filtros">
+<!ENTITY hitcount.column "&amp;Contagem">
+<!ENTITY noFilters.text "Ainda não tem qualquer filtro personalizado.">
+<!ENTITY backup.custom.title "Apenas filtros personalizados">
+<!ENTITY subscription.external.label "Atualizado por outra extensão">
+<!ENTITY subscription.delete.label "Eliminar">
+<!ENTITY noGroupSelected.text "Tem que selecionar um grupo de filtros para que os mesmos sejam exibidos.">
+<!ENTITY filter.cut.label "Cortar">
+<!ENTITY restore.default.label "Restaurar backup de ?1?">
+<!ENTITY subscription.lastDownload.inProgress "A transferir...">
+<!ENTITY subscriptions.tab.label "Subscrições de filtros">
+<!ENTITY sort.descending.label "Ordenar &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Quer mesmo remover todos os filtros selecionados?">
+<!ENTITY filter.delete.label "Eliminar">
+<!ENTITY addSubscriptionAdd.label "Adicionar">
+<!ENTITY viewMenu.label "Ver">
+<!ENTITY subscription.lastDownload.unknown "N/D">
+<!ENTITY addSubscriptionCancel.label "Cancelar">
+<!ENTITY subscription.enabled.label "Ativo">
+<!ENTITY noSubscriptions.text "Ainda não adicionou uma subscrição de filtros. O Adblock Plus não bloqueará
+elementos sem filtros. Por favor utilize &quot;Adicionar subscrição de filtros&quot; para
+um filtro.">
+<!ENTITY subscription.update.label "Atualizar filtros">
+<!ENTITY dialog.title "Preferências de filtros do Adblock Plus">
+<!ENTITY addFilter.label "A&amp;dicionar filtro">
+<!ENTITY subscription.minVersion.warning "Esta subscrição de filtros requer uma versão mais recente do Adblock Plus. Deve atualizar para a versão mais recente do Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Endereço inválido">
+<!ENTITY backup.error "Ocorreu um erro ao guardar os filtros no ficheiro. Certifique-se que o ficheiro não está protegido contra escrita ou a ser utilizado por outra aplicação.">
+<!ENTITY filter.moveUp.label "Mover para cima">
+<!ENTITY addGroup.label "Adicionar &amp;grupo de filtros">
+<!ENTITY filter.edit.label "Editar">
+<!ENTITY subscription.showHideFilters.label "Mostrar/ocultar filtros">
+<!ENTITY acceptableAds2.label "Perm&amp;itir alguma publicidade não intrusiva">
+<!ENTITY addSubscriptionOther.label "Adicionar outra subscrição">
+<!ENTITY close.label "Fechar">
+<!ENTITY sort.none.label "&amp;Não ordenar">
+<!ENTITY filter.actions.label "Ações de filtros">
+<!ENTITY filter.copy.label "Copiar">
+<!ENTITY filter.moveDown.label "Mover para baixo">
+<!ENTITY filter.resetHitCounts.label "Reiniciar estatísticas">
+<!ENTITY readMore.label "Saber mais">
+<!ENTITY subscription.moveUp.label "Mover para cima">
+<!ENTITY addSubscription.label "Adicionar subscrição de &amp;filtros">
+<!ENTITY subscription.homepage.label "Página web">
+<!ENTITY backup.complete.title "Todos os filtros e subscrições">
+<!ENTITY restore.own.label "Restaurar outro backup">
+<!ENTITY restore.complete.warning "Todas as preferências de filtros serão substituídas pelo conteúdo do ficheiro selecionado. Continuar?">
+<!ENTITY filters.tab.label "Filtros personalizados">
+<!ENTITY backup.label "Criar novo backup">
+<!ENTITY find.label "&amp;Localizar">
+<!ENTITY subscription.moveDown.label "Mover para baixo">
+<!ENTITY subscription.lastDownload.connectionError "Transferência falhada">
+<!ENTITY subscription.lastDownload.success "Bem sucedido">
+<!ENTITY subscription.lastDownload.invalidData "Não é uma lista válida">
+<!ENTITY filter.paste.label "Colar">
+<!ENTITY subscription.disabledFilters.enable "Ativar filtros inativos">
+<!ENTITY lasthit.column "Última &amp;utilização">
+<!ENTITY subscription.editTitle.label "Editar título">
+<!ENTITY subscription.disabledFilters.warning "Alguns filtros desta subscrição estão inativos.">
+<!ENTITY filter.column "Regra de &amp;filtro">
+<!ENTITY subscription.lastDownload.label "Última atualização:">
+<!ENTITY viewList.label "Ver lista">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/firstRun.properties
new file mode 100644
index 0000000..29d3e16
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Navegue na web desativando a monitorização. Oculte o seu registo de navegação das companhias que monitorizam os seus movimentos.
+firstRun_toggle_off=Desligado
+firstRun_feature_tracking=Desativar monitorização
+firstRun_feature_malware=Bloqueio de malware
+firstRun_title=O Adblock Plus foi instalado
+firstRun_toggle_on=Ligado
+firstRun_acceptableAdsExplanation=Gostamos de incentivar os sítios web de publicidade a utilizar anúncios não intrusivos. Foi por essa razão que estabelecemos <a>políticas restritas</a> para identificar os anúncios aceitáveis e que são mostrados em definições padrão. No entanto, se você quiser bloquear todos os anúncios, pode <a>desativar</a> essa opção facilmente.
+firstRun_contributor_credits=Créditos
+firstRun_dataCorruptionWarning=Esta página continua a aparecer? <a>Clique aqui!</a>
+firstRun_acceptableAdsHeadline=A publicidade será bloqueada
+firstRun_share=Publicite o programa
+firstRun_share_headline=<a>Ajude-nos</a> a melhorar a web
+firstRun_feature_social_description=Remova os botões das redes sociais, tais como o Facebook Like, que aparecem nas páginas web e que monitorizam o seu comportamento.
+firstRun_filterlistsReinitializedWarning=Parece que ocorreu um erro que causou a remoção de todos os filtros e nós não conseguimos restaurar a cópia de segurança. Neste sentido, os filtros e as definições de anúncios aceitáveis foram reiniciados, Analise os seus filtros e os anúncios aceitáveis nas definições do <a>Adblock Plus.</a>.
+firstRun_feature_malware_description=Melhore a navegação web bloqueando os domínios duvidosos.
+firstRun_features=O Adblock Plus pode fazer mais do que bloquear publicidade
+firstRun_donate=donativos
+firstRun_donate_label=Ajude o nosso projeto
+firstRun_feature_social=Remover botões sociais
+firstRun_legacySafariWarning=Você está a utilizar uma versão do Safari que não é suportada pelo Adblock Plus. A aplicação pode não funcionar corretamente e prejudicar a navegação em alguns sítios web. Deve atualizar para o Safari 6.1.1 ou mais recente (disponível para o Mac OS X 10.8 Mountain Lion), para a versão 7.0.1 ou mais recente (disponível no OS x 10.9 Mavericks) ou utilizar uma versão recente dos navegadores Mozilla Firefox, Google Chrome ou Opera.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/global.properties
new file mode 100644
index 0000000..a8730e8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Não há itens bloqueáveis nesta página
+action3_tooltip=Clique para ativar/desativar o Adblock Plus.
+notification_antiadblock_title=Ocultar mensagens?
+type_label_script=script
+filter_elemhide_nocriteria=Nenhum critério especificado para reconhecimento de elementos a bloquear
+blockingGroup_title=Regras de bloqueio de anúncios
+whitelisted_tooltip=O Adblock Plus está está inativo nesta página.
+type_label_stylesheet=folha de estilo
+blocked_count_tooltip=?1? de ?2?
+type_label_font=tipo de letra
+type_label_popup=janela pop-up
+filter_regexp_tooltip=Este filtro é uma expressão regular ou demasiado curto para ser otimizado. Demasiados filtros com estas características podem tornar o navegador mais lento.
+action0_tooltip=Clique para mostrar o menu de contexto, clique na roda do rato para ativar/desativar.
+whitelisted_page=O Adblock Plus foi desativado nesta página
+remove_group_warning=Quer mesmo remover este grupo?
+action1_tooltip=Clique para abrir/fechar itens bloqueáveis, clique na roda do rato para ativar/desativar.
+type_label_xmlhttprequest=pedido XML
+active_tooltip=O Adblock Plus está ativo. ?1? subscrições de filtros e ?2? filtros personalizados.
+type_label_document=documento
+type_label_object_subrequest=subpedido de objeto
+whitelistGroup_title=Regras de exceção
+disabled_tooltip=O Adblock Plus está inativo.
+filter_elemhide_duplicate_id=Apenas pode especificar uma ID do elemento a ocultar
+type_label_object=objeto
+action2_tooltip=Clique para abrir as preferências, clique na roda do rato para ativar/desativar.
+type_label_subdocument=moldura
+clearStats_warning=Irá reiniciar as estatísticas de todos os filtros e desativar a contagem de bloqueios. Continuar?
+notification_antiadblock_message=Este sítio é conhecido por enviar mensagens dirigidas aos utilizadores do Adblock Plus. Gostaria de ocultar essas mensagens?
+blocked_count_addendum=(na lista de permissões: ?1?, ocultos: ?2?)
+subscription_invalid_location=A localização da lista de filtros não é um endereço ou nome de ficheiro válido.
+type_label_image=imagem
+remove_subscription_warning=Quer mesmo remover esta subscrição?
+type_label_other=outro
+mobile_menu_enable=ABP: Ativar
+type_label_media=áudio/vídeo
+mobile_menu_disable_site=ABP: Desativar em ?1?
+elemhideGroup_title=Regras de bloqueio de elementos
+mobile_menu_enable_site=ABP: Ativar em ?1?
+type_label_elemhide=oculto
+newGroup_title=Novo grupo de filtros
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/overlay.dtd
new file mode 100644
index 0000000..fbcb8c8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Sim">
+<!ENTITY notification.button.no "&amp;Não">
+<!ENTITY sync.label "Sin&amp;cronizar definições do Adblock Plus">
+<!ENTITY whitelist.site.label "Desativar em ?1?">
+<!ENTITY filters.label "Pre&amp;ferências de filtros">
+<!ENTITY disable.label "Desativar em todas as páginas">
+<!ENTITY objecttab.title "Bloquear">
+<!ENTITY objecttab.tooltip "Clique aqui para bloquear este objecto com o Adblock Plus">
+<!ENTITY menuitem.label "Preferências do Ad&amp;block Plus">
+<!ENTITY objecttabs.label "Mos&amp;trar separadores em flash e java">
+<!ENTITY sendReport.label "&amp;Reportar erros nesta página">
+<!ENTITY whitelist.page.label "Desativar apenas nesta página">
+<!ENTITY context.image.label "Bloquear imagem">
+<!ENTITY counthits.label "&amp;Contar bloqueios do filtro">
+<!ENTITY opensidebar.label "A&amp;brir itens bloqueáveis">
+<!ENTITY notification.button.close "Fe&amp;char">
+<!ENTITY contribute.label "Colaborar no Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Bloquear moldura">
+<!ENTITY blocked.tooltip "Itens bloqueados nesta página:">
+<!ENTITY hideplaceholders.label "Ocultar &amp;locais de elementos bloqueados">
+<!ENTITY showinstatusbar.label "Mo&amp;strar na barra de estado">
+<!ENTITY sidebar.title "Elementos bloqueáveis nesta página">
+<!ENTITY options.label "&amp;Opções">
+<!ENTITY context.object.label "Bloquear objeto">
+<!ENTITY context.removeWhitelist.label "Reativar nesta página">
+<!ENTITY filters.tooltip "Filtros mais ativos:">
+<!ENTITY closesidebar.label "Fechar itens &amp;bloqueáveis">
+<!ENTITY showintoolbar.label "Mostrar na &amp;barra de ferramentas">
+<!ENTITY status.tooltip "Estado:">
+<!ENTITY context.media.label "Bloquear áudio/vídeo">
+<!ENTITY subscription.update.label "Atualizar filtros">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/sendReport.dtd
new file mode 100644
index 0000000..d4ac781
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "An&amp;ular">
+<!ENTITY issues.disabledgroups.description "As seguintes subscrições/grupos de filtros estão inativos mas podem estar a interferir nesta página:">
+<!ENTITY showData.label "Mostrar dados do relatório">
+<!ENTITY typeSelector.falsePositive.label "O Adblock Plus está a bloquear de&amp;masiado">
+<!ENTITY issues.change.description "A configuração foi alterada. Por favor recarregue a página para testar as alterações e submeter o relatório, caso o problema ainda persista.">
+<!ENTITY email.label "E&amp;mail:">
+<!ENTITY issues.openPreferences.label "Abrir preferências de filtros">
+<!ENTITY sendPage.confirmation "O seu relatório foi guardado. Pode aceder ao relatório através do seguinte endereço:">
+<!ENTITY copyLink.label "&amp;Copiar ligação do relatório">
+<!ENTITY issues.nofilters.description "O Adblock Plus não está a bloquear elementos da página atual. Provavelmente o problema que está a ocorrer não está relacionado com o Adblock Plus.">
+<!ENTITY sendPage.knownIssue "O problema que reportou já é, provavelmente, conhecido. Mais informação:">
+<!ENTITY typeSelector.other.description "Selecione esta opção se suspeita de um problema no Adblock Plus ao invés de um problema nos filtros.">
+<!ENTITY issues.disabledgroups.enable.label "Ativar subscrição/grupo de filtros">
+<!ENTITY typeWarning.override.label "&amp;Eu compreendo e pretendo enviar o relatório">
+<!ENTITY issues.disabled.enable.label "Ativar Adblock Plus">
+<!ENTITY update.fixed.description "A atualização dos seus filtros parece ter resolvido o problema que estava a reportar. Por favor recarregue a página e tente novamente. Envie um relatório se o problema persistir.">
+<!ENTITY anonymous.label "Submissão &amp;anónima">
+<!ENTITY reloadButton.label "&amp;Recarregar página">
+<!ENTITY recentReports.clear.label "&amp;Remover todos os relatórios">
+<!ENTITY typeSelector.description "Esta janela guiá-lo-à através dos passos necessários para submeter o relatório de erros. Por favor selecione o tipo de erro que está a ocorrer nesta página:">
+<!ENTITY screenshot.remove.label "&amp;Remover informação sensível">
+<!ENTITY issues.ownfilters.description "Alguns dos filtros aplicados nesta página são definidos pelo utilizador. Por favor desative os filtros que poderão estar a causar o problema:">
+<!ENTITY update.inProgress.description "O Adblock Plus necessita de atualizar as subscrições de filtros para se certificar que o problema não foi resolvido. Por favor aguarde...">
+<!ENTITY sendPage.retry.label "Enviar novamente">
+<!ENTITY data.label "&amp;Dados do relatório:">
+<!ENTITY recentReports.label "Os seus relatórios recentes">
+<!ENTITY typeWarning.description "Indicou que pretende reportar um problema genérico do Adblock Plus em vez de um problema com os filtros. Esse tipo de problemas devem ser reportados no [link]fórum Adblock Plus[/link]. Só deve utilizar esta funcionalidade para complementar uma discussão existente, uma vez que ninguém terá conhecimento do seu relatório se não lhes disponibilizar a ligação. A ligação será disponibilizada depois de submeter o relatório.">
+<!ENTITY issues.disabled.description "O Adblock Plus está inativo e não bloqueará anúncios.">
+<!ENTITY attachExtensions.label "Ane&amp;xe a lista das extensões ativas ao relatório para verificarmos se alguma das extensões está a interferir com a aplicação">
+<!ENTITY issues.nosubscriptions.add.label "Adicionar subscrição de filtros">
+<!ENTITY issues.disabledfilters.enable.label "Ativar filtro">
+<!ENTITY issues.override.label "A &amp;configuração está correta. Continuar com o relatório">
+<!ENTITY issues.nosubscriptions.description "Parece que você ainda não subscreveu qualquer lista de filtros que bloqueiam os anúncios dos sítios web.">
+<!ENTITY typeSelector.falsePositive.description "Selecione esta opção se a página não mostra ou mostra incorretamente o conteúdo importante ou se não funciona corretamente. Pode verificar se o Adblock Plus é o causador do problema destivando-o temporariamente.">
+<!ENTITY typeSelector.other.label "Ou&amp;tro erro">
+<!ENTITY emailComment.label "Deve indicar um endereço eletrónico válido para que o possamos contactar, caso precisemos de ajuda para resolver o erro reportado no relatório. O endereço permite-nos também verificar os contributos e criar uma hierarquia.">
+<!ENTITY issues.whitelist.remove.label "Reativar Adblock Plus nesta página">
+<!ENTITY outdatedSubscriptions.description "As seguintes subscrições não são atualizadas há mais de duas semanas. Por favor atualize as subscrições antes de submeter o relatório. O problema pode já ter sido resolvido.">
+<!ENTITY dataCollector.description "Por favor aguarde um momento enquanto o Adblock Plus reúne os dados necessários.">
+<!ENTITY sendButton.label "E&amp;nviar relatório">
+<!ENTITY comment.label "&amp;Comentário (opcional):">
+<!ENTITY sendPage.errorMessage "O envio do relatório falhou com o código de erro &quot;?1?&quot;. Por favor certifique-se que está ligado à Internet e tente novamente. Se o problema persistir, aceda ao [link]fórum do Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Mostrar relatórios recentes">
+<!ENTITY commentPage.heading "Adicionar comentário">
+<!ENTITY update.start.label "Atualizar agora">
+<!ENTITY issues.disabledfilters.description "Os filtros seguintes estão inativos mas podem estar a interferir nesta página:">
+<!ENTITY screenshot.description "A página pode ter um aspeto diferente, consoante a configuração definida. Pode ajudar-nos a perceber o problema se anexar uma imagem ao seu relatório. Pode remover secções que contenham informação sensível e marcar áreas onde o problema seja evidente. Para efetuar estas alterações, clique no botão respetivo e selecione a secção da imagem com o rato.">
+<!ENTITY screenshot.attach.label "Anexar uma imagem ao rela&amp;tório">
+<!ENTITY issues.whitelist.description "O Adblock Plus está inativo na página sobre a qual está a reportar. Por favor reative-o e recarregue a página antes de submeter um relatório para ajudar a analisar este problema.">
+<!ENTITY typeSelector.falseNegative.label "O Adblock Plus não bloqueia um anú&amp;ncio">
+<!ENTITY typeSelector.heading "Selecione o tipo de erro">
+<!ENTITY anonymity.warning "Desta forma, não o poderemos contactar e o mais provável é que lhe iremos dar uma prioridade baixa.">
+<!ENTITY wizard.title "Comunicação de erros">
+<!ENTITY issues.ownfilters.disable.label "Desativar filtro">
+<!ENTITY commentPage.description "O campo de texto seguinte permite-lhe adicionar um comentário para nos ajudar a perceber o problema. Este passo é opcional mas recomendável se o problema não for óbvio. Pode rever o conteúdo do relatório antes de o enviar.">
+<!ENTITY comment.lengthWarning "O comentário excede os 1000 caracteres. Apenas os primeiros 1000 caracteres serão enviados.">
+<!ENTITY typeSelector.falseNegative.description "Selecione esta opção se o anúncio é exibido e o Adblock Plus está ativo.">
+<!ENTITY sendPage.waitMessage "Por favor aguarde enquanto o Adblock Plus submete o seu relatório.">
+<!ENTITY dataCollector.heading "Bem-vindo à comunicação de erros">
+<!ENTITY screenshot.heading "Anexar imagem">
+<!ENTITY sendPage.heading "Enviar relatório">
+<!ENTITY issues.subscriptionCount.description "Parece ter subscrito demasiados filtros. Esta opção não é aconselhável e pode gerar problemas. Não podemos aceitar o seu relatório porque não é claro que filtros devem ser tidos em consideração. Por favor remova todos os filtros exceto os realmente necessários e verifique se o problema ainda ocorre.">
+<!ENTITY screenshot.mark.label "&amp;Marcar o problema">
+<!ENTITY privacyPolicy.label "Política de privacidade">
+<!ENTITY issues.description "O Adblock Plus detetou problemas na sua configuração que poderão ser os responsáveis pelo problema ou que poderão dificultar a análise do relatório.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/sidebar.dtd
new file mode 100644
index 0000000..cdb4186
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Contorno do item flash">
+<!ENTITY address.label "Endereço">
+<!ENTITY context.open.label "Abrir em novo separador">
+<!ENTITY type.label "Tipo">
+<!ENTITY tooltip.filterSource.label "Origem do filtro:">
+<!ENTITY noitems.label "Sem itens bloqueáveis">
+<!ENTITY filter.label "Filtro">
+<!ENTITY tooltip.size.label "Tamanho:">
+<!ENTITY reattach.label "Reancorar">
+<!ENTITY search.label "&amp;Procurar:">
+<!ENTITY docDomain.thirdParty "(terceiros)">
+<!ENTITY filterSource.label "Código fonte do filtro">
+<!ENTITY tooltip.docDomain.label "Origem do documento:">
+<!ENTITY context.copy.label "Copiar endereço do item">
+<!ENTITY tooltip.type.label "Tipo:">
+<!ENTITY context.disablefilter.label "Desativar filtro ?1?">
+<!ENTITY context.copyFilter.label "Copiar filtro">
+<!ENTITY context.block.label "Bloquear este item">
+<!ENTITY context.enablefilter.label "Reativar filtro ?1?">
+<!ENTITY detach.label "Desancorar">
+<!ENTITY whitelisted.label "Página permitida">
+<!ENTITY context.disablefilteronsite.label "Desativar este filtro em ?1?">
+<!ENTITY detached.title "Itens bloqueáveis (desancorada)">
+<!ENTITY docDomain.firstParty "(primeira parte)">
+<!ENTITY tooltip.type.whitelisted "(permitido)">
+<!ENTITY tooltip.filter.label "Filtro ativo:">
+<!ENTITY tooltip.filter.disabled "(inativo)">
+<!ENTITY context.editfilter.label "Editar filtro ativo">
+<!ENTITY tooltip.type.blocked "(bloqueado)">
+<!ENTITY size.label "Tamanho">
+<!ENTITY context.whitelist.label "Adicionar exceção para o item">
+<!ENTITY context.selectAll.label "Selecionar tudo">
+<!ENTITY state.label "Estado">
+<!ENTITY docDomain.label "Origem do documento">
+<!ENTITY tooltip.address.label "Endereço:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/subscriptionSelection.dtd
new file mode 100644
index 0000000..77179e8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Adicionar &amp;subscrição de filtros &quot;?1?&quot;">
+<!ENTITY list.download.failed "O Adblock Plus não conseguiu obter a lista de subscrições.">
+<!ENTITY list.download.retry "Tentar novamente">
+<!ENTITY title.label "&amp;Título da subscrição:">
+<!ENTITY list.download.website "Visitar sítio web">
+<!ENTITY supplementMessage "Esta subscrição deve ser utilizada em conjunto com a subscrição &quot;?1?&quot;, que ainda não está a ser utilizada.">
+<!ENTITY viewList.label "Ver filtros">
+<!ENTITY visitHomepage.label "Visitar página">
+<!ENTITY addSubscription.label "Adicionar subscrição">
+<!ENTITY dialog.title "Adicionar subscrição de filtro">
+<!ENTITY location.label "&amp;Localização de lista de filtros:">
+<!ENTITY fromWeb.description "Por favor confirme a adição dessta subscrição de filtros. Pode alterar o título ou a localização da subscrição antes de a adicionar.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/composer.dtd
new file mode 100644
index 0000000..2bc9f86
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "la s&amp;fârşitul adresei">
+<!ENTITY domainRestriction.label "Aplică &amp;doar domeniului">
+<!ENTITY collapse.default.no.label "Foloseşte opţiunea implicită (nu)">
+<!ENTITY firstParty.label "Doar la pagina &amp;vizitată">
+<!ENTITY preferences.label "&amp;Arată filtrele existente...">
+<!ENTITY pattern.label "Model de căutare pentru potrivire adrese">
+<!ENTITY thirdParty.label "La &amp;pagini partener (3rd party)">
+<!ENTITY filter.label "Fil&amp;tru nou:">
+<!ENTITY collapse.label "Eliberează &amp;spaţiul blocat:">
+<!ENTITY match.warning "Modelul introdus nu mai corespunde adresei care trebuie blocată/deblocată şi de aceea nu va avea nici un efect asupra paginii curente.">
+<!ENTITY anchor.start.label "la î&amp;nceputul adresei">
+<!ENTITY matchCase.label "Potrivire &amp;majusculă">
+<!ENTITY custom.pattern.label "model &amp;individual:">
+<!ENTITY unselectAllTypes.label "Nici unul">
+<!ENTITY type.whitelist.label "Regulă e&amp;xcepţii">
+<!ENTITY regexp.warning "Modelul introdus va fi interpretată ca o expresie regulată, ceea ce poate cauza încetinirea navigării. Dacă nu doriţi să folosiţi expresii regulate, introduceţi * la sfârşitul modelului.">
+<!ENTITY dialog.title "Adăugare regulă de filtrare Adblock Plus">
+<!ENTITY basic.label "Vizualizare simplă">
+<!ENTITY type.filter.label "Filtru de &amp;blocare">
+<!ENTITY types.label "Valabil pentru:">
+<!ENTITY shortpattern.warning "Modelul introdus este prea scurt pentru a fi optimizat, ceea ce poate cauza încetinirea navigării. Este recomandabil să introduceţi modele mai mai lungi.">
+<!ENTITY collapse.yes.label "Da">
+<!ENTITY anchors.label "FoloseÅŸte modelul introdus doar:">
+<!ENTITY collapse.default.yes.label "Foloseşte opţiunea implicită (da)">
+<!ENTITY domainRestriction.help "Specificaţi unul sau mai multe domenii internet, separate de către simbolul |, pentru care filtrul este valid. Simbolul ~ înaintea numelui domeniului va face ca regula să NU se aplice pe domeniul specificat.">
+<!ENTITY accept.label "Adaugă filtru">
+<!ENTITY options.label "Opţiuni">
+<!ENTITY disabled.warning "Adblock Plus este inactiv. Puteţi să adăugaţi filtre, însă ele vor fi utilizate doar după ce [link]activaţi Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "la î&amp;nceputul numelui de domeniu">
+<!ENTITY collapse.no.label "Nu">
+<!ENTITY selectAllTypes.label "Toate tipurile">
+<!ENTITY advanced.label "Vizualizare avansată">
+<!ENTITY pattern.explanation "Filtrul va fi aplicat doar adreselor care corespund modelului definit mai jos, în care simbolul * acţionează ca joker.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/filters.dtd
new file mode 100644
index 0000000..a74e04b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Toate filtrele proprii vor fi înlocuite de către conţinutul fişierului ales. Doriţi să continuaţi?">
+<!ENTITY slow.column "Fi&amp;ltre lente">
+<!ENTITY enabled.column "Activat (&amp;S)">
+<!ENTITY subscription.lastDownload.checksumMismatch "EÅŸuat, suma de control nu se potriveÅŸte.">
+<!ENTITY noFiltersInGroup.text "Grupul selectat este gol.">
+<!ENTITY subscription.actions.label "Acțiuni">
+<!ENTITY filter.selectAll.label "Selectează toate">
+<!ENTITY backupButton.label "&amp;Salvare și Restaurare">
+<!ENTITY restore.minVersion.warning "Avertisment: acest fişier a fost creat de către o versiune mai nouă de Adblock Plus. Se recomandă utilizarea celei mai noi versiuni.">
+<!ENTITY restore.error "Datele din fişier nu pot fi folosite. Verificaţi dacă fişierul a fost într-adevăr create de către Adblock Plus.">
+<!ENTITY sort.ascending.label "Crescător (&amp;A&gt;Z)">
+<!ENTITY sort.label "&amp;Ordonare">
+<!ENTITY subscription.source.label "Listă de filtre">
+<!ENTITY hitcount.column "&amp;Contor">
+<!ENTITY noFilters.text "Nu aveţi nici un filtru propriu.">
+<!ENTITY backup.custom.title "Doar filtre proprii">
+<!ENTITY subscription.external.label "Actualizat de altă extensie">
+<!ENTITY subscription.delete.label "Șterge">
+<!ENTITY noGroupSelected.text "Pentru a vizualiza filtre, trebuie să alegeţi mai întâi un grup.">
+<!ENTITY filter.cut.label "Taie">
+<!ENTITY restore.default.label "Restaurează salvarea din ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Descărcare...">
+<!ENTITY subscriptions.tab.label "Abonamente filtre">
+<!ENTITY sort.descending.label "Descrescător (&amp;Z&gt;A)">
+<!ENTITY filters.remove.warning "Sunteţi sigur că doriţi să ştergeţi filtrele selectate?">
+<!ENTITY filter.delete.label "Åžterge">
+<!ENTITY addSubscriptionAdd.label "Adaugă">
+<!ENTITY viewMenu.label "Vizualizare">
+<!ENTITY subscription.lastDownload.unknown "Necunoscut">
+<!ENTITY addSubscriptionCancel.label "Anulează">
+<!ENTITY subscription.enabled.label "Activat">
+<!ENTITY noSubscriptions.text "Nu aţi adăugat nici un abonament de filtre. Adblock Plus nu blochează nimic dacă nu are filtre. Puteţi folosi butonul Adaugă abonament filtre pentru a vă abona la câteva liste de filtre.">
+<!ENTITY subscription.update.label "Actualizează filtre">
+<!ENTITY dialog.title "Preferințe filtre Adblock Plus">
+<!ENTITY addFilter.label "A&amp;daugă filtru">
+<!ENTITY subscription.minVersion.warning "Acest abonament necesită o versiune mai nouă de Adblock Plus. Se recomandă utilizarea celei mai noi versiuni.">
+<!ENTITY subscription.lastDownload.invalidURL "Eşuat, adresa nu este validă">
+<!ENTITY backup.error "O eroare a apărut la scrierea fişierului. Asiguraţi-vă că fişierul nu este protejat la scriere sau folosit de către altă aplicaţie.">
+<!ENTITY filter.moveUp.label "Mută sus">
+<!ENTITY addGroup.label "Adau&amp;gă grup filtre">
+<!ENTITY filter.edit.label "Editează">
+<!ENTITY subscription.showHideFilters.label "Arată/ascunde filtre">
+<!ENTITY acceptableAds2.label "&amp;Permite publicitatea discretă">
+<!ENTITY addSubscriptionOther.label "Adaugă alt abonament">
+<!ENTITY close.label "ÃŽnchide">
+<!ENTITY sort.none.label "&amp;Neordonat">
+<!ENTITY filter.actions.label "Acțiuni filtre">
+<!ENTITY filter.copy.label "Copiază">
+<!ENTITY filter.moveDown.label "Mută jos">
+<!ENTITY filter.resetHitCounts.label "Iniţializează statisticile filtrelor">
+<!ENTITY readMore.label "Citește mai mult">
+<!ENTITY subscription.moveUp.label "Mută sus">
+<!ENTITY addSubscription.label "Adaugă a&amp;bonament filtru">
+<!ENTITY subscription.homepage.label "Pagina de start">
+<!ENTITY backup.complete.title "Toate filtrele și abonamentele">
+<!ENTITY restore.own.label "Restaurează propria salvare">
+<!ENTITY restore.complete.warning "Toate opţiunile filtrelor vor fi înlocuite de către conţinutul fişierului ales. Doriţi să continuaţi?">
+<!ENTITY filters.tab.label "Filtre proprii">
+<!ENTITY backup.label "Crează salvare nouă">
+<!ENTITY find.label "&amp;Caută">
+<!ENTITY subscription.moveDown.label "Mută jos">
+<!ENTITY subscription.lastDownload.connectionError "Eşuat, descărcare nereuşită">
+<!ENTITY subscription.lastDownload.success "Succes">
+<!ENTITY subscription.lastDownload.invalidData "Eşuat, lista nu este validă">
+<!ENTITY filter.paste.label "LipeÅŸte">
+<!ENTITY subscription.disabledFilters.enable "Activează filtrele inactive">
+<!ENTITY lasthit.column "&amp;Ultima aplicare">
+<!ENTITY subscription.editTitle.label "Editează titlu">
+<!ENTITY subscription.disabledFilters.warning "Unele filtre din acest abonament sunt dezactivate.">
+<!ENTITY filter.column "&amp;Regulă de filtrare">
+<!ENTITY subscription.lastDownload.label "Ultima descărcare:">
+<!ENTITY viewList.label "Afişare listă">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/firstRun.properties
new file mode 100644
index 0000000..f097877
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Navigare fără urme prin eliminarea indiciilor plantate de către companiile publicitare care urmăresc și înregistrează comportamentul dumneavoastră.
+firstRun_toggle_off=OFF
+firstRun_feature_tracking=Dezactivare urmărire
+firstRun_feature_malware=Blocare software rău intenţionat
+firstRun_title=Adblock Plus a fost instalat
+firstRun_toggle_on=ON
+firstRun_acceptableAdsExplanation=Dorim să încurajăm site-urile web în a utiliza publicitate simplă, discretă. De aceea ne-am stabilit <a>reguli de orientare stricte</a> pentru a identifica anunțurile acceptabile, care sunt permise de către setările implicite. Dacă totuși doriți să bloca toată publicitatea, puteți <a>dezactiva</a> aceste permisiuni în câteva secunde.
+firstRun_contributor_credits=Contributori
+firstRun_dataCorruptionWarning=Această pagină continuă să apară și după terminarea instalării? <a>Faceți clic aici!</a>
+firstRun_acceptableAdsHeadline=Reclamele enervante vor fi blocate acum
+firstRun_share=Spuneți prietenilor dumneavoastră
+firstRun_share_headline=<a>Ajutați-ne</a> în a îmbunătăți web-ul
+firstRun_feature_social_description=Eliminare automată a butoanelor mass-media socială, cum ar fi Facebook, care apar pe paginile de web pentru a urmări și înregistra comportamentul dumneavoastră.
+firstRun_filterlistsReinitializedWarning=Se pare că din cauza unor probleme toate filtrele au fost eliminate şi a fost imposibil să le recuperăm. Prin urmare, am resetat filtrele şi setările pentru publicitate acceptabilă. Vă rugăm să verificaţi listele de filtre şi setările pentru publicitate acceptabilă în <a>Opţiuni pentru Adblock Plus</a>.
+firstRun_feature_malware_description=Securizarea navigării prin blocarea domeniilor rău-intenționate cunoscute.
+firstRun_features=Adblock Plus poate face mai mult decât să blocheze publicitatea
+firstRun_donate=Donaţii
+firstRun_donate_label=Ajutați proiectul
+firstRun_feature_social=Ascundere butoane Social Media
+firstRun_legacySafariWarning=Folosiți o versiune veche de Safari care nu este suportată de Adblock Plus. Aceasta putea funcționa incorect sau ar putea afecta navigarea pe unele site-uri. Vă recomandăm insistent să instalați cel puțin Safari 6.1.1 (pe sistemul de operare Mac OS X 10.8 Mountain Lion), sau Safari 7.0.1 (pe OS X 10.9 Mavericks), sau să utilizați cea mai recentă versiune de Mozilla Firefox, Google Chrome, sau Opera.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/global.properties
new file mode 100644
index 0000000..e8ed998
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=În pagină nu se găsește nici un element blocabil
+action3_tooltip=Clic pentru a activa/dezactiva Adblock Plus.
+notification_antiadblock_title=Ascunde mesajele direcționate?
+type_label_script=script
+filter_elemhide_nocriteria=Nu s-a specificat nici un criteriu pentru a identifica elementul pentru ascundere.
+blockingGroup_title=Reguli de blocare
+whitelisted_tooltip=Adblock Plus este activ, dar inactiv în pagina curentă.
+type_label_stylesheet=foaie de stiluri
+blocked_count_tooltip=?1? din ?2?
+type_label_font=corp caracter
+type_label_popup=fereastră pop-up
+filter_regexp_tooltip=Acest filtru este bazat pe expresii regulate sau este prea scurt pentru a fi optimizat. Prea multe astfel de filtre pot duce la încetinirea navigării.
+action0_tooltip=Clic pentru a afiÅŸa meniul contextual, clic-mijloc pentru a activa/dezactiva.
+whitelisted_page=Adblock Plus este inactiv pentru pagina curentă
+remove_group_warning=Sigur doriţi să înlăturaţi acest grup?
+action1_tooltip=Clic pentru a deschide lista elementelor blocabile, clic-mijloc pentru a activa/dezactiva.
+type_label_xmlhttprequest=cerere XML
+active_tooltip=Adblock Plus este activ, sunt folosite ?1? abonamente ÅŸi ?2? filtre proprii.
+type_label_document=document
+type_label_object_subrequest=subcerere obiect
+whitelistGroup_title=Reguli excepţii
+disabled_tooltip=Adblock Plus este inactiv.
+filter_elemhide_duplicate_id=Se poate specifica doar un singur identificator de element pentru ascundere.
+type_label_object=obiect
+action2_tooltip=Clic pentru a modifica opţiuni, clic-mijloc pentru a activa/dezactiva.
+type_label_subdocument=cadru (frame)
+clearStats_warning=Toate statisticile filtrelor vor fi iniţializate şi înregistrarea lor va fi dezactivată. Sunteţi sigur că doriţi să continuaţi?
+notification_antiadblock_message=Acest site trimite mesaje direcționate utilizatorilor Adblock Plus. Vrei ca Adblock Plus să ascundă aceste mesaje direcționate?
+blocked_count_addendum=(permisiuni explicite: ?1?, elemente ascunse: ?2?)
+subscription_invalid_location=Locaţia pentru filtre nu este validă
+type_label_image=imagine
+remove_subscription_warning=Sigur doriţi să îndepărtaţi această subscriere?
+type_label_other=alt element
+mobile_menu_enable=ABP: Activează
+type_label_media=audio-video
+mobile_menu_disable_site=ABP: Dezactivează pe ?1?
+elemhideGroup_title=Reguli de ascuns elemente
+mobile_menu_enable_site=ABP: Activează pe ?1?
+type_label_elemhide=ascuns
+newGroup_title=Grup de filtre nou
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/overlay.dtd
new file mode 100644
index 0000000..4da883a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Da">
+<!ENTITY notification.button.no "&amp;Nu">
+<!ENTITY sync.label "Si&amp;ncronizează setările Adblock Plus">
+<!ENTITY whitelist.site.label "Dezactivează Adblock Plus pe ?1?">
+<!ENTITY filters.label "Pre&amp;ferințe filtre">
+<!ENTITY disable.label "Dezactivează peste tot">
+<!ENTITY objecttab.title "Blochează">
+<!ENTITY objecttab.tooltip "Click aici pentru a bloca obiectul utilizând Adblock Plus">
+<!ENTITY menuitem.label "&amp;Adblock Plus">
+<!ENTITY objecttabs.label "Arată &amp;panouri lângă Flash şi Java">
+<!ENTITY sendReport.label "Rapor&amp;tează probleme pe această pagină">
+<!ENTITY whitelist.page.label "Dezactivează Adblock Plus doar pe pagina curentă">
+<!ENTITY context.image.label "Adblock Plus: blochează imagine">
+<!ENTITY counthits.label "Înre&amp;gistrează statisticile filtrelor">
+<!ENTITY opensidebar.label "Deschide &amp;lista elementelor blocabile">
+<!ENTITY notification.button.close "ÃŽn&amp;chide">
+<!ENTITY contribute.label "Contribuie la Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: blochează cadru">
+<!ENTITY blocked.tooltip "Elemente blocate în pagină:">
+<!ENTITY hideplaceholders.label "Ascunde &amp;indicatoarele elementelor blocate">
+<!ENTITY showinstatusbar.label "Arată în bara de &amp;stare">
+<!ENTITY sidebar.title "Adblock Plus: elemente blocabile în pagină">
+<!ENTITY options.label "&amp;Opţiuni">
+<!ENTITY context.object.label "Adblock Plus: blochează obiect">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: reactivează în pagina curentă">
+<!ENTITY filters.tooltip "Cele mai active filtre:">
+<!ENTITY closesidebar.label "ÃŽnchide &amp;lista elementelor blocabile">
+<!ENTITY showintoolbar.label "Arată în bara de &amp;unelte">
+<!ENTITY status.tooltip "Stare:">
+<!ENTITY context.media.label "Adblock Plus: blochează audio/video">
+<!ENTITY subscription.update.label "Actualizează filtre">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/sendReport.dtd
new file mode 100644
index 0000000..2787f00
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "An&amp;ulează ultima operație">
+<!ENTITY issues.disabledgroups.description "Grupurile de filtre sau abonamentele următoare sunt inactive, deși ar putea să aibă efect pe pagina curentă:">
+<!ENTITY showData.label "AfiÅŸare raportare">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blochează prea &amp;mult">
+<!ENTITY issues.change.description "Configurația a fost schimbată. Reîncărcați pagina pentru a verifica dacă problema persistă. În acest caz, creați o raportare de problemă.">
+<!ENTITY email.label "&amp;Email:">
+<!ENTITY issues.openPreferences.label "Deschide preferințe filtre">
+<!ENTITY sendPage.confirmation "Raportarea a fost salvată și poate fi accesată la adresa următoare:">
+<!ENTITY copyLink.label "&amp;Copiază legătura raportării">
+<!ENTITY issues.nofilters.description "Adblock Plus nu blochează nimic în pagina curentă. Problema pe care o aveți nu are probabil nici o legătură cu Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Problema pe care o aveți este probabil cunoscută. Detalii:">
+<!ENTITY typeSelector.other.description "Alegeți această opțiune dacă aveți impresia că Adblock Plus are o problemă internă.">
+<!ENTITY issues.disabledgroups.enable.label "Activează grupul de filtre / abonamentul">
+<!ENTITY typeWarning.override.label "Trimite rap&amp;ortarea în orice caz">
+<!ENTITY issues.disabled.enable.label "Activează Adblock Plus">
+<!ENTITY update.fixed.description "Actualizarea abonamentelor de filtre va rezolva probabil problema pe care doriți să o raportați. Reîncărcați pagina și utilizați butonul de raportare dacă problema persistă.">
+<!ENTITY anonymous.label "Prezentare an&amp;onima">
+<!ENTITY reloadButton.label "&amp;Reîncărcare pagină">
+<!ENTITY recentReports.clear.label "Șter&amp;ge toate rapoartele">
+<!ENTITY typeSelector.description "Această fereastră vă ghidează prin pașii necesari raportării unei probleme Adblock Plus. Pentru început, alegeți tipul problemei întâlnite pe pagina curentă:">
+<!ENTITY screenshot.remove.label "Masc&amp;hează datele personale">
+<!ENTITY issues.ownfilters.description "Câteva din filtrele aplicate pe această pagină sunt definite de către utilizator. Dezactivați filtrele următoare, care sunt probabil cauza problemei:">
+<!ENTITY update.inProgress.description "Adblock Plus trebui să actualizeze abonamentele de filtre pentru a verifica dacă problema a fost rezolvată între timp. Așteptați un moment.">
+<!ENTITY sendPage.retry.label "Retrimite">
+<!ENTITY data.label "&amp;Datele reportării">
+<!ENTITY recentReports.label "Rapoartele trimise recent">
+<!ENTITY typeWarning.description "Aţi indicat că problema este generală și nu are legătură cu filtrele. Cel mai bine ar fi să raportați problema în [link]forumul Adblock Plus[/link]. Raportarea automată trebuie folosită numai ca unealtă suplimentară pentru o discuție pe forum deja existentă. Pentru aceasta, folosiți legătura generată la sfârșitul operațiunii curente. Dacă nu postați legătura pe forum, este posibil ca nimeni să nu citească raportarea.">
+<!ENTITY issues.disabled.description "Adblock Plus este inactiv și nu va bloca nimic în starea curentă.">
+<!ENTITY attachExtensions.label "Atașea&amp;ză lista suplimentelor active pentru a verifica conflictele potențiale">
+<!ENTITY issues.nosubscriptions.add.label "Adaugă abonament filtre">
+<!ENTITY issues.disabledfilters.enable.label "Activează filtrele">
+<!ENTITY issues.override.label "Configurația es&amp;te corectă, continuă raportarea">
+<!ENTITY issues.nosubscriptions.description "Se pare că nu sunteți abonat la nici o listă de filtre predefinită.">
+<!ENTITY typeSelector.falsePositive.description "Alegeți această opțiune dacă pagina este afișată incorect sau nu funcționează cum trebuie atunci când Adblock Plus este activ. Verificați dacă Adblock Plus este sursa problemei prin dezactivarea temporară a suplimentului.">
+<!ENTITY typeSelector.other.label "Al&amp;tă problemă">
+<!ENTITY emailComment.label "Vă recomandăm să introduceți o adresă validă de email pentru a vă putea contacta cu posibile întrebări despre acest raport. De asemenea, acest lucru ne ajută la recunoașterea contribuțiilor dumneavoastră și la prioritizarea mai bună a acestora.">
+<!ENTITY issues.whitelist.remove.label "Reactivează Adblock Plus pe pagina curentă">
+<!ENTITY outdatedSubscriptions.description "Abonamentele de filtre de mai jos nu au fost actualizate în ultimele două săptămâni. Actualizați-le înainte de a trimite raportul, este posibil ca problema să fi fost deja rezolvată.">
+<!ENTITY dataCollector.description "Așteptați un moment până ce Adblock Plus adună datele necesare.">
+<!ENTITY sendButton.label "Tr&amp;imite raportare">
+<!ENTITY comment.label "&amp;Comentariu (opțional):">
+<!ENTITY sendPage.errorMessage "Eroare la trimitere, cod &quot;?1?&quot;. Verificați dacă sunteți conectat la internet. Dacă problema persistă, cereți ajutor în [link]forumul Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Arată rapoartele trimise recent">
+<!ENTITY commentPage.heading "Introducere comentariu">
+<!ENTITY update.start.label "Actualizează acum">
+<!ENTITY issues.disabledfilters.description "Filtrele următoare sunt inactive, deși ar putea să aibă efect pe pagina curentă:">
+<!ENTITY screenshot.description "Aceeași pagină poate fi afișată diferit pe calculatoare diferite. S-ar putea să ne fie de ajutor la înțelegerea problemei dacă ne trimiteți un instantaneu al paginii curente. Aveți posibilitatea de a înlătura datele confidențiale, precum și de a marca zonele cu probleme, folosind butoanele corespunzătoare și apoi selectând cu mausul.">
+<!ENTITY screenshot.attach.label "Atașează &amp;instantaneu ecran">
+<!ENTITY issues.whitelist.description "Adblock Plus este inactiv pe pagina curentă. Pentru a ajuta la investigarea problemei, activați Adblock Plus și reîncărcați pagina înainte de a trimite un raport.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus &amp;nu blochează o reclamă">
+<!ENTITY typeSelector.heading "Alegeți tipul problemei">
+<!ENTITY anonymity.warning "Nu vom fi capabili sa venim inapoi la tine si sa acordam probabil raportul inferior.">
+<!ENTITY wizard.title "Raportare problemă">
+<!ENTITY issues.ownfilters.disable.label "Dezactivează filtre">
+<!ENTITY commentPage.description "Puteți introduce aici e explicație detaliată care ne poate ajuta să înțelegem mai bine problema (opțional, însă recomandat).">
+<!ENTITY comment.lengthWarning "Comentariul are mai mult de 1000 de litere. Doar primele 1000 vor fi trimise.">
+<!ENTITY typeSelector.falseNegative.description "Alegeți această opțiune în caz că o reclamă este afișată în ciuda faptului că Adblock Plus este activ.">
+<!ENTITY sendPage.waitMessage "Așteptați până când Adblock Plus trimite datele.">
+<!ENTITY dataCollector.heading "Bine ați venit la programul de raportat probleme">
+<!ENTITY screenshot.heading "Atașare instantaneu ecran">
+<!ENTITY sendPage.heading "Trimite raportarea">
+<!ENTITY issues.subscriptionCount.description "Se pare că sunteți abonat la prea multe abonamente de filtru, ceea ce nu este recomandat, deoarece va cauza probabil probleme în viitor. De asemenea, nu poate accepta raportul problemă, deoarece nu este clar care dintre autorii abonamentelor trebuie să ia măsuri. Vă rugăm să păstrați doar abonamentele absolut necesare și să încercați dacă problema persistă.">
+<!ENTITY screenshot.mark.label "&amp;Marcare problemă">
+<!ENTITY privacyPolicy.label "Politica de confidențialitate">
+<!ENTITY issues.description "Adblock Plus a detectat inconsistențe în configurație care pot fi cauza problemei, sau care pot îngreuna trimiterea raportului.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/sidebar.dtd
new file mode 100644
index 0000000..f6400b4
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Evidenţiază marginile elementelor">
+<!ENTITY address.label "Adresă">
+<!ENTITY context.open.label "Deschide în filă nouă">
+<!ENTITY type.label "Tip">
+<!ENTITY tooltip.filterSource.label "Sursă filtru:">
+<!ENTITY noitems.label "Nici un element blocabil">
+<!ENTITY filter.label "Filtru">
+<!ENTITY tooltip.size.label "Mărime:">
+<!ENTITY reattach.label "Prinde la loc">
+<!ENTITY search.label "&amp;Caută:">
+<!ENTITY docDomain.thirdParty "(parte terţă)">
+<!ENTITY filterSource.label "Sursă filtru">
+<!ENTITY tooltip.docDomain.label "Sursă document:">
+<!ENTITY context.copy.label "Copiază adresa elementului">
+<!ENTITY tooltip.type.label "Tip:">
+<!ENTITY context.disablefilter.label "Dezactivează filtru ?1?">
+<!ENTITY context.copyFilter.label "Copiază filtru">
+<!ENTITY context.block.label "Blochează element">
+<!ENTITY context.enablefilter.label "Reactivează filtru ?1?">
+<!ENTITY detach.label "Desprinde">
+<!ENTITY whitelisted.label "Pagini sigure">
+<!ENTITY context.disablefilteronsite.label "Dezactivează acest filtru pe ?1?">
+<!ENTITY detached.title "Adblock Plus: Lista elementelor blocabile în pagină (desprinsă)">
+<!ENTITY docDomain.firstParty "(parte implicată)">
+<!ENTITY tooltip.type.whitelisted "(permis)">
+<!ENTITY tooltip.filter.label "Filtru în acţiune:">
+<!ENTITY tooltip.filter.disabled "(dezactivat)">
+<!ENTITY context.editfilter.label "Modifică filtrul activ">
+<!ENTITY tooltip.type.blocked "(blocat)">
+<!ENTITY size.label "Mărime">
+<!ENTITY context.whitelist.label "Adaugă regulă excepţie pentru element">
+<!ENTITY context.selectAll.label "Selectează tot">
+<!ENTITY state.label "Stare">
+<!ENTITY docDomain.label "Sursă document">
+<!ENTITY tooltip.address.label "Adresă:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/subscriptionSelection.dtd
new file mode 100644
index 0000000..ec7cdbf
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "A&amp;daugă și abonamentul ?1?">
+<!ENTITY list.download.failed "Eroare la descărcarea listei de abonamente.">
+<!ENTITY list.download.retry "Încearcă din nou">
+<!ENTITY title.label "&amp;Titlul abonamentului:">
+<!ENTITY list.download.website "Arată pagina web">
+<!ENTITY supplementMessage "Acest abonament trebuie folosit împreună cu abonamentul ?1?,pe care nu îl folosiți încă.">
+<!ENTITY viewList.label "Vizualizare filtre">
+<!ENTITY visitHomepage.label "Vizualizare pagina de start">
+<!ENTITY addSubscription.label "Adaugă abonament">
+<!ENTITY dialog.title "Adăugare abonamente pentru filtre Adblock Plus">
+<!ENTITY location.label "&amp;Locaţia listei de filtre:">
+<!ENTITY fromWeb.description "Confirmați adăugarea acestui abonament filtre. Puteți schimba titlul sau localizarea înainte de a-l adăuga.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/composer.dtd
new file mode 100644
index 0000000..a7fc2c5
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "в кон&amp;це адреÑа">
+<!ENTITY domainRestriction.label "Ограничить &amp;доменом:">
+<!ENTITY collapse.default.no.label "ИÑпользовать Ñтандартное значение (нет)">
+<!ENTITY firstParty.label "Только Ñлементы Ñ Ñ‚Ð¾&amp;го же Ñайта">
+<!ENTITY preferences.label "Показать Ñу&amp;щеÑтвующие фильтры...">
+<!ENTITY pattern.label "иÑкать шаблон">
+<!ENTITY thirdParty.label "Только Ñторонние Ñлементы">
+<!ENTITY filter.label "Ðовый &amp;фильтр:">
+<!ENTITY collapse.label "Элементы заблокированны:">
+<!ENTITY match.warning "Введенный шаблон не ÑоответÑтвует адреÑу, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ вы Ñоздаете правило, и никак не повлиÑет на него.">
+<!ENTITY anchor.start.label "в на&amp;чале адреÑа">
+<!ENTITY matchCase.label "&amp;Учитывать региÑтр букв">
+<!ENTITY custom.pattern.label "&amp;Другой:">
+<!ENTITY unselectAllTypes.label "Убрать вÑе">
+<!ENTITY type.whitelist.label "ИÑ&amp;ключение">
+<!ENTITY regexp.warning "Введенный шаблон будет понÑÑ‚ как регулÑрное выражение. Большое количеÑтво регулÑрных выражений может отрицательно ÑказатьÑÑ Ð½Ð° быÑтродейÑтвии вашего браузера. ЕÑли вы не ÑобиралиÑÑŒ иÑпользовать регулÑрные выражениÑ, то проÑто добавьте звездочку в конце шаблона.">
+<!ENTITY dialog.title "СоÑтавление фильтра Ð´Ð»Ñ Adblock Plus">
+<!ENTITY basic.label "Стандартный вид">
+<!ENTITY type.filter.label "Правило &amp;блокированиÑ">
+<!ENTITY types.label "ПрименÑть к типам:">
+<!ENTITY shortpattern.warning "Введенный шаблон Ñлишком короткий и потому не будет оптимизирован. Большое количеÑтво таких шаблонов может отрицательно ÑказатьÑÑ Ð½Ð° быÑтродейÑтвии вашего браузера. РекомендуетÑÑ Ð¿Ð¾ возможноÑти иÑпользовать более длинный шаблон.">
+<!ENTITY collapse.yes.label "Да">
+<!ENTITY anchors.label "Принимать шаблон только:">
+<!ENTITY collapse.default.yes.label "ИÑпользовать Ñтандартное значение (да)">
+<!ENTITY domainRestriction.help "Укажите один или неÑколько доменов, разделенные Ñимволом «|», фильтр будет применен только на Ñтих доменах. Символ «~» перед именем домена означает, что фильтр не должен применÑтьÑÑ Ð½Ð° Ñтом домене.">
+<!ENTITY accept.label "Добавить фильтр">
+<!ENTITY options.label "ÐаÑтройки...">
+<!ENTITY disabled.warning "Adblock Plus ÑÐµÐ¹Ñ‡Ð°Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½. Ð’Ñ‹ можете добавить фильтры, но чтобы они работали нужно [link]включить Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "в на&amp;чале имени домена">
+<!ENTITY collapse.no.label "Ðет">
+<!ENTITY selectAllTypes.label "Пометить вÑе">
+<!ENTITY advanced.label "РаÑширенный вид">
+<!ENTITY pattern.explanation "Шаблоном может быть Ð»ÑŽÐ±Ð°Ñ Ñ‡Ð°Ñть адреÑа, причем звездочка (*) заменÑет любое количеÑтво Ñимволов. Фильтр будет применен только к тем адреÑам, которые ÑоответÑтвуют шаблону.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/filters.dtd
new file mode 100644
index 0000000..d1a858b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/filters.dtd
@@ -0,0 +1,73 @@
+<!ENTITY restore.custom.warning "Ð’Ñе ÑобÑтвенные фильтры будут заменены данными Ñтого файла. Продолжать?">
+<!ENTITY slow.column "&amp;Медленное">
+<!ENTITY enabled.column "В&amp;ключено">
+<!ENTITY subscription.lastDownload.checksumMismatch "Ошибка: Ð¿Ñ€Ð¾Ð²ÐµÑ€Ð¾Ñ‡Ð½Ð°Ñ Ñумма не Ñовпадает, возможно произошла ошибка загрузки">
+<!ENTITY noFiltersInGroup.text "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð° фильтров пуÑта.">
+<!ENTITY subscription.actions.label "ДейÑтвиÑ">
+<!ENTITY filter.selectAll.label "Выбрать вÑе">
+<!ENTITY backupButton.label "Резервные &amp;копии и воÑÑтановление">
+<!ENTITY restore.minVersion.warning "Предупреждение: Ñтот файл был запиÑан более новой верÑией Adblock Plus. РекомендуетÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ‚ÑŒ Adblock Plus до поÑледней верÑии, прежде чем воÑÑтанавливать данные из Ñтого файла.">
+<!ENTITY restore.error "Ошибка при обработке данных файла, может Ñто не Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ, ÑÐ¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ Adblock Plus?">
+<!ENTITY sort.ascending.label "Сортировка по ал&amp;фавиту">
+<!ENTITY sort.label "Со&amp;ртировка">
+<!ENTITY subscription.source.label "СпиÑок фильтров">
+<!ENTITY hitcount.column "Сра&amp;батываниÑ">
+<!ENTITY noFilters.text "У Ð²Ð°Ñ Ð¿Ð¾ÐºÐ° что нет ÑобÑтвенных фильтров.">
+<!ENTITY backup.custom.title "Только ÑобÑтвенные фильтры">
+<!ENTITY subscription.external.label "ОбновлÑетÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ раÑширением">
+<!ENTITY subscription.delete.label "Удалить">
+<!ENTITY noGroupSelected.text "Ðужно выбрать группу, чтобы показать ее фильтры.">
+<!ENTITY filter.cut.label "Вырезать">
+<!ENTITY restore.default.label "ВоÑÑтановить копию от ?1?">
+<!ENTITY subscription.lastDownload.inProgress "ÑейчаÑ...">
+<!ENTITY subscriptions.tab.label "ПодпиÑки">
+<!ENTITY sort.descending.label "Ð’ об&amp;ратном порÑдке">
+<!ENTITY filters.remove.warning "Ð’Ñ‹ дейÑтвительно хотите удалить вÑе отмеченные фильтры?">
+<!ENTITY filter.delete.label "Удалить">
+<!ENTITY addSubscriptionAdd.label "Добавить">
+<!ENTITY viewMenu.label "Вид">
+<!ENTITY subscription.lastDownload.unknown "никогда">
+<!ENTITY addSubscriptionCancel.label "Отмена">
+<!ENTITY subscription.enabled.label "Включена">
+<!ENTITY noSubscriptions.text "У Ð²Ð°Ñ Ð¿Ð¾ÐºÐ° нет подпиÑок на фильтры. Без фильтров Adblock Plus ничего не будет
+ блокировать, пожалуйÑта воÑпользуйтеÑÑŒ кнопкой &quot;Добавить подпиÑку&quot;.">
+<!ENTITY subscription.update.label "Обновить фильтры">
+<!ENTITY dialog.title "ÐаÑтройки фильтров Adblock Plus">
+<!ENTITY addFilter.label "Добавить &amp;фильтр">
+<!ENTITY subscription.minVersion.warning "Этот ÑпиÑок фильтров требует более новой верÑии Adblock Plus, желательно обновить Adblock Plus до поÑледней верÑии.">
+<!ENTITY subscription.lastDownload.invalidURL "Ошибка: неверный адреÑ">
+<!ENTITY backup.error "При запиÑи фильтров в файл произошла ошибка. Проверьте, может Ñтот файл защищен от запиÑи или иÑпользуетÑÑ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ программой.">
+<!ENTITY filter.moveUp.label "ПомеÑтить выше">
+<!ENTITY addGroup.label "Добавить &amp;группу фильтров">
+<!ENTITY filter.edit.label "Редактировать">
+<!ENTITY subscription.showHideFilters.label "СпрÑтать/показать фильтры">
+<!ENTITY acceptableAds2.label "Разре&amp;шить некоторую ненавÑзчивую рекламу">
+<!ENTITY addSubscriptionOther.label "Добавить другую подпиÑку">
+<!ENTITY close.label "Закрыть">
+<!ENTITY sort.none.label "Бе&amp;з Ñортировки">
+<!ENTITY filter.actions.label "ДейÑÑ‚Ð²Ð¸Ñ Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ð¼Ð¸">
+<!ENTITY filter.copy.label "Копировать">
+<!ENTITY filter.moveDown.label "ПомеÑтить ниже">
+<!ENTITY filter.resetHitCounts.label "Обнулить ÑтатиÑтику попаданий">
+<!ENTITY readMore.label "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ">
+<!ENTITY subscription.moveUp.label "ПомеÑтить выше">
+<!ENTITY addSubscription.label "До&amp;бавить подпиÑку">
+<!ENTITY subscription.homepage.label "ДомашнÑÑ Ñтраница">
+<!ENTITY backup.complete.title "Ð’Ñе фильтры и подпиÑки">
+<!ENTITY restore.own.label "ВоÑÑтановить ÑобÑтвенную копию">
+<!ENTITY restore.complete.warning "Ð’Ñе ваши фильтры и подпиÑки будут заменены данными Ñтого файла. Продолжать?">
+<!ENTITY filters.tab.label "СобÑтвенные фильтры">
+<!ENTITY backup.label "Создать новую резервную копию">
+<!ENTITY find.label "&amp;Ðайти фильтр">
+<!ENTITY subscription.moveDown.label "ПомеÑтить ниже">
+<!ENTITY subscription.lastDownload.connectionError "Ошибка: невозможно загрузить">
+<!ENTITY subscription.lastDownload.success "OK">
+<!ENTITY subscription.lastDownload.invalidData "Ошибка: неверный формат ÑпиÑка фильтров">
+<!ENTITY filter.paste.label "Ð’Ñтавить">
+<!ENTITY subscription.disabledFilters.enable "Включить отключенные фильтры">
+<!ENTITY lasthit.column "ПоÑ&amp;леднее Ñрабатывание">
+<!ENTITY subscription.editTitle.label "Переименовать">
+<!ENTITY subscription.disabledFilters.warning "Ðекоторые фильтры в Ñтой подпиÑке отключены.">
+<!ENTITY filter.column "&amp;Правило">
+<!ENTITY subscription.lastDownload.label "ПоÑледнее обновление:">
+<!ENTITY viewList.label "Открыть ÑпиÑок">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/firstRun.properties
new file mode 100644
index 0000000..9de16d0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=ПроÑматривайте конфиденциально путем Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ - Ñкрыв ваши дейÑÑ‚Ð²Ð¸Ñ Ð¾Ñ‚ объÑÐ²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ð¹, которые будут отÑлеживать каждый ваш шаг.
+firstRun_toggle_off=ВЫКЛ
+firstRun_feature_tracking=Отключить Ñлежение
+firstRun_feature_malware=Блокирование вредоноÑных программ
+firstRun_title=Adblock Plus уÑтановлен
+firstRun_toggle_on=ВКЛ
+firstRun_acceptableAdsExplanation=Мы хотели бы призвать веб-Ñайты иÑпользовать проÑтую, ненавÑзчивую рекламу. Вот почему мы уÑтановили <a>Ñтрогие принципы</a> Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ÐµÐ¼Ð»ÐµÐ¼Ñ‹Ñ… объÑвлений, которые разрешены в наÑтройках по умолчанию. ЕÑли вы вÑе еще хотите блокировать каждое объÑвление вы можете <a>Отключить</a> Ñто в течение неÑкольких Ñекунд.
+firstRun_contributor_credits=ПожертвованиÑ
+firstRun_dataCorruptionWarning=Эта Ñтраница вÑÑ‘ ещё отображаетÑÑ? <a>Щёлкните здеÑÑŒ!</a>
+firstRun_acceptableAdsHeadline=ÐÐ°Ð´Ð¾ÐµÐ²ÑˆÐ°Ñ Ñ€ÐµÐºÐ»Ð°Ð¼Ð° теперь будет заблокирована
+firstRun_share=РаÑÑказать друзьÑм
+firstRun_share_headline=<a>протÑните нам руку помощи</a> в Ñтремлении Ñделать Интернет лучше
+firstRun_feature_social_description=ÐвтоматичеÑки избавлÑет Ð²Ð°Ñ Ð¾Ñ‚ проÑмотра кнопок Ñоциальных Ñетей, подобных Facebook, которые поÑвлÑÑŽÑ‚ÑÑ Ð½Ð° веб-Ñтраницах и отÑлеживают ваше поведение.
+firstRun_filterlistsReinitializedWarning=Похоже ошибка привела к тому, что вÑе фильтры удалены, и мы не можем их воÑÑтановить из резервной копии. ПоÑтому мы ÑброÑили ваши фильтры и параметры "ненавÑзчивой" рекламы. ПожалуйÑта проверьте ÑпиÑок ваших фильтров и параметры "ненавÑзчивой "рекламы в <a>параметры Adblock Plus</a>.
+firstRun_feature_malware_description=Делает ваш браузер более безопаÑным путем Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð·Ð²ÐµÑтных вредоноÑных доменов.
+firstRun_features=AdBlock Plus ÑпоÑобен на большее, чем проÑто блокировать рекламу
+firstRun_donate=пожертвовать
+firstRun_donate_label=Поддержать наш проект
+firstRun_feature_social=УдалÑть кнопки Ñоциальных Ñетей
+firstRun_legacySafariWarning=Ð’Ñ‹ иÑпользуете Ñтарую верÑию Safari, который не поддерживаетÑÑ Adblock Plus. Она может работать не правильно или ухудшать качеÑтво работы Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ð° некоторых веб-Ñайтах. Мы наÑтоÑтельно рекомендуем обновитьÑÑ Ð´Ð¾ Safari 6.1.1 или выше (в OS X 10.8 Mountain Lion), или Safari 7.0.1 или выше (в OS X 10.9 Mavericks), или иÑпользовать поÑледнюю верÑию Mozilla Firefox, Google Chrome или Opera.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/global.properties
new file mode 100644
index 0000000..c279c00
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Ðа открытой Ñтранице нет Ñлементов, которые можно было бы заблокировать
+action3_tooltip=Щелкните здеÑÑŒ, чтобы включить или отключить Adblock Plus.
+notification_antiadblock_title=Ñкрыть целевых Ñообщений?
+type_label_script=Скрипт
+filter_elemhide_nocriteria=Ðе указано никаких признаков, чтобы опознать Ñлемент, который нужно Ñкрыть
+blockingGroup_title=Правила блокированиÑ
+whitelisted_tooltip=Adblock Plus отключен на Ñтой Ñтранице.
+type_label_stylesheet=Стили
+blocked_count_tooltip=?1? из ?2?
+type_label_font=Шрифт
+type_label_popup=Ð’Ñплывающее окно
+filter_regexp_tooltip=Этот фильтр либо ÑвлÑетÑÑ Ñ€ÐµÐ³ÑƒÐ»Ñрным выражением, либо Ñлишком короткий Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ð¸. Большое количеÑтво таких фильтров может отрицательно ÑказатьÑÑ Ð½Ð° быÑтродейÑтвии вашего браузера.
+action0_tooltip=Щелкните здеÑÑŒ, чтобы открыть контекÑтное меню. Ðажмите Ñреднюю клавишу мышки, чтобы включить или отключить Adblock Plus.
+whitelisted_page=Adblock Plus отключен на Ñтой Ñтранице
+remove_group_warning=Ð’Ñ‹ уверены, что хотите удалить Ñту группу?
+action1_tooltip=Щелкните здеÑÑŒ, чтобы открыть/закрыть ÑпиÑок Ñлементов. Ðажмите Ñреднюю клавишу мышки, чтобы включить или отключить Adblock Plus.
+type_label_xmlhttprequest=XML-запроÑ
+active_tooltip=Adblock Plus включен, иÑпользуетÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñок: ?1?, ÑобÑтвенных фильтров: ?2?.
+type_label_document=Документ
+type_label_object_subrequest=Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°
+whitelistGroup_title=ИÑключениÑ
+disabled_tooltip=Adblock Plus отключен.
+filter_elemhide_duplicate_id=У Ñлемента, который нужно Ñкрыть, может быть только один идентификатор
+type_label_object=Объект
+action2_tooltip=Щелкните здеÑÑŒ, чтобы открыть окно уÑтановок. Ðажмите Ñреднюю клавишу мышки, чтобы включить или отключить Adblock Plus.
+type_label_subdocument=Фрейм
+clearStats_warning=СтатиÑтика попаданий будет обнулена Ð´Ð»Ñ Ð²Ñех фильтров и в дальнейшем больше не будет запиÑыватьÑÑ. Продолжать?
+notification_antiadblock_message=Этот Ñайт, как извеÑтно, показывают целевые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Adblock Plus. Хотите Adblock Plus, чтобы Ñкрыть целевых Ñообщений?
+blocked_count_addendum=(также иÑключений: ?1?, ÑпрÑтано: ?2?)
+subscription_invalid_location=Ðе удалоÑÑŒ раÑпознать введенный Ð°Ð´Ñ€ÐµÑ Ð½Ð¸ как Ð°Ð´Ñ€ÐµÑ Ð² интернете, ни как путь файлу.
+type_label_image=Изображение
+remove_subscription_warning=Ð’Ñ‹ уверены, что хотите удалить Ñту подпиÑку?
+type_label_other=ÐеизвеÑтен
+mobile_menu_enable=ABP: Включить
+type_label_media=Ðудио/видео
+mobile_menu_disable_site=ABP: Отключить на ?1?
+elemhideGroup_title=Правила ÑкрытиÑ
+mobile_menu_enable_site=ABP: Включить на ?1?
+type_label_elemhide=Скрыто
+newGroup_title=ÐÐ¾Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð° фильтров
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/overlay.dtd
new file mode 100644
index 0000000..dd49760
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;да">
+<!ENTITY notification.button.no "&amp;нет">
+<!ENTITY sync.label "Син&amp;хронизировать наÑтройки Adblock Plus">
+<!ENTITY whitelist.site.label "Отключить на ?1?">
+<!ENTITY filters.label "ÐаÑтройки &amp;фильтров">
+<!ENTITY disable.label "Отключить везде">
+<!ENTITY objecttab.title "Блокировать">
+<!ENTITY objecttab.tooltip "Ðажмите здеÑÑŒ, чтобы Adblock Plus заблокировал Ñтот объект">
+<!ENTITY menuitem.label "УÑтановки &amp;Adblock Plus">
+<!ENTITY objecttabs.label "Показывать &amp;Ñрлык на Flash и Java">
+<!ENTITY sendReport.label "&amp;Сообщить о проблеме на Ñтой Ñтранице">
+<!ENTITY whitelist.page.label "Отключить только на Ñтой Ñтранице">
+<!ENTITY context.image.label "Adblock Plus: заблокировать изображение">
+<!ENTITY counthits.label "С&amp;читать ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð¾Ð²">
+<!ENTITY opensidebar.label "Открыть Ñ&amp;пиÑок Ñлементов">
+<!ENTITY notification.button.close "&amp;близко">
+<!ENTITY contribute.label "Помочь проекту Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: заблокировать фрейм">
+<!ENTITY blocked.tooltip "Заблокированные Ñлементы на Ñтой Ñтранице:">
+<!ENTITY hideplaceholders.label "ПрÑтать &amp;метки на меÑте заблокированных Ñлементов">
+<!ENTITY showinstatusbar.label "Показывать в &amp;Ñтроке ÑоÑтоÑниÑ">
+<!ENTITY sidebar.title "Элементы открытой Ñтраницы">
+<!ENTITY options.label "&amp;ÐаÑтройки">
+<!ENTITY context.object.label "Adblock Plus: заблокировать объект">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: включить обратно на Ñтой Ñтранице">
+<!ENTITY filters.tooltip "Ðаиболее чаÑто примененные фильтры:">
+<!ENTITY closesidebar.label "Закрыть Ñ&amp;пиÑок Ñлементов">
+<!ENTITY showintoolbar.label "&amp;Показывать в панели инÑтрументов">
+<!ENTITY status.tooltip "СтатуÑ:">
+<!ENTITY context.media.label "Adblock Plus: заблокировать аудио/видео">
+<!ENTITY subscription.update.label "Обновить фильтры">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/sendReport.dtd
new file mode 100644
index 0000000..39b1b77
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/sendReport.dtd
@@ -0,0 +1,100 @@
+<!ENTITY screenshot.undo.label "&amp;Отменить">
+<!ENTITY issues.disabledgroups.description "Следующие подпиÑки / группы фильтров отключены, но могли бы повлиÑть на Ñту Ñтраницу:">
+<!ENTITY showData.label "Показать данные ÑообщениÑ">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus блокирует Ñлишко&amp;м многое">
+<!ENTITY issues.change.description "Ваши наÑтройки изменилиÑÑŒ. ПожалуйÑта, обновите Ñтраницу Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸
+ внеÑенных изменений и отправьте Ñообщение, еÑли проблема не разрешилаÑÑŒ.">
+<!ENTITY email.label "E-&amp;mail:">
+<!ENTITY issues.openPreferences.label "Открыть наÑтройки фильтров">
+<!ENTITY sendPage.confirmation "Сообщение отправлено и Ñохранено. Ð’Ñ‹ можете проÑмотреть его по Ñледующей ÑÑылке:">
+<!ENTITY copyLink.label "С&amp;копировать ÑÑылку на Ñообщение">
+<!ENTITY issues.nofilters.description "Adblock Plus ничего не блокирует на Ñтой Ñтранице. Скорее вÑего, проблема,
+ которую вы наблюдаете, не ÑвÑзана Ñ Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Возможно, что проблема, о которой вы Ñообщили, уже извеÑтна. Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ:">
+<!ENTITY typeSelector.other.description "ЕÑли вы подозреваете, что проблема в Ñамом раÑширении Adblock Plus,
+ а не в его фильтрах, то выберите Ñтот вариант.">
+<!ENTITY issues.disabledgroups.enable.label "Включить подпиÑку / группу фильтров">
+<!ENTITY typeWarning.override.label "Я &amp;понÑл и, тем не менее, хочу отправить Ñообщение">
+<!ENTITY issues.disabled.enable.label "Включить Adblock Plus">
+<!ENTITY update.fixed.description "Обновление ваших подпиÑок на фильтры Ñкорее вÑего решило проблему, о которой
+ вы хотели Ñообщить. ПожалуйÑта загрузите заново Ñтраницу и попробуйте еще раз.
+ ЕÑли проблема оÑталоÑÑŒ, то пошлите Ñообщение еще раз.">
+<!ENTITY anonymous.label "Отпр&amp;авить анонимно">
+<!ENTITY reloadButton.label "Об&amp;новить Ñтраницу">
+<!ENTITY recentReports.clear.label "Уда&amp;лить вÑе ÑообщениÑ">
+<!ENTITY typeSelector.description "МаÑтер поможет вам отправить Ñообщение о проблеме Ñ Adblock Plus.
+ ПожалуйÑта, укажите на Ñтой Ñтранице тип проблемы, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ вы ÑтолкнулиÑÑŒ:">
+<!ENTITY screenshot.remove.label "У&amp;далить конфиденциальные данные">
+<!ENTITY issues.ownfilters.description "Ðекоторые фильтры, которые применÑÑŽÑ‚ÑÑ Ð½Ð° Ñтой Ñтранице, вы добавили Ñами.
+ ПожалуйÑта, отключите фильтры, которые могли вызвать Ñту проблему:">
+<!ENTITY update.inProgress.description "Adblock Plus должен обновить ваши подпиÑки на фильтры, чтобы удоÑтоверитьÑÑ,
+ что проблема еще не была решена. Подождите, пожалуйÑта...">
+<!ENTITY sendPage.retry.label "Отправить еще раз">
+<!ENTITY data.label "Да&amp;нные ÑообщениÑ:">
+<!ENTITY recentReports.label "Ваши недавно отправленные ÑообщениÑ">
+<!ENTITY typeWarning.description "Ð’Ñ‹ указали, что хотите Ñообщить о проблеме в Adblock Plus, а не в его фильтрах.
+ ПожалуйÑта, учтите, что о таких проблемах лучше Ñообщать на
+ [link]форуме Adblock Plus[/link]. МаÑтер отправки ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñледует
+ иÑпользовать лишь Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ к обÑуждению на форуме, поÑкольку
+ никто не увидит ваше Ñообщение, еÑли не оÑтавить на него ÑÑылку. Ð’Ñ‹
+ получите автоматичеÑки Ñозданную ÑÑылку поÑле отправки ÑообщениÑ.">
+<!ENTITY issues.disabled.description "Adblock Plus отключен и ничего не блокирует в Ñтом ÑоÑтоÑнии.">
+<!ENTITY attachExtensions.label "П&amp;рикрепить ÑпиÑок включенных раÑширений к Ñообщению на Ñлучай, еÑли проблема вызвана конфликтом раÑширений">
+<!ENTITY issues.nosubscriptions.add.label "Добавить подпиÑку">
+<!ENTITY issues.disabledfilters.enable.label "Включить фильтр">
+<!ENTITY issues.override.label "ÐаÑтройки в &amp;порÑдке, продолжить отправление ÑообщениÑ">
+<!ENTITY issues.nosubscriptions.description "Ð’Ñ‹ не подпиÑаны ни на один из готовых ÑпиÑков фильтров, которые автоматичеÑки
+ блокируют нежелательные Ñлементы Ñтраниц.">
+<!ENTITY typeSelector.falsePositive.description "ЕÑли на Ñтранице отÑутÑтвуют важные чаÑти Ñодержимого, а также еÑли она
+ отображаетÑÑ Ð¸Ð»Ð¸ функционирует неправильно, то Ñледует выбрать Ñтот вариант.
+ Ð’Ñ‹ можете проверить, ÑвлÑетÑÑ Ð»Ð¸ Adblock Plus иÑточником проблемы, временно
+ отключив его.">
+<!ENTITY typeSelector.other.label "&amp;Ð”Ñ€ÑƒÐ³Ð°Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð°">
+<!ENTITY emailComment.label "Мы рекомендуем ввеÑти e-mail адреÑ, по которому мы могли бы ÑвÑзатьÑÑ Ð² Ñлучает вопроÑов по вашему Ñообщению. Это также позволит нам узнавать Ваши взноÑÑ‹ и обрабатывать их в предпочтительном порÑдке.">
+<!ENTITY issues.whitelist.remove.label "Включить Adblock Plus на Ñтой Ñтранице">
+<!ENTITY outdatedSubscriptions.description "Следующие подпиÑки на фильтры не обновлÑлиÑÑŒ более двух недель. ПожалуйÑта,
+ обновите Ñти подпиÑки перед отправлением ÑообщениÑ, поÑкольку проблема уже
+ может быть решена.">
+<!ENTITY dataCollector.description "ПожалуйÑта, подождите неÑколько Ñекунд, пока Adblock Plus Ñобирает нужные данные.">
+<!ENTITY sendButton.label "От&amp;править Ñообщение">
+<!ENTITY comment.label "&amp;Комментарий (необÑзательно):">
+<!ENTITY sendPage.errorMessage "Ошибка отправки ÑообщениÑ: «?1?». ПожалуйÑта,
+ удоÑтоверьтеÑÑŒ, что ваше Ñоединение Ñ Ñетью Интернет работает, и попробуйте еще раз.
+ ЕÑли проблема оÑтаетÑÑ, обратитеÑÑŒ в [link]форум Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Показать недавно отправленные ÑообщениÑ">
+<!ENTITY commentPage.heading "Комментарий">
+<!ENTITY update.start.label "Обновить подпиÑки">
+<!ENTITY issues.disabledfilters.description "Следующие фильтры отключены, но могли бы повлиÑть на Ñту Ñтраницу:">
+<!ENTITY screenshot.description "Одна и та же Ñтраница может выглÑдеть по-разному Ð´Ð»Ñ Ñ€Ð°Ð·Ð½Ñ‹Ñ… людей. Снимок Ñкрана
+ может помочь нам понÑть проблему. Ð’Ñ‹ можете удалить конфиденциальные чаÑти Ñнимка
+ или пометить облаÑть Ñнимка, в которой проÑвлÑетÑÑ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð°. Ð”Ð»Ñ Ñтого
+ нажмите на ÑоответÑтвующую кнопку и выберите мышкой чаÑть Ñнимка.">
+<!ENTITY screenshot.attach.label "При&amp;крепить Ñнимок Ñкрана к Ñообщению">
+<!ENTITY issues.whitelist.description "Adblock Plus отключен на Ñтранице, о которой вы ÑобираетеÑÑŒ Ñообщить. ПожалуйÑта,
+ включите Adblock Plus и обновите Ñтраницу, прежде чем поÑылать Ñообщение.
+ Это поможет раÑÑмотрению вашего ÑообщениÑ.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus не блоки&amp;рует рекламу">
+<!ENTITY typeSelector.heading "Выбор типа проблемы">
+<!ENTITY anonymity.warning "Мы не Ñможем ÑвÑзатьÑÑ Ñ Ð²Ð°Ð¼Ð¸ и, вероÑтно, уделим меньше Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð’Ð°ÑˆÐµÐ¼Ñƒ Ñообщению.">
+<!ENTITY wizard.title "Сообщить о проблеме">
+<!ENTITY issues.ownfilters.disable.label "Отключить фильтр">
+<!ENTITY commentPage.description "Внизу вы можете добавить комментарий, чтобы помочь нам понÑть проблему.
+ Это не обÑзательно, но рекомендуетÑÑ Ð´Ð»Ñ Ð½ÐµÐ¾Ñ‡ÐµÐ²Ð¸Ð´Ð½Ñ‹Ñ… проблем.
+ Также вы можете проверить данные ÑообщениÑ, прежде чем оно будет
+ отправлено.">
+<!ENTITY comment.lengthWarning "Длина ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸Ñ Ð¿Ñ€ÐµÐ²Ñ‹ÑˆÐ°ÐµÑ‚ 1000 Ñимволов. Только первые 1000 Ñимволов будут отправлены.">
+<!ENTITY typeSelector.falseNegative.description "ЕÑли неÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° то, что Adblock Plus включен, на Ñтранице отображаетÑÑ Ñ€ÐµÐºÐ»Ð°Ð¼Ð°,
+ то Ñледует выбрать Ñтот вариант.">
+<!ENTITY sendPage.waitMessage "ПожалуйÑта, подождите, пока Adblock Plus отправлÑет ваше Ñообщение.">
+<!ENTITY dataCollector.heading "Добро пожаловать в маÑтер отправки ÑообщениÑ">
+<!ENTITY screenshot.heading "Снимок Ñкрана">
+<!ENTITY sendPage.heading "Отправка ÑообщениÑ">
+<!ENTITY issues.subscriptionCount.description "Похоже, что вы подпиÑаны на Ñлишком большое количеÑтво ÑпиÑков фильтров. Это
+ не рекомендуетÑÑ, поÑкольку Ñильно возраÑтает вероÑтноÑть проблем. Помимо
+ Ñтого, мы не можем принÑть ваше Ñообщение, поÑкольку неÑÑно, какой из ÑпиÑков
+ фильтров нужно иÑправлÑть. ПожалуйÑта, удалите вÑе ÑпиÑки фильтров кроме
+ дейÑтвительно нужных. ПоÑле Ñтого проверьте, проÑвлÑетÑÑ Ð»Ð¸ еще проблема.">
+<!ENTITY screenshot.mark.label "&amp;Пометить проблему">
+<!ENTITY privacyPolicy.label "Правила конфиденциальноÑти">
+<!ENTITY issues.description "Adblock Plus обнаружил проблемы в ваших наÑтройках, которые, возможно, вызвали
+ данную проблему или уÑложнÑÑ‚ раÑÑмотрение вашего ÑообщениÑ.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/sidebar.dtd
new file mode 100644
index 0000000..7786487
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Показать раÑположение Ñлемента">
+<!ENTITY address.label "ÐдреÑ">
+<!ENTITY context.open.label "Открыть в новой вкладке">
+<!ENTITY type.label "Тип">
+<!ENTITY tooltip.filterSource.label "ИÑточник фильтра:">
+<!ENTITY noitems.label "Блокировать нечего">
+<!ENTITY filter.label "Фильтр">
+<!ENTITY tooltip.size.label "Размер:">
+<!ENTITY reattach.label "ПриÑоединить">
+<!ENTITY search.label "П&amp;оиÑк:">
+<!ENTITY docDomain.thirdParty "(Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð³Ð¾ Ñайта)">
+<!ENTITY filterSource.label "СпиÑок фильтров">
+<!ENTITY tooltip.docDomain.label "Домен Ñтраницы:">
+<!ENTITY context.copy.label "Копировать адреÑ">
+<!ENTITY tooltip.type.label "Тип:">
+<!ENTITY context.disablefilter.label "Отключить фильтр ?1?">
+<!ENTITY context.copyFilter.label "Копировать фильтр">
+<!ENTITY context.block.label "Заблокировать Ñлемент">
+<!ENTITY context.enablefilter.label "Включить обратно фильтр ?1?">
+<!ENTITY detach.label "ОтÑоединить">
+<!ENTITY whitelisted.label "Отключен на Ñтой Ñтранице">
+<!ENTITY context.disablefilteronsite.label "Отключить фильтр на ?1?">
+<!ENTITY detached.title "Adblock Plus: Ñлементы открытой Ñтраницы (отÑоединены)">
+<!ENTITY docDomain.firstParty "(Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñ Ñ‚Ð¾Ð³Ð¾ же Ñайта)">
+<!ENTITY tooltip.type.whitelisted "(иÑключение)">
+<!ENTITY tooltip.filter.label "Применен фильтр:">
+<!ENTITY tooltip.filter.disabled "(отключен)">
+<!ENTITY context.editfilter.label "Отредактировать примененный фильтр">
+<!ENTITY tooltip.type.blocked "(заблокирован)">
+<!ENTITY size.label "Размер">
+<!ENTITY context.whitelist.label "Добавить иÑключение Ð´Ð»Ñ Ñлемента">
+<!ENTITY context.selectAll.label "Выделить вÑÑ‘">
+<!ENTITY state.label "СтатуÑ">
+<!ENTITY docDomain.label "Домен Ñтраницы">
+<!ENTITY tooltip.address.label "ÐдреÑ:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/subscriptionSelection.dtd
new file mode 100644
index 0000000..080da8b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Доба&amp;вить подпиÑку на ÑпиÑок фильтров «?1?»">
+<!ENTITY list.download.failed "При Ñкачивании ÑпиÑка подпиÑок произошла ошибка.">
+<!ENTITY list.download.retry "Попробовать еще раз">
+<!ENTITY title.label "Ðа&amp;звание подпиÑки:">
+<!ENTITY list.download.website "Открыть Ñтраницу Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñками">
+<!ENTITY supplementMessage "Этот ÑпиÑок фильтров должен иÑпользоватьÑÑ Ð² комбинации Ñо ÑпиÑком фильтров «?1?», который вы не иÑпользуете.">
+<!ENTITY viewList.label "ПроÑмотреть фильтры">
+<!ENTITY visitHomepage.label "ПоÑетить домашнюю Ñтраницу ÑпиÑка">
+<!ENTITY addSubscription.label "Добавить подпиÑку">
+<!ENTITY dialog.title "Добавить подпиÑку Ð´Ð»Ñ Adblock Plus">
+<!ENTITY location.label "Ð&amp;Ð´Ñ€ÐµÑ ÑпиÑка фильтров:">
+<!ENTITY fromWeb.description "ПожалуйÑта, подтвердите, что вы дейÑтвительно хотите добавить подпиÑку на Ñтот ÑпиÑок фильтров. Ð’Ñ‹ можете изменить название и Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñки перед добавлением.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/composer.dtd
new file mode 100644
index 0000000..23604b6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "na konci a&amp;dresy">
+<!ENTITY domainRestriction.label "Obm&amp;edziť na doménu:">
+<!ENTITY collapse.default.no.label "Použiť predvolené (nie)">
+<!ENTITY firstParty.label "&amp;Len prvá strana">
+<!ENTITY preferences.label "&amp;Zobraziť existujúce filtre...">
+<!ENTITY pattern.label "Vyhľadať vzor">
+<!ENTITY thirdParty.label "Len &amp;tretie strany">
+<!ENTITY filter.label "Nový &amp;filter:">
+<!ENTITY collapse.label "Pád zabl&amp;okovaný::">
+<!ENTITY match.warning "Vzor, ktorý ste vložili nezodpovedá blokovanej/povolenej adrese a nebude mať žiadny efekt.">
+<!ENTITY anchor.start.label "&amp;na zaÄiatku adresy">
+<!ENTITY matchCase.label "&amp;Modelový prípad">
+<!ENTITY custom.pattern.label "&amp;Vlastné:">
+<!ENTITY unselectAllTypes.label "NezvoliÅ¥ niÄ">
+<!ENTITY type.whitelist.label "Základné pravidlo">
+<!ENTITY regexp.warning "Vzor, ktorý ste vložili bude interpretovaný ako regulárny výraz. Mnoho regulárnych výrazov môže spomaliť prehliadanie. Ak ste nemali v úmysle používať regulárne výrazy, pridajte symbol * na koniec vzoru.">
+<!ENTITY dialog.title "Pridať pravidlo filtra">
+<!ENTITY basic.label "Jednoduchý náhľad">
+<!ENTITY type.filter.label "Blokovanie filtra">
+<!ENTITY types.label "Aplikovať na typy:">
+<!ENTITY shortpattern.warning "Vzor, ktorý ste vložili je príliÅ¡ krátky, aby mohol byÅ¥ optimalizovaný, mnoho takýchto schém môže spomaliÅ¥ prehliadanie. OdporúÄame, aby ste vybrali dlhší reÅ¥azec pre tento filter.">
+<!ENTITY collapse.yes.label "Ãno">
+<!ENTITY anchors.label "Prijať vzor len:">
+<!ENTITY collapse.default.yes.label "Použiť predvolené (áno)">
+<!ENTITY domainRestriction.help "Å pecifikujte jednu alebo viac domén oddelených znaÄkou &quot;|&quot;, filter bude obmedzený len pre tieto domény. Symbol &quot;~&quot; pred názvom domény znamená, že filter by nemal byÅ¥ aplikovaný na tejto doméne.">
+<!ENTITY accept.label "Pridať filter">
+<!ENTITY options.label "Možnosti">
+<!ENTITY disabled.warning "Adblock Plus je aktuálne vypnutý. Môžete pridávať filtre, ale tie nebudú aplikované pokiaľ [link]nezapnete Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "&amp;na zaÄiatku názvu domény">
+<!ENTITY collapse.no.label "Nie">
+<!ENTITY selectAllTypes.label "Vybrať všetko">
+<!ENTITY advanced.label "PokroÄilý náhľad">
+<!ENTITY pattern.explanation "Vzor môže byÅ¥ nejaká ÄasÅ¥ adresy, symbol * ako divoká karta. Filter eÅ¡te len bude aplikovaný na adresy zodpovedajúce vzoru.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/filters.dtd
new file mode 100644
index 0000000..ed28642
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "VÅ¡etky vaÅ¡e vlastné filtre budú nahradené obsahom zo zvoleného súboru. Prajete si pokraÄovaÅ¥?">
+<!ENTITY slow.column "&amp;Voľné filtre">
+<!ENTITY enabled.column "&amp;Zapnuté">
+<!ENTITY subscription.lastDownload.checksumMismatch "Zlyhalo, chybné prispôsobenie kontrolného súÄtu">
+<!ENTITY noFiltersInGroup.text "Zvolená skupiny je prázdna">
+<!ENTITY subscription.actions.label "Úlohy">
+<!ENTITY filter.selectAll.label "Vybrať všetko">
+<!ENTITY backupButton.label "&amp;Záloha a Obnova">
+<!ENTITY restore.minVersion.warning "Upozornenie: súbor bol vytvorený novšou verziuo Adblock Plus. Mali by ste aktualizovať na novšiu verziu predtým, než obnovíte z tohto súboru.">
+<!ENTITY restore.error "Údaje súborov nemôžu byť spacované, možno to nie zálohovací súbor Adblock Plus?">
+<!ENTITY sort.ascending.label "Triediť od &amp;A &gt; Z">
+<!ENTITY sort.label "&amp;Triediť podľa">
+<!ENTITY subscription.source.label "Zoznam filtrov">
+<!ENTITY hitcount.column "&amp;PoÄítadlá">
+<!ENTITY noFilters.text "Zatiaľ nemáte žiadne vlastné filtre.">
+<!ENTITY backup.custom.title "Len vlastné filtre">
+<!ENTITY subscription.external.label "Aktualizované iným rozšírením">
+<!ENTITY subscription.delete.label "Zmazať">
+<!ENTITY noGroupSelected.text "Musíte vybrať skupinu filtrov predtým, než sa tieto filtre zobrazia.">
+<!ENTITY filter.cut.label "Vystrihnúť">
+<!ENTITY restore.default.label "Obnoviť zálohu z ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Preberanie...">
+<!ENTITY subscriptions.tab.label "Odbery filtrov">
+<!ENTITY sort.descending.label "Trie&amp;diť od Z &gt; A">
+<!ENTITY filters.remove.warning "Naozaj chcete odstrániť všetky vybraté filtre?">
+<!ENTITY filter.delete.label "Odstrániť">
+<!ENTITY addSubscriptionAdd.label "Pridať">
+<!ENTITY viewMenu.label "Zobraziť">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY addSubscriptionCancel.label "Zrušiť">
+<!ENTITY subscription.enabled.label "Zapnuté">
+<!ENTITY noSubscriptions.text "Ziataľ nie sú pridané žiadne odbery filtrov. Adblock Plus nebude blokovať
+ niÄ bez filtrov, použite, prosím &quot;PridaÅ¥ odber filtra&quot; pre
+ pridanie.">
+<!ENTITY subscription.update.label "Aktualizovať filtre">
+<!ENTITY dialog.title "Nastavenia filtra">
+<!ENTITY addFilter.label "Pridať filt&amp;er">
+<!ENTITY subscription.minVersion.warning "Odoberanie tohto filtra vyžaduje novšiu verziu Adblock Olus, môžete aktualizovať na ostatnú verziu Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Zlyhanie, neplatná adresa">
+<!ENTITY backup.error "Pri zápise filtra do súboru sa vyskytla chyba. Uistite sa, že súbor nie je chránený proti zapisovaniu alebo nie je používaný inou aplikáciou.">
+<!ENTITY filter.moveUp.label "Posunúť hore">
+<!ENTITY addGroup.label "Pridať skupinu &amp;filtrov">
+<!ENTITY filter.edit.label "Upraviť">
+<!ENTITY subscription.showHideFilters.label "Zobraziť/skryť filter">
+<!ENTITY acceptableAds2.label "Povol&amp;iť niektoré nevtieravé reklamy">
+<!ENTITY addSubscriptionOther.label "Pridať iné odoberania">
+<!ENTITY close.label "Zatvoriť">
+<!ENTITY sort.none.label "&amp;Netriedené">
+<!ENTITY filter.actions.label "Úlohy filtrov">
+<!ENTITY filter.copy.label "Kopírovať">
+<!ENTITY filter.moveDown.label "Posunúť dole">
+<!ENTITY filter.resetHitCounts.label "ResetovaÅ¥ Å¡tatistiku poÄítadla">
+<!ENTITY readMore.label "Zobraziť viac">
+<!ENTITY subscription.moveUp.label "Posunúť hore">
+<!ENTITY addSubscription.label "P&amp;ridať povolenie filtra">
+<!ENTITY subscription.homepage.label "Domovská stránka">
+<!ENTITY backup.complete.title "Všetky filtre a odbery">
+<!ENTITY restore.own.label "Obnoviť vlastnú zálohu">
+<!ENTITY restore.complete.warning "VÅ¡etky nastavenia filtrov budú nahradené obsahom zo zvoleného súboru. Prajete si pokraÄovaÅ¥?">
+<!ENTITY filters.tab.label "Vlastné filtre">
+<!ENTITY backup.label "Vytvoriť novú zálohu">
+<!ENTITY find.label "Náj&amp;sť">
+<!ENTITY subscription.moveDown.label "Posunúť dole">
+<!ENTITY subscription.lastDownload.connectionError "Zlyhanie, sťahovanie neúspešné">
+<!ENTITY subscription.lastDownload.success "Úspešné">
+<!ENTITY subscription.lastDownload.invalidData "Zlyhanie, neplatný zoznam filtrov">
+<!ENTITY filter.paste.label "Prilepiť">
+<!ENTITY subscription.disabledFilters.enable "Zapnúť vypnuté filtre">
+<!ENTITY lasthit.column "Po&amp;sledný zápis">
+<!ENTITY subscription.editTitle.label "Upraviť názov">
+<!ENTITY subscription.disabledFilters.warning "Niektoré filtre tohto odberu sú vypnuté.">
+<!ENTITY filter.column "Pravidlo &amp;filtra">
+<!ENTITY subscription.lastDownload.label "Posledné prevzatie:">
+<!ENTITY viewList.label "Zobraziť zoznam">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/firstRun.properties
new file mode 100644
index 0000000..6a3ce81
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=PrechádzaÅ¥ súkromne vypnutím sledovania - skryÅ¥ vaÅ¡e skladby z reklamné spoloÄnosti, ktoré by sledovali každý váš pohyb.
+firstRun_toggle_off=OFF
+firstRun_feature_tracking=Zakázať sledovanie
+firstRun_feature_malware=Blokovanie malvéru
+firstRun_title=Adblock Plus bol nainštalovaný
+firstRun_toggle_on=ON
+firstRun_acceptableAdsExplanation=Radi by sme povzbudili webové stránky aby používali jednoduché a nevtieravé inzercie. To je dôvod, preÄo sme zaviedli <a>prísne pravidlá</a> na identifikáciu prijateľné reklamy, ktoré sú uvedené v Äasti predvolené nastavenie. Ak si napriek tomu chcete blokovaÅ¥ každú reklamu môžete <a>vypnúť</a> toto za pár sekúnd.
+firstRun_contributor_credits=Zásluhy autorov
+firstRun_dataCorruptionWarning=Chcete stále vidieť túto stránku? <a>Klikni tu!</a>
+firstRun_acceptableAdsHeadline=Otravné reklamy budú teraz blokované
+firstRun_share=Povedzte svojim priateľom
+firstRun_share_headline=<a>Pomuožte nám</a> urobiť web lepším miestom
+firstRun_feature_social_description=Automaticky zbaviÅ¥ prehliadanie webu tlaÄidiel sociálnych médií, ako napríklad Facebook podobne, ktoré sú uvedené na webových stránkach a sledují vaÅ¡e správanie.
+firstRun_filterlistsReinitializedWarning=Zdá sa, že problém spôsobil, že všetky filtre boli odstránené a nie sme schopní obnoviť zálohu. Preto sme museli resetovať vaše filtre a prijateľné nastavenia reklám. Prosím, skontrolujte filter zoznamov a prijateľné nastavenia reklamy v <a>Nastavenia Adblock Plus</a>.
+firstRun_feature_malware_description=ZabezpeÄenie prezeranie pomocou blokovanie známych domén s malware.
+firstRun_features=Adblock Plus môže urobiť viac, ako blokovať reklamy
+firstRun_donate=prispejte
+firstRun_donate_label=Podporťe náš projekt
+firstRun_feature_social=Odstránenie tlaÄidiel sociálnych médií
+firstRun_legacySafariWarning=Používate starú verziu Safari, ktorá nepodporuje Adblock Plus. Nemusel by pracovaÅ¥ správne alebo by mohol naruÅ¡iÅ¥ používateľské skúsenosti na niektorých webových stránkach. Dôrazne odporúÄame aktualizovaÅ¥ na Safari 6.1.1 alebo vyšší (k dispozícii pre Mac OS X 10,8 Mountain Lion), alebo Safari 7.0.1 a vyššie (pre OS X 10.9 Mavericks), alebo použiÅ¥ najnovÅ¡iu verziu Mozilla Firefox, Google Chrome alebo Opera.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/global.properties
new file mode 100644
index 0000000..2294515
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Na aktuálnej stránke nie sú blokovateľné položky
+action3_tooltip=Kliknúť pre Otvoriť/Zavrieť Adblock Plus.
+notification_antiadblock_title=Skryť cielené správy?
+type_label_script=skript
+filter_elemhide_nocriteria=Žiadne kritéria neboli špecifikované pre rozpoznanie prvku na skrytie
+blockingGroup_title=Pravidlá blokovania
+whitelisted_tooltip=Adblock Plus je aktívny, ale vypnutý na aktuálnej stránke.
+type_label_stylesheet=Štýly
+blocked_count_tooltip=?1? mimo ?2?
+type_label_font=písmo
+type_label_popup=vyskakovacie okno
+filter_regexp_tooltip=Tento filter je buÄ regulárny výraz alebo je príliÅ¡ krátky, aby mohol byÅ¥ optimalizovaný. PríliÅ¡ mnoho z týchto filtrov môžu spomaliÅ¥ prehliadanie.
+action0_tooltip=Kliknúť na vyvolanie kontextovej ponuky, kliknutie prostredným pre Zapnúť/Vypnúť.
+whitelisted_page=Adblock Plus bol zakázaný pre aktuálnu stránku
+remove_group_warning=Naozaj chcete odstrániť túto skupinu?
+action1_tooltip=Kliknúť pre Otvoriť/Zavrieť blokovateľné položky, kliknutie prostredným pre Zapnúť/Vypnúť.
+type_label_xmlhttprequest=XML požiadavka
+active_tooltip=Adblock Plus je aktívny,?1? popis filtra(ov) a ?2? vlastný filtr(e) sa používa .
+type_label_document=dokument
+type_label_object_subrequest=podžiadosť predmetu
+whitelistGroup_title=Výnimky pravidiel
+disabled_tooltip=Adblock Plus je vypnutý.
+filter_elemhide_duplicate_id=Len jedno ID prvku na skrytie môže byť špecifikované
+type_label_object=predmet
+action2_tooltip=Kliknúť pre otvorenie nastavení, kliknutie prostredným pre Zapnúť/Vypnúť.
+type_label_subdocument=rámec
+clearStats_warning=Toto resetuje vÅ¡etky Å¡tatistiky filtrov a vypne poÄítadlo. Chcete pokraÄovaÅ¥?
+notification_antiadblock_message=Táto stránka bola známa zobrazením cielených správ pre používateľa Adblock Plus. Chcete, aby Adblock Plus skryl cielené správy?
+blocked_count_addendum=(tiež biely zoznam: ?1?, skrytý: ?2?)
+subscription_invalid_location=Umiestnenie zoznamu filtrov nemá platnú URL alebo platný názov súboru.
+type_label_image=obrázok
+remove_subscription_warning=Naozaj si želáte odstrániť toto povolenie?
+type_label_other=iný
+mobile_menu_enable=ABP: Zapnúť
+type_label_media=zvuk/video
+mobile_menu_disable_site=ABP: Vypnúť na ?1?
+elemhideGroup_title=Pravidlá skrytia prvkov
+mobile_menu_enable_site=ABP: Zapnúť na ?1?
+type_label_elemhide=skrytý
+newGroup_title=Nová skupina filtrov
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/overlay.dtd
new file mode 100644
index 0000000..fb1b256
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Ãno">
+<!ENTITY notification.button.no "&amp;Nie">
+<!ENTITY sync.label "Syn&amp;chronizovať nastavenia Adblock Plus">
+<!ENTITY whitelist.site.label "Vypnúť na ?1?">
+<!ENTITY filters.label "&amp;Nastavenia filtrov">
+<!ENTITY disable.label "Vypnúť všade">
+<!ENTITY objecttab.title "Blokovať">
+<!ENTITY objecttab.tooltip "Kliknúť sem pre blokovanie tohto objektu s Adblock Plus">
+<!ENTITY menuitem.label "&amp;Adblock Plus">
+<!ENTITY objecttabs.label "Zobraziť karty pre &amp;Flash a Java">
+<!ENTITY sendReport.label "&amp;Ohlásiť problém na tejto stránke">
+<!ENTITY whitelist.page.label "Vypnúť len na tejto stránke">
+<!ENTITY context.image.label "Adblock obrázok">
+<!ENTITY counthits.label "P&amp;oÄítadlo">
+<!ENTITY opensidebar.label "Otvoriť &amp;blokovateľné položky">
+<!ENTITY notification.button.close "&amp;Zatvoriť">
+<!ENTITY contribute.label "Prispieť na Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock rámec">
+<!ENTITY blocked.tooltip "Blokovať položky na tejto stránke:">
+<!ENTITY hideplaceholders.label "Sk&amp;ryť symboly blokovaných prvkov">
+<!ENTITY showinstatusbar.label "Zobraziť v &amp;stavovom riadku">
+<!ENTITY sidebar.title "Blokovateľné položky na aktuálnej stránke">
+<!ENTITY options.label "&amp;Možnosti">
+<!ENTITY context.object.label "Adblock objekt">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Znovu zapnúť túto stránku">
+<!ENTITY filters.tooltip "Najaktívnejšie filtre:">
+<!ENTITY closesidebar.label "Zatvoriť &amp;blokovateľné položky">
+<!ENTITY showintoolbar.label "Zobraziť v pane&amp;li nástrojov">
+<!ENTITY status.tooltip "Stav:">
+<!ENTITY context.media.label "Adblock Plus: Blokovať audio/video">
+<!ENTITY subscription.update.label "Aktualizovať filtre">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/sendReport.dtd
new file mode 100644
index 0000000..0bd2884
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Späť">
+<!ENTITY issues.disabledgroups.description "Nasledujúce odbery filtrov / skupiny filtrov sú vypnuté, eÅ¡te je možné, že by mali mali úÄinok na tejto stránke:">
+<!ENTITY showData.label "Zobraziť údaje správy">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blokuje pri&amp;veľa">
+<!ENTITY issues.change.description "Nastavenie bolo zmenené. Opäť naÄítajte stránku na otestovanie zmien a potvrÄte správu ak problém nebol odstránený.">
+<!ENTITY email.label "Email:">
+<!ENTITY issues.openPreferences.label "Otvoriť nastavenia filtra">
+<!ENTITY sendPage.confirmation "Vaša správa bola uložená. Môžete ju sprístupniť na tejto adrese:">
+<!ENTITY copyLink.label "&amp;Kopírovať odkaz správy">
+<!ENTITY issues.nofilters.description "Adblock Plus neblokuje niÄ na aktuálnej stránke. Problém, ktorý pozorujete pravdepodobne nesúvisí s Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Problém, ktorý ste ohlásili je pravdepodobne známy. Viac informácií:">
+<!ENTITY typeSelector.other.description "Vyberte túto možnosť ak máte podozrenie na problém s Adblock Plus skôr než na jeho filtre.">
+<!ENTITY issues.disabledgroups.enable.label "Zapnúť odber filtra / skupinu filtrov">
+<!ENTITY typeWarning.override.label "Rozu&amp;miem a chcem potvrdiť správu">
+<!ENTITY issues.disabled.enable.label "Zapnúť Adblock Plus">
+<!ENTITY update.fixed.description "Aktualizácie filtra odberov môžu vyrieÅ¡iÅ¥ problém, ktorý ste nahlásili. Prosím, skúste stránku naÄítaÅ¥ znova a skúste zadaÅ¥ správu znovu, ak problém pretrváva.">
+<!ENTITY anonymous.label "&amp;Anonymný návrh">
+<!ENTITY reloadButton.label "&amp;Opäť naÄítaÅ¥ stránku">
+<!ENTITY recentReports.clear.label "Ods&amp;trániť všetky správy">
+<!ENTITY typeSelector.description "Toto okno Vás prevedie krokmi potrebnými pre podanie hlásenia o chybe Adblock Plus. Najprv zvoľte typ problému, ktorý ste zistili na tejto stránke:">
+<!ENTITY screenshot.remove.label "Odst&amp;rániť citlivé údaje">
+<!ENTITY issues.ownfilters.description "Niektoré filtre aplikované na tejto stránke sú definované používateľom. Vypnite filtre, ktoré by mohli spôsobovať problém:">
+<!ENTITY update.inProgress.description "Adblock Plus potrebuje aktualizovaÅ¥ váš filter odberov, aby sa ubezpeÄil, Äi problém už nie je vyrieÅ¡ený. ÄŒakajte prosím">
+<!ENTITY sendPage.retry.label "Poslať znova">
+<!ENTITY data.label "Ú&amp;daje správy:">
+<!ENTITY recentReports.label "Vaše nedávno potvrdené správy">
+<!ENTITY typeWarning.description "NaznaÄili ste, že chcete ohlásiÅ¥ vÅ¡eobecný problém s Adblock Plus radÅ¡ej ako problém s filtrami. VÅ¡imnite si, že tieto otázky sa lepÅ¡ie rieÅ¡ia na [link]fórume Adblock Plus[/link]. Mali by ste použiÅ¥ reportér problémov pre doplnenie existujúcej diskusie, inak si nikto nevÅ¡imne vaÅ¡u správu skôr, než ju poskytnete na danom odkaze. Automaticky vygenerovaný odkaz bude poskytnutý po potvrdení správy.">
+<!ENTITY issues.disabled.description "Adblock Plus je vypnutý, v danom stave nebude niÄ blokovaÅ¥.">
+<!ENTITY attachExtensions.label "Priložiť &amp;zoznam aktívnych rozšírení k tejto správe pre prípad, že rozšírenie spôsobuje tento problém">
+<!ENTITY issues.nosubscriptions.add.label "Pridať odber filtra">
+<!ENTITY issues.disabledfilters.enable.label "Zapnúť filter">
+<!ENTITY issues.override.label "Nasta&amp;venie je správne, pokraÄovaÅ¥ so správou">
+<!ENTITY issues.nosubscriptions.description "Neodvolávajte sa na odoberaný predpripravený zoznam filtrov, ktorý automaticky odstraňuje neznámy obsah z webovej stránky.">
+<!ENTITY typeSelector.falsePositive.description "Túto možnosÅ¥ vyberte, ak stránka postráda dôležitý obsah, nesprávne sa zobrazuje alebo zlyháva funkÄnosÅ¥. Môžete urÄiÅ¥, Äi je Adblock Plus príÄinou problému jeho doÄasným vypnutím.">
+<!ENTITY typeSelector.other.label "I&amp;né problémy">
+<!ENTITY emailComment.label "OdporúÄame vám zadaÅ¥ platnú e-mailovú adresu, aby sme vás mohli kontaktovaÅ¥, ak sa vyskytnú otázky o vaÅ¡ej správe. Taktiež nám to umožní rozpoznaÅ¥ vaÅ¡e príspevky a pripísaÅ¥ im vyššiu prioritu.">
+<!ENTITY issues.whitelist.remove.label "Zapnúť opäť Adblock Plus na tejto stránke">
+<!ENTITY outdatedSubscriptions.description "Nasledujúci filter odberov nebol aktualizovaný najmenej po dobu dvoch týždňov. Prosím, aktualizujte tieto odbery pred predložením správy, problém už môže byť vyriešený.">
+<!ENTITY dataCollector.description "PoÄkajte, prosím, kým Adblock Plus získa požadované údaje.">
+<!ENTITY sendButton.label "Pos&amp;lať správu">
+<!ENTITY comment.label "Komentá&amp;r (nepovinné):">
+<!ENTITY sendPage.errorMessage "Pokus o zaslanie správy zlyhal s kódom chyby &quot;?1?&quot;. PresvedÄte sa, Äi ste pripojený na internet a skúste to znova. Ak problém pretrváva, požiadajte o pomoc na [link]fórume Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Zobraziť nedávno potvrdené správy">
+<!ENTITY commentPage.heading "Vložiť komentár">
+<!ENTITY update.start.label "Spustiť aktualizáciu teraz">
+<!ENTITY issues.disabledfilters.description "Nasledujúce filtre sú vypnuté, eÅ¡te je možné, že by mali mali úÄinok na tejto stránke:">
+<!ENTITY screenshot.description "Rovnaká stránka vyzerá rozdielne pre rôznych ľudí. Môže nám pomôcÅ¥ pochopiÅ¥ problém, ak priložíte k správe screenshot. Môžete odstrániÅ¥ ÄasÅ¥ s citlivými údajmi, ak oznaÄíte len ÄasÅ¥, kde je problém zrejmý. Kliknite na tlaÄidlo a vyberte ÄasÅ¥ obrázka.">
+<!ENTITY screenshot.attach.label "Pripo&amp;jiť obrázok stránky ku správu">
+<!ENTITY issues.whitelist.description "Adblock Plus je na stránke, ktorú chcete ohlásiÅ¥, vypnutý. Zapnite ho, prosím, znova a opäť naÄítajte stránku skôr, než potvrdíte hlásenie.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus neblokuje &amp;reklamy">
+<!ENTITY typeSelector.heading "Zvoľte typ problému">
+<!ENTITY anonymity.warning "Nebudeme schopný sa k Vás kontaktovať a vašej správe pravdepodobne priradíme nižšiu prioritu.">
+<!ENTITY wizard.title "Hlásenie problémov">
+<!ENTITY issues.ownfilters.disable.label "Vypnúť filter">
+<!ENTITY commentPage.description "Textové pole nižšie vám umožňuje vložiÅ¥ komentár pre vysvetlenie daného problému. Tento krok je nepovinný, ale odporúÄame ho ak problém nie je jasný. Môžete tiež posúdiÅ¥ správu skôr, než ju odoÅ¡lete.">
+<!ENTITY comment.lengthWarning "Dĺžka váško komentára prevyšuje 1000 znakov. Bude odoslaných len prvých 1000 znakov.">
+<!ENTITY typeSelector.falseNegative.description "Vyberte túto možnosť ak sa reklamy zobrazujú napriek zapnutému Adblock Plus.">
+<!ENTITY sendPage.waitMessage "PoÄkajte, prosím, kým Adblock Plus potvrdí vaÅ¡u správu.">
+<!ENTITY dataCollector.heading "Vitajte v hlásení problémov">
+<!ENTITY screenshot.heading "Pripojiť screenshot">
+<!ENTITY sendPage.heading "Poslať správu">
+<!ENTITY issues.subscriptionCount.description "Zdá sa, že máte príliÅ¡ veľa odberov filtrov. Toto nastavenie nie je odporúÄané, pretože pravdepodobnosÅ¥ výskytu problému je vyššia. Taktiež nemôžeme prijaÅ¥ vaÅ¡u správu o probléme, pretože nie je jasné, ktorý autor odberu filtra potrebuje prijaÅ¥ opatrenie. Prosím, odstráňte vÅ¡etky odbery, okrem naozaj nevyhnutných, a otestujte, Äi problém pretrváva.">
+<!ENTITY screenshot.mark.label "O&amp;znaÄiÅ¥ problém">
+<!ENTITY privacyPolicy.label "Zásady ochrany súkromia">
+<!ENTITY issues.description "Adblock Plus zistil problém s vašou konfiguráciou, ktorý by mohol byť zodpovedný za daný problém alebo robí zistenie problému ťažším.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/sidebar.dtd
new file mode 100644
index 0000000..f9e241c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "OhraniÄenie flashových položiek">
+<!ENTITY address.label "Adresa">
+<!ENTITY context.open.label "Otvoriť na novej karte">
+<!ENTITY type.label "Typ">
+<!ENTITY tooltip.filterSource.label "Zdroj filtra:">
+<!ENTITY noitems.label "Neblokovateľné položky">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Veľkosť:">
+<!ENTITY reattach.label "Znovu pripojiť">
+<!ENTITY search.label "&amp;Hľadať:">
+<!ENTITY docDomain.thirdParty "(tretia strana)">
+<!ENTITY filterSource.label "Zdroj filtra">
+<!ENTITY tooltip.docDomain.label "Zdroj dokumentu:">
+<!ENTITY context.copy.label "Kopírovať adresu položiek">
+<!ENTITY tooltip.type.label "Typ:">
+<!ENTITY context.disablefilter.label "Vypnúť filter ?1?">
+<!ENTITY context.copyFilter.label "Kopírovať filter">
+<!ENTITY context.block.label "Blokovať túto položku">
+<!ENTITY context.enablefilter.label "Znovu zapnúť filter ?1?">
+<!ENTITY detach.label "Oddeliť">
+<!ENTITY whitelisted.label "Povolené stránky">
+<!ENTITY context.disablefilteronsite.label "Vypnúť tento filter na ?1?">
+<!ENTITY detached.title "Adblock Plus: Blokovateľné položky (oddelený)">
+<!ENTITY docDomain.firstParty "(prvá strana)">
+<!ENTITY tooltip.type.whitelisted "(povolený)">
+<!ENTITY tooltip.filter.label "Platný filter:">
+<!ENTITY tooltip.filter.disabled "(vypnutý)">
+<!ENTITY context.editfilter.label "UpraviÅ¥ filter v skutoÄnosti">
+<!ENTITY tooltip.type.blocked "(blokovaný)">
+<!ENTITY size.label "Veľkosť">
+<!ENTITY context.whitelist.label "Pridať výnimku pre položku">
+<!ENTITY context.selectAll.label "Vybrať všetko">
+<!ENTITY state.label "Stav">
+<!ENTITY docDomain.label "Zdroj dokumentu">
+<!ENTITY tooltip.address.label "Adresa:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/subscriptionSelection.dtd
new file mode 100644
index 0000000..de251ca
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Pridať tiež filter &amp;odberu &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plus zlyhal pri získavaní zoznamu odberov.">
+<!ENTITY list.download.retry "Skúsiť znova">
+<!ENTITY title.label "Ná&amp;zov povolenia:">
+<!ENTITY list.download.website "Zobraziť webovú stránku">
+<!ENTITY supplementMessage "Tento filter odberu je urÄený pre použitie s filtrom odberu &quot;?1?&quot;ktorý eÅ¡te nepoužívate.">
+<!ENTITY viewList.label "Zobraziť filtre">
+<!ENTITY visitHomepage.label "Navštíviť domovskú stránku">
+<!ENTITY addSubscription.label "Pridať odber">
+<!ENTITY dialog.title "Odoberanie Add Adblock Plus filtrov">
+<!ENTITY location.label "U&amp;miestnenie zoznamu filtrov:">
+<!ENTITY fromWeb.description "Prosím, potvrÄte, že chcete pridaÅ¥ tento filter odberu.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/composer.dtd
new file mode 100644
index 0000000..4290a58
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "na &amp;koncu naslova">
+<!ENTITY domainRestriction.label "Omeji na &amp;domeno:">
+<!ENTITY collapse.default.no.label "Uporabi privzeto (ne)">
+<!ENTITY firstParty.label "Samo &amp;prve stranke">
+<!ENTITY preferences.label "Poka&amp;ži obstojeÄe filtre ...">
+<!ENTITY pattern.label "IÅ¡Äi vzorec">
+<!ENTITY thirdParty.label "Samo zu&amp;nanje stranke">
+<!ENTITY filter.label "Nov &amp;filter:">
+<!ENTITY collapse.label "St&amp;rni blokirane:">
+<!ENTITY match.warning "Vzorec, ki ste ga vnesli, se ne ujema z naslovom, ki ga želite blokirati in zato ne bo vplival nanj.">
+<!ENTITY anchor.start.label "na &amp;zaÄetku naslova">
+<!ENTITY matchCase.label "Razlikuj velike/male &amp;Ärke">
+<!ENTITY custom.pattern.label "Po &amp;meri:">
+<!ENTITY unselectAllTypes.label "NiÄ ne izberi">
+<!ENTITY type.whitelist.label "Pravi&amp;lo izjem">
+<!ENTITY regexp.warning "Vneseni vzorec bo obravnavan kot regularni izraz. Å tevilni regularni izrazi lahko upoÄasnijo vaÅ¡e brskanje. ÄŒe ne nameravate uporabljati regularnih izrazov, dodajte simbol * na konec vzorca.">
+<!ENTITY dialog.title "Dodaj pravilo filtra Adblock Plus">
+<!ENTITY basic.label "Osnovni pogled">
+<!ENTITY type.filter.label "Filter &amp;blokade">
+<!ENTITY types.label "Uporabi za vrste:">
+<!ENTITY shortpattern.warning "Vzorec, ki ste ga vnesli, je prekratek za optimizacijo, Å¡tevilni tovrstni vzorci lahko upoÄasnijo vaÅ¡e brskanje. PriporoÄamo, da izberete daljÅ¡i niz za ta filter.">
+<!ENTITY collapse.yes.label "Da">
+<!ENTITY anchors.label "Sprejmi le vzorec:">
+<!ENTITY collapse.default.yes.label "Uporabi privzeto (da)">
+<!ENTITY domainRestriction.help "Navedite eno ali veÄ domen, loÄenih s simbolom &quot;|&quot;, filter bo veljal le za te domene. Simbol &quot;~&quot; pred imenom domene pomeni, da filter za to domeno ne sme veljati.">
+<!ENTITY accept.label "Dodaj filter">
+<!ENTITY options.label "Možnosti">
+<!ENTITY disabled.warning "Adblock Plus je trenutno onemogoÄen. Å e vedno lahko dodajate filtre, vendar ne bodo veljali, Äe ne [link]omogoÄite Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "na &amp;zaÄetku imena domene">
+<!ENTITY collapse.no.label "Ne">
+<!ENTITY selectAllTypes.label "Izberi vse">
+<!ENTITY advanced.label "Napredni pogled">
+<!ENTITY pattern.explanation "Vzorec je lahko kateri koli del naslova, simbol * velja kot poljuben znak. Filter bo le za naslove, ki ustrezajo vzorcu.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/filters.dtd
new file mode 100644
index 0000000..68220ee
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Vsi tvoji filtri po meri bodo zamenjani z vsebino izbrane datoteke. Želite zagnati proces?">
+<!ENTITY slow.column "Po&amp;Äasni filtri">
+<!ENTITY enabled.column "O&amp;mogoÄeno">
+<!ENTITY subscription.lastDownload.checksumMismatch "Neuspešno, kontrolna vsota se ne ujema">
+<!ENTITY noFiltersInGroup.text "Izbrana skupina je prazna.">
+<!ENTITY subscription.actions.label "Dejanja">
+<!ENTITY filter.selectAll.label "Izberi vse">
+<!ENTITY backupButton.label "&amp;Varnostno kopiraj in obnovi">
+<!ENTITY restore.minVersion.warning "Opozorilo: datoteka je bila ustvarjena z novejÅ¡o razliÄico Adblock Plus. Pred obnovitvijo iz te datoteke, najprej posodobi na najnovejÅ¡o razliÄico Adblock Plus.">
+<!ENTITY restore.error "Podatkov datoteke ni bilo mogoÄe obdelat. Je datoteka res varnostna kopija programa Adblock Plus?">
+<!ENTITY sort.ascending.label "od &amp;A &gt; Z">
+<!ENTITY sort.label "Raz&amp;vrsti">
+<!ENTITY subscription.source.label "Seznam filtrov">
+<!ENTITY hitcount.column "Za&amp;detki">
+<!ENTITY noFilters.text "Svojega lastnega filtra še nimaš.">
+<!ENTITY backup.custom.title "Samo filtri po meri">
+<!ENTITY subscription.external.label "Posodobljepreko druge razširitve">
+<!ENTITY subscription.delete.label "Izbriši">
+<!ENTITY noGroupSelected.text "Preden se filtre lahko prikaže moraš izbrati filter skupino.">
+<!ENTITY filter.cut.label "Izreži">
+<!ENTITY restore.default.label "Obnovite varnostno kopijo z dne ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Prenos s strežnika ...">
+<!ENTITY subscriptions.tab.label "NaroÄnine na filtre">
+<!ENTITY sort.descending.label "od &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Želite res odstraniti vse izbrane filtre?">
+<!ENTITY filter.delete.label "Izbriši">
+<!ENTITY addSubscriptionAdd.label "Dodaj">
+<!ENTITY viewMenu.label "Pogled">
+<!ENTITY subscription.lastDownload.unknown "Ni na voljo">
+<!ENTITY addSubscriptionCancel.label "PrekliÄi">
+<!ENTITY subscription.enabled.label "OmogoÄeno">
+<!ENTITY noSubscriptions.text "Zaenkrat nimaÅ¡ naroÄenega Å¡e nobenega filtra. Adblock Plus ne more
+blokirati niÄesar brez filtrov, zato uporabi opcijo &quot;Dodaj naroÄnino za filter&quot;
+in dodaj vsaj en filter.">
+<!ENTITY subscription.update.label "Posodobi filtre">
+<!ENTITY dialog.title "Nastavitve filtrov za Adblock Plus">
+<!ENTITY addFilter.label "&amp;Dodaj filter">
+<!ENTITY subscription.minVersion.warning "Ta filter potrebuje novejÅ¡o verzijo Adblock Plusa. Nadgradi Adblock plus z najnoveÅ¡o razliÄico.">
+<!ENTITY subscription.lastDownload.invalidURL "Neuspešno, ni veljaven naslov">
+<!ENTITY backup.error "Napaka pri zapisu filtrov v datoteko. Poskrbite, da datoteka ni zaÅ¡Äitena pred pisanjem ali v uporabi nekega drugega programa.">
+<!ENTITY filter.moveUp.label "Premakni navzgor">
+<!ENTITY addGroup.label "Dodaj &amp;skupino filtrov">
+<!ENTITY filter.edit.label "Uredi">
+<!ENTITY subscription.showHideFilters.label "Pokaži/skrij filtre">
+<!ENTITY acceptableAds2.label "Dovol&amp;i nekatere nevsiljive oglase">
+<!ENTITY addSubscriptionOther.label "Dodaj novo naroÄnino">
+<!ENTITY close.label "Zapri">
+<!ENTITY sort.none.label "Nerazvr&amp;Å¡Äeno">
+<!ENTITY filter.actions.label "Dejanja filtra">
+<!ENTITY filter.copy.label "Kopiraj">
+<!ENTITY filter.moveDown.label "Premakni navzdol">
+<!ENTITY filter.resetHitCounts.label "Ponastavi statistiko zadetkov">
+<!ENTITY readMore.label "Preberi veÄ">
+<!ENTITY subscription.moveUp.label "Premakni navzgor">
+<!ENTITY addSubscription.label "Dodaj &amp;naroÄnino filtra">
+<!ENTITY subscription.homepage.label "DomaÄa stran">
+<!ENTITY backup.complete.title "Vsi filtri in naroÄnine">
+<!ENTITY restore.own.label "Obnovi lastno varnostno kopijo">
+<!ENTITY restore.complete.warning "Vsi nastavitve tvojih filtrov bodo zamenjane z vsebino izbrane datoteke. Želite zagnati proces?">
+<!ENTITY filters.tab.label "Filtri po meri">
+<!ENTITY backup.label "Ustvari novo varnostno kopijo">
+<!ENTITY find.label "Najdi">
+<!ENTITY subscription.moveDown.label "Premakni navzdol">
+<!ENTITY subscription.lastDownload.connectionError "Neuspešno, napaka prenosa">
+<!ENTITY subscription.lastDownload.success "Uspešno">
+<!ENTITY subscription.lastDownload.invalidData "Neuspešno, ni veljaven seznam filtrov">
+<!ENTITY filter.paste.label "Prilepi">
+<!ENTITY subscription.disabledFilters.enable "OmogoÄi onemogoÄene filtre">
+<!ENTITY lasthit.column "Zad&amp;nji zadetek">
+<!ENTITY subscription.editTitle.label "Uredi naslov">
+<!ENTITY subscription.disabledFilters.warning "V tej naroÄnini so nekateri filtri onemogoÄeni.">
+<!ENTITY filter.column "Pravilo &amp;filtra">
+<!ENTITY subscription.lastDownload.label "Zadnji prenos:">
+<!ENTITY viewList.label "Pokaži seznam">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/firstRun.properties
new file mode 100644
index 0000000..d749c77
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Brskajte zasebno z onemogoÄanjem sledenja - zabriÅ¡ite svoje sledi oglaÅ¡evalskim agencijam, ki vam sledijo na vsakem koraku.
+firstRun_toggle_off=IZKLOP
+firstRun_feature_tracking=OnemogoÄite sledenje
+firstRun_feature_malware=Blokiranje zlonamernih spletnih mest
+firstRun_title=Adblock Plus je bil nameÅ¡Äen
+firstRun_toggle_on=VKLOP
+firstRun_acceptableAdsExplanation=Želimo spodbujati uporabo preprostih, nevsiljivih oglasov na spletnih straneh. Zato smo vpeljali <a>stroge kriterije</a> prepoznavanja sprejemljivih oglasov, ki so privzeto prikazani. ÄŒe vseeno želite blokirati vse oglase, jih lahko <a>onemogoÄite</a> v nekaj sekundah.
+firstRun_contributor_credits=Krediti sodelavcev
+firstRun_dataCorruptionWarning=Se vam ta stran še vedno prikazuje? <a>Kliknite tukaj!</a>
+firstRun_acceptableAdsHeadline=Nadležni oglasi bodo zdaj blokirani
+firstRun_share=Povejte svojim prijateljem
+firstRun_share_headline=<a>Podajte nam roko</a> v ustvarjanju boljšega spleta
+firstRun_feature_social_description=Med brskanjem se samodejno izognite gumbom socialnih medijev, kot je Facebookov VÅ¡eÄ mi je, ki se pojavljajo na spletnih straneh in sledijo vaÅ¡im navadam brskanja.
+firstRun_filterlistsReinitializedWarning=OÄitno so bili zaradi težave vsi filtri odstranjeni in varnostne kopije ni bilo mogoÄe obnoviti. Zato smo ponastavili vaÅ¡e nastavitve filtrov in dovoljenih oglasov. Prosimo, preverite svoj seznam filtrov in nastavitve dovoljenih oglasov v <a>nastavitvah za Adblock Plus</a>.
+firstRun_feature_malware_description=Brskajte po spletu varneje, tako da blokirate znane domene z zlonamerno programsko opremo.
+firstRun_features=Adblock Plus zmore veÄ kot le blokirati oglase
+firstRun_donate=prispevajte
+firstRun_donate_label=Podprite naš projekt
+firstRun_feature_social=Odstranite gumbe socialnih medijev
+firstRun_legacySafariWarning=Uporabljate staro razliÄico Safarija, ki je Adblock Plus ne podpira. Morda ne bo pravilno deloval ali bo poslabÅ¡al uporabniÅ¡ko izkuÅ¡njo na nekaterih spletnih straneh. MoÄno priporoÄamo, da nadgradite na Safari 6.1.1 ali novejÅ¡ega (na OS X 10.8 Mountain Lion), Safari 7.0.1 ali novejÅ¡ega (na OS X 10.9 Mavericks), ali da uporabljate najnovejÅ¡o razliÄico Mozille Firefox, Google Chroma ali Opere.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/global.properties
new file mode 100644
index 0000000..e612a82
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Na trenutni strani ni elementov blokad
+action3_tooltip=Kliknite za vkljuÄitev/izkljuÄitev Adblock Plus.
+notification_antiadblock_title=Skrijem ciljana sporoÄila?
+type_label_script=skript
+filter_elemhide_nocriteria=Za razpoznavo elementa, ki naj bo skrit, ni navedenih pogojev
+blockingGroup_title=Pravila blokiranja oglasov
+whitelisted_tooltip=Adblock Plus je aktiven, vendar je za trenutno stran izkljuÄen.
+type_label_stylesheet=predlogo strani
+blocked_count_tooltip=?1? od ?2?
+type_label_font=pisava
+type_label_popup=pojavno okno
+filter_regexp_tooltip=Ta filter je regularni izraz ali pa je prekratek za optimizacijo. PreveÄ filtrov lahko upoÄasni brskanje.
+action0_tooltip=Kliknite za pojavni meni, s srednjim klikom vkljuÄite/izkljuÄite.
+whitelisted_page=Za trenutno stran je bil Adblock Plus izkljuÄen
+remove_group_warning=ResniÄno želite odstraniti to skupino?
+action1_tooltip=Kliknite za odprtje/zaprtje blokiranih elementov, s srednjim klikom vkljuÄite/izkljuÄite.
+type_label_xmlhttprequest=Zahteva XML
+active_tooltip=Adblock Plus je aktiven, ?1? naroÄnine na filtre in ?2? filtri po meri so v rabi.
+type_label_document=dokument
+type_label_object_subrequest=podzahteva predmeta
+whitelistGroup_title=Pravila izjem
+disabled_tooltip=Adblock Plus je izkljuÄen.
+filter_elemhide_duplicate_id=Navedete lahko le eno identiteto elementa, ki naj bo skrit
+type_label_object=predmet
+action2_tooltip=Kliknite za nastavitve, s srednjim klikom vkljuÄite/izkljuÄite.
+type_label_subdocument=okvir
+clearStats_warning=S tem boste ponastavili vso statistiko zadetkov filtra in onemogoÄili Å¡tetje zadetkov filtra. Želite nadaljevati?
+notification_antiadblock_message=Ta stran uporabnikom prikazuje ciljana sporoÄila. Želite, da Adblock Plus skrije ta sporoÄila?
+blocked_count_addendum=(prav tako prikriti: ?1?, skriti: ?2?)
+subscription_invalid_location=Mesto seznama filtrov ni niti veljaven URL niti veljavno ime datoteke.
+type_label_image=sliko
+remove_subscription_warning=Želite res odpovedati naroÄnino?
+type_label_other=drugo
+mobile_menu_enable=ABP: omogoÄi
+type_label_media=zvok/video
+mobile_menu_disable_site=ABP: onemogoÄi za ?1?
+elemhideGroup_title=Pravila skrivanja elementov
+mobile_menu_enable_site=ABP: omogoÄi za ?1?
+type_label_elemhide=skrito
+newGroup_title=Nova skupina filtrov
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/overlay.dtd
new file mode 100644
index 0000000..fabef17
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Da">
+<!ENTITY notification.button.no "&amp;Ne">
+<!ENTITY sync.label "Sin&amp;hroniziraj nastavitve Adblock Plus">
+<!ENTITY whitelist.site.label "OnemogoÄi na ?1?">
+<!ENTITY filters.label "Nastavitve &amp;filtra">
+<!ENTITY disable.label "OnemogoÄi povsod">
+<!ENTITY objecttab.title "Blokiraj">
+<!ENTITY objecttab.tooltip "Kliknite sem za blokiranje tega predmeta z Adblock Plus">
+<!ENTITY menuitem.label "Ad&amp;block Plus">
+<!ENTITY objecttabs.label "Pokaži &amp;zavihke za Flash in Javo">
+<!ENTITY sendReport.label "&amp;Javite težavo na tej strani">
+<!ENTITY whitelist.page.label "OnemogoÄi samo na tej strani">
+<!ENTITY context.image.label "Adblock - slike">
+<!ENTITY counthits.label "Å tej za&amp;detke filtra">
+<!ENTITY opensidebar.label "Odpri &amp;elemente blokad">
+<!ENTITY notification.button.close "&amp;Zapri">
+<!ENTITY contribute.label "Sodelujte v Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock - okviri">
+<!ENTITY blocked.tooltip "Blokirani elementi na tej strani:">
+<!ENTITY hideplaceholders.label "Skrij ograde &amp;blokoranih elementov">
+<!ENTITY showinstatusbar.label "Pokaži &amp;v vrstici stanja">
+<!ENTITY sidebar.title "Elementi blokad na trenutni strani">
+<!ENTITY options.label "Mo&amp;žnosti">
+<!ENTITY context.object.label "Adblock - predmeti">
+<!ENTITY context.removeWhitelist.label "Adblock Plus - ponovno omogoÄi na tej strani">
+<!ENTITY filters.tooltip "Najbolj aktivni filtri:">
+<!ENTITY closesidebar.label "Zapri &amp;elemente blokad">
+<!ENTITY showintoolbar.label "Po&amp;kaži v orodni vrstici">
+<!ENTITY status.tooltip "Stanje:">
+<!ENTITY context.media.label "Adblock Plus: Blokiraj zvok/video">
+<!ENTITY subscription.update.label "Posodobi filtre">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/sendReport.dtd
new file mode 100644
index 0000000..47ebf1b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/sendReport.dtd
@@ -0,0 +1,70 @@
+<!ENTITY screenshot.undo.label "Ra&amp;zveljavi">
+<!ENTITY issues.disabledgroups.description "Naslednje naroÄnine na filtre/skupine filtrov so onemogoÄene, Äeprav lahko vplivajo na prikaz te strani:">
+<!ENTITY showData.label "Pokaži podatke poroÄila">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus bloki&amp;ra preveÄ stvari">
+<!ENTITY issues.change.description "VaÅ¡a konfiguracija je bila spremenjena. Ponovno naložite stran in preizkusite težave ter poÅ¡ljite poroÄilo, Äe se s spremembami težava ni odpravila.">
+<!ENTITY email.label "E-&amp;pošta:">
+<!ENTITY issues.openPreferences.label "Odpri nastavitve filtra">
+<!ENTITY sendPage.confirmation "VaÅ¡e poroÄilo je shranjeno. Do njega lahko dostopate na naslednjem naslovu:">
+<!ENTITY copyLink.label "Kopiraj po&amp;vezavo poroÄila">
+<!ENTITY issues.nofilters.description "Adblock Plus ne blokira niÄesar na trenutni strani. Težava, ki jo zaznavate, morda ni povezana z Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Težava, ki ste jo javili, je najbrž že znana. VeÄ podatkov:">
+<!ENTITY typeSelector.other.description "Izberite to možnost, Äe sumite na težavo v Adblock Plus in ne v njegovih filtrih.">
+<!ENTITY issues.disabledgroups.enable.label "OmogoÄi naroÄnino na filter / skupino filtrov">
+<!ENTITY typeWarning.override.label "Razumem in &amp;želim vseeno oddati poroÄilo">
+<!ENTITY issues.disabled.enable.label "OmogoÄi Adblock Plus">
+<!ENTITY update.fixed.description "Posodobitev filtra je najverjetneje rešila problem,
+o katerem ste poroÄali. Osvežite stran in poskusite znova. ÄŒe
+se bo težava ponovila, znova kliknite PoroÄaj.">
+<!ENTITY anonymous.label "&amp;Anonimna oddaja">
+<!ENTITY reloadButton.label "Po&amp;novno naloži stran">
+<!ENTITY recentReports.clear.label "O&amp;dstrani vsa poroÄila">
+<!ENTITY typeSelector.description "To okno vas vodi po korakih do oddaje poroÄila o težavi z Adblock Plus. Najprej izberite vrsto težave, s katero ste se sreÄali na tej strani:">
+<!ENTITY screenshot.remove.label "Odstrani o&amp;bÄutljive podatke">
+<!ENTITY issues.ownfilters.description "Nekateri filtri, uporabljeni na tej strani, so uporabniÅ¡ko doloÄeni. OnemogoÄite filtre, ki so lahko krivi za to težavo:">
+<!ENTITY update.inProgress.description "Adblock mora posodobiti naroÄene filtre, da zagotovi,
+da problem ni bil že reÅ¡en. Prosim poÄakajte ...">
+<!ENTITY sendPage.retry.label "Pošlji znova">
+<!ENTITY data.label "Podatki poroÄila:">
+<!ENTITY recentReports.label "VaÅ¡a nedavno poslana poroÄila">
+<!ENTITY typeWarning.description "Nakazali ste, da želite poroÄati o sploÅ¡ni težavi z Adblock Plus, ne pa o težavi s filtri. UpoÅ¡tevajte, da je o takÅ¡nih težavah najbolje poroÄati na [link]forumu Adblock Plus[/link]. PoroÄanje o težavah uporabite le za podporo obstojeÄe razprave, saj sicer nihÄe ne bo opazil vaÅ¡ega poroÄila, razen Äe ne podate povezavo nanj. Samodejno ustvarjena povezava bo na voljo po poÅ¡iljanju poroÄila.">
+<!ENTITY issues.disabled.description "Adblock Plus je onemogoÄe, v trenutnem stanju ne more blokirati niÄesar.">
+<!ENTITY attachExtensions.label "PoroÄi&amp;lu priložite seznam aktivnih razÅ¡iritev, Äe je vzrok težave spor z dodatkom">
+<!ENTITY issues.nosubscriptions.add.label "Dodaj naroÄnino na filter">
+<!ENTITY issues.disabledfilters.enable.label "OmogoÄi filter">
+<!ENTITY issues.override.label "Kon&amp;figuracija je pravilna, nadaljuj s poroÄilom">
+<!ENTITY issues.nosubscriptions.description "Kot kaže, niste naroÄeni na noben seznam filtrov, ki samodejno odstranijo neželene vsebine s spletnih strani.">
+<!ENTITY typeSelector.falsePositive.description "Izberite to možnost, Äe strani manjka pomembna vsebina, Äe se prikaže nepravilno ali ne deluje pravilno. DoloÄite lahko, ali je Adblock Plus kriv težav, tako da ga zaÄasno izkljuÄite.">
+<!ENTITY typeSelector.other.label "Druga težava">
+<!ENTITY emailComment.label "Bilo bi dobro, da vneseÅ¡ veljaven email, tako da se na vas lahko obrnemo, Äe bodo obstajala vpraÅ¡anja glede poroÄila. Pravtako nam omogoÄa prepoznati vaÅ¡e prispevke in tako lažje doloÄiti prioriteto viÅ¡je.">
+<!ENTITY issues.whitelist.remove.label "Ponovno omogoÄi Adblock Plus na tej strani">
+<!ENTITY outdatedSubscriptions.description "Ta filter ni bil posodobljen vsaj dva tedna.
+Preden poÅ¡ljete poroÄilo, posodobite vse naroÄene fitre,
+saj je morda problem že rešen.">
+<!ENTITY dataCollector.description "PoÄakajte nekaj trenutkov, da Adblock Plus zbere potrebne podatke.">
+<!ENTITY sendButton.label "Po&amp;Å¡lji poroÄilo">
+<!ENTITY comment.label "&amp;Komentar (neobvezno):">
+<!ENTITY sendPage.errorMessage "Poskus poÅ¡iljanja poroÄila je bil neuspeÅ¡en s kodo napake &quot;?1?&quot;. Zagotovite, da ste povezani v splet in poskusite znova. ÄŒe težave ni konec, poiÅ¡Äite pomoÄ na [link]forumu Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Prikaži nedavno poslana poroÄila">
+<!ENTITY commentPage.heading "Vnesite komentar">
+<!ENTITY update.start.label "ZaÄni s posodobitvijo zdaj">
+<!ENTITY issues.disabledfilters.description "Naslednji filtri so onemogoÄeni, Äeprav lahko vplivajo na prikaz te strani:">
+<!ENTITY screenshot.description "Isto stran lahko razliÄni uporabniki vidijo drugaÄe. VÄasih pomaga, Äe poroÄilu pripnete slikovni posnetek strani. Odstranite lahko dele strani z zasebnimi podatki, pa tudi oznaÄite obmoÄja, kjer se težava opazi. Kliknite ustrezni gumb in izberite del slike z miÅ¡ko.">
+<!ENTITY screenshot.attach.label "PoroÄilu priloži &amp;sliko strani">
+<!ENTITY issues.whitelist.description "Adblock Plus je trenutno na strani, o kateri poroÄate, onemogoÄen. OmogoÄite ga in ponovno naložite stran, preden poÅ¡ljete poroÄilo o težavi.">
+<!ENTITY typeSelector.falseNegative.label "Adbloc&amp;k Plus ne blokira oglasa">
+<!ENTITY typeSelector.heading "Kakšno težavo imate?">
+<!ENTITY anonymity.warning "Kontakta z vami ne bomo mogli vzpostaviti. Prioriteto poroÄilu pa bomo verjetno znižali.">
+<!ENTITY wizard.title "PoroÄilo o težavah">
+<!ENTITY issues.ownfilters.disable.label "OnemogoÄi filter">
+<!ENTITY commentPage.description "Spodnje polje z besedilom omogoÄa vnos komentarja, ki nam pomaga razumeti težavo. To je neobvezno, vendar priporoÄamo, Äe težava ni oÄitna. Pred poÅ¡iljanjem si lahko Å¡e enkrat ogledate podatke poroÄila.">
+<!ENTITY comment.lengthWarning "Dolžina vašega komentarja presega 1000 znakov. Poslanih bo le prvih 1000 znakov.">
+<!ENTITY typeSelector.falseNegative.description "Izberite to možnost, Äe je oglas prikazan kljub temu, da je Adblock Plus omogoÄen.">
+<!ENTITY sendPage.waitMessage "PoÄakajte, dokler Adblock Plus poÅ¡ilja vaÅ¡e poroÄilo.">
+<!ENTITY dataCollector.heading "DobrodoÅ¡li v poroÄanje o težavah">
+<!ENTITY screenshot.heading "Priložite sliko strani">
+<!ENTITY sendPage.heading "PoÅ¡lji poroÄilo">
+<!ENTITY issues.subscriptionCount.description "Zdi se, da ste naroÄeni na preveÄ filtrov. TakÅ¡na nastavitev ni priporoÄena, saj je možnost težav veliko veÄja. Prav tako ne moremo obdelati vaÅ¡ega poroÄila o napaki, saj ni jasno, kateri avtor naroÄnine na filtre mora narediti popravke. Prosimo, da odstranite vse nepotrebne naroÄnine na filtre in preizkusite, Äe Å¡e vedno prihaja do napake.">
+<!ENTITY screenshot.mark.label "OznaÄi &amp;težavo">
+<!ENTITY privacyPolicy.label "Izjava o zasebnosti">
+<!ENTITY issues.description "Adblock Plus je zaznal težave z vaÅ¡o konfiguracijo, ki so lahko krive za to težavo ali pa bodo raziskovanje poroÄila otežile.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/sidebar.dtd
new file mode 100644
index 0000000..42347da
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Obrobe elementa naj utripajo">
+<!ENTITY address.label "Naslov">
+<!ENTITY context.open.label "Odpri v novem zavihku">
+<!ENTITY type.label "Vrsta">
+<!ENTITY tooltip.filterSource.label "Vir filtra:">
+<!ENTITY noitems.label "Ni elementov blokiranja">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Velikost:">
+<!ENTITY reattach.label "Pripni">
+<!ENTITY search.label "&amp;Najdi:">
+<!ENTITY docDomain.thirdParty "(tretja stran)">
+<!ENTITY filterSource.label "Vir filtra">
+<!ENTITY tooltip.docDomain.label "Vir dokumenta:">
+<!ENTITY context.copy.label "Kopiraj naslov elementa">
+<!ENTITY tooltip.type.label "Vrsta:">
+<!ENTITY context.disablefilter.label "OnemogoÄi filter ?1?">
+<!ENTITY context.copyFilter.label "Kopiraj filter">
+<!ENTITY context.block.label "Blokiraj ta element">
+<!ENTITY context.enablefilter.label "Ponovno omogoÄi filter ?1?">
+<!ENTITY detach.label "Odpni">
+<!ENTITY whitelisted.label "Dovoljena stran">
+<!ENTITY context.disablefilteronsite.label "OnemogoÄi ta filter na ?1?">
+<!ENTITY detached.title "Adblock Plus: elementi blokad (odpeti)">
+<!ENTITY docDomain.firstParty "(prva stran)">
+<!ENTITY tooltip.type.whitelisted "(dovoljeno)">
+<!ENTITY tooltip.filter.label "Trenutni filter:">
+<!ENTITY tooltip.filter.disabled "(onemogoÄeno)">
+<!ENTITY context.editfilter.label "Uredi trenutni filter">
+<!ENTITY tooltip.type.blocked "(blokirano)">
+<!ENTITY size.label "Velikost">
+<!ENTITY context.whitelist.label "Dodaj pravilo izjem za element">
+<!ENTITY context.selectAll.label "Izberi vse">
+<!ENTITY state.label "Stanje">
+<!ENTITY docDomain.label "Vir dokumenta">
+<!ENTITY tooltip.address.label "Naslov:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/subscriptionSelection.dtd
new file mode 100644
index 0000000..d8c15f3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Dodaj tudi naroÄnino na &amp;filter ?1?">
+<!ENTITY list.download.failed "Pridobivanje seznama naroÄnin ni uspelo.">
+<!ENTITY list.download.retry "Poskusi znova">
+<!ENTITY title.label "&amp;Naslov naroÄnine:">
+<!ENTITY list.download.website "Pokaži spletno mesto">
+<!ENTITY supplementMessage "NaroÄnina na filter je miÅ¡ljena za rabo z naroÄnino na filter ?1?, ki je Å¡e ne uporabljate.">
+<!ENTITY viewList.label "Pokaži filtre">
+<!ENTITY visitHomepage.label "ObiÅ¡Äi domaÄo stran">
+<!ENTITY addSubscription.label "Dodaj naroÄnino">
+<!ENTITY dialog.title "Dodaj naroÄnino na filtre Adblock Plus">
+<!ENTITY location.label "&amp;Mesto seznama filtriranja:">
+<!ENTITY fromWeb.description "Potrdite, da želite dodati to naroÄnino na filter. Naslov ali kraj naroÄnine lahko spremenite Å¡e pred dodajanjem.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/composer.dtd
new file mode 100644
index 0000000..144de9e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "në fund të adresës">
+<!ENTITY domainRestriction.label "Kufizo në domain:">
+<!ENTITY collapse.default.no.label "Përdor të parazgjedhurën (jo):">
+<!ENTITY firstParty.label "Vetëm të parët">
+<!ENTITY preferences.label "Trego filtrin ekzistues...">
+<!ENTITY pattern.label "Kërko për motivin">
+<!ENTITY thirdParty.label "Vetëm të tretët">
+<!ENTITY filter.label "Filtër i ri:">
+<!ENTITY collapse.label "Shkatërro te bllokuarat:">
+<!ENTITY match.warning "Motivi që dhatë nuk përputhet më me adresat e bllokuara/lejuara dhe nuk ka më efekt mbi to.">
+<!ENTITY anchor.start.label "në fillim të adresës">
+<!ENTITY matchCase.label "Përputh shembullin">
+<!ENTITY custom.pattern.label "Përshtatja:">
+<!ENTITY unselectAllTypes.label "Mos selekto asnjë">
+<!ENTITY type.whitelist.label "Rregull përjashtimi">
+<!ENTITY regexp.warning "Motivi që dhatë do të interpretohet si shprehje e rregullt që nuk mund të përdoret nga Adblock Plus dhe mund të ngadalsojë hapjen e faqeve te internetit. Nëse nuk kishit ndërmend të përdorni një shprehje të rregullt, shtoni një (*) në fund të motivit.">
+<!ENTITY dialog.title "Shto një rregullore filtri në Adblock Plus">
+<!ENTITY basic.label "Pamje kryesore">
+<!ENTITY type.filter.label "Blloko filtrin">
+<!ENTITY types.label "Apliko në llojet:">
+<!ENTITY shortpattern.warning "Motivi që dhatë është shumë i shkurtër që të optimizohet dhe mund të ngadalsojë internetin. Rekomandohet që të zgjidhni një varg më të gjatë për këtë filtër në menyrë që të lejoj Adblock Plus ta përpunoj filtrin më mirë.">
+<!ENTITY collapse.yes.label "Po">
+<!ENTITY anchors.label "Prano vetëm motivin:">
+<!ENTITY collapse.default.yes.label "Përdor të parazgjedhurën (po):">
+<!ENTITY domainRestriction.help "Përdore këtë opsion që të specifikosh një ose më shumë adresa të ndara nga një (|). Filtri do të zbatohet vetëm në adresat(s) e zgjedhura. Një (~) përpara emrit të adresës tregon që filtri nuk do të zbatohet në atë adresë.">
+<!ENTITY accept.label "Shto filtër">
+<!ENTITY options.label "Mundësitë">
+<!ENTITY disabled.warning "Adblock Plus nuk punon për momentin. Mund të shtoni filtra por nuk do të funksionojnë nëse ju nuk [link]mundësoni Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "në fillim të domain name">
+<!ENTITY collapse.no.label "Jo">
+<!ENTITY selectAllTypes.label "Selekto të gjitha">
+<!ENTITY advanced.label "Pamje e avancuar">
+<!ENTITY pattern.explanation "Motivi mund të jetë çdo pjesë e adresës; simboli (*) vepron si xhoker. Filtri do të zbatohet vetëm në adresat që i përshtaten motivit të dhënë.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/filters.dtd
new file mode 100644
index 0000000..ac96eab
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Krejt filtrat tuaj të personalizuar do të zëvendësohen nga lënda e kartelës së përzgjedhur. Dëshironi të vazhdohet?">
+<!ENTITY slow.column "Filtruesit e ngadalshëm">
+<!ENTITY enabled.column "Aktivizo">
+<!ENTITY subscription.lastDownload.checksumMismatch "Deshtoi,mosperputhje checksumi">
+<!ENTITY noFiltersInGroup.text "Grupi i përzgjedhur është i zbrazët.">
+<!ENTITY subscription.actions.label "Veprime">
+<!ENTITY filter.selectAll.label "Përzgjidhi Krejt">
+<!ENTITY backupButton.label "&amp;Kopjeruaje dhe Riktheje">
+<!ENTITY restore.minVersion.warning "Kujdes: kartela është krijuar me një version Adblock Plus më të ri. Do të duhej ta përditësonit Adblock Plus-in me versionin më të ri, përpara se të riktheni të dhëna prej kësaj kartele.">
+<!ENTITY restore.error "Të dhënat e kartelës nuk përpunohen dot, ndoshta kjo nuk është kartelë kopjeruajtjesh për Adblock Plus?">
+<!ENTITY sort.ascending.label "A &gt; Z radhitje">
+<!ENTITY sort.label "Radhit sipas">
+<!ENTITY subscription.source.label "Lista e filtrave">
+<!ENTITY hitcount.column "Shtypje">
+<!ENTITY noFilters.text "Nuk keni ende ndonjë filtër të personalizuar.">
+<!ENTITY backup.custom.title "Vetëm filtrat e personalizuar">
+<!ENTITY subscription.external.label "E rifreksuar nga nje shtese tjeter">
+<!ENTITY subscription.delete.label "Fshije">
+<!ENTITY noGroupSelected.text "Përpara se të shfaqen filtrat e tij, lypset të përzgjidhni një grup filtrash.">
+<!ENTITY filter.cut.label "Kopjo-largo">
+<!ENTITY restore.default.label "Të rikthehet kopjeruajtja prej ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Duke u shkarkuar...">
+<!ENTITY subscriptions.tab.label "Filtroni abonimet">
+<!ENTITY sort.descending.label "Z &gt; A radhitje">
+<!ENTITY filters.remove.warning "Doni vërtet të hiqen krejt filtrat e përzgjedhur?">
+<!ENTITY filter.delete.label "Fshijë">
+<!ENTITY addSubscriptionAdd.label "Shto">
+<!ENTITY viewMenu.label "Shih">
+<!ENTITY subscription.lastDownload.unknown "N/D">
+<!ENTITY addSubscriptionCancel.label "Anulo">
+<!ENTITY subscription.enabled.label "E aktivizuar">
+<!ENTITY noSubscriptions.text "Ju nuk keni shtuar ndonje abonim per filter ende.Adblock Plus nuk do te bllokoje asgje pa filtra,ju lutem perdorin &quot;Shto nje abonim filtri&quot; per te shtuar disa.">
+<!ENTITY subscription.update.label "Përditësoni filtra">
+<!ENTITY dialog.title "Filtroni preferencat e Adblock Plus">
+<!ENTITY addFilter.label "Vendos filtrues">
+<!ENTITY subscription.minVersion.warning "Ky abonim filtri kerkon nje version me te ri te Adblock Plus,ti duhet te besh update ne versionin e fundit te Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Deshtoi,nje adrese e pavlefshme">
+<!ENTITY backup.error "Pati një gabim gjatë shkrimit te kartela. Sigurohuni që kartela nuk është e mbrojtur ndaj shkrimit ose që nuk po përdoret nga një zbatim tjetër.">
+<!ENTITY filter.moveUp.label "Ngjite sipër">
+<!ENTITY addGroup.label "Shtoni &amp;grup filtrash">
+<!ENTITY filter.edit.label "Përpunojeni">
+<!ENTITY subscription.showHideFilters.label "Shfaqni/fshihni filtra">
+<!ENTITY acceptableAds2.label "Lejo ndoca reklamë jo të &amp;bezdisshme">
+<!ENTITY addSubscriptionOther.label "Shto nje abonim tjeter">
+<!ENTITY close.label "Mbylle">
+<!ENTITY sort.none.label "Pa radhitur">
+<!ENTITY filter.actions.label "Veprime filtrash">
+<!ENTITY filter.copy.label "Kopjo">
+<!ENTITY filter.moveDown.label "Zbrite poshtë">
+<!ENTITY filter.resetHitCounts.label "Rinisi nga e para statistikat e vizitave">
+<!ENTITY readMore.label "Lexoni më tepër">
+<!ENTITY subscription.moveUp.label "Ngjite sipër">
+<!ENTITY addSubscription.label "Shto abonim per filter">
+<!ENTITY subscription.homepage.label "Kryefaqja">
+<!ENTITY backup.complete.title "Krejt filtrat dhe pajtimet">
+<!ENTITY restore.own.label "Rimerr vlera prej kopjeruajtjes së vet">
+<!ENTITY restore.complete.warning "Krejt parapëlqimet tuaja për filtrat do të zëvendësohen nga lënda e kartelës së përzgjedhur. Dëshironi të vazhdohet?">
+<!ENTITY filters.tab.label "Filtra te kostumizuar">
+<!ENTITY backup.label "Krijoni një kopjeruajtje të re">
+<!ENTITY find.label "Kërko">
+<!ENTITY subscription.moveDown.label "Zbrite poshtë">
+<!ENTITY subscription.lastDownload.connectionError "Deshtoi,gabim shkarkimi">
+<!ENTITY subscription.lastDownload.success "Sukses">
+<!ENTITY subscription.lastDownload.invalidData "Deshtoi,nje liste jo e vlefshme filtrash">
+<!ENTITY filter.paste.label "Hedh">
+<!ENTITY subscription.disabledFilters.enable "Aktivizoni filtrat e aktivizuar">
+<!ENTITY lasthit.column "Shtypja e fundit">
+<!ENTITY subscription.editTitle.label "Përpunoni titullin">
+<!ENTITY subscription.disabledFilters.warning "Për këtë pajtim, disa nga filtrat janë çaktivizuar.">
+<!ENTITY filter.column "Rregulla e filtrimit">
+<!ENTITY subscription.lastDownload.label "Shkarkimi i fundit:">
+<!ENTITY viewList.label "Shihni listën">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/firstRun.properties
new file mode 100644
index 0000000..21438b1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/firstRun.properties
@@ -0,0 +1,24 @@
+firstRun_title=Adblock Plus has been installed
+firstRun_dataCorruptionWarning=Does this page keep showing up? <a>Click here!</a>
+firstRun_acceptableAdsHeadline=Annoying ads will now be blocked
+firstRun_acceptableAdsExplanation=We'd like to encourage websites to use straightforward, unobtrusive advertising. That's why we've established <a>strict guidelines</a> to identify acceptable ads, which are shown under default settings. If you still want to block every ad you can <a>disable</a> this in a few seconds.
+firstRun_legacySafariWarning=You are using an old version of Safari which is not supported by Adblock Plus. It might not work correctly or impair the user experience on some websites. We strongly recommend to either update to Safari 6.1.1 or higher (on OS X 10.8 Mountain Lion), or Safari 7.0.1 or higher (on OS X 10.9 Mavericks), or to use the latest version of Mozilla Firefox, Google Chrome or Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
+
+firstRun_toggle_on=ON
+firstRun_toggle_off=OFF
+
+firstRun_features=Adblock Plus can do more than block ads
+firstRun_feature_malware=Malware Blocking
+firstRun_feature_malware_description=Make your browsing more secure by blocking known malware domains.
+firstRun_feature_social=Remove Social Media Buttons
+firstRun_feature_social_description=Automatically rid your browsing experience of social media buttons, such as the Facebook Like, which appear on web pages and track your behavior.
+firstRun_feature_tracking=Disable Tracking
+firstRun_feature_tracking_description=Browse privately by disabling tracking - hiding your tracks from ad companies that would track your every move.
+
+firstRun_share_headline=<a>Give us a hand</a> in making the web a better place
+firstRun_donate=donate
+firstRun_donate_label=Support our project
+firstRun_share=Tell your friends
+
+firstRun_contributor_credits=Contributor Credits
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/global.properties
new file mode 100644
index 0000000..37f6dc5
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/global.properties
@@ -0,0 +1,41 @@
+disabled_tooltip=Adblock Plus është ç'aktiv.
+blocked_count_tooltip=?1?jasht nga ?2?
+action3_tooltip=Aktivizim/çaktivizo Adblock Plus.
+no_blocking_suggestions=S'ka elemente bllokuese në këtë faqe
+type_label_object=objekti
+type_label_popup=dritarja pop-up
+type_label_image=figura
+type_label_other=tjera
+type_label_font=shkronjat
+mobile_menu_enable=ABP: Mbroj
+type_label_subdocument=ndarja
+type_label_media=zë/video
+type_label_xmlhttprequest=kerkimi për XML
+type_label_script=skripta
+type_label_elemhide=fshehur
+type_label_document=dokumenti
+whitelisted_tooltip=Adblock Plus është aktiv por i pasivizuar në këtë faqe.
+default_dialog_title=Adblock Plus
+type_label_stylesheet=stilet
+notification_antiadblock_title=Hide targeted messages?
+filter_elemhide_nocriteria=No criteria specified to recognize the element to be hidden
+blockingGroup_title=Ad Blocking Rules
+filter_regexp_tooltip=This filter is either a regular expression or too short to be optimized. Too many of these filters might slow down your browsing.
+action0_tooltip=Click to bring up context menu, middle-click to enable/disable.
+whitelisted_page=Adblock Plus has been disabled for the current page
+remove_group_warning=Do you really want to remove this group?
+action1_tooltip=Click to open/close blockable items, middle-click to enable/disable.
+active_tooltip=Adblock Plus is enabled, ?1? filter subscription(s) and ?2? custom filter(s) in use.
+type_label_object_subrequest=object subrequest
+whitelistGroup_title=Exception Rules
+filter_elemhide_duplicate_id=Only one ID of the element to be hidden can be specified
+action2_tooltip=Click to open preferences, middle-click to enable/disable.
+clearStats_warning=This will reset all filter hit statistics and disable counting filter hits. Do you want to proceed?
+notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages?
+blocked_count_addendum=(also whitelisted: ?1?, hidden: ?2?)
+subscription_invalid_location=Filter list location is neither a valid URL nor a valid file name.
+remove_subscription_warning=Do you really want to remove this subscription?
+mobile_menu_disable_site=ABP: Disable on ?1?
+elemhideGroup_title=Element Hiding Rules
+mobile_menu_enable_site=ABP: Enable on ?1?
+newGroup_title=New filter group
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/overlay.dtd
new file mode 100644
index 0000000..256509f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY opensidebar.label "Hap elementet &amp;bllokuese">
+<!ENTITY options.label "Mundësitë (&amp;O)">
+<!ENTITY context.object.label "Adblock Plus: Objektet e bllokuara">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Rilejo në këtë faqe">
+<!ENTITY context.frame.label "Adblock Plus: Pjesët e bllokuara">
+<!ENTITY filters.tooltip "Filtruesit më aktivë:">
+<!ENTITY menuitem.label "Parapëlqimet e Ad&amp;block Plus">
+<!ENTITY closesidebar.label "M&amp;byll elementet bllokuese">
+<!ENTITY whitelist.page.label "Çaktivizo vetëm në këtë faqe">
+<!ENTITY whitelist.site.label "Çaktivizo në ?1?">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.image.label "Adblock Plus: Figurat e bllokuara">
+<!ENTITY status.tooltip "Gjendja:">
+<!ENTITY objecttab.title "Blloko">
+<!ENTITY subscription.update.label "Përditësoni filtra">
+<!ENTITY notification.button.yes "&amp;Yes">
+<!ENTITY notification.button.no "&amp;No">
+<!ENTITY sync.label "Syn&amp;c Adblock Plus settings">
+<!ENTITY filters.label "&amp;Filter preferences">
+<!ENTITY disable.label "Disable everywhere">
+<!ENTITY objecttab.tooltip "Click here to block this object with Adblock Plus">
+<!ENTITY objecttabs.label "Show &amp;tabs on Flash and Java">
+<!ENTITY sendReport.label "&amp;Report issue on this page">
+<!ENTITY counthits.label "Count filter &amp;hits">
+<!ENTITY notification.button.close "&amp;Close">
+<!ENTITY contribute.label "Contribute to Adblock Plus">
+<!ENTITY blocked.tooltip "Blocked items on this page:">
+<!ENTITY hideplaceholders.label "Hide p&amp;laceholders of blocked elements">
+<!ENTITY showinstatusbar.label "&amp;Show in status bar">
+<!ENTITY sidebar.title "Blockable items on current page">
+<!ENTITY showintoolbar.label "Show in tool&amp;bar">
+<!ENTITY context.media.label "Adblock Plus: Block audio/video">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/sendReport.dtd
new file mode 100644
index 0000000..a4139d6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/sendReport.dtd
@@ -0,0 +1,71 @@
+<!ENTITY screenshot.undo.label "Zhbeje (&amp;U)">
+<!ENTITY issues.disabledgroups.description "Abonimet e meposhtme ne filtra/grupe filtrash jane te bllokuar, gjithashtu ata mund te kene efikasitet ne kete faqe:">
+<!ENTITY showData.label "Afisho permbajtjen e raportit">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus po bllokon shu&amp;me">
+<!ENTITY issues.change.description "Konfigurimi juaj ka ndryshuar. Ju lutem ri-ngarkoni faqen per te provuar ndryshimet dhe per te derguar nje raportim nese problemi nuk eshte zgjidhur nga ndryshimet ne konfigurim.">
+<!ENTITY email.label "Posta: (&amp;m)">
+<!ENTITY issues.openPreferences.label "Hap parametrat e filtrave">
+<!ENTITY sendPage.confirmation "Raporti juaj eshte ruajtur. Ju mund ta shikoni ate ne kete adrese:">
+<!ENTITY copyLink.label "KOpjo adresen e raportit (&amp;C)">
+<!ENTITY issues.nofilters.description "Adblock Plus nuk eshte duke bllokuar asgje ne faqen aktuale. Ky problem qe ju po vereni ka shume mundesi qe nuk ka fare lidhje me Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Problemi qe ju keni raportuar ka shume mundesi te jete i njohur. Per me shume informacion:">
+<!ENTITY typeSelector.other.description "Zgjidhni kete mundesi nese ju dyshoni se eshte nje problem me vete Adblock Plus ne vend te filtrave te tij.">
+<!ENTITY issues.disabledgroups.enable.label "Aktivizo abonim filtri/grup filtrash">
+<!ENTITY typeWarning.override.label "Une kuptoj dhe de&amp;shiroj te dergoj raportin gjithsesi">
+<!ENTITY issues.disabled.enable.label "Aktivizo Adblock Plus">
+<!ENTITY reloadButton.label "&amp;Ringarko faqen">
+<!ENTITY recentReports.clear.label "Hiq gjithe &amp;raportimet">
+<!ENTITY typeSelector.description "Kjo dritare do ju udhezoje neper gjithe hapat e nevojshem per dergimin e raportit te problemeve me Adblock Plus. Si fillim, ju lutem zgjidhni tipin e problemit qe ju vereni me kete faqe:">
+<!ENTITY screenshot.remove.label "Hiqni te dhenat pe&amp;rsonale">
+<!ENTITY issues.ownfilters.description "Disa nga filtrat e aplikuar ne kete faqe jane te percaktuar nga perdoruesi. Ju lutem bllokoni filtrat te cilet mund te kene shkaktuar kete problem:">
+<!ENTITY sendPage.retry.label "Dergo perseri">
+<!ENTITY data.label "&amp;Permbajtja e raportit:">
+<!ENTITY recentReports.label "Raportimet tuaja me te fundit">
+<!ENTITY typeWarning.description "Ju keni treguar se deshironi te raportoni nje problem te pergjithshem me Adblock Plus ne vend te nje problemi me filtrat. Ju lutem kini parasysh se keto probleme raportohen me mire ne [link]forumin Adblock Plus[/link]. Ju duhet te perdorni raportimin e problemeve vetem si shtese te nje diskutimi ekzistues, sepse askush nuk do ta vere re raportimin tuaj, vetem nese ju jepni nje adrese te problemit. Adrese e krijuar automatikisht do ju jepet pasi ju te keni derguar raportin.">
+<!ENTITY issues.disabled.description "Adblock Plus eshte jo-aktiv, ai nuk do te bllokoje asnje gje ne gjendjen aktuale.">
+<!ENTITY attachExtensions.label "Bashkangjisni nje liste te prapashtesave aktive ne raportim, ne rast se shkaku i problemit eshte nje konflikt ndermjet moduleve. (&amp;x)">
+<!ENTITY issues.nosubscriptions.add.label "Shto abonim ne filtra">
+<!ENTITY issues.disabledfilters.enable.label "Aktivizo filtrin">
+<!ENTITY issues.override.label "Konfigurimi eshte i sakte, vazhdoni me raportimin (&amp;c)">
+<!ENTITY issues.nosubscriptions.description "Duket sikur ju nuk keni asnje abonim ne filtrat e gatshem te cilet heqin automatikisht permbajtjen e padeshiruar nga faqet web.">
+<!ENTITY typeSelector.other.label "Problem &amp;tjeter">
+<!ENTITY issues.whitelist.remove.label "Ri-aktivizo Adblock Plus ne kete faqe">
+<!ENTITY typeSelector.falsePositive.description "Zgjidhni kete mundesi nese faqes i mungon permbajtja e rendesishme, shfaqet gabim ose nuk funksionon ne rregull. Ju mund te percaktoni nese problemi eshte Adblock Plus duke e fikur ate perkohesisht.">
+<!ENTITY dataCollector.description "Ju lutem prisni disa momente deri sa Adblock Plus te mbledhe te gjitha te dhenat e nevojshme.">
+<!ENTITY sendButton.label "Dergo raporti&amp;n">
+<!ENTITY comment.label "Koment (fakultative): (&amp;C)">
+<!ENTITY sendPage.errorMessage "Tentativa per te derguar raportin ngeci me kodin e gabimit &quot;?1?&quot;. Ju lutem sigurohuni qe jeni te lidhur ne internet dhe provoni perseri. Nese ky problem perseritet kerkoni ndihme ne [link]forumin e Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Afisho raportimet e derguara se fundmi">
+<!ENTITY commentPage.heading "Koment">
+<!ENTITY update.start.label "Filloni përditëso tani">
+<!ENTITY issues.disabledfilters.description "Filtrat e meposhtem jane te bllokuar, gjithashtu ata mund te kene efikasitet ne kete faqe:">
+<!ENTITY screenshot.description "E njejta faqe mund te duket ndryshe per njerez te ndryshem. Mund te na ndihmoje ne kuptimin e problemit nese ju bashkangjisni nje foto raportimit tuaj. Ju mund te hiqni ose mbuloni fusha te cilat permbajne informacion te rendesishem dhe personal dhe gjithashtu mund te shenoni zonat ku eshte i dukshem problemi. Per te bere kete klikoni butonin e duhur dhe zgjidhni nje zone te fotos me mausin tuaj.">
+<!ENTITY screenshot.attach.label "Bashkangji&amp;t nje faqe me imazh ketij raportimi">
+<!ENTITY issues.whitelist.description "Adblock Plus eshte aktualisht jo-aktiv ne faqen ne te cilen ju po raportoni. Ju lutem ri-aktivizojeni ate dhe ringarkoni faqen perpara se te dergoni raportin i cili do te ndihmoje ne hetimin e metejshem te ketij problemi.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus nuk po bllokon nje reklame (&amp;v)">
+<!ENTITY typeSelector.heading "Lloji i problemit">
+<!ENTITY wizard.title "Raportuesi i problemeve">
+<!ENTITY issues.ownfilters.disable.label "Blloko filtrin">
+<!ENTITY commentPage.description "Fusha e meposhtme ju lejon qe te jepni nje koment qe te na ndihmoje ne ta kuptojme me mire problemin. Ky hap eshte fakultativ por i rekomanduar nese problemi nuk eshte lehtesisht i dallueshem. Ju mund te rishikoni gjithashtu te dhenat e raportimit perpara se te dergohet.">
+<!ENTITY comment.lengthWarning "Gjatesia e komentit tuaj i kapercent 1000 karaktere. Vetem 1000 karakteret e para do te dergohen se bashku me raportin.">
+<!ENTITY typeSelector.falseNegative.description "Zgjidhni kete mundesi nese nje reklame shfaqet edhe pse Adblock Plus eshte aktiv.">
+<!ENTITY sendPage.waitMessage "Ju lutem prisni sa Adblock Plus te dergoje raportin tuaj.">
+<!ENTITY dataCollector.heading "Mire se vini ne raportuesin e problemeve">
+<!ENTITY screenshot.heading "Bashkangjit foto">
+<!ENTITY sendPage.heading "Dergo raportin">
+<!ENTITY issues.subscriptionCount.description "Duket sikur ju jeni abonuar ne shume filtra. Ky konfigurim nuk rekomandohet sepse to te shtoje rastet e problemeve te njejta. Gjithashtu ne nuk mund te pranojme raportimin tuaj te problemeve sepse eshet i paqarte se me ke abonim filtri autori duhet te veproje. Ju lutem hiqni te gjithe abonimet ne filtra perveç atyre te nevojshem dhe provoni nese problemi do te jete perseri.">
+<!ENTITY screenshot.mark.label "Shenoni proble&amp;min">
+<!ENTITY privacyPolicy.label "Rregulla Privatësie">
+<!ENTITY issues.description "Adblock Plus ka dalluar probleme me konfigurimin tuaj i cili mund te jete pergjegjes per kete problem ose do te veshtiresoje hetimin e raportit.">
+<!ENTITY update.fixed.description "The updates to your filter subscriptions likely resolved the issue that you
+ were reporting. Please reload the page and retry, hit Report again if the
+ problem remains.">
+<!ENTITY anonymous.label "&amp;Anonymous submission">
+<!ENTITY update.inProgress.description "Adblock Plus needs to update your filter subscriptions to make sure that the
+ issue hasn't been resolved already. Please wait...">
+<!ENTITY emailComment.label "We encourage you to enter a valid email address so that we can contact you if there are questions
+ about your report. It will also allow us to recognize your contributions and to prioritize them higher.">
+<!ENTITY outdatedSubscriptions.description "The following filter subscriptions haven't been updated for at least two
+ weeks. Please update these subscriptions before submitting a report, the
+ issue might be resolved already.">
+<!ENTITY anonymity.warning "We won't be able to come back to you and will likely prioritize the report lower.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/sidebar.dtd
new file mode 100644
index 0000000..b953b23
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Blic kufijte e artikull">
+<!ENTITY address.label "Adresa">
+<!ENTITY context.open.label "Hape një një lidhje të re">
+<!ENTITY type.label "Lloji">
+<!ENTITY tooltip.filterSource.label "Burimi i filtruesit:">
+<!ENTITY noitems.label "S'ka elemente bllokuese">
+<!ENTITY filter.label "Filtruesi">
+<!ENTITY tooltip.size.label "Madhësia:">
+<!ENTITY reattach.label "Bashkëngjit">
+<!ENTITY search.label "Kërko: (&amp;S)">
+<!ENTITY docDomain.thirdParty "(të tretët)">
+<!ENTITY filterSource.label "Burimi i filtrit">
+<!ENTITY tooltip.docDomain.label "Burimi i dokumentit:">
+<!ENTITY context.copy.label "Kopjo adresën e elementit">
+<!ENTITY tooltip.type.label "Lloji:">
+<!ENTITY context.disablefilter.label "Çaktivizo filtruesin ?1?">
+<!ENTITY context.copyFilter.label "Kopjo filtruesin">
+<!ENTITY context.block.label "Blloko këtë send">
+<!ENTITY context.enablefilter.label "Ri mundëso filtruesin ?1?">
+<!ENTITY detach.label "Shkëput">
+<!ENTITY whitelisted.label "Lista e faqeve të lejueshme">
+<!ENTITY context.disablefilteronsite.label "Pamundëso filtruesin në ?1?">
+<!ENTITY detached.title "Adblock Plus: Artikuj per te bllokuar (i shkëputur)">
+<!ENTITY docDomain.firstParty "(të parët)">
+<!ENTITY tooltip.type.whitelisted "(lejuar)">
+<!ENTITY tooltip.filter.label "Filtri në përdorim:">
+<!ENTITY tooltip.filter.disabled "(qkyqur)">
+<!ENTITY context.editfilter.label "Vendos filtruesin në veprim">
+<!ENTITY tooltip.type.blocked "(bllokuar)">
+<!ENTITY size.label "Madhësia">
+<!ENTITY context.whitelist.label "shtoni përjashtim për sundimin artikull">
+<!ENTITY context.selectAll.label "Selekto të gjitha">
+<!ENTITY state.label "Gjendja">
+<!ENTITY docDomain.label "Burimi i dokumentit">
+<!ENTITY tooltip.address.label "Adresa:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/subscriptionSelection.dtd
new file mode 100644
index 0000000..e336024
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY list.download.failed "Adblock Plus dështoj të lidhet me listën e abonimeve.">
+<!ENTITY list.download.retry "Provo prap">
+<!ENTITY title.label "&amp;Titulli i abonimit:">
+<!ENTITY list.download.website "Shiko faqen">
+<!ENTITY viewList.label "Shiko filtrat">
+<!ENTITY visitHomepage.label "Vizito faqen kryesore">
+<!ENTITY addSubscription.label "Shto abonim">
+<!ENTITY dialog.title "Shtoi Adblock Plus filtër abonimi">
+<!ENTITY location.label "Vendi i &amp;listës së filtrit:">
+<!ENTITY fromWeb.description "Ju lutem konfirmoni që doni të shtoni këtë filtër abonimi. Ju mund ta ndryshoni emrin e abonimit ose vendëndodhjen para se ta konfirmoni.">
+<!ENTITY addMain.label "Add filter &amp;subscription &quot;?1?&quot; as well">
+<!ENTITY supplementMessage "This filter subscription is meant to be used with the filter subscription &quot;?1?&quot; which you are not using yet.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/composer.dtd
new file mode 100644
index 0000000..3a398e3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "на &amp;крају адреÑе">
+<!ENTITY domainRestriction.label "Ограничи на &amp;домен:">
+<!ENTITY collapse.default.no.label "Подразумевано (не)">
+<!ENTITY firstParty.label "Само Ñа о&amp;ве адреÑе">
+<!ENTITY preferences.label "&amp;Прикажи поÑтојеће филтере…">
+<!ENTITY pattern.label "Потражи образац">
+<!ENTITY thirdParty.label "Само Ñа други&amp;Ñ… адреÑа">
+<!ENTITY filter.label "Ðови &amp;филтер:">
+<!ENTITY collapse.label "&amp;Скупи блокирано:">
+<!ENTITY match.warning "Образац који Ñте унели више Ñе не поклапа Ñа адреÑом која треба да буде блокирана/одобрена и на њу неће утицати.">
+<!ENTITY anchor.start.label "на &amp;почетку адреÑе">
+<!ENTITY matchCase.label "&amp;Разликуј мала и велика Ñлова">
+<!ENTITY custom.pattern.label "&amp;Прилагођено:">
+<!ENTITY unselectAllTypes.label "Поништи избор">
+<!ENTITY type.whitelist.label "И&amp;зузетак">
+<!ENTITY regexp.warning "Образац који Ñте унели ће бити коришћен као регуларни израз. Превише регуларних израза може уÑпорити прегледач интернет Ñтрана. Уколико не намеравате да кориÑтите регуларне изразе, додајте Ñимбол * на крају обраÑца.">
+<!ENTITY dialog.title "Додавање правила за филтер Adblock Plus-а">
+<!ENTITY basic.label "ОÑновни приказ">
+<!ENTITY type.filter.label "Фи&amp;лтер за блокирање">
+<!ENTITY types.label "Примени на типове:">
+<!ENTITY shortpattern.warning "Образац који Ñте унели је прекратак за оптимизацију, превише таквих образаца може уÑпорити прегледач интернет Ñтрана. Препоручљиво је да кориÑтите дуже изразе као филтере.">
+<!ENTITY collapse.yes.label "Да">
+<!ENTITY anchors.label "Прихвати Ñамо образац:">
+<!ENTITY collapse.default.yes.label "Подразумевано (да)">
+<!ENTITY domainRestriction.help "Ðаведите један или више домена раздвојених знаком &quot;|&quot;. Филтер ће бити употребљен једино за ове домене. Знак &quot;~&quot; иÑпред домена значи да ће домен бити изузет од филтрирања.">
+<!ENTITY accept.label "Додај филтер">
+<!ENTITY options.label "Опције">
+<!ENTITY disabled.warning "Adblock Plus је тренутно иÑкључен. И даље можете додавати филтере, али ће они бити примењени тек kada [link]укључиte Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "на почетку &amp;домена">
+<!ENTITY collapse.no.label "Ðе">
+<!ENTITY selectAllTypes.label "Изабери Ñве">
+<!ENTITY advanced.label "Ðапредни приказ">
+<!ENTITY pattern.explanation "Образац може бити било који део адреÑе, Ñимбол * Ñе кориÑти као џокер. Филтер ће бити коришћен једино ако Ñе адреÑа Ñлаже Ñа обраÑцем.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/filters.dtd
new file mode 100644
index 0000000..0aae653
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Сви ваши прилагођени филтери ће бити замењени Ñа онима из изабрање датотеке. Желите ли да наÑтавите?">
+<!ENTITY slow.column "Спор&amp;и филтери">
+<!ENTITY enabled.column "Омогуће&amp;н">
+<!ENTITY subscription.lastDownload.checksumMismatch "ÐеуÑпело, неÑлагање извештаја">
+<!ENTITY noFiltersInGroup.text "Изабрана група је празна.">
+<!ENTITY subscription.actions.label "Радње">
+<!ENTITY filter.selectAll.label "Изабери Ñве">
+<!ENTITY backupButton.label "Ðап&amp;рави резервну копију и врати у претходно Ñтање">
+<!ENTITY restore.minVersion.warning "Ðапомена: датотека је направљена у новијој верзији додатка Adblock Plus. Требало би да доградите Adblock Plus на најновију верзију пре враћања претходног Ñтања из ове датотеке.">
+<!ENTITY restore.error "Подаци из датотеке ниÑу могли да буду обрађени. Да ли је то заиÑта датотека резерве копије Adblock Plus?">
+<!ENTITY sort.ascending.label "Од &amp;Рдо Ш">
+<!ENTITY sort.label "&amp;Сортирај по">
+<!ENTITY subscription.source.label "СпиÑак филтера">
+<!ENTITY hitcount.column "Бро&amp;ј погодака">
+<!ENTITY noFilters.text "Ðемате прилагођених филтера.">
+<!ENTITY backup.custom.title "Само прилагођени филтери">
+<!ENTITY subscription.external.label "Ðжурира други додатак">
+<!ENTITY subscription.delete.label "Избриши">
+<!ENTITY noGroupSelected.text "Морате да изаберете групу филтера да би њени филтери били приказани.">
+<!ENTITY filter.cut.label "ИÑеци">
+<!ENTITY restore.default.label "Врати претходно Ñтање од ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Преузимање...">
+<!ENTITY subscriptions.tab.label "Претплате на филтере">
+<!ENTITY sort.descending.label "Од &amp;Ш до Ð">
+<!ENTITY filters.remove.warning "Желите ли да уклоните Ñве изабране филтере?">
+<!ENTITY filter.delete.label "Избриши">
+<!ENTITY addSubscriptionAdd.label "Додај">
+<!ENTITY viewMenu.label "Приказ">
+<!ENTITY subscription.lastDownload.unknown "Ðепознато">
+<!ENTITY addSubscriptionCancel.label "Откажи">
+<!ENTITY subscription.enabled.label "Омогућено">
+<!ENTITY noSubscriptions.text "ÐиÑте додали ниједну претплату на филтер. Adblock Plus неће блокирати ништа без њих, па притиÑните „Додај претплату на филтерâ€.">
+<!ENTITY subscription.update.label "Ðжурирај филтере">
+<!ENTITY dialog.title "Подешавања Adblock Plus филтера">
+<!ENTITY addFilter.label "&amp;Додај филтер">
+<!ENTITY subscription.minVersion.warning "Ова претплата на филтер захтева новију верзију додатка Adblock Plus. Молимо Ð²Ð°Ñ Ð´Ð° унапредите додатак.">
+<!ENTITY subscription.lastDownload.invalidURL "ÐеуÑпело, неиÑправна адреÑа">
+<!ENTITY backup.error "Дошло је до грешке приликом чувања филтера у датотеку. Проверите да датотека није Ñамо за читање или је не корити нека друга апликација.">
+<!ENTITY filter.moveUp.label "Помери нагоре">
+<!ENTITY addGroup.label "Додај &amp;групу филтера">
+<!ENTITY filter.edit.label "Уреди">
+<!ENTITY subscription.showHideFilters.label "Прикажи/Ñакриј филтере">
+<!ENTITY acceptableAds2.label "Дозволи &amp;ненаметљиве рекламе">
+<!ENTITY addSubscriptionOther.label "Додај другу претплату">
+<!ENTITY close.label "Затвори">
+<!ENTITY sort.none.label "Ð&amp;епоређано">
+<!ENTITY filter.actions.label "Радње филтера">
+<!ENTITY filter.copy.label "Копирај">
+<!ENTITY filter.moveDown.label "Помери надоле">
+<!ENTITY filter.resetHitCounts.label "Поништи ÑтатиÑтике">
+<!ENTITY readMore.label "Сазнај више">
+<!ENTITY subscription.moveUp.label "Помери нагоре">
+<!ENTITY addSubscription.label "Додај &amp;претплату на филтер">
+<!ENTITY subscription.homepage.label "Матична Ñтраница">
+<!ENTITY backup.complete.title "Додај филтере и претплате">
+<!ENTITY restore.own.label "Врати ÑопÑтвено претходно Ñтање">
+<!ENTITY restore.complete.warning "Све ваша подешавања филтера ће бити замењена Ñа онима из изабране датотеке. Желите ли да наÑтавите?">
+<!ENTITY filters.tab.label "Прилагођени филтери">
+<!ENTITY backup.label "Ðаправи нову резервну копију">
+<!ENTITY find.label "Прона&amp;ђи">
+<!ENTITY subscription.moveDown.label "Помери надоле">
+<!ENTITY subscription.lastDownload.connectionError "ÐеуÑпело, грешка у преузимању">
+<!ENTITY subscription.lastDownload.success "УÑпешно">
+<!ENTITY subscription.lastDownload.invalidData "ÐеуÑпело, није лиÑта филтера">
+<!ENTITY filter.paste.label "Ðалепи">
+<!ENTITY subscription.disabledFilters.enable "Омогући онемогућене филтере">
+<!ENTITY lasthit.column "ПоÑ&amp;ледњи погодак">
+<!ENTITY subscription.editTitle.label "Уреди наÑлов">
+<!ENTITY subscription.disabledFilters.warning "Ðеки филтери Ñа ÑпиÑка Ñу онемогућени.">
+<!ENTITY filter.column "Правило &amp;филтера">
+<!ENTITY subscription.lastDownload.label "ПоÑледње преузимање:">
+<!ENTITY viewList.label "Погледај ÑпиÑак">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/firstRun.properties
new file mode 100644
index 0000000..cac5818
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Сурфујте приватно Ñа онемогућеним праћењем - Ñкривајући Ñе од рекламних компанија које прате Ñваки ваш потез.
+firstRun_toggle_off=ИÑкључен
+firstRun_feature_tracking=Онемогући праћење
+firstRun_feature_malware=Блокирање малвера
+firstRun_title=Adblock Plus је инÑталиран
+firstRun_toggle_on=Укључен
+firstRun_acceptableAdsExplanation=Желели биÑмо да охрабримо Ñајтове да кориÑте фер и ненападно оглашавање, и зато Ñмо покренули <a>Ñтриктан правилник</a> у циљу препознавања прихватљивих оглаÑа који је могуће видети под подразумеваним поÑтавкама. Ðко и даље желите да блокирате Ñве оглаÑе, можете <a>онемогућити</a> ову опцију.
+firstRun_contributor_credits=Кредитовани Ñарадници
+firstRun_dataCorruptionWarning=Да ли Ñе ова Ñтраница наÑтавља појављивати? <a>Кликните овде!</a>
+firstRun_acceptableAdsHeadline=ДоÑадне рекламе ће Ñада бити блокиране
+firstRun_share=Препоручите Ð½Ð°Ñ Ñвојим пријатељима
+firstRun_share_headline=<a>Помози нам</a> да интернет поÑтане боље меÑто
+firstRun_feature_social_description=ÐутоматÑки учините Ñурфовање оÑлобођеним од дугмића друштвених мрежа, као што Ñу "Facebook Like" дугме, који Ñе појављују на Ñтраницама и прате ваше понашање.
+firstRun_filterlistsReinitializedWarning=Изгледа да је проблем узроковао да Ñви филтери буду уклоњени, а резервне примерке није могуће повратити. Због тога Ñмо морали да вратимо поÑтавке филтера и дозвољених оглаÑа на подразумеване вредноÑти. Проверите лиÑте филтера и дозвољене оглаÑе у <a>опцијама Adblock Plus-а</a>.
+firstRun_feature_malware_description=Учините ваше Ñурфовање Ñигурнијим, блокирајући домене познате по злонамерним малвер програмима.
+firstRun_features=Adblock Plus може више од блокирања реклама
+firstRun_donate=Донирајте
+firstRun_donate_label=Подржите наш пројекат
+firstRun_feature_social=Уклоните дугмиће друштвених мрежа
+firstRun_legacySafariWarning=КориÑтите верзију Сафарија коју Adblock Plus не подржава, зато је могуће да неке веб Ñтранице неће бити оптимално приказане, или ABP уопште неће функциониÑати. Препоручујемо да унапредите Safari у задњу верзију, или да кориÑтите Мозила ФајерфокÑ, Гугл Кром или Опера браузер.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/global.properties
new file mode 100644
index 0000000..b7fe0ce
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Ðа овој Ñтрани нема Ñтавки које могу да Ñе блокирају
+action3_tooltip=Кликните да биÑте укључили/иÑкључили Adblock Plus.
+notification_antiadblock_title=Сакријте изабране поруке?
+type_label_script=Ñкрипт
+filter_elemhide_nocriteria=Ðије пронађен критеријум за препознавање елемента који ће бити Ñакривен.
+blockingGroup_title=Правила за блокирање реклама
+whitelisted_tooltip=Adblock Plus је онемогућен на тренутној Ñтрани.
+type_label_stylesheet=Ñтил
+blocked_count_tooltip=?1? од ?2?
+type_label_font=фонт
+type_label_popup=иÑкачући прозор
+filter_regexp_tooltip=Филтер је или регуларан израз или је прекратак за оптимизацију. Превише таквих филтера може уÑпорити ваш прегледач.
+action0_tooltip=Кликните да биÑте отворили приручни мени, а Ñредњи клик за укључивање/иÑкључивање.
+whitelisted_page=Adblock Plus је иÑкључен за ову Ñтрану
+remove_group_warning=Желите ли да уклоните ову групу?
+action1_tooltip=Кликните да биÑте отворили Ñтавке које Ñе могу блокирати, а Ñредњи клик за укључивање/иÑкључивање.
+type_label_xmlhttprequest=XML захтев
+active_tooltip=Adblock Plus је омогућен, ?1? претплата на филтере, ?2? прилагођених филтера у употреби.
+type_label_document=документ
+type_label_object_subrequest=подзахтев за објектом
+whitelistGroup_title=Правила за изузетке
+disabled_tooltip=Adblock Plus је онемогућен.
+filter_elemhide_duplicate_id=Да би Ñте Ñакрили елеменат, морате дати Ñамо један идентитет елемента.
+type_label_object=објекат
+action2_tooltip=Кликните да биÑте отворили подешавања, а Ñредњи клик за омогућавање/онемогућавање.
+type_label_subdocument=оквир
+clearStats_warning=Ово ће поништити ÑтатиÑтике Ñвих филтера и онемогућити даље бројање. Желите ли да наÑтавите?
+notification_antiadblock_message=Познато је да овај Ñајт приказује циљане поруке кориÑницима Adblock Plus-а. Желите ли да Ñакријете те поруке?
+blocked_count_addendum=(такође допуштено: ?1?, Ñакривено: ?2?)
+subscription_invalid_location=ÐеиÑправна адреÑа и име датотеке Ñа ÑпиÑком филтера.
+type_label_image=Ñлика
+remove_subscription_warning=Желите ли да уклоните ову претплату?
+type_label_other=друго
+mobile_menu_enable=ABP: омогући
+type_label_media=аудио/видео
+mobile_menu_disable_site=ABP: онемогући на ?1?
+elemhideGroup_title=Правила за блокирање елемената
+mobile_menu_enable_site=ABP: омогући на ?1?
+type_label_elemhide=Ñакривен
+newGroup_title=Ðова група филтера
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/overlay.dtd
new file mode 100644
index 0000000..52b43c7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Да">
+<!ENTITY notification.button.no "&amp;Ðе">
+<!ENTITY sync.label "ПоÑтавке &amp;уÑклађивања Adblock Plus-а">
+<!ENTITY whitelist.site.label "Онемогући на ?1?">
+<!ENTITY filters.label "Подешавања &amp;филтера">
+<!ENTITY disable.label "Онемогући Ñвуда">
+<!ENTITY objecttab.title "Блокирај">
+<!ENTITY objecttab.tooltip "Кликните овде да биÑте блокирали објекат помоћу Adblock Plus-а">
+<!ENTITY menuitem.label "Adblock Plus - подеша&amp;вања">
+<!ENTITY objecttabs.label "Прикажи &amp;језичак на Flash и Java објектима">
+<!ENTITY sendReport.label "&amp;Пријави проблеме на овој Ñтраници">
+<!ENTITY whitelist.page.label "Онемогући Ñамо на овој Ñтраници">
+<!ENTITY context.image.label "Блокирај Ñлику">
+<!ENTITY counthits.label "Бр&amp;ој поготке филтера">
+<!ENTITY opensidebar.label "О&amp;твори Ñтавке које Ñе могу блокирати">
+<!ENTITY notification.button.close "&amp;Затвори">
+<!ENTITY contribute.label "ДопринеÑите Adblock Plus-у">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Блокирај оквир">
+<!ENTITY blocked.tooltip "Блокиране Ñтавке на овој Ñтрани:">
+<!ENTITY hideplaceholders.label "Сакриј &amp;држаче елемената блокираних Ñтавки">
+<!ENTITY showinstatusbar.label "Прикажи у &amp;ÑтатуÑној траци">
+<!ENTITY sidebar.title "Ставке које Ñе могу блокирати на овој Ñтраници">
+<!ENTITY options.label "Оп&amp;ције">
+<!ENTITY context.object.label "Блокирај објекат">
+<!ENTITY context.removeWhitelist.label "Поново укључи на овој Ñтраници">
+<!ENTITY filters.tooltip "Ðајактивнији филтери:">
+<!ENTITY closesidebar.label "За&amp;твори Ñтавке које Ñе могу блокирати">
+<!ENTITY showintoolbar.label "Прикажи у &amp;траци Ñа алаткама">
+<!ENTITY status.tooltip "Стање:">
+<!ENTITY context.media.label "Блокирај аудио/видео">
+<!ENTITY subscription.update.label "Ðжурирај филтере">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/sendReport.dtd
new file mode 100644
index 0000000..de0adef
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Опозови">
+<!ENTITY issues.disabledgroups.description "Следећа претплата на филтер претплату, или групу филтера је иÑкључена, и можда има утицаја на Ñтраницу:">
+<!ENTITY showData.label "Прикажи податке у извештају">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus блокира превише (&amp;м)">
+<!ENTITY issues.change.description "Ваша подешавања Ñу измењена. Поново учитајте Ñтраницу да биÑте видели промене, па пошаљите извештај ако проблем и даље није решен.">
+<!ENTITY email.label "Е-мејл: (&amp;а)">
+<!ENTITY issues.openPreferences.label "Отвори подешавања филтера">
+<!ENTITY sendPage.confirmation "Ваш извештај је Ñачуван. Можете да му приÑтупите на Ñледећој адреÑи:">
+<!ENTITY copyLink.label "Копирај &amp;везу до извештаја">
+<!ENTITY issues.nofilters.description "Adblock Plus не блокира ништа на тренутној Ñтраници. Овај проблем највероватније није повезан Ñа Ñа Adblock Plus-ом.">
+<!ENTITY sendPage.knownIssue "Проблем који Ñте пријавили је вероватно већ познат. Више информација:">
+<!ENTITY typeSelector.other.description "Изаберите ову опцију ако миÑлите да Ñâм Adblock Plus узрокује проблем, а не филтери.">
+<!ENTITY issues.disabledgroups.enable.label "Омогући претплату на филтер/групу филтера">
+<!ENTITY typeWarning.override.label "&amp;Разумем и ипак желим да пошаљем извештај">
+<!ENTITY issues.disabled.enable.label "Омогући Adblock Plus">
+<!ENTITY update.fixed.description "Претплате на ваш филтер Ñу вероватно већ отклониле проблем који Ñте пријавили. Поново учитајте Ñтраницу, па покушајте поново. Ðко проблем и даље поÑтоји, поново га пријавите.">
+<!ENTITY anonymous.label "&amp;Ðнонимна пријава">
+<!ENTITY reloadButton.label "&amp;Поново учитај Ñтраницу">
+<!ENTITY recentReports.clear.label "Уклони Ñве п&amp;ријаве">
+<!ENTITY typeSelector.description "Овај прозор ће Ð’Ð°Ñ Ð²Ð¾Ð´Ð¸Ñ‚Ð¸ кроз кораке за решавање проблема у Adblock Plus-у и њихово пријављивање. За почетак, изаберите врÑту проблема на који Ñте наишли на овој Ñтраници:">
+<!ENTITY screenshot.remove.label "&amp;Уклони приватне податке">
+<!ENTITY issues.ownfilters.description "Ðеке филтере примењене на овој Ñтраници Ñу Ñтворили кориÑници. Онемогућите оне за које миÑлите да би могли бити узрок проблема.">
+<!ENTITY update.inProgress.description "Adblock Plus мора ажурирати ваше претплате на филтере ради како би проверио да ли је проблем већ отклоњен. Сачекајте...">
+<!ENTITY sendPage.retry.label "Поново пошаљи">
+<!ENTITY data.label "П&amp;одаци у извештају:">
+<!ENTITY recentReports.label "Ваши недавно поÑлати извештаји">
+<!ENTITY typeWarning.description "Ðавели Ñте да желите пријавити општи проблем Ñа Adblock Plus-ом, а не Ñа филтером. Имајте на уму да је такве проблеме најбоље пријавити на [link]форуму Adblock Plus-а[/link]. Овај ÑиÑтем за пријављивање биÑте требали да кориÑтите Ñамо као допуну раÑправи, јер нико неће видети Ваш извештај док му не даднете везу до њега. ÐутоматÑки направљену везу ћете добити одмах након Ñлања извештаја.">
+<!ENTITY issues.disabled.description "Adblock Plus је онемогућен и ништа неће блокирати.">
+<!ENTITY attachExtensions.label "Приложите ÑпиÑак омогућених &amp;додатака у извештај, у Ñлучају да њихов Ñукоб доводи до проблема.">
+<!ENTITY issues.nosubscriptions.add.label "Додај претплату на филтер">
+<!ENTITY issues.disabledfilters.enable.label "Омогућите филтер">
+<!ENTITY issues.override.label "Подешавања Ñу &amp;иÑправна. ÐаÑтави Ñа пријављивањем.">
+<!ENTITY issues.nosubscriptions.description "Изгледа да ниÑте претплаћени ни на један ÑпиÑак филтера који аутоматÑки уклањају нежељени Ñадржај Ñа Ñтраница.">
+<!ENTITY typeSelector.falsePositive.description "Изаберите ову опцију ако Ñтраници недоÑтају неки битни Ñадржаји, погрешно изгледа или не ради како треба. Пробајте да привремено онемогућите Adblock Plus, па проверите да ли је онда Ñве у реду.">
+<!ENTITY typeSelector.other.label "Други проблем (&amp;т)">
+<!ENTITY emailComment.label "Молимо Ð²Ð°Ñ Ð´Ð° унеÑете важећу и-мејл адреÑу да биÑмо могли да Ð²Ð°Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸Ñ€Ð°Ð¼Ð¾ уколико има питања у вези Ñа вашом пријавом. Такође, то ће нам допуÑтити да препознамо ваше доприноÑе и да им дамо већу важноÑÑ‚.">
+<!ENTITY issues.whitelist.remove.label "Омогући Adblock Plus на овој Ñтраници">
+<!ENTITY outdatedSubscriptions.description "Следеће претплате на филтере ноÑу ажуриране више од две Ñедмице. Ðжурирајте их пре него што пријавите проблем, јер би га то могло отклонити.">
+<!ENTITY dataCollector.description "Сачекајте неколико тренутака док Adblock Plus прибави потребне податке.">
+<!ENTITY sendButton.label "&amp;Пошаљите извештај">
+<!ENTITY comment.label "&amp;Коментар (произвољно):">
+<!ENTITY sendPage.errorMessage "Покушај Ñлања извештаја није уÑпео - грешка „?1?â€. Уверите Ñе да Ñте повезани Ñа Интернетом, па покушајте поново. Ðко проблем и даље поÑтоји, помоћ потражите на [link]форуму Adblock Plus-а[/link].">
+<!ENTITY showRecentReports.label "Прикажи недавно поÑлате пријаве">
+<!ENTITY commentPage.heading "УнеÑи коментар">
+<!ENTITY update.start.label "Ðжурирај">
+<!ENTITY issues.disabledfilters.description "Следећи филтери, иако онемогућени, можда имају утицаја на Ñтраницу:">
+<!ENTITY screenshot.description "ИÑта Ñтраница може да изгледа различито код различитих оÑоба, и помогло би нам ако приложите Ñнимак проблема који пријављујете. Можете да уклоните или замаÑкирате приватне информације, а да биÑте то учинили кликните одговарајуће дугме, и мишем изаберите жељени део Ñлике.">
+<!ENTITY screenshot.attach.label "Приложите Ñнимак Ñ&amp;транице уз извештај">
+<!ENTITY issues.whitelist.description "Adblock Plus је тренутно онемогућен на Ñтраници коју пријављујете. Омогућите га и поново учитајте Ñтраницу пре него што пошаљете молбу за иÑпитивање проблема.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus не блокира рекламу/е (&amp;в)">
+<!ENTITY typeSelector.heading "Изаберите врÑту проблема">
+<!ENTITY anonymity.warning "Ðећемо бити у могућноÑти да поново допремо до Ð²Ð°Ñ Ð¸ то ће вероватно Ñнизити приоритет пријаве.">
+<!ENTITY wizard.title "Пријављивање грешака">
+<!ENTITY issues.ownfilters.disable.label "Онемогући филтер">
+<!ENTITY commentPage.description "Доње поље за текÑÑ‚ омогућава вам да додате коментар, како биÑте нам помогли да лакше Ñхватимо проблем. Овај корак је произвољан али је пожељан, ако проблем није лако уочљив. Можете и да још једном прегледате извештај пре него што га пошаљете.">
+<!ENTITY comment.lengthWarning "Дужина вашег коментара прелази 1000 знакова. Само првих 1000 знакова ће бити поÑлато.">
+<!ENTITY typeSelector.falseNegative.description "Изаберите ову опцију ако је реклама приказана иако је Adblock Plus омогућен.">
+<!ENTITY sendPage.waitMessage "Сачекајте док Adblock Plus не пошаље Ваш извештај.">
+<!ENTITY dataCollector.heading "Добро дошли у део за пријаву грешака">
+<!ENTITY screenshot.heading "Приложи Ñнимак">
+<!ENTITY sendPage.heading "Пошаљи извештај">
+<!ENTITY issues.subscriptionCount.description "Изгледа да Ñте Ñе претплатили на превише филтера. То није препоручљиво, јер повећава вероватноћу да наÑтану проблеми. Поред тога, не можемо да прихватимо ваш извештај о грешкама јер је нејаÑно која претплата на филтер Ñадржи грешку. Молимо Ð²Ð°Ñ Ð´Ð° уклоните Ñве непотребне претплате на филтере и проверите да ли још увек има проблема.">
+<!ENTITY screenshot.mark.label "О&amp;значи проблем">
+<!ENTITY privacyPolicy.label "Политика приватноÑти">
+<!ENTITY issues.description "Adblock Plus је уочио проблем Ñа Вашим подешавањима, што може бити узрок овог проблема или отежати његово иÑпитивање.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/sidebar.dtd
new file mode 100644
index 0000000..98f3a7e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "ОÑветли границе Ñтавке">
+<!ENTITY address.label "ÐдреÑа">
+<!ENTITY context.open.label "Отвори на новом лиÑту">
+<!ENTITY type.label "Ð’Ñ€Ñта">
+<!ENTITY tooltip.filterSource.label "Извор филтера:">
+<!ENTITY noitems.label "Ðема Ñтавки за блокирање">
+<!ENTITY filter.label "Филтер">
+<!ENTITY tooltip.size.label "Величина:">
+<!ENTITY reattach.label "Поново Ñпоји">
+<!ENTITY search.label "&amp;Тражи:">
+<!ENTITY docDomain.thirdParty "(трећа Ñтрана)">
+<!ENTITY filterSource.label "Извор филтера">
+<!ENTITY tooltip.docDomain.label "Извор документа:">
+<!ENTITY context.copy.label "Умножи адреÑу Ñтавке">
+<!ENTITY tooltip.type.label "Ð’Ñ€Ñта:">
+<!ENTITY context.disablefilter.label "Онемогући филтер ?1?">
+<!ENTITY context.copyFilter.label "Умножи филтер">
+<!ENTITY context.block.label "Блокирај ову Ñтавку">
+<!ENTITY context.enablefilter.label "Омогући филтер ?1?">
+<!ENTITY detach.label "Одвоји">
+<!ENTITY whitelisted.label "Бела лиÑта">
+<!ENTITY context.disablefilteronsite.label "Онемогући овај филтер на ?1?">
+<!ENTITY detached.title "Adblock Plus: Ñтавке које Ñе могу блокирати (одвојено)">
+<!ENTITY docDomain.firstParty "(прва Ñтрана)">
+<!ENTITY tooltip.type.whitelisted "(на белој лиÑти)">
+<!ENTITY tooltip.filter.label "Коришћени филтер:">
+<!ENTITY tooltip.filter.disabled "(онемогућено)">
+<!ENTITY context.editfilter.label "Уреди коришћени филтер">
+<!ENTITY tooltip.type.blocked "(блокирано)">
+<!ENTITY size.label "Величина">
+<!ENTITY context.whitelist.label "Додај изузетак за Ñтавку">
+<!ENTITY context.selectAll.label "Изабери Ñве">
+<!ENTITY state.label "СтатуÑ">
+<!ENTITY docDomain.label "Извор документа">
+<!ENTITY tooltip.address.label "ÐдреÑа:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/subscriptionSelection.dtd
new file mode 100644
index 0000000..dd6291f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Д&amp;одај и претплату на филтер „?1?â€">
+<!ENTITY list.download.failed "Adblock Plus није уÑпео да набави нови ÑпиÑак претплата.">
+<!ENTITY list.download.retry "Покушај поново">
+<!ENTITY title.label "&amp;Ðазив претплате:">
+<!ENTITY list.download.website "Отвори веб Ñтраницу">
+<!ENTITY supplementMessage "Ова претплата на филтер је предвиђена за коришћење Ñа филтером „?1?†који још увек не кориÑтите.">
+<!ENTITY viewList.label "Погледај филтере">
+<!ENTITY visitHomepage.label "ПоÑети матичну Ñтраницу">
+<!ENTITY addSubscription.label "Додај претплату">
+<!ENTITY dialog.title "Претплата на филтере Adblock Plus-а">
+<!ENTITY location.label "&amp;Локација ÑпиÑка Ñа филтерима:">
+<!ENTITY fromWeb.description "Потврдите да желите додати претплату на овај филтер (можете променити назив или локацију претплате пре додавања).">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/composer.dtd
new file mode 100644
index 0000000..b16c505
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "I slutet av adressen">
+<!ENTITY domainRestriction.label "Begränsa till domän:">
+<!ENTITY collapse.default.no.label "Standard (nej)">
+<!ENTITY firstParty.label "Endast första part">
+<!ENTITY preferences.label "Visa existerande filter…">
+<!ENTITY pattern.label "Sök efter mönster">
+<!ENTITY thirdParty.label "Endast tredje part">
+<!ENTITY filter.label "Nytt filter:">
+<!ENTITY collapse.label "Dölj blockerade:">
+<!ENTITY match.warning "Mönstret du har angivit matchar inte längre adressen som skall blockeras/undantas och kommer därför inte att påverka den.">
+<!ENTITY anchor.start.label "I början av adressen">
+<!ENTITY matchCase.label "S&amp;kiftlägeskänslig">
+<!ENTITY custom.pattern.label "Eget:">
+<!ENTITY unselectAllTypes.label "Välj ingen">
+<!ENTITY type.whitelist.label "Regel för &amp;undantag">
+<!ENTITY regexp.warning "Mönstret du angivit hanteras som ett reguljärt uttryck. Många reguljära uttryck kan göra din surfning långsam. Om du inte avsåg att använda reguljära uttryck, lägg till en asterisk (*) i slutet av mönstret.">
+<!ENTITY dialog.title "Lägg till filterregel för Adblock Plus">
+<!ENTITY basic.label "Standard">
+<!ENTITY type.filter.label "Blockerande filter">
+<!ENTITY types.label "Verkställ för:">
+<!ENTITY shortpattern.warning "Detta mönster är för kort för optimal prestanda och för många sådana mönster kan göra din surfning långsam. Det rekommenderas att använda längre strängar för detta filter.">
+<!ENTITY collapse.yes.label "Ja">
+<!ENTITY anchors.label "Acceptera endast mönster:">
+<!ENTITY collapse.default.yes.label "Standard (ja)">
+<!ENTITY domainRestriction.help "Ange en eller flera domäner avgränsade med lodrätt streck (|). Filtret kommer endast att tillämpas på dessa valda domäner(na). Tilde-tecknet (~) framför en domän anger att filtret inte kommer att användas för den domänen.">
+<!ENTITY accept.label "Lägg till filter">
+<!ENTITY options.label "Inställningar">
+<!ENTITY disabled.warning "Adblock Plus är inaktiverat. Du kan lägga till filter, men de kan inte användas förrän du [link]aktiverar Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "I början av domännamnet">
+<!ENTITY collapse.no.label "Nej">
+<!ENTITY selectAllTypes.label "Markera alla">
+<!ENTITY advanced.label "Avancerat">
+<!ENTITY pattern.explanation "Mönster är en del av en adress, symbolen * är jokertecken. Filtret används endast på adresser som matchar mönstret.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/filters.dtd
new file mode 100644
index 0000000..822ef32
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Alla dina egna filter kommer att ersättas av innehållet i den valda filen. Vill du fortsätta?">
+<!ENTITY slow.column "&amp;LÃ¥ngsamma filter">
+<!ENTITY enabled.column "P&amp;Ã¥">
+<!ENTITY subscription.lastDownload.checksumMismatch "Fel kontrollsumma">
+<!ENTITY noFiltersInGroup.text "Den markerade gruppen är tom">
+<!ENTITY subscription.actions.label "Åtgärder">
+<!ENTITY filter.selectAll.label "Markera alla">
+<!ENTITY backupButton.label "Säkerhetskopiera och &amp;Återställ">
+<!ENTITY restore.minVersion.warning "Varning: Filen har skapats med en nyare version av Adblock Plus. Du bör uppdatera till den senaste Adblock Plus-versionen innan du återställer från denna fil.">
+<!ENTITY restore.error "Filens data kunde inte bearbetas. Kanske är det här inte en Adblock Plus-säkerhetskopiefil?">
+<!ENTITY sort.ascending.label "Sortera A &gt; Ö">
+<!ENTITY sort.label "Sor&amp;tering">
+<!ENTITY subscription.source.label "Filterlista">
+<!ENTITY hitcount.column "Tr&amp;äffar">
+<!ENTITY noFilters.text "Du har inga egna filter än.">
+<!ENTITY backup.custom.title "Endast egna filter">
+<!ENTITY subscription.external.label "Uppdateras av ett annat tillägg">
+<!ENTITY subscription.delete.label "Ta bort">
+<!ENTITY noGroupSelected.text "Du måste markera en filtergrupp innan dess filter kan visas.">
+<!ENTITY filter.cut.label "Klipp ut">
+<!ENTITY restore.default.label "Återställ säkerhetskopia från ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Hämtar…">
+<!ENTITY subscriptions.tab.label "Filterprenumerationer">
+<!ENTITY sort.descending.label "Sortera &amp;Ö &gt; A">
+<!ENTITY filters.remove.warning "Vill du verkligen ta bort alla markerade filter?">
+<!ENTITY filter.delete.label "Ta bort">
+<!ENTITY addSubscriptionAdd.label "Lägg till">
+<!ENTITY viewMenu.label "Visa">
+<!ENTITY subscription.lastDownload.unknown "Okänt">
+<!ENTITY addSubscriptionCancel.label "Avbryt">
+<!ENTITY subscription.enabled.label "Aktiverat">
+<!ENTITY noSubscriptions.text "Du har inte lagt till några filterprenumerationer än. Adblock Plus kommer inte blockera någonting utan filter. Använd &quot;Lägg till filterprenumeration&quot; för att lägga till några.">
+<!ENTITY subscription.update.label "Uppdatera filter">
+<!ENTITY dialog.title "Filterinställningar för Adblock Plus">
+<!ENTITY addFilter.label "Lägg till &amp;filter">
+<!ENTITY subscription.minVersion.warning "Denna filterprenumeration kräver en nyare version av Adblock Plus, du bör uppdatera till den senaste Adblock Plus-versionen.">
+<!ENTITY subscription.lastDownload.invalidURL "Ogiltig adress">
+<!ENTITY backup.error "Det uppstod ett fel vid skrivning av filter till filen. Säkerställ att filen inte är skrivskyddad eller används av ett annat program.">
+<!ENTITY filter.moveUp.label "Flytta uppåt">
+<!ENTITY addGroup.label "Lägg till filtergrupp">
+<!ENTITY filter.edit.label "Redigera">
+<!ENTITY subscription.showHideFilters.label "Visa/dölj filter">
+<!ENTITY acceptableAds2.label "Tillåt viss icke-störande reklam">
+<!ENTITY addSubscriptionOther.label "Lägg till en ny prenumeration">
+<!ENTITY close.label "Stäng">
+<!ENTITY sort.none.label "&amp;Osorterad">
+<!ENTITY filter.actions.label "Filteråtgärder">
+<!ENTITY filter.copy.label "Kopiera">
+<!ENTITY filter.moveDown.label "Flytta nedåt">
+<!ENTITY filter.resetHitCounts.label "Återställ träffstatistik">
+<!ENTITY readMore.label "Läs mer">
+<!ENTITY subscription.moveUp.label "Flytta uppåt">
+<!ENTITY addSubscription.label "Lägg till filter&amp;prenumeration">
+<!ENTITY subscription.homepage.label "Webbplats">
+<!ENTITY backup.complete.title "Alla filter och prenumerationer">
+<!ENTITY restore.own.label "Återställ egen säkerhetskopia">
+<!ENTITY restore.complete.warning "Alla dina filterinställningar kommer att ersättas av innehållet i den valda filen. Vill du fortsätta?">
+<!ENTITY filters.tab.label "Egna filter">
+<!ENTITY backup.label "Skapa ny säkerhetskopia">
+<!ENTITY find.label "Sö&amp;k">
+<!ENTITY subscription.moveDown.label "Flytta nedåt">
+<!ENTITY subscription.lastDownload.connectionError "Fel vid hämtning">
+<!ENTITY subscription.lastDownload.success "Klart">
+<!ENTITY subscription.lastDownload.invalidData "Fel vid validering av filter">
+<!ENTITY filter.paste.label "Klistra in">
+<!ENTITY subscription.disabledFilters.enable "Aktivera inaktiverade filter">
+<!ENTITY lasthit.column "Senaste t&amp;räff">
+<!ENTITY subscription.editTitle.label "Redigera rubrik">
+<!ENTITY subscription.disabledFilters.warning "Vissa filter i denna prenumeration är inaktiverade.">
+<!ENTITY filter.column "Filterregler">
+<!ENTITY subscription.lastDownload.label "Senast hämtat:">
+<!ENTITY viewList.label "Visa lista">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/firstRun.properties
new file mode 100644
index 0000000..5381477
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Surfa privat genom att inaktivera spårning - dölj dina spår från reklamföretag som vill spåra dina rörelser.
+firstRun_toggle_off=AV
+firstRun_feature_tracking=Inaktivera Spårning
+firstRun_feature_malware=Malwareblockering
+firstRun_title=Adblock Plus har installerats
+firstRun_acceptableAdsExplanation=Vi vill uppmuntra webbplatser att använda enkel, diskret reklam. Det är därför vi har fastställt <a>strikta riktlinjer</a> för att identifiera acceptabla annonser, som visas under standardinställningar. Om du fortfarande vill blockera alla annonser kan du <a>inaktivera</a> detta inom ett par sekunder.
+firstRun_toggle_on=PÃ…
+firstRun_contributor_credits=Tack till
+firstRun_dataCorruptionWarning=Fortsätter denna sida att visas? <a>Klicka här!</a>
+firstRun_acceptableAdsHeadline=Irriterande annonser blockeras nu
+firstRun_share=Berätta för dina vänner
+firstRun_share_headline=<a>Hjälp oss</a> att göra webben till en bättre plats
+firstRun_features=Adblock Plus kan göra mer än att blockera reklam
+firstRun_feature_malware_description=Göra din surfning säkrare genom att blockera kända skadliga domäner.
+firstRun_feature_social_description=Förbättrar automatiskt din webbupplevelse genom borttagning av sociala medier knappar, såsom Facebook Gilla, som visas på webbsidor och spåra ditt beteende.
+firstRun_donate=donera
+firstRun_donate_label=Stöd vårt projekt
+firstRun_feature_social=Ta bort knappar för Sociala Medier
+firstRun_legacySafariWarning=Du använder en äldre version av Safari som inte stödjs av Adblock Plus. Adblock Plus kanske inte fungerar korrekt eller försämrar användarupplevelsen på vissa hemsidor. Vi rekommenderar starkt att antingen uppdatera till Safari 6.1.1 eller högre (tillgänglig på OS X 10.8 Mountain Lion), Safari 7.0.1 eller högre (tillgänglig på OS X 10.9 Mavericks), eller att använda den senaste versionen av Mozilla Firefox, Google Chrome eller Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/global.properties
new file mode 100644
index 0000000..0bf2eab
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Det finns inget att blockera på denna sida
+action3_tooltip=Klicka för att slå på/av Adblock Plus.
+notification_antiadblock_title=Göm riktade budskap?
+type_label_script=skript
+filter_elemhide_nocriteria=Inga villkor för att gömma element har uppfyllts
+blockingGroup_title=Reklamblockeringsregler
+whitelisted_tooltip=Adblock Plus är på, men inaktiverat för denna sida.
+type_label_stylesheet=formatmall
+blocked_count_tooltip=?1? av ?2?
+type_label_font=teckensnitt
+type_label_popup=popupfönster
+filter_regexp_tooltip=Detta filter är ett reguljärt uttryck eller för kort för optimal funktion. För många av dessa filter kan göra din surfning långsam.
+action0_tooltip=Klicka för meny, mittenklicka för att slå på/av Adblock Plus.
+whitelisted_page=Adblock Plus är inaktiverat på denna sida
+remove_group_warning=Vill du verkligen radera denna grupp?
+action1_tooltip=Klicka för att öppna/stänga listan med blockerbara objekt, mittenklicka för att slå på/av Adblock Plus.
+type_label_xmlhttprequest=XML-förfrågan
+active_tooltip=Adblock Plus är aktiverat, ?1? filterprenumeration(er) och ?2? egna filter används.
+type_label_document=dokument
+type_label_object_subrequest=objektunderförfrågan
+whitelistGroup_title=Undantagsregler
+disabled_tooltip=Adblock Plus är av.
+filter_elemhide_duplicate_id=Endast ett ID får anges för elementet som skall döljas
+type_label_object=objekt
+action2_tooltip=Klicka för att öppna inställningarna, mittenklicka för att slå på/av Adblock Plus.
+type_label_subdocument=ram
+clearStats_warning=Detta kommer att återställa all filterträffstatistik och inaktivera räkning av filterträffar. Vill du fortsätta?
+notification_antiadblock_message=Denna webbplats har varit känt för att visa riktade budskap till Adblock Plus användare. Vill du Adblock Plus att dölja riktade budskap?
+blocked_count_addendum=(undantagna: ?1?, dolda: ?2?)
+subscription_invalid_location=Platsen du angivit är antingen ogiltig eller så har du angivit ett felaktigt filnamn.
+type_label_image=bild
+remove_subscription_warning=Vill du verkligen ta bort denna prenumeration?
+type_label_other=annan
+mobile_menu_enable=ABP: Aktivera
+type_label_media=ljud/video
+mobile_menu_disable_site=ABP: Inaktivera för ?1?
+elemhideGroup_title=Elementdöljningsregler
+mobile_menu_enable_site=ABP: Aktivera för ?1?
+type_label_elemhide=dold
+newGroup_title=Ny filtergrupp
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/overlay.dtd
new file mode 100644
index 0000000..9e5694a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "Jag">
+<!ENTITY notification.button.no "Nej">
+<!ENTITY sync.label "Syn&amp;kronisera Adblock Plus inställningar">
+<!ENTITY whitelist.site.label "Använd inte på ?1?">
+<!ENTITY filters.label "Filterinställningar">
+<!ENTITY disable.label "Inaktivera för alla domäner">
+<!ENTITY objecttab.title "Blockera">
+<!ENTITY objecttab.tooltip "Klicka här för att blockera detta objekt med Adblock Plus">
+<!ENTITY menuitem.label "Inställning&amp;ar för Adblock Plus">
+<!ENTITY objecttabs.label "&amp;Visa flik vid Flash- och Java-reklam">
+<!ENTITY sendReport.label "Rapportera problem på denna sida">
+<!ENTITY whitelist.page.label "Använd inte på denna sida">
+<!ENTITY context.image.label "Adblock Plus: Blockera bild">
+<!ENTITY counthits.label "Räkna an&amp;talet filterträffar">
+<!ENTITY opensidebar.label "Visa lista över blockerbara objekt">
+<!ENTITY notification.button.close "Sluta">
+<!ENTITY contribute.label "Bidra till Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Blockera ram">
+<!ENTITY blocked.tooltip "Blockerade objekt på denna sida:">
+<!ENTITY hideplaceholders.label "Dölj platshållare för blockerade element">
+<!ENTITY showinstatusbar.label "Visa i statusfältet">
+<!ENTITY sidebar.title "Blockerbara objekt på denna sida">
+<!ENTITY options.label "Alter&amp;nativ">
+<!ENTITY context.object.label "Adblock Plus: Blockera objekt">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Återaktivera på denna sida">
+<!ENTITY filters.tooltip "Mest aktiva filter:">
+<!ENTITY closesidebar.label "Stäng listan över blockerbara objekt">
+<!ENTITY showintoolbar.label "Visa i verktygs&amp;fältet">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Blockera ljud/video">
+<!ENTITY subscription.update.label "Uppdatera filter">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/sendReport.dtd
new file mode 100644
index 0000000..36e35d5
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Ã…ngra">
+<!ENTITY issues.disabledgroups.description "Följande filterprenumerationer/filtergrupper är inaktiverade, men kan trots det påverka denna sida:">
+<!ENTITY showData.label "Visa rapportdata">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blockerar alltför &amp;mycket">
+<!ENTITY issues.change.description "Your configuration has been changed. Var vänlig uppdatera sidan för att testa ändringarna och skicka in en rapport om problemet inte har blivit löst trots förändringarna.">
+<!ENTITY email.label "&amp;E-Post:">
+<!ENTITY issues.openPreferences.label "Öppna filterinställningarna">
+<!ENTITY sendPage.confirmation "Din rapport har sparats. Du kan nå den på följande adress:">
+<!ENTITY copyLink.label "&amp;Kopiera rapportlänk">
+<!ENTITY issues.nofilters.description "Adblock Plus blockerar ingenting på den aktuella sidan. Problemet du har observerat har sannolikt ingenting att göra med Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Problemet du rapporterade är antagligen redan känt. Mer information:">
+<!ENTITY typeSelector.other.description "Välj detta alternativ om du misstänker ett problem med själva tillägget Adblock Plus, snarare än med dess filter.">
+<!ENTITY issues.disabledgroups.enable.label "Aktivera filterprenumeration/filtergrupp">
+<!ENTITY typeWarning.override.label "&amp;Jag förstår och vill skicka in rapporten i alla fall">
+<!ENTITY issues.disabled.enable.label "Aktivera Adblock Plus">
+<!ENTITY update.fixed.description "Uppdateringarna till dina filterprenumerationer löste troligtvis problemet du rapporterade. Var vänlig och uppdatera den berörda sidan och försök igen, tryck Skicka på nytt om ditt problem kvarstår.">
+<!ENTITY anonymous.label "Skick&amp;a in anonymt">
+<!ENTITY reloadButton.label "&amp;Uppdatera sidan">
+<!ENTITY recentReports.clear.label "&amp;Ta bort alla rapporter">
+<!ENTITY typeSelector.description "Denna dialog kommer att guida dig igenom alla steg som krävs för att skicka in en problemrapport för Adblock Plus. Först och främst måste du välja den typ av problem som du upplever på denna sida:">
+<!ENTITY screenshot.remove.label "Ta b&amp;ort känslig data">
+<!ENTITY issues.ownfilters.description "Några av de filter som tillämpas på denna sida är användardefinierade. Var vänlig inaktivera de filter som kan ha orsakat problemet:">
+<!ENTITY update.inProgress.description "Adblock Plus behöver uppdatera dina filterprenumerationer för att kontrollera att ditt problem inte redan är löst.">
+<!ENTITY sendPage.retry.label "Skicka igen">
+<!ENTITY data.label "Ra&amp;pportdata:">
+<!ENTITY recentReports.label "Dina senaste inskickade rapporter">
+<!ENTITY typeWarning.description "Du har angivit att du vill rapportera ett allmänt problem med Adblock Plus snarare än ett problem med filtren. Var vänlig observera att sådana problem helst skall rapporteras i [link]Adblock Plus webbforum[/link]. Du bör endast använda problemrapportören för att göra ett tillägg till en befintlig diskussion, eftersom ingen kommer att märka din rapport om du inte ger dem en länk till den. Den automatiskt genererade länken kommer att bli tillgänglig efter att rapporten har skickats in.">
+<!ENTITY issues.disabled.description "Adblock Plus är inaktiverat, det kommer inte att blockera någonting i sitt nuvarande tillstånd.">
+<!ENTITY attachExtensions.label "Bifoga en lista över aktiverade till&amp;ägg till rapporten ifall en tilläggskonflikt är orsaken till problemet">
+<!ENTITY issues.nosubscriptions.add.label "Lägg till filterprenumeration">
+<!ENTITY issues.disabledfilters.enable.label "Aktivera filter">
+<!ENTITY issues.override.label "&amp;Konfigurationen är korrekt, fortsätt med rapporten">
+<!ENTITY issues.nosubscriptions.description "Du verkar inte prenumerara på något av de fördefinierade filterlistor som automatiskt tar bort icke önskvärt innehåll från webbplatser.">
+<!ENTITY typeSelector.falsePositive.description "Välj detta alternativ om sidan saknar viktigt innehåll, visas på ett felaktigt sätt eller inte fungerar som den skall. Du kan ta reda på huruvida Adblock Plus är orsaken till problemet genom att tillfälligtvis inaktivera det.">
+<!ENTITY typeSelector.other.label "&amp;Annat problem">
+<!ENTITY emailComment.label "Vi uppmanar dig att ange en giltig e-postadress så att vi kan kontakta dig om det finns frågor om er rapport. Det tillåter oss att erkänna era bidrag och prioritera dem högre.">
+<!ENTITY issues.whitelist.remove.label "Återaktivera Adblock Plus för denna sida">
+<!ENTITY outdatedSubscriptions.description "De följande filterprenumerationerna har inte uppdaterats på åtminstone två veckor. Var vänlig och uppdatera dessa filterprenumerationer innan en rapport skickas, problemet kan redan vara löst.">
+<!ENTITY dataCollector.description "Var vänlig vänta några ögonblick medan Adblock Plus samlar in nödvändig data.">
+<!ENTITY sendButton.label "Ski&amp;cka rapport">
+<!ENTITY comment.label "&amp;Kommentar (valfritt):">
+<!ENTITY sendPage.errorMessage "Det gick inte att skicka rapporten. Felkod: &quot;?1?&quot;. Var vänlig säkerställ att du är ansluten till Internet och försök sedan igen. Om problemet kvarstår, vänligen begär hjälp i [link]Adblock Plus webbforum[/link].">
+<!ENTITY showRecentReports.label "Visa senaste inskickade rapporter">
+<!ENTITY commentPage.heading "Ange kommentar">
+<!ENTITY update.start.label "Starta uppdatering nu">
+<!ENTITY issues.disabledfilters.description "Följande filter är inaktiverade, men kan trots det påverka denna sida:">
+<!ENTITY screenshot.description "Samma sida kan uppfattas olika av olika personer. Att bifoga en skärmdump till din rapport kan hjälpa oss att förstå problemet. Du kan ta bort delar som innehåller känslig information så väl som märka ut områden där problemet är tydligt. För att göra det, klicka på motsvarande knapp och markera en sektion av bilden med din mus.">
+<!ENTITY screenshot.attach.label "&amp;Bifoga en bild av sidan till rapporten">
+<!ENTITY issues.whitelist.description "Adblock Plus är för närvarande inaktiverat för sidan som du rapporterar. Var vänlig återaktivera det och uppdatera sidan innan rapporten skickas in, för att underlätta utredningen av detta problem.">
+<!ENTITY typeSelector.falseNegative.label "Ad&amp;block Plus blockerar inte en annons">
+<!ENTITY typeSelector.heading "Välj problemtyp">
+<!ENTITY anonymity.warning "Vi kommer inte att kunna kontakta er och er rapport kan få en lägre prioritering.">
+<!ENTITY wizard.title "Rapportera problem">
+<!ENTITY issues.ownfilters.disable.label "Inaktivera filter">
+<!ENTITY commentPage.description "Textfältet nedan låter dig ange en kommentar för att hjälpa oss förstå problemet. Detta steg är valfritt, men rekommenderas om problemet inte är tydligt. Du kan även granska rapportdatan innan den skickas.">
+<!ENTITY comment.lengthWarning "Längden på din kommentar överskrider 1 000 tecken. Endast de första 1 000 tecknen kommer att skickas.">
+<!ENTITY typeSelector.falseNegative.description "Välj detta alternativ om en annons visas trots att Adblock Plus är aktiverat.">
+<!ENTITY sendPage.waitMessage "Var vänlig vänta medan Adblock Plus skickar ing din rapport.">
+<!ENTITY dataCollector.heading "Välkommen till problemrapportören">
+<!ENTITY screenshot.heading "Bifoga skärmdump">
+<!ENTITY sendPage.heading "Skicka rapport">
+<!ENTITY issues.subscriptionCount.description "Det verkar som att du prenumererar på alldeles för många filterprenumerationer. Den konfigurationen rekommenderas inte eftersom sannolikheten att drabbas av problem ökar. Vi kan heller inte acceptera din problemrapport eftersom det inte står klart vilken filterprenumerationsskapare som måste vidta åtgärder. Var vänlig ta bort alla utom de absolut nödvändiga filterprenumerationerna och testa om problemet kvarstår.">
+<!ENTITY screenshot.mark.label "&amp;Märk ut problemet">
+<!ENTITY privacyPolicy.label "Sekretesspolicy">
+<!ENTITY issues.description "Adblock Plus har upptäckt problem med din konfiguration som kan vara orsaken till detta problem eller som kommer att försvåra utredningen av rapporten.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/sidebar.dtd
new file mode 100644
index 0000000..e159fbe
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Markera objektets ram">
+<!ENTITY address.label "Adress">
+<!ENTITY context.open.label "Öppna i ny flik">
+<!ENTITY type.label "Typ">
+<!ENTITY tooltip.filterSource.label "Filterkälla:">
+<!ENTITY noitems.label "Inget att blockera">
+<!ENTITY filter.label "Filtrera">
+<!ENTITY tooltip.size.label "Storlek:">
+<!ENTITY reattach.label "Koppla ihop">
+<!ENTITY search.label "S&amp;ök:">
+<!ENTITY docDomain.thirdParty "(tredje part)">
+<!ENTITY filterSource.label "Filterkälla">
+<!ENTITY tooltip.docDomain.label "Dokumentkälla:">
+<!ENTITY context.copy.label "Kopiera objektets adress">
+<!ENTITY tooltip.type.label "Typ:">
+<!ENTITY context.disablefilter.label "Inaktivera filtret ?1?">
+<!ENTITY context.copyFilter.label "Kopiera filter">
+<!ENTITY context.block.label "Blockera detta objekt">
+<!ENTITY context.enablefilter.label "Ã…teraktivera filtret ?1?">
+<!ENTITY detach.label "Koppla från">
+<!ENTITY whitelisted.label "Undantagen sida">
+<!ENTITY context.disablefilteronsite.label "Inaktivera detta filter på ?1?">
+<!ENTITY detached.title "Adblock Plus: Blockeringsbara objekt (frånkopplad)">
+<!ENTITY docDomain.firstParty "(första part)">
+<!ENTITY tooltip.type.whitelisted "(undantagen)">
+<!ENTITY tooltip.filter.label "Filter som används:">
+<!ENTITY tooltip.filter.disabled "(inaktiverat)">
+<!ENTITY context.editfilter.label "Blockeringsfilter är på">
+<!ENTITY tooltip.type.blocked "(blockerad)">
+<!ENTITY size.label "Storlek">
+<!ENTITY context.whitelist.label "Lägg till undantag för objekt">
+<!ENTITY context.selectAll.label "Markera alla">
+<!ENTITY state.label "Tillstånd">
+<!ENTITY docDomain.label "Dokumentkälla">
+<!ENTITY tooltip.address.label "Adress:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/subscriptionSelection.dtd
new file mode 100644
index 0000000..d096848
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "L&amp;ägg även till filterprenumerationen &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plus kunde inte hämta listan med filterprenumerationer.">
+<!ENTITY list.download.retry "Försök igen">
+<!ENTITY title.label "&amp;Rubrik för prenumeration:">
+<!ENTITY list.download.website "Visa webbsidan">
+<!ENTITY supplementMessage "Denna filterprenumeration bör användas med filterprenumerationen &quot;?1?&quot;, som för närvarande inte används.">
+<!ENTITY viewList.label "Visa filter">
+<!ENTITY visitHomepage.label "Besök webbsidan">
+<!ENTITY addSubscription.label "Lägg till filterprenumeration">
+<!ENTITY dialog.title "Lägg till filterprenumeration för Adblock Plus">
+<!ENTITY location.label "Plats &amp;för filter:">
+<!ENTITY fromWeb.description "Var vänlig bekräfta att du vill lägga till denna filterprenumeration. Du kan ändra rubrik eller plats innan du lägger till den.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/composer.dtd
new file mode 100644
index 0000000..8116b1f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "&amp;ที่ท้ายๆของที่อยู่">
+<!ENTITY domainRestriction.label "จำà¸à¸±&amp;ดโดเมน:">
+<!ENTITY collapse.default.no.label "ใช้ค่าเริ่มต้น(ไม่ใช่)">
+<!ENTITY firstParty.label "First-party เท่านั้น">
+<!ENTITY preferences.label "à¹à¸ªà¸”งตัวà¸à¸£à¸­à¸‡à¸—ี่มี...">
+<!ENTITY pattern.label "ดูรูปà¹à¸šà¸š">
+<!ENTITY thirdParty.label "Third-party เท่านั้น">
+<!ENTITY filter.label "ตัวà¸à¸£à¸­à¸‡à¹ƒà¸«à¸¡à¹ˆ:">
+<!ENTITY collapse.label "à¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¸—ี่ล้&amp;มเหลว:">
+<!ENTITY match.warning "à¹à¸šà¸šà¸£à¸¹à¸›à¸—ี่คุณเพิ่มเข้ามาไม่สัมพันธ์à¸à¸±à¸šà¸—ี่อยู่ที่จะบล็อà¸à¸«à¸£à¸·à¸­à¹„ม่บล็อภมันจะไม่มีผลใด ๆ">
+<!ENTITY anchor.start.label "ที่ห&amp;น้าๆของที่อยู่">
+<!ENTITY matchCase.label "&amp;จับคู่">
+<!ENTITY custom.pattern.label "&amp;ปรับเอง:">
+<!ENTITY unselectAllTypes.label "ไม่เลือà¸">
+<!ENTITY type.whitelist.label "ข้อยà¸à¹€à¸§à¹‰à¸™">
+<!ENTITY regexp.warning "รูปà¹à¸šà¸šà¸—ี่คุณป้อนเข้าจะถูà¸à¹à¸›à¸¥à¹€à¸›à¹‡à¸™à¸à¸²à¸£à¹à¸ªà¸”งออà¸à¸—ั่วไป à¸à¸²à¸£à¹à¸ªà¸”งออà¸à¸—ั่วไปมาà¸à¹†à¸ˆà¸°à¸—ำให้à¸à¸²à¸£à¹€à¸‚้าเว็บช้าลง ถ้าคุณไม่ตั้งใจจะใช้à¸à¸²à¸£à¹à¸ªà¸”งออà¸à¸—ั่วไปให้ใส่สัà¸à¸¥à¸±à¸à¸©à¸“์ * ที่ท้ายรูปà¹à¸šà¸š">
+<!ENTITY dialog.title "เพิ่มà¸à¸Žà¸•ัวà¸à¸£à¸­à¸‡ Adblock Plus">
+<!ENTITY basic.label "มุมมองพื้นà¸à¸²à¸™">
+<!ENTITY type.filter.label "à¸à¸²à¸£à¸›à¸´à¸”à¸à¸±à¹‰à¸™à¸•ัวà¸à¸£à¸­à¸‡">
+<!ENTITY types.label "ใช้งานà¸à¸±à¸šà¸Šà¸™à¸´à¸”:">
+<!ENTITY shortpattern.warning "รูปà¹à¸šà¸šà¸—ี่คุณป้อนเข้าสั้นเà¸à¸´à¸™à¸à¸§à¹ˆà¸²à¸ˆà¸°à¹ƒà¸Šà¹‰à¹ƒà¸«à¹‰à¹€à¸«à¸¡à¸²à¸°à¸ªà¸¡ รูปà¹à¸šà¸šà¸¡à¸²à¸à¹†à¸ˆà¸°à¸—ำให้เข้าเว็บช้า à¹à¸™à¸°à¸™à¸³à¹ƒà¸«à¹‰à¹ƒà¸Šà¹‰à¸£à¸¹à¸›à¹à¸šà¸šà¸¢à¸²à¸§à¹†à¸ªà¸³à¸«à¸£à¸±à¸šà¸•ัวà¸à¸£à¸­à¸‡à¸™à¸µà¹‰">
+<!ENTITY collapse.yes.label "ใช่">
+<!ENTITY anchors.label "รับเฉพาะรูปà¹à¸šà¸š:">
+<!ENTITY collapse.default.yes.label "ใช้ค่าเริ่มต้น(ใช่)">
+<!ENTITY domainRestriction.help "ระบุโดเมนหนึ่งหรือหลายà¹à¸«à¹ˆà¸‡à¹ƒà¸«à¹‰à¸„ั่นด้วยสัà¸à¸¥à¸±à¸à¸©à¸“์ &quot;|&quot; ตัวà¸à¸£à¸­à¸‡à¸ˆà¸°à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸šà¸™à¹‚ดเมนเหล่านี้เท่านั้น ถ้าไม่ต้องà¸à¸²à¸£à¹ƒà¸Šà¹‰à¹‚ดเมนใดให้ใส่สัà¸à¸¥à¸±à¸à¸©à¸“์ &quot;~&quot; หน้าชื่อโดเมน">
+<!ENTITY accept.label "เพิ่มตัวà¸à¸£à¸­à¸‡">
+<!ENTITY options.label "ตัวเลือà¸">
+<!ENTITY disabled.warning "Adblock Plus ถูà¸à¸›à¸´à¸”ใช้งานอยู่ à¹à¸•่คุณยังสามารถเพิ่มตัวà¸à¸£à¸­à¸‡à¹„ด้ à¹à¸•่ว่าจะยังไม่ถูà¸à¸™à¸³à¹„ปใช้งานจนà¸à¸§à¹ˆà¸²à¸„ุณจะ[link]เปิดใช้งาน Adblock Plus[/link] à¸à¹ˆà¸­à¸™">
+<!ENTITY anchor.start.flexible.label "ส่ว&amp;นต้นของชื่อโดเมน">
+<!ENTITY collapse.no.label "ไม่ใช่">
+<!ENTITY selectAllTypes.label "เลือà¸à¸—ั้งหมด">
+<!ENTITY advanced.label "มุมมองละเอียด">
+<!ENTITY pattern.explanation "รูปà¹à¸šà¸š (pattern) สามารถเป็นส่วนใดส่วนหนึ่งของที่อยู่ สัà¸à¸¥à¸±à¸à¸©à¸“์ * เป็นอัà¸à¸‚ระใดๆ ตัวà¸à¸£à¸­à¸‡à¸ˆà¸°à¸–ูà¸à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸à¸±à¸šà¸—ี่อยู่ที่เหมาะสมà¸à¸±à¸šà¸•ัวà¸à¸£à¸­à¸‡à¹€à¸—่านั้น">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/filters.dtd
new file mode 100644
index 0000000..9e27ded
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/filters.dtd
@@ -0,0 +1,73 @@
+<!ENTITY restore.custom.warning "ตัวà¸à¸£à¸­à¸‡à¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เองของคุณทั้งหมดจะถูà¸à¹à¸—นที่ โดยเนื้อหาของไฟล์ที่เลือà¸à¹„ว้ คุณต้องดำเนินà¸à¸²à¸£à¸•่อหรือไม่">
+<!ENTITY slow.column "ทำให้ตัวà¸à¸£à¸­&amp;งช้าลง">
+<!ENTITY enabled.column "เ&amp;ปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™">
+<!ENTITY subscription.lastDownload.checksumMismatch "ล้มเหลว checksum จับผิดคู่">
+<!ENTITY noFiltersInGroup.text "à¸à¸¥à¸¸à¹ˆà¸¡à¸—ี่เลือà¸à¸§à¹ˆà¸²à¸‡à¹€à¸›à¸¥à¹ˆà¸²">
+<!ENTITY subscription.actions.label "à¸à¸²à¸£à¸à¸£à¸°à¸—ำ">
+<!ENTITY filter.selectAll.label "เลือà¸à¸—ั้งหมด">
+<!ENTITY backupButton.label "à¸à¸²à¸£à¸ªà¸³à¸£à¸­à¸‡à¸‚้อมูลà¹à¸¥&amp;ะคืนค่า">
+<!ENTITY restore.minVersion.warning "คำเตือน: ไฟล์ที่ถูà¸à¸ªà¸£à¹‰à¸²à¸‡à¸‚ึ้นด้วย Adblock Plus เป็นรุ่นใหม่à¸à¸§à¹ˆà¸² คุณควรปรับปรุง Adblock Plus ให้เป็นรุ่นล่าสุดà¸à¹ˆà¸­à¸™à¸—ี่จะà¸à¸¹à¹‰à¸„ืนข้อมูลจาà¸à¹„ฟล์นี้">
+<!ENTITY restore.error "ไม่สามารถประมวลผลà¹à¸Ÿà¹‰à¸¡à¸‚้อมูล บางทีอาจไม่ใช่à¹à¸Ÿà¹‰à¸¡à¸ªà¸³à¸£à¸­à¸‡à¸‚อง Adblock Plus">
+<!ENTITY sort.ascending.label "&amp;จัดลำดับ A &gt; Z">
+<!ENTITY sort.label "&amp;จัดลำดับ">
+<!ENTITY subscription.source.label "รายà¸à¸²à¸£à¸•ัวà¸à¸£à¸­à¸‡">
+<!ENTITY hitcount.column "&amp;นับ">
+<!ENTITY noFilters.text "คุณยังไม่มีตัวà¸à¸£à¸­à¸‡à¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เอง">
+<!ENTITY backup.custom.title "ตัวà¸à¸£à¸­à¸‡à¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เองเท่านั้น">
+<!ENTITY subscription.external.label "ปรับปรุงโดยนามสà¸à¸¸à¸¥à¸­à¸·à¹ˆà¸™">
+<!ENTITY subscription.delete.label "ลบ">
+<!ENTITY noGroupSelected.text "คุณต้องเลือà¸à¸à¸¥à¸¸à¹ˆà¸¡à¸•ัวà¸à¸£à¸­à¸‡à¸à¹ˆà¸­à¸™à¸—ี่ตัวà¸à¸£à¸­à¸‡à¸™à¸±à¹‰à¸™à¸ªà¸²à¸¡à¸²à¸£à¸–à¹à¸ªà¸”งผลได้">
+<!ENTITY filter.cut.label "ตัด">
+<!ENTITY restore.default.label "คืนค่าà¸à¸²à¸£à¸ªà¸³à¸£à¸­à¸‡à¸‚้อมูลจาภ?1?">
+<!ENTITY subscription.lastDownload.inProgress "à¸à¸³à¸¥à¸±à¸‡à¸”าวน์โหลด...">
+<!ENTITY subscriptions.tab.label "นามข้างท้ายตัวà¸à¸£à¸­à¸‡">
+<!ENTITY sort.descending.label "จ&amp;ัดลำดับ Z &gt; A">
+<!ENTITY filters.remove.warning "คุณต้องà¸à¸²à¸£à¹€à¸­à¸²à¸•ัวà¸à¸£à¸­à¸‡à¸—ี่เลือà¸à¹„ว้ทั้งหมดหรือไม่">
+<!ENTITY filter.delete.label "ลบ">
+<!ENTITY addSubscriptionAdd.label "เพิ่ม">
+<!ENTITY viewMenu.label "มุมมอง">
+<!ENTITY subscription.lastDownload.unknown "ไม่มี">
+<!ENTITY addSubscriptionCancel.label "ยà¸à¹€à¸¥à¸´à¸">
+<!ENTITY subscription.enabled.label "เปิดใช้งาน">
+<!ENTITY noSubscriptions.text "คุณยังไม่ได้เพิ่มนามข้างท้ายตัวà¸à¸£à¸­à¸‡à¹ƒà¸”ๆ Adblock Plus จะไม่บล๊อà¸à¹€à¸«à¸•ุà¸à¸²à¸£à¸“์ใดๆ โดยที่ไม่มีตัวà¸à¸£à¸­à¸‡ à¸à¸£à¸¸à¸“าใช้ &quot;เพิ่มนามข้างท้าย&quot; เพื่อ
+ เพิ่มà¸à¸²à¸£à¸”ำเนินà¸à¸²à¸£">
+<!ENTITY subscription.update.label "ปรับปรุงตัวà¸à¸£à¸­à¸‡">
+<!ENTITY dialog.title "ตั้งค่าตัวà¸à¸£à¸­à¸‡ Adblock Plus">
+<!ENTITY addFilter.label "เพิ่มตัวà¸à¸£à¸­&amp;ง">
+<!ENTITY subscription.minVersion.warning "à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸™à¸²à¸¡à¸‚้างท้ายตัวà¸à¸£à¸­à¸‡à¸™à¸µà¹‰à¸•้องมี Adblock Plus รุ่นใหม่ที่à¸à¸§à¹ˆà¸² คุณควรปรับปรุงเป็น Adblock Plus รุ่นล่าสุด">
+<!ENTITY subscription.lastDownload.invalidURL "ล้มเหลว ไม่มีที่อยู่ที่ถูà¸à¸•้อง">
+<!ENTITY backup.error "มีข้อผิดพลาดในà¸à¸²à¸£à¹€à¸‚ียนตัวà¸à¸£à¸­à¸‡à¹„ปยังไฟล์ ตรวจสอบให้à¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸² ไฟล์ที่เà¸à¸µà¹ˆà¸¢à¸§à¸‚้องนี้ไม่ได้ป้องà¸à¸±à¸™à¸à¸²à¸£à¹€à¸‚ียน หรืออยู่ในระหว่างใช้งานโดยโปรà¹à¸à¸£à¸¡à¸›à¸£à¸°à¸¢à¸¸à¸à¸•์อื่นๆ">
+<!ENTITY filter.moveUp.label "ย้ายขึ้น">
+<!ENTITY addGroup.label "เพิ่มà¸à¸¥à¸¸à¹ˆà¸¡à¸•ั&amp;วà¸à¸£à¸­à¸‡">
+<!ENTITY filter.edit.label "à¹à¸à¹‰à¹„ข">
+<!ENTITY subscription.showHideFilters.label "à¹à¸ªà¸”ง/ซ่อนตัวà¸à¸£à¸­à¸‡">
+<!ENTITY acceptableAds2.label "อนุà¸&amp;าตให้มีโฆษณาบางอย่างที่ไม่ต้องà¸à¸²à¸£à¸£à¸šà¸à¸§à¸™">
+<!ENTITY addSubscriptionOther.label "เพิ่มนามข้างท้าย">
+<!ENTITY close.label "ปิด">
+<!ENTITY sort.none.label "&amp;ไม่จัดลำดับ">
+<!ENTITY filter.actions.label "ดำเนินà¸à¸²à¸£à¸•ัวà¸à¸£à¸­à¸‡">
+<!ENTITY filter.copy.label "คัดลอà¸">
+<!ENTITY filter.moveDown.label "ย้ายลง">
+<!ENTITY filter.resetHitCounts.label "ตั้งค่าสถิติà¸à¸²à¸£à¹€à¸‚้าชมใหม่">
+<!ENTITY readMore.label "อ่านเพิ่มเติม">
+<!ENTITY subscription.moveUp.label "ย้ายขึ้น">
+<!ENTITY addSubscription.label "เพิ่&amp;มนามข้างท้ายตัวà¸à¸£à¸­à¸‡">
+<!ENTITY subscription.homepage.label "โฮมเพจ">
+<!ENTITY backup.complete.title "ตัวà¸à¸£à¸­à¸‡à¹à¸¥à¸°à¸™à¸²à¸¡à¸‚้างท้ายทั้งหมด">
+<!ENTITY restore.own.label "คืนค่าà¸à¸²à¸£à¸ªà¸³à¸£à¸­à¸‡à¸‚้อมูลของตนเอง">
+<!ENTITY restore.complete.warning "à¸à¸³à¸«à¸™à¸”ลัà¸à¸©à¸“ะà¸à¸²à¸£à¸à¸£à¸­à¸‡à¸‚องคุณทั้งหมดจะถูà¸à¹à¸—นที่ โดยเนื้อหาของไฟล์ที่เลือà¸à¹„ว้ คุณต้องดำเนินà¸à¸²à¸£à¸•่อหรือไม่">
+<!ENTITY filters.tab.label "ตัวà¸à¸£à¸­à¸‡à¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เอง">
+<!ENTITY backup.label "สร้างà¸à¸²à¸£à¸ªà¸³à¸£à¸­à¸‡à¸‚้อมูลใหม่">
+<!ENTITY find.label "ค้นห&amp;า">
+<!ENTITY subscription.moveDown.label "ย้ายลง">
+<!ENTITY subscription.lastDownload.connectionError "ล้มเหลว à¸à¸²à¸£à¸”าวน์โหลดล้มเหลว">
+<!ENTITY subscription.lastDownload.success "สำเร็จ">
+<!ENTITY subscription.lastDownload.invalidData "ล้มเหลว ไม่มีรายชื่อตัวà¸à¸£à¸­à¸‡à¸—ี่ถูà¸à¸•้อง">
+<!ENTITY filter.paste.label "วาง">
+<!ENTITY subscription.disabledFilters.enable "เปิดใช้งาน à¸à¸²à¸£à¸›à¸´à¸”ใช้งานตัวà¸à¸£à¸­à¸‡">
+<!ENTITY lasthit.column "à¸à¸”&amp;ล่าสุด">
+<!ENTITY subscription.editTitle.label "à¹à¸à¹‰à¹„ขชื่อเรื่อง">
+<!ENTITY subscription.disabledFilters.warning "บางตัวà¸à¸£à¸­à¸‡à¹ƒà¸™à¸à¸²à¸£à¸šà¸­à¸à¸£à¸±à¸šà¸ªà¸¡à¸²à¸Šà¸´à¸à¸™à¸µà¹‰à¸–ูà¸à¸›à¸´à¸”ใช้งาน">
+<!ENTITY filter.column "à¸à¸Ž&amp;ตัวà¸à¸£à¸­à¸‡">
+<!ENTITY subscription.lastDownload.label "ดาวน์โหลดล่าสุด:">
+<!ENTITY viewList.label "มุมมองรายà¸à¸²à¸£">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/firstRun.properties
new file mode 100644
index 0000000..f9d617a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_toggle_off=ไม่ทำงาน
+firstRun_feature_tracking=ปิดระบบติดตามà¸à¸²à¸£à¹ƒà¸‚้งาน
+firstRun_feature_social=ลบปุ่มสื่อสังคมออà¸
+firstRun_title=à¸à¸²à¸•ิดตั้ง Adblock Plus เสร็จสมบูรณ์
+firstRun_feature_malware=บล็อà¸à¸¡à¸±à¸¥à¹à¸§à¸£à¹Œ
+firstRun_toggle_on=ทำงาน
+firstRun_dataCorruptionWarning=ไม่ให้หน้านี้à¹à¸ªà¸”งอีà¸à¸„รั้ง <a>คลิà¸à¸—ี่นี้</a>
+firstRun_acceptableAdsHeadline=โฆษณาที่น่ารำคาà¸à¸ˆà¸°à¸–ูà¸à¸›à¸´à¸”à¸à¸±à¹‰à¸™
+firstRun_share=บอà¸à¹€à¸žà¸·à¹ˆà¸­à¸™à¸‚องคุณ
+firstRun_filterlistsReinitializedWarning=ดูเหมือนว่าปัà¸à¸«à¸²à¸ˆà¸°à¹€à¸à¸´à¸”จาà¸à¸•ัวà¸à¸£à¸­à¸‡à¸—ั้งหมดถูà¸à¸¥à¸šà¸­à¸­à¸à¹„ปà¹à¸¥à¹‰à¸§à¹„ม่สามารถคืนค่าจาà¸à¸•ัวสำรองข้อมูลได้ ดังนั้นเรามีตัวรีเซ็ตตัวà¸à¸£à¸­à¸‡à¸—ี่ได้รับà¸à¸²à¸£à¸¢à¸­à¸¡à¸£à¸±à¸š à¸à¸£à¸¸à¸“าตรวจสอบรายà¸à¸²à¸£à¸•ัวà¸à¸£à¸­à¸‡à¹‚ฆษณาของคุณืั้ <a>ตัวเลือภAdblock Plus</a>
+firstRun_feature_malware_description=ทำให้ท่องเว็บได้ปลอดภัยยิ่งขึ้น โดยà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¹€à¸§à¹‡à¸šà¸—ี่มีมัลà¹à¸§à¸£à¹Œà¸—ี่รู้จัà¸
+firstRun_features=Adblock Plus สามารถทำได้มาà¸à¸à¸à¸§à¹ˆà¸²à¸šà¸¥à¹‡à¸­à¸à¹‚ฆษณา
+firstRun_donate=บริจาค
+firstRun_donate_label=สนับสนุนโปรเจ็คของเรา
+firstRun_legacySafariWarning=คุณà¸à¸³à¸¥à¸±à¸‡à¹ƒà¸Šà¹‰à¹€à¸§à¸­à¸£à¹Œà¸Šà¸±à¹ˆà¸™à¹€à¸à¹ˆà¸²à¸šà¸™ Safari ที่ไม่ได้รับà¸à¸²à¸£à¸ªà¸™à¸±à¸šà¸ªà¸™à¸¸à¸™à¸ˆà¸²à¸ Adblock Plus จะทำให้ทำงานผิดพลาดได้ เราขอà¹à¸™à¸°à¸™à¸³à¹ƒà¸«à¹‰à¸„ุณอัพเดต Safari เป็นเวอร์ชั่น 6.1.1 หรือรุ่นที่สูงà¸à¸§à¹ˆà¸² (บน OS X 10.8 Mountain Lion) หรือ Safari 7.0.1 หรือสูงà¸à¸§à¹ˆà¸² (บน OS X 10.9 Mavericks) หรือใช้เวอร์ชั่นล่าสุดบน Mozilla Firefox, Google Chrome à¹à¸¥à¸° Opera
+firstRun_feature_tracking_description=Browse privately by disabling tracking - hiding your tracks from ad companies that would track your every move.
+firstRun_acceptableAdsExplanation=We'd like to encourage websites to use straightforward, unobtrusive advertising. That's why we've established <a>strict guidelines</a> to identify acceptable ads, which are shown under default settings. If you still want to block every ad you can <a>disable</a> this in a few seconds.
+firstRun_contributor_credits=Contributor Credits
+firstRun_share_headline=<a>Give us a hand</a> in making the web a better place
+firstRun_feature_social_description=Automatically rid your browsing experience of social media buttons, such as the Facebook Like, which appear on web pages and track your behavior.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/global.properties
new file mode 100644
index 0000000..c878f50
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=ไม่มีรายà¸à¸²à¸£à¸—ี่บล็อà¸à¹„ด้ในหน้าล่าสุด
+action3_tooltip=คลิà¸à¹€à¸žà¸·à¹ˆà¸­à¹€à¸›à¸´à¸”หรือปิดใช้งาน Adblock Plus
+type_label_script=สคริปต์
+filter_elemhide_nocriteria=ไม่มีเà¸à¸“ฑ์ที่ระบุที่จำวัตถุที่จะซ่อน
+blockingGroup_title=à¸à¸Žà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¹‚ฆษณา
+whitelisted_tooltip=Adblock Plus เปิดอยู่à¹à¸•่ไม่ใช้à¸à¸±à¸šà¸«à¸™à¹‰à¸²à¸™à¸µà¹‰
+type_label_stylesheet=รูปà¹à¸šà¸šà¹€à¸­à¸à¸ªà¸²à¸£
+blocked_count_tooltip=?1? จาภ?2?
+type_label_font=à¹à¸šà¸šà¸­à¸±à¸à¸©à¸£
+type_label_popup=หน้าต่างà¹à¸šà¸šà¸œà¸¸à¸”ขึ้น(pop-up)
+filter_regexp_tooltip=ตัวà¸à¸£à¸­à¸‡à¸™à¸µà¹‰à¸à¹‡à¹€à¸›à¹‡à¸™à¸à¸²à¸£à¹à¸ªà¸”งออà¸à¸—ั่วไปหรือสั้นเà¸à¸´à¸™à¸à¸§à¹ˆà¸²à¸ˆà¸°à¹ƒà¸Šà¹‰à¹ƒà¸«à¹‰à¹€à¸«à¸¡à¸²à¸°à¸ªà¸¡ ถ้ามีตัวà¸à¸£à¸­à¸‡à¸›à¸£à¸°à¹€à¸ à¸—นี้มาà¸à¹€à¸à¸´à¸™à¹„ปจะทำให้à¸à¸²à¸£à¹€à¸‚้าเว็บช้าได้
+action0_tooltip=คลิà¸à¹€à¸žà¸·à¹ˆà¸­à¸™à¸³à¹„ปที่รายà¸à¸²à¸£à¹€à¸¡à¸™à¸¹ คลิà¸à¹€à¸¡à¸²à¸ªà¹Œà¸à¸¥à¸²à¸‡à¹€à¸žà¸·à¹ˆà¸­à¹€à¸›à¸´à¸”หรือปิดใช้งาน
+whitelisted_page=Adblock Plus ถูà¸à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹ƒà¸™à¸«à¸™à¹‰à¸²à¸¥à¹ˆà¸²à¸ªà¸¸à¸”
+remove_group_warning=คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸²à¸•้องà¸à¸²à¸£à¸ˆà¸°à¸¥à¸šà¸à¸¥à¸¸à¹ˆà¸¡à¸™à¸µà¹‰?
+action1_tooltip=คลิà¸à¹€à¸žà¸·à¹ˆà¸­à¹€à¸›à¸´à¸”หรือปิดสิ่งของ คลิà¸à¹€à¸¡à¸²à¸ªà¹Œà¸à¸¥à¸²à¸‡à¹€à¸žà¸·à¹ˆà¸­à¹€à¸›à¸´à¸”หรือปิดใช้งาน
+type_label_xmlhttprequest=คำร้องขอ XML
+active_tooltip=Adblock Plus เปิดใช้งานอยู่ นามข้างท้ายตัวà¸à¸£à¸­à¸‡ ?1? อย่าง à¹à¸¥à¸°à¸•ัวà¸à¸£à¸­à¸‡à¸à¸³à¸«à¸™à¸”เอง ?2? ตัวเปิดใช้งานอยู่
+type_label_document=เอà¸à¸ªà¸²à¸£
+type_label_object_subrequest=subrequest วัตถุ
+whitelistGroup_title=ข้อยà¸à¹€à¸§à¹‰à¸™à¸‚องà¸à¸Ž
+disabled_tooltip=Adblock Plus ถูà¸à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™
+filter_elemhide_duplicate_id=มีเฉพาะรหัสประจำตัววัตถุเดียวเท่านั้นที่ซ่อนที่สามารถระบุได้
+type_label_object=วัตถุ
+action2_tooltip=คลิà¸à¹€à¸žà¸·à¹ˆà¸­à¹€à¸›à¸´à¸”à¸à¸²à¸£à¸›à¸£à¸±à¸šà¹à¸•่ง คลิà¸à¹€à¸¡à¸²à¸ªà¹Œà¸à¸¥à¸²à¸‡à¹€à¸žà¸·à¹ˆà¸­à¹€à¸›à¸´à¸”หรือปิดใช้งาน
+type_label_subdocument=เฟรม
+clearStats_warning=สิ่งนี้จะตั้งค่าใหม่ทั้งหมดของตัวà¸à¸£à¸­à¸‡à¸à¸²à¸£à¹€à¸‚้าชมสถิติà¹à¸¥à¸°à¸›à¸´à¸”ใช้งานà¸à¸²à¸£à¸•รวจนับปริมาณตัวà¸à¸£à¸­à¸‡ คุณต้องดำเนินà¸à¸²à¸£à¸•่อหรือไม่
+blocked_count_addendum=(à¹à¸¥à¸°à¸¢à¸±à¸‡à¸¡à¸µà¸šà¸±à¸à¸Šà¸µà¸‚าว ?1? อย่าง ซ่อนอยู่ ?2? อย่าง)
+subscription_invalid_location=ตำà¹à¸«à¸™à¹ˆà¸‡à¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸­à¸•ัวà¸à¸£à¸­à¸‡à¹„ม่ใช่ทั้งยูอาร์à¹à¸­à¸¥à¸—ี่ถูà¸à¸•้องà¹à¸¥à¸°à¸Šà¸·à¹ˆà¸­à¹„ฟล์ที่ถูà¸à¸•้อง
+type_label_image=รูปภาพ
+remove_subscription_warning=คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸­à¸§à¹ˆà¸²à¸•้องà¸à¸²à¸£à¸¥à¸šà¸™à¸²à¸¡à¸‚้างท้ายนี้
+type_label_other=อื่นๆ
+mobile_menu_enable=ABP: เปิดใช้งาน
+type_label_media=เสียง/ภาพ
+mobile_menu_disable_site=ABP: ปิดใช้งาน ?1?
+elemhideGroup_title=à¸à¸Žà¸à¸²à¸£à¸‹à¹ˆà¸­à¸™à¸­à¸‡à¸„์ประà¸à¸­à¸š
+mobile_menu_enable_site=ABP: เปิดใช้งาน ?1?
+type_label_elemhide=ซ่อน
+newGroup_title=à¸à¸¥à¸¸à¹ˆà¸¡à¸•ัวà¸à¸£à¸­à¸‡à¹ƒà¸«à¸¡à¹ˆ
+default_dialog_title=Adblock Plus
+notification_antiadblock_title=Hide targeted messages?
+notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages?
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/overlay.dtd
new file mode 100644
index 0000000..57feaca
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY sync.label "เชื่อ&amp;มข้อมูลà¸à¸²à¸£à¸•ั้งค่า Adblock Plus">
+<!ENTITY whitelist.site.label "ปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™ ?1?">
+<!ENTITY filters.label "ตั้งค่าตัวà¸à¸£&amp;อง">
+<!ENTITY disable.label "ปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸—ุà¸à¸—ี่">
+<!ENTITY objecttab.title "บล็อà¸">
+<!ENTITY objecttab.tooltip "คลิà¸à¸—ี่นี่เพื่อบล็อà¸à¸§à¸±à¸•ถุนี้ด้วย Adblock Plus">
+<!ENTITY menuitem.label "&amp;ปรับà¹à¸•่ง Adblock Plus">
+<!ENTITY objecttabs.label "à¹à¸ªà¸”งà¹à¸—็&amp;บบนà¹à¸Ÿà¸¥à¸Šà¹à¸¥à¸°à¸ˆà¸²à¸§à¸²">
+<!ENTITY sendReport.label "&amp;รายงานปัà¸à¸«à¸²à¸—ี่พบในหน้านี้">
+<!ENTITY whitelist.page.label "ปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹€à¸‰à¸žà¸²à¸°à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰">
+<!ENTITY context.image.label "Adblock รูปภาพ">
+<!ENTITY counthits.label "นับจำนวนตัว&amp;à¸à¸£à¸­à¸‡à¸®à¸´à¸•">
+<!ENTITY opensidebar.label "เปิดราย&amp;à¸à¸²à¸£à¸—ี่บล็อà¸à¹„ด้">
+<!ENTITY contribute.label "เข้ามีส่วนร่วมà¸à¸±à¸š Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock เฟรม">
+<!ENTITY blocked.tooltip "สิ่งที่บล็อà¸à¹ƒà¸™à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰:">
+<!ENTITY hideplaceholders.label "ซ่อน&amp;ตำà¹à¸«à¸™à¹ˆà¸‡à¸•ัวยึดตำà¹à¸«à¸™à¹ˆà¸‡à¸‚ององค์ประà¸à¸­à¸šà¸—ี่ถูà¸à¸šà¸¥à¹‡à¸­à¸„ไว้">
+<!ENTITY showinstatusbar.label "à¹&amp;สดงในà¹à¸–บสถานะ">
+<!ENTITY sidebar.title "รายà¸à¸²à¸£à¸—ี่บล็อà¸à¹„ด้ในหน้าล่าสุด">
+<!ENTITY options.label "ตั&amp;วเลือà¸">
+<!ENTITY context.object.label "Adblock วัตถุ">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: เปิดใช้งานอีà¸à¸„รั้งในหน้านี้">
+<!ENTITY filters.tooltip "ตัวà¸à¸£à¸­à¸‡à¸—ี่ใช้งานมาà¸à¸—ี่สุด:">
+<!ENTITY closesidebar.label "ปิดราย&amp;à¸à¸²à¸£à¸—ี่บล็อà¸à¹„ด้">
+<!ENTITY showintoolbar.label "à¹à¸ªà¸”งในà¹à¸–บเ&amp;ครื่องมือ">
+<!ENTITY status.tooltip "สถานะ:">
+<!ENTITY context.media.label "Adblock Plus: บล็อà¸à¹€à¸ªà¸µà¸¢à¸‡/วีดิทัศน์">
+<!ENTITY subscription.update.label "ปรับปรุงตัวà¸à¸£à¸­à¸‡">
+<!ENTITY notification.button.yes "&amp;Yes">
+<!ENTITY notification.button.no "&amp;No">
+<!ENTITY notification.button.close "&amp;Close">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/sendReport.dtd
new file mode 100644
index 0000000..abddb2a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/sendReport.dtd
@@ -0,0 +1,66 @@
+<!ENTITY screenshot.undo.label "เรี&amp;ยà¸à¸„ืน">
+<!ENTITY issues.disabledgroups.description "คำอธิบายตัวà¸à¸£à¸­à¸‡à¸«à¸£à¸·à¸­à¸à¸¥à¸¸à¹ˆà¸¡à¸‚องตัวà¸à¸£à¸­à¸‡à¸•่อไปนี้ปิดใช้งานà¹à¸¥à¹‰à¸§ อาจจะส่งผลà¸à¸£à¸°à¸—บต่อหน้านี้:">
+<!ENTITY showData.label "à¹à¸ªà¸”งข้อมูลรายงาน">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus &amp;มีà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¸¡à¸²à¸à¹€à¸à¸´à¸™à¹„ป">
+<!ENTITY issues.change.description "à¸à¸²à¸£à¸•ั้งค่าเปลี่ยนà¹à¸›à¸¥à¸‡à¹à¸¥à¹‰à¸§ à¸à¸£à¸¸à¸“าเรียà¸à¸«à¸™à¹‰à¸²à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™à¹ƒà¸«à¸¡à¹ˆà¹€à¸žà¸·à¹ˆà¸­à¸—ดสอบความเปลี่ยนà¹à¸›à¸¥à¸‡à¹à¸¥à¸°à¸ªà¹ˆà¸‡à¸£à¸²à¸¢à¸‡à¸²à¸™à¸–้าปัà¸à¸«à¸²à¸¢à¸±à¸‡à¹„ม่ได้รับà¸à¸²à¸£à¹à¸à¹‰à¹„ข">
+<!ENTITY issues.openPreferences.label "เปิดà¸à¸²à¸£à¸›à¸£à¸±à¸šà¹à¸•่งตัวà¸à¸£à¸­à¸‡">
+<!ENTITY sendPage.confirmation "รายงานได้รับà¸à¸²à¸£à¸šà¸±à¸™à¸—ึà¸à¹à¸¥à¹‰à¸§ คุณเข้าดูได้ตามที่อยู่ต่อไปนี้:">
+<!ENTITY copyLink.label "&amp;คัดลอà¸à¸¥à¸´à¸‡à¸à¹Œà¸£à¸²à¸¢à¸‡à¸²à¸™">
+<!ENTITY issues.nofilters.description "Adblock Plus ไม่ได้บล็อà¸à¸ªà¸´à¹ˆà¸‡à¹ƒà¸”เลยในหน้านี้ ปัà¸à¸«à¸²à¸—ี่คุณรายงานไม่น่าจะเà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸š Adblock Plus">
+<!ENTITY sendPage.knownIssue "ปัà¸à¸«à¸²à¸—ี่คุณรายงานมีวิธีà¹à¸à¹‰à¹„ขอยู่à¹à¸¥à¹‰à¸§ ข้อมูลเพิ่มเติม:">
+<!ENTITY typeSelector.other.description "เลือà¸à¸•ัวเลือà¸à¸™à¸µà¹‰à¸–้าคุณคิดว่าปัà¸à¸«à¸²à¹€à¸à¸´à¸”จาà¸à¸•ัว Adblock Plus เอง ไม่ใช่ตัวà¸à¸£à¸­à¸‡">
+<!ENTITY issues.disabledgroups.enable.label "เปิดใช้งานคำอธิบายตัวà¸à¸£à¸­à¸‡à¸«à¸£à¸·à¸­à¸à¸¥à¸¸à¹ˆà¸¡à¸‚องตัวà¸à¸£à¸­à¸‡">
+<!ENTITY typeWarning.override.label "ฉันเข้าใจà¹à¸¥à¸°à¸žà¸£à¹‰à¸­à¸¡à¸ˆà¸°&amp;ส่งรายงาน">
+<!ENTITY issues.disabled.enable.label "เปิด Adblock Plus">
+<!ENTITY update.fixed.description "ตัวà¸à¸£à¸­à¸‡à¸‚องคุณน่าจะมีà¸à¸²à¸£à¸­à¸±à¸žà¹€à¸”ทà¸à¸²à¸£à¹à¸à¹‰à¹„ขปัà¸à¸«à¸²à¸—ี่คุณได้รายงานไว้à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰ à¸à¸£à¸¸à¸“าโหลดเว็บเพจà¹à¸¥à¸°à¸¥à¸­à¸‡à¹ƒà¸«à¸¡à¹ˆà¸­à¸µà¸à¸„รั้ง คุณสามารถดูรายงานของคุณได้อีà¸à¸„รั้ง หาà¸à¸žà¸šà¸›à¸±à¸à¸«à¸²à¸”ังà¸à¸¥à¹ˆà¸²à¸§à¸­à¸¢à¸¹à¹ˆ">
+<!ENTITY reloadButton.label "&amp;เรียà¸à¸«à¸™à¹‰à¸²à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™à¹ƒà¸«à¸¡à¹ˆ">
+<!ENTITY recentReports.clear.label "&amp;ลบรายงานทั้งหมด">
+<!ENTITY typeSelector.description "หน้าต่างนี้จะนำทางไปยังขั้นตอนที่ต้องà¸à¸²à¸£à¹ƒà¸™à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸£à¸²à¸¢à¸‡à¸²à¸™à¸›à¸±à¸à¸«à¸²à¸‚อง Adblock Plus à¸à¸£à¸¸à¸“าเลือà¸à¸Šà¸™à¸´à¸”ของปัà¸à¸«à¸²à¸—ี่คุณพบในหน้านี้:">
+<!ENTITY screenshot.remove.label "&amp;ลบข้อมูลที่ไม่อยาà¸à¹ƒà¸«à¹‰à¹ƒà¸„รเห็น">
+<!ENTITY issues.ownfilters.description "ตัวà¸à¸£à¸­à¸‡à¸šà¸²à¸‡à¸•ัวที่ใช้ในหน้านี้เป็นของผู้ใช้ à¸à¸£à¸¸à¸“าปิดตัวà¸à¸£à¸­à¸‡à¸—ี่อาจà¸à¹ˆà¸­à¹ƒà¸«à¹‰à¹€à¸›à¸´à¸”ปัà¸à¸«à¸²:">
+<!ENTITY update.inProgress.description "Adblock Plus ต้องà¸à¸²à¸£à¸—ี่จะอัพเดทตัวà¸à¸£à¸­à¸‡à¸‚องคุณ เพื่อให้à¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸²à¸›à¸±à¸à¸«à¸²à¹„ด้รับà¸à¸²à¸£à¹à¸à¹‰à¹„ขà¹à¸¥à¹‰à¸§ à¸à¸£à¸¸à¸“ารอสัà¸à¸„รู่...">
+<!ENTITY sendPage.retry.label "ส่งอีà¸à¸„รั้ง">
+<!ENTITY data.label "ข้อ&amp;มูลรายงาน:">
+<!ENTITY recentReports.label "รายงานที่เพิ่งส่งของคุณ">
+<!ENTITY typeWarning.description "คุณระบุไว้ว่า คุณต้องà¸à¸²à¸£à¸£à¸²à¸¢à¸‡à¸²à¸™à¸›à¸±à¸à¸«à¸²à¸à¸±à¸š Adblock Plus มาà¸à¸à¸§à¹ˆà¸²à¸›à¸±à¸à¸«à¸²à¸à¸±à¸šà¸•ัวà¸à¸£à¸­à¸‡ ปัà¸à¸«à¸²à¸”ังà¸à¸¥à¹ˆà¸²à¸§à¸£à¸²à¸¢à¸‡à¸²à¸™à¹„ด้ดีที่สุดที่ [link]Adblock Plus forum[/link] คุณควรใช้ตัวรายงานปัà¸à¸«à¸²à¹€à¸žà¸·à¹ˆà¸­à¸ªà¸™à¸±à¸šà¸ªà¸™à¸¸à¸™à¸šà¸—สนทนาที่มีอยู่ เพราะไม่มีใครจะเห็นรายงานของคุณจนà¸à¸§à¹ˆà¸²à¸„นส่งลิงà¸à¹Œà¹ƒà¸«à¹‰ จะมีลิงà¸à¹Œà¹ƒà¸«à¹‰à¸­à¸±à¸•โนมัติหลังจาà¸à¸ªà¹ˆà¸‡à¸£à¸²à¸¢à¸‡à¸²à¸™">
+<!ENTITY issues.disabled.description "Adblock Plus ถูà¸à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™ ซึ่งจะไม่มีà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¹ƒà¸”ๆ ทั้งสิ้น">
+<!ENTITY attachExtensions.label "à¹à¸™à¸šà¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸­à¸ªà¹ˆà¸§à¸™à¹€à¸ªà¸£à¸´à¸¡à¸—ี่ใช้อยู่ไปà¸à¸±à¸šà¸£à¸²à¸¢à¸‡à¸²à¸™à¹ƒà¸™à¸à¸£&amp;ณีที่เà¸à¸´à¸”ปัà¸à¸«à¸²à¸ªà¹ˆà¸§à¸™à¹€à¸ªà¸£à¸´à¸¡à¸Šà¸™à¸à¸±à¸™">
+<!ENTITY issues.nosubscriptions.add.label "เพิ่มคำอธิบายตัวà¸à¸£à¸­à¸‡">
+<!ENTITY issues.disabledfilters.enable.label "เปิดใช้งานตัวà¸à¸£à¸­à¸‡">
+<!ENTITY issues.override.label "à¸à¸²à¸£à¸•ั้งค่าถูà¸à¸•้อง &amp;ดำเนินà¸à¸²à¸£à¸£à¸²à¸¢à¸‡à¸²à¸™à¸•่อไป">
+<!ENTITY issues.nosubscriptions.description "คุณไม่ได้เขียนคำอธิบายรายชื่อตัวà¸à¸£à¸­à¸‡à¹„ว้ ซึ่งจะลบเนื้อหาที่ไม่ต้องà¸à¸²à¸£à¸­à¸­à¸à¸ˆà¸²à¸à¹€à¸§à¹‡à¸šà¹„ซต์อัตโนมัติ">
+<!ENTITY typeSelector.falsePositive.description "เลือà¸à¸•ัวเลือà¸à¸™à¸µà¹‰ ถ้าหน้าเพจไม่มีเนื้อหาที่สำคัภà¹à¸ªà¸”งผลผิดหรือทำงานผิด คุณสามารถทดสอบว่า Adblock Plus เป็นต้นเหตุของปัà¸à¸«à¸²à¸«à¸£à¸·à¸­à¹„ม่ โดยà¸à¸²à¸£à¸—ดลองปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹„ว้ชั่วคราว">
+<!ENTITY typeSelector.other.label "ปั&amp;à¸à¸«à¸²à¸­à¸·à¹ˆà¸™">
+<!ENTITY issues.whitelist.remove.label "เปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™ Adblock Plus อีà¸à¸„รั้งในหน้านี้">
+<!ENTITY outdatedSubscriptions.description "รายà¸à¸²à¸£à¸•ัวà¸à¸£à¸­à¸‡à¸•่อไปนี้ยังไม่ได้รับà¸à¸²à¸£à¸­à¸±à¸žà¹€à¸”ทเป็นเวลาสองสัปดาห์à¹à¸¥à¹‰à¸§ à¸à¸£à¸¸à¸“าอัพเดทรายà¸à¸²à¸£à¸”ังà¸à¸¥à¹ˆà¸²à¸§à¸à¹ˆà¸­à¸™à¸—ี่จะส่งรายงานไป เพราะปัà¸à¸«à¸²à¸­à¸²à¸ˆà¹„ด้รับà¸à¸²à¸£à¹à¸à¹‰à¹„ขเรียบร้อยà¹à¸¥à¹‰à¸§à¸à¹‡à¹€à¸›à¹‡à¸™à¹„ด้">
+<!ENTITY dataCollector.description "à¸à¸£à¸¸à¸“ารอสัà¸à¸„รู่ระหว่างที่ Adblock Plus à¸à¸³à¸¥à¸±à¸‡à¸£à¸§à¸šà¸£à¸§à¸¡à¸‚้อมูล">
+<!ENTITY sendButton.label "ส่&amp;งรายงาน">
+<!ENTITY comment.label "&amp;ความคิดเห็น (ไม่ใส่à¸à¹‡à¹„ด้):">
+<!ENTITY sendPage.errorMessage "à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸£à¸²à¸¢à¸‡à¸²à¸™à¸œà¸´à¸”พลาด รหัส &quot;?1?&quot; à¸à¸£à¸¸à¸“าเชื่อมต่อà¸à¸±à¸šà¸­à¸´à¸™à¹€à¸—อร์เน็ตà¹à¸¥à¸°à¸¥à¸­à¸‡à¸­à¸µà¸à¸„รั้ง หาà¸à¸›à¸±à¸à¸«à¸²à¸¢à¸±à¸‡à¸¡à¸µà¸­à¸¢à¸¹à¹ˆà¸à¸£à¸¸à¸“าขอความช่วยเหลือที่ [link]Adblock Plus forum[/link]">
+<!ENTITY showRecentReports.label "à¹à¸ªà¸”งรายงานที่เพิ่งส่ง">
+<!ENTITY commentPage.heading "ใส่ความคิดเห็น">
+<!ENTITY update.start.label "เริ่มอัพเดทตอนนี้">
+<!ENTITY issues.disabledfilters.description "ตัวà¸à¸£à¸­à¸‡à¸•่อไปนี้ปิดใช้งานà¹à¸¥à¹‰à¸§ อาจจะส่งผลà¸à¸£à¸°à¸—บต่อหน้านี้:">
+<!ENTITY screenshot.description "หน้าเดียวà¸à¸±à¸™à¸„นต่างà¸à¸±à¸™à¸­à¸²à¸ˆà¸ˆà¸°à¹€à¸«à¹‡à¸™à¸•่างà¸à¸±à¸™à¹„ด้ à¸à¸£à¸¸à¸“าà¹à¸™à¸šà¸ à¸²à¸žà¸«à¸™à¹‰à¸²à¸ˆà¸­à¸¡à¸²à¸à¸±à¸šà¸£à¸²à¸¢à¸‡à¸²à¸™à¸”้วย คุณสามารถลบส่วนที่ไม่ต้องà¸à¸²à¸£à¹ƒà¸«à¹‰à¹ƒà¸„รเห็นà¹à¸¥à¸°à¹€à¸™à¹‰à¸™à¸ªà¹ˆà¸§à¸™à¸—ี่เป็นปัà¸à¸«à¸²à¸¡à¸²à¸”้วย คลิà¸à¸›à¸¸à¹ˆà¸¡à¸—ี่เà¸à¸µà¹ˆà¸¢à¸§à¸‚้องà¹à¸¥à¸°à¹€à¸¥à¸·à¸­à¸à¸ªà¹ˆà¸§à¸™à¸‚องรูปภาพด้วยเมาส์">
+<!ENTITY screenshot.attach.label "à¹à¸™&amp;บรูปภาพหน้าไปà¸à¸±à¸šà¸£à¸²à¸¢à¸‡à¸²à¸™">
+<!ENTITY issues.whitelist.description "Adblock Plus ไม่ได้เปิดใช้งานในหน้าเพจที่คุณรายงาน à¸à¸£à¸¸à¸“าเปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸­à¸µà¸à¸„รั้งà¹à¸¥à¸°à¹€à¸£à¸µà¸¢à¸à¸«à¸™à¹‰à¸²à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™à¹ƒà¸«à¸¡à¹ˆà¸à¹ˆà¸­à¸™à¸ªà¹ˆà¸‡à¸£à¸²à¸¢à¸‡à¸²à¸™à¹€à¸žà¸·à¹ˆà¸­à¸Šà¹ˆà¸§à¸¢à¸ªà¸·à¸šà¸ªà¸§à¸™à¸›à¸±à¸à¸«à¸²à¸™à¸µà¹‰">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus ไม่บล็อà¸à¹‚ฆ&amp;ษณา">
+<!ENTITY typeSelector.heading "เลือà¸à¸Šà¸™à¸´à¸”ของปัà¸à¸«à¸²">
+<!ENTITY wizard.title "รายงานปัà¸à¸«à¸²">
+<!ENTITY issues.ownfilters.disable.label "ปิดใช้งานตัวà¸à¸£à¸­à¸‡">
+<!ENTITY commentPage.description "ช่องว่างนี้ให้คุณใส่ความคิดเห็นเพื่อช่วยให้เราเข้าใจปัà¸à¸«à¸² ใส่หรือไม่ใส่à¸à¹‡à¹„ด้ คุณสามารถทบทวนรายงานอีà¸à¸„รั้งà¸à¹ˆà¸­à¸™à¸ªà¹ˆà¸‡à¹„ด้">
+<!ENTITY comment.lengthWarning "ความคิดเห็นยาวเà¸à¸´à¸™ 1000 อัà¸à¸‚ระ ส่งได้à¹à¸„่ 1000 อัà¸à¸‚ระà¹à¸£à¸à¹€à¸—่านั้น">
+<!ENTITY typeSelector.falseNegative.description "เลือà¸à¸•ัวเลือà¸à¸™à¸µà¹‰à¸–้ายังมีโฆษณาอยู่à¹à¸¡à¹‰à¸§à¹ˆà¸²à¹ƒà¸Šà¹‰à¸‡à¸²à¸™ Adblock Plus à¹à¸¥à¹‰à¸§">
+<!ENTITY sendPage.waitMessage "Adblock Plus à¸à¸³à¸¥à¸±à¸‡à¸ªà¹ˆà¸‡à¸£à¸²à¸¢à¸‡à¸²à¸™ à¸à¸£à¸¸à¸“ารอ">
+<!ENTITY dataCollector.heading "ยินดีต้อนรับสู่à¸à¸²à¸£à¸£à¸²à¸¢à¸‡à¸²à¸™à¸›à¸±à¸à¸«à¸²">
+<!ENTITY screenshot.heading "à¹à¸™à¸šà¸ à¸²à¸žà¸«à¸™à¹‰à¸²à¸ˆà¸­">
+<!ENTITY sendPage.heading "ส่งรายงาน">
+<!ENTITY issues.subscriptionCount.description "ดูเหมือนว่าคุณจะรับข้อมูลจาà¸à¸•ัวà¸à¸£à¸­à¸‡à¸¡à¸²à¸à¹€à¸à¸´à¸™à¹„ป à¸à¸²à¸£à¸•ิดตั้งนี้จึงไม่à¹à¸™à¸°à¸™à¸³à¹€à¸žà¸£à¸²à¸°à¸­à¸²à¸ˆà¸—ำให้มีปัà¸à¸«à¸²à¸¡à¸²à¸ เราจะไม่รับรายงานปัà¸à¸«à¸²à¸ˆà¸²à¸à¸„ุณเพราะไม่ทราบว่าปัà¸à¸«à¸²à¸¡à¸²à¸ˆà¸²à¸à¸•ัวà¸à¸£à¸­à¸‡à¸•ัวใด à¸à¸£à¸¸à¸“าลบออà¸à¹€à¸«à¸¥à¸·à¸­à¹à¸•่ตัวที่จำเป็นà¹à¸¥à¸°à¸—ดสอบดูว่าปัà¸à¸«à¸²à¹€à¸à¸´à¸”จาà¸à¸•ัวใด">
+<!ENTITY screenshot.mark.label "เ&amp;น้นส่วนที่เป็นปัà¸à¸«à¸²">
+<!ENTITY privacyPolicy.label "ความเป็นส่วนตัว">
+<!ENTITY issues.description "Adblock Plus ตรวจพบปัà¸à¸«à¸²à¸à¸²à¸£à¸•ั้งค่าของคุณที่อาจจะเà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¸›à¸±à¸à¸«à¸²à¸™à¸µà¹‰à¸«à¸£à¸·à¸­à¸—ี่ทำให้à¸à¸²à¸£à¸ªà¸·à¸šà¸ªà¸§à¸™à¸£à¸²à¸¢à¸‡à¸²à¸™à¸¢à¸²à¸à¸‚ึ้น">
+<!ENTITY email.label "E&amp;mail:">
+<!ENTITY anonymous.label "&amp;Anonymous submission">
+<!ENTITY emailComment.label "We encourage you to enter a valid email address so that we can contact you if there are questions
+ about your report. It will also allow us to recognize your contributions and to prioritize them higher.">
+<!ENTITY anonymity.warning "We won't be able to come back to you and will likely prioritize the report lower.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/sidebar.dtd
new file mode 100644
index 0000000..9dc7457
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "ขอบของรายà¸à¸²à¸£à¹à¸Ÿà¸¥à¸Š">
+<!ENTITY address.label "ที่อยู่">
+<!ENTITY context.open.label "เปิดในà¹à¸—็บใหม่">
+<!ENTITY type.label "ชนิด">
+<!ENTITY tooltip.filterSource.label "ตัวà¸à¸£à¸­à¸‡à¹à¸«à¸¥à¹ˆà¸‡à¸—ี่มา:">
+<!ENTITY noitems.label "ไม่มีรายà¸à¸²à¸£à¸—ี่บล็อคได้">
+<!ENTITY filter.label "ตัวà¸à¸£à¸­à¸‡">
+<!ENTITY tooltip.size.label "ขนาด:">
+<!ENTITY reattach.label "à¹à¸™à¸šà¸à¸¥à¸±à¸š">
+<!ENTITY search.label "&amp;ค้นหา:">
+<!ENTITY docDomain.thirdParty "(เทิร์ดปาร์ตี้)">
+<!ENTITY filterSource.label "ตัวà¸à¸£à¸­à¸‡à¸•้นฉบับ">
+<!ENTITY tooltip.docDomain.label "à¹à¸«à¸¥à¹ˆà¸‡à¸—ี่มาเอà¸à¸ªà¸²à¸£:">
+<!ENTITY context.copy.label "คัดลอà¸à¸—ี่อยู่รายà¸à¸²à¸£">
+<!ENTITY tooltip.type.label "ชนิด:">
+<!ENTITY context.disablefilter.label "ปิดตัวà¸à¸£à¸­à¸‡ ?1?">
+<!ENTITY context.copyFilter.label "คัดลอà¸à¸•ัวà¸à¸£à¸­à¸‡">
+<!ENTITY context.block.label "บล็อครายà¸à¸²à¸£à¸™à¸µà¹‰">
+<!ENTITY context.enablefilter.label "เปิดตัวà¸à¸£à¸­à¸‡ ?1? อีà¸à¸„รั้ง">
+<!ENTITY detach.label "à¹à¸¢à¸à¸­à¸­à¸">
+<!ENTITY whitelisted.label "หน้าที่ถูà¸à¸‚ึ้นบัà¸à¸Šà¸µà¸‚าว">
+<!ENTITY context.disablefilteronsite.label "ปิดตัวà¸à¸£à¸­à¸‡à¸™à¸µà¹‰à¸šà¸™ ?1?">
+<!ENTITY detached.title "Adblock Plus: รายà¸à¸²à¸£à¸—ี่บล็อà¸à¹„ด้ (ถูà¸à¹à¸¢à¸à¸­à¸­à¸)">
+<!ENTITY docDomain.firstParty "(เฟิร์สปาร์ตี้)">
+<!ENTITY tooltip.type.whitelisted "(ขึ้นบัà¸à¸Šà¸µà¸‚าว)">
+<!ENTITY tooltip.filter.label "เป็นผลมาจาà¸à¸•ัวà¸à¸£à¸­à¸‡:">
+<!ENTITY tooltip.filter.disabled "(ปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™)">
+<!ENTITY context.editfilter.label "à¹à¸à¹‰à¹„ขตัวà¸à¸£à¸­à¸‡à¸—ี่มีผล">
+<!ENTITY tooltip.type.blocked "(ถูà¸à¸šà¸¥à¹‡à¸­à¸„)">
+<!ENTITY size.label "ขนาด">
+<!ENTITY context.whitelist.label "เพิ่มข้อยà¸à¹€à¸§à¹‰à¸™à¸ªà¸³à¸«à¸£à¸±à¸šà¸£à¸²à¸¢à¸à¸²à¸£">
+<!ENTITY context.selectAll.label "เลือà¸à¸—ั้งหมด">
+<!ENTITY state.label "สถานะ">
+<!ENTITY docDomain.label "à¹à¸«à¸¥à¹ˆà¸‡à¸—ี่มาเอà¸à¸ªà¸²à¸£">
+<!ENTITY tooltip.address.label "ที่อยู่:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/subscriptionSelection.dtd
new file mode 100644
index 0000000..802aa7e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "เพิ่มนามข้างท้ายตั&amp;วà¸à¸£à¸­à¸‡ &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plus ไม่สามารถà¸à¸¹à¹‰à¸„ืนรายà¸à¸²à¸£à¸™à¸²à¸¡à¸‚้างท้ายได้">
+<!ENTITY list.download.retry "ลองอีà¸à¸„รั้ง">
+<!ENTITY title.label "&amp;ชื่อ:">
+<!ENTITY list.download.website "ดูเว็บไซต์">
+<!ENTITY supplementMessage "นามข้างท้ายตัวà¸à¸£à¸­à¸‡à¸™à¸µà¹‰à¸•ั้งใจไว้ใช้à¸à¸±à¸šà¸™à¸²à¸¡à¸‚้างท้ายตัวà¸à¸£à¸­à¸‡ &quot;?1?&quot; ซึ่งคุณยังไม่ได้ใช้">
+<!ENTITY viewList.label "ดูตัวà¸à¸£à¸­à¸‡">
+<!ENTITY visitHomepage.label "เยี่ยมชมโฮมเพจ">
+<!ENTITY addSubscription.label "เพิ่มนามข้างท้ายตัวà¸à¸£à¸­à¸‡">
+<!ENTITY dialog.title "เพิ่มนามข้างท้ายตัวà¸à¸£à¸­à¸‡ Adblock Plus">
+<!ENTITY location.label "ที่อยู่&amp;รายชื่อตัวà¸à¸£à¸­à¸‡:">
+<!ENTITY fromWeb.description "à¸à¸£à¸¸à¸“ายืนยันว่าคุณต้องà¸à¸²à¸£à¹€à¸žà¸´à¹ˆà¸¡à¸™à¸²à¸¡à¸‚้างท้ายตัวà¸à¸£à¸­à¸‡à¸™à¸µà¹‰ คุณสามารถเปลี่ยนหัวเรื่องนามข้างท้ายหรือตำà¹à¸«à¸™à¹ˆà¸‡à¸à¹ˆà¸­à¸™à¹€à¸žà¸´à¹ˆà¸¡à¹€à¸‚้ามาได้">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/composer.dtd
new file mode 100644
index 0000000..67be4e6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "adresin s&amp;onunda">
+<!ENTITY domainRestriction.label "Alan a&amp;dına kısıtlama:">
+<!ENTITY collapse.default.no.label "Öntanımlı kullan (hayır)">
+<!ENTITY firstParty.label "Yalnız b&amp;irinci kişilerden">
+<!ENTITY preferences.label "Mevcut süzgeçleri &amp;göster...">
+<!ENTITY pattern.label "Aranacak örnek">
+<!ENTITY thirdParty.label "Yalnız üçün&amp;cü kişilerden">
+<!ENTITY filter.label "&amp;Yeni süzgeç:">
+<!ENTITY collapse.label "Engellenenleri ka&amp;pat:">
+<!ENTITY match.warning "Girdiğiniz örnek, engellenecek veya kara listeden çıkarılacak adresle eşleşmiyor ve üzerinde hiçbir etkisi olmayacak.">
+<!ENTITY anchor.start.label "adresin &amp;başında">
+<!ENTITY matchCase.label "&amp;Büyük küçük harf duyarlı">
+<!ENTITY custom.pattern.label "&amp;Özel:">
+<!ENTITY unselectAllTypes.label "Hiçbirini seçme">
+<!ENTITY type.whitelist.label "&amp;Hariç tutma kuralı">
+<!ENTITY regexp.warning "Girdiğiniz örnek düzenli ifade olarak yorumlanacak. Adblock Plus tarafından doğru işlenemeyebilir ve taramayı yavaşlatabilir. Düzenli ifade olarak kullanmak istediğinizden emin değilseniz örneğin sonuna yıldız (*) işareti koyun.">
+<!ENTITY dialog.title "Adblock Plus süzgeç kuralı ekle">
+<!ENTITY basic.label "Temel görünüm">
+<!ENTITY type.filter.label "Engelleme süzgeci">
+<!ENTITY types.label "Bu türlere uygula:">
+<!ENTITY shortpattern.warning "Girdiğiniz örnek en iyilemek için çok kısa ve bu tür örnekler taramayı yavaşlatabilir. Adblock Plus'ın bu süzgeci daha etkin işleyebilmesi için daha uzun bir satır seçmeniz tavsiye edilir.">
+<!ENTITY collapse.yes.label "Evet">
+<!ENTITY anchors.label "Örneği sadece burada kabul et:">
+<!ENTITY collapse.default.yes.label "Öntanımlı kullan (evet)">
+<!ENTITY domainRestriction.help "Aralarına &quot;|&quot; simgesi koyarak bir ya da daha fazla alan adı belirtin. Böylece süzgeç sadece bu sitelerde uygulanacaktır. Alan adından önce &quot;~&quot; simgesi kullanılması, süzgecin o alan adında kullanılmaması gerektiği anlamına gelir.">
+<!ENTITY accept.label "Süzgeç ekle">
+<!ENTITY options.label "Seçenekler">
+<!ENTITY disabled.warning "Adblock Plus şu an devre dışı. Yine de süzgeç ekleyebilirsiniz, ancak bunlar [link]Adblock Plus etkinleştirilene kadar[/link] uygulanmayacaktır.">
+<!ENTITY anchor.start.flexible.label "alan adının &amp;başında">
+<!ENTITY collapse.no.label "Hayır">
+<!ENTITY selectAllTypes.label "Tümünü seç">
+<!ENTITY advanced.label "Gelişmiş görünüm">
+<!ENTITY pattern.explanation "Bu örnek adresin herhangi bir bölümü olabilir ve * işareti joker görevi yapar. Süzgeç sadece örneğe uyan adreslere uygulanacak.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/filters.dtd
new file mode 100644
index 0000000..8c7ac35
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Tüm isteğe bağlı süzgeçleriniz seçilen dosyanın içeriğiyle değiştirilecek. Devam etmek istiyor musunuz?">
+<!ENTITY slow.column "Ya&amp;vaş süzgeçler">
+<!ENTITY enabled.column "Etkin">
+<!ENTITY subscription.lastDownload.checksumMismatch "Olmadı. Sağlama yapılamadı">
+<!ENTITY noFiltersInGroup.text "Seçili öbek boş">
+<!ENTITY subscription.actions.label "Eylemler">
+<!ENTITY filter.selectAll.label "Tümünü seç">
+<!ENTITY backupButton.label "&amp;Yedekle ve geri getir">
+<!ENTITY restore.minVersion.warning "Uyarı: Dosya Adblock Plus'ın daha yeni bir sürümüyle oluşturulmuş. Bu dosyayı geri getirmeden önce Adblock Plus'ı en güncel sürümüne yükseltmelisiniz.">
+<!ENTITY restore.error "Dosya verisi iÅŸlenemiyor. Adblock Plus yedeÄŸi olmayabilir mi?">
+<!ENTITY sort.ascending.label "&amp;A'da Z'ye sıralama">
+<!ENTITY sort.label "&amp;Sırala">
+<!ENTITY subscription.source.label "Süzgeç listesi">
+<!ENTITY hitcount.column "İsab&amp;et">
+<!ENTITY noFilters.text "İsteğe göre ayarlanmış hiçbir süzgeciniz yok.">
+<!ENTITY backup.custom.title "Sadece isteğe bağlı süzgeçler">
+<!ENTITY subscription.external.label "Başka bir eklenti tarafından güncellendi">
+<!ENTITY subscription.delete.label "Sil">
+<!ENTITY noGroupSelected.text "Süzgeçlerini görmek için bir süzgeç öbeği seçmeniz gerekiyor.">
+<!ENTITY filter.cut.label "Kes">
+<!ENTITY restore.default.label "?1? tarihli yedek geri getirilsin mi?">
+<!ENTITY subscription.lastDownload.inProgress "İndiriliyor...">
+<!ENTITY subscriptions.tab.label "Süzgeç abonelikleri">
+<!ENTITY sort.descending.label "&amp;Z'den A'ya sıralama">
+<!ENTITY filters.remove.warning "Tüm seçili süzgeçleri gerçekten silmek istiyor musunuz?">
+<!ENTITY filter.delete.label "Sil">
+<!ENTITY addSubscriptionAdd.label "Ekle">
+<!ENTITY viewMenu.label "Görünüm">
+<!ENTITY subscription.lastDownload.unknown "Yok">
+<!ENTITY addSubscriptionCancel.label "Vazgeç">
+<!ENTITY subscription.enabled.label "Etkin">
+<!ENTITY noSubscriptions.text "Henüz hiçbir süzgeç aboneliği eklemediniz. Adblock Plus süzgeç olmadan hiçbir şey
+ engellemeyecektir. Abonelik eklemek için
+ lütfen &quot;Süzgeç aboneliği ekle&quot; düğmesini kullanın.">
+<!ENTITY subscription.update.label "Süzgeçleri güncelle">
+<!ENTITY dialog.title "Adblock Plus Süzme Tercihleri">
+<!ENTITY addFilter.label "Süzgeç e&amp;kle">
+<!ENTITY subscription.minVersion.warning "Bu süzgeç aboneliği daha yeni bir Adblock Plus sürümü gerektiriyor. En güncel Adblock Plus sürümüne yükseltmelisiniz.">
+<!ENTITY subscription.lastDownload.invalidURL "Olmadı. Bu geçerli bir adres değil.">
+<!ENTITY backup.error "Süzgeçler dosyaya yazılırken bir sorun meydana geldi. Dosyanın yazma korumalı veya başka bir uygulama tarafından kullanılmıyor olduğundan emin olun.">
+<!ENTITY filter.moveUp.label "Yukarıya taşı">
+<!ENTITY addGroup.label "Sü&amp;zgeç öbeği ekle">
+<!ENTITY filter.edit.label "Düzenle">
+<!ENTITY subscription.showHideFilters.label "Süzgeçleri göster/gizle">
+<!ENTITY acceptableAds2.label "Rahatsız etmeyen bazı reklamlara &amp;izin ver">
+<!ENTITY addSubscriptionOther.label "BaÅŸka abonelik ekle">
+<!ENTITY close.label "Kapat">
+<!ENTITY sort.none.label "Sıralan&amp;mamış">
+<!ENTITY filter.actions.label "Süzgeç eylemleri">
+<!ENTITY filter.copy.label "Kopyala">
+<!ENTITY filter.moveDown.label "Aşağıya taşı">
+<!ENTITY filter.resetHitCounts.label "İsabet istatistiklerini sıfırla">
+<!ENTITY readMore.label "Daha fazla bilgi al">
+<!ENTITY subscription.moveUp.label "Yukarıya taşı">
+<!ENTITY addSubscription.label "Süzgeç aboneliği ekle">
+<!ENTITY subscription.homepage.label "Ana sayfa">
+<!ENTITY backup.complete.title "Tüm süzgeç ve abonelikler">
+<!ENTITY restore.own.label "Kendi yedeÄŸini geri getir">
+<!ENTITY restore.complete.warning "Tüm süzme tercihleriniz seçilen dosyanın içeriğiyle değiştirilecek. Devam etmek istiyor musunuz?">
+<!ENTITY filters.tab.label "İsteğe bağlı süzgeçler">
+<!ENTITY backup.label "Yeni yedek oluÅŸtur">
+<!ENTITY find.label "&amp;Bul">
+<!ENTITY subscription.moveDown.label "Aşağıya taşı">
+<!ENTITY subscription.lastDownload.connectionError "Olmadı. İndirmede sorun var.">
+<!ENTITY subscription.lastDownload.success "Eşleme başarılı oldu.">
+<!ENTITY subscription.lastDownload.invalidData "Olmadı. Bu düzgün bir süzgeç listesi değil.">
+<!ENTITY filter.paste.label "Yapıştır">
+<!ENTITY subscription.disabledFilters.enable "Devre dışı süzgeçleri devreye sok">
+<!ENTITY lasthit.column "Son isabet">
+<!ENTITY subscription.editTitle.label "Başlığı değiştir">
+<!ENTITY subscription.disabledFilters.warning "Bu abonelikteki bazı süzgeçler devre dışı.">
+<!ENTITY filter.column "Süzgeç &amp;kuralı">
+<!ENTITY subscription.lastDownload.label "Son indirme zamanı:">
+<!ENTITY viewList.label "Listeye bak">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/firstRun.properties
new file mode 100644
index 0000000..e7c76d5
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Her hareketinizi izleyen reklam şirketlerin adımlarınızı gizleyin. İnternette izlenmeyi devre dışı bırakarak gezin.
+firstRun_toggle_off=KAPALI
+firstRun_feature_tracking=İzlenmeyi Devre Dışı Bırak
+firstRun_feature_malware=Zararlı Yazılım Engelleme
+firstRun_title=Adblock Plus yüklendi
+firstRun_toggle_on=AÇIK
+firstRun_acceptableAdsExplanation=Siteleri basit ve rahatsız etmeyen reklamlar yayınlamaya teşvik ediyoruz. Bu yüzden varsayılan ayarlar altında gösterilen, makul reklamları tanımlayan <a>sıkı kuralları</a> kabul ettik. Yine de tüm reklamları engellemek istiyorsanız <a>devre dışı bırakma</a> işini birkaç saniye içinde yapabilirsiniz.
+firstRun_contributor_credits=Emeği Geçenler
+firstRun_dataCorruptionWarning=Bu sayfa sürekli gösteriliyor mu? <a>Buraya tıklayın!</a>
+firstRun_acceptableAdsHeadline=Rahatsız edici reklamlar artık engellenecek
+firstRun_share=Arkadaşlarınıza bahsedin
+firstRun_share_headline=İnterneti daha iyi bir yer yapabilmek için <a>bize elinizi uzatın</a>
+firstRun_feature_social_description=Sayfalarda çıkan ve davranışlarınızı takip eden Facebook'un "Beğen" düğmesi gibi sosyal medya düğmelerinden kurtulun.
+firstRun_filterlistsReinitializedWarning=Görünüşe göre bir sorun tüm filtrelerinizin kaldırılmasına neden olmuş ve bir yedeği geri yükleyemiyoruz. Bu yüzden filtrelerinizi ve Kabul Edilebilir Reklamlar ayarlarınızı sıfırlamamız gerekiyordu. Lütfen <a>Adblock Plus seçenekleri</a> bölümünde filtre listelerinizi ve Kabul Edilebilir Reklamlar ayarlarınızı denetleyin.
+firstRun_feature_malware_description=Bilinen kötü amaçlı yazılıma sahip alan adlarını engelleyerek gezintinizi daha güvenli hale getirin.
+firstRun_features=Adblock Plus reklamları engellemekten daha fazlasını yapabilir
+firstRun_donate=bağış yapın
+firstRun_donate_label=Projemize destek verin
+firstRun_feature_social=Sosyal Medya Düğmelerini Kaldır
+firstRun_legacySafariWarning=Safari'nin Adblock Plus tarafından desteklenmeyen eski bir sürümünü kullanıyorsunuz. Uygulama doğru şekilde çalışmayabilir veya bazı internet sitelerinde kullanıcı deneyimini olumsuz etkileyebilir. Sürümünüzü Safari 6.1.1 veya daha yüksek (OS X 10.8 Mountain Lion için), ya da Safari 7.0.1 veya daha yüksek (OS X 10.9 Mavericks için) bir sürüme yükseltmenizi, veya Mozilla Firefox, Google Chrome ya da Opera'nın en son sürümünü kullanmanızı önemle tavsiye ederiz.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/global.properties
new file mode 100644
index 0000000..bf4bc48
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Bakılan sayfada engellenebilecek bir öğe bulunmuyor
+action3_tooltip=Adblock Plus'ı etkinleştirmek ya da etkisizleştirmek için orta düğmeye tıklayın.
+notification_antiadblock_title=Hedeflenen iletileri gizlemek istiyor musunuz?
+type_label_script=betik
+filter_elemhide_nocriteria=Gizlenecek bileşeni anlamak için hiçbir ölçüt belirtilmedi
+blockingGroup_title=Reklam Engelleme Kuralları
+whitelisted_tooltip=Adblock Plus etkin, ancak bu sayfada devre dışı.
+type_label_stylesheet=biçem yaprağı
+blocked_count_tooltip=toplamda ?1?, sayfada ?2?
+type_label_font=yazı tipi
+type_label_popup=açılır pencere
+filter_regexp_tooltip=Süzgeç ya düzenli ifade ya da en iyileştirilmek için çok kısa. Bu süzgeçlerden çok fazlası, taramanızı yavaşlatabilir.
+action0_tooltip=İçerik menüsünü açmak için tıklayın; etkinleştirmek ya da etkisizleştirmek için orta düğmeye tıklayın.
+whitelisted_page=Adblock Plus bakılan sayfa için devre dışı bırakıldı
+remove_group_warning=Bu grubu kaldırmayı gerçekten istiyor musunuz?
+action1_tooltip=Engellenebilir öğeleri açmak ya da kapatmak için tıklayın; etkinleştirmek ya da etkisizleştirmek için orta düğmeye tıklayın.
+type_label_xmlhttprequest=XML isteÄŸi
+active_tooltip=Adblock Plus devrede ve ?1? süzgeç aboneliği ile ?2? özel süzgeç kullanıyor.
+type_label_document=belge
+type_label_object_subrequest=nesne alt isteÄŸi
+whitelistGroup_title=Hariç Tutma Kuralları
+disabled_tooltip=Adblock Plus etkin deÄŸil.
+filter_elemhide_duplicate_id=Gizlenecek sadece bir bileÅŸen kimliÄŸi belirtilebilir
+type_label_object=nesne
+action2_tooltip=Tercihler penceresini açmak için tıklayın; etkinleştirmek ya da etkisizleştirmek için orta düğmeye tıklayın.
+type_label_subdocument=çerçeve
+clearStats_warning=Bu hareket isabet istatistiklerinin sıfırlanması ve artık istatistik tutulmamasıyla sonuçlanacak. Devam etmek istiyor musunuz?
+notification_antiadblock_message=Bu site Adblock Plus kullanıcılarına hedeflenen iletiler göstermesiyle bilinir. Adblock Plus'ın hedeflenen iletileri gizlemesini istiyor musunuz?
+blocked_count_addendum=(ayrıca ?1? tane ak listede, ?2? tane gizli)
+subscription_invalid_location=Dosya listesi konumu ne düzgün bir URL ne de düzgün bir ada sahip.
+type_label_image=resim
+remove_subscription_warning=Gerçekten abonelikten çıkmak istiyor musunuz?
+type_label_other=diÄŸer
+mobile_menu_enable=ABP: EtkinleÅŸtir
+type_label_media=ses/görüntü
+mobile_menu_disable_site=ABP: ?1? sitesinde etkisizleÅŸtirilsin mi?
+elemhideGroup_title=Öğe Gizleme Kuralları
+mobile_menu_enable_site=ABP: ?1? sitesinde etkinleÅŸtirilsin mi?
+type_label_elemhide=gizli
+newGroup_title=Yeni süzgeç öbeği
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/overlay.dtd
new file mode 100644
index 0000000..4cbbc1c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Evet">
+<!ENTITY notification.button.no "&amp;Hayır">
+<!ENTITY sync.label "Adblock Plus ayarlarını &amp;eşitle">
+<!ENTITY whitelist.site.label "?1? sitesinde devre dışı kal">
+<!ENTITY filters.label "&amp;Süzgeç tercihleri">
+<!ENTITY disable.label "Her yerde devre dışı kal">
+<!ENTITY objecttab.title "Engelle">
+<!ENTITY objecttab.tooltip "Bu nesneyi Adblock Plus ile engellemek için buraya tıklayın.">
+<!ENTITY menuitem.label "Adblock Plus Tercihleri">
+<!ENTITY objecttabs.label "Flash ve &amp;Java'yı kulakçıklarla belirt">
+<!ENTITY sendReport.label "&amp;Bu sayfadaki sorunu bildir">
+<!ENTITY whitelist.page.label "Sadece bu sayfada devre dışı kal">
+<!ENTITY context.image.label "Adblock Plus: Resmi engelle">
+<!ENTITY counthits.label "Süzgeç isa&amp;betini say">
+<!ENTITY opensidebar.label "E&amp;ngellenebilecek öğeleri göster">
+<!ENTITY notification.button.close "&amp;Kapat">
+<!ENTITY contribute.label "Adblock Plus'a katkıda bulun">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Çerçeveyi engelle">
+<!ENTITY blocked.tooltip "Bu sayfada engellenen öğeler:">
+<!ENTITY hideplaceholders.label "Enge&amp;llenen öğelerin yer işaretlerini gizle">
+<!ENTITY showinstatusbar.label "&amp;Durum çubuğunda göster">
+<!ENTITY sidebar.title "Bu sayfadaki engellenebilecek öğeler">
+<!ENTITY options.label "S&amp;eçenekler">
+<!ENTITY context.object.label "Adblock Plus: Nesneyi engelle">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Bu sayfada devreye sok">
+<!ENTITY filters.tooltip "En etkin süzgeçler:">
+<!ENTITY closesidebar.label "E&amp;ngellenebilecek öğeleri gizle">
+<!ENTITY showintoolbar.label "A&amp;raç çubuğunda göster">
+<!ENTITY status.tooltip "Durum:">
+<!ENTITY context.media.label "Adblock Plus: Ses/video engelle">
+<!ENTITY subscription.update.label "Süzgeçleri güncelle">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/sendReport.dtd
new file mode 100644
index 0000000..c187ec1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Geri al">
+<!ENTITY issues.disabledgroups.description "Bu sayfada etkisi olabilecek aşağıdaki abonelikler ve süzgeç grupları devre dışı bırakıldı:">
+<!ENTITY showData.label "Bildirim verisini göster">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus çok &amp;fazla engelleme yapıyor">
+<!ENTITY issues.change.description "Yapılandırmanız değişti. Lütfen değişiklikleri sınamak için sayfayı yeniden yükleyin ve yapılan değişiklikler sorunu gidermediyse hatayı bildirin.">
+<!ENTITY email.label "E-&amp;posta:">
+<!ENTITY issues.openPreferences.label "Süzgeç tercihlerini aç">
+<!ENTITY sendPage.confirmation "Bildiriminiz kaydedildi ve ona aşağıdaki adresten ulaşabilirsiniz:">
+<!ENTITY copyLink.label "Bildirimi bağlantısını &amp;kopyala">
+<!ENTITY issues.nofilters.description "Adblock Plus bu sayfada hiçbir şeyi engellemiyor. Gözlemlediğiniz sorun büyük olasılıkla Adblock Plus ile ilgisiz.">
+<!ENTITY sendPage.knownIssue "Bildirdiğiniz sorun büyük olasılıkla biliniyor. Daha fazla bilgi:">
+<!ENTITY typeSelector.other.description "Sorunun süzgeçlerinden çok Adblock Plus'ın kendisinden kaynaklandığından şüpheleniyorsanız bu seçeneği seçin.">
+<!ENTITY issues.disabledgroups.enable.label "Süzgeç aboneliğini veya grubunu devreye sok">
+<!ENTITY typeWarning.override.label "Anlıyorum ve ne olur&amp;sa olsun bildirimi göndermek istiyorum">
+<!ENTITY issues.disabled.enable.label "Adblock Plus'ı etkinleştir">
+<!ENTITY update.fixed.description "Süzgeç aboneliklerinize yapılan güncellemeler muhtemelen bildirmek istediğiniz sorunu giderdi. Sayfayı tekrar yükleyip bir daha deneyin, hâlâ sorun varsa bildirin.">
+<!ENTITY anonymous.label "&amp;Anonim gönder">
+<!ENTITY reloadButton.label "Sayfayı &amp;tazele">
+<!ENTITY recentReports.clear.label "Tüm bildirimleri sil">
+<!ENTITY typeSelector.description "Bu pencere Adblock Plus sorun bildirimi göndermek için gerekli adımların atılmasında size rehberlik edecek. Önce bu sayfada ne tür sorun yaşadığınızı seçin:">
+<!ENTITY screenshot.remove.label "Hassas &amp;veriyi sil">
+<!ENTITY issues.ownfilters.description "Bu sayfada uygulanan süzgeçlerin bazıları kullanıcı tarafından tanımlanmış. Lütfen soruna neden olmuş olabilecek süzgeçleri devre dışı bırakın:">
+<!ENTITY update.inProgress.description "Bu sorunun süzgeç güncellemesiyle giderilmesinin mümkün olup olmadığını tespit etmek için abonelikleriniz şimdi güncellenecektir. Lütfen bekleyin...">
+<!ENTITY sendPage.retry.label "Yeniden gönder">
+<!ENTITY data.label "Bildirim &amp;verisi:">
+<!ENTITY recentReports.label "Yakında gönderdiğiniz bildirimler">
+<!ENTITY typeWarning.description "Süzgeçlerle ilgili bir sorun değil de Adblock Plus ile ilgili genel bir sorun bildiriminde bulunmak istediğinizi belirttiniz. Lütfen böyle sorunların en iyi bildirim yerinin [link]Adblock Plus forumu[/link] olduğu aklınızda olsun. Siz bağlantı vermediğiniz sürece kimse bildiriminizi görmeyeceği için sorun bildiriciyi sadece mevcut bir tartışmaya katkı sağlamak için kullanmalısınız.">
+<!ENTITY issues.disabled.description "Adblock Plus devre dışı ve şu anki durumunda hiçbir şeyi engellemeyecek.">
+<!ENTITY attachExtensions.label "Sor&amp;un kaynağının eklenti uyumsuzluğu olup olmadığının belirlenmesi için etkin eklentilerin listesini bildirime ekle">
+<!ENTITY issues.nosubscriptions.add.label "Süzgeç aboneliği ekle">
+<!ENTITY issues.disabledfilters.enable.label "Süzgeci devreye sok">
+<!ENTITY issues.override.label "Yapılan&amp;dırma doğru, bildirime devam et">
+<!ENTITY issues.nosubscriptions.description "Sitelerdeki istenmeyen içeriği yok eden önceden hazırlanmış süzgeç listelerinden herhangi birine abone olmuş değilsiniz.">
+<!ENTITY typeSelector.falsePositive.description "Sayfanın önemli içeriği hiç görünmüyorsa, yanlış görünüyorsa veya sayfa düzgün işlemiyorsa bu seçeneği seçin. Sorun kaynağının Adblock Plus olup olmadığını eklentiyi geçici olarak devre dışı bırakıp belirleyebilirsiniz.">
+<!ENTITY typeSelector.other.label "BaÅŸka bir sorun">
+<!ENTITY emailComment.label "Sizi, raporunuz hakkında sorularımız olursa sizinle iletişime geçebilmemiz için geçerli bir e-posta adresi girmeye teşvik ediyoruz. Bu aynı zamanda katılımlarınızı hatırlamamızı ve önceliklerini yüksek olarak ayarlamamızı sağlar.">
+<!ENTITY issues.whitelist.remove.label "Adblock Plus'u bu sayfada devreye sok">
+<!ENTITY outdatedSubscriptions.description "Aşağıdaki süzgeç abonelikleri en az 2 haftadır güncellenmedi. Bildirmeden önce lütfen bu abonelikleri güncelleyin, sorun çoktan giderilmiş olabilir.">
+<!ENTITY dataCollector.description "Adblock Plus eklentisinin gerekli bilgileri toplaması için lütfen biraz bekleyin.">
+<!ENTITY sendButton.label "&amp;Bildirimi gönder">
+<!ENTITY comment.label "Y&amp;orum (isteğe bağlı):">
+<!ENTITY sendPage.errorMessage "Hata bildirimi gönderme girişiminiz &quot;?1?&quot; hata koduyla başarısız oldu. Lütfen internete bağlı olduğunuzdan emin olun ve yeniden deneyin. Sorun devam ederse lütfen [link]Adblock Plus forumunda[/link] yardım isteyin.">
+<!ENTITY showRecentReports.label "Yakında gönderilen bildirimleri göster">
+<!ENTITY commentPage.heading "Yorum ekle">
+<!ENTITY update.start.label "Güncellemeyi şimdi başlat">
+<!ENTITY issues.disabledfilters.description "Bu sayfada etkisi olabilecek aşağıdaki süzgeçler devre dışı bırakıldı:">
+<!ENTITY screenshot.description "Aynı sayfa farklı kişilerce farklı biçimde görülebilir. Bildirime ekran görüntüsü eklemeniz sorunu anlamamıza yardımcı olabilir. Hassas bilgilerin olduğu bölümleri silebilirsiniz ve sorunun görünür olduğu yerleri işaretleyebilirsiniz. Bunu yapmak için ilgili düğmeye basın ve resimde bir bölümü farenizle seçin.">
+<!ENTITY screenshot.attach.label "Bildirime say&amp;fa resmi ekle">
+<!ENTITY issues.whitelist.description "Adblock Plus bildirimde bulunduğunuz sayfada devre dışı. Bu sorunun incelenmesine yardım etmek için bildirim göndermeden önce eklentiyi devreye sokun ve sayfayı yeniden yükleyin.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus reklamın birini engellemiyor">
+<!ENTITY typeSelector.heading "Sorun türünü seçin">
+<!ENTITY anonymity.warning "Size geri dönemeyiz ve muhtemelen rapor önceliği düşük olarak ayarlanır.">
+<!ENTITY wizard.title "Sorun bildirici">
+<!ENTITY issues.ownfilters.disable.label "Süzgeci devre dışı bırak">
+<!ENTITY commentPage.description "Aşağıdaki metin alanı sorunu anlamamız için yorum yazmanıza olanak tanır. Bu adım isteğe bağlıdır ancak sorun açık değilse tavsiye edilir. Ayrıca bildirimi göndermeden önce gözden geçirebilirsiniz.">
+<!ENTITY comment.lengthWarning "Yorumunuzun uzunluğu 1000 karakteri aşıyor. Sadece ilk 1000 karakter gönderilecek.">
+<!ENTITY typeSelector.falseNegative.description "Adblock Plus devrede olmasına rağmen reklamın biri görünüyorsa bu seçeneği seçin.">
+<!ENTITY sendPage.waitMessage "Lüftfen Adblock Plus bildirimi gönderirken bekleyin.">
+<!ENTITY dataCollector.heading "Sorun bildiriciye hoÅŸ geldiniz">
+<!ENTITY screenshot.heading "Ekran görüntüsü ekle">
+<!ENTITY sendPage.heading "Bildirimi gönder">
+<!ENTITY issues.subscriptionCount.description "Çok fazla süzgeç listesine abone olduğunuz görülüyor. Böyle yapmanız tavsiye edilmez çünkü bu, sorun çıkma olasılığını daha da arttırır. Ayrıca hangi süzgeç aboneliği yazarının hatayı düzeltmesi gerektiği belirsiz olduğundan hata bildiriminizi kabul edemeyiz. Sadece gerçekten gerekli olan süzgeç abonelikleri dışında kalanlardan çıkın ve sorunun hâlâ yaşanıp yaşanmadığına bakın.">
+<!ENTITY screenshot.mark.label "Sorunu iÅŸ&amp;aretle">
+<!ENTITY privacyPolicy.label "Gizlilik politikası">
+<!ENTITY issues.description "Adblock Plus yapılandırmanızda bu sorunun nedeni olabilecek veya bildirimi incelemeyi güçleştirecek sorunlar keşfetti.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/sidebar.dtd
new file mode 100644
index 0000000..667d01f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Flash öğesinin sınırları">
+<!ENTITY address.label "Konum">
+<!ENTITY context.open.label "Yeni sekmede aç">
+<!ENTITY type.label "Tür">
+<!ENTITY tooltip.filterSource.label "Süzgeç kaynağı:">
+<!ENTITY noitems.label "Engellenebilecek öğe yok">
+<!ENTITY filter.label "Süzgeç">
+<!ENTITY tooltip.size.label "Boyut">
+<!ENTITY reattach.label "BirleÅŸtir">
+<!ENTITY search.label "&amp;Ara">
+<!ENTITY docDomain.thirdParty "(üçüncü taraf)">
+<!ENTITY filterSource.label "Süzgeç kaynağı">
+<!ENTITY tooltip.docDomain.label "Belge kaynağı:">
+<!ENTITY context.copy.label "Öğenin konumunu kopyala">
+<!ENTITY tooltip.type.label "Tür:">
+<!ENTITY context.disablefilter.label "?1? süzgecini devre dışı bırak">
+<!ENTITY context.copyFilter.label "Süzgeci kopyala">
+<!ENTITY context.block.label "Bu öğeyi engelle">
+<!ENTITY context.enablefilter.label "?1? süzgecini devreye sok">
+<!ENTITY detach.label "Ayır">
+<!ENTITY whitelisted.label "Ak listeye dahil bir sayfa">
+<!ENTITY context.disablefilteronsite.label "Bu süzgeci ?1? alan adında kullanma">
+<!ENTITY detached.title "Adblock Plus: Engellenebilecek öğeler (ayrıldı)">
+<!ENTITY docDomain.firstParty "(birinci taraf)">
+<!ENTITY tooltip.type.whitelisted "(ak listede)">
+<!ENTITY tooltip.filter.label "Yürürlükteki süzgeç:">
+<!ENTITY tooltip.filter.disabled "(devre dışı)">
+<!ENTITY context.editfilter.label "Yürürlükteki süzgeci düzelt">
+<!ENTITY tooltip.type.blocked "(engellendi)">
+<!ENTITY size.label "Boyut">
+<!ENTITY context.whitelist.label "Öğeye ayrıcalık tanı">
+<!ENTITY context.selectAll.label "Tümünü seç">
+<!ENTITY state.label "Durum">
+<!ENTITY docDomain.label "Belge kaynağı">
+<!ENTITY tooltip.address.label "Konum:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/subscriptionSelection.dtd
new file mode 100644
index 0000000..b60a9e2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "&quot;?1?&quot; süzgecine de abone ol">
+<!ENTITY list.download.failed "Adblock Plus abonelik listesini alamadı">
+<!ENTITY list.download.retry "Yeniden dene">
+<!ENTITY title.label "&amp;Aboneliğin adı:">
+<!ENTITY list.download.website "Siteye git">
+<!ENTITY supplementMessage "Bu süzgeç aboneliği henüz kullanmadığınız &quot;?1?&quot; süzgeç aboneliğiyle kullanılmak üzere hazırlanmış.">
+<!ENTITY viewList.label "Süzgeçlere bak">
+<!ENTITY visitHomepage.label "Ana sayfaya git">
+<!ENTITY addSubscription.label "Abone ol">
+<!ENTITY dialog.title "Adblock Plus süzgeç aboneliği ekle">
+<!ENTITY location.label "Süzgeç &amp;listesi konumu:">
+<!ENTITY fromWeb.description "Lütfen bu süzgeç aboneliğini eklemek istediğinizi teyit edin. Eklemeden önce abonelik adını ve konumunu değiştirebilirsiniz.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/composer.dtd
new file mode 100644
index 0000000..68f86cb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "при &amp;кінці адреÑи">
+<!ENTITY domainRestriction.label "Об&amp;межити доменом">
+<!ENTITY collapse.default.no.label "Як завжди (ні)">
+<!ENTITY firstParty.label "То&amp;й же Ñайт">
+<!ENTITY preferences.label "Показати &amp;Ñ–Ñнуючі фільтри…">
+<!ENTITY pattern.label "Шукати шаблон">
+<!ENTITY thirdParty.label "С&amp;торонній Ñайт">
+<!ENTITY filter.label "Ðовий &amp;фільтр:">
+<!ENTITY collapse.label "З&amp;гортати заблоковане:">
+<!ENTITY match.warning "Вказаний шаблон не відповідає адреÑÑ–, Ð´Ð»Ñ Ñкої ви Ñтворюєте правило, Ñ– ніÑк на неї не вплине.">
+<!ENTITY anchor.start.label "на &amp;початку адреÑи">
+<!ENTITY matchCase.label "Ð’&amp;раховувати регіÑтр">
+<!ENTITY custom.pattern.label "І&amp;нше">
+<!ENTITY unselectAllTypes.label "Скинути вÑе">
+<!ENTITY type.whitelist.label "Пра&amp;вило винÑтку">
+<!ENTITY regexp.warning "Шаблон що ви ввели буде інтерпретовано Ñк регулÑрний вираз. Багато регулÑрних виразів можуть уповільнити переглÑд Ñторінок. Додайте * на кінець шаблону Ñкщо ви не збиралиÑÑŒ викориÑтовувати регулÑрний вираз.">
+<!ENTITY dialog.title "Додати правило Ñ„Ñ–Ð»ÑŒÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Adblock Plus">
+<!ENTITY basic.label "ПроÑтий виглÑд">
+<!ENTITY type.filter.label "Правило &amp;блокуваннÑ">
+<!ENTITY types.label "ЗаÑтоÑовувати до об’єктів:">
+<!ENTITY shortpattern.warning "Шаблон що ви ввели закороткий Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ñ–Ð·ÑƒÐ²Ð°Ð½Ð½Ñ, багато таких шаблонів можуть уповільнити переглÑд Ñторінок. Рекомендовано обрати довшу Ñтроку Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ фільтра">
+<!ENTITY collapse.yes.label "Так">
+<!ENTITY anchors.label "ЗаÑтоÑувати шаблон лише:">
+<!ENTITY collapse.default.yes.label "Як завжди (так)">
+<!ENTITY domainRestriction.help "Вкажіть один чи більше доменів, розділених Ñимволом „|“, фільтр буде заÑтоÑовано лише на них. Символ „~“ перед іменем домена вказує що фільтр на цей домен не розповÑюджуєтьÑÑ.">
+<!ENTITY accept.label "Додати фільтр">
+<!ENTITY options.label "ÐалаштуваннÑ">
+<!ENTITY disabled.warning "Adblock Plus наразі вимкнений. Ви можете додавати фільтри, але вони не будуть заÑтоÑовуватиÑÑ, доки Ви не [link]увімкнете Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "на &amp;початку імені домена">
+<!ENTITY collapse.no.label "ÐÑ–">
+<!ENTITY selectAllTypes.label "Вибрати вÑе">
+<!ENTITY advanced.label "Розширений виглÑд">
+<!ENTITY pattern.explanation "Шаблон може бути будь-Ñкою чаÑтиною адреÑи, Ñимвол * працює Ñк джокер. Фільтр буде заÑтоÑовано лише до Ð°Ð´Ñ€ÐµÑ Ñ‰Ð¾ відповідають шаблону.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/filters.dtd
new file mode 100644
index 0000000..2d0b05b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Ð’ÑÑ– ваші влаÑні фільтри будуть замінені вміÑтом вибраного файла. Продовжити?">
+<!ENTITY slow.column "Пов&amp;ільні фільтри">
+<!ENTITY enabled.column "У&amp;вімкнено">
+<!ENTITY subscription.lastDownload.checksumMismatch "Помилка, не збіглаÑÑŒ контрольна Ñума">
+<!ENTITY noFiltersInGroup.text "Вибрана група пуÑта.">
+<!ENTITY subscription.actions.label "Дії">
+<!ENTITY filter.selectAll.label "Вибрати вÑÑ–">
+<!ENTITY backupButton.label "&amp;Резервні копії та відновленнÑ">
+<!ENTITY restore.minVersion.warning "Увага: файл було Ñтворено новішою верÑією Adblock Plus.Вам Ñлід оновити Adblock Plus до оÑтанньої верÑÑ–Ñ— перш ніж відновлюватиÑÑŒ з цього файла.">
+<!ENTITY restore.error "Дані з файла неможливо обробити — може, це не Ñ” ÐдблоківÑька резервна копіÑ?">
+<!ENTITY sort.ascending.label "Від &amp;Рдо Я">
+<!ENTITY sort.label "&amp;Сортувати за">
+<!ENTITY subscription.source.label "Перелік фільтрів">
+<!ENTITY hitcount.column "&amp;Попадань">
+<!ENTITY noFilters.text "У Ð²Ð°Ñ Ð¿Ð¾ÐºÐ¸ нема влаÑних фільтрів.">
+<!ENTITY backup.custom.title "Лише влаÑні фільтри">
+<!ENTITY subscription.external.label "Оновлено іншим розширеннÑм">
+<!ENTITY subscription.delete.label "Видалити">
+<!ENTITY noGroupSelected.text "Ви маєте вибрати групу фільтрів до того Ñк Ñ—Ñ— фільтри можна буде показати.">
+<!ENTITY filter.cut.label "Вирізати">
+<!ENTITY restore.default.label "ВідновитиÑÑŒ з резервної копії ?1?">
+<!ENTITY subscription.lastDownload.inProgress "ЗавантажуєтьÑÑ…">
+<!ENTITY subscriptions.tab.label "ПідпиÑки на фільтри">
+<!ENTITY sort.descending.label "Від &amp;Я до Ð">
+<!ENTITY filters.remove.warning "Ви дійÑно хочете вилучити вÑÑ– вибрані фільтри?">
+<!ENTITY filter.delete.label "Вилучити">
+<!ENTITY addSubscriptionAdd.label "Додати">
+<!ENTITY viewMenu.label "ВиглÑд">
+<!ENTITY subscription.lastDownload.unknown "ніколи">
+<!ENTITY addSubscriptionCancel.label "СкаÑувати">
+<!ENTITY subscription.enabled.label "Увімкнено">
+<!ENTITY noSubscriptions.text "Ви поки не додали жодних підпиÑок. Ðдблок не буде блокувати нічого без фільтрів, будь лаÑка ÑкориÑтайтеÑÑŒ пунктом «Додати підпиÑку».">
+<!ENTITY subscription.update.label "Оновити фільтри">
+<!ENTITY dialog.title "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ñ–Ð² Ðдблоку">
+<!ENTITY addFilter.label "&amp;Додати фільтр">
+<!ENTITY subscription.minVersion.warning "Ð¦Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñка фільтрів потребує новішої верÑÑ–Ñ— Adblock Plus. Вам Ñлід оновитиÑÑŒ до оÑтанньої верÑÑ–Ñ— Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Помилка, невірна адреÑа">
+<!ENTITY backup.error "Під Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¸Ñу фільтрів у файл ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. УпевнітьÑÑ, що файл не захищений від запиÑу Ñ– не викориÑтовуєтьÑÑ Ñ–Ð½ÑˆÐ¾ÑŽ програмою.">
+<!ENTITY filter.moveUp.label "ЗÑунути вверх">
+<!ENTITY addGroup.label "Додати &amp;групу фільтрів">
+<!ENTITY filter.edit.label "Редагувати">
+<!ENTITY subscription.showHideFilters.label "Сховати/показати фільтри">
+<!ENTITY acceptableAds2.label "Дозволити деÑку ненав'Ñзливу &amp;рекламу">
+<!ENTITY addSubscriptionOther.label "Додати іншу підпиÑку">
+<!ENTITY close.label "Закрити">
+<!ENTITY sort.none.label "&amp;ÐеÑортовано">
+<!ENTITY filter.actions.label "Дії з фільтрами">
+<!ENTITY filter.copy.label "Копіювати">
+<!ENTITY filter.moveDown.label "ЗÑунути вниз">
+<!ENTITY filter.resetHitCounts.label "Скинути ÑтатиÑтику">
+<!ENTITY readMore.label "Детальніше">
+<!ENTITY subscription.moveUp.label "ЗÑунути вверх">
+<!ENTITY addSubscription.label "Додати &amp;підпиÑку">
+<!ENTITY subscription.homepage.label "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка">
+<!ENTITY backup.complete.title "Ð’ÑÑ– фільтри та підпиÑки">
+<!ENTITY restore.own.label "ВідновитиÑÑŒ з влаÑної резервної копії">
+<!ENTITY restore.complete.warning "Ð’ÑÑ– ваші Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ñ–Ð² будуть замінені вміÑтом вибраного файла. Продовжити?">
+<!ENTITY filters.tab.label "ВлаÑні фільтри">
+<!ENTITY backup.label "Створити нову резервну копію">
+<!ENTITY find.label "З&amp;найти фільтр">
+<!ENTITY subscription.moveDown.label "ЗÑунути вниз">
+<!ENTITY subscription.lastDownload.connectionError "Помилка, неможливо викачати">
+<!ENTITY subscription.lastDownload.success "УÑпіх">
+<!ENTITY subscription.lastDownload.invalidData "Помилка, не правильний ÑпиÑок фільтрів">
+<!ENTITY filter.paste.label "Ð’Ñтавити">
+<!ENTITY subscription.disabledFilters.enable "Увімкнути вимкнені фільтри">
+<!ENTITY lasthit.column "&amp;ОÑтаннє попаданнÑ">
+<!ENTITY subscription.editTitle.label "Редагувати назву">
+<!ENTITY subscription.disabledFilters.warning "ДеÑкі фільтри у цій підпиÑці вимкнено.">
+<!ENTITY filter.column "Правило &amp;фільтруваннÑ">
+<!ENTITY subscription.lastDownload.label "ОÑтаннє оновленнÑ:">
+<!ENTITY viewList.label "ПереглÑд ÑпиÑку">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/firstRun.properties
new file mode 100644
index 0000000..f001239
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=ПереглÑдайте Ñайти анонімно шлÑхом Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ - Ð¿Ñ€Ð¸Ñ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ шлÑху від рекламних компаній, Ñкі хочуть відÑлідковувати кожний ваш крок.
+firstRun_toggle_off=ВИМКÐ
+firstRun_feature_tracking=Ð’Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ÑтеженнÑ
+firstRun_feature_malware=Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÑˆÐºÑ–Ð´Ð»Ð¸Ð²Ð¸Ñ… програм
+firstRun_title=Adblock Plus вже вÑтановлено
+firstRun_toggle_on=УВІМК
+firstRun_acceptableAdsExplanation=Ми хотіли б заохотити веб-Ñайти викориÑтовувати проÑту, ненав'Ñзливу рекламу. ОÑÑŒ чому ми вже Ñтворені <a>Ñуворі керівні принципи</a> Ð´Ð»Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— прийнÑтної реклами, Ñкі відображаютьÑÑ Ñƒ групі типових налаштувань. Якщо потрібно заблокувати кожну рекламу, то ви можете <a>вимкнути</a> це за декілька Ñекунд.
+firstRun_contributor_credits=ВнеÑки учаÑників
+firstRun_dataCorruptionWarning=Ð¦Ñ Ñторінка вÑе ще відображаєтьÑÑ? <a>ÐатиÑніть тут!</a>
+firstRun_acceptableAdsHeadline=Дратівлива реклама буде надалі блокуватиÑÑ
+firstRun_share=Розказати друзÑм
+firstRun_share_headline=<a>Подайте нам руку</a> Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÑ€Ð°Ñ‰Ð¾Ð³Ð¾ Ñередовища у мережі
+firstRun_feature_social_description=Ðвтоматично прибирає кнопки Ñоціальних мереж на кшталт Facebook, Ñкі з'ÑвлÑютьÑÑ Ð½Ð° веб-Ñторінках Ñ– відÑтежують вашу поведінку.
+firstRun_filterlistsReinitializedWarning=ЗдаєтьÑÑ, що помилка призвела до того, що вÑÑ– фільтри були знищені, Ñ– ми не можемо відновити резервну копію. Тому ми Ñкинули фільтри Ñ– Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½ÐµÐ½Ð°Ð²â€™Ñзливої реклами. Будь лаÑка, перевірте ÑпиÑок ваших фільтрів та Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½ÐµÐ½Ð°Ð²â€™Ñзливої реклами <a>Adblock Plus параметри</a>.
+firstRun_feature_malware_description=Убезпечте ваші переглÑд через Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð¼ÐµÐ½Ñ–Ð² відомих зловмиÑних програм.
+firstRun_features=Adblock Plus може зробити більше, ніж Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐºÐ»Ð°Ð¼Ð¸
+firstRun_donate=пожертва
+firstRun_donate_label=Підтримайте наш проект
+firstRun_feature_social=ВидалÑÑ” кнопки Ñоціальних мереж
+firstRun_legacySafariWarning=Ви викориÑтовуєте Ñтару верÑÑ–ÑŽ Safari, Ñка не підтримуєтьÑÑ Adblock Plus. Вона може не працювати належним чином або погіршувати ÑкіÑть роботи кориÑтувача на деÑких веб-Ñайтах. Ми наÑтійно рекомендуємо онвити до Safari 6.1.1 або вище (в OS X 10.8 Mounain Lion), або Safari 7.0.1 або вище (в OS X 10.9 Mavericks), або викориÑтовувати оÑтанню верÑÑ–ÑŽ Mozilla Firefox, Google Chrome або Mozilla.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/global.properties
new file mode 100644
index 0000000..8faed6d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Ðа відкритій Ñторінці немає елементів, Ñкі можна було б заблокувати
+action3_tooltip=Клацніть, щоб увімкнути чи вимкнути Adblock Plus.
+notification_antiadblock_title=Приховати цільові повідомленнÑ?
+type_label_script=Скрипт
+filter_elemhide_nocriteria=Ðе вказаний критерій за Ñким упізнати елемент, що буде приховано.
+blockingGroup_title=Правила блокуваннÑ
+whitelisted_tooltip=Adblock Plus увімкнено, проте не Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ñторінки.
+type_label_stylesheet=Стилі
+blocked_count_tooltip=?1? з ?2?
+type_label_font=шрифт
+type_label_popup=виринаюче вікно
+filter_regexp_tooltip=Цей фільтр або Ñ” регулÑрним виразом, або занадто короткий Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ñ–Ð·Ð°Ñ†Ñ–Ñ—. Забагато фільтрів можуть вповільнити переглÑд Ñторінок
+action0_tooltip=Клацніть, щоб відкрити контекÑтне меню. Ð¡ÐµÑ€ÐµÐ´Ð½Ñ ÐºÐ»Ð°Ð²Ñ–ÑˆÐ° миші — вкл/викл.
+whitelisted_page=Adblock Plus вимкнено Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ñторінки
+remove_group_warning=Ви дійÑно бажаєте видалити цю групу?
+action1_tooltip=Клацніть, щоб відкрити/закрити ÑпиÑок елементів. Ð¡ÐµÑ€ÐµÐ´Ð½Ñ ÐºÐ»Ð°Ð²Ñ–ÑˆÐ° миші — вкл/викл.
+type_label_xmlhttprequest=XML-запит
+active_tooltip=Adblock Plus увімкнено, задіÑно ?1? підпиÑок та ?2? влаÑних фільтрів.
+type_label_document=Документ
+type_label_object_subrequest=Запит об’єкта
+whitelistGroup_title=Правила винÑтків
+disabled_tooltip=Adblock Plus вимкнено.
+filter_elemhide_duplicate_id=Можна вказати лише один ID елемента, що буде приховано.
+type_label_object=Об’єкт
+action2_tooltip=Клацніть, щоб відкрити вікно налаштувань. Ð¡ÐµÑ€ÐµÐ´Ð½Ñ ÐºÐ»Ð°Ð²Ñ–ÑˆÐ° миші — вкл/викл.
+type_label_subdocument=Фрейм
+clearStats_warning=Це Ñкине вÑÑŽ ÑтатиÑтику по фільтрам та вимкне Ñ€Ð°Ñ…ÑƒÐ²Ð°Ð½Ð½Ñ Ñ…Ñ–Ñ‚Ñ–Ð². Продовжити?
+notification_antiadblock_message=Цей Ñайт відомий тим, що показує цільові Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачам Adblock Plus. Ви хочете, щоб Adblock Plus приховав цільові повідомленнÑ?
+blocked_count_addendum=(також відкрито: ?1?, приховано: ?2?)
+subscription_invalid_location=Ðе вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ñ‚Ð¸ введену адреÑу ні Ñк інтернет адреÑу, ні Ñк шлÑÑ… до файлу.
+type_label_image=ЗображеннÑ
+remove_subscription_warning=Ви впевнені, що хочете вилучити цю підпиÑку?
+type_label_other=Інший
+mobile_menu_enable=ABP: Увімкнути
+type_label_media=аудіо/відео
+mobile_menu_disable_site=ABP: Вимкнути на ?1?
+elemhideGroup_title=Правила приховуваннÑ
+mobile_menu_enable_site=ABP: Увімкнути на ?1?
+type_label_elemhide=Приховане
+newGroup_title=Ðова група фільтрів
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/overlay.dtd
new file mode 100644
index 0000000..3928786
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Так">
+<!ENTITY notification.button.no "&amp;ÐÑ–">
+<!ENTITY sync.label "Синхроні&amp;зувати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ðдблоку">
+<!ENTITY whitelist.site.label "Вимкнути: на ?1?">
+<!ENTITY filters.label "&amp;ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ñ–Ð²">
+<!ENTITY disable.label "Вимкнути вÑюди">
+<!ENTITY objecttab.title "Заблокувати">
+<!ENTITY objecttab.tooltip "ÐатиÑніть тут, щоб заблокувати цей об’єкт">
+<!ENTITY menuitem.label "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ &amp;Adblock Plus">
+<!ENTITY objecttabs.label "Показувати &amp;Ñрлик на Flash Ñ– Java">
+<!ENTITY sendReport.label "Повідомити про проблеми на &amp;Ñторінці">
+<!ENTITY whitelist.page.label "Вимкнути: тільки на цій Ñторінці">
+<!ENTITY context.image.label "Adblock Plus: заблокувати зображеннÑ">
+<!ENTITY counthits.label "&amp;Рахувати хіти фільтрів">
+<!ENTITY opensidebar.label "Відкрити Ñ&amp;пиÑок елементів">
+<!ENTITY notification.button.close "&amp;Закрити">
+<!ENTITY contribute.label "Допомогти Ðдблоку">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: заблокувати фрейм">
+<!ENTITY blocked.tooltip "Заблоковані елементи на цій Ñторінці:">
+<!ENTITY hideplaceholders.label "При&amp;ховувати замінники заблокованих елементів">
+<!ENTITY showinstatusbar.label "Показувати в Ñ€Ñдку &amp;Ñтану">
+<!ENTITY sidebar.title "Елементи відкритої Ñторінки">
+<!ENTITY options.label "Ð&amp;алаштуваннÑ">
+<!ENTITY context.object.label "Adblock Plus: заблокувати об’єкт">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Знов увімкнути Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ñторінки">
+<!ENTITY filters.tooltip "Ðайбільш чаÑто заÑтоÑовані фільтри:">
+<!ENTITY closesidebar.label "Закрити Ñ&amp;пиÑок елементів">
+<!ENTITY showintoolbar.label "По&amp;казувати в панелі інÑтрументів">
+<!ENTITY status.tooltip "СтатуÑ:">
+<!ENTITY context.media.label "Adblock Plus: Блокувати аудіо/відео">
+<!ENTITY subscription.update.label "Оновити фільтри">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/sendReport.dtd
new file mode 100644
index 0000000..2f025d7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/sendReport.dtd
@@ -0,0 +1,70 @@
+<!ENTITY screenshot.undo.label "&amp;Повернути">
+<!ENTITY issues.disabledgroups.description "ÐаÑтупні фільтрові підпиÑки/групи вимкнені, але могли вплинути на цю Ñторінку:">
+<!ENTITY showData.label "Показати дані звіту">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus &amp;блокує забагато">
+<!ENTITY issues.change.description "Ваші Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÑƒÐ»Ð¾ змінено. Перегрузіть Ñторінку Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ внеÑених змін та зашліть звіт Ñкщо проблему не вирішено.">
+<!ENTITY email.label "&amp;Електронна пошта:">
+<!ENTITY issues.openPreferences.label "Відкрити фільтрові підпиÑки">
+<!ENTITY sendPage.confirmation "Звіт було запиÑано. Ви можете переглÑнути його за поÑиланнÑм:">
+<!ENTITY copyLink.label "С&amp;копіювати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð²Ñ–Ñ‚Ñƒ">
+<!ENTITY issues.nofilters.description "Adblock Plus не блокує нічого на поточній Ñторінці. Швидше за вÑе проблема, Ñку ви бачите, не пов’Ñзана з Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Проблема про Ñку ви повідомили вже відома. Детальніше:">
+<!ENTITY typeSelector.other.description "Виберіть цей варіант Ñкщо ви підозрюєте проблему Ñаме з Adblock Plus а не з його фільтрами.">
+<!ENTITY issues.disabledgroups.enable.label "Увімкнути фільтрову підпиÑку/групу">
+<!ENTITY typeWarning.override.label "Я &amp;розумію, та вÑе ж хочу надіÑлати звіт">
+<!ENTITY issues.disabled.enable.label "Увімкнути Adblock Plus">
+<!ENTITY update.fixed.description "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð°ÑˆÐ¸Ñ… підпиÑок на фільтри швидше за вÑе вирішило проблему, про Ñку ви хотіли повідомити. Будь лаÑка завантажте заново Ñторінку Ñ– Ñпробуйте ще раз. Якщо проблема залишилаÑÑ, то надішліть Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‰Ðµ раз.">
+<!ENTITY anonymous.label "&amp;Ðнонімне поданнÑ">
+<!ENTITY reloadButton.label "&amp;Перезавантажити Ñторінку">
+<!ENTITY recentReports.clear.label "&amp;Вилучити вÑÑ– звіти">
+<!ENTITY typeSelector.description "Це вікно проведе Ð²Ð°Ñ Ð¿Ð¾ кроках надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð²Ñ–Ñ‚Ñƒ про проблему з Adblock Plus. Спершу, виберіть тип проблеми з Ñкою ви зіткнулиÑÑŒ на цій Ñторінці:">
+<!ENTITY screenshot.remove.label "&amp;Вилучити конфіденційні дані">
+<!ENTITY issues.ownfilters.description "ДеÑкі з заÑтоÑованих фільтрів були задані кориÑтувачем. Вимкніть фільтри що могли Ñпричинити проблему.">
+<!ENTITY update.inProgress.description "Adblock Plus необхідно оновити ваші підпиÑки на фільтри, щоб переконатиÑÑ, що це Ð¿Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð½Ðµ було вирішено вже. Будь лаÑка, зачекайте...">
+<!ENTITY sendPage.retry.label "ÐадіÑлати ще раз">
+<!ENTITY data.label "&amp;Дані звіту:">
+<!ENTITY recentReports.label "Ваші недавно надіÑлані звіти">
+<!ENTITY typeWarning.description "Ви вказали що хочете повідомити про загальну проблему в Adblock Plus, а не в фільтрах. Зауважте, що про такі проблеми найкраще повідомлÑти до [link]форуму Adblock Plus[/link]. МайÑтер звітів Ñлід викориÑтовувати лише додатково до Ñ–Ñнуючої диÑкуÑÑ–Ñ—, оÑкільки ніхто не побачить вашого звіту, Ñкщо не поÑтавити на нього поÑиланнÑ. Ви отримаєте автоматично Ñтворене поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð²Ñ–Ñ‚Ñƒ.">
+<!ENTITY issues.disabled.description "Adblock Plus вимкнено, він не блокуватиме нічого у поточному Ñтані.">
+<!ENTITY attachExtensions.label "Долучити до звіту ÑпиÑок активних &amp;розширень — на випадок Ñкщо причиною проблеми Ñ” конфлікт розширень">
+<!ENTITY issues.nosubscriptions.add.label "Додати підпиÑку на фільтри">
+<!ENTITY issues.disabledfilters.enable.label "Увімкнути фільтр">
+<!ENTITY issues.override.label "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ &amp;правильні, продовжити звіт">
+<!ENTITY issues.nosubscriptions.description "Ви не підпиÑані на жоден з готових ÑпиÑків Ñ„Ñ–Ð»ÑŒÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ‚Ñ€Ñ– автоматично вилучають небажаний вміÑÑ‚ з Ñайтів.">
+<!ENTITY typeSelector.falsePositive.description "Виберіть цей варіант Ñкщо на Ñторінці відÑÑƒÑ‚Ð½Ñ Ñ‡Ð°Ñтина вміÑту, або Ñкщо вона показуєтьÑÑ Ñ‡Ð¸ функціонує неправильно. Ви можете перевірити, чи був Adblock Plus причиною - тимчаÑово його вимкнувши.">
+<!ENTITY typeSelector.other.label "&amp;Інша проблема">
+<!ENTITY emailComment.label "Ми рекомендуємо Вам ввеÑти адреÑу електронної пошти, щоб ми могли зв'ÑзатиÑÑ Ð· вами, Ñкщо виникнуть Ð¿Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· приводу звіту. Це також дозволить нам розпізнати ваші внеÑки та зробити Ñ—Ñ… більш пріоритетними.">
+<!ENTITY issues.whitelist.remove.label "Переувімкнути Adblock Plus на цій Ñторінці">
+<!ENTITY outdatedSubscriptions.description "ÐаÑтупні підпиÑки на фільтри не оновлювалиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ двох тижнів. Будь лаÑка, поновіть ці підпиÑки перед відправленнÑм повідомленнÑ, оÑкільки проблема вже може бути вирішена.">
+<!ENTITY dataCollector.description "Заждіть, Adblock Plus збирає потрібні дані">
+<!ENTITY sendButton.label "&amp;ÐадіÑлати звіт">
+<!ENTITY comment.label "&amp;Коментар (необов’Ñзково):">
+<!ENTITY sendPage.errorMessage "Помилка відправки звіту: «?1?». УпевнітьÑÑ Ñ‰Ð¾ ви під’єднані до інтернету та Ñпробуйте ще раз. Якщо проблема не зникає, будь лаÑка пошукайте допомоги на [link]форумі Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Показати недавно надіÑлані звіти">
+<!ENTITY commentPage.heading "ВвеÑти коментар">
+<!ENTITY update.start.label "Розпочати Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ñ€Ð°Ð·">
+<!ENTITY issues.disabledfilters.description "ÐаÑтупні фільтри вимкнені, але могли вплинути на цю Ñторінку:">
+<!ENTITY screenshot.description "Та Ñама Ñторінка може виглÑдати по різному Ð´Ð»Ñ Ñ€Ñ–Ð·Ð½Ð¸Ñ… людей. Знімок екрана (Ñкріншот) може допомогти нам зрозуміти проблему. Ви можете вилучити конфіденційні чаÑтини, а також позначити облаÑті де приÑÑƒÑ‚Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð°. Щоб це зробити, клацніть по відповідній клавіші та виберіть облаÑть Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ð¸ÑˆÐºÐ¾ÑŽ.">
+<!ENTITY screenshot.attach.label "&amp;Додати Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñторінки до звіту">
+<!ENTITY issues.whitelist.description "Adblock Plus наразі вимкнений на тій Ñторінці про Ñку ви звітуєте. Увімкніть його та перегрузіть Ñторінку перед надÑиланнÑм звіту. Це допоможе в його розглÑді.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus не блокує &amp;рекламу">
+<!ENTITY typeSelector.heading "Виберіть тип проблеми">
+<!ENTITY anonymity.warning "Ми не будемо мати можливіÑть повернутиÑÑ Ð´Ð¾ Ð²Ð°Ñ Ñ–, швидше за вÑе, пріоритети звіту нижчий.">
+<!ENTITY wizard.title "Повідомити про проблему">
+<!ENTITY issues.ownfilters.disable.label "Вимкнути фільтр">
+<!ENTITY commentPage.description "Ðижче ви можете ввеÑти коментар щоб допомогти нам зрозуміти проблему. Цей крок необов’Ñзковий, проте рекомендований коли проблема не очевидна. Ви можете також переглÑнути Ñвій коментар перед надÑиланнÑм.">
+<!ENTITY comment.lengthWarning "Довжина ÐºÐ¾Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÑƒÑ” 1000 Ñимволів. Будуть поÑлані лише перші 1000 Ñимволів.">
+<!ENTITY typeSelector.falseNegative.description "Виберіть цей варіант Ñкщо реклама показуєтьÑÑ Ð¿Ð¾Ð¿Ñ€Ð¸ те що Adblock Plus увімкнено.">
+<!ENTITY sendPage.waitMessage "Заждіть доки Adblock Plus надÑилає ваш звіт.">
+<!ENTITY dataCollector.heading "ЛаÑкаво проÑимо до звітувача про проблеми">
+<!ENTITY screenshot.heading "Додати Ñкріншот">
+<!ENTITY sendPage.heading "ÐадіÑлати звіт">
+<!ENTITY issues.subscriptionCount.description "ЗдаєтьÑÑ, ви підпиÑалиÑÑŒ на забагато фільтрових підпиÑок.
+ Ми не радимо таке робити, оÑкільки можливіÑть отримати проблеми дуже виÑока.
+ Також ми не можемо прийнÑти ваш звіт, оÑкільки незрозуміло,
+ котрому з авторів підпиÑок Ñлід щоÑÑŒ зробити.
+ Вилучте вÑÑ– підпиÑки крім дійÑно необхідних, Ñ– перевірте,
+ чи проблема вÑе ще буде приÑутнÑ.">
+<!ENTITY screenshot.mark.label "По&amp;значити проблему">
+<!ENTITY privacyPolicy.label "Політика приватноÑті">
+<!ENTITY issues.description "Adblock Plus знайшов проблеми у ваших налаштуваннÑÑ… котрі, можливо, Ñпричинили цю проблему, або уÑладнÑть розглÑд звіту.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/sidebar.dtd
new file mode 100644
index 0000000..23725a0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Рамка Ð´Ð»Ñ Flash об'єктів">
+<!ENTITY address.label "ÐдреÑа">
+<!ENTITY context.open.label "Відкрити в новій вкладці">
+<!ENTITY type.label "Тип">
+<!ENTITY tooltip.filterSource.label "Джерело фільтра:">
+<!ENTITY noitems.label "Блокувати нічого">
+<!ENTITY filter.label "Фільтр">
+<!ENTITY tooltip.size.label "Розмір:">
+<!ENTITY reattach.label "Приєднати">
+<!ENTITY search.label "П&amp;ошук:">
+<!ENTITY docDomain.thirdParty "(запит з іншого Ñайта)">
+<!ENTITY filterSource.label "Джерело фільтра">
+<!ENTITY tooltip.docDomain.label "Джерело документа:">
+<!ENTITY context.copy.label "Копіювати адреÑу">
+<!ENTITY tooltip.type.label "Тип:">
+<!ENTITY context.disablefilter.label "Вимкнути фільтр ?1?">
+<!ENTITY context.copyFilter.label "Копіювати фільтр">
+<!ENTITY context.block.label "Заблокувати елемент">
+<!ENTITY context.enablefilter.label "Знов увімкнути фільтр ?1?">
+<!ENTITY detach.label "Від’єднати">
+<!ENTITY whitelisted.label "Дозволений на цій Ñторінці">
+<!ENTITY context.disablefilteronsite.label "Вимкнути цей фільтр на ?1?">
+<!ENTITY detached.title "Adblock Plus: елементи відкритої Ñторінки (від’єднані)">
+<!ENTITY docDomain.firstParty "(запит з того ж Ñайта)">
+<!ENTITY tooltip.type.whitelisted "(дозволений)">
+<!ENTITY tooltip.filter.label "ЗаÑтоÑований фільтр:">
+<!ENTITY tooltip.filter.disabled "(вимкнено)">
+<!ENTITY context.editfilter.label "Відредагувати заÑтоÑований фільтр">
+<!ENTITY tooltip.type.blocked "(заблокований)">
+<!ENTITY size.label "Розмір">
+<!ENTITY context.whitelist.label "Вказати елемент Ñк винÑток">
+<!ENTITY context.selectAll.label "Вибрати вÑе">
+<!ENTITY state.label "СтатуÑ">
+<!ENTITY docDomain.label "Джерело документа">
+<!ENTITY tooltip.address.label "ÐдреÑа:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/subscriptionSelection.dtd
new file mode 100644
index 0000000..2b0d2c5
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "&amp;Додати також підпиÑку на фільтер «?1?»">
+<!ENTITY list.download.failed "Adblock Plus не зміг отримати перелік підпиÑок">
+<!ENTITY list.download.retry "Спробувати ще раз">
+<!ENTITY title.label "&amp;Ðазва підпиÑки:">
+<!ENTITY list.download.website "ПереглÑнути Ñайт">
+<!ENTITY supplementMessage "Ð¦Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð¾Ð²Ð° підпиÑка призначена Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð² парі з фільтровою підпиÑкою «?1?», котру ви наразі не викориÑтовуєте.">
+<!ENTITY viewList.label "ПереглÑнути фільтри">
+<!ENTITY visitHomepage.label "Відвідати домашню Ñторінку">
+<!ENTITY addSubscription.label "Додати підпиÑку">
+<!ENTITY dialog.title "Додати підпиÑку на фільтр Adblock Plus">
+<!ENTITY location.label "Розташ&amp;ÑƒÐ²Ð°Ð½Ð½Ñ ÑпиÑку з фільтром:">
+<!ENTITY fromWeb.description "Будь лаÑка підтвердіть що ви бажаєте додати цю фільтрову підпиÑку. Ви можете змінити назву чи Ð·Ð½Ð°Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ додаваннÑм.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/composer.dtd
new file mode 100644
index 0000000..71d2903
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "ở cuố&amp;i địa chỉ">
+<!ENTITY domainRestriction.label "Giá»›i hạn t&amp;rên miá»n:">
+<!ENTITY collapse.default.no.label "Dùng mặc định (không)">
+<!ENTITY firstParty.label "Chỉ của bê&amp;n thứ nhất">
+<!ENTITY preferences.label "&amp;Hiện các bá»™ lá»c Ä‘ang có...">
+<!ENTITY pattern.label "Tìm mẫu">
+<!ENTITY thirdParty.label "Chỉ củ&amp;a bên thứ ba">
+<!ENTITY filter.label "Bá»™ &amp;lá»c má»›i:">
+<!ENTITY collapse.label "&amp;Thu gá»n những mục bị chặn:">
+<!ENTITY match.warning "Mẫu mà bạn Ä‘iá»n vào không còn khá»›p vá»›i địa chỉ cần được chặn/đưa vào danh sách trắng và sẽ không có ảnh hưởng đến nó.">
+<!ENTITY anchor.start.label "ở đầ&amp;u địa chỉ">
+<!ENTITY matchCase.label "&amp;Phân biệt HOA thưá»ng">
+<!ENTITY custom.pattern.label "Tù&amp;y biến:">
+<!ENTITY unselectAllTypes.label "Không chá»n">
+<!ENTITY type.whitelist.label "&amp;Quy luật ngoại lệ">
+<!ENTITY regexp.warning "Mẫu bạn gõ vào sẽ được xem là biểu thức quy tắc. Nhiá»u biểu thức quy tắc có thể làm chậm việc duyệt web cá»§a bạn. Nếu bạn không định dùng biểu thức quy tắc, hãy thêm má»™t biểu tượng * ở cuối mẫu.">
+<!ENTITY dialog.title "Thêm quy tắc lá»c cho Adblock Plus">
+<!ENTITY basic.label "Hiển thị cơ bản">
+<!ENTITY type.filter.label "Bá»™ lá»c chặn">
+<!ENTITY types.label "Ãp dụng cho các kiểu:">
+<!ENTITY shortpattern.warning "Mẫu bạn gõ vào quá ngắn để tối ưu hóa, nhiá»u mẫu như vậy có thể làm chậm việc duyệt web cá»§a bạn. Lá»i khuyên là bạn hãy chá»n má»™t chuá»—i dài hÆ¡n cho bá»™ lá»c này.">
+<!ENTITY collapse.yes.label "Có">
+<!ENTITY anchors.label "Chỉ chấp nhận mẫu:">
+<!ENTITY collapse.default.yes.label "Dùng mặc định (có)">
+<!ENTITY domainRestriction.help "Chá»n má»™t hay nhiá»u tên miá»n ngăn cách bằng dấu &quot;|&quot;, bá»™ lá»c sẽ chỉ được áp dụng trên những tên miá»n này. Dấu &quot;~&quot; trước má»™t tên miá»n có nghÄ©a là bá»™ lá»c sẽ không được áp dụng cho tên miá»n đó.">
+<!ENTITY accept.label "Thêm bá»™ lá»c">
+<!ENTITY options.label "Tùy chá»n">
+<!ENTITY disabled.warning "Adblock Plus hiện Ä‘ang bị vô hiệu hóa. Bạn vẫn có thể thêm các bá»™ lá»c nhưng chúng sẽ không được áp dụng trừ khi bạn [link]kích hoạt Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "ở đầ&amp;u tên miá»n">
+<!ENTITY collapse.no.label "Không">
+<!ENTITY selectAllTypes.label "Chá»n tất cả">
+<!ENTITY advanced.label "Hiển thị nâng cao">
+<!ENTITY pattern.explanation "Mẫu có thể là bất kì phần nào cá»§a địa chỉ, biểu tượng * được dùng như má»™t mặt nạ. Bá»™ lá»c sẽ chỉ được áp dụng cho những địa chỉ phù hợp vá»›i mẫu.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/filters.dtd
new file mode 100644
index 0000000..409f4a2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Tất cả bá»™ lá»c tùy biến cá»§a bạn sẽ được thay thế bởi ná»™i dung cá»§a tập tin được chá»n. Bạn có muốn thá»±c hiện?">
+<!ENTITY slow.column "&amp;Bá»™ lá»c chậm">
+<!ENTITY enabled.column "&amp;Bật">
+<!ENTITY subscription.lastDownload.checksumMismatch "Thất bại, mã băm không phù hợp">
+<!ENTITY noFiltersInGroup.text "Nhóm được chá»n trống.">
+<!ENTITY subscription.actions.label "Hành động">
+<!ENTITY filter.selectAll.label "Chá»n tất cả">
+<!ENTITY backupButton.label "&amp;Sao lưu và phục hồi">
+<!ENTITY restore.minVersion.warning "Cảnh báo: tập tin đã được tạo bởi phiên bản Adblock Plus mới hơn. Bạn cần cập nhập lên phiên bản mới nhất của Adblock Plus trước khi có thể khôi phục từ tập tin này.">
+<!ENTITY restore.error "Dữ liệu của tập tin có thể không được xử lý, có lẽ đây không phải là một tập tin sao lưu của Adblock Plus?">
+<!ENTITY sort.ascending.label "Sắp xếp theo thứ tự &amp;A &gt; Z">
+<!ENTITY sort.label "Sắp &amp;xếp theo">
+<!ENTITY subscription.source.label "Danh sách bá»™ lá»c">
+<!ENTITY hitcount.column "&amp;Số lần bấm">
+<!ENTITY noFilters.text "Bạn chưa có bá»™ lá»c tùy biến nào.">
+<!ENTITY backup.custom.title "Chỉ bá»™ lá»c tùy biến">
+<!ENTITY subscription.external.label "ÄÆ°á»£c cập nhập bởi ứng dụng khác">
+<!ENTITY subscription.delete.label "Xóa">
+<!ENTITY noGroupSelected.text "Bạn cần chá»n nhóm cho bá»™ lá»c trước khi nó được hiển thị">
+<!ENTITY filter.cut.label "Cắt">
+<!ENTITY restore.default.label "Khôi phục từ ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Äang tải...">
+<!ENTITY subscriptions.tab.label "Äăng ký bá»™ lá»c">
+<!ENTITY sort.descending.label "Sắp xếp theo thứ tự &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Bạn có thá»±c sá»± muốn loại bá» tất cả những bá»™ lá»c được chá»n?">
+<!ENTITY filter.delete.label "Xóa">
+<!ENTITY addSubscriptionAdd.label "Thêm">
+<!ENTITY viewMenu.label "Hiển thị">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY addSubscriptionCancel.label "Há»§y">
+<!ENTITY subscription.enabled.label "Äã được bật">
+<!ENTITY noSubscriptions.text "Bạn chưa chá»n bất kì bá»™ lá»c nào ! AdBlock Plus không thể hoạt động nếu không có má»™t bá»™ lá»c, xin hãy sá»­ dụng &quot;Äăng ký bá»™ lá»c&quot; để thêm bá»™ lá»c cho mình .">
+<!ENTITY subscription.update.label "Cập nhập bá»™ lá»c">
+<!ENTITY dialog.title "Tùy chá»n bá»™ lá»c AdBlock Plus">
+<!ENTITY addFilter.label "&amp;Thêm bá»™ lá»c">
+<!ENTITY subscription.minVersion.warning "Bá»™ lá»c này cần có phiên bản Adblock Plus má»›i hÆ¡n, bạn cần phải cập nhập lên phiên bản má»›i nhất cá»§a AdBlock Plus .">
+<!ENTITY subscription.lastDownload.invalidURL "Thất bại, không phải là địa chỉ hợp lệ">
+<!ENTITY backup.error "Có vấn đỠkhi ghi bá»™ lá»c vào tập tin. Hãy chắc chắn rằng tập tin không bị bảo vệ ghi hoặc bị sá»­ dụng bởi má»™t ứng dụng khác.">
+<!ENTITY filter.moveUp.label "Di chuyển lên">
+<!ENTITY addGroup.label "Thêm &amp;nhóm bá»™ lá»c">
+<!ENTITY filter.edit.label "Chỉnh sửa">
+<!ENTITY subscription.showHideFilters.label "Hiện/ẩn bá»™ lá»c">
+<!ENTITY acceptableAds2.label "Cho phép một số quảng cáo không gây hại">
+<!ENTITY addSubscriptionOther.label "Thêm bá»™ lá»c khác">
+<!ENTITY close.label "Äóng">
+<!ENTITY sort.none.label "&amp;Chưa sắp xếp">
+<!ENTITY filter.actions.label "Hành động cho bá»™ lá»c">
+<!ENTITY filter.copy.label "Chép">
+<!ENTITY filter.moveDown.label "Di chuyển xuống">
+<!ENTITY filter.resetHitCounts.label "Cài lại thống kê lượt bấm">
+<!ENTITY readMore.label "Äá»c thêm">
+<!ENTITY subscription.moveUp.label "Chuyển lên trên">
+<!ENTITY addSubscription.label "Thêm bá»™ lá»c">
+<!ENTITY subscription.homepage.label "Trang chá»§">
+<!ENTITY backup.complete.title "Tất cả các bá»™ lá»c và mục đăng ký">
+<!ENTITY restore.own.label "Khôi phục riêng">
+<!ENTITY restore.complete.warning "Tất cả tùy chỉnh bá»™ lá»c cá»§a bạn sẽ được thay thế bởi ná»™i dung cá»§a tập tin được chá»n. Bạn có muốn thá»±c hiện?">
+<!ENTITY filters.tab.label "Bá»™ lá»c tùy biến">
+<!ENTITY backup.label "Tạo sao lưu mới">
+<!ENTITY find.label "&amp;Tìm">
+<!ENTITY subscription.moveDown.label "Chuyển xuống dưới">
+<!ENTITY subscription.lastDownload.connectionError "Thất bại, tải xuống thất bại">
+<!ENTITY subscription.lastDownload.success "Hoàn thành">
+<!ENTITY subscription.lastDownload.invalidData "Thất bại, đây không phải là danh sách bá»™ lá»c hợp lệ">
+<!ENTITY filter.paste.label "Dán">
+<!ENTITY subscription.disabledFilters.enable "Bật bá»™ lá»c đã bị vô hiệu hóa">
+<!ENTITY lasthit.column "Lần bấm cuối">
+<!ENTITY subscription.editTitle.label "Sá»­a tiêu Ä‘á»">
+<!ENTITY subscription.disabledFilters.warning "Má»™t vài phần tá»­ trong bá»™ lá»c này đã bị vô hiệu hóa .">
+<!ENTITY filter.column "&amp;Quy luật lá»c">
+<!ENTITY subscription.lastDownload.label "Lần tải cuối:">
+<!ENTITY viewList.label "Xem danh sách">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/firstRun.properties
new file mode 100644
index 0000000..74e60dc
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Duyệt riêng tư bằng cách vô hiệu theo dõi - ẩn theo dõi của bạn từ các công ty quảng cáo theo dõi từng bước của bạn.
+firstRun_toggle_off=TẮT
+firstRun_feature_tracking=Vô hiệu hóa theo dõi
+firstRun_feature_malware=Chặn phần má»m độc hại
+firstRun_title=Adblock Plus đã được cài đặt
+firstRun_acceptableAdsExplanation=Chúng tôi khuyến khích các trang mạng dùng những quảng cáo minh bạch, không phiá»n nhiá»…u. Äó là lí do tại sao chúng tôi gây dá»±ng <a>hướng dẫn chặt chẽ</a> để xác định các quảng cáo được chấp nhận, hiện dưới mức thiết lập mặc định. Nếu bạn vẫn muốn chặn má»i quảng cáo, bạn có thể <a>vô hiệu</a> Ä‘iá»u này trong má»™t vài giây.
+firstRun_toggle_on=BẬT
+firstRun_contributor_credits=Äóng góp các khoản tín dụng
+firstRun_dataCorruptionWarning=Có phải trang này luôn hiển thị? <a>Bấm vào đây</a>
+firstRun_acceptableAdsHeadline=Những quảng cáo phiá»n phức sẽ bị chặn
+firstRun_share=Nói với bạn bè của bạn
+firstRun_share_headline=<a>Giúp chúng tôi một tay</a> trong việc làm trang mạng trở nên tốt hơn
+firstRun_features=Adblock Plus có thể làm nhiá»u hÆ¡n là chặn quảng cáo
+firstRun_feature_malware_description=Làm cho trình duyệt an toàn hÆ¡n bằng cách chặn các tên miá»n chứa phần má»m độc hại.
+firstRun_feature_social_description=Tá»± động loại bá» lịch duyệt cá»§a các nút truyá»n thông mạng xã há»™i, như là nút Thích Facebook, xuất hiện trên trang mạng và theo dõi hành vi cá»§a bạn.
+firstRun_donate=á»§ng há»™
+firstRun_donate_label=Hỗ trợ dự án của chúng tôi
+firstRun_feature_social=Loại bỠcác nút bấm Phương tiện Mạng xã hội
+firstRun_legacySafariWarning=Bạn Ä‘ang dùng má»™t phiên bản cÅ© cá»§a Safari không được há»— trợ bởi Adblock Plus. Nó có thể không hoạt động chính xác hoặc làm giảm trải nghiệm cá»§a ngưá»i dùng trên má»™t số trang mạng. Chúng tôi rất khuyến khích cập nhật lên Safari 6.1.1 hoặc cao hÆ¡n (trên OS X 10.8 Mountain Lion), hoặc Safari 7.0.1 hoặc cao hÆ¡n (trên OS X 10.9 Mavericks), hoặc dùng phiên bản má»›i nhất cá»§a Mozilla Firefox, Google Chrome hoặc Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/global.properties
new file mode 100644
index 0000000..39cabf8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Không có mục nào trong trang hiện tại có thể chặn được
+action3_tooltip=Nhấn để bật/tắt Adblock Plus.
+notification_antiadblock_title=Ẩn tin nhắn mục tiêu?
+type_label_script=văn lệnh
+filter_elemhide_nocriteria=Không có chuẩn để nhận diện các phần tử bị ẩn
+blockingGroup_title=Quy tắc chặn quảng cáo
+whitelisted_tooltip=Adblock Plus bị vô hiệu ở trang hiện tại.
+type_label_stylesheet=stylesheet
+blocked_count_tooltip=?1? trong ?2?
+type_label_font=phông
+type_label_popup=cửa sổ bật lên
+filter_regexp_tooltip=Bá»™ lá»c này là má»™t biểu thức chính quy hoặc là do quá ngắn nên không tối ưu hóa được. Quá nhiá»u bá»™ lá»c như thế này có thể làm chậm việc duyệt cá»§a bạn.
+action0_tooltip=Nhấn chuột trái để hiển thị trình đơn ngữ cảnh, nhấn chuột giữa để bật/tắt.
+whitelisted_page=Adblock Plus đã bị vô hiệu hóa cho trang hiện tại
+remove_group_warning=Bạn có thật sự muốn loại bỠnhóm này?
+action1_tooltip=Nhấn chuột trái để mở/đóng các mục có thể chặn được, nhấn chuột giữa để bật/tắt.
+type_label_xmlhttprequest=yêu cầu XML
+active_tooltip=Adblock Plus đã kích hoạt, ?1? bá»™ lá»c trá»n gói và ?2? bá»™ lá»c tùy biến Ä‘ang được dùng.
+type_label_document=tài liệu
+type_label_object_subrequest=yêu cầu con đối tượng
+whitelistGroup_title=Quy tắc ngoại lệ
+disabled_tooltip=Adblock Plus đã bị vô hiệu.
+filter_elemhide_duplicate_id=Chỉ có thể xác định một ID của phần tử bị ẩn
+type_label_object=đối tượng
+action2_tooltip=Nhấn chuá»™t trái để mở tùy chá»n, nhấn chuá»™t giữa để bật/tắt.
+type_label_subdocument=khung
+clearStats_warning=Äiá»u này sẽ thiết lập lại toàn bá»™ thông số lượt bấm và vô hiệu đếm lượt bấm. Bạn có muốn thá»±c hiện?
+notification_antiadblock_message=Trang này đã được biết là hiện tin nhắn mục tiêu cho ngưá»i dùng Adblock Plus. Bạn có muốn Adblock Plus ẩn tin nhắn mục tiêu?
+blocked_count_addendum=(trong danh sách trắng: ?1?, bị ẩn: ?2?)
+subscription_invalid_location=Äịa chỉ để tải bá»™ lá»c không phải là má»™t URL hay tên tập tin hợp lệ.
+type_label_image=ảnh
+remove_subscription_warning=Bạn có thật sá»± muốn xóa bá»™ trá»n gói này không?
+type_label_other=khác
+mobile_menu_enable=ABP: Bật
+type_label_media=tiếng/phim
+mobile_menu_disable_site=ABP: Vô hiệu trên ?1?
+elemhideGroup_title=Quy tắc ẩn phần tử
+mobile_menu_enable_site=ABP: Kích hoạt trên ?1?
+type_label_elemhide=ẩn
+newGroup_title=Nhóm lá»c má»›i
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/overlay.dtd
new file mode 100644
index 0000000..71de231
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Có">
+<!ENTITY notification.button.no "&amp;Không">
+<!ENTITY sync.label "Äồng bá»™ thiết lập Adbl&amp;ock Plus">
+<!ENTITY whitelist.site.label "Vô hiệu hóa trên ?1?">
+<!ENTITY filters.label "&amp;Tùy chỉnh bá»™ lá»c">
+<!ENTITY disable.label "Vô hiệu hóa ở má»i nÆ¡i">
+<!ENTITY objecttab.title "Chặn">
+<!ENTITY objecttab.tooltip "Nhấn vào đây để chặn đối tượng này với Adblock Plus">
+<!ENTITY menuitem.label "Tùy chá»n Adblock &amp;Plus">
+<!ENTITY objecttabs.label "Hiện thẻ trên Flash và Java">
+<!ENTITY sendReport.label "&amp;Báo cáo vấn đỠtrên trang này">
+<!ENTITY whitelist.page.label "Chỉ vô hiệu hóa trên trang này">
+<!ENTITY context.image.label "Adblock Plus: Chặn Ảnh">
+<!ENTITY counthits.label "Äếm lượt &amp;bấm bá»™ lá»c">
+<!ENTITY opensidebar.label "&amp;Mở các mục có thể chặn được">
+<!ENTITY notification.button.close "Äó&amp;ng">
+<!ENTITY contribute.label "Äóng góp cho Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Chặn Khung">
+<!ENTITY blocked.tooltip "Các mục bị chặn trong trang này:">
+<!ENTITY hideplaceholders.label "Ẩn &amp;chỗ giữ các yếu tố bị chặn">
+<!ENTITY showinstatusbar.label "Hiện t&amp;rong thanh trạng thái">
+<!ENTITY sidebar.title "Các mục bị chặn trên trang hiện tại">
+<!ENTITY options.label "Tù&amp;y chá»n">
+<!ENTITY context.object.label "Adblock Plus: Chặn Äối Tượng">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Kích Hoạt Lại trên Trang Này">
+<!ENTITY filters.tooltip "Các bá»™ lá»c có hiệu lá»±c nhất:">
+<!ENTITY closesidebar.label "Äóng các &amp;mục có thể chặn được">
+<!ENTITY showintoolbar.label "Hiện trong thanh &amp;công cụ">
+<!ENTITY status.tooltip "Trạng thái:">
+<!ENTITY context.media.label "Adblock Plus: Chặn nhạc/phim">
+<!ENTITY subscription.update.label "Cập nhập bá»™ lá»c">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/sendReport.dtd
new file mode 100644
index 0000000..d6b50b7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Hoàn tác">
+<!ENTITY issues.disabledgroups.description "Bá»™ lá»c trá»n gói/nhóm bá»™ lá»c sau đã bị vô hiệu hóa, song chúng có thể vẫn gây ảnh hưởng tá»›i trang này:">
+<!ENTITY showData.label "Hiện dữ liệu báo cáo">
+<!ENTITY typeSelector.falsePositive.label "&amp;Adblock Plus chặn quá nhiá»u">
+<!ENTITY issues.change.description "Cấu hình cá»§a bạn đã được thay đổi. Vui lòng tải lại trang để kiểm tra thay đổi và gá»­i lên má»™t báo cáo nếu vấn đỠvẫn chưa được giải quyết sau sá»± Ä‘iá»u chỉnh.">
+<!ENTITY email.label "Äịa chỉ&amp;mail:">
+<!ENTITY issues.openPreferences.label "Mở tùy chỉnh bá»™ lá»c">
+<!ENTITY sendPage.confirmation "Báo cáo của bạn đã được lưu. Bạn có thể truy cập nó tại địa chỉ sau:">
+<!ENTITY copyLink.label "Chép liên kết báo cáo">
+<!ENTITY issues.nofilters.description "Adblock Plus đang không chặn bất kì thứ gì trên trang hiện tại. Vấn đỠmà bạn theo dõi có vẻ như không liên quan tới Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Vấn đỠmà bạn báo cáo có thể đã được biết. Thông tin thêm:">
+<!ENTITY typeSelector.other.description "Chá»n tùy chá»n này nếu bạn nghi ngá» má»™t vấn đỠvá»›i bản thân Adblock Plus hÆ¡n là do bá»™ lá»c cá»§a nó.">
+<!ENTITY issues.disabledgroups.enable.label "Kích hoạt bá»™ lá»c trá»n gói/nhóm bá»™ lá»c">
+<!ENTITY typeWarning.override.label "Tôi hiể&amp;u và vẫn muốn gửi báo cáo">
+<!ENTITY issues.disabled.enable.label "Kích hoạt Adblock Plus">
+<!ENTITY update.fixed.description "Bản cập nhập đến bá»™ lá»c cá»§a bạn có vẻ như đã sá»­a được lá»—i mà bạn Ä‘ang thông báo. Vui lòng tải lại trang và thá»­ lại, nhấn Báo cáo lá»—i lần nữa nếu vấn đỠvẫn còn tiếp diá»…n.">
+<!ENTITY anonymous.label "&amp;Gửi thông tin ẩn danh">
+<!ENTITY reloadButton.label "Tải lại tr&amp;ang">
+<!ENTITY recentReports.clear.label "&amp;Xóa tất cả báo cáo">
+<!ENTITY typeSelector.description "Cá»­a sổ này sẽ hướng dẫn bạn qua các bước cần thiết cho việc gá»­i lên má»™t báo cáo vấn đỠcá»§a Adblock Plus. Trước tiên, hãy chá»n kiểu vấn đỠmà bạn Ä‘ang gặp trên trang này:">
+<!ENTITY screenshot.remove.label "Xóa dữ liệu nhạ&amp;y cảm">
+<!ENTITY issues.ownfilters.description "Má»™t số bá»™ lá»c áp dụng trên trang này do ngưá»i dùng tá»± tạo ra. Vui lòng vô hiệu hóa các bá»™ lá»c có thể đã gây ra vấn đỠnày:">
+<!ENTITY update.inProgress.description "Adblock Plus cần phải cập nhập bá»™ lá»c quảng cáo để chắc chắn rằng vấn đỠchưa được giải quyết. Xin chá»...">
+<!ENTITY sendPage.retry.label "Gửi lại">
+<!ENTITY data.label "&amp;Dữ liệu báo cáo:">
+<!ENTITY recentReports.label "Các báo cáo được gửi lên gần đây của bạn">
+<!ENTITY typeWarning.description "Bạn cho biết rằng bạn muốn báo cáo má»™t vấn đỠthông thưá»ng cá»§a Adblock Plus chứ không phải là bá»™ lá»c. Vui lòng lưu ý rằng các vấn đỠđó tốt hÆ¡n nên được báo cáo trong [link]diá»…n đàn Adblock Plus[/link]. Bạn chỉ nên dùng trình báo cáo vấn đỠđể bổ sung các thảo luận Ä‘ang mở, vì không ai chú ý tá»›i báo cáo cá»§a bạn trừ khi bạn cung cấp cho há» má»™t liên kết tá»›i nó. Liên kết được tá»± động tạo ra sẽ được cung cấp sau khi gá»­i lên báo cáo.">
+<!ENTITY issues.disabled.description "Adblock Plus đang bị tắt, nó sẽ không chặn bất kì thứ gì trong tình trạng hiện tại.">
+<!ENTITY attachExtensions.label "Äính kèm danh sách các phần mở rá»™ng Ä‘ang dùng vào báo cáo trong trưá»ng hợp xung đột tiện ích là nguyên nhân cá»§a vấn Ä‘á»">
+<!ENTITY issues.nosubscriptions.add.label "Thêm bá»™ lá»c trá»n gói">
+<!ENTITY issues.disabledfilters.enable.label "Kích hoạt bá»™ lá»c">
+<!ENTITY issues.override.label "&amp;Cấu hình này đúng rồi, hãy tiếp tục báo cáo">
+<!ENTITY issues.nosubscriptions.description "Có vẻ như bạn không đăng kí dùng bất kì danh sách bá»™ lá»c tạo sẵn nào.">
+<!ENTITY typeSelector.falsePositive.description "Chá»n tùy chá»n này nếu trang thiếu ná»™i dung quan trá»ng, hiển thị không chính xác hoặc không vận hành đúng. Bạn có thể xác định xem Adblock Plus có phải là nguyên nhân không bằng cách tạm thá»i vô hiệu hóa nó.">
+<!ENTITY typeSelector.other.label "&amp;Vấn đỠkhác">
+<!ENTITY emailComment.label "Chúng tôi khuyến khích bạn nhập địa chỉ email hợp lệ để chúng tôi tiện liên lạc nếu chúng tôi cần gì từ thông báo cá»§a bạn. Äồng thá»i, nó cÅ©ng giúp chúng tôi có thể ghi nhận công lao đóng góp cá»§a bạn .">
+<!ENTITY issues.whitelist.remove.label "Bật lại Adblock Plus trên trang này">
+<!ENTITY outdatedSubscriptions.description "Bá»™ lá»c sau đã không được cập nhập từ hai tuần trước. Vui lòng cập nhập bá»™ lá»c trước khi gá»­i thông báo lá»—i, có thể vấn đỠđã được giải quyết từ trước.">
+<!ENTITY dataCollector.description "Vui lòng đợi một lát trong khi Adblock Plus thu thập dữ liệu cần thiết.">
+<!ENTITY sendButton.label "&amp;Gửi báo cáo">
+<!ENTITY comment.label "&amp;Bình luận (phụ):">
+<!ENTITY sendPage.errorMessage "Một nỗ lực gửi báo cáo bị thất bại với mã lỗi &quot;?1?&quot;. Vui lòng chắc chắn rằng bạn đã được kết nối Internet rồi thử lại. Nếu vấn đỠvẫn còn, vui lòng yêu cầu trợ giúp trên [link]diễn đàn Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Hiện các báo cáo được gửi lên gần đây">
+<!ENTITY commentPage.heading "Äiá»n bình luận">
+<!ENTITY update.start.label "Bắt đầu cập nhập ngay">
+<!ENTITY issues.disabledfilters.description "Các bá»™ lá»c sau đã bị vô hiệu hóa, song chúng có thể vẫn gây ảnh hưởng tá»›i trang này:">
+<!ENTITY screenshot.description "Cùng má»™t trang có thể trông khác đối vá»›i nhiá»u ngưá»i khác nhau. Chúng tôi có thể hiểu vấn đỠhÆ¡n nếu bạn đính kèm má»™t ảnh chụp màn hình vào báo cáo. Bạn có thể xóa các phần chứa thông tin nhạy cảm cÅ©ng như đánh dấu các vùng dá»… nhận thấy vấn Ä‘á». Äể làm việc đó, nhấn chuá»™t vào nút liên quan và chá»n vùng hình ảnh bằng chuá»™t cá»§a bạn.">
+<!ENTITY screenshot.attach.label "Äính &amp;kèm ảnh chụp trang vào báo cáo">
+<!ENTITY issues.whitelist.description "Adblock Plus hiện đang bị tắt trên trang mà bạn báo cáo. Vui lòng bật nó lại và tải lại trang trước khi gửi báo cáo.">
+<!ENTITY typeSelector.falseNegative.label "Adbloc&amp;k Plus không chặn một quảng cáo">
+<!ENTITY typeSelector.heading "Chá»n kiểu vấn Ä‘á»">
+<!ENTITY anonymity.warning "Chúng tôi không thể trở lại với bạn và sẽ hạ mức ưu tiên của báo cáo của bạn.">
+<!ENTITY wizard.title "Trình báo cáo lỗi">
+<!ENTITY issues.ownfilters.disable.label "Vô hiệu hóa bá»™ lá»c">
+<!ENTITY commentPage.description "Trưá»ng văn bản bên dưới cho phép bạn Ä‘iá»n bình luận để giúp chúng tôi hiểu vấn Ä‘á». Bước này chỉ là phụ nhưng được khuyến khích nếu vấn đỠkhông rõ ràng. Bạn cÅ©ng có thể xem lại dữ liệu báo cáo trước khi gá»­i.">
+<!ENTITY comment.lengthWarning "Äá»™ dài bình luận cá»§a bạn vượt qua 1000 kí tá»±. Chỉ 1000 kí tá»± đầu tiên sẽ được gá»­i Ä‘i.">
+<!ENTITY typeSelector.falseNegative.description "Chá»n tùy chá»n này nếu má»™t quảng cáo vẫn hiển thị cho dù Adblock Plus Ä‘ang được bật.">
+<!ENTITY sendPage.waitMessage "Vui lòng đợi trong khi Adblock Plus đang gửi lên báo cáo của bạn.">
+<!ENTITY dataCollector.heading "Chào mừng đến vá»›i trình báo cáo vấn Ä‘á»">
+<!ENTITY screenshot.heading "Äính kèm ảnh chụp">
+<!ENTITY sendPage.heading "Gửi báo cáo">
+<!ENTITY issues.subscriptionCount.description "Có vẻ như bạn đăng kí dùng quá nhiá»u bá»™ lá»c trá»n gói. Thiết lập này không được khuyến khích vì nó làm khả năng xảy ra vấn đỠcao hÆ¡n. Chúng tôi cÅ©ng không thể chấp nhận báo cáo vấn đỠcá»§a bạn vì không cho thấy rõ tác giả bá»™ lá»c trá»n gói nào cần hành động. Vui lòng xóa tất cả và để lại các bá»™ lá»c trá»n gói cần thiết rồi kiểm tra thá»­ xem vấn đỠcòn không.">
+<!ENTITY screenshot.mark.label "Äánh dấ&amp;u vấn Ä‘á»">
+<!ENTITY privacyPolicy.label "Chính sách riêng tư">
+<!ENTITY issues.description "Adblock Plus nhận thấy vấn đỠvá»›i cấu hình cá»§a bạn, Ä‘iá»u có thể chịu trách nhiệm cho vấn đỠhoặc làm cho việc kiểm tra báo cáo khó khăn hÆ¡n.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/sidebar.dtd
new file mode 100644
index 0000000..02208a2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Nhấp nháy quanh viá»n cá»§a mục này">
+<!ENTITY address.label "Äịa chỉ">
+<!ENTITY context.open.label "Mở trong Thẻ Mới">
+<!ENTITY type.label "Kiểu">
+<!ENTITY tooltip.filterSource.label "Nguồn bá»™ lá»c:">
+<!ENTITY noitems.label "Không có mục nào có thể chặn được">
+<!ENTITY filter.label "Bá»™ lá»c">
+<!ENTITY tooltip.size.label "Kích thước:">
+<!ENTITY reattach.label "Äính lại">
+<!ENTITY search.label "Tì&amp;m:">
+<!ENTITY docDomain.thirdParty "(bên thứ ba)">
+<!ENTITY filterSource.label "Nguồn bá»™ lá»c">
+<!ENTITY tooltip.docDomain.label "Nguồn tài liệu:">
+<!ENTITY context.copy.label "Chép địa chỉ của mục này">
+<!ENTITY tooltip.type.label "Kiểu:">
+<!ENTITY context.disablefilter.label "Vô hiệu hóa bá»™ lá»c ?1?">
+<!ENTITY context.copyFilter.label "Chép bá»™ lá»c">
+<!ENTITY context.block.label "Chặn mục này">
+<!ENTITY context.enablefilter.label "Kích hoạt lại bá»™ lá»c ?1?">
+<!ENTITY detach.label "Tách rá»i">
+<!ENTITY whitelisted.label "Trang nằm trong sổ trắng">
+<!ENTITY context.disablefilteronsite.label "Vô hiệu hóa bá»™ lá»c này trên ?1?">
+<!ENTITY detached.title "Adblock Plus: các mục có thể chặn (tách rá»i)">
+<!ENTITY docDomain.firstParty "(bên thứ nhất)">
+<!ENTITY tooltip.type.whitelisted "(sổ trắng)">
+<!ENTITY tooltip.filter.label "Bá»™ lá»c Ä‘ang có hiệu lá»±c:">
+<!ENTITY tooltip.filter.disabled "(bị vô hiệu hóa)">
+<!ENTITY context.editfilter.label "Chỉnh sá»­a bá»™ lá»c Ä‘ang có hiệu lá»±c">
+<!ENTITY tooltip.type.blocked "(đã chặn)">
+<!ENTITY size.label "Kích thước">
+<!ENTITY context.whitelist.label "Thêm quy luật ngoại lệ cho mục">
+<!ENTITY context.selectAll.label "Chá»n tất cả">
+<!ENTITY state.label "Tình trạng">
+<!ENTITY docDomain.label "Nguồn tài liệu">
+<!ENTITY tooltip.address.label "Äịa chỉ:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/subscriptionSelection.dtd
new file mode 100644
index 0000000..804c14b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Kèm thêm bá»™ lá»c trá»n &amp;gói &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plus không thể lấy danh sách bá»™ lá»c trá»n gói.">
+<!ENTITY list.download.retry "Thử lại">
+<!ENTITY title.label "&amp;Tiêu đỠcá»§a bá»™ trá»n gói:">
+<!ENTITY list.download.website "Xem trang mạng">
+<!ENTITY supplementMessage "Bá»™ lá»c trá»n gói này chỉ nên dùng kèm vá»›i bá»™ lá»c trá»n gói &quot;?1?&quot; - cái mà bạn chưa sá»­ dụng.">
+<!ENTITY viewList.label "Xem bá»™ lá»c">
+<!ENTITY visitHomepage.label "Vào trang chủ">
+<!ENTITY addSubscription.label "Thêm bá»™ trá»n gói">
+<!ENTITY dialog.title "Thêm bá»™ lá»c trá»n gói cho Adblock Plus">
+<!ENTITY location.label "Äị&amp;a chỉ cá»§a danh sách bá»™ lá»c:">
+<!ENTITY fromWeb.description "Vui lòng xác nhận rằng bạn muốn thêm bá»™ lá»c trá»n gói này. Bạn có thể thay đổi tiêu đỠhoặc địa chỉ trước khi thêm nó.">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/composer.dtd
new file mode 100644
index 0000000..2ed029e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "åœ¨åœ°å€æœ«å°¾ (&amp;n)">
+<!ENTITY domainRestriction.label "é™åˆ¶åŸŸï¼š (&amp;d)">
+<!ENTITY collapse.default.no.label "使用默认值 (å¦)">
+<!ENTITY firstParty.label "仅第一方 (&amp;r)">
+<!ENTITY preferences.label "显示所有å±è”½è§„则…… (&amp;S)">
+<!ENTITY pattern.label "查找模å¼">
+<!ENTITY thirdParty.label "仅第三方 (&amp;T)">
+<!ENTITY filter.label "新建å±è”½è§„则: (&amp;f)">
+<!ENTITY collapse.label "折å å·²å±è”½: (&amp;l)">
+<!ENTITY match.warning "您输入的模å¼ä¸æ˜¯è¯¥åœ°å€çš„过滤/例外规则,将ä¸ä¼šå¯¹è¯¥åœ°å€äº§ç”Ÿä»»ä½•效果。">
+<!ENTITY anchor.start.label "在地å€å¼€å§‹å¤„ (&amp;g)">
+<!ENTITY matchCase.label "匹é…大å°å†™ (&amp;M)">
+<!ENTITY custom.pattern.label "自定义: (&amp;C)">
+<!ENTITY unselectAllTypes.label "å…¨ä¸é€‰">
+<!ENTITY type.whitelist.label "例外规则 (&amp;x)">
+<!ENTITY regexp.warning "您输入的模å¼å°†ä»¥æ­£åˆ™è¡¨è¾¾å¼è§£é‡Šã€‚此正则表达å¼ä¸èƒ½é«˜æ•ˆåœ°åœ¨Adblock Plus上è¿è¡Œï¼Œå¹¶ä¸”å¯èƒ½ä¼šé™ä½Žæ‚¨æµè§ˆçš„速度。如果您ä¸å¸Œæœ›ä½¿ç”¨æ­£åˆ™è¡¨è¾¾å¼ï¼Œè¯·åœ¨æ¨¡å¼æœ«å°¾æ·»åŠ ä¸€ä¸ªæ˜Ÿå·(*)。">
+<!ENTITY dialog.title "添加 Adblock Plus 过滤规则">
+<!ENTITY basic.label "基本视图">
+<!ENTITY type.filter.label "å±è”½è§„则 (&amp;B)">
+<!ENTITY types.label "适用于类型:">
+<!ENTITY shortpattern.warning "您输入的模å¼å¤ªçŸ­è€Œä¸èƒ½è¢«ä¼˜åŒ–,过多这样的模å¼ä¼šé™ä½Žæ‚¨æµè§ˆçš„é€Ÿåº¦ã€‚æŽ¨èæ‚¨ä¸ºè¯¥è¿‡æ»¤è§„则选择一个长些的字符串,这样 Adblock Plus æ‰èƒ½æ›´æœ‰æ•ˆåœ°å¤„ç†ã€‚">
+<!ENTITY collapse.yes.label "是">
+<!ENTITY anchors.label "ä»…æŽ¥å—æ¨¡å¼:">
+<!ENTITY collapse.default.yes.label "使用默认值 (是)">
+<!ENTITY domainRestriction.help "由竖线(|)分隔的一个或多个域,过滤规则仅应用于这些域上。域å剿œ‰ä»£å­—符(~),表示过滤规则ä¸åº”该应用于该域上。">
+<!ENTITY accept.label "添加过滤规则">
+<!ENTITY options.label "选项">
+<!ENTITY disabled.warning "Adblock Plus ç›®å‰å¤„于ç¦ç”¨çжæ€ã€‚您å¯ä»¥ç»§ç»­æ·»åŠ è¿‡æ»¤è§„åˆ™ï¼Œä½†æ˜¯è¿™äº›è§„åˆ™åœ¨æ‚¨[link]å¯ç”¨ Adblock Plus[/link] ä¹‹åŽæ‰èƒ½ç”Ÿæ•ˆã€‚">
+<!ENTITY anchor.start.flexible.label "在域å开始处 (&amp;g)">
+<!ENTITY collapse.no.label "å¦">
+<!ENTITY selectAllTypes.label "全选">
+<!ENTITY advanced.label "高级视图">
+<!ENTITY pattern.explanation "模å¼å¯ä»¥æ˜¯åœ°å€çš„ä»»æ„部分,星å·(*)是通é…符。过滤规则åªä¼šåº”用到与模å¼åŒ¹é…的地å€ä¸Šã€‚">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/filters.dtd
new file mode 100644
index 0000000..23ccf7c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/filters.dtd
@@ -0,0 +1,73 @@
+<!ENTITY restore.custom.warning "您所有的自定义规则将被选择的文件中的内容所替代。您是å¦ç»§ç»­ï¼Ÿ">
+<!ENTITY slow.column "慢速过滤规则 (&amp;w)">
+<!ENTITY enabled.column "å¯ç”¨ (&amp;n)">
+<!ENTITY subscription.lastDownload.checksumMismatch "失败,检验和ä¸åŒ¹é…">
+<!ENTITY noFiltersInGroup.text "选择的分组是空的。">
+<!ENTITY subscription.actions.label "æ“作">
+<!ENTITY filter.selectAll.label "全选">
+<!ENTITY backupButton.label "备份与还原 (&amp;B)">
+<!ENTITY restore.minVersion.warning "警告:该文件由新版本的 Adblock Plus 创建。您应该先更新至最新版本的 Adblock Plus ç„¶åŽå†è¿˜åŽŸè¯¥æ–‡ä»¶ã€‚">
+<!ENTITY restore.error "无法处ç†è¯¥æ–‡ä»¶ï¼Œå¯èƒ½è¯¥æ–‡ä»¶ä¸æ˜¯ Adblock Plus 备份文件?">
+<!ENTITY sort.ascending.label "&amp;A &gt; Z 顺åº">
+<!ENTITY sort.label "æŽ’åº (&amp;S)">
+<!ENTITY subscription.source.label "过滤规则列表">
+<!ENTITY hitcount.column "计数 (&amp;H)">
+<!ENTITY noFilters.text "您还没有自定义过滤规则。">
+<!ENTITY backup.custom.title "仅自定义过滤规则">
+<!ENTITY subscription.external.label "由其他扩展更新">
+<!ENTITY subscription.delete.label "删除">
+<!ENTITY noGroupSelected.text "è¦æƒ³æ˜¾ç¤ºè¿‡æ»¤è§„则分组中的过滤规则,您必须先选择一个过滤规则分组。">
+<!ENTITY filter.cut.label "剪切">
+<!ENTITY restore.default.label "还原到 ?1? 的备份">
+<!ENTITY subscription.lastDownload.inProgress "正在下载……">
+<!ENTITY subscriptions.tab.label "过滤规则订阅组">
+<!ENTITY sort.descending.label "&amp;Z &gt; A 顺åº">
+<!ENTITY filters.remove.warning "您确定è¦ç§»é™¤æ‰€æœ‰é€‰å®šçš„过滤规则å—?">
+<!ENTITY filter.delete.label "删除">
+<!ENTITY addSubscriptionAdd.label "添加">
+<!ENTITY viewMenu.label "查看">
+<!ENTITY subscription.lastDownload.unknown "未知">
+<!ENTITY addSubscriptionCancel.label "å–æ¶ˆ">
+<!ENTITY subscription.enabled.label "å¯ç”¨">
+<!ENTITY noSubscriptions.text "您还没有添加过滤规则订阅组。Adblock Plus 没有过滤规则将无法
+进行å±è”½ï¼Œè¯·ä½¿ç”¨ “添加过滤规则订阅组†添加过滤规则。">
+<!ENTITY subscription.update.label "更新过滤规则">
+<!ENTITY dialog.title "Adblock Plus 过滤规则首选项">
+<!ENTITY addFilter.label "添加过滤规则 (&amp;d)">
+<!ENTITY subscription.minVersion.warning "è¯¥è¿‡æ»¤è§„åˆ™è®¢é˜…ç»„éœ€è¦æ–°ç‰ˆæœ¬çš„ Adblock Plus,您应该更新至最新的 Adblock Plus。">
+<!ENTITY subscription.lastDownload.invalidURL "å¤±è´¥ï¼Œä¸æ˜¯æœ‰æ•ˆåœ°å€">
+<!ENTITY backup.error "将过滤规则写入文件时å‘ç”Ÿé”™è¯¯ã€‚è¯·ç¡®è®¤è¯¥æ–‡ä»¶æ²¡æœ‰å†™ä¿æŠ¤æˆ–è€…æ­£åœ¨è¢«å…¶ä»–ç¨‹åºä½¿ç”¨ã€‚">
+<!ENTITY filter.moveUp.label "上移">
+<!ENTITY addGroup.label "添加过滤规则分组 (&amp;g)">
+<!ENTITY filter.edit.label "编辑">
+<!ENTITY subscription.showHideFilters.label "显示/éšè—过滤规则">
+<!ENTITY acceptableAds2.label "å…许一些éžä¾µå…¥å¼å¹¿å‘Š (&amp;i)">
+<!ENTITY addSubscriptionOther.label "添加其他过滤规则订阅组">
+<!ENTITY close.label "关闭">
+<!ENTITY sort.none.label "ä¸æŽ’åº (&amp;U)">
+<!ENTITY filter.actions.label "过滤规则æ“作">
+<!ENTITY filter.copy.label "å¤åˆ¶">
+<!ENTITY filter.moveDown.label "下移">
+<!ENTITY filter.resetHitCounts.label "é‡ç½®ç”Ÿæ•ˆæ¬¡æ•°ç»Ÿè®¡">
+<!ENTITY readMore.label "深入了解">
+<!ENTITY subscription.moveUp.label "上移">
+<!ENTITY addSubscription.label "添加过滤规则订阅组 (&amp;f)">
+<!ENTITY subscription.homepage.label "主页">
+<!ENTITY backup.complete.title "所有订阅组和自定义规则">
+<!ENTITY restore.own.label "还原自己的备份">
+<!ENTITY restore.complete.warning "æ‚¨æ‰€æœ‰çš„è¿‡æ»¤è§„åˆ™å‚æ•°å°†è¢«é€‰æ‹©çš„æ–‡ä»¶ä¸­çš„内容所替代。您是å¦ç»§ç»­ï¼Ÿ">
+<!ENTITY filters.tab.label "自定义过滤规则">
+<!ENTITY backup.label "创建新备份">
+<!ENTITY find.label "查找 (&amp;n)">
+<!ENTITY subscription.moveDown.label "下移">
+<!ENTITY subscription.lastDownload.connectionError "失败,下载失败">
+<!ENTITY subscription.lastDownload.success "æˆåŠŸ">
+<!ENTITY subscription.lastDownload.invalidData "å¤±è´¥ï¼Œä¸æ˜¯æœ‰æ•ˆçš„过滤规则列表">
+<!ENTITY filter.paste.label "粘贴">
+<!ENTITY subscription.disabledFilters.enable "å¯ç”¨å·²ç¦ç”¨çš„过滤规则">
+<!ENTITY lasthit.column "最åŽç”Ÿæ•ˆæ—¶é—´ (&amp;L)">
+<!ENTITY subscription.editTitle.label "编辑标题">
+<!ENTITY subscription.disabledFilters.warning "该过滤规则订阅组中的æŸäº›è¿‡æ»¤è§„则被ç¦ç”¨ã€‚">
+<!ENTITY filter.column "过滤规则 (&amp;F)">
+<!ENTITY subscription.lastDownload.label "最åŽä¸‹è½½äºŽ:">
+<!ENTITY viewList.label "查看列表">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/firstRun.properties
new file mode 100644
index 0000000..e318330
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=éšç§˜æµè§ˆé¿å¼€è·Ÿè¸ª - 摆脱广告公å¸è·Ÿè¸ªä½ çš„一举一动。
+firstRun_toggle_off=关闭
+firstRun_feature_tracking=ç¦æ­¢è·Ÿè¸ª
+firstRun_feature_malware=æ‹¦æˆªæ¶æ„软件
+firstRun_title=Adblock Plus 已安装
+firstRun_toggle_on=å¼€å¯
+firstRun_acceptableAdsExplanation=我们想鼓励网站使用简å•ã€ä¸ä½¿äººå感的广告。这也是为什么我们建立了一个<a>严格的指导方针</a>æ¥ç¡®å®šå¯æŽ¥å—çš„å¹¿å‘Šï¼Œå¹¶åœ¨é»˜è®¤è®¾ç½®ä¸‹å±•ç¤ºå®ƒä»¬ã€‚å¦‚æžœæ‚¨ä»æƒ³å±è”½æ‰€æœ‰å¹¿å‘Šï¼Œæ‚¨å¯ä»¥è½»æ¾åœ°<a>ç¦ç”¨</a>这项功能。
+firstRun_contributor_credits=贡献者记录
+firstRun_dataCorruptionWarning=总是显示此页?<a>点击这里ï¼</a>
+firstRun_acceptableAdsHeadline=æ¼äººçš„广告将被å±è”½
+firstRun_share=告诉你的朋å‹
+firstRun_share_headline=<a>给我们一点支æŒ</a>,让网络å˜å¾—更加美好
+firstRun_feature_social_description=自动å±è”½ç½‘页中出现的社交媒体按钮,例如 Facebook çš„ Like,摆脱行为跟踪。
+firstRun_filterlistsReinitializedWarning=似乎因一个问题导致所有过滤规则已被删除,并且我们无法从备份中æ¢å¤ã€‚因此,我们ä¸å¾—ä¸é‡ç½®æ‚¨çš„è¿‡æ»¤è§„åˆ™å’Œå¯æŽ¥å—广告设置。请在 <a>Adblock Plus 选项</a> ä¸­æ£€æŸ¥æ‚¨çš„è¿‡æ»¤è§„åˆ™åˆ—è¡¨å’Œå¯æŽ¥å—广告设置。
+firstRun_feature_malware_description=使您的æµè§ˆæ›´å®‰å…¨ï¼Œé˜»æ­¢å·²çŸ¥çš„æ¶æ„软件域。
+firstRun_features=Adblock Plus ä¸ä»…仅能拦截广告
+firstRun_donate=æèµ 
+firstRun_donate_label=æ”¯æŒæˆ‘们的项目
+firstRun_feature_social=移除社交媒体按钮
+firstRun_legacySafariWarning=Adblock Plus 䏿”¯æŒæ‚¨æ­£åœ¨ä½¿ç”¨çš„ Safari 旧版本。这å¯èƒ½å¯¼è‡´æ— æ³•正常工作,或者æŸå®³ä¸€äº›ç½‘站上的用户体验。我们强烈建议您更新到 Safari 6.1.1 或更高版本(基于 OS X 10.8 Mountain Lion),或 Safari 7.0.1 或更高版本(基于 OS X 10.9 Mavericks),或者使用 Mozilla Firefoxã€Google Chrome 或 Opera æµè§ˆå™¨çš„æœ€æ–°ç‰ˆæœ¬ã€‚
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/global.properties
new file mode 100644
index 0000000..48387e9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=当å‰é¡µé¢æ— å¯è¿‡æ»¤é¡¹ç›®
+action3_tooltip=点击切æ¢å¯ç”¨/ç¦ç”¨ Adblock Plus。
+notification_antiadblock_title=éšè—针对性的信æ¯ï¼Ÿ
+type_label_script=脚本
+filter_elemhide_nocriteria=没有指定è¦éšè—元素的识别标准
+blockingGroup_title=广告å±è”½è§„则
+whitelisted_tooltip=Adblock Plus 在当å‰é¡µç¦ç”¨ã€‚
+type_label_stylesheet=æ ·å¼è¡¨
+blocked_count_tooltip=第 ?1? 项,共 ?2? 项
+type_label_font=字体
+type_label_popup=弹出窗å£
+filter_regexp_tooltip=è¯¥è¿‡æ»¤è§„åˆ™æ˜¯æ­£åˆ™è¡¨è¾¾å¼æˆ–者太短而无法优化。如果这ç§ç±»åž‹çš„过滤规则太多会é™ä½Žæ‚¨æµè§ˆçš„速度。
+action0_tooltip=点击弹出快æ·èœå•,中键点击切æ¢å¯ç”¨/ç¦ç”¨ã€‚
+whitelisted_page=Adblock Plus 在当å‰é¡µé¢å·²ç¦ç”¨
+remove_group_warning=您希望移除该组å—?
+action1_tooltip=点击打开/关闭å¯è¿‡æ»¤é¡¹ç›®ï¼Œä¸­é”®ç‚¹å‡»åˆ‡æ¢å¯ç”¨/ç¦ç”¨ã€‚
+type_label_xmlhttprequest=XML 请求
+active_tooltip=Adblock Plus 处于å¯ç”¨çжæ€ï¼Œæ­£åœ¨ä½¿ç”¨ ?1? 过滤规则订阅组和 ?2? 自定义过滤规则。
+type_label_document=文档
+type_label_object_subrequest=对象å­è¯·æ±‚
+whitelistGroup_title=例外规则
+disabled_tooltip=Adblock Plus å·²ç¦ç”¨ã€‚
+filter_elemhide_duplicate_id=ä»…å¯ä»¥æŒ‡å®šä¸€ä¸ªè¦éšè—的元素 ID
+type_label_object=对象
+action2_tooltip=点击打开首选项,中键点击切æ¢å¯ç”¨/ç¦ç”¨ã€‚
+type_label_subdocument=帧
+clearStats_warning=æ­¤æ“作将ç¦ç”¨å¹¶é‡ç½®æ‰€æœ‰è¿‡æ»¤è§„则生效次数统计。您确定è¦è¿™æ ·åšå—?
+notification_antiadblock_message=此网站已知会对 Adblock Plus 用户显示针对性的信æ¯ã€‚您想让 Adblock Plus éšè—针对性的信æ¯å—?
+blocked_count_addendum=(白åå•: ?1?, éšè—: ?2?)
+subscription_invalid_location=过滤规则列表的ä½ç½®ä¸æ˜¯æœ‰æ•ˆçš„ URL 或有效的文件å。
+type_label_image=图片
+remove_subscription_warning=您确定è¦ç§»é™¤è¯¥è¿‡æ»¤è§„则订阅组å—?
+type_label_other=å…¶ä»–
+mobile_menu_enable=ABP:å¯ç”¨
+type_label_media=音频/视频
+mobile_menu_disable_site=ABP:在 ?1? ç¦ç”¨
+elemhideGroup_title=元素éšè—规则
+mobile_menu_enable_site=ABP:在 ?1? å¯ç”¨
+type_label_elemhide=éšè—
+newGroup_title=新建过滤规则组
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/overlay.dtd
new file mode 100644
index 0000000..cf9ea7f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "是(&amp;Y)">
+<!ENTITY notification.button.no "å¦(&amp;N)">
+<!ENTITY sync.label "åŒæ­¥ Adblo&amp;ck Plus 设置">
+<!ENTITY whitelist.site.label "在 ?1? ç¦ç”¨ Adblock Plus">
+<!ENTITY filters.label "过滤规则首选项 (&amp;F)">
+<!ENTITY disable.label "完全ç¦ç”¨">
+<!ENTITY objecttab.title "å±è”½">
+<!ENTITY objecttab.tooltip "点击这里用 Adblock Plus å±è”½è¯¥å¯¹è±¡">
+<!ENTITY menuitem.label "Ad&amp;block Plus 首选项">
+<!ENTITY objecttabs.label "在 Flash 和 Java 上显示标签 (&amp;t)">
+<!ENTITY sendReport.label "报告该页é¢ä¸Šçš„问题 (&amp;R)">
+<!ENTITY whitelist.page.label "仅在本页ç¦ç”¨ Adblock Plus">
+<!ENTITY context.image.label "过滤图片(Adblock Plus)">
+<!ENTITY counthits.label "统计过滤规则生效次数 (&amp;h)">
+<!ENTITY opensidebar.label "打开å¯è¿‡æ»¤é¡¹ç›® (&amp;b)">
+<!ENTITY notification.button.close "关闭(&amp;C)">
+<!ENTITY contribute.label "助力 Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "过滤帧(Adblock Plus)">
+<!ENTITY blocked.tooltip "该页上已过滤的项目:">
+<!ENTITY hideplaceholders.label "éšè—å·²å±è”½å…ƒç´ çš„å ä½ç¬¦ (&amp;l)">
+<!ENTITY showinstatusbar.label "åœ¨çŠ¶æ€æ æ˜¾ç¤º (&amp;s)">
+<!ENTITY sidebar.title "本页å¯è¿‡æ»¤çš„项目">
+<!ENTITY options.label "选项 (&amp;O)">
+<!ENTITY context.object.label "过滤对象(Adblock Plus)">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: 在此页é¢ä¸Šé‡æ–°å¯ç”¨">
+<!ENTITY filters.tooltip "最活跃过滤规则:">
+<!ENTITY closesidebar.label "关闭å¯è¿‡æ»¤é¡¹ç›® (&amp;b)">
+<!ENTITY showintoolbar.label "åœ¨å·¥å…·æ æ˜¾ç¤º (&amp;b)">
+<!ENTITY status.tooltip "状æ€:">
+<!ENTITY context.media.label "过滤视频/音频(Adblock Plus)">
+<!ENTITY subscription.update.label "更新过滤规则">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/sendReport.dtd
new file mode 100644
index 0000000..2b2152e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/sendReport.dtd
@@ -0,0 +1,78 @@
+<!ENTITY screenshot.undo.label "撤销 (&amp;U)">
+<!ENTITY issues.disabledgroups.description "如下过滤规则订阅组或过滤规则组处于ç¦ç”¨çжæ€ï¼Œä½†æ˜¯å®ƒä»¬å¯èƒ½å¯¹è¯¥é¡µé¢æœ‰æ•ˆï¼š">
+<!ENTITY showData.label "显示报告数æ®">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus å±è”½äº†å¤ªå¤šå…ƒç´  (&amp;m)">
+<!ENTITY issues.change.description "æ‚¨çš„è®¾ç½®å·²æ›´æ”¹ã€‚è¯·é‡æ–°è½½å…¥é¡µé¢æ¥æµ‹è¯•æ›´æ”¹ï¼Œå¦‚æžœé—®é¢˜ä¾æ—§å­˜åœ¨è§£å†³å†æäº¤æŠ¥å‘Šã€‚">
+<!ENTITY email.label "电å­é‚®ç®± (&amp;m)">
+<!ENTITY issues.openPreferences.label "打开过滤规则首选项">
+<!ENTITY sendPage.confirmation "您的报告已被ä¿å­˜ã€‚您å¯ä»¥é€šè¿‡å¦‚下地å€è®¿é—®ï¼š">
+<!ENTITY copyLink.label "å¤åˆ¶æŠ¥å‘Šé“¾æŽ¥ (&amp;C)">
+<!ENTITY issues.nofilters.description "Adblock Plus 在当å‰é¡µé¢ä¸Šæœªå±è”½ä»»ä½•元素。您é‡åˆ°çš„问题很å¯èƒ½ä¸Ž Adblock Plus 无关。">
+<!ENTITY sendPage.knownIssue "您æäº¤çš„问题å¯èƒ½æ˜¯ä¸ªå·²çŸ¥é—®é¢˜ã€‚详情è§ï¼š">
+<!ENTITY typeSelector.other.description "如果您怀疑问题出在 Adblock Plus è‡ªèº«è€Œä¸æ˜¯è¿‡æ»¤è§„则,请选择此选项。">
+<!ENTITY issues.disabledgroups.enable.label "å¯ç”¨è¿‡æ»¤è§„则订阅组/过滤规则分组">
+<!ENTITY typeWarning.override.label "我了解并ä»ç„¶å¸Œæœ›æäº¤æŠ¥å‘Š (&amp;s)">
+<!ENTITY issues.disabled.enable.label "å¯ç”¨ Adblock Plus">
+<!ENTITY update.fixed.description "更新的过滤规则订阅组å¯èƒ½å·²è§£å†³äº†æ‚¨æŠ¥å‘Šçš„é—®é¢˜ã€‚è¯·é‡æ–°è½½å…¥é¡µé¢å¹¶é‡è¯•,如果问题ä»ç„¶å­˜åœ¨ï¼Œæ‚¨å†ç»§ç»­æŠ¥å‘Šé—®é¢˜ã€‚">
+<!ENTITY anonymous.label "匿åæäº¤ (&amp;A)">
+<!ENTITY reloadButton.label "釿–°è½½å…¥é¡µé¢ (&amp;R)">
+<!ENTITY recentReports.clear.label "移除所有报告 (&amp;R)">
+<!ENTITY typeSelector.description "本窗å£å°†é€šè¿‡ä¸€ç³»åˆ—步骤引导您æäº¤ Adblock Plus 问题报告。
+首先,请在本页选择您é‡åˆ°çš„问题类型:">
+<!ENTITY screenshot.remove.label "ç§»é™¤æ•æ„Ÿæ•°æ® (&amp;R)">
+<!ENTITY issues.ownfilters.description "一些应用到该页é¢çš„过滤规则是由用户自定义的。
+请ç¦ç”¨è¿™äº›å¯èƒ½å¯¼è‡´è¯¥é—®é¢˜çš„过滤规则:">
+<!ENTITY update.inProgress.description "Adblock Plus éœ€è¦æ›´æ–°æ‚¨çš„过滤规则订阅组以确ä¿é—®é¢˜è¿˜æœªè¢«è§£å†³ã€‚请ç¨ç­‰â€¦â€¦">
+<!ENTITY sendPage.retry.label "冿¬¡å‘é€">
+<!ENTITY data.label "报告数æ®ï¼š(&amp;p)">
+<!ENTITY recentReports.label "您最近æäº¤çš„æŠ¥å‘Š">
+<!ENTITY typeWarning.description "æ‚¨å·²ç»æ˜Žç¡®æ‚¨æƒ³è¦æŠ¥å‘Š Adblock Plus çš„é€šç”¨é—®é¢˜è€Œä¸æ˜¯è¿‡æ»¤è§„则的问题。
+请注æ„这类问题最好报告至 [link]Adblock Plus 论å›[/link]。您应该仅仅使用
+问题报告系统æ¥è¡¥å……ä¸€ä¸ªå­˜åœ¨çš„è®¨è®ºï¼Œå¦‚æžœæ‚¨ä¸æä¾›é“¾æŽ¥ï¼Œå¾ˆå¯èƒ½æ²¡äººä¼š
+注æ„到您的报告。æäº¤æŠ¥å‘Šä¹‹åŽä¼šæä¾›ç»™æ‚¨è‡ªåŠ¨åˆ›å»ºçš„é“¾æŽ¥ã€‚">
+<!ENTITY issues.disabled.description "Adblock Plus å·²ç¦ç”¨ï¼Œå½“å‰çжæ€ä¸‹ Adblock Plus ä¸ä¼šå±è”½ä»»ä½•元素。">
+<!ENTITY attachExtensions.label "在报告中附加激活的扩展列表,用于确定附加组件冲çªå¯¼è‡´çš„问题 (&amp;x)">
+<!ENTITY issues.nosubscriptions.add.label "添加过滤规则订阅组">
+<!ENTITY issues.disabledfilters.enable.label "å¯ç”¨è¿‡æ»¤è§„则">
+<!ENTITY issues.override.label "设置正确,继续报告 (&amp;c)">
+<!ENTITY issues.nosubscriptions.description "您似乎没有订阅任何制作好的过滤规则列表。">
+<!ENTITY typeSelector.falsePositive.description "如果页é¢ç¼ºå¤±äº†é‡è¦å†…å®¹ã€æ˜¾ç¤ºä¸æ­£å¸¸æˆ–è€…åŠŸèƒ½ä¸æ­£å¸¸ï¼Œè¯·é€‰æ‹©æ­¤é€‰é¡¹ã€‚
+您å¯ä»¥é€šè¿‡ä¸´æ—¶ç¦ç”¨ Adblock Plus æ¥æ£€æµ‹é—®é¢˜æ˜¯å¦ä¸º Adblock Plus 所致。">
+<!ENTITY typeSelector.other.label "其他问题 (&amp;t)">
+<!ENTITY emailComment.label "我们鼓励您输入一个有效的电å­é‚®ä»¶åœ°å€ï¼Œä»¥ä¾¿åœ¨æˆ‘们对你的报告有疑问时å¯ä»¥ä¸Žæ‚¨è”系。它还能使我们能认出你的贡献,并帮助确定它们的优先次åºã€‚">
+<!ENTITY issues.whitelist.remove.label "åœ¨æ­¤é¡µä¸Šé‡æ–°å¯ç”¨ Adblock Plus">
+<!ENTITY outdatedSubscriptions.description "如下过滤规则订阅组已ç»è‡³å°‘两周没有更新了。请在æäº¤æŠ¥å‘Šä¹‹å‰å…ˆæ›´æ–°è¿™äº›è¿‡æ»¤è§„则订阅组,也许问题已ç»è§£å†³ã€‚">
+<!ENTITY dataCollector.description "Adblock Plus 正在收集所需数æ®ï¼Œè¯·ç¨ç­‰ç‰‡åˆ»ã€‚">
+<!ENTITY sendButton.label "å‘é€æŠ¥å‘Š (&amp;n)">
+<!ENTITY comment.label "注释(å¯é€‰ï¼‰ï¼š(&amp;C)">
+<!ENTITY sendPage.errorMessage "å‘é€æŠ¥å‘Šå¤±è´¥ï¼Œé”™è¯¯ç  &quot;?1?&quot;ã€‚è¯·ç¡®ä¿æ‚¨å·²è¿žæŽ¥äº’è”网并é‡è¯•。
+å¦‚æžœé—®é¢˜ä¾æ—§ï¼Œè¯·åˆ° [link]Adblock Plus 论å›[/link]寻求帮助。">
+<!ENTITY showRecentReports.label "显示最近æäº¤çš„æŠ¥å‘Š">
+<!ENTITY commentPage.heading "输入注释">
+<!ENTITY update.start.label "现在开始更新">
+<!ENTITY issues.disabledfilters.description "如下过滤规则处于ç¦ç”¨çжæ€ï¼Œä½†æ˜¯å®ƒä»¬å¯èƒ½å¯¹è¯¥é¡µé¢ä¸Šæœ‰æ•ˆï¼š">
+<!ENTITY screenshot.description "åŒæ ·çš„页é¢ï¼Œä¸åŒçš„人å¯èƒ½è§åˆ°çš„å¹¶ä¸ç›¸åŒã€‚如果您在报告中
+附加了截图,它å¯èƒ½ä¼šå¸®åŠ©æˆ‘ä»¬äº†è§£é—®é¢˜ã€‚æ‚¨å¯ä»¥ç§»é™¤æ•感信
+æ¯åŒºåŸŸä¹Ÿå¯ä»¥æ ‡è®°å‡ºé—®é¢˜åŒºåŸŸã€‚点击相应的按钮并用鼠标在
+图片上选择区域å³å¯ã€‚">
+<!ENTITY screenshot.attach.label "为报告附加页é¢å›¾ç‰‡ (&amp;t)">
+<!ENTITY issues.whitelist.description "Adblock Plus åœ¨æ‚¨è¦æŠ¥å‘Šçš„é¡µé¢ä¸Šæ˜¯ç¦ç”¨çš„。请在æäº¤æŠ¥å‘Šå助调研该问题之å‰ï¼Œé‡æ–°å¯ç”¨ Adblock Plus 并釿–°è½½å…¥è¯¥é¡µé¢ã€‚">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus 没有å±è”½å¹¿å‘Š (&amp;v)">
+<!ENTITY typeSelector.heading "选择问题类型">
+<!ENTITY anonymity.warning "我们将无法回å¤ä½ ï¼Œå¹¶ä¸”报告å¯èƒ½è¢«æ”¾åœ¨è¾ƒä½Žçš„优先级次åºã€‚">
+<!ENTITY wizard.title "问题报告">
+<!ENTITY issues.ownfilters.disable.label "ç¦ç”¨è¿‡æ»¤è§„则">
+<!ENTITY commentPage.description "以下文本区å…许您输入一些注释æ¥å¸®åŠ©æˆ‘ä»¬æ›´å¥½åœ°ç†è§£è¯¥é—®é¢˜ã€‚
+该步骤虽然是å¯é€‰çš„ï¼Œä½†æ˜¯å¦‚æžœé—®é¢˜ä¸æ˜¯é‚£ä¹ˆæ˜¾è€Œæ˜“è§çš„è¯ï¼Œæˆ‘们
+æŽ¨èæ‚¨è¾“入一些注释。您å¯ä»¥åœ¨å‘é€ä¹‹å‰å†æ£€æŸ¥ä¸€ä¸‹æŠ¥å‘Šçš„æ•°æ®ã€‚">
+<!ENTITY comment.lengthWarning "您输入的注释长度超过 1000 ä¸ªå­—ç¬¦ã€‚åªæœ‰å‰ 1000 个字符会被å‘é€å‡ºåŽ»ã€‚">
+<!ENTITY typeSelector.falseNegative.description "如果 Adblock Plus 处于å¯ç”¨çжæ€ä½†ä»ç„¶æœ‰å¹¿å‘Šå‡ºçŽ°ï¼Œè¯·é€‰æ‹©æ­¤é€‰é¡¹ã€‚">
+<!ENTITY sendPage.waitMessage "Adblock Plus 正在æäº¤æ‚¨çš„æŠ¥å‘Šï¼Œè¯·ç¨ç­‰ã€‚">
+<!ENTITY dataCollector.heading "欢迎使用问题报告系统">
+<!ENTITY screenshot.heading "附加截图">
+<!ENTITY sendPage.heading "å‘é€æŠ¥å‘Š">
+<!ENTITY issues.subscriptionCount.description "æ‚¨ä¼¼ä¹Žè®¢é˜…äº†å¤ªå¤šçš„è¿‡æ»¤è§„åˆ™ã€‚æˆ‘ä»¬ä¸æŽ¨è采用过多的过滤规则订阅组,因为这å¯èƒ½ä¼šå¸¦æ¥è®¸å¤šé—®é¢˜ã€‚
+并且很抱歉我们ä¸èƒ½æŽ¥å—您的问题报告,因为我们很难弄清是哪些过滤规则订阅组的作者需è¦é‡‡å–行动。请移除所有éžå¿…è¦çš„过滤规则订阅组,然åŽå†æµ‹è¯•一下问题是å¦è¿˜å­˜åœ¨ã€‚">
+<!ENTITY screenshot.mark.label "标记问题 (&amp;M)">
+<!ENTITY privacyPolicy.label "éšç§ç­–ç•¥">
+<!ENTITY issues.description "Adblock Plus å·²ç»æ£€æµ‹å‡ºæ‚¨çš„设置å¯èƒ½å¯¼è‡´äº†è¯¥é—®é¢˜æˆ–者致使报告难以调研。">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/sidebar.dtd
new file mode 100644
index 0000000..3bda933
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "闪动显示该项目的边框">
+<!ENTITY address.label "地å€">
+<!ENTITY context.open.label "在新标签页打开">
+<!ENTITY type.label "类型">
+<!ENTITY tooltip.filterSource.label "过滤规则æº:">
+<!ENTITY noitems.label "æ— å¯è¿‡æ»¤é¡¹ç›®">
+<!ENTITY filter.label "过滤规则">
+<!ENTITY tooltip.size.label "大å°:">
+<!ENTITY reattach.label "åˆä½“">
+<!ENTITY search.label "æœç´¢ï¼š (&amp;S)">
+<!ENTITY docDomain.thirdParty "(第三方)">
+<!ENTITY filterSource.label "过滤规则æº">
+<!ENTITY tooltip.docDomain.label "文档æºï¼š">
+<!ENTITY context.copy.label "å¤åˆ¶é¡¹ç›®åœ°å€">
+<!ENTITY tooltip.type.label "类型:">
+<!ENTITY context.disablefilter.label "ç¦ç”¨è¿‡æ»¤è§„则 ?1?">
+<!ENTITY context.copyFilter.label "å¤åˆ¶è¿‡æ»¤è§„则">
+<!ENTITY context.block.label "过滤该项">
+<!ENTITY context.enablefilter.label "釿–°å¯ç”¨è¿‡æ»¤è§„则 ?1?">
+<!ENTITY detach.label "分体">
+<!ENTITY whitelisted.label "列入白åå•的页é¢">
+<!ENTITY context.disablefilteronsite.label "在 ?1? ç¦ç”¨è¯¥è¿‡æ»¤è§„则">
+<!ENTITY detached.title "Adblock Plus: å¯è¿‡æ»¤é¡¹ç›® (分体å¼)">
+<!ENTITY docDomain.firstParty "(第一方)">
+<!ENTITY tooltip.type.whitelisted "(白åå•)">
+<!ENTITY tooltip.filter.label "已生效的过滤规则:">
+<!ENTITY tooltip.filter.disabled "(å·²ç¦ç”¨)">
+<!ENTITY context.editfilter.label "编辑过滤规则有效">
+<!ENTITY tooltip.type.blocked "(已过滤)">
+<!ENTITY size.label "大å°">
+<!ENTITY context.whitelist.label "将该项加入白åå•">
+<!ENTITY context.selectAll.label "全选">
+<!ENTITY state.label "状æ€">
+<!ENTITY docDomain.label "文档æº">
+<!ENTITY tooltip.address.label "地å€:">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/subscriptionSelection.dtd
new file mode 100644
index 0000000..47596ee
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "åŒæ—¶æ·»åŠ è¿‡æ»¤è§„åˆ™è®¢é˜…ç»„ “?1?†(&amp;s)">
+<!ENTITY list.download.failed "获å–订阅组的过滤规则列表失败。">
+<!ENTITY list.download.retry "é‡è¯•">
+<!ENTITY title.label "订阅组的标题: (&amp;t)">
+<!ENTITY list.download.website "查看站点">
+<!ENTITY supplementMessage "该过滤规则订阅组æ„味ç€è¯¥è®¢é˜…组将与您未添加的订阅组 “?1?†一起使用。">
+<!ENTITY viewList.label "查看过滤规则">
+<!ENTITY visitHomepage.label "查看主页">
+<!ENTITY addSubscription.label "添加订阅组">
+<!ENTITY dialog.title "添加 Adblock Plus 过滤规则订阅组">
+<!ENTITY location.label "过滤规则列表ä½ç½®: (&amp;l)">
+<!ENTITY fromWeb.description "请确认您希望添加该过滤规则订阅组。在添加之å‰ï¼Œæ‚¨å¯ä»¥æ›´æ”¹è®¢é˜…标题或ä½ç½®ã€‚">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/composer.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/composer.dtd
new file mode 100644
index 0000000..6b49cb9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "ç¶²å€çµå°¾ (&amp;n)">
+<!ENTITY domainRestriction.label "網域é™åˆ¶: (&amp;d)">
+<!ENTITY collapse.default.no.label "使用é è¨­å€¼ (å¦)">
+<!ENTITY firstParty.label "åªé™ç¬¬ä¸€æ–¹ (&amp;r)">
+<!ENTITY preferences.label "顯示已有的æ¢ä»¶... (&amp;S)">
+<!ENTITY pattern.label "尋找æ¢ä»¶">
+<!ENTITY thirdParty.label "åªé™ç¬¬ä¸‰æ–¹ (&amp;T)">
+<!ENTITY filter.label "æ–°éŽæ¿¾æ¢ä»¶: (&amp;f)">
+<!ENTITY collapse.label "摺疊已阻擋項目: (&amp;l)">
+<!ENTITY match.warning "您輸入的æ¢ä»¶èˆ‡è©²ç¶²å€ä¸ç¬¦ï¼Œæ­¤æ¢ä»¶ä¸æœƒç”Ÿæ•ˆã€‚">
+<!ENTITY anchor.start.label "ç¶²å€é–‹é ­ (&amp;g)">
+<!ENTITY matchCase.label "符åˆå¤§å°å¯« (&amp;M)">
+<!ENTITY custom.pattern.label "自訂: (&amp;C)">
+<!ENTITY unselectAllTypes.label "å–æ¶ˆå…¨é¸">
+<!ENTITY type.whitelist.label "例外æ¢ä»¶ (&amp;x)">
+<!ENTITY regexp.warning "您輸入的æ¢ä»¶å°‡è¢«è§£è®€ç‚ºæ­£è¦è¡¨ç¤ºæ³•,使用正è¦è¡¨ç¤ºæ³•å¯èƒ½æœƒä½¿ Adblock Plus æ‹–æ…¢ç€è¦½é€Ÿåº¦ã€‚è‹¥æ‚¨ä¸æ‰“算使用正è¦è¡¨ç¤ºå¼ï¼Œè«‹åœ¨æ¢ä»¶çµå°¾åŠ ä¸Šæ˜Ÿè™Ÿ (*)。">
+<!ENTITY dialog.title "新增 Adblock Plus éŽæ¿¾æ¢ä»¶">
+<!ENTITY basic.label "基本檢視">
+<!ENTITY type.filter.label "éŽæ¿¾æ¢ä»¶ (&amp;B)">
+<!ENTITY types.label "套用類型:">
+<!ENTITY shortpattern.warning "您輸入的æ¢ä»¶å¤ªçŸ­ç„¡æ³•最佳化,å¯èƒ½æœƒæ‹–æ…¢ç€è¦½é€Ÿåº¦ã€‚å»ºè­°æ‚¨é¸æ“‡è¼ƒé•·çš„字串好讓 Adblock Plus 更有效率。">
+<!ENTITY collapse.yes.label "是">
+<!ENTITY anchors.label "åªæŽ¥å—特定格å¼ï¼š">
+<!ENTITY collapse.default.yes.label "使用é è¨­å€¼ (是)">
+<!ENTITY domainRestriction.help "æ­¤é¸é …坿Œ‡å®šä¸€å€‹æˆ–多個網域,請用管線符號 (|) 分隔。若在網域å稱å‰åŠ ä¸Šæ³¢æµªç¬¦è™Ÿ (~) 則表示æ¢ä»¶ä¸æœƒå¥—用於該網域。">
+<!ENTITY accept.label "æ–°å¢žéŽæ¿¾æ¢ä»¶">
+<!ENTITY options.label "é¸é …">
+<!ENTITY disabled.warning "Adblock Plus ç›®å‰å·²åœç”¨ã€‚您還是å¯ä»¥æ–°å¢žéŽæ¿¾æ¢ä»¶ï¼Œä½†é™¤éžæ‚¨ [link]啟用 Adblock Plus[/link],å¦å‰‡ä¸æœƒç”Ÿæ•ˆã€‚">
+<!ENTITY anchor.start.flexible.label "網域å稱開頭 (&amp;g)">
+<!ENTITY collapse.no.label "å¦">
+<!ENTITY selectAllTypes.label "å…¨é¸">
+<!ENTITY advanced.label "進階檢視">
+<!ENTITY pattern.explanation "æ¢ä»¶æ ¼å¼å¯ä»¥æ˜¯ç¶²å€çš„任一部分,星號 (*) 代表è¬ç”¨å­—å…ƒã€‚éŽæ¿¾æ¢ä»¶åªæœƒå¥—ç”¨åœ¨ç¬¦åˆæ ¼å¼çš„ç¶²å€ä¸Šã€‚">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/filters.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/filters.dtd
new file mode 100644
index 0000000..c953bc9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "所有自訂æ¢ä»¶éƒ½æœƒè¢«é¸ä¸­çš„æª”案替æ›ã€‚您確定è¦é€™éº¼åšå—Žï¼Ÿ">
+<!ENTITY slow.column "æ…¢é€ŸéŽæ¿¾æ¢ä»¶ (&amp;w)">
+<!ENTITY enabled.column "已啟用 (&amp;n)">
+<!ENTITY subscription.lastDownload.checksumMismatch "失敗,驗證碼ä¸ç¬¦">
+<!ENTITY noFiltersInGroup.text "é¸ä¸­çš„群組是空的">
+<!ENTITY subscription.actions.label "æ“作">
+<!ENTITY filter.selectAll.label "全部é¸å–">
+<!ENTITY backupButton.label "備份åŠé‚„原 (&amp;B)">
+<!ENTITY restore.minVersion.warning "警告:這個檔案由較新版的 Adblock Plus å»ºç«‹ã€‚å¾žé€™å€‹æª”æ¡ˆé‚„åŽŸå‰æ‚¨æ‡‰è©²å…ˆæ›´æ–°è‡³æœ€æ–°ç‰ˆçš„ Adblock Plus。">
+<!ENTITY restore.error "無法處ç†è©²æª”æ¡ˆçš„è³‡æ–™ï¼Œä¹Ÿè¨±é€™ä¸æ˜¯ Adblock Plus 的備份檔?">
+<!ENTITY sort.ascending.label "&amp;A &gt; Z 排åº">
+<!ENTITY sort.label "æŽ’åº (&amp;S)">
+<!ENTITY subscription.source.label "æ¢ä»¶åˆ—表">
+<!ENTITY hitcount.column "命中次數 (&amp;H)">
+<!ENTITY noFilters.text "您還沒有任何自訂æ¢ä»¶ã€‚">
+<!ENTITY backup.custom.title "åªæœ‰è‡ªè¨‚æ¢ä»¶">
+<!ENTITY subscription.external.label "由其他擴充套件更新">
+<!ENTITY subscription.delete.label "刪除">
+<!ENTITY noGroupSelected.text "您需è¦é¸æ“‡ä¸€å€‹æ¢ä»¶ç¾¤çµ„æ‰èƒ½é¡¯ç¤ºå…¶ä¸­çš„éŽæ¿¾æ¢ä»¶ã€‚">
+<!ENTITY filter.cut.label "剪下">
+<!ENTITY restore.default.label "還原至 ?1?">
+<!ENTITY subscription.lastDownload.inProgress "下載中...">
+<!ENTITY subscriptions.tab.label "éŽæ¿¾æ¢ä»¶é›†">
+<!ENTITY sort.descending.label "&amp;Z &gt; A 排åº">
+<!ENTITY filters.remove.warning "您確定è¦ç§»é™¤æ‰€æœ‰é¸ä¸­çš„éŽæ¿¾æ¢ä»¶ï¼Ÿ">
+<!ENTITY filter.delete.label "刪除">
+<!ENTITY addSubscriptionAdd.label "加入">
+<!ENTITY viewMenu.label "檢視">
+<!ENTITY subscription.lastDownload.unknown "無法å–å¾—">
+<!ENTITY addSubscriptionCancel.label "å–æ¶ˆ">
+<!ENTITY subscription.enabled.label "啟用">
+<!ENTITY noSubscriptions.text "æ‚¨æœªè¨‚é–±ä»»ä½•éŽæ¿¾æ¢ä»¶é›†ã€‚æ²’æœ‰éŽæ¿¾æ¢ä»¶çš„話 Adblock Plus 䏿›‰å¾—該阻擋什麼,請使用&quot;æ–°å¢žéŽæ¿¾æ¢ä»¶é›†&quot;加入。">
+<!ENTITY subscription.update.label "æ›´æ–°éŽæ¿¾æ¢ä»¶">
+<!ENTITY dialog.title "Adblock Plus æ¢ä»¶å好設定">
+<!ENTITY addFilter.label "æ–°å¢žéŽæ¿¾æ¢ä»¶ (&amp;d)">
+<!ENTITY subscription.minVersion.warning "æ­¤æ¢ä»¶é›†éœ€è¦æ–°ç‰ˆçš„ Adblock Plus,您應該更新至最新版本。">
+<!ENTITY subscription.lastDownload.invalidURL "失敗,無效的ä½å€">
+<!ENTITY backup.error "æ¢ä»¶å¯«å…¥æª”案時發生錯誤。請確定該檔案沒有寫入ä¿è­·æˆ–正被其他的程å¼ä½¿ç”¨ã€‚">
+<!ENTITY filter.moveUp.label "往上移">
+<!ENTITY addGroup.label "新增æ¢ä»¶ç¾¤çµ„ (&amp;g)">
+<!ENTITY filter.edit.label "編輯">
+<!ENTITY subscription.showHideFilters.label "顯示/éš±è—éŽæ¿¾æ¢ä»¶">
+<!ENTITY acceptableAds2.label "å…許部分éžä¾µå…¥å¼å»£å‘Š (&amp;i)">
+<!ENTITY addSubscriptionOther.label "新增其他æ¢ä»¶é›†">
+<!ENTITY close.label "關閉">
+<!ENTITY sort.none.label "ä¸æŽ’åº (&amp;U)">
+<!ENTITY filter.actions.label "æ¢ä»¶æ“作">
+<!ENTITY filter.copy.label "複製">
+<!ENTITY filter.moveDown.label "往下移">
+<!ENTITY filter.resetHitCounts.label "é‡è¨­å‘½ä¸­çµ±è¨ˆ">
+<!ENTITY readMore.label "詳細內容">
+<!ENTITY subscription.moveUp.label "往上移">
+<!ENTITY addSubscription.label "æ–°å¢žéŽæ¿¾æ¢ä»¶é›† (&amp;f)">
+<!ENTITY subscription.homepage.label "首é ">
+<!ENTITY backup.complete.title "所有æ¢ä»¶å’ŒéŽæ¿¾æ¢ä»¶é›†">
+<!ENTITY restore.own.label "從自己的備份還原">
+<!ENTITY restore.complete.warning "所有æ¢ä»¶å好設定都將被é¸ä¸­çš„æª”案替æ›ã€‚您確定è¦é€™éº¼åšå—Žï¼Ÿ">
+<!ENTITY filters.tab.label "自訂æ¢ä»¶">
+<!ENTITY backup.label "建立新的備份">
+<!ENTITY find.label "尋找 (&amp;n)">
+<!ENTITY subscription.moveDown.label "往下移">
+<!ENTITY subscription.lastDownload.connectionError "失敗,檔案下載失敗">
+<!ENTITY subscription.lastDownload.success "æˆåŠŸ">
+<!ENTITY subscription.lastDownload.invalidData "å¤±æ•—ï¼Œç„¡æ•ˆçš„éŽæ¿¾æ¢ä»¶åˆ—表">
+<!ENTITY filter.paste.label "貼上">
+<!ENTITY subscription.disabledFilters.enable "啟用所有æ¢ä»¶">
+<!ENTITY lasthit.column "最後命中 (&amp;L)">
+<!ENTITY subscription.editTitle.label "編輯標題">
+<!ENTITY subscription.disabledFilters.warning "æ­¤æ¢ä»¶é›†å…§æœ‰éƒ¨ä»½æ¢ä»¶è¢«åœç”¨ã€‚">
+<!ENTITY filter.column "éŽæ¿¾æ¢ä»¶ (&amp;F)">
+<!ENTITY subscription.lastDownload.label "最後下載:">
+<!ENTITY viewList.label "檢視æ¢ä»¶åˆ—表">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/firstRun.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/firstRun.properties
new file mode 100644
index 0000000..e0eda73
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=阻止追蹤功能æ‰èƒ½é”到真正的隱密ç€è¦½ - 此功能å¯ä»¥æ“ºè„«æƒ³ç›£è¦–您一舉一動的廣告商。
+firstRun_toggle_off=關閉
+firstRun_feature_tracking=åœç”¨è¿½è¹¤
+firstRun_feature_malware=惡æ„è»Ÿé«”éŽæ¿¾
+firstRun_title=Adblock Plus 已安è£å®Œæˆ
+firstRun_acceptableAdsExplanation=我們想鼓勵網站改採簡樸且ä¸éŽæ–¼æ¶çœ¼çš„廣告。這也是我們之所以建立<a>嚴格的è¦ç¯„</a>來辨識éžä¾µå…¥å¼å»£å‘Šçš„原因,這種類型的廣告é è¨­æœƒé¡¯ç¤ºå‡ºä¾†ã€‚è‹¥æ‚¨ä»æƒ³é˜»æ“‹æ‰€æœ‰çš„廣告,å¯ä»¥è¼•鬆地<a>åœç”¨æ­¤åŠŸèƒ½</a> 。
+firstRun_toggle_on=開啟
+firstRun_contributor_credits=è²¢ç»åå–®
+firstRun_dataCorruptionWarning=這個é é¢ä¸€ç›´è·³å‡ºä¾†å—Žï¼Ÿ <a>請看這裡ï¼</a>
+firstRun_acceptableAdsHeadline=從ç¾åœ¨èµ·ï¼Œç…©äººçš„廣告都將煙消雲散
+firstRun_share=告訴您的朋å‹
+firstRun_share_headline=<a>請助我們一臂之力</a>,讓網路變得更美好
+firstRun_features=Adblock Plus ä¸åªå¯ä»¥éŽæ¿¾å»£å‘Š
+firstRun_feature_malware_description=éŽæ¿¾æƒ¡æ„網域å¯ä½¿æ‚¨çš„ç€è¦½éŽç¨‹æ›´åŠ å®‰å…¨ã€‚
+firstRun_feature_social_description=自動擺脫如 Facebook Like 這類出ç¾åœ¨ç¶²é ä¸Šè¿½è¹¤æ‚¨ç€è¦½ç¿’慣的社交按鈕。
+firstRun_donate=贊助
+firstRun_donate_label=æ”¯æ´æˆ‘們的專案
+firstRun_feature_social=移除社交媒體按鈕
+firstRun_legacySafariWarning=您正在使用 Adblock Plus æ‰€ä¸æ”¯æ´çš„舊版 Safari。這å¯èƒ½å½±éŸ¿ä½¿ç”¨è€…體驗或導致功能失常。我們強烈建議將 Safari 更新至 6.1.1 以上版本 (OS X 10.8 Mountain Lion 系統),或更新至 Safari 7.0.1 (OS X 10.9 Mavericks 系統) 以上版本,或å¯è€ƒæ…®æ”¹ç”¨æœ€æ–°ç‰ˆçš„ Mozilla Firefox, Google Chrome 或 Opera。
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/global.properties b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/global.properties
new file mode 100644
index 0000000..aa2de1d
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=æ­¤é é¢æ²’有å¯é˜»æ“‹çš„é …ç›®
+action3_tooltip=點擊啟用或åœç”¨ Adblock Plus。
+notification_antiadblock_title=éš±è—é‡å°æ€§çš„訊æ¯ï¼Ÿ
+type_label_script=程å¼ç¢¼
+filter_elemhide_nocriteria=沒有指定欲隱è—元素的辨識å稱
+blockingGroup_title=廣告阻擋è¦å‰‡
+whitelisted_tooltip=Adblock Plus 在目å‰é é¢åœç”¨ã€‚
+type_label_stylesheet=樣å¼è¡¨
+blocked_count_tooltip=?1? 項,共 ?2? 項
+type_label_font=å­—é«”
+type_label_popup=彈出å¼è¦–窗
+filter_regexp_tooltip=æ­¤æ¢ä»¶å¯èƒ½æ˜¯æ­£è¦è¡¨ç¤ºæ³•æˆ–è€…å¤ªçŸ­éœ€è¦æœ€ä½³åŒ–ï¼Œå¤ªå¤šé€™é¡žéŽæ¿¾æ¢ä»¶æœƒæ‹–æ…¢ç€è¦½é€Ÿåº¦ã€‚
+action0_tooltip=點擊展開功能表,按中éµå‰‡å¯å•Ÿç”¨/åœç”¨ Adblock Plus。
+whitelisted_page=Adblock Plus 已在目å‰é é¢åœç”¨
+remove_group_warning=您確定è¦ç§»é™¤æ­¤æ¢ä»¶ç¾¤çµ„嗎?
+action1_tooltip=點擊開啟或關閉å¯é˜»æ“‹é …目清單,按中éµå‰‡å¯å•Ÿç”¨/åœç”¨ Adblock Plus。
+type_label_xmlhttprequest=XML 請求
+active_tooltip=Adblock Plus 已啟用,?1? 份æ¢ä»¶é›†å·²è¨‚閱,?2? æ¢è‡ªè¨‚æ¢ä»¶å·²ä½¿ç”¨ã€‚
+type_label_document=文件
+type_label_object_subrequest=物件å­è«‹æ±‚
+whitelistGroup_title=例外æ¢ä»¶
+disabled_tooltip=Adblock Plus å·²åœç”¨ã€‚
+filter_elemhide_duplicate_id=åªèƒ½æŒ‡å®šä¸€å€‹ ID 來隱è—該元素
+type_label_object=物件
+action2_tooltip=點擊開啟å好設定視窗,按中éµå‰‡å¯å•Ÿç”¨æˆ–åœç”¨ Adblock Plus。
+type_label_subdocument=é æ¡†
+clearStats_warning=這會é‡è¨­æ‰€æœ‰çš„æ¢ä»¶å‘½ä¸­çµ±è¨ˆä¸¦åœç”¨å‘½ä¸­è¨ˆæ•¸å™¨ã€‚您確定è¦é€™éº¼åšï¼Ÿ
+notification_antiadblock_message=å·²çŸ¥æ­¤ç¶²ç«™æœƒå° Adblock Plus 用戶顯示é‡å°æ€§çš„訊æ¯ã€‚您希望 Adblock Plus éš±è—它們嗎?
+blocked_count_addendum=(以åŠç™½åå–®: ?1?, 已隱è—: ?2?)
+subscription_invalid_location=æ¢ä»¶é›†ç¶²å€æˆ–檔案å稱無效。
+type_label_image=圖片
+remove_subscription_warning=您確定è¦ç§»é™¤æ­¤æ¢ä»¶é›†å—Žï¼Ÿ
+type_label_other=å…¶ä»–
+mobile_menu_enable=ABP:啟用
+type_label_media=音訊/影片
+mobile_menu_disable_site=ABP:在 ?1? åœç”¨
+elemhideGroup_title=元素隱è—è¦å‰‡
+mobile_menu_enable_site=ABP:在 ?1? 啟用
+type_label_elemhide=éš±è—
+newGroup_title=æ–°çš„æ¢ä»¶ç¾¤çµ„
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/overlay.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/overlay.dtd
new file mode 100644
index 0000000..76a2b80
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;確定">
+<!ENTITY notification.button.no "&amp;å–æ¶ˆ">
+<!ENTITY sync.label "åŒæ­¥ Adblo&amp;ck Plus 設定值">
+<!ENTITY whitelist.site.label "在 ?1? åœç”¨">
+<!ENTITY filters.label "æ¢ä»¶å好設定 (&amp;F)">
+<!ENTITY disable.label "完全åœç”¨">
+<!ENTITY objecttab.title "阻擋">
+<!ENTITY objecttab.tooltip "按這裡用 Adblock Plus 阻擋此物件">
+<!ENTITY menuitem.label "Ad&amp;block Plus å好設定">
+<!ENTITY objecttabs.label "Flash 和 Java 物件上顯示標籤 (&amp;t)">
+<!ENTITY sendReport.label "回報此é é¢éŒ¯èª¤ (&amp;R)">
+<!ENTITY whitelist.page.label "åªåœ¨æ­¤é é¢åœç”¨">
+<!ENTITY context.image.label "Adblock Plus:阻擋圖片">
+<!ENTITY counthits.label "計算æ¢ä»¶å‘½ä¸­æ¬¡æ•¸ (&amp;h)">
+<!ENTITY opensidebar.label "開啟å¯é˜»æ“‹é …ç›® (&amp;b)">
+<!ENTITY notification.button.close "&amp;關閉">
+<!ENTITY contribute.label "贊助 Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plusï¼šé˜»æ“‹é æ¡†">
+<!ENTITY blocked.tooltip "æ­¤é å·²é˜»æ“‹é …ç›®:">
+<!ENTITY hideplaceholders.label "éš±è—已阻擋元素所佔用的空間 (&amp;l)">
+<!ENTITY showinstatusbar.label "在狀態列顯示 (&amp;s)">
+<!ENTITY sidebar.title "本é å¯é˜»æ“‹é …ç›®">
+<!ENTITY options.label "é¸é … (&amp;O)">
+<!ENTITY context.object.label "Adblock Plus:阻擋物件">
+<!ENTITY context.removeWhitelist.label "Adblock Plus:此é ä¸è¨­ç‚ºç™½åå–®">
+<!ENTITY filters.tooltip "最活èºçš„æ¢ä»¶:">
+<!ENTITY closesidebar.label "關閉å¯é˜»æ“‹é …ç›® (&amp;b)">
+<!ENTITY showintoolbar.label "在工具列顯示 (&amp;b)">
+<!ENTITY status.tooltip "狀態:">
+<!ENTITY context.media.label "Adblock Plus:阻擋音訊/影片">
+<!ENTITY subscription.update.label "æ›´æ–°éŽæ¿¾æ¢ä»¶">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/sendReport.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/sendReport.dtd
new file mode 100644
index 0000000..8e93337
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/sendReport.dtd
@@ -0,0 +1,66 @@
+<!ENTITY screenshot.undo.label "復原 (&amp;U)">
+<!ENTITY issues.disabledgroups.description "ä¸‹åˆ—éŽæ¿¾æ¢ä»¶é›†/æ¢ä»¶ç¾¤çµ„å·²åœç”¨ï¼Œå®ƒå€‘將無法在此é é¢ç™¼æ®ä½œç”¨ï¼š">
+<!ENTITY showData.label "顯示報告資料">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus 擋了太多æ±è¥¿ (&amp;m)">
+<!ENTITY issues.change.description "æ‚¨çš„è¨­å®šå€¼å·²è®Šæ›´ã€‚è«‹åœ¨é‡æ–°è¼‰å…¥é é¢å¾Œæ¸¬è©¦éŒ¯èª¤æ˜¯å¦ä»ç„¶å­˜åœ¨ï¼Œè‹¥éŒ¯èª¤ä¾èˆŠå­˜åœ¨ï¼Œè«‹å‚³é€éŒ¯èª¤å ±å‘Šã€‚">
+<!ENTITY email.label "E&amp;mail:">
+<!ENTITY issues.openPreferences.label "開啟æ¢ä»¶å好設定">
+<!ENTITY sendPage.confirmation "報告已儲存。您å¯ä»¥åœ¨ä¸‹åˆ—ç¶²å€å­˜å–:">
+<!ENTITY copyLink.label "è¤‡è£½å ±å‘Šé€£çµ (&amp;C)">
+<!ENTITY issues.nofilters.description "Adblock Plus 在此é é¢æ²’有阻擋任何æ±è¥¿ã€‚您回報的錯誤å¯èƒ½å’Œ Adblock Plus 無關。">
+<!ENTITY sendPage.knownIssue "您回報的錯誤已é‡è¤‡ã€‚檢視更多資訊:">
+<!ENTITY typeSelector.other.description "鏿“‡æ­¤é¸é …表示有其他錯誤發生,而且您懷疑是 Adblock Plus 本身引起而éžéŽæ¿¾æ¢ä»¶é€ æˆçš„錯誤。">
+<!ENTITY issues.disabledgroups.enable.label "å•Ÿç”¨éŽæ¿¾æ¢ä»¶é›†/æ¢ä»¶ç¾¤çµ„">
+<!ENTITY typeWarning.override.label "我了解並堅æŒè¦å‚³é€éŒ¯èª¤å ±å‘Š (&amp;s)">
+<!ENTITY issues.disabled.enable.label "啟用 Adblock Plus">
+<!ENTITY update.fixed.description "éŽæ¿¾æ¢ä»¶é›†æ›´æ–°å¾Œå¾ˆå¯èƒ½è§£æ±ºäº†æ‚¨æ­£è¦å›žå ±çš„å•é¡Œã€‚è«‹é‡æ–°è¼‰å…¥ç¶²é å¾Œå†è©¦ä¸€æ¬¡ï¼Œè‹¥å•題ä»åœ¨è«‹å†æ¬¡å›žå ±ã€‚">
+<!ENTITY anonymous.label "ä»¥åŒ¿åæ–¹å¼æäº¤">
+<!ENTITY reloadButton.label "釿–°è¼‰å…¥é é¢ (&amp;R)">
+<!ENTITY recentReports.clear.label "移除所有錯誤報告 (&amp;R)">
+<!ENTITY typeSelector.description "本視窗會一步步指導您傳é€ä¸€ä»½ Adblock Plus éŒ¯èª¤å ±å‘Šã€‚é¦–å…ˆï¼Œè«‹é¸æ“‡æ‚¨åœ¨æ­¤é é¢ç¢°åˆ°çš„錯誤類型:">
+<!ENTITY screenshot.remove.label "ç§»é™¤æ•æ„Ÿè³‡æ–™ (&amp;R)">
+<!ENTITY issues.ownfilters.description "套用到此é é¢ä¸­çš„æ¢ä»¶æœ‰éƒ¨ä»½æ˜¯ç”±ä½¿ç”¨è€…å®šç¾©çš„ã€‚è«‹åœç”¨é€™äº›éŽæ¿¾æ¢ä»¶ï¼Œé€™å¾ˆå¯èƒ½å°±æ˜¯å°Žè‡´éŒ¯èª¤ç™¼ç”Ÿçš„原因:">
+<!ENTITY update.inProgress.description "Adblock Plus éœ€è¦æ›´æ–°æ‚¨çš„éŽæ¿¾æ¢ä»¶é›†ä¾†ç¢ºå®šé€™å€‹å•é¡Œä»æœªè§£æ±ºã€‚è«‹ç¨å€™â€¦">
+<!ENTITY sendPage.retry.label "冿¬¡å‚³é€">
+<!ENTITY data.label "報告資料: (&amp;p)">
+<!ENTITY recentReports.label "您最近的錯誤報告">
+<!ENTITY typeWarning.description "您表示è¦å›žå ±çš„錯誤是 Adblock Plus 本身的錯誤而éžéŽæ¿¾æ¢ä»¶å¼•起的錯誤。請注æ„,這類錯誤最好到 [link]Adblock Plus 討論å€[/link] ä¸Šå›žå ±ã€‚åªæœ‰ç‚ºè¨Žè«–ä¸²ä½œè£œå……æ™‚æ‰æ‡‰è©²ä½¿ç”¨éŒ¯èª¤å›žå ±å™¨ï¼Œæ²’有人會察覺您的錯誤報告網å€ï¼Œé™¤éžæ‚¨å°‡é€£çµè²¼å‡ºä¾†ã€‚
+ çµåœ¨å‚³é€æˆåŠŸä¹‹å¾Œæœƒè‡ªå‹•ç”¢ç”Ÿã€‚">
+<!ENTITY issues.disabled.description "Adblock Plus å·²åœç”¨ï¼Œç›®å‰ç‹€æ…‹ä¸‹ä¸æœƒé˜»æ“‹ä»»ä½•ç¶²é å…§å®¹ã€‚">
+<!ENTITY attachExtensions.label "附加目å‰å•Ÿç”¨çš„æ“´å……套件列表至報告中,以便排除因套件è¡çªæ‰€ç”¢ç”Ÿçš„å•題 (&amp;x)">
+<!ENTITY issues.nosubscriptions.add.label "è¨‚é–±éŽæ¿¾æ¢ä»¶é›†">
+<!ENTITY issues.disabledfilters.enable.label "å•Ÿç”¨éŽæ¿¾æ¢ä»¶">
+<!ENTITY issues.override.label "設定值是正確的,繼續回報錯誤 (&amp;c)">
+<!ENTITY issues.nosubscriptions.description "æ‚¨ä¼¼ä¹Žæ²’æœ‰è¨‚é–±ä»»ä½•éŽæ¿¾æ¢ä»¶é›†ï¼Œè¨‚é–±éŽæ¿¾æ¢ä»¶é›†å¯è‡ªå‹•移除與網é å…§å®¹ç„¡é—œçš„廣告。">
+<!ENTITY typeSelector.falsePositive.description "鏿“‡æ­¤é¸é …表示網é ç¼ºå°‘了主è¦å…§å®¹ã€é¡¯ç¤ºéŒ¯èª¤æˆ–功能異常。您å¯ä»¥æš«æ™‚åœç”¨ Adblock Plus 後å†è©¦ä¸€æ¬¡ï¼Œè‹¥åœç”¨å¾Œå•題消失,則很å¯èƒ½å°±æ˜¯ Adblock Plus çš„å•題。">
+<!ENTITY typeSelector.other.label "å…¶ä»–å•題 (&amp;t)">
+<!ENTITY emailComment.label "建議您輸入有效的電å­éƒµä»¶ä½å€ï¼Œå¦‚此我們æ‰èƒ½åœ¨æœ‰ç–‘啿™‚連絡您。這也會用來辨識您所æäº¤çš„報告,並æé«˜å…¶å„ªå…ˆæ¬Šã€‚">
+<!ENTITY issues.whitelist.remove.label "在此é é¢é‡æ–°å•Ÿç”¨ Adblock Plus">
+<!ENTITY outdatedSubscriptions.description "ä¸‹åˆ—çš„éŽæ¿¾æ¢ä»¶é›†è‡³å°‘兩個星期沒有更新。請在é€å‡ºå ±å‘Šå‰æ›´æ–°é€™äº›æ¢ä»¶é›†ï¼Œèªªä¸å®šå•題已經解決了。">
+<!ENTITY dataCollector.description "è«‹ç¨å€™ï¼ŒAdblock Plus 正在è’集必è¦çš„資料。">
+<!ENTITY sendButton.label "傳é€å ±å‘Š (&amp;n)">
+<!ENTITY comment.label "備註 (é¸ç”¨): (&amp;C)">
+<!ENTITY sendPage.errorMessage "嘗試傳é€å ±å‘Šå¤±æ•—,錯誤碼 &quot;?1?&quot;。請確定您已連上網路後å†è©¦ä¸€æ¬¡ã€‚è‹¥ä¾èˆŠå¤±æ•—,請到 [link]Adblock Plus 討論å€[/link] 尋求å”助。">
+<!ENTITY showRecentReports.label "顯示最近傳é€çš„錯誤報告">
+<!ENTITY commentPage.heading "輸入註解">
+<!ENTITY update.start.label "ç«‹å³æ›´æ–°">
+<!ENTITY issues.disabledfilters.description "ä¸‹åˆ—éŽæ¿¾æ¢ä»¶å·²åœç”¨ï¼Œå®ƒå€‘將無法在此é é¢ç™¼æ®ä½œç”¨ï¼š">
+<!ENTITY screenshot.description "åŒæ¨£çš„é é¢æ¯å€‹äººçœ‹åˆ°çš„æƒ…æ³å¯èƒ½éƒ½ä¸åŒã€‚附加螢幕擷圖到報告中å¯ä»¥å¹«åŠ©æˆ‘å€‘æ›´äº†è§£å•題所在。您å¯ä»¥å…ˆç§»é™¤åŒ…嫿•感資訊的部份,也å¯ä»¥æ¨™ç¤ºå•題發生的å€åŸŸï¼Œä½¿å…¶æ›´ç‚ºé†’目。åªè¦æŒ‰ä¸‹ç›¸æ‡‰çš„æŒ‰éˆ•並用滑鼠在圖片上é¸å–å³å¯ã€‚">
+<!ENTITY screenshot.attach.label "附加é é¢åœ–片到報告中 (&amp;t)">
+<!ENTITY issues.whitelist.description "Adblock Plus 在您目å‰å›žå ±çš„é é¢ä¸­åœç”¨ã€‚請在é€å‡ºå ±å‘Šå‰å†æ¬¡å•Ÿç”¨ä¸¦é‡æ–°è¼‰å…¥è©²ç¶²é ä»¥å”助調查。">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus 沒有擋掉廣告 (&amp;v)">
+<!ENTITY typeSelector.heading "鏿“‡å•題類型">
+<!ENTITY anonymity.warning "我們將無法è¯çµ¡æ‚¨ï¼Œä¸”此報告的優先權å¯èƒ½æœƒç›¸å°è¼ƒä½Žã€‚">
+<!ENTITY wizard.title "錯誤回報器">
+<!ENTITY issues.ownfilters.disable.label "åœç”¨éŽæ¿¾æ¢ä»¶">
+<!ENTITY commentPage.description "下é¢çš„æ–‡å­—方塊å¯ä»¥è®“您輸入é¡å¤–的註解,以幫助我們更了解å•é¡Œæ‰€åœ¨ã€‚é€™å€‹æ­¥é©Ÿä¸æ˜¯å¿…須的,但若å•題ä¸å¤ªæ˜Žé¡¯æ™‚還是建議您這麼åšã€‚åœ¨å›žå ±ä¹‹å‰æ‚¨ä¹Ÿå¯ä»¥æª¢è¦–報告資料。">
+<!ENTITY comment.lengthWarning "æ‚¨è¼¸å…¥çš„è¨»è§£è¶…éŽ 1000 å€‹å­—å…ƒã€‚åªæœ‰å‰ 1000 個字元會被傳é€ã€‚">
+<!ENTITY typeSelector.falseNegative.description "鏿“‡æ­¤é¸é …表示雖然已啟用 Adblock Plus,但廣告ä¾ç„¶é¡¯ç¤ºåœ¨ç¶²é ä¸­ã€‚">
+<!ENTITY sendPage.waitMessage "è«‹ç¨å€™ï¼ŒAdblock Plus æ­£åœ¨å‚³é€æ‚¨çš„報告。">
+<!ENTITY dataCollector.heading "歡迎使用錯誤回報器">
+<!ENTITY screenshot.heading "附加螢幕擷圖">
+<!ENTITY sendPage.heading "傳é€å ±å‘Š">
+<!ENTITY issues.subscriptionCount.description "您似乎訂閱了éŽå¤šçš„éŽæ¿¾æ¢ä»¶é›†ã€‚我們ä¸å»ºè­°é€™éº¼åšï¼Œé€™å¯èƒ½æœƒå¢žåŠ ç™¼ç”ŸéŒ¯èª¤çš„æ©ŸçŽ‡ã€‚åŒæ™‚æˆ‘å€‘ç„¡æ³•æŽ¥å—æ‚¨çš„éŒ¯èª¤å›žå ±ï¼Œå› ç‚ºé‚„ä¸æ¸…æ¥šæ˜¯å“ªä½æ¢ä»¶é›†ä½œè€…需è¦åšå‡ºä¿®æ­£ã€‚請移除ä¸é‡è¦çš„éŽæ¿¾æ¢ä»¶é›†å¾Œå†è©¦ä¸€æ¬¡ï¼Œçœ‹çœ‹éŒ¯èª¤æ˜¯å¦ä»æœƒç™¼ç”Ÿã€‚">
+<!ENTITY screenshot.mark.label "標示å•題所在 (&amp;M)">
+<!ENTITY privacyPolicy.label "éš±ç§æ¬Šæ”¿ç­–">
+<!ENTITY issues.description "Adblock Plus 嵿¸¬åˆ°æ‚¨çš„設定值å¯èƒ½å°Žè‡´å•題發生,或使調查變得難以進行。">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/sidebar.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/sidebar.dtd
new file mode 100644
index 0000000..b25a6ce
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "é–ƒçˆç‰©ä»¶é‚Šæ¡†">
+<!ENTITY address.label "ä½å€">
+<!ENTITY context.open.label "於新分é é–‹å•Ÿ">
+<!ENTITY type.label "類型">
+<!ENTITY tooltip.filterSource.label "æ¢ä»¶ä¾†æºï¼š">
+<!ENTITY noitems.label "ç„¡å¯é˜»æ“‹é …ç›®">
+<!ENTITY filter.label "éŽæ¿¾æ¢ä»¶">
+<!ENTITY tooltip.size.label "大å°ï¼š">
+<!ENTITY reattach.label "固定">
+<!ENTITY search.label "æœå°‹ï¼š (&amp;S)">
+<!ENTITY docDomain.thirdParty "(第三方)">
+<!ENTITY filterSource.label "æ¢ä»¶ä¾†æº">
+<!ENTITY tooltip.docDomain.label "文件來æºï¼š">
+<!ENTITY context.copy.label "複製項目ä½å€">
+<!ENTITY tooltip.type.label "類型:">
+<!ENTITY context.disablefilter.label "åœç”¨éŽæ¿¾æ¢ä»¶ ?1?">
+<!ENTITY context.copyFilter.label "è¤‡è£½éŽæ¿¾æ¢ä»¶">
+<!ENTITY context.block.label "阻擋此項目">
+<!ENTITY context.enablefilter.label "釿–°å•Ÿç”¨éŽæ¿¾æ¢ä»¶ ?1?">
+<!ENTITY detach.label "分離">
+<!ENTITY whitelisted.label "æ­¤é é¢å·²åŠ å…¥ç™½åå–®">
+<!ENTITY context.disablefilteronsite.label "在 ?1? åœç”¨æ­¤éŽæ¿¾æ¢ä»¶">
+<!ENTITY detached.title "Adblock Plus:å¯é˜»æ“‹é …目(已分離)">
+<!ENTITY docDomain.firstParty "(第一方)">
+<!ENTITY tooltip.type.whitelisted "(白åå–®)">
+<!ENTITY tooltip.filter.label "作用中的æ¢ä»¶ï¼š">
+<!ENTITY tooltip.filter.disabled "(å·²åœç”¨)">
+<!ENTITY context.editfilter.label "編輯作用中的æ¢ä»¶">
+<!ENTITY tooltip.type.blocked "(已阻擋)">
+<!ENTITY size.label "大å°">
+<!ENTITY context.whitelist.label "將此項目加為例外æ¢ä»¶">
+<!ENTITY context.selectAll.label "å…¨é¸">
+<!ENTITY state.label "狀態">
+<!ENTITY docDomain.label "文件來æº">
+<!ENTITY tooltip.address.label "ä½å€ï¼š">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/subscriptionSelection.dtd b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/subscriptionSelection.dtd
new file mode 100644
index 0000000..2752cd1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "一併訂閱 &quot;?1?&quot; æ¢ä»¶é›† (&amp;s)">
+<!ENTITY list.download.failed "接收æ¢ä»¶é›†æ¸…單失敗。">
+<!ENTITY list.download.retry "å†è©¦ä¸€æ¬¡">
+<!ENTITY title.label "éŽæ¿¾æ¢ä»¶é›†å稱: (&amp;t)">
+<!ENTITY list.download.website "造訪網站">
+<!ENTITY supplementMessage "æ­¤éŽæ¿¾æ¢ä»¶é›†éœ€è¦èˆ‡æ‚¨å°šæœªè¨‚閱的 &quot;?1?&quot; åŒæ™‚使用。">
+<!ENTITY viewList.label "æª¢è¦–éŽæ¿¾æ¢ä»¶">
+<!ENTITY visitHomepage.label "造訪首é ">
+<!ENTITY addSubscription.label "æ–°å¢žéŽæ¿¾æ¢ä»¶é›†">
+<!ENTITY dialog.title "新增 Adblock Plus éŽæ¿¾æ¢ä»¶é›†">
+<!ENTITY location.label "éŽæ¿¾æ¢ä»¶é›†ä½å€ï¼š (&amp;l)">
+<!ENTITY fromWeb.description "è«‹ç¢ºèªæ‚¨æ˜¯å¦è¦è¨‚閱這個æ¢ä»¶é›†ã€‚è¨‚é–±å‰æ‚¨å¯ä»¥è®Šæ›´æ¢ä»¶é›†æ¨™é¡Œæˆ–ä½å€ã€‚">
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-icon-big.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-icon-big.png
new file mode 100644
index 0000000..85cce1c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-icon-big.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status-16.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status-16.png
new file mode 100644
index 0000000..c3abf18
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status-16.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status-32.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status-32.png
new file mode 100644
index 0000000..da2a318
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status-32.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status.png
new file mode 100644
index 0000000..a1c4e0b
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/ajax-loader.gif b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/ajax-loader.gif
new file mode 100644
index 0000000..a642494
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/ajax-loader.gif
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background-main.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background-main.png
new file mode 100644
index 0000000..464a997
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background-main.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background-share.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background-share.png
new file mode 100644
index 0000000..b572b56
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background-share.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background.png
new file mode 100644
index 0000000..bb19387
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/checkbox.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/checkbox.png
new file mode 100644
index 0000000..ba6c53e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/checkbox.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/close.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/close.png
new file mode 100644
index 0000000..a4aaf5c
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/close.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/composer.css b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/composer.css
new file mode 100644
index 0000000..da75ba4
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/composer.css
@@ -0,0 +1,77 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
+@namespace html url("http://www.w3.org/1999/xhtml");
+
+/*
+ * Force left-to-right everywhere where we are displaying addresses
+ */
+.suggestion > .radio-label-box:-moz-locale-dir(rtl),
+html|*.textbox-input:-moz-locale-dir(rtl)
+{
+ direction: ltr;
+ text-align: end;
+}
+
+#patternGroup {
+ overflow: auto;
+}
+
+#anchorGroup {
+ padding-left: 20px;
+}
+
+#typeGroupLabel {
+ margin-top: 10px;
+}
+
+#typeGroup {
+ overflow: auto;
+ margin-bottom: 10px
+}
+
+:root:not([advancedMode="true"]) #options {
+ display: none;
+}
+
+#disabledWarning, #groupDisabledWarning, #regexpWarning, #shortpatternWarning, #matchWarning {
+ color: #E00000;
+}
+
+#disabledWarning > *, #groupDisabledWarning > * {
+ margin: 0px;
+ font-size: inherit;
+}
+
+.text-link {
+ font-size: 80%;
+ -moz-user-focus: ignore;
+}
+
+.help {
+ color: #0000E0;
+ border-bottom: 1px dotted #0000E0;
+ cursor: help;
+ margin: 0px;
+ padding: 0px;
+}
+
+tooltip {
+ /* Gecko 1.8.1 doesn't support multiline tooltips :-( */
+ max-width: none;
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/donate.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/donate.png
new file mode 100644
index 0000000..3e77b37
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/donate.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/malware.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/malware.png
new file mode 100644
index 0000000..9b51b63
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/malware.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/social.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/social.png
new file mode 100644
index 0000000..a2af1ea
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/social.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/tracking.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/tracking.png
new file mode 100644
index 0000000..a8727a9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/tracking.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/filters.css b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/filters.css
new file mode 100644
index 0000000..a4ea586
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/filters.css
@@ -0,0 +1,221 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
+
+#buttons
+{
+ margin-top: 10px;
+}
+
+#noSubscriptions
+{
+ font-style: italic;
+}
+
+.localeMatch
+{
+ font-weight: bold;
+}
+.selectSubscriptionItem
+{
+ margin: 0px;
+}
+
+.subscription
+{
+ padding: 5px;
+}
+.subscription:not(:last-child)
+{
+ border-bottom: 1px solid rgba(0, 0, 0, 0.25);
+}
+.subscription:not([selected="true"]) > .disabled
+{
+}
+
+.subscription:not([selected="true"]) > .disabled .titleBox
+{
+ color: #808080;
+}
+.subscription:not([selected="true"]) > .disabled .status
+{
+ color: #808080;
+}
+
+.titleBox .title,
+.titleBox > .titleEditor
+{
+ font-weight: bold;
+}
+
+.subscription description, .subscription textbox
+{
+ margin: 0px !important;
+ padding: 0px !important;
+ border-width: 0px !important;
+ -moz-appearance: none !important;
+}
+
+.subscription .link
+{
+ text-decoration: underline;
+ cursor: pointer;
+}
+
+.subscription .warning
+{
+ color: #FF0000;
+}
+
+.enabledCheckbox
+{
+ padding: 2px;
+ -moz-margin-end: 10px;
+}
+.enabledCheckbox:focus
+{
+ outline: 1px dotted gray;
+}
+.enabledCheckbox .checkbox-label-box
+{
+ display: none;
+}
+
+.actionButton
+{
+ font: -moz-info;
+}
+
+splitter
+{
+ border-width: 0px !important;
+}
+
+#filtersTooltip
+{
+ max-width: none;
+}
+
+.tooltipLabel
+{
+ font-weight: bold;
+ -moz-margin-end: 10px;
+}
+
+#tooltip-additional
+{
+ color: #C00000;
+ margin-top: 10px;
+}
+
+tree
+{
+ margin: 0px;
+}
+
+#col-slow {
+ text-align: center;
+}
+
+#col-hitcount, #col-lasthit {
+ text-align: right;
+}
+
+#col-hitcount
+{
+ min-width: 60px;
+}
+#col-enabled
+{
+ min-width: 48px;
+}
+#col-slow
+{
+ min-width: 30px;
+}
+
+/*
+ * Force left-to-right for filter text but not comments
+ */
+treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter, type-invalid),
+treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter, type-whitelist),
+treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter, type-filterlist),
+treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter, type-elemhide),
+treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter, type-elemhideexception)
+{
+ direction: ltr;
+ text-align: end;
+}
+
+treechildren::-moz-tree-cell-text(col-filter, dummy-true)
+{
+ font-style: italic;
+}
+
+treechildren::-moz-tree-cell-text(col-filter, type-whitelist, selected-false),
+treechildren::-moz-tree-cell-text(col-filter, type-elemhideexception, selected-false)
+{
+ color: #008000;
+}
+
+treechildren::-moz-tree-cell-text(col-filter, type-elemhide, selected-false)
+{
+ color: #000080;
+}
+
+treechildren::-moz-tree-cell-text(col-slow)
+{
+ font-size: 0px;
+}
+
+treechildren::-moz-tree-cell-text(col-filter, disabled-true, selected-false)
+{
+ color: #808080;
+}
+
+treechildren::-moz-tree-cell-text(col-filter, type-comment, selected-false)
+{
+ color: #808080;
+}
+
+treechildren::-moz-tree-cell-text(col-filter, type-invalid, selected-false)
+{
+ color: #C00000;
+}
+
+treechildren::-moz-tree-image(col-enabled, disabled-true)
+{
+ list-style-image: url(checkbox.png);
+ -moz-image-region: rect(13px 13px 26px 0px);
+}
+
+treechildren::-moz-tree-image(col-enabled, disabled-false)
+{
+ list-style-image: url(checkbox.png);
+ -moz-image-region: rect(0px 13px 13px 0px);
+}
+
+treechildren::-moz-tree-image(col-slow, slow-true)
+{
+ list-style-image: url(slow.png);
+}
+
+.findbar-highlight
+{
+ display: none;
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/firstRun.css b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/firstRun.css
new file mode 100644
index 0000000..7a02ad6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/firstRun.css
@@ -0,0 +1,588 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+@font-face {
+ font-family: 'CreteRound';
+ font-style: normal;
+ src: url(fonts/CreteRound-Regular.otf);
+ src: local ('Ø'),
+ /*local ('Ø') forces using no local font called CreteRound*/
+ url(fonts/CreteRound-Regular.otf) format('otf');
+}
+
+@font-face {
+ font-family: 'CreteRound';
+ font-style: italic;
+ src: url(fonts/CreteRound-Italic.otf);
+ src: local ('Ø'),
+ /*local ('Ø') forces using no local font called CreteRound*/
+ url(fonts/CreteRound-Italic.otf) format('otf');
+}
+
+body
+{
+ font-family: Helvetica, Arial, sans-serif;
+ font-size: 15px;
+ line-height: 140%;
+ color: #7f776b;
+ background-color: #f8f6f2;
+ background-image: url(background-main.png);
+ margin: 0;
+ padding: 0;
+}
+
+a, a:link, a:visited
+{
+ color: #5a84b3;
+ text-decoration: underline;
+}
+
+a:hover
+{
+ text-decoration: none;
+}
+
+button
+{
+ cursor: pointer;
+}
+
+ul
+{
+ margin: 0;
+ padding: 0;
+}
+
+li
+{
+ margin: 0;
+ padding: 0;
+ list-style-type: none;
+}
+
+header
+{
+ background-image: url(background.png);
+ background-repeat: repeat-x;
+ width: 100%;
+ padding: 40px 0 0 0;
+}
+
+header h1
+{
+ font-size: 24px;
+ font-weight: normal;
+ color: #57ab5b;
+ text-align: center;
+ margin: 21px auto;
+ padding: 16px 0 14px 0;
+ border: 1px #57ab5b;
+ border-style: dashed none;
+ /* border parallel fix - 957px is the value
+ * closest to 960px(page width) which makes
+ * the dashed border parallel
+ */
+ max-width: 957px;
+}
+
+h1,h2,h3
+{
+ font-family: CreteRound, Helvetica, Arial, sans-serif;
+}
+
+h2
+{
+ font-size: 26px;
+ font-weight: lighter;
+ color: #968d81;
+ line-height: 28px;
+ text-align: center;
+ margin: 0;
+ padding: 0;
+}
+
+h3
+{
+ font-size: 22px;
+ color: #7F776B;
+ font-weight: normal;
+ margin: 0 0 10px 0;
+ padding: 0;
+ line-height: 24px;
+}
+
+h4
+{
+ font-size: 15px;
+ color: #7f776b;
+ font-weight: normal;
+ text-align: center;
+ margin: 0;
+ padding: 0;
+}
+
+section
+{
+ margin: 0 auto;
+ margin-bottom: 30px;
+ max-width: 760px;
+ background-image: url(background.png);
+ padding: 40px 100px;
+}
+
+section > p
+{
+ margin: 15px 0 0 0;
+}
+
+#logo
+{
+ margin: 0 auto;
+ height: 100px;
+ width: 99px;
+ display: block;
+ background-image: url(abp-icon-big.png);
+ background-repeat: no-repeat;
+}
+
+#can-do-more
+{
+ max-width: 960px;
+ padding: 40px 0px 0px 0px;
+ border-bottom: 4px solid #968D81;
+}
+
+#can-do-more > h2
+{
+ margin: 0 100px;
+}
+
+.feature-malware-image
+{
+ background-image: url(features/malware.png);
+ background-repeat: no-repeat;
+}
+
+.feature-social-image
+{
+ background-image: url(features/social.png);
+ background-repeat: no-repeat;
+}
+
+.feature-tracking-image
+{
+ background-image: url(features/tracking.png);
+ background-repeat: no-repeat;
+}
+
+#can-do-more-content
+{
+ margin: 30px 100px 20px 100px;
+}
+
+#can-do-more #features
+{
+ border-spacing: 10px;
+ margin: 0px;
+ padding: 0px;
+}
+
+#can-do-more .feature:not([hidden])
+{
+ display: block;
+ list-style-type: none;
+ padding: 30px 0;
+ padding-bottom: 20px;
+ border-top: 1px dashed #c0bebb;
+}
+
+#can-do-more .feature-image, #can-do-more .feature-description
+{
+ display: inline-block;
+ *display: inline; /* IE6 inline-block fix */
+ *zoom: 1;
+ vertical-align: top;
+}
+
+#can-do-more .feature-description
+{
+ margin: 0px 0px 0 20px;
+ width: 625px;
+ max-width: 85%;
+}
+
+#can-do-more .feature-description-textblock
+{
+ width: 480px;
+ max-width: 100%;
+ margin: 0 40px 0 0;
+ display: inline-block;
+}
+
+#can-do-more .feature-description-textblock > span
+{
+ margin: 15px 0 0 0;
+}
+
+#can-do-more .feature-image
+{
+ width: 59px;
+ height: 59px;
+ margin: 8px 0 10px 20px;
+}
+
+#share
+{
+ background-image: url(background-share.png);
+ padding: 50px 100px 40px 100px;
+ max-width: 760px;
+ text-align: center;
+ font-family: CreteRound, Helvetica, Arial, sans-serif;
+}
+
+#share h2
+{
+ color: #fff;
+ margin: 0 0 30px 0;
+}
+
+#share h2 > a
+{
+ color: #fff;
+}
+
+#share h2 > a:hover
+{
+ color: #2e5075;
+}
+
+#share span
+{
+ color: #bed1e6;
+ text-align: center;
+ line-height: 34px;
+ font-size: 22px;
+ display: block;
+}
+
+#donate:hover, .share-buttons a:hover
+{
+ box-shadow: 0px 0px 0px 2px #8ca7c4;
+ border-radius: 30px;
+}
+
+#donate-block span, #share-block span
+{
+ margin: 10px 20px 0px 20px;
+}
+
+#donate-block, #share-block
+{
+ min-width: 250px;
+ display: inline-block;
+ vertical-align: top;
+ padding: 5px 0 5px 0;
+}
+
+#donate-block
+{
+ border: 1px dashed #37506d;
+ border-style: none dashed;
+ width: 50%;
+}
+
+#share-block
+{
+ border-right: 1px dashed #37506d;
+ width: 49%;
+}
+
+.share-buttons
+{
+ margin: 6px 0 0 0;
+ cursor: pointer;
+ vertical-align: top;
+ /* because inline block creates
+ * space if not captured with
+ * font-size and line-height 0px
+ */
+ font-size: 0px;
+ line-height: 0px;
+}
+
+.share-buttons > a
+{
+ width: 50px;
+ height: 50px;
+ margin: 0 8px;
+ text-decoration: none;
+ display: inline-block;
+}
+
+#share-general,
+:root[lang^="zh-"] #share-chinese
+{
+ display: block;
+}
+
+:root[lang^="zh-"] #share-general,
+#share-chinese
+{
+ display: none;
+}
+
+#share-chinese > a
+{
+ border-bottom: 2px solid transparent;
+}
+
+#share-chinese > a:hover
+{
+ box-shadow: none;
+ border-radius: 0;
+ border-bottom: 2px solid #8CA7C4;
+}
+
+#share-facebook
+{
+ background-image: url(social/facebook.png);
+ background-repeat: no-repeat;
+}
+
+#share-twitter
+{
+ background-image: url(social/twitter.png);
+ background-repeat: no-repeat;
+}
+
+#share-gplus
+{
+ background-image: url(social/googleplus.png);
+ background-repeat: no-repeat;
+}
+
+#share-renren
+{
+ background-image: url(social/renren.png);
+ background-repeat: no-repeat;
+}
+
+#share-weibo
+{
+ background-image: url(social/weibo.png);
+ background-repeat: no-repeat;
+}
+
+.warning
+{
+ font-size: 160%;
+ border: 3px dashed red;
+ text-align: center;
+ line-height: 1.3em;
+}
+
+#social ul
+{
+ list-style: none;
+ display: inline-block;
+ padding: 0;
+ margin: 0;
+}
+
+#social:hover h1
+{
+ opacity: 0;
+}
+
+#social ul:hover li {
+ opacity: 0.3;
+}
+
+#social ul li
+{
+ display: inline-block;
+ margin: 0px 5px;
+ -webkit-transition: opacity .5s ease, bottom .3s ease;
+ transition: opacity .5s ease, bottom .3s ease;
+ position: relative;
+ bottom: -30px;
+}
+
+#social ul li:hover
+{
+ opacity: 1.0;
+ bottom: 0px;
+}
+
+.share-button
+{
+ display: inline-block;
+ width: 82px;
+ height: 82px;
+}
+
+#glass-pane, #share-popup
+{
+ visibility: hidden;
+ opacity: 0;
+ -webkit-transition-property: opacity;
+ transition-property: opacity;
+}
+
+#glass-pane
+{
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ background: rgba(0, 0, 0, 0.5) url(ajax-loader.gif) no-repeat 50% 50%;
+ z-index: 101;
+ -webkit-transition-duration: 0.2s;
+ transition-duration: 0.2s;
+}
+
+#share-popup
+{
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ border: none;
+ -webkit-transition-delay: 0.1s;
+ transition-delay: 0.1s;
+}
+
+#glass-pane.visible, #share-popup.visible
+{
+ visibility: visible;
+ opacity: 1;
+}
+
+#share-popup.visible
+{
+ -webkit-transition-duration: 0.15s;
+ transition-duration: 0.15s;
+}
+
+.toggle
+{
+ cursor: pointer;
+ position: relative;
+ display: inline-block;
+ vertical-align: top;
+ height: 22px;
+ margin: 32px 0px 7px 0px;
+ border-radius: 9999px;
+ border: 1px solid #999;
+ overflow: hidden;
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ user-select: none;
+}
+
+.toggle:hover
+{
+ box-shadow: 0px 0px 3px 0px #968d81;
+}
+
+.toggle:active
+{
+ cursor: wait;
+}
+
+.toggle-on, .toggle-off
+{
+ min-width: 42px;
+ height: 100%;
+ font-size: 11px;
+ font-weight: 500;
+ text-align: center;
+ line-height: 23px;
+ border-radius: 9999px;
+}
+
+.toggle-on
+{
+ padding: 0px 30px 0px 10px;
+ color: rgba(255,255,255, 0.8);
+ text-shadow: 1px 1px rgba(0,0,0,0.2);
+ box-shadow: inset 2px 2px 6px rgba(0,0,0,0.2);
+ background: rgb(69,163,31);
+}
+
+.toggle-off
+{
+ padding: 0px 10px 0px 30px;
+ color: rgba(0,0,0,0.6);
+ text-shadow: 1px 1px rgba(255,255,255,0.2);
+ background: #cfcfcf;
+ background: -moz-linear-gradient(top, #cfcfcf 0%, #f5f5f5 100%);
+ background: -webkit-linear-gradient(top, #cfcfcf 0%,#f5f5f5 100%);
+ background: linear-gradient(to bottom, #cfcfcf 0%,#f5f5f5 100%);
+}
+
+.toggle-blob
+{
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ height: 100%;
+ width: 22px;
+ border-radius: 50px;
+ background: #cfcfcf;
+ background: -moz-linear-gradient(bottom, #cfcfcf 0%, #f5f5f5 100%);
+ background: -webkit-linear-gradient(bottom, #cfcfcf 0%,#f5f5f5 100%);
+ background: linear-gradient(to top, #cfcfcf 0%,#f5f5f5 100%);
+ box-shadow: 1px 1px 2px #888;
+}
+
+.off .toggle-on
+{
+ margin-top: -22px;
+}
+
+.off .toggle-blob
+{
+ left: 0px;
+ right: auto;
+}
+
+#donate
+{
+ height: 21px;
+ display: inline-block;
+ margin: 15px 0px 2px 0px;
+ font-size: 16px;
+ color: #003366;
+ cursor: pointer;
+ font-weight: bold;
+ padding: 5px 18px;
+ text-decoration: none;
+ border-radius: 20px;
+ border: 1px solid #FF9933;
+ overflow: hidden;
+ font-family: arial, sans-serif;
+ background-image: url(donate.png);
+ background-repeat: repeat-x;
+}
+
+footer
+{
+ margin: 0 auto 30px;
+ max-width: 960px;
+ text-align: center;
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/fonts/CreteRound-Italic.otf b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/fonts/CreteRound-Italic.otf
new file mode 100644
index 0000000..169bced
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/fonts/CreteRound-Italic.otf
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/fonts/CreteRound-Regular.otf b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/fonts/CreteRound-Regular.otf
new file mode 100644
index 0000000..d951855
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/fonts/CreteRound-Regular.otf
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/item-state.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/item-state.png
new file mode 100644
index 0000000..a494379
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/item-state.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/overlay.css b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/overlay.css
new file mode 100644
index 0000000..0f58a15
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/overlay.css
@@ -0,0 +1,226 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
+@namespace html url("http://www.w3.org/1999/xhtml");
+
+#abp-status
+{
+ cursor: pointer;
+}
+
+toolbar[iconsize="small"] #abp-toolbarbutton,
+#PersonalToolbar #abp-toolbarbutton,
+#header-view-toolbar > #abp-toolbarbutton,
+#abp-status {
+ list-style-image: url("abp-status-16.png");
+ -moz-image-region: rect(0px, 16px, 16px, 0px);
+}
+toolbar[iconsize="small"] #abp-toolbarbutton[abpstate="disabled"],
+#PersonalToolbar #abp-toolbarbutton[abpstate="disabled"],
+#header-view-toolbar > #abp-toolbarbutton[abpstate="disabled"],
+#abp-status[abpstate="disabled"],
+toolbar[iconsize="small"] #abp-toolbarbutton[abpstate="whitelisted"],
+#PersonalToolbar #abp-toolbarbutton[abpstate="whitelisted"],
+#header-view-toolbar > #abp-toolbarbutton[abpstate="whitelisted"],
+#abp-status[abpstate="whitelisted"] {
+ -moz-image-region: rect(16px, 16px, 32px, 0px);
+}
+
+#abp-toolbarbutton[cui-areatype="menu-panel"],
+toolbarpaletteitem[place="palette"] > #abp-toolbarbutton
+{
+ list-style-image: url("abp-status-32.png");
+ -moz-image-region: rect(0px, 32px, 32px, 0px);
+}
+
+#abp-toolbarbutton[cui-areatype="menu-panel"][abpstate="disabled"],
+toolbarpaletteitem[place="palette"] > #abp-toolbarbutton[abpstate="disabled"],
+#abp-toolbarbutton[cui-areatype="menu-panel"][abpstate="whitelisted"],
+toolbarpaletteitem[place="palette"] > #abp-toolbarbutton[abpstate="whitelisted"]
+{
+ -moz-image-region: rect(32px, 32px, 64px, 0px);
+}
+
+#abp-toolbar-popup {
+ list-style-image: none;
+ -moz-image-region: rect(0px, 0px, 0px, 0px);
+}
+
+toolbox[vertical="true"] toolbar #abp-toolbarbutton dropmarker {
+ display: none !important;
+}
+
+menuitem[default="true"] {
+ font-weight: bold;
+}
+
+#abp-toolbarbutton,
+#abp-site-info {
+ list-style-image: url("abp-status.png");
+ -moz-image-region: rect(0px, 24px, 24px, 0px);
+}
+#abp-toolbarbutton[abpstate="disabled"],
+#abp-toolbarbutton[abpstate="whitelisted"],
+#abp-site-info[abpaction="enable"],
+#abp-site-info[abpaction="enable_site"] {
+ -moz-image-region: rect(24px, 24px, 48px, 0px);
+}
+
+/* Hack: force the label to be displayed below icon for type="menu" */
+#abp-toolbarbutton[type="menu"]:not([cui-areatype="menu-panel"])
+{
+ -moz-box-orient: horizontal;
+}
+toolbar[mode="full"] #abp-toolbarbutton[type="menu"]
+{
+ -moz-binding: url("chrome://global/content/bindings/toolbarbutton.xml#menu-vertical");
+}
+
+/* Thunderbird-specific toolbar icon styles */
+#header-view-toolbar > #abp-toolbarbutton
+{
+ -moz-appearance: dualbutton;
+ padding: 0px !important;
+}
+
+/* Hide toolbar icon text in Thunderbird to save space */
+#header-view-toolbar > #abp-toolbarbutton .toolbarbutton-text
+{
+ display: none;
+}
+
+/* SeaMonkey expects the icon to be rather large, add margin */
+#mail-toolbox #abp-toolbarbutton .toolbarbutton-icon
+{
+ margin-top: 5px;
+}
+
+#abp-status-image {
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+#abp-site-info .pageaction-image {
+ width: 32px;
+ height: 32px;
+ padding: 4px;
+}
+
+#abp-toolbarbutton > toolbarbutton {
+ /* Argh, Songbird defines image region directly on the anonymous toolbarbutton element */
+ -moz-image-region: inherit !important;
+}
+
+#abp-tooltip {
+ max-width: none;
+}
+
+#abp-tooltip label {
+ font-weight: bold;
+ margin-bottom: 0px;
+}
+
+#abp-tooltip description:not([hidden="true"])+label {
+ margin-top: 10px;
+}
+
+#abp-bottombar-title {
+ padding-left: 4px;
+}
+
+#abp-bottombar-toolbar {
+ display: -moz-box !important;
+ visibility: visible !important;
+}
+
+#abp-bottombar-close {
+ padding: 4px 2px;
+ border-style: none !important;
+ -moz-user-focus: normal;
+ list-style-image: url("close.png");
+ -moz-appearance: none;
+ -moz-image-region: rect(0px, 14px, 14px, 0px);
+}
+
+#abp-bottombar-close:hover {
+ -moz-image-region: rect(0px, 28px, 14px, 14px);
+}
+
+#abp-bottombar-close:hover:active {
+ -moz-image-region: rect(0px, 42px, 14px, 28px);
+}
+
+.abp-contributebutton
+{
+ margin-top: 20px;
+}
+
+.abp-contributebutton-btn
+{
+ font: -moz-info;
+ margin-left: 40px;
+ margin-right: 40px;
+}
+
+.abp-contributebutton-close
+{
+ border-style: none !important;
+ -moz-user-focus: normal;
+ list-style-image: url("close.png");
+ -moz-appearance: none;
+ -moz-image-region: rect(0px, 14px, 14px, 0px);
+
+ /* Firefox Australis theme defines some width for all toolbaritem tags inside
+ * UIPanel element, the properties have to be reset to default values. */
+ min-width: 0px !important;
+ min-height: 0px !important;
+ width: auto !important;
+ height: auto !important;
+}
+
+.abp-contributebutton-close:hover
+{
+ -moz-image-region: rect(0px, 28px, 14px, 14px);
+}
+
+#abp-notification
+{
+ width: 300px;
+}
+
+#abp-notification-question
+{
+ display: none;
+ white-space: nowrap;
+}
+
+.abp-question #abp-notification-question
+{
+ display: block;
+}
+
+#abp-notification html|a
+{
+ cursor: pointer;
+ color: #0000f0;
+}
+
+#abp-notification html|a:hover
+{
+ text-decoration: underline;
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/sendReport.css b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/sendReport.css
new file mode 100644
index 0000000..53768f9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/sendReport.css
@@ -0,0 +1,129 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
+
+.wizard-header
+{
+ display: none;
+}
+
+#wizardHeader
+{
+ display: -moz-box;
+ -moz-box-ordinal-group: 0;
+ -moz-binding: none !important;
+ padding: 10px 5px !important;
+}
+
+.progressLabel
+{
+ margin: 5px 0px;
+ text-align: center;
+ font-size: 110%;
+ font-weight: normal;
+}
+
+.progressLabel.active
+{
+ font-weight: bold;
+}
+
+progressmeter
+{
+ margin-top: 100px;
+}
+
+.radioDescription
+{
+ -moz-margin-start: 32px;
+}
+
+radio, checkbox, .topLabel, #dataDeck
+{
+ margin-top: 15px;
+}
+
+#recentReports
+{
+ margin-top: 15px;
+}
+
+#recentReportsList
+{
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+#outdatedSubscriptionsList
+{
+ margin: 10px 20px;
+}
+
+#issuesBox
+{
+ overflow: auto;
+}
+
+#issuesChangeMessage
+{
+ color: red;
+}
+
+#screenshotButtons
+{
+ margin-top: 10px;
+}
+
+#screenshotBox
+{
+ overflow-y: scroll;
+}
+
+#commentLengthWarning, #anonymityWarning
+{
+ color: red;
+}
+
+#commentLengthWarning[visible="false"], #anonymityWarning[visible="false"]
+{
+ visibility: hidden;
+}
+
+/*
+ * Force left-to-right everywhere where we are displaying addresses
+ */
+#data:-moz-locale-dir(rtl)
+{
+ direction: ltr;
+}
+
+#sendReportError
+{
+ color: red;
+ font-size: 150%;
+}
+
+#sendReportErrorLinks, #typeWarningTextLink
+{
+ margin: 0px;
+}
+
+#sendReportErrorBox
+{
+ margin-bottom: 10px;
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/sidebar.css b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/sidebar.css
new file mode 100644
index 0000000..abad956
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/sidebar.css
@@ -0,0 +1,112 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
+
+#suggestionsList {
+ margin: 0px;
+}
+
+#detachButton, #reattachButton:not([disabled="true"]) {
+ text-decoration: underline;
+ cursor: pointer;
+}
+
+#reattachButton[disabled="true"] {
+ color: GrayText;
+}
+
+#detachButton, #reattachButton {
+ font-size: 90%;
+}
+
+tooltip {
+ max-width: none;
+}
+
+#tooltipPreview {
+ margin:10px;
+ max-width: 300px;
+ max-height: 300px;
+}
+
+#tooltip label {
+ font-weight: bold;
+}
+
+#contextBlock,
+#contextWhitelist {
+ font-weight: bold;
+}
+
+#state {
+ min-width: 16px;
+}
+
+#size {
+ text-align: end;
+}
+
+/*
+ * Force left-to-right everywhere where we are displaying addresses
+ */
+treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter),
+treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-address),
+treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-size)
+{
+ direction: ltr;
+ text-align: end;
+}
+
+.disabledTextLabel
+{
+ font-style: italic;
+}
+
+treechildren::-moz-tree-cell-text(state-filtered, selected-false),
+treechildren::-moz-tree-cell-text(state-hidden, selected-false) {
+ color: #C00000;
+}
+treechildren::-moz-tree-cell-text(state-whitelisted, selected-false),
+treechildren::-moz-tree-cell-text(state-hiddenexception, selected-false) {
+ color: #008000;
+}
+
+treechildren::-moz-tree-image(col-state, dummy-false)
+{
+ list-style-image: url(item-state.png);
+ -moz-image-region: rect(0px 10px 10px 0px);
+ -moz-margin-start: 3px;
+}
+treechildren::-moz-tree-image(col-state, filter-disabled-true, dummy-false) {
+ -moz-image-region: rect(10px 10px 20px 0px);
+}
+treechildren::-moz-tree-image(col-state, state-filtered, dummy-false),
+treechildren::-moz-tree-image(col-state, state-hidden, dummy-false) {
+ -moz-image-region: rect(20px 10px 30px 0px);
+}
+treechildren::-moz-tree-image(col-state, state-whitelisted, dummy-false),
+treechildren::-moz-tree-image(col-state, state-hiddenexception, dummy-false) {
+ -moz-image-region: rect(30px 10px 40px 0px);
+}
+
+treechildren::-moz-tree-cell-text(col-filter, state-hidden, selected-false) {
+ color: #000080;
+}
+treechildren::-moz-tree-cell-text(col-filter, filter-disabled-true, selected-false) {
+ color: #C0C0C0;
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/slow.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/slow.png
new file mode 100644
index 0000000..8463e9e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/slow.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/facebook.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/facebook.png
new file mode 100644
index 0000000..f45c417
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/facebook.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/googleplus.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/googleplus.png
new file mode 100644
index 0000000..53e6819
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/googleplus.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/renren.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/renren.png
new file mode 100644
index 0000000..e9af994
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/renren.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/twitter.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/twitter.png
new file mode 100644
index 0000000..fec913a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/twitter.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/weibo.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/weibo.png
new file mode 100644
index 0000000..176a628
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/weibo.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/subscriptionSelection.css b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/subscriptionSelection.css
new file mode 100644
index 0000000..8ed7c24
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/subscriptionSelection.css
@@ -0,0 +1,69 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
+
+dialog
+{
+ width: 550px;
+}
+
+*[invisible="true"]
+{
+ visibility: hidden;
+}
+
+#supplementMessage
+{
+ color: #F00000;
+}
+
+.localeMatch
+{
+ font-weight: bold;
+}
+
+#all-subscriptions-loading
+{
+ margin: 50px;
+}
+
+#all-subscriptions
+{
+ min-height: 200px;
+}
+#all-subscriptions > richlistitem > .variant
+{
+ width: 200px;
+}
+#all-subscriptions > richlistitem:not(:first-child) > .subscriptionTitle,
+#all-subscriptions > richlistitem:not(:first-child) > .subscriptionTitle + .variant
+{
+ border-top: 1px dashed black;
+ margin-top: 0px;
+ padding-top: 4px;
+}
+
+#supplementMessage
+{
+ margin-top: 5px;
+}
+#supplementMessage > label
+{
+ margin-left: 0px;
+ margin-right: 0px;
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/defaults/prefs.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/defaults/prefs.js
new file mode 100644
index 0000000..efcb5e3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/defaults/prefs.js
@@ -0,0 +1,38 @@
+// For description of these values see http://adblockplus.org/en/preferences
+
+pref("extensions.adblockplus.currentVersion", "0.0");
+pref("extensions.adblockplus.enabled", true);
+pref("extensions.adblockplus.frameobjects", true);
+pref("extensions.adblockplus.fastcollapse", false);
+pref("extensions.adblockplus.showinstatusbar", false);
+pref("extensions.adblockplus.detachsidebar", false);
+pref("extensions.adblockplus.defaulttoolbaraction", 0);
+pref("extensions.adblockplus.defaultstatusbaraction", 0);
+pref("extensions.adblockplus.sidebar_key", "Accel Shift V, Accel Shift U");
+pref("extensions.adblockplus.sendReport_key", "");
+pref("extensions.adblockplus.filters_key", "Accel Shift E, Accel Shift F, Accel Shift O");
+pref("extensions.adblockplus.enable_key", "");
+pref("extensions.adblockplus.flash_scrolltoitem", true);
+pref("extensions.adblockplus.previewimages", true);
+pref("extensions.adblockplus.data_directory", "adblockplus");
+pref("extensions.adblockplus.patternsbackups", 5);
+pref("extensions.adblockplus.patternsbackupinterval", 24);
+pref("extensions.adblockplus.whitelistschemes", "about chrome file irc moz-safe-about news resource snews x-jsd addbook cid imap mailbox nntp pop data javascript moz-icon");
+pref("extensions.adblockplus.subscriptions_autoupdate", true);
+pref("extensions.adblockplus.subscriptions_listurl", "https://adblockplus.org/subscriptions2.xml");
+pref("extensions.adblockplus.subscriptions_fallbackurl", "https://adblockplus.org/getSubscription?version=%VERSION%&url=%SUBSCRIPTION%&downloadURL=%URL%&error=%ERROR%&channelStatus=%CHANNELSTATUS%&responseStatus=%RESPONSESTATUS%");
+pref("extensions.adblockplus.subscriptions_fallbackerrors", 5);
+pref("extensions.adblockplus.subscriptions_exceptionsurl", "https://easylist-downloads.adblockplus.org/exceptionrules.txt");
+pref("extensions.adblockplus.subscriptions_exceptionscheckbox", true);
+pref("extensions.adblockplus.documentation_link", "https://adblockplus.org/redirect?link=%LINK%&lang=%LANG%");
+pref("extensions.adblockplus.savestats", true);
+pref("extensions.adblockplus.composer_default", 2);
+pref("extensions.adblockplus.clearStatsOnHistoryPurge", true);
+pref("extensions.adblockplus.report_submiturl", "https://reports.adblockplus.org/submitReport?version=1&guid=%GUID%&lang=%LANG%");
+pref("extensions.adblockplus.recentReports", []);
+pref("extensions.adblockplus.hideContributeButton", false);
+pref("extensions.adblockplus.blockableItemsSize", {width: 200, height: 200});
+pref("extensions.adblockplus.notificationurl", "https://notification.adblockplus.org/notification.json");
+pref("extensions.adblockplus.notificationdata", {});
+pref("extensions.adblockplus.subscriptions_antiadblockurl", "https://easylist-downloads.adblockplus.org/antiadblockfilters.txt");
+pref("extensions.adblockplus.please_kill_startup_performance", false);
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/icon.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/icon.png
new file mode 100644
index 0000000..9db9e39
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/icon.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/icon64.png b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/icon64.png
new file mode 100644
index 0000000..a8dcad6
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/icon64.png
Binary files differ
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/install.rdf b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/install.rdf
new file mode 100644
index 0000000..edaed14
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/install.rdf
@@ -0,0 +1,634 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of the Adblock Plus build tools,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+
+ <Description about="urn:mozilla:install-manifest">
+ <em:id>{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}</em:id>
+ <em:version>2.6.3.0</em:version>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Ads were yesterday!</em:description>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:type>2</em:type>
+ <em:bootstrap>true</em:bootstrap>
+ <em:updateURL>https://adblockplus.org/devbuilds/adblockplus/update.rdf?reqVersion=%REQ_VERSION%&amp;id=%ITEM_ID%&amp;version=%ITEM_VERSION%&amp;maxAppVersion=%ITEM_MAXAPPVERSION%&amp;status=%ITEM_STATUS%&amp;appID=%APP_ID%&amp;appVersion=%APP_VERSION%&amp;appOS=%APP_OS%&amp;appABI=%APP_ABI%&amp;locale=%APP_LOCALE%&amp;currentAppVersion=%CURRENT_APP_VERSION%&amp;updateType=%UPDATE_TYPE%</em:updateURL>
+ <em:optionsURL>chrome://adblockplus/content/ui/settings.xul</em:optionsURL>
+ <em:optionsType>2</em:optionsType>
+ <em:localized>
+ <Description>
+ <em:locale>ar</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>آدبلوك بلس</em:name>
+ <em:description>الإعلانات أصبحت من الأمس!</em:description>
+ <em:homepageURL>http://adblockplus.org/ar/</em:homepageURL>
+ <em:translator>Ùلاديمير بلنت</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>bg</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Рекламите бÑха вчера!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Ивайло Йовчев (s0urce)</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>ca</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>AdBlock Plus</em:name>
+ <em:description>Els anuncis eren ahir</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>BennyBeat</em:translator>
+ <em:translator>CatTranslations</em:translator>
+ <em:translator>el_libre</em:translator>
+ <em:translator>Toni Barrera</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>cs</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>A reklamy jsou minulostí!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Jakub Tománek</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>da</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reklamer er fortid!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>AlleyKat</em:translator>
+ <em:translator>Regmos</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>de</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Werbung war gestern!</em:description>
+ <em:homepageURL>http://adblockplus.org/de/</em:homepageURL>
+ <em:translator>Wladimir Palant</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>dsb</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Wabjenje jo cora była!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>milupo</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>el</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Αφήστε τις διαφημίσεις στο χθες!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>rookie</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>en-GB</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Ads were yesterday!</em:description>
+ <em:homepageURL>http://adblockplus.org/en/</em:homepageURL>
+ <em:translator>Mark Tyndall</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>en-US</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Ads were yesterday!</em:description>
+ <em:homepageURL>http://adblockplus.org/en/</em:homepageURL>
+ <em:translator>Wladimir Palant</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>eo</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reklamoj estis hieraÅ­!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Wladimir PALANT</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>es-AR</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>¡La publicidad es cosa del pasado!</em:description>
+ <em:homepageURL>http://adblockplus.org/es/</em:homepageURL>
+ <em:translator>KNTRO</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>es-ES</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>La publicidad es cosa del ayer</em:description>
+ <em:homepageURL>http://adblockplus.org/es/</em:homepageURL>
+ <em:translator>Urko</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>es-MX</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Los Anuncios son cosa del Ayer!</em:description>
+ <em:homepageURL>http://adblockplus.org/es/</em:homepageURL>
+ <em:translator>Francisco Alvarado</em:translator>
+ <em:translator>Ninnetyer</em:translator>
+ <em:translator>poz2k4444</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>et</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reklaamid on nüüd eilne päev!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Aivo Kuhlberg</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>eu</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Iragarkiak atzoko kontuak dira!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Librezale.org</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>fa</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>تبلیغت متعلق به دیروز بود!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>از طر٠Wladimir Palant</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>fi</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Mainokset ovat menneisyyttä!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Joni Heinonen</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>fr</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Les publicités, c&#39;est du passé !</em:description>
+ <em:homepageURL>http://adblockplus.org/fr/</em:homepageURL>
+ <em:translator>Dagobert_78</em:translator>
+ <em:translator>Jim Courbron</em:translator>
+ <em:translator>jojaba</em:translator>
+ <em:translator>pirlouy</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>fy-NL</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Fan no ôf gjin reklames mear!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Wim Benes</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>gl</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>A publicidade é o que lle doe!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Jesús Olano</em:translator>
+ <em:translator>Manuel Meixide</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>he</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>הפרסומות שייכות לעבר!</em:description>
+ <em:homepageURL>http://adblockplus.org/he/</em:homepageURL>
+ <em:translator>catcat</em:translator>
+ <em:translator>SiiiE</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>hr</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reklame su prošlost!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>gogo</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>hsb</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reklama bÄ› wÄera!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Milupo</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>hu</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>A reklám a múlté!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Gárdonyi László</em:translator>
+ <em:translator>Mikes Kaszmán István</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>hy-AM</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Ô³Õ¸Õ¾Õ¡Õ¦Õ¤Õ¶Õ¥Ö€Õ¨ Õ¥Ö€Õ¥Õ¯ Õ§Õ«Õ¶!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>iAbaS</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>id</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Iklan sudah menjadi masa lalu!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>is</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Auglýsingar eru hluti af fortíðinni!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Kristján Bjarni Guðmundsson</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>it</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Permette di dire &#39;no&#39; alla pubblicità presente nelle pagine web!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Luana Di Muzio - BabelZilla</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>ja</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>広告ã¯éŽåŽ»ã®éºç‰©ã§ã™ï¼</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Haebaru</em:translator>
+ <em:translator>k2jp</em:translator>
+ <em:translator>Premier</em:translator>
+ <em:translator>Shirayuki (alphabetical order)</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>kk</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Жарнамаға жол жоқ!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Бауржан Муфтахидинов</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>ko</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>ì¸í„°ë„· ì´ìš©ì„ 방해하거나 불법·유해한 ê´‘ê³ ì˜ ì°¨ë‹¨!</em:description>
+ <em:homepageURL>http://adblockplus.org/ko/</em:homepageURL>
+ <em:translator>Maybee</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>lt</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reklamos tai praeitis!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Algimantas MargeviÄius</em:translator>
+ <em:translator>Jonas Slivka</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>lv</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>ReklÄmas ir vakardiena!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Džerijs Šterns</em:translator>
+ <em:translator>Janis-Marks Gailis</em:translator>
+ <em:translator>Klaids Borovs</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>ms</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Iklan hanyalah pada masa dulu!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>temperror</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>nb-NO</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Si farvel til reklame!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Roy Skoglund</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>nl</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reclames behoren tot het verleden!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>markh</em:translator>
+ <em:translator>Onno Ekker</em:translator>
+ <em:translator>pitdicker</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>pl</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Powiedz NIE! reklamom</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Leszek(teo)Życzkowski</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>pt-BR</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Propaganda indesejada é coisa do passado!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Ajwsert</em:translator>
+ <em:translator>Mauro José da Silva</em:translator>
+ <em:translator>Teboga</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>pt-PT</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Publicidade... já era!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>António Mendonça; Sérgio Marques</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>ro</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Elimină publicitatea din paginile web.</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>ultravioletu</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>ru</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Скажи &#34;нет&#34; рекламе!</em:description>
+ <em:homepageURL>http://adblockplus.org/ru/</em:homepageURL>
+ <em:translator>Wladimir Palant</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>sk</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reklamy sú minulosťou!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Ján Kendi (Jacen)</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>sl</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Oglasi so preteklost!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Martin Srebotnjak</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>sq</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reklamat jane e kaluara!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Genti Ereqi</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>sr</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>ОглаÑи Ñу прошлоÑÑ‚!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>kapetance</em:translator>
+ <em:translator>ДакСРБИЈÐ</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>sv-SE</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Säg farväl till all reklam!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Mikael Hiort af Ornäs</em:translator>
+ <em:translator>Stefan Lewitas</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>th</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>ลาà¸à¹ˆà¸­à¸™à¸žà¸§à¸à¹‚ฆษณา!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Anusuk Sangubon(Jaideejung007)</em:translator>
+ <em:translator>Ken</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>tr</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reklamlar geçmişte kaldı!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Ahmet Serkan Tıratacı</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>uk</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Скажи «ÐІ» рекламі!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Тимофій Бабич</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>vi</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Quảng cáo đã là dĩ vãng!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Knight Vegor</em:translator>
+ <em:translator>Nguyễn Mạnh Hùng</em:translator>
+ <em:translator>SITUVN</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>zh-CN</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>广告已æˆå¾€äº‹ï¼</em:description>
+ <em:homepageURL>https://adblockplus.org/zh_CN/</em:homepageURL>
+ <em:translator>blackdire</em:translator>
+ <em:translator>YFdyh000</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>zh-TW</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>廣告已æˆéŽåŽ»å¼ï¼</em:description>
+ <em:homepageURL>https://adblockplus.org/zh_TW/</em:homepageURL>
+ <em:translator>Jose Sun</em:translator>
+ <em:translator>knight00931</em:translator>
+ </Description>
+ </em:localized>
+ <em:targetApplication>
+ <Description>
+ <!-- fennec2 -->
+ <em:id>{aa3c5121-dab2-40e2-81ca-7ea25febc110}</em:id>
+ <em:minVersion>22.0</em:minVersion>
+ <em:maxVersion>33.0</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ <em:targetApplication>
+ <Description>
+ <!-- firefox -->
+ <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
+ <em:minVersion>22.0</em:minVersion>
+ <em:maxVersion>33.0</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ <em:targetApplication>
+ <Description>
+ <!-- seamonkey -->
+ <em:id>{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}</em:id>
+ <em:minVersion>2.19</em:minVersion>
+ <em:maxVersion>2.30</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ <em:targetApplication>
+ <Description>
+ <!-- thunderbird -->
+ <em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</em:id>
+ <em:minVersion>22.0</em:minVersion>
+ <em:maxVersion>33.0</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ <em:targetApplication>
+ <Description>
+ <!-- toolkit -->
+ <em:id>toolkit@mozilla.org</em:id>
+ <em:minVersion>22.0</em:minVersion>
+ <em:maxVersion>33.0</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ </Description>
+</RDF> \ No newline at end of file
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/Public.jsm b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/Public.jsm
new file mode 100644
index 0000000..0f96bcb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/Public.jsm
@@ -0,0 +1,202 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Public Adblock Plus API.
+ */
+
+var EXPORTED_SYMBOLS = ["AdblockPlus"];
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cr = Components.results;
+const Cu = Components.utils;
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+function require(module)
+{
+ let result = {};
+ result.wrappedJSObject = result;
+ Services.obs.notifyObservers(result, "adblockplus-require", module);
+ return result.exports;
+}
+
+let {FilterStorage} = require("filterStorage");
+let {Filter} = require("filterClasses");
+let {Subscription, SpecialSubscription, RegularSubscription, DownloadableSubscription, ExternalSubscription} = require("subscriptionClasses");
+
+const externalPrefix = "~external~";
+
+/**
+ * Class implementing public Adblock Plus API
+ * @class
+ */
+var AdblockPlus =
+{
+ /**
+ * Returns current subscription count
+ * @type Integer
+ */
+ get subscriptionCount()
+ {
+ return FilterStorage.subscriptions.length;
+ },
+
+ /**
+ * Gets a subscription by its URL
+ */
+ getSubscription: function(/**String*/ id) /**IAdblockPlusSubscription*/
+ {
+ if (id in FilterStorage.knownSubscriptions)
+ return createSubscriptionWrapper(FilterStorage.knownSubscriptions[id]);
+
+ return null;
+ },
+
+ /**
+ * Gets a subscription by its position in the list
+ */
+ getSubscriptionAt: function(/**Integer*/ index) /**IAdblockPlusSubscription*/
+ {
+ if (index < 0 || index >= FilterStorage.subscriptions.length)
+ return null;
+
+ return createSubscriptionWrapper(FilterStorage.subscriptions[index]);
+ },
+
+ /**
+ * Updates an external subscription and creates it if necessary
+ */
+ updateExternalSubscription: function(/**String*/ id, /**String*/ title, /**Array of Filter*/ filters) /**String*/
+ {
+ if (id.substr(0, externalPrefix.length) != externalPrefix)
+ id = externalPrefix + id;
+ let subscription = Subscription.knownSubscriptions[id];
+ if (typeof subscription == "undefined")
+ subscription = new ExternalSubscription(id, title);
+
+ subscription.lastDownload = parseInt(new Date().getTime() / 1000);
+
+ let newFilters = [];
+ for (let filter of filters)
+ {
+ filter = Filter.fromText(Filter.normalize(filter));
+ if (filter)
+ newFilters.push(filter);
+ }
+
+ if (id in FilterStorage.knownSubscriptions)
+ FilterStorage.updateSubscriptionFilters(subscription, newFilters);
+ else
+ {
+ subscription.filters = newFilters;
+ FilterStorage.addSubscription(subscription);
+ }
+
+ return id;
+ },
+
+ /**
+ * Removes an external subscription by its identifier
+ */
+ removeExternalSubscription: function(/**String*/ id) /**Boolean*/
+ {
+ if (id.substr(0, externalPrefix.length) != externalPrefix)
+ id = externalPrefix + id;
+ if (!(id in FilterStorage.knownSubscriptions))
+ return false;
+
+ FilterStorage.removeSubscription(FilterStorage.knownSubscriptions[id]);
+ return true;
+ },
+
+ /**
+ * Adds user-defined filters to the list
+ */
+ addPatterns: function(/**Array of String*/ filters)
+ {
+ for (let filter of filters)
+ {
+ filter = Filter.fromText(Filter.normalize(filter));
+ if (filter)
+ {
+ filter.disabled = false;
+ FilterStorage.addFilter(filter);
+ }
+ }
+ },
+
+ /**
+ * Removes user-defined filters from the list
+ */
+ removePatterns: function(/**Array of String*/ filters)
+ {
+ for (let filter of filters)
+ {
+ filter = Filter.fromText(Filter.normalize(filter));
+ if (filter)
+ FilterStorage.removeFilter(filter);
+ }
+ },
+
+ /**
+ * Returns installed Adblock Plus version
+ */
+ getInstalledVersion: function() /**String*/
+ {
+ return require("info").addonVersion;
+ },
+
+ /**
+ * Returns source code revision this Adblock Plus build was created from (if available)
+ */
+ getInstalledBuild: function() /**String*/
+ {
+ return "";
+ },
+};
+
+/**
+ * Wraps a subscription into IAdblockPlusSubscription structure.
+ */
+function createSubscriptionWrapper(/**Subscription*/ subscription) /**IAdblockPlusSubscription*/
+{
+ if (!subscription)
+ return null;
+
+ return {
+ url: subscription.url,
+ special: subscription instanceof SpecialSubscription,
+ title: subscription.title,
+ autoDownload: true,
+ disabled: subscription.disabled,
+ external: subscription instanceof ExternalSubscription,
+ lastDownload: subscription instanceof RegularSubscription ? subscription.lastDownload : 0,
+ downloadStatus: subscription instanceof DownloadableSubscription ? subscription.downloadStatus : "synchronize_ok",
+ lastModified: subscription instanceof DownloadableSubscription ? subscription.lastModified : null,
+ expires: subscription instanceof DownloadableSubscription ? subscription.expires : 0,
+ getPatterns: function()
+ {
+ let result = subscription.filters.map(function(filter)
+ {
+ return filter.text;
+ });
+ return result;
+ }
+ };
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/antiadblockInit.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/antiadblockInit.js
new file mode 100644
index 0000000..d8b29ca
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/antiadblockInit.js
@@ -0,0 +1,78 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {Utils} = require("utils");
+let {Prefs} = require("prefs");
+let {ActiveFilter} = require("filterClasses");
+let {FilterStorage} = require("filterStorage");
+let {FilterNotifier} = require("filterNotifier");
+let {Subscription} = require("subscriptionClasses");
+let {Notification} = require("notification");
+
+exports.initAntiAdblockNotification = function initAntiAdblockNotification()
+{
+ let notification = {
+ id: "antiadblock",
+ type: "question",
+ title: Utils.getString("notification_antiadblock_title"),
+ message: Utils.getString("notification_antiadblock_message"),
+ urlFilters: []
+ };
+
+ function notificationListener(approved)
+ {
+ let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl);
+ if (subscription.url in FilterStorage.knownSubscriptions)
+ subscription.disabled = !approved;
+ }
+
+ function addAntiAdblockNotification(subscription)
+ {
+ let urlFilters = [];
+ for (let filter of subscription.filters)
+ if (filter instanceof ActiveFilter)
+ for (let domain in filter.domains)
+ if (domain && urlFilters.indexOf(domain) == -1)
+ urlFilters.push(domain);
+ notification.urlFilters = urlFilters;
+ Notification.addNotification(notification);
+ Notification.addQuestionListener(notification.id, notificationListener);
+ }
+
+ function removeAntiAdblockNotification()
+ {
+ Notification.removeNotification(notification);
+ Notification.removeQuestionListener(notification.id, notificationListener);
+ }
+
+ let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl);
+ if (subscription.lastDownload && subscription.disabled)
+ addAntiAdblockNotification(subscription);
+
+ FilterNotifier.addListener(function(action, value, newItem, oldItem)
+ {
+ if (!/^subscription\.(updated|removed|disabled)$/.test(action) || value.url != Prefs.subscriptions_antiadblockurl)
+ return;
+
+ if (action == "subscription.updated")
+ addAntiAdblockNotification(value);
+ else if (action == "subscription.removed" || (action == "subscription.disabled" && !value.disabled))
+ removeAntiAdblockNotification();
+ });
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/appSupport.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/appSupport.js
new file mode 100644
index 0000000..67c6248
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/appSupport.js
@@ -0,0 +1,948 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Various application-specific functions.
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/AddonManager.jsm");
+
+/**
+ * Checks whether an application window is known and should get Adblock Plus
+ * user interface elements.
+ * @result Boolean
+ */
+exports.isKnownWindow = (/**Window*/ window) => false;
+
+/**
+ * HACK: In some applications the window finishes initialization during load
+ * event processing which makes an additional delay necessary. This flag
+ * indicates that.
+ * @type Boolean
+ */
+exports.delayInitialization = false;
+
+/**
+ * Retrieves the browser element for an application window.
+ * @type function(window)
+ */
+exports.getBrowser = null;
+
+/**
+ * Adds a new browser tab in the given application window.
+ * @type function(window, url, event)
+ */
+exports.addTab = null;
+
+/**
+ * Retrieves the current browser location for an application window.
+ */
+exports.getCurrentLocation = function getCurrentLocation(/**Window*/ window) /**nsIURI|String*/
+{
+ let browser = (exports.getBrowser ? exports.getBrowser(window) : null);
+ return (browser ? browser.currentURI : null);
+}
+
+
+/**
+ * The ID (or a list of possible IDs) of the content area context menu.
+ * @type String|String[]
+ */
+exports.contentContextMenu = null;
+
+/**
+ * Determines the default placement of the toolbar icon via object properties
+ * parent, before and after.
+ * @type Object
+ */
+exports.defaultToolbarPosition = null;
+
+/**
+ * The properties parent, before, after determine the placement of the status
+ * bar icon.
+ * @type Object
+ */
+exports.statusbarPosition = null;
+
+/**
+ * The properties parent, before, after determine the placement of the Tools
+ * submenu.
+ * @type Object
+ */
+exports.toolsMenu = null;
+
+/**
+ * Maps windows to their bottom bar info.
+ */
+let bottomBars = new WeakMap();
+
+/**
+ * Adds a bottom bar to the application window.
+ * @type function(window, element)
+ */
+exports.addBottomBar = null;
+
+function _addBottomBar(window, parent, element)
+{
+ if (bottomBars.has(window) || !parent)
+ return null;
+
+ let bar = {elements: []};
+ for (let child = element.firstElementChild; child; child = child.nextElementSibling)
+ {
+ let clone = child.cloneNode(true);
+ parent.appendChild(clone);
+ bar.elements.push(clone);
+ }
+
+ bottomBars.set(window, bar);
+ return bar;
+};
+
+/**
+ * Removes the bottom bar from the application window.
+ * @type function(window)
+ */
+exports.removeBottomBar = null;
+
+function _removeBottomBar(window)
+{
+ if (!bottomBars.has(window))
+ return null;
+
+ let bar = bottomBars.get(window);
+ for (let i = 0; i < bar.elements.length; i++)
+ if (bar.elements[i].parentNode)
+ bar.elements[i].parentNode.removeChild(bar.elements[i]);
+
+ bottomBars.delete(window);
+ return bar;
+};
+
+/**
+ * Maps windows to a list of progress listeners.
+ */
+let progressListeners = new WeakMap();
+
+/**
+ * Makes sure that a function is called whenever the displayed browser location changes.
+ */
+exports.addBrowserLocationListener = function addBrowserLocationListener(/**Window*/ window, /**Function*/ callback, /**Boolean*/ ignoreSameDoc)
+{
+ let browser = (exports.getBrowser ? exports.getBrowser(window) : null);
+ if (browser)
+ {
+ let dummy = function() {};
+ let progressListener =
+ {
+ callback: callback,
+ onLocationChange: function(progress, request, uri, flags)
+ {
+ if (!ignoreSameDoc || !flags || !(flags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT))
+ this.callback();
+ },
+ onProgressChange: dummy,
+ onSecurityChange: dummy,
+ onStateChange: dummy,
+ onStatusChange: dummy,
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference])
+ };
+ browser.addProgressListener(progressListener);
+
+ if (progressListeners.has(window))
+ progressListeners.get(window).push(progressListener);
+ else
+ progressListeners.set(window, [progressListener]);
+ }
+};
+
+/**
+ * Removes a location listener registered for a window.
+ */
+exports.removeBrowserLocationListener = function removeBrowserLocationListener(/**Window*/ window, /**Function*/ callback)
+{
+ if (!progressListeners.has(window))
+ return;
+
+ let browser = (exports.getBrowser ? exports.getBrowser(window) : null);
+ let listeners = progressListeners.get(window);
+ for (let i = 0; i < listeners.length; i++)
+ {
+ if (listeners[i].callback == callback)
+ {
+ if (browser)
+ browser.removeProgressListener(listeners[i]);
+ listeners.splice(i--, 1);
+ }
+ }
+};
+
+/**
+ * Removes all location listeners registered for a window, to be called on
+ * cleanup.
+ */
+exports.removeBrowserLocationListeners = function removeBrowserLocationListeners(/**Window*/ window)
+{
+ if (!progressListeners.has(window))
+ return;
+
+ let browser = (exports.getBrowser ? exports.getBrowser(window) : null);
+ if (browser)
+ {
+ let listeners = progressListeners.get(window);
+ for (let i = 0; i < listeners.length; i++)
+ browser.removeProgressListener(listeners[i]);
+ }
+ progressListeners.delete(window);
+};
+
+/**
+ * Maps windows to a list of click listeners.
+ */
+let clickListeners = new WeakMap();
+
+/**
+ * Makes sure that a function is called whenever the user clicks inside the
+ * browser's content area.
+ */
+exports.addBrowserClickListener = function addBrowserClickListener(/**Window*/ window, /**Function*/ callback)
+{
+ let browser = (exports.getBrowser ? exports.getBrowser(window) : null);
+ if (browser)
+ {
+ browser.addEventListener("click", callback, true);
+
+ if (clickListeners.has(window))
+ clickListeners.get(window).push(callback);
+ else
+ clickListeners.set(window, [callback]);
+ }
+};
+
+/**
+ * Removes all click listeners registered for a window, to be called on
+ * cleanup.
+ */
+exports.removeBrowserClickListeners = function removeBrowserClickListeners(/**Window*/ window)
+{
+ if (!clickListeners.has(window))
+ return;
+
+ let browser = (exports.getBrowser ? exports.getBrowser(window) : null);
+ if (browser)
+ {
+ let listeners = clickListeners.get(window);
+ for (let i = 0; i < listeners.length; i++)
+ browser.removeEventListener("click", listeners[i], true);
+ }
+ clickListeners.delete(window);
+};
+
+let {application} = require("info");
+switch (application)
+{
+ case "firefox":
+ {
+ exports.isKnownWindow = function ff_isKnownWindow(window)
+ {
+ return (window.document.documentElement.getAttribute("windowtype") == "navigator:browser");
+ };
+
+ exports.getBrowser = (window) => window.gBrowser;
+
+ exports.addTab = function ff_addTab(window, url, event)
+ {
+ if (event)
+ window.openNewTabWith(url, exports.getBrowser(window).contentDocument, null, event, false);
+ else
+ window.gBrowser.loadOneTab(url, {inBackground: false});
+ };
+
+ exports.contentContextMenu = "contentAreaContextMenu";
+
+ exports.defaultToolbarPosition = {
+ parent: "nav-bar"
+ };
+
+ exports.toolsMenu = {
+ parent: "menu_ToolsPopup"
+ };
+
+ exports.addBottomBar = function fx_addBottomBar(window, element)
+ {
+ let bar = _addBottomBar(window, window.document.getElementById("appcontent"), element);
+ if (bar)
+ {
+ let display = window.document.getElementById("statusbar-display");
+ bar.changedFixed = display && !display.hasAttribute("fixed");
+ if (bar.changedFixed)
+ display.setAttribute("fixed", "true");
+ }
+ };
+
+ exports.removeBottomBar = function fx_removeBottomBar(window)
+ {
+ let bar = _removeBottomBar(window);
+ if (bar && bar.changedFixed)
+ window.document.getElementById("statusbar-display").removeAttribute("fixed");
+ };
+
+ break;
+ }
+
+ case "seamonkey":
+ {
+ exports.isKnownWindow = function sm_isKnownWindow(window)
+ {
+ let type = window.document.documentElement.getAttribute("windowtype");
+ return (type == "navigator:browser" || type == "mail:3pane" || type == "mail:messageWindow");
+ };
+
+ exports.addTab = function sm_addTab(window, url, event)
+ {
+ if (event || !("gBrowser" in window))
+ window.openNewTabWith(url, ("gBrowser" in window ? window.gBrowser.contentDocument : null), null, event, false);
+ else
+ window.gBrowser.loadOneTab(url, {inBackground: false});
+ };
+
+ exports.getBrowser = function sm_getBrowser(window)
+ {
+ if ("gBrowser" in window)
+ return window.gBrowser;
+ else if ("getMessageBrowser" in window)
+ return window.getMessageBrowser();
+ else
+ return null;
+ };
+
+ exports.getCurrentLocation = function sm_getCurrentLocation(window)
+ {
+ if ("currentHeaderData" in window && "content-base" in window.currentHeaderData)
+ {
+ // This is a blog entry
+ return window.currentHeaderData["content-base"].headerValue;
+ }
+ else if ("currentHeaderData" in window && "from" in window.currentHeaderData)
+ {
+ // This is a mail/newsgroup entry
+ try
+ {
+ let headerParser = Cc["@mozilla.org/messenger/headerparser;1"].getService(Ci.nsIMsgHeaderParser);
+ let emailAddress = headerParser.extractHeaderAddressMailboxes(window.currentHeaderData.from.headerValue);
+ return "mailto:" + emailAddress.replace(/^[\s"]+/, "").replace(/[\s"]+$/, "").replace(/\s/g, "%20");
+ }
+ catch(e)
+ {
+ return null;
+ }
+ }
+ else
+ {
+ let browser = exports.getBrowser(window);
+ return (browser ? browser.currentURI : null);
+ }
+ };
+
+ exports.contentContextMenu = ["contentAreaContextMenu", "mailContext"];
+
+ exports.defaultToolbarPosition = {
+ parent: ["PersonalToolbar", "msgToolbar"],
+ before: ["bookmarks-button", "button-junk"]
+ };
+
+ exports.statusbarPosition = {
+ parent: "status-bar"
+ };
+
+ exports.toolsMenu = {
+ parent: "taskPopup",
+ after: "downloadmgr"
+ };
+
+ exports.addBottomBar = function sm_addBottomBar(window, element)
+ {
+ _addBottomBar(window, window.document.getElementById("appcontent") || window.document.getElementById("messagepanebox"), element);
+ };
+
+ exports.removeBottomBar = _removeBottomBar;
+
+ break;
+ }
+
+ case "thunderbird":
+ {
+ exports.isKnownWindow = function tb_isKnownWindow(window)
+ {
+ let type = window.document.documentElement.getAttribute("windowtype");
+ return (type == "mail:3pane" || type == "mail:messageWindow");
+ };
+
+ exports.delayInitialization = true;
+
+ exports.getBrowser = (window) => window.getBrowser();
+
+ exports.addTab = function tb_addTab(window, url, event)
+ {
+ let tabmail = window.document.getElementById("tabmail");
+ if (!tabmail)
+ {
+ let wnd = Services.wm.getMostRecentWindow("mail:3pane");
+ if (window)
+ tabmail = wnd.document.getElementById("tabmail");
+ }
+
+ if (tabmail)
+ tabmail.openTab("contentTab", {contentPage: url});
+ else
+ {
+ window.openDialog("chrome://messenger/content/", "_blank",
+ "chrome,dialog=no,all", null,
+ {
+ tabType: "contentTab",
+ tabParams: {contentPage: url}
+ });
+ }
+ };
+
+ exports.contentContextMenu = ["mailContext", "pageContextMenu"];
+
+ exports.defaultToolbarPosition = {
+ parent: "header-view-toolbar",
+ before: "hdrReplyButton",
+ addClass: "msgHeaderView-button"
+ };
+
+ exports.statusbarPosition = {
+ parent: "status-bar"
+ };
+
+ exports.toolsMenu = {
+ parent: "taskPopup",
+ after: "javaScriptConsole"
+ };
+
+ exports.getCurrentLocation = function getCurrentLocation(window)
+ {
+ let browser = exports.getBrowser(window);
+ if (!browser)
+ return null;
+
+ if (browser.id == "messagepane" && "currentHeaderData" in window && "content-base" in window.currentHeaderData)
+ {
+ // This is a blog entry
+ return window.currentHeaderData["content-base"].headerValue;
+ }
+ else if (browser.id == "messagepane" && "currentHeaderData" in window && "from" in window.currentHeaderData)
+ {
+ // This is a mail/newsgroup entry
+ try
+ {
+ let headerParser = Cc["@mozilla.org/messenger/headerparser;1"].getService(Ci.nsIMsgHeaderParser);
+ let emailAddress = headerParser.extractHeaderAddressMailboxes(window.currentHeaderData.from.headerValue);
+ return "mailto:" + emailAddress.replace(/^[\s"]+/, "").replace(/[\s"]+$/, "").replace(/\s/g, "%20");
+ }
+ catch(e)
+ {
+ return null;
+ }
+ }
+ else
+ return browser.currentURI;
+ }
+
+ exports.addBottomBar = function tb_addBottomBar(window, element)
+ {
+ let browser = exports.getBrowser(window);
+ if (!browser)
+ return;
+
+ let parent = window.document.getElementById("messagepanebox");
+ if (!parent || !(parent.compareDocumentPosition(browser) & Ci.nsIDOMNode.DOCUMENT_POSITION_CONTAINED_BY))
+ parent = browser.parentNode;
+
+ _addBottomBar(window, parent, element);
+ };
+
+ exports.removeBottomBar = _removeBottomBar;
+
+ let BrowserChangeListener = function(window, callback)
+ {
+ this.window = window;
+ this.callback = callback;
+ this.onSelect = this.onSelect.bind(this);
+ this.attach();
+ };
+ BrowserChangeListener.prototype = {
+ window: null,
+ callback: null,
+ currentBrowser: null,
+
+ setBrowser: function(browser)
+ {
+ if (browser != this.currentBrowser)
+ {
+ let oldBrowser = this.currentBrowser;
+ this.currentBrowser = browser;
+ this.callback(oldBrowser, browser);
+ }
+ },
+
+ onSelect: function()
+ {
+ this.setBrowser(exports.getBrowser(this.window));
+ },
+
+ attach: function()
+ {
+ this.onSelect();
+
+ let tabmail = this.window.document.getElementById("tabmail");
+ if (tabmail)
+ tabmail.tabContainer.addEventListener("select", this.onSelect, false);
+ },
+ detach: function()
+ {
+ let tabmail = this.window.document.getElementById("tabmail");
+ if (tabmail)
+ tabmail.tabContainer.removeEventListener("select", this.onSelect, false);
+
+ this.setBrowser(null);
+ }
+ };
+
+ exports.addBrowserLocationListener = function(/**Window*/ window, /**Function*/ callback, /**Boolean*/ ignoreSameDoc)
+ {
+ if (progressListeners.has(window))
+ {
+ progressListeners.get(window).locationCallbacks.push(callback);
+ return;
+ }
+
+ let callbacks = [callback];
+ let dummy = function() {};
+ let progressListener =
+ {
+ onLocationChange: function(progress, request, uri, flags)
+ {
+ if (!ignoreSameDoc || !flags || !(flags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT))
+ for (let i = 0; i < callbacks.length; i++)
+ callbacks[i]();
+ },
+ onProgressChange: dummy,
+ onSecurityChange: dummy,
+ onStateChange: dummy,
+ onStatusChange: dummy,
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference])
+ };
+ let messageListener =
+ {
+ onStartHeaders: dummy,
+ onEndHeaders: function()
+ {
+ let browser = exports.getBrowser(window);
+ if (browser.id == "messagepane")
+ for (let i = 0; i < callbacks.length; i++)
+ callbacks[i]();
+ },
+ onEndAttachments: dummy,
+ onBeforeShowHeaderPane: dummy
+ };
+
+ let listener = new BrowserChangeListener(window, function(oldBrowser, newBrowser)
+ {
+ if (oldBrowser)
+ oldBrowser.removeProgressListener(progressListener);
+ if (newBrowser)
+ newBrowser.addProgressListener(progressListener);
+ progressListener.onLocationChange();
+ });
+ listener.locationCallbacks = callbacks;
+
+ if ("gMessageListeners" in window)
+ window.gMessageListeners.push(messageListener);
+ listener.messageListener = messageListener;
+
+ progressListeners.set(window, listener);
+ };
+
+ exports.removeBrowserLocationListener = function(/**Window*/ window, /**Function*/ callback)
+ {
+ if (!progressListeners.has(window))
+ return;
+
+ let callbacks = progressListeners.get(window).locationCallbacks;
+ for (let i = 0; i < callbacks.length; i++)
+ if (callbacks[i] == callback)
+ callbacks.splice(i--, 1);
+ };
+
+ exports.removeBrowserLocationListeners = function(/**Window*/ window)
+ {
+ if (!progressListeners.has(window))
+ return;
+
+ let listener = progressListeners.get(window);
+
+ let messageListener = listener.messageListener;
+ let index = ("gMessageListeners" in window ? window.gMessageListeners.indexOf(messageListener) : -1);
+ if (index >= 0)
+ window.gMessageListeners.splice(index, 1);
+
+ listener.detach();
+ progressListeners.delete(window);
+ };
+
+ exports.addBrowserClickListener = function addBrowserClickListener(/**Window*/ window, /**Function*/ callback)
+ {
+ if (clickListeners.has(window))
+ {
+ clickListeners.get(window).callbacks.push(callback);
+ return;
+ }
+
+ let callbacks = [callback];
+ let listener = new BrowserChangeListener(window, function(oldBrowser, newBrowser)
+ {
+ if (oldBrowser)
+ for (let i = 0; i < callbacks.length; i++)
+ oldBrowser.removeEventListener("click", callbacks[i], true);
+ if (newBrowser)
+ for (let i = 0; i < callbacks.length; i++)
+ newBrowser.addEventListener("click", callbacks[i], true);
+ });
+ listener.callbacks = callbacks;
+
+ clickListeners.set(window, listener);
+ };
+
+ exports.removeBrowserClickListeners = function removeBrowserClickListeners(/**Window*/ window)
+ {
+ if (!clickListeners.has(window))
+ return;
+
+ let listener = clickListeners.get(window);
+ listener.detach();
+
+ clickListeners.delete(window);
+ };
+
+ // Make sure to close/reopen list of blockable items when the user changes tabs
+ let {WindowObserver} = require("windowObserver");
+ new WindowObserver({
+ listeners: new WeakMap(),
+ applyToWindow: function(window)
+ {
+ if (!exports.isKnownWindow(window) || this.listeners.has(window))
+ return;
+
+ let {Utils} = require("utils");
+ Utils.runAsync(function()
+ {
+ let listener = new BrowserChangeListener(window, function(oldBrowser, newBrowser)
+ {
+ if (bottomBars.has(window))
+ {
+ let {UI} = require("ui")
+ UI.toggleBottombar(window);
+ UI.toggleBottombar(window);
+ }
+ });
+ this.listeners.set(window, listener);
+ }.bind(this));
+ },
+ removeFromWindow: function(window)
+ {
+ if (!this.listeners.has(window))
+ return;
+
+ let listener = this.listeners.get(window);
+ listener.detach();
+ this.listeners.delete(window);
+ }
+ });
+
+ break;
+ }
+
+ case "fennec2":
+ {
+ exports.isKnownWindow = (window) => window.document.documentElement.id == "main-window";
+
+ exports.getBrowser = (window) => window.BrowserApp.selectedBrowser;
+
+ exports.addTab = (window, url, event) => window.BrowserApp.addTab(url, {selected: true});
+
+ let BrowserChangeListener = function(window, callback)
+ {
+ this.window = window;
+ this.callback = callback;
+ this.onSelect = this.onSelect.bind(this);
+ this.attach();
+ };
+ BrowserChangeListener.prototype = {
+ window: null,
+ callback: null,
+ currentBrowser: null,
+
+ setBrowser: function(browser)
+ {
+ if (browser != this.currentBrowser)
+ {
+ let oldBrowser = this.currentBrowser;
+ this.currentBrowser = browser;
+ this.callback(oldBrowser, browser);
+ }
+ },
+
+ onSelect: function()
+ {
+ let {Utils} = require("utils");
+ Utils.runAsync(function()
+ {
+ this.setBrowser(exports.getBrowser(this.window));
+ }.bind(this));
+ },
+
+ attach: function()
+ {
+ this.onSelect();
+
+ this.window.BrowserApp.deck.addEventListener("TabSelect", this.onSelect, false);
+ },
+ detach: function()
+ {
+ this.window.BrowserApp.deck.removeEventListener("TabSelect", this.onSelect, false);
+
+ this.setBrowser(null);
+ }
+ };
+
+ exports.addBrowserLocationListener = function ffn_addBrowserLocationListener(/**Window*/ window, /**Function*/ callback, /**Boolean*/ ignoreSameDoc)
+ {
+ if (progressListeners.has(window))
+ {
+ progressListeners.get(window).locationCallbacks.push(callback);
+ return;
+ }
+
+ let callbacks = [callback];
+ let dummy = function() {};
+ let progressListener =
+ {
+ onLocationChange: function(progress, request, uri, flags)
+ {
+ if (!ignoreSameDoc || !flags || !(flags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT))
+ for (let i = 0; i < callbacks.length; i++)
+ callbacks[i]();
+ },
+ onProgressChange: dummy,
+ onSecurityChange: dummy,
+ onStateChange: dummy,
+ onStatusChange: dummy,
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference])
+ };
+
+ let listener = new BrowserChangeListener(window, function(oldBrowser, newBrowser)
+ {
+ if (oldBrowser && typeof oldBrowser.removeProgressListener == "function")
+ oldBrowser.removeProgressListener(progressListener);
+ if (newBrowser && typeof newBrowser.removeProgressListener == "function")
+ newBrowser.addProgressListener(progressListener);
+ progressListener.onLocationChange();
+ });
+ listener.locationCallbacks = callbacks;
+
+ progressListeners.set(window, listener);
+ };
+
+ exports.removeBrowserLocationListener = function ffn_removeBrowserLocationListener(/**Window*/ window, /**Function*/ callback)
+ {
+ if (!progressListeners.has(window))
+ return;
+
+ let callbacks = progressListeners.get(window).locationCallbacks;
+ for (let i = 0; i < callbacks.length; i++)
+ if (callbacks[i] == callback)
+ callbacks.splice(i--, 1);
+ };
+
+ exports.removeBrowserLocationListeners = function ffn_removeBrowserLocationListeners(/**Window*/ window)
+ {
+ if (!progressListeners.has(window))
+ return;
+
+ let listener = progressListeners.get(window);
+ listener.detach();
+ progressListeners.delete(window);
+ };
+
+ exports.addBrowserClickListener = function ffn_addBrowserClickListener(/**Window*/ window, /**Function*/ callback)
+ {
+ if (clickListeners.has(window))
+ {
+ clickListeners.get(window).callbacks.push(callback);
+ return;
+ }
+
+ let callbacks = [callback];
+ let listener = new BrowserChangeListener(window, function(oldBrowser, newBrowser)
+ {
+ if (oldBrowser)
+ for (let i = 0; i < callbacks.length; i++)
+ oldBrowser.removeEventListener("click", callbacks[i], true);
+ if (newBrowser)
+ for (let i = 0; i < callbacks.length; i++)
+ newBrowser.addEventListener("click", callbacks[i], true);
+ });
+ listener.callbacks = callbacks;
+
+ clickListeners.set(window, listener);
+ };
+
+ exports.removeBrowserClickListeners = function ffn_removeBrowserClickListeners(/**Window*/ window)
+ {
+ if (!clickListeners.has(window))
+ return;
+
+ let listener = clickListeners.get(window);
+ listener.detach();
+
+ clickListeners.delete(window);
+ };
+
+ let {Filter} = require("filterClasses");
+ let {Prefs} = require("prefs");
+ let {Policy} = require("contentPolicy");
+ let {UI} = require("ui");
+ let {Utils} = require("utils");
+
+ let toggleWhitelist = function(window)
+ {
+ if (!Prefs.enabled)
+ {
+ Prefs.enabled = true;
+ return;
+ }
+
+ let location = exports.getCurrentLocation(window);
+ let host = null;
+ if (location instanceof Ci.nsIURL && Policy.isBlockableScheme(location))
+ {
+ try
+ {
+ host = location.host.replace(/^www\./, "");
+ } catch (e) {}
+ }
+
+ if (!host)
+ return;
+
+ if (Policy.isWhitelisted(location.spec))
+ UI.removeWhitelist(window);
+ else
+ UI.toggleFilter(Filter.fromText("@@||" + host + "^$document"));
+ };
+
+ let menuItem = null;
+ onShutdown.add(function()
+ {
+ let window = null;
+ for (window in UI.applicationWindows)
+ break;
+
+ if (window && menuItem)
+ window.NativeWindow.menu.remove(menuItem);
+ });
+
+ UI.updateIconState = function fmn_updateIconState(window, icon)
+ {
+ if (menuItem !== null)
+ {
+ window.NativeWindow.menu.remove(menuItem);
+ menuItem = null;
+ }
+
+ let action;
+ let host = null;
+ if (Prefs.enabled)
+ {
+ let location = exports.getCurrentLocation(window);
+ if (location instanceof Ci.nsIURL && Policy.isBlockableScheme(location))
+ {
+ try
+ {
+ host = location.host.replace(/^www\./, "");
+ } catch (e) {}
+ }
+ if (!host)
+ return;
+
+ if (host && Policy.isWhitelisted(location.spec))
+ action = "enable_site";
+ else if (host)
+ action = "disable_site";
+ }
+ else
+ action = "enable";
+
+ let actionText = Utils.getString("mobile_menu_" + action);
+ if (host)
+ actionText = actionText.replace(/\?1\?/g, host);
+
+ let iconUrl = require("info").addonRoot + "icon64.png";
+ menuItem = window.NativeWindow.menu.add(actionText, iconUrl, toggleWhitelist.bind(null, window));
+ };
+
+ UI.openSubscriptionDialog = function(window, url, title, mainURL, mainTitle)
+ {
+ let dialogTitle = this.overlay.attributes.subscriptionDialogTitle;
+ let dialogMessage = this.overlay.attributes.subscriptionDialogMessage.replace(/\?1\?/, title).replace(/\?2\?/, url);
+ if (Utils.confirm(window, dialogMessage, dialogTitle))
+ this.setSubscription(url, title);
+ };
+
+ UI.openFiltersDialog = function()
+ {
+ let window = UI.currentWindow;
+ if (!window)
+ return
+
+ let browser = exports.addTab(window, "about:addons").browser;
+ browser.addEventListener("load", function openAddonPrefs(event)
+ {
+ browser.removeEventListener("load", openAddonPrefs, true);
+ Utils.runAsync(function()
+ {
+ // The page won't be ready until the add-on manager data is loaded so we call this method
+ // to know when the data will be ready.
+ AddonManager.getAddonsByTypes(["extension", "theme", "locale"], function()
+ {
+ let event = new Event("Event");
+ event.initEvent("popstate", true, false);
+ event.state = {id: require("info").addonID};
+ browser._contentWindow.dispatchEvent(event);
+ });
+ });
+ }, true);
+ };
+
+ break;
+ }
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/contentPolicy.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/contentPolicy.js
new file mode 100644
index 0000000..084ebc5
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/contentPolicy.js
@@ -0,0 +1,779 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Content policy implementation, responsible for blocking things.
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {TimeLine} = require("timeline");
+let {Utils} = require("utils");
+let {Prefs} = require("prefs");
+let {FilterStorage} = require("filterStorage");
+let {BlockingFilter, WhitelistFilter} = require("filterClasses");
+let {defaultMatcher} = require("matcher");
+let {objectMouseEventHander} = require("objectTabs");
+let {RequestNotifier} = require("requestNotifier");
+let {ElemHide} = require("elemHide");
+
+/**
+ * List of explicitly supported content types
+ * @type Array of String
+ */
+let contentTypes = ["OTHER", "SCRIPT", "IMAGE", "STYLESHEET", "OBJECT", "SUBDOCUMENT", "DOCUMENT", "XMLHTTPREQUEST", "OBJECT_SUBREQUEST", "FONT", "MEDIA"];
+
+/**
+ * List of content types that aren't associated with a visual document area
+ * @type Array of String
+ */
+let nonVisualTypes = ["SCRIPT", "STYLESHEET", "XMLHTTPREQUEST", "OBJECT_SUBREQUEST", "FONT"];
+
+/**
+ * Randomly generated class name, to be applied to collapsed nodes.
+ */
+let collapsedClass = "";
+
+/**
+ * Public policy checking functions and auxiliary objects
+ * @class
+ */
+let Policy = exports.Policy =
+{
+ /**
+ * Map of content type identifiers by their name.
+ * @type Object
+ */
+ type: {},
+
+ /**
+ * Map of content type names by their identifiers (reverse of type map).
+ * @type Object
+ */
+ typeDescr: {},
+
+ /**
+ * Map of localized content type names by their identifiers.
+ * @type Object
+ */
+ localizedDescr: {},
+
+ /**
+ * Lists the non-visual content types.
+ * @type Object
+ */
+ nonVisual: {},
+
+ /**
+ * Map containing all schemes that should be ignored by content policy.
+ * @type Object
+ */
+ whitelistSchemes: {},
+
+ /**
+ * Called on module startup, initializes various exported properties.
+ */
+ init: function()
+ {
+ TimeLine.enter("Entered content policy initialization");
+
+ // type constant by type description and type description by type constant
+ let iface = Ci.nsIContentPolicy;
+ for (let typeName of contentTypes)
+ {
+ if ("TYPE_" + typeName in iface)
+ {
+ let id = iface["TYPE_" + typeName];
+ this.type[typeName] = id;
+ this.typeDescr[id] = typeName;
+ this.localizedDescr[id] = Utils.getString("type_label_" + typeName.toLowerCase());
+ }
+ }
+
+ this.type.ELEMHIDE = 0xFFFD;
+ this.typeDescr[0xFFFD] = "ELEMHIDE";
+ this.localizedDescr[0xFFFD] = Utils.getString("type_label_elemhide");
+
+ this.type.POPUP = 0xFFFE;
+ this.typeDescr[0xFFFE] = "POPUP";
+ this.localizedDescr[0xFFFE] = Utils.getString("type_label_popup");
+
+ for (let type of nonVisualTypes)
+ this.nonVisual[this.type[type]] = true;
+
+ // whitelisted URL schemes
+ for (let scheme of Prefs.whitelistschemes.toLowerCase().split(" "))
+ this.whitelistSchemes[scheme] = true;
+
+ TimeLine.log("done initializing types");
+
+ // Generate class identifier used to collapse node and register corresponding
+ // stylesheet.
+ TimeLine.log("registering global stylesheet");
+
+ let offset = "a".charCodeAt(0);
+ for (let i = 0; i < 20; i++)
+ collapsedClass += String.fromCharCode(offset + Math.random() * 26);
+
+ let collapseStyle = Services.io.newURI("data:text/css," +
+ encodeURIComponent("." + collapsedClass +
+ "{-moz-binding: url(chrome://global/content/bindings/general.xml#foobarbazdummy) !important;}"), null, null);
+ Utils.styleService.loadAndRegisterSheet(collapseStyle, Ci.nsIStyleSheetService.USER_SHEET);
+ onShutdown.add(function()
+ {
+ Utils.styleService.unregisterSheet(collapseStyle, Ci.nsIStyleSheetService.USER_SHEET);
+ })
+ TimeLine.log("done registering stylesheet");
+
+ TimeLine.leave("Done initializing content policy");
+ },
+
+ /**
+ * Checks whether a node should be blocked, hides it if necessary
+ * @param wnd {nsIDOMWindow}
+ * @param node {nsIDOMElement}
+ * @param contentType {String}
+ * @param location {nsIURI}
+ * @param collapse {Boolean} true to force hiding of the node
+ * @return {Boolean} false if the node should be blocked
+ */
+ processNode: function(wnd, node, contentType, location, collapse)
+ {
+ let topWnd = wnd.top;
+ if (!topWnd || !topWnd.location || !topWnd.location.href)
+ return true;
+
+ let privatenode=false;
+ Components.utils.import("resource://gre/modules/PrivateBrowsingUtils.jsm");
+ if (PrivateBrowsingUtils.isWindowPrivate(wnd))
+ privatenode=true;
+
+ let originWindow = Utils.getOriginWindow(wnd);
+ let wndLocation = originWindow.location.href;
+ let docDomain = getHostname(wndLocation);
+ let match = null;
+ if (!match && Prefs.enabled)
+ {
+ let testWnd = wnd;
+ let parentWndLocation = getWindowLocation(testWnd);
+ while (true)
+ {
+ let testWndLocation = parentWndLocation;
+ parentWndLocation = (testWnd == testWnd.parent ? testWndLocation : getWindowLocation(testWnd.parent));
+ match = Policy.isWhitelisted(testWndLocation, parentWndLocation);
+
+ if (!(match instanceof WhitelistFilter))
+ {
+ let keydata = (testWnd.document && testWnd.document.documentElement ? testWnd.document.documentElement.getAttribute("data-adblockkey") : null);
+ if (keydata && keydata.indexOf("_") >= 0)
+ {
+ let [key, signature] = keydata.split("_", 2);
+ let keyMatch = defaultMatcher.matchesByKey(testWndLocation, key.replace(/=/g, ""), docDomain);
+ if (keyMatch && Utils.crypto)
+ {
+ // Website specifies a key that we know but is the signature valid?
+ let uri = Services.io.newURI(testWndLocation, null, null);
+ let params = [
+ uri.path.replace(/#.*/, ""), // REQUEST_URI
+ uri.asciiHost, // HTTP_HOST
+ Utils.httpProtocol.userAgent // HTTP_USER_AGENT
+ ];
+ if (Utils.verifySignature(key, signature, params.join("\0")))
+ match = keyMatch;
+ }
+ }
+ }
+
+ if (match instanceof WhitelistFilter)
+ {
+ FilterStorage.increaseHitCount(match, wnd);
+ RequestNotifier.addNodeData(testWnd.document, topWnd, Policy.type.DOCUMENT, getHostname(parentWndLocation), false, testWndLocation, match);
+ return true;
+ }
+
+ if (testWnd.parent == testWnd)
+ break;
+ else
+ testWnd = testWnd.parent;
+ }
+ }
+
+ // Data loaded by plugins should be attached to the document
+ if (contentType == Policy.type.OBJECT_SUBREQUEST && node instanceof Ci.nsIDOMElement)
+ node = node.ownerDocument;
+
+ // Fix type for objects misrepresented as frames or images
+ if (contentType != Policy.type.OBJECT && (node instanceof Ci.nsIDOMHTMLObjectElement || node instanceof Ci.nsIDOMHTMLEmbedElement))
+ contentType = Policy.type.OBJECT;
+
+ let locationText = location.spec;
+ if (!match && contentType == Policy.type.ELEMHIDE)
+ {
+ let testWnd = wnd;
+ let parentWndLocation = getWindowLocation(testWnd);
+ while (true)
+ {
+ let testWndLocation = parentWndLocation;
+ parentWndLocation = (testWnd == testWnd.parent ? testWndLocation : getWindowLocation(testWnd.parent));
+ let parentDocDomain = getHostname(parentWndLocation);
+ match = defaultMatcher.matchesAny(testWndLocation, "ELEMHIDE", parentDocDomain, false);
+ if (match instanceof WhitelistFilter)
+ {
+ FilterStorage.increaseHitCount(match, wnd);
+ RequestNotifier.addNodeData(testWnd.document, topWnd, contentType, parentDocDomain, false, testWndLocation, match);
+ return true;
+ }
+
+ if (testWnd.parent == testWnd)
+ break;
+ else
+ testWnd = testWnd.parent;
+ }
+
+ match = location;
+ locationText = match.text.replace(/^.*?#/, '#');
+ location = locationText;
+
+ if (!match.isActiveOnDomain(docDomain))
+ return true;
+
+ let exception = ElemHide.getException(match, docDomain);
+ if (exception)
+ {
+ FilterStorage.increaseHitCount(exception, wnd);
+ RequestNotifier.addNodeData(node, topWnd, contentType, docDomain, thirdParty, locationText, exception);
+ return true;
+ }
+ }
+
+ let thirdParty = (contentType == Policy.type.ELEMHIDE ? false : isThirdParty(location, docDomain));
+
+ if (!match && Prefs.enabled)
+ {
+ match = defaultMatcher.matchesAny(locationText, Policy.typeDescr[contentType] || "", docDomain, thirdParty, privatenode);
+ if (match instanceof BlockingFilter && node.ownerDocument && !(contentType in Policy.nonVisual))
+ {
+ let prefCollapse = (match.collapse != null ? match.collapse : !Prefs.fastcollapse);
+ if (collapse || prefCollapse)
+ schedulePostProcess(node);
+ }
+
+ // Track mouse events for objects
+ if (!match && contentType == Policy.type.OBJECT && node.nodeType == Ci.nsIDOMNode.ELEMENT_NODE)
+ {
+ node.addEventListener("mouseover", objectMouseEventHander, true);
+ node.addEventListener("mouseout", objectMouseEventHander, true);
+ }
+ }
+
+ // Store node data
+ RequestNotifier.addNodeData(node, topWnd, contentType, docDomain, thirdParty, locationText, match);
+ if (match)
+ FilterStorage.increaseHitCount(match, wnd);
+
+ return !match || match instanceof WhitelistFilter;
+ },
+
+ /**
+ * Checks whether the location's scheme is blockable.
+ * @param location {nsIURI}
+ * @return {Boolean}
+ */
+ isBlockableScheme: function(location)
+ {
+ return !(location.scheme in Policy.whitelistSchemes);
+ },
+
+ /**
+ * Checks whether a page is whitelisted.
+ * @param {String} url
+ * @param {String} [parentUrl] location of the parent page
+ * @return {Filter} filter that matched the URL or null if not whitelisted
+ */
+ isWhitelisted: function(url, parentUrl)
+ {
+ if (!url)
+ return null;
+
+ // Do not apply exception rules to schemes on our whitelistschemes list.
+ let match = /^([\w\-]+):/.exec(url);
+ if (match && match[1] in Policy.whitelistSchemes)
+ return null;
+
+ if (!parentUrl)
+ parentUrl = url;
+
+ // Ignore fragment identifier
+ let index = url.indexOf("#");
+ if (index >= 0)
+ url = url.substring(0, index);
+
+ let result = defaultMatcher.matchesAny(url, "DOCUMENT", getHostname(parentUrl), false);
+ return (result instanceof WhitelistFilter ? result : null);
+ },
+
+ /**
+ * Checks whether the page loaded in a window is whitelisted.
+ * @param wnd {nsIDOMWindow}
+ * @return {Filter} matching exception rule or null if not whitelisted
+ */
+ isWindowWhitelisted: function(wnd)
+ {
+ return Policy.isWhitelisted(getWindowLocation(wnd));
+ },
+
+
+ /**
+ * Asynchronously re-checks filters for given nodes.
+ */
+ refilterNodes: function(/**Node[]*/ nodes, /**RequestEntry*/ entry)
+ {
+ // Ignore nodes that have been blocked already
+ if (entry.filter && !(entry.filter instanceof WhitelistFilter))
+ return;
+
+ for (let node of nodes)
+ Utils.runAsync(refilterNode, this, node, entry);
+ }
+};
+Policy.init();
+
+/**
+ * Actual nsIContentPolicy and nsIChannelEventSink implementation
+ * @class
+ */
+let PolicyImplementation =
+{
+ classDescription: "Adblock Plus content policy",
+ classID: Components.ID("cfeaabe6-1dd1-11b2-a0c6-cb5c268894c9"),
+ contractID: "@adblockplus.org/abp/policy;1",
+ xpcom_categories: ["content-policy", "net-channel-event-sinks"],
+
+ /**
+ * Registers the content policy on startup.
+ */
+ init: function()
+ {
+ let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
+ try
+ {
+ registrar.registerFactory(this.classID, this.classDescription, this.contractID, this);
+ }
+ catch (e if e.result == Cr.NS_ERROR_FACTORY_EXISTS)
+ {
+ // See bug 924340 - it might be too early to init now, the old version
+ // we are replacing didn't finish removing itself yet.
+ Utils.runAsync(this.init.bind(this));
+ return;
+ }
+
+ let catMan = Utils.categoryManager;
+ for (let category of this.xpcom_categories)
+ catMan.addCategoryEntry(category, this.contractID, this.contractID, false, true);
+
+ // http-on-opening-request is new in Gecko 18, http-on-modify-request can
+ // be used in earlier releases.
+ let httpTopic = "http-on-opening-request";
+ if (Services.vc.compare(Utils.platformVersion, "18.0") < 0)
+ httpTopic = "http-on-modify-request";
+
+ Services.obs.addObserver(this, httpTopic, true);
+ Services.obs.addObserver(this, "content-document-global-created", true);
+ Services.obs.addObserver(this, "xpcom-category-entry-removed", true);
+ Services.obs.addObserver(this, "xpcom-category-cleared", true);
+
+ onShutdown.add(function()
+ {
+ // Our category observers should be removed before changing category
+ // memberships, just in case.
+ Services.obs.removeObserver(this, httpTopic);
+ Services.obs.removeObserver(this, "content-document-global-created");
+ Services.obs.removeObserver(this, "xpcom-category-entry-removed");
+ Services.obs.removeObserver(this, "xpcom-category-cleared");
+
+ for (let category of this.xpcom_categories)
+ catMan.deleteCategoryEntry(category, this.contractID, false);
+
+ // This needs to run asynchronously, see bug 753687
+ Utils.runAsync(function()
+ {
+ registrar.unregisterFactory(this.classID, this);
+ }.bind(this));
+
+ this.previousRequest = null;
+ }.bind(this));
+ },
+
+ //
+ // nsISupports interface implementation
+ //
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPolicy, Ci.nsIObserver,
+ Ci.nsIChannelEventSink, Ci.nsIFactory, Ci.nsISupportsWeakReference]),
+
+ //
+ // nsIContentPolicy interface implementation
+ //
+
+ shouldLoad: function(contentType, contentLocation, requestOrigin, node, mimeTypeGuess, extra)
+ {
+ // Ignore requests without context and top-level documents
+ if (!node || contentType == Policy.type.DOCUMENT)
+ return Ci.nsIContentPolicy.ACCEPT;
+
+ // Ignore standalone objects
+ if (contentType == Policy.type.OBJECT && node.ownerDocument && !/^text\/|[+\/]xml$/.test(node.ownerDocument.contentType))
+ return Ci.nsIContentPolicy.ACCEPT;
+
+ let wnd = Utils.getWindow(node);
+ if (!wnd)
+ return Ci.nsIContentPolicy.ACCEPT;
+
+ // Ignore whitelisted schemes
+ let location = Utils.unwrapURL(contentLocation);
+ if (!Policy.isBlockableScheme(location))
+ return Ci.nsIContentPolicy.ACCEPT;
+
+ // Interpret unknown types as "other"
+ if (!(contentType in Policy.typeDescr))
+ contentType = Policy.type.OTHER;
+
+ let result = Policy.processNode(wnd, node, contentType, location, false);
+ if (result)
+ {
+ // We didn't block this request so we will probably see it again in
+ // http-on-opening-request. Keep it so that we can associate it with the
+ // channel there - will be needed in case of redirect.
+ this.previousRequest = [location, contentType];
+ }
+ return (result ? Ci.nsIContentPolicy.ACCEPT : Ci.nsIContentPolicy.REJECT_REQUEST);
+ },
+
+ shouldProcess: function(contentType, contentLocation, requestOrigin, insecNode, mimeType, extra)
+ {
+ return Ci.nsIContentPolicy.ACCEPT;
+ },
+
+ //
+ // nsIObserver interface implementation
+ //
+ observe: function(subject, topic, data, additional)
+ {
+ switch (topic)
+ {
+ case "content-document-global-created":
+ {
+ if (!(subject instanceof Ci.nsIDOMWindow) || !subject.opener)
+ return;
+
+ let uri = additional || Utils.makeURI(subject.location.href);
+ if (!Policy.processNode(subject.opener, subject.opener.document, Policy.type.POPUP, uri, false))
+ {
+ subject.stop();
+ Utils.runAsync(subject.close, subject);
+ }
+ else if (uri.spec == "about:blank")
+ {
+ // An about:blank pop-up most likely means that a load will be
+ // initiated synchronously. Set a flag for our "http-on-opening-request"
+ // handler.
+ this.expectingPopupLoad = true;
+ Utils.runAsync(function()
+ {
+ this.expectingPopupLoad = false;
+ });
+ }
+ break;
+ }
+ case "http-on-opening-request":
+ case "http-on-modify-request":
+ {
+ if (!(subject instanceof Ci.nsIHttpChannel))
+ return;
+
+ if (this.previousRequest && subject.URI == this.previousRequest[0] &&
+ subject instanceof Ci.nsIWritablePropertyBag)
+ {
+ // We just handled a content policy call for this request - associate
+ // the data with the channel so that we can find it in case of a redirect.
+ subject.setProperty("abpRequestType", this.previousRequest[1]);
+ this.previousRequest = null;
+ }
+
+ if (this.expectingPopupLoad)
+ {
+ let wnd = Utils.getRequestWindow(subject);
+ if (wnd && wnd.opener && wnd.location.href == "about:blank")
+ {
+ this.observe(wnd, "content-document-global-created", null, subject.URI);
+ if (subject instanceof Ci.nsIWritablePropertyBag)
+ subject.setProperty("abpRequestType", Policy.type.POPUP);
+ }
+ }
+
+ break;
+ }
+ case "xpcom-category-entry-removed":
+ case "xpcom-category-cleared":
+ {
+ let category = data;
+ if (this.xpcom_categories.indexOf(category) < 0)
+ return;
+
+ if (topic == "xpcom-category-entry-removed" &&
+ subject instanceof Ci.nsISupportsCString &&
+ subject.data != this.contractID)
+ {
+ return;
+ }
+
+ // Our category entry was removed, make sure to add it back
+ let catMan = Utils.categoryManager;
+ catMan.addCategoryEntry(category, this.contractID, this.contractID, false, true);
+ break;
+ }
+ }
+ },
+
+ //
+ // nsIChannelEventSink interface implementation
+ //
+
+ asyncOnChannelRedirect: function(oldChannel, newChannel, flags, callback)
+ {
+ let result = Cr.NS_OK;
+ try
+ {
+ // Try to retrieve previously stored request data from the channel
+ let contentType;
+ if (oldChannel instanceof Ci.nsIWritablePropertyBag)
+ {
+ try
+ {
+ contentType = oldChannel.getProperty("abpRequestType");
+ }
+ catch(e)
+ {
+ // No data attached, ignore this redirect
+ return;
+ }
+ }
+
+ let newLocation = null;
+ try
+ {
+ newLocation = newChannel.URI;
+ } catch(e2) {}
+ if (!newLocation)
+ return;
+
+ let wnd = Utils.getRequestWindow(newChannel);
+ if (!wnd)
+ return;
+
+ if (contentType == Policy.type.SUBDOCUMENT && wnd.parent == wnd.top && wnd.opener)
+ {
+ // This is a window opened in a new tab miscategorized as frame load,
+ // see bug 467514. Get the frame as context to be at least consistent.
+ wnd = wnd.opener;
+ }
+
+ if (contentType == Policy.type.POPUP && wnd.opener)
+ {
+ // Popups are initiated by their opener, not their own window.
+ wnd = wnd.opener;
+ }
+
+ if (!Policy.processNode(wnd, wnd.document, contentType, newLocation, false))
+ result = Cr.NS_BINDING_ABORTED;
+ }
+ catch (e)
+ {
+ // We shouldn't throw exceptions here - this will prevent the redirect.
+ Cu.reportError(e);
+ }
+ finally
+ {
+ callback.onRedirectVerifyCallback(result);
+ }
+ },
+
+ //
+ // nsIFactory interface implementation
+ //
+
+ createInstance: function(outer, iid)
+ {
+ if (outer)
+ throw Cr.NS_ERROR_NO_AGGREGATION;
+ return this.QueryInterface(iid);
+ }
+};
+PolicyImplementation.init();
+
+/**
+ * Nodes scheduled for post-processing (might be null).
+ * @type Array of Node
+ */
+let scheduledNodes = null;
+
+/**
+ * Schedules a node for post-processing.
+ */
+function schedulePostProcess(/**Element*/ node)
+{
+ if (scheduledNodes)
+ scheduledNodes.push(node);
+ else
+ {
+ scheduledNodes = [node];
+ Utils.runAsync(postProcessNodes);
+ }
+}
+
+/**
+ * Processes nodes scheduled for post-processing (typically hides them).
+ */
+function postProcessNodes()
+{
+ let nodes = scheduledNodes;
+ scheduledNodes = null;
+
+ for (let node of nodes)
+ {
+ // adjust frameset's cols/rows for frames
+ let parentNode = node.parentNode;
+ if (parentNode && parentNode instanceof Ci.nsIDOMHTMLFrameSetElement)
+ {
+ let hasCols = (parentNode.cols && parentNode.cols.indexOf(",") > 0);
+ let hasRows = (parentNode.rows && parentNode.rows.indexOf(",") > 0);
+ if ((hasCols || hasRows) && !(hasCols && hasRows))
+ {
+ let index = -1;
+ for (let frame = node; frame; frame = frame.previousSibling)
+ if (frame instanceof Ci.nsIDOMHTMLFrameElement || frame instanceof Ci.nsIDOMHTMLFrameSetElement)
+ index++;
+
+ let property = (hasCols ? "cols" : "rows");
+ let weights = parentNode[property].split(",");
+ weights[index] = "0";
+ parentNode[property] = weights.join(",");
+ }
+ }
+ else
+ node.classList.add(collapsedClass);
+ }
+}
+
+/**
+ * Extracts the hostname from a URL (might return null).
+ */
+function getHostname(/**String*/ url) /**String*/
+{
+ try
+ {
+ return Utils.unwrapURL(url).host;
+ }
+ catch(e)
+ {
+ return null;
+ }
+}
+
+/**
+ * Retrieves the location of a window.
+ * @param wnd {nsIDOMWindow}
+ * @return {String} window location or null on failure
+ */
+function getWindowLocation(wnd)
+{
+ if ("name" in wnd && wnd.name == "messagepane")
+ {
+ // Thunderbird branch
+ try
+ {
+ let mailWnd = wnd.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIWebNavigation)
+ .QueryInterface(Ci.nsIDocShellTreeItem)
+ .rootTreeItem
+ .QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIDOMWindow);
+
+ // Typically we get a wrapped mail window here, need to unwrap
+ try
+ {
+ mailWnd = mailWnd.wrappedJSObject;
+ } catch(e) {}
+
+ if ("currentHeaderData" in mailWnd && "content-base" in mailWnd.currentHeaderData)
+ {
+ return mailWnd.currentHeaderData["content-base"].headerValue;
+ }
+ else if ("currentHeaderData" in mailWnd && "from" in mailWnd.currentHeaderData)
+ {
+ let emailAddress = Utils.headerParser.extractHeaderAddressMailboxes(mailWnd.currentHeaderData.from.headerValue);
+ if (emailAddress)
+ return 'mailto:' + emailAddress.replace(/^[\s"]+/, "").replace(/[\s"]+$/, "").replace(/\s/g, '%20');
+ }
+ } catch(e) {}
+ }
+
+ // Firefox branch
+ return wnd.location.href;
+}
+
+/**
+ * Checks whether the location's origin is different from document's origin.
+ */
+function isThirdParty(/**nsIURI*/location, /**String*/ docDomain) /**Boolean*/
+{
+ if (!location || !docDomain)
+ return true;
+
+ try
+ {
+ return Utils.effectiveTLD.getBaseDomain(location) != Utils.effectiveTLD.getBaseDomainFromHost(docDomain);
+ }
+ catch (e)
+ {
+ // EffectiveTLDService throws on IP addresses, just compare the host name
+ let host = "";
+ try
+ {
+ host = location.host;
+ } catch (e) {}
+ return host != docDomain;
+ }
+}
+
+/**
+ * Re-checks filters on an element.
+ */
+function refilterNode(/**Node*/ node, /**RequestEntry*/ entry)
+{
+ let wnd = Utils.getWindow(node);
+ if (!wnd || wnd.closed)
+ return;
+
+ if (entry.type == Policy.type.OBJECT)
+ {
+ node.removeEventListener("mouseover", objectMouseEventHander, true);
+ node.removeEventListener("mouseout", objectMouseEventHander, true);
+ }
+ Policy.processNode(wnd, node, entry.type, Utils.makeURI(entry.location), true);
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/customizableUI.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/customizableUI.js
new file mode 100644
index 0000000..7db7425
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/customizableUI.js
@@ -0,0 +1,320 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview This emulates a subset of the CustomizableUI API from Firefox 28.
+ */
+
+let {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm", null);
+
+let {Utils} = require("utils");
+
+// UI module has to be referenced lazily to avoid circular references
+XPCOMUtils.defineLazyGetter(this, "UI", () => require("ui").UI);
+
+let widgets = Map();
+
+function getToolbox(/**Window*/ window, /**Widget*/ widget) /**Element*/
+{
+ if (!("defaultArea" in widget) || !widget.defaultArea)
+ return null;
+
+ let toolbar = UI.findElement(window, widget.defaultArea);
+ if (!toolbar)
+ return null;
+
+ let toolbox = toolbar.toolbox;
+ if (toolbox && ("palette" in toolbox) && toolbox.palette)
+ return toolbox;
+ else
+ return null;
+}
+
+function getToolbar(/**Element*/ element) /**Element*/
+{
+ for (let parent = element.parentNode; parent; parent = parent.parentNode)
+ if (parent.localName == "toolbar")
+ return parent;
+ return null;
+}
+
+function getPaletteItem(/**Element*/ toolbox, /**String*/ id) /**Element*/
+{
+ for (let child of toolbox.palette.children)
+ if (child.id == id)
+ return child;
+
+ return null;
+}
+
+function restoreWidget(/**Element*/ toolbox, /**Widget*/ widget)
+{
+ // Create node
+ let node = widget.onBuild(toolbox.ownerDocument);
+
+ // Insert into the palette first
+ toolbox.palette.insertBefore(node, toolbox.palette.firstChild);
+
+ // Now find out where we should put it
+ let position = toolbox.getAttribute(widget.positionAttribute);
+ if (!/^\S*,\S*,\S*$/.test(position))
+ position = null;
+
+ if (position == null)
+ {
+ // No explicitly saved position but maybe we can find it in a currentset
+ // attribute somewhere.
+ let toolbars = toolbox.externalToolbars.slice();
+ for (let child of toolbox.children)
+ if (child.localName == "toolbar")
+ toolbars.push(child);
+ for (let toolbar of toolbars)
+ {
+ let currentSet = toolbar.getAttribute("currentset");
+ if (currentSet)
+ {
+ let items = currentSet.split(",");
+ let index = items.indexOf(widget.id);
+ if (index >= 0)
+ {
+ let before = (index + 1 < items.length ? items[index + 1] : "");
+ position = "visible," + toolbar.id + "," + before;
+ toolbox.setAttribute(widget.positionAttribute, position);
+ toolbox.ownerDocument.persist(toolbox.id, widget.positionAttribute);
+ break;
+ }
+ }
+ }
+ }
+
+ showWidget(toolbox, widget, position);
+}
+
+function showWidget(/**Element*/ toolbox, /**Widget*/ widget, /**String*/ position)
+{
+ let visible = "visible", parent = null, before = null;
+ if (position)
+ {
+ [visible, parent, before] = position.split(",", 3);
+ parent = toolbox.ownerDocument.getElementById(parent);
+ if (before == "")
+ before = null;
+ else
+ before = toolbox.ownerDocument.getElementById(before);
+ if (before && before.parentNode != parent)
+ before = null;
+ }
+
+ if (visible == "visible" && !parent)
+ {
+ let insertionPoint = {
+ parent: widget.defaultArea
+ };
+ if (typeof widget.defaultBefore != "undefined")
+ insertionPoint.before = widget.defaultBefore;
+ if (typeof widget.defaultAfter != "undefined")
+ insertionPoint.after = widget.defaultAfter;
+
+ [parent, before] = UI.resolveInsertionPoint(toolbox.ownerDocument.defaultView, insertionPoint);
+ }
+
+ if (parent && parent.localName != "toolbar")
+ parent = null;
+
+ if (visible != "visible")
+ {
+ // Move to palette if the item is currently visible
+ let node = toolbox.ownerDocument.getElementById(widget.id);
+ if (node)
+ toolbox.palette.appendChild(node);
+ }
+ else if (parent)
+ {
+ // Add the item to the toolbar
+ let items = parent.currentSet.split(",");
+ let index = (before ? items.indexOf(before.id) : -1);
+ if (index < 0)
+ before = null;
+ parent.insertItem(widget.id, before, null, false);
+ }
+
+ saveState(toolbox, widget);
+}
+
+function removeWidget(/**Window*/ window, /**Widget*/ widget)
+{
+ let element = window.document.getElementById(widget.id);
+ if (element)
+ element.parentNode.removeChild(element);
+
+ let toolbox = getToolbox(window, widget);
+ if (toolbox)
+ {
+ let paletteItem = getPaletteItem(toolbox, widget.id);
+ if (paletteItem)
+ paletteItem.parentNode.removeChild(paletteItem);
+ }
+}
+
+function onToolbarCustomization(/**Event*/ event)
+{
+ let toolbox = event.currentTarget;
+ for (let [id, widget] of widgets)
+ saveState(toolbox, widget);
+}
+
+function saveState(/**Element*/ toolbox, /**Widget*/ widget)
+{
+ let node = toolbox.ownerDocument.getElementById(widget.id);
+
+ let position = toolbox.getAttribute(widget.positionAttribute) || "hidden,,";
+ if (node && node.parentNode.localName != "toolbarpalette")
+ {
+ if (typeof widget.onAdded == "function")
+ widget.onAdded(node)
+
+ let toolbar = getToolbar(node);
+ position = "visible," + toolbar.id + "," + (node.nextSibling ? node.nextSibling.id : "");
+ }
+ else
+ position = position.replace(/^visible,/, "hidden,")
+
+ toolbox.setAttribute(widget.positionAttribute, position);
+ toolbox.ownerDocument.persist(toolbox.id, widget.positionAttribute);
+}
+
+let CustomizableUI = exports.CustomizableUI =
+{
+ createWidget: function(widget)
+ {
+ if (typeof widget.id == "undefined" ||
+ typeof widget.defaultArea == "undefined" ||
+ typeof widget.positionAttribute == "undefined")
+ {
+ throw new Error("Unexpected: required property missing from the widget data");
+ }
+ widgets.set(widget.id, widget);
+
+ // Show widget in any existing windows
+ for (let window of UI.applicationWindows)
+ {
+ let toolbox = getToolbox(window, widget);
+ if (toolbox)
+ {
+ toolbox.addEventListener("aftercustomization", onToolbarCustomization, false);
+ restoreWidget(toolbox, widget);
+ }
+ }
+ },
+
+ destroyWidget: function(id)
+ {
+ // Don't do anything here. This function is called on shutdown,
+ // removeFromWindow will take care of cleaning up already.
+ },
+
+ getPlacementOfWidget: function(id)
+ {
+ let window = UI.currentWindow;
+ if (!window)
+ return null;
+
+ let widget = window.document.getElementById(id);
+ if (!widget)
+ return null;
+
+ let toolbar = getToolbar(widget);
+ if (!toolbar)
+ return null;
+
+ return {area: toolbar.id};
+ },
+
+ addWidgetToArea: function(id)
+ {
+ // Note: the official API function also has area and position parameters.
+ // We ignore those here and simply restore the previous position instead.
+ let widget = widgets.get(id);
+ for (let window of UI.applicationWindows)
+ {
+ let toolbox = getToolbox(window, widget);
+ if (!toolbox)
+ continue;
+
+ let position = toolbox.getAttribute(widget.positionAttribute);
+ if (position)
+ position = position.replace(/^hidden,/, "visible,");
+ showWidget(toolbox, widget, position);
+ }
+ },
+
+ removeWidgetFromArea: function(id)
+ {
+ let widget = widgets.get(id);
+ for (let window of UI.applicationWindows)
+ {
+ let toolbox = getToolbox(window, widget);
+ if (!toolbox)
+ continue;
+
+ let position = toolbox.getAttribute(widget.positionAttribute);
+ if (position)
+ position = position.replace(/^visible,/, "hidden,");
+ else
+ position = "hidden,,";
+ showWidget(toolbox, widget, position);
+ }
+ }
+};
+
+let {WindowObserver} = require("windowObserver");
+new WindowObserver({
+ applyToWindow: function(window)
+ {
+ let {isKnownWindow} = require("appSupport");
+ if (!isKnownWindow(window))
+ return;
+
+ for (let [id, widget] of widgets)
+ {
+ let toolbox = getToolbox(window, widget);
+ if (toolbox)
+ {
+ toolbox.addEventListener("aftercustomization", onToolbarCustomization, false);
+
+ // Restore widget asynchronously to allow the stylesheet to load
+ Utils.runAsync(restoreWidget.bind(null, toolbox, widget));
+ }
+ }
+ },
+
+ removeFromWindow: function(window)
+ {
+ let {isKnownWindow} = require("appSupport");
+ if (!isKnownWindow(window))
+ return;
+
+ for (let [id, widget] of widgets)
+ {
+ let toolbox = getToolbox(window, widget);
+ if (toolbox)
+ toolbox.removeEventListener("aftercustomization", onToolbarCustomization, false);
+
+ removeWidget(window, widget);
+ }
+ }
+});
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/downloader.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/downloader.js
new file mode 100644
index 0000000..d1ef209
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/downloader.js
@@ -0,0 +1,381 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Downloads a set of URLs in regular time intervals.
+ */
+
+let {Utils} = require("utils");
+
+let MILLIS_IN_SECOND = exports.MILLIS_IN_SECOND = 1000;
+let MILLIS_IN_MINUTE = exports.MILLIS_IN_MINUTE = 60 * MILLIS_IN_SECOND;
+let MILLIS_IN_HOUR = exports.MILLIS_IN_HOUR = 60 * MILLIS_IN_MINUTE;
+let MILLIS_IN_DAY = exports.MILLIS_IN_DAY = 24 * MILLIS_IN_HOUR;
+
+/**
+ * Creates a new downloader instance.
+ * @param {Function} dataSource Function that will yield downloadable objects on each check
+ * @param {Integer} initialDelay Number of milliseconds to wait before the first check
+ * @param {Integer} checkInterval Interval between the checks
+ * @constructor
+ */
+let Downloader = exports.Downloader = function Downloader(dataSource, initialDelay, checkInterval)
+{
+ this.dataSource = dataSource;
+ this._timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ this._timer.initWithCallback(function()
+ {
+ this._timer.delay = checkInterval;
+ this._doCheck();
+ }.bind(this), initialDelay, Ci.nsITimer.TYPE_REPEATING_SLACK);
+ this._downloading = Object.create(null);
+}
+Downloader.prototype =
+{
+ /**
+ * Timer triggering the downloads.
+ * @type nsITimer
+ */
+ _timer: null,
+
+ /**
+ * Map containing the URLs of objects currently being downloaded as its keys.
+ */
+ _downloading: null,
+
+ /**
+ * Function that will yield downloadable objects on each check.
+ * @type Function
+ */
+ dataSource: null,
+
+ /**
+ * Maximal time interval that the checks can be left out until the soft
+ * expiration interval increases.
+ * @type Integer
+ */
+ maxAbsenceInterval: 1 * MILLIS_IN_DAY,
+
+ /**
+ * Minimal time interval before retrying a download after an error.
+ * @type Integer
+ */
+ minRetryInterval: 1 * MILLIS_IN_DAY,
+
+ /**
+ * Maximal allowed expiration interval, larger expiration intervals will be
+ * corrected.
+ * @type Integer
+ */
+ maxExpirationInterval: 14 * MILLIS_IN_DAY,
+
+ /**
+ * Maximal number of redirects before the download is considered as failed.
+ * @type Integer
+ */
+ maxRedirects: 5,
+
+ /**
+ * Called whenever expiration intervals for an object need to be adapted.
+ * @type Function
+ */
+ onExpirationChange: null,
+
+ /**
+ * Callback to be triggered whenever a download starts.
+ * @type Function
+ */
+ onDownloadStarted: null,
+
+ /**
+ * Callback to be triggered whenever a download finishes successfully. The
+ * callback can return an error code to indicate that the data is wrong.
+ * @type Function
+ */
+ onDownloadSuccess: null,
+
+ /**
+ * Callback to be triggered whenever a download fails.
+ * @type Function
+ */
+ onDownloadError: null,
+
+ /**
+ * Checks whether anything needs downloading.
+ */
+ _doCheck: function()
+ {
+ let now = Date.now();
+ for (let downloadable of this.dataSource())
+ {
+ if (downloadable.lastCheck && now - downloadable.lastCheck > this.maxAbsenceInterval)
+ {
+ // No checks for a long time interval - user must have been offline, e.g.
+ // during a weekend. Increase soft expiration to prevent load peaks on the
+ // server.
+ downloadable.softExpiration += now - downloadable.lastCheck;
+ }
+ downloadable.lastCheck = now;
+
+ // Sanity check: do expiration times make sense? Make sure people changing
+ // system clock don't get stuck with outdated subscriptions.
+ if (downloadable.hardExpiration - now > this.maxExpirationInterval)
+ downloadable.hardExpiration = now + this.maxExpirationInterval;
+ if (downloadable.softExpiration - now > this.maxExpirationInterval)
+ downloadable.softExpiration = now + this.maxExpirationInterval;
+
+ // Notify the caller about changes to expiration parameters
+ if (this.onExpirationChange)
+ this.onExpirationChange(downloadable);
+
+ // Does that object need downloading?
+ if (downloadable.softExpiration > now && downloadable.hardExpiration > now)
+ continue;
+
+ // Do not retry downloads too often
+ if (downloadable.lastError && now - downloadable.lastError < this.minRetryInterval)
+ continue;
+
+ this._download(downloadable, 0);
+ }
+ },
+
+ /**
+ * Stops the periodic checks.
+ */
+ cancel: function()
+ {
+ this._timer.cancel();
+ },
+
+ /**
+ * Checks whether an address is currently being downloaded.
+ */
+ isDownloading: function(/**String*/ url) /**Boolean*/
+ {
+ return url in this._downloading;
+ },
+
+ /**
+ * Starts downloading for an object.
+ */
+ download: function(/**Downloadable*/ downloadable)
+ {
+ // Make sure to detach download from the current execution context
+ Utils.runAsync(this._download.bind(this, downloadable, 0));
+ },
+
+ /**
+ * Generates the real download URL for an object by appending various
+ * parameters.
+ */
+ getDownloadUrl: function(/**Downloadable*/ downloadable) /** String*/
+ {
+ let {addonName, addonVersion, application, applicationVersion, platform, platformVersion} = require("info");
+ let url = downloadable.redirectURL || downloadable.url;
+ if (url.indexOf("?") >= 0)
+ url += "&";
+ else
+ url += "?";
+ url += "addonName=" + encodeURIComponent(addonName) +
+ "&addonVersion=" + encodeURIComponent(addonVersion) +
+ "&application=" + encodeURIComponent(application) +
+ "&applicationVersion=" + encodeURIComponent(applicationVersion) +
+ "&platform=" + encodeURIComponent(platform) +
+ "&platformVersion=" + encodeURIComponent(platformVersion) +
+ "&lastVersion=" + encodeURIComponent(downloadable.lastVersion);
+ return url;
+ },
+
+ _download: function(downloadable, redirects)
+ {
+ if (this.isDownloading(downloadable.url))
+ return;
+
+ let downloadUrl = this.getDownloadUrl(downloadable);
+ let request = null;
+
+ let errorCallback = function errorCallback(error)
+ {
+ let channelStatus = -1;
+ try
+ {
+ channelStatus = request.channel.status;
+ } catch (e) {}
+
+ let responseStatus = request.status;
+
+ Cu.reportError("Adblock Plus: Downloading URL " + downloadable.url + " failed (" + error + ")\n" +
+ "Download address: " + downloadUrl + "\n" +
+ "Channel status: " + channelStatus + "\n" +
+ "Server response: " + responseStatus);
+
+ if (this.onDownloadError)
+ {
+ // Allow one extra redirect if the error handler gives us a redirect URL
+ let redirectCallback = null;
+ if (redirects <= this.maxRedirects)
+ {
+ redirectCallback = function redirectCallback(url)
+ {
+ downloadable.redirectURL = url;
+ this._download(downloadable, redirects + 1);
+ }.bind(this);
+ }
+
+ this.onDownloadError(downloadable, downloadUrl, error, channelStatus, responseStatus, redirectCallback);
+ }
+ }.bind(this);
+
+ try
+ {
+ request = new XMLHttpRequest();
+ request.mozBackgroundRequest = true;
+ request.open("GET", downloadUrl);
+ }
+ catch (e)
+ {
+ errorCallback("synchronize_invalid_url");
+ return;
+ }
+
+ try {
+ request.overrideMimeType("text/plain");
+ request.channel.loadFlags = request.channel.loadFlags |
+ request.channel.INHIBIT_CACHING |
+ request.channel.VALIDATE_ALWAYS;
+
+ // Override redirect limit from preferences, user might have set it to 1
+ if (request.channel instanceof Ci.nsIHttpChannel)
+ request.channel.redirectionLimit = this.maxRedirects;
+ }
+ catch (e)
+ {
+ Cu.reportError(e)
+ }
+
+ request.addEventListener("error", function(event)
+ {
+ if (onShutdown.done)
+ return;
+
+ delete this._downloading[downloadable.url];
+ errorCallback("synchronize_connection_error");
+ }.bind(this), false);
+
+ request.addEventListener("load", function(event)
+ {
+ if (onShutdown.done)
+ return;
+
+ delete this._downloading[downloadable.url];
+
+ // Status will be 0 for non-HTTP requests
+ if (request.status && request.status != 200)
+ {
+ errorCallback("synchronize_connection_error");
+ return;
+ }
+
+ this.onDownloadSuccess(downloadable, request.responseText, errorCallback, function redirectCallback(url)
+ {
+ if (redirects >= this.maxRedirects)
+ errorCallback("synchronize_connection_error");
+ else
+ {
+ downloadable.redirectURL = url;
+ this._download(downloadable, redirects + 1);
+ }
+ }.bind(this));
+ }.bind(this), false);
+
+ request.send(null);
+
+ this._downloading[downloadable.url] = true;
+ if (this.onDownloadStarted)
+ this.onDownloadStarted(downloadable);
+ },
+
+ /**
+ * Produces a soft and a hard expiration interval for a given supplied
+ * expiration interval.
+ * @return {Array} soft and hard expiration interval
+ */
+ processExpirationInterval: function(/**Integer*/ interval)
+ {
+ interval = Math.min(Math.max(interval, 0), this.maxExpirationInterval);
+ let soft = Math.round(interval * (Math.random() * 0.4 + 0.8));
+ let hard = interval * 2;
+ let now = Date.now();
+ return [now + soft, now + hard];
+ }
+};
+
+/**
+ * An object that can be downloaded by the downloadable
+ * @param {String} url URL that has to be requested for the object
+ * @constructor
+ */
+let Downloadable = exports.Downloadable = function Downloadable(url)
+{
+ this.url = url;
+}
+Downloadable.prototype =
+{
+ /**
+ * URL that has to be requested for the object.
+ * @type String
+ */
+ url: null,
+
+ /**
+ * URL that the download was redirected to if any.
+ * @type String
+ */
+ redirectURL: null,
+
+ /**
+ * Time of last download error or 0 if the last download was successful.
+ * @type Integer
+ */
+ lastError: 0,
+
+ /**
+ * Time of last check whether the object needs downloading.
+ * @type Integer
+ */
+ lastCheck: 0,
+
+ /**
+ * Object version corresponding to the last successful download.
+ * @type Integer
+ */
+ lastVersion: 0,
+
+ /**
+ * Soft expiration interval, will increase if no checks are performed for a
+ * while.
+ * @type Integer
+ */
+ softExpiration: 0,
+
+ /**
+ * Hard expiration interval, this is fixed.
+ * @type Integer
+ */
+ hardExpiration: 0,
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/elemHide.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/elemHide.js
new file mode 100644
index 0000000..df17a0f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/elemHide.js
@@ -0,0 +1,419 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Element hiding implementation.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {Utils} = require("utils");
+let {IO} = require("io");
+let {Prefs} = require("prefs");
+let {ElemHideException} = require("filterClasses");
+let {FilterNotifier} = require("filterNotifier");
+let {AboutHandler} = require("elemHideHitRegistration");
+let {TimeLine} = require("timeline");
+
+/**
+ * Lookup table, filters by their associated key
+ * @type Object
+ */
+let filterByKey = {__proto__: null};
+
+/**
+ * Lookup table, keys of the filters by filter text
+ * @type Object
+ */
+let keyByFilter = {__proto__: null};
+
+/**
+ * Lookup table, keys are known element hiding exceptions
+ * @type Object
+ */
+let knownExceptions = {__proto__: null};
+
+/**
+ * Lookup table, lists of element hiding exceptions by selector
+ * @type Object
+ */
+let exceptions = {__proto__: null};
+
+/**
+ * Currently applied stylesheet URL
+ * @type nsIURI
+ */
+let styleURL = null;
+
+/**
+ * Element hiding component
+ * @class
+ */
+let ElemHide = exports.ElemHide =
+{
+ /**
+ * Indicates whether filters have been added or removed since the last apply() call.
+ * @type Boolean
+ */
+ isDirty: false,
+
+ /**
+ * Inidicates whether the element hiding stylesheet is currently applied.
+ * @type Boolean
+ */
+ applied: false,
+
+ /**
+ * Called on module startup.
+ */
+ init: function()
+ {
+ TimeLine.enter("Entered ElemHide.init()");
+ Prefs.addListener(function(name)
+ {
+ if (name == "enabled")
+ ElemHide.apply();
+ });
+ onShutdown.add(function()
+ {
+ ElemHide.unapply();
+ });
+
+ TimeLine.log("done adding prefs listener");
+
+ let styleFile = IO.resolveFilePath(Prefs.data_directory);
+ styleFile.append("elemhide.css");
+ styleURL = Services.io.newFileURI(styleFile).QueryInterface(Ci.nsIFileURL);
+ TimeLine.log("done determining stylesheet URL");
+
+ TimeLine.leave("ElemHide.init() done");
+ },
+
+ /**
+ * Removes all known filters
+ */
+ clear: function()
+ {
+ filterByKey = {__proto__: null};
+ keyByFilter = {__proto__: null};
+ knownExceptions = {__proto__: null};
+ exceptions = {__proto__: null};
+ ElemHide.isDirty = false;
+ ElemHide.unapply();
+ },
+
+ /**
+ * Add a new element hiding filter
+ * @param {ElemHideFilter} filter
+ */
+ add: function(filter)
+ {
+ if (filter instanceof ElemHideException)
+ {
+ if (filter.text in knownExceptions)
+ return;
+
+ let selector = filter.selector;
+ if (!(selector in exceptions))
+ exceptions[selector] = [];
+ exceptions[selector].push(filter);
+ knownExceptions[filter.text] = true;
+ }
+ else
+ {
+ if (filter.text in keyByFilter)
+ return;
+
+ let key;
+ do {
+ key = Math.random().toFixed(15).substr(5);
+ } while (key in filterByKey);
+
+ filterByKey[key] = filter;
+ keyByFilter[filter.text] = key;
+ ElemHide.isDirty = true;
+ }
+ },
+
+ /**
+ * Removes an element hiding filter
+ * @param {ElemHideFilter} filter
+ */
+ remove: function(filter)
+ {
+ if (filter instanceof ElemHideException)
+ {
+ if (!(filter.text in knownExceptions))
+ return;
+
+ let list = exceptions[filter.selector];
+ let index = list.indexOf(filter);
+ if (index >= 0)
+ list.splice(index, 1);
+ delete knownExceptions[filter.text];
+ }
+ else
+ {
+ if (!(filter.text in keyByFilter))
+ return;
+
+ let key = keyByFilter[filter.text];
+ delete filterByKey[key];
+ delete keyByFilter[filter.text];
+ ElemHide.isDirty = true;
+ }
+ },
+
+ /**
+ * Checks whether an exception rule is registered for a filter on a particular
+ * domain.
+ */
+ getException: function(/**Filter*/ filter, /**String*/ docDomain) /**ElemHideException*/
+ {
+ let selector = filter.selector;
+ if (!(filter.selector in exceptions))
+ return null;
+
+ let list = exceptions[filter.selector];
+ for (let i = list.length - 1; i >= 0; i--)
+ if (list[i].isActiveOnDomain(docDomain))
+ return list[i];
+
+ return null;
+ },
+
+ /**
+ * Will be set to true if apply() is running (reentrance protection).
+ * @type Boolean
+ */
+ _applying: false,
+
+ /**
+ * Will be set to true if an apply() call arrives while apply() is already
+ * running (delayed execution).
+ * @type Boolean
+ */
+ _needsApply: false,
+
+ /**
+ * Generates stylesheet URL and applies it globally
+ */
+ apply: function()
+ {
+ if (this._applying)
+ {
+ this._needsApply = true;
+ return;
+ }
+
+ TimeLine.enter("Entered ElemHide.apply()");
+
+ if (!ElemHide.isDirty || !Prefs.enabled)
+ {
+ // Nothing changed, looks like we merely got enabled/disabled
+ if (Prefs.enabled && !ElemHide.applied)
+ {
+ try
+ {
+ Utils.styleService.loadAndRegisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET);
+ ElemHide.applied = true;
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ }
+ TimeLine.log("Applying existing stylesheet finished");
+ }
+ else if (!Prefs.enabled && ElemHide.applied)
+ {
+ ElemHide.unapply();
+ TimeLine.log("ElemHide.unapply() finished");
+ }
+
+ TimeLine.leave("ElemHide.apply() done (no file changes)");
+ return;
+ }
+
+ IO.writeToFile(styleURL.file, this._generateCSSContent(), function(e)
+ {
+ TimeLine.enter("ElemHide.apply() write callback");
+ this._applying = false;
+
+ // _generateCSSContent is throwing NS_ERROR_NOT_AVAILABLE to indicate that
+ // there are no filters. If that exception is passed through XPCOM we will
+ // see a proper exception here, otherwise a number.
+ let noFilters = (e == Cr.NS_ERROR_NOT_AVAILABLE || (e && e.result == Cr.NS_ERROR_NOT_AVAILABLE));
+ if (noFilters)
+ {
+ e = null;
+ IO.removeFile(styleURL.file, function(e) {});
+ }
+ else if (e)
+ Cu.reportError(e);
+
+ if (this._needsApply)
+ {
+ this._needsApply = false;
+ this.apply();
+ }
+ else if (!e)
+ {
+ ElemHide.isDirty = false;
+
+ ElemHide.unapply();
+ TimeLine.log("ElemHide.unapply() finished");
+
+ if (!noFilters)
+ {
+ try
+ {
+ Utils.styleService.loadAndRegisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET);
+ ElemHide.applied = true;
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ }
+ TimeLine.log("Applying stylesheet finished");
+ }
+
+ FilterNotifier.triggerListeners("elemhideupdate");
+ }
+ TimeLine.leave("ElemHide.apply() write callback done");
+ }.bind(this), "ElemHideWrite");
+
+ this._applying = true;
+
+ TimeLine.leave("ElemHide.apply() done", "ElemHideWrite");
+ },
+
+ _generateCSSContent: function()
+ {
+ // Grouping selectors by domains
+ TimeLine.log("start grouping selectors");
+ let domains = {__proto__: null};
+ let hasFilters = false;
+ for (let key in filterByKey)
+ {
+ let filter = filterByKey[key];
+ let domain = filter.selectorDomain || "";
+
+ let list;
+ if (domain in domains)
+ list = domains[domain];
+ else
+ {
+ list = {__proto__: null};
+ domains[domain] = list;
+ }
+ list[filter.selector] = key;
+ hasFilters = true;
+ }
+ TimeLine.log("done grouping selectors");
+
+ if (!hasFilters)
+ throw Cr.NS_ERROR_NOT_AVAILABLE;
+
+ function escapeChar(match)
+ {
+ return "\\" + match.charCodeAt(0).toString(16) + " ";
+ }
+
+ // Return CSS data
+ let cssTemplate = "-moz-binding: url(about:" + AboutHandler.aboutPrefix + "?%ID%#dummy) !important;";
+ for (let domain in domains)
+ {
+ let rules = [];
+ let list = domains[domain];
+
+ if (domain)
+ yield ('@-moz-document domain("' + domain.split(",").join('"),domain("') + '"){').replace(/[^\x01-\x7F]/g, escapeChar);
+ else
+ {
+ // Only allow unqualified rules on a few protocols to prevent them from blocking chrome
+ yield '@-moz-document url-prefix("http://"),url-prefix("https://"),'
+ + 'url-prefix("mailbox://"),url-prefix("imap://"),'
+ + 'url-prefix("news://"),url-prefix("snews://"){';
+ }
+
+ for (let selector in list)
+ yield selector.replace(/[^\x01-\x7F]/g, escapeChar) + "{" + cssTemplate.replace("%ID%", list[selector]) + "}";
+ yield '}';
+ }
+ },
+
+ /**
+ * Unapplies current stylesheet URL
+ */
+ unapply: function()
+ {
+ if (ElemHide.applied)
+ {
+ try
+ {
+ Utils.styleService.unregisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET);
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ }
+ ElemHide.applied = false;
+ }
+ },
+
+ /**
+ * Retrieves the currently applied stylesheet URL
+ * @type String
+ */
+ get styleURL()
+ {
+ return ElemHide.applied ? styleURL.spec : null;
+ },
+
+ /**
+ * Retrieves an element hiding filter by the corresponding protocol key
+ */
+ getFilterByKey: function(/**String*/ key) /**Filter*/
+ {
+ return (key in filterByKey ? filterByKey[key] : null);
+ },
+
+ /**
+ * Returns a list of all selectors active on a particular domain (currently
+ * used only in Chrome, Opera and Safari).
+ */
+ getSelectorsForDomain: function(/**String*/ domain, /**Boolean*/ specificOnly)
+ {
+ let result = [];
+ for (let key in filterByKey)
+ {
+ let filter = filterByKey[key];
+
+ // it is important to always access filter.domains
+ // here, even if it isn't used, in order to
+ // workaround WebKit bug 132872, also see #419
+ let domains = filter.domains;
+
+ if (specificOnly && (!domains || domains[""]))
+ continue;
+
+ if (filter.isActiveOnDomain(domain) && !this.getException(filter, domain))
+ result.push(filter.selector);
+ }
+ return result;
+ }
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/elemHideHitRegistration.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/elemHideHitRegistration.js
new file mode 100644
index 0000000..a05f6df
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/elemHideHitRegistration.js
@@ -0,0 +1,160 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Hit counts for element hiding.
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+let {Utils} = require("utils");
+
+/**
+ * about: URL module used to count hits.
+ * @class
+ */
+let AboutHandler = exports.AboutHandler =
+{
+ classID: Components.ID("{55fb7be0-1dd2-11b2-98e6-9e97caf8ba67}"),
+ classDescription: "Element hiding hit registration protocol handler",
+ aboutPrefix: "abp-elemhidehit",
+
+ /**
+ * Registers handler on startup.
+ */
+ init: function()
+ {
+ let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
+ registrar.registerFactory(this.classID, this.classDescription,
+ "@mozilla.org/network/protocol/about;1?what=" + this.aboutPrefix, this);
+ onShutdown.add(function()
+ {
+ registrar.unregisterFactory(this.classID, this);
+ }.bind(this));
+ },
+
+ //
+ // Factory implementation
+ //
+
+ createInstance: function(outer, iid)
+ {
+ if (outer != null)
+ throw Cr.NS_ERROR_NO_AGGREGATION;
+
+ return this.QueryInterface(iid);
+ },
+
+ //
+ // About module implementation
+ //
+
+ getURIFlags: function(uri)
+ {
+ return ("HIDE_FROM_ABOUTABOUT" in Ci.nsIAboutModule ? Ci.nsIAboutModule.HIDE_FROM_ABOUTABOUT : 0);
+ },
+
+ newChannel: function(uri)
+ {
+ let match = /\?(\d+)/.exec(uri.path)
+ if (!match)
+ throw Cr.NS_ERROR_FAILURE;
+
+ return new HitRegistrationChannel(uri, match[1]);
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIFactory, Ci.nsIAboutModule])
+};
+AboutHandler.init();
+
+/**
+ * Channel returning data for element hiding hits.
+ * @constructor
+ */
+function HitRegistrationChannel(uri, key)
+{
+ this.key = key;
+ this.URI = this.originalURI = uri;
+}
+HitRegistrationChannel.prototype = {
+ key: null,
+ URI: null,
+ originalURI: null,
+ contentCharset: "utf-8",
+ contentLength: 0,
+ contentType: "text/xml",
+ owner: Utils.systemPrincipal,
+ securityInfo: null,
+ notificationCallbacks: null,
+ loadFlags: 0,
+ loadGroup: null,
+ name: null,
+ status: Cr.NS_OK,
+
+ asyncOpen: function(listener, context)
+ {
+ let stream = this.open();
+ Utils.runAsync(function()
+ {
+ try {
+ listener.onStartRequest(this, context);
+ } catch(e) {}
+ try {
+ listener.onDataAvailable(this, context, stream, 0, stream.available());
+ } catch(e) {}
+ try {
+ listener.onStopRequest(this, context, Cr.NS_OK);
+ } catch(e) {}
+ }, this);
+ },
+
+ open: function()
+ {
+ let {Policy} = require("contentPolicy");
+ let {ElemHide} = require("elemHide");
+ let data = "<bindings xmlns='http://www.mozilla.org/xbl'><binding id='dummy'/></bindings>";
+ let filter = ElemHide.getFilterByKey(this.key);
+ if (filter)
+ {
+ let wnd = Utils.getRequestWindow(this);
+ if (wnd && wnd.document && !Policy.processNode(wnd, wnd.document, Policy.type.ELEMHIDE, filter))
+ data = "<bindings xmlns='http://www.mozilla.org/xbl'/>";
+ }
+
+ let stream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream);
+ stream.setData(data, data.length);
+ return stream;
+ },
+ isPending: function()
+ {
+ return false;
+ },
+ cancel: function()
+ {
+ throw Cr.NS_ERROR_NOT_IMPLEMENTED;
+ },
+ suspend: function()
+ {
+ throw Cr.NS_ERROR_NOT_IMPLEMENTED;
+ },
+ resume: function()
+ {
+ throw Cr.NS_ERROR_NOT_IMPLEMENTED;
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIChannel, Ci.nsIRequest])
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterClasses.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterClasses.js
new file mode 100644
index 0000000..cb3a5b1
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterClasses.js
@@ -0,0 +1,906 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Definition of Filter class and its subclasses.
+ */
+
+let {FilterNotifier} = require("filterNotifier");
+
+/**
+ * Abstract base class for filters
+ *
+ * @param {String} text string representation of the filter
+ * @constructor
+ */
+function Filter(text)
+{
+ this.text = text;
+ this.subscriptions = [];
+}
+exports.Filter = Filter;
+
+Filter.prototype =
+{
+ /**
+ * String representation of the filter
+ * @type String
+ */
+ text: null,
+
+ /**
+ * Filter subscriptions the filter belongs to
+ * @type Array of Subscription
+ */
+ subscriptions: null,
+
+ /**
+ * Serializes the filter to an array of strings for writing out on the disk.
+ * @param {Array of String} buffer buffer to push the serialization results into
+ */
+ serialize: function(buffer)
+ {
+ buffer.push("[Filter]");
+ buffer.push("text=" + this.text);
+ },
+
+ toString: function()
+ {
+ return this.text;
+ }
+};
+
+/**
+ * Cache for known filters, maps string representation to filter objects.
+ * @type Object
+ */
+Filter.knownFilters = {__proto__: null};
+
+/**
+ * Regular expression that element hiding filters should match
+ * @type RegExp
+ */
+Filter.elemhideRegExp = /^([^\/\*\|\@"!]*?)#(\@)?(?:([\w\-]+|\*)((?:\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\))*)|#([^{}]+))$/;
+/**
+ * Regular expression that RegExp filters specified as RegExps should match
+ * @type RegExp
+ */
+Filter.regexpRegExp = /^(@@)?\/.*\/(?:\$~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)?$/;
+/**
+ * Regular expression that options on a RegExp filter should match
+ * @type RegExp
+ */
+Filter.optionsRegExp = /\$(~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)$/;
+
+/**
+ * Creates a filter of correct type from its text representation - does the basic parsing and
+ * calls the right constructor then.
+ *
+ * @param {String} text as in Filter()
+ * @return {Filter}
+ */
+Filter.fromText = function(text)
+{
+ if (text in Filter.knownFilters)
+ return Filter.knownFilters[text];
+
+ let ret;
+ let match = (text.indexOf("#") >= 0 ? Filter.elemhideRegExp.exec(text) : null);
+ if (match)
+ ret = ElemHideBase.fromText(text, match[1], match[2], match[3], match[4], match[5]);
+ else if (text[0] == "!")
+ ret = new CommentFilter(text);
+ else
+ ret = RegExpFilter.fromText(text);
+
+ Filter.knownFilters[ret.text] = ret;
+ return ret;
+}
+
+/**
+ * Deserializes a filter
+ *
+ * @param {Object} obj map of serialized properties and their values
+ * @return {Filter} filter or null if the filter couldn't be created
+ */
+Filter.fromObject = function(obj)
+{
+ let ret = Filter.fromText(obj.text);
+ if (ret instanceof ActiveFilter)
+ {
+ if ("disabled" in obj)
+ ret._disabled = (obj.disabled == "true");
+ if ("hitCount" in obj)
+ ret._hitCount = parseInt(obj.hitCount) || 0;
+ if ("lastHit" in obj)
+ ret._lastHit = parseInt(obj.lastHit) || 0;
+ }
+ return ret;
+}
+
+/**
+ * Removes unnecessary whitespaces from filter text, will only return null if
+ * the input parameter is null.
+ */
+Filter.normalize = function(/**String*/ text) /**String*/
+{
+ if (!text)
+ return text;
+
+ // Remove line breaks and such
+ text = text.replace(/[^\S ]/g, "");
+
+ if (/^\s*!/.test(text))
+ {
+ // Don't remove spaces inside comments
+ return text.replace(/^\s+/, "").replace(/\s+$/, "");
+ }
+ else if (Filter.elemhideRegExp.test(text))
+ {
+ // Special treatment for element hiding filters, right side is allowed to contain spaces
+ let [, domain, separator, selector] = /^(.*?)(#\@?#?)(.*)$/.exec(text);
+ return domain.replace(/\s/g, "") + separator + selector.replace(/^\s+/, "").replace(/\s+$/, "");
+ }
+ else
+ return text.replace(/\s/g, "");
+}
+
+/**
+ * Class for invalid filters
+ * @param {String} text see Filter()
+ * @param {String} reason Reason why this filter is invalid
+ * @constructor
+ * @augments Filter
+ */
+function InvalidFilter(text, reason)
+{
+ Filter.call(this, text);
+
+ this.reason = reason;
+}
+exports.InvalidFilter = InvalidFilter;
+
+InvalidFilter.prototype =
+{
+ __proto__: Filter.prototype,
+
+ /**
+ * Reason why this filter is invalid
+ * @type String
+ */
+ reason: null,
+
+ /**
+ * See Filter.serialize()
+ */
+ serialize: function(buffer) {}
+};
+
+/**
+ * Class for comments
+ * @param {String} text see Filter()
+ * @constructor
+ * @augments Filter
+ */
+function CommentFilter(text)
+{
+ Filter.call(this, text);
+}
+exports.CommentFilter = CommentFilter;
+
+CommentFilter.prototype =
+{
+ __proto__: Filter.prototype,
+
+ /**
+ * See Filter.serialize()
+ */
+ serialize: function(buffer) {}
+};
+
+/**
+ * Abstract base class for filters that can get hits
+ * @param {String} text see Filter()
+ * @param {String} domains (optional) Domains that the filter is restricted to separated by domainSeparator e.g. "foo.com|bar.com|~baz.com"
+ * @constructor
+ * @augments Filter
+ */
+function ActiveFilter(text, domains)
+{
+ Filter.call(this, text);
+
+ this.domainSource = domains;
+}
+exports.ActiveFilter = ActiveFilter;
+
+ActiveFilter.prototype =
+{
+ __proto__: Filter.prototype,
+
+ _disabled: false,
+ _hitCount: 0,
+ _lastHit: 0,
+
+ /**
+ * Defines whether the filter is disabled
+ * @type Boolean
+ */
+ get disabled()
+ {
+ return this._disabled;
+ },
+ set disabled(value)
+ {
+ if (value != this._disabled)
+ {
+ let oldValue = this._disabled;
+ this._disabled = value;
+ FilterNotifier.triggerListeners("filter.disabled", this, value, oldValue);
+ }
+ return this._disabled;
+ },
+
+ /**
+ * Number of hits on the filter since the last reset
+ * @type Number
+ */
+ get hitCount()
+ {
+ return this._hitCount;
+ },
+ set hitCount(value)
+ {
+ if (value != this._hitCount)
+ {
+ let oldValue = this._hitCount;
+ this._hitCount = value;
+ FilterNotifier.triggerListeners("filter.hitCount", this, value, oldValue);
+ }
+ return this._hitCount;
+ },
+
+ /**
+ * Last time the filter had a hit (in milliseconds since the beginning of the epoch)
+ * @type Number
+ */
+ get lastHit()
+ {
+ return this._lastHit;
+ },
+ set lastHit(value)
+ {
+ if (value != this._lastHit)
+ {
+ let oldValue = this._lastHit;
+ this._lastHit = value;
+ FilterNotifier.triggerListeners("filter.lastHit", this, value, oldValue);
+ }
+ return this._lastHit;
+ },
+
+ /**
+ * String that the domains property should be generated from
+ * @type String
+ */
+ domainSource: null,
+
+ /**
+ * Separator character used in domainSource property, must be overridden by subclasses
+ * @type String
+ */
+ domainSeparator: null,
+
+ /**
+ * Determines whether the trailing dot in domain names isn't important and
+ * should be ignored, must be overridden by subclasses.
+ * @type Boolean
+ */
+ ignoreTrailingDot: true,
+
+ /**
+ * Determines whether domainSource is already upper-case,
+ * can be overridden by subclasses.
+ * @type Boolean
+ */
+ domainSourceIsUpperCase: false,
+
+ /**
+ * Map containing domains that this filter should match on/not match on or null if the filter should match on all domains
+ * @type Object
+ */
+ get domains()
+ {
+ let domains = null;
+
+ if (this.domainSource)
+ {
+ let source = this.domainSource;
+ if (!this.domainSourceIsUpperCase) {
+ // RegExpFilter already have uppercase domains
+ source = source.toUpperCase();
+ }
+ let list = source.split(this.domainSeparator);
+ if (list.length == 1 && list[0][0] != "~")
+ {
+ // Fast track for the common one-domain scenario
+ domains = {__proto__: null, "": false};
+ if (this.ignoreTrailingDot)
+ list[0] = list[0].replace(/\.+$/, "");
+ domains[list[0]] = true;
+ }
+ else
+ {
+ let hasIncludes = false;
+ for (let i = 0; i < list.length; i++)
+ {
+ let domain = list[i];
+ if (this.ignoreTrailingDot)
+ domain = domain.replace(/\.+$/, "");
+ if (domain == "")
+ continue;
+
+ let include;
+ if (domain[0] == "~")
+ {
+ include = false;
+ domain = domain.substr(1);
+ }
+ else
+ {
+ include = true;
+ hasIncludes = true;
+ }
+
+ if (!domains)
+ domains = {__proto__: null};
+
+ domains[domain] = include;
+ }
+ domains[""] = !hasIncludes;
+ }
+
+ this.domainSource = null;
+ }
+
+ Object.defineProperty(this, "domains", {value: domains, enumerable: true});
+ return this.domains;
+ },
+
+ /**
+ * Checks whether this filter is active on a domain.
+ */
+ isActiveOnDomain: function(/**String*/ docDomain) /**Boolean*/
+ {
+ // If no domains are set the rule matches everywhere
+ if (!this.domains)
+ return true;
+
+ // If the document has no host name, match only if the filter isn't restricted to specific domains
+ if (!docDomain)
+ return this.domains[""];
+
+ if (this.ignoreTrailingDot)
+ docDomain = docDomain.replace(/\.+$/, "");
+ docDomain = docDomain.toUpperCase();
+
+ while (true)
+ {
+ if (docDomain in this.domains)
+ return this.domains[docDomain];
+
+ let nextDot = docDomain.indexOf(".");
+ if (nextDot < 0)
+ break;
+ docDomain = docDomain.substr(nextDot + 1);
+ }
+ return this.domains[""];
+ },
+
+ /**
+ * Checks whether this filter is active only on a domain and its subdomains.
+ */
+ isActiveOnlyOnDomain: function(/**String*/ docDomain) /**Boolean*/
+ {
+ if (!docDomain || !this.domains || this.domains[""])
+ return false;
+
+ if (this.ignoreTrailingDot)
+ docDomain = docDomain.replace(/\.+$/, "");
+ docDomain = docDomain.toUpperCase();
+
+ for (let domain in this.domains)
+ if (this.domains[domain] && domain != docDomain && (domain.length <= docDomain.length || domain.indexOf("." + docDomain) != domain.length - docDomain.length - 1))
+ return false;
+
+ return true;
+ },
+
+ /**
+ * See Filter.serialize()
+ */
+ serialize: function(buffer)
+ {
+ if (this._disabled || this._hitCount || this._lastHit)
+ {
+ Filter.prototype.serialize.call(this, buffer);
+ if (this._disabled)
+ buffer.push("disabled=true");
+ if (this._hitCount)
+ buffer.push("hitCount=" + this._hitCount);
+ if (this._lastHit)
+ buffer.push("lastHit=" + this._lastHit);
+ }
+ }
+};
+
+/**
+ * Abstract base class for RegExp-based filters
+ * @param {String} text see Filter()
+ * @param {String} regexpSource filter part that the regular expression should be build from
+ * @param {Number} contentType (optional) Content types the filter applies to, combination of values from RegExpFilter.typeMap
+ * @param {Boolean} matchCase (optional) Defines whether the filter should distinguish between lower and upper case letters
+ * @param {String} domains (optional) Domains that the filter is restricted to, e.g. "foo.com|bar.com|~baz.com"
+ * @param {Boolean} thirdParty (optional) Defines whether the filter should apply to third-party or first-party content only
+ * @constructor
+ * @augments ActiveFilter
+ */
+function RegExpFilter(text, regexpSource, contentType, matchCase, domains, thirdParty)
+{
+ ActiveFilter.call(this, text, domains);
+
+ if (contentType != null)
+ this.contentType = contentType;
+ if (matchCase)
+ this.matchCase = matchCase;
+ if (thirdParty != null)
+ this.thirdParty = thirdParty;
+
+ if (regexpSource.length >= 2 && regexpSource[0] == "/" && regexpSource[regexpSource.length - 1] == "/")
+ {
+ // The filter is a regular expression - convert it immediately to catch syntax errors
+ let regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2), this.matchCase ? "" : "i");
+ this.__defineGetter__("regexp", () => regexp);
+ }
+ else
+ {
+ // No need to convert this filter to regular expression yet, do it on demand
+ this.regexpSource = regexpSource;
+ }
+}
+exports.RegExpFilter = RegExpFilter;
+
+RegExpFilter.prototype =
+{
+ __proto__: ActiveFilter.prototype,
+
+ /**
+ * @see ActiveFilter.domainSourceIsUpperCase
+ */
+ domainSourceIsUpperCase: true,
+
+ /**
+ * Number of filters contained, will always be 1 (required to optimize Matcher).
+ * @type Integer
+ */
+ length: 1,
+
+ /**
+ * @see ActiveFilter.domainSeparator
+ */
+ domainSeparator: "|",
+
+ /**
+ * Expression from which a regular expression should be generated - for delayed creation of the regexp property
+ * @type String
+ */
+ regexpSource: null,
+ /**
+ * Regular expression to be used when testing against this filter
+ * @type RegExp
+ */
+ get regexp()
+ {
+ // Remove multiple wildcards
+ let source = this.regexpSource
+ .replace(/\*+/g, "*") // remove multiple wildcards
+ .replace(/\^\|$/, "^") // remove anchors following separator placeholder
+ .replace(/\W/g, "\\$&") // escape special symbols
+ .replace(/\\\*/g, ".*") // replace wildcards by .*
+ // process separator placeholders (all ANSI characters but alphanumeric characters and _%.-)
+ .replace(/\\\^/g, "(?:[\\x00-\\x24\\x26-\\x2C\\x2F\\x3A-\\x40\\x5B-\\x5E\\x60\\x7B-\\x7F]|$)")
+ .replace(/^\\\|\\\|/, "^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?") // process extended anchor at expression start
+ .replace(/^\\\|/, "^") // process anchor at expression start
+ .replace(/\\\|$/, "$") // process anchor at expression end
+ .replace(/^(\.\*)/, "") // remove leading wildcards
+ .replace(/(\.\*)$/, ""); // remove trailing wildcards
+
+ let regexp = new RegExp(source, this.matchCase ? "" : "i");
+
+ delete this.regexpSource;
+ this.__defineGetter__("regexp", () => regexp);
+ return this.regexp;
+ },
+ /**
+ * Content types the filter applies to, combination of values from RegExpFilter.typeMap
+ * @type Number
+ */
+ contentType: 0x7FFFFFFF,
+ /**
+ * Defines whether the filter should distinguish between lower and upper case letters
+ * @type Boolean
+ */
+ matchCase: false,
+ /**
+ * Defines whether the filter should apply to third-party or first-party content only. Can be null (apply to all content).
+ * @type Boolean
+ */
+ thirdParty: null,
+
+ /**
+ * Tests whether the URL matches this filter
+ * @param {String} location URL to be tested
+ * @param {String} contentType content type identifier of the URL
+ * @param {String} docDomain domain name of the document that loads the URL
+ * @param {Boolean} thirdParty should be true if the URL is a third-party request
+ * @return {Boolean} true in case of a match
+ */
+ matches: function(location, contentType, docDomain, thirdParty, privatenode)
+ {
+
+ if(this.subscriptions[0])
+ if (this.subscriptions[0].privateMode)
+ if (privatenode==false)
+ return false;
+
+ if (this.regexp.test(location) &&
+ (RegExpFilter.typeMap[contentType] & this.contentType) != 0 &&
+ (this.thirdParty == null || this.thirdParty == thirdParty) &&
+ this.isActiveOnDomain(docDomain))
+ {
+ return true;
+ }
+
+ return false;
+ }
+};
+
+RegExpFilter.prototype.__defineGetter__("0", function()
+{
+ return this;
+});
+
+/**
+ * Creates a RegExp filter from its text representation
+ * @param {String} text same as in Filter()
+ */
+RegExpFilter.fromText = function(text)
+{
+ let blocking = true;
+ let origText = text;
+ if (text.indexOf("@@") == 0)
+ {
+ blocking = false;
+ text = text.substr(2);
+ }
+
+ let contentType = null;
+ let matchCase = null;
+ let domains = null;
+ let siteKeys = null;
+ let thirdParty = null;
+ let collapse = null;
+ let options;
+ let match = (text.indexOf("$") >= 0 ? Filter.optionsRegExp.exec(text) : null);
+ if (match)
+ {
+ options = match[1].toUpperCase().split(",");
+ text = match.input.substr(0, match.index);
+ for (let option of options)
+ {
+ let value = null;
+ let separatorIndex = option.indexOf("=");
+ if (separatorIndex >= 0)
+ {
+ value = option.substr(separatorIndex + 1);
+ option = option.substr(0, separatorIndex);
+ }
+ option = option.replace(/-/, "_");
+ if (option in RegExpFilter.typeMap)
+ {
+ if (contentType == null)
+ contentType = 0;
+ contentType |= RegExpFilter.typeMap[option];
+ }
+ else if (option[0] == "~" && option.substr(1) in RegExpFilter.typeMap)
+ {
+ if (contentType == null)
+ contentType = RegExpFilter.prototype.contentType;
+ contentType &= ~RegExpFilter.typeMap[option.substr(1)];
+ }
+ else if (option == "MATCH_CASE")
+ matchCase = true;
+ else if (option == "~MATCH_CASE")
+ matchCase = false;
+ else if (option == "DOMAIN" && typeof value != "undefined")
+ domains = value;
+ else if (option == "THIRD_PARTY")
+ thirdParty = true;
+ else if (option == "~THIRD_PARTY")
+ thirdParty = false;
+ else if (option == "COLLAPSE")
+ collapse = true;
+ else if (option == "~COLLAPSE")
+ collapse = false;
+ else if (option == "SITEKEY" && typeof value != "undefined")
+ siteKeys = value.split(/\|/);
+ else
+ return new InvalidFilter(origText, "Unknown option " + option.toLowerCase());
+ }
+ }
+
+ if (!blocking && (contentType == null || (contentType & RegExpFilter.typeMap.DOCUMENT)) &&
+ (!options || options.indexOf("DOCUMENT") < 0) && !/^\|?[\w\-]+:/.test(text))
+ {
+ // Exception filters shouldn't apply to pages by default unless they start with a protocol name
+ if (contentType == null)
+ contentType = RegExpFilter.prototype.contentType;
+ contentType &= ~RegExpFilter.typeMap.DOCUMENT;
+ }
+ if (!blocking && siteKeys)
+ contentType = RegExpFilter.typeMap.DOCUMENT;
+
+ try
+ {
+ if (blocking)
+ return new BlockingFilter(origText, text, contentType, matchCase, domains, thirdParty, collapse);
+ else
+ return new WhitelistFilter(origText, text, contentType, matchCase, domains, thirdParty, siteKeys);
+ }
+ catch (e)
+ {
+ return new InvalidFilter(origText, e);
+ }
+}
+
+/**
+ * Maps type strings like "SCRIPT" or "OBJECT" to bit masks
+ */
+RegExpFilter.typeMap = {
+ OTHER: 1,
+ SCRIPT: 2,
+ IMAGE: 4,
+ STYLESHEET: 8,
+ OBJECT: 16,
+ SUBDOCUMENT: 32,
+ DOCUMENT: 64,
+ XBL: 1,
+ PING: 1,
+ XMLHTTPREQUEST: 2048,
+ OBJECT_SUBREQUEST: 4096,
+ DTD: 1,
+ MEDIA: 16384,
+ FONT: 32768,
+
+ BACKGROUND: 4, // Backwards compat, same as IMAGE
+
+ POPUP: 0x10000000,
+ ELEMHIDE: 0x40000000
+};
+
+// ELEMHIDE, POPUP option shouldn't be there by default
+RegExpFilter.prototype.contentType &= ~(RegExpFilter.typeMap.ELEMHIDE | RegExpFilter.typeMap.POPUP);
+
+/**
+ * Class for blocking filters
+ * @param {String} text see Filter()
+ * @param {String} regexpSource see RegExpFilter()
+ * @param {Number} contentType see RegExpFilter()
+ * @param {Boolean} matchCase see RegExpFilter()
+ * @param {String} domains see RegExpFilter()
+ * @param {Boolean} thirdParty see RegExpFilter()
+ * @param {Boolean} collapse defines whether the filter should collapse blocked content, can be null
+ * @constructor
+ * @augments RegExpFilter
+ */
+function BlockingFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, collapse)
+{
+ RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty);
+
+ this.collapse = collapse;
+}
+exports.BlockingFilter = BlockingFilter;
+
+BlockingFilter.prototype =
+{
+ __proto__: RegExpFilter.prototype,
+
+ /**
+ * Defines whether the filter should collapse blocked content. Can be null (use the global preference).
+ * @type Boolean
+ */
+ collapse: null
+};
+
+/**
+ * Class for whitelist filters
+ * @param {String} text see Filter()
+ * @param {String} regexpSource see RegExpFilter()
+ * @param {Number} contentType see RegExpFilter()
+ * @param {Boolean} matchCase see RegExpFilter()
+ * @param {String} domains see RegExpFilter()
+ * @param {Boolean} thirdParty see RegExpFilter()
+ * @param {String[]} siteKeys public keys of websites that this filter should apply to
+ * @constructor
+ * @augments RegExpFilter
+ */
+function WhitelistFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, siteKeys)
+{
+ RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty);
+
+ if (siteKeys != null)
+ this.siteKeys = siteKeys;
+}
+exports.WhitelistFilter = WhitelistFilter;
+
+WhitelistFilter.prototype =
+{
+ __proto__: RegExpFilter.prototype,
+
+ /**
+ * List of public keys of websites that this filter should apply to
+ * @type String[]
+ */
+ siteKeys: null
+}
+
+/**
+ * Base class for element hiding filters
+ * @param {String} text see Filter()
+ * @param {String} domains (optional) Host names or domains the filter should be restricted to
+ * @param {String} selector CSS selector for the HTML elements that should be hidden
+ * @constructor
+ * @augments ActiveFilter
+ */
+function ElemHideBase(text, domains, selector)
+{
+ ActiveFilter.call(this, text, domains || null);
+
+ if (domains)
+ this.selectorDomain = domains.replace(/,~[^,]+/g, "").replace(/^~[^,]+,?/, "").toLowerCase();
+ this.selector = selector;
+}
+exports.ElemHideBase = ElemHideBase;
+
+ElemHideBase.prototype =
+{
+ __proto__: ActiveFilter.prototype,
+
+ /**
+ * @see ActiveFilter.domainSeparator
+ */
+ domainSeparator: ",",
+
+ /**
+ * @see ActiveFilter.ignoreTrailingDot
+ */
+ ignoreTrailingDot: false,
+
+ /**
+ * Host name or domain the filter should be restricted to (can be null for no restriction)
+ * @type String
+ */
+ selectorDomain: null,
+ /**
+ * CSS selector for the HTML elements that should be hidden
+ * @type String
+ */
+ selector: null
+};
+
+/**
+ * Creates an element hiding filter from a pre-parsed text representation
+ *
+ * @param {String} text same as in Filter()
+ * @param {String} domain domain part of the text representation (can be empty)
+ * @param {String} tagName tag name part (can be empty)
+ * @param {String} attrRules attribute matching rules (can be empty)
+ * @param {String} selector raw CSS selector (can be empty)
+ * @return {ElemHideFilter|ElemHideException|InvalidFilter}
+ */
+ElemHideBase.fromText = function(text, domain, isException, tagName, attrRules, selector)
+{
+ if (!selector)
+ {
+ if (tagName == "*")
+ tagName = "";
+
+ let id = null;
+ let additional = "";
+ if (attrRules) {
+ attrRules = attrRules.match(/\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\)/g);
+ for (let rule of attrRules) {
+ rule = rule.substr(1, rule.length - 2);
+ let separatorPos = rule.indexOf("=");
+ if (separatorPos > 0) {
+ rule = rule.replace(/=/, '="') + '"';
+ additional += "[" + rule + "]";
+ }
+ else {
+ if (id)
+ {
+ let {Utils} = require("utils");
+ return new InvalidFilter(text, Utils.getString("filter_elemhide_duplicate_id"));
+ }
+ else
+ id = rule;
+ }
+ }
+ }
+
+ if (id)
+ selector = tagName + "." + id + additional + "," + tagName + "#" + id + additional;
+ else if (tagName || additional)
+ selector = tagName + additional;
+ else
+ {
+ let {Utils} = require("utils");
+ return new InvalidFilter(text, Utils.getString("filter_elemhide_nocriteria"));
+ }
+ }
+ if (isException)
+ return new ElemHideException(text, domain, selector);
+ else
+ return new ElemHideFilter(text, domain, selector);
+}
+
+/**
+ * Class for element hiding filters
+ * @param {String} text see Filter()
+ * @param {String} domains see ElemHideBase()
+ * @param {String} selector see ElemHideBase()
+ * @constructor
+ * @augments ElemHideBase
+ */
+function ElemHideFilter(text, domains, selector)
+{
+ ElemHideBase.call(this, text, domains, selector);
+}
+exports.ElemHideFilter = ElemHideFilter;
+
+ElemHideFilter.prototype =
+{
+ __proto__: ElemHideBase.prototype
+};
+
+/**
+ * Class for element hiding exceptions
+ * @param {String} text see Filter()
+ * @param {String} domains see ElemHideBase()
+ * @param {String} selector see ElemHideBase()
+ * @constructor
+ * @augments ElemHideBase
+ */
+function ElemHideException(text, domains, selector)
+{
+ ElemHideBase.call(this, text, domains, selector);
+}
+exports.ElemHideException = ElemHideException;
+
+ElemHideException.prototype =
+{
+ __proto__: ElemHideBase.prototype
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterListener.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterListener.js
new file mode 100644
index 0000000..1687a26
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterListener.js
@@ -0,0 +1,282 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Component synchronizing filter storage with Matcher instances and ElemHide.
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {TimeLine} = require("timeline");
+let {FilterStorage} = require("filterStorage");
+let {FilterNotifier} = require("filterNotifier");
+let {ElemHide} = require("elemHide");
+let {defaultMatcher} = require("matcher");
+let {ActiveFilter, RegExpFilter, ElemHideBase} = require("filterClasses");
+let {Prefs} = require("prefs");
+
+/**
+ * Value of the FilterListener.batchMode property.
+ * @type Boolean
+ */
+let batchMode = false;
+
+/**
+ * Increases on filter changes, filters will be saved if it exceeds 1.
+ * @type Integer
+ */
+let isDirty = 0;
+
+/**
+ * This object can be used to change properties of the filter change listeners.
+ * @class
+ */
+let FilterListener =
+{
+ /**
+ * Set to true when executing many changes, changes will only be fully applied after this variable is set to false again.
+ * @type Boolean
+ */
+ get batchMode()
+ {
+ return batchMode;
+ },
+ set batchMode(value)
+ {
+ batchMode = value;
+ flushElemHide();
+ },
+
+ /**
+ * Increases "dirty factor" of the filters and calls FilterStorage.saveToDisk()
+ * if it becomes 1 or more. Save is executed delayed to prevent multiple
+ * subsequent calls. If the parameter is 0 it forces saving filters if any
+ * changes were recorded after the previous save.
+ */
+ setDirty: function(/**Integer*/ factor)
+ {
+ if (factor == 0 && isDirty > 0)
+ isDirty = 1;
+ else
+ isDirty += factor;
+ if (isDirty >= 1)
+ FilterStorage.saveToDisk();
+ }
+};
+
+/**
+ * Observer listening to history purge actions.
+ * @class
+ */
+let HistoryPurgeObserver =
+{
+ observe: function(subject, topic, data)
+ {
+ if (topic == "browser:purge-session-history" && Prefs.clearStatsOnHistoryPurge)
+ {
+ FilterStorage.resetHitCounts();
+ FilterListener.setDirty(0); // Force saving to disk
+
+ Prefs.recentReports = [];
+ }
+ },
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver])
+};
+
+/**
+ * Initializes filter listener on startup, registers the necessary hooks.
+ */
+function init()
+{
+ TimeLine.enter("Entered filter listener initialization()");
+
+ FilterNotifier.addListener(function(action, item, newValue, oldValue)
+ {
+ let match = /^(\w+)\.(.*)/.exec(action);
+ if (match && match[1] == "filter")
+ onFilterChange(match[2], item, newValue, oldValue);
+ else if (match && match[1] == "subscription")
+ onSubscriptionChange(match[2], item, newValue, oldValue);
+ else
+ onGenericChange(action, item);
+ });
+
+ if ("nsIStyleSheetService" in Ci)
+ ElemHide.init();
+ else
+ flushElemHide = function() {}; // No global stylesheet in Chrome & Co.
+ FilterStorage.loadFromDisk();
+
+ TimeLine.log("done initializing data structures");
+
+ Services.obs.addObserver(HistoryPurgeObserver, "browser:purge-session-history", true);
+ onShutdown.add(function()
+ {
+ Services.obs.removeObserver(HistoryPurgeObserver, "browser:purge-session-history");
+ });
+ TimeLine.log("done adding observers");
+
+ TimeLine.leave("Filter listener initialization done");
+}
+init();
+
+/**
+ * Calls ElemHide.apply() if necessary.
+ */
+function flushElemHide()
+{
+ if (!batchMode && ElemHide.isDirty)
+ ElemHide.apply();
+}
+
+/**
+ * Notifies Matcher instances or ElemHide object about a new filter
+ * if necessary.
+ * @param {Filter} filter filter that has been added
+ */
+function addFilter(filter)
+{
+ if (!(filter instanceof ActiveFilter) || filter.disabled)
+ return;
+
+ let hasEnabled = false;
+ for (let i = 0; i < filter.subscriptions.length; i++)
+ if (!filter.subscriptions[i].disabled)
+ hasEnabled = true;
+ if (!hasEnabled)
+ return;
+
+ if (filter instanceof RegExpFilter)
+ defaultMatcher.add(filter);
+ else if (filter instanceof ElemHideBase)
+ ElemHide.add(filter);
+}
+
+/**
+ * Notifies Matcher instances or ElemHide object about removal of a filter
+ * if necessary.
+ * @param {Filter} filter filter that has been removed
+ */
+function removeFilter(filter)
+{
+ if (!(filter instanceof ActiveFilter))
+ return;
+
+ if (!filter.disabled)
+ {
+ let hasEnabled = false;
+ for (let i = 0; i < filter.subscriptions.length; i++)
+ if (!filter.subscriptions[i].disabled)
+ hasEnabled = true;
+ if (hasEnabled)
+ return;
+ }
+
+ if (filter instanceof RegExpFilter)
+ defaultMatcher.remove(filter);
+ else if (filter instanceof ElemHideBase)
+ ElemHide.remove(filter);
+}
+
+/**
+ * Subscription change listener
+ */
+function onSubscriptionChange(action, subscription, newValue, oldValue)
+{
+ FilterListener.setDirty(1);
+
+ if (action != "added" && action != "removed" && action != "disabled" && action != "updated")
+ return;
+
+ if (action != "removed" && !(subscription.url in FilterStorage.knownSubscriptions))
+ {
+ // Ignore updates for subscriptions not in the list
+ return;
+ }
+
+ if ((action == "added" || action == "removed" || action == "updated") && subscription.disabled)
+ {
+ // Ignore adding/removing/updating of disabled subscriptions
+ return;
+ }
+
+ if (action == "added" || action == "removed" || action == "disabled")
+ {
+ let method = (action == "added" || (action == "disabled" && newValue == false) ? addFilter : removeFilter);
+ if (subscription.filters)
+ subscription.filters.forEach(method);
+ }
+ else if (action == "updated")
+ {
+ subscription.oldFilters.forEach(removeFilter);
+ subscription.filters.forEach(addFilter);
+ }
+
+ flushElemHide();
+}
+
+/**
+ * Filter change listener
+ */
+function onFilterChange(action, filter, newValue, oldValue)
+{
+ if (action == "hitCount" && newValue == 0)
+ {
+ // Filter hits are being reset, make sure these changes are saved.
+ FilterListener.setDirty(0);
+ }
+ else if (action == "hitCount" || action == "lastHit")
+ FilterListener.setDirty(0.002);
+ else
+ FilterListener.setDirty(1);
+
+ if (action != "added" && action != "removed" && action != "disabled")
+ return;
+
+ if ((action == "added" || action == "removed") && filter.disabled)
+ {
+ // Ignore adding/removing of disabled filters
+ return;
+ }
+
+ if (action == "added" || (action == "disabled" && newValue == false))
+ addFilter(filter);
+ else
+ removeFilter(filter);
+ flushElemHide();
+}
+
+/**
+ * Generic notification listener
+ */
+function onGenericChange(action)
+{
+ if (action == "load")
+ {
+ isDirty = 0;
+
+ defaultMatcher.clear();
+ ElemHide.clear();
+ for (let subscription of FilterStorage.subscriptions)
+ if (!subscription.disabled)
+ subscription.filters.forEach(addFilter);
+ flushElemHide();
+ }
+ else if (action == "save")
+ isDirty = 0;
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterNotifier.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterNotifier.js
new file mode 100644
index 0000000..010081e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterNotifier.js
@@ -0,0 +1,73 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview This component manages listeners and calls them to distributes
+ * messages about filter changes.
+ */
+
+/**
+ * List of registered listeners
+ * @type Array of function(action, item, newValue, oldValue)
+ */
+let listeners = [];
+
+/**
+ * This class allows registering and triggering listeners for filter events.
+ * @class
+ */
+let FilterNotifier = exports.FilterNotifier =
+{
+ /**
+ * Adds a listener
+ */
+ addListener: function(/**function(action, item, newValue, oldValue)*/ listener)
+ {
+ if (listeners.indexOf(listener) >= 0)
+ return;
+
+ listeners.push(listener);
+ },
+
+ /**
+ * Removes a listener that was previosly added via addListener
+ */
+ removeListener: function(/**function(action, item, newValue, oldValue)*/ listener)
+ {
+ let index = listeners.indexOf(listener);
+ if (index >= 0)
+ listeners.splice(index, 1);
+ },
+
+ /**
+ * Notifies listeners about an event
+ * @param {String} action event code ("load", "save", "elemhideupdate",
+ * "subscription.added", "subscription.removed",
+ * "subscription.disabled", "subscription.title",
+ * "subscription.lastDownload", "subscription.downloadStatus",
+ * "subscription.homepage", "subscription.updated",
+ * "filter.added", "filter.removed", "filter.moved",
+ * "filter.disabled", "filter.hitCount", "filter.lastHit")
+ * @param {Subscription|Filter} item item that the change applies to
+ */
+ triggerListeners: function(action, item, param1, param2, param3)
+ {
+ let list = listeners.slice();
+ for (let listener of list)
+ listener(action, item, param1, param2, param3);
+ }
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterStorage.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterStorage.js
new file mode 100644
index 0000000..546f788
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterStorage.js
@@ -0,0 +1,897 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview FilterStorage class responsible for managing user's subscriptions and filters.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/FileUtils.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+let {IO} = require("io");
+let {Prefs} = require("prefs");
+let {Filter, ActiveFilter} = require("filterClasses");
+let {Subscription, SpecialSubscription, ExternalSubscription} = require("subscriptionClasses");
+let {FilterNotifier} = require("filterNotifier");
+let {Utils} = require("utils");
+let {TimeLine} = require("timeline");
+
+/**
+ * Version number of the filter storage file format.
+ * @type Integer
+ */
+let formatVersion = 4;
+
+/**
+ * This class reads user's filters from disk, manages them in memory and writes them back.
+ * @class
+ */
+let FilterStorage = exports.FilterStorage =
+{
+ /**
+ * Version number of the patterns.ini format used.
+ * @type Integer
+ */
+ get formatVersion()
+ {
+ return formatVersion;
+ },
+
+ /**
+ * File that the filter list has been loaded from and should be saved to
+ * @type nsIFile
+ */
+ get sourceFile()
+ {
+ let file = null;
+ if (Prefs.patternsfile)
+ {
+ // Override in place, use it instead of placing the file in the regular data dir
+ file = IO.resolveFilePath(Prefs.patternsfile);
+ }
+ if (!file)
+ {
+ // Place the file in the data dir
+ file = IO.resolveFilePath(Prefs.data_directory);
+ if (file)
+ file.append("patterns.ini");
+ }
+ if (!file)
+ {
+ // Data directory pref misconfigured? Try the default value
+ try
+ {
+ file = IO.resolveFilePath(Services.prefs.getDefaultBranch("extensions.adblockplus.").getCharPref("data_directory"));
+ if (file)
+ file.append("patterns.ini");
+ } catch(e) {}
+ }
+
+ if (!file)
+ Cu.reportError("Adblock Plus: Failed to resolve filter file location from extensions.adblockplus.patternsfile preference");
+
+ this.__defineGetter__("sourceFile", () => file);
+ return this.sourceFile;
+ },
+
+ /**
+ * Will be set to true if no patterns.ini file exists.
+ * @type Boolean
+ */
+ firstRun: false,
+
+ /**
+ * Map of properties listed in the filter storage file before the sections
+ * start. Right now this should be only the format version.
+ */
+ fileProperties: {__proto__: null},
+
+ /**
+ * List of filter subscriptions containing all filters
+ * @type Array of Subscription
+ */
+ subscriptions: [],
+
+ /**
+ * Map of subscriptions already on the list, by their URL/identifier
+ * @type Object
+ */
+ knownSubscriptions: {__proto__: null},
+
+ /**
+ * Finds the filter group that a filter should be added to by default. Will
+ * return null if this group doesn't exist yet.
+ */
+ getGroupForFilter: function(/**Filter*/ filter) /**SpecialSubscription*/
+ {
+ let generalSubscription = null;
+ for (let subscription of FilterStorage.subscriptions)
+ {
+ if (subscription instanceof SpecialSubscription && !subscription.disabled)
+ {
+ // Always prefer specialized subscriptions
+ if (subscription.isDefaultFor(filter))
+ return subscription;
+
+ // If this is a general subscription - store it as fallback
+ if (!generalSubscription && (!subscription.defaults || !subscription.defaults.length))
+ generalSubscription = subscription;
+ }
+ }
+ return generalSubscription;
+ },
+
+ /**
+ * Adds a filter subscription to the list
+ * @param {Subscription} subscription filter subscription to be added
+ * @param {Boolean} silent if true, no listeners will be triggered (to be used when filter list is reloaded)
+ */
+ addSubscription: function(subscription, silent)
+ {
+ if (subscription.url in FilterStorage.knownSubscriptions)
+ return;
+
+ FilterStorage.subscriptions.push(subscription);
+ FilterStorage.knownSubscriptions[subscription.url] = subscription;
+ addSubscriptionFilters(subscription);
+
+ if (!silent)
+ FilterNotifier.triggerListeners("subscription.added", subscription);
+ },
+
+ /**
+ * Removes a filter subscription from the list
+ * @param {Subscription} subscription filter subscription to be removed
+ * @param {Boolean} silent if true, no listeners will be triggered (to be used when filter list is reloaded)
+ */
+ removeSubscription: function(subscription, silent)
+ {
+ for (let i = 0; i < FilterStorage.subscriptions.length; i++)
+ {
+ if (FilterStorage.subscriptions[i].url == subscription.url)
+ {
+ removeSubscriptionFilters(subscription);
+
+ FilterStorage.subscriptions.splice(i--, 1);
+ delete FilterStorage.knownSubscriptions[subscription.url];
+ if (!silent)
+ FilterNotifier.triggerListeners("subscription.removed", subscription);
+ return;
+ }
+ }
+ },
+
+ /**
+ * Moves a subscription in the list to a new position.
+ * @param {Subscription} subscription filter subscription to be moved
+ * @param {Subscription} [insertBefore] filter subscription to insert before
+ * (if omitted the subscription will be put at the end of the list)
+ */
+ moveSubscription: function(subscription, insertBefore)
+ {
+ let currentPos = FilterStorage.subscriptions.indexOf(subscription);
+ if (currentPos < 0)
+ return;
+
+ let newPos = insertBefore ? FilterStorage.subscriptions.indexOf(insertBefore) : -1;
+ if (newPos < 0)
+ newPos = FilterStorage.subscriptions.length;
+
+ if (currentPos < newPos)
+ newPos--;
+ if (currentPos == newPos)
+ return;
+
+ FilterStorage.subscriptions.splice(currentPos, 1);
+ FilterStorage.subscriptions.splice(newPos, 0, subscription);
+ FilterNotifier.triggerListeners("subscription.moved", subscription);
+ },
+
+ /**
+ * Replaces the list of filters in a subscription by a new list
+ * @param {Subscription} subscription filter subscription to be updated
+ * @param {Array of Filter} filters new filter lsit
+ */
+ updateSubscriptionFilters: function(subscription, filters)
+ {
+ removeSubscriptionFilters(subscription);
+ subscription.oldFilters = subscription.filters;
+ subscription.filters = filters;
+ addSubscriptionFilters(subscription);
+ FilterNotifier.triggerListeners("subscription.updated", subscription);
+ delete subscription.oldFilters;
+ },
+
+ /**
+ * Adds a user-defined filter to the list
+ * @param {Filter} filter
+ * @param {SpecialSubscription} [subscription] particular group that the filter should be added to
+ * @param {Integer} [position] position within the subscription at which the filter should be added
+ * @param {Boolean} silent if true, no listeners will be triggered (to be used when filter list is reloaded)
+ */
+ addFilter: function(filter, subscription, position, silent)
+ {
+ if (!subscription)
+ {
+ if (filter.subscriptions.some(s => s instanceof SpecialSubscription && !s.disabled))
+ return; // No need to add
+ subscription = FilterStorage.getGroupForFilter(filter);
+ }
+ if (!subscription)
+ {
+ // No group for this filter exists, create one
+ subscription = SpecialSubscription.createForFilter(filter);
+ this.addSubscription(subscription);
+ return;
+ }
+
+ if (typeof position == "undefined")
+ position = subscription.filters.length;
+
+ if (filter.subscriptions.indexOf(subscription) < 0)
+ filter.subscriptions.push(subscription);
+ subscription.filters.splice(position, 0, filter);
+ if (!silent)
+ FilterNotifier.triggerListeners("filter.added", filter, subscription, position);
+ },
+
+ /**
+ * Removes a user-defined filter from the list
+ * @param {Filter} filter
+ * @param {SpecialSubscription} [subscription] a particular filter group that
+ * the filter should be removed from (if ommited will be removed from all subscriptions)
+ * @param {Integer} [position] position inside the filter group at which the
+ * filter should be removed (if ommited all instances will be removed)
+ */
+ removeFilter: function(filter, subscription, position)
+ {
+ let subscriptions = (subscription ? [subscription] : filter.subscriptions.slice());
+ for (let i = 0; i < subscriptions.length; i++)
+ {
+ let subscription = subscriptions[i];
+ if (subscription instanceof SpecialSubscription)
+ {
+ let positions = [];
+ if (typeof position == "undefined")
+ {
+ let index = -1;
+ do
+ {
+ index = subscription.filters.indexOf(filter, index + 1);
+ if (index >= 0)
+ positions.push(index);
+ } while (index >= 0);
+ }
+ else
+ positions.push(position);
+
+ for (let j = positions.length - 1; j >= 0; j--)
+ {
+ let position = positions[j];
+ if (subscription.filters[position] == filter)
+ {
+ subscription.filters.splice(position, 1);
+ if (subscription.filters.indexOf(filter) < 0)
+ {
+ let index = filter.subscriptions.indexOf(subscription);
+ if (index >= 0)
+ filter.subscriptions.splice(index, 1);
+ }
+ FilterNotifier.triggerListeners("filter.removed", filter, subscription, position);
+ }
+ }
+ }
+ }
+ },
+
+ /**
+ * Moves a user-defined filter to a new position
+ * @param {Filter} filter
+ * @param {SpecialSubscription} subscription filter group where the filter is located
+ * @param {Integer} oldPosition current position of the filter
+ * @param {Integer} newPosition new position of the filter
+ */
+ moveFilter: function(filter, subscription, oldPosition, newPosition)
+ {
+ if (!(subscription instanceof SpecialSubscription) || subscription.filters[oldPosition] != filter)
+ return;
+
+ newPosition = Math.min(Math.max(newPosition, 0), subscription.filters.length - 1);
+ if (oldPosition == newPosition)
+ return;
+
+ subscription.filters.splice(oldPosition, 1);
+ subscription.filters.splice(newPosition, 0, filter);
+ FilterNotifier.triggerListeners("filter.moved", filter, subscription, oldPosition, newPosition);
+ },
+
+ /**
+ * Increases the hit count for a filter by one
+ * @param {Filter} filter
+ * @param {Window} window Window that the match originated in (required
+ * to recognize private browsing mode)
+ */
+ increaseHitCount: function(filter, wnd)
+ {
+ if (!Prefs.savestats || PrivateBrowsing.enabledForWindow(wnd) ||
+ PrivateBrowsing.enabled || !(filter instanceof ActiveFilter))
+ {
+ return;
+ }
+
+ filter.hitCount++;
+ filter.lastHit = Date.now();
+ },
+
+ /**
+ * Resets hit count for some filters
+ * @param {Array of Filter} filters filters to be reset, if null all filters will be reset
+ */
+ resetHitCounts: function(filters)
+ {
+ if (!filters)
+ {
+ filters = [];
+ for (let text in Filter.knownFilters)
+ filters.push(Filter.knownFilters[text]);
+ }
+ for (let filter of filters)
+ {
+ filter.hitCount = 0;
+ filter.lastHit = 0;
+ }
+ },
+
+ _loading: false,
+
+ /**
+ * Loads all subscriptions from the disk
+ * @param {nsIFile} [sourceFile] File to read from
+ */
+ loadFromDisk: function(sourceFile)
+ {
+ if (this._loading)
+ return;
+
+ TimeLine.enter("Entered FilterStorage.loadFromDisk()");
+ this._loading = true;
+
+ let readFile = function(sourceFile, backupIndex)
+ {
+ TimeLine.enter("FilterStorage.loadFromDisk() -> readFile()");
+
+ let parser = new INIParser();
+ IO.readFromFile(sourceFile, parser, function(e)
+ {
+ TimeLine.enter("FilterStorage.loadFromDisk() read callback");
+ if (!e && parser.subscriptions.length == 0)
+ {
+ // No filter subscriptions in the file, this isn't right.
+ e = new Error("No data in the file");
+ }
+
+ if (e)
+ Cu.reportError(e);
+
+ if (e && !explicitFile)
+ {
+ // Attempt to load a backup
+ sourceFile = this.sourceFile;
+ if (sourceFile)
+ {
+ let [, part1, part2] = /^(.*)(\.\w+)$/.exec(sourceFile.leafName) || [null, sourceFile.leafName, ""];
+
+ sourceFile = sourceFile.clone();
+ sourceFile.leafName = part1 + "-backup" + (++backupIndex) + part2;
+
+ IO.statFile(sourceFile, function(e, statData)
+ {
+ if (!e && statData.exists)
+ readFile(sourceFile, backupIndex);
+ else
+ doneReading(parser);
+ });
+ TimeLine.leave("FilterStorage.loadFromDisk() read callback done");
+ return;
+ }
+ }
+ doneReading(parser);
+ }.bind(this), "FilterStorageRead");
+
+ TimeLine.leave("FilterStorage.loadFromDisk() <- readFile()", "FilterStorageRead");
+ }.bind(this);
+
+ var doneReading = function(parser)
+ {
+ // Old special groups might have been converted, remove them if they are empty
+ let specialMap = {"~il~": true, "~wl~": true, "~fl~": true, "~eh~": true};
+ let knownSubscriptions = {__proto__: null};
+ for (let i = 0; i < parser.subscriptions.length; i++)
+ {
+ let subscription = parser.subscriptions[i];
+ if (subscription instanceof SpecialSubscription && subscription.filters.length == 0 && subscription.url in specialMap)
+ parser.subscriptions.splice(i--, 1);
+ else
+ knownSubscriptions[subscription.url] = subscription;
+ }
+
+ this.fileProperties = parser.fileProperties;
+ this.subscriptions = parser.subscriptions;
+ this.knownSubscriptions = knownSubscriptions;
+ Filter.knownFilters = parser.knownFilters;
+ Subscription.knownSubscriptions = parser.knownSubscriptions;
+
+ if (parser.userFilters)
+ {
+ for (let i = 0; i < parser.userFilters.length; i++)
+ {
+ let filter = Filter.fromText(parser.userFilters[i]);
+ this.addFilter(filter, null, undefined, true);
+ }
+ }
+ TimeLine.log("Initializing data done, triggering observers")
+
+ this._loading = false;
+ FilterNotifier.triggerListeners("load");
+
+ if (sourceFile != this.sourceFile)
+ this.saveToDisk();
+
+ TimeLine.leave("FilterStorage.loadFromDisk() read callback done");
+ }.bind(this);
+
+ let explicitFile;
+ if (sourceFile)
+ {
+ explicitFile = true;
+ readFile(sourceFile, 0);
+ }
+ else
+ {
+ explicitFile = false;
+ sourceFile = FilterStorage.sourceFile;
+
+ let callback = function(e, statData)
+ {
+ if (e || !statData.exists)
+ {
+ this.firstRun = true;
+ this._loading = false;
+ FilterNotifier.triggerListeners("load");
+
+ TimeLine.leave("FilterStorage.loadFromDisk() read callback done");
+ }
+ else
+ readFile(sourceFile, 0);
+ }.bind(this);
+
+ if (sourceFile)
+ IO.statFile(sourceFile, callback);
+ else
+ callback(true);
+ }
+
+ TimeLine.leave("FilterStorage.loadFromDisk() done");
+ },
+
+ _generateFilterData: function(subscriptions)
+ {
+ yield "# Adblock Plus preferences";
+ yield "version=" + formatVersion;
+
+ let saved = {__proto__: null};
+ let buf = [];
+
+ // Save filter data
+ for (let i = 0; i < subscriptions.length; i++)
+ {
+ let subscription = subscriptions[i];
+ for (let j = 0; j < subscription.filters.length; j++)
+ {
+ let filter = subscription.filters[j];
+ if (!(filter.text in saved))
+ {
+ filter.serialize(buf);
+ saved[filter.text] = filter;
+ for (let k = 0; k < buf.length; k++)
+ yield buf[k];
+ buf.splice(0);
+ }
+ }
+ }
+
+ // Save subscriptions
+ for (let i = 0; i < subscriptions.length; i++)
+ {
+ let subscription = subscriptions[i];
+
+ yield "";
+
+ subscription.serialize(buf);
+ if (subscription.filters.length)
+ {
+ buf.push("", "[Subscription filters]")
+ subscription.serializeFilters(buf);
+ }
+ for (let k = 0; k < buf.length; k++)
+ yield buf[k];
+ buf.splice(0);
+ }
+ },
+
+ /**
+ * Will be set to true if saveToDisk() is running (reentrance protection).
+ * @type Boolean
+ */
+ _saving: false,
+
+ /**
+ * Will be set to true if a saveToDisk() call arrives while saveToDisk() is
+ * already running (delayed execution).
+ * @type Boolean
+ */
+ _needsSave: false,
+
+ /**
+ * Saves all subscriptions back to disk
+ * @param {nsIFile} [targetFile] File to be written
+ */
+ saveToDisk: function(targetFile)
+ {
+ let explicitFile = true;
+ if (!targetFile)
+ {
+ targetFile = FilterStorage.sourceFile;
+ explicitFile = false;
+ }
+ if (!targetFile)
+ return;
+
+ if (!explicitFile && this._saving)
+ {
+ this._needsSave = true;
+ return;
+ }
+
+ TimeLine.enter("Entered FilterStorage.saveToDisk()");
+
+ // Make sure the file's parent directory exists
+ try {
+ targetFile.parent.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
+ } catch (e) {}
+
+ let writeFilters = function()
+ {
+ TimeLine.enter("FilterStorage.saveToDisk() -> writeFilters()");
+ IO.writeToFile(targetFile, this._generateFilterData(subscriptions), function(e)
+ {
+ TimeLine.enter("FilterStorage.saveToDisk() write callback");
+ if (!explicitFile)
+ this._saving = false;
+
+ if (e)
+ Cu.reportError(e);
+
+ if (!explicitFile && this._needsSave)
+ {
+ this._needsSave = false;
+ this.saveToDisk();
+ }
+ else
+ FilterNotifier.triggerListeners("save");
+ TimeLine.leave("FilterStorage.saveToDisk() write callback done");
+ }.bind(this), "FilterStorageWrite");
+ TimeLine.leave("FilterStorage.saveToDisk() -> writeFilters()", "FilterStorageWrite");
+ }.bind(this);
+
+ let checkBackupRequired = function(callbackNotRequired, callbackRequired)
+ {
+ if (explicitFile || Prefs.patternsbackups <= 0)
+ callbackNotRequired();
+ else
+ {
+ IO.statFile(targetFile, function(e, statData)
+ {
+ if (e || !statData.exists)
+ callbackNotRequired();
+ else
+ {
+ let [, part1, part2] = /^(.*)(\.\w+)$/.exec(targetFile.leafName) || [null, targetFile.leafName, ""];
+ let newestBackup = targetFile.clone();
+ newestBackup.leafName = part1 + "-backup1" + part2;
+ IO.statFile(newestBackup, function(e, statData)
+ {
+ if (!e && (!statData.exists || (Date.now() - statData.lastModified) / 3600000 >= Prefs.patternsbackupinterval))
+ callbackRequired(part1, part2)
+ else
+ callbackNotRequired();
+ });
+ }
+ });
+ }
+ }.bind(this);
+
+ let removeLastBackup = function(part1, part2)
+ {
+ TimeLine.enter("FilterStorage.saveToDisk() -> removeLastBackup()");
+ let file = targetFile.clone();
+ file.leafName = part1 + "-backup" + Prefs.patternsbackups + part2;
+ IO.removeFile(file, (e) => renameBackup(part1, part2, Prefs.patternsbackups - 1));
+ TimeLine.leave("FilterStorage.saveToDisk() <- removeLastBackup()");
+ }.bind(this);
+
+ let renameBackup = function(part1, part2, index)
+ {
+ TimeLine.enter("FilterStorage.saveToDisk() -> renameBackup()");
+ if (index > 0)
+ {
+ let fromFile = targetFile.clone();
+ fromFile.leafName = part1 + "-backup" + index + part2;
+
+ let toName = part1 + "-backup" + (index + 1) + part2;
+
+ IO.renameFile(fromFile, toName, (e) => renameBackup(part1, part2, index - 1));
+ }
+ else
+ {
+ let toFile = targetFile.clone();
+ toFile.leafName = part1 + "-backup" + (index + 1) + part2;
+
+ IO.copyFile(targetFile, toFile, writeFilters);
+ }
+ TimeLine.leave("FilterStorage.saveToDisk() <- renameBackup()");
+ }.bind(this);
+
+ // Do not persist external subscriptions
+ let subscriptions = this.subscriptions.filter((s) => !(s instanceof ExternalSubscription));
+ if (!explicitFile)
+ this._saving = true;
+
+ checkBackupRequired(writeFilters, removeLastBackup);
+
+ TimeLine.leave("FilterStorage.saveToDisk() done");
+ },
+
+ /**
+ * Returns the list of existing backup files.
+ */
+ getBackupFiles: function() /**nsIFile[]*/
+ {
+ // TODO: This method should be asynchronous
+ let result = [];
+
+ let [, part1, part2] = /^(.*)(\.\w+)$/.exec(FilterStorage.sourceFile.leafName) || [null, FilterStorage.sourceFile.leafName, ""];
+ for (let i = 1; ; i++)
+ {
+ let file = FilterStorage.sourceFile.clone();
+ file.leafName = part1 + "-backup" + i + part2;
+ if (file.exists())
+ result.push(file);
+ else
+ break;
+ }
+ return result;
+ }
+};
+
+/**
+ * Joins subscription's filters to the subscription without any notifications.
+ * @param {Subscription} subscription filter subscription that should be connected to its filters
+ */
+function addSubscriptionFilters(subscription)
+{
+ if (!(subscription.url in FilterStorage.knownSubscriptions))
+ return;
+
+ for (let filter of subscription.filters)
+ filter.subscriptions.push(subscription);
+}
+
+/**
+ * Removes subscription's filters from the subscription without any notifications.
+ * @param {Subscription} subscription filter subscription to be removed
+ */
+function removeSubscriptionFilters(subscription)
+{
+ if (!(subscription.url in FilterStorage.knownSubscriptions))
+ return;
+
+ for (let filter of subscription.filters)
+ {
+ let i = filter.subscriptions.indexOf(subscription);
+ if (i >= 0)
+ filter.subscriptions.splice(i, 1);
+ }
+}
+
+/**
+ * Observer listening to private browsing mode changes.
+ * @class
+ */
+let PrivateBrowsing = exports.PrivateBrowsing =
+{
+ /**
+ * Will be set to true when the private browsing mode is switched on globally.
+ * @type Boolean
+ */
+ enabled: false,
+
+ /**
+ * Checks whether private browsing is enabled for a particular window.
+ */
+ enabledForWindow: function(/**Window*/ wnd) /**Boolean*/
+ {
+ try
+ {
+ return wnd.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsILoadContext)
+ .usePrivateBrowsing;
+ }
+ catch (e)
+ {
+ // Gecko 19 and below will throw NS_NOINTERFACE, this is expected
+ if (e.result != Cr.NS_NOINTERFACE)
+ Cu.reportError(e);
+ return false;
+ }
+ },
+
+ init: function()
+ {
+ if ("@mozilla.org/privatebrowsing;1" in Cc)
+ {
+ try
+ {
+ this.enabled = Cc["@mozilla.org/privatebrowsing;1"].getService(Ci.nsIPrivateBrowsingService).privateBrowsingEnabled;
+ Services.obs.addObserver(this, "private-browsing", true);
+ onShutdown.add(function()
+ {
+ Services.obs.removeObserver(this, "private-browsing");
+ }.bind(this));
+ }
+ catch(e)
+ {
+ Cu.reportError(e);
+ }
+ }
+ },
+
+ observe: function(subject, topic, data)
+ {
+ if (topic == "private-browsing")
+ {
+ if (data == "enter")
+ this.enabled = true;
+ else if (data == "exit")
+ this.enabled = false;
+ }
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver])
+};
+PrivateBrowsing.init();
+
+/**
+ * IO.readFromFile() listener to parse filter data.
+ * @constructor
+ */
+function INIParser()
+{
+ this.fileProperties = this.curObj = {};
+ this.subscriptions = [];
+ this.knownFilters = {__proto__: null};
+ this.knownSubscriptions = {__proto__: null};
+}
+INIParser.prototype =
+{
+ linesProcessed: 0,
+ subscriptions: null,
+ knownFilters: null,
+ knownSubscriptions : null,
+ wantObj: true,
+ fileProperties: null,
+ curObj: null,
+ curSection: null,
+ userFilters: null,
+
+ process: function(val)
+ {
+ let origKnownFilters = Filter.knownFilters;
+ Filter.knownFilters = this.knownFilters;
+ let origKnownSubscriptions = Subscription.knownSubscriptions;
+ Subscription.knownSubscriptions = this.knownSubscriptions;
+ let match;
+ try
+ {
+ if (this.wantObj === true && (match = /^(\w+)=(.*)$/.exec(val)))
+ this.curObj[match[1]] = match[2];
+ else if (val === null || (match = /^\s*\[(.+)\]\s*$/.exec(val)))
+ {
+ if (this.curObj)
+ {
+ // Process current object before going to next section
+ switch (this.curSection)
+ {
+ case "filter":
+ case "pattern":
+ if ("text" in this.curObj)
+ Filter.fromObject(this.curObj);
+ break;
+ case "subscription":
+ let subscription = Subscription.fromObject(this.curObj);
+ if (subscription)
+ this.subscriptions.push(subscription);
+ break;
+ case "subscription filters":
+ case "subscription patterns":
+ if (this.subscriptions.length)
+ {
+ let subscription = this.subscriptions[this.subscriptions.length - 1];
+ for (let text of this.curObj)
+ {
+ let filter = Filter.fromText(text);
+ subscription.filters.push(filter);
+ filter.subscriptions.push(subscription);
+ }
+ }
+ break;
+ case "user patterns":
+ this.userFilters = this.curObj;
+ break;
+ }
+ }
+
+ if (val === null)
+ return;
+
+ this.curSection = match[1].toLowerCase();
+ switch (this.curSection)
+ {
+ case "filter":
+ case "pattern":
+ case "subscription":
+ this.wantObj = true;
+ this.curObj = {};
+ break;
+ case "subscription filters":
+ case "subscription patterns":
+ case "user patterns":
+ this.wantObj = false;
+ this.curObj = [];
+ break;
+ default:
+ this.wantObj = undefined;
+ this.curObj = null;
+ }
+ }
+ else if (this.wantObj === false && val)
+ this.curObj.push(val.replace(/\\\[/g, "["));
+ }
+ finally
+ {
+ Filter.knownFilters = origKnownFilters;
+ Subscription.knownSubscriptions = origKnownSubscriptions;
+ }
+
+ // Allow events to be processed every now and then.
+ // Note: IO.readFromFile() will deal with the potential reentrance here.
+ this.linesProcessed++;
+ if (this.linesProcessed % 1000 == 0)
+ Utils.yield();
+ }
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/io.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/io.js
new file mode 100644
index 0000000..ea362b7
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/io.js
@@ -0,0 +1,365 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Module containing file I/O helpers.
+ */
+
+let {Services} = Cu.import("resource://gre/modules/Services.jsm", null);
+let {FileUtils} = Cu.import("resource://gre/modules/FileUtils.jsm", null);
+let {OS} = Cu.import("resource://gre/modules/osfile.jsm", null);
+let {Task} = Cu.import("resource://gre/modules/Task.jsm", null);
+
+let {TimeLine} = require("timeline");
+let {Prefs} = require("prefs");
+let {Utils} = require("utils");
+
+let firstRead = true;
+const BUFFER_SIZE = 0x8000; // 32kB
+
+let IO = exports.IO =
+{
+ /**
+ * Retrieves the platform-dependent line break string.
+ */
+ get lineBreak()
+ {
+ let lineBreak = (Services.appinfo.OS == "WINNT" ? "\r\n" : "\n");
+ delete IO.lineBreak;
+ IO.__defineGetter__("lineBreak", () => lineBreak);
+ return IO.lineBreak;
+ },
+
+ /**
+ * Tries to interpret a file path as an absolute path or a path relative to
+ * user's profile. Returns a file or null on failure.
+ */
+ resolveFilePath: function(/**String*/ path) /**nsIFile*/
+ {
+ if (!path)
+ return null;
+
+ try {
+ // Assume an absolute path first
+ return new FileUtils.File(path);
+ } catch (e) {}
+
+ try {
+ // Try relative path now
+ return FileUtils.getFile("ProfD", path.split("/"));
+ } catch (e) {}
+
+ return null;
+ },
+
+ /**
+ * Reads strings from a file asynchronously, calls listener.process() with
+ * each line read and with a null parameter once the read operation is done.
+ * The callback will be called when the operation is done.
+ */
+ readFromFile: function(/**nsIFile*/ file, /**Object*/ listener, /**Function*/ callback, /**String*/ timeLineID)
+ {
+ try
+ {
+ let processing = false;
+ let buffer = "";
+ let loaded = false;
+ let error = null;
+
+ let onProgress = function(data)
+ {
+ if (timeLineID)
+ {
+ TimeLine.asyncStart(timeLineID);
+ }
+
+ let index = (processing ? -1 : Math.max(data.lastIndexOf("\n"), data.lastIndexOf("\r")));
+ if (index >= 0)
+ {
+ // Protect against reentrance in case the listener processes events.
+ processing = true;
+ try
+ {
+ let oldBuffer = buffer;
+ buffer = data.substr(index + 1);
+ data = data.substr(0, index + 1);
+ let lines = data.split(/[\r\n]+/);
+ lines.pop();
+ lines[0] = oldBuffer + lines[0];
+ for (let i = 0; i < lines.length; i++)
+ listener.process(lines[i]);
+ }
+ finally
+ {
+ processing = false;
+ data = buffer;
+ buffer = "";
+ onProgress(data);
+
+ if (loaded)
+ {
+ loaded = false;
+ onSuccess();
+ }
+
+ if (error)
+ {
+ let param = error;
+ error = null;
+ onError(param);
+ }
+ }
+ }
+ else
+ buffer += data;
+
+ if (timeLineID)
+ {
+ TimeLine.asyncEnd(timeLineID);
+ }
+ };
+
+ let onSuccess = function()
+ {
+ if (processing)
+ {
+ // Still processing data, delay processing this event.
+ loaded = true;
+ return;
+ }
+
+ if (timeLineID)
+ {
+ TimeLine.asyncStart(timeLineID);
+ }
+
+ if (buffer !== "")
+ listener.process(buffer);
+ listener.process(null);
+
+ if (timeLineID)
+ {
+ TimeLine.asyncEnd(timeLineID);
+ TimeLine.asyncDone(timeLineID);
+ }
+
+ callback(null);
+ };
+
+ let onError = function(e)
+ {
+ if (processing)
+ {
+ // Still processing data, delay processing this event.
+ error = e;
+ return;
+ }
+
+ callback(e);
+
+ if (timeLineID)
+ {
+ TimeLine.asyncDone(timeLineID);
+ }
+ };
+
+ let decoder = new TextDecoder();
+ let array = new Uint8Array(BUFFER_SIZE);
+ Task.spawn(function()
+ {
+ if (firstRead && Services.vc.compare(Utils.platformVersion, "23.0a1") <= 0)
+ {
+ // See https://issues.adblockplus.org/ticket/530 - the first file
+ // opened cannot be closed due to Gecko bug 858723. Make sure that
+ // our patterns.ini file doesn't stay locked by opening a dummy file
+ // first.
+ try
+ {
+ let dummyPath = IO.resolveFilePath(Prefs.data_directory + "/dummy").path;
+ let dummy = yield OS.File.open(dummyPath, {write: true, truncate: true});
+ yield dummy.close();
+ }
+ catch (e)
+ {
+ // Dummy might be locked already, we don't care
+ }
+ }
+ firstRead = false;
+
+ let f = yield OS.File.open(file.path, {read: true});
+ let numBytes;
+ do
+ {
+ numBytes = yield f.readTo(array);
+ if (numBytes)
+ {
+ let data = decoder.decode(numBytes == BUFFER_SIZE ?
+ array :
+ array.subarray(0, numBytes), {stream: true});
+ onProgress(data);
+ }
+ } while (numBytes);
+
+ yield f.close();
+ }.bind(this)).then(onSuccess, onError);
+ }
+ catch (e)
+ {
+ callback(e);
+ }
+ },
+
+ /**
+ * Writes string data to a file in UTF-8 format asynchronously. The callback
+ * will be called when the write operation is done.
+ */
+ writeToFile: function(/**nsIFile*/ file, /**Iterator*/ data, /**Function*/ callback, /**String*/ timeLineID)
+ {
+ try
+ {
+ let encoder = new TextEncoder();
+
+ Task.spawn(function()
+ {
+ // This mimics OS.File.writeAtomic() but writes in chunks.
+ let tmpPath = file.path + ".tmp";
+ let f = yield OS.File.open(tmpPath, {write: true, truncate: true});
+
+ let buf = [];
+ let bufLen = 0;
+ let lineBreak = this.lineBreak;
+
+ function writeChunk()
+ {
+ let array = encoder.encode(buf.join(lineBreak) + lineBreak);
+ buf = [];
+ bufLen = 0;
+ return f.write(array);
+ }
+
+ for (let line in data)
+ {
+ buf.push(line);
+ bufLen += line.length;
+ if (bufLen >= BUFFER_SIZE)
+ yield writeChunk();
+ }
+
+ if (bufLen)
+ yield writeChunk();
+
+ // OS.File.flush() isn't exposed prior to Gecko 27, see bug 912457.
+ if (typeof f.flush == "function")
+ yield f.flush();
+ yield f.close();
+ yield OS.File.move(tmpPath, file.path, {noCopy: true});
+ }.bind(this)).then(callback.bind(null, null), callback);
+ }
+ catch (e)
+ {
+ callback(e);
+ }
+ },
+
+ /**
+ * Copies a file asynchronously. The callback will be called when the copy
+ * operation is done.
+ */
+ copyFile: function(/**nsIFile*/ fromFile, /**nsIFile*/ toFile, /**Function*/ callback)
+ {
+ try
+ {
+ let promise = OS.File.copy(fromFile.path, toFile.path);
+ promise.then(callback.bind(null, null), callback);
+ }
+ catch (e)
+ {
+ callback(e);
+ }
+ },
+
+ /**
+ * Renames a file within the same directory, will call callback when done.
+ */
+ renameFile: function(/**nsIFile*/ fromFile, /**String*/ newName, /**Function*/ callback)
+ {
+ try
+ {
+ toFile = fromFile.clone();
+ toFile.leafName = newName;
+ let promise = OS.File.move(fromFile.path, toFile.path);
+ promise.then(callback.bind(null, null), callback);
+ }
+ catch(e)
+ {
+ callback(e);
+ }
+ },
+
+ /**
+ * Removes a file, will call callback when done.
+ */
+ removeFile: function(/**nsIFile*/ file, /**Function*/ callback)
+ {
+ try
+ {
+ let promise = OS.File.remove(file.path);
+ promise.then(callback.bind(null, null), callback);
+ }
+ catch(e)
+ {
+ callback(e);
+ }
+ },
+
+ /**
+ * Gets file information such as whether the file exists.
+ */
+ statFile: function(/**nsIFile*/ file, /**Function*/ callback)
+ {
+ try
+ {
+ let promise = OS.File.stat(file.path);
+ promise.then(function onSuccess(info)
+ {
+ callback(null, {
+ exists: true,
+ isDirectory: info.isDir,
+ isFile: !info.isDir,
+ lastModified: info.lastModificationDate.getTime()
+ });
+ }, function onError(e)
+ {
+ if (e.becauseNoSuchFile)
+ {
+ callback(null, {
+ exists: false,
+ isDirectory: false,
+ isFile: false,
+ lastModified: 0
+ });
+ }
+ else
+ callback(e);
+ });
+ }
+ catch(e)
+ {
+ callback(e);
+ }
+ }
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/keySelector.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/keySelector.js
new file mode 100644
index 0000000..20847d9
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/keySelector.js
@@ -0,0 +1,228 @@
+/*
+ * This file is part of the Adblock Plus build tools,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+let validModifiers =
+{
+ ACCEL: null,
+ CTRL: "control",
+ CONTROL: "control",
+ SHIFT: "shift",
+ ALT: "alt",
+ META: "meta",
+ __proto__: null
+};
+
+/**
+ * Sets the correct value of validModifiers.ACCEL.
+ */
+function initAccelKey()
+{
+ validModifiers.ACCEL = "control";
+ try
+ {
+ let accelKey = Services.prefs.getIntPref("ui.key.accelKey");
+ if (accelKey == Ci.nsIDOMKeyEvent.DOM_VK_CONTROL)
+ validModifiers.ACCEL = "control";
+ else if (accelKey == Ci.nsIDOMKeyEvent.DOM_VK_ALT)
+ validModifiers.ACCEL = "alt";
+ else if (accelKey == Ci.nsIDOMKeyEvent.DOM_VK_META)
+ validModifiers.ACCEL = "meta";
+ }
+ catch(e)
+ {
+ Cu.reportError(e);
+ }
+}
+
+exports.KeySelector = KeySelector;
+
+/**
+ * This class provides capabilities to find and use available keyboard shortcut
+ * keys.
+ * @param {ChromeWindow} window the window where to look up existing shortcut
+ * keys
+ * @constructor
+ */
+function KeySelector(window)
+{
+ this._initExistingShortcuts(window);
+}
+KeySelector.prototype =
+{
+ /**
+ * Map listing existing shortcut keys as its keys.
+ * @type Object
+ */
+ _existingShortcuts: null,
+
+ /**
+ * Sets up _existingShortcuts property for a window.
+ */
+ _initExistingShortcuts: function(/**ChromeWindow*/ window)
+ {
+ if (!validModifiers.ACCEL)
+ initAccelKey();
+
+ this._existingShortcuts = {__proto__: null};
+
+ let keys = window.document.getElementsByTagName("key");
+ for (let i = 0; i < keys.length; i++)
+ {
+ let key = keys[i];
+ let keyData =
+ {
+ shift: false,
+ meta: false,
+ alt: false,
+ control: false,
+ char: null,
+ code: null
+ };
+
+ let keyChar = key.getAttribute("key");
+ if (keyChar && keyChar.length == 1)
+ keyData.char = keyChar.toUpperCase();
+
+ let keyCode = key.getAttribute("keycode");
+ if (keyCode && "DOM_" + keyCode.toUpperCase() in Ci.nsIDOMKeyEvent)
+ keyData.code = Ci.nsIDOMKeyEvent["DOM_" + keyCode.toUpperCase()];
+
+ if (!keyData.char && !keyData.code)
+ continue;
+
+ let keyModifiers = key.getAttribute("modifiers");
+ if (keyModifiers)
+ for each (let modifier in keyModifiers.toUpperCase().match(/\w+/g))
+ if (modifier in validModifiers)
+ keyData[validModifiers[modifier]] = true;
+
+ let canonical = [keyData.shift, keyData.meta, keyData.alt, keyData.control, keyData.char || keyData.code].join(" ");
+ this._existingShortcuts[canonical] = true;
+ }
+ },
+
+ /**
+ * Selects a keyboard shortcut variant that isn't already taken,
+ * parses it into an object.
+ */
+ selectKey: function(/**String*/ variants) /**Object*/
+ {
+ for each (let variant in variants.split(/\s*,\s*/))
+ {
+ if (!variant)
+ continue;
+
+ let keyData =
+ {
+ shift: false,
+ meta: false,
+ alt: false,
+ control: false,
+ char: null,
+ code: null,
+ codeName: null
+ };
+ for each (let part in variant.toUpperCase().split(/\s+/))
+ {
+ if (part in validModifiers)
+ keyData[validModifiers[part]] = true;
+ else if (part.length == 1)
+ keyData.char = part;
+ else if ("DOM_VK_" + part in Ci.nsIDOMKeyEvent)
+ {
+ keyData.code = Ci.nsIDOMKeyEvent["DOM_VK_" + part];
+ keyData.codeName = "VK_" + part;
+ }
+ }
+
+ if (!keyData.char && !keyData.code)
+ continue;
+
+ let canonical = [keyData.shift, keyData.meta, keyData.alt, keyData.control, keyData.char || keyData.code].join(" ");
+ if (canonical in this._existingShortcuts)
+ continue;
+
+ return keyData;
+ }
+
+ return null;
+ }
+};
+
+/**
+ * Creates the text representation for a key.
+ * @static
+ */
+KeySelector.getTextForKey = function (/**Object*/ key) /**String*/
+{
+ if (!key)
+ return null;
+
+ if (!("text" in key))
+ {
+ key.text = null;
+ try
+ {
+ let stringBundle = Services.strings.createBundle("chrome://global-platform/locale/platformKeys.properties");
+ let parts = [];
+ if (key.control)
+ parts.push(stringBundle.GetStringFromName("VK_CONTROL"));
+ if (key.alt)
+ parts.push(stringBundle.GetStringFromName("VK_ALT"));
+ if (key.meta)
+ parts.push(stringBundle.GetStringFromName("VK_META"));
+ if (key.shift)
+ parts.push(stringBundle.GetStringFromName("VK_SHIFT"));
+ if (key.char)
+ parts.push(key.char.toUpperCase());
+ else
+ {
+ let stringBundle2 = Services.strings.createBundle("chrome://global/locale/keys.properties");
+ parts.push(stringBundle2.GetStringFromName(key.codeName));
+ }
+ key.text = parts.join(stringBundle.GetStringFromName("MODIFIER_SEPARATOR"));
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ return null;
+ }
+ }
+ return key.text;
+};
+
+/**
+ * Tests whether a keypress event matches the given key.
+ * @static
+ */
+KeySelector.matchesKey = function(/**Event*/ event, /**Object*/ key) /**Boolean*/
+{
+ if (event.defaultPrevented || !key)
+ return false;
+ if (key.shift != event.shiftKey || key.alt != event.altKey)
+ return false;
+ if (key.meta != event.metaKey || key.control != event.ctrlKey)
+ return false;
+
+ if (key.char && event.charCode && String.fromCharCode(event.charCode).toUpperCase() == key.char)
+ return true;
+ if (key.code && event.keyCode && event.keyCode == key.code)
+ return true;
+ return false;
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/main.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/main.js
new file mode 100644
index 0000000..f18cc05
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/main.js
@@ -0,0 +1,73 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Starts up Adblock Plus
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {TimeLine} = require("timeline");
+
+TimeLine.enter("Adblock Plus startup");
+registerPublicAPI();
+TimeLine.log("Done registering public API");
+require("filterListener");
+TimeLine.log("Done loading filter listener");
+require("contentPolicy");
+TimeLine.log("Done loading content policy");
+require("synchronizer");
+TimeLine.log("Done loading subscription synchronizer");
+require("notification");
+TimeLine.log("Done loading notification downloader");
+require("sync");
+TimeLine.log("Done loading sync support");
+require("ui");
+TimeLine.log("Done loading UI integration code");
+TimeLine.leave("Started up");
+
+function registerPublicAPI()
+{
+ let {addonRoot} = require("info");
+
+ let uri = Services.io.newURI(addonRoot + "lib/Public.jsm", null, null);
+ if (uri instanceof Ci.nsIMutable)
+ uri.mutable = false;
+
+ let classID = Components.ID("5e447bce-1dd2-11b2-b151-ec21c2b6a135");
+ let contractID = "@adblockplus.org/abp/public;1";
+ let factory =
+ {
+ createInstance: function(outer, iid)
+ {
+ if (outer)
+ throw Cr.NS_ERROR_NO_AGGREGATION;
+ return uri.QueryInterface(iid);
+ },
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIFactory])
+ };
+
+ let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
+ registrar.registerFactory(classID, "Adblock Plus public API URL", contractID, factory);
+
+ onShutdown.add(function()
+ {
+ registrar.unregisterFactory(classID, factory);
+ Cu.unload(uri.spec);
+ });
+}
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/matcher.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/matcher.js
new file mode 100644
index 0000000..908b0b8
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/matcher.js
@@ -0,0 +1,446 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Matcher class implementing matching addresses against a list of filters.
+ */
+
+let {Filter, RegExpFilter, WhitelistFilter} = require("filterClasses");
+
+/**
+ * Blacklist/whitelist filter matching
+ * @constructor
+ */
+function Matcher()
+{
+ this.clear();
+}
+exports.Matcher = Matcher;
+
+Matcher.prototype = {
+ /**
+ * Lookup table for filters by their associated keyword
+ * @type Object
+ */
+ filterByKeyword: null,
+
+ /**
+ * Lookup table for keywords by the filter text
+ * @type Object
+ */
+ keywordByFilter: null,
+
+ /**
+ * Removes all known filters
+ */
+ clear: function()
+ {
+ this.filterByKeyword = {__proto__: null};
+ this.keywordByFilter = {__proto__: null};
+ },
+
+ /**
+ * Adds a filter to the matcher
+ * @param {RegExpFilter} filter
+ */
+ add: function(filter)
+ {
+ if (filter.text in this.keywordByFilter)
+ return;
+
+ // Look for a suitable keyword
+ let keyword = this.findKeyword(filter);
+ let oldEntry = this.filterByKeyword[keyword];
+ if (typeof oldEntry == "undefined")
+ this.filterByKeyword[keyword] = filter;
+ else if (oldEntry.length == 1)
+ this.filterByKeyword[keyword] = [oldEntry, filter];
+ else
+ oldEntry.push(filter);
+ this.keywordByFilter[filter.text] = keyword;
+ },
+
+ /**
+ * Removes a filter from the matcher
+ * @param {RegExpFilter} filter
+ */
+ remove: function(filter)
+ {
+ if (!(filter.text in this.keywordByFilter))
+ return;
+
+ let keyword = this.keywordByFilter[filter.text];
+ let list = this.filterByKeyword[keyword];
+ if (list.length <= 1)
+ delete this.filterByKeyword[keyword];
+ else
+ {
+ let index = list.indexOf(filter);
+ if (index >= 0)
+ {
+ list.splice(index, 1);
+ if (list.length == 1)
+ this.filterByKeyword[keyword] = list[0];
+ }
+ }
+
+ delete this.keywordByFilter[filter.text];
+ },
+
+ /**
+ * Chooses a keyword to be associated with the filter
+ * @param {String} text text representation of the filter
+ * @return {String} keyword (might be empty string)
+ */
+ findKeyword: function(filter)
+ {
+ let result = "";
+ let text = filter.text;
+ if (Filter.regexpRegExp.test(text))
+ return result;
+
+ // Remove options
+ let match = Filter.optionsRegExp.exec(text);
+ if (match)
+ text = match.input.substr(0, match.index);
+
+ // Remove whitelist marker
+ if (text.substr(0, 2) == "@@")
+ text = text.substr(2);
+
+ let candidates = text.toLowerCase().match(/[^a-z0-9%*][a-z0-9%]{3,}(?=[^a-z0-9%*])/g);
+ if (!candidates)
+ return result;
+
+ let hash = this.filterByKeyword;
+ let resultCount = 0xFFFFFF;
+ let resultLength = 0;
+ for (let i = 0, l = candidates.length; i < l; i++)
+ {
+ let candidate = candidates[i].substr(1);
+ let count = (candidate in hash ? hash[candidate].length : 0);
+ if (count < resultCount || (count == resultCount && candidate.length > resultLength))
+ {
+ result = candidate;
+ resultCount = count;
+ resultLength = candidate.length;
+ }
+ }
+ return result;
+ },
+
+ /**
+ * Checks whether a particular filter is being matched against.
+ */
+ hasFilter: function(/**RegExpFilter*/ filter) /**Boolean*/
+ {
+ return (filter.text in this.keywordByFilter);
+ },
+
+ /**
+ * Returns the keyword used for a filter, null for unknown filters.
+ */
+ getKeywordForFilter: function(/**RegExpFilter*/ filter) /**String*/
+ {
+ if (filter.text in this.keywordByFilter)
+ return this.keywordByFilter[filter.text];
+ else
+ return null;
+ },
+
+ /**
+ * Checks whether the entries for a particular keyword match a URL
+ */
+ _checkEntryMatch: function(keyword, location, contentType, docDomain, thirdParty, privatenode)
+ {
+ let list = this.filterByKeyword[keyword];
+ for (let i = 0; i < list.length; i++)
+ {
+ let filter = list[i];
+ if (filter.matches(location, contentType, docDomain, thirdParty,privatenode))
+ return filter;
+ }
+ return null;
+ },
+
+ /**
+ * Tests whether the URL matches any of the known filters
+ * @param {String} location URL to be tested
+ * @param {String} contentType content type identifier of the URL
+ * @param {String} docDomain domain name of the document that loads the URL
+ * @param {Boolean} thirdParty should be true if the URL is a third-party request
+ * @return {RegExpFilter} matching filter or null
+ */
+ matchesAny: function(location, contentType, docDomain, thirdParty)
+ {
+ let candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g);
+ if (candidates === null)
+ candidates = [];
+ candidates.push("");
+ for (let i = 0, l = candidates.length; i < l; i++)
+ {
+ let substr = candidates[i];
+ if (substr in this.filterByKeyword)
+ {
+ let result = this._checkEntryMatch(substr, location, contentType, docDomain, thirdParty);
+ if (result)
+ return result;
+ }
+ }
+
+ return null;
+ }
+};
+
+/**
+ * Combines a matcher for blocking and exception rules, automatically sorts
+ * rules into two Matcher instances.
+ * @constructor
+ */
+function CombinedMatcher()
+{
+ this.blacklist = new Matcher();
+ this.whitelist = new Matcher();
+ this.keys = {__proto__: null};
+ this.resultCache = {__proto__: null};
+}
+exports.CombinedMatcher = CombinedMatcher;
+
+/**
+ * Maximal number of matching cache entries to be kept
+ * @type Number
+ */
+CombinedMatcher.maxCacheEntries = 1000;
+
+CombinedMatcher.prototype =
+{
+ /**
+ * Matcher for blocking rules.
+ * @type Matcher
+ */
+ blacklist: null,
+
+ /**
+ * Matcher for exception rules.
+ * @type Matcher
+ */
+ whitelist: null,
+
+ /**
+ * Exception rules that are limited by public keys, mapped by the corresponding keys.
+ * @type Object
+ */
+ keys: null,
+
+ /**
+ * Lookup table of previous matchesAny results
+ * @type Object
+ */
+ resultCache: null,
+
+ /**
+ * Number of entries in resultCache
+ * @type Number
+ */
+ cacheEntries: 0,
+
+ /**
+ * @see Matcher#clear
+ */
+ clear: function()
+ {
+ this.blacklist.clear();
+ this.whitelist.clear();
+ this.keys = {__proto__: null};
+ this.resultCache = {__proto__: null};
+ this.cacheEntries = 0;
+ },
+
+ /**
+ * @see Matcher#add
+ */
+ add: function(filter)
+ {
+ if (filter instanceof WhitelistFilter)
+ {
+ if (filter.siteKeys)
+ {
+ for (let i = 0; i < filter.siteKeys.length; i++)
+ this.keys[filter.siteKeys[i]] = filter.text;
+ }
+ else
+ this.whitelist.add(filter);
+ }
+ else
+ this.blacklist.add(filter);
+
+ if (this.cacheEntries > 0)
+ {
+ this.resultCache = {__proto__: null};
+ this.cacheEntries = 0;
+ }
+ },
+
+ /**
+ * @see Matcher#remove
+ */
+ remove: function(filter)
+ {
+ if (filter instanceof WhitelistFilter)
+ {
+ if (filter.siteKeys)
+ {
+ for (let i = 0; i < filter.siteKeys.length; i++)
+ delete this.keys[filter.siteKeys[i]];
+ }
+ else
+ this.whitelist.remove(filter);
+ }
+ else
+ this.blacklist.remove(filter);
+
+ if (this.cacheEntries > 0)
+ {
+ this.resultCache = {__proto__: null};
+ this.cacheEntries = 0;
+ }
+ },
+
+ /**
+ * @see Matcher#findKeyword
+ */
+ findKeyword: function(filter)
+ {
+ if (filter instanceof WhitelistFilter)
+ return this.whitelist.findKeyword(filter);
+ else
+ return this.blacklist.findKeyword(filter);
+ },
+
+ /**
+ * @see Matcher#hasFilter
+ */
+ hasFilter: function(filter)
+ {
+ if (filter instanceof WhitelistFilter)
+ return this.whitelist.hasFilter(filter);
+ else
+ return this.blacklist.hasFilter(filter);
+ },
+
+ /**
+ * @see Matcher#getKeywordForFilter
+ */
+ getKeywordForFilter: function(filter)
+ {
+ if (filter instanceof WhitelistFilter)
+ return this.whitelist.getKeywordForFilter(filter);
+ else
+ return this.blacklist.getKeywordForFilter(filter);
+ },
+
+ /**
+ * Checks whether a particular filter is slow
+ */
+ isSlowFilter: function(/**RegExpFilter*/ filter) /**Boolean*/
+ {
+ let matcher = (filter instanceof WhitelistFilter ? this.whitelist : this.blacklist);
+ if (matcher.hasFilter(filter))
+ return !matcher.getKeywordForFilter(filter);
+ else
+ return !matcher.findKeyword(filter);
+ },
+
+ /**
+ * Optimized filter matching testing both whitelist and blacklist matchers
+ * simultaneously. For parameters see Matcher.matchesAny().
+ * @see Matcher#matchesAny
+ */
+ matchesAnyInternal: function(location, contentType, docDomain, thirdParty, privatenode)
+ {
+ let candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g);
+ if (candidates === null)
+ candidates = [];
+ candidates.push("");
+
+ let blacklistHit = null;
+ for (let i = 0, l = candidates.length; i < l; i++)
+ {
+ let substr = candidates[i];
+ if (substr in this.whitelist.filterByKeyword)
+ {
+ let result = this.whitelist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, privatenode);
+ if (result)
+ return result;
+ }
+ if (substr in this.blacklist.filterByKeyword && blacklistHit === null)
+ blacklistHit = this.blacklist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, privatenode);
+ }
+ return blacklistHit;
+ },
+
+ /**
+ * @see Matcher#matchesAny
+ */
+ matchesAny: function(location, contentType, docDomain, thirdParty, privatenode)
+ {
+ let key = location + " " + contentType + " " + docDomain + " " + thirdParty;
+ if (!privatenode){
+ if (key in this.resultCache)
+ return this.resultCache[key];
+ }
+
+ let result = this.matchesAnyInternal(location, contentType, docDomain, thirdParty, privatenode);
+
+ if (this.cacheEntries >= CombinedMatcher.maxCacheEntries)
+ {
+ this.resultCache = {__proto__: null};
+ this.cacheEntries = 0;
+ }
+
+ if (!privatenode){
+ this.resultCache[key] = result;
+ this.cacheEntries++;
+ }
+
+ return result;
+ },
+
+ /**
+ * Looks up whether any filters match the given website key.
+ */
+ matchesByKey: function(/**String*/ location, /**String*/ key, /**String*/ docDomain)
+ {
+ key = key.toUpperCase();
+ if (key in this.keys)
+ {
+ let filter = Filter.knownFilters[this.keys[key]];
+ if (filter && filter.matches(location, "DOCUMENT", docDomain, false))
+ return filter;
+ else
+ return null;
+ }
+ else
+ return null;
+ }
+}
+
+/**
+ * Shared CombinedMatcher instance that should usually be used.
+ * @type CombinedMatcher
+ */
+let defaultMatcher = exports.defaultMatcher = new CombinedMatcher();
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/notification.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/notification.js
new file mode 100644
index 0000000..06e949e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/notification.js
@@ -0,0 +1,339 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Handles notifications.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {TimeLine} = require("timeline");
+let {Prefs} = require("prefs");
+let {Downloader, Downloadable, MILLIS_IN_MINUTE, MILLIS_IN_HOUR, MILLIS_IN_DAY} = require("downloader");
+let {Utils} = require("utils");
+let {Matcher} = require("matcher");
+let {Filter} = require("filterClasses");
+
+let INITIAL_DELAY = 12 * MILLIS_IN_MINUTE;
+let CHECK_INTERVAL = 1 * MILLIS_IN_HOUR;
+let EXPIRATION_INTERVAL = 1 * MILLIS_IN_DAY;
+let TYPE = {
+ information: 0,
+ question: 1,
+ critical: 2
+};
+
+let listeners = {};
+
+function getNumericalSeverity(notification)
+{
+ return (notification.type in TYPE ? TYPE[notification.type] : TYPE.information);
+}
+
+function saveNotificationData()
+{
+ // HACK: JSON values aren't saved unless they are assigned a different object.
+ Prefs.notificationdata = JSON.parse(JSON.stringify(Prefs.notificationdata));
+}
+
+function localize(translations, locale)
+{
+ if (locale in translations)
+ return translations[locale];
+
+ let languagePart = locale.substring(0, locale.indexOf("-"));
+ if (languagePart && languagePart in translations)
+ return translations[languagePart];
+
+ let defaultLocale = "en-US";
+ return translations[defaultLocale];
+}
+
+/**
+ * The object providing actual downloading functionality.
+ * @type Downloader
+ */
+let downloader = null;
+let localData = [];
+
+/**
+ * Regularly fetches notifications and decides which to show.
+ * @class
+ */
+let Notification = exports.Notification =
+{
+ /**
+ * Called on module startup.
+ */
+ init: function()
+ {
+ TimeLine.enter("Entered Notification.init()");
+
+ downloader = new Downloader(this._getDownloadables.bind(this), INITIAL_DELAY, CHECK_INTERVAL);
+ onShutdown.add(function()
+ {
+ downloader.cancel();
+ });
+
+ downloader.onExpirationChange = this._onExpirationChange.bind(this);
+ downloader.onDownloadSuccess = this._onDownloadSuccess.bind(this);
+ downloader.onDownloadError = this._onDownloadError.bind(this);
+
+ TimeLine.leave("Notification.init() done");
+ },
+
+ /**
+ * Yields a Downloadable instances for the notifications download.
+ */
+ _getDownloadables: function()
+ {
+ let downloadable = new Downloadable(Prefs.notificationurl);
+ if (typeof Prefs.notificationdata.lastError === "number")
+ downloadable.lastError = Prefs.notificationdata.lastError;
+ if (typeof Prefs.notificationdata.lastCheck === "number")
+ downloadable.lastCheck = Prefs.notificationdata.lastCheck;
+ if (typeof Prefs.notificationdata.data === "object" && "version" in Prefs.notificationdata.data)
+ downloadable.lastVersion = Prefs.notificationdata.data.version;
+ if (typeof Prefs.notificationdata.softExpiration === "number")
+ downloadable.softExpiration = Prefs.notificationdata.softExpiration;
+ if (typeof Prefs.notificationdata.hardExpiration === "number")
+ downloadable.hardExpiration = Prefs.notificationdata.hardExpiration;
+ yield downloadable;
+ },
+
+ _onExpirationChange: function(downloadable)
+ {
+ Prefs.notificationdata.lastCheck = downloadable.lastCheck;
+ Prefs.notificationdata.softExpiration = downloadable.softExpiration;
+ Prefs.notificationdata.hardExpiration = downloadable.hardExpiration;
+ saveNotificationData();
+ },
+
+ _onDownloadSuccess: function(downloadable, responseText, errorCallback, redirectCallback)
+ {
+ try
+ {
+ let data = JSON.parse(responseText);
+ for (let notification of data.notifications)
+ {
+ if ("severity" in notification)
+ {
+ if (!("type" in notification))
+ notification.type = notification.severity;
+ delete notification.severity;
+ }
+ }
+ Prefs.notificationdata.data = data;
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ errorCallback("synchronize_invalid_data");
+ return;
+ }
+
+ Prefs.notificationdata.lastError = 0;
+ Prefs.notificationdata.downloadStatus = "synchronize_ok";
+ [Prefs.notificationdata.softExpiration, Prefs.notificationdata.hardExpiration] = downloader.processExpirationInterval(EXPIRATION_INTERVAL);
+ saveNotificationData();
+ },
+
+ _onDownloadError: function(downloadable, downloadURL, error, channelStatus, responseStatus, redirectCallback)
+ {
+ Prefs.notificationdata.lastError = Date.now();
+ Prefs.notificationdata.downloadStatus = error;
+ saveNotificationData();
+ },
+
+ /**
+ * Determines which notification is to be shown next.
+ * @param {String} url URL to match notifications to (optional)
+ * @return {Object} notification to be shown, or null if there is none
+ */
+ getNextToShow: function(url)
+ {
+ function checkTarget(target, parameter, name, version)
+ {
+ let minVersionKey = parameter + "MinVersion";
+ let maxVersionKey = parameter + "MaxVersion";
+ return !((parameter in target && target[parameter] != name) ||
+ (minVersionKey in target && Services.vc.compare(version, target[minVersionKey]) < 0) ||
+ (maxVersionKey in target && Services.vc.compare(version, target[maxVersionKey]) > 0));
+ }
+
+ let remoteData = [];
+ if (typeof Prefs.notificationdata.data == "object" && Prefs.notificationdata.data.notifications instanceof Array)
+ remoteData = Prefs.notificationdata.data.notifications;
+
+ if (!(Prefs.notificationdata.shown instanceof Array))
+ {
+ Prefs.notificationdata.shown = [];
+ saveNotificationData();
+ }
+
+ let notifications = localData.concat(remoteData);
+ if (notifications.length === 0)
+ return null;
+
+ let {addonName, addonVersion, application, applicationVersion, platform, platformVersion} = require("info");
+ let notificationToShow = null;
+ for (let notification of notifications)
+ {
+ if ((typeof notification.type === "undefined" || notification.type !== "critical")
+ && Prefs.notificationdata.shown.indexOf(notification.id) !== -1)
+ continue;
+
+ if (typeof url === "string" || notification.urlFilters instanceof Array)
+ {
+ if (typeof url === "string" && notification.urlFilters instanceof Array)
+ {
+ let matcher = new Matcher();
+ for (let urlFilter of notification.urlFilters)
+ matcher.add(Filter.fromText(urlFilter));
+ if (!matcher.matchesAny(url, "DOCUMENT", url))
+ continue;
+ }
+ else
+ continue;
+ }
+
+ if (notification.targets instanceof Array)
+ {
+ let match = false;
+ for (let target of notification.targets)
+ {
+ if (checkTarget(target, "extension", addonName, addonVersion) &&
+ checkTarget(target, "application", application, applicationVersion) &&
+ checkTarget(target, "platform", platform, platformVersion))
+ {
+ match = true;
+ break;
+ }
+ }
+ if (!match)
+ continue;
+ }
+
+ if (!notificationToShow
+ || getNumericalSeverity(notification) > getNumericalSeverity(notificationToShow))
+ notificationToShow = notification;
+ }
+
+ if (notificationToShow && "id" in notificationToShow)
+ {
+ if (notificationToShow.type !== "question")
+ this.markAsShown(notificationToShow.id);
+ }
+
+ return notificationToShow;
+ },
+
+ markAsShown: function(id)
+ {
+ if (Prefs.notificationdata.shown.indexOf(id) > -1)
+ return;
+
+ Prefs.notificationdata.shown.push(id);
+ saveNotificationData();
+ },
+
+ /**
+ * Localizes the texts of the supplied notification.
+ * @param {Object} notification notification to translate
+ * @param {String} locale the target locale (optional, defaults to the
+ * application locale)
+ * @return {Object} the translated texts
+ */
+ getLocalizedTexts: function(notification, locale)
+ {
+ locale = locale || Utils.appLocale;
+ let textKeys = ["title", "message"];
+ let localizedTexts = [];
+ for (let key of textKeys)
+ {
+ if (key in notification)
+ {
+ if (typeof notification[key] == "string")
+ localizedTexts[key] = notification[key];
+ else
+ localizedTexts[key] = localize(notification[key], locale);
+ }
+ }
+ return localizedTexts;
+ },
+
+ /**
+ * Adds a local notification.
+ * @param {Object} notification notification to add
+ */
+ addNotification: function(notification)
+ {
+ if (localData.indexOf(notification) == -1)
+ localData.push(notification);
+ },
+
+ /**
+ * Removes an existing local notification.
+ * @param {Object} notification notification to remove
+ */
+ removeNotification: function(notification)
+ {
+ let index = localData.indexOf(notification);
+ if (index > -1)
+ localData.splice(index, 1);
+ },
+
+ /**
+ * Adds a listener for question-type notifications
+ */
+ addQuestionListener: function(/**string*/ id, /**function(approved)*/ listener)
+ {
+ if (!(id in listeners))
+ listeners[id] = [];
+ if (listeners[id].indexOf(listener) === -1)
+ listeners[id].push(listener);
+ },
+
+ /**
+ * Removes a listener that was previously added via addQuestionListener
+ */
+ removeQuestionListener: function(/**string*/ id, /**function(approved)*/ listener)
+ {
+ if (!(id in listeners))
+ return;
+ let index = listeners[id].indexOf(listener);
+ if (index > -1)
+ listeners[id].splice(index, 1);
+ if (listeners[id].length === 0)
+ delete listeners[id];
+ },
+
+ /**
+ * Notifies listeners about interactions with a notification
+ * @param {String} id notification ID
+ * @param {Boolean} approved indicator whether notification has been approved or not
+ */
+ triggerQuestionListeners: function(id, approved)
+ {
+ if (!(id in listeners))
+ return;
+ let questionListeners = listeners[id];
+ for (let listener of questionListeners)
+ listener(approved);
+ }
+};
+Notification.init();
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/objectTabs.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/objectTabs.js
new file mode 100644
index 0000000..1227490
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/objectTabs.js
@@ -0,0 +1,492 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Code responsible for showing and hiding object tabs.
+ */
+
+/**
+ * Class responsible for showing and hiding object tabs.
+ * @class
+ */
+var objTabs =
+{
+ /**
+ * Number of milliseconds to wait until hiding tab after the mouse moves away.
+ * @type Integer
+ */
+ HIDE_DELAY: 1000,
+
+ /**
+ * Flag used to trigger object tabs initialization first time object tabs are
+ * used.
+ * @type Boolean
+ */
+ initialized: false,
+
+ /**
+ * Will be set to true while initialization is in progress.
+ * @type Boolean
+ */
+ initializing: false,
+
+ /**
+ * Parameters for _showTab, to be called once initialization is complete.
+ */
+ delayedShowParams: null,
+
+ /**
+ * Randomly generated class to be used for visible object tabs on top of object.
+ * @type String
+ */
+ objTabClassVisibleTop: null,
+
+ /**
+ * Randomly generated class to be used for visible object tabs at the bottom of the object.
+ * @type String
+ */
+ objTabClassVisibleBottom: null,
+
+ /**
+ * Randomly generated class to be used for invisible object tabs.
+ * @type String
+ */
+ objTabClassHidden: null,
+
+ /**
+ * Document element the object tab is currently being displayed for.
+ * @type Element
+ */
+ currentElement: null,
+
+ /**
+ * Windows that the window event handler is currently registered for.
+ * @type Array of Window
+ */
+ windowListeners: null,
+
+ /**
+ * Panel element currently used as object tab.
+ * @type Element
+ */
+ objtabElement: null,
+
+ /**
+ * Time of previous position update.
+ * @type Integer
+ */
+ prevPositionUpdate: 0,
+
+ /**
+ * Timer used to update position of the object tab.
+ * @type nsITimer
+ */
+ positionTimer: null,
+
+ /**
+ * Timer used to delay hiding of the object tab.
+ * @type nsITimer
+ */
+ hideTimer: null,
+
+ /**
+ * Used when hideTimer is running, time when the tab should be hidden.
+ * @type Integer
+ */
+ hideTargetTime: 0,
+
+ /**
+ * Initializes object tabs (generates random classes and registers stylesheet).
+ */
+ _initCSS: function()
+ {
+ function processCSSData(request)
+ {
+ if (onShutdown.done)
+ return;
+
+ let data = request.responseText;
+
+ let rnd = [];
+ let offset = "a".charCodeAt(0);
+ for (let i = 0; i < 60; i++)
+ rnd.push(offset + Math.random() * 26);
+
+ this.objTabClassVisibleTop = String.fromCharCode.apply(String, rnd.slice(0, 20));
+ this.objTabClassVisibleBottom = String.fromCharCode.apply(String, rnd.slice(20, 40));
+ this.objTabClassHidden = String.fromCharCode.apply(String, rnd.slice(40, 60));
+
+ let {Utils} = require("utils");
+ let url = Utils.makeURI("data:text/css," + encodeURIComponent(data.replace(/%%CLASSVISIBLETOP%%/g, this.objTabClassVisibleTop)
+ .replace(/%%CLASSVISIBLEBOTTOM%%/g, this.objTabClassVisibleBottom)
+ .replace(/%%CLASSHIDDEN%%/g, this.objTabClassHidden)));
+ Utils.styleService.loadAndRegisterSheet(url, Ci.nsIStyleSheetService.USER_SHEET);
+ onShutdown.add(function()
+ {
+ Utils.styleService.unregisterSheet(url, Ci.nsIStyleSheetService.USER_SHEET);
+ });
+
+ this.initializing = false;
+ this.initialized = true;
+
+ if (this.delayedShowParams)
+ this._showTab.apply(this, this.delayedShowParams);
+ }
+
+ this.delayedShowParams = arguments;
+
+ if (!this.initializing)
+ {
+ this.initializing = true;
+
+ // Load CSS asynchronously
+ try {
+ let request = new XMLHttpRequest();
+ request.mozBackgroundRequest = true;
+ request.open("GET", "chrome://adblockplus/content/objtabs.css");
+ request.overrideMimeType("text/plain");
+
+ request.addEventListener("load", processCSSData.bind(this, request), false);
+ request.send(null);
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ this.initializing = false;
+ }
+ }
+ },
+
+ /**
+ * Called to show object tab for an element.
+ */
+ showTabFor: function(/**Element*/ element)
+ {
+ // Object tabs aren't usable in Fennec
+ let {application} = require("info");
+ if (application == "fennec" || application == "fennec2")
+ return;
+
+ let {Prefs} = require("prefs");
+ if (!Prefs.frameobjects)
+ return;
+
+ if (this.hideTimer)
+ {
+ this.hideTimer.cancel();
+ this.hideTimer = null;
+ }
+
+ if (this.objtabElement)
+ this.objtabElement.style.setProperty("opacity", "1", "important");
+
+ if (this.currentElement != element)
+ {
+ this._hideTab();
+
+ let {Policy} = require("contentPolicy");
+ let {RequestNotifier} = require("requestNotifier");
+ let data = RequestNotifier.getDataForNode(element, true, Policy.type.OBJECT);
+ if (data)
+ {
+ if (this.initialized)
+ this._showTab(element, data[1]);
+ else
+ this._initCSS(element, data[1]);
+ }
+ }
+ },
+
+ /**
+ * Called to hide object tab for an element (actual hiding happens delayed).
+ */
+ hideTabFor: function(/**Element*/ element)
+ {
+ if (element != this.currentElement || this.hideTimer)
+ return;
+
+ this.hideTargetTime = Date.now() + this.HIDE_DELAY;
+ this.hideTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ this.hideTimer.init(this, 40, Ci.nsITimer.TYPE_REPEATING_SLACK);
+ },
+
+ /**
+ * Makes the tab element visible.
+ */
+ _showTab: function(/**Element*/ element, /**RequestEntry*/ data)
+ {
+ let {UI} = require("ui");
+ if (!UI.overlay)
+ return;
+
+ let doc = element.ownerDocument.defaultView.top.document;
+
+ this.objtabElement = doc.createElementNS("http://www.w3.org/1999/xhtml", "a");
+ this.objtabElement.textContent = UI.overlay.attributes.objtabtext;
+ this.objtabElement.setAttribute("title", UI.overlay.attributes.objtabtooltip);
+ this.objtabElement.setAttribute("href", data.location);
+ this.objtabElement.setAttribute("class", this.objTabClassHidden);
+ this.objtabElement.style.setProperty("opacity", "1", "important");
+ this.objtabElement.nodeData = data;
+
+ this.currentElement = element;
+
+ // Register paint listeners for the relevant windows
+ this.windowListeners = [];
+ let wnd = element.ownerDocument.defaultView;
+ while (wnd)
+ {
+ wnd.addEventListener("MozAfterPaint", objectWindowEventHandler, false);
+ this.windowListeners.push(wnd);
+ wnd = (wnd.parent != wnd ? wnd.parent : null);
+ }
+
+ // Register mouse listeners on the object tab
+ this.objtabElement.addEventListener("mouseover", objectTabEventHander, false);
+ this.objtabElement.addEventListener("mouseout", objectTabEventHander, false);
+ this.objtabElement.addEventListener("click", objectTabEventHander, true);
+
+ // Insert the tab into the document and adjust its position
+ doc.documentElement.appendChild(this.objtabElement);
+ if (!this.positionTimer)
+ {
+ this.positionTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ this.positionTimer.init(this, 200, Ci.nsITimer.TYPE_REPEATING_SLACK);
+ }
+ this._positionTab();
+ },
+
+ /**
+ * Hides the tab element.
+ */
+ _hideTab: function()
+ {
+ this.delayedShowParams = null;
+
+ if (this.objtabElement)
+ {
+ // Prevent recursive calls via popuphidden handler
+ let objtab = this.objtabElement;
+ this.objtabElement = null;
+ this.currentElement = null;
+
+ if (this.hideTimer)
+ {
+ this.hideTimer.cancel();
+ this.hideTimer = null;
+ }
+
+ if (this.positionTimer)
+ {
+ this.positionTimer.cancel();
+ this.positionTimer = null;
+ }
+
+ try {
+ objtab.parentNode.removeChild(objtab);
+ } catch (e) {}
+ objtab.removeEventListener("mouseover", objectTabEventHander, false);
+ objtab.removeEventListener("mouseout", objectTabEventHander, false);
+ objtab.nodeData = null;
+
+ for (let wnd of this.windowListeners)
+ wnd.removeEventListener("MozAfterPaint", objectWindowEventHandler, false);
+ this.windowListeners = null;
+ }
+ },
+
+ /**
+ * Updates position of the tab element.
+ */
+ _positionTab: function()
+ {
+ // Test whether element is still in document
+ let elementDoc = null;
+ try
+ {
+ elementDoc = this.currentElement.ownerDocument;
+ } catch (e) {} // Ignore "can't access dead object" error
+ if (!elementDoc || !this.currentElement.offsetWidth || !this.currentElement.offsetHeight ||
+ !elementDoc.defaultView || !elementDoc.documentElement)
+ {
+ this._hideTab();
+ return;
+ }
+
+ let objRect = this._getElementPosition(this.currentElement);
+
+ let className = this.objTabClassVisibleTop;
+ let left = objRect.right - this.objtabElement.offsetWidth;
+ let top = objRect.top - this.objtabElement.offsetHeight;
+ if (top < 0)
+ {
+ top = objRect.bottom;
+ className = this.objTabClassVisibleBottom;
+ }
+
+ if (this.objtabElement.style.left != left + "px")
+ this.objtabElement.style.setProperty("left", left + "px", "important");
+ if (this.objtabElement.style.top != top + "px")
+ this.objtabElement.style.setProperty("top", top + "px", "important");
+
+ if (this.objtabElement.getAttribute("class") != className)
+ this.objtabElement.setAttribute("class", className);
+
+ this.prevPositionUpdate = Date.now();
+ },
+
+ /**
+ * Calculates element's position relative to the top frame and considering
+ * clipping due to scrolling.
+ * @return {left: Number, top: Number, right: Number, bottom: Number}
+ */
+ _getElementPosition: function(/**Element*/ element)
+ {
+ // Restrict rectangle coordinates by the boundaries of a window's client area
+ function intersectRect(rect, wnd)
+ {
+ // Cannot use wnd.innerWidth/Height because they won't account for scrollbars
+ let doc = wnd.document;
+ let wndWidth = doc.documentElement.clientWidth;
+ let wndHeight = doc.documentElement.clientHeight;
+ if (doc.compatMode == "BackCompat") // clientHeight will be bogus in quirks mode
+ wndHeight = Math.max(doc.documentElement.offsetHeight, doc.body.offsetHeight) - wnd.scrollMaxY - 1;
+
+ rect.left = Math.max(rect.left, 0);
+ rect.top = Math.max(rect.top, 0);
+ rect.right = Math.min(rect.right, wndWidth);
+ rect.bottom = Math.min(rect.bottom, wndHeight);
+ }
+
+ let rect = element.getBoundingClientRect();
+ let wnd = element.ownerDocument.defaultView;
+
+ let style = wnd.getComputedStyle(element, null);
+ let offsets = [
+ parseFloat(style.borderLeftWidth) + parseFloat(style.paddingLeft),
+ parseFloat(style.borderTopWidth) + parseFloat(style.paddingTop),
+ parseFloat(style.borderRightWidth) + parseFloat(style.paddingRight),
+ parseFloat(style.borderBottomWidth) + parseFloat(style.paddingBottom)
+ ];
+
+ rect = {left: rect.left + offsets[0], top: rect.top + offsets[1],
+ right: rect.right - offsets[2], bottom: rect.bottom - offsets[3]};
+ while (true)
+ {
+ intersectRect(rect, wnd);
+
+ if (!wnd.frameElement)
+ break;
+
+ // Recalculate coordinates to be relative to frame's parent window
+ let frameElement = wnd.frameElement;
+ wnd = frameElement.ownerDocument.defaultView;
+
+ let frameRect = frameElement.getBoundingClientRect();
+ let frameStyle = wnd.getComputedStyle(frameElement, null);
+ let relLeft = frameRect.left + parseFloat(frameStyle.borderLeftWidth) + parseFloat(frameStyle.paddingLeft);
+ let relTop = frameRect.top + parseFloat(frameStyle.borderTopWidth) + parseFloat(frameStyle.paddingTop);
+
+ rect.left += relLeft;
+ rect.right += relLeft;
+ rect.top += relTop;
+ rect.bottom += relTop;
+ }
+
+ return rect;
+ },
+
+ doBlock: function()
+ {
+ let {UI} = require("ui");
+ let {Utils} = require("utils");
+ let chromeWindow = Utils.getChromeWindow(this.currentElement.ownerDocument.defaultView);
+ UI.blockItem(chromeWindow, this.currentElement, this.objtabElement.nodeData);
+ },
+
+ /**
+ * Called whenever a timer fires.
+ */
+ observe: function(/**nsISupport*/ subject, /**String*/ topic, /**String*/ data)
+ {
+ if (subject == this.positionTimer)
+ {
+ // Don't update position if it was already updated recently (via MozAfterPaint)
+ if (Date.now() - this.prevPositionUpdate > 100)
+ this._positionTab();
+ }
+ else if (subject == this.hideTimer)
+ {
+ let now = Date.now();
+ if (now >= this.hideTargetTime)
+ this._hideTab();
+ else if (this.hideTargetTime - now < this.HIDE_DELAY / 2)
+ this.objtabElement.style.setProperty("opacity", (this.hideTargetTime - now) * 2 / this.HIDE_DELAY, "important");
+ }
+ }
+};
+
+onShutdown.add(objTabs._hideTab.bind(objTabs));
+
+/**
+ * Function called whenever the mouse enters or leaves an object.
+ */
+function objectMouseEventHander(/**Event*/ event)
+{
+ if (!event.isTrusted)
+ return;
+
+ if (event.type == "mouseover")
+ objTabs.showTabFor(event.target);
+ else if (event.type == "mouseout")
+ objTabs.hideTabFor(event.target);
+}
+
+/**
+ * Function called for paint events of the object tab window.
+ */
+function objectWindowEventHandler(/**Event*/ event)
+{
+ if (!event.isTrusted)
+ return;
+
+ // Don't trigger update too often, avoid overusing CPU on frequent page updates
+ if (event.type == "MozAfterPaint" && Date.now() - objTabs.prevPositionUpdate > 20)
+ objTabs._positionTab();
+}
+
+/**
+ * Function called whenever the mouse enters or leaves an object tab.
+ */
+function objectTabEventHander(/**Event*/ event)
+{
+ if (onShutdown.done || !event.isTrusted)
+ return;
+
+ if (event.type == "click" && event.button == 0)
+ {
+ event.preventDefault();
+ event.stopPropagation();
+
+ objTabs.doBlock();
+ }
+ else if (event.type == "mouseover")
+ objTabs.showTabFor(objTabs.currentElement);
+ else if (event.type == "mouseout")
+ objTabs.hideTabFor(objTabs.currentElement);
+}
+exports.objectMouseEventHander = objectMouseEventHander;
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/prefs.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/prefs.js
new file mode 100644
index 0000000..e1b6ae0
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/prefs.js
@@ -0,0 +1,203 @@
+/*
+ * This file is part of the Adblock Plus build tools,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+let {addonRoot, addonName} = require("info");
+let branchName = "extensions." + addonName + ".";
+let branch = Services.prefs.getBranch(branchName);
+let ignorePrefChanges = false;
+
+function init()
+{
+ // Load default preferences and set up properties for them
+ let defaultBranch = Services.prefs.getDefaultBranch(branchName);
+ let scope =
+ {
+ pref: function(pref, value)
+ {
+ if (pref.substr(0, branchName.length) != branchName)
+ {
+ Cu.reportError(new Error("Ignoring default preference " + pref + ", wrong branch."));
+ return;
+ }
+ pref = pref.substr(branchName.length);
+
+ let [getter, setter] = typeMap[typeof value];
+ setter(defaultBranch, pref, value);
+ defineProperty(pref, false, getter, setter);
+ }
+ };
+ Services.scriptloader.loadSubScript(addonRoot + "defaults/prefs.js", scope);
+
+ // Add preference change observer
+ try
+ {
+ branch.QueryInterface(Ci.nsIPrefBranch2).addObserver("", Prefs, true);
+ onShutdown.add(function() branch.removeObserver("", Prefs));
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ }
+}
+
+/**
+ * Sets up getter/setter on Prefs object for preference.
+ */
+function defineProperty(/**String*/ name, defaultValue, /**Function*/ readFunc, /**Function*/ writeFunc)
+{
+ let value = defaultValue;
+ Prefs["_update_" + name] = function()
+ {
+ try
+ {
+ value = readFunc(branch, name);
+ triggerListeners(name);
+ }
+ catch(e)
+ {
+ Cu.reportError(e);
+ }
+ };
+ Prefs.__defineGetter__(name, function() value);
+ Prefs.__defineSetter__(name, function(newValue)
+ {
+ if (value == newValue)
+ return value;
+
+ try
+ {
+ ignorePrefChanges = true;
+ writeFunc(branch, name, newValue);
+ value = newValue;
+ Services.prefs.savePrefFile(null);
+ triggerListeners(name);
+ }
+ catch(e)
+ {
+ Cu.reportError(e);
+ }
+ finally
+ {
+ ignorePrefChanges = false;
+ }
+ return value;
+ });
+ Prefs["_update_" + name]();
+}
+
+let listeners = [];
+function triggerListeners(/**String*/ name)
+{
+ for (let i = 0; i < listeners.length; i++)
+ {
+ try
+ {
+ listeners[i](name);
+ }
+ catch(e)
+ {
+ Cu.reportError(e);
+ }
+ }
+}
+
+/**
+ * Manages the preferences for an extension, object properties corresponding
+ * to extension's preferences are added automatically. Setting the property
+ * will automatically change the preference, external preference changes are
+ * also recognized automatically.
+ */
+let Prefs = exports.Prefs =
+{
+ /**
+ * Migrates an old preference to a new name.
+ */
+ migrate: function(/**String*/ oldName, /**String*/ newName)
+ {
+ if (newName in this && Services.prefs.prefHasUserValue(oldName))
+ {
+ let [getter, setter] = typeMap[typeof this[newName]];
+ try
+ {
+ this[newName] = getter(Services.prefs, oldName);
+ } catch(e) {}
+ Services.prefs.clearUserPref(oldName);
+ }
+ },
+
+ /**
+ * Adds a preferences listener that will be fired whenever a preference
+ * changes.
+ */
+ addListener: function(/**Function*/ listener)
+ {
+ if (listeners.indexOf(listener) < 0)
+ listeners.push(listener);
+ },
+
+ /**
+ * Removes a preferences listener.
+ */
+ removeListener: function(/**Function*/ listener)
+ {
+ let index = listeners.indexOf(listener);
+ if (index >= 0)
+ listeners.splice(index, 1);
+ },
+
+ observe: function(subject, topic, data)
+ {
+ if (ignorePrefChanges || topic != "nsPref:changed")
+ return;
+
+ if ("_update_" + data in this)
+ this["_update_" + data]();
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver])
+};
+
+// Getter/setter functions for difference preference types
+let typeMap =
+{
+ boolean: [getBoolPref, setBoolPref],
+ number: [getIntPref, setIntPref],
+ string: [getCharPref, setCharPref],
+ object: [getJSONPref, setJSONPref]
+};
+
+function getIntPref(branch, pref) branch.getIntPref(pref)
+function setIntPref(branch, pref, newValue) branch.setIntPref(pref, newValue)
+
+function getBoolPref(branch, pref) branch.getBoolPref(pref)
+function setBoolPref(branch, pref, newValue) branch.setBoolPref(pref, newValue)
+
+function getCharPref(branch, pref) branch.getComplexValue(pref, Ci.nsISupportsString).data
+function setCharPref(branch, pref, newValue)
+{
+ let str = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
+ str.data = newValue;
+ branch.setComplexValue(pref, Ci.nsISupportsString, str);
+}
+
+function getJSONPref(branch, pref) JSON.parse(getCharPref(branch, pref))
+function setJSONPref(branch, pref, newValue) setCharPref(branch, pref, JSON.stringify(newValue))
+
+init();
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/requestNotifier.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/requestNotifier.js
new file mode 100644
index 0000000..2ee9ec3
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/requestNotifier.js
@@ -0,0 +1,378 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Stores Adblock Plus data to be attached to a window.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {Utils} = require("utils");
+let {BlockingFilter, WhitelistFilter, ElemHideBase, ElemHideFilter, ElemHideException} = require("filterClasses");
+
+let nodeData = new WeakMap();
+let windowStats = new WeakMap();
+let windowSelection = new WeakMap();
+
+let setEntry, hasEntry, getEntry;
+// Last issue(Bug 982561) preventing us from using WeakMap fixed for FF version 32
+if (Services.vc.compare(Utils.platformVersion, "32.0a1") >= 0)
+{
+ setEntry = (map, key, value) => map.set(key, value);
+ hasEntry = (map, key) => map.has(key);
+ getEntry = (map, key) => map.get(key);
+}
+else
+{
+ // Fall back to user data
+ let dataSeed = Math.random();
+ let nodeDataProp = "abpNodeData" + dataSeed;
+ let windowStatsProp = "abpWindowStats" + dataSeed;
+ let windowSelectionProp = "abpWindowSelection" + dataSeed;
+ let getProp = function(map)
+ {
+ switch (map)
+ {
+ case nodeData:
+ return nodeDataProp;
+ case windowStats:
+ return windowStatsProp;
+ case windowSelection:
+ return windowSelectionProp;
+ default:
+ return null;
+ }
+ };
+
+ setEntry = (map, key, value) => key.setUserData(getProp(map), value, null);
+ hasEntry = (map, key) => key.getUserData(getProp(map));
+ getEntry = (map, key) => key.getUserData(getProp(map)) || undefined;
+}
+
+/**
+ * List of notifiers in use - these notifiers need to receive notifications on
+ * new requests.
+ * @type RequestNotifier[]
+ */
+let activeNotifiers = [];
+
+/**
+ * Creates a notifier object for a particular window. After creation the window
+ * will first be scanned for previously saved requests. Once that scan is
+ * complete only new requests for this window will be reported.
+ * @param {Window} wnd window to attach the notifier to
+ * @param {Function} listener listener to be called whenever a new request is found
+ * @param {Object} [listenerObj] "this" pointer to be used when calling the listener
+ */
+function RequestNotifier(wnd, listener, listenerObj)
+{
+ this.window = wnd;
+ this.listener = listener;
+ this.listenerObj = listenerObj || null;
+ activeNotifiers.push(this);
+ if (wnd)
+ this.startScan(wnd);
+ else
+ this.scanComplete = true;
+}
+exports.RequestNotifier = RequestNotifier;
+
+RequestNotifier.prototype =
+{
+ /**
+ * The window this notifier is associated with.
+ * @type Window
+ */
+ window: null,
+
+ /**
+ * The listener to be called when a new request is found.
+ * @type Function
+ */
+ listener: null,
+
+ /**
+ * "this" pointer to be used when calling the listener.
+ * @type Object
+ */
+ listenerObj: null,
+
+ /**
+ * Will be set to true once the initial window scan is complete.
+ * @type Boolean
+ */
+ scanComplete: false,
+
+ /**
+ * Shuts down the notifier once it is no longer used. The listener
+ * will no longer be called after that.
+ */
+ shutdown: function()
+ {
+ delete this.window;
+ delete this.listener;
+ delete this.listenerObj;
+
+ for (let i = activeNotifiers.length - 1; i >= 0; i--)
+ if (activeNotifiers[i] == this)
+ activeNotifiers.splice(i, 1);
+ },
+
+ /**
+ * Notifies listener about a new request.
+ */
+ notifyListener: function(/**Window*/ wnd, /**Node*/ node, /**RequestEntry*/ entry)
+ {
+ this.listener.call(this.listenerObj, wnd, node, entry, this.scanComplete);
+ },
+
+ /**
+ * Number of currently posted scan events (will be 0 when the scan finishes
+ * running).
+ */
+ eventsPosted: 0,
+
+ /**
+ * Starts the initial scan of the window (will recurse into frames).
+ * @param {Window} wnd the window to be scanned
+ */
+ startScan: function(wnd)
+ {
+ let doc = wnd.document;
+ let walker = doc.createTreeWalker(doc, Ci.nsIDOMNodeFilter.SHOW_ELEMENT, null, false);
+
+ let process = function()
+ {
+ if (!this.listener)
+ return;
+
+ let node = walker.currentNode;
+ let data = getEntry(nodeData, node);
+ if (typeof data != "undefined")
+ for (let k in data)
+ this.notifyListener(wnd, node, data[k]);
+
+ if (walker.nextNode())
+ Utils.runAsync(process);
+ else
+ {
+ // Done with the current window, start the scan for its frames
+ for (let i = 0; i < wnd.frames.length; i++)
+ this.startScan(wnd.frames[i]);
+
+ this.eventsPosted--;
+ if (!this.eventsPosted)
+ {
+ this.scanComplete = true;
+ this.notifyListener(wnd, null, null);
+ }
+ }
+ }.bind(this);
+
+ // Process each node in a separate event to allow other events to process
+ this.eventsPosted++;
+ Utils.runAsync(process);
+ }
+};
+
+RequestNotifier.storeSelection = function(/**Window*/ wnd, /**String*/ selection)
+{
+ setEntry(windowSelection, wnd.document, selection);
+};
+RequestNotifier.getSelection = function(/**Window*/ wnd) /**String*/
+{
+ if (hasEntry(windowSelection, wnd.document))
+ return getEntry(windowSelection, wnd.document);
+ else
+ return null;
+};
+
+/**
+ * Attaches request data to a DOM node.
+ * @param {Node} node node to attach data to
+ * @param {Window} topWnd top-level window the node belongs to
+ * @param {Integer} contentType request type, one of the Policy.type.* constants
+ * @param {String} docDomain domain of the document that initiated the request
+ * @param {Boolean} thirdParty will be true if a third-party server has been requested
+ * @param {String} location the address that has been requested
+ * @param {Filter} filter filter applied to the request or null if none
+ */
+RequestNotifier.addNodeData = function(/**Node*/ node, /**Window*/ topWnd, /**Integer*/ contentType, /**String*/ docDomain, /**Boolean*/ thirdParty, /**String*/ location, /**Filter*/ filter)
+{
+ return new RequestEntry(node, topWnd, contentType, docDomain, thirdParty, location, filter);
+}
+
+/**
+ * Retrieves the statistics for a window.
+ * @result {Object} Object with the properties items, blocked, whitelisted, hidden, filters containing statistics for the window (might be null)
+ */
+RequestNotifier.getWindowStatistics = function(/**Window*/ wnd)
+{
+ if (hasEntry(windowStats, wnd.document))
+ return getEntry(windowStats, wnd.document);
+ else
+ return null;
+}
+
+/**
+ * Retrieves the request entry associated with a DOM node.
+ * @param {Node} node
+ * @param {Boolean} noParent if missing or false, the search will extend to the parent nodes until one is found that has data associated with it
+ * @param {Integer} [type] request type to be looking for
+ * @param {String} [location] request location to be looking for
+ * @result {[Node, RequestEntry]}
+ * @static
+ */
+RequestNotifier.getDataForNode = function(node, noParent, type, location)
+{
+ while (node)
+ {
+ let data = getEntry(nodeData, node);
+ if (typeof data != "undefined")
+ {
+ // Look for matching entry
+ for (let k in data)
+ {
+ let entry = data[k];
+ if ((typeof type == "undefined" || entry.type == type) &&
+ (typeof location == "undefined" || entry.location == location))
+ {
+ return [node, entry];
+ }
+ }
+ }
+
+ // If we don't have any match on this node then maybe its parent will do
+ if ((typeof noParent != "boolean" || !noParent) &&
+ node.parentNode instanceof Ci.nsIDOMElement)
+ {
+ node = node.parentNode;
+ }
+ else
+ {
+ node = null;
+ }
+ }
+
+ return null;
+};
+
+function RequestEntry(node, topWnd, contentType, docDomain, thirdParty, location, filter)
+{
+ this.type = contentType;
+ this.docDomain = docDomain;
+ this.thirdParty = thirdParty;
+ this.location = location;
+ this.filter = filter;
+
+ this.attachToNode(node);
+
+ // Update window statistics
+ if (!hasEntry(windowStats, topWnd.document))
+ {
+ setEntry(windowStats, topWnd.document, {
+ items: 0,
+ hidden: 0,
+ blocked: 0,
+ whitelisted: 0,
+ filters: {}
+ });
+ }
+
+ let stats = getEntry(windowStats, topWnd.document);
+ if (!filter || !(filter instanceof ElemHideBase))
+ stats.items++;
+ if (filter)
+ {
+ if (filter instanceof BlockingFilter)
+ stats.blocked++;
+ else if (filter instanceof WhitelistFilter || filter instanceof ElemHideException)
+ stats.whitelisted++;
+ else if (filter instanceof ElemHideFilter)
+ stats.hidden++;
+
+ if (filter.text in stats.filters)
+ stats.filters[filter.text]++;
+ else
+ stats.filters[filter.text] = 1;
+ }
+
+ // Notify listeners
+ for (let notifier of activeNotifiers)
+ if (!notifier.window || notifier.window == topWnd)
+ notifier.notifyListener(topWnd, node, this);
+}
+RequestEntry.prototype =
+{
+ /**
+ * Content type of the request (one of the nsIContentPolicy constants)
+ * @type Integer
+ */
+ type: null,
+ /**
+ * Domain name of the requesting document
+ * @type String
+ */
+ docDomain: null,
+ /**
+ * True if the request goes to a different domain than the domain of the containing document
+ * @type Boolean
+ */
+ thirdParty: false,
+ /**
+ * Address being requested
+ * @type String
+ */
+ location: null,
+ /**
+ * Filter that was applied to this request (if any)
+ * @type Filter
+ */
+ filter: null,
+ /**
+ * String representation of the content type, e.g. "subdocument"
+ * @type String
+ */
+ get typeDescr()
+ {
+ return require("contentPolicy").Policy.typeDescr[this.type];
+ },
+ /**
+ * User-visible localized representation of the content type, e.g. "frame"
+ * @type String
+ */
+ get localizedDescr()
+ {
+ return require("contentPolicy").Policy.localizedDescr[this.type];
+ },
+
+ /**
+ * Attaches this request object to a DOM node.
+ */
+ attachToNode: function(/**Node*/ node)
+ {
+ let existingData = getEntry(nodeData, node);
+ if (typeof existingData == "undefined")
+ {
+ existingData = {};
+ setEntry(nodeData, node, existingData);
+ }
+
+ // Add this request to the node data
+ existingData[this.type + " " + this.location] = this;
+ }
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/subscriptionClasses.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/subscriptionClasses.js
new file mode 100644
index 0000000..13dceaf
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/subscriptionClasses.js
@@ -0,0 +1,597 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Definition of Subscription class and its subclasses.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {ActiveFilter, BlockingFilter, WhitelistFilter, ElemHideBase} = require("filterClasses");
+let {FilterNotifier} = require("filterNotifier");
+
+/**
+ * Abstract base class for filter subscriptions
+ *
+ * @param {String} url download location of the subscription
+ * @param {String} [title] title of the filter subscription
+ * @constructor
+ */
+function Subscription(url, title)
+{
+ this.url = url;
+ this.filters = [];
+ if (title)
+ this._title = title;
+ else
+ {
+ let {Utils} = require("utils");
+ this._title = Utils.getString("newGroup_title");
+ }
+ Subscription.knownSubscriptions[url] = this;
+}
+exports.Subscription = Subscription;
+
+Subscription.prototype =
+{
+ /**
+ * Download location of the subscription
+ * @type String
+ */
+ url: null,
+
+ /**
+ * Filters contained in the filter subscription
+ * @type Array of Filter
+ */
+ filters: null,
+
+ _title: null,
+ _fixedTitle: false,
+ _disabled: false,
+
+ /**
+ * Title of the filter subscription
+ * @type String
+ */
+ get title()
+ {
+ return this._title;
+ },
+ set title(value)
+ {
+ if (value != this._title)
+ {
+ let oldValue = this._title;
+ this._title = value;
+ FilterNotifier.triggerListeners("subscription.title", this, value, oldValue);
+ }
+ return this._title;
+ },
+
+ /**
+ * Determines whether the title should be editable
+ * @type Boolean
+ */
+ get fixedTitle()
+ {
+ return this._fixedTitle;
+ },
+ set fixedTitle(value)
+ {
+ if (value != this._fixedTitle)
+ {
+ let oldValue = this._fixedTitle;
+ this._fixedTitle = value;
+ FilterNotifier.triggerListeners("subscription.fixedTitle", this, value, oldValue);
+ }
+ return this._fixedTitle;
+ },
+
+ /**
+ * Defines whether the filters in the subscription should be disabled
+ * @type Boolean
+ */
+ get disabled()
+ {
+ return this._disabled;
+ },
+ set disabled(value)
+ {
+ if (value != this._disabled)
+ {
+ let oldValue = this._disabled;
+ this._disabled = value;
+ FilterNotifier.triggerListeners("subscription.disabled", this, value, oldValue);
+ }
+ return this._disabled;
+ },
+
+ /**
+ * Serializes the filter to an array of strings for writing out on the disk.
+ * @param {Array of String} buffer buffer to push the serialization results into
+ */
+ serialize: function(buffer)
+ {
+ buffer.push("[Subscription]");
+ buffer.push("url=" + this.url);
+ buffer.push("title=" + this._title);
+ if (this._fixedTitle)
+ buffer.push("fixedTitle=true");
+ if (this._disabled)
+ buffer.push("disabled=true");
+ },
+
+ serializeFilters: function(buffer)
+ {
+ for (let filter of this.filters)
+ buffer.push(filter.text.replace(/\[/g, "\\["));
+ },
+
+ toString: function()
+ {
+ let buffer = [];
+ this.serialize(buffer);
+ return buffer.join("\n");
+ }
+};
+
+/**
+ * Cache for known filter subscriptions, maps URL to subscription objects.
+ * @type Object
+ */
+Subscription.knownSubscriptions = {__proto__: null};
+
+/**
+ * Returns a subscription from its URL, creates a new one if necessary.
+ * @param {String} url URL of the subscription
+ * @return {Subscription} subscription or null if the subscription couldn't be created
+ */
+Subscription.fromURL = function(url)
+{
+ if (url in Subscription.knownSubscriptions)
+ return Subscription.knownSubscriptions[url];
+
+ try
+ {
+ // Test URL for validity
+ url = Services.io.newURI(url, null, null).spec;
+ return new DownloadableSubscription(url, null);
+ }
+ catch (e)
+ {
+ return new SpecialSubscription(url);
+ }
+}
+
+/**
+ * Deserializes a subscription
+ *
+ * @param {Object} obj map of serialized properties and their values
+ * @return {Subscription} subscription or null if the subscription couldn't be created
+ */
+Subscription.fromObject = function(obj)
+{
+ let result;
+ try
+ {
+ obj.url = Services.io.newURI(obj.url, null, null).spec;
+
+ // URL is valid - this is a downloadable subscription
+ result = new DownloadableSubscription(obj.url, obj.title);
+ if ("downloadStatus" in obj)
+ result._downloadStatus = obj.downloadStatus;
+ if ("lastSuccess" in obj)
+ result.lastSuccess = parseInt(obj.lastSuccess) || 0;
+ if ("lastCheck" in obj)
+ result._lastCheck = parseInt(obj.lastCheck) || 0;
+ if ("expires" in obj)
+ result.expires = parseInt(obj.expires) || 0;
+ if ("softExpiration" in obj)
+ result.softExpiration = parseInt(obj.softExpiration) || 0;
+ if ("errors" in obj)
+ result._errors = parseInt(obj.errors) || 0;
+ if ("version" in obj)
+ result.version = parseInt(obj.version) || 0;
+ if ("requiredVersion" in obj)
+ {
+ let {addonVersion} = require("info");
+ result.requiredVersion = obj.requiredVersion;
+ if (Services.vc.compare(result.requiredVersion, addonVersion) > 0)
+ result.upgradeRequired = true;
+ }
+ if ("homepage" in obj)
+ result._homepage = obj.homepage;
+ if ("lastDownload" in obj)
+ result._lastDownload = parseInt(obj.lastDownload) || 0;
+ }
+ catch (e)
+ {
+ // Invalid URL - custom filter group
+ if (!("title" in obj))
+ {
+ // Backwards compatibility - titles and filter types were originally
+ // determined by group identifier.
+ if (obj.url == "~wl~")
+ obj.defaults = "whitelist";
+ else if (obj.url == "~fl~")
+ obj.defaults = "blocking";
+ else if (obj.url == "~eh~")
+ obj.defaults = "elemhide";
+ if ("defaults" in obj)
+ {
+ let {Utils} = require("utils");
+ obj.title = Utils.getString(obj.defaults + "Group_title");
+ }
+ }
+ result = new SpecialSubscription(obj.url, obj.title);
+ if ("defaults" in obj)
+ result.defaults = obj.defaults.split(" ");
+ }
+ if ("fixedTitle" in obj)
+ result._fixedTitle = (obj.fixedTitle == "true");
+ if ("privateMode" in obj)
+ result.privateMode = (obj.privateMode == "true");
+ if ("disabled" in obj)
+ result._disabled = (obj.disabled == "true");
+
+ return result;
+}
+
+/**
+ * Class for special filter subscriptions (user's filters)
+ * @param {String} url see Subscription()
+ * @param {String} [title] see Subscription()
+ * @constructor
+ * @augments Subscription
+ */
+function SpecialSubscription(url, title)
+{
+ Subscription.call(this, url, title);
+}
+exports.SpecialSubscription = SpecialSubscription;
+
+SpecialSubscription.prototype =
+{
+ __proto__: Subscription.prototype,
+
+ /**
+ * Filter types that should be added to this subscription by default
+ * (entries should correspond to keys in SpecialSubscription.defaultsMap).
+ * @type Array of String
+ */
+ defaults: null,
+
+ /**
+ * Tests whether a filter should be added to this group by default
+ * @param {Filter} filter filter to be tested
+ * @return {Boolean}
+ */
+ isDefaultFor: function(filter)
+ {
+ if (this.defaults && this.defaults.length)
+ {
+ for (let type of this.defaults)
+ {
+ if (filter instanceof SpecialSubscription.defaultsMap[type])
+ return true;
+ if (!(filter instanceof ActiveFilter) && type == "blacklist")
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ /**
+ * See Subscription.serialize()
+ */
+ serialize: function(buffer)
+ {
+ Subscription.prototype.serialize.call(this, buffer);
+ if (this.defaults && this.defaults.length)
+ buffer.push("defaults=" + this.defaults.filter((type) => type in SpecialSubscription.defaultsMap).join(" "));
+ if (this._lastDownload)
+ buffer.push("lastDownload=" + this._lastDownload);
+ }
+};
+
+SpecialSubscription.defaultsMap = {
+ __proto__: null,
+ "whitelist": WhitelistFilter,
+ "blocking": BlockingFilter,
+ "elemhide": ElemHideBase
+};
+
+/**
+ * Creates a new user-defined filter group.
+ * @param {String} [title] title of the new filter group
+ * @result {SpecialSubscription}
+ */
+SpecialSubscription.create = function(title)
+{
+ let url;
+ do
+ {
+ url = "~user~" + Math.round(Math.random()*1000000);
+ } while (url in Subscription.knownSubscriptions);
+ return new SpecialSubscription(url, title)
+};
+
+/**
+ * Creates a new user-defined filter group and adds the given filter to it.
+ * This group will act as the default group for this filter type.
+ */
+SpecialSubscription.createForFilter = function(/**Filter*/ filter) /**SpecialSubscription*/
+{
+ let subscription = SpecialSubscription.create();
+ subscription.filters.push(filter);
+ for (let type in SpecialSubscription.defaultsMap)
+ {
+ if (filter instanceof SpecialSubscription.defaultsMap[type])
+ subscription.defaults = [type];
+ }
+ if (!subscription.defaults)
+ subscription.defaults = ["blocking"];
+
+ let {Utils} = require("utils");
+ subscription.title = Utils.getString(subscription.defaults[0] + "Group_title");
+ return subscription;
+};
+
+/**
+ * Abstract base class for regular filter subscriptions (both internally and externally updated)
+ * @param {String} url see Subscription()
+ * @param {String} [title] see Subscription()
+ * @constructor
+ * @augments Subscription
+ */
+function RegularSubscription(url, title)
+{
+ Subscription.call(this, url, title || url);
+}
+exports.RegularSubscription = RegularSubscription;
+
+RegularSubscription.prototype =
+{
+ __proto__: Subscription.prototype,
+
+ _homepage: null,
+ _lastDownload: 0,
+
+ /**
+ * Filter subscription homepage if known
+ * @type String
+ */
+ get homepage()
+ {
+ return this._homepage;
+ },
+ set homepage(value)
+ {
+ if (value != this._homepage)
+ {
+ let oldValue = this._homepage;
+ this._homepage = value;
+ FilterNotifier.triggerListeners("subscription.homepage", this, value, oldValue);
+ }
+ return this._homepage;
+ },
+
+ /**
+ * Time of the last subscription download (in seconds since the beginning of the epoch)
+ * @type Number
+ */
+ get lastDownload()
+ {
+ return this._lastDownload;
+ },
+ set lastDownload(value)
+ {
+ if (value != this._lastDownload)
+ {
+ let oldValue = this._lastDownload;
+ this._lastDownload = value;
+ FilterNotifier.triggerListeners("subscription.lastDownload", this, value, oldValue);
+ }
+ return this._lastDownload;
+ },
+
+ /**
+ * See Subscription.serialize()
+ */
+ serialize: function(buffer)
+ {
+ Subscription.prototype.serialize.call(this, buffer);
+ if (this._homepage)
+ buffer.push("homepage=" + this._homepage);
+ if (this._lastDownload)
+ buffer.push("lastDownload=" + this._lastDownload);
+ }
+};
+
+/**
+ * Class for filter subscriptions updated by externally (by other extension)
+ * @param {String} url see Subscription()
+ * @param {String} [title] see Subscription()
+ * @constructor
+ * @augments RegularSubscription
+ */
+function ExternalSubscription(url, title)
+{
+ RegularSubscription.call(this, url, title);
+}
+exports.ExternalSubscription = ExternalSubscription;
+
+ExternalSubscription.prototype =
+{
+ __proto__: RegularSubscription.prototype,
+
+ /**
+ * See Subscription.serialize()
+ */
+ serialize: function(buffer)
+ {
+ throw new Error("Unexpected call, external subscriptions should not be serialized");
+ }
+};
+
+/**
+ * Class for filter subscriptions updated by externally (by other extension)
+ * @param {String} url see Subscription()
+ * @param {String} [title] see Subscription()
+ * @constructor
+ * @augments RegularSubscription
+ */
+function DownloadableSubscription(url, title)
+{
+ RegularSubscription.call(this, url, title);
+}
+exports.DownloadableSubscription = DownloadableSubscription;
+
+DownloadableSubscription.prototype =
+{
+ __proto__: RegularSubscription.prototype,
+
+ _downloadStatus: null,
+ _lastCheck: 0,
+ _errors: 0,
+
+ /**
+ * Status of the last download (ID of a string)
+ * @type String
+ */
+ get downloadStatus()
+ {
+ return this._downloadStatus;
+ },
+ set downloadStatus(value)
+ {
+ let oldValue = this._downloadStatus;
+ this._downloadStatus = value;
+ FilterNotifier.triggerListeners("subscription.downloadStatus", this, value, oldValue);
+ return this._downloadStatus;
+ },
+
+ /**
+ * Time of the last successful download (in seconds since the beginning of the
+ * epoch).
+ */
+ lastSuccess: 0,
+
+ /**
+ * Time when the subscription was considered for an update last time (in seconds
+ * since the beginning of the epoch). This will be used to increase softExpiration
+ * if the user doesn't use Adblock Plus for some time.
+ * @type Number
+ */
+ get lastCheck()
+ {
+ return this._lastCheck;
+ },
+ set lastCheck(value)
+ {
+ if (value != this._lastCheck)
+ {
+ let oldValue = this._lastCheck;
+ this._lastCheck = value;
+ FilterNotifier.triggerListeners("subscription.lastCheck", this, value, oldValue);
+ }
+ return this._lastCheck;
+ },
+
+ /**
+ * Hard expiration time of the filter subscription (in seconds since the beginning of the epoch)
+ * @type Number
+ */
+ expires: 0,
+
+ /**
+ * Soft expiration time of the filter subscription (in seconds since the beginning of the epoch)
+ * @type Number
+ */
+ softExpiration: 0,
+
+ /**
+ * Number of download failures since last success
+ * @type Number
+ */
+ get errors()
+ {
+ return this._errors;
+ },
+ set errors(value)
+ {
+ if (value != this._errors)
+ {
+ let oldValue = this._errors;
+ this._errors = value;
+ FilterNotifier.triggerListeners("subscription.errors", this, value, oldValue);
+ }
+ return this._errors;
+ },
+
+ /**
+ * Version of the subscription data retrieved on last successful download
+ * @type Number
+ */
+ version: 0,
+
+ /**
+ * Minimal Adblock Plus version required for this subscription
+ * @type String
+ */
+ requiredVersion: null,
+
+ /**
+ * Should be true if requiredVersion is higher than current Adblock Plus version
+ * @type Boolean
+ */
+ upgradeRequired: false,
+
+ /**
+ * Should be true if the Privatemode: header is set to true in the subscription
+ * @type Boolean
+ */
+ privateMode: false,
+
+ /**
+ * See Subscription.serialize()
+ */
+ serialize: function(buffer)
+ {
+ RegularSubscription.prototype.serialize.call(this, buffer);
+ if (this.downloadStatus)
+ buffer.push("downloadStatus=" + this.downloadStatus);
+ if (this.lastSuccess)
+ buffer.push("lastSuccess=" + this.lastSuccess);
+ if (this.lastCheck)
+ buffer.push("lastCheck=" + this.lastCheck);
+ if (this.expires)
+ buffer.push("expires=" + this.expires);
+ if (this.softExpiration)
+ buffer.push("softExpiration=" + this.softExpiration);
+ if (this.errors)
+ buffer.push("errors=" + this.errors);
+ if (this.version)
+ buffer.push("version=" + this.version);
+ if (this.requiredVersion)
+ buffer.push("requiredVersion=" + this.requiredVersion);
+ if (this.privateMode)
+ buffer.push("privateMode=" + this.privateMode);
+ }
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/sync.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/sync.js
new file mode 100644
index 0000000..05eeced
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/sync.js
@@ -0,0 +1,459 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Firefox Sync integration
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {FilterStorage} = require("filterStorage");
+let {FilterNotifier} = require("filterNotifier");
+let {Synchronizer} = require("synchronizer");
+let {Subscription, SpecialSubscription, DownloadableSubscription, ExternalSubscription} = require("subscriptionClasses");
+let {Filter, ActiveFilter} = require("filterClasses");
+
+// Firefox Sync classes are set later in initEngine()
+let Service, Engines, SyncEngine, Store, Tracker;
+
+/**
+ * ID of the only record stored
+ * @type String
+ */
+let filtersRecordID = "6fad6286-8207-46b6-aa39-8e0ce0bd7c49";
+
+let Sync = exports.Sync =
+{
+ /**
+ * Will be set to true if/when Weave starts up.
+ * @type Boolean
+ */
+ initialized: false,
+
+ /**
+ * Whether Weave requested us to track changes.
+ * @type Boolean
+ */
+ trackingEnabled: false,
+
+ /**
+ * Returns Adblock Plus sync engine.
+ * @result Engine
+ */
+ getEngine: function()
+ {
+ if (this.initialized)
+ return Engines.get("adblockplus");
+ else
+ return null;
+ }
+};
+
+/**
+ * Listens to notifications from Sync service.
+ */
+let SyncServiceObserver =
+{
+ init: function()
+ {
+ try
+ {
+ let {Status, STATUS_DISABLED, CLIENT_NOT_CONFIGURED} = Cu.import("resource://services-sync/status.js", null);
+ Sync.initialized = Status.ready;
+ Sync.trackingEnabled = (Status.service != STATUS_DISABLED && Status.service != CLIENT_NOT_CONFIGURED);
+ }
+ catch (e)
+ {
+ return;
+ }
+
+ if (Sync.initialized)
+ this.initEngine();
+ else
+ Services.obs.addObserver(this, "weave:service:ready", true);
+ Services.obs.addObserver(this, "weave:engine:start-tracking", true);
+ Services.obs.addObserver(this, "weave:engine:stop-tracking", true);
+
+ onShutdown.add(function()
+ {
+ try
+ {
+ Services.obs.removeObserver(this, "weave:service:ready");
+ } catch (e) {}
+ Services.obs.removeObserver(this, "weave:engine:start-tracking");
+ Services.obs.removeObserver(this, "weave:engine:stop-tracking");
+ }.bind(this));
+ },
+
+ initEngine: function()
+ {
+ ({Engines, SyncEngine, Store, Tracker} = Cu.import("resource://services-sync/engines.js"));
+ if (typeof Engines == "undefined")
+ {
+ ({Service} = Cu.import("resource://services-sync/service.js"));
+ Engines = Service.engineManager;
+ }
+
+ ABPEngine.prototype.__proto__ = SyncEngine.prototype;
+ ABPStore.prototype.__proto__ = Store.prototype;
+ ABPTracker.prototype.__proto__ = Tracker.prototype;
+
+ Engines.register(ABPEngine);
+ onShutdown.add(function()
+ {
+ Engines.unregister("adblockplus");
+ });
+ },
+
+ observe: function(subject, topic, data)
+ {
+ switch (topic)
+ {
+ case "weave:service:ready":
+ if (Sync.initialized)
+ return;
+
+ this.initEngine();
+ Sync.initialized = true;
+ break;
+ case "weave:engine:start-tracking":
+ Sync.trackingEnabled = true;
+ if (trackerInstance)
+ trackerInstance.startTracking();
+ break;
+ case "weave:engine:stop-tracking":
+ Sync.trackingEnabled = false;
+ if (trackerInstance)
+ trackerInstance.stopTracking();
+ break;
+ }
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
+};
+
+function ABPEngine()
+{
+ SyncEngine.call(this, "AdblockPlus", Service);
+}
+ABPEngine.prototype =
+{
+ _storeObj: ABPStore,
+ _trackerObj: ABPTracker,
+ version: 1,
+
+ _reconcile: function(item)
+ {
+ // Always process server data, we will do the merging ourselves
+ return true;
+ }
+};
+
+function ABPStore(name, engine)
+{
+ Store.call(this, name, engine);
+}
+ABPStore.prototype =
+{
+ getAllIDs: function()
+ {
+ let result = {}
+ result[filtersRecordID] = true;
+ return result;
+ },
+
+ changeItemID: function(oldId, newId)
+ {
+ // This should not be called, our engine doesn't implement _findDupe
+ throw Cr.NS_ERROR_UNEXPECTED;
+ },
+
+ itemExists: function(id)
+ {
+ // Only one id exists so far
+ return (id == filtersRecordID);
+ },
+
+ createRecord: function(id, collection)
+ {
+ let record = new ABPEngine.prototype._recordObj(collection, id);
+ if (id == filtersRecordID)
+ {
+ record.cleartext = {
+ id: id,
+ subscriptions: [],
+ };
+ for (let subscription of FilterStorage.subscriptions)
+ {
+ if (subscription instanceof ExternalSubscription)
+ continue;
+
+ let subscriptionEntry =
+ {
+ url: subscription.url,
+ disabled: subscription.disabled
+ };
+ if (subscription instanceof SpecialSubscription)
+ {
+ subscriptionEntry.filters = [];
+ for (let filter of subscription.filters)
+ {
+ let filterEntry = {text: filter.text};
+ if (filter instanceof ActiveFilter)
+ filterEntry.disabled = filter.disabled;
+ subscriptionEntry.filters.push(filterEntry);
+ }
+ }
+ else
+ subscriptionEntry.title = subscription.title;
+ record.cleartext.subscriptions.push(subscriptionEntry);
+ }
+
+ // Data sent, forget about local changes now
+ trackerInstance.clearPrivateChanges()
+ }
+ else
+ record.deleted = true;
+
+ return record;
+ },
+
+ create: function(record)
+ {
+ // This should not be called because our record list doesn't change but
+ // call update just in case.
+ this.update(record);
+ },
+
+ update: function(record)
+ {
+ if (record.id != filtersRecordID)
+ return;
+
+ this._log.trace("Merging in remote data");
+
+ let data = record.cleartext.subscriptions;
+
+ // First make sure we have the same subscriptions on both sides
+ let seenSubscription = {__proto__: null};
+ for (let remoteSubscription of data)
+ {
+ seenSubscription[remoteSubscription.url] = true;
+ if (remoteSubscription.url in FilterStorage.knownSubscriptions)
+ {
+ let subscription = FilterStorage.knownSubscriptions[remoteSubscription.url];
+ if (!trackerInstance.didSubscriptionChange(remoteSubscription))
+ {
+ // Only change local subscription if there were no changes, otherwise dismiss remote changes
+ subscription.disabled = remoteSubscription.disabled;
+ if (subscription instanceof DownloadableSubscription)
+ subscription.title = remoteSubscription.title;
+ }
+ }
+ else if (!trackerInstance.didSubscriptionChange(remoteSubscription))
+ {
+ // Subscription was added remotely, add it locally as well
+ let subscription = Subscription.fromURL(remoteSubscription.url);
+ if (!subscription)
+ continue;
+
+ subscription.disabled = remoteSubscription.disabled;
+ if (subscription instanceof DownloadableSubscription)
+ {
+ subscription.title = remoteSubscription.title;
+ FilterStorage.addSubscription(subscription);
+ Synchronizer.execute(subscription);
+ }
+ }
+ }
+
+ for (let subscription of FilterStorage.subscriptions.slice())
+ {
+ if (!(subscription.url in seenSubscription) && subscription instanceof DownloadableSubscription && !trackerInstance.didSubscriptionChange(subscription))
+ {
+ // Subscription was removed remotely, remove it locally as well
+ FilterStorage.removeSubscription(subscription);
+ }
+ }
+
+ // Now sync the custom filters
+ let seenFilter = {__proto__: null};
+ for (let remoteSubscription of data)
+ {
+ if (!("filters" in remoteSubscription))
+ continue;
+
+ for (let remoteFilter of remoteSubscription.filters)
+ {
+ seenFilter[remoteFilter.text] = true;
+
+ let filter = Filter.fromText(remoteFilter.text);
+ if (trackerInstance.didFilterChange(filter))
+ continue;
+
+ if (filter.subscriptions.some((subscription) => subscription instanceof SpecialSubscription))
+ {
+ // Filter might have been changed remotely
+ if (filter instanceof ActiveFilter)
+ filter.disabled = remoteFilter.disabled;
+ }
+ else
+ {
+ // Filter was added remotely, add it locally as well
+ FilterStorage.addFilter(filter);
+ }
+ }
+ }
+
+ for (let subscription of FilterStorage.subscriptions)
+ {
+ if (!(subscription instanceof SpecialSubscription))
+ continue;
+
+ for (let filter of subscription.filters.slice())
+ {
+ if (!(filter.text in seenFilter) && !trackerInstance.didFilterChange(filter))
+ {
+ // Filter was removed remotely, remove it locally as well
+ FilterStorage.removeFilter(filter);
+ }
+ }
+ }
+
+ // Merge done, forget about local changes now
+ trackerInstance.clearPrivateChanges()
+ },
+
+ remove: function(record)
+ {
+ // Shouldn't be called but if it is - ignore
+ },
+
+ wipe: function()
+ {
+ this._log.trace("Got wipe command, removing all data");
+
+ for (let subscription of FilterStorage.subscriptions.slice())
+ {
+ if (subscription instanceof DownloadableSubscription)
+ FilterStorage.removeSubscription(subscription);
+ else if (subscription instanceof SpecialSubscription)
+ {
+ for (let filter of subscription.filters.slice())
+ FilterStorage.removeFilter(filter);
+ }
+ }
+
+ // Data wiped, forget about local changes now
+ trackerInstance.clearPrivateChanges()
+ }
+};
+
+/**
+ * Hack to allow store to use the tracker - store tracker pointer globally.
+ */
+let trackerInstance = null;
+
+function ABPTracker(name, engine)
+{
+ Tracker.call(this, name, engine);
+
+ this.privateTracker = new Tracker(name + ".private", engine);
+ trackerInstance = this;
+
+ this.onChange = this.onChange.bind(this);
+
+ if (Sync.trackingEnabled)
+ this.startTracking();
+}
+ABPTracker.prototype =
+{
+ privateTracker: null,
+
+ startTracking: function()
+ {
+ FilterNotifier.addListener(this.onChange);
+ },
+
+ stopTracking: function()
+ {
+ FilterNotifier.removeListener(this.onChange);
+ },
+
+ clearPrivateChanges: function()
+ {
+ this.privateTracker.clearChangedIDs();
+ },
+
+ addPrivateChange: function(id)
+ {
+ // Ignore changes during syncing
+ if (this.ignoreAll)
+ return;
+
+ this.addChangedID(filtersRecordID);
+ this.privateTracker.addChangedID(id);
+ this.score += 10;
+ },
+
+ didSubscriptionChange: function(subscription)
+ {
+ return ("subscription " + subscription.url) in this.privateTracker.changedIDs;
+ },
+
+ didFilterChange: function(filter)
+ {
+ return ("filter " + filter.text) in this.privateTracker.changedIDs;
+ },
+
+ onChange: function(action, item)
+ {
+ switch (action)
+ {
+ case "subscription.updated":
+ if ("oldSubscription" in item)
+ {
+ // Subscription moved to a new address
+ this.addPrivateChange("subscription " + item.url);
+ this.addPrivateChange("subscription " + item.oldSubscription.url);
+ }
+ else if (item instanceof SpecialSubscription)
+ {
+ // User's filters changed via Preferences window
+ for (let filter of item.filters)
+ this.addPrivateChange("filter " + filter.text);
+ for (let filter of item.oldFilters)
+ this.addPrivateChange("filter " + filter.text);
+ }
+ break;
+ case "subscription.added":
+ case "subscription.removed":
+ case "subscription.disabled":
+ case "subscription.title":
+ this.addPrivateChange("subscription " + item.url);
+ break;
+ case "filter.added":
+ case "filter.removed":
+ case "filter.disabled":
+ this.addPrivateChange("filter " + item.text);
+ break;
+ }
+ }
+};
+
+SyncServiceObserver.init();
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/synchronizer.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/synchronizer.js
new file mode 100644
index 0000000..b9f9e29
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/synchronizer.js
@@ -0,0 +1,330 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Manages synchronization of filter subscriptions.
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {TimeLine} = require("timeline");
+let {Downloader, Downloadable,
+ MILLIS_IN_SECOND, MILLIS_IN_MINUTE, MILLIS_IN_HOUR, MILLIS_IN_DAY} = require("downloader");
+let {Filter, CommentFilter} = require("filterClasses");
+let {FilterStorage} = require("filterStorage");
+let {FilterNotifier} = require("filterNotifier");
+let {Prefs} = require("prefs");
+let {Subscription, DownloadableSubscription} = require("subscriptionClasses");
+let {Utils} = require("utils");
+
+let INITIAL_DELAY = 6 * MILLIS_IN_MINUTE;
+let CHECK_INTERVAL = 1 * MILLIS_IN_HOUR;
+let DEFAULT_EXPIRATION_INTERVAL = 5 * MILLIS_IN_DAY;
+
+/**
+ * The object providing actual downloading functionality.
+ * @type Downloader
+ */
+let downloader = null;
+
+/**
+ * This object is responsible for downloading filter subscriptions whenever
+ * necessary.
+ * @class
+ */
+let Synchronizer = exports.Synchronizer =
+{
+ /**
+ * Called on module startup.
+ */
+ init: function()
+ {
+ TimeLine.enter("Entered Synchronizer.init()");
+
+ downloader = new Downloader(this._getDownloadables.bind(this), INITIAL_DELAY, CHECK_INTERVAL);
+ onShutdown.add(function()
+ {
+ downloader.cancel();
+ });
+
+ downloader.onExpirationChange = this._onExpirationChange.bind(this);
+ downloader.onDownloadStarted = this._onDownloadStarted.bind(this);
+ downloader.onDownloadSuccess = this._onDownloadSuccess.bind(this);
+ downloader.onDownloadError = this._onDownloadError.bind(this);
+
+ TimeLine.leave("Synchronizer.init() done");
+ },
+
+ /**
+ * Checks whether a subscription is currently being downloaded.
+ * @param {String} url URL of the subscription
+ * @return {Boolean}
+ */
+ isExecuting: function(url)
+ {
+ return downloader.isDownloading(url);
+ },
+
+ /**
+ * Starts the download of a subscription.
+ * @param {DownloadableSubscription} subscription Subscription to be downloaded
+ * @param {Boolean} manual true for a manually started download (should not trigger fallback requests)
+ */
+ execute: function(subscription, manual)
+ {
+ downloader.download(this._getDownloadable(subscription, manual));
+ },
+
+ /**
+ * Yields Downloadable instances for all subscriptions that can be downloaded.
+ */
+ _getDownloadables: function()
+ {
+ if (!Prefs.subscriptions_autoupdate)
+ return;
+
+ for (let subscription of FilterStorage.subscriptions)
+ {
+ if (subscription instanceof DownloadableSubscription)
+ yield this._getDownloadable(subscription, false);
+ }
+ },
+
+ /**
+ * Creates a Downloadable instance for a subscription.
+ */
+ _getDownloadable: function(/**Subscription*/ subscription, /**Boolean*/ manual) /**Downloadable*/
+ {
+ let result = new Downloadable(subscription.url);
+ if (subscription.lastDownload != subscription.lastSuccess)
+ result.lastError = subscription.lastDownload * MILLIS_IN_SECOND;
+ result.lastCheck = subscription.lastCheck * MILLIS_IN_SECOND;
+ result.lastVersion = subscription.version;
+ result.softExpiration = subscription.softExpiration * MILLIS_IN_SECOND;
+ result.hardExpiration = subscription.expires * MILLIS_IN_SECOND;
+ result.manual = manual;
+ result.privateMode = subscription.privateMode;
+ return result;
+ },
+
+ _onExpirationChange: function(downloadable)
+ {
+ let subscription = Subscription.fromURL(downloadable.url);
+ subscription.lastCheck = Math.round(downloadable.lastCheck / MILLIS_IN_SECOND);
+ subscription.softExpiration = Math.round(downloadable.softExpiration / MILLIS_IN_SECOND);
+ subscription.expires = Math.round(downloadable.hardExpiration / MILLIS_IN_SECOND);
+ },
+
+ _onDownloadStarted: function(downloadable)
+ {
+ let subscription = Subscription.fromURL(downloadable.url);
+ FilterNotifier.triggerListeners("subscription.downloadStatus", subscription);
+ },
+
+ _onDownloadSuccess: function(downloadable, responseText, errorCallback, redirectCallback)
+ {
+ let lines = responseText.split(/[\r\n]+/);
+ let match = /\[Adblock(?:\s*Plus\s*([\d\.]+)?)?\]/i.exec(lines[0]);
+ if (!match)
+ return errorCallback("synchronize_invalid_data");
+ let minVersion = match[1];
+
+ // Don't remove parameter comments immediately but add them to a list first,
+ // they need to be considered in the checksum calculation.
+ let remove = [];
+ let params = {
+ redirect: null,
+ homepage: null,
+ title: null,
+ version: null,
+ privatemode: null,
+ expires: null
+ };
+ for (let i = 0; i < lines.length; i++)
+ {
+ let match = /^\s*!\s*(\w+)\s*:\s*(.*)/.exec(lines[i]);
+ if (match)
+ {
+ let keyword = match[1].toLowerCase();
+ let value = match[2];
+ if (keyword in params)
+ {
+ params[keyword] = value;
+ remove.push(i);
+ }
+ else if (keyword == "checksum")
+ {
+ lines.splice(i--, 1);
+ let checksum = Utils.generateChecksum(lines);
+ if (checksum && checksum != value.replace(/=+$/, ""))
+ return errorCallback("synchronize_checksum_mismatch");
+ }
+ }
+ }
+
+ if (params.redirect)
+ return redirectCallback(params.redirect);
+
+ // Handle redirects
+ let subscription = Subscription.fromURL(downloadable.redirectURL || downloadable.url);
+ if (downloadable.redirectURL && downloadable.redirectURL != downloadable.url)
+ {
+ let oldSubscription = Subscription.fromURL(downloadable.url);
+ subscription.title = oldSubscription.title;
+ subscription.disabled = oldSubscription.disabled;
+ subscription.lastCheck = oldSubscription.lastCheck;
+
+ let listed = (oldSubscription.url in FilterStorage.knownSubscriptions);
+ if (listed)
+ FilterStorage.removeSubscription(oldSubscription);
+
+ delete Subscription.knownSubscriptions[oldSubscription.url];
+
+ if (listed)
+ FilterStorage.addSubscription(subscription);
+ }
+
+ // The download actually succeeded
+ subscription.lastSuccess = subscription.lastDownload = Math.round(Date.now() / MILLIS_IN_SECOND);
+ subscription.downloadStatus = "synchronize_ok";
+ subscription.errors = 0;
+
+ // Remove lines containing parameters
+ for (let i = remove.length - 1; i >= 0; i--)
+ lines.splice(remove[i], 1);
+
+ // Process parameters
+ if (params.homepage)
+ {
+ let uri = Utils.makeURI(params.homepage);
+ if (uri && (uri.scheme == "http" || uri.scheme == "https"))
+ subscription.homepage = uri.spec;
+ }
+
+ if (params.privatemode)
+ {
+ subscription.privateMode = (params.privatemode == "true");
+ }
+
+ if (params.title)
+ {
+ subscription.title = params.title;
+ subscription.fixedTitle = true;
+ }
+ else
+ subscription.fixedTitle = false;
+
+ subscription.version = (params.version ? parseInt(params.version, 10) : 0);
+
+ let expirationInterval = DEFAULT_EXPIRATION_INTERVAL;
+ if (params.expires)
+ {
+ let match = /^(\d+)\s*(h)?/.exec(params.expires);
+ if (match)
+ {
+ let interval = parseInt(match[1], 10);
+ if (match[2])
+ expirationInterval = interval * MILLIS_IN_HOUR;
+ else
+ expirationInterval = interval * MILLIS_IN_DAY;
+ }
+ }
+
+ let [softExpiration, hardExpiration] = downloader.processExpirationInterval(expirationInterval);
+ subscription.softExpiration = Math.round(softExpiration / MILLIS_IN_SECOND);
+ subscription.expires = Math.round(hardExpiration / MILLIS_IN_SECOND);
+
+ delete subscription.requiredVersion;
+ delete subscription.upgradeRequired;
+ if (minVersion)
+ {
+ let {addonVersion} = require("info");
+ subscription.requiredVersion = minVersion;
+ if (Services.vc.compare(minVersion, addonVersion) > 0)
+ subscription.upgradeRequired = true;
+ }
+
+ // Process filters
+ lines.shift();
+ let filters = [];
+ for (let line of lines)
+ {
+ line = Filter.normalize(line);
+ if (line)
+ filters.push(Filter.fromText(line));
+ }
+
+ FilterStorage.updateSubscriptionFilters(subscription, filters);
+
+ return undefined;
+ },
+
+ _onDownloadError: function(downloadable, downloadURL, error, channelStatus, responseStatus, redirectCallback)
+ {
+ let subscription = Subscription.fromURL(downloadable.url);
+ subscription.lastDownload = Math.round(Date.now() / MILLIS_IN_SECOND);
+ subscription.downloadStatus = error;
+
+ // Request fallback URL if necessary - for automatic updates only
+ if (!downloadable.manual)
+ {
+ subscription.errors++;
+
+ if (redirectCallback && subscription.errors >= Prefs.subscriptions_fallbackerrors && /^https?:\/\//i.test(subscription.url))
+ {
+ subscription.errors = 0;
+
+ let fallbackURL = Prefs.subscriptions_fallbackurl;
+ let {addonVersion} = require("info");
+ fallbackURL = fallbackURL.replace(/%VERSION%/g, encodeURIComponent(addonVersion));
+ fallbackURL = fallbackURL.replace(/%SUBSCRIPTION%/g, encodeURIComponent(subscription.url));
+ fallbackURL = fallbackURL.replace(/%URL%/g, encodeURIComponent(downloadURL));
+ fallbackURL = fallbackURL.replace(/%ERROR%/g, encodeURIComponent(error));
+ fallbackURL = fallbackURL.replace(/%CHANNELSTATUS%/g, encodeURIComponent(channelStatus));
+ fallbackURL = fallbackURL.replace(/%RESPONSESTATUS%/g, encodeURIComponent(responseStatus));
+
+ let request = new XMLHttpRequest();
+ request.mozBackgroundRequest = true;
+ request.open("GET", fallbackURL);
+ request.overrideMimeType("text/plain");
+ request.channel.loadFlags = request.channel.loadFlags |
+ request.channel.INHIBIT_CACHING |
+ request.channel.VALIDATE_ALWAYS;
+ request.addEventListener("load", function(ev)
+ {
+ if (onShutdown.done)
+ return;
+
+ if (!(subscription.url in FilterStorage.knownSubscriptions))
+ return;
+
+ let match = /^(\d+)(?:\s+(\S+))?$/.exec(request.responseText);
+ if (match && match[1] == "301" && match[2] && /^https?:\/\//i.test(match[2])) // Moved permanently
+ redirectCallback(match[2]);
+ else if (match && match[1] == "410") // Gone
+ {
+ let data = "[Adblock]\n" + subscription.filters.map((f) => f.text).join("\n");
+ redirectCallback("data:text/plain," + encodeURIComponent(data));
+ }
+ }, false);
+ request.send(null);
+ }
+ }
+ },
+};
+Synchronizer.init();
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/timeline.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/timeline.js
new file mode 100644
index 0000000..18c10fb
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/timeline.js
@@ -0,0 +1,155 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Debugging module used for load time measurements.
+ */
+
+let nestingCounter = 0;
+let firstTimeStamp = null;
+let lastTimeStamp = null;
+
+let asyncActions = {__proto__: null};
+
+/**
+ * Time logging module, used to measure startup time of Adblock Plus (development builds only).
+ * @class
+ */
+let TimeLine = exports.TimeLine = {
+ /**
+ * Logs an event to console together with the time it took to get there.
+ */
+ log: function(/**String*/ message, /**Boolean*/ _forceDisplay)
+ {
+ if (!_forceDisplay && nestingCounter <= 0)
+ return;
+
+ let now = Date.now();
+ let diff = lastTimeStamp ? Math.round(now - lastTimeStamp) : "first event";
+ lastTimeStamp = now;
+
+ // Indent message depending on current nesting level
+ for (let i = 0; i < nestingCounter; i++)
+ message = "* " + message;
+
+ // Pad message with spaces
+ let padding = [];
+ for (let i = message.toString().length; i < 80; i++)
+ padding.push(" ");
+ dump("[" + now + "] ABP timeline: " + message + padding.join("") + "\t (" + diff + ")\n");
+ },
+
+ /**
+ * Called to indicate that application entered a block that needs to be timed.
+ */
+ enter: function(/**String*/ message)
+ {
+ if (nestingCounter <= 0)
+ firstTimeStamp = Date.now();
+
+ this.log(message, true);
+ nestingCounter = (nestingCounter <= 0 ? 1 : nestingCounter + 1);
+ },
+
+ /**
+ * Called when application exited a block that TimeLine.enter() was called for.
+ * @param {String} message message to be logged
+ * @param {String} [asyncAction] identifier of a pending async action
+ */
+ leave: function(message, asyncAction)
+ {
+ if (typeof asyncAction != "undefined")
+ message += " (async action pending)";
+
+ nestingCounter--;
+ this.log(message, true);
+
+ if (nestingCounter <= 0)
+ {
+ if (firstTimeStamp !== null)
+ dump("ABP timeline: Total time elapsed: " + Math.round(Date.now() - firstTimeStamp) + "\n");
+ firstTimeStamp = null;
+ lastTimeStamp = null;
+ }
+
+ if (typeof asyncAction != "undefined")
+ {
+ if (asyncAction in asyncActions)
+ dump("ABP timeline: Warning: Async action " + asyncAction + " already executing\n");
+ asyncActions[asyncAction] = {start: Date.now(), total: 0};
+ }
+ },
+
+ /**
+ * Called when the application starts processing of an async action.
+ */
+ asyncStart: function(/**String*/ asyncAction)
+ {
+ if (asyncAction in asyncActions)
+ {
+ let action = asyncActions[asyncAction];
+ if ("currentStart" in action)
+ dump("ABP timeline: Warning: Processing reentered for async action " + asyncAction + "\n");
+ action.currentStart = Date.now();
+ }
+ else
+ dump("ABP timeline: Warning: Async action " + asyncAction + " is unknown\n");
+ },
+
+ /**
+ * Called when the application finishes processing of an async action.
+ */
+ asyncEnd: function(/**String*/ asyncAction)
+ {
+ if (asyncAction in asyncActions)
+ {
+ let action = asyncActions[asyncAction];
+ if ("currentStart" in action)
+ {
+ action.total += Date.now() - action.currentStart;
+ delete action.currentStart;
+ }
+ else
+ dump("ABP timeline: Warning: Processing not entered for async action " + asyncAction + "\n");
+ }
+ else
+ dump("ABP timeline: Warning: Async action " + asyncAction + " is unknown\n");
+ },
+
+ /**
+ * Called when an async action is done and its time can be logged.
+ */
+ asyncDone: function(/**String*/ asyncAction)
+ {
+ if (asyncAction in asyncActions)
+ {
+ let action = asyncActions[asyncAction];
+ let now = Date.now();
+ let diff = now - action.start;
+ if ("currentStart" in action)
+ dump("ABP timeline: Warning: Still processing for async action " + asyncAction + "\n");
+
+ let message = "Async action " + asyncAction + " done";
+ let padding = [];
+ for (let i = message.toString().length; i < 80; i++)
+ padding.push(" ");
+ dump("[" + now + "] ABP timeline: " + message + padding.join("") + "\t (" + action.total + "/" + diff + ")\n");
+ }
+ else
+ dump("ABP timeline: Warning: Async action " + asyncAction + " is unknown\n");
+ }
+};
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/ui.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/ui.js
new file mode 100644
index 0000000..d7551c2
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/ui.js
@@ -0,0 +1,1973 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {Utils} = require("utils");
+let {Prefs} = require("prefs");
+let {Policy} = require("contentPolicy");
+let {FilterStorage} = require("filterStorage");
+let {FilterNotifier} = require("filterNotifier");
+let {RequestNotifier} = require("requestNotifier");
+let {Filter} = require("filterClasses");
+let {Subscription, SpecialSubscription, DownloadableSubscription} = require("subscriptionClasses");
+let {Synchronizer} = require("synchronizer");
+let {KeySelector} = require("keySelector");
+let {Notification} = require("notification");
+let {initAntiAdblockNotification} = require("antiadblockInit");
+
+let CustomizableUI = null;
+
+/**
+ * Filter corresponding with "disable on site" menu item (set in fillIconMent()).
+ * @type Filter
+ */
+let siteWhitelist = null;
+/**
+ * Filter corresponding with "disable on site" menu item (set in fillIconMenu()).
+ * @type Filter
+ */
+let pageWhitelist = null;
+
+/**
+ * Window containing the detached list of blockable items.
+ * @type Window
+ */
+let detachedBottombar = null;
+
+/**
+ * Object initializing add-on options, observes add-on manager notifications
+ * about add-on options being opened.
+ * @type nsIObserver
+ */
+let optionsObserver =
+{
+ init: function()
+ {
+ Services.obs.addObserver(this, "addon-options-displayed", true);
+ onShutdown.add(function()
+ {
+ Services.obs.removeObserver(this, "addon-options-displayed");
+ }.bind(this));
+ },
+
+ /**
+ * Initializes options in add-on manager when they show up.
+ */
+ initOptionsDoc: function(/**Document*/ doc)
+ {
+ function hideElement(id, hide)
+ {
+ let element = doc.getElementById(id);
+ if (element)
+ element.collapsed = hide;
+ }
+ function setChecked(id, checked)
+ {
+ let element = doc.getElementById(id);
+ if (element)
+ element.value = checked;
+ }
+ function addCommandHandler(id, handler)
+ {
+ let element = doc.getElementById(id);
+ if (element)
+ element.addEventListener("command", handler, false);
+ }
+
+ Utils.splitAllLabels(doc);
+
+ addCommandHandler("adblockplus-filters", UI.openFiltersDialog.bind(UI));
+
+ let {Sync} = require("sync");
+ let syncEngine = Sync.getEngine();
+ hideElement("adblockplus-sync", !syncEngine);
+
+ let {defaultToolbarPosition, statusbarPosition} = require("appSupport");
+ let hasToolbar = defaultToolbarPosition;
+ let hasStatusBar = statusbarPosition;
+
+ hideElement("adblockplus-showintoolbar", !hasToolbar);
+ hideElement("adblockplus-showinstatusbar", !hasStatusBar);
+
+ let checkbox = doc.querySelector("setting[type=bool]");
+ if (checkbox)
+ initCheckboxes();
+
+ function initCheckboxes()
+ {
+ if (!("value" in checkbox))
+ {
+ // XBL bindings didn't apply yet (bug 708397), try later
+ Utils.runAsync(initCheckboxes);
+ return;
+ }
+
+ setChecked("adblockplus-savestats", Prefs.savestats);
+ addCommandHandler("adblockplus-savestats", function()
+ {
+ UI.toggleSaveStats(doc.defaultView);
+ this.value = Prefs.savestats;
+ });
+
+ let hasAcceptableAds = FilterStorage.subscriptions.some((subscription) => subscription instanceof DownloadableSubscription &&
+ subscription.url == Prefs.subscriptions_exceptionsurl);
+ setChecked("adblockplus-acceptableAds", hasAcceptableAds);
+ addCommandHandler("adblockplus-acceptableAds", function()
+ {
+ this.value = UI.toggleAcceptableAds();
+ });
+
+ setChecked("adblockplus-sync", syncEngine && syncEngine.enabled);
+ addCommandHandler("adblockplus-sync", function()
+ {
+ this.value = UI.toggleSync();
+ });
+
+ setChecked("adblockplus-showintoolbar", UI.isToolbarIconVisible());
+ addCommandHandler("adblockplus-showintoolbar", function()
+ {
+ UI.toggleToolbarIcon();
+ this.value = UI.isToolbarIconVisible();
+ });
+
+ let list = doc.getElementById("adblockplus-subscription-list");
+ if (list)
+ {
+ // Load subscriptions data
+ let request = new XMLHttpRequest();
+ request.mozBackgroundRequest = true;
+ request.open("GET", "chrome://adblockplus/content/ui/subscriptions.xml");
+ request.addEventListener("load", function()
+ {
+ if (onShutdown.done)
+ return;
+
+ let currentSubscription = FilterStorage.subscriptions.filter((subscription) => subscription instanceof DownloadableSubscription &&
+ subscription.url != Prefs.subscriptions_exceptionsurl);
+ currentSubscription = (currentSubscription.length ? currentSubscription[0] : null);
+
+ let subscriptions =request.responseXML.getElementsByTagName("subscription");
+ for (let i = 0; i < subscriptions.length; i++)
+ {
+ let item = subscriptions[i];
+ let url = item.getAttribute("url");
+ if (!url)
+ continue;
+
+ list.appendItem(item.getAttribute("title"), url, null);
+ if (currentSubscription && url == currentSubscription.url)
+ list.selectedIndex = list.itemCount - 1;
+
+ if (currentSubscription && list.selectedIndex < 0)
+ {
+ list.appendItem(currentSubscription.title, currentSubscription.url, null);
+ list.selectedIndex = list.itemCount - 1;
+ }
+ }
+
+ var listener = function()
+ {
+ if (list.value)
+ UI.setSubscription(list.value, list.label);
+ }
+ list.addEventListener("command", listener, false);
+
+ // xul:menulist in Fennec is broken and doesn't trigger any events
+ // on selection. Have to detect selectIndex changes instead.
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=891736
+ list.watch("selectedIndex", function(prop, oldval, newval)
+ {
+ Utils.runAsync(listener);
+ return newval;
+ });
+ }, false);
+ request.send();
+ }
+ }
+ },
+
+ observe: function(subject, topic, data)
+ {
+ let {addonID} = require("info")
+ if (data != addonID)
+ return;
+
+ this.initOptionsDoc(subject.QueryInterface(Ci.nsIDOMDocument));
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference])
+};
+optionsObserver.init();
+
+/**
+ * Session restore observer instance, stored to prevent it from being garbage
+ * collected.
+ * @type SessionRestoreObserver
+ */
+let sessionRestoreObserver = null;
+
+/**
+ * Observer waiting for the browsing session to be restored on startup.
+ */
+function SessionRestoreObserver(/**function*/ callback)
+{
+ sessionRestoreObserver = this;
+
+ this.callback = callback;
+ Services.obs.addObserver(this, "sessionstore-windows-restored", true);
+
+ // Just in case, don't wait longer than 5 seconds
+ this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ this.timer.init(this, 5000, Ci.nsITimer.TYPE_ONE_SHOT);
+}
+SessionRestoreObserver.prototype =
+{
+ callback: null,
+ timer: null,
+ observe: function(subject, topic, data)
+ {
+ Services.obs.removeObserver(this, "sessionstore-windows-restored");
+ sessionRestoreObserver = null;
+
+ this.timer.cancel();
+ this.timer = null;
+
+ if (!onShutdown.done)
+ this.callback();
+ },
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference])
+}
+
+/**
+ * Timer used to delay notification handling.
+ * @type nsITimer
+ */
+let notificationTimer = null;
+
+let UI = exports.UI =
+{
+ /**
+ * Gets called on startup, initializes UI integration.
+ */
+ init: function()
+ {
+ // We should call initDone once both overlay and filters are loaded
+ let overlayLoaded = false;
+ let filtersLoaded = false;
+ let sessionRestored = false;
+
+ // Start loading overlay
+ let request = new XMLHttpRequest();
+ request.mozBackgroundRequest = true;
+ request.open("GET", "chrome://adblockplus/content/ui/overlay.xul");
+ request.addEventListener("load", function(event)
+ {
+ if (onShutdown.done)
+ return;
+
+ this.processOverlay(request.responseXML.documentElement);
+
+ // Don't wait for the rest of the startup sequence, add icon already
+ this.addToolbarButton();
+
+ overlayLoaded = true;
+ if (overlayLoaded && filtersLoaded && sessionRestored)
+ this.initDone();
+ }.bind(this), false);
+ request.send(null);
+
+ // Wait for filters to load
+ if (FilterStorage._loading)
+ {
+ let listener = function(action)
+ {
+ if (action != "load")
+ return;
+
+ FilterNotifier.removeListener(listener);
+ filtersLoaded = true;
+ if (overlayLoaded && filtersLoaded && sessionRestored)
+ this.initDone();
+ }.bind(this);
+ FilterNotifier.addListener(listener);
+ }
+ else
+ filtersLoaded = true;
+
+ // Initialize UI after the session is restored
+ let window = this.currentWindow;
+ if (!window && "nsISessionStore" in Ci)
+ {
+ // No application windows yet, the application must be starting up. Wait
+ // for session to be restored before initializing our UI.
+ new SessionRestoreObserver(function()
+ {
+ sessionRestored = true;
+ if (overlayLoaded && filtersLoaded && sessionRestored)
+ this.initDone();
+ }.bind(this));
+ }
+ else
+ sessionRestored = true;
+ },
+
+ /**
+ * Provesses overlay document data and initializes overlay property.
+ */
+ processOverlay: function(/**Element*/ root)
+ {
+ Utils.splitAllLabels(root);
+
+ let specialElements = {"abp-status-popup": true, "abp-status": true, "abp-toolbarbutton": true, "abp-menuitem": true, "abp-bottombar-container": true};
+
+ this.overlay = {all: []};
+
+ // Remove whitespace text nodes
+ let walker = root.ownerDocument.createTreeWalker(
+ root, Ci.nsIDOMNodeFilter.SHOW_TEXT,
+ (node) => !/\S/.test(node.nodeValue), false
+ );
+ let whitespaceNodes = [];
+ while (walker.nextNode())
+ whitespaceNodes.push(walker.currentNode);
+
+ for (let i = 0; i < whitespaceNodes.length; i++)
+ whitespaceNodes[i].parentNode.removeChild(whitespaceNodes[i]);
+
+ // Put overlay elements into appropriate fields
+ while (root.firstElementChild)
+ {
+ let child = root.firstElementChild;
+ if (child.getAttribute("id") in specialElements)
+ this.overlay[child.getAttribute("id")] = child;
+ else
+ this.overlay.all.push(child);
+ root.removeChild(child);
+ }
+
+ // Read overlay attributes
+ this.overlay.attributes = {};
+ for (let i = 0; i < root.attributes.length; i++)
+ this.overlay.attributes[root.attributes[i].name] = root.attributes[i].value;
+
+ // Copy context menu into the toolbar icon and Tools menu item
+ function fixId(element, newId)
+ {
+ if (element.hasAttribute("id"))
+ element.setAttribute("id", element.getAttribute("id").replace("abp-status", newId));
+
+ for (let i = 0, len = element.children.length; i < len; i++)
+ fixId(element.children[i], newId);
+
+ return element;
+ }
+
+ if ("abp-status-popup" in this.overlay)
+ {
+ let menuSource = this.overlay["abp-status-popup"];
+ delete this.overlay["abp-status-popup"];
+
+ if (this.overlay.all.length)
+ this.overlay.all[0].appendChild(menuSource);
+ if ("abp-toolbarbutton" in this.overlay)
+ this.overlay["abp-toolbarbutton"].appendChild(fixId(menuSource.cloneNode(true), "abp-toolbar"));
+ if ("abp-menuitem" in this.overlay)
+ this.overlay["abp-menuitem"].appendChild(fixId(menuSource.cloneNode(true), "abp-menuitem"));
+ }
+ },
+
+ /**
+ * Gets called once the initialization is finished and Adblock Plus elements
+ * can be added to the UI.
+ */
+ initDone: function()
+ {
+ // The icon might be added already, make sure its state is correct
+ this.updateState();
+
+ // Listen for pref and filters changes
+ Prefs.addListener(function(name)
+ {
+ if (name == "enabled" || name == "defaulttoolbaraction" || name == "defaultstatusbaraction")
+ this.updateState();
+ else if (name == "showinstatusbar")
+ {
+ for (let window in this.applicationWindows)
+ this.updateStatusbarIcon(window);
+ }
+ }.bind(this));
+ FilterNotifier.addListener(function(action)
+ {
+ if (/^(filter|subscription)\.(added|removed|disabled|updated)$/.test(action) || action == "load")
+ this.updateState();
+ }.bind(this));
+
+ notificationTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ notificationTimer.initWithCallback(this.showNextNotification.bind(this),
+ 3 * 60 * 1000, Ci.nsITimer.TYPE_ONE_SHOT);
+ onShutdown.add(() => notificationTimer.cancel());
+
+ // Add "anti-adblock messages" notification
+ initAntiAdblockNotification();
+
+ let documentCreationObserver = {
+ observe: function(subject, topic, data)
+ {
+ if (!(subject instanceof Ci.nsIDOMWindow))
+ return;
+
+ this.showNextNotification(subject.location.href);
+ }.bind(UI)
+ };
+ Services.obs.addObserver(documentCreationObserver, "content-document-global-created", false);
+ onShutdown.add(function()
+ {
+ Services.obs.removeObserver(documentCreationObserver, "content-document-global-created", false);
+ });
+
+ // Execute first-run actions if a window is open already, otherwise it
+ // will happen in applyToWindow() when a window is opened.
+ this.firstRunActions(this.currentWindow);
+ },
+
+ addToolbarButton: function()
+ {
+ let {WindowObserver} = require("windowObserver");
+ new WindowObserver(this);
+
+ let {defaultToolbarPosition} = require("appSupport");
+ if ("abp-toolbarbutton" in this.overlay && defaultToolbarPosition)
+ {
+ try
+ {
+ ({CustomizableUI}) = Cu.import("resource:///modules/CustomizableUI.jsm", null);
+ }
+ catch (e)
+ {
+ // No built-in CustomizableUI API, use our own implementation.
+ ({CustomizableUI}) = require("customizableUI");
+ }
+
+ CustomizableUI.createWidget({
+ id: "abp-toolbarbutton",
+ type: "custom",
+ positionAttribute: "abp-iconposition", // For emulation only
+ defaultArea: defaultToolbarPosition.parent,
+ defaultBefore: defaultToolbarPosition.before, // For emulation only
+ defaultAfter: defaultToolbarPosition.after, // For emulation only
+ removable: true,
+ onBuild: function(document)
+ {
+ let node = document.importNode(this.overlay["abp-toolbarbutton"], true);
+ node.addEventListener("click", this.onIconClick, false);
+ node.addEventListener("command", this.onIconClick, false);
+ this.updateIconState(document.defaultView, node);
+ return node;
+ }.bind(this),
+ onAdded: function(node)
+ {
+ // For emulation only, this callback isn't part of the official
+ // CustomizableUI API.
+ this.updateIconState(node.ownerDocument.defaultView, node);
+ }.bind(this),
+ });
+ onShutdown.add(CustomizableUI.destroyWidget.bind(CustomizableUI, "abp-toolbarbutton"));
+ }
+ },
+
+ firstRunActions: function(window)
+ {
+ if (this.firstRunDone || !window || FilterStorage._loading)
+ return;
+
+ this.firstRunDone = true;
+
+ let {addonVersion} = require("info");
+ let prevVersion = Prefs.currentVersion;
+ if (prevVersion != addonVersion)
+ {
+ Prefs.currentVersion = addonVersion;
+ this.addSubscription(window, prevVersion);
+ }
+ },
+
+ /**
+ * Will be set to true after the check whether first-run actions should run
+ * has been performed.
+ * @type Boolean
+ */
+ firstRunDone: false,
+
+ /**
+ * Initializes Adblock Plus UI in a window.
+ */
+ applyToWindow: function(/**Window*/ window, /**Boolean*/ noDelay)
+ {
+ let {delayInitialization, isKnownWindow, getBrowser, addBrowserLocationListener, addBrowserClickListener} = require("appSupport");
+ if (window.document.documentElement.id == "CustomizeToolbarWindow" || isKnownWindow(window))
+ {
+ // Add style processing instruction
+ let style = window.document.createProcessingInstruction("xml-stylesheet", 'class="adblockplus-node" href="chrome://adblockplus/skin/overlay.css" type="text/css"');
+ window.document.insertBefore(style, window.document.firstChild);
+ }
+
+ if (!isKnownWindow(window))
+ return;
+
+ // Thunderbird windows will not be initialized at this point, execute
+ // delayed
+ if (!noDelay && delayInitialization)
+ {
+ Utils.runAsync(this.applyToWindow.bind(this, window, true));
+ return;
+ }
+
+ // Add general items to the document
+ for (let i = 0; i < this.overlay.all.length; i++)
+ window.document.documentElement.appendChild(this.overlay.all[i].cloneNode(true));
+
+ // Add status bar icon
+ this.updateStatusbarIcon(window);
+
+ // Add tools menu item
+ if ("abp-menuitem" in this.overlay)
+ {
+ let {toolsMenu} = require("appSupport");
+ let [parent, before] = this.resolveInsertionPoint(window, toolsMenu);
+ if (parent)
+ parent.insertBefore(this.overlay["abp-menuitem"].cloneNode(true), before);
+ }
+
+ // Attach event handlers
+ for (let i = 0; i < eventHandlers.length; i++)
+ {
+ let [id, event, handler] = eventHandlers[i];
+ let element = window.document.getElementById(id);
+ if (element)
+ element.addEventListener(event, handler.bind(null, window), false);
+ }
+ window.addEventListener("popupshowing", this.onPopupShowing, false);
+ window.addEventListener("keypress", this.onKeyPress, false);
+
+ addBrowserLocationListener(window, function()
+ {
+ this.updateIconState(window, window.document.getElementById("abp-status"));
+ this.updateIconState(window, window.document.getElementById("abp-toolbarbutton"));
+ }.bind(this));
+ addBrowserClickListener(window, this.onBrowserClick.bind(this, window));
+
+ window.document.getElementById("abp-notification-close").addEventListener("command", function(event)
+ {
+ window.document.getElementById("abp-notification").hidePopup();
+ }, false);
+
+ // First-run actions?
+ this.firstRunActions(window);
+
+ // Some people actually switch off browser.frames.enabled and are surprised
+ // that things stop working...
+ window.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIWebNavigation)
+ .QueryInterface(Ci.nsIDocShell)
+ .allowSubframes = true;
+ },
+
+ /**
+ * Removes Adblock Plus UI from a window.
+ */
+ removeFromWindow: function(/**Window*/ window)
+ {
+ let {isKnownWindow, removeBrowserLocationListeners, removeBrowserClickListeners} = require("appSupport");
+ if (window.document.documentElement.id == "CustomizeToolbarWindow" || isKnownWindow(window))
+ {
+ // Remove style processing instruction
+ for (let child = window.document.firstChild; child; child = child.nextSibling)
+ if (child.nodeType == child.PROCESSING_INSTRUCTION_NODE && child.data.indexOf("adblockplus-node") >= 0)
+ child.parentNode.removeChild(child);
+ }
+
+ if (!isKnownWindow(window))
+ return;
+
+ for (let id in this.overlay)
+ {
+ if (id == "all")
+ {
+ let list = this.overlay[id];
+ for (let i = 0; i < list.length; i++)
+ {
+ let clone = window.document.getElementById(list[i].getAttribute("id"));
+ if (clone)
+ clone.parentNode.removeChild(clone);
+ }
+ }
+ else
+ {
+ let clone = window.document.getElementById(id);
+ if (clone)
+ clone.parentNode.removeChild(clone);
+ }
+ }
+
+ window.removeEventListener("popupshowing", this.onPopupShowing, false);
+ window.removeEventListener("keypress", this.onKeyPress, false);
+ removeBrowserLocationListeners(window);
+ removeBrowserClickListeners(window);
+ },
+
+ /**
+ * The overlay information to be used when adding elements to the UI.
+ * @type Object
+ */
+ overlay: null,
+
+ /**
+ * Iterator for application windows that Adblock Plus should apply to.
+ * @type Iterator
+ */
+ get applicationWindows()
+ {
+ let {isKnownWindow} = require("appSupport");
+
+ let enumerator = Services.wm.getZOrderDOMWindowEnumerator(null, true);
+ if (!enumerator.hasMoreElements())
+ {
+ // On Linux the list returned will be empty, see bug 156333. Fall back to random order.
+ enumerator = Services.wm.getEnumerator(null);
+ }
+ while (enumerator.hasMoreElements())
+ {
+ let window = enumerator.getNext().QueryInterface(Ci.nsIDOMWindow);
+ if (isKnownWindow(window))
+ yield window;
+ }
+ },
+
+ /**
+ * Returns the top-most application window or null if none exists.
+ * @type Window
+ */
+ get currentWindow()
+ {
+ for (let window of this.applicationWindows)
+ return window;
+ return null;
+ },
+
+ /**
+ * Opens a URL in the browser window. If browser window isn't passed as parameter,
+ * this function attempts to find a browser window. If an event is passed in
+ * it should be passed in to the browser if possible (will e.g. open a tab in
+ * background depending on modifiers keys).
+ */
+ loadInBrowser: function(/**String*/ url, /**Window*/ currentWindow, /**Event*/ event)
+ {
+ if (!currentWindow)
+ currentWindow = this.currentWindow;
+
+ let {addTab} = require("appSupport");
+ if (currentWindow && addTab)
+ addTab(currentWindow, url, event);
+ else
+ {
+ let protocolService = Cc["@mozilla.org/uriloader/external-protocol-service;1"].getService(Ci.nsIExternalProtocolService);
+ protocolService.loadURI(Services.io.newURI(url, null, null), null);
+ }
+ },
+
+ /**
+ * Opens a pre-defined documentation link in the browser window. This will
+ * send the UI language to adblockplus.org so that the correct language
+ * version of the page can be selected.
+ */
+ loadDocLink: function(/**String*/ linkID, /**Window*/ window)
+ {
+ let link = Utils.getDocLink(linkID);
+ this.loadInBrowser(link, window);
+ },
+
+
+ /**
+ * Brings up the filter composer dialog to block an item.
+ */
+ blockItem: function(/**Window*/ window, /**Node*/ node, /**RequestEntry*/ item)
+ {
+ if (!item)
+ return;
+
+ window.openDialog("chrome://adblockplus/content/ui/composer.xul", "_blank", "chrome,centerscreen,resizable,dialog=no,dependent", [node], item);
+ },
+
+ /**
+ * Opens filter preferences dialog or focuses an already open dialog.
+ * @param {Filter} [filter] filter to be selected
+ */
+ openFiltersDialog: function(filter)
+ {
+ let existing = Services.wm.getMostRecentWindow("abp:filters");
+ if (existing)
+ {
+ try
+ {
+ existing.focus();
+ } catch (e) {}
+ if (filter)
+ existing.SubscriptionActions.selectFilter(filter);
+ }
+ else
+ {
+ Services.ww.openWindow(null, "chrome://adblockplus/content/ui/filters.xul", "_blank", "chrome,centerscreen,resizable,dialog=no", {wrappedJSObject: filter});
+ }
+ },
+
+ /**
+ * Opens report wizard for the current page.
+ */
+ openReportDialog: function(/**Window*/ window)
+ {
+ let wnd = Services.wm.getMostRecentWindow("abp:sendReport");
+ if (wnd)
+ wnd.focus();
+ else
+ {
+ let uri = this.getCurrentLocation(window);
+ if (uri)
+ {
+ let {getBrowser} = require("appSupport");
+ window.openDialog("chrome://adblockplus/content/ui/sendReport.xul", "_blank", "chrome,centerscreen,resizable=no", getBrowser(window).contentWindow, uri);
+ }
+ }
+ },
+
+ /**
+ * Opens our contribution page.
+ */
+ openContributePage: function(/**Window*/ window)
+ {
+ this.loadDocLink("contribute", window);
+ },
+
+ /**
+ * Executed on first run, adds a filter subscription and notifies that user
+ * about that.
+ */
+ addSubscription: function(/**Window*/ window, /**String*/ prevVersion)
+ {
+ // Add "acceptable ads" subscription for new users and user updating from old ABP versions.
+ // Don't add it for users of privacy subscriptions (use a hardcoded list for now).
+ let addAcceptable = (Services.vc.compare(prevVersion, "2.0") < 0);
+ let privacySubscriptions = {
+ "https://easylist-downloads.adblockplus.org/easyprivacy+easylist.txt": true,
+ "https://easylist-downloads.adblockplus.org/easyprivacy.txt": true,
+ "https://secure.fanboy.co.nz/fanboy-tracking.txt": true,
+ "https://fanboy-adblock-list.googlecode.com/hg/fanboy-adblocklist-stats.txt": true,
+ "https://bitbucket.org/fanboy/fanboyadblock/raw/tip/fanboy-adblocklist-stats.txt": true,
+ "https://hg01.codeplex.com/fanboyadblock/raw-file/tip/fanboy-adblocklist-stats.txt": true,
+ "https://adversity.googlecode.com/hg/Adversity-Tracking.txt": true
+ };
+ if (FilterStorage.subscriptions.some((subscription) => subscription.url == Prefs.subscriptions_exceptionsurl || subscription.url in privacySubscriptions))
+ addAcceptable = false;
+
+ // Don't add subscription if the user has a subscription already
+ let addSubscription = true;
+ //if (FilterStorage.subscriptions.some((subscription) => subscription instanceof DownloadableSubscription && subscription.url != Prefs.subscriptions_exceptionsurl))
+ addSubscription = false;
+
+ // If this isn't the first run, only add subscription if the user has no custom filters
+ if (addSubscription && Services.vc.compare(prevVersion, "0.0") > 0)
+ {
+ if (FilterStorage.subscriptions.some((subscription) => subscription.url != Prefs.subscriptions_exceptionsurl && subscription.filters.length))
+ addSubscription = false;
+ }
+
+ // Add "acceptable ads" subscription
+ if (false)
+ {
+ let subscription = Subscription.fromURL(Prefs.subscriptions_exceptionsurl);
+ if (subscription)
+ {
+ subscription.title = "Allow non-intrusive advertising";
+ FilterStorage.addSubscription(subscription);
+ if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+ Synchronizer.execute(subscription);
+ }
+ else
+ addAcceptable = false;
+ }
+
+ /* Add "anti-adblock messages" subscription for new users and users updating from old ABP versions
+ if (Services.vc.compare(prevVersion, "2.5") < 0)
+ {
+ let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl);
+ if (subscription && !(subscription.url in FilterStorage.knownSubscriptions))
+ {
+ subscription.disabled = true;
+ FilterStorage.addSubscription(subscription);
+ if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+ Synchronizer.execute(subscription);
+ }
+ }*/
+
+ // Extra subsriptions
+ let subscription = Subscription.fromURL("http://gnuzilla.gnu.org/filters/blacklist.txt");
+ subscription.disabled = false;
+ FilterStorage.addSubscription(subscription);
+ Synchronizer.execute(subscription);
+
+ let subscription = Subscription.fromURL("http://gnuzilla.gnu.org/filters/third-party.txt");
+ subscription.disabled = false;
+ FilterStorage.addSubscription(subscription);
+ Synchronizer.execute(subscription);
+
+ let subscription = Subscription.fromURL("http://gnuzilla.gnu.org/filters/javascript.txt");
+ subscription.disabled = false;
+ FilterStorage.addSubscription(subscription);
+ Synchronizer.execute(subscription);
+
+ if (!addSubscription && !addAcceptable)
+ return;
+
+ function notifyUser()
+ {return;
+ let {addTab} = require("appSupport");
+ if (addTab)
+ {
+ addTab(window, "chrome://adblockplus/content/ui/firstRun.html");
+ }
+ else
+ {
+ let dialogSource = '\
+ <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>\
+ <dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" onload="document.title=content.document.title" buttons="accept" width="500" height="600">\
+ <iframe type="content-primary" flex="1" src="chrome://adblockplus/content/ui/firstRun.html"/>\
+ </dialog>';
+ Services.ww.openWindow(window,
+ "data:application/vnd.mozilla.xul+xml," + encodeURIComponent(dialogSource),
+ "_blank", "chrome,centerscreen,resizable,dialog=no", null);
+ }
+ }
+
+ if (addSubscription)
+ {
+ // Load subscriptions data
+ let request = new XMLHttpRequest();
+ request.mozBackgroundRequest = true;
+ request.open("GET", "chrome://adblockplus/content/ui/subscriptions.xml");
+ request.addEventListener("load", function()
+ {
+ if (onShutdown.done)
+ return;
+
+ let node = Utils.chooseFilterSubscription(request.responseXML.getElementsByTagName("subscription"));
+ let subscription = (node ? Subscription.fromURL(node.getAttribute("url")) : null);
+ if (subscription)
+ {
+ FilterStorage.addSubscription(subscription);
+ subscription.disabled = false;
+ subscription.title = node.getAttribute("title");
+ subscription.homepage = node.getAttribute("homepage");
+ if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+ Synchronizer.execute(subscription);
+
+ notifyUser();
+ }
+ }, false);
+ request.send();
+ }
+ else
+ notifyUser();
+ },
+
+ /**
+ * Handles clicks inside the browser's content area, will intercept clicks on
+ * abp: links. This can be called either with an event object or with the link
+ * target (if it is the former then link target will be retrieved from event
+ * target).
+ */
+ onBrowserClick: function (/**Window*/ window, /**Event*/ event, /**String*/ linkTarget)
+ {
+ if (event)
+ {
+ // Ignore right-clicks
+ if (event.button == 2)
+ return;
+
+ // Search the link associated with the click
+ let link = event.target;
+ while (link && !(link instanceof Ci.nsIDOMHTMLAnchorElement))
+ link = link.parentNode;
+
+ if (!link || link.protocol != "abp:")
+ return;
+
+ // This is our link - make sure the browser doesn't handle it
+ event.preventDefault();
+ event.stopPropagation();
+
+ linkTarget = link.href;
+ }
+
+ let match = /^abp:\/*subscribe\/*\?(.*)/i.exec(linkTarget);
+ if (!match)
+ return;
+
+ // Decode URL parameters
+ let title = null;
+ let url = null;
+ let mainSubscriptionTitle = null;
+ let mainSubscriptionURL = null;
+ for (let param of match[1].split('&'))
+ {
+ let parts = param.split("=", 2);
+ if (parts.length != 2 || !/\S/.test(parts[1]))
+ continue;
+ switch (parts[0])
+ {
+ case "title":
+ title = decodeURIComponent(parts[1]);
+ break;
+ case "location":
+ url = decodeURIComponent(parts[1]);
+ break;
+ case "requiresTitle":
+ mainSubscriptionTitle = decodeURIComponent(parts[1]);
+ break;
+ case "requiresLocation":
+ mainSubscriptionURL = decodeURIComponent(parts[1]);
+ break;
+ }
+ }
+ if (!url)
+ return;
+
+ // Default title to the URL
+ if (!title)
+ title = url;
+
+ // Main subscription needs both title and URL
+ if (mainSubscriptionTitle && !mainSubscriptionURL)
+ mainSubscriptionTitle = null;
+ if (mainSubscriptionURL && !mainSubscriptionTitle)
+ mainSubscriptionURL = null;
+
+ // Trim spaces in title and URL
+ title = title.replace(/^\s+/, "").replace(/\s+$/, "");
+ url = url.replace(/^\s+/, "").replace(/\s+$/, "");
+ if (mainSubscriptionURL)
+ {
+ mainSubscriptionTitle = mainSubscriptionTitle.replace(/^\s+/, "").replace(/\s+$/, "");
+ mainSubscriptionURL = mainSubscriptionURL.replace(/^\s+/, "").replace(/\s+$/, "");
+ }
+
+ // Verify that the URL is valid
+ url = Utils.makeURI(url);
+ if (!url || (url.scheme != "http" && url.scheme != "https" && url.scheme != "ftp"))
+ return;
+ url = url.spec;
+
+ if (mainSubscriptionURL)
+ {
+ mainSubscriptionURL = Utils.makeURI(mainSubscriptionURL);
+ if (!mainSubscriptionURL || (mainSubscriptionURL.scheme != "http" && mainSubscriptionURL.scheme != "https" && mainSubscriptionURL.scheme != "ftp"))
+ mainSubscriptionURL = mainSubscriptionTitle = null;
+ else
+ mainSubscriptionURL = mainSubscriptionURL.spec;
+ }
+
+ this.openSubscriptionDialog(window, url, title, mainSubscriptionURL, mainSubscriptionTitle);
+ },
+
+ /**
+ * Opens a dialog letting the user confirm/adjust a filter subscription to
+ * be added.
+ */
+ openSubscriptionDialog: function(/**Window*/ window, /**String*/ url, /**String*/ title, /**String*/ mainURL, /**String*/ mainTitle)
+ {
+ let subscription = {url: url, title: title, disabled: false, external: false,
+ mainSubscriptionTitle: mainTitle, mainSubscriptionURL: mainURL};
+ window.openDialog("chrome://adblockplus/content/ui/subscriptionSelection.xul", "_blank",
+ "chrome,centerscreen,resizable,dialog=no", subscription, null);
+ },
+
+ /**
+ * Retrieves the current location of the browser.
+ */
+ getCurrentLocation: function(/**Window*/ window) /**nsIURI*/
+ {
+ let {getCurrentLocation} = require("appSupport");
+ let result = getCurrentLocation(window);
+ return (result ? Utils.unwrapURL(result) : null);
+ },
+
+ /**
+ * Looks up an element with given ID in the window. If a list of IDs is given
+ * will try all of them until an element exists.
+ */
+ findElement: function(/**Window*/ window, /**String|String[]*/ id) /**Element*/
+ {
+ if (id instanceof Array)
+ {
+ for (let candidate of id)
+ {
+ let result = window.document.getElementById(candidate);
+ if (result)
+ return result;
+ }
+ return null;
+ }
+ else
+ return window.document.getElementById(id);
+ },
+
+ /**
+ * Resolves an insertion point as specified in appSupport module. Returns
+ * two elements: the parent element and the element to insert before.
+ */
+ resolveInsertionPoint: function(/**Window*/ window, /**Object*/ insertionPoint) /**Element[]*/
+ {
+ let parent = null;
+ let before = null;
+ if (insertionPoint)
+ {
+ if ("parent" in insertionPoint)
+ parent = this.findElement(window, insertionPoint.parent);
+
+ if (parent && "before" in insertionPoint)
+ before = this.findElement(window, insertionPoint.before);
+
+ if (parent && !before && "after" in insertionPoint)
+ {
+ let after = this.findElement(window, insertionPoint.after);
+ if (after)
+ before = after.nextElementSibling;
+ }
+
+ if (before && before.parentNode != parent)
+ before = null;
+ }
+
+ return [parent, before];
+ },
+
+ /**
+ * Toggles visibility state of the toolbar icon.
+ */
+ toggleToolbarIcon: function()
+ {
+ if (!CustomizableUI)
+ return;
+ if (this.isToolbarIconVisible())
+ CustomizableUI.removeWidgetFromArea("abp-toolbarbutton");
+ else
+ {
+ let {defaultToolbarPosition} = require("appSupport");
+ CustomizableUI.addWidgetToArea("abp-toolbarbutton", defaultToolbarPosition.parent);
+ }
+ },
+
+ /**
+ * Updates Adblock Plus icon state for all windows.
+ */
+ updateState: function()
+ {
+ for (let window in this.applicationWindows)
+ {
+ this.updateIconState(window, window.document.getElementById("abp-status"));
+ this.updateIconState(window, window.document.getElementById("abp-toolbarbutton"));
+ }
+ },
+
+ /**
+ * Updates Adblock Plus icon state for a single application window.
+ */
+ updateIconState: function(/**Window*/ window, /**Element*/ icon)
+ {
+ if (!icon)
+ return;
+
+ let state = (Prefs.enabled ? "active" : "disabled");
+ if (state == "active")
+ {
+ let location = this.getCurrentLocation(window);
+ if (location && Policy.isWhitelisted(location.spec))
+ state = "whitelisted";
+ }
+
+ let popupId = "abp-status-popup";
+ if (icon.localName == "statusbarpanel")
+ {
+ if (Prefs.defaultstatusbaraction == 0)
+ {
+ icon.setAttribute("popup", popupId);
+ icon.removeAttribute("context");
+ }
+ else
+ {
+ icon.removeAttribute("popup");
+ icon.setAttribute("context", popupId);
+ }
+ }
+ else
+ {
+ if (Prefs.defaulttoolbaraction == 0)
+ {
+ icon.setAttribute("type", "menu");
+ icon.removeAttribute("context");
+ }
+ else
+ {
+ icon.setAttribute("type", "menu-button");
+ icon.setAttribute("context", popupId);
+ }
+ }
+
+ icon.setAttribute("abpstate", state);
+ },
+
+ /**
+ * Shows or hides status bar icons in all windows, according to pref.
+ */
+ updateStatusbarIcon: function(/**Window*/ window)
+ {
+ if (!("abp-status" in this.overlay))
+ return;
+
+ let {statusbarPosition} = require("appSupport");
+ if (!statusbarPosition)
+ return;
+
+ let icon = window.document.getElementById("abp-status");
+ if (Prefs.showinstatusbar && !icon)
+ {
+ let [parent, before] = this.resolveInsertionPoint(window, statusbarPosition);
+ if (!parent)
+ return;
+
+ parent.insertBefore(this.overlay["abp-status"].cloneNode(true), before);
+
+ icon = window.document.getElementById("abp-status");
+ this.updateIconState(window, icon);
+ icon.addEventListener("click", this.onIconClick, false);
+ }
+ else if (!Prefs.showinstatusbar && icon)
+ icon.parentNode.removeChild(icon);
+ },
+
+ /**
+ * Toggles the value of a boolean preference.
+ */
+ togglePref: function(/**String*/ pref)
+ {
+ Prefs[pref] = !Prefs[pref];
+ },
+
+ /**
+ * If the given filter is already in user's list, removes it from the list. Otherwise adds it.
+ */
+ toggleFilter: function(/**Filter*/ filter)
+ {
+ if (filter.subscriptions.length)
+ {
+ if (filter.disabled || filter.subscriptions.some((subscription) => !(subscription instanceof SpecialSubscription)))
+ filter.disabled = !filter.disabled;
+ else
+ FilterStorage.removeFilter(filter);
+ }
+ else
+ FilterStorage.addFilter(filter);
+ },
+
+
+ /**
+ * Toggles "Count filter hits" option.
+ */
+ toggleSaveStats: function(window)
+ {
+ if (Prefs.savestats)
+ {
+ if (!Utils.confirm(window, Utils.getString("clearStats_warning")))
+ return;
+
+ FilterStorage.resetHitCounts();
+ Prefs.savestats = false;
+ }
+ else
+ Prefs.savestats = true;
+ },
+
+ /**
+ * Sets the current filter subscription in a single-subscription scenario,
+ * all other subscriptions will be removed.
+ */
+ setSubscription: function(url, title)
+ {
+ let subscription = Subscription.fromURL(url);
+ let currentSubscriptions = FilterStorage.subscriptions.filter(
+ ((subscription) => subscription instanceof DownloadableSubscription && subscription.url != Prefs.subscriptions_exceptionsurl)
+ );
+ if (!subscription || currentSubscriptions.indexOf(subscription) >= 0)
+ return;
+
+ for (let i = 0; i < currentSubscriptions.length; i++)
+ FilterStorage.removeSubscription(currentSubscriptions[i]);
+
+ subscription.title = title;
+ FilterStorage.addSubscription(subscription);
+ if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+ Synchronizer.execute(subscription);
+ },
+
+ /**
+ * Adds or removes "non-intrisive ads" filter list.
+ * @return {Boolean} true if the filter list has been added
+ **/
+ toggleAcceptableAds: function()
+ {
+ let subscription = Subscription.fromURL(Prefs.subscriptions_exceptionsurl);
+ if (!subscription)
+ return false;
+
+ subscription.disabled = false;
+ subscription.title = "Allow non-intrusive advertising";
+ if (subscription.url in FilterStorage.knownSubscriptions)
+ FilterStorage.removeSubscription(subscription);
+ else
+ {
+ FilterStorage.addSubscription(subscription);
+ if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+ Synchronizer.execute(subscription);
+ }
+
+ return (subscription.url in FilterStorage.knownSubscriptions);
+ },
+
+ /**
+ * Toggles the pref for the Adblock Plus sync engine.
+ * @return {Boolean} new state of the sync engine
+ */
+ toggleSync: function()
+ {
+ let {Sync} = require("sync");
+ let syncEngine = Sync.getEngine();
+ if (syncEngine)
+ {
+ syncEngine.enabled = !syncEngine.enabled;
+ return syncEngine.enabled;
+ }
+ else
+ return false;
+ },
+
+ /**
+ * Tests whether blockable items list is currently open.
+ */
+ isBottombarOpen: function(/**Window*/ window) /**Boolean*/
+ {
+ if (detachedBottombar && !detachedBottombar.closed)
+ return true;
+
+ return !!window.document.getElementById("abp-bottombar");
+ },
+
+ /**
+ * Called when some pop-up in the application window shows up, initializes
+ * pop-ups related to Adblock Plus.
+ */
+ onPopupShowing: function(/**Event*/ event)
+ {
+ if (event.defaultPrevented)
+ return;
+
+ let popup = event.originalTarget;
+
+ let {contentContextMenu} = require("appSupport");
+ if ((typeof contentContextMenu == "string" && popup.id == contentContextMenu) ||
+ (contentContextMenu instanceof Array && contentContextMenu.indexOf(popup.id) >= 0))
+ {
+ this.fillContentContextMenu(popup);
+ }
+ else if (popup.id == "abp-tooltip")
+ this.fillIconTooltip(event, popup.ownerDocument.defaultView);
+ else
+ {
+ let match = /^(abp-(?:toolbar|status|menuitem)-)popup$/.exec(popup.id);
+ if (match)
+ this.fillIconMenu(event, popup.ownerDocument.defaultView, match[1]);
+ }
+ },
+
+ /**
+ * Handles click on toolbar and status bar icons.
+ */
+ onIconClick: function(/**Event*/ event)
+ {
+ if (event.eventPhase != event.AT_TARGET)
+ return;
+
+ let isToolbar = (event.target.localName != "statusbarpanel");
+ let action = 0;
+ if ((isToolbar && event.type == "command") || (!isToolbar && event.button == 0))
+ action = (isToolbar ? Prefs.defaulttoolbaraction : Prefs.defaultstatusbaraction);
+ else if (event.button == 1)
+ action = 3;
+
+ let window = event.target.ownerDocument.defaultView;
+ if (action == 1)
+ this.toggleBottombar(window);
+ else if (action == 2)
+ this.openFiltersDialog();
+ else if (action == 3)
+ {
+ // If there is a whitelisting rule for current page - remove it (reenable).
+ // Otherwise flip "enabled" pref.
+ if (!this.removeWhitelist(window))
+ this.togglePref("enabled");
+ }
+ },
+
+ /**
+ * Removes/disables the exception rule applying for the current page.
+ */
+ removeWhitelist: function(/**Window*/ window)
+ {
+ let location = this.getCurrentLocation(window);
+ let filter = null;
+ if (location)
+ filter = Policy.isWhitelisted(location.spec);
+ if (filter && filter.subscriptions.length && !filter.disabled)
+ {
+ UI.toggleFilter(filter);
+ return true;
+ }
+ return false;
+ },
+
+ /**
+ * Updates state of the icon tooltip.
+ */
+ fillIconTooltip: function(/**Event*/ event, /**Window*/ window)
+ {
+ let E = (id) => window.document.getElementById(id);
+
+ let node = window.document.tooltipNode;
+ if (!node || !node.hasAttribute("tooltip"))
+ {
+ event.preventDefault();
+ return;
+ }
+
+ // Prevent tooltip from overlapping menu
+ for (let id of ["abp-toolbar-popup", "abp-status-popup"])
+ {
+ let element = E(id);
+ if (element && element.state == "open")
+ {
+ event.preventDefault();
+ return;
+ }
+ }
+
+ let type = (node.id == "abp-toolbarbutton" ? "toolbar" : "statusbar");
+ let action = parseInt(Prefs["default" + type + "action"]);
+ if (isNaN(action))
+ action = -1;
+
+ let actionDescr = E("abp-tooltip-action");
+ actionDescr.hidden = (action < 0 || action > 3);
+ if (!actionDescr.hidden)
+ actionDescr.setAttribute("value", Utils.getString("action" + action + "_tooltip"));
+
+ let statusDescr = E("abp-tooltip-status");
+ let state = node.getAttribute("abpstate");
+ let statusStr = Utils.getString(state + "_tooltip");
+ if (state == "active")
+ {
+ let [activeSubscriptions, activeFilters] = FilterStorage.subscriptions.reduce(function([subscriptions, filters], current)
+ {
+ if (current instanceof SpecialSubscription)
+ return [subscriptions, filters + current.filters.filter((filter) => !filter.disabled).length];
+ else if (!current.disabled && !(Prefs.subscriptions_exceptionscheckbox && current.url == Prefs.subscriptions_exceptionsurl))
+ return [subscriptions + 1, filters];
+ else
+ return [subscriptions, filters]
+ }, [0, 0]);
+
+ statusStr = statusStr.replace(/\?1\?/, activeSubscriptions).replace(/\?2\?/, activeFilters);
+ }
+ statusDescr.setAttribute("value", statusStr);
+
+ let activeFilters = [];
+ E("abp-tooltip-blocked-label").hidden = (state != "active");
+ E("abp-tooltip-blocked").hidden = (state != "active");
+ if (state == "active")
+ {
+ let {getBrowser} = require("appSupport");
+ let stats = RequestNotifier.getWindowStatistics(getBrowser(window).contentWindow);
+
+ let blockedStr = Utils.getString("blocked_count_tooltip");
+ blockedStr = blockedStr.replace(/\?1\?/, stats ? stats.blocked : 0).replace(/\?2\?/, stats ? stats.items : 0);
+
+ if (stats && stats.whitelisted + stats.hidden)
+ {
+ blockedStr += " " + Utils.getString("blocked_count_addendum");
+ blockedStr = blockedStr.replace(/\?1\?/, stats.whitelisted).replace(/\?2\?/, stats.hidden);
+ }
+
+ E("abp-tooltip-blocked").setAttribute("value", blockedStr);
+
+ if (stats)
+ {
+ let filterSort = function(a, b)
+ {
+ return stats.filters[b] - stats.filters[a];
+ };
+ for (let filter in stats.filters)
+ activeFilters.push(filter);
+ activeFilters = activeFilters.sort(filterSort);
+ }
+
+ if (activeFilters.length > 0)
+ {
+ let filtersContainer = E("abp-tooltip-filters");
+ while (filtersContainer.firstChild)
+ filtersContainer.removeChild(filtersContainer.firstChild);
+
+ for (let i = 0; i < activeFilters.length && i < 3; i++)
+ {
+ let descr = filtersContainer.ownerDocument.createElement("description");
+ descr.setAttribute("value", activeFilters[i] + " (" + stats.filters[activeFilters[i]] + ")");
+ filtersContainer.appendChild(descr);
+ }
+ }
+ }
+
+ E("abp-tooltip-filters-label").hidden = (activeFilters.length == 0);
+ E("abp-tooltip-filters").hidden = (activeFilters.length == 0);
+ E("abp-tooltip-more-filters").hidden = (activeFilters.length <= 3);
+ },
+
+ /**
+ * Updates state of the icon context menu.
+ */
+ fillIconMenu: function(/**Event*/ event, /**Window*/ window, /**String*/ prefix)
+ {
+ function hideElement(id, hide)
+ {
+ let element = window.document.getElementById(id);
+ if (element)
+ element.hidden = hide;
+ }
+ function setChecked(id, checked)
+ {
+ let element = window.document.getElementById(id);
+ if (element)
+ element.setAttribute("checked", checked);
+ }
+ function setDisabled(id, disabled)
+ {
+ let element = window.document.getElementById(id);
+ if (element)
+ element.setAttribute("disabled", disabled);
+ }
+ function setDefault(id, isDefault)
+ {
+ let element = window.document.getElementById(id);
+ if (element)
+ element.setAttribute("default", isDefault);
+ }
+ function generateLabel(id, param)
+ {
+ let element = window.document.getElementById(id);
+ if (element)
+ element.setAttribute("label", element.getAttribute("labeltempl").replace(/\?1\?/, param));
+ }
+
+ let bottombarOpen = this.isBottombarOpen(window);
+ hideElement(prefix + "openbottombar", bottombarOpen);
+ hideElement(prefix + "closebottombar", !bottombarOpen);
+
+ hideElement(prefix + "whitelistsite", true);
+ hideElement(prefix + "whitelistpage", true);
+
+ let location = this.getCurrentLocation(window);
+ if (location && Policy.isBlockableScheme(location))
+ {
+ let host = null;
+ try
+ {
+ host = location.host.replace(/^www\./, "");
+ } catch (e) {}
+
+ if (host)
+ {
+ let ending = "|";
+ location = location.clone();
+ if (location instanceof Ci.nsIURL)
+ location.ref = "";
+ if (location instanceof Ci.nsIURL && location.query)
+ {
+ location.query = "";
+ ending = "?";
+ }
+
+ siteWhitelist = Filter.fromText("@@||" + host + "^$document");
+ setChecked(prefix + "whitelistsite", siteWhitelist.subscriptions.length && !siteWhitelist.disabled);
+ generateLabel(prefix + "whitelistsite", host);
+ hideElement(prefix + "whitelistsite", false);
+
+ pageWhitelist = Filter.fromText("@@|" + location.spec + ending + "$document");
+ setChecked(prefix + "whitelistpage", pageWhitelist.subscriptions.length && !pageWhitelist.disabled);
+ hideElement(prefix + "whitelistpage", false);
+ }
+ else
+ {
+ siteWhitelist = Filter.fromText("@@|" + location.spec + "|");
+ setChecked(prefix + "whitelistsite", siteWhitelist.subscriptions.length && !siteWhitelist.disabled);
+ generateLabel(prefix + "whitelistsite", location.spec.replace(/^mailto:/, ""));
+ hideElement(prefix + "whitelistsite", false);
+ }
+ }
+
+ setDisabled("abp-command-sendReport", !location || !Policy.isBlockableScheme(location) || location.scheme == "mailto");
+
+ setChecked(prefix + "disabled", !Prefs.enabled);
+ setChecked(prefix + "frameobjects", Prefs.frameobjects);
+ setChecked(prefix + "slowcollapse", !Prefs.fastcollapse);
+ setChecked(prefix + "savestats", Prefs.savestats);
+
+ let {defaultToolbarPosition, statusbarPosition} = require("appSupport");
+ let hasToolbar = defaultToolbarPosition;
+ let hasStatusBar = statusbarPosition;
+ hideElement(prefix + "showintoolbar", !hasToolbar || prefix == "abp-toolbar-");
+ hideElement(prefix + "showinstatusbar", !hasStatusBar);
+ hideElement(prefix + "iconSettingsSeparator", (prefix == "abp-toolbar-" || !hasToolbar) && !hasStatusBar);
+
+ setChecked(prefix + "showintoolbar", this.isToolbarIconVisible());
+ setChecked(prefix + "showinstatusbar", Prefs.showinstatusbar);
+
+ let {Sync} = require("sync");
+ let syncEngine = Sync.getEngine();
+ hideElement(prefix + "sync", !syncEngine);
+ setChecked(prefix + "sync", syncEngine && syncEngine.enabled);
+
+ let defAction = (!window.document.popupNode || window.document.popupNode.id == "abp-toolbarbutton" ?
+ Prefs.defaulttoolbaraction :
+ Prefs.defaultstatusbaraction);
+ setDefault(prefix + "openbottombar", defAction == 1);
+ setDefault(prefix + "closebottombar", defAction == 1);
+ setDefault(prefix + "filters", defAction == 2);
+ setDefault(prefix + "disabled", defAction == 3);
+
+ let popup = window.document.getElementById(prefix + "popup");
+ let items = (popup ? popup.querySelectorAll('menuitem[key]') : []);
+ for (let i = 0; i < items.length; i++)
+ {
+ let item = items[i];
+ let match = /^abp-key-/.exec(item.getAttribute("key"));
+ if (!match)
+ continue;
+
+ let name = match.input.substr(match.index + match[0].length);
+ if (!this.hotkeys)
+ this.configureKeys(window);
+ if (name in this.hotkeys)
+ {
+ let text = KeySelector.getTextForKey(this.hotkeys[name]);
+ if (text)
+ item.setAttribute("acceltext", text);
+ else
+ item.removeAttribute("acceltext");
+ }
+ }
+
+ hideElement(prefix + "contributebutton", Prefs.hideContributeButton);
+ },
+
+ /**
+ * Adds Adblock Plus menu items to the content area context menu when it shows
+ * up.
+ */
+ fillContentContextMenu: function(/**Element*/ popup)
+ {
+ let target = popup.triggerNode;
+ if (target instanceof Ci.nsIDOMHTMLMapElement || target instanceof Ci.nsIDOMHTMLAreaElement)
+ {
+ // HTML image maps will usually receive events when the mouse pointer is
+ // over a different element, get the real event target.
+ let rect = target.getClientRects()[0];
+ target = target.ownerDocument.elementFromPoint(Math.max(rect.left, 0), Math.max(rect.top, 0));
+ }
+
+ if (!target)
+ return;
+
+ let window = popup.ownerDocument.defaultView;
+ let menuItems = [];
+ let addMenuItem = function([node, nodeData])
+ {
+ let type = nodeData.typeDescr.toLowerCase();
+ if (type == "background")
+ {
+ type = "image";
+ node = null;
+ }
+
+ let label = this.overlay.attributes[type + "contextlabel"];
+ if (!label)
+ return;
+
+ let item = popup.ownerDocument.createElement("menuitem");
+ item.setAttribute("label", label);
+ item.setAttribute("class", "abp-contextmenuitem");
+ item.addEventListener("command", this.blockItem.bind(this, window, node, nodeData), false);
+ popup.appendChild(item);
+
+ menuItems.push(item);
+ }.bind(this);
+
+ // Look up data that we have for the node
+ let data = RequestNotifier.getDataForNode(target);
+ let hadImage = false;
+ if (data && !data[1].filter)
+ {
+ addMenuItem(data);
+ hadImage = (data[1].typeDescr == "IMAGE");
+ }
+
+ // Look for frame data
+ let wnd = Utils.getWindow(target);
+ if (wnd.frameElement)
+ {
+ let data = RequestNotifier.getDataForNode(wnd.frameElement, true);
+ if (data && !data[1].filter)
+ addMenuItem(data);
+ }
+
+ // Look for a background image
+ if (!hadImage)
+ {
+ let extractImageURL = function(computedStyle, property)
+ {
+ let value = computedStyle.getPropertyCSSValue(property);
+ // CSSValueList
+ if ("length" in value && value.length >= 1)
+ value = value[0];
+ // CSSValuePrimitiveType
+ if ("primitiveType" in value && value.primitiveType == value.CSS_URI)
+ return Utils.unwrapURL(value.getStringValue()).spec;
+
+ return null;
+ };
+
+ let node = target;
+ while (node)
+ {
+ if (node.nodeType == Ci.nsIDOMNode.ELEMENT_NODE)
+ {
+ let style = wnd.getComputedStyle(node, "");
+ let bgImage = extractImageURL(style, "background-image") || extractImageURL(style, "list-style-image");
+ if (bgImage)
+ {
+ let data = RequestNotifier.getDataForNode(wnd.document, true, Policy.type.IMAGE, bgImage);
+ if (data && !data[1].filter)
+ {
+ addMenuItem(data);
+ break;
+ }
+ }
+ }
+
+ node = node.parentNode;
+ }
+ }
+
+ // Add "Remove exception" menu item if necessary
+ let location = this.getCurrentLocation(window);
+ let filter = (location ? Policy.isWhitelisted(location.spec) : null);
+ if (filter && filter.subscriptions.length && !filter.disabled)
+ {
+ let label = this.overlay.attributes.whitelistcontextlabel;
+ if (!label)
+ return;
+
+ let item = popup.ownerDocument.createElement("menuitem");
+ item.setAttribute("label", label);
+ item.setAttribute("class", "abp-contextmenuitem");
+ item.addEventListener("command", this.toggleFilter.bind(this, filter), false);
+ popup.appendChild(item);
+
+ menuItems.push(item);
+ }
+
+ // Make sure to clean up everything once the context menu is closed
+ if (menuItems.length)
+ {
+ let cleanUp = function(event)
+ {
+ if (event.eventPhase != event.AT_TARGET)
+ return;
+
+ popup.removeEventListener("popuphidden", cleanUp, false);
+ for (let i = 0; i < menuItems.length; i++)
+ if (menuItems[i].parentNode)
+ menuItems[i].parentNode.removeChild(menuItems[i]);
+ }.bind(this);
+ popup.addEventListener("popuphidden", cleanUp, false);
+ }
+ },
+
+ /**
+ * Called when the user presses a key in the application window, reacts to our
+ * shortcut keys.
+ */
+ onKeyPress: function(/**Event*/ event)
+ {
+ if (!this.hotkeys)
+ this.configureKeys(event.currentTarget);
+
+ for (let key in this.hotkeys)
+ {
+ if (KeySelector.matchesKey(event, this.hotkeys[key]))
+ {
+ event.preventDefault();
+ let command = event.currentTarget.document.getElementById("abp-command-" + key);
+ if (command)
+ command.doCommand();
+ }
+ }
+ },
+
+ /**
+ * Checks whether the toolbar icon is currently displayed.
+ */
+ isToolbarIconVisible: function() /**Boolean*/
+ {
+ if (!CustomizableUI)
+ return false;
+ let placement = CustomizableUI.getPlacementOfWidget("abp-toolbarbutton");
+ return !!placement;
+ },
+
+ /**
+ * Stores the selected hotkeys, initialized when the user presses a key.
+ */
+ hotkeys: null,
+
+ /**
+ * Chooses shortcut keys that are available in the window according to
+ * preferences.
+ */
+ configureKeys: function(/**Window*/ window)
+ {
+ let selector = new KeySelector(window);
+
+ this.hotkeys = {};
+ for (let name in Prefs)
+ {
+ let match = /_key$/.exec(name);
+ if (match && typeof Prefs[name] == "string")
+ {
+ let keyName = match.input.substr(0, match.index);
+ this.hotkeys[keyName] = selector.selectKey(Prefs[name]);
+ }
+ }
+ },
+
+ /**
+ * Toggles open/closed state of the blockable items list.
+ */
+ toggleBottombar: function(/**Window*/ window)
+ {
+ if (detachedBottombar && !detachedBottombar.closed)
+ {
+ detachedBottombar.close();
+ detachedBottombar = null;
+ }
+ else
+ {
+ let {addBottomBar, removeBottomBar, getBrowser} = require("appSupport");
+ let mustDetach = !addBottomBar || !removeBottomBar || !("abp-bottombar-container" in this.overlay);
+ let detach = mustDetach || Prefs.detachsidebar;
+ if (!detach && window.document.getElementById("abp-bottombar"))
+ {
+ removeBottomBar(window);
+
+ let browser = (getBrowser ? getBrowser(window) : null);
+ if (browser)
+ browser.contentWindow.focus();
+ }
+ else if (!detach)
+ {
+ addBottomBar(window, this.overlay["abp-bottombar-container"]);
+ let element = window.document.getElementById("abp-bottombar");
+ if (element)
+ {
+ element.setAttribute("width", Prefs.blockableItemsSize.width);
+ element.setAttribute("height", Prefs.blockableItemsSize.height);
+
+ let splitter = window.document.getElementById("abp-bottombar-splitter");
+ if (splitter)
+ {
+ splitter.addEventListener("command", function()
+ {
+ Prefs.blockableItemsSize = {width: element.width, height: element.height};
+ }, false);
+ }
+ }
+ }
+ else
+ detachedBottombar = window.openDialog("chrome://adblockplus/content/ui/sidebarDetached.xul", "_blank", "chrome,resizable,dependent,dialog=no", mustDetach);
+ }
+ },
+
+ /**
+ * Hide contribute button and persist this choice.
+ */
+ hideContributeButton: function(/**Window*/ window)
+ {
+ Prefs.hideContributeButton = true;
+
+ for (let id of ["abp-status-contributebutton", "abp-toolbar-contributebutton", "abp-menuitem-contributebutton"])
+ {
+ let button = window.document.getElementById(id);
+ if (button)
+ button.hidden = true;
+ }
+ },
+
+ showNextNotification: function(url)
+ {
+ let window = this.currentWindow;
+ if (!window)
+ return;
+
+ let button = window.document.getElementById("abp-toolbarbutton")
+ || window.document.getElementById("abp-status");
+ if (!button)
+ return;
+
+ let notification = Notification.getNextToShow(url);
+ if (!notification)
+ return;
+
+ this._showNotification(window, button, notification);
+ },
+
+ _showNotification: function(window, button, notification)
+ {
+ let panel = window.document.getElementById("abp-notification");
+ if (panel.state !== "closed")
+ return;
+
+ function insertMessage(element, text, links)
+ {
+ let match = /^(.*?)<(a|strong)>(.*?)<\/\2>(.*)$/.exec(text);
+ if (!match)
+ {
+ element.appendChild(window.document.createTextNode(text));
+ return;
+ }
+
+ let [_, before, tagName, value, after] = match;
+
+ insertMessage(element, before, links);
+
+ let newElement = window.document.createElementNS("http://www.w3.org/1999/xhtml", tagName);
+ if (tagName === "a" && links && links.length)
+ newElement.setAttribute("href", links.shift());
+ insertMessage(newElement, value, links);
+ element.appendChild(newElement);
+
+ insertMessage(element, after, links);
+ }
+
+ let texts = Notification.getLocalizedTexts(notification);
+ let titleElement = window.document.getElementById("abp-notification-title");
+ titleElement.textContent = texts.title;
+ let messageElement = window.document.getElementById("abp-notification-message");
+ messageElement.innerHTML = "";
+ let docLinks = [];
+ for (let link of notification.links)
+ docLinks.push(Utils.getDocLink(link));
+ insertMessage(messageElement, texts.message, docLinks);
+
+ messageElement.addEventListener("click", function(event)
+ {
+ let link = event.target;
+ while (link && link !== messageElement && link.localName !== "a")
+ link = link.parentNode;
+ if (!link || link.localName !== "a")
+ return;
+ event.preventDefault();
+ event.stopPropagation();
+ this.loadInBrowser(link.href, window);
+ }.bind(this));
+
+ if (notification.type === "question")
+ {
+ function buttonHandler(approved, event)
+ {
+ event.preventDefault();
+ event.stopPropagation();
+ panel.hidePopup();
+ Notification.triggerQuestionListeners(notification.id, approved)
+ Notification.markAsShown(notification.id);
+ }
+ window.document.getElementById("abp-notification-yes").onclick = buttonHandler.bind(null, true);
+ window.document.getElementById("abp-notification-no").onclick = buttonHandler.bind(null, false);
+ }
+
+ panel.setAttribute("class", "abp-" + notification.type);
+ panel.setAttribute("noautohide", notification.type === "question");
+ panel.openPopup(button, "bottomcenter topcenter", 0, 0, false, false, null);
+ }
+};
+UI.onPopupShowing = UI.onPopupShowing.bind(UI);
+UI.onKeyPress = UI.onKeyPress.bind(UI);
+UI.onIconClick = UI.onIconClick.bind(UI);
+UI.init();
+
+/**
+ * List of event handers to be registered for each window. For each event
+ * handler the element ID, event and the actual event handler are listed.
+ * @type Array
+ */
+let eventHandlers = [
+ ["abp-command-sendReport", "command", UI.openReportDialog.bind(UI)],
+ ["abp-command-filters", "command", UI.openFiltersDialog.bind(UI)],
+ ["abp-command-sidebar", "command", UI.toggleBottombar.bind(UI)],
+ ["abp-command-togglesitewhitelist", "command", function() { UI.toggleFilter(siteWhitelist); }],
+ ["abp-command-togglepagewhitelist", "command", function() { UI.toggleFilter(pageWhitelist); }],
+ ["abp-command-toggleobjtabs", "command", UI.togglePref.bind(UI, "frameobjects")],
+ ["abp-command-togglecollapse", "command", UI.togglePref.bind(UI, "fastcollapse")],
+ ["abp-command-togglesavestats", "command", UI.toggleSaveStats.bind(UI)],
+ ["abp-command-togglesync", "command", UI.toggleSync.bind(UI)],
+ ["abp-command-toggleshowintoolbar", "command", UI.toggleToolbarIcon.bind(UI)],
+ ["abp-command-toggleshowinstatusbar", "command", UI.togglePref.bind(UI, "showinstatusbar")],
+ ["abp-command-enable", "command", UI.togglePref.bind(UI, "enabled")],
+ ["abp-command-contribute", "command", UI.openContributePage.bind(UI)],
+ ["abp-command-contribute-hide", "command", UI.hideContributeButton.bind(UI)]
+];
+
+onShutdown.add(function()
+{
+ for (let window in UI.applicationWindows)
+ if (UI.isBottombarOpen(window))
+ UI.toggleBottombar(window);
+});
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/utils.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/utils.js
new file mode 100644
index 0000000..8fbdf3e
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/utils.js
@@ -0,0 +1,787 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Module containing a bunch of utility functions.
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+let sidebarParams = null;
+
+/**
+ * Provides a bunch of utility functions.
+ * @class
+ */
+let Utils = exports.Utils =
+{
+ /**
+ * Returns the add-on ID used by Adblock Plus
+ */
+ get addonID()
+ {
+ let {addonID} = require("info");
+ return addonID;
+ },
+
+ /**
+ * Returns the installed Adblock Plus version
+ */
+ get addonVersion()
+ {
+ let {addonVersion} = require("info");
+ return addonVersion;
+ },
+
+ /**
+ * Returns whether we are running in Fennec, for Fennec-specific hacks
+ * @type Boolean
+ */
+ get isFennec()
+ {
+ let {application} = require("info");
+ let result = (application == "fennec" || application == "fennec2");
+ Utils.__defineGetter__("isFennec", () => result);
+ return result;
+ },
+
+ /**
+ * Returns the user interface locale selected for adblockplus chrome package.
+ */
+ get appLocale()
+ {
+ let locale = "en-US";
+ try
+ {
+ locale = Utils.chromeRegistry.getSelectedLocale("adblockplus");
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ }
+ Utils.__defineGetter__("appLocale", () => locale);
+ return Utils.appLocale;
+ },
+
+ /**
+ * Returns version of the Gecko platform
+ */
+ get platformVersion()
+ {
+ let platformVersion = Services.appinfo.platformVersion;
+ Utils.__defineGetter__("platformVersion", () => platformVersion);
+ return Utils.platformVersion;
+ },
+
+ /**
+ * Retrieves a string from global.properties string bundle, will throw if string isn't found.
+ *
+ * @param {String} name string name
+ * @return {String}
+ */
+ getString: function(name)
+ {
+ // Randomize URI to work around bug 719376
+ let stringBundle = Services.strings.createBundle("chrome://adblockplus/locale/global.properties?" + Math.random());
+ Utils.getString = function(name)
+ {
+ return stringBundle.GetStringFromName(name);
+ }
+ return Utils.getString(name);
+ },
+
+ /**
+ * Shows an alert message like window.alert() but with a custom title.
+ *
+ * @param {Window} parentWindow parent window of the dialog (can be null)
+ * @param {String} message message to be displayed
+ * @param {String} [title] dialog title, default title will be used if omitted
+ */
+ alert: function(parentWindow, message, title)
+ {
+ if (!title)
+ title = Utils.getString("default_dialog_title");
+ Utils.promptService.alert(parentWindow, title, message);
+ },
+
+ /**
+ * Asks the user for a confirmation like window.confirm() but with a custom title.
+ *
+ * @param {Window} parentWindow parent window of the dialog (can be null)
+ * @param {String} message message to be displayed
+ * @param {String} [title] dialog title, default title will be used if omitted
+ * @return {Bool}
+ */
+ confirm: function(parentWindow, message, title)
+ {
+ if (!title)
+ title = Utils.getString("default_dialog_title");
+ return Utils.promptService.confirm(parentWindow, title, message);
+ },
+
+ /**
+ * Retrieves the window for a document node.
+ * @return {Window} will be null if the node isn't associated with a window
+ */
+ getWindow: function(/**Node*/ node)
+ {
+ if ("ownerDocument" in node && node.ownerDocument)
+ node = node.ownerDocument;
+
+ if ("defaultView" in node)
+ return node.defaultView;
+
+ return null;
+ },
+
+ /**
+ * Retrieves the top-level chrome window for a content window.
+ */
+ getChromeWindow: function(/**Window*/ window) /**Window*/
+ {
+ return window.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIWebNavigation)
+ .QueryInterface(Ci.nsIDocShellTreeItem)
+ .rootTreeItem
+ .QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIDOMWindow);
+ },
+
+ /**
+ * If the window doesn't have its own security context (e.g. about:blank or
+ * data: URL) walks up the parent chain until a window is found that has a
+ * security context.
+ */
+ getOriginWindow: function(/**Window*/ wnd) /**Window*/
+ {
+ while (wnd != wnd.parent)
+ {
+ let uri = Utils.makeURI(wnd.location.href);
+ if (uri.spec != "about:blank" && uri.spec != "moz-safe-about:blank" &&
+ !Utils.netUtils.URIChainHasFlags(uri, Ci.nsIProtocolHandler.URI_INHERITS_SECURITY_CONTEXT))
+ {
+ break;
+ }
+ wnd = wnd.parent;
+ }
+ return wnd;
+ },
+
+ /**
+ * If a protocol using nested URIs like jar: is used - retrieves innermost
+ * nested URI.
+ */
+ unwrapURL: function(/**nsIURI or String*/ url) /**nsIURI*/
+ {
+ if (!(url instanceof Ci.nsIURI))
+ url = Utils.makeURI(url);
+
+ if (url instanceof Ci.nsINestedURI)
+ return url.innermostURI;
+ else
+ return url;
+ },
+
+ /**
+ * Translates a string URI into its nsIURI representation, will return null for
+ * invalid URIs.
+ */
+ makeURI: function(/**String*/ url) /**nsIURI*/
+ {
+ try
+ {
+ return Utils.ioService.newURI(url, null, null);
+ }
+ catch (e) {
+ return null;
+ }
+ },
+
+ /**
+ * Posts an action to the event queue of the current thread to run it
+ * asynchronously. Any additional parameters to this function are passed
+ * as parameters to the callback.
+ */
+ runAsync: function(/**Function*/ callback, /**Object*/ thisPtr)
+ {
+ let params = Array.prototype.slice.call(arguments, 2);
+ let runnable = {
+ run: function()
+ {
+ callback.apply(thisPtr, params);
+ }
+ };
+ Services.tm.currentThread.dispatch(runnable, Ci.nsIEventTarget.DISPATCH_NORMAL);
+ },
+
+ /**
+ * Gets the DOM window associated with a particular request (if any).
+ */
+ getRequestWindow: function(/**nsIChannel*/ channel) /**nsIDOMWindow*/
+ {
+ try
+ {
+ if (channel.notificationCallbacks)
+ return channel.notificationCallbacks.getInterface(Ci.nsILoadContext).associatedWindow;
+ } catch(e) {}
+
+ try
+ {
+ if (channel.loadGroup && channel.loadGroup.notificationCallbacks)
+ return channel.loadGroup.notificationCallbacks.getInterface(Ci.nsILoadContext).associatedWindow;
+ } catch(e) {}
+
+ return null;
+ },
+
+ /**
+ * Generates filter subscription checksum.
+ *
+ * @param {Array of String} lines filter subscription lines (with checksum line removed)
+ * @return {String} checksum or null
+ */
+ generateChecksum: function(lines)
+ {
+ let stream = null;
+ try
+ {
+ // Checksum is an MD5 checksum (base64-encoded without the trailing "=") of
+ // all lines in UTF-8 without the checksum line, joined with "\n".
+
+ let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
+ converter.charset = "UTF-8";
+ stream = converter.convertToInputStream(lines.join("\n"));
+
+ let hashEngine = Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash);
+ hashEngine.init(hashEngine.MD5);
+ hashEngine.updateFromStream(stream, stream.available());
+ return hashEngine.finish(true).replace(/=+$/, "");
+ }
+ catch (e)
+ {
+ return null;
+ }
+ finally
+ {
+ if (stream)
+ stream.close();
+ }
+ },
+
+ /**
+ * Formats a unix time according to user's locale.
+ * @param {Integer} time unix time in milliseconds
+ * @return {String} formatted date and time
+ */
+ formatTime: function(time)
+ {
+ try
+ {
+ let date = new Date(time);
+ return Utils.dateFormatter.FormatDateTime("", Ci.nsIScriptableDateFormat.dateFormatShort,
+ Ci.nsIScriptableDateFormat.timeFormatNoSeconds,
+ date.getFullYear(), date.getMonth() + 1, date.getDate(),
+ date.getHours(), date.getMinutes(), date.getSeconds());
+ }
+ catch(e)
+ {
+ // Make sure to return even on errors
+ Cu.reportError(e);
+ return "";
+ }
+ },
+
+ /**
+ * Checks whether any of the prefixes listed match the application locale,
+ * returns matching prefix if any.
+ */
+ checkLocalePrefixMatch: function(/**String*/ prefixes) /**String*/
+ {
+ if (!prefixes)
+ return null;
+
+ let appLocale = Utils.appLocale;
+ for (let prefix of prefixes.split(/,/))
+ if (new RegExp("^" + prefix + "\\b").test(appLocale))
+ return prefix;
+
+ return null;
+ },
+
+ /**
+ * Chooses the best filter subscription for user's language.
+ */
+ chooseFilterSubscription: function(/**NodeList*/ subscriptions) /**Node*/
+ {
+ let selectedItem = null;
+ let selectedPrefix = null;
+ let matchCount = 0;
+ for (let i = 0; i < subscriptions.length; i++)
+ {
+ let subscription = subscriptions[i];
+ if (!selectedItem)
+ selectedItem = subscription;
+
+ let prefix = Utils.checkLocalePrefixMatch(subscription.getAttribute("prefixes"));
+ if (prefix)
+ {
+ if (!selectedPrefix || selectedPrefix.length < prefix.length)
+ {
+ selectedItem = subscription;
+ selectedPrefix = prefix;
+ matchCount = 1;
+ }
+ else if (selectedPrefix && selectedPrefix.length == prefix.length)
+ {
+ matchCount++;
+
+ // If multiple items have a matching prefix of the same length:
+ // Select one of the items randomly, probability should be the same
+ // for all items. So we replace the previous match here with
+ // probability 1/N (N being the number of matches).
+ if (Math.random() * matchCount < 1)
+ {
+ selectedItem = subscription;
+ selectedPrefix = prefix;
+ }
+ }
+ }
+ }
+ return selectedItem;
+ },
+
+ /**
+ * Pauses code execution and allows events to be processed. Warning:
+ * other extension code might execute, the extension might even shut down.
+ */
+ yield: function()
+ {
+ let {Prefs} = require("prefs");
+ if (Prefs.please_kill_startup_performance)
+ {
+ this.yield = function() {};
+ return;
+ }
+ let thread = Services.tm.currentThread;
+ while (thread.processNextEvent(false));
+ },
+
+ /**
+ * Saves sidebar state before detaching/reattaching
+ */
+ setParams: function(params)
+ {
+ sidebarParams = params;
+ },
+
+ /**
+ * Retrieves and removes sidebar state after detaching/reattaching
+ */
+ getParams: function()
+ {
+ let ret = sidebarParams;
+ sidebarParams = null;
+ return ret;
+ },
+
+ /**
+ * Verifies RSA signature. The public key and signature should be base64-encoded.
+ */
+ verifySignature: function(/**String*/ key, /**String*/ signature, /**String*/ data) /**Boolean*/
+ {
+ if (!Utils.crypto)
+ return false;
+
+ // Maybe we did the same check recently, look it up in the cache
+ if (!("_cache" in Utils.verifySignature))
+ Utils.verifySignature._cache = new Cache(5);
+ let cache = Utils.verifySignature._cache;
+ let cacheKey = key + " " + signature + " " + data;
+ if (cacheKey in cache.data)
+ return cache.data[cacheKey];
+ else
+ cache.add(cacheKey, false);
+
+ let keyInfo, pubKey, context;
+ try
+ {
+ let keyItem = Utils.crypto.getSECItem(atob(key));
+ keyInfo = Utils.crypto.SECKEY_DecodeDERSubjectPublicKeyInfo(keyItem.address());
+ if (keyInfo.isNull())
+ throw new Error("SECKEY_DecodeDERSubjectPublicKeyInfo failed");
+
+ pubKey = Utils.crypto.SECKEY_ExtractPublicKey(keyInfo);
+ if (pubKey.isNull())
+ throw new Error("SECKEY_ExtractPublicKey failed");
+
+ let signatureItem = Utils.crypto.getSECItem(atob(signature));
+
+ context = Utils.crypto.VFY_CreateContext(pubKey, signatureItem.address(), Utils.crypto.SEC_OID_ISO_SHA_WITH_RSA_SIGNATURE, null);
+ if (context.isNull())
+ return false; // This could happen if the signature is invalid
+
+ let error = Utils.crypto.VFY_Begin(context);
+ if (error < 0)
+ throw new Error("VFY_Begin failed");
+
+ error = Utils.crypto.VFY_Update(context, data, data.length);
+ if (error < 0)
+ throw new Error("VFY_Update failed");
+
+ error = Utils.crypto.VFY_End(context);
+ if (error < 0)
+ return false;
+
+ cache.data[cacheKey] = true;
+ return true;
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ return false;
+ }
+ finally
+ {
+ if (keyInfo && !keyInfo.isNull())
+ Utils.crypto.SECKEY_DestroySubjectPublicKeyInfo(keyInfo);
+ if (pubKey && !pubKey.isNull())
+ Utils.crypto.SECKEY_DestroyPublicKey(pubKey);
+ if (context && !context.isNull())
+ Utils.crypto.VFY_DestroyContext(context, true);
+ }
+ },
+
+ /**
+ * Returns the documentation link from the preferences.
+ */
+ getDocLink: function(/**String*/ linkID)
+ {
+ let {Prefs} = require("prefs");
+ let docLink = Prefs.documentation_link;
+ return docLink.replace(/%LINK%/g, linkID).replace(/%LANG%/g, Utils.appLocale);
+ },
+
+ /**
+ * Splits up a combined label into the label and access key components.
+ *
+ * @return {Array} An array with two strings: label and access key
+ */
+ splitLabel: function(/**String*/ label)
+ {
+ let match = /^(.*)\s*\(&(.)\)\s*(\u2026?)$/.exec(label);
+ if (match)
+ {
+ // Access key not part of the label
+ return [match[1] + match[3], match[2]];
+ }
+ else
+ {
+ // Access key part of the label
+ let pos = label.indexOf("&");
+ if (pos >= 0 && pos < label.length - 1)
+ return [label.substr(0, pos) + label.substr(pos + 1), label[pos + 1]];
+ else
+ return [label, ""];
+ }
+ },
+
+ /**
+ * Split all labels starting from a particular DOM node.
+ */
+ splitAllLabels: function(/**DOMNode*/ root)
+ {
+ let attrMap = {
+ __proto__: null,
+ "label": "value",
+ "setting": "title"
+ };
+
+ let elements = root.querySelectorAll("*[label], label[value], setting[title]");
+ for (let i = 0; i < elements.length; i++)
+ {
+ let element = elements[i];
+ let attr = (element.localName in attrMap ? attrMap[element.localName] : "label");
+ let origLabel = element.getAttribute(attr);
+
+ let [label, accesskey] = this.splitLabel(origLabel);
+ if (label != origLabel)
+ element.setAttribute(attr, label);
+ if (accesskey != "")
+ element.setAttribute("accesskey", accesskey);
+
+ // Labels forward changes of the accessKey property to their control, only
+ // set it for actual controls.
+ if (element.localName != "label")
+ element.accessKey = accesskey;
+ }
+ }
+};
+
+/**
+ * A cache with a fixed capacity, newer entries replace entries that have been
+ * stored first.
+ * @constructor
+ */
+function Cache(/**Integer*/ size)
+{
+ this._ringBuffer = new Array(size);
+ this.data = {__proto__: null};
+}
+exports.Cache = Cache;
+
+Cache.prototype =
+{
+ /**
+ * Ring buffer storing hash keys, allows determining which keys need to be
+ * evicted.
+ * @type Array
+ */
+ _ringBuffer: null,
+
+ /**
+ * Index in the ring buffer to be written next.
+ * @type Integer
+ */
+ _bufferIndex: 0,
+
+ /**
+ * Cache data, maps values to the keys. Read-only access, for writing use
+ * add() method.
+ * @type Object
+ */
+ data: null,
+
+ /**
+ * Adds a key and the corresponding value to the cache.
+ */
+ add: function(/**String*/ key, value)
+ {
+ if (!(key in this.data))
+ {
+ // This is a new key - we need to add it to the ring buffer and evict
+ // another entry instead.
+ let oldKey = this._ringBuffer[this._bufferIndex];
+ if (typeof oldKey != "undefined")
+ delete this.data[oldKey];
+ this._ringBuffer[this._bufferIndex] = key;
+
+ this._bufferIndex++;
+ if (this._bufferIndex >= this._ringBuffer.length)
+ this._bufferIndex = 0;
+ }
+
+ this.data[key] = value;
+ },
+
+ /**
+ * Clears cache contents.
+ */
+ clear: function()
+ {
+ this._ringBuffer = new Array(this._ringBuffer.length);
+ this.data = {__proto__: null};
+ }
+}
+
+// Getters for common services, this should be replaced by Services.jsm in future
+
+XPCOMUtils.defineLazyServiceGetter(Utils, "categoryManager", "@mozilla.org/categorymanager;1", "nsICategoryManager");
+XPCOMUtils.defineLazyServiceGetter(Utils, "ioService", "@mozilla.org/network/io-service;1", "nsIIOService");
+XPCOMUtils.defineLazyServiceGetter(Utils, "promptService", "@mozilla.org/embedcomp/prompt-service;1", "nsIPromptService");
+XPCOMUtils.defineLazyServiceGetter(Utils, "effectiveTLD", "@mozilla.org/network/effective-tld-service;1", "nsIEffectiveTLDService");
+XPCOMUtils.defineLazyServiceGetter(Utils, "netUtils", "@mozilla.org/network/util;1", "nsINetUtil");
+XPCOMUtils.defineLazyServiceGetter(Utils, "styleService", "@mozilla.org/content/style-sheet-service;1", "nsIStyleSheetService");
+XPCOMUtils.defineLazyServiceGetter(Utils, "prefService", "@mozilla.org/preferences-service;1", "nsIPrefService");
+XPCOMUtils.defineLazyServiceGetter(Utils, "versionComparator", "@mozilla.org/xpcom/version-comparator;1", "nsIVersionComparator");
+XPCOMUtils.defineLazyServiceGetter(Utils, "windowMediator", "@mozilla.org/appshell/window-mediator;1", "nsIWindowMediator");
+XPCOMUtils.defineLazyServiceGetter(Utils, "windowWatcher", "@mozilla.org/embedcomp/window-watcher;1", "nsIWindowWatcher");
+XPCOMUtils.defineLazyServiceGetter(Utils, "chromeRegistry", "@mozilla.org/chrome/chrome-registry;1", "nsIXULChromeRegistry");
+XPCOMUtils.defineLazyServiceGetter(Utils, "systemPrincipal", "@mozilla.org/systemprincipal;1", "nsIPrincipal");
+XPCOMUtils.defineLazyServiceGetter(Utils, "dateFormatter", "@mozilla.org/intl/scriptabledateformat;1", "nsIScriptableDateFormat");
+XPCOMUtils.defineLazyServiceGetter(Utils, "childMessageManager", "@mozilla.org/childprocessmessagemanager;1", "nsISyncMessageSender");
+XPCOMUtils.defineLazyServiceGetter(Utils, "parentMessageManager", "@mozilla.org/parentprocessmessagemanager;1", "nsIFrameMessageManager");
+XPCOMUtils.defineLazyServiceGetter(Utils, "httpProtocol", "@mozilla.org/network/protocol;1?name=http", "nsIHttpProtocolHandler");
+XPCOMUtils.defineLazyServiceGetter(Utils, "clipboard", "@mozilla.org/widget/clipboard;1", "nsIClipboard");
+XPCOMUtils.defineLazyServiceGetter(Utils, "clipboardHelper", "@mozilla.org/widget/clipboardhelper;1", "nsIClipboardHelper");
+XPCOMUtils.defineLazyGetter(Utils, "crypto", function()
+{
+ try
+ {
+ let ctypes = Components.utils.import("resource://gre/modules/ctypes.jsm", null).ctypes;
+
+ let nsslib;
+ try
+ {
+ nsslib = ctypes.open(ctypes.libraryName("nss3"));
+ }
+ catch (e)
+ {
+ // It seems that on Mac OS X the full path name needs to be specified
+ let file = Services.dirsvc.get("GreD", Ci.nsILocalFile);
+ file.append(ctypes.libraryName("nss3"));
+ nsslib = ctypes.open(file.path);
+ }
+
+ let result = {};
+
+ // seccomon.h
+ result.siUTF8String = 14;
+
+ // secoidt.h
+ result.SEC_OID_ISO_SHA_WITH_RSA_SIGNATURE = 15;
+
+ // The following types are opaque to us
+ result.VFYContext = ctypes.void_t;
+ result.SECKEYPublicKey = ctypes.void_t;
+ result.CERTSubjectPublicKeyInfo = ctypes.void_t;
+
+ /*
+ * seccomon.h
+ * struct SECItemStr {
+ * SECItemType type;
+ * unsigned char *data;
+ * unsigned int len;
+ * };
+ */
+ result.SECItem = ctypes.StructType("SECItem", [
+ {type: ctypes.int},
+ {data: ctypes.unsigned_char.ptr},
+ {len: ctypes.int}
+ ]);
+
+ /*
+ * cryptohi.h
+ * extern VFYContext *VFY_CreateContext(SECKEYPublicKey *key, SECItem *sig,
+ * SECOidTag sigAlg, void *wincx);
+ */
+ result.VFY_CreateContext = nsslib.declare(
+ "VFY_CreateContext",
+ ctypes.default_abi, result.VFYContext.ptr,
+ result.SECKEYPublicKey.ptr,
+ result.SECItem.ptr,
+ ctypes.int,
+ ctypes.voidptr_t
+ );
+
+ /*
+ * cryptohi.h
+ * extern void VFY_DestroyContext(VFYContext *cx, PRBool freeit);
+ */
+ result.VFY_DestroyContext = nsslib.declare(
+ "VFY_DestroyContext",
+ ctypes.default_abi, ctypes.void_t,
+ result.VFYContext.ptr,
+ ctypes.bool
+ );
+
+ /*
+ * cryptohi.h
+ * extern SECStatus VFY_Begin(VFYContext *cx);
+ */
+ result.VFY_Begin = nsslib.declare("VFY_Begin",
+ ctypes.default_abi, ctypes.int,
+ result.VFYContext.ptr
+ );
+
+ /*
+ * cryptohi.h
+ * extern SECStatus VFY_Update(VFYContext *cx, const unsigned char *input,
+ * unsigned int inputLen);
+ */
+ result.VFY_Update = nsslib.declare(
+ "VFY_Update",
+ ctypes.default_abi, ctypes.int,
+ result.VFYContext.ptr,
+ ctypes.unsigned_char.ptr,
+ ctypes.int
+ );
+
+ /*
+ * cryptohi.h
+ * extern SECStatus VFY_End(VFYContext *cx);
+ */
+ result.VFY_End = nsslib.declare(
+ "VFY_End",
+ ctypes.default_abi, ctypes.int,
+ result.VFYContext.ptr
+ );
+
+ /*
+ * keyhi.h
+ * extern CERTSubjectPublicKeyInfo *
+ * SECKEY_DecodeDERSubjectPublicKeyInfo(SECItem *spkider);
+ */
+ result.SECKEY_DecodeDERSubjectPublicKeyInfo = nsslib.declare(
+ "SECKEY_DecodeDERSubjectPublicKeyInfo",
+ ctypes.default_abi, result.CERTSubjectPublicKeyInfo.ptr,
+ result.SECItem.ptr
+ );
+
+ /*
+ * keyhi.h
+ * extern void SECKEY_DestroySubjectPublicKeyInfo(CERTSubjectPublicKeyInfo *spki);
+ */
+ result.SECKEY_DestroySubjectPublicKeyInfo = nsslib.declare(
+ "SECKEY_DestroySubjectPublicKeyInfo",
+ ctypes.default_abi, ctypes.void_t,
+ result.CERTSubjectPublicKeyInfo.ptr
+ );
+
+ /*
+ * keyhi.h
+ * extern SECKEYPublicKey *
+ * SECKEY_ExtractPublicKey(CERTSubjectPublicKeyInfo *);
+ */
+ result.SECKEY_ExtractPublicKey = nsslib.declare(
+ "SECKEY_ExtractPublicKey",
+ ctypes.default_abi, result.SECKEYPublicKey.ptr,
+ result.CERTSubjectPublicKeyInfo.ptr
+ );
+
+ /*
+ * keyhi.h
+ * extern void SECKEY_DestroyPublicKey(SECKEYPublicKey *key);
+ */
+ result.SECKEY_DestroyPublicKey = nsslib.declare(
+ "SECKEY_DestroyPublicKey",
+ ctypes.default_abi, ctypes.void_t,
+ result.SECKEYPublicKey.ptr
+ );
+
+ // Convenience method
+ result.getSECItem = function(data)
+ {
+ var dataArray = new ctypes.ArrayType(ctypes.unsigned_char, data.length)();
+ for (let i = 0; i < data.length; i++)
+ dataArray[i] = data.charCodeAt(i) % 256;
+ return new result.SECItem(result.siUTF8String, dataArray, dataArray.length);
+ };
+
+ return result;
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ // Expected, ctypes isn't supported in Gecko 1.9.2
+ return null;
+ }
+});
+
+if ("@mozilla.org/messenger/headerparser;1" in Cc)
+ XPCOMUtils.defineLazyServiceGetter(Utils, "headerParser", "@mozilla.org/messenger/headerparser;1", "nsIMsgHeaderParser");
+else
+ Utils.headerParser = null;
diff --git a/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/windowObserver.js b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/windowObserver.js
new file mode 100644
index 0000000..eb0b13a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/windowObserver.js
@@ -0,0 +1,112 @@
+/*
+ * This file is part of the Adblock Plus build tools,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+exports.WindowObserver = WindowObserver;
+
+/**
+ * This class will call listener's method applyToWindow() for all new chrome
+ * windows being opened. It will also call listener's method removeFromWindow()
+ * for all windows still open when the extension is shut down.
+ * @param {Object} listener
+ * @param {String} [when] when to execute applyToWindow(). "start" means immediately
+ * when the window opens, "ready" when its contents are available
+ * and "end" (default) means to wait until the "load" event.
+ * @constructor
+ */
+function WindowObserver(listener, when)
+{
+ this._listener = listener;
+ this._when = when;
+
+ let windows = [];
+ let e = Services.wm.getZOrderDOMWindowEnumerator(null, true);
+ while (e.hasMoreElements())
+ windows.push(e.getNext());
+
+ // Check if there are any windows that we missed
+ let eAll = Services.ww.getWindowEnumerator();
+ while (eAll.hasMoreElements())
+ {
+ let element = eAll.getNext();
+ if (windows.indexOf(element) < 0)
+ windows.push(element);
+ }
+
+ for (let i = 0; i < windows.length; i++)
+ {
+ let window = windows[i].QueryInterface(Ci.nsIDOMWindow);
+ if (when == "start" || window.document.readyState == "complete")
+ this._listener.applyToWindow(window);
+ else
+ this.observe(window, "chrome-document-global-created", null);
+ }
+
+ Services.obs.addObserver(this, "chrome-document-global-created", true);
+
+ this._shutdownHandler = function()
+ {
+ let e = Services.ww.getWindowEnumerator();
+ while (e.hasMoreElements())
+ this._listener.removeFromWindow(e.getNext().QueryInterface(Ci.nsIDOMWindow));
+
+ Services.obs.removeObserver(this, "chrome-document-global-created");
+ }.bind(this);
+ onShutdown.add(this._shutdownHandler);
+}
+WindowObserver.prototype =
+{
+ _listener: null,
+ _when: null,
+ _shutdownHandler: null,
+
+ shutdown: function()
+ {
+ if (!this._shutdownHandler)
+ return;
+
+ onShutdown.remove(this._shutdownHandler);
+ this._shutdownHandler();
+ this._shutdownHandler = null;
+ },
+
+ observe: function(subject, topic, data)
+ {
+ if (topic == "chrome-document-global-created")
+ {
+ let window = subject.QueryInterface(Ci.nsIDOMWindow);
+ if (this._when == "start")
+ {
+ this._listener.applyToWindow(window);
+ return;
+ }
+
+ let event = (this._when == "ready" ? "DOMContentLoaded" : "load");
+ let listener = function()
+ {
+ window.removeEventListener(event, listener, false);
+ if (this._shutdownHandler)
+ this._listener.applyToWindow(window);
+ }.bind(this);
+ window.addEventListener(event, listener, false);
+ }
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver])
+};
diff --git a/helpers/DATA/firefox/gnu/searchplugins/duckduckgo.xml b/helpers/DATA/firefox/gnu/searchplugins/duckduckgo.xml
new file mode 100644
index 0000000..427194f
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/searchplugins/duckduckgo.xml
@@ -0,0 +1,8 @@
+<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/" xmlns:os="http://a9.com/-/spec/opensearch/1.1/">
+<os:ShortName>DuckDuckGo</os:ShortName>
+<os:Description>Search DuckDuckGo (SSL)</os:Description>
+<os:InputEncoding>UTF-8</os:InputEncoding>
+<os:Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAANcNAADXDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJyDsJmlk8pf6+v3s/v7+++zr/fcnIOyzJyDsgCcg7CYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnIOwBJyDscCcg7PZttJ7/7Pfs//////++xO7/S5GA/ycg7P8nIOz2JyDscCcg7AEAAAAAAAAAAAAAAAAnIOwBJyDstScg7P8nIOz/Y8p5/2fHZf9Yv0z/YcF2/1rBUv8nIOz/JyDs/ycg7P8nIOy1JyDsAQAAAAAAAAAAJyDscCcg7P8nIOz/JyDs/4jQoP/p9+n//////05X3v9LkYD/JyDs/ycg7P8nIOz/JyDs/ycg7HAAAAAAJyDsJicg7PYnIOz/JyDs/zUu7f/+/v////////////89N+7/JyDs/yUo7f8nIOz/JyDs/ycg7P8nIOz2JyDsJicg7IAnIOz/JyDs/ycg7P9hXPH////////////t/P//GIr2/wfD+/8Gyfz/DKv5/yM57/8nIOz/JyDs/ycg7H8nIOyzJyDs/ycg7P8nIOz/jov1////////////Otz9/w3G/P8cWfH/JSvt/ycg7P8nIOz/JyDs/ycg7P8nIOyzJyDs5icg7P8nIOz/JyDs/7u5+f///////////27l/v8E0v3/BNL9/wTQ/f8Oofn/IT7v/ycg7P8nIOz/JyDs5icg7OYnIOz/JyDs/ycg7P/p6P3/uWsC////////////5fr//6Po/f8Thfb/DKv5/w6f+f8nIOz/JyDs/ycg7OYnIOyzJyDs/ycg7P8nIOz/9/b+/////////////////7lrAv/V1Pv/JyDs/ycg7P8nIOz/JyDs/ycg7P8nIOyzJyDsgCcg7P8nIOz/JyDs/8/N+///////////////////////iIX1/ycg7P8nIOz/JyDs/ycg7P8nIOz/JyDsfycg7CYnIOz2JyDs/ycg7P9FP+7/q6n4/+7u/f/n5v3/fXn0/yoj7P8nIOz/JyDs/ycg7P8nIOz/JyDs9icg7CYAAAAAJyDscCcg7P8nIOz/wsD6/+no/f/Y1/z/eHTz/ycg7P8nIOz/JyDs/ycg7P8nIOz/JyDs/ycg7HAAAAAAAAAAACcg7AEnIOy1JyDs/ycg7P8nIOz/JyDs/ycg7P8nIOz/JyDs/ycg7P8nIOz/JyDs/ycg7LUnIOwBAAAAAAAAAAAAAAAAJyDsAScg7HAnIOz2JyDs/ycg7P8nIOz/JyDs/ycg7P8nIOz/JyDs9icg7HAnIOwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJyDsJicg7IAnIOyzJyDs5icg7OYnIOyzJyDsgCcg7CYAAAAAAAAAAAAAAAAAAAAA+B8AAPAPAADAAwAAwAMAAIABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAACAAQAAwAMAAMADAADwDwAA+B8AAA==</os:Image>
+<os:Url type="text/html" method="GET" template="https://duckduckgo.com/html?q={searchTerms}">
+</os:Url>
+</SearchPlugin>
diff --git a/helpers/DATA/firefox/gnu/settings.js b/helpers/DATA/firefox/gnu/settings.js
new file mode 100644
index 0000000..bb4ed9a
--- /dev/null
+++ b/helpers/DATA/firefox/gnu/settings.js
@@ -0,0 +1,129 @@
+
+// Release notes and vendor URLs
+pref("app.releaseNotesURL", "https://www.gnu.org/software/gnuzilla/");
+pref("app.vendorURL", "https://www.gnu.org/software/gnuzilla/");
+
+// Disable plugin installer
+pref("plugins.hide_infobar_for_missing_plugin", true);
+pref("plugins.hide_infobar_for_outdated_plugin", true);
+pref("plugins.notifyMissingFlash", false);
+
+//https://developer.mozilla.org/en-US/docs/Web/API/MediaSource
+//pref("media.mediasource.enabled",true);
+
+//Speeding it up
+pref("network.http.pipelining", true);
+pref("network.http.proxy.pipelining", true);
+pref("network.http.pipelining.maxrequests", 10);
+pref("nglayout.initialpaint.delay", 0);
+
+// Disable third party cookies
+pref("network.cookie.cookieBehavior", 1);
+
+// Extensions can be updated
+pref("extensions.update.enabled", true);
+// Use LANG environment variable to choose locale
+pref("intl.locale.matchOS", true);
+// Disable default browser checking.
+pref("browser.shell.checkDefaultBrowser", false);
+// Prevent EULA dialog to popup on first run
+pref("browser.EULA.override", true);
+
+// Default name strings
+pref ("distribution.about", "GNU IceCat");
+pref ("distribution.id", "gnu");
+pref ("distribution.version", "1.0");
+
+// Set useragent to Firefox compatible
+//pref("general.useragent.compatMode.firefox",true);
+// Spoof the useragent to a generic one
+pref("general.useragent.compatMode.firefox",true);
+// Spoof the useragent to a generic one
+pref("general.useragent.override", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0");
+pref("general.appname.override", "Netscape");
+pref("general.appversion.override", "31.0");
+pref("general.buildID.override", "Gecko/20100101");
+pref("general.oscpu.override", "Windows NT 6.1; WOW64");
+pref("general.platform.override", "Win32");
+
+// Startup page
+//pref ("browser.startup.page" , 3);
+//pref ("browser.startup.homepage" , "https://www.gnu.org/software/gnuzilla/");
+//pref ("startup.homepage_welcome_url", "https://www.gnu.org/software/gnuzilla/");
+pref ("startup.homepage_welcome_url", "");
+//pref ("startup.homepage_override_url" , "https://www.gnu.org/software/gnuzilla/");
+
+// Help URL
+pref ("app.support.baseURL", "https://www.gnu.org/software/gnuzilla/");
+pref ("app.support.inputURL", "https://lists.gnu.org/mailman/listinfo/bug-gnuzilla");
+pref ("app.feedback.baseURL", "https://lists.gnu.org/mailman/listinfo/bug-gnuzilla");
+pref ("browser.uitour.url", "https://www.gnu.org/software/gnuzilla/");
+pref ("plugins.update.url", "https://www.gnu.org/software/gnuzilla/");
+pref ("browser.customizemode.tip0.learnMoreUrl", "https://www.gnu.org/software/gnuzilla/");
+
+// Dictionary download preference
+pref("browser.dictionaries.download.url", "http://dictionaries.mozdev.org/");
+pref("browser.search.searchEnginesURL", "http://mycroft.mozdev.org/");
+// Enable Spell Checking In All Text Fields
+pref("layout.spellcheckDefault", 2);
+
+// Apturl preferences
+pref("network.protocol-handler.app.apt","/usr/bin/apturl");
+pref("network.protocol-handler.warn-external.apt",false);
+pref("network.protocol-handler.app.apt+http","/usr/bin/apturl");
+pref("network.protocol-handler.warn-external.apt+http",false);
+pref("network.protocol-handler.external.apt",true);
+pref("network.protocol-handler.external.apt+http",true);
+
+// Privacy & Freedom Issues
+// https://webdevelopmentaid.wordpress.com/2013/10/21/customize-privacy-settings-in-mozilla-firefox-part-1-aboutconfig/
+// https://panopticlick.eff.org
+// http://ip-check.info
+// http://browserspy.dk
+// https://wiki.mozilla.org/Fingerprinting
+// http://www.browserleaks.com
+// http://fingerprint.pet-portal.eu
+pref("privacy.donottrackheader.enabled", true);
+pref("privacy.donottrackheader.value", 1);
+pref("dom.ipc.plugins.flash.subprocess.crashreporter.enabled", false);
+pref("browser.safebrowsing.enabled", false);
+pref("browser.safebrowsing.malware.enabled", false);
+pref("services.sync.privacyURL", "https://www.gnu.org/software/gnuzilla/");
+pref("social.enabled", false);
+pref("social.remote-install.enabled", false);
+pref("datareporting.healthreport.uploadEnabled", false);
+pref("social.toast-notifications.enabled", false);
+pref("datareporting.policy.dataSubmissionEnabled", false);
+pref("datareporting.healthreport.uploadEnabled", false);
+pref("datareporting.healthreport.service.enabled", false);
+pref("browser.slowStartup.notificationDisabled", true);
+pref("network.http.sendRefererHeader", 2);
+pref("network.http.referer.spoofSource", true);
+//http://grack.com/blog/2010/01/06/3rd-party-cookies-dom-storage-and-privacy/
+//pref("dom.storage.enabled", false);
+pref("dom.event.clipboardevents.enabled",false);
+pref("network.prefetch-next", false);
+pref("network.dns.disablePrefetch", true);
+pref("network.http.sendSecureXSiteReferrer", false);
+pref("toolkit.telemetry.enabled", false);
+// Do not tell what plugins do we have enabled: https://mail.mozilla.org/pipermail/firefox-dev/2013-November/001186.html
+pref("plugins.enumerable_names", "");
+pref("plugin.state.flash", 1);
+
+
+// Services
+pref("gecko.handlerService.schemes.mailto.0.name", "");
+pref("gecko.handlerService.schemes.mailto.1.name", "");
+pref("handlerService.schemes.mailto.1.uriTemplate", "");
+pref("gecko.handlerService.schemes.mailto.0.uriTemplate", "");
+pref("browser.contentHandlers.types.0.title", "");
+pref("browser.contentHandlers.types.0.uri", "");
+pref("browser.contentHandlers.types.1.title", "");
+pref("browser.contentHandlers.types.1.uri", "");
+pref("gecko.handlerService.schemes.webcal.0.name", "");
+pref("gecko.handlerService.schemes.webcal.0.uriTemplate", "");
+pref("gecko.handlerService.schemes.irc.0.name", "");
+pref("gecko.handlerService.schemes.irc.0.uriTemplate", "");
+// https://kiwiirc.com/client/irc.247cdn.net/?nick=Your%20Nickname#underwater-hockey
+
+pref("font.default.x-western", "sans-serif");
diff --git a/helpers/DATA/firefox/trisquel/abouthome/aboutHome.css b/helpers/DATA/firefox/trisquel/abouthome/aboutHome.css
new file mode 100644
index 0000000..8635239
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/aboutHome.css
@@ -0,0 +1,429 @@
+%if 0
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+%endif
+
+html {
+ font: message-box;
+ font-size: 100%;
+ background-color: hsl(0,0%,95%);
+ color: #000;
+ height: 100%;
+}
+
+body {
+ margin: 0;
+ display: -moz-box;
+ -moz-box-orient: vertical;
+ width: 100%;
+ height: 100%;
+}
+
+input,
+button {
+ font-size: inherit;
+ font-family: inherit;
+}
+
+a {
+ color: -moz-nativehyperlinktext;
+ text-decoration: none;
+}
+
+.spacer {
+ -moz-box-flex: 1;
+}
+
+#topSection {
+ text-align: center;
+}
+
+#brandLogo {
+ height: 420px;
+ width: 150px;
+ margin: 22px auto 31px;
+ background-image: url("chrome://branding/content/about-logo.png");
+ background-size: 420px 150px;
+ background-position: center center;
+ background-repeat: no-repeat;
+}
+
+#searchForm,
+#snippets {
+ width: 470px;
+}
+
+#searchForm {
+ display: -moz-box;
+}
+
+#searchLogoContainer {
+ display: -moz-box;
+ -moz-box-align: center;
+ padding-top: 2px;
+ -moz-padding-end: 8px;
+}
+
+#searchLogoContainer[hidden] {
+ display: none;
+}
+
+#searchEngineLogo {
+ display: inline-block;
+ height: 28px;
+ width: 70px;
+ min-width: 70px;
+}
+
+#searchText {
+ -moz-box-flex: 1;
+ padding: 6px 8px;
+ background: hsla(0,0%,100%,.9) padding-box;
+ border: 1px solid;
+ border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2);
+ box-shadow: 0 1px 0 hsla(210,65%,9%,.02) inset,
+ 0 0 2px hsla(210,65%,9%,.1) inset,
+ 0 1px 0 hsla(0,0%,100%,.2);
+ border-radius: 2.5px 0 0 2.5px;
+}
+
+#searchText:-moz-dir(rtl) {
+ border-radius: 0 2.5px 2.5px 0;
+}
+
+#searchText:focus,
+#searchText[autofocus] {
+ border-color: hsla(206,100%,60%,.6) hsla(206,76%,52%,.6) hsla(204,100%,40%,.6);
+}
+
+#searchSubmit {
+ -moz-margin-start: -1px;
+ background: linear-gradient(hsla(0,0%,100%,.8), hsla(0,0%,100%,.1)) padding-box;
+ padding: 0 9px;
+ border: 1px solid;
+ border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2);
+ -moz-border-start: 1px solid transparent;
+ border-radius: 0 2.5px 2.5px 0;
+ box-shadow: 0 0 2px hsla(0,0%,100%,.5) inset,
+ 0 1px 0 hsla(0,0%,100%,.2);
+ cursor: pointer;
+ transition-property: background-color, border-color, box-shadow;
+ transition-duration: 150ms;
+}
+
+#searchSubmit:-moz-dir(rtl) {
+ border-radius: 2.5px 0 0 2.5px;
+}
+
+#searchText:focus + #searchSubmit,
+#searchText + #searchSubmit:hover,
+#searchText[autofocus] + #searchSubmit {
+ border-color: #59b5fc #45a3e7 #3294d5;
+ color: white;
+}
+
+#searchText:focus + #searchSubmit,
+#searchText[autofocus] + #searchSubmit {
+ background-image: linear-gradient(#4cb1ff, #1793e5);
+ box-shadow: 0 1px 0 hsla(0,0%,100%,.2) inset,
+ 0 0 0 1px hsla(0,0%,100%,.1) inset,
+ 0 1px 0 hsla(210,54%,20%,.03);
+}
+
+#searchText + #searchSubmit:hover {
+ background-image: linear-gradient(#66bdff, #0d9eff);
+ box-shadow: 0 1px 0 hsla(0,0%,100%,.2) inset,
+ 0 0 0 1px hsla(0,0%,100%,.1) inset,
+ 0 1px 0 hsla(210,54%,20%,.03),
+ 0 0 4px hsla(206,100%,20%,.2);
+}
+
+#searchText + #searchSubmit:hover:active {
+ box-shadow: 0 1px 1px hsla(211,79%,6%,.1) inset,
+ 0 0 1px hsla(211,79%,6%,.2) inset;
+ 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;
+ -moz-box-pack: center;
+ width: 100%;
+ background-color: hsla(0,0%,0%,.03);
+ border-top: 1px solid hsla(0,0%,0%,.03);
+ box-shadow: 0 1px 2px hsla(0,0%,0%,.02) inset,
+ 0 -1px 0 hsla(0,0%,100%,.25);
+}
+
+#launcher:not([session]),
+body[narrow] #launcher[session] {
+ display: block; /* display separator and restore button on separate lines */
+ text-align: center;
+ white-space: nowrap; /* prevent navigational buttons from wrapping */
+}
+
+.launchButton {
+ display: -moz-box;
+ -moz-box-orient: vertical;
+ margin: 16px 1px;
+ padding: 14px 6px;
+ min-width: 88px;
+ max-width: 176px;
+ max-height: 85px;
+ vertical-align: top;
+ white-space: normal;
+ background: transparent padding-box;
+ border: 1px solid transparent;
+ border-radius: 2.5px;
+ color: #525c66;
+ font-size: 75%;
+ cursor: pointer;
+ transition-property: background-color, border-color, box-shadow;
+ transition-duration: 150ms;
+}
+
+body[narrow] #launcher[session] > .launchButton {
+ margin: 4px 1px;
+}
+
+.launchButton:hover {
+ background-color: hsla(211,79%,6%,.03);
+ border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2);
+}
+
+.launchButton:hover:active {
+ background-image: linear-gradient(hsla(211,79%,6%,.02), hsla(211,79%,6%,.05));
+ border-color: hsla(210,54%,20%,.2) hsla(210,54%,20%,.23) hsla(210,54%,20%,.25);
+ box-shadow: 0 1px 1px hsla(211,79%,6%,.05) inset,
+ 0 0 1px hsla(211,79%,6%,.1) inset;
+ transition-duration: 0ms;
+}
+
+.launchButton[hidden],
+#launcher:not([session]) > #restorePreviousSessionSeparator,
+#launcher:not([session]) > #restorePreviousSession {
+ display: none;
+}
+
+#restorePreviousSessionSeparator {
+ width: 3px;
+ height: 116px;
+ margin: 0 10px;
+ background-image: linear-gradient(hsla(0,0%,100%,0), hsla(0,0%,100%,.35), hsla(0,0%,100%,0)),
+ linear-gradient(hsla(211,79%,6%,0), hsla(211,79%,6%,.2), hsla(211,79%,6%,0)),
+ linear-gradient(hsla(0,0%,100%,0), hsla(0,0%,100%,.35), hsla(0,0%,100%,0));
+ background-position: left top, center, right bottom;
+ background-size: 1px auto;
+ background-repeat: no-repeat;
+}
+
+body[narrow] #restorePreviousSessionSeparator {
+ margin: 0 auto;
+ width: 512px;
+ height: 3px;
+ background-image: linear-gradient(to right, hsla(0,0%,100%,0), hsla(0,0%,100%,.35), hsla(0,0%,100%,0)),
+ linear-gradient(to right, hsla(211,79%,6%,0), hsla(211,79%,6%,.2), hsla(211,79%,6%,0)),
+ linear-gradient(to right, hsla(0,0%,100%,0), hsla(0,0%,100%,.35), hsla(0,0%,100%,0));
+ background-size: auto 1px;
+}
+
+#restorePreviousSession {
+ max-width: none;
+ font-size: 90%;
+}
+
+body[narrow] #restorePreviousSession {
+ font-size: 80%;
+}
+
+.launchButton::before {
+ display: block;
+ width: 32px;
+ height: 32px;
+ margin: 0 auto 6px;
+ line-height: 0; /* remove extra vertical space due to non-zero font-size */
+}
+
+#downloads::before {
+ content: url("chrome://browser/content/abouthome/downloads.png");
+}
+
+#bookmarks::before {
+ content: url("chrome://browser/content/abouthome/bookmarks.png");
+}
+
+#history::before {
+ content: url("chrome://browser/content/abouthome/history.png");
+}
+
+#apps::before {
+ content: url("chrome://browser/content/abouthome/apps.png");
+}
+
+#addons::before {
+ content: url("chrome://browser/content/abouthome/addons.png");
+}
+
+#sync::before {
+ content: url("chrome://browser/content/abouthome/sync.png");
+}
+
+#settings::before {
+ content: url("chrome://browser/content/abouthome/settings.png");
+}
+
+#restorePreviousSession::before {
+ content: url("chrome://browser/content/abouthome/restore-large.png");
+ height: 48px;
+ width: 48px;
+ display: inline-block; /* display on same line as text label */
+ vertical-align: middle;
+ margin-bottom: 0;
+ -moz-margin-end: 8px;
+}
+
+#restorePreviousSession:-moz-dir(rtl)::before {
+ transform: scaleX(-1);
+}
+
+body[narrow] #restorePreviousSession::before {
+ content: url("chrome://browser/content/abouthome/restore.png");
+ height: 32px;
+ width: 32px;
+}
+
+#aboutMozilla {
+ 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 {
+ opacity: 1;
+}
+
+#aboutMozilla::before {
+ content: url("chrome://browser/content/abouthome/mozilla.png");
+ display: block;
+ position: absolute;
+ top: 12px;
+ right: 12px;
+ width: 69px;
+ height: 19px;
+}
+
+/* [HiDPI]
+ * At resolutions above 1dppx, prefer downscaling the 2x Retina graphics
+ * rather than upscaling the original-size ones (bug 818940).
+ */
+@media not all and (max-resolution: 1dppx) {
+ #brandLogo {
+ 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");
+ }
+
+ #bookmarks::before {
+ content: url("chrome://browser/content/abouthome/bookmarks@2x.png");
+ }
+
+ #history::before {
+ content: url("chrome://browser/content/abouthome/history@2x.png");
+ }
+
+ #apps::before {
+ content: url("chrome://browser/content/abouthome/apps@2x.png");
+ }
+
+ #addons::before {
+ content: url("chrome://browser/content/abouthome/addons@2x.png");
+ }
+
+ #sync::before {
+ content: url("chrome://browser/content/abouthome/sync@2x.png");
+ }
+
+ #settings::before {
+ content: url("chrome://browser/content/abouthome/settings@2x.png");
+ }
+
+ #restorePreviousSession::before {
+ content: url("chrome://browser/content/abouthome/restore-large@2x.png");
+ }
+
+ 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/helpers/DATA/firefox/trisquel/abouthome/aboutHome.js b/helpers/DATA/firefox/trisquel/abouthome/aboutHome.js
new file mode 100644
index 0000000..d3b4aa9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/aboutHome.js
@@ -0,0 +1,502 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * 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.
+ image: "data:image/png;base64," +
+ "iVBORw0KGgoAAAANSUhEUgAAAIwAAAA4CAYAAAAvmxBdAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ" +
+ "bWFnZVJlYWR5ccllPAAAGrFJREFUeNrtfHt4VdW172+utZOASLJ5+BaIFrUeXkFsa0Fl++gDnznV" +
+ "VlvFxt7aqvUUarXtse3Bau35ak/rZ9XT26NtfOvV6wFET+FYCQEKWqsQIT5RCAgSXnlnrzXneNw/" +
+ "1lphJSSQ8BB7bub3zW+LO3uN+fiNMcf4jTEX0N/6W3/rb/2tv30smtnXB3zmRi2FQakxQNKX3WkW" +
+ "9S/tgW3HLpmQM543A0BWVSHMYGIwOTDxzxrOf3/RQQfMZ2/SLAvKhTFVBGUqKFONH2QAzwOMF38a" +
+ "wHhYZAxWAqhe/iszp3+b970d/sInc57vz/J8L2eMB2MAEYkBQ6DQ3dRw4dq7AUjcP3rAfPZmLWXC" +
+ "LHKoIAcQAUxaB5EaEfc6AEBhjDEwmcx43/fO9HxT4vkReBIAAZgjgodW3NcPnn1sHgD/iHknn+0d" +
+ "6s8XEUhsXXac/34WAAGw8afuT8GZ3X055YeSJcIsG+pMZwFn0UihezRofPt3G54f/0E8cNMN+Myo" +
+ "8jVTCgYd823PLzrPeIBnABiUQ1F+UoWsVOYb33mkoKp/7/dKyT0AGc47X4s0sjBEoLxbBqAQAMfW" +
+ "Rfe38B4BM+VHUkYOs8mi1FrABbK4dcvK73zwp1M3xYPOxANKBqbpCdXNGb0UwPKRF74xpfDQ0t+K" +
+ "54+IvlKoahmAhaO/mv/ZmicG3tqPgT61ZM2dZMQJOYhIdByRM/F3dCCOox4Bc3oEliqyyNoQCPPu" +
+ "sXceKZqRsigu7pwaWBowiRb46+f9Q1V2wl1nDx09/R7jF30x9adNlN8yPx4DHwht+B/cBIBoRqeI" +
+ "E4hE/oshTcB0wNbT6/o/zrhFyohR5ZxmrVWE+fDxdx4puhGAH4OkPe5B6pykeJAc/7cDEMZ/095Y" +
+ "870P339m+BXs2v4kbCFsm9u2vnpJ3bzR7wAo2B/R2v+PjSnyXcRxtOLUSXFxwAFz5i2SZUIVO82S" +
+ "BWye/vLOIwNvjL8OYqCEfXCmJAZPHkC7sK1REbj2+lmbq86qTVmmfuuyN2cTiREWKCvACgml9kDL" +
+ "7HQksehsZmSdA6yVpsa6P38v3swg7m4vN1dGXrThKGP8yS5fP33j/LEvxKDbl2f2A0YFCtkZQDOa" +
+ "PjLAnP4jrmBGjh1AVhG2ttxfX33++vjY2eeNXf/siLUAzgEwMJZrY2vF/Vu/t4BRqCqgCmj07wMV" +
+ "HXUCzJQfUlZE72ICnANcqNj21h8eiK1AX46gXh29KT9H+rd9XxBjYGCgig7QHOgjPgMAKigXQZYp" +
+ "si4uCOc3v35zY2wF9ufGSgxA7fdd9g8ho9ol4P4ojiQWnSUMMANECrJNy1NWYH8eGfsEvJbLv1IK" +
+ "1XIAUwEtA0xplJMwjcaYlTDeShg8dOgjj6/cJxNYfWIWkHJoh5yyjkSZ8RbB89YBZq4/pXafGeuz" +
+ "b9WciXJxo2B2houqgAjABJCLOwFMqFv57+bBxMIAJm1det3avnl1OYCLAeSgWhofaY1QXQSRuYc+" +
+ "/OiD3QLmUzNdqTBKhRVMADsF5beuToXJB90KtFz+lVIVniXOVUAUqjpXVB4WwPjGTPB8/0zjeTnj" +
+ "ezl43szmKy6vNkDF4MeeXNc3oJyUhfAMkJsJkSxUVrLos6o6z/O8Ucb3phrPzyHKeVTwkpPXseg3" +
+ "Cqe+1SfG+swfaw6KGTAoJ5eyGF3IBeEIJB2AcXxb0FI/L45uFQBMGiu6Z3ai9eqrclBUClFWVatV" +
+ "5GERNT5wEVQnQLUcIuVNX75kFjn60rA5c1d0AoywlkcxfdwZ2LSgbOmBZAv70povu7RcyFUqcZYd" +
+ "Pbxix44fnLv8pbYUOWh+P3ZM9uJRo34xoLDgq8b3YTxvqhqsaPzyJTdmn36msjdyqPqkMhWqBFGZ" +
+ "MtV8uDX4zMjp2zemyEoPgGn4zyOvGzy48A54GcD3Sz1jFrqqE+4uOOvdmb0ASlYEs5mQE9afUdhy" +
+ "0yv3lHzwya/8ZcjgI0+5yssU3QKYkgQ4Ivp60LL1n8kBQfOWuvdnj6uLldgHQKoKxU7HV/eg2y1X" +
+ "XXmXEs1U0ZVb29o//4k5c5P5eQB+s+68aVeUFBTcCxUoS6kRWfjhueecc9SfX3ytA9QTr7eVACqY" +
+ "FDYEwnbB2qcHHg6gLY6ODhpomi77coUyVaojhKH9+ZHzF/wqXiztEg34APxNX/jCvQOLCi83fpy8" +
+ "UsCJXHLYnGdn785S0uKTyyBUBXJZcW5x4bSN56ciyLQcD4Bf/+ThVwwbUvRb+JkoswqAWX5b9Lm1" +
+ "M3uSM/UnUiaCKiZk2blvvnxX0ePxuBNAmpMur51wyLBPzjVeBBoVwIXBk6vuP+SG+LkcuwkWAA96" +
+ "/JjZKnKxkACkkFb5Nztz220xX9bJlWi+6opKFalQlpqlmzZNu6B6SaJ0knKJ/DW5qd8p8TO3x6AB" +
+ "qza1EE06cdmy9wDAY5LjmBTMkQnUnZ42H0ywNF52aU6FK4UY5NySI+cv+E3MCnMM5HyqtwFoO3rB" +
+ "gmuDMFjGjiCOIEQwzH9c+7lzju+JTaYlJ2ehUqXMWWFqeurFxqsAFMVf25Ss9kTOEZdvebClJbxT" +
+ "yUGZoEzwlL/b9tzRX+pOztSfSBZApSqyIrL45buKnkaUJEzLCN5+csxr+ab6fyILkI2OIZYBlx9/" +
+ "2bYvpLgw2+EqKLKdwoceVKJp+tfuEpYKZcaW1tZbLqheEsbj3GV+oxdV3x0GwQZrHUIiWKIST3Vm" +
+ "DG54zFrKrBBWiGgSyx9Uv6Xh0n/MKlGlOII4h80trQ+kuJt8HGklZHg6FZF/Y/uOb7O1YOvAzkGt" +
+ "Kxmoehe6SYNEpkErwZIFC4I2fuLKf2tLtDOPzumPhA6wAPJDLt1yuzjaAEcAMUCMApXfvPP7IcO6" +
+ "gkYFs4RRpgy49qanUsAPu/T8W48e/YwL6S/kYtBYwM8U/yu6KVlQUShr9CkKyK7b1vDVy0qVeaYy" +
+ "gaxbdeK85/8a/z7sYR3zgXM1gXUInEPoCEw8PR6z8YQxaidQPh6RrgrPEOZS4chKjFuydEEKFD1x" +
+ "QgrAnfO3V98Jw/B5dhFgmByU+MK/nnrq6K6gcQtPyqlIubJAibCxPv/fsVVNgCI9yGEAQdBq71NH" +
+ "UEdQIoBo5PBBeklazuQfSpYFM0UAFsDmd2yMf9+1XkUT3otc8AiRwpFChCBCI0detGbSLtYr5uw6" +
+ "tk26XctZwgxhRt65ZSmr1t389M1Jk85wzKcHRAiJkCfasDnI/0sMGN+jlLMrAigMhp0+f+TBBIw4" +
+ "milEYOcQBHZZAoZeEIgKgIIgeJbD2MqEFhxaDAFmdAWMisxQFigzlAUnX9e4rA9yeHuTna3koBQB" +
+ "RogxwOPvxNbQAAA7VHQEFKSQKEFIu4lA5d3HiiuFNB4XQZlhUHBK11QO0oRdD7ouROVCkeJZG7ak" +
+ "/KBOYHlz4sTy1WVlVY5oYego2+bs82+3tFw6YcVrp01dteqpxNfyhKQuGlxCMSsKBh570ABT/8XP" +
+ "5dhRVpyDWAd2Ns0O9yrhWdfcMpvCEByEoNCCwhBgvgBdM+PM5TH5FPW+1ZLo8de2viehe12dhVoH" +
+ "OAtDPO61O4o+kYCTnE5wVuGsxlzKHul7BUDKdomKgwpB2QHAyNiP2Dl+0Z2WRXZ9YP0F55WJczvX" +
+ "0jp09U3fLiurWD1+/NqQaHZIVNbu3O1vt7aM+fSqVRWXvPvu0pRldwAkQ5brjO+NMh0kgMIvGjYZ" +
+ "wIKETPxIrYt1U5M8iThKJil9yZGc++ab298dP36Jb8wZohqhQHRErKEeAA6fG5FT5yIlYYI6tzfO" +
+ "vtiQni3MYDw0ChqEgUMyejyAdwGwDeW4ZI9FAGQOmwzgv/cERmZbDXhnKBNUGMJkUhGVduSSJJ1P" +
+ "6rw8HIalJo7ilBkchgCgL48fVzLceDc4kZnWUdap1AQi10x+660n4jXyk1M7ZXEZgHhMUkMO4Njp" +
+ "hQGMf8h56Fx++ZE1a+1xZC2Szjs3sk9uUEhUbSMvP3LeyOGZ0tKJiearo1J1DHVRPYmS7JUcG2g1" +
+ "pxxUsooBnpmQWAOb10YbKGygcKFCZOC0XqxrRKokCBQG5euX77In2k1P+2hhWEZBAAoCuCCEcW7E" +
+ "2xMn/m6oYo0jyjnmuc3Off6UN96YMvmtt5LILSmQ61r3xAA0I+xqPBiIejAd1f7e2MPPfvm4LQs/" +
+ "89a+bP6nZuSzfsaU+T7g+UBixYQVRFGS01kFO22srRy0EgA4CEvFRHS3MANMY/fGbybmlQqAFSBV" +
+ "sCp8kWwCGA5dqefFShnnRV77ecHYU37iXuqLoB0tsuIo34v3NfJR1GlJsrnOuiXGy1y8k+rwxh57" +
+ "3srSD/6rbLdra7yMqgjUCGAULR8uWr0LJPYAGApCeCbKNygLPKIxJ65YOSU+YpLUUCYGiqBzQVy3" +
+ "Ft1zbevnJl60UARqACgcVDo9ZZr63Mqua68QxlpmrWJC1FmrmLSKCFVktcpZrbKhzg4D26E5Lgjg" +
+ "8vnoMwwh1hU/dvTRo/qcDyJqcESw5Dp6o3XNHVrqLDSubAdFjuXwwWZcX+Wc9APboKxQUoiLurXa" +
+ "IYfCpjlCDsoxZ6OCouLRt+xpbY3nA8aDMR6E2+9vffOWxl02cQ+Bbdjevt7l83D5ABRaKNHYO484" +
+ "YmgMkoJ4jElCOL8Lz9NN87YumrRDxc2DElQZKgIVhZcZcO1hZ74wtK/H0thvtuXGXdM2S0S/ziQ1" +
+ "FPJiG7pHwvbgDhtKnQ0VNhCEeUHQLmiuf2fymieGvJGY8DCfX+yCEC5xWIlwtO+P6+s4VESJGS4+" +
+ "liwxKjZ/2FGRZvPhYgktxEZdHWOAr2P34ihWIQWTgJ2CnWJbo9Ymz1g/5+h1QsF9wgKJ19Z4hV87" +
+ "4fKNE3cnx8v4V8H4UOjqhvce+zW6qdWVlOvSjQsDlw/WUT4A5QNQGIJDizMPHXR+CiRBb4GSzlYr" +
+ "26Z7vYKSC42nUOPBqA9VU1I0ZOJPEYWj1NvVW/3AoEUAFgO4IzZ1hYk2jf9WUw7IjCIXHUVhXrFp" +
+ "/sQtKZPIoXXr/PjoSkZeoHo6gP/bFyeciECqcHG3IrXp37a2SF3xQNPxRAXgq5nS1bHsDWCYALYA" +
+ "u+h0W/impI8Pad9ec/vAoWVTjV84Nsn5FAwcvmDMN5rOqf1jyatdHzjuGjvThloKYH3b5qVXt775" +
+ "44ZuN1QEKknF3a6ImfDee4tWjBrV6R5Qoeq1AP6Avaxx8gDolhdPXAh2qzQmZFQ4ZhALrj/mvLpT" +
+ "+qhxya0BP5VVZQBkA6jNR0AJ2xUUcjKGjsx4k3PVYUwaJU6rJ3reLiHlHppjBjF3fLYSzU/noEZ8" +
+ "3611VusoVJBVsFWAdezim/3jemSFe+SNIsvCpAhCXf7TBZI+PnTr4nO2t2xcME3ZroYKIouEEqDo" +
+ "xfHfav/GxOttFgBOucGWll0XVqrqXYDWNLz3aG7bsovWp4i2TvkhScLqNBezq/M/zxLBxV2Yx/75" +
+ "yCPP6usc04CJ+B3bcLMwQTiK+0UIwgz1ip8+4pyaYX0x0SnWMkjnYGygkm9nBO0MGzoI2TTDyQBw" +
+ "7ubNawPmeZYZNt5wZhrxX8OHX9yXSTJzGcVgIWasbs8/hc7XRzXM670cg0Vs5H+MHm6u74ucrb/K" +
+ "lAlFPoySoqFFn+rm+OCGV762df2cYWe4fP0M5qDWhoowRIm1/h+s1YZx3wrVOV1LDhXMaGzfXntF" +
+ "46vXtMQRS/clsqRRT9SNd0GMBo6edRStZbKeg4D//ciQIcP2CTDbqsdVKQePq1JMFkXxv4qO9AaM" +
+ "fPGoaeuG9kXp0LkU0wGgMFC1gYAdAeyg0m3IrE3W3mtTvodjRpHq9X3xL4h5Qsq63P/z9ra6LqSc" +
+ "vvmBPkwOTex2lnf4wNee/47fa99NGGVJ8Zl1qP3UPfwkdr15mDDV+Y3Pf+Kh9c9kz9pee89J7dve" +
+ "vaRt+7qLbVv47y5UUKggp3BB/okNz0/aHI8332OaIgELxWDpptQtt6X+Qcu03nVYGQYxjxzl+7/e" +
+ "GyvjdYrCtv31JiW7QTjy6qWj83jF4AeP/MLaodiHRtZBXAihEEIWkq4eSgGmvKGhqpX5d1YEVhiW" +
+ "BaI6Zf6QITN7s5ELhw4tZZavkwhIZMOC1rZfo5s64nPv4+1NzXot2/hYiqKckglH4/7eRojCOosp" +
+ "St6u2ijfS1Hv3I0SdVy5aam9ecumBeOqN8w7aRkxSlMVdRDmRHa4m5xWPKPEusUA6maIrcy/cCKw" +
+ "InASKaCoXrlo2LAH+xpMpAEjLauu2ObaNnxVmZqUHaI8SaR+KnIhTPHCo6ZtOn6vk4qUPNNGnV2P" +
+ "J0ptENweMq92zHBMcMwwIrfMLS6etKdJEnMlCYOZm9YE4dUPkWvsIUckJ/+SZwd5PCEOEBc5rh7j" +
+ "grqf+VfvSc7mO/xZSihVAra3YMY/PqqrUhZVe7C8yRHTBqAVQJuQN5idgJ2ASQAz4PJjptWevKc0" +
+ "RZQ0TQATRWDd/dmFDQ2VeaLH0z4dRVTK9EXZ7IqFJSXH7W6eLw0blntp2NAydGOSqPGVs/5mW9Zc" +
+ "JGKbRSxELIRDCFuIuAmiBa8eMW37rcdc1JDtM+3PYdSp43k9/ulPgmDrsnz+vFBktRWBZYEVKSlU" +
+ "feH5wYPP7u5Hfy4uzi4oLq50IjkSaXrf2vIfBPnV6PlKiwKg0XfyNe2BPkmJ8+oUGeh/bLjNu7En" +
+ "0Gy+w5sppLcyKRra9IZJ98hTvciop9MPSSFUwGTnEjHICsgpyKHYHzjquWMvrJ+wewUENPFjCIAx" +
+ "k3uStyIMbw5FVieWJvJpBE5kgqq+X1VcPGdRcfHMxSUluSUlJbmlUZ+1tKRkLRGVnrZ9Rw12rSLt" +
+ "sDpFg8vmfbpw0HH3wcuMMSaiao2XAbwMjPFhPL/ReN6DfsY8tHHekN0WXR929vqsCpWruFshPEqF" +
+ "o3IyADuWTxgea1rYTbRVeEMmc+SnCwp+OcB4l3kmLq0D4BnzkA/MMUBjvDMXC1DBqlkCFr9N9E//" +
+ "HIZpPyDsQVuTFwsMfP273k8GFeLbvo9izwe8DGA8VMPgIc/D2piALlPFDGWUMqNuazOun/RbeQU7" +
+ "L/zl0cfC+SPOXjG84NBRawCvJNoSE7PiBgr5Xx/MKf7jLnzIbUPKlHVF5C11KgJfD9+shY8Vxjd3" +
+ "0780rEvP8bFDDvnVQGO+lU5MeTDwzM5aTbOzNyrw/XNbWx9JFLknk+sjqjobUHJq9XS/cNj3jZcZ" +
+ "Ac9PwBIDyAeMD2O8RhhvpTFYqYpGqMQOM2UhlFOhsvjfgNJ6ofxyoZaXbHPt8mDNjDU9ACYBbyGA" +
+ "AT/KZEZ/MpO5qciYyRlgROeJGSh0nQCL21Ufmx4EL8dMpqScRt4DFVAAYMCtORx+0Rhz7aFF+GJB" +
+ "BmNM/JKklGo1KlBtHZ474U79P9hZOZcQYb0unD/mwu05qADCZwE4C8Y7I3kTk4kFx+mUuzfMKf5e" +
+ "+rn+rUMq4PR4hFII0gw0xpdvGAWGoDqHf9m8IuV8m2Qtf1pQMPok37+50JhpHlC8EzwRcAzwOqs+" +
+ "Vkv06I+da04nInd3RvuxgCIAhcUTF5zvFQ79oucP+Cy8zIjE6qQnt5Pviu5IqAogVKNCNSrBUte6" +
+ "blnrqi/Vo3O9rI3Pc7cbP6sgGQcAf7rvl3zK908uBKjAGK5jrrmNKKHj/RS3E6L3V2USLUzkZAB4" +
+ "i75pTivwwQMyoKYQ685+QOtScvzUHPbIlJ54ZVsuDPTrZDmnQqUQggo1qkoNRDyFeJ6XGQfjF0fW" +
+ "3O9YWxW6adNzw36Dzm/JKEJ0k7QgtfiSygd1vSrkdZ3jlb6fneT7Y+MN1xrmVX9gbkw9q1MdsemF" +
+ "U5wkpwqSRSw49gfZAcPPHOsVlIww/sBjjPEVnqfGZEQlWKVCjWK31TW/dv56pCruU126TGxPl+US" +
+ "IrAgNQ7TQ+pNukQqfalLNimApvMt6CZMTvsiu3VOJ17XnrNWZ9m85oK8Qmz4sFB+CeXrF29dfOqG" +
+ "1PwKs6fOKyvKjrnb8wrHGD8TWfCOEoX85zb96dgXY9leN2NM+y3SJZG4u7XsSldIykFPz09NHxbR" +
+ "T2U3M11AsKf8aRqtnBqQoG91oWkGOS0/XaQo2Pf3u5mUDK9LukD7Mv5Tv9teSQ4VzipsINUtW9Zc" +
+ "t/mFiRu7WbcOuQNP+MXQ4hGX3mEKBl1mjB9bbwAqSz6cf+TZ8Qaabta/u6hM92ItpZs5dvyor5R/" +
+ "dwvp9QAa6eFzfxRlpVMk2mXh93czeyPn1Bn5ShWtYAJsyEve+OPgC7Hzmgx3USDtejQedlbtDX7h" +
+ "0Ns6HChV5LcvP7rpb1+qx/690dHrtewL05c2c7ZLtrM91fOpDGjXyvT9+WYBPQAg3NPcey1n4vVt" +
+ "FUJSIfGNjJZNy2ekkqzpazIJOefSoTaA9q1VY+5Wbvs9NAoYVBkFh5Sesi9lJ/u6lt5+WETpoi2M" +
+ "PpZU/k9szmKGtVGRWBjQ6g3zP78pxfSGKb+tJ4LPAsi31S/+uXCUlVZmCIc+DlI15L4Cpr/1FA1d" +
+ "0VLqAilzgcCGChdQc5eoTXqpkNS66hv1YLsUElURiG1sOZj7lunf3v3fwlBKjRfX9EjEHKcscV98" +
+ "D40zRKIqgEpz4yvTVnfjU/VbmL/r4yhwTTbPCNsZNi8g50/OnvbCsXu5wQqVURCBuOb7seu98n7A" +
+ "/L23Tc8NX8mW6pL73UoOhYPH/GJv/I7Dzlqbg5pRUG1q++A//+Ng+4f9gDlATVzLHfErZiHioKrn" +
+ "H37uhgeG597sdYnIYeeszypQqQawre9dHNbd0Yj9/5KnfsB8DJpuXXj8Q+ryj3dUZglD1Uz3MsWv" +
+ "HX7uh1fv6QGHn7upAmrWQpEV2zSt+bVptamw+6C9VaP/hcoHrvkABgydUjPLywy6Oboh6HW6PgLj" +
+ "LYqStqYRQHKDMQflMhXOQrnata27tvGvufrEn8ZBfmdPP2AO7NpmAAw85B8qTyjKlt1svAHTjPGL" +
+ "k4w0jAcTAyllnBoh9Kxw/tEdS8cuT0WyH4vX1PYD5qMBzQDE2eFDxz09zsscWuwVHX6a8YwaFAiM" +
+ "NAkHr4vdUdf82rQN6JwnSl4N4vAxeKdxP2A+mjXuKTvcXcY9TdOnyxPk4zKZ/vbRAqe75C3QfZZY" +
+ "0P/y6/7299z+H4QrdGsoib8JAAAAAElFTkSuQmCC"
+ }
+};
+
+// 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 = [ "" ];
+
+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) {
+ for (let mutation of mutations) {
+ if (mutation.attributeName == "searchEngineName") {
+ setupSearchEngine();
+ if (!gInitialized) {
+// ensureSnippetsMapThen(loadSnippets);
+ gInitialized = true;
+ }
+ return;
+ }
+ }
+});
+
+window.addEventListener("pageshow", function () {
+ // Delay search engine setup, cause browser.js::BrowserOnAboutPageLoad runs
+ // later and may use asynchronous getters.
+ window.gObserver.observe(document.documentElement, { attributes: true });
+ fitToWidth();
+ window.addEventListener("resize", fitToWidth);
+
+ // Ask chrome to update snippets.
+ var event = new CustomEvent("AboutHomeLoad", {bubbles:true});
+ document.dispatchEvent(event);
+});
+
+window.addEventListener("pagehide", function() {
+ window.gObserver.disconnect();
+ 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)
+{
+return;
+ 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;
+ let engineName = document.documentElement.getAttribute("searchEngineName");
+
+ if (engineName && searchTerms.length > 0) {
+ // Send an event that will perform a search and Firefox Health Report will
+ // record that a search from about:home has occurred.
+ let eventData = JSON.stringify({
+ engineName: engineName,
+ searchTerms: searchTerms
+ });
+ let event = new CustomEvent("AboutHomeSearchEvent", {detail: eventData});
+ document.dispatchEvent(event);
+ }
+
+ aEvent.preventDefault();
+}
+
+
+function setupSearchEngine()
+{
+ // The "autofocus" attribute doesn't focus the form element
+ // immediately when the element is first drawn, so the
+ // attribute is also used for styling when the page first loads.
+ let searchText = document.getElementById("searchText");
+ searchText.addEventListener("blur", function searchText_onBlur() {
+ searchText.removeEventListener("blur", searchText_onBlur);
+ searchText.removeAttribute("autofocus");
+ });
+
+ let searchEngineName = document.documentElement.getAttribute("searchEngineName");
+ let searchEngineInfo = SEARCH_ENGINES[searchEngineName];
+ let logoElt = document.getElementById("searchEngineLogo");
+
+ // Add search engine logo.
+ if (searchEngineInfo && searchEngineInfo.image) {
+ logoElt.parentNode.hidden = false;
+ logoElt.src = searchEngineInfo.image;
+ logoElt.alt = searchEngineName;
+ searchText.placeholder = "";
+ }
+ else {
+ logoElt.parentNode.hidden = true;
+ searchText.placeholder = searchEngineName;
+ }
+
+}
+
+/**
+ * Inform the test harness that we're done loading the page.
+ */
+function loadSucceeded()
+{
+ var event = new CustomEvent("AboutHomeLoadSnippetsSucceeded", {bubbles:true});
+ document.dispatchEvent(event);
+}
+
+/**
+ * Update the local snippets from the remote storage, then show them through
+ * showSnippets.
+ */
+function loadSnippets()
+{
+return;
+ 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()
+{
+return;
+ 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()
+{
+return;
+ // 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");
+ } else if (document.body.hasAttribute("narrow")) {
+ document.body.removeAttribute("narrow");
+ fitToWidth();
+ }
+}
diff --git a/helpers/DATA/firefox/trisquel/abouthome/aboutHome.xhtml b/helpers/DATA/firefox/trisquel/abouthome/aboutHome.xhtml
new file mode 100644
index 0000000..4cf1dfe
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/aboutHome.xhtml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE html [
+ <!ENTITY % htmlDTD
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "DTD/xhtml1-strict.dtd">
+ %htmlDTD;
+ <!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd">
+ %globalDTD;
+ <!ENTITY % aboutHomeDTD SYSTEM "chrome://browser/locale/aboutHome.dtd">
+ %aboutHomeDTD;
+ <!ENTITY % browserDTD SYSTEM "chrome://browser/locale/browser.dtd" >
+ %browserDTD;
+]>
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>&abouthome.pageTitle;</title>
+
+ <link rel="icon" type="image/png" id="favicon"
+ href="chrome://branding/content/icon32.png"/>
+ <link rel="stylesheet" type="text/css" media="all"
+ href="chrome://browser/content/abouthome/aboutHome.css"/>
+
+<style>
+
+label{
+position:relative;
+bottom:2px;
+left:2px;
+}
+
+#addonsform form{
+position:relative;
+left:10px;
+}
+
+em {
+color:#600
+}
+
+a{
+color:#004998
+}
+
+#addonsform{
+background-color:#fff;
+font-size:14px;
+padding:10px 30px 20px 30px;
+border-radius: 10px;
+box-shadow: 0px 0px 5px #888888;
+}
+
+.block-side-margin {
+ min-width: 16px;
+ -moz-box-flex: 1;
+}
+
+#block-horizontal-margin {
+ display: -moz-box;
+ -moz-box-flex: 1;
+}
+
+ul li {
+list-style:none;
+background:#ddd;
+border-radius:3px;
+padding:3px 5px 3px 5px;
+margin:5px;
+box-shadow: 0px 2px 0 #ccc ;
+float:left;
+}
+
+ul li a{
+font-weight:bold;
+color:#666;
+text-shadow:0px 1px 0px #fff;
+}
+
+#trisquel a {
+font-weight:bold;
+color:#56728C;
+text-shadow:0px 1px 0px #fff;
+}
+
+#footer{
+min-height:100px;
+}
+
+</style>
+
+ </head>
+
+ <body dir="&locale.dir;" onload="prepare();">
+
+
+ <div class="spacer"/>
+ <div id="topSection">
+ <img src="chrome://branding/content/about-logo.png"/>
+
+ <div id="searchContainer">
+ <form name="searchForm" id="searchForm" action="https://duckduckgo.com/html/">
+ <input type="hidden" name="t" value="trisquel"/>
+ <input type="text" name="q" value="" id="searchText" maxlength="256"
+ autofocus="autofocus"/>
+ <input id="searchSubmit" type="submit" value="&abouthome.searchEngineButton.label;"/>
+ </form>
+ </div>
+
+ </div>
+
+ <div class="spacer"/>
+
+<div id="footer" style=" display: -moz-box; -moz-box-align: center; -moz-box-pack: center; width: 100%; background-color: hsla(0,0%,0%,.03); border-top: 1px solid hsla(0,0%,0%,.03); box-shadow: 0 2px 5px hsla(0,0%,0%,.1) inset, 0 -1px 0 hsla(0,0%,100%,.25);">
+<p id="trisquel"><a href="https://trisquel.info">Trisquel GNU/Linux</a>:</p>
+<ul style="font-size:0.8em">
+<li><a href="https://trisquel.info/forum">Forum</a></li>
+<li><a href="https://trisquel.info/wiki">Wiki</a></li>
+<li><a href="http://store.trisquel.info/">Store</a></li>
+<li><a href="https://trisquel.info/donate">Donate</a></li>
+</ul>
+</div>
+
+ </body>
+</html>
+
diff --git a/helpers/DATA/firefox/trisquel/abouthome/addons.png b/helpers/DATA/firefox/trisquel/abouthome/addons.png
new file mode 100644
index 0000000..41519ce
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/addons.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/addons@2x.png b/helpers/DATA/firefox/trisquel/abouthome/addons@2x.png
new file mode 100644
index 0000000..d4d04ee
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/addons@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/apps.png b/helpers/DATA/firefox/trisquel/abouthome/apps.png
new file mode 100644
index 0000000..79fc95d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/apps.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/apps@2x.png b/helpers/DATA/firefox/trisquel/abouthome/apps@2x.png
new file mode 100644
index 0000000..cbe7a6d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/apps@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/bookmarks.png b/helpers/DATA/firefox/trisquel/abouthome/bookmarks.png
new file mode 100644
index 0000000..5c7e194
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/bookmarks.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/bookmarks@2x.png b/helpers/DATA/firefox/trisquel/abouthome/bookmarks@2x.png
new file mode 100644
index 0000000..7ede007
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/bookmarks@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/downloads.png b/helpers/DATA/firefox/trisquel/abouthome/downloads.png
new file mode 100644
index 0000000..3d4d10e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/downloads.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/downloads@2x.png b/helpers/DATA/firefox/trisquel/abouthome/downloads@2x.png
new file mode 100644
index 0000000..d384a22
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/downloads@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/history.png b/helpers/DATA/firefox/trisquel/abouthome/history.png
new file mode 100644
index 0000000..ae742b1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/history.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/history@2x.png b/helpers/DATA/firefox/trisquel/abouthome/history@2x.png
new file mode 100644
index 0000000..696902e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/history@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/restore-large.png b/helpers/DATA/firefox/trisquel/abouthome/restore-large.png
new file mode 100644
index 0000000..ef593e6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/restore-large.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/restore-large@2x.png b/helpers/DATA/firefox/trisquel/abouthome/restore-large@2x.png
new file mode 100644
index 0000000..d5c71d0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/restore-large@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/restore.png b/helpers/DATA/firefox/trisquel/abouthome/restore.png
new file mode 100644
index 0000000..5c3d6f4
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/restore.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/restore@2x.png b/helpers/DATA/firefox/trisquel/abouthome/restore@2x.png
new file mode 100644
index 0000000..5acb630
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/restore@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/settings.png b/helpers/DATA/firefox/trisquel/abouthome/settings.png
new file mode 100644
index 0000000..4b0c309
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/settings.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/settings@2x.png b/helpers/DATA/firefox/trisquel/abouthome/settings@2x.png
new file mode 100644
index 0000000..c77cb9a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/settings@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/snippet1.png b/helpers/DATA/firefox/trisquel/abouthome/snippet1.png
new file mode 100644
index 0000000..ce2ec55
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/snippet1.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/snippet1@2x.png b/helpers/DATA/firefox/trisquel/abouthome/snippet1@2x.png
new file mode 100644
index 0000000..f57cd0a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/snippet1@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/snippet2.png b/helpers/DATA/firefox/trisquel/abouthome/snippet2.png
new file mode 100644
index 0000000..e0724fb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/snippet2.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/snippet2@2x.png b/helpers/DATA/firefox/trisquel/abouthome/snippet2@2x.png
new file mode 100644
index 0000000..40577f5
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/snippet2@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/sync.png b/helpers/DATA/firefox/trisquel/abouthome/sync.png
new file mode 100644
index 0000000..11e40cc
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/sync.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/abouthome/sync@2x.png b/helpers/DATA/firefox/trisquel/abouthome/sync@2x.png
new file mode 100644
index 0000000..6354f5b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/abouthome/sync@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/bookmarks.html.in b/helpers/DATA/firefox/trisquel/bookmarks.html.in
new file mode 100644
index 0000000..9767e59
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/bookmarks.html.in
@@ -0,0 +1,23 @@
+<!DOCTYPE NETSCAPE-Bookmark-file-1>
+<!-- This is an automatically generated file.
+ It will be read and overwritten.
+ DO NOT EDIT! -->
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
+<TITLE>Bookmarks</TITLE>
+<H1>Bookmarks Menu</H1>
+
+<DL><p>
+ <DT><H3 ADD_DATE="1245542278" LAST_MODIFIED="1245543070" PERSONAL_TOOLBAR_FOLDER="true">Bookmarks Toolbar</H3>
+<DD>Add bookmarks to this folder to see them displayed on the Bookmarks Toolbar
+ <DL><p>
+ <HR>
+ <DT><A HREF="http://trisquel.info/" ADD_DATE="1245542718" LAST_MODIFIED="1245542736" ICON_URI="http://trisquel.info/sites/default/themes/trisquel3/favicon.ico" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACRklEQVQ4jY2SXU/SYRiHL9xwUzd7s80AzRmzmiKhgCKof0X4C4FHYZtOV2nMWZvTtFyNyQwrX1gwshTzDQQN8f0gD9w6ydo6aJ201Rfoc3Sgs+wg+Z3e9/Xcv117IOWUS1F7NJSNVYMrI3UOoGAgF/PCDg0LccyLK4jRPfTeouNLao+G+rkXWCLzCLNDXBssOJoJs0Po/Q5oy0LVW0jNq3s0LEaAtIMFY7AZMfEDMZLAshDFvvYT++p3TAEXALWhYQrdpwAJ5d5OFB1KbMmP5LrOA21ZWJf3qRipo/hRPjq/GfWgBnFlF/vqPuphDTp/FaZgD8ZAE9qRdozBZqyJHXBngrxVgTXynoJbp9E976ZitA7jxGO0z4w4Nj4gxt9x+aGM4p58Sr0l6HxV2FfjCNNPDurnt5zBEtumqEt+ZNcwOoDsdh7O9U2cW2s0rixhmRvFEglyfWMXcWkeefu5PwKNk/exRKeonrxBTagDw3gLeq8W59Yaju09HOtfsCW+IsY+0TDjO/RxLBLKPSoMAZFSbwkA9bMTODd/IYSfUuK+dCQxtbilNC5/RozGkblzqPT3YXjpQe/TpsZnu85iT37DFL6DKehGNVgIrgzqpsYo61Wm0iATcXkf4XUX1YG7qB5cAdKoCd1EmO5MrYX5rR9rLInMnYNmxEZxtxIh3I8p1HISKgHSyGuSYY0lMUdnqA25EML9iJEE8lYFB1/4v0IlQDoXrl7EONZL/ZsAleN9ZAtKIP0k+O9HpMhbFeh92sPL0n/h3yJfoqCu2Os+AAAAAElFTkSuQmCC">Trisquel GNU/Linux</A>
+ <DT><A HREF="http://trisquel.info/wiki/" ADD_DATE="1245542718" LAST_MODIFIED="1245542736" ICON_URI="http://trisquel.info/sites/default/themes/trisquel3/favicon.ico" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACRklEQVQ4jY2SXU/SYRiHL9xwUzd7s80AzRmzmiKhgCKof0X4C4FHYZtOV2nMWZvTtFyNyQwrX1gwshTzDQQN8f0gD9w6ydo6aJ201Rfoc3Sgs+wg+Z3e9/Xcv117IOWUS1F7NJSNVYMrI3UOoGAgF/PCDg0LccyLK4jRPfTeouNLao+G+rkXWCLzCLNDXBssOJoJs0Po/Q5oy0LVW0jNq3s0LEaAtIMFY7AZMfEDMZLAshDFvvYT++p3TAEXALWhYQrdpwAJ5d5OFB1KbMmP5LrOA21ZWJf3qRipo/hRPjq/GfWgBnFlF/vqPuphDTp/FaZgD8ZAE9qRdozBZqyJHXBngrxVgTXynoJbp9E976ZitA7jxGO0z4w4Nj4gxt9x+aGM4p58Sr0l6HxV2FfjCNNPDurnt5zBEtumqEt+ZNcwOoDsdh7O9U2cW2s0rixhmRvFEglyfWMXcWkeefu5PwKNk/exRKeonrxBTagDw3gLeq8W59Yaju09HOtfsCW+IsY+0TDjO/RxLBLKPSoMAZFSbwkA9bMTODd/IYSfUuK+dCQxtbilNC5/RozGkblzqPT3YXjpQe/TpsZnu85iT37DFL6DKehGNVgIrgzqpsYo61Wm0iATcXkf4XUX1YG7qB5cAdKoCd1EmO5MrYX5rR9rLInMnYNmxEZxtxIh3I8p1HISKgHSyGuSYY0lMUdnqA25EML9iJEE8lYFB1/4v0IlQDoXrl7EONZL/ZsAleN9ZAtKIP0k+O9HpMhbFeh92sPL0n/h3yJfoqCu2Os+AAAAAElFTkSuQmCC">Wiki</A>
+ <DT><A HREF="http://trisquel.info/donate" ADD_DATE="1245542718" LAST_MODIFIED="1245542736" ICON_URI="http://trisquel.info/sites/default/themes/trisquel3/favicon.ico" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACRklEQVQ4jY2SXU/SYRiHL9xwUzd7s80AzRmzmiKhgCKof0X4C4FHYZtOV2nMWZvTtFyNyQwrX1gwshTzDQQN8f0gD9w6ydo6aJ201Rfoc3Sgs+wg+Z3e9/Xcv117IOWUS1F7NJSNVYMrI3UOoGAgF/PCDg0LccyLK4jRPfTeouNLao+G+rkXWCLzCLNDXBssOJoJs0Po/Q5oy0LVW0jNq3s0LEaAtIMFY7AZMfEDMZLAshDFvvYT++p3TAEXALWhYQrdpwAJ5d5OFB1KbMmP5LrOA21ZWJf3qRipo/hRPjq/GfWgBnFlF/vqPuphDTp/FaZgD8ZAE9qRdozBZqyJHXBngrxVgTXynoJbp9E976ZitA7jxGO0z4w4Nj4gxt9x+aGM4p58Sr0l6HxV2FfjCNNPDurnt5zBEtumqEt+ZNcwOoDsdh7O9U2cW2s0rixhmRvFEglyfWMXcWkeefu5PwKNk/exRKeonrxBTagDw3gLeq8W59Yaju09HOtfsCW+IsY+0TDjO/RxLBLKPSoMAZFSbwkA9bMTODd/IYSfUuK+dCQxtbilNC5/RozGkblzqPT3YXjpQe/TpsZnu85iT37DFL6DKehGNVgIrgzqpsYo61Wm0iATcXkf4XUX1YG7qB5cAdKoCd1EmO5MrYX5rR9rLInMnYNmxEZxtxIh3I8p1HISKgHSyGuSYY0lMUdnqA25EML9iJEE8lYFB1/4v0IlQDoXrl7EONZL/ZsAleN9ZAtKIP0k+O9HpMhbFeh92sPL0n/h3yJfoqCu2Os+AAAAAElFTkSuQmCC">Donate</A>
+ <DT><A HREF="http://store.trisquel.info/" ADD_DATE="1245542718" LAST_MODIFIED="1245542736" ICON_URI="http://store.trisquel.info/favicon.ico" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACRklEQVQ4jY2SXU/SYRiHL9xwUzd7s80AzRmzmiKhgCKof0X4C4FHYZtOV2nMWZvTtFyNyQwrX1gwshTzDQQN8f0gD9w6ydo6aJ201Rfoc3Sgs+wg+Z3e9/Xcv117IOWUS1F7NJSNVYMrI3UOoGAgF/PCDg0LccyLK4jRPfTeouNLao+G+rkXWCLzCLNDXBssOJoJs0Po/Q5oy0LVW0jNq3s0LEaAtIMFY7AZMfEDMZLAshDFvvYT++p3TAEXALWhYQrdpwAJ5d5OFB1KbMmP5LrOA21ZWJf3qRipo/hRPjq/GfWgBnFlF/vqPuphDTp/FaZgD8ZAE9qRdozBZqyJHXBngrxVgTXynoJbp9E976ZitA7jxGO0z4w4Nj4gxt9x+aGM4p58Sr0l6HxV2FfjCNNPDurnt5zBEtumqEt+ZNcwOoDsdh7O9U2cW2s0rixhmRvFEglyfWMXcWkeefu5PwKNk/exRKeonrxBTagDw3gLeq8W59Yaju09HOtfsCW+IsY+0TDjO/RxLBLKPSoMAZFSbwkA9bMTODd/IYSfUuK+dCQxtbilNC5/RozGkblzqPT3YXjpQe/TpsZnu85iT37DFL6DKehGNVgIrgzqpsYo61Wm0iATcXkf4XUX1YG7qB5cAdKoCd1EmO5MrYX5rR9rLInMnYNmxEZxtxIh3I8p1HISKgHSyGuSYY0lMUdnqA25EML9iJEE8lYFB1/4v0IlQDoXrl7EONZL/ZsAleN9ZAtKIP0k+O9HpMhbFeh92sPL0n/h3yJfoqCu2Os+AAAAAElFTkSuQmCC">Store</A>
+ <HR>
+ <DT><A HREF="http://www.gnu.org/" ADD_DATE="1245542746" LAST_MODIFIED="1245542763" ICON_URI="http://www.gnu.org/graphics/gnu-head-mini.png" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAGFBMVEVFRUV+fn6mpqa/v7/Ozs7Y2Njg4OD8/Pwuhn+TAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAALEQAACxEBf2RfkQAAAAd0SU1FB9MBDhQ6Gd8s57cAAAEkSURBVHicXdFNc4JADAbgoP0Bi4d6dcGBMzp2z2rrnjulcsavnKuQ9+83K37vDAN5yIZsILws0uv3i7ugLTnAwpjBOsTLOE4VmmKQTFYBioGNKkI5drcCReRItmNAyinSCjianJo6A/aGRtRjtPadpB5CRkQRUaYPGbXW4UgKMfXQxDnJPIeJ0qyOrclrLXoqou8+5p7HM9EkT/JtyEsqB2QYnRv7sT2ArRPLf0kWOp1sA3hYPq3Oh/t0EAjjVIG703II9awr3l3BhxAf5foMLaaasPEZqm5A+0RzGCmuIKJbWi284csIJbzykBQ3aIADsL2CFtBWpovhA1Td7Q6NzqZ/B+38APG3HxU+sYO4B9Akt+AnqGbp/gmwTN6eAWt+gcv6B4rivVin0bWbAAAAAElFTkSuQmCC">GNU&#39;s not UNIX!</A>
+ <DT><A FEEDURL="http://planet.gnu.org/atom.xml" HREF="http://planet.gnu.org/">GNU Planet</A>
+ <DT><A HREF="http://www.fsf.org/" ADD_DATE="1245542771" LAST_MODIFIED="1245542780" ICON_URI="http://www.fsf.org/favicon.ico" 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>
+ </DL><p>
+</DL><p>
diff --git a/helpers/DATA/firefox/trisquel/branding/Makefile.in b/helpers/DATA/firefox/trisquel/branding/Makefile.in
new file mode 100644
index 0000000..9cc8935
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/Makefile.in
@@ -0,0 +1,67 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+include $(topsrcdir)/config/config.mk
+
+PREF_JS_EXPORTS = $(srcdir)/pref/icecat-branding.js
+
+# On Windows only do this step for browser, skip for metro.
+ifeq ($(MOZ_WIDGET_TOOLKIT) $(DIST_SUBDIR),windows browser)
+BRANDING_FILES := \
+ icecat.ico \
+ document.ico \
+ branding.nsi \
+ appname.bmp \
+ bgintro.bmp \
+ bgplain.bmp \
+ clock.bmp \
+ particles.bmp \
+ pencil.bmp \
+ pencil-rtl.bmp \
+ wizHeader.bmp \
+ wizHeaderRTL.bmp \
+ wizWatermark.bmp \
+ newwindow.ico \
+ newtab.ico \
+ pbmode.ico \
+ $(NULL)
+endif
+
+ifeq ($(MOZ_WIDGET_TOOLKIT),cocoa)
+BRANDING_FILES := \
+ background.png \
+ icecat.icns \
+ disk.icns \
+ document.icns \
+ dsstore \
+ $(NULL)
+endif
+
+ifdef MOZ_WIDGET_GTK
+BRANDING_FILES := \
+ default16.png \
+ default32.png \
+ default48.png \
+ mozicon128.png \
+ $(NULL)
+endif
+
+ifeq ($(OS_ARCH),OS2)
+BRANDING_FILES := \
+ icecat-os2.ico \
+ document-os2.ico \
+ $(NULL)
+endif
+
+BRANDING_DEST := $(DIST)/branding
+BRANDING_TARGET := export
+INSTALL_TARGETS += BRANDING
+
+ifeq ($(MOZ_WIDGET_TOOLKIT) $(DIST_SUBDIR),windows metro)
+VISUALMANIFEST := VisualElementsManifest.xml
+VISUALMANIFEST_FLAGS := -Fsubstitution -DMOZ_APP_DISPLAYNAME=${MOZ_APP_DISPLAYNAME}
+VISUALMANIFEST_PATH := $(DIST)/bin
+PP_TARGETS += VISUALMANIFEST
+endif
+
diff --git a/helpers/DATA/firefox/trisquel/branding/VisualElementsManifest.xml b/helpers/DATA/firefox/trisquel/branding/VisualElementsManifest.xml
new file mode 100644
index 0000000..f763409
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/VisualElementsManifest.xml
@@ -0,0 +1,16 @@
+<Application
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <VisualElements
+ DisplayName="@MOZ_APP_DISPLAYNAME@"
+ Logo="tileresources\VisualElements_logo.png"
+ SmallLogo="tileresources\VisualElements_smalllogo.png"
+ ForegroundText="light"
+ BackgroundColor="#0a1833">
+ <DefaultTile
+ ShortName="@MOZ_APP_DISPLAYNAME@"
+ ShowName="allLogos"
+ />
+ <SplashScreen
+ Image="tileresources\VisualElements_splashscreen.png" />
+ </VisualElements>
+</Application>
diff --git a/helpers/DATA/firefox/trisquel/branding/appname.bmp b/helpers/DATA/firefox/trisquel/branding/appname.bmp
new file mode 100644
index 0000000..69d9e0f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/appname.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/background.png b/helpers/DATA/firefox/trisquel/branding/background.png
new file mode 100644
index 0000000..e52f31d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/background.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/bgintro.bmp b/helpers/DATA/firefox/trisquel/branding/bgintro.bmp
new file mode 100644
index 0000000..14214ce
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/bgintro.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/bgplain.bmp b/helpers/DATA/firefox/trisquel/branding/bgplain.bmp
new file mode 100644
index 0000000..c82f896
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/bgplain.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/branding.nsi b/helpers/DATA/firefox/trisquel/branding/branding.nsi
new file mode 100644
index 0000000..9b6ab6a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/branding.nsi
@@ -0,0 +1,50 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# NSIS branding defines for official release builds.
+# The nightly build branding.nsi is located in browser/installer/windows/nsis/
+# The unofficial build branding.nsi is located in browser/branding/unofficial/
+
+# BrandFullNameInternal is used for some registry and file system values
+# instead of BrandFullName and typically should not be modified.
+!define BrandFullNameInternal "IceCat"
+!define CompanyName "GNU"
+!define URLInfoAbout "http://www.gnu.org/software/gnuzilla/"
+!define URLUpdateInfo "http://www.gnu.org/software/gnuzilla/"
+
+!define URLStubDownload "http://www.gnu.org/software/gnuzilla/"
+!define URLManualDownload "http://ftp.gnu.org/gnu/gnuzilla/"
+
+; The OFFICIAL define is a workaround to support different urls for Release and
+; Beta since they share the same branding when building with other branches that
+; set the update channel to beta.
+!define OFFICIAL
+!define Channel "release"
+
+# The installer's certificate name and issuer expected by the stub installer
+!define CertNameDownload "Mozilla Corporation"
+!define CertIssuerDownload "DigiCert Assured ID Code Signing CA-1"
+
+# Dialog units are used so the UI displays correctly with the system's DPI
+# settings.
+# The dialog units for the bitmap's dimensions should match exactly with the
+# bitmap's width and height in pixels.
+!define APPNAME_BMP_WIDTH_DU "134u"
+!define APPNAME_BMP_HEIGHT_DU "36u"
+!define INTRO_BLURB_WIDTH_DU "258u"
+!define INTRO_BLURB_EDGE_DU "170u"
+!define INTRO_BLURB_LTR_TOP_DU "20u"
+!define INTRO_BLURB_RTL_TOP_DU "12u"
+
+# UI Colors that can be customized for each channel
+!define FOOTER_CONTROL_TEXT_COLOR_NORMAL 0x000000
+!define FOOTER_CONTROL_TEXT_COLOR_FADED 0x666666
+!define FOOTER_BKGRD_COLOR 0xFFFFFF
+!define INTRO_BLURB_TEXT_COLOR 0x666666
+!define OPTIONS_TEXT_COLOR_NORMAL 0x000000
+!define OPTIONS_TEXT_COLOR_FADED 0x666666
+!define OPTIONS_BKGRD_COLOR 0xF0F0F0
+!define INSTALL_BLURB_TEXT_COLOR 0x666666
+!define INSTALL_PROGRESS_TEXT_COLOR_NORMAL 0x666666
+!define INSTALL_PROGRESS_TEXT_COLOR_FADED 0x999999
diff --git a/helpers/DATA/firefox/trisquel/branding/clock.bmp b/helpers/DATA/firefox/trisquel/branding/clock.bmp
new file mode 100644
index 0000000..c74398e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/clock.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/configure.sh b/helpers/DATA/firefox/trisquel/branding/configure.sh
new file mode 100644
index 0000000..7481c2c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/configure.sh
@@ -0,0 +1,5 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+MOZ_APP_DISPLAYNAME=IceCat
diff --git a/helpers/DATA/firefox/trisquel/branding/content/Makefile.in b/helpers/DATA/firefox/trisquel/branding/content/Makefile.in
new file mode 100644
index 0000000..2d17f36
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/Makefile.in
@@ -0,0 +1,13 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Branding Makefile
+# - jars chrome artwork
+
+# resources needed for the metro tile interface
+ifeq ($(MOZ_WIDGET_TOOLKIT) $(DIST_SUBDIR),windows metro)
+TILE_FILES := $(wildcard $(srcdir)/VisualElements*)
+TILE_DEST := $(DIST)/bin/tileresources
+INSTALL_TARGETS += TILE
+endif
diff --git a/helpers/DATA/firefox/trisquel/branding/content/VisualElements_logo.png b/helpers/DATA/firefox/trisquel/branding/content/VisualElements_logo.png
new file mode 100644
index 0000000..0cbf367
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/VisualElements_logo.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/content/VisualElements_smalllogo.png b/helpers/DATA/firefox/trisquel/branding/content/VisualElements_smalllogo.png
new file mode 100644
index 0000000..425f9fd
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/VisualElements_smalllogo.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/content/VisualElements_splashscreen.png b/helpers/DATA/firefox/trisquel/branding/content/VisualElements_splashscreen.png
new file mode 100644
index 0000000..484ac2f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/VisualElements_splashscreen.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/content/about-background.png b/helpers/DATA/firefox/trisquel/branding/content/about-background.png
new file mode 100644
index 0000000..f626f74
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/about-background.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/content/about-logo.png b/helpers/DATA/firefox/trisquel/branding/content/about-logo.png
new file mode 100644
index 0000000..554a13d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/about-logo.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/content/about-logo@2x.png b/helpers/DATA/firefox/trisquel/branding/content/about-logo@2x.png
new file mode 100644
index 0000000..1c4dea8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/about-logo@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/content/about-wordmark.svg b/helpers/DATA/firefox/trisquel/branding/content/about-wordmark.svg
new file mode 100644
index 0000000..7c73566
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/about-wordmark.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="aboutWordmark"
+ x="0px"
+ y="0px"
+ width="130px"
+ height="38px"
+ viewBox="0 0 130 38"
+ xml:space="preserve"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="about-wordmark.svg"><metadata
+ id="metadata9"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs7" /><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1678"
+ inkscape:window-height="980"
+ id="namedview5"
+ showgrid="false"
+ inkscape:zoom="12.361033"
+ inkscape:cx="65.19257"
+ inkscape:cy="11.28883"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="aboutWordmark" />
+
+
+
+
+
+<g
+ style="font-size:29.90496063px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Montserrat;-inkscape-font-specification:Montserrat"
+ id="text2985-3"><path
+ d="m 7.5040834,20.952038 c 0.99797,1.6e-5 1.8577666,0.138197 2.5793926,0.414545 0.721604,0.276379 1.435542,0.706277 2.141816,1.289696 l -1.174544,1.220605 c -1.0594042,-0.84443 -2.2262709,-1.266651 -3.500604,-1.266666 -1.3050564,1.5e-5 -2.4105091,0.537388 -3.3163613,1.61212 -0.9058618,1.059405 -1.3587904,2.694554 -1.3587869,4.905451 -3.5e-6,4.375758 1.4969637,6.563634 4.4909059,6.563632 1.1822123,2e-6 2.2108974,-0.253331 3.0860583,-0.759999 l 0,-4.951512 -2.8787857,0 -0.2303029,-1.63515 5.0896936,0 0,7.623025 c -1.550718,0.921211 -3.2856642,1.381817 -5.204845,1.381817 -2.0113175,0 -3.592729,-0.698585 -4.7442391,-2.095756 C 1.3319647,33.856678 0.75620807,31.814661 0.75620941,29.127789 0.75620807,26.563761 1.416409,24.560128 2.7368141,23.116885 4.0572125,21.673669 5.6463007,20.952054 7.5040834,20.952038"
+ style="font-size:23.03028679px;font-weight:normal;fill:#ffffff;-inkscape-font-specification:Fira Sans"
+ id="path2987" /><path
+ d="m 27.21585,21.228401 0,15.844837 -2.671513,0 -6.678783,-13.65696 c 0.184238,2.026677 0.276359,4.03031 0.276363,6.010905 l 0,7.646055 -1.865453,0 0,-15.844837 2.602422,0 6.724844,13.67999 c -0.1689,-1.596762 -0.253345,-3.201204 -0.253333,-4.81333 l 0,-8.86666 1.865453,0"
+ style="font-size:23.03028679px;font-weight:normal;fill:#ffffff;-inkscape-font-specification:Fira Sans"
+ id="path2989" /><path
+ d="m 42.660895,21.228401 0,10.801205 c -1.3e-5,1.59677 -0.483648,2.886464 -1.450908,3.869088 -0.951929,0.967272 -2.295361,1.450908 -4.0303,1.450908 -1.750307,0 -3.093739,-0.483636 -4.0303,-1.450908 -0.936568,-0.96727 -1.40485,-2.256965 -1.404848,-3.869088 l 0,-10.801205 1.980605,0 0,10.639993 c -4e-6,2.51798 1.151509,3.776968 3.454543,3.776967 2.303019,10e-7 3.454532,-1.258987 3.454543,-3.776967 l 0,-10.639993 2.026665,0"
+ style="font-size:23.03028679px;font-weight:normal;fill:#ffffff;-inkscape-font-specification:Fira Sans"
+ id="path2991" /><path
+ d="m 51.654545,16.349101 0,20.724137 -4.904413,0 0,-20.724137 4.904413,0"
+ style="font-weight:bold;fill:#ffffff;font-family:Fira Sans;-inkscape-font-specification:Fira Sans Bold"
+ id="path2993" /><path
+ d="m 62.358188,20.68532 c 2.093336,1.6e-5 3.907568,0.647956 5.442702,1.943822 l -2.063442,2.840972 c -0.95697,-0.777517 -1.953801,-1.166281 -2.990496,-1.166294 -2.133227,1.3e-5 -3.199837,1.644784 -3.199831,4.934319 -6e-6,1.674684 0.269139,2.860913 0.807434,3.55869 0.538282,0.697786 1.31581,1.046677 2.332587,1.046674 0.956949,3e-6 1.943812,-0.388761 2.960591,-1.166294 l 2.153157,3.020401 c -1.575007,1.256009 -3.359334,1.884012 -5.352988,1.884013 -2.432276,-10e-7 -4.35616,-0.747624 -5.771657,-2.242872 -1.395566,-1.515182 -2.093348,-3.538749 -2.093347,-6.070707 -10e-7,-2.55188 0.707749,-4.61532 2.123252,-6.190327 1.415497,-1.594916 3.299508,-2.392381 5.652038,-2.392397"
+ style="font-weight:bold;fill:#ffffff;font-family:Fira Sans;-inkscape-font-specification:Fira Sans Bold"
+ id="path2995" /><path
+ d="m 76.017276,20.68532 c 2.292703,1.6e-5 4.086999,0.717735 5.382893,2.153157 1.295867,1.435451 1.943807,3.429113 1.943823,5.980992 -1.6e-5,0.657917 -0.02992,1.226111 -0.08971,1.704583 l -9.808827,0 c 0.13955,1.33576 0.508378,2.272781 1.106483,2.811066 0.598092,0.538293 1.425462,0.807437 2.482112,0.807434 1.176251,3e-6 2.442226,-0.468507 3.79793,-1.405533 l 1.943822,2.631637 c -1.854121,1.475311 -3.917561,2.212966 -6.190327,2.212967 -2.571833,-10e-7 -4.545558,-0.757592 -5.921182,-2.272777 -1.37563,-1.515182 -2.063443,-3.548717 -2.063442,-6.100612 -10e-7,-2.472133 0.647939,-4.505669 1.943822,-6.100612 1.315814,-1.614853 3.140015,-2.422286 5.472608,-2.422302 m -2.601731,6.997761 5.293178,0 0,-0.209335 c -0.03989,-2.432258 -0.897159,-3.648392 -2.571827,-3.648405 -0.81741,1.3e-5 -1.445413,0.299062 -1.884012,0.897149 -0.438613,0.578174 -0.717725,1.565037 -0.837339,2.960591"
+ style="font-weight:bold;fill:#ffffff;font-family:Fira Sans;-inkscape-font-specification:Fira Sans Bold"
+ id="path2997" /><path
+ d="m 94.549005,15.840716 c 2.47213,2.2e-5 4.605349,0.757613 6.399665,2.272777 l -2.392401,2.840972 c -1.156338,-0.996815 -2.392409,-1.495231 -3.708215,-1.495248 -1.375637,1.7e-5 -2.472151,0.598116 -3.289546,1.794297 -0.797472,1.176277 -1.196204,2.980541 -1.196198,5.412798 -6e-6,2.412342 0.398726,4.206637 1.196198,5.382893 0.817395,1.156329 1.943814,1.734491 3.379261,1.734488 1.196187,3e-6 2.541908,-0.578159 4.03717,-1.734488 l 2.212971,2.870876 c -1.734507,1.774362 -3.89763,2.661541 -6.489381,2.661542 -2.89082,-10e-7 -5.1935,-0.94699 -6.908046,-2.840972 -1.714552,-1.913913 -2.571827,-4.605357 -2.571826,-8.074339 -10e-7,-3.389215 0.867242,-6.040786 2.601731,-7.954719 1.734483,-1.913898 3.977353,-2.870855 6.728617,-2.870877"
+ style="font-weight:bold;fill:#ffffff;font-family:Fira Sans;-inkscape-font-specification:Fira Sans Bold"
+ id="path2999" /><path
+ d="m 109.29869,20.68532 c 2.27277,1.6e-5 3.93748,0.468527 4.99413,1.405533 1.05663,0.937036 1.58495,2.342568 1.58496,4.2166 l 0,6.160421 c -1e-5,0.598104 0.0797,1.036709 0.23924,1.315819 0.17942,0.279116 0.45853,0.48845 0.83734,0.628004 l -0.98686,3.080211 c -0.97691,-0.07975 -1.77438,-0.289082 -2.3924,-0.628004 -0.59811,-0.338923 -1.07659,-0.88718 -1.43544,-1.644773 -1.03671,1.574995 -2.63164,2.362491 -4.78479,2.362492 -1.575,-10e-7 -2.83101,-0.458543 -3.76803,-1.375628 -0.93702,-0.917084 -1.40553,-2.113281 -1.40553,-3.588596 0,-1.734481 0.63797,-3.060267 1.91392,-3.97736 1.27594,-0.917076 3.12008,-1.375618 5.53242,-1.375628 l 1.61486,0 0,-0.687814 c -10e-6,-0.93701 -0.19937,-1.574982 -0.59809,-1.913917 -0.39875,-0.358847 -1.09653,-0.538277 -2.09335,-0.53829 -1.1364,1.3e-5 -2.52199,0.279126 -4.15679,0.837339 l -1.07658,-3.110116 c 2.09334,-0.777513 4.08701,-1.166277 5.98099,-1.166293 m 1.94382,9.180823 -1.16629,0 c -2.13323,7e-6 -3.19984,0.777535 -3.19983,2.332587 -1e-5,0.637977 0.15949,1.136392 0.47848,1.495248 0.33892,0.338926 0.79746,0.508387 1.37563,0.508384 1.05663,3e-6 1.89397,-0.498412 2.51201,-1.495248 l 0,-2.840971"
+ style="font-weight:bold;fill:#ffffff;font-family:Fira Sans;-inkscape-font-specification:Fira Sans Bold"
+ id="path3001" /><path
+ d="m 124.84414,17.216345 0,3.977359 3.6484,0 -0.50838,3.289546 -3.14002,0 0,7.29681 c -10e-6,0.737661 0.11961,1.265981 0.35886,1.584963 0.23923,0.31899 0.61802,0.478483 1.13639,0.47848 0.55821,3e-6 1.12641,-0.179427 1.70458,-0.53829 l 1.58496,3.020401 c -1.19621,0.837339 -2.63164,1.256008 -4.30631,1.256009 -3.46898,-0.01994 -5.20347,-1.933853 -5.20347,-5.741753 l 0,-7.35662 -2.24287,0 0,-3.289546 2.24287,0 0,-3.43907 4.72499,-0.538289"
+ style="font-weight:bold;fill:#ffffff;font-family:Fira Sans;-inkscape-font-specification:Fira Sans Bold"
+ id="path3003" /></g>
+</svg> \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/branding/content/about.png b/helpers/DATA/firefox/trisquel/branding/content/about.png
new file mode 100644
index 0000000..eaa1a31
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/about.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/content/aboutDialog.css b/helpers/DATA/firefox/trisquel/branding/content/aboutDialog.css
new file mode 100644
index 0000000..4c2a7b6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/aboutDialog.css
@@ -0,0 +1,25 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#aboutDialogContainer {
+ background-image: url("chrome://branding/content/about-background.png");
+ background-repeat: no-repeat;
+ background-color: #000;
+ color: #fff;
+}
+
+.text-link {
+ color: #fff !important;
+ text-decoration: underline;
+}
+
+#rightBox {
+ /* this margin prevents text from overlapping the planet image */
+ margin-left: 280px;
+ margin-right: 20px;
+}
+
+#bottomBox {
+ background-color: rgba(0,0,0,.7);
+}
diff --git a/helpers/DATA/firefox/trisquel/branding/content/icon48.png b/helpers/DATA/firefox/trisquel/branding/content/icon48.png
new file mode 100644
index 0000000..2f18a7d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/icon48.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/content/icon64.png b/helpers/DATA/firefox/trisquel/branding/content/icon64.png
new file mode 100644
index 0000000..16e1d6e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/icon64.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/content/identity-icons-brand.png b/helpers/DATA/firefox/trisquel/branding/content/identity-icons-brand.png
new file mode 100644
index 0000000..b26b76d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/identity-icons-brand.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/content/identity-icons-brand@2x.png b/helpers/DATA/firefox/trisquel/branding/content/identity-icons-brand@2x.png
new file mode 100644
index 0000000..41e9a1d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/identity-icons-brand@2x.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/content/jar.mn b/helpers/DATA/firefox/trisquel/branding/content/jar.mn
new file mode 100644
index 0000000..dc07b3d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/jar.mn
@@ -0,0 +1,27 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+browser.jar:
+% content branding %content/branding/ contentaccessible=yes
+ content/branding/about.png (about.png)
+ content/branding/about-background.png (about-background.png)
+ content/branding/about-logo.png (about-logo.png)
+ content/branding/about-logo@2x.png (about-logo@2x.png)
+ content/branding/about-wordmark.svg (about-wordmark.svg)
+ content/branding/icon48.png (icon48.png)
+ content/branding/icon64.png (icon64.png)
+ content/branding/icon16.png (../default16.png)
+ content/branding/icon32.png (../default32.png)
+ content/branding/icon128.png (../mozicon128.png)
+ content/branding/identity-icons-brand.png (identity-icons-brand.png)
+ content/branding/identity-icons-brand@2x.png (identity-icons-brand@2x.png)
+ content/branding/aboutDialog.css (aboutDialog.css)
+#ifdef MOZ_METRO
+ content/branding/metro-about.css (metro-about.css)
+ content/branding/metro-about-footer.png (metro-about-footer.png)
+ content/branding/metro-about-wordmark.png (metro-about-wordmark.png)
+ content/branding/metro_firstrun_logo.png (metro_firstrun_logo.png)
+ content/branding/metro_firstrun_logo@1.4x.png (metro_firstrun_logo@1.4x.png)
+ content/branding/metro_firstrun_logo@1.8x.png (metro_firstrun_logo@1.8x.png)
+#endif
diff --git a/helpers/DATA/firefox/trisquel/branding/content/metro-about-footer.png b/helpers/DATA/firefox/trisquel/branding/content/metro-about-footer.png
new file mode 100644
index 0000000..c81a520
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/metro-about-footer.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/content/metro-about-wordmark.png b/helpers/DATA/firefox/trisquel/branding/content/metro-about-wordmark.png
new file mode 100644
index 0000000..58b1390
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/metro-about-wordmark.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/content/metro-about.css b/helpers/DATA/firefox/trisquel/branding/content/metro-about.css
new file mode 100644
index 0000000..ae59ca7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/metro-about.css
@@ -0,0 +1,14 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#about-flyoutpanel {
+ background-color: #002147;
+ color: white;
+}
+
+#about-policy-label:hover,
+#about-policy-label:active {
+ background: #0a111c;
+}
+
diff --git a/helpers/DATA/firefox/trisquel/branding/content/metro_firstrun_logo.png b/helpers/DATA/firefox/trisquel/branding/content/metro_firstrun_logo.png
new file mode 100644
index 0000000..8ad7f27
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/metro_firstrun_logo.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/content/metro_firstrun_logo@1.4x.png b/helpers/DATA/firefox/trisquel/branding/content/metro_firstrun_logo@1.4x.png
new file mode 100644
index 0000000..8a247a8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/metro_firstrun_logo@1.4x.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/content/metro_firstrun_logo@1.8x.png b/helpers/DATA/firefox/trisquel/branding/content/metro_firstrun_logo@1.8x.png
new file mode 100644
index 0000000..a716c58
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/metro_firstrun_logo@1.8x.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/content/moz.build b/helpers/DATA/firefox/trisquel/branding/content/moz.build
new file mode 100644
index 0000000..c97072b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/content/moz.build
@@ -0,0 +1,7 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+JAR_MANIFESTS += ['jar.mn'] \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/branding/default16.png b/helpers/DATA/firefox/trisquel/branding/default16.png
new file mode 100644
index 0000000..d2728b4
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/default16.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/default32.png b/helpers/DATA/firefox/trisquel/branding/default32.png
new file mode 100644
index 0000000..b485806
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/default32.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/default48.png b/helpers/DATA/firefox/trisquel/branding/default48.png
new file mode 100644
index 0000000..2f18a7d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/default48.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/disk.icns b/helpers/DATA/firefox/trisquel/branding/disk.icns
new file mode 100644
index 0000000..718f1a3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/disk.icns
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/document-os2.ico b/helpers/DATA/firefox/trisquel/branding/document-os2.ico
new file mode 100644
index 0000000..214e92c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/document-os2.ico
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/document.icns b/helpers/DATA/firefox/trisquel/branding/document.icns
new file mode 100644
index 0000000..ff419f2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/document.icns
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/document.ico b/helpers/DATA/firefox/trisquel/branding/document.ico
new file mode 100644
index 0000000..3c8e283
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/document.ico
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/dsstore b/helpers/DATA/firefox/trisquel/branding/dsstore
new file mode 100644
index 0000000..2d11482
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/dsstore
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/icecat-os2.ico b/helpers/DATA/firefox/trisquel/branding/icecat-os2.ico
new file mode 100644
index 0000000..560d198
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/icecat-os2.ico
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/icecat.icns b/helpers/DATA/firefox/trisquel/branding/icecat.icns
new file mode 100644
index 0000000..0c6941a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/icecat.icns
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/icecat.ico b/helpers/DATA/firefox/trisquel/branding/icecat.ico
new file mode 100644
index 0000000..a6a7817
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/icecat.ico
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/locales/Makefile.in b/helpers/DATA/firefox/trisquel/branding/locales/Makefile.in
new file mode 100644
index 0000000..82f614e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/locales/Makefile.in
@@ -0,0 +1,5 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DEFINES += -DAB_CD=$(AB_CD)
diff --git a/helpers/DATA/firefox/trisquel/branding/locales/browserconfig.properties b/helpers/DATA/firefox/trisquel/branding/locales/browserconfig.properties
new file mode 100644
index 0000000..72ab4be
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/locales/browserconfig.properties
@@ -0,0 +1,6 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Do NOT localize or otherwise change these values
+browser.startup.homepage=about:icecat
diff --git a/helpers/DATA/firefox/trisquel/branding/locales/en-US/brand.dtd b/helpers/DATA/firefox/trisquel/branding/locales/en-US/brand.dtd
new file mode 100644
index 0000000..519de9b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/locales/en-US/brand.dtd
@@ -0,0 +1,8 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!ENTITY brandShortName "IceCat">
+<!ENTITY brandFullName "IceCat">
+<!ENTITY vendorShortName "GNU">
+<!ENTITY trademarkInfo.part1 "">
diff --git a/helpers/DATA/firefox/trisquel/branding/locales/en-US/brand.properties b/helpers/DATA/firefox/trisquel/branding/locales/en-US/brand.properties
new file mode 100644
index 0000000..3120429
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/locales/en-US/brand.properties
@@ -0,0 +1,15 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+brandShortName=IceCat
+brandFullName=IceCat
+vendorShortName=GNU
+
+homePageSingleStartMain=IceCat Start, a fast home page with built-in search
+homePageImport=Import your home page from %S
+
+homePageMigrationPageTitle=Home Page Selection
+homePageMigrationDescription=Please select the home page you wish to use:
+
+syncBrandShortName=Sync
diff --git a/helpers/DATA/firefox/trisquel/branding/locales/jar.mn b/helpers/DATA/firefox/trisquel/branding/locales/jar.mn
new file mode 100644
index 0000000..ff4e055
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/locales/jar.mn
@@ -0,0 +1,12 @@
+#filter substitution
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+@AB_CD@.jar:
+% locale branding @AB_CD@ %locale/branding/
+# Unofficial branding only exists in en-US
+ locale/branding/brand.dtd (en-US/brand.dtd)
+ locale/branding/brand.properties (en-US/brand.properties)
+ locale/branding/browserconfig.properties (browserconfig.properties)
diff --git a/helpers/DATA/firefox/trisquel/branding/locales/moz.build b/helpers/DATA/firefox/trisquel/branding/locales/moz.build
new file mode 100644
index 0000000..3a54c0c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/locales/moz.build
@@ -0,0 +1,9 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DEFINES['MOZ_DISTRIBUTION_ID_UNQUOTED'] = CONFIG['MOZ_DISTRIBUTION_ID']
+
+JAR_MANIFESTS += ['jar.mn'] \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/branding/moz.build b/helpers/DATA/firefox/trisquel/branding/moz.build
new file mode 100644
index 0000000..3e2f88f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/moz.build
@@ -0,0 +1,10 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += ['content', 'locales']
+
+DIST_SUBDIR = 'browser'
+export('DIST_SUBDIR')
diff --git a/helpers/DATA/firefox/trisquel/branding/mozicon128.png b/helpers/DATA/firefox/trisquel/branding/mozicon128.png
new file mode 100644
index 0000000..6d922fd
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/mozicon128.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/newtab.ico b/helpers/DATA/firefox/trisquel/branding/newtab.ico
new file mode 100644
index 0000000..6e3fee6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/newtab.ico
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/newwindow.ico b/helpers/DATA/firefox/trisquel/branding/newwindow.ico
new file mode 100644
index 0000000..a300935
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/newwindow.ico
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/particles.bmp b/helpers/DATA/firefox/trisquel/branding/particles.bmp
new file mode 100644
index 0000000..ab74ce0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/particles.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/pbmode.ico b/helpers/DATA/firefox/trisquel/branding/pbmode.ico
new file mode 100644
index 0000000..d217994
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/pbmode.ico
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/pencil-rtl.bmp b/helpers/DATA/firefox/trisquel/branding/pencil-rtl.bmp
new file mode 100644
index 0000000..e50d92d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/pencil-rtl.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/pencil.bmp b/helpers/DATA/firefox/trisquel/branding/pencil.bmp
new file mode 100644
index 0000000..252c10f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/pencil.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/pref/icecat-branding.js b/helpers/DATA/firefox/trisquel/branding/pref/icecat-branding.js
new file mode 100644
index 0000000..58a869e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/pref/icecat-branding.js
@@ -0,0 +1,24 @@
+pref("startup.homepage_override_url","http://www.gnu.org");
+pref("startup.homepage_welcome_url","http://www.gnu.org/software/gnuzilla/");
+// The time interval between checks for a new version (in seconds)
+// nightly=8 hours, official=24 hours
+pref("app.update.interval", 86400);
+// The time interval between the downloading of mar file chunks in the
+// background (in seconds)
+pref("app.update.download.backgroundInterval", 60);
+// URL user can browse to manually if for some reason all update installation
+// attempts fail.
+pref("app.update.url.manual", "http://www.gnu.org/software/gnuzilla/");
+// A default value for the "More information about this update" link
+// supplied in the "An update is available" page of the update wizard.
+pref("app.update.url.details", "http://www.gnu.org/software/gnuzilla/");
+
+// Release notes and vendor URLs
+pref("app.releaseNotesURL", "http://www.gnu.org/software/gnuzilla/");
+pref("app.vendorURL", "http://www.gnu.org/");
+
+// Search codes belong only in builds with official branding
+pref("browser.search.param.yahoo-fr", "");
+pref("browser.search.param.yahoo-fr-cjkt", ""); // now unused
+pref("browser.search.param.yahoo-fr-ja", "");
+pref("browser.search.param.yahoo-f-CN", "");
diff --git a/helpers/DATA/firefox/trisquel/branding/wizHeader.bmp b/helpers/DATA/firefox/trisquel/branding/wizHeader.bmp
new file mode 100644
index 0000000..87e5b0e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/wizHeader.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/wizHeaderRTL.bmp b/helpers/DATA/firefox/trisquel/branding/wizHeaderRTL.bmp
new file mode 100644
index 0000000..c7f98e7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/wizHeaderRTL.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/branding/wizWatermark.bmp b/helpers/DATA/firefox/trisquel/branding/wizWatermark.bmp
new file mode 100644
index 0000000..971b8c0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/branding/wizWatermark.bmp
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/enable-js-options.patch b/helpers/DATA/firefox/trisquel/enable-js-options.patch
new file mode 100644
index 0000000..9cca7a9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/enable-js-options.patch
@@ -0,0 +1,310 @@
+# HG changeset patch
+# User Gijs Kruitbosch <gijskruitbosch@gmail.com>
+# Date 1365155574 -7200
+# Node ID 444b9baa31d6065d37edbd61a2dcb892c989e0e2
+# Parent 99121d529b47ec285d61f64988335e60ac120cf7
+Bug 851702 - Remove JS load and advanced preferences from the UI
+
+diff --git a/browser/components/preferences/advanced-scripts.xul b/browser/components/preferences/advanced-scripts.xul
+deleted file mode 100644
+--- a/browser/components/preferences/advanced-scripts.xul
++++ /dev/null
+@@ -1,46 +0,0 @@
+-<?xml version="1.0"?>
+-
+-<!-- -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- -->
+-<!-- This Source Code Form is subject to the terms of the Mozilla Public
+- - License, v. 2.0. If a copy of the MPL was not distributed with this
+- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+-
+-<!DOCTYPE prefwindow SYSTEM "chrome://browser/locale/preferences/advanced-scripts.dtd">
+-
+-<?xml-stylesheet href="chrome://global/skin/"?>
+-
+-<prefwindow id="AdvancedJSDialog" type="child"
+- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+- title="&advancedJSDialog.title;"
+- dlgbuttons="accept,cancel,help"
+- ondialoghelp="openPrefsHelp()">
+-
+- <script type="application/javascript" src="chrome://browser/content/utilityOverlay.js"/>
+-
+- <prefpane id="AdvancedJSDialogPane"
+- helpTopic="prefs-advanced-javascript">
+-
+- <preferences>
+- <preference id="dom.event.contextmenu.enabled" name="dom.event.contextmenu.enabled" type="bool"/>
+- <preference id="dom.disable_window_move_resize" name="dom.disable_window_move_resize" type="bool" inverted="true"/>
+- <preference id="dom.disable_window_flip" name="dom.disable_window_flip" type="bool" inverted="true"/>
+- </preferences>
+-
+- <script type="application/javascript" src="chrome://browser/content/preferences/advanced-scripts.js"/>
+-
+- <stringbundle id="preferencesBundle" src="chrome://browser/locale/preferences/preferences.properties"/>
+-
+- <description value="&allowScripts.label;"/>
+-
+- <checkbox id="moveResizePopupWindows" label="&moveResizePopupWindows.label;"
+- accesskey="&moveResizePopupWindows.accesskey;"
+- preference="dom.disable_window_move_resize"/>
+- <checkbox id="raiseLowerWindows" label="&raiseLowerWindows.label;"
+- accesskey="&raiseLowerWindows.accesskey;"
+- preference="dom.disable_window_flip"/>
+- <checkbox id="disableContextMenus" label="&disableContextMenus.label;"
+- accesskey="&disableContextMenus.accesskey;"
+- preference="dom.event.contextmenu.enabled"/>
+-
+- </prefpane>
+-</prefwindow>
+diff --git a/browser/components/preferences/content.xul b/browser/components/preferences/content.xul
+--- a/browser/components/preferences/content.xul
++++ b/browser/components/preferences/content.xul
+@@ -17,23 +17,18 @@
+
+ <prefpane id="paneContent"
+ onpaneload="gContentPane.init();"
+ helpTopic="prefs-content">
+
+ <preferences id="contentPreferences">
+ <!--XXX buttons prefs -->
+
+- <!-- POPUPS, JAVASCRIPT -->
++ <!-- POPUPS -->
+ <preference id="dom.disable_open_during_load" name="dom.disable_open_during_load" type="bool"/>
+- <preference id="javascript.enabled" name="javascript.enabled" type="bool"/>
+-
+- <preference id="pref.advanced.javascript.disable_button.advanced"
+- name="pref.advanced.javascript.disable_button.advanced"
+- type="bool"/>
+
+ <!-- FONTS -->
+ <preference id="font.language.group"
+ name="font.language.group"
+ type="wstring"
+ onchange="gContentPane._rebuildFonts();"/>
+ </preferences>
+
+@@ -56,30 +51,16 @@
+ label="&blockPopups.label;" accesskey="&blockPopups.accesskey;"
+ onsyncfrompreference="return gContentPane.updateButtons('popupPolicyButton',
+ 'dom.disable_open_during_load');"/>
+ </vbox>
+ <button id="popupPolicyButton" label="&popupExceptions.label;"
+ oncommand="gContentPane.showPopupExceptions();"
+ accesskey="&popupExceptions.accesskey;"/>
+ </row>
+- <row id="enableJavaScriptRow">
+- <vbox align="start">
+- <checkbox id="enableJavaScript" preference="javascript.enabled"
+- label="&enableJavaScript.label;" accesskey="&enableJavaScript.accesskey;"
+- onsyncfrompreference="return gContentPane.updateButtons('advancedJSButton',
+- 'javascript.enabled');"/>
+- </vbox>
+- <vbox>
+- <button id="advancedJSButton" label="&advancedJS.label;"
+- accesskey="&advancedJS.accesskey;"
+- oncommand="gContentPane.showAdvancedJS();"
+- preference="pref.advanced.javascript.disable_button.advanced"/>
+- </vbox>
+- </row>
+ </rows>
+ </grid>
+ </groupbox>
+
+ <!-- Fonts and Colors -->
+ <groupbox id="fontsGroup">
+ <caption label="&fontsAndColors.label;"/>
+
+diff --git a/browser/components/preferences/in-content/content.xul b/browser/components/preferences/in-content/content.xul
+--- a/browser/components/preferences/in-content/content.xul
++++ b/browser/components/preferences/in-content/content.xul
+@@ -1,24 +1,18 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ - You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+ <preferences id="contentPreferences">
+
+- <!-- Popups and JavaScript -->
++ <!-- Popups -->
+ <preference id="dom.disable_open_during_load"
+ name="dom.disable_open_during_load"
+ type="bool"/>
+- <preference id="javascript.enabled"
+- name="javascript.enabled"
+- type="bool"/>
+- <preference id="pref.advanced.javascript.disable_button.advanced"
+- name="pref.advanced.javascript.disable_button.advanced"
+- type="bool"/>
+
+ <!-- Fonts -->
+ <preference id="font.language.group"
+ name="font.language.group"
+ type="wstring"
+ onchange="gContentPane._rebuildFonts();"/>
+ </preferences>
+
+@@ -45,30 +39,16 @@
+ label="&blockPopups.label;" accesskey="&blockPopups.accesskey;"
+ onsyncfrompreference="return gContentPane.updateButtons('popupPolicyButton',
+ 'dom.disable_open_during_load');"/>
+ </vbox>
+ <button id="popupPolicyButton" label="&popupExceptions.label;"
+ oncommand="gContentPane.showPopupExceptions();"
+ accesskey="&popupExceptions.accesskey;"/>
+ </row>
+- <row id="enableJavaScriptRow">
+- <vbox align="start">
+- <checkbox id="enableJavaScript" preference="javascript.enabled"
+- label="&enableJavaScript.label;" accesskey="&enableJavaScript.accesskey;"
+- onsyncfrompreference="return gContentPane.updateButtons('advancedJSButton',
+- 'javascript.enabled');"/>
+- </vbox>
+- <vbox>
+- <button id="advancedJSButton" label="&advancedJS.label;"
+- accesskey="&advancedJS.accesskey;"
+- oncommand="gContentPane.showAdvancedJS();"
+- preference="pref.advanced.javascript.disable_button.advanced"/>
+- </vbox>
+- </row>
+ </rows>
+ </grid>
+ </groupbox>
+
+ <!-- Fonts and Colors -->
+ <groupbox id="fontsGroup" data-category="paneContent" hidden="true">
+ <caption label="&fontsAndColors.label;"/>
+
+diff --git a/browser/components/preferences/jar.mn b/browser/components/preferences/jar.mn
+--- a/browser/components/preferences/jar.mn
++++ b/browser/components/preferences/jar.mn
+@@ -4,17 +4,16 @@
+
+ browser.jar:
+ content/browser/preferences/aboutPermissions.xul
+ content/browser/preferences/aboutPermissions.js
+ content/browser/preferences/aboutPermissions.css
+ content/browser/preferences/aboutPermissions.xml
+ * content/browser/preferences/advanced.xul
+ * content/browser/preferences/advanced.js
+- content/browser/preferences/advanced-scripts.xul
+ content/browser/preferences/applications.xul
+ * content/browser/preferences/applications.js
+ content/browser/preferences/applicationManager.xul
+ * content/browser/preferences/applicationManager.js
+ * content/browser/preferences/colors.xul
+ * content/browser/preferences/cookies.xul
+ content/browser/preferences/cookies.js
+ content/browser/preferences/content.xul
+diff --git a/browser/locales/en-US/chrome/browser/preferences/advanced-scripts.dtd b/browser/locales/en-US/chrome/browser/preferences/advanced-scripts.dtd
+deleted file mode 100644
+--- a/browser/locales/en-US/chrome/browser/preferences/advanced-scripts.dtd
++++ /dev/null
+@@ -1,15 +0,0 @@
+-<!-- This Source Code Form is subject to the terms of the Mozilla Public
+- - License, v. 2.0. If a copy of the MPL was not distributed with this
+- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+-
+-<!ENTITY advancedJSDialog.title "Advanced JavaScript Settings">
+-<!ENTITY window.width "37em">
+-
+-<!ENTITY allowScripts.label "Allow scripts to:">
+-
+-<!ENTITY moveResizePopupWindows.label "Move or resize popup windows">
+-<!ENTITY moveResizePopupWindows.accesskey "M">
+-<!ENTITY raiseLowerWindows.label "Raise or lower windows">
+-<!ENTITY raiseLowerWindows.accesskey "R">
+-<!ENTITY disableContextMenus.label "Disable or replace context menus">
+-<!ENTITY disableContextMenus.accesskey "D">
+diff --git a/browser/locales/en-US/chrome/browser/preferences/content.dtd b/browser/locales/en-US/chrome/browser/preferences/content.dtd
+--- a/browser/locales/en-US/chrome/browser/preferences/content.dtd
++++ b/browser/locales/en-US/chrome/browser/preferences/content.dtd
+@@ -2,25 +2,16 @@
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+ <!ENTITY blockPopups.label "Block pop-up windows">
+ <!ENTITY blockPopups.accesskey "B">
+ <!ENTITY popupExceptions.label "Exceptions…">
+ <!ENTITY popupExceptions.accesskey "E">
+
+-<!ENTITY enableJavaScript.label "Enable JavaScript">
+-<!ENTITY enableJavaScript.accesskey "J">
+-<!ENTITY advancedJS.label "Advanced…">
+-<!ENTITY advancedJS.accesskey "v">
+-
+-<!ENTITY enableJava.label "Enable Java">
+-<!ENTITY enableJava.accesskey "n">
+-
+-
+ <!ENTITY fontsAndColors.label "Fonts &amp; Colors">
+
+ <!ENTITY defaultFont.label "Default font:">
+ <!ENTITY defaultFont.accesskey "D">
+ <!ENTITY defaultSize.label "Size:">
+ <!ENTITY defaultSize.accesskey "S">
+
+ <!ENTITY advancedFonts.label "Advanced…">
+diff --git a/browser/locales/jar.mn b/browser/locales/jar.mn
+--- a/browser/locales/jar.mn
++++ b/browser/locales/jar.mn
+@@ -81,17 +81,16 @@
+ #endif
+ locale/browser/feeds/subscribe.dtd (%chrome/browser/feeds/subscribe.dtd)
+ locale/browser/feeds/subscribe.properties (%chrome/browser/feeds/subscribe.properties)
+ locale/browser/migration/migration.dtd (%chrome/browser/migration/migration.dtd)
+ locale/browser/migration/migration.properties (%chrome/browser/migration/migration.properties)
+ locale/browser/preferences/aboutPermissions.dtd (%chrome/browser/preferences/aboutPermissions.dtd)
+ locale/browser/preferences/aboutPermissions.properties (%chrome/browser/preferences/aboutPermissions.properties)
+ locale/browser/preferences/advanced.dtd (%chrome/browser/preferences/advanced.dtd)
+- locale/browser/preferences/advanced-scripts.dtd (%chrome/browser/preferences/advanced-scripts.dtd)
+ locale/browser/preferences/applicationManager.dtd (%chrome/browser/preferences/applicationManager.dtd)
+ locale/browser/preferences/applicationManager.properties (%chrome/browser/preferences/applicationManager.properties)
+ locale/browser/preferences/colors.dtd (%chrome/browser/preferences/colors.dtd)
+ locale/browser/preferences/cookies.dtd (%chrome/browser/preferences/cookies.dtd)
+ locale/browser/preferences/content.dtd (%chrome/browser/preferences/content.dtd)
+ locale/browser/preferences/connection.dtd (%chrome/browser/preferences/connection.dtd)
+ locale/browser/preferences/applications.dtd (%chrome/browser/preferences/applications.dtd)
+ locale/browser/preferences/fonts.dtd (%chrome/browser/preferences/fonts.dtd)
+--- a/browser/components/preferences/content.js 2014-04-28 01:52:01.000000000 +0200
++++ b/browser/components/preferences/content.js 2014-05-07 17:02:34.000000000 +0200
+@@ -57,18 +57,7 @@
+ "chrome://browser/content/preferences/permissions.xul",
+ "", params);
+ },
+-
+- // JAVASCRIPT
+
+- /**
+- * Displays the advanced JavaScript preferences for enabling or disabling
+- * various annoying behaviors.
+- */
+- showAdvancedJS: function ()
+- {
+- openDialog("chrome://browser/content/preferences/advanced-scripts.xul",
+- "Browser:AdvancedScripts", null);
+- },
+
+ // FONTS
+
+--- a/browser/components/preferences/in-content/content.js 2014-05-07 17:01:48.000000000 +0200
++++ b/browser/components/preferences/in-content/content.js 2014-04-28 01:52:01.000000000 +0200
+@@ -58,18 +58,6 @@
+ "Browser:Permissions", "resizable=yes", params);
+ },
+
+- // JAVASCRIPT
+-
+- /**
+- * Displays the advanced JavaScript preferences for enabling or disabling
+- * various annoying behaviors.
+- */
+- showAdvancedJS: function ()
+- {
+- openDialog("chrome://browser/content/preferences/advanced-scripts.xul",
+- "Browser:AdvancedScripts", null);
+- },
+-
+ // FONTS
+
+ /**
diff --git a/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/LICENSE b/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/LICENSE
new file mode 100644
index 0000000..10d1ec6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/LICENSE
@@ -0,0 +1,24 @@
+Extension built by Ruben Rodriguez using pieces of torbutton as a template
+
+Copyright (c) 2014, Ruben Rodriguez <ruben@gnu.org>
+Copyright (c) 2013, The Tor Project, Inc.
+Copyright (c) 2006 Scott Squires, Oleg Ivanov
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/chrome.manifest b/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/chrome.manifest
new file mode 100644
index 0000000..d2eafb9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/chrome.manifest
@@ -0,0 +1,8 @@
+content icecathome chrome/content/
+
+locale icecathome af chrome/locale/es/
+locale icecathome ak chrome/locale/en/
+
+component {a364a9c0-2960-11e4-8c21-0800200c9a66} components/aboutIceCat.js
+contract @mozilla.org/network/protocol/about;1?what=icecat {a364a9c0-2960-11e4-8c21-0800200c9a66}
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/chrome/content/aboutIceCat/aboutIceCat.xhtml b/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/chrome/content/aboutIceCat/aboutIceCat.xhtml
new file mode 100644
index 0000000..3999c6a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/chrome/content/aboutIceCat/aboutIceCat.xhtml
@@ -0,0 +1,279 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE html [
+ <!ENTITY % htmlDTD
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "DTD/xhtml1-strict.dtd">
+ %htmlDTD;
+ <!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd">
+ %globalDTD;
+ <!ENTITY % aboutHomeDTD SYSTEM "chrome://browser/locale/aboutHome.dtd">
+ %aboutHomeDTD;
+ <!ENTITY % browserDTD SYSTEM "chrome://browser/locale/browser.dtd" >
+ %browserDTD;
+]>
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <title>&abouthome.pageTitle;</title>
+
+ <link rel="icon" type="image/png" id="favicon"
+ href="chrome://branding/content/icon32.png"/>
+ <link rel="stylesheet" type="text/css" media="all"
+ href="chrome://browser/content/abouthome/aboutHome.css"/>
+
+<style>
+
+label{
+position:relative;
+bottom:2px;
+left:2px;
+}
+
+#addonsform form{
+position:relative;
+left:10px;
+}
+
+em {
+color:#600
+}
+
+a{
+color:#004998
+}
+
+#addonsform{
+background-color:#fff;
+font-size:14px;
+padding:10px 30px 20px 30px;
+border-radius: 10px;
+box-shadow: 0px 0px 5px #888888;
+}
+
+.block-side-margin {
+ min-width: 16px;
+ -moz-box-flex: 1;
+}
+
+#block-horizontal-margin {
+ display: -moz-box;
+ -moz-box-flex: 1;
+}
+
+ul li {
+list-style:none;
+background:#ddd;
+border-radius:3px;
+padding:3px 5px 3px 5px;
+margin:5px;
+box-shadow: 0px 2px 0 #ccc ;
+float:left;
+}
+
+ul li a{
+font-weight:bold;
+color:#666;
+text-shadow:0px 1px 0px #fff;
+}
+
+#trisquel a {
+font-weight:bold;
+color:#56728C;
+text-shadow:0px 1px 0px #fff;
+}
+
+#footer{
+min-height:100px;
+}
+
+</style>
+
+<script type="text/javascript">
+<![CDATA[
+
+Components.utils.import("resource://gre/modules/AddonManager.jsm");
+Components.utils.import("resource://gre/modules/Services.jsm");
+
+function flip(sel){
+ var id = sel.id;
+ var addonObj=-1;
+ AddonManager.getAddonByID(id, function(addon) {
+ addonObj=addon;
+ });
+ var thread = Components.classes["@mozilla.org/thread-manager;1"].getService().currentThread;
+ while (addonObj == null || addonObj == -1)
+ thread.processNextEvent(true);
+ addonObj.userDisabled = addonObj.isActive;
+ if ( addonObj.operationsRequiringRestart != 0)
+ alert("This change will be applied when you restart IceCat");
+}
+
+function languagesettings(sel){
+ if (sel.checked)
+ Services.prefs.setCharPref(sel.id,sel.value);
+ else
+ Services.prefs.clearUserPref(sel.id);
+}
+
+function fontsettings(sel){
+ if (sel.checked)
+ Services.prefs.setIntPref(sel.id,sel.value);
+ else
+ Services.prefs.clearUserPref(sel.id);
+}
+
+
+function prepare(){
+
+/*try {
+Services.prefs.getCharPref("extensions.icecathome.intl.accept_languages");
+}catch(err){
+Services.prefs.setCharPref("intl.accept_languages","en-US, en");
+Services.prefs.setCharPref("extensions.icecathome.intl.accept_languages","en-US, en");
+}
+
+try {
+Services.prefs.getIntPref("extensions.icecathome.browser.display.use_document_fonts");
+}catch(err){
+Services.prefs.setIntPref("browser.display.use_document_fonts",0);
+Services.prefs.setIntPref("extensions.icecathome.browser.display.use_document_fonts",0);
+}*/
+
+ var f = document.createElement("form");
+
+ var extensions=[
+["jid1-KtlZuoiikVfFew@jetpack","Block execution of non-free <a target=\"_blank\" href=\"http://www.gnu.org/software/librejs/\">JavaScript</a> <em>(experimental)</em>"],
+["{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}","Block privacy <a target=\"_blank\" href=\"https://easylist.adblockplus.org\">trackers</a>"],
+["torproxy@trisquel","Use <a target=\"_blank\" href=\"https://www.torproject.org/\">Tor</a> when in Private Mode"],
+["https-everywhere@eff.org","Get redirected to <a target=\"_blank\" href=\"https://www.eff.org/https-everywhere/faq\">HTTPS</a> when possible"],
+]
+
+ for (var i=0; i<extensions.length; ++i) {
+ var ex=extensions[i][0];
+
+ var tmp = document.createElement("input");
+ tmp.setAttribute('type',"checkbox");
+ tmp.setAttribute('id', ex);
+ tmp.setAttribute('onclick','flip(this);');
+
+ var label = document.createElement("label");
+ label.htmlFor = ex ;
+ label.id = ex+'label';
+ label.appendChild(document.createTextNode(''));
+
+ f.appendChild(tmp);
+ f.appendChild(label);
+ f.appendChild(document.createElement("br"));
+
+ document.getElementById("addonsform").appendChild(f);
+ }
+
+ var tmp = document.createElement("input");
+ tmp.setAttribute('type',"checkbox");
+ tmp.setAttribute('id', "intl.accept_languages");
+ tmp.setAttribute('value', "en-US, en");
+ tmp.setAttribute('onclick','languagesettings(this);');
+ value=Services.prefs.getCharPref("intl.accept_languages");
+ tmp.checked=(value=="en-US, en");
+ var label = document.createElement("label");
+ label.htmlFor = "intl.accept_languages" ;
+ label.id = "intl.accept_languageslabel";
+ label.appendChild(document.createTextNode("Request pages in English"));
+ f.appendChild(tmp);
+ f.appendChild(label);
+ f.appendChild(document.createElement("br"));
+ document.getElementById("addonsform").appendChild(f);
+
+ var tmp = document.createElement("input");
+ tmp.setAttribute('type',"checkbox");
+ tmp.setAttribute('id', "browser.display.use_document_fonts");
+ tmp.setAttribute('value', 0);
+ tmp.setAttribute('onclick','fontsettings(this);');
+ value=Services.prefs.getIntPref("browser.display.use_document_fonts");
+ tmp.checked=(value==0);
+ var label = document.createElement("label");
+ label.htmlFor = "browser.display.use_document_fonts" ;
+ label.id = "browser.display.use_document_fontslabel";
+ label.appendChild(document.createTextNode("Use system fonts"));
+ f.appendChild(tmp);
+ f.appendChild(label);
+ f.appendChild(document.createElement("br"));
+ document.getElementById("addonsform").appendChild(f);
+
+
+ for (var i=0; i<extensions.length; ++i) {
+ var ex=extensions[i][0];
+ var addonObj=-1;
+
+ AddonManager.getAddonByID(ex, function(addon) {
+ addonObj=addon;
+ });
+
+ var thread = Components.classes["@mozilla.org/thread-manager;1"].getService().currentThread;
+ while ( addonObj == -1)
+ thread.processNextEvent(true);
+ if ( addonObj != null){
+ document.getElementById(ex).checked = addonObj.isActive;
+ //document.getElementById(ex+'label').innerHTML = addonObj.name;
+ document.getElementById(ex+'label').innerHTML = extensions[i][1];
+ }else{
+ document.getElementById(ex).style.display='none';
+ document.getElementById(ex+'label').style.display='none';
+ }
+ }
+}
+
+
+]]>
+</script>
+
+ </head>
+
+ <body dir="&locale.dir;" onload="prepare();">
+
+ <div class="spacer"/>
+ <div id="topSection">
+ <img src="chrome://branding/content/about-logo.png"/>
+
+ <div id="searchContainer">
+ <form name="searchForm" id="searchForm" action="https://duckduckgo.com/html/">
+ <input type="hidden" name="t" value="trisquel"/>
+ <input type="text" name="q" value="" id="searchText" maxlength="256"
+ autofocus="autofocus"/>
+ <input id="searchSubmit" type="submit" value="&abouthome.searchEngineButton.label;"/>
+ </form>
+ </div>
+
+ </div>
+
+ <div class="spacer"/>
+
+<div id="block-horizontal-margin">
+<div class="block-side-margin"></div>
+<div id="addonsform">
+<h3>Enabled privacy features:</h3>
+<p>The <a target="_blank" href="http://www.gnu.org/software/gnuzilla/">GNU IceCat</a> web browser protects your <a target="_blank" href="http://www.gnu.org/philosophy/free-sw.html">freedom</a> and your privacy!</p>
+</div>
+<div class="block-side-margin"></div>
+</div>
+
+ <div class="spacer"/>
+
+<div id="footer" style=" display: -moz-box; -moz-box-align: center; -moz-box-pack: center; width: 100%; background-color: hsla(0,0%,0%,.03); border-top: 1px solid hsla(0,0%,0%,.03); box-shadow: 0 2px 5px hsla(0,0%,0%,.1) inset, 0 -1px 0 hsla(0,0%,100%,.25);">
+<p id="trisquel"><a href="https://trisquel.info">Trisquel GNU/Linux</a>:</p>
+<ul style="font-size:0.8em">
+<li><a href="https://trisquel.info/forum">Forum</a></li>
+<li><a href="https://trisquel.info/wiki">Wiki</a></li>
+<li><a href="http://store.trisquel.info/">Store</a></li>
+<li><a href="https://trisquel.info/donate">Donate</a></li>
+</ul>
+</div>
+
+ </body>
+</html>
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/chrome/locale/en/aboutIceCat.dtd b/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/chrome/locale/en/aboutIceCat.dtd
new file mode 100644
index 0000000..55efd56
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/chrome/locale/en/aboutIceCat.dtd
@@ -0,0 +1 @@
+<!ENTITY aboutIceCat.title "About IceCat">
diff --git a/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/chrome/locale/es/aboutIceCat.dtd b/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/chrome/locale/es/aboutIceCat.dtd
new file mode 100644
index 0000000..2412c09
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/chrome/locale/es/aboutIceCat.dtd
@@ -0,0 +1 @@
+<!ENTITY aboutIceCat.title "Acerca de IceCat">
diff --git a/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/components/aboutIceCat.js b/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/components/aboutIceCat.js
new file mode 100644
index 0000000..6b32cc1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/components/aboutIceCat.js
@@ -0,0 +1,72 @@
+/*
+
+Copyright (c) 2014, Ruben Rodriguez <ruben@gnu.org>
+Copyright (c) 2013, The Tor Project, Inc.
+Copyright (c) 2006 Scott Squires, Oleg Ivanov
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+// Module specific constants
+const kMODULE_NAME = "about:icecat";
+const kMODULE_CONTRACTID = "@mozilla.org/network/protocol/about;1?what=icecat";
+const kMODULE_CID = Components.ID("a364a9c0-2960-11e4-8c21-0800200c9a66");
+
+const kAboutIceCatURL = "chrome://icecathome/content/aboutIceCat/aboutIceCat.xhtml";
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cu = Components.utils;
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+function AboutIceCat()
+{
+}
+
+
+AboutIceCat.prototype =
+{
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIAboutModule]),
+
+ // nsIClassInfo implementation:
+ classDescription: kMODULE_NAME,
+ classID: kMODULE_CID,
+ contractID: kMODULE_CONTRACTID,
+
+ // nsIAboutModule implementation:
+ newChannel: function(aURI)
+ {
+ let ioSvc = Cc["@mozilla.org/network/io-service;1"]
+ .getService(Ci.nsIIOService);
+ let channel = ioSvc.newChannel(kAboutIceCatURL, null, null);
+ channel.originalURI = aURI;
+
+ return channel;
+ },
+
+ getURIFlags: function(aURI)
+ {
+ return Ci.nsIAboutModule.ALLOW_SCRIPT;
+ }
+};
+
+
+const NSGetFactory = XPCOMUtils.generateNSGetFactory([AboutIceCat]);
diff --git a/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/defaults/preferences/preferences.js b/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/defaults/preferences/preferences.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/defaults/preferences/preferences.js
diff --git a/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/install.rdf b/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/install.rdf
new file mode 100644
index 0000000..0f8065a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/abouticecat@gnu.org/install.rdf
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+
+ <Description about="urn:mozilla:install-manifest">
+ <em:name>IceCatHome</em:name>
+ <em:creator>Ruben Rodriguez</em:creator>
+ <em:id>abouticecat@gnu.org</em:id>
+ <em:version>1.0</em:version>
+ <em:updateURL>https://127.0.0.1/</em:updateURL>
+ <!-- <em:updateKey></em:updateKey> -->
+ <!-- firefox -->
+ <em:targetApplication>
+ <Description>
+ <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
+ <em:minVersion>30.0</em:minVersion>
+ <em:maxVersion>10000.0</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ </Description>
+</RDF>
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/Changelog b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/Changelog
new file mode 100644
index 0000000..c5f270b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/Changelog
@@ -0,0 +1,1426 @@
+3.5.1 (2014-04-25)
+ * Revert https://github.com/EFForg/https-everywhere/pull/134 due to YouTube
+ breakage.
+ * Re-enable ability to see all rulesets in enable/disable dialog.
+ * Added more Debian coverage.
+ * Fixes to Doubleclick, Guardian, Heroku, Home Depot, HypeMachine, IMDB,
+ Justin.tv, Kikatek, Mozilla, MyFitnessPal, Pinterest, XKCD, Reuters,
+ Technet, Tumblr, Wordpress, Yandex, Youtube, Flickr.
+ * Fix Australis icon positioning:
+ https://github.com/EFForg/https-everywhere/pull/216
+
+chrome-2014.4.25
+ * Ruleset fixes (same as 3.5.1)
+
+chrome-2014.4.16
+ * Make Chrome build script compatible with Chrome release scripts.
+ * Fix disappearing icon: https://github.com/EFForg/https-everywhere/pull/220
+ * Fix XKCD images
+
+chrome-2014.4.14.1
+ * Revert back to chrome-2014.1.3 because of bug in Chrome release script.
+
+chrome-2014.4.14
+ * Add SV localization
+ * Add persistent user-generated rules, thanks to Vijay P.:
+ https://github.com/EFForg/https-everywhere/pull/60
+ * Use onBeforeRedirect for redirect loop detection:
+ https://github.com/EFForg/https-everywhere/pull/199
+ * Remove unneeded onBeforeSendHeaders listener:
+ https://github.com/EFForg/https-everywhere/pull/172
+ * Fix host-only cookie bug:
+ https://github.com/EFForg/https-everywhere/pull/166
+ * Split incognito mode:
+ https://github.com/EFForg/https-everywhere/pull/165
+ * Cleanup pageAction icon code:
+ https://github.com/EFForg/https-everywhere/pull/173
+ * Add and modify some rulesets (same as 3.5)
+
+3.5 (2014-04-14)
+ * Merge all non-ruleset changes from 4.0development.16
+ * Merge all new/modified rulesets from 4.0development.16 that are
+ in the Alexa Top 1000 using utils/alexa-ruleset-checker.py. For a full list,
+ see utils/alexa-logs/07042014.log.
+
+4.0development.16 (2014-04-14)
+ * Restore code that loads custom rule files:
+ https://github.com/EFForg/https-everywhere/pull/156
+ * Use loadContext interface to get windows associated with requests
+ * Reduce annoying logging messages
+ * Report cert warning pages to SSL Observatory
+ * Remove SSL Observatory observers when disabled
+ * Don't set LOAD_REPLACE flag:
+ https://github.com/EFForg/https-everywhere/pull/134
+ * Add script to merge rulesets in Alexa Top 1M, thanks to Claudio MOretti:
+ https://github.com/EFForg/https-everywhere/pull/149
+ * 8 new rules
+ * 59 modified rules
+
+4.0development.15 (2014-02-05)
+ * Replace the single XML ruleset library with an sqlite database of rulesets
+ that are loaded on demand
+ - reduces startup time by a factor of 10-20:
+ https://trac.torproject.org/projects/tor/ticket/10174
+ - reduces RAM usage https://trac.torproject.org/projects/tor/ticket/4804
+ - Is scalable: https://trac.torproject.org/projects/tor/ticket/6118
+ Further analysis in this thread:
+ https://lists.eff.org/pipermail/https-everywhere/2014-January/001919.html
+ * Implement a cleanup case to recover from some Observatory UI code bugs that
+ would leave the Observatory off incorrectly.
+ https://trac.torproject.org/projects/tor/ticket/10728
+ * Fix observatory - private browsing mode interaction
+ https://trac.torproject.org/projects/tor/ticket/10208
+ * Ship 848 new rulesets
+ * Update cert whitelist
+
+3.5android.0 (2014-01-31)
+ * First Firefox for Android release! :D
+ * Major UI changes for mobile compatibility
+ * Android channel update URL set to
+ https://www.eff.org/files/https-everywhere-android-update-2048.rdf
+ * Updated rulesets: Freenode, Imgur
+
+3.4.5 (2014-01-03)
+ * Updated license
+ * Updated README.md
+ * Updated contributors list
+ * Fix a performance bug when re-enabling HTTPS-Everywhere from its menu
+ * Observatory cert whitelist update
+ * Updated rules: Atlassian, Brightcove, MIT, Pidgin, Microsoft, Whonix,
+ Skanetrafiken, Stack-Exchange, Stack-Exchange-mixedcontent
+
+chrome-2014.1.3
+ * Various ruleset fixes
+ * Various performance improvements, thanks to Nick Semenkovich and Jacob
+ Hoffman-Andrews!
+ * Add LRU caching for rules
+ * Refactor out unused code
+ * Reload page when rule is disabled
+ * Upgrade URI.js
+ * Add fi translation
+
+3.4.4tbb (2013-12-06)
+ * Pseudorelease, just for Tor Browser Bundle usage
+ * Tiny ruleset tweaks (XKCD is back)!
+ * Create an about:config setting that overrules mixedcontent ruleset disablement
+
+3.4.3 (2013-12-03)
+ * Fixes: Cloudfront / Amazon MP3 player, Cornell/Arxiv, FlickR,
+ AmazonAWS/spiegel.tv
+ * Disable broken: Barns and Noble, Behance, Boards.ie, Elsevier, Kohls,
+ OpenDNS, Spin.de, Svenskakyrkan
+ * Deprecate the ContentPolicy API, fixing a crash bug
+ lurking since Firefox 20:
+ https://bugzilla.mozilla.org/show_bug.cgi?id=939180
+ * Fix really silly Observatory UI bug that would leave the Observatory off
+ for non-Tor users after they turned it on
+ * Update Observatory blacklist
+ * Bump maxVersion from Firefox 25 to 28.
+
+4.0development.14 (2013-11-21)
+ * Deprecate the ContentPolicy API, fixing a crash bug
+ lurking since Firefox 20:
+ https://bugzilla.mozilla.org/show_bug.cgi?id=939180
+ * Fix really silly Observatory UI bug that would leave the Observatory off
+ for non-Tor users after they turned it on
+ * Ship 438 new rulesets
+ * Update Observatory blacklist
+
+4.0development.13 (2013-10-04)
+ * HTTPS Everywhere builds are now deterministic!
+ * Numerous new and updated rules
+
+3.4.2 (2013-10-04)
+ * HTTPS Everywhere builds are now deterministic!
+ * Global memory leak bug fixes
+ * Updated rules: Craigslist, Apple.com, Microsoft, CloudFront, UKLocalGov,
+ Bing, Cengage
+ * New rules from dev: IPTorrents.com, TvTorrents
+
+4.0development.12 (2013-09-12)
+ * Fix clients1.google.com OSCP meltdown
+ https://trac.torproject.org/projects/tor/ticket/9713
+ * Updated rules: ConnMan, Viddler.com, ISC, GNOME, Dozuki, Thingiverse, Box,
+ ComputerWorld, Makerbot, McClatchy Interactive.com, Mozilla, Ohio State
+ University, printrbot, Thingiverse, Tradedoubler, XiTi.com, Flameeyes, Open
+ Clipart Library, Musopen, CERN, FilZilla, Google Services, Linux Foundation,
+ Debian, Python.org, Ardour, Netmarble, Drexel University, Guifi.net,
+ net-security.org, University of California, WordPress blogs, Perl.org
+ * New rules: Akira.org, AntiPolygraph.org, Banu.com, break.com, Click and
+ Pledge.com, DataCoup.com, linux-sunxi.org, Lockbox.com, PSC.edu, University
+ of Greifswald, University of Rostock, WIMM.com, ZeusClicks.com,
+ gayorrents.net, Addison.com.hk, Auto Ad Manager.com, Blutmagie.de,
+ Brixwork.com, HDtracks.com, hostname.sk, iPXE.org, Linn Records.com,
+ Navigant Research.com, OpenLDAP.org, Quotes and Sayings.com, Solid-Run.com,
+ TU-Dresden.de, Tux.Org, Ultrasurf.us, Zamzar.com, chaox.net, digilinux.ru,
+ iNaturalist.org, IUCNredlist.org, jensge.org, Libre Graphics World.org,
+ NAB.org, PengPod.com, pythonhosted.org, randombit.net, factorable.net,
+ JoeyH.name, Acunetix.com, Alex Cabal.com, Altera.com, Commotionwireless.net,
+ CounterMail.com, dotplex.de, Dyne.org, finalrewind.net, Keelog.com,
+ Mailinator.com, My Shadow.com, OpenMailBox.org, PwdHash.com, Silent
+ Sender.com, Standard Ebooks.com, Tarasic.com.tw, Barracuda.com
+
+4.0development.11 (2013-08-30)
+ * Notify users who have been accidentally updated from stable to dev
+ https://trac.torproject.org/projects/tor/ticket/9600
+ * Added and updated numerous rules, including Craigslist
+ * Fixes toolbar button size
+ https://trac.torproject.org/projects/tor/ticket/9511
+ * Declare loop variables with var to avoid global memory leaks
+ * Updated localizations
+
+3.4.1
+ * Fix typo resulting in variable leak in get_prefs(), thanks to Jérémy
+ Bobbio
+
+3.4
+ * Do not upgrade stable users to the development branch!
+ * The previous release moved extension code from the development branch into
+ the stable branch, and changed many stable rules
+
+chrome-2013.8.17
+ * Urgent bugfix release for
+ https://trac.torproject.org/projects/tor/ticket/9507
+ - release from the stable / 3.0 branch, not master
+ - don't ship the development ruleset library, it's not ready for prime
+ time yet
+ - avoid performance hits from repeatedly re-testing rulesets
+ - other possible weirdness
+
+chrome-2013-8.16
+ * Includes all fixes from 3.3, 3.3.1, and 4.0development.10
+ * This will be the first Chromium release where the bulk of the rules that
+ are broken because of mixed content will be disabled by default
+
+4.0development.10
+ * Numerous rules added, modified, and deleted
+ * Added utils/find_rules.py, python script by Osama Khalid to apply HTTPS
+ Everywhere rules to URLs
+ * Updated readme to include more dependencies
+
+3.3.2
+ * We merged in a bunch of non-ruleset changes from 4.0development.9:
+ https://trac.torproject.org/projects/tor/ticket/9480
+ (Notable changes from this merge include a rewriting of fetch-source.js,
+ improvements to the CSS such that the icon changes color when disabled
+ and shows the number of applied rules when active, fixing bugs in
+ HTTPSRules.js and ApplicableList.js that led to undefined functions,
+ and rewriting makexpi.sh to accept a --fast flag.)
+ * The tickets described below were fixed by the merge from 4.0development.9:
+ https://trac.torproject.org/projects/tor/ticket/8998
+ https://trac.torproject.org/projects/tor/ticket/9374
+ * Add a script find_rules.py by Osama Khalid to utils/. It applies HTTPS
+ Everywhere rules to URLs.
+ * Add merge-rulesets.py from master to utils/.
+ * Removed default parameters for a js function that caused breakage
+ in older versions of FF.
+ * Changed mixed content blocking in FF to be based on the user's active
+ content blocking preferences rather than if the FF version is >=23.0.
+ * [Zurcher_Katonalbank] Add rule
+ * [LegitScript] www now supports SSL
+ * [DebianOwnCA] Debian self-signed cert rules
+ * [Debian] Update rule for non-self-signed domains
+ * [UKLocalGov] Add havering.gov.uk
+ * [aeriagames] Use CDN with valid cert
+ * [spu.ac.th] Disable (https site not found)
+ * Added rules from mishari for Loxinfo, SPU, Silkspan, Settrade,
+ Powerbuy, opengarden.com, Naiin, MyHappyOffice, Mirakar,
+ MarketingOops, Makewebeasy, m2fjob, LandandHouse, Jaymart,
+ Etravelway, Craigslist, Blognone, TrueCorp, dealfish, 3bbwifi,
+ thepiratebay, and priceza.
+ * [Ubuntu] Add rule for ubuntuforums.org
+ * [EuroBillTracker.xml] Add EuroBillTracker rule
+ * [wikidot] Exclusion for iframes
+ * [StockCharts] Add reason for disabling
+ * [9gag] Disable rule for breaking AJAX.
+ * [MayFirstPeopleLink] Updated rule
+ * [Derpiboo.ru] Add rule
+ * [Fedora Project] Split start
+ * [Lurkmore.to] Add rule
+ * [2ch.so] Add rule
+ * [FSF] Added the status and u subdomains
+ * [Reddit] Exclude blog
+ * [Desk.com] Fix
+ * [Cheezburger] Fix
+ * Updated debian dependencies in readme
+ * [Adtech.de] Add exclusion
+
+3.3.1
+ * [Wikimedia] removed mixedcontent
+
+4.0development.9
+ * Includes all fixes from 3.3
+
+3.3
+ * This major release fixed the following mixed content blocker (MCB)
+ related bugs in time for Firefox 23:
+ https://trac.torproject.org/projects/tor/ticket/9196
+ https://trac.torproject.org/projects/tor/ticket/8774
+ https://trac.torproject.org/projects/tor/ticket/8776
+ * In effect, this update disables rulesets that cause mixed content errors
+ by default, and adds platform="mixedcontent" to 950 new rules. This is
+ necessary to prevent a massive amount of websites from breaking by default
+ for our users when Firefox 23 comes out.
+ * [Internet Archive] Moved to stable
+ * [Linaro] Default off per webmaster request
+ * [Applicom] Default off per webmaster request
+
+chrome-2013.7.10
+ * In Chrome version, fixed css, "What is this?" link in popup, and added
+ favicons to popup (thanks to Jay Weisskopf)
+ * Includes all fixes from 3.2.4
+
+3.2.4 (2013-07-10)
+ * [Yandex] remove maps from exclusions
+ * [Amazon Web Services] Add exclusion
+ https://trac.torproject.org/projects/tor/ticket/8907
+ * [Hotmail / Live] Add exclusion
+ https://trac.torproject.org/projects/tor/ticket/9026
+ * [Mozilla] Point labs to mozillalabs.org
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2013-July/001636.html
+ * [Yandex] Exclude ll
+ * [Brightcove] Add exclusion
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2013-May/001587.html
+ * [NYTimes] Add exclusion, disabled
+ * [News Corporation] Exclude 2013 images
+ https://trac.torproject.org/projects/tor/ticket/9040
+ * [imgbox] Fix typo
+ https://trac.torproject.org/projects/tor/ticket/8690
+
+3.2.3 (2013-06-28)
+ * https://trac.torproject.org/projects/tor/query?group=status&milestone=HTTPS-E+3.2.3
+
+chrome-2012.6.4
+ * The "factors of 12" chromium beta
+ * Various ruleset fixes:
+ https://eff.org/r.5bSj
+ https://trac.torproject.org/projects/tor/ticket/8584
+ https://trac.torproject.org/projects/tor/ticket/8571
+ * Disable Myspace by default due to mixed content
+
+4.0development.8 (2013-06-04)
+ * Fix broken ruleset dialog in Firefox 22+
+ https://trac.torproject.org/projects/tor/ticket/8997
+ * The toolbar button chnages to indicate active rulesets:
+ https://trac.torproject.org/projects/tor/ticket/4886
+ * Ship 31 new rulesets
+ * New translations: Japanese and Sinhala
+ * Updated translations: Hungarian, Lithuanian, Slovenian
+ * Ruleset fixes from 3.2.2:
+ https://eff.org/r.5bSj
+ * Observatory cert whitelist update
+
+3.2.2 (2013-05-22)
+ * Quick turn-around release to unbreak support.apple.com
+ * Fixes for a number of other ruleset bugs:
+ https://eff.org/r.5bSj
+ * Incremental observatory cert whitelist update
+
+3.2.1 (2013-05-17)
+ * Implement XHR outstanding request limits to work around TCP connection
+ exhaustion if the SSL Observatory server is slow or down:
+ https://trac.torproject.org/projects/tor/ticket/8670
+ https://bugzilla.mozilla.org/show_bug.cgi?id=856748
+ * Overdue update to the Observatory cert whitelist
+ * Other known ruleset fixes: EA, Yandex, Apple
+ https://trac.torproject.org/projects/tor/ticket/8584
+ https://trac.torproject.org/projects/tor/ticket/8571
+
+4.0development.7 (2013-05-17)
+ * Implement XHR outstanding request limits to work around TCP connection
+ exhaustion if the SSL Observatory server is slow or down:
+ https://trac.torproject.org/projects/tor/ticket/8670
+ https://bugzilla.mozilla.org/show_bug.cgi?id=856748
+ * Add a note hinting users how to toggle rulesets (thanks to Pavel Kazakov)
+ https://trac.torproject.org/projects/tor/ticket/4967
+ * Ship all fixes from 3.2:
+ https://eff.org/r.b9Qc
+ * Other known ruleset fixes: EA, Yandex
+ https://trac.torproject.org/projects/tor/ticket/8571
+ * Ship 1308 new rulesets!
+ * Numerous new and updated translations
+
+chrome-2012.4.30
+ * The "May day somewhere" chromium beta
+ * Ship all ruleset bugfixes from the Firefox 3.2 release:
+ https://eff.org/r.b9Qc
+ * Flag/disable mixed content rulesets: Apple Support, BBC, Dell support,
+ FBI, Wordpress, Zend
+ https://eff.org/r.1bQt
+ * Disable VistaX64
+ https://trac.torproject.org/projects/tor/ticket/8801
+
+3.2 (2013-04-25)
+ * Related trac bugs for this release:
+ https://eff.org/r.b9Qc
+ * New: MoinMoin
+ * Fixes: Adobe, Bahn.de, Cloudfront, Dell, Droplr, FBI, Google Maps,
+ Joomla, Juno Download, Lenovo, New York Times, SEC, Soundcloud,
+ Tweakers.net, Univ Strasbourg, Vkontakte, Zend
+ * Disable broken: AirAsia, Netvibes, Newgrounds, Pirate Bay, Russia Today, SVT,
+ Wolfram Alpha
+ * Maybe fixed: Quantcast/Tumblr:
+ https://trac.torproject.org/projects/tor/ticket/8406 (maybe fixed)
+ * Sync languages and translations from the master branch.
+ * New languages: Finnish, Norwegian (Bokmål), Slovak, Bulgarian.
+ * All HTTPS Everywhere users will be now prompted about using the
+ SSL Observatory.
+
+chrome-2012.3.7
+ * The "cookies uncrumbled" chromium beta
+ * Ship all ruleset bugfixes from Firefox 3.1.4
+ * Stop securing HTTP (non-S) cookies in weird cases!!!
+ https://trac.torproject.org/projects/tor/ticket/7492
+
+4.0development.6 (2013-03-07)
+ * Disabled 26 broken or problematic rulesets
+ * Ship all ruleset fixes from 3.1.4
+ * Ship 232 new rulesets
+ * Numerous ruleset fixes
+ * Update cert whitelist
+
+3.1.4 (2013-03-07)
+ * The circles are stable releasee
+ * Fixes:
+ AmazonAWS/Atomsforpeace.info, Disqus, Eventbrite, ImageShack.us, MySQL,
+ NuGet, NYTimes, Ooyala, Opera, Scientific American, SourceForge,
+ University of Southampton, UserVoice, WebType, Zendesk
+ https://trac.torproject.org/projects/tor/ticket/8056
+ https://trac.torproject.org/projects/tor/ticket/8349
+ https://trac.torproject.org/projects/tor/ticket/7690
+ https://trac.torproject.org/projects/tor/ticket/8025
+ https://trac.torproject.org/projects/tor/ticket/8077
+ https://trac.torproject.org/projects/tor/ticket/8199
+ https://trac.torproject.org/projects/tor/ticket/8198
+ * Disable broken:
+ American Public Media (for real this time), Asymmetric Publications,
+ Salsa Labs, Vimeo
+ https://trac.torproject.org/projects/tor/ticket/7650
+ https://trac.torproject.org/projects/tor/ticket/8280
+ https://trac.torproject.org/projects/tor/ticket/7569
+ * Update cert whitelist
+
+chrome-2013.1.18
+ * "Internet Freedom" chromium beta
+ * Import all ruleset fixes from Firefox 3.1.3
+
+4.0development.5 (2013-1-18)
+ * Internet Freedom Day development release
+ * Fix the implementation of safeToSecureCookie
+ - Get https://trac.torproject.org/projects/tor/ticket/7491 right(er)
+ - Fix https://trac.torproject.org/projects/tor/ticket/7855
+ * Fix a ruleset processing bug, which would prevent <target host="*.z.com">
+ from matching x.y.z.com
+ * Ship all ruleset fixes from 3.1.2 and 3.1.3
+ - Except Etsy, where we're trying to fix rather than disable the ruleset
+ https://trac.torproject.org/projects/tor/ticket/7774
+ * Ship 354 new rulesets
+ * Update cert whitelist
+ * Update translations: Korean, Polish, French
+
+3.1.3 (2013-1-18)
+ * Internet Freedom Day stable bugfix release
+ * Fixes: CloudFront/Spotify, AmazonAWS (Amazon MP3s and product images), Libav,
+ Google Maps, UserEcho
+ https://trac.torproject.org/projects/tor/ticket/7931
+ https://trac.torproject.org/projects/tor/ticket/7888
+ https://trac.torproject.org/projects/tor/ticket/7594
+ https://trac.torproject.org/projects/tor/ticket/7539
+ https://trac.torproject.org/projects/tor/ticket/7698
+ * Disable broken: Coursera, EBay, Etsy, OpenOffice, Ping.fm, Pinterest :(
+ https://trac.torproject.org/projects/tor/ticket/7336
+ https://trac.torproject.org/projects/tor/ticket/7825
+ https://trac.torproject.org/projects/tor/ticket/7774
+ https://trac.torproject.org/projects/tor/ticket/7695
+ https://trac.torproject.org/projects/tor/ticket/7777
+ https://trac.torproject.org/projects/tor/ticket/7865
+ * Update cert whitelist
+
+3.1.2 (2013-1-2)
+ * Release 3.1.2, since 3.1.1 was accidentally mis-tagged
+ * Fixes for: AmazonAWS/Datawrapper, Cachefly, Cloudfront/C-SPAN, Hetzner.de
+ KeyDrive/Snapnames, QT, openDesktop, OpenTTD, WhiskeyMedia
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-December/001432.html
+ https://trac.torproject.org/projects/tor/ticket/7608
+ https://trac.torproject.org/projects/tor/ticket/7567
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-December/001432.html
+ https://trac.torproject.org/projects/tor/ticket/7560
+ https://trac.torproject.org/projects/tor/ticket/7796
+ * Disable broken: FlossManuals, Pastebin, Poste.it, Ustream, TED, AusGamers
+ https://trac.torproject.org/projects/tor/ticket/7731
+ https://trac.torproject.org/projects/tor/ticket/7850
+ https://trac.torproject.org/projects/tor/ticket/7840
+ https://trac.torproject.org/projects/tor/ticket/7548
+ * Increase Observatory deployment (65%->85%)
+ * Update cert whitelist
+
+chrome-2012.12.17
+ * The "overdue bugfixes" chromium beta
+ * Ship all ruleset bugfixes from Firefox 3.1 and 3.0.4
+ * Additional fixes for: AmazonAWS/Datawrapper, Cachefly, Cloudfront/C-SPAN,
+ Hetzner.de, KeyDrive/Snapnames, QT
+ * Additionally disable: Automattic
+
+4.0development.4 (2012-12-17)
+ * Fix nasty bug that prevented Firefox downloads from Mozilla's CDN
+ https://trac.torproject.org/projects/tor/ticket/7717
+ * Fix download from qt-project.org
+ * Ship 72 new rulesets
+ * Include all rulset fixes from 3.1
+
+3.1 (2012-12-12)
+ * Hacky solution to a very nasty bug in which <securecookie> directives
+ would cause cookies to be flagged as secure even if they were set from
+ HTTP origins!
+ https://trac.torproject.org/projects/tor/ticket/7491
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-November/001397.html
+ * Fixes: Akamai, Biomed central, BYU, Cachefly / Topix, DuckDuckGo, Focus.de,
+ Fortum, Mashable, Mail.ru, MayFirst/People Link, MIT, Rackspace,
+ Salsa Labs, SurveyMonkey, Tumblr
+ * Disable: Adtech.de, AllthingsD American Public Media, Dafont, MediaFire,
+ Verizon, vk.com, Wired, Conde Nast
+ * Observatory-only translations into Hebrew and Croatian
+ * Offer the SSL Observatory popup to a larger cohort of users
+
+4.0development.3 (2012-12-3)
+ * Hacky solution to a very nasty bug in which <securecookie> directives
+ would cause cookies to be flagged as secure even if they were set from
+ HTTP origins!
+ https://trac.torproject.org/projects/tor/ticket/7491
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-November/001397.html
+ * Ship 245 new rulesets
+ * Fixes include: Internet Archive, Rackspace
+ * Disable broken: American Public Media, Verizon, Nieuwsblad.be, MyOpenID
+ * (Plus fixes and rulesets disabled between 4.0dev2 and 3.0.4)
+ * Observatory-only translations: Croatian, Hebrew
+
+3.0.4 (2012-11-9)
+ * Fixes:
+ ACLU, Amazon, Barnes & Noble, CharityNavigator, Cloudfront/Turntable.fm,
+ Coursera, itella.fi, posti.fi, Uservoice
+ https://trac.torproject.org/projects/tor/ticket/7336
+ https://trac.torproject.org/projects/tor/ticket/7273
+ https://trac.torproject.org/projects/tor/ticket/7227
+ * Disable broken:
+ Asterisk, Boston Globe (separated out from NYTimes.com), Extabit, Gawker,
+ Google Services (Followers widget), NPR, SF.se, SonyMusic, Statcounter, WebType
+ https://trac.torproject.org/projects/tor/ticket/7270
+ https://trac.torproject.org/projects/tor/ticket/7243
+ https://trac.torproject.org/projects/tor/ticket/7361
+ https://trac.torproject.org/projects/tor/ticket/7120
+ https://trac.torproject.org/projects/tor/ticket/7278
+ https://trac.torproject.org/projects/tor/ticket/7363
+ https://trac.torproject.org/projects/tor/ticket/7294
+ * No longer cacert: lawblog.de
+ * Offer the SSL Observatory popup to a larger cohort of users
+ * Update translations: Spanish, Russian, Turkish, Swedish
+
+chrome-2012.10.31
+ * The "ghosts and goblins" chromium alpha
+ * Work around a nasty bug that was affecting some high-volume Live Youtube streams
+ (but not other live YouTube streams)
+ https://trac.torproject.org/projects/tor/ticket/7127
+ * Other Fixes:
+ AdaCore, Akamai/MTV3 Katsomo, Akamai/HP, Atlassian, Bahn.de, MySQL, NPR, PBS,
+ Phronoix Media/Openbenchmarking, SSRN, Spoki
+ https://trac.torproject.org/projects/tor/ticket/7219
+ https://trac.torproject.org/projects/tor/ticket/7180
+ https://trac.torproject.org/projects/tor/ticket/7135
+ https://trac.torproject.org/projects/tor/ticket/7206
+ https://trac.torproject.org/projects/tor/ticket/7198
+ * Disable broken/buggy:
+ CBS/Last.fm, Citibank Australia, Bytename, HP, NIFTY, Microchip, MyOpenID, NttDocomo
+ https://trac.torproject.org/projects/tor/ticket/6587
+ https://trac.torproject.org/projects/tor/ticket/7226
+ https://trac.torproject.org/projects/tor/ticket/7111
+ https://trac.torproject.org/projects/tor/ticket/7161
+ https://trac.torproject.org/projects/tor/ticket/7114
+ https://trac.torproject.org/projects/tor/ticket/7138
+ https://trac.torproject.org/projects/tor/ticket/7107
+
+3.0.3 (2012-10-29)
+ * Work around a nasty bug that was affecting some high-volume Live Youtube streams
+ (but not other live YouTube streams)
+ https://trac.torproject.org/projects/tor/ticket/7127
+ * Other Fixes:
+ AdaCore, Akamai/MTV3 Katsomo, Akamai/HP, Atlassian, Bahn.de, DemocracyNow, MySQL, NuGet,
+ PBS, Phronoix Media/Openbenchmarking, SSRN, Spoki
+ https://trac.torproject.org/projects/tor/ticket/7219
+ https://trac.torproject.org/projects/tor/ticket/7180
+ https://trac.torproject.org/projects/tor/ticket/7135
+ https://trac.torproject.org/projects/tor/ticket/7206
+ https://trac.torproject.org/projects/tor/ticket/7198
+ * Disable broken/buggy:
+ CBS/Last.fm, Citibank Australia, Bytename, HP, NIFTY, Microchip, MyOpenID, NttDocomo
+ https://trac.torproject.org/projects/tor/ticket/6587
+ https://trac.torproject.org/projects/tor/ticket/7226
+ https://trac.torproject.org/projects/tor/ticket/7111
+ https://trac.torproject.org/projects/tor/ticket/7161
+ https://trac.torproject.org/projects/tor/ticket/7114
+ https://trac.torproject.org/projects/tor/ticket/7138
+ https://trac.torproject.org/projects/tor/ticket/7107
+ * Updated translations:
+ Greek, Russian, Latvian
+ * New translation:
+ Turkish
+ * Offer the SSL Observatory popup to a larger cohort of users
+
+4.0development.2 (2012-10-25)
+ * Ship 67 new rulesets
+ * Fix broken logouts from non-US Google accounts:
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-October/001347.html
+ * Other fixes:
+ Microsoft (Bing login button), ZeniMax, Ubuntuone, TrueCrypt, Springer,
+ Optical Society, IMDB, Facebook, EzineArticles, Broadband Reports, Apache,
+ Akamai (exclude Zynga content to prevent breakage of some Zynga games),
+ Costco, Atlassian, Akamai/MTV3 Katsomo
+ * Disable broken/buggy:
+ HP, Bytename, NIFTY, Microchip, NttDocomo
+ * Updated translations:
+ Greek, Russian, Latvian
+ * New translation:
+ Turkish
+
+chrome-2012.10.18
+ * The "even more perfect" chromium alpha
+ * Fixes from the last two Firefox releases:
+ Microsoft (Bing login button), ZeniMax, Ubuntuone, TrueCrypt, Springer,
+ Optical Society, IMDB, Facebook, EzineArticles, Broadband Reports, Apache,
+ Akamai (exclude Zynga content to prevent breakage of some Zynga games),
+ Costco Akamai/SVTplay.se, Bahn.de, European Southern Observatory, IEEE,
+ Indeed, Java, Librivox, Pinterest, New York Times, Springer, Vimeo,
+ Shannon Health, O'Reilly Media
+ * Also fix: DemocracyNow, NuGet
+ * Disable: NIFTY
+
+3.0.2 (2012-10-16)
+ * Some fixes that should have shipped in 3.0.1, but actually didn't:
+ European Southern Observatory, Indeed, LibriVox
+ * New fixes:
+ Microsoft (Bing login button), ZeniMax, Ubuntuone, TrueCrypt, Springer
+ (fix / reenable), Optical Society, IMDB, Facebook, EzineArticles,
+ Broadband Reports, Apache, Akamai (exclude Zynga content to prevent
+ breakage of some Zynga games), Costco
+
+4.0development.1 (2012-10-11)
+ * Merge the 4.0 branch, which ships 884 new rulesets and expands
+ hundreds of others
+
+3.0.1 and 4.0development.1:
+ * Fixes: adition.com, Akamai/SVTplay.se, Bahn.de, European Southern Observatory,
+ IEEE, Indeed, Java, Librivox, Pinterest, New York Times, Springer, Vimeo,
+ Shannon Health, O'Reilly Media
+ https://trac.torproject.org/projects/tor/ticket/7080
+ https://mail1.eff.org/pipermail/https-everywhere/2012-October/001583.html
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-October/001339.html
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-October/001343.html
+ * Disable broken: Springer
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-October/001340.html
+ * Updated translations: Basque, Hungarian, Traditional Chinese
+
+chrome-2012.10.9
+ * The "prepare for liftoff" chromium alpha
+ * Add an experimental Spanish translation!
+ * Fixes:
+ Akamai/CNN, GO.com/ABC, AWS/Amazon Zeitgeist MP3 player, AWS/Spiegel.tv,
+ Technology Review, Cloudfront/Tunein, Akamai/Discovery Channel, Beyond
+ Security, OCaml, Gentoo, Nokia, Widgetbox.com, Squarespace, 1and1
+ Internet, American Physical Society, Baker and Taylor, Barnes and Noble,
+ Cloudfront, Trustguard, IEEE, Mozilla, Nrelate, OpenDNS, RFC Editor,
+ Symantec, Valve, Zenimax-Media
+ * Disable buggy: Web.de, AJC.com, Feross, Bestofmedia, Grooveshark, Gearhog
+
+3.0 (2012-10-04)
+ * Since version 2.x:
+ * 1,455 new active rulesets
+ * UI improvements:
+ - right-click to view ruleset source in the config window
+ - translate some untranslated menus
+ - better icons in a few places (breaking/redirecting rules,
+ context button)
+ * Numerous improvements to the SSL Observatory internals, including cached
+ submissions on hostile networks, better Tor and Convergence integration,
+ and a new setting to control self-signed cert submission
+ * New translations: Basque, Czech, Danish, French, Greek, Hungarian,
+ Italian, Korean, Malaysian, Polish, Slovak, Turkish,
+ Traditional Chinese
+ * Relative to 3.0development.8:
+ * Only promote the Decentralized SSL Observatory to 5% of non-Tor users
+ * Update the SSL Observatory whitelist of common cert chains
+ * Fixes, mostly in the CDN/media playback department:
+ Akamai/CNN, GO.com/ABC, AWS/Amazon Zeitgeist MP3 player,
+ AWS/Spiegel.tv, Technology Review, Cloudfront/Tunein,
+ Akamai/Discovery Channel, Beyond Security, OCaml, Gentoo,
+ Nokia, Widgetbox.com, Squarespace
+ https://trac.torproject.org/projects/tor/ticket/4199
+ https://trac.torproject.org/projects/tor/ticket/6871
+ https://trac.torproject.org/projects/tor/ticket/6992
+ https://trac.torproject.org/projects/tor/ticket/7000
+ https://trac.torproject.org/projects/tor/ticket/7020
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-October/001324.html
+ * Disable buggy: Web.de, AJC.com, Feross, Bestofmedia
+ * Remove a lot of off-by-default rulesets from the code, since they have
+ some costs in terms of startup speed and RAM usage
+
+3.0development.8 (2012-10-03)
+ * 3.0 stable release candidate 1
+ * Fixes: AOL, 1and1 Internet, American Physical Society, Antispam.de, BBC,
+ Baker and Taylor, Barnes and Noble, BitTorrent, CacheFly,
+ CheezBurger, Cleverbridge, Cloudfront, Facebook, Trustguard,
+ IEEE, Link Plus Catalog, Microsoft, Mozilla, News Corp, Nrelate,
+ OpenDNS, PassThePopcorn, Pidgin, Piriform, RFC Editor, Symantec,
+ Telegraph, Transmission, Valve, Zenimax-Media,
+ kirjoitusalusta.fi, uTorrent
+ * Reenable: CodingTeam
+ * Disable broken: GrooveShark, Gearhog, Paper.li, Soton.ac.uk, SVT.se
+ * Various translation improvements
+ * Support a new platform="mixedcontent" attribute
+ * Switch to the actual HTTPS Everywhere logo for the context menu button
+
+
+chrome-2012.9.21
+ * Workaround for breakage in Amazon Look Inside the Book (via Cloudfront)
+ https://trac.torproject.org/projects/tor/ticket/6848
+ * Replace jsURI with URI.js, fixing a number of bugs in the Chrome port
+ - https://trac.torproject.org/projects/tor/ticket/6197
+ - Also breakage on other random pages like
+ http://venturebeat.com/2012/09/13/how-do-not-track-could-destroy-the-internet-as-you-know-it/
+ * Fixes: AOL, Antispam.de, BBC, BitTorrent, Facebook, Gearhog, LinkPlus
+ Catalog, Microsoft, Mother Jones, Mozilla, Office.co.uk, OpenDNS,
+ PassThePopcorn, Piriform, WhatCD, uTorrent
+ * Disable broken: Paper.li, SVT.se, Soton.ac.uk
+ * Reenable: Referly
+
+chrome-2012.9.10
+ * The "just add eleven" chromium alpha
+ * Time to test the updating mechanism from direct -> Chrome Web Store
+ installs
+ * Ruleset changes in addition to those in FF 3.0dev7:
+ * Fixes: News Corp, Cheezburger, CacheFly, Cleverbridge, Nrelate,
+ Pidgin, Telegraph
+ * Improvements: Global Marketing Strategies
+
+
+3.0development.7 (2012-09-07)
+ * Add a cleanup routine for profiles affected by a 2.2 defaults bug:
+ https://mail1.eff.org/pipermail/https-everywhere/2012-August/001511.html
+ * Make Decentralized SSL Observatory-Tor interactions saner in the wake of
+ Torbutton transitioning to "always on" (we now detect a local Tor instance
+ on port 9050 and use it)
+ https://trac.torproject.org/projects/tor/ticket/6541
+ * Fix some other bugs in the Observatory proxy-wrangling code
+ * Disable broken/buggy rulesets: Voxel, Mapquest, Imgur, Justin.tv,
+ F-Secure, Valve, SpringFiles, openDesktop, syllabushare, Playboy, FAZ
+ * Fixes / Improvements: Eloqua, OpenDNS, Mashable, News Corp, Sony, Yahoo!,
+ Examiner.com, FBI, Adtechus, Mozilla, Dreamhost, Lenovo / Thinkpad, Pirate
+ Party, Scribd
+ * New Czech translation
+
+3.0development.6 (2012-08-16)
+ * Prevent ruleset bugs from crashing the UI
+ https://trac.torproject.org/projects/tor/ticket/6280
+ * Fix a lack-of-translation bug in the context menu
+ https://trac.torproject.org/projects/tor/ticket/6516
+ (although coverage will probably be patchy for a while)
+ * Add hooks to use our new Firefox internal rewrite API, if the browser
+ has it (this should address
+ https://trac.torproject.org/projects/tor/ticket/5477
+ https://trac.torproject.org/projects/tor/ticket/3190
+ )
+ * Fixes: OpenStreetMap, Okcupid, Yandex, Valve, Atlantic Media, AWS,
+ XDA developers, Tumblr, MetaPress, Mixpanel, VideoLAN, JBoss,
+ Yourhosting, Pypi, QT, Imgur, Scientific American,
+ Chronicle, ISOC, Wikimedia, Xmission, Tumblr, OpenDNS
+ Mobygames, Telegraph Media, Dailymotion, RFC-editor, US gov,
+ Discogs, Costco, Brightcove, PirateParty, BrownPaperTickets
+ * Improvements: Apple, MIT
+ * Disable buggy/broken: ZDNet, Globe and Mail, Malwarebytes, Plenty of Fish,
+ Raymond.CC, Blip.tv, Governo Portugês, adf.ly,
+ McAfee :( :( :(
+ * New translations: Italian, Turkish, Traditional Chinese, Korean
+ * Numerous updated translations
+
+chrome-2012.8.16
+ * The "exponential bifurcation" alpha
+ * Change the update URI to the specific one blessed by the Chrome Web Store
+ (they tell us that, despite appearances, the request will actually be
+ https)
+
+chrome-2012.8.15
+
+ * The "Happiness in the Cloud" Alpha
+ * We still suffer from the horrible Appcache bug, so this is still an alpha:
+ https://trac.torproject.org/projects/tor/ticket/5585
+ https://code.google.com/p/chromium/issues/detail?id=121325
+ * Enslave ourselves to the Chrome Web Store, because Google has made it
+ very tricky to install .crx files in Chrome version 21
+ https://code.google.com/p/chromium/issues/detail?id=133818
+ https://code.google.com/p/chromium/issues/detail?id=128748
+ * Do a better job of displaying the context menu, especially for error pages:
+ https://trac.torproject.org/projects/tor/ticket/6085
+ (should be fixed for real this time)
+ * Fancier Chrome context menus by Jay Weisskopf
+ * Fixes: OpenStreetMap, Okcupid, Yandex, Valve, Atlantic Media, AWS,
+ XDA developers, Tumblr, MetaPress, Mixpanel, VideoLAN, JBoss,
+ Yourhosting, Pypi, QT, Imgur, Scientific American,
+ Chronicle, ISOC, Wikimedia, Xmission, Tumblr, OpenDNS
+ Mobygames, Telegraph Media, Dailymotion, RFC-editor, US gov,
+ Discogs, Costco, Brightcove, PirateParty, BrownPaperTickets,
+ * Improvements: Apple, MIT
+ * Disable buggy/broken: ZDNet, Globe and Mail, Malwarebytes, Plenty of Fish,
+ Raymond.CC, Blip.tv, Governo Portugês, adf.ly
+ McAfee :( :( :(
+
+3.0development.5 (2012-06-26)
+ * Fix the enable/disable button in Firefox 15
+ https://trac.torproject.org/projects/tor/ticket/6212
+ * Fixes: GetFirebug, Gentoo, Ebay, Yandex (extensive), Maxmind, Blogger, HP,
+ Jottit
+ * Disable broken: Project Syndicate, Alton Towers, Network for Good
+ https://trac.torproject.org/projects/tor/ticket/6222
+ * The Decentralized SSL Observatory client now saves up some certificates if
+ the network blocks or MITMs attempts to submit them.
+
+chrome-2012.6.21
+ * The Autonomous Greenland Beta Release
+ * Allow rulesets to be toggled when the page breaks completely
+ https://trac.torproject.org/projects/tor/ticket/6085
+ * Fixes: Github, Gentoo, HP, Maxmind, Orange
+ * Disable broken: Alton Towers, Project Syndicate
+ * Only ship 1 new ruleset (we're in a freeze)
+
+3.0development.4 (2012-06-18)
+ * Fix compatibility bug with Firefox 15:
+ https://trac.torproject.org/projects/tor/ticket/5893
+ * Ship 217 new rulesets (frozen; new rulesets now have to wait until 4.0
+ development)
+ * Fixes: numerous, including: Boxee, CiteULike, MozillaMessaging,
+ Yandex, Demonoid, Pirate Party, Gentoo, NYTimes, Microsoft,
+ Wikipedia, Lenovo, MyWOT
+ https://trac.torproject.org/projects/tor/ticket/5912
+ https://trac.torproject.org/projects/tor/ticket/6091
+ https://trac.torproject.org/projects/tor/ticket/5703
+ https://trac.torproject.org/projects/tor/ticket/5931
+ https://trac.torproject.org/projects/tor/ticket/5958
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-June/001189.html
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-June/001190.html
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-May/001186.html
+ https://mail1.eff.org/pipermail/https-everywhere/2012-May/001433.html
+ * Disable broken: MarketWatch, Disqus, Magento, Lavasoft,
+ Typepad/Say Media, Thomas Cook, Thomson Reuters clients,
+ Science Daily, BinRev, Ikea, Interpol
+ https://trac.torproject.org/projects/tor/ticket/5899
+ https://trac.torproject.org/projects/tor/ticket/5496
+
+chrome-2012.6.18
+ * The Divisible By Six Chromium Beta Release
+ * Ship 444 new Rulesets
+ * Fixes: numerous, including: Boxee, omgubuntu, Microsoft
+ https://trac.torproject.org/projects/tor/ticket/5899
+ https://trac.torproject.org/projects/tor/ticket/5703
+ https://trac.torproject.org/projects/tor/ticket/5931
+ https://trac.torproject.org/projects/tor/ticket/5958
+ * Disable broken: Disqus, uTorrent, Thomas Cook, Thomson Reuters clients,
+ Science Daily, Say Media, BinRev, Ikea, Interpol
+ * Not fixed:
+ The horrible appcache / CSS bug:
+ https://trac.torproject.org/projects/tor/ticket/5585
+ Occasional extension compatibility glitches:
+ https://trac.torproject.org/projects/tor/ticket/5731
+
+3.0development.3 (2012-05-11)
+ * Ship 361 new rulesets
+ * Do a better job of disabling CACert rulesets by default on non-CAcert
+ platforms
+ * Fix for compatibility with some other Firefox extensions:
+ https://trac.torproject.org/projects/tor/ticket/5682
+ * Fixes: Wordpress stylesheets, USENIX, Mozilla, Opera, Valve, and many
+ others
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-April/001105.html
+ https://trac.torproject.org/projects/tor/ticket/5831
+ * Disable broken: Pandora, Miranda IM, Pastebin.ca
+ https://trac.torproject.org/projects/tor/ticket/5804
+ https://trac.torproject.org/projects/tor/ticket/5776
+ * Testing our new more automated release process
+
+chrome-2012.5.1
+ * The May Day Chromium Beta Release
+ * Ship 886 new rulesets (thanks mostly to Negres!)
+ * Fix two downgrade attacks that might allow attackers to deny HTTPS
+ Everywhere protection for cookies on some domains.
+ https://trac.torproject.org/projects/tor/ticket/5676
+ https://trac.torproject.org/projects/tor/ticket/2199
+ * More efficient ruleset storage shrinks the .crx download by a factor of
+ about 4 (thanks fauxfaux)
+ https://trac.torproject.org/projects/tor/ticket/5275
+ * Disable buggy rulesets: IBM, Scribd, Wunderground, ReadWriteWeb,
+ Pastebin.ca
+ https://trac.torproject.org/projects/tor/ticket/5344
+ https://trac.torproject.org/projects/tor/ticket/5435
+ https://trac.torproject.org/projects/tor/ticket/5630
+ * Ruleset fixes: Debian, Kohls, Malwarebytes, Yandex, Wikipedia, Mises.org,
+ OpenDNS, Wizards of the Coast, Lenovo, Barnes and Noble,
+ Pastebin.ca
+ https://trac.torproject.org/projects/tor/ticket/5509
+ https://trac.torproject.org/projects/tor/ticket/5491
+ https://trac.torproject.org/projects/tor/ticket/5303
+ * Numerous other improvements, fixes, and exciting new bugs :)
+
+
+3.0development.2 (2012-04-26)
+ * License change: the tree now includes some code from Convergence, which
+ is GPL v3+. Other code remains licensable as GPLv2+
+ * Ship 696 new rulesets (!!!), thanks to a lot of amazing work by Negres
+ * Fix a downgrade attack that might allow attackers to deny HTTPS
+ Everywhere protection for cookies on some domains.
+ https://trac.torproject.org/projects/tor/ticket/5676
+ * Fix a weird wrong DOM-origin bug that occurred while redirects were in
+ progress (this might have security implications, although we are unsure
+ if it was exploitable).
+ https://trac.torproject.org/projects/tor/ticket/5477
+ * Ruleset fixes: Debian, Kohls, Malwarebytes, Yandex, Wikipedia, Mises.org,
+ OpenDNS, Wizards of the Coast, Lenovo, Barnes and Noble
+ https://trac.torproject.org/projects/tor/ticket/5509
+ https://trac.torproject.org/projects/tor/ticket/5491
+ https://trac.torproject.org/projects/tor/ticket/5303
+ * Stumble across more horrible security holes in the Verizon website:
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-February/001003.html
+ * Disable the Gentoo ruleset on non-CAcert platforms
+ * Disable buggy rulesets: IBM, Scribd, Wunderground, ReadWriteWeb :( :( :(
+ https://trac.torproject.org/projects/tor/ticket/5344
+ https://trac.torproject.org/projects/tor/ticket/5435
+ https://trac.torproject.org/projects/tor/ticket/5630
+ * Better cohabitation between the Decentralized SSL Observatory and
+ Convergence
+ * Separate Observatory option to control self-signed cert submission
+ * Numerous other ruleset enhancements, fixes, and probably exciting new bugs
+ in Negres's ruleset changes
+
+3.0development.1 (2012-03-14)
+ * By default, use https://google.co.cctld instead of
+ encrypted.google.com
+ https://trac.torproject.org/projects/tor/ticket/5152
+ * Add an optional ruleset to use https://www.google.com
+ instead of encrypted.google.com, too
+ * Add a new context menu in the rulesets list:
+ - toggle a ruleset
+ - reset it to the default
+ https://trac.torproject.org/projects/tor/ticket/3762
+ - view the ruleset source
+ https://trac.torproject.org/projects/tor/ticket/5237
+ * Show the Observatory popup to all users once, not just TorButton users
+ * Four new translations: Basque, French, Polish, Slovak
+ * Ship 125 new rulesets
+
+chrome-2012.3.14
+ * Ship 109 new rulesets since the last Chromium release
+ * Add an optional ruleset to search on https://www.google.com
+ instead of encrypted.google.com
+ * Switch non-US google searches to country sites by default
+ * Better chrome context UI
+
+2.2.3 (2012-09-25)
+ * Workaround for breakage in Amazon Look Inside the Book (via Cloudfront)
+ https://trac.torproject.org/projects/tor/ticket/6848
+ * Fix logout for AOL users
+ * Other fixes: PassThePopcorn, WhatCD, Antispam.de, RFCeditor,
+ Weatherspark / GoogleMaps
+ * Disable broken: SVT.se
+
+2.2.1 (2012-08-17)
+ * Fix a configuration-parsing bug in 2.2 that would
+ ignore default_off rules if this was a first install
+ https://mail1.eff.org/pipermail/https-everywhere/2012-August/001511.html
+ * Add a cleanup routine for profiles affected by that bug.
+
+2.2 (2012-08-15)
+ * Prevent ruleset bugs from crashing the UI
+ https://trac.torproject.org/projects/tor/ticket/6280
+ * Fix the enable/disable button in Firefox 14
+ https://trac.torproject.org/projects/tor/ticket/6212
+ * Fix a nasty bug in the optional "Search www.google.com" ruleset:
+ https://gitweb.torproject.org/https-everywhere.git/commitdiff/50ca41a1e189ef8383781f803e51ec7a06688a3b
+ * Disable buggy/broken: ZDNet, Globe and Mail, Blip.tv, Governo Portugês,
+ Alton Towers, McAfee :( :( :(
+ * Fixes: Yandex, Wikipedia, PirateParty, JBoss, Gentoo
+ * Hopefully the last 2.x release before 3.0 stable
+
+2.1 (2012-06-18)
+ * Fix context menu breakage when URIs lack a host
+ * Fixes: CiteULike, MozillaMessaging, Yandex, Demonoid, Pirate Party,
+ Gentoo, NYTimes, Microsoft, Wikipedia, Lenovo
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-June/001189.html
+ https://trac.torproject.org/projects/tor/ticket/6091
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-June/001190.html
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-May/001186.html
+ https://mail1.eff.org/pipermail/https-everywhere/2012-May/001433.html
+ * Disable broken: MarketWatch, Disqus, Magento, Lavasoft, Project Syndicate,
+ Typepad/Say Media
+ https://trac.torproject.org/projects/tor/ticket/5899
+ https://trac.torproject.org/projects/tor/ticket/5496
+
+2.0.5 (2012-05-16)
+ * Rebuild 2.0.4 without a bug in the release scripts that prevented all the
+ rulesets from being absent
+
+2.0.4 (2012-05-16)
+ * Fix for compatibility with some other Firefox extensions:
+ https://trac.torproject.org/projects/tor/ticket/5682
+ * Fixes: Wordpress stylesheets, USENIX, Mozilla, Opera, Indymedia
+ https://trac.torproject.org/projects/tor/ticket/5905
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-April/001105.html
+ * Disable broken: Pandora, Miranda IM, Pastebin.ca, PaidContent
+ https://trac.torproject.org/projects/tor/ticket/5804
+ https://trac.torproject.org/projects/tor/ticket/5776
+
+
+2.0.3 (2012-04-26)
+
+ * Fix a downgrade attack that might allow attackers to deny HTTPS
+ Everywhere protection for cookies on some domains.
+ https://trac.torproject.org/projects/tor/ticket/5676
+ * Minor redirection mechanism fixes
+ * Fixes: WordPress, Yandex, OpenDNS, Via.me/AWS
+ * Improvements: Mozilla
+ * Disable broken: ReadWriteWeb
+
+2.0.2 (2012-04-19)
+
+ * Fix a weird wrong DOM-origin bug that occurred while redirects were in
+ progress (this might have security implications, although we are unsure
+ if it was exploitable).
+ https://trac.torproject.org/projects/tor/ticket/5477
+ * By default, use https://google.co.cctld instead of
+ encrypted.google.com
+ https://trac.torproject.org/projects/tor/ticket/5152
+ * Add an optional ruleset to use https://www.google.com
+ instead of encrypted.google.com, too
+ * Ruleset fixes: Debian, Kohls, Malwarebytes, Yandex, Wikipedia, Mises.org,
+ OpenDNS, Wizards of the Coast, Lenovo, Barnes and Noble
+ https://trac.torproject.org/projects/tor/ticket/5509
+ https://trac.torproject.org/projects/tor/ticket/5491
+ https://trac.torproject.org/projects/tor/ticket/5303
+ * Stumble across more horrible security holes in the Verizon website:
+ https://mail1.eff.org/pipermail/https-everywhere-rules/2012-February/001003.html
+ * Disable the Gentoo ruleset on non-CAcert platforms
+ * Disable buggy rulesets: IBM, Scribd, Wunderground :( :( :(
+ https://trac.torproject.org/projects/tor/ticket/5344
+ https://trac.torproject.org/projects/tor/ticket/5435
+ https://trac.torproject.org/projects/tor/ticket/5630
+
+2.0.1 (2012-02-27)
+ * 2.0 is now Stable!
+ * Fix tiny settings window on some versions of Windows:
+ https://trac.torproject.org/projects/tor/ticket/5197
+ * Fix drop down menu bug for the non-English versions of the UI
+ * Added Farsi and Arabic translations
+ * Disable Netflix, which was demonstrating a lot of breakage
+ * Improvements: Wikipedia
+ * Fixes: Google, Samba
+ * Ship 4 new rulesets since 2.0development.6
+ (404 new rulesets since 1.2.2!)
+ * Check ruleset grammaticity with xmllint/RelaxNG
+
+chrome-2012.2.27
+ * Split Google Translate out of the Google APIs rule, and turn it off by
+ default on Chrome only:
+ Fixes https://trac.torproject.org/projects/tor/ticket/5196
+ * Ship 19 new rulesets since last Chromium release
+
+chrome-2012.2.9
+ * make <exclusion pattern> rulesets elements work in the Chrome version
+ https://trac.torproject.org/projects/tor/ticket/5042
+ (also disable the LinkedIn ruleset)
+ * Support for Google Sorry
+ * 6 new rulesets
+
+2.0development.6 (2012-02-08)
+ * Fix a nasty UI crash bug on Windows
+ https://trac.torproject.org/projects/tor/ticket/5020
+ * Ruleset fixes: Google Video, Yandex, LDS
+ https://trac.torproject.org/projects/tor/ticket/5026
+ https://trac.torproject.org/projects/tor/ticket/5042
+ * Disable problematic LinkedIn ruleset
+ * An experimental ruleset for the Google "Sorry" page
+ * Improved Nederlands translation
+ * Ship 6 new rulesets
+
+chrome-2012.02.06{,.01}
+ * First "Official" EFF alpha Chrome release
+ (Thanks to Mike Perry and Aaron Swartz for leading the porting effort!)
+ * Installable on Chrome|Chromium 18+
+ * Two point versions, to test the autoupdating mechanism
+
+2.0development.5 (2012-02-02)
+ * Fix some data structure inefficiencies that should reduce RAM consumption
+ by 25-75MB (!)
+ https://trac.torproject.org/projects/tor/ticket/4804
+ * Global enable / disable option
+ https://trac.torproject.org/projects/tor/ticket/4060
+ * Google Cache is back! :)
+ * Ship 126 new rulesets
+ * Fixes: Wikipedia, Identi.ca, Verizon, CCC.de, UserScripts, Yandex,
+ Hidemyass, Mozilla, Pogo, Google, Google Images, Google Video,
+ The Pirate Bay, AK Vorrat, JBoss
+ * Improvements: EFF, Flickr, RedHat, Diaspora, PrivatePaste, KDE,
+ Portugese Govt
+ * Disable broken: NSF.gov, WHO.int, Economist
+ * New experimental Yahoo! ruleset (off by default)
+ * New translations: Spanish, Nederlands
+
+2.0development.4 (2011-11-15)
+ * The translations actually work
+ * Add new translations: Chinese, Russian
+ * Ship 37 new rulesets
+ * Exclude Userscript paths as an insecure workaround for the Greasemonkey
+ and Scriptish instances of this bug:
+ https://trac.torproject.org/projects/tor/ticket/3190
+ * Fixes: Java.com, Yandex, Wordpress, Wikipedia, Bahn.de, UNSW, Apache,
+ DuckDuckGo, Google Images
+ * Improvements: Debian, Tumblr, Apple, Facebook, VeriSign, Google Services,
+ Flickr, Youtu.be
+ * Disable broken: Target, OpenUniversity, TV.com, Radio Shack,
+ Yahoo Mail :( :(,
+ Google Cache coverage in Google Services :( :( :(
+
+2.0development.3 (2011-10-19)
+ * Selectively reenable nsIContentPolicy::shouldLoad()
+ Fixes: https://trac.torproject.org/projects/tor/ticket/4194
+ Fixes: https://trac.torproject.org/projects/tor/ticket/4149
+ * Crazy experimental IOUtils hacks from NoScript
+ https://bugzilla.mozilla.org/show_bug.cgi?id=677643#c75
+ (Appears to fix
+ https://mail1.eff.org/pipermail/https-everywhere/2011-October/001208.html,
+ which is probably a general redirection bug)
+ * Secure cookies set by JavaScript as well as those set by HTTP
+ Fixes: https://trac.torproject.org/projects/tor/ticket/3766
+ * Perform initialisation synchronously, reducing races during startup
+ Fixes: https://trac.torproject.org/projects/tor/ticket/3533
+ * Ship 9 new rulesets
+ * Disable: MikeWest
+ * Improvements: YouTube, Google Images
+
+2.0development.2 (2011-10-05)
+ * Enable YouTube by default
+ (also closes https://trac.torproject.org/projects/tor/ticket/4032)
+ * Merge nsIContentPolicy disablement from stable
+ (closes https://trac.torproject.org/projects/tor/ticket/3882)
+ * Context menu should work on error pages
+ (https://trac.torproject.org/projects/tor/ticket/3815)
+ * Fix the ASN setting button in the observatory prefs
+ (https://trac.torproject.org/projects/tor/ticket/4170)
+ * Make the Observatory much more efficient
+ * Ship 46 new rulesets
+ * Update for new Wikipedia HTTPS deployment
+ * Ruleset Fixes and Enhancements: Yandex, Identica, SBB, Polldaddy, XKCD,
+ Statcounter, Caltech, UCSD, FlickR, Android
+ * Disable broken: LastPass, Avast, EPEAT, Bloglines
+ * Improve the state of our translations-in progress
+ * Fancy new Python build scripts
+
+2.0development.1 (2011-09-15)
+ * Begin alpha testing for the Decentralized SSL Observatory!
+ (currently opt-in, with a popup prompt if you have Tor Button installed)
+ * Ship 164 new rulesets
+ * Enable Google Maps by default
+ * Pending translations: Arabic, Dutch, German, Portugese, Latvian, Russian,
+ Swedish
+ * Fixes: OpenDNS, WordPress, Flickr
+ * Expansions & Improvements: Google Services, Twitter, Gowalla, Apple, Bit.ly
+ AdBlock Plus, KLM, Adobe, UCSD, Heroku, Wikipedia
+ * Disable broken rulesets: Deviantart, Bandcamp, Securityfocus
+ * Improved build scripts
+
+1.2.2 (2012-01-09)
+ * Google Cache is back!
+ * Fixes: Wikipedia, Identi.ca, Verizon, CCC.de, UserScripts,
+ Yandex
+ * Improvements: EFF
+ * Disable broken: NSF.gov, WHO.int
+
+1.2.1 (2011-10-15)
+ * Google Cache is broken, remove it from GoogleServices :( :( :(
+ * Fix for the Google Image Search homepage
+ * Exclude help.duckduckgo.com:
+ https://trac.torproject.org/projects/tor/ticket/4399
+ * Disable Yahoo! Mail:
+ https://trac.torproject.org/projects/tor/ticket/4441
+ * Installable on Firefox 10
+
+1.2 (2011-10-14)
+ * Fixes: WordPress, Statcounter, Java, Bahn.de, SICS.se
+ * Improvements: use fancy new HTTPS Wikipedia
+ * Disable broken: OpenUniversity, TV.com, Random.org, kb.CERT
+
+1.1 (2011-10-19)
+ * Further tweaks to internals, will hopefully fix a number of weird issues:
+ https://trac.torproject.org/projects/tor/ticket/4194
+ https://trac.torproject.org/projects/tor/ticket/4149
+ https://mail1.eff.org/pipermail/https-everywhere/2011-October/001208.html
+ * YouTube is enabled by default!
+ * Fixes: Yandex, Statcounter, Polldaddy, SBB.ch
+ * Improvements: Facebook+
+ * Disable broken: Bloglines, EPEAT
+
+1.0.3 (2011-09-26)
+ * Mozilla is about to release Firefox 7, the stable branch needs to be
+ installable there!
+ * Disabling nsIContentPolicy callbacks should fix this crash bug:
+ https://trac.torproject.org/projects/tor/ticket/3882
+ https://bugzilla.mozilla.org/show_bug.cgi?id=677643
+ It /might/ cause us to fail to rewrite requests in obscure corner cases.
+ We haven't found any in testing, but vigilance will be required.
+ * Support for Google Maps
+ * Fixes: WordPress, Lenovo, OpenDNS, Avast, Ripe.net, TV.com, 38.de
+ * Disable broken: Seagate
+
+1.0.2 (2011-09-20)
+ * Major improvements to the Wikipedia ruleset
+ * Disable broken/buggy rulesets: DeviantArt, eHow, About.me, Bandcamp,
+ StudiVZ, Securityfocus, BankofAmerica :( :( :(
+ * Small fixes: OpenDNS, WordPress, links in the "About" page
+ * Declare incompatibility with Firefox 7 & 8 until Mozilla fixes this:
+ https://bugzilla.mozilla.org/show_bug.cgi?id=677643
+
+1.0.1 (2011-08-10)
+ * Disable some rulesets with partial compatibility issues: Reddit,
+ StumbleUpon, Heroku
+ * Small Yandex fix
+ * Fix/improvement for Google Instant outside the US
+
+1.0.0 (2011-08-04)
+ * Release 1.0 into the stable branch!
+ * Improve toolbar UI for error pages somewhat (it still isn't perfect)
+ * Bugfixes: Microsoft, Dropbox, Netflix, MySQL
+ * Disable a couple of broken rules
+
+1.0.0development.5: (2011-07-13)
+ * Ship rulesets as a single "default.rulesets" file, shrinking the .xpi from
+ ~370 kB to ~120kB and speeding Firefox startup:
+ https://trac.torproject.org/projects/tor/ticket/3404
+ * Fix an ephemeral bug where disabled-by-default rules would be briefly
+ enabled when first installed
+ * Wikipedia shows up in the toolbar/context menu
+ * Fixes to netflix & netzpolitik
+ * Toolbar/context menu can be opened with left or right click
+
+1.0.0development.4: (2011-07-06)
+ * Fix a bug with Google Translate
+ * Unbreak the Netflix blog
+ * Toolbar button now looks OK in Seamonkey
+ * Declare compatibility with the next round of Firefox alphas
+
+1.0.0development.3: (2011-07-04)
+ * Do not show a bizarre popup when people click the HTTPS toolbar button on
+ error pages
+ * Fix a GoogleServices bug that broke logout from non-US google accounts :(
+
+1.0.0development.2: (2011-07-01)
+ * Fix bugs that arose when trying to move the toolbar menu icon:
+ https://trac.torproject.org/projects/tor/ticket/3497
+ * Handle usernames and passwords in URIs more explicitly
+ https://trac.torproject.org/projects/tor/ticket/2199
+ * By default, move context menu from toolbar to addons bar
+ * Ship 22 new rulesets
+ * Add support for Google Plus, Accounts and AdWdords
+ * Improvements to Microsoft, Twitter and Gitorious
+
+1.0.0development.1: (2011-06-27)
+ * Add a context menu to let users toggle rulesets that are/might be
+ applicable to the current page (we can now stabilise the dev branch!)
+ * Ship 42 new rulesets
+ * Support for Google Image Search (except the very first landing page :/)
+ * Fixes: Netflix, Plone
+ * Improvements: Google APIs, Google Services, Mediawiki
+ * Disable broken rules: OKCupid, Surveymonkey
+ * Declare compatibility with recent Seamonkey releases
+
+0.9.9.development.6:
+ * Optimistically declare compatibility with Firefoxes up to v 7.*
+ * Ship 193 new rulesets
+ * Fixes & Improvements: Wikipedia, AmazonAWS, Google Images, Microsoft,
+ Mozilla, Netflix, Google User Content, Twitter, Gitorious, AdBlock Plus,
+ Youtube, he.net, Bitcoin
+ * Remove broken rules: Match.com
+
+0.9.9.development.5:
+ * Compatible with Firefox 4.0.1+
+ * New ruleset management UI (thanks to katmagic and Stefan Tomanek)
+ * Ship 136 new rulesets
+ * Fixes: reCAPTCHA, Google Images, Gentoo, Gitorious
+ * Improvements: Bit.ly, Yahoo, Nokia
+ * Disable: WashingtonPost :(, Doubleclick, OpenSSL.org (!)
+
+0.9.9.development.4:
+ * Ship 117 new rulesets
+ * Fixes: MySQL, GroupOn, country-specific Google news sites,
+ * Improvements: mail.com, WordPress
+ * Leave WashingtonPost ruleset on in the hope that it gets fixed soon :/
+ * Disable broken rules: HTC, I2P ...
+
+0.9.9.development.3:
+
+ * In the settings dialogue, offer "Reset defaults" instead of "Enable all"
+ * Merge fixes from NoScript that avoid some torbutton bugs
+ * Ship 56 new rulesets
+ * Numerous tweaks + fixes, including NYTimes and AddThis
+
+0.9.9.development.2:
+
+ * Prevent the preferences window from swallowing the screen on OS X / Windows
+ * Stop the StartCom rule from breaking StartCom OCSP/CRLs (which can't be HTTPS)
+ * Attempt to do the same for for CAcert
+ * Fixes to: Reddit, Drupal.org
+ * Disable some problematic rulesets: Cisco, Opera
+ * Enable: Reddit
+ * Ship another 62 rulesets
+
+0.9.9.development.1:
+
+ * The efficient ruleset checking implementation should now hopefully be...
+ efficient
+ * Ship all the rulesets (!!!)
+ * Except the ones that cause cert warnings, which are there but off by default
+ * Build scripts attempt to validate rulesets before making a .xpi
+
+0.9.7:
+ * Support firefox 5 and 6 betas
+ * Numerous improvements and fixes to Google and GoogleServices support
+ * Fixes to AmazonAWS
+ * Secure j.mp via bit.ly
+ * Fix gentoo bugs
+
+0.9.6:
+ * Support firefox 4.0.1
+ * Unbreak recaptcha
+ * Disable google.com/jsapi (which was breaking some embedded maps, though
+ that bug *might* have been fixed)
+
+0.9.5:
+ * WashingtonPost is broken and seems to be staying that way; disable it :(
+ * Replace "Enable All" with "Reset Defaults"
+ * Fixes & Improvements to WordPress + Mozilla
+
+0.9.4:
+ * Significant performance improvements
+ * Disable Cisco by default
+ * Fixes & improvements to: NYTimes, WashingtonPost, Cisco, WordPress
+ * Support Google Code
+ * Disable Google Custom Search Engines (they don't work)
+ * Support global installation for OS distributions (thanks dm0)
+
+
+0.9.3:
+ * Significant performance improvements
+ * Disable Cisco by default
+ * Fixes & improvements to: NYTimes, WashingtonPost, Cisco, WordPress
+ * Support Google Code
+ * Disable Google Custom Search Engines (they don't work)
+ * Support global installation for OS distributions (thanks dm0)
+
+0.9.2:
+ * Fix a bug in our redirection loop detection that was causing touble with
+ some parts of NYTimes, Facebook, and other sites
+ (closes: https://trac.torproject.org/projects/tor/ticket/2217)
+
+0.9.1:
+ * Unbreak the "all x news articles" links in Google News
+ * Exclude nytimes.com/roomfordebate, since it's broken in https.
+
+0.9.0:
+ * This is our "Firesheep" release. It has numerous anti-firesheep
+ improvements!
+ * Split the stricter parts of the Facebook rule into a "Facebook+" rule.
+ It's what's required to protect Facebook from Firesheep and similar cookie
+ theft attacks, but it may break apps, because apps.facebook.com currently
+ has the wrong cert.
+ * Allow rulesets to specify that the secure flag should be set on some
+ cookies even if the site operator failed to do so
+ * Ship rules for:
+ - Amazon S3 (AWS)
+ - Github
+ - Bit.ly
+ - Dropbox
+ - Evernote
+ - Cisco
+ * Extensive improvements (including secure cookies) in the Twitter and
+ Facebook rules
+ * Support for full Live / Hotmail encryption
+ * Significant performance optimisation decreases CPU load
+ Fixes:
+ https://trac.torproject.org/projects/tor/ticket/1656
+ https://trac.torproject.org/projects/tor/ticket/2194
+ * Rearrange our Channel Replacement code!
+ Fixes https://trac.torproject.org/projects/tor/ticket/1684
+ https://bugzilla.mozilla.org/show_bug.cgi?id=548102
+ Thanks to Giorgio Maone and Boris Zbarsky!
+ * Add scrollbars if there are a lot of rules present in the Preferences
+ dialog (may still be somewhat buggy...)
+ * Optimise GoogleServices.xml and support Google code search
+ * Patch for future compatiability with Request Policy:
+ https://trac.torproject.org/projects/tor/ticket/1574
+ * Support for the Firefox 4 API
+ * The Amazon rule was causing a lot of glitches; it is now off by default
+ * Control log verbosity with an about:config variable
+ * Numerous minor rule improvements
+
+0.2.2:
+ * Fix a glitch in the Content Policy path that may or may not have been
+ responsible for these bugs:
+ https://trac.torproject.org/projects/tor/ticket/1700
+ https://trac.torproject.org/projects/tor/ticket/1672
+ https://trac.torproject.org/projects/tor/ticket/1673
+ The patch breaks toolbar search suggestions. And who knows what else?
+ * Don't send some country homepages to https://www.google.com/webhp?hl= ;
+ use https://encrypted.google.com instead
+ * Cleanup and refactor the URI replacement and rewriting code. Should
+ hopefully fix https://trac.torproject.org/projects/tor/ticket/1649
+ * Add a Google APIs rule
+ * Remove some Extremely Nasty code that would delete malformed rulesets (!)
+ (it was pasted from Torbutton's cookie handling logic...)
+ * Add code.google.com to Google Services
+ * The client=firefox* workaround is no longer necessary once we're sending
+ non-US users to encrypted.google.com rather than www.google.com
+ * Better coverage for GMX, Google services, Twitter
+ * Scroogle homepage in HTTPS
+ * Add rules for
+ - Mail.com logins
+ - Microsoft (limited coverage)
+ * Fix a nasty Google/Wikipedia bug within 0.2.2.development.{1,2}
+
+0.2.1:
+ * Although google said https://www.google.com would continue to work, that
+ wasn't absolutely true.
+ * The new encyrpted.google.com seems to require queries to be #q=thing
+ rather than search?q=thing, at least some of the time. So let's do that.
+
+0.2.0:
+ * Work around the fact that Google does not allow client=firefox* HTTPS
+ searches from outside the US, by rewriting those URIs
+ * Add rules for:
+ - Amazon
+ - GMX
+ - Live.com (Hotmail logins)
+ - Meebo
+ - the Netherlands Government
+ - Wordpress.com
+ - Zoho
+ * Remove the assumption that non-US searches would always start with an hl=
+ language parameter
+ * Handle searches to the google.com/firefox script better
+ * Remove accidental duplicates of a couple of rules!
+ * Bump maxVersion into the future so we're compatible with Firefox alphas
+ * Fix more legacy eff.org bugs
+
+0.1.2:
+ * Apparently, we are not actually compatible with Firefox 2.0.0.x, so don't
+ install with it!
+ * Further generalisation of Wikimedia rules
+ * Fix bugs in the handling of obscure parts of eff.org and torproject.org
+ * A bug in a user rules file should produce an error, rather than causing all
+ rules to fail to load
+
+0.1.1:
+ * Generalise the Wikipedia rules to other Wikimedia services
+ * In preferences window, add a link to instructions for writing one's own
+ rules
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome.manifest b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome.manifest
new file mode 100644
index 0000000..4869afe
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome.manifest
@@ -0,0 +1,53 @@
+content https-everywhere chrome/content/
+override chrome://https-everywhere/content/rulesets.sqlite defaults/rulesets.sqlite
+
+locale https-everywhere en chrome/locale/en/
+locale https-everywhere lt chrome/locale/lt/
+locale https-everywhere lv chrome/locale/lv/
+locale https-everywhere pt chrome/locale/pt/
+locale https-everywhere sv chrome/locale/sv/
+locale https-everywhere de chrome/locale/de/
+locale https-everywhere ru chrome/locale/ru/
+locale https-everywhere zh-CN chrome/locale/zh-CN/
+locale https-everywhere zh-TW chrome/locale/zh-TW/
+locale https-everywhere es chrome/locale/es/
+locale https-everywhere nl chrome/locale/nl/
+locale https-everywhere ar chrome/locale/ar/
+locale https-everywhere fa chrome/locale/fa/
+locale https-everywhere eu chrome/locale/eu/
+locale https-everywhere fr chrome/locale/fr/
+locale https-everywhere pl chrome/locale/pl/
+locale https-everywhere sk chrome/locale/sk/
+locale https-everywhere ms chrome/locale/ms/
+locale https-everywhere da chrome/locale/da/
+locale https-everywhere el chrome/locale/el/
+locale https-everywhere hu chrome/locale/hu/
+locale https-everywhere it chrome/locale/it/
+locale https-everywhere tr chrome/locale/tr/
+locale https-everywhere ko chrome/locale/ko/
+locale https-everywhere cs chrome/locale/cs/
+locale https-everywhere hr chrome/locale/hr/
+locale https-everywhere he chrome/locale/he/
+locale https-everywhere fi chrome/locale/fi/
+locale https-everywhere nb chrome/locale/nb/
+locale https-everywhere sl chrome/locale/sl/
+locale https-everywhere bg chrome/locale/bg/
+locale https-everywhere ja chrome/locale/ja/
+locale https-everywhere si chrome/locale/si/
+
+skin https-everywhere classic/1.0 chrome/skin/
+
+component {32c165b4-fe5e-4964-9250-603c410631b4} components/https-everywhere.js
+contract @eff.org/https-everywhere;1 {32c165b4-fe5e-4964-9250-603c410631b4}
+
+category profile-after-change HTTPSEverywhere @eff.org/https-everywhere;1
+category content-policy HTTPSEverywhere @eff.org/https-everywhere;1
+
+overlay chrome://browser/content/browser.xul chrome://https-everywhere/content/toolbar_button.xul
+overlay chrome://navigator/content/navigator.xul chrome://https-everywhere/content/toolbar_button.xul
+
+style chrome://global/content/customizeToolbar.xul chrome://https-everywhere/skin/https-everywhere.css
+component {0f9ab521-986d-4ad8-9c1f-6934e195c15c} components/ssl-observatory.js
+contract @eff.org/ssl-observatory;1 {0f9ab521-986d-4ad8-9c1f-6934e195c15c}
+
+category profile-after-change SSLObservatory @eff.org/ssl-observatory;1
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/about.xul b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/about.xul
new file mode 100644
index 0000000..cf57e9d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/about.xul
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://https-everywhere/content/preferences.css" type="text/css"?>
+
+<!DOCTYPE overlay SYSTEM "chrome://https-everywhere/locale/https-everywhere.dtd">
+
+<dialog id="https-everywhere-about"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ buttons="accept"
+ title="&https-everywhere.about.title;"
+ width="640"
+ height="480"
+ align="center">
+
+ <script type="application/x-javascript"
+ src="chrome://https-everywhere/content/preferences.js"/>
+ <vbox style="overflow:auto" flex="1">
+ <label style="text-align:center; font-weight:bold; font-size:22px;">&https-everywhere.about.ext_name;</label>
+ <label style="text-align:center; font-size:18px; margin-bottom:10px;">&https-everywhere.about.ext_description;</label>
+
+ <groupbox>
+ <caption label="&https-everywhere.about.version;" />
+ <label>3.5.1</label>
+ </groupbox>
+
+ <groupbox>
+ <caption label="&https-everywhere.about.created_by;" />
+ <label>Mike Perry and Peter Eckersley</label>
+ </groupbox>
+
+ <groupbox>
+ <caption label="&https-everywhere.about.librarians;" />
+ <label>Seth Schoen, MB and Andreas Jonsson</label>
+ </groupbox>
+
+ <groupbox>
+ <caption label="&https-everywhere.about.thanks;" />
+ <label>Many many contributors, including Aaron Swartz, Alec Moskvin,
+ Aleksey Kosterin, Alex Xu, Anas Qtiesh, Artyom Gavrichenkov, Brian
+ Carpenter, Chris Palmer, Christian Inci, Christopher Liu, Claudio
+ Moretti, Colonel Graff, Dan Auerbach, Daniel Kahn Gillmor, dm0, The
+ Doctor, Felix Geyer, Fruitless Creek, George Kargiotakis, haviah, Heiko
+ Adams, Jeroen van der Gun, Jay Weisskopf, Jacob Taylor, Jonathan Davies, Jorge Bernal,
+ katmagic, Kevin Jacobs, Korte, Liam K, Leonardo Brondani Schenkel, Marti Raudsepp, Micah Lee, Mike
+ Cardwell, Mangix, Matthias-Christian Ott, Mikko Harhanen, Mishari Muqbil, Neheb, Ori Avtalion, Osama Khalid,
+ nitrox, Pablo Castellano, Paul Wise, Pavel Kazakov, Phol Paucar, Richard
+ Green, Roan Kattouw, Rules Moore, Stefan Tomanek, Sam Reed, Steve
+ Milner, Sujit Rao, TK-999, Vendo, Victor Garin, Weiland Hoffmann, Whizz
+ Mo and Yan Zhu. Also, portions of HTTPS Everywhere are based on code
+ from NoScript, by Giorgio Maone and others. We are grateful for their
+ excellent work!</label>
+ </groupbox>
+
+ <label style="font-weight:bold; margin-top:10px;">
+ &https-everywhere.about.contribute;
+ <label id="donate link"
+ value="&https-everywhere.about.donate_tor;"
+ style="color: blue; cursor:hand; text-decoration:underline; font-style:bold"
+ onmouseover="event.target.style.cursor='pointer'"
+ onmouseout="event.target.style.cursor='default'"
+ onclick="window_opener('https://www.torproject.org/donate/donate.html.en')"/>
+ or
+ <label id="donate link2"
+ value="&https-everywhere.about.donate_eff;"
+ style="color: blue; cursor:hand; text-decoration:underline; font-style:bold"
+ onmouseover="event.target.style.cursor='pointer'"
+ onmouseout="event.target.style.cursor='default'"
+ onclick="window_opener('https://www.eff.org/donate')"/>
+ </label>
+ </vbox>
+</dialog>
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/ApplicableList.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/ApplicableList.js
new file mode 100644
index 0000000..6949167
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/ApplicableList.js
@@ -0,0 +1,266 @@
+// An ApplicableList is a structure used to keep track of which rulesets
+// were applied, and which ones weren't but might have been, to the contents
+// of a given page (top level nsIDOMWindow)
+
+serial_number = 0;
+
+function ApplicableList(logger, doc, domWin) {
+ this.domWin = domWin;
+ this.uri = doc.baseURIObject.clone();
+ if (!this.uri) {
+ this.log(WARN,"NULL CLONING URI " + doc);
+ if (doc)
+ this.log(WARN,"NULL CLONING URI " + doc.baseURIObject);
+ if (doc.baseURIObject)
+ this.log(WARN,"NULL CLONING URI " + doc.baseURIObject.spec);
+ }
+ this.home = doc.baseURIObject.spec; // what doc we're housekeeping for
+ this.log = logger;
+ this.active = {};
+ this.breaking = {}; // rulesets with redirection loops
+ this.inactive = {};
+ this.moot={}; // rulesets that might be applicable but uris are already https
+ this.all={}; // active + breaking + inactive + moot
+ serial_number += 1;
+ this.serial = serial_number;
+ this.log(DBUG,"Alist serial #" + this.serial + " for " + this.home);
+}
+
+ApplicableList.prototype = {
+
+ empty: function() {
+ // Empty everything, used when toggles occur in order to ensure that if
+ // the reload fails, the resulting list is not eroneous
+ this.active = {};
+ this.breaking = {};
+ this.inactive = {};
+ this.moot={};
+ this.all={};
+ },
+
+ active_rule: function(ruleset) {
+ this.log(INFO,"active rule " + ruleset.name +" in "+ this.home +" -> " +
+ this.domWin.document.baseURIObject.spec+ " serial " + this.serial);
+ this.active[ruleset.name] = ruleset;
+ this.all[ruleset.name] = ruleset;
+ },
+
+ breaking_rule: function(ruleset) {
+ this.log(NOTE,"breaking rule " + ruleset.name +" in "+ this.home +" -> " +
+ this.domWin.document.baseURIObject.spec+ " serial " + this.serial);
+ this.breaking[ruleset.name] = ruleset;
+ this.all[ruleset.name] = ruleset;
+ },
+
+ inactive_rule: function(ruleset) {
+
+ this.log(INFO,"inactive rule " + ruleset.name +" in "+ this.home +" -> " +
+ this.domWin.document.baseURIObject.spec+ " serial " + this.serial);
+ this.inactive[ruleset.name] = ruleset;
+ this.all[ruleset.name] = ruleset;
+ },
+
+ moot_rule: function(ruleset) {
+ this.log(INFO,"moot rule " + ruleset.name +" in "+ this.home + " serial " + this.serial);
+ this.moot[ruleset.name] = ruleset;
+ this.all[ruleset.name] = ruleset;
+ },
+
+ dom_handler: function(operation,key,data,src,dst) {
+ // See https://developer.mozilla.org/En/DOM/UserDataHandler
+ if (src && dst)
+ dst.setUserData(key, data, this.dom_handler);
+ },
+
+ populate_list: function() {
+ // The base URI of the dom tends to be loaded from some /other/
+ // ApplicableList, so pretend we're loading it from here.
+ HTTPSEverywhere.instance.https_rules.rewrittenURI(this, this.uri);
+ this.log(DBUG, "populating using alist #" + this.serial);
+ },
+
+ populate_menu: function(document, menupopup, weird) {
+ this.populate_list();
+ this.document = document;
+
+ var https_everywhere = CC["@eff.org/https-everywhere;1"].getService(Components.interfaces.nsISupports).wrappedJSObject;
+
+ // get the menu popup
+ this.menupopup = menupopup;
+
+ // empty it all of its menuitems
+ while(this.menupopup.firstChild.tagName != "menuseparator") {
+ this.menupopup.removeChild(this.menupopup.firstChild);
+ }
+
+ // add global enable/disable toggle button
+ var strings = document.getElementById("HttpsEverywhereStrings");
+
+ var enableLabel = document.createElement('menuitem');
+ var text = strings.getString("https-everywhere.menu.globalDisable");
+ if(!https_everywhere.prefs.getBoolPref("globalEnabled"))
+ text = strings.getString("https-everywhere.menu.globalEnable");
+
+ enableLabel.setAttribute('label', text);
+ enableLabel.setAttribute('command', 'https-everywhere-menuitem-globalEnableToggle');
+ this.prepend_child(enableLabel);
+
+ // add the label at the top
+ var any_rules = false;
+ for(var x in this.all) {
+ any_rules = true; // how did JavaScript get this ugly?
+ break;
+ }
+ var label = document.createElement('menuitem');
+ label.setAttribute('label', strings.getString('https-everywhere.menu.enableDisable'));
+ label.setAttribute('command', 'https-everywhere-menuitem-preferences');
+ var label2 = false;
+ if (!any_rules) {
+ label2 = document.createElement('menuitem');
+ if (!weird) text = strings.getString('https-everywhere.menu.noRules');
+ else text = strings.getString('https-everywhere.menu.unknownRules');
+ label2.setAttribute('label', text);
+ label2.setAttribute('command', 'https-everywhere-menuitem-preferences');
+ label2.setAttribute('style', 'color:#909090;');
+ }
+
+ // create a commandset if it doesn't already exist
+ this.commandset = document.getElementById('https-everywhere-commandset');
+ if(!this.commandset) {
+ this.commandset = document.createElement('commandset');
+ this.commandset.setAttribute('id', 'https-everywhere-commandset');
+ var win = document.getElementById('main-window');
+ win.appendChild(this.commandset);
+ } else {
+ // empty commandset
+ while(this.commandset.firstChild)
+ this.commandset.removeChild(this.commandset.firstChild);
+ }
+
+ var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
+ .getService(Components.interfaces.nsIWindowMediator);
+
+ var domWin = wm.getMostRecentWindow("navigator:browser").content.document.defaultView.top;
+ var location = domWin.document.baseURIObject.asciiSpec; //full url, including about:certerror details
+
+ if(location.substr(0, 6) == "about:"){
+ //"From" portion of the rule is retrieved from the location bar via document.getElementById("urlbar").value
+
+ var fromHost = document.getElementById("urlbar").value;
+
+ //scheme must be trimmed out to check for applicable rulesets
+ if(fromHost.indexOf("://") != -1)
+ fromHost = fromHost.substr(fromHost.indexOf("://") + 3, fromHost.length);
+
+ //trim off any page locations - we only want the host - e.g. domain.com
+ if(fromHost.indexOf("/") != -1)
+ fromHost = fromHost.substr(0, fromHost.indexOf("/"));
+
+ // Search for applicable rulesets for the host listed in the location bar
+ var plist = HTTPSRules.potentiallyApplicableRulesets(fromHost);
+ for (var i = 0 ; i < plist.length ; i++){
+ //For each applicable rulset, determine active/inactive, and append to proper list.
+ var ruleOn = false;
+ try {
+ if(https_everywhere.rule_toggle_prefs.getBoolPref(plist[i].name))
+ ruleOn = true;
+ } catch(e) {
+ if(https_everywhere.https_rules.rulesetsByName[plist[i].name].active)
+ ruleOn = true;
+ }
+ if(ruleOn)
+ this.active_rule(plist[i]);
+ else
+ this.inactive_rule(plist[i]);
+ }
+ }
+
+ // add all applicable commands
+ for(var x in this.breaking)
+ this.add_command(this.breaking[x]);
+ for(var x in this.active)
+ this.add_command(this.active[x]);
+ for(var x in this.moot)
+ this.add_command(this.moot[x]);
+ for(var x in this.inactive)
+ this.add_command(this.inactive[x]);
+
+ if(https_everywhere.prefs.getBoolPref("globalEnabled")){
+ // add all the menu items
+ for (var x in this.inactive)
+ this.add_menuitem(this.inactive[x], 'inactive');
+ // rules that are active for some uris are not really moot
+ for (var x in this.moot)
+ if (!(x in this.active))
+ this.add_menuitem(this.moot[x], 'moot');
+ // break once break everywhere
+ for (var x in this.active)
+ if (!(x in this.breaking))
+ this.add_menuitem(this.active[x], 'active');
+ for (var x in this.breaking)
+ this.add_menuitem(this.breaking[x], 'breaking');
+
+ if (label2) this.prepend_child(label2);
+ this.prepend_child(label);
+ }
+
+ },
+
+ prepend_child: function(node) {
+ this.menupopup.insertBefore(node, this.menupopup.firstChild);
+ },
+
+ add_command: function(rule) {
+ var command = this.document.createElement("command");
+ command.setAttribute('id', rule.id+'-command');
+ command.setAttribute('label', rule.name);
+ command.setAttribute('oncommand', 'toggle_rule("'+rule.id+'")');
+ this.commandset.appendChild(command);
+ },
+
+ // add a menu item for a rule -- type is "active", "inactive", "moot",
+ // or "breaking"
+
+ add_menuitem: function(rule, type) {
+ // create the menuitem
+ var item = this.document.createElement('menuitem');
+ item.setAttribute('command', rule.id+'-command');
+ item.setAttribute('class', type+'-item menuitem-iconic');
+ item.setAttribute('label', rule.name);
+
+ // we can get confused if rulesets have their state changed after the
+ // ApplicableList was constructed
+ if (!rule.active && (type == 'active' || type == 'moot'))
+ type = 'inactive';
+ if (rule.active && type == 'inactive')
+ type = 'moot';
+
+ // set the icon
+ var image_src;
+ if (type == 'active') image_src = 'tick.png';
+ else if (type == 'inactive') image_src = 'cross.png';
+ else if (type == 'moot') image_src = 'tick-moot.png';
+ else if (type == 'breaking') image_src = 'loop.png';
+ item.setAttribute('image', 'chrome://https-everywhere/skin/'+image_src);
+
+ // all done
+ this.prepend_child(item);
+ },
+
+ show_applicable: function() {
+ this.log(WARN, "Applicable list number " + this.serial);
+ for (var x in this.active)
+ this.log(WARN,"Active: " + this.active[x].name);
+
+ for (var x in this.breaking)
+ this.log(WARN,"Breaking: " + this.breaking[x].name);
+
+ for (x in this.inactive)
+ this.log(WARN,"Inactive: " + this.inactive[x].name);
+
+ for (x in this.moot)
+ this.log(WARN,"Moot: " + this.moot[x].name);
+
+ }
+};
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/ChannelReplacement.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/ChannelReplacement.js
new file mode 100644
index 0000000..551bcab
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/ChannelReplacement.js
@@ -0,0 +1,387 @@
+function CtxCapturingListener(tracingChannel, captureObserver) {
+ this.originalListener = tracingChannel.setNewListener(this);
+ this.captureObserver = captureObserver;
+}
+CtxCapturingListener.prototype = {
+ originalListener: null,
+ originalCtx: null,
+ onStartRequest: function(request, ctx) {
+ this.originalCtx = ctx;
+ if (this.captureObserver) {
+ this.captureObserver.observeCapture(request, this);
+ }
+ },
+ onDataAvailable: function(request, ctx, inputStream, offset, count) {},
+ onStopRequest: function(request, ctx, statusCode) {},
+ QueryInterface: xpcom_generateQI([Ci.nsIStreamListener])
+};
+
+function ChannelReplacement(chan, newURI, newMethod) {
+ return this._init(chan, newURI, newMethod);
+}
+
+ChannelReplacement.supported = "nsITraceableChannel" in Ci;
+
+ChannelReplacement.runWhenPending = function(channel, callback) {
+ if (channel.isPending()) {
+ callback();
+ return false;
+ } else {
+ new LoadGroupWrapper(channel, callback);
+ return true;
+ }
+};
+
+
+ChannelReplacement.prototype = {
+ listener: null,
+ context: null,
+ oldChannel: null,
+ channel: null,
+ window: null,
+ suspended: false,
+
+ get _unsupportedError() {
+ return new Error("Can't replace channels without nsITraceableChannel!");
+ },
+
+ get _classifierClass() {
+ delete this.__proto__._classifierClass;
+ return this.__proto__._classifierClass = Cc["@mozilla.org/channelclassifier"];
+ },
+
+ _autoHeadersRx: /^(?:Host|Cookie|Authorization)$|Cache|^If-/,
+ visitHeader: function(key, val) {
+ try {
+ // we skip authorization and cache-related fields which should be automatically set
+ if (!this._autoHeadersRx.test(key)) this.channel.setRequestHeader(key, val, false);
+ } catch (e) {
+ dump(e + "\n");
+ }
+ },
+
+ _init: function(chan, newURI, newMethod) {
+ if (!(ChannelReplacement.supported && chan instanceof Ci.nsITraceableChannel))
+ throw this._unsupportedError;
+
+ newURI = newURI || chan.URI;
+
+ var newChan = IOS.newChannelFromURI(newURI);
+
+ this.oldChannel = chan;
+ this.channel = newChan;
+
+ // porting of http://mxr.mozilla.org/mozilla-central/source/netwerk/protocol/http/src/nsHttpChannel.cpp#2750
+
+ var loadFlags = chan.loadFlags;
+
+ if (chan.URI.schemeIs("https"))
+ loadFlags &= ~chan.INHIBIT_PERSISTENT_CACHING;
+
+
+ newChan.loadGroup = chan.loadGroup;
+ newChan.notificationCallbacks = chan.notificationCallbacks;
+ newChan.loadFlags = loadFlags | newChan.LOAD_REPLACE;
+
+ if (!(newChan instanceof Ci.nsIHttpChannel))
+ return this;
+
+ // copy headers
+ chan.visitRequestHeaders(this);
+
+ if (!newMethod || newMethod === chan.requestMethod) {
+ if (newChan instanceof Ci.nsIUploadChannel && chan instanceof Ci.nsIUploadChannel && chan.uploadStream ) {
+ var stream = chan.uploadStream;
+ if (stream instanceof Ci.nsISeekableStream) {
+ stream.seek(stream.NS_SEEK_SET, 0);
+ }
+
+ try {
+ let ctype = chan.getRequestHeader("Content-type");
+ let clen = chan.getRequestHeader("Content-length");
+ if (ctype && clen) {
+ newChan.setUploadStream(stream, ctype, parseInt(clen, 10));
+ }
+ } catch(e) {
+ newChan.setUploadStream(stream, '', -1);
+ }
+
+ newChan.requestMethod = chan.requestMethod;
+ }
+ } else {
+ newChan.requestMethod = newMethod;
+ }
+
+ if (chan.referrer) newChan.referrer = chan.referrer;
+ newChan.allowPipelining = chan.allowPipelining;
+ newChan.redirectionLimit = chan.redirectionLimit - 1;
+ if (chan instanceof Ci.nsIHttpChannelInternal && newChan instanceof Ci.nsIHttpChannelInternal) {
+ if (chan.URI == chan.documentURI) {
+ newChan.documentURI = newURI;
+ } else {
+ newChan.documentURI = chan.documentURI;
+ }
+ }
+
+ if (chan instanceof Ci.nsIEncodedChannel && newChan instanceof Ci.nsIEncodedChannel) {
+ newChan.applyConversion = chan.applyConversion;
+ }
+
+ // we can't transfer resume information because we can't access mStartPos and mEntityID :(
+ // http://mxr.mozilla.org/mozilla-central/source/netwerk/protocol/http/src/nsHttpChannel.cpp#2826
+
+ if ("nsIApplicationCacheChannel" in Ci &&
+ chan instanceof Ci.nsIApplicationCacheChannel && newChan instanceof Ci.nsIApplicationCacheChannel) {
+ newChan.applicationCache = chan.applicationCache;
+ newChan.inheritApplicationCache = chan.inheritApplicationCache;
+ }
+
+ if (chan instanceof Ci.nsIPropertyBag && newChan instanceof Ci.nsIWritablePropertyBag)
+ for (var properties = chan.enumerator, p; properties.hasMoreElements();)
+ if ((p = properties.getNext()) instanceof Ci.nsIProperty)
+ newChan.setProperty(p.name, p.value);
+
+ if (chan.loadFlags & chan.LOAD_DOCUMENT_URI) {
+ this.window = IOUtil.findWindow(chan);
+ if (this.window) this.window._replacedChannel = chan;
+ }
+
+ return this;
+ },
+
+ _onChannelRedirect: function() {
+ var oldChan = this.oldChannel;
+ var newChan = this.channel;
+
+ if (this.realRedirect) {
+ if (oldChan.redirectionLimit === 0) {
+ oldChan.cancel(NS_ERROR_REDIRECT_LOOP);
+ throw NS_ERROR_REDIRECT_LOOP;
+ }
+ } else newChan.redirectionLimit += 1;
+
+
+
+ // nsHttpHandler::OnChannelRedirect()
+
+ const CES = Ci.nsIChannelEventSink;
+ const flags = CES.REDIRECT_INTERNAL;
+ this._callSink(
+ Cc["@mozilla.org/netwerk/global-channel-event-sink;1"].getService(CES),
+ oldChan, newChan, flags);
+ var sink;
+
+ for (let cess = Cc['@mozilla.org/categorymanager;1'].getService(CI.nsICategoryManager)
+ .enumerateCategory("net-channel-event-sinks");
+ cess.hasMoreElements();
+ ) {
+ sink = cess.getNext();
+ if (sink instanceof CES)
+ this._callSink(sink, oldChan, newChan, flags);
+ }
+ sink = IOUtil.queryNotificationCallbacks(oldChan, CES);
+ if (sink) this._callSink(sink, oldChan, newChan, flags);
+
+ // ----------------------------------
+
+ newChan.originalURI = oldChan.originalURI;
+
+ sink = IOUtil.queryNotificationCallbacks(oldChan, Ci.nsIHttpEventSink);
+ if (sink) sink.onRedirect(oldChan, newChan);
+ },
+
+ _callSink: function(sink, oldChan, newChan, flags) {
+ try {
+ if ("onChannelRedirect" in sink) sink.onChannelRedirect(oldChan, newChan, flags);
+ else sink.asyncOnChannelRedirect(oldChan, newChan, flags, this._redirectCallback);
+ } catch(e) {
+ if (e.toString().indexOf("(NS_ERROR_DOM_BAD_URI)") !== -1 && oldChan.URI.spec !== newChan.URI.spec) {
+ let oldURL = oldChan.URI.spec;
+ try {
+ oldChan.URI.spec = newChan.URI.spec;
+ this._callSink(sink, oldChan, newChan, flags);
+ } catch(e1) {
+ throw e;
+ } finally {
+ oldChan.URI.spec = oldURL;
+ }
+ } else if (e.message.indexOf("(NS_ERROR_NOT_AVAILABLE)") === -1) throw e;
+ }
+ },
+
+ _redirectCallback: ("nsIAsyncVerifyRedirectCallback" in Ci)
+ ? {
+ QueryInterface: xpcom_generateQI([Ci.nsIAsyncVerifyRedirectCallback]),
+ onRedirectVerifyCallback: function(result) {}
+ }
+ : null
+ ,
+
+ replace: function(realRedirect, callback) {
+ let self = this;
+ let oldChan = this.oldChannel;
+ this.realRedirect = !!realRedirect;
+ if (typeof(callback) !== "function") {
+ callback = this._defaultCallback;
+ }
+ ChannelReplacement.runWhenPending(oldChan, function() {
+ if (oldChan.status) return; // channel's doom had been already defined
+
+ let ccl = new CtxCapturingListener(oldChan, self);
+ self.loadGroup = oldChan.loadGroup;
+
+ oldChan.loadGroup = null; // prevents the wheel from stopping spinning
+
+
+ if (self._redirectCallback) { // Gecko >= 2
+ // this calls asyncAbort, which calls onStartRequest on our listener
+ oldChan.cancel(NS_BINDING_REDIRECTED);
+ self.suspend(); // believe it or not, this will defer asyncAbort() notifications until resume()
+ callback(self);
+ } else {
+ // legacy (Gecko < 2)
+ self.observeCapture = function(req, ccl) {
+ self.open = function() { self._redirect(ccl); };
+ callback(self);
+ };
+ oldChan.cancel(NS_BINDING_REDIRECTED);
+ }
+
+
+ });
+ },
+
+ observeCapture: function(req, ccl) {
+ this._redirect(ccl);
+ },
+
+ _defaultCallback: function(replacement) {
+ replacement.open();
+ },
+
+ open: function() {
+ this.resume(); // this triggers asyncAbort and the listeners in cascade
+ },
+ _redirect: function(ccl) {
+ let oldChan = this.oldChannel,
+ newChan = this.channel,
+ overlap;
+
+ if (!(this.window && (overlap = this.window._replacedChannel) !== oldChan)) {
+ try {
+ if (ABE.consoleDump && this.window) {
+ ABE.log("Opening delayed channel: " + oldChan.name + " - (current loading channel for this window " + (overlap && overlap.name) + ")");
+ }
+
+ oldChan.loadGroup = this.loadGroup;
+
+ this._onChannelRedirect();
+ newChan.asyncOpen(ccl.originalListener, ccl.originalCtx);
+
+ if (this.window && this.window != IOUtil.findWindow(newChan)) {
+ // late diverted load, unwanted artifact, abort
+ IOUtil.abort(newChan);
+ } else {
+ // safe browsing hook
+ if (this._classifierClass)
+ this._classifierClass.createInstance(Ci.nsIChannelClassifier).start(newChan, true);
+ }
+ } catch (e) {
+ ABE.log(e);
+ }
+ } else {
+ if (ABE.consoleDump) {
+ ABE.log("Detected double load on the same window: " + oldChan.name + " - " + (overlap && overlap.name));
+ }
+ }
+
+ this.dispose();
+ },
+
+ suspend: function() {
+ if (!this.suspended) {
+ this.oldChannel.suspend();
+ this.suspended = true;
+ }
+ },
+ resume: function() {
+ if (this.suspended) {
+ this.suspended = false;
+ try {
+ this.oldChannel.resume();
+ } catch (e) {}
+ }
+ },
+
+ dispose: function() {
+ this.resume();
+ if (this.loadGroup) {
+ try {
+ this.loadGroup.removeRequest(this.oldChannel, null, NS_BINDING_REDIRECTED);
+ } catch (e) {}
+ this.loadGroup = null;
+ }
+
+ }
+};
+
+function LoadGroupWrapper(channel, callback) {
+ this._channel = channel;
+ this._inner = channel.loadGroup;
+ this._callback = callback;
+ channel.loadGroup = this;
+}
+LoadGroupWrapper.prototype = {
+ QueryInterface: xpcom_generateQI([Ci.nsILoadGroup]),
+
+ get activeCount() {
+ return this._inner ? this._inner.activeCount : 0;
+ },
+ set defaultLoadRequest(v) {
+ return this._inner ? this._inner.defaultLoadRequest = v : v;
+ },
+ get defaultLoadRequest() {
+ return this._inner ? this._inner.defaultLoadRequest : null;
+ },
+ set groupObserver(v) {
+ return this._inner ? this._inner.groupObserver = v : v;
+ },
+ get groupObserver() {
+ return this._inner ? this._inner.groupObserver : null;
+ },
+ set notificationCallbacks(v) {
+ return this._inner ? this._inner.notificationCallbacks = v : v;
+ },
+ get notificationCallbacks() {
+ return this._inner ? this._inner.notificationCallbacks : null;
+ },
+ get requests() {
+ return this._inner ? this._inner.requests : this._emptyEnum;
+ },
+
+ addRequest: function(r, ctx) {
+ this.detach();
+ if (this._inner) try {
+ this._inner.addRequest(r, ctx);
+ } catch(e) {
+ // addRequest may have not been implemented
+ }
+ if (r === this._channel)
+ try {
+ this._callback(r, ctx);
+ } catch (e) {}
+ },
+ removeRequest: function(r, ctx, status) {
+ this.detach();
+ if (this._inner) this._inner.removeRequest(r, ctx, status);
+ },
+
+ detach: function() {
+ if (this._channel.loadGroup) this._channel.loadGroup = this._inner;
+ },
+ _emptyEnum: {
+ QueryInterface: xpcom_generateQI([Ci.nsISimpleEnumerator]),
+ getNext: function() { return null; },
+ hasMoreElements: function() { return false; }
+ }
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/Cookie.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/Cookie.js
new file mode 100644
index 0000000..9afe0a8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/Cookie.js
@@ -0,0 +1,148 @@
+function Cookie(s, host) {
+ this.parse(s, host);
+}
+Cookie.computeId = function(c) {
+ return c.name + ";" + c.host + "/" + c.path;
+};
+Cookie.find = function(f) {
+ var cc = Cookie.prototype.cookieManager.enumerator;
+ var c;
+ while (cc.hasMoreElements()) {
+ if (f(c = cc.getNext())) return c;
+ }
+ return null;
+};
+
+Cookie.attributes = { host: 'domain', path: 'path', expires: 'expires', isHttpOnly: 'HttpOnly', isSecure: 'Secure' };
+Cookie.prototype = {
+
+ name: '',
+ value: '',
+ source: '',
+ domain: '',
+ host: '',
+ rawHost: '',
+ path: '',
+ secure: false,
+ httponly: false,
+ session: true,
+ expires: 0,
+
+ id: '',
+
+
+ toString: function() {
+ var c = [this['name'] + "=" + this.value];
+ var v;
+ const aa = Cookie.attributes;
+ for (var k in aa) {
+ var p = aa[k];
+ v = this[k];
+ switch(typeof(v)) {
+ case "string":
+ if (v) c.push(p + "=" + v);
+ break;
+ case "boolean":
+ if (v) c.push(p);
+ break;
+ case "number":
+ if (!this.isSession) c.push(p + "=" + new Date(v * 1000).toUTCString());
+ break;
+ }
+ }
+ return c.join("; ");
+ },
+ parse: function(s, host) {
+ var p;
+ if (this.source) {
+ // cleanup for recycle
+ for (p in this) {
+ if (typeof (p) != "function") delete this[p];
+ }
+ }
+ this.source = s;
+ this.host = host;
+
+ var parts = s.split(/;\s*/);
+ var nv = parts.shift().split("=");
+
+ this.name = nv.shift() || '';
+ this.value = nv.join('=') || '';
+
+ var n, v;
+ for each (p in parts) {
+ nv = p.split("=");
+ switch (n = nv[0].toLowerCase()) {
+ case 'expires':
+ v = Math.round(Date.parse((nv[1] || '').replace(/\-/g, ' ')) / 1000);
+ break;
+ case 'domain':
+ case 'path':
+ v = nv[1] || '';
+ break;
+ case 'secure':
+ case 'httponly':
+ v = true;
+ break;
+ default:
+ n = 'unknown';
+ }
+ this[n] = v;
+ }
+ if (!this.expires) {
+ this.session = true;
+ this.expires = Math.round(new Date() / 1000) + 31536000;
+ }
+ if (this.domain) {
+ if (!this.isDomain) this.domain = "." + this.domain;
+ this.host = this.domain;
+ }
+ this.rawHost = this.host.replace(/^\./, '');
+
+ this.id = Cookie.computeId(this);
+ },
+
+
+ get cookieManager() {
+ delete Cookie.prototype.cookieManager;
+ var cman = Cc["@mozilla.org/cookiemanager;1"]
+ .getService(Ci.nsICookieManager2).QueryInterface(Ci.nsICookieManager);
+ return Cookie.prototype.cookieManager = cman;
+ },
+ belongsTo: function(host, path) {
+ if (path && this.path && path.indexOf(this.path) != 0) return false;
+ if (host == this.rawHost) return true;
+ var d = this.domain;
+ return d && (host == d || this.isDomain && host.slice(-d.length) == d);
+ },
+ save: function() {
+ this.save = ("cookieExists" in this.cookieManager)
+ ? function() { this.cookieManager.add(this.host, this.path, this.name, this.value, this.secure, this.httponly, this.session, this.expires); }
+ : function() { this.cookieManager.add(this.host, this.path, this.name, this.value, this.secure, this.session, this.expires);}
+ ;
+ return this.save();
+ },
+ exists: function() {
+ var cc = this.cookieManager.enumerator;
+ while(cc.hasMoreElements()) {
+ if (this.sameAs(cc.getNext())) return true;
+ }
+ return false;
+ },
+
+ sameAs: function(c) {
+ (c instanceof Ci.nsICookie) && (c instanceof Ci.nsICookie2);
+ return Cookie.computeId(c) == this.id;
+ },
+
+ // nsICookie2 interface extras
+ get isSecure() { return this.secure; },
+ get expiry() { return this.expires; },
+ get isSession() { return this.session; },
+ get isHttpOnly() { return this.httponly; },
+ get isDomain() { return this.domain && this.domain[0] == '.'; },
+ policy: 0,
+ status: 0,
+ QueryInterface: xpcom_generateQI([Ci.nsICookie, Ci.nsICookie2])
+
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/HTTPS.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/HTTPS.js
new file mode 100644
index 0000000..c39a0ef
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/HTTPS.js
@@ -0,0 +1,296 @@
+INCLUDE('Cookie');
+// XXX: Disable STS for now.
+var STS = {
+ isSTSURI : function(uri) {
+ return false;
+ }
+};
+
+// Hack. We only need the part of the policystate that tracks content
+// policy loading.
+const PolicyState = {
+ attach: function(channel) {
+ IOUtil.attachToChannel(channel, "httpseverywhere.policyLoaded", true);
+ },
+
+ extract: function(channel) {
+ var res = IOUtil.extractFromChannel(channel,
+ "httpseverywhere.policyLoaded", true);
+ return res;
+ },
+};
+
+const HTTPS = {
+ ready: false,
+
+ secureCookies: true,
+ secureCookiesExceptions: null,
+ secureCookiesForced: null,
+ httpsForced: null,
+ httpsForcedExceptions: null,
+ httpsRewrite: null,
+
+ replaceChannel: function(applicable_list, channel) {
+ var blob = HTTPSRules.rewrittenURI(applicable_list, channel.URI.clone());
+ if (null == blob) return false; // no rewrite
+ var uri = blob.newuri;
+ if (!uri) this.log(WARN, "OH NO BAD ARGH\nARGH");
+
+ var c2 = channel.QueryInterface(CI.nsIHttpChannel);
+ this.log(DBUG, channel.URI.spec+": Redirection limit is " + c2.redirectionLimit);
+ // XXX This used to be (c2.redirectionLimit == 1), but that's very
+ // inefficient in a case (eg amazon) where this may happen A LOT.
+ // Rather than number like 10, we should use the starting value
+ // in network.http.redirection-limit minus some counter
+ if (c2.redirectionLimit < 10) {
+ this.log(WARN, "Redirection loop trying to set HTTPS on:\n " +
+ channel.URI.spec +"\n(falling back to HTTP)");
+ if (!blob.applied_ruleset) {
+ this.log(WARN,"Blacklisting rule for: " + channel.URI.spec);
+ https_everywhere_blacklist[channel.URI.spec] = true;
+ }
+ https_everywhere_blacklist[channel.URI.spec] = blob.applied_ruleset;
+ var domain = null;
+ try { domain = channel.URI.host; } catch (e) {}
+ if (domain) https_blacklist_domains[domain] = true;
+ return false;
+ }
+
+ // Check for the new internal redirect API. If it exists, use it.
+ if (!"redirectTo" in channel) {
+ this.log(WARN, "nsIHTTPChannel.redirectTo API is missing. This version of HTTPS Everywhere is useless!!!!\n!!!\n");
+ return false;
+ }
+
+ this.log(INFO, "Using nsIHttpChannel.redirectTo: " + channel.URI.spec + " -> " + uri.spec);
+ try {
+ channel.redirectTo(uri);
+ return true;
+ } catch(e) {
+ // This should not happen. We should only get exceptions if
+ // the channel was already open.
+ this.log(WARN, "Exception on nsIHttpChannel.redirectTo: "+e);
+
+ // Don't return: Fallback to NoScript ChannelReplacement.js
+ }
+ this.log(WARN,"Aborting redirection " + channel.name + ", should be HTTPS!");
+ IOUtil.abort(channel);
+ return false;
+ },
+
+ // getApplicableListForContext was remove along with the nsIContentPolicy
+ // bindings and the and forceURI path that used them.
+
+ onCrossSiteRequest: function(channel, origin, browser, rw) {
+ try {
+ this.handleCrossSiteCookies(channel, origin, browser);
+ } catch(e) {
+ this.log(WARN, e + " --- " + e.stack);
+ }
+ },
+
+ registered: false,
+ handleSecureCookies: function(req) {
+
+ try {
+ req = req.QueryInterface(CI.nsIHttpChannel);
+ } catch(e) {
+ this.log(WARN, "Request is not an nsIHttpChannel: " + req);
+ return;
+ }
+ if (!this.secureCookies) return;
+ var uri = req.URI;
+ if (!uri) {
+ this.log(WARN,"No URI inside request " +req);
+ return;
+ }
+ //this.log(DBUG, "Cookie hunting in " + uri.spec);
+ var alist = HTTPSEverywhere.instance.getApplicableListForChannel(req);
+ if (!alist)
+ this.log(INFO, "No alist for cookies for "+(req.URI) ? req.URI.spec : "???");
+
+ if (uri.schemeIs("https")) {
+ var host = uri.host;
+ try {
+ var cookies = req.getResponseHeader("Set-Cookie");
+ } catch(mayHappen) {
+ //this.log(VERB,"Exception hunting Set-Cookie in headers: " + mayHappen);
+ return;
+ }
+ if (!cookies) return;
+ var c;
+ for each (var cs in cookies.split("\n")) {
+ this.log(DBUG, "Examining cookie: ");
+ c = new Cookie(cs, host);
+ if (!c.secure && HTTPSRules.shouldSecureCookie(alist, c, true)) {
+ this.log(INFO, "Securing cookie: " + c.domain + " " + c.name);
+ c.secure = true;
+ req.setResponseHeader("Set-Cookie", c.source + ";Secure", true);
+ }
+ }
+
+ }
+ },
+
+ handleInsecureCookie: function(c) {
+ if (HTTPSRules.shouldSecureCookie(null, c, false)) {
+ this.log(INFO, "Securing cookie from event: " + c.domain + " " + c.name);
+ var cookieManager = Components.classes["@mozilla.org/cookiemanager;1"]
+ .getService(Components.interfaces.nsICookieManager2);
+ //some braindead cookies apparently use umghzabilliontrabilions
+ var expiry = Math.min(c.expiry, Math.pow(2,31));
+ cookieManager.remove(c.host, c.name, c.path, false);
+ cookieManager.add(c.host, c.path, c.name, c.value, true, c.isHTTPOnly, c.isSession, expiry);
+ }
+ },
+
+ handleCrossSiteCookies: function(req, origin, browser) {
+
+ var unsafeCookies = this.getUnsafeCookies(browser);
+ if (!unsafeCookies) return;
+
+ var uri = req.URI;
+ var dscheme = uri.scheme;
+
+ var oparts = origin && origin.match(/^(https?):\/\/([^\/:]+).*?(\/.*)/);
+ if (!(oparts && /https?/.test(dscheme))) return;
+
+ var oscheme = oparts[1];
+ if (oscheme == dscheme) return; // we want to check only cross-scheme requests
+
+ var dsecure = dscheme == "https";
+
+ if (dsecure && !ns.getPref("secureCookies.recycle", false)) return;
+
+ var dhost = uri.host;
+ var dpath = uri.path;
+
+ var ohost = oparts[2];
+ var opath = oparts[3];
+
+ var ocookieCount = 0, totCount = 0;
+ var dcookies = [];
+ var c;
+
+ for (var k in unsafeCookies) {
+ c = unsafeCookies[k];
+ if (!c.exists()) {
+ delete unsafeCookies[k];
+ } else {
+ totCount++;
+ if (c.belongsTo(dhost, dpath) && c.secure != dsecure) { // either secure on http or not secure on https
+ dcookies.push(c);
+ }
+ if (c.belongsTo(ohost, opath)) {
+ ocookieCount++;
+ }
+ }
+ }
+
+ if (!totCount) {
+ this.setUnsafeCookies(browser, null);
+ return;
+ }
+
+ // We want to "desecurify" cookies only if cross-navigation to unsafe
+ // destination originates from a site sharing some secured cookies
+
+ if (ocookieCount == 0 && !dsecure || !dcookies.length) return;
+
+ if (dsecure) {
+ this.log(WARN,"Detected cross-site navigation with secured cookies: " + origin + " -> " + uri.spec);
+
+ } else {
+ this.log(WARN,"Detected unsafe navigation with NoScript-secured cookies: " + origin + " -> " + uri.spec);
+ this.log(WARN,uri.prePath + " cannot support secure cookies because it does not use HTTPS. Consider forcing HTTPS for " + uri.host + " in NoScript's Advanced HTTPS options panel.");
+ }
+
+ var cs = CC['@mozilla.org/cookieService;1'].getService(CI.nsICookieService).getCookieString(uri, req);
+
+ for each (c in dcookies) {
+ c.secure = dsecure;
+ c.save();
+ this.log(WARN,"Toggled secure flag on " + c);
+ }
+
+ if (cs) {
+ dcookies.push.apply(
+ dcookies, cs.split(/\s*;\s*/).map(function(cs) { var nv = cs.split("="); return { name: nv.shift(), value: nv.join("=") }; })
+ .filter(function(c) { return dcookies.every(function(x) { return x.name != c.name; }); })
+ );
+ }
+
+ cs = dcookies.map(function(c) { return c.name + "=" + c.value; }).join("; ");
+
+ this.log(WARN,"Sending Cookie for " + dhost + ": " + cs);
+ req.setRequestHeader("Cookie", cs, false); // "false" because merge syntax breaks Cookie header
+ },
+
+
+ cookiesCleanup: function(refCookie) {
+ var downgraded = [];
+
+ var ignored = this.secureCookiesExceptions;
+ var disabled = !this.secureCookies;
+ var bi = DOM.createBrowserIterator();
+ var unsafe, k, c, total, deleted;
+ for (var browser; browser = bi.next();) {
+ unsafe = this.getUnsafeCookies(browser);
+ if (!unsafe) continue;
+ total = deleted = 0;
+ for (k in unsafe) {
+ c = unsafe[k];
+ total++;
+ if (disabled || (refCookie ? c.belongsTo(refCookie.host) : ignored && ignored.test(c.rawHost))) {
+ if (c.exists()) {
+ this.log(WARN,"Cleaning Secure flag from " + c);
+ c.secure = false;
+ c.save();
+ }
+ delete unsafe[k];
+ deleted++;
+ }
+ }
+ if (total == deleted) this.setUnsafeCookies(browser, null);
+ if (!this.cookiesPerTab) break;
+ }
+ },
+
+ get cookiesPerTab() {
+ return ns.getPref("secureCookies.perTab", false);
+ },
+
+ _globalUnsafeCookies: {},
+ getUnsafeCookies: function(browser) {
+ return this.cookiesPerTab
+ ? browser && ns.getExpando(browser, "unsafeCookies")
+ : this._globalUnsafeCookies;
+ },
+ setUnsafeCookies: function(browser, value) {
+ return this.cookiesPerTab
+ ? browser && ns.setExpando(browser, "unsafeCookies", value)
+ : this._globalUnsafeCookies = value;
+ },
+
+ _getParent: function(req, w) {
+ return w && w.frameElement || DOM.findBrowserForNode(w || IOUtil.findWindow(req));
+ }
+
+};
+
+(function () {
+ ["secureCookies", "secureCookiesExceptions", "secureCookiesForced"].forEach(function(p) {
+ var v = HTTPS[p];
+ delete HTTPS[p];
+ HTTPS.__defineGetter__(p, function() {
+ return v;
+ });
+ HTTPS.__defineSetter__(p, function(n) {
+ v = n;
+ if (HTTPS.ready) HTTPS.cookiesCleanup();
+ return v;
+ });
+ });
+})();
+
+HTTPS.ready = true;
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/HTTPSRules.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/HTTPSRules.js
new file mode 100644
index 0000000..ecbaf76
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/HTTPSRules.js
@@ -0,0 +1,762 @@
+// Compilation of RegExps is now delayed until they are first used...
+
+function Rule(from, to) {
+ this.to = to;
+ this.from_c = from; // This will become a RegExp after compilation
+}
+
+function Exclusion(pattern) {
+ this.pattern_c = pattern; // Will become a RegExp after compilation
+}
+
+function CookieRule(host, cookiename) {
+ this.host = host;
+ this.name = cookiename;
+
+ // These will be made during compilation:
+
+ //this.host_c = new RegExp(host);
+ //this.name_c = new RegExp(cookiename);
+}
+
+function RuleSet(id, name, xmlName, match_rule, default_off, platform) {
+ if(xmlName == "WordPress.xml" || xmlName == "Github.xml") {
+ this.log(NOTE, "RuleSet( name="+name+", xmlName="+xmlName+", match_rule="+match_rule+", default_off="+default_off+", platform="+platform+" )");
+ }
+
+ this.id=id;
+ this.on_by_default = true;
+ this.compiled = false;
+ this.name = name;
+ this.xmlName = xmlName;
+ this.notes = "";
+ if (match_rule) this.ruleset_match_c = new RegExp(match_rule);
+ else this.ruleset_match_c = null;
+ if (default_off) {
+ // Perhaps problematically, this currently ignores the actual content of
+ // the default_off XML attribute. Ideally we'd like this attribute to be
+ // "valueless"
+ this.notes = default_off;
+ this.on_by_default = false;
+ }
+ if (platform)
+ if (platform.search(HTTPSRules.localPlatformRegexp) == -1) {
+ this.on_by_default = false;
+ this.notes = "Only for " + platform;
+ }
+
+ this.rules = [];
+ this.exclusions = [];
+ this.cookierules = [];
+
+ this.rule_toggle_prefs = HTTPSEverywhere.instance.rule_toggle_prefs;
+
+ try {
+ // if this pref exists, use it
+ this.active = this.rule_toggle_prefs.getBoolPref(name);
+ } catch(e) {
+ // if not, use the default
+ this.active = this.on_by_default;
+ }
+}
+
+var dom_parser = Cc["@mozilla.org/xmlextras/domparser;1"].createInstance(Ci.nsIDOMParser);
+
+RuleSet.prototype = {
+
+ ensureCompiled: function() {
+ // Postpone compilation of exclusions, rules and cookies until now, to accelerate
+ // browser load time.
+ if (this.compiled) return;
+ var i;
+
+ for (i = 0; i < this.exclusions.length; ++i) {
+ this.exclusions[i].pattern_c = new RegExp(this.exclusions[i].pattern_c);
+ }
+ for (i = 0; i < this.rules.length; ++i) {
+ this.rules[i].from_c = new RegExp(this.rules[i].from_c);
+ }
+
+ for (i = 0; i < this.cookierules.length; i++) {
+ var cr = this.cookierules[i];
+ cr.host_c = new RegExp(cr.host);
+ cr.name_c = new RegExp(cr.name);
+ }
+
+ this.compiled = true;
+ },
+
+ apply: function(urispec) {
+ // return null if it does not apply
+ // and the new url if it does apply
+ var i;
+ var returl = null;
+ this.ensureCompiled();
+ // If a rulset has a match_rule and it fails, go no further
+ if (this.ruleset_match_c && !this.ruleset_match_c.test(urispec)) {
+ this.log(VERB, "ruleset_match_c excluded " + urispec);
+ return null;
+ }
+ // Even so, if we're covered by an exclusion, go home
+ for (i = 0; i < this.exclusions.length; ++i) {
+ if (this.exclusions[i].pattern_c.test(urispec)) {
+ this.log(DBUG,"excluded uri " + urispec);
+ return null;
+ }
+ }
+ // Okay, now find the first rule that triggers
+ for (i = 0; i < this.rules.length; ++i) {
+ // This is just for displaying inactive rules
+ returl = urispec.replace(this.rules[i].from_c, this.rules[i].to);
+ if (returl != urispec) return returl;
+ }
+
+ return null;
+ },
+ log: function(level, msg) {
+ https_everywhereLog(level, msg);
+ },
+
+ wouldMatch: function(hypothetical_uri, alist) {
+ // return true if this ruleset would match the uri, assuming it were http
+ // used for judging moot / inactive rulesets
+ // alist is optional
+
+ // if the ruleset is already somewhere in this applicable list, we don't
+ // care about hypothetical wouldMatch questions
+ if (alist && (this.name in alist.all)) return false;
+
+ this.log(DBUG,"Would " +this.name + " match " +hypothetical_uri.spec +
+ "? serial " + (alist && alist.serial));
+
+ var uri = hypothetical_uri.clone();
+ if (uri.scheme == "https") uri.scheme = "http";
+ var urispec = uri.spec;
+
+ this.ensureCompiled();
+
+ if (this.ruleset_match_c && !this.ruleset_match_c.test(urispec))
+ return false;
+
+ for (var i = 0; i < this.exclusions.length; ++i)
+ if (this.exclusions[i].pattern_c.test(urispec)) return false;
+
+ for (var i = 0; i < this.rules.length; ++i)
+ if (this.rules[i].from_c.test(urispec)) return true;
+ return false;
+ },
+
+ transformURI: function(uri) {
+ // If no rule applies, return null; if a rule would have applied but was
+ // inactive, return 0; otherwise, return a fresh uri instance
+ // for the target
+ var newurl = this.apply(uri.spec);
+ if (null == newurl)
+ return null;
+ var newuri = Components.classes["@mozilla.org/network/standard-url;1"].
+ createInstance(CI.nsIStandardURL);
+ newuri.init(CI.nsIStandardURL.URLTYPE_STANDARD, 80,
+ newurl, uri.originCharset, null);
+ newuri = newuri.QueryInterface(CI.nsIURI);
+ return newuri;
+ },
+
+ enable: function() {
+ // Enable us.
+ this.rule_toggle_prefs.setBoolPref(this.name, true);
+ this.active = true;
+ },
+
+ disable: function() {
+ // Disable us.
+ this.rule_toggle_prefs.setBoolPref(this.name, false);
+ this.active = false;
+ },
+
+ toggle: function() {
+ this.active = !this.active;
+ this.rule_toggle_prefs.setBoolPref(this.name, this.active);
+ },
+
+ clear: function() {
+ try {
+ this.rule_toggle_prefs.clearUserPref(this.name);
+ } catch(e) {
+ // this ruleset has never been toggled
+ }
+ this.active = this.on_by_default;
+ }
+};
+
+const RuleWriter = {
+
+ getCustomRuleDir: function() {
+ var loc = "ProfD"; // profile directory
+ var file =
+ CC["@mozilla.org/file/directory_service;1"]
+ .getService(CI.nsIProperties)
+ .get(loc, CI.nsILocalFile)
+ .clone();
+ file.append("HTTPSEverywhereUserRules");
+ // Check for existence, if not, create.
+ if (!file.exists()) {
+ file.create(CI.nsIFile.DIRECTORY_TYPE, 0700);
+ }
+ if (!file.isDirectory()) {
+ // XXX: Arg, death!
+ }
+ return file;
+ },
+
+ chromeToPath: function (aPath) {
+ if (!aPath || !(/^chrome:/.test(aPath)))
+ return; //not a chrome url
+
+ var ios =
+ CC['@mozilla.org/network/io-service;1']
+ .getService(CI.nsIIOService);
+ var uri = ios.newURI(aPath, "UTF-8", null);
+ var cr =
+ CC['@mozilla.org/chrome/chrome-registry;1']
+ .getService(CI.nsIChromeRegistry);
+ var rv = cr.convertChromeURL(uri).spec;
+
+ if (/^file:/.test(rv))
+ rv = this.urlToPath(rv);
+ else
+ rv = this.urlToPath("file://"+rv);
+
+ return rv;
+ },
+
+ urlToPath: function (aPath) {
+ if (!aPath || !/^file:/.test(aPath))
+ return ;
+
+ var ph =
+ CC["@mozilla.org/network/protocol;1?name=file"]
+ .createInstance(CI.nsIFileProtocolHandler);
+ var rv = ph.getFileFromURLSpec(aPath).path;
+
+ return rv;
+ },
+
+ read: function(file, rule_store, ruleset_id) {
+ if (!file.exists())
+ return null;
+ if ((rule_store.targets == null) && (rule_store.targets != {}))
+ this.log(WARN, "TARGETS IS NULL");
+ var data = "";
+ var fstream = CC["@mozilla.org/network/file-input-stream;1"]
+ .createInstance(CI.nsIFileInputStream);
+ var sstream = CC["@mozilla.org/scriptableinputstream;1"]
+ .createInstance(CI.nsIScriptableInputStream);
+ fstream.init(file, -1, 0, 0);
+ sstream.init(fstream);
+
+ var str = sstream.read(4096);
+ while (str.length > 0) {
+ data += str;
+ str = sstream.read(4096);
+ }
+
+ sstream.close();
+ fstream.close();
+ return this.readFromString(data, rule_store, ruleset_id);
+ },
+
+ readFromString: function(data, rule_store, ruleset_id) {
+ try {
+ var xmlruleset = dom_parser.parseFromString(data, "text/xml");
+ } catch(e) { // file has been corrupted; XXX: handle error differently
+ this.log(WARN,"Error in XML data: " + e + "\n" + data);
+ return null;
+ }
+ this.parseOneRuleset(xmlruleset.documentElement, rule_store, ruleset_id);
+ },
+
+ parseOneRuleset: function(xmlruleset, rule_store, ruleset_id) {
+ // Extract an xmlruleset into the rulestore
+ if (!xmlruleset.getAttribute("name")) {
+ this.log(WARN, "This blob: '" + xmlruleset + "' is not a ruleset\n");
+ return null;
+ }
+
+ this.log(DBUG, "Parsing " + xmlruleset.getAttribute("name"));
+
+ var match_rl = xmlruleset.getAttribute("match_rule");
+ var dflt_off = xmlruleset.getAttribute("default_off");
+ var platform = xmlruleset.getAttribute("platform");
+ var rs = new RuleSet(ruleset_id, xmlruleset.getAttribute("name"), xmlruleset.getAttribute("f"), match_rl, dflt_off, platform);
+
+ // see if this ruleset has the same name as an existing ruleset;
+ // if so, this ruleset is ignored; DON'T add or return it.
+ if (rs.name in rule_store.rulesetsByName) {
+ this.log(WARN, "Error: found duplicate rule name " + rs.name);
+ return null;
+ }
+
+ // Add this ruleset id into HTTPSRules.targets if it's not already there.
+ // This should only happen for custom user rules. Built-in rules get
+ // their ids preloaded into the targets map, and have their <target>
+ // tags stripped when the sqlite database is built.
+ var targets = xmlruleset.getElementsByTagName("target");
+ for (var i = 0; i < targets.length; i++) {
+ var host = targets[i].getAttribute("host");
+ if (!host) {
+ this.log(WARN, "<target> missing host in " + xmlruleset.getAttribute("name"));
+ return null;
+ }
+ if (! rule_store.targets[host])
+ rule_store.targets[host] = [];
+ this.log(DBUG, "Adding " + host + " to targets, pointing at " + ruleset_id);
+ rule_store.targets[host].push(ruleset_id);
+ }
+
+ var exclusions = xmlruleset.getElementsByTagName("exclusion");
+ for (var i = 0; i < exclusions.length; i++) {
+ var exclusion = new Exclusion(exclusions[i].getAttribute("pattern"));
+ rs.exclusions.push(exclusion);
+ }
+
+ var rules = xmlruleset.getElementsByTagName("rule");
+ for (var i = 0; i < rules.length; i++) {
+ var rule = new Rule(rules[i].getAttribute("from"),
+ rules[i].getAttribute("to"));
+ rs.rules.push(rule);
+ }
+
+ var securecookies = xmlruleset.getElementsByTagName("securecookie");
+ for (var i = 0; i < securecookies.length; i++) {
+ var c_rule = new CookieRule(securecookies[i].getAttribute("host"),
+ securecookies[i].getAttribute("name"));
+ rs.cookierules.push(c_rule);
+ this.log(DBUG,"Cookie rule "+ c_rule.host+ " " +c_rule.name);
+ }
+
+ rule_store.rulesets.push(rs);
+ rule_store.rulesetsByID[rs.id] = rs;
+ rule_store.rulesetsByName[rs.name] = rs;
+ },
+
+ enumerate: function(dir) {
+ // file is the given directory (nsIFile)
+ var entries = dir.directoryEntries;
+ var ret = [];
+ while(entries.hasMoreElements()) {
+ var entry = entries.getNext();
+ entry.QueryInterface(Components.interfaces.nsIFile);
+ ret.push(entry);
+ }
+ return ret;
+ },
+};
+
+
+
+const HTTPSRules = {
+ init: function() {
+ try {
+ this.rulesets = [];
+ this.targets = {}; // dict mapping target host pattern -> list of
+ // applicable ruleset ids
+ this.rulesetsByID = {};
+ this.rulesetsByName = {};
+ var t1 = new Date().getTime();
+ this.checkMixedContentHandling();
+ var rulefiles = RuleWriter.enumerate(RuleWriter.getCustomRuleDir());
+ this.scanRulefiles(rulefiles);
+
+ // Initialize database connection.
+ var dbFile = new FileUtils.File(RuleWriter.chromeToPath("chrome://https-everywhere/content/rulesets.sqlite"));
+ var rulesetDBConn = Services.storage.openDatabase(dbFile);
+ this.queryForRuleset = rulesetDBConn.createStatement(
+ "select contents from rulesets where id = :id");
+
+ // Preload the mapping of hostname target -> ruleset ID from DB.
+ // This is a little slow (287 ms on a Core2 Duo @ 2.2GHz with SSD),
+ // but is faster than loading all of the rulesets. If this becomes a
+ // bottleneck, change it to load in a background webworker, or load
+ // a smaller bloom filter instead.
+ var targetsQuery = rulesetDBConn.createStatement("select host, ruleset_id from targets");
+ this.log(DBUG, "Loading targets...");
+ while (targetsQuery.executeStep()) {
+ var host = targetsQuery.row.host;
+ var id = targetsQuery.row.ruleset_id;
+ if (!this.targets[host]) {
+ this.targets[host] = [id];
+ } else {
+ this.targets[host].push(id);
+ }
+ }
+ this.log(DBUG, "Loading adding targets.");
+ } catch(e) {
+ this.log(DBUG,"Rules Failed: "+e);
+ }
+ var t2 = new Date().getTime();
+ this.log(NOTE,"Loading targets took " + (t2 - t1) / 1000.0 + " seconds");
+
+ var gitCommitQuery = rulesetDBConn.createStatement("select git_commit from git_commit");
+ if (gitCommitQuery.executeStep()) {
+ this.GITCommitID = gitCommitQuery.row.git_commit;
+ }
+
+ try {
+ if (HTTPSEverywhere.instance.prefs.getBoolPref("performance_tests")) {
+ this.testRulesetRetrievalPerformance();
+ }
+ } catch(e) {
+ this.log(WARN, "Exception during testing " + e);
+ }
+ return;
+ },
+
+ checkMixedContentHandling: function() {
+ // Firefox 23+ blocks mixed content by default, so rulesets that create
+ // mixed content situations should be disabled there
+ var appInfo = CC["@mozilla.org/xre/app-info;1"].getService(CI.nsIXULAppInfo);
+ var platformVer = appInfo.platformVersion;
+ var versionChecker = CC["@mozilla.org/xpcom/version-comparator;1"]
+ .getService(CI.nsIVersionComparator);
+ var prefs = Components.classes["@mozilla.org/preferences-service;1"]
+ .getService(Components.interfaces.nsIPrefService).getBranch("");
+
+
+ // If mixed content is present and enabled, and the user hasn't opted to enable
+ // mixed content triggering rules, leave them out. Otherwise add them in.
+ if(versionChecker.compare(appInfo.version, "23.0a1") >= 0
+ && prefs.getBoolPref("security.mixed_content.block_active_content")
+ && !prefs.getBoolPref("extensions.https_everywhere.enable_mixed_rulesets")) {
+ this.log(INFO, "Not activating rules that trigger mixed content errors.");
+ this.localPlatformRegexp = new RegExp("firefox");
+ } else {
+ this.log(INFO, "Activating rules that would normally trigger mixed content");
+ this.localPlatformRegexp = new RegExp("(firefox|mixedcontent)");
+ }
+ },
+
+ scanRulefiles: function(rulefiles) {
+ var i = 0;
+ var r = null;
+ for(i = 0; i < rulefiles.length; ++i) {
+ try {
+ this.log(DBUG,"Loading ruleset file: "+rulefiles[i].path);
+ var ruleset_id = "custom_" + i;
+ RuleWriter.read(rulefiles[i], this, ruleset_id);
+ } catch(e) {
+ this.log(WARN, "Error in ruleset file: " + e);
+ if (e.lineNumber)
+ this.log(WARN, "(line number: " + e.lineNumber + ")");
+ }
+ }
+ },
+
+ resetRulesetsToDefaults: function() {
+ // Callable from within the prefs UI and also for cleaning up buggy
+ // configurations...
+ for (var i in this.rulesets) {
+ this.rulesets[i].clear();
+ }
+ },
+
+ rewrittenURI: function(alist, input_uri) {
+ // This function oversees the task of working out if a uri should be
+ // rewritten, what it should be rewritten to, and recordkeeping of which
+ // applicable rulesets are and aren't active. Previously this returned
+ // the new uri if there was a rewrite. Now it returns a JS object with a
+ // newuri attribute and an applied_ruleset attribute (or null if there's
+ // no rewrite).
+ var i = 0;
+ userpass_present = false; // Global so that sanitiseURI can tweak it.
+ // Why does JS have no tuples, again?
+ var blob = {}; blob.newuri = null;
+ if (!alist) this.log(DBUG, "No applicable list rewriting " + input_uri.spec);
+ this.log(NOTE, "Processing " + input_uri.spec);
+
+ var uri = this.sanitiseURI(input_uri);
+
+ // Get the list of rulesets that target this host
+ try {
+ var rs = this.potentiallyApplicableRulesets(uri.host);
+ } catch(e) {
+ this.log(NOTE, 'Could not check applicable rules for '+uri.spec + '\n'+e);
+ return null;
+ }
+
+ // ponder each potentially applicable ruleset, working out if it applies
+ // and recording it as active/inactive/moot/breaking in the applicable list
+ for (i = 0; i < rs.length; ++i) {
+ if (!rs[i].active) {
+ if (alist && rs[i].wouldMatch(uri, alist))
+ alist.inactive_rule(rs[i]);
+ continue;
+ }
+ blob.newuri = rs[i].transformURI(uri);
+ if (blob.newuri) {
+ // we rewrote the uri
+ this.log(DBUG, "Rewrote "+input_uri.spec);
+ if (alist) {
+ if (uri.spec in https_everywhere_blacklist)
+ alist.breaking_rule(rs[i]);
+ else
+ alist.active_rule(rs[i]);
+ }
+ if (userpass_present) blob.newuri.userPass = input_uri.userPass;
+ blob.applied_ruleset = rs[i];
+ return blob;
+ }
+ if (uri.scheme == "https" && alist) {
+ // we didn't rewrite but the rule applies to this domain and the
+ // requests are going over https
+ if (rs[i].wouldMatch(uri, alist)) alist.moot_rule(rs[i]);
+ continue;
+ }
+ }
+ return null;
+ },
+
+ sanitiseURI: function(input_uri) {
+ // Rulesets shouldn't try to parse usernames and passwords. If we find
+ // those, apply the ruleset without them (and then add them back later).
+ // When .userPass is absent, sometimes it is false and sometimes trying
+ // to read it raises an exception (probably depending on the URI type).
+ var uri = input_uri;
+ try {
+ if (input_uri.userPass) {
+ uri = input_uri.clone();
+ userpass_present = true; // tweaking a global in our caller :(
+ uri.userPass = null;
+ }
+ } catch(e) {}
+
+ // example.com. is equivalent to example.com
+ // example.com.. is invalid, but firefox would load it anyway
+ try {
+ if (uri.host)
+ try {
+ var h = uri.host;
+ if (h.charAt(h.length - 1) == ".") {
+ while (h.charAt(h.length - 1) == ".")
+ h = h.slice(0,-1);
+ uri = uri.clone();
+ uri.host = h;
+ }
+ } catch(e) {
+ this.log(WARN, "Failed to normalise domain: ");
+ try {this.log(WARN, input_uri.host);}
+ catch(e2) {this.log(WARN, "bang" + e + " & " + e2 + " & "+ input_uri);}
+ }
+ } catch(e3) {
+ this.log(INFO, "uri.host is explosive!");
+ try { this.log(INFO, "(" + uri.spec + ")"); } // happens for about: uris and soforth
+ catch(e4) { this.log(WARN, "(and unprintable!!!!!!)"); }
+ }
+ return uri;
+ },
+
+ setInsert: function(intoList, fromList) {
+ // Insert any elements from fromList into intoList, if they are not
+ // already there. fromList may be null.
+ if (!fromList) return;
+ for (var i = 0; i < fromList.length; i++)
+ if (intoList.indexOf(fromList[i]) == -1)
+ intoList.push(fromList[i]);
+ },
+
+ loadAllRulesets: function() {
+ for (var host in this.targets) {
+ var ruleset_ids = this.targets[host];
+ for (var i = 0; i < ruleset_ids.length; i++) {
+ var id = ruleset_ids[i];
+ if (!this.rulesetsByID[id]) {
+ this.loadRulesetById(id);
+ }
+ }
+ }
+ },
+
+ // Load a ruleset by numeric id, e.g. 234
+ // NOTE: This call runs synchronously, which can lock up the browser UI. Is
+ // there any way to fix that, given that we need to run blocking in the request
+ // flow? Perhaps we can preload all targets from the DB into memory at startup
+ // so we only hit the DB when we know there is something to be had.
+ loadRulesetById: function(ruleset_id) {
+ this.log(DBUG, "Querying DB for ruleset id " + ruleset_id);
+ this.queryForRuleset.params.id = ruleset_id;
+
+ try {
+ if (this.queryForRuleset.executeStep()) {
+ this.log(INFO, "Found ruleset in DB for id " + ruleset_id);
+ RuleWriter.readFromString(this.queryForRuleset.row.contents, this, ruleset_id);
+ } else {
+ this.log(WARN,"Couldn't find ruleset for id " + ruleset_id);
+ }
+ } finally {
+ this.queryForRuleset.reset();
+ }
+ },
+
+ // Get all rulesets matching a given target, lazy-loading from DB as necessary.
+ rulesetsByTarget: function(target) {
+ var rulesetIds = this.targets[target];
+
+ var output = [];
+ if (rulesetIds) {
+ this.log(INFO, "For target " + target + ", found ids " + rulesetIds.toString());
+ for (var i = 0; i < rulesetIds.length; i++) {
+ var id = rulesetIds[i];
+ if (!this.rulesetsByID[id]) {
+ this.loadRulesetById(id);
+ }
+ if (this.rulesetsByID[id]) {
+ output.push(this.rulesetsByID[id]);
+ }
+ }
+ } else {
+ this.log(INFO, "For target " + target + ", found no ids in DB");
+ }
+ return output;
+ },
+
+ potentiallyApplicableRulesets: function(host) {
+ // Return a list of rulesets that declare targets matching this host
+ var i, tmp, t;
+ var results = [];
+
+ var attempt = function(target) {
+ this.setInsert(results, this.rulesetsByTarget(target));
+ }.bind(this);
+
+ attempt(host);
+
+ // replace each portion of the domain with a * in turn
+ var segmented = host.split(".");
+ for (i = 0; i < segmented.length; ++i) {
+ tmp = segmented[i];
+ segmented[i] = "*";
+ t = segmented.join(".");
+ segmented[i] = tmp;
+ attempt(t);
+ }
+ // now eat away from the left, with *, so that for x.y.z.google.com we
+ // check *.z.google.com and *.google.com (we did *.y.z.google.com above)
+ for (i = 2; i <= segmented.length - 2; ++i) {
+ t = "*." + segmented.slice(i,segmented.length).join(".");
+ attempt(t);
+ }
+ this.log(DBUG,"Potentially applicable rules for " + host + ":");
+ for (i = 0; i < results.length; ++i)
+ this.log(DBUG, " " + results[i].name);
+ return results;
+ },
+
+ testRulesetRetrievalPerformance: function() {
+ // We can use this function to measure the impact of changes in the ruleset
+ // storage architecture, potentiallyApplicableRulesets() caching
+ // implementations, etc.
+ var req = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
+ .createInstance(Ci.nsIXMLHttpRequest);
+ req.open("GET", "https://eff.org/files/alexa-top-10000-global.txt", false);
+ req.send();
+ var domains = req.response.split("\n");
+ var domains_l = domains.length - 1; // The last entry in this thing is bogus
+ var prefix = "";
+ this.log(WARN, "Calling potentiallyApplicableRulesets() with " + domains_l + " domains");
+ var count = 0;
+ var t1 = new Date().getTime();
+ for (var n = 0; n < domains_l; n++) {
+ if (this.potentiallyApplicableRulesets(prefix + domains[n]).length != 0)
+ count++;
+ }
+ var t2 = new Date().getTime();
+ this.log(NOTE, count + " hits: average call to potentiallyApplicableRulesets took " + (t2 - t1) / domains_l + " milliseconds");
+ count = 0;
+ t1 = new Date().getTime();
+ for (var n = 0; n < domains_l; n++) {
+ if (this.potentiallyApplicableRulesets(prefix + domains[n]).length != 0)
+ count++;
+ }
+ t2 = new Date().getTime();
+ this.log(NOTE, count + " hits: average subsequent call to potentiallyApplicableRulesets took " + (t2 - t1) / domains_l + " milliseconds");
+ },
+
+ shouldSecureCookie: function(applicable_list, c, known_https) {
+ // Check to see if the Cookie object c meets any of our cookierule citeria
+ // for being marked as secure.
+ // @applicable_list : an ApplicableList or record keeping
+ // @c : an nsICookie2
+ // @known_https : true if we know the page setting the cookie is https
+
+ this.log(DBUG," rawhost: " + c.rawHost + "\n name: " + c.name + "\n host" + c.host);
+ var i,j;
+ var rs = this.potentiallyApplicableRulesets(c.host);
+ for (i = 0; i < rs.length; ++i) {
+ var ruleset = rs[i];
+ if (ruleset.active) {
+ ruleset.ensureCompiled();
+ // Never secure a cookie if this page might be HTTP
+ if (!known_https && !this.safeToSecureCookie(c.rawHost))
+ continue;
+ for (j = 0; j < ruleset.cookierules.length; j++) {
+ var cr = ruleset.cookierules[j];
+ if (cr.host_c.test(c.host) && cr.name_c.test(c.name)) {
+ if (applicable_list) applicable_list.active_rule(ruleset);
+ this.log(INFO,"Active cookie rule " + ruleset.name);
+ return true;
+ }
+ }
+ if (ruleset.cookierules.length > 0)
+ if (applicable_list) applicable_list.moot_rule(ruleset);
+ } else if (ruleset.cookierules.length > 0) {
+ if (applicable_list) applicable_list.inactive_rule(ruleset);
+ this.log(INFO,"Inactive cookie rule " + ruleset.name);
+ }
+ }
+ return false;
+ },
+
+ safeToSecureCookie: function(domain) {
+ // Check if the domain might be being served over HTTP. If so, it isn't
+ // safe to secure a cookie! We can't always know this for sure because
+ // observing cookie-changed doesn't give us enough context to know the
+ // full origin URI.
+
+ // First, if there are any redirect loops on this domain, don't secure
+ // cookies. XXX This is not a very satisfactory heuristic. Sometimes we
+ // would want to secure the cookie anyway, because the URLs that loop are
+ // not authenticated or not important. Also by the time the loop has been
+ // observed and the domain blacklisted, a cookie might already have been
+ // flagged as secure.
+
+ if (domain in https_blacklist_domains) {
+ this.log(INFO, "cookies for " + domain + "blacklisted");
+ return false;
+ }
+
+ // If we passed that test, make up a random URL on the domain, and see if
+ // we would HTTPSify that.
+
+ try {
+ var nonce_path = "/" + Math.random().toString();
+ nonce_path = nonce_path + nonce_path;
+ var test_uri = "http://" + domain + nonce_path;
+ } catch (e) {
+ this.log(WARN, "explosion in safeToSecureCookie for " + domain + "\n"
+ + "(" + e + ")");
+ return false;
+ }
+
+ this.log(INFO, "Testing securecookie applicability with " + test_uri);
+ var rs = this.potentiallyApplicableRulesets(domain);
+ for (var i = 0; i < rs.length; ++i) {
+ if (!rs[i].active) continue;
+ var rewrite = rs[i].apply(test_uri);
+ if (rewrite) {
+ this.log(INFO, "Yes: " + rewrite);
+ return true;
+ }
+ }
+ this.log(INFO, "(NO)");
+ return false;
+ }
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/IOUtil.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/IOUtil.js
new file mode 100644
index 0000000..96c2500
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/IOUtil.js
@@ -0,0 +1,263 @@
+const IO = {
+ readFile: function(file, charset) {
+ var res;
+
+ const is = Cc["@mozilla.org/network/file-input-stream;1"]
+ .createInstance(Ci.nsIFileInputStream );
+ is.init(file ,0x01, 256 /*0400*/, null);
+ const sis = Cc["@mozilla.org/scriptableinputstream;1"]
+ .createInstance(Ci.nsIScriptableInputStream);
+ sis.init(is);
+
+ res = sis.read(sis.available());
+ is.close();
+
+ if (charset !== null) { // use "null" if you want uncoverted data...
+ const unicodeConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]
+ .createInstance(Ci.nsIScriptableUnicodeConverter);
+ try {
+ unicodeConverter.charset = charset || "UTF-8";
+ } catch(ex) {
+ unicodeConverter.charset = "UTF-8";
+ }
+ res = unicodeConverter.ConvertToUnicode(res);
+ }
+
+ return res;
+ },
+ writeFile: function(file, content, charset) {
+ const unicodeConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]
+ .createInstance(Ci.nsIScriptableUnicodeConverter);
+ try {
+ unicodeConverter.charset = charset || "UTF-8";
+ } catch(ex) {
+ unicodeConverter.charset = "UTF-8";
+ }
+
+ content = unicodeConverter.ConvertFromUnicode(content);
+ const os = Cc["@mozilla.org/network/file-output-stream;1"]
+ .createInstance(Ci.nsIFileOutputStream);
+ os.init(file, 0x02 | 0x08 | 0x20, 448 /*0700*/, 0);
+ os.write(content, content.length);
+ os.close();
+ },
+
+ safeWriteFile: function(file, content, charset) {
+ var tmp = file.clone();
+ var name = file.leafName;
+ tmp.leafName = name + ".tmp";
+ tmp.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, file.exists() ? file.permissions : 384 /*0600*/);
+ this.writeFile(tmp, content, charset);
+ tmp.moveTo(file.parent, name);
+ }
+};
+
+
+function nsISupportsWrapper(wrapped) {
+ this.wrappedJSObject = wrapped;
+}
+nsISupportsWrapper.prototype = {
+ QueryInterface: xpcom_generateQI([])
+};
+
+const IOUtil = {
+ asyncNetworking: true,
+ proxiedDNS: 0,
+
+ attachToChannel: function(channel, key, requestInfo) {
+ if (channel instanceof Ci.nsIWritablePropertyBag2)
+ channel.setPropertyAsInterface(key, requestInfo);
+ },
+ extractFromChannel: function(channel, key, preserve) {
+ if (channel instanceof Ci.nsIPropertyBag2) {
+ let p = channel.get(key);
+ if (p) {
+ if (!preserve && (channel instanceof Ci.nsIWritablePropertyBag)) channel.deleteProperty(key);
+ if (p.wrappedJSObject) return p.wrappedJSObject;
+ p instanceof Ci.nsIURL || p instanceof Ci.nsIURL;
+ return p;
+ }
+ }
+ return null;
+ },
+
+ extractInternalReferrer: function(channel) {
+ if (channel instanceof Ci.nsIPropertyBag2) {
+ const key = "docshell.internalReferrer";
+ if (channel.hasKey(key))
+ try {
+ return channel.getPropertyAsInterface(key, Ci.nsIURL);
+ } catch(e) {}
+ }
+ return null;
+ },
+ extractInternalReferrerSpec: function(channel) {
+ var ref = this.extractInternalReferrer(channel);
+ return ref && ref.spec || null;
+ },
+
+ getProxyInfo: function(channel) {
+ return Ci.nsIProxiedChannel && (channel instanceof Ci.nsIProxiedChannel)
+ ? channel.proxyInfo
+ : Components.classes["@mozilla.org/network/protocol-proxy-service;1"]
+ .getService(Components.interfaces.nsIProtocolProxyService)
+ .resolve(channel.URI, 0);
+ },
+
+
+ canDoDNS: function(channel) {
+ if (!channel || IOS.offline) return false;
+
+ var proxyInfo = this.getProxyInfo(channel);
+ switch(this.proxiedDNS) {
+ case 1:
+ return !(proxyInfo && (proxyInfo.flags & Ci.nsIProxyInfo.TRANSPARENT_PROXY_RESOLVES_HOST));
+ case 2:
+ return true;
+ default:
+ return !proxyInfo || proxyInfo.type == "direct";
+ }
+
+ },
+
+ abort: function(channel, noNetwork) {
+ channel.cancel(Cr.NS_ERROR_ABORT);
+ },
+
+ findWindow: function(channel) {
+ for each(var cb in [channel.notificationCallbacks,
+ channel.loadGroup && channel.loadGroup.notificationCallbacks]) {
+ if (cb instanceof Ci.nsIInterfaceRequestor) {
+ if (Ci.nsILoadContext) try {
+ // For Gecko 1.9.1
+ return cb.getInterface(Ci.nsILoadContext).associatedWindow;
+ } catch(e) {}
+
+ try {
+ // For Gecko 1.9.0
+ return cb.getInterface(Ci.nsIDOMWindow);
+ } catch(e) {}
+ }
+ }
+ return null;
+ },
+
+ readFile: IO.readFile,
+ writeFile: IO.writeFile,
+ safeWriteFIle: IO.safeWriteFile,
+
+ _protocols: {}, // caching them we gain a 33% speed boost in URI creation :)
+ newURI: function(url) {
+ try {
+ let scheme = url.substring(0, url.indexOf(':'));
+ return (this._protocols[scheme] ||
+ (this._protocols[scheme] =
+ Cc["@mozilla.org/network/protocol;1?name=" + scheme]
+ .getService(Ci.nsIProtocolHandler)))
+ .newURI(url, null, null);
+ } catch(e) {
+ return IOS.newURI(url, null, null);
+ }
+ },
+
+ unwrapURL: function(url) {
+ try {
+ if (!(url instanceof Ci.nsIURI))
+ url = this.newURI(url);
+
+ switch (url.scheme) {
+ case "view-source":
+ return this.unwrapURL(url.path);
+ case "feed":
+ let u = url.spec.substring(5);
+ if (u.substring(0, 2) == '//') u = "http:" + u;
+ return this.unwrapURL(u);
+ case "wyciwyg":
+ return this.unwrapURL(url.path.replace(/^\/\/\d+\//, ""));
+ case "jar":
+ if (url instanceof Ci.nsIJARURI)
+ return this.unwrapURL(url.JARFile);
+ }
+ }
+ catch (e) {}
+
+ return url;
+ },
+
+
+ get _channelFlags() {
+ delete this._channelFlags;
+ const constRx = /^[A-Z_]+$/;
+ const ff = {};
+ [Ci.nsIHttpChannel, Ci.nsICachingChannel].forEach(function(c) {
+ for (var p in c) {
+ if (constRx.test(p)) ff[p] = c[p];
+ }
+ });
+ return this._channelFlags = ff;
+ },
+ humanFlags: function(loadFlags) {
+ var hf = [];
+ var c = this._channelFlags;
+ for (var p in c) {
+ if (loadFlags & c[p]) hf.push(p + "=" + c[p]);
+ }
+ return hf.join("\n");
+ },
+
+ queryNotificationCallbacks: function(chan, iid) {
+ var cb;
+ try {
+ cb = chan.notificationCallbacks.getInterface(iid);
+ if (cb) return cb;
+ } catch(e) {}
+
+ try {
+ return chan.loadGroup && chan.loadGroup.notificationCallbacks.getInterface(iid);
+ } catch(e) {}
+
+ return null;
+ },
+
+
+ anonymizeURI: function(uri, cookie) {
+ if (uri instanceof Ci.nsIURL) {
+ uri.query = this.anonymizeQS(uri.query, cookie);
+ } else return this.anonymizeURL(uri, cookie);
+ return uri;
+ },
+ anonymizeURL: function(url, cookie) {
+ var parts = url.split("?");
+ if (parts.length < 2) return url;
+ parts[1] = this.anonymizeQS(parts[1], cookie);
+ return parts.join("?");
+ },
+
+ _splitName: function(nv) nv.split("=")[0],
+ _qsRx: /[&=]/,
+ _anonRx: /(?:auth|s\w+(?:id|key)$)/,
+ anonymizeQS: function(qs, cookie) {
+ if (!qs) return qs;
+ if (!this._qsRx.test(qs)) return '';
+
+ var cookieNames, hasCookies;
+ if ((hasCookies = !!cookie)) cookieNames = cookie.split(/\s*;\s*/).map(this._splitName);
+
+ let parms = qs.split("&");
+ for (j = parms.length; j-- > 0;) {
+ let nv = parms[j].split("=");
+ let name = nv[0];
+ if (this._anonRx.test(name) || cookie && cookieNames.indexOf(name) > -1)
+ parms.splice(j, 1);
+ }
+ return parms.join("&");
+ },
+
+ get TLDService() {
+ delete this.TLDService;
+ return this.TLDService = Cc["@mozilla.org/network/effective-tld-service;1"].getService(Ci.nsIEffectiveTLDService);
+ }
+
+};
+
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/NSS.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/NSS.js
new file mode 100644
index 0000000..97a7e78
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/NSS.js
@@ -0,0 +1,491 @@
+// Copyright (c) 2011 Moxie Marlinspike <moxie@thoughtcrime.org>
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 3 of the
+// License, or (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+// USA
+
+
+/**
+ * This class manages the ctypes bridge to the NSS (crypto) libraries
+ * distributed with Mozilla.
+ *
+ **/
+
+function NSS() {
+
+}
+
+NSS.initialize = function(nssPath) {
+ var sharedLib;
+
+ try {
+ sharedLib = ctypes.open(nssPath);
+ } catch (e) {
+ dump("Failed to find nss3 in installed directory, checking system paths.\n");
+ sharedLib = ctypes.open(ctypes.libraryName("nss3"));
+ }
+
+ NSS.types = new Object();
+
+ NSS.types.CERTDistNames = ctypes.StructType("CERTDistNames");
+
+ NSS.types.SECItem = ctypes.StructType("SECItem",
+ [{'type' : ctypes.int},
+ {'data' : ctypes.unsigned_char.ptr},
+ {'len' : ctypes.uint32_t}]);
+
+ NSS.types.PLArenaPool = ctypes.StructType("PLArenaPool");
+
+ NSS.types.CERTCertificateList = ctypes.StructType("CERTCertificateList",
+ [{'certs' : NSS.types.SECItem.ptr},
+ {'len' : ctypes.int},
+ {'arena' : NSS.types.PLArenaPool.ptr}]),
+
+ NSS.types.CERTAVA = ctypes.StructType("CERTAVA",
+ [{'type' : NSS.types.SECItem},
+ {'value' : NSS.types.SECItem}]);
+
+ NSS.types.CERTRDN = ctypes.StructType("CERTRDN",
+ [{'avas' : NSS.types.CERTAVA.ptr.ptr}]);
+
+ NSS.types.SECAlgorithmID = ctypes.StructType("SECAlgorithmID",
+ [{'algorithm' : NSS.types.SECItem},
+ {'parameters' : NSS.types.SECItem}]);
+
+ NSS.types.CERTSignedData = ctypes.StructType("CERTSignedData",
+ [{'data' : NSS.types.SECItem},
+ {'signatureAlgorithm' : NSS.types.SECAlgorithmID},
+ {'signature' : NSS.types.SECItem}]);
+
+ NSS.types.CERTOKDomainName = ctypes.StructType("CERTOKDomainName");
+
+ NSS.types.NSSCertificateStr = ctypes.StructType("NSSCertificateStr");
+
+ NSS.types.CERTAuthKeyID = ctypes.StructType("CERTAuthKeyID");
+
+ NSS.types.CERTName = ctypes.StructType("CERTName",
+ [{'arena' : ctypes.voidptr_t},
+ {'rdns' : NSS.types.CERTRDN.ptr.ptr}]);
+
+ NSS.types.CERTValidity = ctypes.StructType("CERTValidity",
+ [{'arena' : ctypes.voidptr_t},
+ {'notBefore' : NSS.types.SECItem},
+ {'notAfter' : NSS.types.SECItem}]);
+
+ NSS.types.CERTCertExtension = ctypes.StructType("CERTCertExtension",
+ [{'id' : NSS.types.SECItem},
+ {'critical' : NSS.types.SECItem},
+ {'value' : NSS.types.SECItem}]);
+
+ NSS.types.CERTCertDBHandle = ctypes.StructType("CERTCertDBHandle");
+
+ NSS.types.PK11SlotInfo = ctypes.StructType("PK11SlotInfo");
+
+ NSS.types.PK11SlotListElement = ctypes.StructType("PK11SlotListElement",
+ [{'next' : ctypes.StructType("PK11SlotListElement").ptr},
+ {'prev' : ctypes.StructType("PK11SlotListElement").ptr},
+ {'slot' : NSS.types.PK11SlotInfo.ptr},
+ {'refCount' : ctypes.int}]),
+
+ NSS.types.PK11SlotList = ctypes.StructType("PK11SlotList",
+ [{'head' : NSS.types.PK11SlotListElement.ptr},
+ {'tail' : NSS.types.PK11SlotListElement.ptr},
+ {'lock' : ctypes.StructType("PZLock").ptr}]),
+
+ NSS.types.SECKEYPrivateKey = ctypes.StructType("SECKEYPrivateKey",
+ [{'arena' : NSS.types.PLArenaPool.ptr},
+ {'keyType' : ctypes.int},
+ {'pkcs11Slot' : NSS.types.PK11SlotInfo.ptr},
+ {'pkcs11ID' : ctypes.unsigned_long},
+ {'pkcs11IsTemp' : ctypes.int},
+ {'wincx' : ctypes.voidptr_t},
+ {'staticflags' : ctypes.int32_t}]);
+
+ NSS.types.SECKEYPublicKey = ctypes.StructType("SECKEYPublicKey");
+
+ NSS.types.CERTSubjectPublicKeyInfo = ctypes.StructType("CERTSubjectPublicKeyInfo",
+ [{'arena' : NSS.types.PLArenaPool.ptr},
+ {'algorithm' : NSS.types.SECAlgorithmID},
+ {'subjectPublicKey' : NSS.types.SECItem}]);
+
+ NSS.types.CERTCertificateRequest = ctypes.StructType("CERTCertificateRequest");
+
+ NSS.types.SEC_ASN1Template = ctypes.StructType("SEC_ASN1Template",
+ [{'kind' : ctypes.unsigned_long},
+ {'offset' : ctypes.unsigned_long},
+ {'sub' : ctypes.voidptr_t},
+ {'size' : ctypes.unsigned_int}]);
+
+ NSS.types.PK11RSAGenParams = ctypes.StructType("PK11RSAGenParams",
+ [{'keySizeInBits' : ctypes.int},
+ {'pe' : ctypes.unsigned_long}]);
+
+ NSS.types.CERTCertTrust = ctypes.StructType("CERTCertTrust",
+ [{'sslFlags' : ctypes.uint32_t},
+ {'emailFlags' : ctypes.uint32_t},
+ {'objectSigningFlags' : ctypes.uint32_t}]);
+
+ NSS.types.CERTSubjectList = ctypes.StructType("CERTSubjectList");
+
+ NSS.types.CERTGeneralName = ctypes.StructType("CERTGeneralName");
+
+ NSS.types.CERTCertificate = ctypes.StructType("CERTCertificate",
+ [{'arena' : NSS.types.PLArenaPool.ptr},
+ {'subjectName' : ctypes.char.ptr},
+ {'issuerName' : ctypes.char.ptr},
+ {'signatureWrap' : NSS.types.CERTSignedData},
+ {'derCert' : NSS.types.SECItem},
+ {'derIssuer' : NSS.types.SECItem},
+ {'derSubject' : NSS.types.SECItem},
+ {'derPublicKey' : NSS.types.SECItem},
+ {'certKey' : NSS.types.SECItem},
+ {'version' : NSS.types.SECItem},
+ {'serialNumber' : NSS.types.SECItem},
+ {'signature' : NSS.types.SECAlgorithmID},
+ {'issuer' : NSS.types.CERTName},
+ {'validity' : NSS.types.CERTValidity},
+ {'subject' : NSS.types.CERTName},
+ {'subjectPublicKeyInfo' : NSS.types.CERTSubjectPublicKeyInfo},
+ {'issuerID' : NSS.types.SECItem},
+ {'subjectID' : NSS.types.SECItem},
+ {'extensions' : NSS.types.CERTCertExtension.ptr.ptr},
+ {'emailAddr' : ctypes.char.ptr},
+ {'dbhandle' : NSS.types.CERTCertDBHandle.ptr},
+ {'subjectKeyID' : NSS.types.SECItem},
+ {'keyIDGenerated' : ctypes.int},
+ {'keyUsage' : ctypes.unsigned_int},
+ {'rawKeyUsage' : ctypes.unsigned_int},
+ {'keyUsagePresent' : ctypes.int},
+ {'nsCertType' : ctypes.uint32_t},
+ {'keepSession' : ctypes.int},
+ {'timeOK' : ctypes.int},
+ {'domainOK' : NSS.types.CERTOKDomainName.ptr},
+ {'isperm' : ctypes.int},
+ {'istemp' : ctypes.int},
+ {'nickname' : ctypes.char.ptr},
+ {'dbnickname' : ctypes.char.ptr},
+ {'nssCertificate' : NSS.types.NSSCertificateStr.ptr},
+ {'trust' : NSS.types.CERTCertTrust.ptr},
+ {'referenceCount' : ctypes.int},
+ {'subjectList' : NSS.types.CERTSubjectList.ptr},
+ {'authKeyID' : NSS.types.CERTAuthKeyID.ptr},
+ {'isRoot' : ctypes.int},
+ {'options' : ctypes.voidptr_t},
+ {'series' : ctypes.int},
+ {'slot' : NSS.types.PK11SlotInfo.ptr},
+ {'pkcs11ID' : ctypes.unsigned_long},
+ {'ownSlot' : ctypes.int}]);
+
+ NSS.types.CERTBasicConstraints = ctypes.StructType("CERTBasicConstraints",
+ [{'isCA': ctypes.int},
+ {'pathLenConstraint' : ctypes.int}]);
+
+
+ NSS.lib = {
+ SEC_OID_MD5 : 3,
+ SEC_OID_SHA1 : 4,
+ SEC_OID_X509_KEY_USAGE : 81,
+ SEC_OID_NS_CERT_EXT_COMMENT : 75,
+ CKM_RSA_PKCS_KEY_PAIR_GEN : 0,
+ buffer : ctypes.ArrayType(ctypes.char),
+ ubuffer : ctypes.ArrayType(ctypes.unsigned_char),
+
+ // CERT_CertificateTemplate : sharedLib.declare("CERT_CertificateTemplate",
+ // NSS.types.SEC_ASN1Template),
+
+ NSS_Get_CERT_CertificateTemplate : sharedLib.declare("NSS_Get_CERT_CertificateTemplate",
+ ctypes.default_abi,
+ NSS.types.SEC_ASN1Template.ptr),
+
+ PK11_HashBuf : sharedLib.declare("PK11_HashBuf",
+ ctypes.default_abi,
+ ctypes.int,
+ ctypes.int,
+ ctypes.unsigned_char.ptr,
+ ctypes.unsigned_char.ptr,
+ ctypes.int32_t),
+
+ CERT_GetDefaultCertDB : sharedLib.declare("CERT_GetDefaultCertDB",
+ ctypes.default_abi,
+ NSS.types.CERTCertDBHandle.ptr),
+
+ CERT_ChangeCertTrust : sharedLib.declare("CERT_ChangeCertTrust",
+ ctypes.default_abi,
+ ctypes.int32_t,
+ NSS.types.CERTCertDBHandle.ptr,
+ NSS.types.CERTCertificate.ptr,
+ NSS.types.CERTCertTrust.ptr),
+
+ CERT_FindCertByNickname : sharedLib.declare("CERT_FindCertByNickname",
+ ctypes.default_abi,
+ NSS.types.CERTCertificate.ptr,
+ NSS.types.CERTCertDBHandle.ptr,
+ ctypes.char.ptr),
+
+ CERT_FindCertByDERCert : sharedLib.declare("CERT_FindCertByDERCert",
+ ctypes.default_abi,
+ NSS.types.CERTCertificate.ptr,
+ NSS.types.CERTCertDBHandle.ptr,
+ NSS.types.SECItem.ptr),
+
+ CERT_VerifyCertNow : sharedLib.declare("CERT_VerifyCertNow",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.CERTCertDBHandle.ptr,
+ NSS.types.CERTCertificate.ptr,
+ ctypes.int,
+ ctypes.int,
+ ctypes.voidptr_t),
+
+ CERT_CertChainFromCert : sharedLib.declare("CERT_CertChainFromCert",
+ ctypes.default_abi,
+ NSS.types.CERTCertificateList.ptr,
+ NSS.types.CERTCertificate.ptr,
+ ctypes.int,
+ ctypes.int),
+
+ PK11_FindKeyByAnyCert : sharedLib.declare("PK11_FindKeyByAnyCert",
+ ctypes.default_abi,
+ NSS.types.SECKEYPrivateKey.ptr,
+ NSS.types.CERTCertificate.ptr,
+ ctypes.voidptr_t),
+
+ PK11_GetInternalKeySlot : sharedLib.declare("PK11_GetInternalKeySlot",
+ ctypes.default_abi,
+ NSS.types.PK11SlotInfo.ptr),
+
+ PK11_GetAllSlotsForCert : sharedLib.declare("PK11_GetAllSlotsForCert",
+ ctypes.default_abi,
+ NSS.types.PK11SlotList.ptr,
+ NSS.types.CERTCertificate.ptr,
+ ctypes.voidptr_t),
+
+ PK11_GetTokenName : sharedLib.declare("PK11_GetTokenName",
+ ctypes.default_abi,
+ ctypes.char.ptr,
+ NSS.types.PK11SlotInfo.ptr),
+
+ PK11_GenerateKeyPair : sharedLib.declare("PK11_GenerateKeyPair",
+ ctypes.default_abi,
+ NSS.types.SECKEYPrivateKey.ptr,
+ NSS.types.PK11SlotInfo.ptr,
+ ctypes.int,
+ NSS.types.PK11RSAGenParams.ptr,
+ NSS.types.SECKEYPublicKey.ptr.ptr,
+ ctypes.int,
+ ctypes.int,
+ ctypes.voidptr_t),
+
+ PK11_SetPrivateKeyNickname : sharedLib.declare("PK11_SetPrivateKeyNickname",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.SECKEYPrivateKey.ptr,
+ ctypes.char.ptr),
+
+ SEC_ASN1EncodeItem : sharedLib.declare("SEC_ASN1EncodeItem",
+ ctypes.default_abi,
+ NSS.types.SECItem.ptr,
+ NSS.types.PLArenaPool.ptr,
+ NSS.types.SECItem.ptr,
+ ctypes.voidptr_t,
+ NSS.types.SEC_ASN1Template.ptr),
+
+ SEC_DerSignData : sharedLib.declare("SEC_DerSignData",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.PLArenaPool.ptr,
+ NSS.types.SECItem.ptr,
+ ctypes.unsigned_char.ptr,
+ ctypes.int,
+ NSS.types.SECKEYPrivateKey.ptr,
+ ctypes.int),
+
+ SEC_GetSignatureAlgorithmOidTag : sharedLib.declare("SEC_GetSignatureAlgorithmOidTag",
+ ctypes.default_abi,
+ ctypes.int,
+ ctypes.int,
+ ctypes.int),
+
+ SECOID_SetAlgorithmID : sharedLib.declare("SECOID_SetAlgorithmID",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.PLArenaPool.ptr,
+ NSS.types.SECAlgorithmID.ptr,
+ ctypes.int,
+ NSS.types.SECItem.ptr),
+
+
+ CERT_Hexify : sharedLib.declare("CERT_Hexify",
+ ctypes.default_abi,
+ ctypes.char.ptr,
+ NSS.types.SECItem.ptr,
+ ctypes.int),
+
+ CERT_AsciiToName : sharedLib.declare("CERT_AsciiToName",
+ ctypes.default_abi,
+ NSS.types.CERTName.ptr,
+ ctypes.char.ptr),
+
+ SECKEY_CreateSubjectPublicKeyInfo : sharedLib.declare("SECKEY_CreateSubjectPublicKeyInfo",
+ ctypes.default_abi,
+ NSS.types.CERTSubjectPublicKeyInfo.ptr,
+ NSS.types.SECKEYPublicKey.ptr),
+
+ CERT_CreateCertificateRequest : sharedLib.declare("CERT_CreateCertificateRequest",
+ ctypes.default_abi,
+ NSS.types.CERTCertificateRequest.ptr,
+ NSS.types.CERTName.ptr,
+ NSS.types.CERTSubjectPublicKeyInfo.ptr,
+ NSS.types.SECItem.ptr.ptr),
+
+ CERT_CreateCertificate : sharedLib.declare("CERT_CreateCertificate",
+ ctypes.default_abi,
+ NSS.types.CERTCertificate.ptr,
+ ctypes.uint32_t,
+ NSS.types.CERTName.ptr,
+ NSS.types.CERTValidity.ptr,
+ NSS.types.CERTCertificateRequest.ptr),
+
+ CERT_DestroyCertificate : sharedLib.declare("CERT_DestroyCertificate",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.CERTCertificate.ptr),
+
+ CERT_DestroyCertificateList : sharedLib.declare("CERT_DestroyCertificateList",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.CERTCertificateList.ptr),
+
+ CERT_NewTempCertificate : sharedLib.declare("CERT_NewTempCertificate",
+ ctypes.default_abi,
+ NSS.types.CERTCertificate.ptr,
+ NSS.types.CERTCertDBHandle.ptr,
+ NSS.types.SECItem.ptr,
+ ctypes.char.ptr,
+ ctypes.int,
+ ctypes.int),
+
+ CERT_CreateValidity : sharedLib.declare("CERT_CreateValidity",
+ ctypes.default_abi,
+ NSS.types.CERTValidity.ptr,
+ ctypes.int64_t,
+ ctypes.int64_t),
+
+ CERT_CertListFromCert : sharedLib.declare("CERT_CertListFromCert",
+ ctypes.default_abi,
+ NSS.types.CERTCertificateList.ptr,
+ NSS.types.CERTCertificate.ptr),
+
+ CERT_StartCertExtensions : sharedLib.declare("CERT_StartCertExtensions",
+ ctypes.default_abi,
+ ctypes.voidptr_t,
+ NSS.types.CERTCertificate.ptr),
+
+ CERT_AddExtension : sharedLib.declare("CERT_AddExtension",
+ ctypes.default_abi,
+ ctypes.int,
+ ctypes.voidptr_t,
+ ctypes.int,
+ NSS.types.SECItem.ptr,
+ ctypes.int,
+ ctypes.int),
+
+
+ CERT_EncodeBasicConstraintValue : sharedLib.declare("CERT_EncodeBasicConstraintValue",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.PLArenaPool.ptr,
+ NSS.types.CERTBasicConstraints.ptr,
+ NSS.types.SECItem.ptr),
+
+ CERT_EncodeAndAddBitStrExtension : sharedLib.declare("CERT_EncodeAndAddBitStrExtension",
+ ctypes.default_abi,
+ ctypes.int,
+ ctypes.voidptr_t,
+ ctypes.int,
+ NSS.types.SECItem.ptr,
+ ctypes.int),
+
+ CERT_EncodeAltNameExtension : sharedLib.declare("CERT_EncodeAltNameExtension",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.PLArenaPool.ptr,
+ NSS.types.CERTGeneralName.ptr,
+ NSS.types.SECItem.ptr),
+
+ CERT_FinishExtensions : sharedLib.declare("CERT_FinishExtensions",
+ ctypes.default_abi,
+ ctypes.int,
+ ctypes.voidptr_t),
+
+ CERT_ImportCerts : sharedLib.declare("CERT_ImportCerts",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.CERTCertDBHandle.ptr,
+ ctypes.int,
+ ctypes.int,
+ NSS.types.SECItem.ptr.ptr,
+ NSS.types.CERTCertificate.ptr.ptr.ptr,
+ ctypes.int,
+ ctypes.int,
+ ctypes.char.ptr),
+
+ PORT_NewArena : sharedLib.declare("PORT_NewArena",
+ ctypes.default_abi,
+ NSS.types.PLArenaPool.ptr,
+ ctypes.uint32_t),
+
+ PORT_ArenaZAlloc : sharedLib.declare("PORT_ArenaZAlloc",
+ ctypes.default_abi,
+ ctypes.voidptr_t,
+ NSS.types.PLArenaPool.ptr,
+ ctypes.int),
+
+ PORT_FreeArena : sharedLib.declare("PORT_FreeArena",
+ ctypes.default_abi,
+ ctypes.void_t,
+ NSS.types.PLArenaPool.ptr,
+ ctypes.int),
+
+ CERT_GetCommonName : sharedLib.declare("CERT_GetCommonName",
+ ctypes.default_abi,
+ ctypes.char.ptr,
+ NSS.types.CERTName.ptr),
+
+ CERT_GetOrgUnitName : sharedLib.declare("CERT_GetOrgUnitName",
+ ctypes.default_abi,
+ ctypes.char.ptr,
+ NSS.types.CERTName.ptr),
+
+ CERT_GetCertificateNames : sharedLib.declare("CERT_GetCertificateNames",
+ ctypes.default_abi,
+ NSS.types.CERTGeneralName.ptr,
+ NSS.types.CERTCertificate.ptr,
+ NSS.types.PLArenaPool.ptr),
+
+ CERT_DecodeDERCertificate : sharedLib.declare("__CERT_DecodeDERCertificate",
+ ctypes.default_abi,
+ NSS.types.CERTCertificate.ptr,
+ NSS.types.SECItem.ptr,
+ ctypes.int,
+ ctypes.char.ptr),
+
+ CERT_FindCertExtension : sharedLib.declare("CERT_FindCertExtension",
+ ctypes.default_abi,
+ ctypes.int,
+ NSS.types.CERTCertificate.ptr,
+ ctypes.int,
+ NSS.types.SECItem.ptr),
+ };
+
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/Root-CAs.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/Root-CAs.js
new file mode 100644
index 0000000..49777fa
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/Root-CAs.js
@@ -0,0 +1,348 @@
+// These are concatenated md5 and sha1 fingerprints for the Firefox and
+// Microsoft root CAs as of Aug 2010
+
+root_ca_hashes = {
+ '00531D1D7201D423C820D00B6088C5D143DDB1FFF3B49B73831407F6BC8B975023D07C50' : true,
+ '015A99C3D64FA94B3C3BB1A3AB274CBFFC219A76112F76C1C508833C9A2FA2BA84AC087A' : true,
+ '019408DE857F8D806CE602CA89522848750251B2C632536F9D917279543C137CD721C6E0' : true,
+ '0208EE8CAAB8387A6824DCB4E26A52337E206939CC5FA883635F64C750EBF5FDA9AEE653' : true,
+ '0226C3015E08303743A9D07DCF37E6BF323C118E1BF7B8B65254E2E2100DD6029037F096' : true,
+ '034287D7C1167D18AFA4703CB8312C3E4EF2E6670AC9B5091FE06BE0E5483EAAD6BA32D9' : true,
+ '03DC08EEC4703FFA20E5E179E81AE7C59ED18028FB1E8A9701480A7890A59ACD73DFF871' : true,
+ '044BFDC96CDA2A32857C598461468A64BEB5A995746B9EDF738B56E6DF437A77BE106B81' : true,
+ '0468E9247E41CED76C441630703DDDB9AB16DD144ECDC0FC4BAAB62ECF0408896FDE52B7' : true,
+ '068690F2195471FDDD3DE6EEA161CAFF7030AABF8432A800666CCCC42A887E42B7553E2B' : true,
+ '069F6979166690021B8C8CA2C3076F3A627F8D7827656399D27D7F9044C9FEB3F33EFA9A' : true,
+ '06F0171EB1E961ED7A363CA594A1374AFAAA27B8CAF5FDF5CDA98AC3378572E04CE8F2E0' : true,
+ '06F9EBECCC569D88BA90F5BAB01AE00216D424FE9610E17519AF232BB68774E24144BE6E' : true,
+ '076192047EA6B9CD5E6B007AE3BF1D0434D499426F9FC2BB27B075BAB682AAE5EFFCBA74' : true,
+ '087C581F522B44B43B79CD01F8C5C3C995E6ADF8D77146024DD56A21B2E73FCDF23B35FF' : true,
+ '0B092C1CD721866F94376FE6A7F3224D0409565B77DA582E6495AC0060A72354E64B0192' : true,
+ '0C412F135BA054F596662D7ECD0E03F4DA79C1711150C23439AA2B0B0C62FD55B2F9F580' : true,
+ '0C5ADD5AAE29F7A77679FA4151FEF035B865130BEDCA38D27F69929420770BED86EFBC10' : true,
+ '0C7FDD6AF42AB9C89BBD207EA9DB5C3760D68974B5C2659E8A0FC1887C88D246691B182C' : true,
+ '0CF89E17FCD403BDE68D9B3C0587FE8433A335C23CE8034B04E13DE5C48E791AEB8C3204' : true,
+ '0E40A76CDE035D8FD10FE4D18DF96CA9A9E9780814375888F20519B06D2B0D2B6016907D' : true,
+ '0EFA4BF7D760CD65F7A7068857986239D29F6C98BEFC6D986521543EE8BE56CEBC288CF3' : true,
+ '0FA01300C3558AB7D37E2D04739EDE3C8B1A1106B8E26B232980FD652E6181376441FD11' : true,
+ '100EADF35C841D8E035F2DC93937F552742CDF1594049CBF17A2046CC639BB3888E02E33' : true,
+ '10FC635DF6263E0DF325BE5F79CD6767742C3192E607E424EB4549542BE1BBC53E6174E2' : true,
+ '119279403CB18340E5AB664A679280DFA9628F4B98A91B4835BAD2C1463286BB66646A8C' : true,
+ '14F108AD9DFA64E289E71CCFA8AD7D5E3921C115C15D0ECA5CCB5BC4F07D21D8050B566A' : true,
+ '155EF5117AA2C1150E927E66FE3B84C3B38FECEC0B148AA686C3D00F01ECC8848E8085EB' : true,
+ '15ACA5C2922D79BCE87FCB67ED02CF36E7B4F69D61EC9069DB7E90A7401A3CF47D4FE8EE' : true,
+ '15B298A354704048703A375582C45AFA0048F8D37B153F6EA2798C323EF4F318A5624A9E' : true,
+ '15EE9F5AA08528DF6BDD34A3A056D8307F8A77836BDC6D068F8B0737FCC5725413068CA4' : true,
+ '160A1613C17FF01D887EE3D9E71261CCF88015D3F98479E1DA553D24FD42BA3F43886AEF' : true,
+ '173574AF7B611CEBF4F93CE2EE40F9A2925A8F8D2C6D04E0665F596AFF22D863E8256F3F' : true,
+ '1802B00127036A191B323B83DE9AA985D6BF7994F42BE5FA29DA0BD7587B591F47A44F22' : true,
+ '1898C0D6E93AFCF9B0F50CF74B014417FAB7EE36972662FB2DB02AF6BF03FDE87C4B2F9B' : true,
+ '18AE695D15CAB917673267D597B260C04BA7B9DDD68788E12FF852E1A024204BF286A8F6' : true,
+ '1AD00CB9A6E68A3B6E95860C5B8CD8195A4D0E8B5FDCFDF64E7299A36C060DB222CA78E4' : true,
+ '1B2E00CA2606903DADFE6F1568D36BB367650DF17E8E7E5B8240A4F4564BCFE23D69C6F0' : true,
+ '1BD75F76734CC0DC98CA442BCC0F78DD31E2C52CE1089BEFFDDADB26DD7C782EBC4037BD' : true,
+ '1C4BE2C62DB9AC3114F4400769CB1F4011C5B5F75552B011669C2E9717DE6D9BFF5FA810' : true,
+ '1D3554048578B03F42424DBF20730A3F02FAF3E291435468607857694DF5E45B68851868' : true,
+ '1D6496AF2D821A300BA0620D76BC53AA7FBB6ACD7E0AB438DAAF6FD50210D007C6C0829C' : true,
+ '1E240EA0F876D785A3F5F8A1493D2EBAFD1ED1E2021B0B9F73E8EB75CE23436BBCC746EB' : true,
+ '1E42950233926BB95FC07FDAD6B24BFCCCAB0EA04C2301D6697BDD379FCD12EB24E3949D' : true,
+ '1E74C3863C0C35C53EC27FEF3CAA3CD9209900B63D955728140CD13622D8C687A4EB0085' : true,
+ '200B4A7A88A7A942868A5F74567B880593E6AB220303B52328DCDA569EBAE4D1D1CCFB65' : true,
+ '206BD68B4A8F48ABE488090DE5651A500CFD83DBAE44B9A0C8F676F3B570650B94B69DBF' : true,
+ '2124A681C1D8F219AF4998E39DFE0BF46A174570A916FBE84453EED3D070A1D8DA442829' : true,
+ '21BC82AB49C4133B4BB22B5C6B909C198BAF4C9B1DF02A92F7DA128EB91BACF498604B6F' : true,
+ '21D84C822B990933A2EB14248D8E5FE84054DA6F1C3F4074ACED0FECCDDB79D153FB901D' : true,
+ '21EFB85040393F756F27FEE3EA5870EBA59C9B10EC7357515ABB660C4D94F73B9E6E9272' : true,
+ '222DA601EA7C0AF7F06C56433F7776D3FEB8C432DCF9769ACEAE3DD8908FFD288665647D' : true,
+ '224D8F8AFCF735C2BB5734907B8B22163E2BF7F2031B96F38CE6C4D8A85D3E2D58476A0F' : true,
+ '246DABD2F2EA4A66AE5BBCAE50AD6E56F9DD19266B2043F1FE4B3DCB0190AFF11F31A69D' : true,
+ '2477D9A891D13BFA882DC2FFF8CD3393D8C5388AB7301B1B6ED47AE645253A6F9F1A2761' : true,
+ '252AC6C5896839F9557202165EA39ED23C71D70E35A5DAA8B2E3812DC3677417F5990DF3' : true,
+ '255BA669B87BF8780DC18FA6EAE47063FA0882595F9CA6A11ECCBEAF65C764C0CCC311D0' : true,
+ '257ABA832EB6A20BDAFEF5020F08D7AD81968B3AEF1CDC70F5FA3269C292A3635BD123D3' : true,
+ '259DCF5EB3259D95B93F00865F47943D43F9B110D5BAFD48225231B0D0082B372FEF9A54' : true,
+ '266D2C1998B6706838505419EC9034600B77BEBBCB7AA24705DECC0FBD6A02FC7ABD9B52' : true,
+ '27DE36FE72B70003009DF4F01E6C0424DE3F40BD5093D39B6C60F6DABC076201008976C9' : true,
+ '27EC3947CDDA5AAFE29A016521A94CBB4D2378EC919539B5007F758F033B211EC54D8BCF' : true,
+ '2A5D003739469475397B11A6F29341E13F85F2BB4A62B0B58BE1614ABB0D4631B4BEF8BA' : true,
+ '2A954ECA79B2874573D92D90BAF99FB6A43489159A520F0D93D032CCAF37E7FE20A8B419' : true,
+ '2B508718392D3BFFC3917F2D7DC08A97B19DD096DCD4E3E0FD676885505A672C438D4E9C' : true,
+ '2B7020568682A018C807531228702172F17F6FB631DC99E3A3C87FFE1CF1811088D96033' : true,
+ '2C20269DCB1A4A0085B5B75AAEC201378C96BAEBDD2B070748EE303266A0F3986E7CAE58' : true,
+ '2C6F17A39562012065D2076EFCB83F6DB1EAC3E5B82476E9D50B1EC67D2CC11E12E0B491' : true,
+ '2C8C175EB154AB9317B5365ADBD1C6F2A073E5C5BD43610D864C21130A855857CC9CEA46' : true,
+ '2C8F9F661D1890B147269D8E86828CA96252DC40F71143A22FDE9EF7348E064251B18118' : true,
+ '2CC2B0D5D622C52E901EF4633F0FBB324A058FDFD761DB21B0C2EE48579BE27F42A4DA1C' : true,
+ '2DBBE525D3D165823AB70EFAE6EBE2E1B3EAC44776C9C81CEAF29D95B6CCA0081B67EC9D' : true,
+ '2E03FDC5F5D72B9464C1BE8931F1169B96995C7711E8E52DF9E34BECEC67D3CBF1B6C4D2' : true,
+ '30C908DDD73E63A4092814C74EB97E2CCFE4313DBA05B8A7C30063995A9EB7C247AD8FD5' : true,
+ '30C9E71E6BE614EB65B216692031674D3BC0380B33C3F6A60C86152293D9DFF54B81C004' : true,
+ '31853C62949763B9AAFD894EAF6FE0CF1F4914F7D874951DDDAE02C0BEFD3A2D82755185' : true,
+ '324A4BBBC863699BBE749AC6DD1D4624AD7E1C28B064EF8F6003402014C3D0E3370EB58A' : true,
+ '3327D16CFC9185FC8C7E98FA854EF305E70715F6F728365B5190E271DEE4C65EBEEACAF3' : true,
+ '33B784F55F27D76827DE14DE122AED6F0747220199CE74B97CB03D79B264A2C855E933FF' : true,
+ '343339FC6D033A8FA25385443270DEC45E5A168867BFFF00987D0B1DC2AB466C4264F956' : true,
+ '34FCB8D036DB9E14B3C2F2DB8FE494C7379A197B418545350CA60369F33C2EAF474F2079' : true,
+ '354895364A545A72968EE064CCEF2C8CC90D1BEA883DA7D117BE3B79F4210E1A5894A72D' : true,
+ '370971C4AFEB7501AE636C3016BFD1E5A399F76F0CBF4C9DA55E4AC24E8960984B2905B6' : true,
+ '3741491B18569A26F5ADC266FB40A54C4313BB96F1D5869BC14E6A92F6CFF63469878237' : true,
+ '3785445332451F20F0F395E125C4434EF48B11BFDEABBE94542071E641DE6BBE882B40B9' : true,
+ '37A56ED4B1258497B7FD56157AF9A200B435D4E1119D1C6690A749EBB394BD637BA782B7' : true,
+ '3916AAB96A41E11469DF9E6C3B72DCB6879F4BEE05DF98583BE360D633E70D3FFE9871AF' : true,
+ '3AB2DE229A209349F9EDC8D28AE7680D36863563FD5128C7BEA6F005CFE9B43668086CCE' : true,
+ '3AE550B039BEC7463633A1FE823E8D943CBB5DE0FCD6397C0588E56697BD462ABDF95C76' : true,
+ '3B0AE4BB416A84B39D2C575E6542BE478E1032E9245944F84791983EC9E829CB1059B4D3' : true,
+ '3C4C25CC0A19CAEE6AEB55160086725F23E833233E7D0CC92B7C4279AC19C2F474D604CA' : true,
+ '3D4129CB1EAA1174CD5DB062AFB0435BDDE1D2A901802E1D875E84B3807E4BB1FD994134' : true,
+ '3E455215095192E1B75D379FB187298AB1BC968BD4F49D622AA89A81F2150152A41D829C' : true,
+ '3E80175BADD77C104BF941B0CF1642B000EA522C8A9C06AA3ECCE0B4FA6CDC21D92E8099' : true,
+ '3F459639E25087F7BBFE980C3C2098E62AC8D58B57CEBF2F49AFF2FC768F511462907A41' : true,
+ '400125068D21436A0E43009CE743F3D5F9CD0E2CDA7624C18FBDF0F0ABB645B8F7FED57A' : true,
+ '410352DC0FF7501B16F0028EBA6F45C5DAC9024F54D8F6DF94935FB1732638CA6AD77C13' : true,
+ '41B807F7A8D109EEB49A8E704DFC1B787A74410FB0CD5C972A364B71BF031D88A6510E9E' : true,
+ '4265CABE019A9A4CA98C4149CDC0D57F293621028B20ED02F566C532D1D6ED909F45002F' : true,
+ '42769768CFA6B43824AAA11BF267DECA4178AB4CBFCE7B4102ACDAC4933E6FF50DCF715C' : true,
+ '4281A0E21CE35510DE558942659622E6E0B4322EB2F6A568B654538448184A5036874384' : true,
+ '429BD669C6D445AD2E81511D355A89624F555CE20DCD3364E0DC7C41EFDD40F50356C122' : true,
+ '45E1A572C5A93664409EF5E45884678C6B2F34AD8958BE62FDB06B5CCEBB9DD94F4E39F3' : true,
+ '45F750114EC5ADBD53688663EC7B6AE1C09AB0C8AD7114714ED5E21A5A276ADCD5E7EFCB' : true,
+ '468C210EAB92214659DBA6DB0061DE265A5A4DAF7861267C4B1F1E67586BAE6ED4FEB93F' : true,
+ '48D11E627801C26E4369A42CEE130AB564902AD7277AF3E32CD8CC1DC79DE1FD7F8069EA' : true,
+ '4963AE27F4D5953DD8DB2486B89C0753D3C063F219ED073E34AD5D750B327629FFD59AF2' : true,
+ '497904B0EB8719AC47B0BC11519B74D0D1EB23A46D17D68FD92564C2F1F1601764D8E349' : true,
+ '49EFA6A1F0DE8EA76AEE5B7D1E5FC4463E42A18706BD0C9CCF594750D2E4D6AB0048FDC4' : true,
+ '4B1C568CA0E8C79E1EF5EE32939965FE4C95A9902ABE0777CED18D6ACCC3372D2748381E' : true,
+ '4B6771BE33B90DB64B3A400187F08B1F7AC5FFF8DCBC5583176877073BF751735E9BD358' : true,
+ '4B798DD41D0392AA51EE04E5906F474954F9C163759F19045121A319F64C2D0555B7E073' : true,
+ '4BE2C99196650CF40E5A9392A00AFEB28CF427FD790C3AD166068DE81E57EFBB932272D4' : true,
+ '4C5641E50DBB2BE8CAA3ED1808AD43390483ED3399AC3608058722EDBC5E4600E3BEF9D7' : true,
+ '4D56677ECCE6457259B74F511172E169C0DB578157E9EE82B5917DF0DD6D82EE9039C4E2' : true,
+ '4FEBF1F070C280635D589FDA123CA9C4E392512F0ACFF505DFF6DE067F7537E165EA574B' : true,
+ '50193E2FE8B6F4055449F3AEC98B3E1947AFB915CDA26D82467B97FA42914468726138DD' : true,
+ '5186E81FBCB1C371B51810DB5FDCF62078E9DD0650624DB9CB36B50767F209B843BE15B3' : true,
+ '556EBEF54C1D7C0360C43418BC9649C1245C97DF7514E7CF2DF8BE72AE957B9E04741E85' : true,
+ '565FAA80611217F66721E62B6D61568E8025EFF46E70C8D472246584FE403B8A8D6ADBF5' : true,
+ '58EB470764D62CBAE29B96552B9700B56A6F2A8B6E2615088DF59CD24C402418AE42A3F1' : true,
+ '59736628512B98B410FF7D06FA22D6C8A0F8DB3F0BF417693B282EB74A6AD86DF9D448A3' : true,
+ '5A11B922850289E1C3F22CE14EC101844B421F7515F6AE8A6ECEF97F6982A400A4D9224E' : true,
+ '5B6F532CBB8188FA6C042C325DA56B967CA04FD8064C1CAA32A37AA94375038E8DF8DDC0' : true,
+ '5B9EFD3B6035EA688E52FE1319144AA36B81446A5CDDF474A0F800FFBE69FD0DB6287516' : true,
+ '5C48DCF74272EC56946D1CCC713580756631BF9EF74F9EB6C9D5A60CBA6ABED1F7BDEF7B' : true,
+ '5E397BDDF8BAEC82E9AC62BA0C54002BCA3AFBCF1240364B44B216208880483919937CF7' : true,
+ '5E809E845A0E650B1702F355182A3ED7786A74AC76AB147F9C6A3050BA9EA87EFE9ACE3C' : true,
+ '5F944A7322B8F7D131EC5939F78EFE6E9FC796E8F8524F863AE1496D381242105F1B78F5' : true,
+ '60847C5ACEDB0CD4CBA7E9FE02C6A9C0101DFA3FD50BCBBB9BB5600C1955A41AF4733A04' : true,
+ '649CEF2E44FCC68F5207D051738FCB3DDA40188B9189A3EDEEAEDA97FE2F9DF5B7D18A41' : true,
+ '65295911BB8F5166890D47824002C5AFC4674DDC6CE2967FF9C92E072EF8E8A7FBD6A131' : true,
+ '6558AB15AD576C1EA8A7B569ACBFFFEBE5DF743CB601C49B9843DCAB8CE86A81109FE48E' : true,
+ '67AC0D773011DED143AE7B737190BCA9ED8DC8386C4886AEEE079158AAC3BFE658E394B4' : true,
+ '67CB9DC013248A829BB2171ED11BECD4D23209AD23D314232174E40D7F9D62139786633A' : true,
+ '689B17C654E0E0E099551642F75A86D8027268293E5F5D17AAA4B3C3E6361E1F92575EAA' : true,
+ '6960ECBE8C94D76E6F2EC4782F55F08397226AAE4A7A64A59BD16787F27F841C0A001FD0' : true,
+ '6C397DA40E5559B23FD641B11250DE435F3B8CF2F810B37D78B4CEEC1919C37334B9C774' : true,
+ '6CC9A76E47F10CE3533B784C4DC26AC5B72FFF92D2CE43DE0A8D4C548C503726A81E2B93' : true,
+ '6D38C49B22244CA3A8B3A09345E157FA89C32E6B524E4D65388B9ECEDC637134ED4193A3' : true,
+ '70B57C4881953E80DC289BBAEF1EE4854072BA31FEC351438480F62E6CB95508461EAB2F' : true,
+ '711F0E21E7AAEA323A6623D3AB50D66996974CD6B663A7184526B1D648AD815CF51E801A' : true,
+ '71AA6AAF1FA5C0D50E90D40BF6AADFCC55C86F7414AC8BDD6814F4D86AF15F3710E104D0' : true,
+ '71E265FBCD7B0B845BE3BCD76320C598CFF810FB2C4FFC0156BFE1E1FABCB418C68D31C5' : true,
+ '72E44A87E369408077EABCE3F4FFF0E15F43E5B1BFF8788CAC1CC7CA4A9AC6222BCC34C6' : true,
+ '733A747AECBBA396A6C2E4E2C89BC0C3AEC5FB3FC8E1BFC4E54F03075A9AE800B7F7B6FA' : true,
+ '739DD35FC63C95FEC6ED89E58208DD897FB9E2C995C97A939F9E81A07AEA9B4D70463496' : true,
+ '74014A91B108C458CE47CDF0DD11530885A408C09C193E5D51587DCDD61330FD8CDE37BF' : true,
+ '747B820343F0009E6BB3EC47BF85A5934463C531D7CCC1006794612BB656D3BF8257846F' : true,
+ '74A82C81432B35609B78056B58F36582CFF360F524CB20F1FEAD89006F7F586A285B2D5B' : true,
+ '770D19B121FD00429C3E0CA5DD0B028E25019019CFFBD9991CB76825748D945F30939542' : true,
+ '774AF42C9DB027B747B515E4C762F0FCDF646DCB7B0FD3A96AEE88C64E2D676711FF9D5F' : true,
+ '782A02DFDB2E14D5A75F0ADFB68E9C5D4F65566336DB6598581D584A596C87934D5F2AB4' : true,
+ '78A5FB104BE4632ED26BFBF2B6C24B8EEC0C3716EA9EDFADD35DFBD55608E60A05D3CBF3' : true,
+ '79E4A9840D7D3A96D7C04FE2434C892EA8985D3A65E5E5C4B2D7D66D40C6DD2FB19C5436' : true,
+ '7A79544D07923B5BFF41F00EC739A298C060ED44CBD881BD0EF86C0BA287DDCF8167478C' : true,
+ '7BB508999A8C18BF85277D0EAEDAB2AB24BA6D6C8A5B5837A48DB5FAE919EA675C94D217' : true,
+ '7C62FF749D31535E684AD578AA1EBF239F744E9F2B4DBAEC0F312C50B6563B8E2D93C311' : true,
+ '7CA50FF85B9A7D6D30AE545AE342A28A59AF82799186C7B47507CBCF035746EB04DDB716' : true,
+ '7D86908F5BF1F240C0F73D62B5A4A93B72997913EC9B0DAE65D1B6D7B24A76A3AEC2EE16' : true,
+ '7E234E5BA7A5B425E90007741162AED67F8AB0CFD051876A66F3360F47C88D8CD335FC74' : true,
+ '7F667A71D3EB6978209A51149D83DA20BE36A4562FB2EE05DBB3D32323ADF445084ED656' : true,
+ '803ABC22C1E6FB8D9B3B274A321B9A0147BEABC922EAE80E78783462A79F45C254FDE68B' : true,
+ '8135B9FBFB12CA186936EBAE6978A1F1DCBB9EB7194BC47205C111752986835B53CAE4F8' : true,
+ '81D6ED354F1F26D031D040DD8AE5810DE0925E18C7765E22DABD9427529DA6AF4E066428' : true,
+ '8212F789E10B9160A4B6229F9468119268ED18B309CD5291C0D3357C1D1141BF883866B1' : true,
+ '824AD493004D66B6A32CA77B3536CF0B687EC17E0602E3CD3F7DFBD7E28D57A0199A3F44' : true,
+ '8292BA5BEFCD8A6FA63D55F984F6D6B7F9B5B632455F9CBEEC575F80DCE96E2CC7B278B7' : true,
+ '84901D95304956FC4181F045D776C46B439E525F5A6A47C32CEBC45C63ED39317CE5F4DF' : true,
+ '852FF4764CD5426CCB5E7DF717E835BD4EFCED9C6BDD0C985CA3C7D253063C5BE6FC620C' : true,
+ '85CA765A1BD16822DCA22312CAC680345BCDCDCC66F6DCE4441FE37D5CC3134C46F47038' : true,
+ '86386D5E49636C855CDB6DDC94B7D0F7ACED5F6553FD25CE015F1F7A483B6A749F6178C6' : true,
+ '86420509BCA79DEC1DF32E0EBAD81DD01D8259CA2127C3CBC16CD932F62C65298CA88712' : true,
+ '86ACDE2BC56DC3D98C2888D38D16131ECE6A64A309E42FBBD9851C453E6409EAE87D60F1' : true,
+ '86EF8E319D9F8569A2A41A127168BA1B90DECE77F8C825340E62EBD635E1BE20CF7327DD' : true,
+ '8714AB83C4041BF193C750E2D721EBEF30779E9315022E94856A3FF8BCF815B082F9AEFD' : true,
+ '879055F2CE31153C33D927C876E37DE13070F8833E4AA6803E09A646AE3F7D8AE1FD1654' : true,
+ '87CE0B7B2A0E4900E158719B37A893720563B8630D62D75ABBC8AB1E4BDFB5A899B24D43' : true,
+ '882C8C52B8A23CF3F7BB03EAAEAC420B74207441729CDD92EC7931D823108DC28192E2BB' : true,
+ '8949548CC8689A8329ECDC067321AB97A60F34C8626C81F68BF77DA9F667588A903F7D36' : true,
+ '8956AA4D441E59D805A1886DEAC828B26372C49DA9FFF051B8B5C7D4E5AAE30384024B9C' : true,
+ '8BCA525F7553D02C6F630D8F882E1CD78EB03FC3CF7BB292866268B751223DB5103405CB' : true,
+ '8CCADC0B22CEF5BE72AC411A11A8D81291C6D6EE3E8AC86384E548C299295C756C817B81' : true,
+ '8CD79FEBC7B8144C5478A7903BA935671F55E8839BAC30728BE7108EDE7B0BB0D3298224' : true,
+ '8D26FF2F316D5929DDE636A7E2CE6425720FC15DDC27D456D098FABF3CDD78D31EF5A8DA' : true,
+ '8D639B56C114E4EE9A128586119082A3D2441AA8C203AECAA96E501F124D52B68FE4C375' : true,
+ '8D7251DBA03ACF2077DFF265065EDFEFC8C25F169EF85074D5BEE8CDA2D43CAEE75FD257' : true,
+ '8EADB501AA4D81E48C1DD1E1140095193679CA35668772304D30A5FB873B0FA77BB70D54' : true,
+ '8F5D770627C4983C5B9378E7D77D9BCC7E784A101C8265CC2DE1F16D47B440CAD90A1945' : true,
+ '8F91E7EEE3FCDA86CAFCDC70EDB7B70C8250BED5A214433A66377CBC10EF83F669DA3A67' : true,
+ '911B3F6ECD9EABEE07FE1F71D2B36127E19FE30E8B84609E809B170D72A8C5BA6E1409BD' : true,
+ '91DE0625ABDAFD32170CBB25172A84672796BAE63F1801E277261BA0D77770028F20EEE4' : true,
+ '91F4035520A1F8632C62DEACFB611C8E21FCBD8E7F6CAF051BD1B343ECA8E76147F20F8A' : true,
+ '9265588BA21A317273685CB4A57A0748E621F3354379059A4B68309D8A2F74221587EC79' : true,
+ '932A3EF6FD23690D7120D42B47992BA6CBA1C5F8B0E35EB8B94512D3F934A2E90610D336' : true,
+ '937F901CED846717A4655F9BCB3002978781C25A96BDC2FB4C65064FF9390B26048A0E01' : true,
+ '93C28E117BD4F30319BD2875134A454AAB48F333DB04ABB9C072DA5B0CC1D057F0369B46' : true,
+ '93EB36130BC154F13E7505E5E01CD4375F4E1FCF31B7913B850B54F6E5FF501A2B6FC6CF' : true,
+ '93F1AD340B2BE7A85460E2738CA49431705D2B4565C7047A540694A79AF7ABB842BDC161' : true,
+ '9414777E3E5EFD8F30BD41B0CFE7D03075E0ABB6138512271C04F85FDDDE38E4B7242EFE' : true,
+ '96897D61D1552B27E25A39B42A6C446F8EFDCABC93E61E925D4D1DED181A4320A467A139' : true,
+ '9760E8575FD35047E5430C94368AB06290AEA26985FF14804C434952ECE9608477AF556F' : true,
+ '978FC66B3B3E40857724750B76BB55F8B5D303BF8682E152919D83F184ED05F1DCE5370C' : true,
+ '9A771918ED96CFDF1BB70EF58DB9882ECF74BFFF9B86815B08335440363E87B6B6F0BF73' : true,
+ '9AAEF722F533FB4EEC0A249DC63D7D255E997CA5945AAB75FFD14804A974BF2AE1DFE7E1' : true,
+ '9B340D1A315B97462698BCA6136A71969E6CEB179185A29EC6060CA53E1974AF94AF59D4' : true,
+ '9D666ACCFFD5F543B4BF8C16D12BA8998939576E178DF705780FCC5EC84F84F6253A4893' : true,
+ '9DFBF9ACED893322F428488325235BE0A69A91FD057F136A42630BB1760D2D51120C1650' : true,
+ '9E80FF78010C2EC136BDFE96906E08F34ABDEEEC950D359C89AEC752A12C5B29F6D6AA0C' : true,
+ '9F6C1F0F07AC1921F915BBD5C72CD82AF5C27CF5FFF3029ACF1A1A4BEC7EE1964C77D784' : true,
+ '9FDDDBABFF8EFF45215FF06C9D8FFE2B9656CD7B57969895D0E141466806FBB8C6110687' : true,
+ 'A10B44B3CA10D8006E9D0FD80F920AD1B80186D1EB9C86A54104CF3054F34C52B7E558C6' : true,
+ 'A208E4B33EEFDE084B60D0BF7952498D8CC4307BC60755E7B22DD9F7FEA245936C7CF288' : true,
+ 'A2339B4C747873D46CE7C1F38DCB5CE985371CA6E550143DCE2803471BDE3A09E8F8770F' : true,
+ 'A26F53B7EE40DB4A68E7FA18D9104B7269BD8CF49CD300FB592E1793CA556AF3ECAA35FB' : true,
+ 'A33D88FE161BDDF95C9F1A7FD8C89008A3E31E20B2E46A328520472D0CDE9523E7260C6D' : true,
+ 'A37D2C27E4A7F3AA5F75D4C49264026AB6AF5BE5F878A00114C3D7FEF8C775C34CCD17B6' : true,
+ 'A3EC750F2E88DFFA48014E0B5C486FFB37F76DE6077C90C5B13E931AB74110B4F2E49A27' : true,
+ 'A66B6090239B3F2DBB986FD6A7190D46E0AB059420725493056062023670F7CD2EFC6666' : true,
+ 'A771FD26FC3CE540F19906EBC1936DE9E619D25B380B7B13FDA33E8A58CD82D8A88E0515' : true,
+ 'A7F2E41606411150306B9CE3B49CB0C9E12DFB4B41D7D9C32B30514BAC1D81D8385E2D46' : true,
+ 'A80D6F3978B9436D77426D985ACC23CAD6DAA8208D09D2154D24B52FCB346EB258B28A58' : true,
+ 'A8EDDEEB938866D82FC3BD1DBE45BE4D7639C71847E151B5C7EA01C758FBF12ABA298F7A' : true,
+ 'A923759BBA49366E31C2DBF2E766BA87317A2AD07F2B335EF5A1C34E4B57E8B7D8F1FCA6' : true,
+ 'A981C0B73A9250BC91A521FF3D47879FCB658264EA8CDA186E1752FB52C397367EA387BE' : true,
+ 'AA088FF6F97BB7F2B1A71E9BEAEABD79CF9E876DD3EBFC422697A3B5A37AA076A9062348' : true,
+ 'AA8E5DD9F8DB0A58B78D26876C823555409D4BD917B55C27B69B64CB9822440DCD09B889' : true,
+ 'AABFBF6497DA981D6FC6083A957033CA394FF6850B06BE52E51856CC10E180E882B385CC' : true,
+ 'AB57A65B7D428219B5D85826285EFDFFB12E13634586A46F1AB2606837582DC4ACFD9497' : true,
+ 'ABAB8D2DB740E5973D2FF2A63BDA6A05C18211328A92B3B23809B9B5E2740A07FB12EB5E' : true,
+ 'ABBFEAE36B29A6CCA6783599EFAD2B802F173F7DE99667AFA57AF80AA2D1B12FAC830338' : true,
+ 'ACB694A59C17E0D791529BB19706A6E4D4DE20D05E66FC53FE1A50882C78DB2852CAE474' : true,
+ 'AD8E0F9E016BA0C574D50CD368654F1ECFDEFE102FDA05BBE4C78D2E4423589005B2571D' : true,
+ 'AFB8336E7CDDC60264AD58FC0D4F7BCFBC7B3C6FEF26B9F7AB10D7A1F6B67C5ED2A12D3D' : true,
+ 'B001EE14D9AF291894768EF169332A846E3A55A4190C195C93843CC0DB722E313061F0B1' : true,
+ 'B147BC1857D118A0782DEC71E82A9573204285DCF7EB764195578E136BD4B7D1E98E46A5' : true,
+ 'B39C25B1C32E32538015309D4D02773E6782AAE0EDEEE21A5839D3C0CD14680A4F60142A' : true,
+ 'B3A53E77216DAC4AC0C9FBD5413DCA0658119F0E128287EA50FDD987456F4F78DCFAD6D4' : true,
+ 'B44ADBE85916461E5AD86EDA064352622964B686135B5DFDDD3253A89BBC24D74B08C64D' : true,
+ 'B465220A7CADDF41B7D544D5ADFA9A75BC9219DDC98E14BF1A781F6E280B04C27F902712' : true,
+ 'B4819E89AC1724FD2A4285271D0C2B5D20CB594FB4EDD895763FD5254E959A6674C6EEB2' : true,
+ 'B5E83436C910445848706D2E83D4B805039EEDB80BE7A03C6953893B20D2D9323A4C2AFD' : true,
+ 'B75274E292B48093F275E4CCD7F2EA263BC49F48F8F373A09C1EBDF85BB1C365C7D811B3' : true,
+ 'B774CD487C5F9A0D3BF3FE66F41B3DFA5B4E0EC28EBD8292A51782241281AD9FEEDD4E4C' : true,
+ 'B7B0D1EC1A033ECEA91511CCB16FB2AEE3D73606996CDFEF61FA04C335E98EA96104264A' : true,
+ 'B8089AF003CC1B0DC86C0B76A1756423A0A1AB90C9FC847B3B1261E8977D5FD32261D3CC' : true,
+ 'B816334C4C4CF2D8D34D06B4A65B4003838E30F77FDD14AA385ED145009C0E2236494FAA' : true,
+ 'B8D312034E8C0C5A47C9B6C59E5B97FD0560A2C738FF98D1172A94FE45FB8A47D665371E' : true,
+ 'BA21EA20D6DDDB8FC1578B40ADA1FCFC801D62D07B449D5C5C035C98EA61FA443C2A58FE' : true,
+ 'BA926442161FCBA116481AF6405C59870456F23D1E9C43AECB0D807F1C0647551A05F456' : true,
+ 'BC6C5133A7E9D366635415721B2192935922A1E15AEA163521F898396A4646B0441B0FA9' : true,
+ 'BD8ACE34A8AE6148E85EC87A1CE8CCBFD2EDF88B41B6FE01461D6E2834EC7C8F6C77721E' : true,
+ 'BDD6F58A7C3CC4A6F934CCC38961F6B2CABB51672400588E6419F1D40878D0403AA20264' : true,
+ 'BE395ABE078AB1121725CC1D46343CB2DE990CED99E0431F60EDC3937E7CD5BF0ED9E5FA' : true,
+ 'BF6059A35BBAF6A77642DA6F1A7B50CF5D989CDB159611365165641B560FDBEA2AC23EF1' : true,
+ 'BFB5E77D3DEA6F1DF08A50BC8C1CFA1DE4554333CA390E128B8BF81D90B70F4002D1D6E9' : true,
+ 'C1623E23C582739C03594B2BE977497F2AB628485E78FBF3AD9E7910DD6BDF99722C96E5' : true,
+ 'C1D43E07AEEBECFD7589E67EA84CEBCD76B76096DD145629AC7585D37063C1BC47861C8B' : true,
+ 'C1D951C084B86A75E82FD7D65F7EAC460B972C9EA6E7CC58D93B20BF71EC412E7209FABF' : true,
+ 'C22A59ABCF152F4CF7E631A316AE840C9158C5EF987301A8903CFDAB03D72DA1D88909C9' : true,
+ 'C2DBAB8E9652C5EEAEF25500896D55953913853E45C439A2DA718CDFB6F3E033E04FEE71' : true,
+ 'C45D0E48B6AC28304E0ABCF938168757D8A6332CE0036FB185F6634F7D6A066526322827' : true,
+ 'C463AB44201C36E437C05F279D0F6F6E97E2E99636A547554F838FBA38B82E74F89A830A' : true,
+ 'C4D7F0B2A3C57D6167F004CD43D3BA5890DEDE9E4C4E9F6FD88617579DD391BC65A68964' : true,
+ 'C570C4A2ED53780CC810538164CBD01D23E594945195F2414803B4D564D2A3A3F5D88B8C' : true,
+ 'C5A1B7FF73DDD6D7343218DFFC3CAD8806083F593F15A104A069A46BA903D006B7970991' : true,
+ 'C5DFB849CA051355EE2DBA1AC33EB028D69B561148F01C77C54578C10926DF5B856976AD' : true,
+ 'C5E67BBF06D04F43EDC47A658AFB6B19339B6B1450249B557A01877284D9E02FC3D2D8E9' : true,
+ 'C69F6D5CB379B00389CBF03FA4C09F8AEF2DACCBEABB682D32CE4ABD6CB90025236C07BC' : true,
+ 'C7BD11D6918A3582C53666017C6F4779634C3B0230CF1B78B4569FECF2C04A8652EFEF0E' : true,
+ 'C86E97F335A729144782892391A6BEC84A3F8D6BDC0E1ECFCD72E377DEF2D7FF92C19BC7' : true,
+ 'C91962D0DA7E1020FCA4CD0380872DF551A44C28F313E3F9CB5E7C0A1E0E0DD2843758AE' : true,
+ 'C9982777281E3D0E153C8400B88503E656E0FAC03B8F18235518E5D311CAE8C24331AB66' : true,
+ 'CA3DD368F1035CD032FAB82B59E85ADB97817950D81C9670CC34D809CF794431367EF474' : true,
+ 'CB17E431673EE209FE455793F30AFA1C4EB6D578499B1CCF5F581EAD56BE3D9B6744A5E5' : true,
+ 'CBBDC3682DB3CB1859D32952E8C66489C9321DE6B5A82666CF6971A18A56F2D3A8675602' : true,
+ 'CC4DAEFB306BD838FE50EB86614BD2269C615C4D4D85103A5326C24DBAEAE4A2D2D5CC97' : true,
+ 'CD3B3D625B09B80936879E122F7164BA67EB337B684CEB0EC2B0760AB488278CDD9597DD' : true,
+ 'CD68B6A7C7C4CE75E01D4F5744619209132D0D45534B6997CDB2D5C339E25576609B5CC6' : true,
+ 'CD996CDB2AC296155ABF879EAEA5EE93EE29D6EA98E632C6E527E0906F0280688BDF44DC' : true,
+ 'CDF439F3B51850D73EA4C591A03E214BE1A45B141A21DA1A79F41A42A961D669CD0634C1' : true,
+ 'CE78335C5978016E18EAB936A0B92E23AE5083ED7CF45CBC8F61C621FE685D794221156E' : true,
+ 'CF8F3B62A3CACA711BA3E1CB4857351F5D003860F002ED829DEAA41868F788186D62127F' : true,
+ 'CFF4270DD4EDDC6516496D3DDABF6EDE3A44735AE581901F248661461E3B9CC45FF53A1B' : true,
+ 'D2EDEE7992F78272180BFED98BEC13D8A7F8390BA57705096FD36941D42E7198C6D4D9D5' : true,
+ 'D35376E3CE58C5B0F29FF42A05F0A1F2211165CA379FBB5ED801E31C430A62AAC109BCB4' : true,
+ 'D3D9BDAE9FAC6724B3C81B52E1B9A9BD4A65D5F41DEF39B8B8904A4AD3648133CFC7A1D1' : true,
+ 'D3F3A616C0FA6B1D59B12D964D0E112E74F8A3C3EFE7B390064B83903C21646020E5DFCE' : true,
+ 'D474DE575C39B2D39C8583C5C065498A5FB7EE0633E259DBAD0C4C9AE6D38F1A61C7DC25' : true,
+ 'D480656824F9892228DBF5A49A178F14016897E1A0B8F2C3B134665C20A727B7A158E28F' : true,
+ 'D59788DA6416E71D664AA6EA37FC7ADCEC93DE083C93D933A986B3D5CDE25ACB2FEECF8E' : true,
+ 'D5BEFFB5EE826CF0E2578EA7E5346F03D904080A4929C838E9F185ECF7A22DEF99342407' : true,
+ 'D5E98140C51869FC462C8975620FAA7807E032E020B72C3F192F0628A2593A19A70F069E' : true,
+ 'D63981C6527E9669FCFCCA66ED05F296B51C067CEE2B0C3DF855AB2D92F4FE39D4E70F0E' : true,
+ 'D6A5C3ED5DDD3E00C13D87921F1D3FE4B31EB1B740E36C8402DADC37D44DF5D4674952F9' : true,
+ 'D6ED3CCAE2660FAF10430D779B0409BF85B5FF679B0C79961FC86E4422004613DB179284' : true,
+ 'D7343DEF1D270928E131025B132BDDF7B172B1A56D95F91FE50287E14D37EA6A4463768A' : true,
+ 'D87E32EF69F8BF72031D4082E8A775AF42EFDDE6BFF35ED0BAE6ACDD204C50AE86C4F4FA' : true,
+ 'DA26B6E6C7C2F7B79E4659B3577718653E84D3BCC544C0F6FA19435C851F3F2FCBA8E814' : true,
+ 'DB233DF969FA4BB9958044735E7D4183273EE12457FDC4F90C55E82B56167F62F532E547' : true,
+ 'DBC8F2272EB1EA6A29235DFE563E33DFC8EC8C879269CB4BAB39E98D7E5767F31495739D' : true,
+ 'DC32C3A76D2557C768099DEA2DA9A2D18782C6C304353BCFD29692D2593E7D44D934FF11' : true,
+ 'DC6D6FAF897CDD17332FB5BA9035E9CE7F88CD7223F3C813818C994614A89C99FA3B5247' : true,
+ 'DD753F56BFBBC5A17A1553C690F9FBCC24A40A1F573643A67F0A4B0749F6A22BF28ABB6B' : true,
+ 'DF0DBC7CC836B77699A1ABF0D20F896A342CD9D3062DA48C346965297F081EBC2EF68FDC' : true,
+ 'DF168A83EA83845DB96501C6A65D193EDBAC3C7AA4254DA1AA5CAAD68468CB88EEDDEEA8' : true,
+ 'DF3C735981E7395081044C34A2CBB37B61573A11DF0ED87ED5926522EAD056D744B32371' : true,
+ 'DFF28073CCF1E66173FCF542E9C57CEE99A69BE61AFE886B4D2B82007CB854FC317E1539' : true,
+ 'E006A1C97DCFC9FC0DC0567596D862139BAAE59F56EE21CB435ABE2593DFA7F040D11DCB' : true,
+ 'E14B5273D71BDB9330E5BDE4096EBEFB216B2A29E62A00CE820146D8244141B92511B279' : true,
+ 'E1C07EA0AABBD4B77B84C228117808A7CDD4EEAE6000AC7F40C3802C171E30148030C072' : true,
+ 'E2D52023ECEEB872E12B5D296FFA43DA9BACF3B664EAC5A17BED08437C72E4ACDA12F7E7' : true,
+ 'E2D8F867F4509435FC5E05FC822295C30446C8BB9A6983C95C8A2E5464687C1115AAB74A' : true,
+ 'E2F8E080D0083F1EC1E9D23F8069AE06C73026E325FE21916B55C4B53A56B13DCAF3D625' : true,
+ 'E60BD2C9CA2D88DB1A710E4B78EB024140E78C1D523D1CD9954FAC1A1AB3BD3CBAA15BFC' : true,
+ 'E77ADCB11F6E061F746C591627C34BC07454535C24A3A758207E3E3ED324F816FB211649' : true,
+ 'E8CC9FB09B40C51F4FBA7421F952857A688B6EB807E8EDA5C7B17C4393D0795F0FAE155F' : true,
+ 'EBB04F1D3A2E372F1DDA6E27D6B680FA18F7C1FCC3090203FD5BAA2F861A754976C8DD25' : true,
+ 'EBF59D290D61F9421F7CC2BA6DE3150928903A635B5280FAE6774C0B6DA7D6BAA64AF2E8' : true,
+ 'EC407D2B765267052CEAF23A4F65F0D8A5EC73D48C34FCBEF1005AEB85843524BBFAB727' : true,
+ 'ED41F58C50C52B9C73E6EE6CEBC2A8261B4B396126276B6491A2686DD70243212D1F1D96' : true,
+ 'EE2931BC327E9AE6E8B5F751B4347190503006091D97D4F5AE39F7CBE7927D7D652D3431' : true,
+ 'EE7A41E0CF757D889280A21A9A7BA157679A4F81FC705DDEC419778DD2EBD875F4C242C6' : true,
+ 'EEFE6169656EF89CC62AF4D72B63EFA29FAD91A6CE6AC6C50047C44EC9D4A50D92D84979' : true,
+ 'EF5AF133EFF1CDBB5102EE12144B96C4A1DB6393916F17E4185509400415C70240B0AE6B' : true,
+ 'F058C503826717AB8FDA0310278E19C2CB44A097857C45FA187ED952086CB9841F2D51B5' : true,
+ 'F096B62FC510D5678E832532E85E2EE52388C9D371CC9E963DFF7D3CA7CEFCD625EC190D' : true,
+ 'F09E639376A595BC1861F19BFBD364DD80BF3DE9A41D768D194B293C85632CDBC8EA8CF7' : true,
+ 'F16A2218C9CDDFCE821D1DB7785CA9A57998A308E14D6585E6C21E153A719FBA5AD34AD9' : true,
+ 'F1BC636A54E0B527F5CDE71AE34D6E4A36B12B49F9819ED74C9EBC380FC6568F5DACB2F7' : true,
+ 'F20598E5964BBE5D55181B55B388E3929078C5A28F9A4325C2A7C73813CDFE13C20F934E' : true,
+ 'F27DE954E4A3220D769FE70BBBB3242B049811056AFE9FD0F5BE01685AACE6A5D1C4454C' : true,
+ 'F37E3A13DC746306741A3C38328CFBA9253F775B0E7797AB645F15915597C39E263631D1' : true,
+ 'F3D752A875FD18ECE17D35B1706EA59C968338F113E36A7BABDD08F7776391A68736582E' : true,
+ 'F4FF97428070FE66168BBED35315819BF44095C238AC73FC4F77BF8F98DF70F8F091BC52' : true,
+ 'F520DA5203862B92768D5CB72D8B93ADA65CB4733D94A5C865A864647C2C01272C89B143' : true,
+ 'F775AB29FB514EB7775EFF053C998EF5DE28F4A4FFE5B92FA3C503D1A349A7F9962A8212' : true,
+ 'F7B661AB03C25C463E2D2CF4A124D854FAA7D9FB31B746F200A85E65797613D816E063B5' : true,
+ 'F8387C7788DF2C16682EC2E2524BB8F95F3AFC0A8B64F686673474DF7EA9A2FEF9FA7A51' : true,
+ 'F8BEC46322C9A846748BB81D1E4A2BF661EF43D77FCAD46151BC98E0C35912AF9FEB6311' : true,
+ 'FB1B5D438A94CD44C676F2434B47E731F18B538D1BE903B6A6F056435B171589CAF36BF2' : true,
+ 'FC11B8D8089330006D23F97EEB521E0270179B868C00A4FA609152223F9F3E32BDE00562' : true,
+ 'FD49BE5B185A25ECF9C354851040E8D4086418E906CEE89C2353B6E27FBD9E7439F76316' : true
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/STS.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/STS.js
new file mode 100644
index 0000000..17999aa
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/STS.js
@@ -0,0 +1,228 @@
+// http://lists.w3.org/Archives/Public/www-archive/2009Sep/att-0051/draft-hodges-strict-transport-sec-05.plain.html
+
+const STS = {
+
+ enabled: false,
+
+ get db() {
+ delete this.db;
+ return this.initPersistentDB();
+ },
+
+ initPersistentDB: function() {
+ return this.db = new STSDB(STSPersistence);
+ },
+
+ processRequest: function(chan) {
+ if (this.enabled) {
+ var uri = chan.URI;
+ if (uri.schemeIs("https")) {
+ try {
+ this.db.processHeader(uri.asciiHost, chan.getResponseHeader("Strict-Transport-Security"));
+ } catch (e) {}
+ }
+ }
+ },
+
+ isSTSURI: function(uri) {
+ return this.enabled && this.db.matches(uri.asciiHost);
+ },
+
+ enterPrivateBrowsing: function() {
+ try {
+ this.db.save();
+ } catch(e) {}
+
+ this.db = new STSDB(this.db);
+ },
+
+ exitPrivateBrowsing: function() {
+ this.initPersistentDB();
+ },
+
+ eraseDB: function() {
+ this.db.reset();
+ STSPersistence.save(this.db);
+ },
+
+ patchErrorPage: function(docShell, errorURI) {
+ // see #errors-in-secure-transport-establishment
+ if (!this.enabled) return;
+
+ if (!(/^about:certerror?/.test(errorURI.spec) &&
+ this.isSTSURI(docShell.currentURI))
+ ) return;
+
+ Thread.delay(function() {
+ docShell.document.getElementById("expertContent").style.display = "none";
+ }, 100);
+ },
+
+ dispose: function() {
+ this.db.save();
+ }
+};
+
+function STSDB(source) {
+ this._entries = {};
+ if (source && source._entries) { // clone
+ var entries = source._entries;
+ for (var p in entries) {
+ this._entries[p] = entries[p];
+ }
+ } else {
+ if (source && source.load) {
+ this._persistence = source;
+ this.load();
+ }
+ }
+}
+
+STSDB.prototype = {
+ _persistence: null,
+ _dirty: false,
+ _saveTimer: null,
+
+ processHeader: function(host, header) {
+ if (DNS.isIP(host)) return;
+
+ var m = header.match(/^\s*max-age\s*=\s*(\d+)\s*(;\s*includeSubDomains)?/i);
+ if (!m) return;
+ var maxAge = parseInt(m[1]);
+ var includeSubDomains = !!m[2];
+ var expiration = Math.round(Date.now() / 1000) + maxAge;
+ if (host in this._entries) {
+ var e = this._entries[host];
+ if (e.expiration == expiration && e.includeSubDomains == includeSubDomains)
+ return;
+
+ e.expiration = expiration;
+ e.includeSubDomains = includeSubDomains;
+ } else {
+ this.add(new STSEntry(host, expiration, includeSubDomains));
+ }
+ this.saveDeferred();
+ },
+
+ add: function(entry) {
+ this._entries[entry.host] = entry;
+ },
+
+ matches: function(host, asSuperDomain) {
+ if (host in this._entries) {
+ var e = this._entries[host];
+
+ if (e.expiration >= Date.now() / 1000) {
+ if ((!asSuperDomain || e.includeSubDomains))
+ return true;
+ } else {
+ delete this._entries[host];
+ }
+ }
+
+ var dotPos = host.indexOf(".");
+ var lastDotPos = host.lastIndexOf(".");
+
+ if (dotPos == lastDotPos)
+ return false;
+
+ return this.matches(host.substring(dotPos + 1), true);
+ },
+
+ serialize: function() {
+ var lines = [], ee = this._entries;
+ var e;
+ for (var h in ee) {
+ e = ee[h];
+ lines.push([e.host, e.expiration, e.includeSubDomains ? "*" : ""].join(";"));
+ }
+ return lines.join("\n");
+ },
+ restore: function(s) {
+ s.split(/\s+/).forEach(function(line) {
+ if (line) {
+ var args = line.split(";");
+ if (args.length > 1)
+ this.add(new STSEntry(args[0], parseInt(args[1]), !!args[2]));
+ }
+ }, this);
+ },
+
+ load: function() {
+ if (this._persistence) {
+ this._persistence.load(this);
+ this.purgeExpired();
+ }
+ },
+
+ save: function() {
+ if (this._dirty && this._persistence) {
+ this.purgeExpired();
+ this._persistence.save(this);
+ this._dirty = false;
+ }
+ },
+
+ saveDeferred: function() {
+ if (this._dirty || !this._persistence) return;
+ this._dirty = true;
+ if (!this._timer) this._timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ this._timer.initWithCallback(this, 10000, Ci.nsITimer.TYPE_ONE_SHOT);
+ },
+ notify: function(timer) {
+ this.save();
+ },
+
+ purgeExpired: function() {
+ var now = Math.round(Date.now() / 1000);
+ for (var h in this._entries) {
+ if (this._entries[h].expiration < now) delete this._entries[h];
+ }
+ },
+
+ reset: function() {
+ this._entries = {};
+ this._dirty = false;
+ }
+};
+
+function STSEntry(host, expiration, includeSubDomains) {
+ this.host = host;
+ this.expiration = expiration;
+ if (includeSubDomains) this.includeSubDomains = includeSubDomains;
+}
+
+STSEntry.prototype = {
+ includeSubDomains: false
+};
+
+
+const STSPersistence = {
+ get _file() {
+ delete this._file;
+ var f = Cc["@mozilla.org/file/directory_service;1"].getService(
+ Ci.nsIProperties).get("ProfD", Ci.nsIFile);
+ f.append("NoScriptSTS.db");
+ return this._file = f;
+ },
+ load: function(db) {
+ var f = this._file;
+ try {
+ if (f.exists()) db.restore(IO.readFile(f));
+ } catch (e) {
+ dump("STS: Error loading db from " + f.path + "!" + e + "\n");
+ return false;
+ }
+ return true;
+ },
+ save: function(db) {
+ var f = this._file;
+ try {
+ IO.safeWriteFile(f, db.serialize());
+ } catch(e) {
+ dump("STS: Error saving db to " + f.path + "!" + e + "\n");
+ return false;
+ }
+ return true;
+ }
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/Thread.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/Thread.js
new file mode 100644
index 0000000..8c9daf6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/Thread.js
@@ -0,0 +1,100 @@
+
+var Thread = {
+
+ hostRunning: true,
+ activeLoops: 0,
+ _timers: [],
+
+ spin: function(ctrl) {
+ ctrl.startTime = ctrl.startTime || Date.now();
+ ctrl.timeout = false;
+ this.activeLoops++;
+ this._spinInternal(ctrl);
+ this.activeLoops--;
+ ctrl.elapsed = Date.now() - ctrl.startTime;
+ return ctrl.timeout;
+ },
+
+ _spinInternal: function(ctrl) {
+ var t = ctrl.startTime;
+ var maxTime = parseInt(ctrl.maxTime);
+ if (maxTime) {
+ while(ctrl.running && this.hostRunning) {
+ this.yield();
+ if (Date.now() - t > maxTime) {
+ ctrl.timeout = true;
+ ctrl.running = false;
+ break;
+ }
+ }
+ } else while(ctrl.running && this.hostRunning) this.yield();
+ },
+
+ yield: function() {
+ this.current.processNextEvent(true);
+ },
+
+ yieldAll: function() {
+ var t = this.current;
+ while(t.hasPendingEvents()) t.processNextEvent(false);
+ },
+
+ get current() {
+ delete this.current;
+ var obj = "@mozilla.org/thread-manager;1" in Cc
+ ? Cc["@mozilla.org/thread-manager;1"].getService()
+ : Cc["@mozilla.org/thread;1"].createInstance(Ci.nsIThread);
+ this.__defineGetter__("current", function() { return obj.currentThread; });
+ return this.current;
+ },
+
+ get currentQueue() {
+ delete this.currentQueue;
+ var eqs = null;
+ const CTRID = "@mozilla.org/event-queue-service;1";
+ if (CTRID in Cc) {
+ const IFace = Ci.nsIEventQueueService;
+ eqs = Cc[CTRID].getService(IFace);
+ }
+ this.__defineGetter__("currentQueue", eqs
+ ? function() { return eqs.getSpecialEventQueue(IFace.CURRENT_THREAD_EVENT_QUEUE); }
+ : this.__lookupGetter__("current")
+ );
+ return this.currentQueue;
+ },
+
+ delay: function(callback, time, self, args) {
+ var timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ this._timers.push(timer);
+ timer.initWithCallback({
+ notify: this._delayRunner,
+ context: { callback: callback, args: args || DUMMY_ARRAY, self: self || null }
+ }, time || 1, 0);
+ },
+
+ dispatch: function(runnable) {
+ this.current.dispatch(runnable, Ci.nsIEventTarget.DISPATCH_NORMAL);
+ },
+
+ asap: function(callback, self, args) {
+ this.current.dispatch({
+ run: function() {
+ callback.apply(self, args || DUMMY_ARRAY);
+ }
+ }, Ci.nsIEventTarget.DISPATCH_NORMAL);
+ },
+
+ _delayRunner: function(timer) {
+ var ctx = this.context;
+ try {
+ ctx.callback.apply(ctx.self, ctx.args);
+ } finally {
+ this.context = null;
+ var tt = Thread._timers;
+ var pos = tt.indexOf(timer);
+ if (pos > -1) tt.splice(pos, 1);
+ timer.cancel();
+ }
+ }
+
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/X509ChainWhitelist.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/X509ChainWhitelist.js
new file mode 100644
index 0000000..b32b6e4
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/X509ChainWhitelist.js
@@ -0,0 +1,1007 @@
+
+// These are SHA256 fingerprints for the most common chains observed by the
+// Decentralized SSL Observatory. These should not be resubmitted.
+// This file is automatically generated by utils/mk_client_whitelist.py
+
+const X509ChainWhitelist = {
+ '000AA4E99FE86D84F762DFB2DC29323D0614B95AA335A270AF204EBA2F2240AF' : true,
+ '00487384DE9545F7F6D6709574920DB9743F0DDC4D5E1518EC00ACCCC6F9866F' : true,
+ '0077DFC8E3CFE0E4398F208CDCB1BC5A7A78BEEF101ED256315FCB9833283B58' : true,
+ '012AAE6B27B392684695FA22F87C8DD3F60CDAB564EE4D4D58DF98575D99153B' : true,
+ '01FC275FB7BB83082EA2C546876545030D74F68355AF2B0CCB1972993B393E58' : true,
+ '0261C3970364E15EC2BB646934FE28F8FCE6E1D5E0B99C7539DF636ED03A9DF0' : true,
+ '027017BAD8EC764424A5DB3B647AD769E78F1653A92F800FAF21212C4DB6CEF8' : true,
+ '034AA8D4F147FC9E93CC18EB5BC06F28FE3DF4923CA61A9CAE92F4E3E078C5F3' : true,
+ '03985CA59706D4A023A5CE0B2E4F870EA465A8E3803CEB2AD859FC86D3569852' : true,
+ '04376F22DBF0B17201EB6871797B1D31FC00EBC4743317793B9C5A5BEA8CECF4' : true,
+ '046C78CE6601C4D88EAC305EE65068225CED3988A6BEC42E50B57B1979742245' : true,
+ '04AEEFBC8685B2668E25C23D77C6D63B95C7C0BA1B8ABBF434F5EAA66BC3E7F4' : true,
+ '052592AA10AFA8D750861F47C540D3A0653A87138ED7427BFD02C9D197D3EF8B' : true,
+ '0544DC1E0D529429A1C86E848D1C78B8511CC1A2128405D276FD864B452890EF' : true,
+ '055C88BD28194042771FF813973E086A30710231DB219FF377B79FA075E7F2AD' : true,
+ '05CB56F00C8DA64EEF10F2305EF696AF839CF8DD541910D760772AC86811FDAB' : true,
+ '05CE45708C3882B0DB81A4504FBE064C1ACD7DABDD071A7F263744FAAF040CF5' : true,
+ '05F70EA23C890F1C382FB250E40DFFD3488C271006DB6B10DC96BF34B6F74420' : true,
+ '06808645F29D708E4C31AC40FA00000733238E10A56D2067AA62803C9736E923' : true,
+ '0699966F623E746BF97DB3B6BBBEB83BCF2E8CAE89D907A49A731951B158216A' : true,
+ '06B35EEE47D7E55F278C5DB13FF137B269B6EF91B58FEB4B2E70E7CC1DB757D2' : true,
+ '07CF2A06F1718D6E476B98C2B42E370A35FAFE4C1F41CF7A1DE115CDB6222FAC' : true,
+ '07E7123B20A807889C384460FFCE4A7F53593A5C872B0E8FD45795D71CD0F9FE' : true,
+ '07FC57E4C188422B53059AD4839F467B9269E4EABBF902C99B30E25DEC5EB1B7' : true,
+ '0834241C7C2B598E20698047C331B173BCA189B96E528FA1993AFAAE3F7D51F6' : true,
+ '087FAD2F33E4D28A13CCFDE11F270188E01AE0EED615D2F433DA4EF05CA6BD4C' : true,
+ '089979504BECAC25640130E65E562AA3E3B5D49EE148FEF6A2B77A2A1CF5FC06' : true,
+ '08BD4BE042F6DA7D627143ED6B2BACE65615683C3C272123AC55105DE4BD723A' : true,
+ '08E5080C1D69F2C11524050C9C0EFDAEBFE68A27FD30EC04AAF4DE2D590F22EB' : true,
+ '09250AF23BC74D92973DD48812D5ED28CE1F5C110EE5F7CA791D9CFDE04A131C' : true,
+ '096800FDAFA82029B3B5E3947E0EAB6FB1F1D6958DE04E9256969F99F7518C57' : true,
+ '0A122B87C038CAEA46E8944009B11C2168E47F4DACAA9D3BBFB92CB5F5E1BCDE' : true,
+ '0A36586C8EEE28E5ECA1F542691D12B3CE7815CDCF722CDF7074AA71413C2550' : true,
+ '0A6A1FECBADAF7F1B473305A71E454F6AA8C1B0F40941FF4660B814BFF4984B3' : true,
+ '0A903D7CCFBB18FFEC8E3AB05FC7E592C1E7509D0EC2DBD9A2C05236BA9FD7C9' : true,
+ '0A91A9CAC951DA1739ABB2F29D16A6F5FAA9F49AC87516AB59CA77150D282528' : true,
+ '0AA5730256323B66DBE88E3056AA3F45E52BE5E2B87C1C9DBC1986CEAF97B5D9' : true,
+ '0B2D2C539D3D922820B6D08E159E6763D22AE797B2C32F8202B632BB93588588' : true,
+ '0B39ADF22CBA98C15754A7A899C5B96871337D2178EB3EBF0B5D5F88332EA971' : true,
+ '0B901F548AE4E0F25EF38010E311945FB198E497F203A88FE7C44970F7ECDC40' : true,
+ '0C114EDF67FB7C09C532297D79A5743EE5F8576A8EBE3DF69A728B8CFC0A167C' : true,
+ '0C7E90EF8BCD379CB001FD07530718DCC0A33E9D7D1D333F505F0143BC6A8FD6' : true,
+ '0CA932C2E0929B9B6C0A8822D3F094F671522419835049CAEAC51755D1F44777' : true,
+ '0D4F42B386775FF404B84D58859BC5AB029F1F9CC6B7AFFF32B838F8B8C71F3E' : true,
+ '0D8FC5F202A5668F7F3EA7F6A73521E0C7FEB5DBF6E58BA68AB7C7E01F4C532C' : true,
+ '0D91DE20988EA155526570498A1A6289FEC55994A5BA888C9134765F2A0B0580' : true,
+ '0E3AE0C9BEDFCFB38239DC4214A3AF3E6386720E2E5F8A85EEB52BD152E4DF09' : true,
+ '0EEAAD4FE6818F1D723A5567CD0A6569D45E346E2DA2896222A7F3367F4AE8C7' : true,
+ '0EF8FA5AAD4BACDB842959378F18935855B027B0BADDCBDEADC9CC958C4C603B' : true,
+ '0F39AF5CA9615B05CBC12DE3C94A8C4FBA71CA8CEF541952315A9D0658DB5B28' : true,
+ '0F7DE9806919EBD5EE47188428BF7FE13495E4684ADBB5BA980BB15D4D0B0C22' : true,
+ '0F8F66953B0F42560CDD573A013D3FB809D9747210E58F28F4878CDA5A8B8AD2' : true,
+ '0F97235268233245499D6C1319DF1BCA3AAAFB13CF9B06EB294FCA328022E82C' : true,
+ '0F9E066578F4AFB0ACBDC408CB25B7D7200BC5CB7FC4DA6D32532D827EA5B232' : true,
+ '0FA392F6EABCE0F4DA14C7B5237B21BEEE6BDA55832A8A6090CAEBB53AC8D77B' : true,
+ '1049EFDE8BD0E7D94AE05D50D326ABCE41E79B0572F86FDF1F7387738262F09A' : true,
+ '10552D044AD79FBF1AF5357998DAB9B1FFD66D7B53C8107FC2280148D66475E3' : true,
+ '10E82776E55D0C2D58F6598E615CF38AA14161D1EAD97C4A09182FE1D44E695B' : true,
+ '10FD669D6DA882678AEAFB35A5F8A0963C2E2B3084883EA515C8956FEC4207ED' : true,
+ '114ED15D4B557A16DDE1D01CB4074215CE6773C180FEF60F08267CEAFB670D5E' : true,
+ '116A5D5F3E99CFE5F72A4AFAC8699CC225C130F4B8520CDB350A1262D9585973' : true,
+ '118FF53B6BEB35CBFE6592D45BE082BA1228D1817E46B2CC14B8855FCC5C9D59' : true,
+ '11EC553AB76EED159FE553B52E7475FA71A0FF3F4B3038CF91BC7138F50B0A7E' : true,
+ '11F7A939F33BDF6270E16C747C0B0918902CD4501AF1843D9EA4445A2E708C58' : true,
+ '1243C75D0F805DA54E780D0D9C55247B1ABB31FC09EB65A7017695945F2A0D4A' : true,
+ '124CE9CD70225896BB3C9DF372E0457CABCEE8585D1BCB8E16D0E6D95B94AF2F' : true,
+ '124E430E0E0B103B580A0436D7CF436F6ECE55908279FA8EBDF475AED08A9CE9' : true,
+ '12826065A034136FFC2258AA1A65F9E550A582B4017E396077917C775D42E553' : true,
+ '1363B86EDA0BFAF10F1141CBE7569647F2FFB370F539694288101128A38261B8' : true,
+ '137E64BF679E2CD24F034125EC926D48F34C7404CFD6B61B23BA9E91E55D3560' : true,
+ '13ECB3394571030912CDF82DDAFA05B242398929BD3ACE1598B79DBF28B701F8' : true,
+ '142A33AB96C13ED7C7B8782D764F374B5A8F9C4E33B4DFE9B7750E878E7C5D0D' : true,
+ '14587E25D8BF0150F429924144E88AC551C1F77CB5DC84F6CDDE7079014ED2EE' : true,
+ '14E443C709A20C11205371C5BC54C20CCD53AC434750EBC91C45B30DD0D8B53A' : true,
+ '14F5D6BA3842E708E3AADC26B8A9CD89FE9CF2BEF46398369521839733A4504F' : true,
+ '150F5BC3D839579BD7DD1254A6C3C3AFE3485D7DED21C3B8123BA6875886A91A' : true,
+ '154C4C43AAF5F838B7B9BE748FF671521BDF0ECF3D749EB85487F9C315239778' : true,
+ '15F46CDF488A5BAD54DBA0F2E2F825F956F8ECF9E3AF294551E88F62A8A0CECD' : true,
+ '16BE849F33D16B22C495B9793329BE704AD9C681C2A963C71FDB303D526E09B3' : true,
+ '17A0318A02B4E7EB14792644E1E28966257748F8162A53AF4E49697A4707C9F7' : true,
+ '17BE5D468B1EA071C36079A4843B8A1E69B9FCAFFA0565FB54B10A02D78B7FA8' : true,
+ '17D0A909CE750C728FBD0F33589A3EBFDA452D00C757A18557DB4697289287B6' : true,
+ '17E110287D04C595DAE0C73090051A1F30F165A37429CD78C1F8FC1754549D41' : true,
+ '17EC9E8F98C207F4CA7FD0680193A54DC33BC97CB364669442F5B7492D36839E' : true,
+ '17FD21D68D53F369EEC1E22EFCC3B79B255EB8E1031D147F6461291C4D980037' : true,
+ '183AE55CFEE1CAC5CCBC1C58D813DED429DF750E023362FB8BEDCB27A9F94559' : true,
+ '186DC5DF9C693C311857A94BF9B2810BDD02F22DAD527D2BFBC0CDF24BCE26FD' : true,
+ '1882C2D8D817DD1078933D244E379CFC5BA8EAAE302BCF9FA22636B08FAC86CE' : true,
+ '188F5D081FD0D98429D1747FFBFEAB39733EA7C2B61C8BF6B0ED62F71264C619' : true,
+ '1974EFA39EBF5C2D3B53D5089EF28F6545D5B4937DB660385AF579A28FD17A3F' : true,
+ '19778EECDA512FBEFDD9AD0507A1F828AE67C35594C20831D1D531B79F8B2F99' : true,
+ '19AD483D37D656F9D7844F14C53281FDD56683C0C8FB2A8F3F77DE7C810C1CFC' : true,
+ '19C76F18839C90F94AB9E4CD3ABC4C15E0A8DA9B8705E7DD872962CF8409DAF2' : true,
+ '1A5C89F300E3A9835759D6588CE3361993E336D76EF4B2F64F1DFC4D913BC6F3' : true,
+ '1AA7EB7CB182FF1BA09FCDFD088DE1F25F8551DAE53CE2C16D4D72D1B6091CA5' : true,
+ '1ADFE710199AE62734EAD27EEE6D6A4EC4D6FF19D6978A7CFBDCABA69C1617E1' : true,
+ '1B5827F9E4B66B4895AB47A0395BB1E135D15F7A23712147C5D382C1AD805ED5' : true,
+ '1B8AC4A31C75996D44252AED8CCF639282DF3A180900C660804483597238D8BF' : true,
+ '1BAF1A75711BC2EF2C4EB8C2BEA4B5B1B183E95ACCB247DB89B3098C324870C2' : true,
+ '1C1BD271327C7721AFDE3C5BE6FA98B132F2EE1911BDF05F0649121349A4537F' : true,
+ '1C1DAB84FAA0FC35AAA8A54760840F8A48EB449B338D7CF3902397514F4D1CD7' : true,
+ '1C363FBCE719D6567E55DE267E6662A454494FA085180F23FE84139E9E83527C' : true,
+ '1C573E491ECF04E3240144B2A63D8DDB457367055B90F5947CEFB55174A6B959' : true,
+ '1C923C0DC4E99E8F807E44A5499EAC4BC48022C63A3EB4CE819D556349FB57BA' : true,
+ '1D4D6D7E6B04F507E28EEA37367012166A6E4AFD02D2F325129A70F76894512E' : true,
+ '1D602FC8C0A6E38288593AF300D73F04B3A5AF89F5B08A0DAC3D935A9B69D7B9' : true,
+ '1E15FDE9774DDD452B000A3FD8118DAE63D16F8EAC19D26806BB08A70677F42F' : true,
+ '1E294231C72B07AAA6E2FE3B18BA14F1095F82718B42AF1DEE071D011740550E' : true,
+ '1E5D810BCB8DA3AF393761C59CC88D22669ECB7D4F926760BE1EC6CD83E60765' : true,
+ '1E5DD6CDAA3AAB8BB891B8D7B4E99AF2EBB7F08719F1D3B3C7B8694962EE8668' : true,
+ '1E84A8F15A3EB4B7921D7462C1FFF8DDC182E4E0682EB48C42FB3645BA43A6E2' : true,
+ '1EC6CF08000A6583160FEDE1C117794E75CA5533B666D04FAB138D8F12A4ABC1' : true,
+ '1F1A125828C6F4A21A9D035C28E5493FACE0F4D7DE6B6F2DD5B9FD5D426B6FC7' : true,
+ '1F3C4550EEA0B9B8F4608632610548B64126E8929450D285DBF906752241CEF3' : true,
+ '1F4C963A9BA39CE44E46F135EFEAD5B30D6A0A3A43545E18CBE59DE452A6468B' : true,
+ '1F6AF055216D53382D7D42AE6893552B4C04C0D6CE31A2A71B7FD24F7A607A67' : true,
+ '1FB6F7F8DD4B392D4BEAA5E707AAF882D2AA83C5E9720C58B616F8DDDFFA6F77' : true,
+ '206A33714BD518CEFF68A6904E19B0837230BCADEADEA6E056EE3745774BE3EB' : true,
+ '20714569334D93E90D2200B253E447A249EC53311A379538BFACDCEE457D9656' : true,
+ '20BE732FDB6D751C0991700E7C9D401093135652D25B1A29D3387E21D60B776B' : true,
+ '20F2E0109442ED3DB805D939B1FCC9F4C8E17414F748FDE98883C9EFA504397E' : true,
+ '20FD7A6E1659C35B1870F698D182820EADD8E02ABE97A9FCD691681B4A6493E6' : true,
+ '215C6D97B01A9EA11CDCB7D4D62EF74D31231F99CA59F3D21104097AD5D52868' : true,
+ '22BA6A5C28A505A68F7C025447822720E4772BC380FD9EA58EA71C32682CF0FC' : true,
+ '22DD516BE482B2A7F3C5EE268E8110EB9814E86E4102654C3CF5705743BCF870' : true,
+ '22E6BB3D9964F458D462BAF404323775B20EEF02F174CDBB442D4381DB98C61D' : true,
+ '23223C3601CC5682B21E4D4C236BB85C9098082EE3942070E33CC791CDFAD31A' : true,
+ '23980A7B935B10CA69315CDA05E61B4ABAE7876724C0E0C3CC7BE9748E41ACCC' : true,
+ '243D9193A5D38C9F2C21409EA470757D3903F8C418709E12C47F01C4EC08E5D5' : true,
+ '24540FC5876A301AF83E2494013ED0B4F7B1312D7238EDDFA1DB0E7736082856' : true,
+ '24789DF7D8F1D393F224621E436675778CAFD595AF6988D2995F28553F28B629' : true,
+ '24AEFDF5AA4C36F89987C960EA14B8A90CB2670CCCC66957652A21E0231D2E4E' : true,
+ '25531D59643B0F5E1CEE67B9CE42B0332FCF9688659F62D990C77CB8C1349E10' : true,
+ '258296CAC41A779D819E37CB4B120D2270F55AD8BDA24747C572165BE31849D2' : true,
+ '25B87ACDCD18628D9B64EB9F6366C970B2FE922B39EBB7E3DD1354899260B180' : true,
+ '2601092E7F1A7841A9E65C6D24D0BBC0CFE986404E6DAFF628E2C2D70667EB59' : true,
+ '2635178113FBBCC75EABC09C497D411C994AD0170CF9DF999A4FF5C16872CDBB' : true,
+ '2643995B1EC6D06457AB936E18B5A5721CEDDCC82F4E116C36EEC5096BB04DC4' : true,
+ '2677470F2FBD067904B7014B88988BB94F72403C014240B9843AE5A5FA21661D' : true,
+ '26B163AB60042EB690FF4549F6086019E19A99A3B69332AD1FE85D9C46491AA9' : true,
+ '26D184F574A19836878B10B209825413B48BB1C92195AB69F6B01D359FD4D07E' : true,
+ '2710EBB98F6790081E34A1961D7716533511A1746616DDBAB9A3D64ED32B1875' : true,
+ '271B4C5B8689BD69CCA837BC080C554DBEE0B20C5B1C505F68544AEC29588277' : true,
+ '2774F85336B9446490224280339F361F69E44891C5D8F078F03FEC5BC7C37437' : true,
+ '27C6EFE085FD0EF2DD467630B0A650BD3624BB4065F811F5F99CA976B4C0B871' : true,
+ '28002E2FB259DA7341B69C144F4EC6B5B12CB9A981C34387044926957CF9152C' : true,
+ '28082C3B3FB30995C3ED4D971AF00E3114C75B9FA47540DEA79E120E01C03562' : true,
+ '28445F7C648AB6025EB469E9C5FD10C6C8D0D21B6A20F078854EFF406C55D3F7' : true,
+ '287821696D43B83F1EA4A3AF5F6E5695F86D770148341106757B98DACB5C979F' : true,
+ '287AC69E23A84ED6C79668FD778A1C5F89D93D9E85B1F84110731B3EF007852D' : true,
+ '288B79B657E95C6E9FF6FF795A3E36528FDD26538925F67411B0F1F715DC9905' : true,
+ '2895D775D2F7F4D7BFF504B3C204939766B2C2734BC607B154CB1B2E52D76012' : true,
+ '28B2F8B5E2ED8681AE3D47EBB733718E32FF81FD736E97EEE68E12A6CFD3C9D6' : true,
+ '29AE4E3FA75E6A40E5C2D8BB9446BC39D672780F4CD6334CA2527FFEC0FBBFD3' : true,
+ '2A00C2E13F83FE2640D9DA1B802219AED52B811CCD54F7632622FB05531CB829' : true,
+ '2A227A780950EC49D49437E4FBD2306EC1D213A25343B752F116B3C4203C641A' : true,
+ '2A2EE56590084C2B144125731B45BDF927C357840E997888F52EF90AD6361EA5' : true,
+ '2AE917E3AB4B867883088BCFFED53EBEF9F87988C77AE47FE325547B181931A1' : true,
+ '2B372D2A09743CB535C71949D24612C108A95D542D5235B443C116426F4EC740' : true,
+ '2B5FC256FE24DB51001FBB200C80DEDE29EF2CCA290DEDA0EA7FA5627A8400E6' : true,
+ '2B804DA0656D06DB6CFF31AF9EE7A41E9621F5062C855A3FA3E69208C6BED1BB' : true,
+ '2B96B9494AB9EF09B7D4ACC0F7C7C8B27BB23772D8203F98A635285335B476FA' : true,
+ '2BB158B54FA26B5A7FDA92096D214B5AB548D13D4CD0D275B967703750B03097' : true,
+ '2BDDDA7C2F05123A014AFE1044AE6AD3B1AA14F0BEAE4FDE812BE52DA271F992' : true,
+ '2C27A3FBE2D833ED7FA00DE8A00EB1E16F40043D68C21C6FAA72A34DD839A5EB' : true,
+ '2C43EC0374BC603A1B191B88ADBCD5C1A0409120427995C2684A1590C7AB1432' : true,
+ '2C6E83BE981FD0EB0ECE7D8977D665C1B7665DFEE4C0F7DBDF5138FEC3974EBB' : true,
+ '2D75CD1232720CFFABA233953EB8CFD860C23034BD9CF969E8D104485B251ECE' : true,
+ '2D978BE3F44F069B366DB5D8E3B1FE4B02775498DE8D17EA68B423259B681FDD' : true,
+ '2DBAF94C053FCCFA1EC09CBB22F54DAFF2DB4ABE1B3C61CFF1BEBC31260F4821' : true,
+ '2E23B68E6E803E74BA36D9C9006F96D8BAC39DB4CAEEBF1C12C6CC01CFDFAD6D' : true,
+ '2E50DDF50FA4B9220202816F9B79405227BA4F803E61FD96D6BC95A0263E49EC' : true,
+ '2E6193577D9F6627E5D23883970975541C6807F1DD1F48971EECF07C204C16BD' : true,
+ '2E726E5D6C08B18944773DECBBBA88F95E25D586248B145354596BA8DB31DDC1' : true,
+ '2F0D2656CFB3D34F4775E89AD96E2AA7D3A1FCDE399BCB2E03AA2BA0A035946B' : true,
+ '2F36C6E796C7C4047152AD68B781475E3FA3AA785DE5CC277DA2DA20F35AD52C' : true,
+ '2FE442C9741D5351A016B9796E3021A01BAC6867A567ABBD1C7EB08DD359DF94' : true,
+ '30354519FFD4794257A7EBEDB0D47DEC9A547B4E7213199000F41EB65C233EF7' : true,
+ '304039981650BCAEA6BAC7B1FF2E03A9BFBC8AF4C37F37E66D59D327776EAE77' : true,
+ '305B4CDDF744AA543DA713E7E60C19ED5537D49ED2252330B46B7E664C4E588C' : true,
+ '30AF2F588C872B174436F3B68ED432C0495D651C84A04787CC8C13D6D61DF63B' : true,
+ '3102A33CF44D88924253BC149D22198D046E6571E79D0C6CFE106F8A725364FC' : true,
+ '3141118408E436FF8489E07BACF80B260A33E842C5BEC83C763B6AE73701A76A' : true,
+ '31C4E7F6630486BF42150967E951D3DA5ED8D382AA596FD571231CA96E0F352E' : true,
+ '31F411310C7FCAAF8CC265F557CF93BF32E5E277589E932442A3A840E141809D' : true,
+ '32CFE4F78C2B8737E9A31F4E0A2513535FE242D02F1DD83C04ADA77839CC4442' : true,
+ '32D398E73D053561EC78257EB01F0945C2A38D9F80674F6F2B4B10BA35A2B4E4' : true,
+ '32FA61C84B195BCADA9A65448CD3C8CA66B1DFE252CF97D46567ACEB59BD2D83' : true,
+ '330457913F88C2037F663003C36F0B6B2B3071AD972C9A4DA54998A7CEB8B148' : true,
+ '331C02F8B180F4E4F15DFAC71D1F03F3ACA9438FEE138AC2A60264BCA35DA54A' : true,
+ '3379517964657D6F875971C1ED6218D9F890BEFC7390CA654C79A666D1989A18' : true,
+ '3386FCF2133229E0BB6481DD2149E9D87540B5277E3FC3C3DFAE50A8D81D0653' : true,
+ '339C59871E132711D25988F0DDB86E0EE5D34B119972C0A5E3C3B556BC293D74' : true,
+ '33AD12326DC0DE4AD1CCDF7B3F1E0202B8476857E1C911B056F53CC6D4A60187' : true,
+ '34CADA62CE9D32857D65E868355E258447C0111D3F78CDCF4360F5B7B9F7E3E4' : true,
+ '34F904FEE6E8CF59E4FFE90F627D688210910D0176C9B5ACF7DAE8CABA722B63' : true,
+ '357E325CD50420D15B1E6779D32E62FB6029A9710017B14CC23AD41DE08A400B' : true,
+ '35931DC7CBFF8F707BEF6D02988B66FC79B77D05DA0A09F439040F4099A69883' : true,
+ '359D692646482C906B77BC217B7C262E81B6D80441DAC6FC2E317C5A0C1A72DF' : true,
+ '35A88292416784CF9D883274B422DDA092B8692CB98FCC788C9B926987854291' : true,
+ '35C8C522026971801A41CE23438829BBA27D3902953FE183E2E3B84415F6ECEC' : true,
+ '36267B2A60E0B5997DEEE17CDBE6AC7F7D54D279C6AB4F06CD469919F442E6AE' : true,
+ '362BF6E353729E4F8FDA7D87DD726C825E2661DA801BB75B857F4DA622BB9704' : true,
+ '363C229BA74BC61CAD1DEF35B5B808146FB5D1D34E5D37C02E1FE19B5EC6C37A' : true,
+ '366B123FA1EA2FF7FDBCA0422E504C8E0AB62334AC8941D307060F5ACDFB58AA' : true,
+ '3761FB4C3FDF80BD66FB31A506612BE2B98FAC57691A6125227B4787C35C32F6' : true,
+ '379F1BE4B67E89183FCD2AB1C0A3B930DE70D33CAE2C8629819DB4951600A398' : true,
+ '37A8C0FE01BCC73FA73F8A161566E23F12C22BAD0461D7CB9D9386EB7DD63800' : true,
+ '383BB79AFA098696BE4D3605F26A60FDD7C455D31FB03BE8553C3EA348F479F2' : true,
+ '386702317DA5549A08139017D14AC498D7DD4837E0E16F91BCAD37684AA6EB97' : true,
+ '388AF939697463B651AFF01141B625DC877D0FB31CBC5E234A5526BAAB68E660' : true,
+ '392080D12E0D8985A6C35526FCCF9CFF55219D7E62E92BF05863F7CFFC42596D' : true,
+ '39CA68E75049A34F875DEE1CD6929FA61DE4B250B5060D613BA9088810D60B9A' : true,
+ '39EC99D4093CF0A60A947685856F20DBF85966FBCAB4033890361A650294A8A8' : true,
+ '3A9480EEDF0D65938DD92A7FE7E9BE4D797CEB0662CADDA2321D47C04818A57D' : true,
+ '3AFA38F8367A45AAFBA949076A38537CBAE4A0774FC4CC40BE52F944F29F7F19' : true,
+ '3B00662EE3F01FFE2C40842F0F3B76C039ABB785962E371767E89E2AFA311A74' : true,
+ '3B1FDB5890A3C11F7149C13019F3EE43D3D3A8C174E485512E946EDCBBFFFE55' : true,
+ '3B3A1C7A8131E1E6A66039972C1AEF65797E783ACC2C645CF10EEAA5F20BD297' : true,
+ '3C40EF3135CB1E82D0E6518EF75EAEDAC43DE347CB74E2A09CBC0C5A56DB2636' : true,
+ '3C49B9DC9307C6B33E0DBE135836504ACB9F6204B7172A412C28E797E56CA02A' : true,
+ '3C91A39CC52452FB91463E511257D3BFCDCA3A149EBF39978F39E55F20FB061E' : true,
+ '3C96B0CE3855D125998B8DDA63F2A37AA1FC5967949393D7428C1FA97D2542B4' : true,
+ '3CFD92A9ACFC3B9D7BF81B2994D398500413E7B57C711D711F98DB009FD142D4' : true,
+ '3D04D60DD221BA390696E262A7B522815BAD5A03B79D1176931F2AD5435D494F' : true,
+ '3D7A71BB494A12E1F21A1EB9033CBEFCD1FE81F358B131016DAF92C1C06F1A38' : true,
+ '3D81B541D1B04B15AFEF518152CF8DDDB9300EE0A1BADC916FB366FA034120ED' : true,
+ '3D9910368BB2A01AF8277EA5E26F9CFCB045DC63CEC7397EEB2827B16C0344AE' : true,
+ '3DE5855D87575043D52CE7496F7486CBD8177FCB9F8C686B55F5F0EE761B2DFF' : true,
+ '3E09F448ED5A72584FA305F82A25706D2AE756083530B4E18665DA2AE46C1410' : true,
+ '3E18B028DAFB97BD9A036F1743316C8EC963C17066E362328FEA24D6FF8B2A7C' : true,
+ '3E486CEF660870234BD56B008730D8B318B7FBD047B55939D74545B98D8176DC' : true,
+ '3E5558CB92AEDC7E01DB0FBCD0825CC0F51AA7B683ABFD01D1E5E04C8A4D716B' : true,
+ '3E7FC707C590EECFA7E9DBBD270452366C0E2F0ABA7768B3F18E7DE34B3E15BD' : true,
+ '3EA82DE5DF72699D567B865AACE54C72AFF800647415E5E49D4260F422C26DA7' : true,
+ '3EFD44B1F0C8400130C35FE003FA304C2E47FD20612A4D1C83F88723B885CE66' : true,
+ '3FC8022D0C28EBFD45DC1D07E14F9E83F0CAD2E7ECEDBFDB991E01EBF2400F54' : true,
+ '3FC92874F07DB0DEE11CCB2CA7BDF187641DC78ECE4C76E71B2253FBBC17E3FE' : true,
+ '3FCBCC65096D7D731244167CCEAA21757E56D6EFC05A632AB3E062643E5B380F' : true,
+ '402FA5AD0E7932A07356FB849DCC1AEF11649D516ED1C5617C48F3E7F9B02356' : true,
+ '4093A7B65486890D2575D57070237C586DC489B3A68FA913DEF136370F2DDF9F' : true,
+ '40E66AA57071722F0B8E8B59A74998F82E8D5020BDDBB35D0E941851ED11921D' : true,
+ '4147C9CD6ECA16D7C6A8939E15E419220C822956FE754DCB2F08F2C78A99C3DC' : true,
+ '414CB8A3E4E86E2B4E03EB2FE71312CFE17B78945B41597F8E03AF04CFFAECC9' : true,
+ '4196DA17789961AAEB04CEBF7F1F77621F89102F48350D3B95E66E955FA8AA8D' : true,
+ '4247E57738776992C6640ACA48156C9DE580F0A739CAF0A353CDDFE3417F7C46' : true,
+ '4248F09AC0B07BCF41B413A2D8FF50AC42C6943D6F6D20F9C37502FDD2315171' : true,
+ '426334353C51D4E625F2DE937D9AD9FE6769E0F4E1425AF23D7802385103B583' : true,
+ '429DA945C771332087229D2822684175DC050F832EB9F0ED90F868E99B6FBFC1' : true,
+ '42D6DFA920BABBF7876416C3F5B30598040F6A748F22E3C3E0E2D32DEF098AD1' : true,
+ '431F835569D356C0C577FFCF90DDBF9B17E16D7FA9027888B708071B696E818F' : true,
+ '4321F690235447D71149C54E13896C885D07524C80CBA133428E1BD235123234' : true,
+ '43555C20820B179886354E63251A21247292B3B7BA46D8BEE860A0313258136A' : true,
+ '4373B2B85D4FEFE97E79B4C7935AD1762380D97FAE2C64FD61E58593F8BC8C4A' : true,
+ '43CFA30A34E75D16640693DF32B691B40219631AFFFC6A09DA97006AFD2811FC' : true,
+ '44338B3B7D1302BEC14439BFF723B5AF93DC549A7E1E417112C76C1455108EB3' : true,
+ '44CE10B295D3908C5CB40661F3F07EA13B27A31F32041B79D12AB7F5250B4227' : true,
+ '44CE6D5CE40E8F7BE79569A66792B181CA71DF0C80D3CEDA59A151F2E7CD32E3' : true,
+ '4533B5CC20DF3613F517118ED8D5AA328EDE18610AE99E16A5B6AF21EC0FFE17' : true,
+ '45CFA75EF370F3B3C2271E4AA0F99106B3339B6FEFDA5B335CC863F0C6F66323' : true,
+ '4603C35A8304F6057C253381D39404E8B40AE0958B4EB2CEAB7777CD85802C0C' : true,
+ '46236B9468DB40FAF467AFB0C35B517E514251530785695F54440E6730AAE44A' : true,
+ '46584E2D9BFE069862BC6449C85E904AF29A71887DCAEB14C191D75ED0AC1FCF' : true,
+ '46853D3090658137B446AC75E481E4593CFF61E22115C348521D70EF398C05F8' : true,
+ '46C05D7E95263B17CE368AAED872817DB0517CD9F388396CF42568DF88C96C67' : true,
+ '46E74AF8240C97D2E91E118761CA4F74371BF7D2266601BAF6084BB1924B62D6' : true,
+ '475971EE29368BC1FB6B66D497096A1ABA32C66A30C7D554CB11FE848345B46D' : true,
+ '47828F3C65E9FB0113793E5B60E19A44BC9775611C44ACB65481842FEE2FA819' : true,
+ '478D230215F850914D64BD43327923DEC9E52B4F14EF5E7E9122B16F40B2733D' : true,
+ '47A1BDC994354BC3EB242FFC12768EA8633719084BB5A159E30FC4388BED59B7' : true,
+ '47BE050E9E76AE62AED5EFF6EA9F2E0DF1FF0E7A3EE2B6B68D60B3C849E070EA' : true,
+ '47E134C83737EE674C6AC46306C325701EFF7B0A4C887B968593CC1F5FCAAF0D' : true,
+ '480ABF7202B5437D84FC1F475A30A19C18C7F598BDA1375E8AB84829B966D596' : true,
+ '4810562E0CC4EFD265AC19316F353D660806DC54231D65C906C6DB1E86EEDAC2' : true,
+ '486F62E8D5F6323416CF210DDBD26A256AF9AD33F70A2C1CF8915866F74C149D' : true,
+ '48DF42F374FDCD58EB650256F421F6C1A73F663DCB8DE0972DF9421205509F8C' : true,
+ '49AC28CE0DDCDA953E64E7D131DEA9EF57169FF3280EC9FC6DAA88C943EA9E76' : true,
+ '49B7DA13E82D9DEB867193B30E48CD1279A66A6FB44236E1B93AAF62F58EE077' : true,
+ '49CB0BC132E548E6D6A5BCC31C2254016BC2A181755B5B13D1D27218404D1C74' : true,
+ '4A12F9678B1A5B4677054BDA1CB6B41AD8A4F556A184E7E4C33669EDD31EA50D' : true,
+ '4A60AA57F2A0858D4A3A9696C5652432997B73BDDE06880BB3DE7879FE79B87B' : true,
+ '4AE41D7B98B74E61B0D6EED291348B881E5531B4ECEB9940631835EF6A8CC60F' : true,
+ '4AF1D354BDAA3AB076BB6A02BAA3E1BAA2503D21ABE54B54001BCF62C0982721' : true,
+ '4B2851A38CCC082ED3A24F9DCB8C917F572D9F064CEF218D2E07ECBAAF6EDAAB' : true,
+ '4B6B616E1EE80E17D1BB037A2831C3AAD7E6CDE3D89A205D1F7D6E0854F3C21A' : true,
+ '4BF10AC1958BCBEFA06944AC7866E3458EA70E6ED97DBDDF01A84A360C3B71CA' : true,
+ '4C1A5506EA02230980E66C1CA936B268A3C453E997733E44074640CF4653594C' : true,
+ '4C3F647343026A15ADA9E047A8B4527FF88F9D01A2B7AB7241947443F75D5E96' : true,
+ '4C6FC9852280F11829BD4066C38BE6C1FE4E4C053F6126EE03D15EC3D0BD5B15' : true,
+ '4CCB36D30DA2AD2DEFBFA838DE32AE64AC8F6AE138E0A1FA46D1E0CDB688974F' : true,
+ '4CE6DB77F8EF355DF6EC2ABA7A5989DD0F2D0BB228DB5DE69BE7C83E3603C69E' : true,
+ '4CE78AB01352DC6AD84A195DD333207A43CBA0372546FEDEC9E6803DA6375403' : true,
+ '4D26A014A4C4007564C743D9BBF9C2DC9A5A881C05E549DFFDAFCD3814F3966C' : true,
+ '4D53CEABA15DE7DACABA8689C96832B59F66AC55E9E94CB595405004A1A9AF29' : true,
+ '4DC47950ADC2B7FF5A9A57167E343AFDDB27155DE0D031F25149B622E608B8CB' : true,
+ '4DD59EC33898319B54EE610C9A4DA78A87504FB8631FCA5783223F306529FABF' : true,
+ '4DDCB0EAA387111F7C2E0355AFF2C3325514BD9D9A3812295F7506999838B7ED' : true,
+ '4E0E281DBED708FB0AF032A0233F134D3BD309224DD8BE9894E749D1AE9BA37D' : true,
+ '4E5AD8D52C37A505176F9BA95BAF43CB5FD5A7FC4654DC71178ABEA8188E7ED6' : true,
+ '4E88949F1AA84802EB493CA5C6CDA9C6DED49A4DBA0C8453139C89A9CEC2E041' : true,
+ '4ED3C78D58943651EDB04EDDCB696F91F7B33450831CB18ACE714720AF4523EA' : true,
+ '4F212E4C3A8E4EA8F7D258A988D5930F05A8E61E78D86DBF9478DA2DE8F01B54' : true,
+ '509A3662D987A2D5D9CE7943D1878A36DFC4A786CC185CC9DE1D58E15E2EE02A' : true,
+ '50C1358C5AA5556E967E2CCC1397BEA364DE2E7C6704B6950E423AD5D5BBE798' : true,
+ '50D5DCC8D0668D34E90722924EB28C37C803E34156DE8E61DAB296DBD37F5993' : true,
+ '5112E6A8D06852BA07669C1DF31EFA1BA2BE7894C3F0F7B7282FEEBB698F7F4F' : true,
+ '512EFAAE67E525C0DC3D7AF491ABA9FFA1B7439031207D293622E9286F0BB562' : true,
+ '51452CADA5B15129E04773A1BAFC3166F56C59B4CCF905060BA52EB6A877E1E9' : true,
+ '5184A3AD148B610511D8D02CFBCD2993AFC3BBD576721B617FE7CB1DF53C070D' : true,
+ '51ABE9BEDE2D96CA84110007FD6626F0ADF9881A3C74870C119CEDBFF2B4CE54' : true,
+ '51EE14CDF007AFBCE34D598602831B21661F6FD7B6C04B0D34817757B4D007D7' : true,
+ '52B8E665B8191D828F946C041ABC28AC6A5719A4AA21B1C403F7611F11A84F31' : true,
+ '52C584E4DA8D3FD6FD63E83B2EA0FD6D98DB0413776C26122FF0420A3F0F91A0' : true,
+ '52F208427F03726C6DE3F5308C776D690F580EA39DDB01595DFB54364C48377D' : true,
+ '5376577409E17E8F37B2CC6FD486FBD356FF2AD0B5EF520DB7CDAD06C6A6F3E0' : true,
+ '538735DC5CF27D0DACB0FBC4FC24E0598D8838682CBE3DA8C37CDA60F60BE64C' : true,
+ '53C57169154423529775809598828294B218B2D2AFBCD3F2561FD072376CA188' : true,
+ '552771717F5948A7FBF93067CF25E5D1D67A63C8A3DD09EF98603165874E3281' : true,
+ '5545F754EE0194995FACDF3F30F3E6A8B0749DD750B0B5964B16A5D9B21E9FAC' : true,
+ '55E0EF8E07B79720C78F3E2303981BAC4BE4FB417D858E3531716DEA81BB8D67' : true,
+ '56B5B8AD95FC9A853F180196FAF9BF2896A8D2E053474ECA3A19295B1D214AD1' : true,
+ '56B6BEB3100D40CAB0EA4E450188CDDA653F473F3F182578AAB314006E66FA5C' : true,
+ '56CC8586CAB1C99C3EA4C1D35E91FAA568DED02AA74364D08F480A0EEE4E4FF7' : true,
+ '57383F2DCB3A5959514A8C0CB208205EEF70D3A899BEA2AA7D1B6FD13BB23BD8' : true,
+ '57A0B57635F2D75EBC9C3B166E68E35E1CF91BD074AA9D5CBCB3359D93F02859' : true,
+ '585CCB444BDE628F6778320DE64727701AABA22F826C31063082CFC5835742BB' : true,
+ '597C180F976AF183984FD9B1D015D000C55AF0B873FE4A4F8E782D191285BAC1' : true,
+ '5999169B7C3C7ED6E94A194BF0DFF7D07EB7581BE8C82E77B83DE42263F6A673' : true,
+ '59E0DDB8377B568DA0FC1E2B7C482CC6331DA441F85E7F52FA8AE280DA90D051' : true,
+ '59FF0CC641EA56CD3670E81E4BD76A487163C70CCA729E0710D49AD1EAD70634' : true,
+ '5AA16CEF791C27E12F900F07D5FC9D0B3386A1FCCF2F547D08E94AD34BABB775' : true,
+ '5AA7341552FF047164227AEFB41437582F7116D76B854F54920A5D6A9B72271C' : true,
+ '5AEDDAC786E11B696A37E5506BF5CB702A3B803BC8506BBFF720788401D595A2' : true,
+ '5AFD1775AD2CAA741FCF1201AE206C4A1286C0DBF751AC035BAADE571F002927' : true,
+ '5B11479053C46A16C629C58DD5EB40529814B75A6BBDCD6BD6FC6BA9483D9669' : true,
+ '5B1D47E25C53FAFDB2894D342FB536794A99B4D0F4C0BB994DAC22CF9247F166' : true,
+ '5B67A7FC34D1885F7351DC949794160E0DB6E6C193286145DF8E483F21E90B80' : true,
+ '5B9F8603E75E06129C216E4A2DF6FB4EC184CE685F6C229BB85233DFFD2335A6' : true,
+ '5C07B9D0BC6C5C3634102DAF631A330FC02BF579A3421E1B8483E076953FCDF5' : true,
+ '5C2484F4DCA59EC5D77C5935BF71EC473995A9F7D39B0F26D2264A279C6DEC96' : true,
+ '5C25116119EA6FCA1D13D54D4870475E5B3D34B060605E02F9C7521D3EC47441' : true,
+ '5C34509E57E6B30A28891841EFB2A5F0D051493059DD80157C19B2822A97EAF4' : true,
+ '5C95EA9F41391B1D2609E3CBFEDDC0B9B865326B4526176D5305DF2EEF5AED52' : true,
+ '5CDF3C4C27BB3B1BBE8C6AB81EFF3FA995BBDFE662A0BCDED869E462BE748486' : true,
+ '5CE0E2F94DE7BFC370B5C429E1CE1A0635E4F38D55BAF122748D4307F1709DE9' : true,
+ '5CF08039C4F9AC5947E941DB6D681C0CD7971AD6E068262D919060C1A66D5FB2' : true,
+ '5D2112B7777AF1BBA029F1DB3D166086C0379669C01C03FCB1667645F32EAA35' : true,
+ '5D5F5FC12AC675264FB7F2783EF62458304D84B09BF62E19EC1B91243E3E5487' : true,
+ '5D77443F3FFBBAEAB8C88714A8EEE37196F7D9CE89517806EDBF897DE0215763' : true,
+ '5DB16AA171CA274D753222AA4EC17827814F5A69CFE72D092397F048CEEB2370' : true,
+ '5DFF17B36C6CED5E5607FC2A8B6559964A23AB8B08181E1CAC94E3B213767A1B' : true,
+ '5E579D296D274F9A01D1E1A7410A24029948FFA01595E64BD2E492EEFDD1F702' : true,
+ '5EC75158F235F80BBFC25F40D96AB89CC35D8578BAD11410B5D32CC33428A00E' : true,
+ '5F05ACF54EAA38008B650AAA2DBB3722805C793616B1A21B43E1879107254E38' : true,
+ '5F6795C104B707429A3E966D32F847FF1B18497C73A45F6EA5E47378EF1D3823' : true,
+ '5F98F1AC11CB74885CCC871AB7CB1B95989E9E3E7482BDFC32895A65A783AFE9' : true,
+ '5FB819ACDB4D470232F59DBE853A5BC55C3713062ED6F75AD35982304E14B32A' : true,
+ '5FCCA125301032F32C5C915A1AF5191FB7E0ADB6E36AB4210099490CF54C2C27' : true,
+ '5FEFA4F01BA5AA16F36E2A4125C2E0F808B9503355BF09B3189A623B8EA42E69' : true,
+ '5FFD23170DA2D4AF8278447F473A80F69D41889D6C91F3A598E41B4C1170E43E' : true,
+ '60234A884EF08293BDFED2AA0F7A12164317F1453966758A66FEA4AA422E9A14' : true,
+ '6085325DD4C19C14024B66E50D6FB600D161AE12B569A70B9C1EFFECBE9C2A3D' : true,
+ '60B1AE233D6CEE231FA2D0B3D5888FC9842087D2ABB3CBCC6E9C230D974F5D7E' : true,
+ '60B7233177358390EAA910658D1D063B57CC3D5B76F70E521CB81E39DB9AD50C' : true,
+ '60CC6E8C652D1CCBFFA42DAD8158217DFB7F42B9EEF9DBDB795ED372EB2AA728' : true,
+ '613E70A1BE3CA6314EDB7C00B2477990271E0C8DE8210EED56ACD391E8CFF28F' : true,
+ '6167E58071C283AEE1B24B692C593747D5FAD1B3A001B1CF11569E80FDA44152' : true,
+ '61F83ABFF7740C9144959145660E563D682A8D21E20B92AF581237F621A5187C' : true,
+ '623760585A2256D234ACE51A98E31B982EB5E5BA2D3CBD673C747FC832529F60' : true,
+ '624A2686ED8B75686FCCC3FD9DB8284E94981BF30BDD2453817BD653F3BD9CF2' : true,
+ '626042CAC6DE8C95C77C0E732144FCBD63418D72ED04CCB42FCBF260B38B21D5' : true,
+ '62C06D5EC111BEA1222B57F5BF5FA974B5025C3554BCFC2677048DF4A2EC0170' : true,
+ '62C4876E637B0361493822910A5FEBD70113B70407AEE4FDEBF249585FC4A069' : true,
+ '62C9A052080F8EBA5E8FEB9615B5CDDFFF1D74F8467653030CB1BA12337EB5D7' : true,
+ '63448627F20BDD4F11B278941D82DE56AD3A689CC06064D867FF060FCFE29A49' : true,
+ '634783AC64589BF61818D6D57D8C3628FBECF3354AE91725CC1CC3A6B62E4E0E' : true,
+ '63591FA550D322410D6B2617A3B70A23046032A8CB2F96F2CFFF9111D46489BB' : true,
+ '635B65E10638CE83AC12795BB42A235C6DF75DCE35AB6901255D4A3B0DE05FA0' : true,
+ '63C46A097FF0E3D00C6ACAC2029979168DC83ACF453ABD79E9502AEDFC9736A2' : true,
+ '63DBD2E32AFC1025D4AC5CABF8E6E61ED4DF6D0DE50533BFBD6E3918F40E6EEB' : true,
+ '63E6A22E453B17B4EA3E35C6E39EB315DBB77A237B1BBA9BFB2B3BCF675A63B9' : true,
+ '64261C63D988D7AD86D209177AEF7DB6EE3E62151B54C6FADF8F100C2750D0CB' : true,
+ '644E41BA23C44182CD1D12265833CF5D62553B2192496B051118DE945E0B5BBC' : true,
+ '64831454483CA9CA55859BBD324F492638DA8179EAAED19EA3CC8E16FCE7A83B' : true,
+ '65B9EA850436692D74A1A350E112A63BB4F2B9E4B10A602707ADBEFE76B247F2' : true,
+ '65E435C88F831D080BA50F37D0668230281DB9A679D705FBA84820A44D822540' : true,
+ '668B926F5EAA59F351B7ABFCBBE5FA17B547B01C5A7D4AE385736CE8FD13359E' : true,
+ '66E91987E1C56D61C6210022B93C24BBFA83C039C8C13E71A4E949A252792B77' : true,
+ '66E9E8A83F938165FE2D1F3E6669FD46132CFF7A2F99E5D23CC3CEEE0A07EFDA' : true,
+ '66F68579A292313FF975514DFBE38463C59215775C62323FD02302F539E3B252' : true,
+ '671DBED9969959A1ADA0F9DBAAFB7DD35CB71FB06D0337DB178E34BB5CAFA9C1' : true,
+ '676EC356B302BAC4392ABCD0702056E398C3092F6F3C66B61CA17171FB8196A5' : true,
+ '67E6D8DB673E4B9ADC12C134F94EFEBC055068A7B255AC721582D7AE3FCD3D6C' : true,
+ '68EE7C99FB1E2B8F0DA74C5339E58C6A1F7C2697CDE363B2A8A6D8E012D2C773' : true,
+ '692C08B2A888E8B373FCCDB491C531D58002CAC55188368BB037DDA1F2C829F5' : true,
+ '692C7B1D9E68C51DE61E300811DE5521D900BFBE44AA0E5211A4622C51A1193F' : true,
+ '6981222723F6C1FB0E7C14D8181D0799F0657E123C470C759F70A78D995B7102' : true,
+ '69A828B3AAE09B3F1EFBC53DB56353AF2444809A08F188668225B2A0EB520FC3' : true,
+ '69C135C5854B93D0B081254262DAFDB0FB3C0603D45EE6F5E91BD6678CF5A6E9' : true,
+ '69D7A817007EC6958CDE66700AE1372870F1AE4710026D3F93EE1A15E024C880' : true,
+ '69EEB2BDE9BE075A2C6927DCF5DB9E9427FBD153953D3843BE5151A6ECC3D560' : true,
+ '6A14524124841DA5A7C0A27539973C88C77C79EE8C190068EAAA9218CC35AE76' : true,
+ '6A525C84FBFEF83BEA806634766F1530D9C5964DFAE49BD2F678984AF29FB474' : true,
+ '6ABF9C8C111E6353439EF682EDBFECE4F8AF8029D4E9F3F0E638C27A347DBA14' : true,
+ '6AC112C1828538894A1FAC7CECE0ACFEE75658118041513498E880274BD2B7C9' : true,
+ '6B02CD14A3675354A800006220E94D8D4D5F9774D60EC984955FF720D927E529' : true,
+ '6B59DAD53B5D9FAD67626890D678177BE94BBD7C8E7815986BB28C09BD60E9D2' : true,
+ '6BF07AE522AE438A1736D449CDFF0D8F72F7690C120CD9F51FA2CF88160E8980' : true,
+ '6C636B0095B2D2ADC0DA3BEA01B82A14130410220A5692C3FA2F374E07EC03AA' : true,
+ '6CC97CE9EB4776E7E4EE831B97F15D992FDDE766B9AA2233B41770271C0BDD88' : true,
+ '6D13CD353D7F6723CC79620F59D5ADC6FF6FD185B9482C0D3044B69E8B60434B' : true,
+ '6D3BBB6612DF6B07FDB7630F79AE3C8B7609A853AC5E95FA5061E4248BE9CE97' : true,
+ '6DDA1CB95F5505512C2759E9F6ACB12B2F66CDEA160527EFA91D2F1CE057079F' : true,
+ '6DF2BF0E57C2A025F1FFACF32B574A50464D613CA9873BD8DF692B62CB1DFD74' : true,
+ '6DF8AC95B45A03538483369BAEE17EC1610F591F633E29A9A4DFD0C29E28397D' : true,
+ '6E01105B0FBC4CEC9790A2501D4DC5536754CD3B71480AB7C200B7A671A643B5' : true,
+ '6E61AF6B9F05C441F3AE6B3FE2D5A6ECF9885A2B223703D1C9660D14E6102F7F' : true,
+ '6E7E91E395DCD00520BAB2D41630963493456B73BF32E23ACBF4C2BBD5F0A703' : true,
+ '6E8D6125A9037938869D2D9C291AC9A2AC3731A6E7429D9E2037970069B7659C' : true,
+ '6E95E8980B03A9FF276C6A4F68B46DE8D29410A9FCF4285633DA91647BE7E10C' : true,
+ '6F6CA3B04E355CFF85B89EEB861EDD2D91CC874EEFE99A2D9B0A3095653D9E97' : true,
+ '6F8652847DB9289EECB5A58CA15FA522DA5F26A60E0BAFAA1BAAA37B32FBF465' : true,
+ '6FBABED892623FA77A93005871EF0A6374050AE9F3D3A346A8BD4558EE3959C1' : true,
+ '6FCE4CF77E254C2920BE515857DAB1929ECE7638DD8C370C1AF6A374F36517A6' : true,
+ '701E5C167D1D2A47E29F6E0EF64D59D978CA3287D20E3590ABF531EEFDDD885F' : true,
+ '70202315E3423BCD73E6A3CE51D0F541A78350111E683D8BA64AE9271A9C6369' : true,
+ '7066B709F68AFBA83E93FC497B97DAEE440AA3B27F8E6E32DFBB1365C3F2EE68' : true,
+ '70751440BEBC64501417A81F17FDB0FD31052D19DC361383EDE63E647ED1D8DA' : true,
+ '7081C7813097A8602BE2DFE4BF202EF4574BCD4DDF51FE8C7A2F872F93481E83' : true,
+ '709A501B0835742664FB4C650498359C1576F74186B0D12129A6E96A5C09080F' : true,
+ '70EE22590F5CFBBC659A9EA9BCFA0C876694116323562076D6FA6471E79907E9' : true,
+ '71168AF1899C2122E92CE1FAFCB2EE64B9CDE6D14069E7412F492C9078704F26' : true,
+ '713C52C05CB8B1EA3B27FBBE33649956A33D8E1AC4F222EC3B90428E52C28E00' : true,
+ '714F1E26865618BA75AD738AD3B843B14D776EC9B7D617CA4E7C2DBC98C8E7D2' : true,
+ '7180F1CD379E01A81DB181F3A839C48E64734FD493D1013367A7287181C4A7DA' : true,
+ '72FB0C9D7767CD725184EC22406246CC4E130E49E4630E2D5BF248187EA583D0' : true,
+ '72FC451177A264EC01165ACC89684C137EB92467BB44EE64962C5D1AED5F8409' : true,
+ '731D2388EDB673DEAA419BD26B43D6AE7D27EFDFB47B6A1124EB20D30F90965F' : true,
+ '7356E86E8C181E623D168491A780BA7011327CF716B416619FED3C3878A425B5' : true,
+ '73B26EBA4831AC03380E60772E12BE78303E9A6816058678BC432BA8D640B3F6' : true,
+ '745D3184B509466217C4305CF4082681DA91C917D7C176D5C8FB8C9810C1EFF0' : true,
+ '7464C196FA42968ABF359C05DE1A029FA4CC551380CBBE661CCBFBB1C7865E70' : true,
+ '74711F9774C66CEC41DE4FD32197132B13A40A6758A106DC95BCADB9298A6241' : true,
+ '747E80C10894375B82C313C81766E6757B1B28E5BAE75AAB0BDE87A9242E8655' : true,
+ '74C7149B1B6739C22FC0102A7EA2DBCA770432A85F2095812DC7961831F73EC2' : true,
+ '74D4CF230B19F9B9E3C674DB1B1754DEBA59A837534135CEA2A9DA3496876FD2' : true,
+ '74E0485AFE164965FF9F982F0999B980CF05DE73016EB7F6B38B105A5E07564D' : true,
+ '750C7E44BD7AE01B7D2ABEE54139FF35FC53DDE34A4E0802432CB08764E211C5' : true,
+ '7567AE3D698B690FB2349D4468F155CEFE64ED1975B768E791D934332970791B' : true,
+ '7572D3C2860E9D28159C0337E8DC7C693F307AE0F1F02E0C35E091AC1C1571F6' : true,
+ '75B0A587771EFCF6AD7AF92EFBDEFF0F4E5CAF9883AF521B9B13C78D247B5A4E' : true,
+ '75B50B0EBC80D619AC5A04DBDF5C622B1FBEE1F299594B0E4CD6B6363BEFF8CB' : true,
+ '75F12E7E7FEE1F0AE3C22D1B94D33E4A31EC9C3B0B30338AF4EAD52856A11D26' : true,
+ '7607259BFE14402887557E6AC9BB570FD9D3927DA048FF9C7926758ECE32B824' : true,
+ '7633A1503B4C364C9C55BAAE30CC899238244FC16BEEDF7DC22E54CB9B569A6C' : true,
+ '765511648B44C53C9335BA4041B2808D4B9BE5A3223FFB901ED32673D5898A4A' : true,
+ '767EB0B508322CA5B9E37A4A1CE1CC43F5AFEB557D509AD50261F25DA73ED0DE' : true,
+ '76A266265F7454F38CBC307C9FECDBE80081097444B97BCA9C722D93219EA358' : true,
+ '76B1A25306D53B410FE5318EF1D077B29081025ADDD40CA55ED4A0A1EF557E65' : true,
+ '76EBE04192726D45EAEF654FC3DFE992E2297DFDEE303BBE89C8F425269F41E7' : true,
+ '770784FC2B1A52F110194800E972006E868F055C52A8BE467F3AD7BCD7E441CC' : true,
+ '77C5EFEDC19C242BDC746C5EF4A1DF4117918CBE078CF6DD65FC274DB64CFBAD' : true,
+ '77CDA7C1BAC564BA322B350C6CEC0B9E813104332905F2D556603B8F661AC19A' : true,
+ '78C30D03D640DB32D06E482ABA1084A967544E9081BE94CA87CA4FBC2141C6E9' : true,
+ '79244B0AFBB3B26770A470A4F23555757DC25D3856F56D0096D9F06EB47D5889' : true,
+ '792EE0B202E6A45AAA85E918497D9C9F16FEAC99500A7940C0FC812ECC42120C' : true,
+ '79B0B3A8D1BDB11D40FE8B93868460B339CEE667DE3E94C880AD9BB14E50CBFD' : true,
+ '79B893E3487215CD87BE3BB3CD5CE1359CF8385BEA49A5E45BD03624A0DB3D08' : true,
+ '79F9792935CFEB56CBCCF76F92C17E93606B2774C0F3618F2DE9BFE9506AA04F' : true,
+ '7A081DEE8006EF40615953A1EF9BA820BADAA31338157E69660B3EBE7852838C' : true,
+ '7A0F440C38F18E15DE15BBD496D670B48571AC7A71EE56F0F696E26FE1C06C92' : true,
+ '7A898AD8A9DC791DD00EC4F1C6CA3F1AFBF711D2A26E99E6D0740B1B5FCEFA49' : true,
+ '7A938A727247270556F67BCA523A333A2F22573331A6D696E6C559302C9C1912' : true,
+ '7B3234A53D173A266510B9777DBDA7F372E40651E07B910899A0C1063A560787' : true,
+ '7B40E5E9E8A2F63FFF19CE2F4EFEC73C902CD146E75DF866ED274651288DEC80' : true,
+ '7B45E99CAD17290A002ED52128572713BDD96FC1544094FE297EDF28E4D40063' : true,
+ '7B6DCA23E77F3424FAA26C0DB800ACB6E3BBC3DC13A11EE4679049EE3DF03A02' : true,
+ '7C6BB49D3E96F1125169FEB59751BE733ABD4F0D2860EA0A8F1A5C9B14A62968' : true,
+ '7CE1119D84CDCA99D2C1040485C894E22A02106EEEAB39FD20650BFBF7CC5948' : true,
+ '7CEE465792A72473B5B70A88F140AA27C5DAFC6C876AD88D2E45423D9CDC6C06' : true,
+ '7D100CF85EE12F47C6C9755F00CEDCEBBFA513CEC80993AE5E7FAF6F68289C23' : true,
+ '7D3EF8DEBFDDD39FA7CA90EAC62E660639521686926488A315B10FB2A0005F6A' : true,
+ '7D7753734C01837BEC44A0E459A049D96683FF8D0DB78878C3BEC4C9574B412A' : true,
+ '7D817F280F1D664E0C9E717287D6AADB1132D4F3A3E2001B94009119733C9434' : true,
+ '7D886B62A526E2B996C9F715AC5B23D07EDA09AD69D18E8F54F5210166AE0C8D' : true,
+ '7DAB96077DBBA3345EB176EDF7919AF6889938AFD1D9BD32105BD82B0D1CBCA1' : true,
+ '7DBF7C36818F0BBE711267E6192080F75CE8908B48C9E6EB9626DD9B05308A7D' : true,
+ '7DE8C95508E4933243E3EC7D7C222F82A250E1B71C5619C547FCDA51146392FD' : true,
+ '7E0CD7D375698FDB4C4FFDA33ECBEEDCC86ECE5ED8942F85B216B022812A3504' : true,
+ '7E47F4F45DE3FCA19673D070AA99E0DBFD6049A98B94D090B6B2168A1347D6E7' : true,
+ '7E770FF8F54B17E68443C8D43DCF1661C1082C024BF46DC66716D39B7BC6FA80' : true,
+ '7F0F7FB9B5975CD10469ECD29F69E5C11CDE9EC561684535E8A36CBC514D3DBC' : true,
+ '7F3B3BE589085EF5F314845A6F850F9411F0594FAFDDF725D3AD3BB189BBBE99' : true,
+ '7FCD0B25EEE0A63FA151354DC39D42CA58AC10D8ED9EB4E0B215C652C07D4E28' : true,
+ '8035EB81467C64D22C3624A58022AF1B5D0D4047328109CABB74CE6B580A9A8E' : true,
+ '806791E1F1BCA3B3AFECAB7D1EC6FD66C2616C6CF13A3256AF0D53AB0A759BCF' : true,
+ '8126A7034869686473438C4C7C005631DF665491A9CE81D9B3ABAA27D327CF75' : true,
+ '813CF894750BE7FE8A0C8B5003B362D62D400F6F08BC1FCABF247172A63B17E7' : true,
+ '814461D429FB2539D44E02913E03F0698FC1ECFF7894260AD3AA9C2716B99E0B' : true,
+ '81A524F4768E8D164B51E023E9FDC90DFBD9EB3D6111C0DA5328B8743253BE8A' : true,
+ '81C82F1726447A63776BE2F5E36CC6DEDF0C62F3B11C7C8B7CE17E10309C4569' : true,
+ '81F32F8C3E868A588E5F34A64C6FBDB483891716BABC5C59D75391A58D8C6146' : true,
+ '8249977B7E0D31F533255488A5416349A1C6AAA59C330D6274C82364324C3870' : true,
+ '8256476D83180014AF0D76C02D405990926003E2052E205DD66B158E69DAD7AC' : true,
+ '82668C1629CB39A7B5D9DF6BC94349FA113F915999799DDFE31FF1862FACD095' : true,
+ '82C49DF2DF809141CB5FB30EAA8E41A3E510AC7F51CF203FAC2B16F20C96C2E4' : true,
+ '82D1AEF2AFC46271D18C5FE50811DF9A5EAB812156C2FE6F531A34FD529E75A9' : true,
+ '837CFD4C8E9033F38B46225EAF78A12DA6636DAA0CCA197FC964B51092C55634' : true,
+ '83BBDAE22AE7CC2EEC0698B2435650633DEE4E0DCF849789C974976D4D641C33' : true,
+ '83DD8D43E88B8D6ABAEA06F3A3A2455C8F6F79059923A08A8D2AF33233F5A63F' : true,
+ '840B5405310320AE110F3410F585B799CE365AC1076CA0CDCD94CA6867A9166A' : true,
+ '84A8C623C4304D57CE03893ACBF4E51FC9975C58658B89127508E5C33BE992A7' : true,
+ '84F98B7850FF7A169D5642E9EF4401DDEBE465DFD5BE957C9EF18CE9988C11AD' : true,
+ '8524BF9691E1C2AB2BA091218096105A335A0315C8282E59B6E8346B11E36608' : true,
+ '8583DD0B4F3B4EF42A66A8D6E369B1E2FCB8B7C64846B242384DF6B8FA0570BD' : true,
+ '85C4AABFC4B38B9B5D0A4B854DC02527DEC6BA1761B28F5698141AE36ECB15D1' : true,
+ '85DFEE3DF0EC8DFD281A3DE35C80A220A42FC9CFA1EA353349D98FBB58DB6E64' : true,
+ '86154D1D0FD89E4E1FCF72511C74A8B2B0DDF4F38E675B649192ED0C9DAF84CE' : true,
+ '8685E22CF1BE901D8E954A0674DB6EC013D9627DDC9FB81D3EEF752BB410DCB5' : true,
+ '87108514AFAE3DC15C9F52574F918D7FAE18350602652906E289802FC543E61E' : true,
+ '8769B55BC6349F2874697988D13507CC28F9EC6630431A7A9D360046DCBB3190' : true,
+ '8769C6220722FE98F6EA21C5456ED2BFDD9112CBAE15847B239AFB2E6A630DBF' : true,
+ '87C002662AAAB5BE7B6A7CF4B1CE9036E3A2A70A0A3CD80F64005C889ECCDDBE' : true,
+ '87D35135D0372CC692C261453242880BE00159B60C2450AC7D7B84DF963FCF8B' : true,
+ '87D61B9AF0E0A2D9F836AC304E2F5A84C543275820BC4BABBE3B75A0D182DAA0' : true,
+ '8858520A8D4E5C88D777C33963CC7F43E796B555E7FC573681B59DCFAFB43EFA' : true,
+ '887A5D0381838CCC20D204BBCFFDD864AB71C20D2BA06842921BD96BB171A796' : true,
+ '88BDA25A602E57FFD8A0837257CE1618DEA23AFB0051874072E85CD98F740F07' : true,
+ '88EBF5BCAB2CF8C43095EC58E1BD0E375518B5C734CDC394BEB34F3A7B0480EC' : true,
+ '8919E46CD5418E4CBC8FEA766240D5918B48BB28BAE25743EB276B996E6E7B73' : true,
+ '89489486E767E3C410896A44B28109680C653391FA763E7A21ED1FEB13540DFE' : true,
+ '8974A885ADD3112CB168E00C10557410A89955EDFA94CCC4EBA3F5A51759D8E5' : true,
+ '899F08AAF5A4105B9B6CD106464D7634D5B27A444CDBC70264B8CFB56D290DEF' : true,
+ '89CBF98E81A0F82966E19BF3BB997A2E0BCC7C90FB83A2D4627FB311B6FD1D58' : true,
+ '89F5AB7CB2C9A8F6123C4D2F3F4FE378BEEE92B2EF506202BFE847DB058631E8' : true,
+ '8BA43B5CC73958FF059423C2AC018F994F6FE3A7E88C4B4E6E89ADEC692FF1E9' : true,
+ '8BB672CAE5B222514864A8E4FB8C89A774200D7773F2A56347C75D5094514C74' : true,
+ '8BE5E1A7C8736600D204B7C20EDDA49E72107EDA9AA5E03F971FB24FA8F8C686' : true,
+ '8C2DDBA5CA9E4CF79937A5A3AFCA79F371B6F235B37308EB53ADF12C319A7EC9' : true,
+ '8C6DDA18A4CB339717E1321FBFDC9A3ACC52F2FEF6FB453EA389A2B43FFFC63C' : true,
+ '8C7CFA7D4BB49D306857772722769DB1FB9CDC09F565F22A8EC082D956E93694' : true,
+ '8C85C2F6E697880B740C96BF35FAA02B4B2F718DDBC4A8ED6ECF9EBD7FBEC1E4' : true,
+ '8CB93E0ED93C6730B58CC0314B8158A7A92184312C53A7CDABF05B369CC7E730' : true,
+ '8D0CF6F0B227BE9394DA0DADABAB81A44900D104A915645ABF030220F3AE187C' : true,
+ '8D0EC1B68E24C1C390A7DCE081085A14CB27FE8B5CE652A60529E04825F289DC' : true,
+ '8D7E00642EF079DCB1B9DE964075E3FD44C63D7DD6493AA3507D87D0E277CD25' : true,
+ '8E6419A3781E9E9C262AFDF8318332504EEA56B39EF770B9882523D132B85AE9' : true,
+ '8F8515B35B665B69D0DB9661EAE9FF0829B71CF4AFEB3BBF988BEE73985F5D3B' : true,
+ '8F9CE539058EA5E0587C8E79E554DBFD1971FDE7C5A96DD1EF7277AFC2EF70D3' : true,
+ '8FDA31393381A23479C8BFCADEA59DA75A1C390693F72CB7B546C641BC698256' : true,
+ '8FDDF56677555109B03ACCF8F39EAF657767096D71F1652125BBF487FC6BAEFC' : true,
+ '903081B318092837E460229248FA67A70B01EC6DF9C9D279188ACED18F1E6BB8' : true,
+ '905AF56BB5517C973A43C5B576B40C5EB69F00E615BEAA8538D294E40BBA836C' : true,
+ '90859FF52A82829F7DC99392C6AAD9F346F54ED3D468426C26233AD5D189FBC7' : true,
+ '90BDE9F4CB3DD673BDB6C641361BD8B076A985903DF004AF7E74DAD95EF82E50' : true,
+ '90D6AE9953E31E3DA34A67533E444BC924E67CC2C610FA468DB31E59B1A35471' : true,
+ '90FF35B27260290E94BE3E2FD6F62F412A3FF4303E38ACF6315E190A1980A095' : true,
+ '916A17B983FBECECABBDBC4ECA80A330919B2EC1F3F4BE4A54832B3874EEE5AF' : true,
+ '91CD0D276921BD32F4C8616BF2676078C24E39AE1B30943C5263AE0377F41F21' : true,
+ '91CE410FCEA8EC201D33AB8E7419BC60E8EC83509B51D10BBAD728E2B6EAFB1C' : true,
+ '91EE28B14AB2C7571BE6CDE2D75FD4C05C960FB033DA819EDD463D5D3C494591' : true,
+ '92624A843DE27E186FB6C18ADEE88F30E00A984E44BAB93108BFF565AFFD2A15' : true,
+ '927546232861B1DE9D105031E4A2502A170A06D65340705EE3D7ADDD34F9FE0A' : true,
+ '930971709C7B3F9D52B30CD42E61D03BB430A1D8641F685F5A9F730760FC78A5' : true,
+ '9343EA576B49D46887962DA39BEBE09276ED97EBDF47A82AA8CA4F28A04AC789' : true,
+ '936EC5E6437D79832DE6B015C38725C84A4638D73770965D82F3CBA4EC35C0BA' : true,
+ '9394C03EA88D9DCD628AACC140CF1FAAEC364252F318F577380BF2623009DFFF' : true,
+ '93AFEA0BFBF153CA77357087301C0F31B095EF2D5A53F7E2D02F9B13DD6E7325' : true,
+ '93D45B29473CACF1E89444ADB8FCB8C3626C278E2339E897C88C2A51119C1C25' : true,
+ '93DCEAA3D67BD8992097C446EECE4A6A02DCF89EAB0008EFAE7D0C9BE26B7C00' : true,
+ '94C5E69A5644B4BBFF863312752633025D60B905984BC297D103F7B58F8F1CAA' : true,
+ '94CE12FB5F69E4273C8F813ED37ECB954AD667BC81C4E37DD27A40C291DDB12E' : true,
+ '951E14CC4823E3E83E2DD0CE75826B7BDBCD45CB16FCB70A1CFBE6C6BE1157D0' : true,
+ '95EEDB5E6C8B8552E29D7FB0C607EC68AB3D3F88A3FF97F4C70D7BA9D69C8521' : true,
+ '9658D54C28C27DD6E9B79098D7D86C1EA32215492E8AE9DB225E3410EEBC39CE' : true,
+ '96735DA929F88A1A3292D120F963FF675FD13315DECAE2555139CCF71822F408' : true,
+ '96B9BCDC21A4E9187BC7BB7B5BB052A1953140044A59ECFB2F1DB1C0FC648FE6' : true,
+ '96BC0612871BA526E0F8AB96612077A50930AD430147A0BFD37E1BE21E0C64DD' : true,
+ '96DC92A327E33DF81946BB760B8C22FD7F74A2C9592987BA110F7A9D211F47B8' : true,
+ '974149DB587C53796C2752AE8D14C7F3E7C9A1002EECE93420AEDF52B1F48558' : true,
+ '9787EFF64AF68F280E2778414020672F24C44010549900A5A0487F11CADF9A41' : true,
+ '97907F0BB6A5CFB411D9975E742C8DD55AED77AA373C56DD74ABE6B7C9892A60' : true,
+ '97B09B0E6CD2378FA7CED47F365C77266C94B867F8F87B01D8B667D0DB2F5DC8' : true,
+ '98323FED7420A24CE2E1D0A4445B73918FA0C867BF19E2FEA18449B429D935CD' : true,
+ '984E447F3A932B79E9373A9EA9786E0637ADEE21B6EAA6B8127B05F26D7181FF' : true,
+ '98AD6C8A91B962AFCC223C26F0026802B688AE55C204BA0A4ED5BFA5619D979C' : true,
+ '98D9DCCD4C1EF004D7F000B29AC540E935ADC074DAB919F8ABBAC7507FC35EBF' : true,
+ '990477B5471E1BFF7187E419CFAFEDE674FAF3E6325182F9F8C686A2BAB085B5' : true,
+ '99E437DA5156E02DE52D0D95AFDE0FDBAF8F626F4D3BAD2FFFE7F4C75D76BD60' : true,
+ '9AE40265F51732A5A72BFE9B4C3CAA7106EE84D320F7C675C443C91550E5F701' : true,
+ '9B340670FFFA8B98B78247E2A470627E05F1AE05ADA505FDD049350B5A8521EC' : true,
+ '9B573154350FBEDA3CAC21F90DC0E59C9EB0DED7F069650E099F62B0871F3615' : true,
+ '9B80DD5C98B0F0A7AE343DBB896DBCE45DA52EB4E31BE057287A2A738D9CE3D6' : true,
+ '9B98284571E5FBB2A2BE676AE24830A6F0048748FA38D1F11CBCB252505D2E62' : true,
+ '9B9C56A1228EFF3D6520261D3CE06F38597A96199CEE7BFEE71D95F7EA6EB54D' : true,
+ '9BD01B7914B81371F2FBF23E7A0876608CAC69218A0DDB78C2AE45909744E5BE' : true,
+ '9BE0DD4F76D60653F0C3DF854026C8A73C5403B593504B80187730E6562FC67B' : true,
+ '9BF6A4CE27AD782886988DB3FC3AF54CC857946C7C5E32A9A6AB13A9F7504DB1' : true,
+ '9C0F47FE70B9E636409CD37362B052B40B3CF765DFE80E71D999E7EB1AE1D4C2' : true,
+ '9C102F918224790C649D916B43E1CC9EFC4C16ACD141E22E85F199C1C6BE7DA2' : true,
+ '9C109FBEC4A2FC259F1C89666AFC54EC974EF4CC52C858B3C612689CC8A943FF' : true,
+ '9C1C2898E71561BB2B87D8859A5066940BA97950DE95E12ED293822111EC3D35' : true,
+ '9C7F9776163746C45FBC96E2985B57C6AF769E83428F910C3EEF0918BC5CE593' : true,
+ '9CF455322FC12AA2FFE88CCC43388419F61C41ED1AEC560E11D627A009DA62EC' : true,
+ '9D484D53782C2FC0798843979D991B84A180C1A833D717AE002E75F90E954EFB' : true,
+ '9D93BBA3F1A3E4BE5D1146849473DC18A987B0CF48566E506564D4386B29C50F' : true,
+ '9DF287B6058B72D28B1B7E4A46CEC187EC1FF32561A6B681E2F6B6E5A4937F88' : true,
+ '9E2F5DDC11A878B6A7D27F9FECBF10861EF27BACAA208D8EC7ADBE2682FADE95' : true,
+ '9E531CB7619C8C0D5C97E7ED9B20C3A269ACE189AFC5D80DF6D2034BFFD0E804' : true,
+ '9E6937E5BD26C280FA683490204D1347BD8662325524F0BE4B25FC17381923E8' : true,
+ '9E837E2CEACD82AEE4D2CCFDFCCDD0331D305E5B2D123B317E2F3C0376BAC850' : true,
+ '9EA5F3B71232ACCBFFFAD71FCCD08B459DEE53DE93399DCE0A212D0034E9FE6F' : true,
+ '9ED22741CDF43DC2AA238D354F0BD95C28F1B5557ECE9489AABA4CC37CBFC9AF' : true,
+ '9EF5444454DA21B0B7D6110C9B040BDD005EA0BEA27788D00BB3F1C48D9D0F36' : true,
+ '9F7385E656F0E8237CE9A5E9C96A1B3CA17920EE75C112ABE9219C18F77E9E97' : true,
+ '9F9E4DC55925D2944C0ADE2959EED5F6E55A14BC2F6109F8864A8AAD2E4A7997' : true,
+ '9FC08812780624B21DB7596E278F22F0023D27DE99277E37CF07BBBD4B351590' : true,
+ '9FC5DF8E8AECAEAA4939A5BD94A078371135107A7AAA15ED5728C9887FF4DD8B' : true,
+ 'A0142CE676C4FA2524F53E7626D21042BFD8A903AC54F8AB2FB977ABB760D6D5' : true,
+ 'A029D3A07D53CF4D88E75038E45EA719A7A04F1084FA5C327E5AE66B229E7761' : true,
+ 'A03D7CE2FA040738CCFEF1F20872DDC1E321745B2C34095822A51B3BDC07D9F5' : true,
+ 'A03DFE739C80E109658E0B3EB41D9EE1F03EEE48162C4EB97EBC3548760402AF' : true,
+ 'A0AF36C48B0FB8F827459F8AFE6FB82AD1CF7D5D193057AA7BE7DE3EF5E4F69A' : true,
+ 'A0E9635A0A993A3C15F0D7362D4D7C1EC21A50B04AFDEC18685B4A21F69E42B3' : true,
+ 'A1504C131B0FE702B64AA259B901DA2D9B2AE9D85AADE02F1528C1147F98E535' : true,
+ 'A1712F04B99848A73D978552028EB84039AB331DCFCE329E8A7A59F678139F28' : true,
+ 'A1B71E94B84076BBF29645578CA796F299D5FC07CA4C2049D41760F9B53035F2' : true,
+ 'A2152E5BF42DA70683BFF5526B3F9B90045F74B82A034EDDDFD2F8674BD20D7F' : true,
+ 'A21C3F2CE357822C64D1F9C26446235137559939DBE7C7C3E5CDA218376EC1EB' : true,
+ 'A277B893194AE7687EBBCFA344178B3578AA6228D2B430BBE2FC8D5EAEE43135' : true,
+ 'A2E6C7ED88E5F8103D95E02F792372AB66EEDA5AF35CE4884316493325F971E9' : true,
+ 'A3554186EC7CFF6B11D03F042B490700287F9CCE71A4F581B0C5C13C2A0CE643' : true,
+ 'A37B9444FE3BB0FB2EC43F2677926EF458D0ED4F0688FEA6443A5F243F10C2AB' : true,
+ 'A44473407C78C1A951194CB7DBBFBD5010A60A0C82565E02AE1E372975C8D8E4' : true,
+ 'A450EA9215B45056104180FAA52CD6635B94625D0FA383A2000CD8FB0B203E28' : true,
+ 'A45C0F1FB81BDEAED2EF4302BD5AF171F31496B6A8D502B488BC8E3E22D5E992' : true,
+ 'A45C8546DF176BCD32BD7D15FFE732DA2B73EDB38D387108ADABBE4B20066275' : true,
+ 'A4C6A2F0F5175D6C5C1D87E61ECCECB368E6B5374F056F222FEDBD0857B83F2A' : true,
+ 'A4D07A0F8A6A11935F63B66461D06DAFE3D8AAC0E0001B5E842A2232F327137F' : true,
+ 'A5278398DC472DC37141AA3EFCF4953AD7B14AC25D3730D2E99020353CDEEA25' : true,
+ 'A558DE705EC13AE6FF7DF6E6B1BFDB54A7CB7FFAC1499954FB109E6B884CFC03' : true,
+ 'A59F7C5EA7F5C48B71DC6BB678541E4982BBA6FE8E181F5C91DBB9F9FBF49A66' : true,
+ 'A5B9EDB84D5E06BB960BD23A73B0AFC8A0F35C95B782BB54004EEF2430CD3351' : true,
+ 'A6584C2334B3B29B3F7DC858D65AC229F679D8134C75DBD5A6CC1A4B897ABB2D' : true,
+ 'A68F08DECE7FAEC73E7F00AFE4C758B2742EA6BCB9FFC0F3D09C3D3E79E41EBF' : true,
+ 'A6B6702113E87CFB26DA2066CE2151698C68EC71EA906F632FD65DD35B3E0094' : true,
+ 'A6D113CA991875E854CB226297662EE3B083F5D4E15E03D1FBD96AF0FA6691DB' : true,
+ 'A6D1CFE508A9E64AC65FDE0FB8EDB8A808D3083125E2BFA975B4A1F0373FE8B9' : true,
+ 'A718CF6FB0B4672FDB9BA1CDB812CDB98423DD8ACC8991780BE5E0FAEB863FBC' : true,
+ 'A74DA51FDF285B66F86065496D236FADC4D44051DA6400B743DAB15A81FF3B13' : true,
+ 'A7636BE0A08F56D7F05A8D69AF0B7199FA7C05AAC123DCE71AB57C538A4D910A' : true,
+ 'A806A89477E76D5B381113AFAF7D082B543E172A38A1C4B5E23645A81A411E8A' : true,
+ 'A84DC1DB143EEE938A45743268683770BA0FB2EE69A4EB4B131841555CF1E124' : true,
+ 'A8E146E7A32922CB9F5908D8FC85B2928D4BBAF44E8917F370E57C60EC479EBF' : true,
+ 'A9266E0A665A00C7C4360A7CE3FE0B5ADBD6E7E20A32677E43BA30FCFE112E30' : true,
+ 'A93B07A90F55AB3B6BDD56958FD69A808C8DEFA838DB35D323F080A4AB1E4B60' : true,
+ 'A982473B3AABC66BDE83F206E260A07267088862EF71389082A98858BB12C3EB' : true,
+ 'A99953DEB7EA51793C1A353F91A070E4702D42AECC9808E4F14805A755D1866C' : true,
+ 'A9C8BD62DD64EBE49F3DC28459A7756B6D7D6168A9195E8C52D41D2AB9D9CE05' : true,
+ 'A9DAFB7E89AA7141CD52F08D5740F09F388419744351D889C96D2B4C3153A424' : true,
+ 'AA1716CB8EAE12CAD75B01F3A4EC5516140813349BF4041369089A6063625EDB' : true,
+ 'AA55A82D7DDFFAE695312FA5ADFE893D1430057D1D8ECCCD2A9E985CEBAE3989' : true,
+ 'AA9F7FEBC74FE835504EE24501DB2D00409FC761AACAFA92DC8A696388AE843D' : true,
+ 'AAA011E89B2581C1863FB1DA1E41A8FB8EF14ED0817976F16909C68E27F4E70B' : true,
+ 'AAB01A25BB1EE114084DBA1E0B2B8E5C84936196D40CAAA26A16E58FC50E2B93' : true,
+ 'AAD7DA6E17F164E00B0B63A6338330219F40EE683F8E0CA5F6B709F2E13FB3E5' : true,
+ 'AADA8A48FB9966CCB61E4B8C97DB2DE50F0AF34422D74D1A770501AD00C40119' : true,
+ 'AB34CB23DF8A006DD182B01EBBD38DC13785C4DDD433564B5CA7579DEBF3B1AC' : true,
+ 'AB47045D4B45B0821E851EEEF7EA9D6571F9759DAE4F3DB1EF92597BFD2B4FF9' : true,
+ 'ABB5673AF0583FF328D23B1D4F35B33EF6B68DDCDD482BB3BC1DCB43D2A0367D' : true,
+ 'ABB5D30080E3CFE6F83F249F3F8A22C731F318DDF1BAC4D4895B2B7F7A6287E4' : true,
+ 'ABE9809D21AFE6E0FB253DCD55E10C31DBAB32A973EC52DFDA1C15068F89D333' : true,
+ 'AC3D6D1C64348ED7E068376BFDDA866A015317B4AA8A7FC0C16F7E7ED4DA9682' : true,
+ 'ACBD5C965EBDEE4D8D3EDEE2A5FC407A6A3A7AD5E6EC120EF1854C18118953B2' : true,
+ 'AD046A8C4DE2A89F32973F0566452CFD38CE0586998717364C528F5995B5E2F2' : true,
+ 'AD05645C0957254FE67FC48F7BFAFC24D30BEBE233B82D87DAFF3B44EF7314B4' : true,
+ 'AD3FC05D383E384659DA700279CE3C48DAB804AC74DE2B3DD3687F6ED355F99B' : true,
+ 'AD40C15657CEFAB57F6A71035796462F0184B0AAA489E601087DE329F35CD757' : true,
+ 'AD679FC990B740191DF7F88D51947A1F23D79F862160E3C94A22BB1169A7567D' : true,
+ 'AE03E5FDACD94805484DE44DB4BABB96D1D2EED4F0B9CB528CB30210C8005C6A' : true,
+ 'AE176A4F7AAFCDBBDC0B7A69ED5D5AE0A8FD0A5BD37BE887ED0F098239D11CE6' : true,
+ 'AE7960061D5D4739E2A6C0BEC6BE8E98ECE3E97994940C9BF5AB2E1C2C0D9702' : true,
+ 'AE7BAFD9FB7AB3D87D0D58774420B314E46538D2894DC58DF5F5614DFE7F0435' : true,
+ 'AEF7E370874D2001D989B258853C1974A5E45676D3D7595F74662C0B650BFE8D' : true,
+ 'AFEC41B1302FD09F03015FB573960516918EFAE30F68D97D027D45A51C4115B7' : true,
+ 'B06CD6AF9B4156B4379FF3C6C1F8CA182A923527D0DD92905394DB3446A11D5C' : true,
+ 'B09F332B8A115069BAC41865E1F1228DFD8ADCF3A66C1F2EC9DFF41173EE7A85' : true,
+ 'B0FD996D85E74BF51328181823707C4FE5E96C0028C2B3FAC104A96237B63EC6' : true,
+ 'B0FF4F8A6FD3F8FBB19A188351CD4925C951DC2D64633B9E0446F026670A47D1' : true,
+ 'B15FFE5C987B12D7299D96F1DBC1C7E85B0528D1AFAF9C6FE808361F7B0D1D06' : true,
+ 'B183D8E672345AABE24C849B4A13D0BD99C296AAB273ABE88C00CAA229A27154' : true,
+ 'B1991ED1894F821B66AEF2E26E0834CC796FFB43971A79588A44CCBF7E8B3076' : true,
+ 'B1D9B3EE2512A48A8E703E2D2263EEB4B0A3D24963F5165DB3719CD4750D2986' : true,
+ 'B20BEB685F3FB617FC974C4C624ED894EB2F7FA61DE28104C7B9EDA1F52F46FE' : true,
+ 'B295FDC9D7462488EBD4E5FA8E5B062FE5E2D0432C6A02B99F4CAD1F9BE6D0BB' : true,
+ 'B319CB30FD80959806C6836129AF6E1A8A32B8B8D39AF65674532BBCAFA2CF8C' : true,
+ 'B31C07387E56AA457F17CA3D3A4C485683253CF387E6DCE37469B6A8E51CBF29' : true,
+ 'B3251BB9A1B4F219400E69789FB08CA2BBA396C6D2FD3C4B69F4B7E1C0DDB615' : true,
+ 'B3381C627EFBEF5DF3BCC9DB71A9B6E4C0A4F3114F7E7408A356FB33FBA5D20B' : true,
+ 'B36D72C8B1F436DA49520421FC0A2869A9952DA405DA5E29EC3A1919453DD6F5' : true,
+ 'B38D0B1FCAFA3F435FECB2B3A25804FB004BF11DE5CD691C1461A4D76792A4B0' : true,
+ 'B4130785116E5A84BF7B191696B213BA8877228388B18C2DA38DCB9EE14AC8CA' : true,
+ 'B440A043514252DA267A339059C789BB14D1339B7964B0945262D978D9AD021E' : true,
+ 'B5008FE6CBE7E0EC5B158E8C9CE487FB6E5349F47007F3CDD2B1AAA69098FA40' : true,
+ 'B51BFFBF094EBB26247D54321DE8F7CC10B24BE9EA6D9383BF908E765D5D9594' : true,
+ 'B5453C09F38363BC702FCACE4B64A74538B1BE40617640C00150CA9129FCDF52' : true,
+ 'B55BBD123C4262662BC144E0CF4BC9B47059C4BD0A136C075BB9B3E82830799D' : true,
+ 'B56769F28FE8395FCD50E7552BFBC2AA549F30E1092A54921BE76B07A6A800F5' : true,
+ 'B5A9BD7AB128FDCB0DE3C7EAE193904867BAC57822BE195F3060369520403D6A' : true,
+ 'B5C58EAB37201F8A7F3C520FECBB3C016A30960C5931DD7C43ECA217A1E31774' : true,
+ 'B5D38F895E2681F656FEE774C8677D29749C3E5ADD3DAF7A2A91043BF5A4DDA5' : true,
+ 'B5F004A0997E3448A1ABE7DCE45D8BD263AC631D14B05A04CA195E98D665B679' : true,
+ 'B61D7AEFD0BDF0DF2C8C8E68D4E3D92EF45CF9F79AFD9EDC4729D71375916019' : true,
+ 'B633827A97472541F7DFF77C347301FB40604D6076D08FF4244C070FCFC9B731' : true,
+ 'B663B6C8C60A5969BEE4F6844813AAB8945EE2CE2253CFBA67500B991CD8A07F' : true,
+ 'B6CEE930054D71DEE1D167A566B9881B8971F7EB4BC4A34FCFD9DDB3DE311B9C' : true,
+ 'B6FAC01424B5C332C72B6B218DC93AEBE54318DDBFC5BD1277E262FA7831E5B1' : true,
+ 'B70CE73DC10ECA5F97059AFEA5A65F1B1CD45F3137BADD7F3A12DD1D6A468D82' : true,
+ 'B7135730040D8EC88C4228AF1C9482AE97526F30CEED5AA117387D20A61D7159' : true,
+ 'B72D29A0BC3BE16C085CE7AD38D1B7A945DC96F4A6F20F126138FC5202A072C4' : true,
+ 'B745A72DD07E5FED73CFA723D6BC2E98FA62B6E03ED378804EBEF7DCD83725C0' : true,
+ 'B76BD62A287E68C2CC8F8CA7FD5196938DF4C39E6F46DD81A3A37D22B761C158' : true,
+ 'B7E6A641053C86E17A4A328D98700AF4BA3BDD35E5208359AF120C2690F51E3E' : true,
+ 'B7EC03174DAD602E897345B072749AA86CAF05151062989E183C3039DE25569D' : true,
+ 'B839688B9303FEF8860B4FB2EDF19FF2A0BF5306DAC007E8CE074CBA13B39A03' : true,
+ 'B86F85494700264E918D8706B711B9E8C3C12AA776E0B63AF35B73CE56B15BBA' : true,
+ 'B8845702F28C3AF9B35D8B5F1DFFFA014CE411CF592B18395F700CD8B937F3B9' : true,
+ 'B8F0936622984493F4B74D087ACA8438AABAB1111DA258806EA86C23C6F6617E' : true,
+ 'B9772693C35DE8A4B6EDC9457AFC3B4B52ECAFDBF612CEF1A27AE7F7FAB8F79C' : true,
+ 'B9D8E2EC3C47B6130DB45DE0741CDB790E36E4617986AAD5A2BA232B8BD8A85D' : true,
+ 'BA4052C530EB5FDDBBFD98FA9EB99660BC084678009D5AFB2F9996BCA40C354B' : true,
+ 'BAC88F443D9F2F03CC7ABFB27373EF9600AC918E084967BB77E80650B3724266' : true,
+ 'BADED8CA137A9AFC4A0FE344F663C743D1A549D0A8DE663426B90E788868024C' : true,
+ 'BB7E9348A57593802F083CAA99351386DBDF348C83AB35E554BB7BA44FE1FA55' : true,
+ 'BB7F20108F934620F741F678F3D25F7DB4A50A2CD216FBAA1F4773767F645AB9' : true,
+ 'BBAA50F752648522389B89EDD345BF8C41FE10D4593A8A1DF467B2FFA7BF870B' : true,
+ 'BBB99D57C9ECE54B1634DB4BD6211C5167A5EB4DC310340BDE14B1BBCE275937' : true,
+ 'BBEF78F8C05ED5A5C2142C3598696B0674FF3DADFC8156896025A13EC892ECC2' : true,
+ 'BC0B758091A4613FE070BECD6CDC0BF1FE89727C3482DB4A2353CEC027E3AB11' : true,
+ 'BC17CA376A3CA716F41BFA9D3A2CED2B1941431D70543BD600B7596F4EA2E440' : true,
+ 'BC1FE50662610B7D575931031B1EE60479D9D9E3D94048DE6FBD44C88B9FDAF1' : true,
+ 'BC447B8A11DA8F1DE19285AAFB97AF1A26A35157AB8FE1E4AF80AA70B11AB65B' : true,
+ 'BC568DC8C01D8D7595FFCA2A7E000780F15EC24CD38AAF25EDDCE7BCD41E4FAE' : true,
+ 'BC622EDE87E66E364218B38609D792F6906F7CF95EE5EDD1A76BE0C48B8533F3' : true,
+ 'BCE02BE648B8A1EE092574F3D453388649082A1B72E7AFE7ADBA310EFBD38DE6' : true,
+ 'BCE27288DAB9DD76CB73B5754152983F14B11DD0466B1D4F6F55B61E27A3353D' : true,
+ 'BCEAEC2D8B8C18B58BD320D77850EC38285F419ACA8A9E939DAE7DFDF26696D0' : true,
+ 'BDE511A7E1B38D779BD9E758B2EE8F7F2DD5A242D37CA573394808CB01B78FA1' : true,
+ 'BEDF91AB2008A01DA4111518C8065D4BFD9ED614A29CF89A16E94CBCD5F5D17F' : true,
+ 'BF38E5D5BE0CC67C1CFAC96B40DFD91DE065F2DAAE427AA54893FFC5ADC73707' : true,
+ 'BF9B71E2C87C03CF421733610A1BDAB430C041EB20DB75ADBD9ECB3D342072CA' : true,
+ 'BFA0CD61FEFB0FE90D0F9025E67C62A735DC730F13B5D5FBED9B54A3DB882F91' : true,
+ 'BFA5B4A3751715409895D27F7C9F057F2C31EE560DB075008A3BAA21DE838FF3' : true,
+ 'BFE49B659622D1011F4BB655CDA77638665D068FBCAF11C73829D2DE16E43BE4' : true,
+ 'BFEC93327E0A7A92EB67CB3E00D29C97411077E06CFD010BB84A5C0836CD2F1B' : true,
+ 'C0AF523C6E9B52801FCA62602022547B25D8A107CC7008C67C438E1A093FA69B' : true,
+ 'C0DA5CBD6F39A5B707B0E7DD33004811FD6F925DE713C817F3E2719393163E9F' : true,
+ 'C1AF26C31745338DD2E13C1BA98A2E643AAA3271CF1FD5B878E93B1DDA2DB868' : true,
+ 'C1AFF08543BBDC3D2D796884D099D8A7B8D40FBA1F37AA31CEC16EBE2AFF0D0A' : true,
+ 'C27D64BA2F133417986FC42073BCD7DB4668A2FA7D2D217CDE215F25D2BD5E23' : true,
+ 'C284387A9875E45662ACE976D665D6A33C36F3EF2B053AF26C0918DEECBE7CB6' : true,
+ 'C2C65F50563C7E96AFE6602B9A0B68DE74F3C7AE5C00ECDB39B98960BDFE5B91' : true,
+ 'C2CE30C7F0723F2D2B25A18FA209B1CBC66662624FA8CD1EBA96BF051D969625' : true,
+ 'C2E60ADC4803F0F11F83C644D8DAF80DAD4B9D6A67FC108B3C2CE6F2576EB69C' : true,
+ 'C32E558AC4FEACD1690C227683DFC38CD26FEF103953FCEC9CBE0FAB08C176DF' : true,
+ 'C391E32BB11DD8F6F13BF71E0B9CE225364A50006E3F91147EDE39D2AA6E70E0' : true,
+ 'C3C07C187D95222D855EBFDFF827193F71C471BAA3A1B51242BFE963FD4A63F1' : true,
+ 'C3DEDA7A5C280862654DD266D482AF59CD7CE5C09020F8F32EDA0D0FE2345B02' : true,
+ 'C46DC6888470BF64D41C297E1FA082ABB128D4D0EC44DAB62E05E4FF8496B18B' : true,
+ 'C4D51A111115A7D06422BBB16B67ECFC73D636DB08551B27596FEB532D8CC2BA' : true,
+ 'C4F8364FC0A36A73AA0BDA4074FF1490B3AE07A7BEA479385BF28078288F9C3E' : true,
+ 'C520C3FFB5C5107BEF2E8DC44C74803713E13D9BCC99A57C6838BE15ADAAC04A' : true,
+ 'C55B18B5DF187AE68174C086FA4E692C6443B01FF4A19DCA743EC1F6E1B7E332' : true,
+ 'C58F0FF2DF810FAC8EA095F349A2E6D7E0D9C09D6FBE7D45895408530E1C75F4' : true,
+ 'C5B2A636DE1FD6629B4BA41FD1693F261F50577130A05366D298F9CD282E4BA7' : true,
+ 'C5E4575B4442687C80E6F9F290846CE80217AEE8892B9977C5F455BEBE285EDA' : true,
+ 'C610F374CDA9036FCB01F526005ED8561D16A27790491AFB26D56A1BF0716007' : true,
+ 'C6479E02F20A3596203FF184483F1F6A29EF9F95DAD258EF2A84BC6125B299DC' : true,
+ 'C66BA6D7D5EE44E268D2DFE0A00284BA59F2FD86AE8F738E84718A1B4C5927D3' : true,
+ 'C6983038573EE575734E531266D91772390BDF63A276B49E9360C81F8C813EA6' : true,
+ 'C69E1305EEEB633DAB5055D952D0A8FFAF35FE57D0E1896A7BB24EE37F29959B' : true,
+ 'C6A38936450B0D72D5C38EC5BE6FA683D25CBFE604C7415BC5E55E2DEB06A946' : true,
+ 'C71294A0124420512711C918C36F77192D2B45CDF8C99824B4BC862D0B31C3B0' : true,
+ 'C7E74023ADA70B7F3BE9085E1554B8EC7AA20B0E0A38A08B2A05DD377F7177D9' : true,
+ 'C821C2140114FA7DDE92FA497EED3E4B9131919A9EF3D6750013C6CE7FEE0B72' : true,
+ 'C86D8AEC465B23370C4D5086141E9C98935D91524E3CF68BBE62C0AB231EEEBD' : true,
+ 'C8726499B7FA3B32022A21230BC27CC59901DF584C69F33232EE76FD7A554F3D' : true,
+ 'C88BF2F611A7EE5307733DC2950EFF56A96BC832961FF595196EB88EFDDF4932' : true,
+ 'C8B4AB5E690CF9E14D079125CBD13232EACD4FA3F15276D2D7BC48FB84BDC0C3' : true,
+ 'C8CC1B97C420851221D3997B0C0E3A6B87B4D9F86D348917FF90BF710DE79351' : true,
+ 'C950A2AC5B35DEC3F384099AD2E3BA7FDBE79E93362A132380CB5ADD1EC2E94D' : true,
+ 'C9F2002F6542DA1BC5833AF9A11F6F5F144B76539CDB9E1738C7DB37097523D9' : true,
+ 'CA157632863D3E7B499F141741724FA84DBA48AEB51B04A53A9D3DFEA7F70BF1' : true,
+ 'CA362B0DE34C54F91953DDCDE461D54BF30DB252EC07AB6B4C449E45750BACED' : true,
+ 'CA46DA728E76E97AD214DBB6AC9CB1EA2DC87202C88C35E87CE574FC1F2E0438' : true,
+ 'CA846077B68DCA99AE30BAC33929143E856784B64E70098CBC7FF5BBD85C824B' : true,
+ 'CB42AB965E2C1CC7F20BE15F308C2173AE531C532DBBF8A36B292B1E1A891A07' : true,
+ 'CB6C703326037CB5C4456097438DF15387452C0CACD89D9DDAB1475A2111C197' : true,
+ 'CB7FF00DBEDF16D72C8A10151A30595AEEEB9A2317D3F44269966624417141F4' : true,
+ 'CBC3C62B44E2C35250AB62FB2C3993C55F251559259727D5F76A63002148F17A' : true,
+ 'CC1A62E8FD6FCF9A3BE4BAAA64AE2FC0BDEA2C2F34BAEF8F9123D991262DB210' : true,
+ 'CC815184FE74CDD53947DCC9733B1D5E9B9E8F31C8C96154355ABAF389BF7D63' : true,
+ 'CCF6435DDA033106286D7A69A4C8DD727B59C4E334826CDBCF6F66C801580FF4' : true,
+ 'CD35C7ABA0839C0D865DEA4C1DB624F709E5EA041A68DB55842E2C189F38BAC1' : true,
+ 'CD7C028069F371EBE93537094CB57A51CA0CA421B9A7F8C1422D9C454F864FD3' : true,
+ 'CDA01229ED05A3825448BF81C4479F02828C6E02DC3F303ADC153BC0600D1FE3' : true,
+ 'CDE7AA628678D4BCAEF4240A9D09B5BC7BC1A1757010006931949C83DA299B9E' : true,
+ 'CE01F10B612255CCF31E03F308F45E0A091C0FC41A13280F575BAA7F4F7B4A58' : true,
+ 'CE318D567E77FA3E2B87268B09B1FE99484916CDBC7A56B99900CE7BB7B4F967' : true,
+ 'CE34361030AA71334FC8EAC253C91EDDDAD3E2AF0974931325384B9A445CD116' : true,
+ 'CEA9DC1557689CC8AFBC740C095ABE8AA617C19AB92B761EA71F19AB2B3FBA4A' : true,
+ 'CF19B1004488D5D9C882E2C4D0A47789618E0BCD6475F6D9C6B5591C2BF333C9' : true,
+ 'CF3457D98980F7909742C974AE4EEABF2007967D9870705867C18A5B47CEB2B4' : true,
+ 'D010B9708329342E43370125857DBFD443ABC95CF5778898A7343E5F1C61F4E9' : true,
+ 'D0927B6D60E3441E11D75A8FD593A38665AA7D211F691BDA3D0E815EBE303C25' : true,
+ 'D0ADA8B3F0D09BD13AE5877B5E448C18376D129F92DCF2D4F1BB182725A62D3D' : true,
+ 'D0E5727B39200CF1054391FD251191C38F6754C103612F442673BC53F1C1634D' : true,
+ 'D18241A820196F4910694FBB37556273E54236F41FD53B3AF75B6C6430D93B15' : true,
+ 'D1B116326075EB6F65C4F8F8E6742B639DB23B56CD8420F42F8219CE615303C7' : true,
+ 'D1C4E4D1F014FB8F889F45AFA39485BE742F64268C662BB28494855E393ADE96' : true,
+ 'D1C684802932EB8EBBFA0DBD55EFA5345AB3A928653CC222D548CD29D91EEBFE' : true,
+ 'D249C8E95880A20CAEEFADA9A9B8E80386234DBCA6D990E78CE574B430C0E6A2' : true,
+ 'D2D9C57B19EABF7A90BCB421283733EABE5ECC6311B1D05089D4F4251D157E3D' : true,
+ 'D3525FAE9E537DD0A56F0311A27A603C422DB0376928C707A12A1E3785F2BEE7' : true,
+ 'D387A162888C2556F1D3B9A73201A8608A57085E1115214BD2588F315B89776A' : true,
+ 'D41844AFC9E00E17DC87F0ED1AE4A0559C418770A4FD7033E3D9A9997C5E204E' : true,
+ 'D44D1A7D80BD2F9B4A62E11BFEBBB74A5780B0366CB6038CEC9FBC8C8E19439A' : true,
+ 'D44DF644880E56596405F1364D8C3E5301F05ACBF82FD66B671D895288C75360' : true,
+ 'D53C334638CE54CB75DAA15D1AAAAD70081C9A52A2393DFC79E9C3A92D54F4D6' : true,
+ 'D5D9E3A7DAB437D5F8967A307F6BEDD3B2AEFCF59B229BA649C4E549F01668B5' : true,
+ 'D5E62D9B8F9EB17D8BA84646BC72AE6271E24D0C7787D302965A92ABAEDEE2FB' : true,
+ 'D6061064FEC9DF923123EDB3050700BE1532B68D9FC12FAECABB9FA82CE2B887' : true,
+ 'D6200C1744EDDC3BA40857A1089A20F7E86EC3B29FF413CA2BE49C060A79D19C' : true,
+ 'D63DF52A3A887D35ED58C64463BF73252738FDDFD73E0F8B378E318AD3057D36' : true,
+ 'D646154250C7883E951B03FBBE9EF7D3D00E74D60281FC82876A913A23AACB1B' : true,
+ 'D6ADFC439E8E9FAD7C281DF1117E0030BAE78D15E481B7886F54E72DB7DD352A' : true,
+ 'D7266CBBD307F97B7284312CD4C2A5BADA7D4EB123237EFA43E55D8D2F5B16A6' : true,
+ 'D737A5AE5F875A566A4ED4CB025D07D076998270F0D25292661B4CD581B0805C' : true,
+ 'D7632272521683A38E88A18C2CC6AED79B2C5E854483BDB6EE83D82BF41B96CA' : true,
+ 'D77C2904CEF8726B748EE36E43BE65BDBD12FC48E4A4ECA4885537745B0BFD15' : true,
+ 'D77D31A02283F81A4E64F7512C59BD71FF603FED5EC57F24F0A240F04B846999' : true,
+ 'D782121A27D3EFEBF791EFE34D5A81385358DA939F5DEB17530252BFBC8E2F02' : true,
+ 'D78220C9BDCD563F71BD8139B40A495879DAE9FB1968AE3225BD0D04DAF294BF' : true,
+ 'D796DA6F4413295EF05E79C798E92CF8A6AE172A091C862D7176384D520BA2FA' : true,
+ 'D7D1D7F326D3DE85FC1DFA7F45F9D5A3C64473B37143EB09DA66CE56F6258FCE' : true,
+ 'D82602A79F22AF46AD32D0AD123D30464371FFCB7A8AFB8C51A74841463A20FF' : true,
+ 'D86562629BA86C435C0965C4AC302160729F27804FEBA36E211F96CDEFB5DF8E' : true,
+ 'D86996C0C019AAD9DF5531836BC48F54427021AB8E24BA1AD073895574A143FA' : true,
+ 'D8AA8D8A7A48ACCB4C1B7E6C2228B7BFBC297EAFAB1315643744E3EE4DFA7E6C' : true,
+ 'D9065B6D9F7F27507D51170FB465FA6250DF528EC38BB46DAD0311C1DF63ACA1' : true,
+ 'D9259A35701E881FD41A9939C4AB82EDAA83A18D1ABCBBBF8329FC6850A0C6DD' : true,
+ 'D94290750677E2B5ECE7C2DC41AD4618C6995F173EC44DF80B23CC0E333EA654' : true,
+ 'D9FDB29EF83808BC82A97839FB2F22C2D20DAB2E6B67BF5862C8922BB1FA9068' : true,
+ 'DA5D20F1A6CF6CEC3AA7028A6E17D8F2E1A60069E497758B0CC938C08F4E76BC' : true,
+ 'DAA384D0D2A94A18A14E3DDF7A963E59BE41C06B978F3DC8862E1EE6C8E76DD0' : true,
+ 'DACA572539398A22DF7049B23BA3E59DAD6F34A44ED7D5E275457D9F79B880A8' : true,
+ 'DB7B1361B066EC2F777AE104F88A846DC163200AEB05B47D5BFEC91B6F13AC53' : true,
+ 'DB995D854C4EDEF4DB5CCF20B2B30719056F3EDAA0CCF4B9D9C5C898407C5C7A' : true,
+ 'DBBF19EB75C47A8473F59CE4B2A318B493EEFEE4B6719BDF40FAB2E81D9DB2D9' : true,
+ 'DC90A8BEF7B1C62F9E4B3D3345665DBB5D6CB46077F5E7ED0628A5C0E3DFB742' : true,
+ 'DCC87ABAA2524536C43A280BC52710BF117E56EBB39444873F93AEF18519A502' : true,
+ 'DCCFAA33D28DE7243AB2C1514FF36012E967B0C0C6E62E940325CFCE982BFC23' : true,
+ 'DCF5F2D0FD496B041393D2151A3C6366DB5D9E3E6FC5EEAF236CEA93B7E0126D' : true,
+ 'DD5A1FC87107218C43D2C1C73075C5506D6901CE1289F86DC0162E6BBB80B84C' : true,
+ 'DD79B321EF333A6C39D48DB57DC5A138F023A111D56851CD4CBC8EB1BD094893' : true,
+ 'DD7B5992561C1F706A82F7D9318E45DCB1CF508A564263893350E2D3CBC41241' : true,
+ 'DDB4149166CCAC259D826E4E6649B5F59DB8DE3A2ABE0D0CA88F192AC891B331' : true,
+ 'DDC51B2E6531407BA185447AD1A9825344FCD12E93D120D81825613F016DF297' : true,
+ 'DDCA648AB82DF2A942AAD4B384839255D5D98ABEAFB602B2BBA2F4B115072EDC' : true,
+ 'DE65D592D65A64794CCF2911A10DB5DB27C28E6C88BBBF75B75FCBC2CAF5A02A' : true,
+ 'DEC7DC8AB8ED70C1D2FB2875F0F99FA99FB53E6BED70CD47B244ABA2104DA5AD' : true,
+ 'DEEBA70EA985BD2637FA63B79F69B0EEE5D261E95E3699B97855296B23D82C3D' : true,
+ 'DF32CD36F2BAE47DB4BDD2610D77629F44819723F9BA4FCFF6CC7F6E5709FFFD' : true,
+ 'DF4482289B54CB444569A5436AEEBEBFB348D966D2FBC8C5115376F3E5496303' : true,
+ 'DF464344337A60D78868FE886F92848BFF8713D641C9AC5EBA29524842656CCA' : true,
+ 'E0BD7FDC3544BBBF78F401148ADE378A4A85214C0469EDD5EC23C5246A6F5555' : true,
+ 'E0EFCF7FC7033248F1933BE975F931485787F32928E47DABAC84FEC9D7365CFB' : true,
+ 'E0F0A23CA9D564C9EF7CCD977D01D6E6E7EF5ABD585819EE64520CF369967353' : true,
+ 'E18545BD6D070F0C6AFE93153C190792C4921FC90953FAA775E351B1FB1BCC44' : true,
+ 'E25454E967CE89CBD0F51AC02466D60FC091BDDD9CBD3093ABD027B0AC4E8174' : true,
+ 'E26F4C34273553354334DC7A22DC56A781F2491181799287CC91F12871FEB50D' : true,
+ 'E27966B8B9C67C751F9AB8315D0BD1CEE334D96A8C5F60C764070EF8B8FCE61A' : true,
+ 'E2C42D4BD3807D802CE3B9EBC6FACC04E34EF327F4BBEC1C7A48618A1271F5E4' : true,
+ 'E2FBB7B66934E9C420D496089F2C0FB5AFA193A1E6F49BF35A751EE1E1F983DA' : true,
+ 'E2FC1229FE0EDF06A3706DB8DBD2344B61A9364840A3E61E6B29CE49A966AC8F' : true,
+ 'E315468836F77DF6AA146AF392C5DB7262A83AA83FD7CD75771C70D29C3F16CB' : true,
+ 'E35CE61842F1093D8D4AA9923AC66D17F8D1870A03C9CFCA1A27361CE8091CBC' : true,
+ 'E381DF6792973BFE322D23C6CF2A6C24A4ECFC77F43F03D2FC04EE39FAD7C683' : true,
+ 'E3EADC69740DF00FD147B0718CB1063D7E90E172E196C96956920235CF9DB382' : true,
+ 'E3FFE980C209BCBE10F594806CAA472BA2D4702F6E2549AEB86DC52B46DCF773' : true,
+ 'E4A79C0CBC9966A44EC1185DD6E66371FF395D0FAC53C1FD2619B02F6ACC9C6D' : true,
+ 'E4E88DE573C9161962C072B7A9C966BE3070A6027A061DE32630C553C09EB046' : true,
+ 'E4F069C24D7162E3C94AB295EA33C8926BDDF79934CA28D8982A35650EB60B05' : true,
+ 'E50C2EC0BA6891F60BB325C0762AB06271161EFA9E0B2ADD50FF520128092FBF' : true,
+ 'E556C54852E6E0E61097B2A34DDCB87F12EF74CA847CE07C4CAD2348FF41D3E5' : true,
+ 'E5E046397DC23925AB8CAD7CB66E2A12EBD989350CE41F89EED455248A109098' : true,
+ 'E5FB4DB1871BDADEE779D366E7BD007F7A963FBCB00B90EC14C8077477E436AD' : true,
+ 'E68C4E54088AD4A308EC6053041A4A8B04A213347BAE2CE86D3F1587B1518981' : true,
+ 'E692108B3683F3C6362DF92476D62BAE60687035B70B9119F962190C9C215B04' : true,
+ 'E6A029856494D7FE48E048D60E7BDE80D2B6217FF084F64A929056E166F479C2' : true,
+ 'E6A6EDA8D60BE3C0A5A19631D1BC3262EDABEBFCD0144F3D19513C8F6342CD12' : true,
+ 'E6EB9DC7D407B4A2F308B4822E5BEA7428CD4520C59934214831D61E95F2BA34' : true,
+ 'E70FC0431E5B6632A30C04F99A4E0E55C860187A04CCCDA4FDC08E926E94964D' : true,
+ 'E7382549110E59A8E0AEADFBD5D29FFA2350B5FB2923F2095744FBFD8AD54C97' : true,
+ 'E7CF336F6E4E8CC153474F240D9238D41091EBA635F25CDAFCFCFC3AF2A6BA43' : true,
+ 'E7E7A31551051BC4346069C741DF38908FB54470BEA2FAAA789DDED2D627F09D' : true,
+ 'E80FA3BD00D99AF27B013B520D3CEB1A8DF8BE355EC971F08B4AE44FFCE44147' : true,
+ 'E8165BA89FE5F637FA2B3428FCC54E7E92BDDBB80505188C61320FC70E24F86F' : true,
+ 'E83B3C3A3EAA32F6C60BE4D4DA918AA4A5432FF3380D4886C2844D69094EC571' : true,
+ 'E893B898F708775C51A0A60748972C53C4B62787A591B96EFBF8CE28E29E87D8' : true,
+ 'E8AD1B8DA833226A37C21D1608E0DBA8C758EED7A943EDF323ACBB779E227C86' : true,
+ 'E9A176C583F8B5522A9A86B6A4409AFAF614D6A7650A5D6C32E4499319F5280B' : true,
+ 'E9BB3A11B595B1D403FE21DF47A3A4EB4CF43ED49259DA83FB0FAAEC048422D7' : true,
+ 'E9DDA8C162F91A7D746A5567060DD636491C8C1441697B600F56C00FE73AC594' : true,
+ 'EA64F2625FAFE2EC122B493D4754C2B090153F167213AB6F07A87C1D993E5292' : true,
+ 'EA6973A28807C80D7558B7636F875574C9FAD887BACF23B0F686A61C26EDBFA7' : true,
+ 'EA9369F9AEF701B1F9699363254A2AE007F47AA824AECE077B82F1C0B6A69197' : true,
+ 'EB11019A7642C75F4DDC1DC9CF3B469BFB4C44B71C615693C73175F16DCA036C' : true,
+ 'EB5F60FED8FCE35455A15B9A8E9E200FCF1B8B5B278D1511C8C5EE67BD99FB46' : true,
+ 'EBABE928B643E1B9FD6F61D67ACC4BA6A9BFCC95927D31D265F701AC4613B9AE' : true,
+ 'EBB8403BAC78C842A81201893DC86184BE82BC2BFEC8A51748651F938F4051B0' : true,
+ 'EBC9928117D91D999CC375930982E891C5DC4F9E02A3960FE692DAB13D96ADA5' : true,
+ 'EC3097F047F40894368CA744A97CBB177C1122963AFF3D958DDBAC299F793E71' : true,
+ 'EC4FC179A9A40EBCF5F9508C94C0209D9C28ABFB21EE932FE11BC87F2887C490' : true,
+ 'EC810B437C1FF46BD3F0DABC2AE11DBC7ADE12B9889580BCF20C097540C97A7B' : true,
+ 'EC869ABCCE3A1C036F1AFABE5ECD4FDA581D16C0E81E16A2734E6004A55896BC' : true,
+ 'ECA27FBA9090EAD50CEE16362AB7462FBD060DF8B4BE27C107328E49214D6758' : true,
+ 'ECA4B72D4C90C2889F21F4084AE4CB53F5B8EA5D147529B0CF72D3A9093532B4' : true,
+ 'ED310E1BAEB1759D2AEC00BCDE6D9A86DFA33B17563EB5105585F15327831032' : true,
+ 'EDEEFEA60ECD1F9063448654B3D1285B8D340B4AAE455A26C34AF221F6F96F85' : true,
+ 'EE5D710097EAD11639F98940D1F32793ECC114F0408856CCB6536F1EF2366704' : true,
+ 'EE82E118167C83EC466137DE867DF824A5063074FC61CD164D21F26976741A2E' : true,
+ 'EF162B09A3D267BB7B8C79D44D06A7AF21EF260518D0EF3A8CFA1730D7B89231' : true,
+ 'EF55226DCFD0FA606BFD3496633BFCBC146925B2D6685AB4875E142D79233600' : true,
+ 'F010781D39EBF1A76700CA71DB56877685A52CEC2E7250D2C5684AF659887AC8' : true,
+ 'F055D488944F4779BE3F17FBEAD728843701CE6598D01286AA1D525F26AEDAAB' : true,
+ 'F07E7F2A7106743D8C1FF2E201F944E3227363968C5A0AE31112473B93BACC7B' : true,
+ 'F0A9E452CB90B0B6C50FB794AAE7ECBF5E56801A10124C95292B28592FA9B003' : true,
+ 'F0FD8D8E64636B1A1CC2557C50DBADE7A1F0536B905F5FFC06AFEF630AB9A40B' : true,
+ 'F1C66D3A1C4917A59AF8ADC68A0722F7193D345BD978BA00FF669E7948D44F29' : true,
+ 'F1DE4066AF24E5744C9075CFE974CCEAAEC75EF9E6028B48090B1A46CC218C37' : true,
+ 'F205928C933AFF1F1A6411AB779CFAE3FAAF43754AB86735DB52F74DB1DA81D2' : true,
+ 'F233DDE8F7165F2D7AA4E736E6FE1F913570FA7CA3E3C134EFD22D5F303075DE' : true,
+ 'F2835EDF2E61A29F9E62FEF97476165D5FF40E553A2A4F955EDE30C0A5149E12' : true,
+ 'F28F54684E233C9EEC646C6E1336E33684DA3732ECBEEDB2A606E09DD29801FA' : true,
+ 'F2C91876EDB36EAD7E4821C2A6581144F1E5A67B2DEF4A5E4AFDF79F5E1CC4D7' : true,
+ 'F2F7938B7E294F17565B2833CC2E0A657DA80A237814C24B5C0AAAF35C4608F8' : true,
+ 'F3160DD030C118B5D5835743E78CCADD0620E5C08460E0CD1F5D9D437352105B' : true,
+ 'F319741878D155ED3E5DD4955A82B842700A64D86AB782B511F0CB9B25C48AFA' : true,
+ 'F3A6A1A957C3BC86EFB3772C6153D97C33B908124CA58480AD1F62C54CD89013' : true,
+ 'F3B356D9CE5B37D2B690C4EBB2E04A643CB542273C1754D2EC9803D831781737' : true,
+ 'F3D202454336E948C83BCA2342C4D1A0DBB4335E829229BEAE04B4125F0D508E' : true,
+ 'F3F90821BD1454FC7AC92F768D2C9F75B5CD79FF4DD3251F4B9D647D34024F73' : true,
+ 'F456775CCC8DEC02CF2F92A48101E18EBCC9C880D41FA87EBE5E2EAA0E24620D' : true,
+ 'F460158348B017310570CAB302E33DD12FF72526698115EEE8D3DE318383ED9C' : true,
+ 'F47CA7623AEE6A1849B4F3F90818A93AA937A0EFA65D6674EA769BD7EC113BF8' : true,
+ 'F48CB2C1C2551290BA59502BBFCEC7BF137B5176967BB92B38E79D4EAA63B7E0' : true,
+ 'F4AD6AEF9BCAC58CF21EA81D65C3B8C85CBC9BCF6A2807FB0C5CD332C5F9BF49' : true,
+ 'F4C119D9DB2CD569E75B9B1F0884B990575EFD920E8C62177990AE650B7AA274' : true,
+ 'F4EDB536BE8520B583202E17C56768579613187741195347DDB9BCE3AE2D5150' : true,
+ 'F5B52148D7155BEE637459A918CE58D22D4E024FB715325FC1B36DA4C6255357' : true,
+ 'F5DBA16527D871BEFEEAE706C232AD0B76FA1384EFB86A844C7BA46B96917B9D' : true,
+ 'F5EB7AFA398131FF3966EE221B9C8F332BEFCB634D42631E349AC0BCF367E920' : true,
+ 'F5F8E7786E1F61643C7D2805D86031E5C4CC97AE93FC3785FE289FBC44C381E4' : true,
+ 'F66ABF80914FBDBE53F794409F4E0DC895129066609E8B491506FCE246A2EEB8' : true,
+ 'F69B01FAC28E6126F1BA71159D0273519683F2317EA764B4C483B32BB97614B0' : true,
+ 'F6A08E63AF8E62D51930BCE0FA7CF25DD2944512652EFA275E150EDD9C11CF51' : true,
+ 'F6A7FA219283E5B13E256B4E039E4CCD93CB72B84D84086E398D5534ECA42DFE' : true,
+ 'F74D9E23F4CB53775CA60178347F2A029F77579000B21AA08EC62A1C2932348A' : true,
+ 'F754352E819D0C33E6CFC06EECBB4356DB5D8BD1FD2591C7C817CCE662BE2BC4' : true,
+ 'F77AF5088D4EB425ADC0997C059C641EFB5AE2CAC73669EBAEEA378EDA383186' : true,
+ 'F7A57247F89F0C50879598293BB33B7AFF5FB74BCE37BF7B53F8955CEFBB9511' : true,
+ 'F7B593D9277B72E9CF376EAC2BD5535F76CD9FA0FDA3793D7EA6B4D050602E85' : true,
+ 'F7FC63254BF2472575C6D5DEC8DDF02B24B6F1BDCE03D807B159A69820262D4A' : true,
+ 'F805AE1FEDB2D94096F0D341B703ECD4975D773A179555DDC83D424F85578571' : true,
+ 'F823D6220F702D0547375FC4451FE27A91F0CE2AF9DA31552235F96CBBA56326' : true,
+ 'F82E01B697453BD37AD7012E267DC78395DF3DF4BFB0B1657F58256616F9B355' : true,
+ 'F8434B1782EC41F184305BD75BB3C0206721BC6CAD62442377072C06101B70DE' : true,
+ 'F88D1DF97289C9ED7E062D4E4B2B2463F90946DAC91785A6FA02F2599D7FE65C' : true,
+ 'F8E68F837C3E9452994FD6BF08F02D12D087BF6D44137BA37F72E408620F558B' : true,
+ 'F9971BA9EA322BB3FCB85111FED48B9CC1C9788D7BC6985E3CCE4BB7801B0DCC' : true,
+ 'FA14D235A95650A4CFD7A2A4DD80BAF2AF47581E01E412D640F93D6BB79D1C06' : true,
+ 'FADEBB24D23CEE1E8B02430C31A939E14821E9567A25367303F20F74879AB51C' : true,
+ 'FB674F1642EE443BBB827B29FD871CC110D77875884B1B050FC804D2884B2B3A' : true,
+ 'FB6814C66D6DDA2F348BF759398AB81F7795CA223F8AE9C0D82CA295162F68AD' : true,
+ 'FB7EF701469F77B6412100BB2D6399B1A574BB9610186FFFCC0119E14CB2021F' : true,
+ 'FBCC79E05CC135E183F4963C2A206F9DFDBC2DD0D379A743D5FB301741796921' : true,
+ 'FC2DA5A38AD07685CC019C7C388A396159FBAEF9EA491588FC995DBDF52A0B9C' : true,
+ 'FCF4BA663F0032118EADF9D327B65AB502C7A8B336462A397238884E9A28508E' : true,
+ 'FD4E54155D3117D78872DA05046A16FE944315F63C20BF0530F986F5F3797ECF' : true,
+ 'FD87C175594ABB82818D5CFEE506105069ECE5D5A499CFAD2E6376A88BAEB15D' : true,
+ 'FD8B1849A13BBD87D072F9D09506C90C0F29D7CCBD2B6446AD31335348AF9294' : true,
+ 'FDEE85771EF592A9E5F47D08250AFCBC73DCE96A72418B2848AE400F3CF59341' : true,
+ 'FE5DBE234A59B532A12BD552A36DB75AD21EF243C48C61849A0F93AF314C5896' : true,
+ 'FE739A748FB17DAFB6CBA0DA5B2164B8E0435E8DA7FB85E7970BBE731B428631' : true,
+ 'FE9E5DFD73260F732A5F7CE93B82DFA71D84F10D772A845221204A9685089FE7' : true,
+ 'FEB92F19B7394B8BF0FF71AEFD233E262AB656BDD531AD89FBEB9228C5378301' : true,
+ 'FEE5D5CF3F51FDBCD24D5D4E9BA06AFB96BFB558CB5D4249C70066749EEA8FBA' : true,
+ 'FEFEF80071B0D8E2B57D6601BB353A435A425EAA701827370C3585CE09F2CE50' : true,
+ 'FF769AAD90F56FB48D6C6CFCC86E38F9CBC6DB23774342892AFD4680ED3560FB' : true,
+} ;
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/sha256.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/sha256.js
new file mode 100644
index 0000000..7e15f1a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/code/sha256.js
@@ -0,0 +1,249 @@
+/*
+ * A JavaScript implementation of the SHA256 hash function.
+ *
+ * FILE:sha256.js
+ * VERSION:0.8
+ * AUTHOR:Christoph Bichlmeier <informatik@zombiearena.de>
+ *
+ * NOTE: This version is not tested thoroughly!
+ *
+ * Copyright (c) 2003, Christoph Bichlmeier
+ * All rights reserved.
+ *
+ * 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.
+ * 3. Neither the name of the copyright holder nor the names of contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * ======================================================================
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''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 AUTHORS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* SHA256 logical functions */
+function rotateRight(n,x) {
+ return ((x >>> n) | (x << (32 - n)));
+}
+function choice(x,y,z) {
+ return ((x & y) ^ (~x & z));
+}
+function majority(x,y,z) {
+ return ((x & y) ^ (x & z) ^ (y & z));
+}
+function sha256_Sigma0(x) {
+ return (rotateRight(2, x) ^ rotateRight(13, x) ^ rotateRight(22, x));
+}
+function sha256_Sigma1(x) {
+ return (rotateRight(6, x) ^ rotateRight(11, x) ^ rotateRight(25, x));
+}
+function sha256_sigma0(x) {
+ return (rotateRight(7, x) ^ rotateRight(18, x) ^ (x >>> 3));
+}
+function sha256_sigma1(x) {
+ return (rotateRight(17, x) ^ rotateRight(19, x) ^ (x >>> 10));
+}
+function sha256_expand(W, j) {
+ return (W[j&0x0f] += sha256_sigma1(W[(j+14)&0x0f]) + W[(j+9)&0x0f] +
+ sha256_sigma0(W[(j+1)&0x0f]));
+}
+
+/* Hash constant words K: */
+var K256 = new Array(
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
+ 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
+ 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
+ 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
+ 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
+ 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+ );
+
+/* global arrays */
+var ihash, count, buffer;
+var sha256_hex_digits = "0123456789abcdef";
+
+/* Add 32-bit integers with 16-bit operations (bug in some JS-interpreters:
+ overflow) */
+function safe_add(x, y)
+{
+ var lsw = (x & 0xffff) + (y & 0xffff);
+ var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+ return (msw << 16) | (lsw & 0xffff);
+}
+
+/* Initialise the SHA256 computation */
+function sha256_init() {
+ ihash = new Array(8);
+ count = new Array(2);
+ buffer = new Array(64);
+ count[0] = count[1] = 0;
+ ihash[0] = 0x6a09e667;
+ ihash[1] = 0xbb67ae85;
+ ihash[2] = 0x3c6ef372;
+ ihash[3] = 0xa54ff53a;
+ ihash[4] = 0x510e527f;
+ ihash[5] = 0x9b05688c;
+ ihash[6] = 0x1f83d9ab;
+ ihash[7] = 0x5be0cd19;
+}
+
+/* Transform a 512-bit message block */
+function sha256_transform() {
+ var a, b, c, d, e, f, g, h, T1, T2;
+ var W = new Array(16);
+
+ /* Initialize registers with the previous intermediate value */
+ a = ihash[0];
+ b = ihash[1];
+ c = ihash[2];
+ d = ihash[3];
+ e = ihash[4];
+ f = ihash[5];
+ g = ihash[6];
+ h = ihash[7];
+
+ /* make 32-bit words */
+ for(var i=0; i<16; i++)
+ W[i] = ((buffer[(i<<2)+3]) | (buffer[(i<<2)+2] << 8) | (buffer[(i<<2)+1]
+ << 16) | (buffer[i<<2] << 24));
+
+ for(var j=0; j<64; j++) {
+ T1 = h + sha256_Sigma1(e) + choice(e, f, g) + K256[j];
+ if(j < 16) T1 += W[j];
+ else T1 += sha256_expand(W, j);
+ T2 = sha256_Sigma0(a) + majority(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = safe_add(d, T1);
+ d = c;
+ c = b;
+ b = a;
+ a = safe_add(T1, T2);
+ }
+
+ /* Compute the current intermediate hash value */
+ ihash[0] += a;
+ ihash[1] += b;
+ ihash[2] += c;
+ ihash[3] += d;
+ ihash[4] += e;
+ ihash[5] += f;
+ ihash[6] += g;
+ ihash[7] += h;
+}
+
+/* Read the next chunk of data and update the SHA256 computation */
+function sha256_update(data, inputLen) {
+ var i, index, curpos = 0;
+ /* Compute number of bytes mod 64 */
+ index = ((count[0] >> 3) & 0x3f);
+ var remainder = (inputLen & 0x3f);
+
+ /* Update number of bits */
+ if ((count[0] += (inputLen << 3)) < (inputLen << 3)) count[1]++;
+ count[1] += (inputLen >> 29);
+
+ /* Transform as many times as possible */
+ for(i=0; i+63<inputLen; i+=64) {
+ for(var j=index; j<64; j++)
+ buffer[j] = data.charCodeAt(curpos++);
+ sha256_transform();
+ index = 0;
+ }
+
+ /* Buffer remaining input */
+ for(var j=0; j<remainder; j++)
+ buffer[j] = data.charCodeAt(curpos++);
+}
+
+/* Finish the computation by operations such as padding */
+function sha256_final() {
+ var index = ((count[0] >> 3) & 0x3f);
+ buffer[index++] = 0x80;
+ if(index <= 56) {
+ for(var i=index; i<56; i++)
+ buffer[i] = 0;
+ } else {
+ for(var i=index; i<64; i++)
+ buffer[i] = 0;
+ sha256_transform();
+ for(var i=0; i<56; i++)
+ buffer[i] = 0;
+ }
+ buffer[56] = (count[1] >>> 24) & 0xff;
+ buffer[57] = (count[1] >>> 16) & 0xff;
+ buffer[58] = (count[1] >>> 8) & 0xff;
+ buffer[59] = count[1] & 0xff;
+ buffer[60] = (count[0] >>> 24) & 0xff;
+ buffer[61] = (count[0] >>> 16) & 0xff;
+ buffer[62] = (count[0] >>> 8) & 0xff;
+ buffer[63] = count[0] & 0xff;
+ sha256_transform();
+}
+
+/* Split the internal hash values into an array of bytes */
+function sha256_encode_bytes() {
+ var j=0;
+ var output = new Array(32);
+ for(var i=0; i<8; i++) {
+ output[j++] = ((ihash[i] >>> 24) & 0xff);
+ output[j++] = ((ihash[i] >>> 16) & 0xff);
+ output[j++] = ((ihash[i] >>> 8) & 0xff);
+ output[j++] = (ihash[i] & 0xff);
+ }
+ return output;
+}
+
+/* Get the internal hash as a hex string */
+function sha256_encode_hex() {
+ var output = new String();
+ for(var i=0; i<8; i++) {
+ for(var j=28; j>=0; j-=4)
+ output += sha256_hex_digits.charAt((ihash[i] >>> j) & 0x0f);
+ }
+ return output;
+}
+
+/* Main function: returns a hex string representing the SHA256 value of the
+ given data */
+function sha256_digest(data) {
+ sha256_init();
+ sha256_update(data, data.length);
+ sha256_final();
+ return sha256_encode_hex();
+}
+
+/* test if the JS-interpreter is working properly */
+function sha256_self_test()
+{
+ return sha256_digest("message digest") ==
+ "f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650";
+}
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/fetch-source.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/fetch-source.js
new file mode 100644
index 0000000..a0220c8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/fetch-source.js
@@ -0,0 +1,161 @@
+/* vim: set expandtab tabstop=2 shiftwidth=2 softtabstop=2 foldmethod=marker: */
+
+/**
+ * HTTPS Everywhere Firefox Extension: https://www.eff.org/https-everywhere/
+ *
+ * Licensed under the GPL v3+.
+ *
+ * @copyright Copyright (C) 2010-2013 Mike Perry <mikeperry@fscked.org>
+ * Peter Eckersley <pde@eff.org>
+ * and many others.
+ */
+
+// Define https everywhere variable object that will act as a namespace, so that
+// global namespace pollution is avoided, although technically not required for
+// windows created by add-on.
+// See: https://developer.mozilla.org/en-US/docs/Security_best_practices_in_extensions#Code_wrapping
+if (!httpsEverywhere) { var httpsEverywhere = {}; }
+
+/**
+ * JS Object for fetching the XML source of rulesets.
+ *
+ * @author Pavel Kazakov <nullishzero@gmail.com>
+ */
+httpsEverywhere.fetchSource = {
+ // TODO: look into class constants
+ CC: Components.classes,
+ CI: Components.interfaces,
+
+ // Constants for generating URL from which source will be fetched
+ BASE_SITE: 'https://gitweb.torproject.org/https-everywhere.git/blob_plain/',
+ DIRECTORY: '/src/chrome/content/rules/',
+ HEAD_STRING: 'HEAD',
+
+ /**
+ * Initializes the window to view source.
+ */
+ init: function() {
+ var fs = httpsEverywhere.fetchSource;
+
+ if("arguments" in window && window.arguments.length > 0) {
+ var filename = window.arguments[0].xmlName;
+ var id = window.arguments[0].GITCommitID; //GIT commit ID
+ var URL = fs.getURL(filename, id);
+ var source = fs.getSource(URL, filename, false);
+ } else {
+ // Should never happen
+ throw 'Invalid window arguments.';
+ }
+ },
+
+ /**
+ * Generates a URL that can be used for viewing the ruleset source.
+ *
+ * @param filename name of ruleset to view, such as EFF.xml
+ * @param GITCommitID revision of ruleset
+ *
+ * @return string of URL
+ */
+ getURL: function(filename, GITCommitID) {
+ var fs = httpsEverywhere.fetchSource;
+ return fs.BASE_SITE + GITCommitID + ":" + fs.DIRECTORY + filename;
+ },
+
+ /**
+ * Sends HTTP request to view ruleset source and updates the window with the
+ * ruleset source.
+ *
+ * @param URL HTTP request will be sent to this URL
+ * @param filename used for displaying ruleset source
+ * @param useHead whether send request to latest revision of ruleset
+ */
+ getSource: function(URL, filename, useHead) {
+ var fs = httpsEverywhere.fetchSource;
+ fs.setFilenameText(filename);
+ fs.setPathText(URL);
+
+ var req = fs.CC["@mozilla.org/xmlextras/xmlhttprequest;1"]
+ .createInstance(fs.CI.nsIXMLHttpRequest);
+
+ // Use HTTP GET
+ req.open("GET", URL);
+
+ // Clear User-Agent so request is pseudo-anonymous
+ req.setRequestHeader("User-Agent", "");
+
+ // handle asynchronous request
+ req.onreadystatechange = function(params) {
+ if (req.readyState == 4) {
+
+ // HTTP Request was successful
+ if (req.status == 200) {
+ fs.setSourceText(req.responseText);
+ } else if (!useHead) {
+ // HTTP request was not successful and the request wasn't sent to
+ // get the latest revision. Therefore, if we can't fetch current
+ // revision (this project's revision might newer than lastest, for
+ // example), try to at least display the latest revision.
+ var URL = fs.getURL(filename, fs.HEAD_STRING);
+ fs.getSource(URL, filename, true);
+ } else {
+ // at least we tried...
+ fs.downloadFailed();
+ }
+ }
+ };
+
+ req.send();
+ },
+
+ /**
+ * Handle a download failure of ruleset.
+ */
+ downloadFailed: function() {
+ document.getElementById("source-text").hidden = true;
+ document.getElementById("failure-label").hidden = false;
+ },
+
+
+ /**
+ * Convenience method for setting ruleset source text.
+ *
+ * @param text ruleset source
+ */
+ setSourceText: function(text) {
+ var textBox = document.getElementById("source-text");
+ textBox.value = text;
+ },
+
+ /**
+ * Convenience method for setting filename text.
+ *
+ * @param text file name
+ */
+ setFilenameText: function (text) {
+ var textLabel = document.getElementById("filename-text");
+ textLabel.value = text;
+ },
+
+ /**
+ * Convenience method for setting the path (URL) that was used to fetch
+ * ruleset.
+ *
+ * @param text path text
+ */
+ setPathText: function(text) {
+ var textLabel = document.getElementById("path-text");
+ textLabel.value = text;
+ }
+};
+
+// TODO: Test resizing on mulitple platforms
+// adjust window resizing
+window.onresize = function() {
+ var textBox = document.getElementById("source-text");
+ // TODO: Move to constants
+ textBox.width = window.innerWidth - 100;
+ textBox.height = window.innerHeight - 150;
+};
+
+// hook event for init
+window.addEventListener("load", httpsEverywhere.fetchSource.init, false);
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/fetch-source.xul b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/fetch-source.xul
new file mode 100644
index 0000000..caa0048
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/fetch-source.xul
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+
+<!DOCTYPE overlay SYSTEM "chrome://https-everywhere/locale/https-everywhere.dtd">
+
+<dialog id="https-everywhere-fetch-xml"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ title="&https-everywhere.prefs.view_xml_source;"
+ persist="screenX screenY width height"
+ style="height:80%; resize:both;"
+ buttons="accept"
+ height="600"
+ width="650">
+
+
+ <script type="application/x-javascript" src="fetch-source.js"/>
+ <box orient="horizontal">
+ <label id="filename-label" value="&https-everywhere.source.filename;:"/>
+ <label id="filename-text"/>
+ </box>
+ <box orient="horizontal">
+ <label id="path-label" value="URL:"/>
+ <label id="path-text"/>
+ </box>
+ <separator class="thin"/>
+ <textbox id="source-text" multiline="true" readonly="true" value="&https-everywhere.source.downloading;..."/>
+ <label id="failure-label" hidden="true" value="&https-everywhere.source.unable_to_download;"/>
+</dialog>
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/meta-preferences.xul b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/meta-preferences.xul
new file mode 100644
index 0000000..3e48010
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/meta-preferences.xul
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://https-everywhere/content/preferences.css" type="text/css"?>
+
+<!DOCTYPE overlay SYSTEM "chrome://https-everywhere/locale/https-everywhere.dtd">
+
+<window id="https-everywhere-meta-prefs"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ title="&https-everywhere.prefs.title;"
+ persist="screenX screenY width height"
+ width="600"
+ height="600">
+ <separator class="thin" />
+ <tabbox flex="1">
+ <tabs>
+ <tab label="HTTPS Everywhere" />
+ <tab label="SSL Observatory" />
+ </tabs>
+ <tabpanels flex="1">
+ <tabpanel flex="1" orient="vertical">
+ <browser src="chrome://https-everywhere/content/preferences.xul" flex="1"/>
+ </tabpanel>
+ <tabpanel flex="1" orient="vertical">
+ <browser src="chrome://https-everywhere/content/observatory-preferences.xul" flex="1"/>
+ </tabpanel>
+ </tabpanels>
+ </tabbox>
+
+</window>
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/observatory-popup.xul b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/observatory-popup.xul
new file mode 100644
index 0000000..60da68f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/observatory-popup.xul
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<!DOCTYPE window SYSTEM "chrome://https-everywhere/locale/ssl-observatory.dtd">
+<window id="ssl-observatory-dialog"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ title="&ssl-observatory.popup.title;"
+ width="500"
+ height="440"
+ align="center"
+ onload="document.getElementById('ask-me-later').focus()"
+ >
+ <script type="application/x-javascript" src="observatory-xul.js" />
+ <image src="chrome://https-everywhere/skin/ssl-observatory-messy.jpg" />
+ <label style="padding:25px;">&ssl-observatory.popup.text;</label>
+
+ <commandgroup>
+ <command id="enable" oncommand="enable_observatory() ; popup_done()" />
+ <command id="nope" oncommand="disable_observatory() ; popup_done()" />
+ <command id="later" oncommand="window.close()" />
+ <command id="more-info"
+ oncommand='popup_done() ;
+ window.open("chrome://https-everywhere/content/observatory-preferences.xul","obsprefs",
+ "chrome, centerscreen")'/>
+ </commandgroup>
+
+ <vbox flex="1">
+ <spacer flex="5" />
+ <separator class="thin"/>
+ <hbox>
+ <spacer flex="2" />
+ <button label="&ssl-observatory.popup.yes;" tabindex="2" accesskey="y"
+ command='enable'/>
+ <spacer flex="1" />
+ <button label="&ssl-observatory.popup.no;" tabindex="3" accesskey="n"
+ command='nope'/>
+ <spacer flex="2" />
+ </hbox>
+ <separator class="thin"/>
+ <spacer flex="10" />
+ <hbox>
+ <spacer flex="2" />
+ <button label="&ssl-observatory.popup.details;" tabindex="4" accesskey="D"
+ command='more-info'/>
+ <spacer flex="1" />
+ <button id="ask-me-later" label="&ssl-observatory.popup.later;"
+ tabindex="1" accesskey="A" command='later'/>
+ <spacer flex="2" />
+ </hbox>
+ <separator class="thin"/>
+ <spacer flex="1" />
+ </vbox>
+
+ <!--
+ <hbox style="padding-top:10px;">
+ <label class="text-link" href="https://www.eff.org/" tabindex="3" value="&ssl-observatory.popup.details;" />
+ <spacer flex="1" />
+ <button label="&ssl-observatory.popup.later;" id="ask-me-later" tabindex="0" style="font-size:0.8em;" accesskey="l"
+ oncommand="doCancel()"/>-
+ </hbox>-->
+</window>
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/observatory-preferences.xul b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/observatory-preferences.xul
new file mode 100644
index 0000000..96102d0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/observatory-preferences.xul
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+
+<!DOCTYPE overlay SYSTEM "chrome://https-everywhere/locale/ssl-observatory.dtd">
+
+<dialog id="https-everywhere-prefs"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ buttons="accept"
+ buttonlabelaccept="&ssl-observatory.prefs.done;"
+ title="&ssl-observatory.prefs.title;"
+ width="800"
+ height="768"
+ persist="screenX screenY width height"
+ onload="observatory_prefs_init(document)"
+ ondialogaccept="observatory_prefs_accept()">
+ <script type="application/x-javascript" src="observatory-xul.js" />
+ <vbox flex="1" style="overflow:auto">
+ <spacer flex="1" />
+ <hbox flex="1">
+ <spacer flex="1" />
+ <image id="obs-title-logo"
+ src="chrome://https-everywhere/skin/ssl-observatory-messy.jpg" />
+ <spacer flex="1" />
+ </hbox>
+ <spacer flex="2" />
+ <label>&ssl-observatory.prefs.explanation;</label>
+ <separator class="thin" />
+ <label>&ssl-observatory.prefs.explanation2;</label>
+ <separator class="thin" />
+ <commandset>
+ <command id="toggle-enabled" oncommand="toggle_enabled()" />
+ <command id="use-obs-anon" oncommand="set_obs_anon(true)" />
+ <command id="use-obs-nonanon" oncommand="set_obs_anon(false)" />
+ <command id="toggle-alt-roots" oncommand="toggle_alt_roots()" />
+ <command id="toggle-send-asn" oncommand="toggle_send_asn()" />
+ <command id="toggle-priv-dns" oncommand="toggle_priv_dns()" />
+ <command id="toggle-self-signed" oncommand="toggle_self_signed()" />
+ </commandset>
+ <checkbox label="&ssl-observatory.prefs.use;" id="use-observatory"
+ command="toggle-enabled" style="font-size:1.5em;"/>
+ <separator class="thin"/>
+ <radiogroup style="margin-left:3em;" id="ssl-obs-how">
+ <radio label="&ssl-observatory.prefs.anonymous;"
+ tooltiptext="&ssl-observatory.prefs.anonymous_tooltip;"
+ alt_label="&ssl-observatory.prefs.anonymous_unavailable;"
+ command="use-obs-anon"
+ class="ssl-obs-conf" id="ssl-obs-anon"/>
+ <radio label="&ssl-observatory.prefs.nonanon;"
+ tooltiptext="&ssl-observatory.prefs.nonanon_tooltip;"
+ command="use-obs-nonanon"
+ class="ssl-obs-conf" id="ssl-obs-nonanon"/>
+ </radiogroup>
+ <separator class="thin"/>
+ <tooltip id="asn-tip" noautohide="true">
+ <label>&ssl-observatory.prefs.asn_tooltip;</label>
+ </tooltip>
+ <checkbox label="&ssl-observatory.prefs.asn;" id="send-asn"
+ tooltip="asn-tip" class="ssl-obs-conf"
+ command="toggle-send-asn"/>
+ <spacer flex="2" />
+ <hbox>
+ <spacer flex="1" />
+ <button label="&ssl-observatory.prefs.show;" onclick="show_advanced()"
+ id="show-advanced-button" class="ssl-obs-conf"/>
+ <button label="&ssl-observatory.prefs.hide;" onclick="hide_advanced()"
+ id="hide-advanced-button" hidden="true" />
+ <spacer flex="1" />
+ </hbox>
+ <spacer flex="1" />
+ <vbox flex="2">
+ <tooltip id="alt-roots-tip" noautohide="true">
+ <label>&ssl-observatory.prefs.alt_roots_tooltip;</label>
+ </tooltip>
+ <tooltip id="priv-dns-tip" noautohide="true">
+ <label>&ssl-observatory.prefs.priv_dns_tooltip;</label>
+ </tooltip>
+ <tooltip id="self-signed-tip" noautohide="true">
+ <label>&ssl-observatory.prefs.self_signed_tooltip;</label>
+ </tooltip>
+ <vbox id="observatory-advanced-opts" hidden="true">
+
+ <groupbox hidden="true" tooltip="self-signed-tip">
+ <checkbox label="&ssl-observatory.prefs.self_signed;"
+ class="ssl-obs-conf" id="self-signed"
+ command="toggle-self-signed"/>
+ </groupbox>
+
+ <groupbox hidden="true" tooltip="alt-roots-tip" >
+ <caption hidden="true" label="&ssl-observatory.prefs.adv_priv_opts1;"/>
+ <checkbox label="&ssl-observatory.prefs.alt_roots;"
+ command="toggle-alt-roots" class="ssl-obs-conf"
+ id="alt-roots" />
+ </groupbox>
+ <groupbox hidden="true" tooltip="priv-dns-tip">
+ <caption hidden="true" label="&ssl-observatory.prefs.adv_priv_opts2;"/>
+ <checkbox label="&ssl-observatory.prefs.priv_dns;"
+ class="ssl-obs-conf" id="priv-dns"
+ command="toggle-priv-dns"/>
+ </groupbox>
+ </vbox>
+ </vbox>
+ <spacer flex="5" />
+ </vbox>
+</dialog>
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/observatory-warning.xul b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/observatory-warning.xul
new file mode 100644
index 0000000..1f64e12
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/observatory-warning.xul
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<!DOCTYPE window SYSTEM "chrome://https-everywhere/locale/ssl-observatory.dtd">
+<window id="ssl-observatory-dialog"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ title="&ssl-observatory.warning.title;"
+ width="600"
+ height="500"
+ align="center"
+ onload="warning_populate(window.arguments[0])"
+ >
+ <script type="application/x-javascript" src="observatory-xul.js" />
+ <image src="chrome://https-everywhere/skin/ssl-observatory-messy.jpg" />
+ <vbox flex="1">
+ <vbox id="warning-container" flex="1">
+ <label style="padding:25px 25px 10px;">&ssl-observatory.warning.text;</label>
+ <spacer flex="1" />
+ </vbox>
+
+ <commandgroup>
+ <command id="showcert" oncommand="show_certs()" />
+ <command id="okay" oncommand='window.close()'
+ />
+ </commandgroup>
+
+ <spacer flex="1" />
+ <label style="padding:5px 25px 0px;">&ssl-observatory.warning.defense;</label>
+ <separator class="thin"/>
+ <hbox>
+ <spacer flex="2" />
+ <button label="&ssl-observatory.warning.showcert;" accesskey="S"
+ id="show-certificate" command='showcert'/>
+ <spacer flex="1" />
+ <button label="&ssl-observatory.warning.okay;" accesskey="I"
+ command='okay'/>
+ <spacer flex="2" />
+ </hbox>
+ <separator class="thin" />
+ </vbox>
+
+ <!--
+ <hbox style="padding-top:10px;">
+ <label class="text-link" href="https://www.eff.org/" tabindex="3" value="&ssl-observatory.popup.details;" />
+ <spacer flex="1" />
+ <button label="&ssl-observatory.popup.later;" id="ask-me-later" tabindex="0" style="font-size:0.8em;" accesskey="l"
+ oncommand="doCancel()"/>-
+ </hbox>-->
+</window>
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/observatory-xul.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/observatory-xul.js
new file mode 100644
index 0000000..df5e623
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/observatory-xul.js
@@ -0,0 +1,194 @@
+const CC = Components.classes;
+const CI = Components.interfaces;
+VERB=1;
+DBUG=2;
+INFO=3;
+NOTE=4;
+WARN=5;
+
+var ssl_observatory = CC["@eff.org/ssl-observatory;1"]
+ .getService(Components.interfaces.nsISupports)
+ .wrappedJSObject;
+var obsprefs = ssl_observatory.prefs;
+
+const pref_prefix = "extensions.ssl_observatory.";
+
+function observatory_prefs_init(doc) {
+ // Is the Observatory on?
+ var enabled = obsprefs.getBoolPref("extensions.https_everywhere._observatory.enabled");
+ document.getElementById("use-observatory").checked = enabled;
+ set_observatory_configurability(enabled);
+ // Other settings
+ document.getElementById("alt-roots").checked =
+ obsprefs.getBoolPref("extensions.https_everywhere._observatory.alt_roots");
+ document.getElementById("priv-dns").checked =
+ obsprefs.getBoolPref("extensions.https_everywhere._observatory.priv_dns");
+ document.getElementById("self-signed").checked =
+ obsprefs.getBoolPref("extensions.https_everywhere._observatory.self_signed");
+ document.getElementById("send-asn").checked =
+ obsprefs.getBoolPref("extensions.https_everywhere._observatory.send_asn");
+
+ // More complicated: is it anonymised by Tor?
+ var obs_how = doc.getElementById("ssl-obs-how");
+ var anon_radio = document.getElementById("ssl-obs-anon");
+ var nonanon_radio = document.getElementById("ssl-obs-nonanon");
+ var anon = !obsprefs.getBoolPref(
+ "extensions.https_everywhere._observatory.use_custom_proxy");
+
+ // first set the radios to match the current settings variables
+ obs_how.selectedItem = (anon) ? anon_radio : nonanon_radio;
+
+ // But if the user hasn't turned the observatory on,
+ // the default should be the maximally sensible one
+ var torbutton_avail = ssl_observatory.proxy_test_successful;
+ if (!enabled) {
+ set_obs_anon(torbutton_avail);
+ obs_how.selectedItem = (torbutton_avail) ? anon_radio : nonanon_radio;
+ }
+ //scale_title_logo();
+}
+
+// The user has responded to the popup in a final way; don't show it to them
+// again
+function popup_done() {
+ obsprefs.setBoolPref("extensions.https_everywhere._observatory.popup_shown", true);
+ obsprefs.setBoolPref("extensions.https_everywhere._observatory.clean_config", true);
+ window.close();
+}
+
+
+function scale_title_logo() {
+ // The image is naturally 500x207, but if it's shrunk we don't want it
+ // distorted
+ var img = document.getElementById("obs-title-logo");
+ alert("ch is " + img.height);
+ if (img.height != "207")
+ img.width = (500.0/207.0) * img.height;
+}
+
+// grey/ungrey UI elements that control observatory operation
+function set_observatory_configurability(enabled) {
+ // the relevant widgets are tagged with class="ssl-obs-conf"
+ var ui_elements = document.querySelectorAll(".ssl-obs-conf");
+ for (var i =0; i < ui_elements.length; i++)
+ ui_elements[i].disabled = !enabled;
+ // the "use tor" option can't be ungreyed unless tor is available
+ if (ssl_observatory.proxy_test_successful == false) {
+ var tor_opt = document.getElementById("ssl-obs-anon")
+ tor_opt.disabled = true;
+ tor_opt.label = tor_opt.getAttribute("alt_label");
+ }
+ if (!enabled)
+ hide_advanced();
+}
+
+// show/hide advanced options in the preferences dialog
+function show_advanced() {
+ var enabled = obsprefs.getBoolPref("extensions.https_everywhere._observatory.enabled");
+ if (enabled) {
+ var adv_opts_box = document.getElementById("observatory-advanced-opts");
+ recursive_set(adv_opts_box, "hidden", "false");
+ document.getElementById("show-advanced-button").hidden = true;
+ document.getElementById("hide-advanced-button").hidden = false;
+ }
+ //scale_title_logo();
+}
+function hide_advanced() {
+ var adv_opts_box = document.getElementById("observatory-advanced-opts");
+ recursive_set(adv_opts_box, "hidden", "true");
+ document.getElementById("show-advanced-button").hidden = false;
+ document.getElementById("hide-advanced-button").hidden = true;
+}
+
+function recursive_set(node, attrib, value) {
+ node.setAttribute(attrib, value);
+ for (var i=0; i < node.childNodes.length; i++)
+ recursive_set(node.childNodes[i], attrib, value)
+}
+
+
+function set_obs_anon(val) {
+ obsprefs.setBoolPref( "extensions.https_everywhere._observatory.use_custom_proxy", !val);
+}
+
+// called from the popup only
+function enable_observatory() {
+ obsprefs.setBoolPref("extensions.https_everywhere._observatory.enabled", true);
+ var torbutton_avail = ssl_observatory.proxy_test_successful;
+ set_obs_anon(torbutton_avail);
+}
+
+function disable_observatory() {
+ // default but be sure...
+ obsprefs.setBoolPref("extensions.https_everywhere._observatory.enabled", false);
+}
+
+// called from within the prefs window, we have more work to do:
+function toggle_enabled() {
+ var use_obs = document.getElementById("use-observatory").checked;
+ obsprefs.setBoolPref("extensions.https_everywhere._observatory.enabled", use_obs);
+ set_observatory_configurability(use_obs);
+}
+
+function toggle_send_asn() {
+ var send_asn = document.getElementById("send-asn").checked;
+ obsprefs.setBoolPref("extensions.https_everywhere._observatory.send_asn", send_asn);
+ if (send_asn) ssl_observatory.setupASNWatcher()
+ else ssl_observatory.stopASNWatcher();
+}
+
+function toggle_alt_roots() {
+ var alt_roots = document.getElementById("alt-roots").checked;
+ obsprefs.setBoolPref("extensions.https_everywhere._observatory.alt_roots", alt_roots);
+}
+
+function toggle_priv_dns() {
+ var priv_dns = document.getElementById("priv-dns").checked;
+ obsprefs.setBoolPref("extensions.https_everywhere._observatory.priv_dns", priv_dns);
+}
+
+function toggle_self_signed() {
+ var self_signed = document.getElementById("self-signed").checked;
+ obsprefs.setBoolPref("extensions.https_everywhere._observatory.self_signed", self_signed);
+}
+
+function observatory_prefs_accept() {
+ // This is *horrid*, but
+ // https://developer.mozilla.org/en/working_with_windows_in_chrome_code#Accessing_the_elements_of_the_top-level_document_from_a_child_window
+ var outer = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+ .getInterface(Components.interfaces.nsIWebNavigation)
+ .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
+ .rootTreeItem
+ .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+ .getInterface(Components.interfaces.nsIDOMWindow);
+
+ if (outer) outer.close()
+ else alert("no outer space");
+
+ return true; // https://developer.mozilla.org/en/XUL/dialog#a-ondialogaccept
+ // also close things if there is no out meta prefs window
+}
+
+function warning_populate(warningObj) {
+ // Fill in the SSL Observatory Warning labels...
+ var container = document.getElementById("warning-container");
+ for (var hash in warningObj) {
+ var label=document.createElement("label");
+ label.setAttribute("style","padding:5px 25px 5px;");
+ label.textContent = warningObj[hash].long_desc;
+ container.appendChild(label);
+ //var spacer=document.createElement("spacer");
+ //separator.setAttribute("flex","1");
+ //container.appendChild(spacer);
+ }
+}
+
+function show_certs() {
+ var parent_win = window.arguments[1];
+ var cert = window.arguments[2];
+ if (!parent_win)
+ alert("no parent window trying to show certs");
+ CC["@mozilla.org/nsCertificateDialogs;1"]
+ .getService(CI.nsICertificateDialogs)
+ .viewCert(parent_win, cert);
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/preferences.css b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/preferences.css
new file mode 100644
index 0000000..6b35c00
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/preferences.css
@@ -0,0 +1,11 @@
+treechildren::-moz-tree-checkbox { /* css for unchecked cells */
+ list-style-image: url("chrome://https-everywhere/skin/cross.png");
+}
+
+treechildren::-moz-tree-checkbox(checked) { /* css for checked cells */
+ list-style-image: url("chrome://https-everywhere/skin/tick.png");
+}
+
+treechildren::-moz-tree-checkbox(undefined) { /* css for empty cells */
+ list-style-image: url("");
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/preferences.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/preferences.js
new file mode 100644
index 0000000..557b335
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/preferences.js
@@ -0,0 +1,269 @@
+const CC = Components.classes;
+const CI = Components.interfaces;
+VERB=1;
+DBUG=2;
+INFO=3;
+NOTE=4;
+WARN=5;
+
+https_everywhere = CC["@eff.org/https-everywhere;1"]
+ .getService(Components.interfaces.nsISupports)
+ .wrappedJSObject;
+
+rulesets = [];
+
+const id_prefix = "he_enable";
+const pref_prefix = "extensions.https_everywhere.";
+const GITID = https_everywhere.https_rules.GITCommitID;
+
+// Disable all rules.
+function disable_all() {
+ for (var i in rulesets) {
+ rulesets[i].disable();
+ }
+
+ treeView.treebox.invalidate();
+}
+
+// Reset all rules to their default state.
+function reset_defaults() {
+ https_everywhere.https_rules.resetRulesetsToDefaults()
+ treeView.treebox.invalidate();
+}
+
+function resetSelected() {
+ var start = {};
+ var end = {};
+ var st = document.getElementById('sites_tree');
+ var sel = st.view.selection;
+ var numRanges = sel.getRangeCount();
+
+ for (var t = 0; t < numRanges; t++){
+ sel.getRangeAt(t, start, end);
+ for (var v = start.value; v <= end.value; v++){
+ var rs = treeView.rules[v];
+ rs.clear();
+ }
+ }
+}
+
+function resetSelectedMenu() {
+ var start = {};
+ var end = {};
+ var st = document.getElementById('sites_tree');
+ var sel = st.view.selection;
+ var numRanges = sel.getRangeCount();
+ var menuitem = document.getElementById("revert_menuitem");
+
+ for (var t = 0; t < numRanges; t++){
+ sel.getRangeAt(t, start, end);
+ for (var v = start.value; v <= end.value; v++){
+ var rs = treeView.rules[v];
+ if (rs.active !== rs.on_by_default) {
+ menuitem.disabled = false;
+ return;
+ }
+ }
+ }
+ menuitem.disabled = true;
+}
+
+function toggleSelected() {
+ var start = {};
+ var end = {};
+ var st = document.getElementById('sites_tree');
+ var sel = st.view.selection;
+ var numRanges = sel.getRangeCount();
+ var menuitem = document.getElementById("revert_menuitem");
+
+ for (var t = 0; t < numRanges; t++){
+ sel.getRangeAt(t, start, end);
+ for (var v = start.value; v <= end.value; v++){
+ var rs = treeView.rules[v];
+ rs.toggle();
+ treeView.treebox.invalidateRow(v);
+ }
+ }
+}
+
+
+function viewXMLSource() {
+ var start = {};
+ var end = {};
+ var st = document.getElementById('sites_tree');
+ var sel = st.view.selection;
+ var numRanges = sel.getRangeCount();
+ var menuitem = document.getElementById("revert_menuitem");
+
+ for (var t = 0; t < numRanges; t++){
+ sel.getRangeAt(t, start, end);
+ for (var v = start.value; v <= end.value; v++){
+ var rs = treeView.rules[v];
+
+ //This *should* not violate TorButton's State Control, but someone should double check
+ //this code just in case
+ var aWin = CC['@mozilla.org/appshell/window-mediator;1']
+ .getService(CI.nsIWindowMediator)
+ .getMostRecentWindow('navigator:browser');
+ aWin.openDialog("chrome://https-everywhere/content/fetch-source.xul",
+ rs.xmlName, "chrome,centerscreen",
+ {xmlName: rs.xmlName, GITCommitID: GITID} );
+ }
+ }
+}
+
+function getValue(row, col) {
+ switch (col.id) {
+ case "site_col":
+ return row.name;
+ case "note_col":
+ return row.notes;
+ case "enabled_col":
+ return https_everywhere.https_rules.rulesetsByName[row.name].active;
+ /*var ruleActive = false;
+ try {
+ if(https_everywhere.rule_toggle_prefs.getBoolPref(row.name))
+ ruleActive = true;
+ } catch(e) {
+ ruleActive = https_everywhere.https_rules.rulesetsByName[row.name].active;
+ }
+ return ruleActive;*/
+ default:
+ return;
+ }
+}
+
+function compareRules(a, b, col) {
+ var aval = getValue(a, col).toLowerCase();
+ var bval = getValue(b, col).toLowerCase();
+ var ret = 0;
+ if (aval < bval) {
+ ret = -1;
+ } else if (aval > bval) {
+ ret = 1;
+ } else {
+ ret = 0;
+ }
+ return ret;
+}
+
+function https_prefs_init(doc) {
+ var st = document.getElementById('sites_tree');
+ https_everywhere.https_rules.loadAllRulesets();
+ rulesets = Array.slice(https_everywhere.https_rules.rulesets);
+
+ // GLOBAL VARIABLE!
+ treeView = {
+ rules: rulesets,
+ rowCount: rulesets.length,
+ getCellValue: function(row, col) { // site names
+ if (!this.rules[row]) return;
+ return getValue(this.rules[row], col);
+ },
+ getCellText: function(row, col) { // activation indicator
+ return this.getCellValue(row, col);
+ },
+ setCellValue: function(row, col, val) { // toggle a rule's activation
+ var rule = this.rules[row];
+
+ if (val == "true") {
+ rule.enable();
+ } else {
+ rule.disable();
+ }
+
+ this.treebox.invalidateRow(row);
+ },
+ isEditable: function(row, col) {
+ return (col.id == "enabled_col");
+ },
+ setTree: function(treebox) {
+ this.treebox = treebox;
+ },
+ isContainer: function(row) { return false; },
+ isSeparator: function(row) { return false; },
+ isSorted: function() { return false; },
+ getRowProperties: function(row, props) {},
+ getColumnProperties: function(colid, col, props) {},
+ getCellProperties: function(row, col, props) {
+ if ( (col.id == "enabled_col") && !(this.rules[row]) ) {
+ var atomS = CC["@mozilla.org/atom-service;1"];
+ atomS = atomS.getService(CI.nsIAtomService);
+ // Starting with 22.0a1 there is no |props| available anymore. See:
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=407956. Looking at the
+ // patch the following seems to work, though.
+ if (!props) {
+ return "undefined";
+ }
+ props.AppendElement( atomS.getAtom("undefined") );
+ }
+ },
+ getLevel: function(row) { return 0; },
+ getImageSrc: function(row, col) { return null; },
+ search: function(query) {
+ var new_rules = [];
+ query = query.value.toLowerCase().replace(/^\s+|\s+$/g, "");
+
+ for (var i in rulesets) {
+ var rule_name = rulesets[i].name.toLowerCase();
+ if ( rule_name.indexOf(query) != -1 ) {
+ new_rules.push(rulesets[i]);
+ }
+ }
+
+ this.rules = new_rules;
+ this.rowCount = new_rules.length;
+ this.treebox.invalidate();
+ this.treebox.scrollToRow(rulesets[0]);
+ },
+ cycleHeader: function (col) {
+ var columnName;
+ var order = (col.element.getAttribute("sortDirection") === "ascending" ? -1 : 1);
+
+ var compare = function (a, b) {
+ return compareRules(a, b, col) * order;
+ };
+ rulesets.sort(compare);
+ this.rules.sort(compare);
+
+ var cols = st.getElementsByTagName("treecol");
+ for (var i = 0; i < cols.length; i++) {
+ cols[i].removeAttribute("sortDirection");
+ }
+ col.element.setAttribute("sortDirection", order === 1 ? "ascending" : "descending");
+ this.treebox.invalidate();
+ }
+ };
+
+ st.view = treeView;
+}
+
+function window_opener(uri) {
+ // we don't use window.open, because we need to work around TorButton's state control
+ if(typeof gBrowser == "undefined"){
+ var window = CC["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator);
+ var browserWindow = window.getMostRecentWindow("navigator:browser").getBrowser();
+ var newTab = browserWindow.addTab(uri, null, null);
+ browserWindow.selectedTab = newTab;
+
+ }
+ else
+ gBrowser.selectedTab = gBrowser.addTab(uri);
+}
+
+function https_prefs_accept() {
+ // This is *horrid*, but
+ // https://developer.mozilla.org/en/working_with_windows_in_chrome_code#Accessing_the_elements_of_the_top-level_document_from_a_child_window
+ var outer = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+ .getInterface(Components.interfaces.nsIWebNavigation)
+ .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
+ .rootTreeItem
+ .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+ .getInterface(Components.interfaces.nsIDOMWindow);
+
+ if (outer) outer.close();
+ else alert("no outer space");
+
+ return true; // https://developer.mozilla.org/en/XUL/dialog#a-ondialogaccept
+ // also close things if there is no out meta prefs window
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/preferences.xul b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/preferences.xul
new file mode 100644
index 0000000..ebde85b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/preferences.xul
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://https-everywhere/content/preferences.css" type="text/css"?>
+
+<!DOCTYPE overlay SYSTEM "chrome://https-everywhere/locale/https-everywhere.dtd">
+
+<dialog id="https-everywhere-prefs"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ buttons="accept,extra1,extra2"
+ buttonlabelextra1="&https-everywhere.prefs.disable_all;"
+ ondialogextra1="disable_all();"
+ buttonlabelextra2="&https-everywhere.prefs.reset_defaults;"
+ ondialogextra2="reset_defaults();"
+ title="&https-everywhere.prefs.title;"
+ persist="screenX screenY width height"
+ style="height:80%; resize:both;"
+ height="600"
+ width="650"
+ onload="https_prefs_init(document)"
+ ondialogaccept="https_prefs_accept()">
+
+ <script type="application/x-javascript" src="preferences.js"/>
+
+ <popupset>
+ <menupopup id="tree-contextmenu" onpopupshowing="resetSelectedMenu()">
+ <menuitem label="&https-everywhere.prefs.reset_default;" oncommand="resetSelected();" id="revert_menuitem"/>
+ <menuitem label="&https-everywhere.prefs.toggle;" oncommand="toggleSelected();"/>
+ <menuitem label="&https-everywhere.prefs.view_xml_source;" oncommand="viewXMLSource();"/>
+ </menupopup>
+ </popupset>
+
+ <groupbox flex="1">
+ <caption label="&https-everywhere.prefs.list_caption;"
+ align="center"/>
+ <vbox>
+ &https-everywhere.prefs.search;: <textbox id="tree_search" oninput="treeView.search(this);" />
+ </vbox>
+ <tree id="sites_tree" editable="true" flex="1" context="tree-contextmenu">
+ <treecols>
+ <treecol id="enabled_col" type="checkbox" label="&https-everywhere.prefs.enabled;"
+ editable="true" class="sortDirectionIndicator" persist="sortDirection width"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="site_col" label="&https-everywhere.prefs.site;" flex="1" editable="false" class="sortDirectionIndicator" persist="sortDirection width"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="note_col" label="&https-everywhere.prefs.notes;" flex="1" editable="false" class="sortDirectionIndicator" persist="sortDirection width"/>
+ </treecols>
+ <treechildren/>
+ </tree>
+ </groupbox>
+ <separator class="thin"/>
+ <vbox>
+ &https-everywhere.prefs.ruleset_howto;
+ <separator class="thin"/>
+ <label id="ruleset link"
+ value="&https-everywhere.prefs.here_link;"
+ style="color: blue; cursor:hand; text-decoration:underline;"
+ onmouseover="event.target.style.cursor='pointer'"
+ onmouseout="event.target.style.cursor='default'"
+ onclick="window_opener('https://eff.org/https-everywhere/rulesets')"/>.
+ </vbox>
+</dialog>
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/rules/00README b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/rules/00README
new file mode 100644
index 0000000..fcd8a77
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/rules/00README
@@ -0,0 +1,17 @@
+<!--
+This directory contains web site rewriting rules for the
+HTTPS Everywhere software, available from
+https://www.eff.org/https-everywhere
+
+These rules were contributed to the project by users and aim to
+enable routine secure access to as many different web sites as
+possible. They are automatically installed together with the
+HTTPS Everywhere software. The presence of these rules does not
+mean that an HTTPS Everywhere user accessed, or intended to
+access, any particular web site.
+
+For information about how to create additional HTTPS Everywhere
+rewriting rules to add support for new sites, please see
+
+https://www.eff.org/https-everywhere/rulesets
+-->
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.css b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.css
new file mode 100644
index 0000000..30dad18
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.css
@@ -0,0 +1,14 @@
+#ruleset-tests-status {
+ padding: 20px;
+}
+#wrapper {
+ text-align: center;
+}
+#progess-bar {
+ width: 300px;
+ height: 20px;
+}
+#log {
+ width: 400px;
+ height: 300px;
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.js
new file mode 100644
index 0000000..0bee33e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.js
@@ -0,0 +1,31 @@
+var HTTPSEverywhere = null;
+
+function updateStatusBar(current_test, total_tests) {
+ var labelText = "Test "+current_test+" of "+total_tests;
+ document.getElementById("progress-bar-label").value = labelText;
+
+ var percent = current_test / total_tests;
+ document.getElementById("progress-bar").value = percent;
+}
+
+function updateLog(msg) {
+ document.getElementById("log").value += msg+'\n';
+}
+
+function cancel() {
+ updateLog("Canceling early ...");
+ HTTPSEverywhere.httpseRulesetTests.cancel = true;
+}
+
+function start() {
+ HTTPSEverywhere = Components.classes["@eff.org/https-everywhere;1"]
+ .getService(Components.interfaces.nsISupports)
+ .wrappedJSObject;
+
+ HTTPSEverywhere.httpseRulesetTests.updateStatusBar = updateStatusBar;
+ HTTPSEverywhere.httpseRulesetTests.updateLog = updateLog;
+ HTTPSEverywhere.httpseRulesetTests.cancel = false;
+
+ updateLog("Starting ruleset tests ...");
+ HTTPSEverywhere.httpseRulesetTests.testRunner();
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.xul b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.xul
new file mode 100644
index 0000000..0efcd5d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests-status.xul
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="ruleset-tests-status.css" type="text/css"?>
+<!DOCTYPE window SYSTEM "chrome://https-everywhere/locale/https-everywhere.dtd">
+<window id="ruleset-tests-status"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ title="&https-everywhere.ruleset-tests.status_title;"
+ >
+
+ <script type="application/x-javascript" src="ruleset-tests-status.js" />
+
+ <commandgroup>
+ <command id="cancel" oncommand="cancel();" />
+ <command id="start" oncommand="start();" />
+ </commandgroup>
+
+ <html:div id="wrapper">
+ <vbox flex="1" style="width:100%">
+ <label id="progress-bar-label" value="Click Start to start the tests"></label>
+
+ <spacer flex="1"/>
+
+ <progressmeter id="progress-bar" mode="determined" value="0" />
+
+ <spacer flex="1"/>
+
+ <textbox id="log" multiline="true" readonly="true" value="" />
+
+ <spacer flex="1"/>
+
+ <button
+ id="cancel-button"
+ label="&https-everywhere.ruleset-tests.status_cancel_button;"
+ command="cancel" />
+
+ <button
+ id="start-button"
+ label="&https-everywhere.ruleset-tests.status_start_button;"
+ command="start" />
+ </vbox>
+ </html:div>
+</window>
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests.js
new file mode 100644
index 0000000..1aa94d8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/ruleset-tests.js
@@ -0,0 +1,155 @@
+// load the HTTPS Everywhere component
+var HTTPSEverywhere = null;
+try {
+ HTTPSEverywhere = Components.classes["@eff.org/https-everywhere;1"]
+ .getService(Components.interfaces.nsISupports)
+ .wrappedJSObject;
+} catch(e) {
+ // HTTPS Everywhere doesn't seem to be installed
+}
+
+// attach testRunner to the HTTPS Everywhere component so that status.js can run it
+if(HTTPSEverywhere) {
+ HTTPSEverywhere.httpseRulesetTests = {
+ testRunner: testRunner
+ };
+}
+
+
+function openStatus() {
+ // make sure mixed content blocking preferences are correct
+ Services.prefs.setBoolPref("security.mixed_content.block_display_content", false);
+ Services.prefs.setBoolPref("security.mixed_content.block_active_content", true);
+
+ // open the status tab
+ var statusTab = gBrowser.addTab('chrome://https-everywhere/content/ruleset-tests-status.xul');
+ gBrowser.selectedTab = statusTab;
+}
+
+function testRunner() {
+ Components.utils.import("resource://gre/modules/PopupNotifications.jsm");
+
+ const numTabs = 6;
+ var finished = false;
+ var output = [];
+ var urls = [];
+ var num = 0;
+
+ for(var target in HTTPSEverywhere.https_rules.targets) {
+ if(!target.indexOf("*") != -1) {
+ urls.push({
+ url: 'https://'+target,
+ target: target,
+ ruleset_names: HTTPSEverywhere.https_rules.targets[target]
+ });
+ }
+ }
+
+ function test() {
+ var i;
+
+ HTTPSEverywhere.httpseRulesetTests.updateStatusBar(num, urls.length);
+
+ // start loading all the tabs
+ window.focus
+ for(i=0; i<numTabs; i++) {
+ newTab(num);
+ }
+ }
+
+ function newTab(number) {
+ num +=1;
+ // start a test in this tab
+ if(urls.length) {
+
+ // open a new tab
+ var tab = gBrowser.addTab(urls[number].url);
+
+ // wait for the page to load
+ var intervalId = window.setTimeout(function(){
+
+ // detect mixed content blocker
+ if(PopupNotifications.getNotification("mixed-content-blocked", gBrowser.getBrowserForTab(tab))) {
+ // build output to log
+ ruleset_xmls = '';
+ for(let i=0; i<urls[number].ruleset_names.length; i++) {
+ ruleset_xmls += urls[number].ruleset_names[i].xmlName + ', ';
+ }
+ if(ruleset_xmls != '')
+ ruleset_xmls = ruleset_xmls.substring(ruleset_xmls.length-2, 2);
+ var output = 'MCB triggered: '+urls[number].url+' ('+ruleset_xmls+')';
+
+ HTTPSEverywhere.httpseRulesetTests.updateLog(output);
+ }
+
+ // close this tab, and open another
+ closeTab(tab);
+
+ }, 10000);
+
+ } else {
+
+ //to run if urls is empty
+ if (!finished) {
+ finished = true;
+ window.setTimeout(function(){
+ gBrowser.removeCurrentTab();
+ }, 10000);
+ }
+ }
+ }
+
+ //closes tab
+ function closeTab(tab) {
+ HTTPSEverywhere.httpseRulesetTests.updateStatusBar(num, urls.length);
+
+ gBrowser.selectedTab = tab;
+ gBrowser.removeCurrentTab();
+
+ // open a new tab, if the tests haven't been canceled
+ if(!HTTPSEverywhere.httpseRulesetTests.cancel) {
+ newTab(num);
+ }
+ }
+
+ //manages write out of output mochilog.txt, which contains sites that trigger mcb
+ function writeout(weburl) {
+
+ //initialize file
+ var file = Components.classes["@mozilla.org/file/directory_service;1"].
+ getService(Components.interfaces.nsIProperties).
+ get("Home", Components.interfaces.nsIFile);
+ writeoutfile = "mochilog.txt";
+ file.append(writeoutfile);
+
+ //create file if it does not already exist
+ if(!file.exists()) {
+ file.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 420);
+ }
+
+ //initialize output stream
+ var stream = Components.classes["@mozilla.org/network/file-output-stream;1"]
+ .createInstance(Components.interfaces.nsIFileOutputStream);
+
+ //permissions are set to append (will not delete existing contents)
+ stream.init(file, 0x02 | 0x08 | 0x10, 0666, 0);
+
+ var content = weburl + "\n";
+
+ //Deal with ascii text and write out
+ var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].
+ createInstance(Components.interfaces.nsIConverterOutputStream);
+ converter.init(stream, "UTF-8", 0, 0);
+ converter.writeString(content);
+ converter.close();
+
+ //alternative write out if ascii is not a concern
+ //stream.write(content,content.length);
+ //stream.close();
+
+ }
+ test();
+}
+
+
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/toolbar_button.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/toolbar_button.js
new file mode 100644
index 0000000..0e90a12
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/toolbar_button.js
@@ -0,0 +1,369 @@
+window.addEventListener("load", https_everywhere_load, true);
+window.addEventListener("load", function load(event) {
+ // need to wrap migratePreferences in another callback so that notification
+ // always displays on browser restart
+ window.removeEventListener("load", load, false);
+ gBrowser.addEventListener("DOMContentLoaded", migratePreferences, true);
+}, false);
+
+const CI = Components.interfaces;
+const CC = Components.classes;
+
+// LOG LEVELS ---
+VERB=1;
+DBUG=2;
+INFO=3;
+NOTE=4;
+WARN=5;
+
+HTTPSEverywhere = CC["@eff.org/https-everywhere;1"]
+ .getService(Components.interfaces.nsISupports)
+ .wrappedJSObject;
+
+// avoid polluting global namespace
+// see: https://developer.mozilla.org/en-US/docs/Security_best_practices_in_extensions#Code_wrapping
+if (!httpsEverywhere) { var httpsEverywhere = {}; }
+
+/**
+ * JS Object that acts as a namespace for the toolbar.
+ *
+ * Used to display toolbar hints to new users and change toolbar UI for cases
+ * such as when the toolbar is disabled.
+ */
+httpsEverywhere.toolbarButton = {
+
+ /**
+ * Name of preference for determining whether to show ruleset counter.
+ */
+ COUNTER_PREF: "extensions.https_everywhere.show_counter",
+
+ /**
+ * Used to determine if a hint has been previously shown.
+ * TODO: Probably extraneous, look into removing
+ */
+ hintShown: false,
+
+ /**
+ * Initialize the toolbar button used to hint new users and update UI on
+ * certain events.
+ */
+ init: function() {
+ HTTPSEverywhere.log(DBUG, 'Removing listener for toolbarButton init.');
+ window.removeEventListener('load', httpsEverywhere.toolbarButton.init, false);
+
+ var tb = httpsEverywhere.toolbarButton;
+
+ // make sure icon is proper color during init
+ tb.changeIcon();
+
+ // make sure the checkbox for showing counter is properly set
+ var showCounter = tb.shouldShowCounter();
+ var counterItem = document.getElementById('https-everywhere-counter-item');
+ counterItem.setAttribute('checked', showCounter ? 'true' : 'false');
+
+ // show ruleset counter when a tab is changed
+ tb.updateRulesetsApplied();
+ gBrowser.tabContainer.addEventListener(
+ 'TabSelect',
+ tb.updateRulesetsApplied,
+ false
+ );
+
+ // hook event for when page loads
+ var onPageLoad = function() {
+ // Timeout is used for a number of reasons.
+ // 1) For Performance since we want to defer computation.
+ // 2) Sometimes the page is loaded before all applied rulesets are
+ // calculated; in such a case, a half-second wait works.
+ setTimeout(tb.updateRulesetsApplied, 500);
+ };
+
+ var appcontent = document.getElementById('appcontent');
+ if (appcontent) {
+ appcontent.addEventListener('load', onPageLoad, true);
+ }
+
+ // decide whether to show toolbar hint
+ let hintPref = "extensions.https_everywhere.toolbar_hint_shown";
+ if (!Services.prefs.getPrefType(hintPref)
+ || !Services.prefs.getBoolPref(hintPref)) {
+ // only run once
+ Services.prefs.setBoolPref(hintPref, true);
+ gBrowser.addEventListener("DOMContentLoaded", tb.handleShowHint, true);
+ }
+ },
+
+ /**
+ * Shows toolbar hint if previously not shown.
+ */
+ handleShowHint: function() {
+ var tb = httpsEverywhere.toolbarButton;
+ if (!tb.hintShown){
+ tb.hintShown = true;
+ const faqURL = "https://www.eff.org/https-everywhere/faq";
+ var nBox = gBrowser.getNotificationBox();
+ var strings = document.getElementById('HttpsEverywhereStrings');
+ var msg = strings.getString('https-everywhere.toolbar.hint');
+ var hint = nBox.appendNotification(
+ msg,
+ 'https-everywhere',
+ 'chrome://https-everywhere/skin/https-everywhere-24.png',
+ nBox.PRIORITY_WARNING_MEDIUM,
+ [],
+ function(action) {
+ // see https://developer.mozilla.org/en-US/docs/XUL/Method/appendNotification#Notification_box_events
+ gBrowser.selectedTab = gBrowser.addTab(faqURL);
+ }
+ );
+ }
+ gBrowser.removeEventListener("DOMContentLoaded", tb.handleShowHint, true);
+ },
+
+ /**
+ * Changes HTTPS Everywhere toolbar icon based on whether HTTPS Everywhere
+ * is enabled or disabled.
+ */
+ changeIcon: function() {
+ var enabled = HTTPSEverywhere.prefs.getBoolPref("globalEnabled");
+
+ var toolbarbutton = document.getElementById('https-everywhere-button');
+ if (enabled) {
+ toolbarbutton.setAttribute('status', 'enabled');
+ } else {
+ toolbarbutton.setAttribute('status', 'disabled');
+ }
+ },
+
+ /**
+ * Update the rulesets applied counter for the current tab.
+ */
+ updateRulesetsApplied: function() {
+ var toolbarbutton = document.getElementById('https-everywhere-button');
+ var enabled = HTTPSEverywhere.prefs.getBoolPref("globalEnabled");
+ var showCounter = httpsEverywhere.toolbarButton.shouldShowCounter();
+ if (!enabled || !showCounter) {
+ toolbarbutton.setAttribute('rulesetsApplied', 0);
+ return;
+ }
+
+ var domWin = content.document.defaultView.top;
+ var alist = HTTPSEverywhere.getExpando(domWin,"applicable_rules", null);
+ if (!alist) {
+ return;
+ }
+ // Make sure the list is up to date
+ alist.populate_list();
+
+ var counter = 0;
+ for (var x in alist.active) {
+ if (!(x in alist.breaking)) {
+ ++counter;
+ }
+ }
+ for (var x in alist.moot) {
+ if (!(x in alist.active)) {
+ ++counter;
+ }
+ }
+
+ toolbarbutton.setAttribute('rulesetsApplied', counter);
+ HTTPSEverywhere.log(INFO, 'Setting icon counter to: ' + counter);
+ },
+
+ /**
+ * Gets whether to show the rulesets applied counter.
+ *
+ * @return {boolean}
+ */
+ shouldShowCounter: function() {
+ var tb = httpsEverywhere.toolbarButton;
+ var sp = Services.prefs;
+
+ var prefExists = sp.getPrefType(tb.COUNTER_PREF);
+
+ // the default behavior is to show the rulesets applied counter.
+ // if no preference exists (default) or its enabled, show the counter
+ return !prefExists || sp.getBoolPref(tb.COUNTER_PREF);
+ },
+
+ /**
+ * Toggles the user's preference for displaying the rulesets applied counter
+ * and updates the UI.
+ */
+ toggleShowCounter: function() {
+ var tb = httpsEverywhere.toolbarButton;
+ var sp = Services.prefs;
+
+ var showCounter = tb.shouldShowCounter();
+ sp.setBoolPref(tb.COUNTER_PREF, !showCounter);
+
+ tb.updateRulesetsApplied();
+ }
+
+};
+
+function https_everywhere_load() {
+ window.removeEventListener('load', https_everywhere_load, true);
+ // on first run, put the context menu in the addons bar
+ try {
+ var first_run;
+ try {
+ first_run = Services.prefs.getBoolPref("extensions.https_everywhere.firstrun_context_menu");
+ } catch(e) {
+ Services.prefs.setBoolPref("extensions.https_everywhere.firstrun_context_menu", true);
+ first_run = true;
+ }
+ if(first_run) {
+ Services.prefs.setBoolPref("extensions.https_everywhere.firstrun_context_menu", false);
+ var navbar = document.getElementById("nav-bar");
+ if(navbar.currentSet.indexOf("https-everywhere-button") == -1) {
+ var set = navbar.currentSet+',https-everywhere-button';
+ navbar.setAttribute('currentset', set);
+ navbar.currentSet = set;
+ document.persist('nav-bar', 'currentset');
+ }
+ }
+ } catch(e) { }
+}
+
+function stitch_context_menu() {
+ // the same menu appears both under Tools and via the toolbar button:
+ var menu = document.getElementById("https-everywhere-menu");
+ if (!menu.firstChild) {
+ var popup = document.getElementById("https-everywhere-context");
+ menu.appendChild(popup.cloneNode(true));
+ }
+}
+function stitch_context_menu2() {
+ // the same menu appears both under Tools and via the toolbar button:
+ var menu = document.getElementById("https-everywhere-menu2");
+ if (!menu.firstChild) {
+ var popup = document.getElementById("https-everywhere-context");
+ menu.appendChild(popup.cloneNode(true));
+ }
+}
+
+var rulesetTestsMenuItem = null;
+
+function show_applicable_list(menupopup) {
+ var domWin = content.document.defaultView.top;
+ if (!(domWin instanceof CI.nsIDOMWindow)) {
+ alert(domWin + " is not an nsIDOMWindow");
+ return null;
+ }
+
+ var alist = HTTPSEverywhere.getExpando(domWin,"applicable_rules", null);
+ var weird=false;
+
+ if (!alist) {
+ // This case occurs for error pages and similar. We need a dummy alist
+ // because populate_menu lives in there. Would be good to refactor this
+ // away.
+ alist = new HTTPSEverywhere.ApplicableList(HTTPSEverywhere.log, document, domWin);
+ weird = true;
+ }
+ alist.populate_menu(document, menupopup, weird);
+
+ // should we also show the ruleset tests menu item?
+ if(HTTPSEverywhere.prefs.getBoolPref("show_ruleset_tests")) {
+
+ if(!rulesetTestsMenuItem) {
+ let strings = document.getElementById('HttpsEverywhereStrings');
+ let label = strings.getString('https-everywhere.menu.ruleset-tests');
+
+ rulesetTestsMenuItem = this.document.createElement('menuitem');
+ rulesetTestsMenuItem.setAttribute('command', 'https-everywhere-menuitem-ruleset-tests');
+ rulesetTestsMenuItem.setAttribute('label', label);
+ }
+
+ if(!menupopup.contains(rulesetTestsMenuItem))
+ menupopup.appendChild(rulesetTestsMenuItem);
+ }
+
+}
+
+function toggle_rule(rule_id) {
+ // toggle the rule state
+ HTTPSEverywhere.https_rules.rulesetsByID[rule_id].toggle();
+ var domWin = content.document.defaultView.top;
+ /*if (domWin instanceof CI.nsIDOMWindow) {
+ var alist = HTTPSEverywhere.getExpando(domWin,"applicable_rules", null);
+ if (alist) alist.empty();
+ }*/
+ reload_window();
+}
+
+function reload_window() {
+ var domWin = content.document.defaultView.top;
+ if (!(domWin instanceof CI.nsIDOMWindow)) {
+ HTTPSEverywhere.log(WARN, domWin + " is not an nsIDOMWindow");
+ return null;
+ }
+ try {
+ var webNav = domWin.QueryInterface(CI.nsIInterfaceRequestor)
+ .getInterface(CI.nsIWebNavigation)
+ .QueryInterface(CI.nsIDocShell);
+ } catch(e) {
+ HTTPSEverywhere.log(WARN,"failed to get webNav");
+ return null;
+ }
+ // This choice of flags comes from NoScript's quickReload function; not sure
+ // if it's optimal
+ webNav.reload(webNav.LOAD_FLAGS_CHARSET_CHANGE);
+}
+
+function toggleEnabledState(){
+ HTTPSEverywhere.toggleEnabledState();
+ reload_window();
+
+ // Change icon depending on enabled state
+ httpsEverywhere.toolbarButton.changeIcon();
+}
+
+function open_in_tab(url) {
+ var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
+ .getService(Components.interfaces.nsIWindowMediator);
+ var recentWindow = wm.getMostRecentWindow("navigator:browser");
+ recentWindow.delayedOpenTab(url, null, null, null, null);
+}
+
+// hook event for showing hint
+HTTPSEverywhere.log(DBUG, 'Adding listener for toolbarButton init.');
+window.addEventListener("load", httpsEverywhere.toolbarButton.init, false);
+
+function migratePreferences() {
+ gBrowser.removeEventListener("DOMContentLoaded", migratePreferences, true);
+ let prefs_version = HTTPSEverywhere.prefs.getIntPref("prefs_version");
+
+ // first migration loses saved prefs
+ if(prefs_version == 0) {
+ try {
+ // upgrades will have old rules as preferences, such as the EFF rule
+ let upgrade = false;
+ let childList = HTTPSEverywhere.prefs.getChildList("", {});
+ for(let i=0; i<childList.length; i++) {
+ if(childList[i] == 'EFF') {
+ upgrade = true;
+ break;
+ }
+ }
+
+ if(upgrade) {
+ let nBox = gBrowser.getNotificationBox();
+ let strings = document.getElementById('HttpsEverywhereStrings');
+ let msg = strings.getString('https-everywhere.migration.notification0');
+ nBox.appendNotification(
+ msg,
+ 'https-everywhere-migration0',
+ 'chrome://https-everywhere/skin/https-everywhere-24.png',
+ nBox.PRIORITY_WARNING_MEDIUM
+ );
+ }
+ } catch(e) {
+ HTTPSEverywhere.log(WARN, "Migration from prefs_version 0 error: "+e);
+ }
+
+ HTTPSEverywhere.prefs.setIntPref("prefs_version", prefs_version+1);
+ }
+}
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/toolbar_button.xul b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/toolbar_button.xul
new file mode 100644
index 0000000..c3cbed0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/toolbar_button.xul
@@ -0,0 +1,71 @@
+<?xml version="1.0"?>
+<?xml-stylesheet href="chrome://https-everywhere/skin/https-everywhere.css" type="text/css"?>
+
+<!DOCTYPE overlay SYSTEM "chrome://https-everywhere/locale/https-everywhere.dtd">
+
+<!-- helpful docs at
+ https://developer.mozilla.org/en/XUL/PopupGuide/PopupEvents -->
+
+<overlay id="https-everywhere-button-overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+ <script type="application/x-javascript" src="chrome://https-everywhere/content/toolbar_button.js"/>
+ <script type="application/x-javascript" src="chrome://https-everywhere/content/ruleset-tests.js"/>
+
+ <stringbundleset id="stringbundleset">
+ <stringbundle id="HttpsEverywhereStrings"
+ src="chrome://https-everywhere/locale/https-everywhere.properties" />
+ </stringbundleset>
+
+ <!-- this works in Firefox, we need a Seamonkey version too... -->
+ <menupopup id="menu_ToolsPopup" onpopupshowing="stitch_context_menu()">
+ <menu id="https-everywhere-menu" label="&https-everywhere.about.ext_name;">
+ <!-- "https-everywhere-context" below gets .cloneNode()ed in here -->
+ </menu>
+ </menupopup>
+
+ <menupopup id="toolsPopup" onpopupshowing="stitch_context_menu2()">
+ <menu id="https-everywhere-menu2" label="&https-everywhere.about.ext_name;">
+ <!-- "https-everywhere-context" below gets .cloneNode()ed in here -->
+ </menu>
+ </menupopup>
+
+ <toolbarpalette id="BrowserToolbarPalette">
+ <toolbarbutton
+ id="https-everywhere-button"
+ tooltiptext="&https-everywhere.about.ext_name;"
+ label="HTTPS"
+ context="https-everywhere-context-menu"
+ oncontextmenu="this.open = true;"
+ oncommand="this.open = true;"
+ buttonstyle="pictures"
+ type="menu"
+ rulesetsApplied="0">
+
+ <menupopup id="https-everywhere-context" onpopupshowing="show_applicable_list(this)">
+ <!-- entries will be written here by ApplicableList.populate_menu() -->
+ <menuseparator />
+ <menuitem type="checkbox" id="https-everywhere-counter-item" label="&https-everywhere.menu.showCounter;"
+ oncommand="httpsEverywhere.toolbarButton.toggleShowCounter()" />
+ <menuseparator />
+ <menuitem label="&https-everywhere.menu.observatory;" command="https-everywhere-menuitem-observatory" />
+ <menuitem label="&https-everywhere.menu.about;" command="https-everywhere-menuitem-about" />
+ </menupopup>
+ </toolbarbutton>
+ </toolbarpalette>
+ <commandset>
+ <command id="https-everywhere-menuitem-globalEnableToggle"
+ oncommand="toggleEnabledState();" />
+ <command id="https-everywhere-menuitem-preferences"
+ oncommand="HTTPSEverywhere.chrome_opener('chrome://https-everywhere/content/preferences.xul', 'chrome,centerscreen,resizable=yes');" />
+ <command id="https-everywhere-menuitem-about"
+ oncommand="HTTPSEverywhere.chrome_opener('chrome://https-everywhere/content/about.xul');" />
+ <command id="https-everywhere-menuitem-observatory"
+ oncommand="HTTPSEverywhere.chrome_opener('chrome://https-everywhere/content/observatory-preferences.xul', 'chrome,centerscreen,resizable=yes');" />
+ <command id="https-everywhere-menuitem-donate-eff"
+ oncommand="open_in_tab('https://www.eff.org/donate');" />
+ <command id="https-everywhere-menuitem-donate-tor"
+ oncommand="open_in_tab('https://www.torproject.org/donate');" />
+ <command id="https-everywhere-menuitem-ruleset-tests"
+ oncommand="openStatus();" />
+ </commandset>
+</overlay>
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/toolbar_button_binding.xml b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/toolbar_button_binding.xml
new file mode 100644
index 0000000..1981b3a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/content/toolbar_button_binding.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<!--
+Toolbar button needs to be extended to show a counter for the number of
+rulesets applied, and this can be done using XBL.
+
+See: https://developer.mozilla.org/en-US/docs/XBL
+-->
+<bindings xmlns="http://www.mozilla.org/xbl"
+ xmlns:xbl="http://www.mozilla.org/xbl"
+ xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+ <binding id="https-everywhere-binding">
+ <content>
+ <!-- ruleset counter (rscounter) and rulesets applied (rsapplied) -->
+ <xul:stack id="rscounter">
+ <xul:label id="rsapplied" xbl:inherits="value=rulesetsApplied" />
+ </xul:stack>
+
+ <!--
+ Https everywhere toolbar button is already defined; just use its settings.
+ TODO: Look into any issues with oncommand/oncontext.
+ -->
+ <xul:toolbarbutton
+ class="https-everywhere-button toolbarbutton-1 chromeclass-toolbar-additional"
+ flex="1"
+ allowevents="true"
+ xbl:inherits="type,crop,image,label,accesskey,command,align,dir,pack,orient,wrap">
+
+ <children includes="menupopup" />
+ </xul:toolbarbutton>
+ </content>
+ </binding>
+</bindings>
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ar/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ar/https-everywhere.dtd
new file mode 100644
index 0000000..00b898e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ar/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "عن HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Ø´ÙØ± شبكة الإنترنت! استخدم تلقائيا تقنية HTTPS للأمان مع الكثير من المواقع.">
+<!ENTITY https-everywhere.about.version "النسخة">
+<!ENTITY https-everywhere.about.created_by "أنشأه">
+<!ENTITY https-everywhere.about.librarians "جامعيْ القواعد">
+<!ENTITY https-everywhere.about.thanks "شكراً لكل من">
+<!ENTITY https-everywhere.about.contribute "إن أعجبتك Ø¥Ø¶Ø§ÙØ© HTTPS EverywhereØŒ Ùكر بـ">
+<!ENTITY https-everywhere.about.donate_tor "التبرع لتور">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "التبرع للـ EFF">
+
+<!ENTITY https-everywhere.menu.about "عن HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "خيارات مرصد SSL">
+<!ENTITY https-everywhere.menu.globalEnable "ÙØ¹Ù‘Ù„ HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "عطّل HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "خيارات HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "ÙØ¹Ù‘Ù„ الكل">
+<!ENTITY https-everywhere.prefs.disable_all "عطّل الكل">
+<!ENTITY https-everywhere.prefs.reset_defaults "استعادة الإعدادات Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ©">
+<!ENTITY https-everywhere.prefs.search "بحث">
+<!ENTITY https-everywhere.prefs.site "موقع">
+<!ENTITY https-everywhere.prefs.notes "ملاحظات">
+<!ENTITY https-everywhere.prefs.list_caption "أي من قواعد إعادة توجيه HTTPS يجب أن تطبق؟">
+<!ENTITY https-everywhere.prefs.enabled "Ù…ÙØ¹Ù‘Ù„">
+<!ENTITY https-everywhere.prefs.ruleset_howto "يمكنك تعلم كيÙية كتابة قواعد خاصة بك (Ù„Ø¥Ø¶Ø§ÙØ© الدعم لمواقع أخرى)">
+<!ENTITY https-everywhere.prefs.here_link "هنا">
+<!ENTITY https-everywhere.prefs.toggle "بدّل">
+<!ENTITY https-everywhere.prefs.reset_default "استعادة الإعداد Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ">
+<!ENTITY https-everywhere.prefs.view_xml_source "Ø§ÙØ­Øµ مصدر XML">
+
+<!ENTITY https-everywhere.source.downloading "يحÙمل حالياً">
+<!ENTITY https-everywhere.source.filename "اسم الملÙ">
+<!ENTITY https-everywhere.source.unable_to_download "تعذّر تنزيل المصدر.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "عذراً. انت كنت تستخدم اصدار مستقر من HTTPS Everywhere، ولكن تم تحديث اصدارك إلي الاصدار التجريبي عن طريق الخطء.">
+<!ENTITY https-everywhere.popup.paragraph2 "هل ترغب ÙÙŠ العودة للاصدار المستقر؟">
+<!ENTITY https-everywhere.popup.paragraph3 "كنا نحب لو واصلت استخدام الاصدار التجريبي من HTTPS Everywhere لان ذلك يساعدنا علي جعل البرنامج Ø£ÙØ¶Ù„! قد تجد ÙÙŠ الاصدار التجريبي بعض الأخطاء التي يمكنك ان تبلغ عنها بمراسلة https-everywhere@eff.org. نآس٠على الإزعاج Ùˆ شكراً لأستخدامك HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "ابقني علي الاصدار التجريبي">
+<!ENTITY https-everywhere.popup.revert "حمل الاصدار المستقر الاخير">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ar/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ar/https-everywhere.properties
new file mode 100644
index 0000000..2618335
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ar/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = ÙØ¹Ù‘Ù„ HTTPS Everywhere
+https-everywhere.menu.globalDisable = أوق٠HTTPS Everywhere
+https-everywhere.menu.enableDisable = ÙØ¹Ù„ / اوق٠القوانين
+https-everywhere.menu.noRules = (هذه Ø§Ù„ØµÙØ­Ø© لا تحتوي على قوانين)
+https-everywhere.menu.unknownRules = (قواين هذه Ø§Ù„ØµÙØ­Ø© غير Ù…Ø¹Ø±ÙˆÙØ©)
+https-everywhere.toolbar.hint = HTTPS Everywhere Ù…ÙØ¹Ù„ الان. يمكنك ØªÙØ¹ÙŠÙ„Ù‡ او تعطيله علي حسب الموقع الذي تزور عن طريق الضغط علي الرمز ÙÙŠ شريطة العناوين.
+https-everywhere.migration.notification0 = من أجل أن تنÙيذ اصلاح مهم، هذا التحديث يعيد قوانين HTTPS Everywhere إلى حالتها Ø§Ù„Ø¥ÙØªØ±Ø§Ø¶ÙŠØ©.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ar/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ar/ssl-observatory.dtd
new file mode 100644
index 0000000..04e3e91
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ar/ssl-observatory.dtd
@@ -0,0 +1,97 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Ø§Ù„ØªÙØ§ØµÙŠÙ„ ومعلومات الخصوصية">
+<!ENTITY ssl-observatory.popup.later "إسألني لاحقاً">
+<!ENTITY ssl-observatory.popup.no "لا">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere يمكن له أن يكتش٠الهجمات
+ضد Ù…ØªØµÙØ­Ùƒ عبر إرسال الشهادات التي تستقبلها إلى المرصد.
+هل تريد تشغيل هذه الخاصية؟">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"هل تريد أن يستخدم HTTPS Everywhere خاصية SSL Observatory؟">
+
+<!ENTITY ssl-observatory.popup.yes "نعم">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"ان استخدام تلك الخاصية آمن إلا إذا كنت تستخدم الإنترنت ضمن شبكة شركة ذات إعدادات رقابية:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"آمن، إلا إذا كنت تستخدم شبكة شركة داخلية تستخدم أسماء سرية لخوادمها:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"أرسل وتحقق من الشهادات الموقعة بواسطة سلطة غير معتمدة.">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"من الآمن (والمستحسن) ØªÙØ¹ÙŠÙ„ هذا الخيار، إلا إذا كنت تستخدم شبكة شركة تطÙلية أو برنامج كاسبرسكي المضاد للڤيروسات الذي يراقب ØªØµÙØ­Ùƒ عن طريق TLS بروكسي Ùˆ private root Certificate Authority. إذا ÙØ¹Ù„ت الخاصية على شبكة مماثلة، قد ينشر هذا الخيار أدلة على أي نطاقات https:// تمت زيارتها عبر ذلك البروكسي، وذلك بسبب الشهادات Ø§Ù„ÙØ±ÙŠØ¯Ø© التي يمكن أن ينتجها. ولذلك نحن نتركه غير Ù…ÙØ¹Ù„ ÙÙŠ الإعدادات Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ©.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "تحقق من الشهادات باستخدام تور Ù„Ø¥Ø®ÙØ§Ø¡ الهوية">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"تحقق من الشهادات باستخدام تور Ù„Ø¥Ø®ÙØ§Ø¡ الهوية (يتطلب تور)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"يتطلب هذا الخيار تثبيت و تشغيل تور">
+
+<!ENTITY ssl-observatory.prefs.asn
+"عندما ترى شهادة جديدة، أخبر المرصد عن هوية مزود خدمة الإنترنت الخاص بك.">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"هذا سيجلب Ùˆ يرسل &quot;رقم النظام المستقل&quot; الخاص بشبكتك. هذا سيساعدنا على تحديد موقع الهجمات ضد HTTPSØŒ وتحديد ما إذا كان لدينا ملاحظات من شبكات ÙÙŠ أماكن مثل سوريا وإيران حيث هذه الهجمات شائعة نسبياً.">
+
+<!ENTITY ssl-observatory.prefs.done "انتهى">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere يمكن له أن يستخدم مرصد SSL من الـEFF وهذا يعني شيئين: (۱)
+إرسال نسخ من شهادات HTTPS إلى المرصد لمساعدتنا على كش٠هجمات 'رجل-ÙÙŠ-الوسط'
+ وتحسين الأمان على الإنترنت، Ùˆ (Ù¢) يسمح لنا بتحذيرك عن الاتصالات غير الآمنة أو الهجمات على Ù…ØªØµÙØ­Ùƒ.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"على سبيل المثال، عندما تقوم بزيارة https://www.something.com, ÙØ¥Ù† الشهادة
+التي يتلقاها المرصد تشير إلى أن شخصاً ما قام بزيارة www.something.com, ولكن ليس من قام بالزيارة
+أو ما هي Ø§Ù„ØµÙØ­Ø§Øª التي قاموا بقراءتها. أشر Ø¨Ø§Ù„ÙØ£Ø±Ø© Ùوق الخيار للمزيد من Ø§Ù„ØªÙØ§ØµÙŠÙ„:">
+
+<!ENTITY ssl-observatory.prefs.hide "أخÙ٠الخيارات المتقدمة">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"تحقق من الشهادات حتى لو لم يكن تور متاح">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"سنحاول Ø§Ù„Ø­ÙØ§Ø¸ على سرية البيانات، ولكن هذا الخيار أقل أمناً">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"أرسل وتحقق من شهادات أسماء DNS غير العامة">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"ما لم يتم تحديد هذا الخيار، لن يسجل المرصد الشهادات للأسماء التي لا يستطيع حلها عبر نظام DNS.">
+
+<!ENTITY ssl-observatory.prefs.show "أظهر الخيارات المتقدمة">
+
+<!ENTITY ssl-observatory.prefs.title "ØªÙØ¶ÙŠÙ„ات مرصد SSL">
+
+<!ENTITY ssl-observatory.prefs.use "استخدم المرصد؟">
+<!ENTITY ssl-observatory.warning.title "تحذير من مرصد SSL الخاص بـEFF">
+<!ENTITY ssl-observatory.warning.showcert "أظهر سلسة الشهادة">
+<!ENTITY ssl-observatory.warning.okay "أنا Ø£Ùهم">
+<!ENTITY ssl-observatory.warning.text "أصدر مرصد SSL من الـEFF تحذيراً حول شهادة ( أو شهادات) HTTPS لهذا الموقع:">
+<!ENTITY ssl-observatory.warning.defense "إن كنت مسجل الدخول ÙÙŠ هذا الموقع، ننصحك بتغيير كلمة السر عندما تحصل علي اتصال آمن بالإنترنت.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"اعرض و تحقق من الشهادات الموقعة ذاتياً">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"هذا Ù…ÙØ¶Ù„ ; Ùمشاكل التشÙير شائعة بشكل خاص ÙÙŠ الأجهزة المدمجة الموقعة ذاتياً">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/bg/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/bg/https-everywhere.dtd
new file mode 100644
index 0000000..6bf445f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/bg/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "За HTTPS на вÑÑкаде">
+<!ENTITY https-everywhere.about.ext_name "HTTPS на вÑÑкаде">
+<!ENTITY https-everywhere.about.ext_description "Заключи интернетат! Ðвтоматично ползваи HTTPS защита на много Ñтраници.">
+<!ENTITY https-everywhere.about.version "ВерÑиÑ">
+<!ENTITY https-everywhere.about.created_by "Създаване от">
+<!ENTITY https-everywhere.about.librarians "Правилни Книжарници">
+<!ENTITY https-everywhere.about.thanks "Ð‘Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ Ð½Ð°">
+<!ENTITY https-everywhere.about.contribute "Ðко хареÑвате HTTPS на вÑÑкаде, можете да разгледате">
+<!ENTITY https-everywhere.about.donate_tor "ДарÑване към">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "ДарÑване към ЕФФ">
+
+<!ENTITY https-everywhere.menu.about "За HTTPS на вÑÑкаде">
+<!ENTITY https-everywhere.menu.observatory "SSL ОбÑÐµÑ€Ð¶Ð°Ñ‚Ð¾Ñ€Ð¸Ñ Ð½Ð°Ñтроики">
+<!ENTITY https-everywhere.menu.globalEnable "Включете HTTPS на вÑÑкаде">
+<!ENTITY https-everywhere.menu.globalDisable "Изключете HTTPS на вÑÑкаде">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS на вÑÑкаде наÑтроики">
+<!ENTITY https-everywhere.prefs.enable_all "Включи Ð’Ñички">
+<!ENTITY https-everywhere.prefs.disable_all "Изключи Ð’Ñички">
+<!ENTITY https-everywhere.prefs.reset_defaults "ВъзÑтанови Ñтандартните">
+<!ENTITY https-everywhere.prefs.search "ТърÑи">
+<!ENTITY https-everywhere.prefs.site "Страница">
+<!ENTITY https-everywhere.prefs.notes "Бележки">
+<!ENTITY https-everywhere.prefs.list_caption "Кой HTTPS преадреÑÐ¸Ñ€Ð°Ð½Ñ Ð´Ð° деиÑтват?">
+<!ENTITY https-everywhere.prefs.enabled "Включен">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Можеш да научеш да пишеш твоите правила(да добавÑте Ñтраници)">
+<!ENTITY https-everywhere.prefs.here_link "тук">
+<!ENTITY https-everywhere.prefs.toggle "Копче">
+<!ENTITY https-everywhere.prefs.reset_default "ВъзÑтанови Ñтандартните">
+<!ENTITY https-everywhere.prefs.view_xml_source "Виж XML Кода">
+
+<!ENTITY https-everywhere.source.downloading "ИзтеглÑне">
+<!ENTITY https-everywhere.source.filename "Име на файл">
+<!ENTITY https-everywhere.source.unable_to_download "Ðевъзможно да Ñвали кода.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/bg/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/bg/https-everywhere.properties
new file mode 100644
index 0000000..ec16615
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/bg/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Ключи HTTPS на вÑÑкаде
+https-everywhere.menu.globalDisable = Изключете
+https-everywhere.menu.enableDisable = Включи / Изключи Правила
+https-everywhere.menu.noRules = (ÐÑма Правила за Тази Страница)
+https-everywhere.menu.unknownRules = (Ðепознати Правила за Тази Страница)
+https-everywhere.toolbar.hint = HTTPS Everywhere is now active. You can toggle it on a site-by-site basis by clicking the icon in the address bar.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/bg/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/bg/ssl-observatory.dtd
new file mode 100644
index 0000000..a0f88fd
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/bg/ssl-observatory.dtd
@@ -0,0 +1,93 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Детайли и Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ‡Ñ Ð·Ð° Уединение">
+<!ENTITY ssl-observatory.popup.later "Попитай ме по-къÑно">
+<!ENTITY ssl-observatory.popup.no "Ðе">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere може да заÑече атаки
+против Ñ‚Ð²Ð¾Ñ Ð±Ñ€Ð°ÑƒÐ·ÑŠÑ€ като праща Ñертификатите, които получаваш към
+Observatory. Включи тази опциÑ?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"HTTPS Everywhere да използва ли SSL Observatory?">
+
+<!ENTITY ssl-observatory.popup.yes "Да">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"БезопаÑтно е да влючеш това, оÑвен ако ползваш много шпионÑка връÑка:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"БезопаÑно, уÑвен ако ползвате таиен интернет Ñ Ñ‚Ð°Ð¸Ð½Ð¸ имена на Ñървърите:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Вкарай и провери Ñертификати подпиÑани от не-Ñтандартни CAта">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"">
+
+<!ENTITY ssl-observatory.prefs.anonymous "ПроверÑвай Ñертификати като използваш Tor за анонимноÑÑ‚">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"ПроверÑвай Ñертификати като използваш Tor за анонимноÑÑ‚ (изиÑква Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Тази Ð¾Ð¿Ñ†Ð¸Ñ Ð¸Ð·Ð¸Ñква Tor и Torbutton да бъдат инÑталирани">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Когато видиш нов Ñертификат кажи на Observatory към кой ISP Ñи Ñвързан">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"">
+
+<!ENTITY ssl-observatory.prefs.done "Готово">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"">
+
+<!ENTITY ssl-observatory.prefs.hide "Скрий разширени наÑтройки">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"ПроверÑвай Ñертификати даье ако Tor ние Ñвободен">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Ð’Ñе още ше опитаме да пазим данните анонимни, но тази наÑтройка е по малко Ñигорна">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Вкараи и провери Ñертификати за чаÑтни DNS имена">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"">
+
+<!ENTITY ssl-observatory.prefs.show "Покажи разширени наÑтройки">
+
+<!ENTITY ssl-observatory.prefs.title "SSL ОбÑÐµÑ€Ð¶Ð°Ñ‚Ð¾Ñ€Ð¸Ñ NаÑтроики">
+
+<!ENTITY ssl-observatory.prefs.use "Използвай Observatory?">
+<!ENTITY ssl-observatory.warning.title "Ð’ÐИМÐÐИЕ от SSL обÑерваторÑта на ЕФФ">
+<!ENTITY ssl-observatory.warning.showcert "Покажи веригата на Ñертификата">
+<!ENTITY ssl-observatory.warning.okay "Разбирам">
+<!ENTITY ssl-observatory.warning.text "SSL ОбÑерваторÑта на ЕФФ е дала признак за HTTPS Ñертификат(и) на тази Ñтраница:">
+<!ENTITY ssl-observatory.warning.defense "Ðко Ñи влÑзал в тази Ñтраница, предложено е да Ñмениш паролата когато имаш безопаÑтна връÑка.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Вкарай и провери Ñамо-подпиÑани Ñертификати">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Това е предложено; проблеми Ñ ÐºÑ€Ð¸Ð¿Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ ÑÑŠ ÑпеÑифично нормални в Ñамо-подпиÑани дребни девизи ">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/cs/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/cs/https-everywhere.dtd
new file mode 100644
index 0000000..ce1f107
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/cs/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "O aplikaci HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "ZaÅ¡ifrujte Web! Automaticky používejte HTTPS zabezpeÄení na mnoha stránkách.">
+<!ENTITY https-everywhere.about.version "Verze">
+<!ENTITY https-everywhere.about.created_by "Vytvořil">
+<!ENTITY https-everywhere.about.librarians "Knihovníci Pravidel">
+<!ENTITY https-everywhere.about.thanks "Poděkování">
+<!ENTITY https-everywhere.about.contribute "Pokud se vám líbí HTTPS Everywhere, můžete">
+<!ENTITY https-everywhere.about.donate_tor "Přispět na Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "Přispět na EFF">
+
+<!ENTITY https-everywhere.menu.about "O aplikaci HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "Nastavení SSL Observatoře">
+<!ENTITY https-everywhere.menu.globalEnable "Zapnout HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Vypnout HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Nastavení HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "Zapnout vše">
+<!ENTITY https-everywhere.prefs.disable_all "Vypnout vše">
+<!ENTITY https-everywhere.prefs.reset_defaults "Vrátit výchozí nastavení">
+<!ENTITY https-everywhere.prefs.search "Hledat">
+<!ENTITY https-everywhere.prefs.site "Stránky">
+<!ENTITY https-everywhere.prefs.notes "Poznámky">
+<!ENTITY https-everywhere.prefs.list_caption "Která pravdila HTTPS pro přesměrování mají platit?">
+<!ENTITY https-everywhere.prefs.enabled "Zapnuto">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Návod, jak si vytvořit vlastní sadu pravidel (pro přidání podpory dalších webů) najdete">
+<!ENTITY https-everywhere.prefs.here_link "zde">
+<!ENTITY https-everywhere.prefs.toggle "Změnit">
+<!ENTITY https-everywhere.prefs.reset_default "Vrátit výchozí nastavení">
+<!ENTITY https-everywhere.prefs.view_xml_source "Zobrazit Zdroj v XML">
+
+<!ENTITY https-everywhere.source.downloading "Stahování">
+<!ENTITY https-everywhere.source.filename "Název souboru">
+<!ENTITY https-everywhere.source.unable_to_download "Zdroj nelze stáhnout.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/cs/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/cs/https-everywhere.properties
new file mode 100644
index 0000000..98fb982
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/cs/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Zapnout HTTPS Everywhere
+https-everywhere.menu.globalDisable = Vypnout HTTPS Everywhere
+https-everywhere.menu.enableDisable = Zapnout / Vypnout Pravidla
+https-everywhere.menu.noRules = (Pro tuto stránku neexistují žádná pravidla)
+https-everywhere.menu.unknownRules = (Pravidla pro tuto stránku nejsou známá)
+https-everywhere.toolbar.hint = HTTPS Everywhere is now active. You can toggle it on a site-by-site basis by clicking the icon in the address bar.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/cs/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/cs/ssl-observatory.dtd
new file mode 100644
index 0000000..724c842
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/cs/ssl-observatory.dtd
@@ -0,0 +1,94 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Podrobnosti a informace o soukromí">
+<!ENTITY ssl-observatory.popup.later "Rozhodnu se později">
+<!ENTITY ssl-observatory.popup.no "Ne">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere umí odhalit útotky
+proti vaÅ¡emu prohlížeÄi tak, že posílá certifikáty, které obdržíte, do
+Observatoře. Zapnout tuto funkci?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Má HTTPS Everywhere používat SSL Observatoř?">
+
+<!ENTITY ssl-observatory.popup.yes "Ano">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Povolit tuto funkci je bezpeÄné, pokud nejste na velmi
+dotěrné firemní síti:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"BezpeÄné, pokud nepoužíváte firemní síť s tajnými jmény intranetových serverů:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Odeslat a prověřit certikáty podepsané nestadartními koÅ™enovými CertifikaÄními Autoritami">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Je bezpeÄné (a doporuÄené) tuto možnost povolit, pokud nepoužíváte dotÄ›rnou firemní síť nebo antivirový sofware Kaspersky který monitoruje vaÅ¡e surfování s TLS proxy a sorkoumou koÅ™enovou CertifikaÄní Autoritou. Pokud ji na takové síti povolíte, může tato možnost publikovat důkazy o tom které https:// servery byly skrze tuto proxy navÅ¡tíveny, kvůli jedineÄným certifikátům které by takto vznikly. Proto nechváme tuto možnost ve výchozím nastavení vypnoutou.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Prověřovat certifikáty skrze Tor pro zajištění anonymity">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Prověřovat certifikáty skrze Tor pro zajištění anonymity (vyžaduje Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Pro použití této možnosti je třeba mít nainstalovaný Tor a Torbutton">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Když uvidíte nový certifikát, řekněte Observatoři přes kterého ISP jste připojení">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Toto naÄte a odeÅ¡le &quot;Äíslo Autonomního Systému&quot; vaší sítÄ›. Pomůže nám to lokalizovat útoky na HTTPS, a rozpoznat jestli máme hlášení ze sítí v zemích jako je Ãrán a Sýrie, kde jsou útoky relativnÄ› Äasté.">
+
+<!ENTITY ssl-observatory.prefs.done "Hotovo">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere umí použít SSL Observatoř od EFF. Ta udělá dvě věci: (1)
+oděšle kopie HTTPS cerifikátů do observotÅ™e, což nám pomůže detekovat útoky typu 'man in the middle' a zlepÅ¡it bezpeÄnost na Webu; a (2)
+umožní nám varovat vás pÅ™ed nezabezpeÄným pÅ™ipojením nebo útokem na váš prohlížeÄ.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Pokud například navštívíte https://www.something.com, certifikát, kerý příjde do Observatoře nás informuje o tom, že někdo navštívil
+www.something.com, ale neřekne kdo to byl, ani na jakou konkrétní stránku se
+díval. Pro zobrazení podrobností najeÄte na možnosti myší.">
+
+<!ENTITY ssl-observatory.prefs.hide "Skrýt pokroÄilé nastavení">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Prověřovat certifikáty i pokud Tor není dostupný">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"I tak se budeme snažit, aby data zůstala anonymní, ale tato možnost není tak bezpeÄná">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Odesílat a prověřovat certifikáty neveřejných DNS jmen">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Pokud není tato možnost zaškrtnutá, Observatoř nebude zaznamenávat certifikáty pro jména která nenajde v DNS systému.">
+
+<!ENTITY ssl-observatory.prefs.show "Zobrazit pokroÄilé nastavení">
+
+<!ENTITY ssl-observatory.prefs.title "Nastavení SSL Observatoře">
+
+<!ENTITY ssl-observatory.prefs.use "Používat Observatoř?">
+<!ENTITY ssl-observatory.warning.title "VAROVÃNà z SSL ObservatoÅ™e od EFF">
+<!ENTITY ssl-observatory.warning.showcert "Zobrazit řetězec certifikátů">
+<!ENTITY ssl-observatory.warning.okay "Rozumím">
+<!ENTITY ssl-observatory.warning.text "SSL Observatoř od EFF vydala varování před HTTPS cetifikátem / certifikáty na těchto stránkách:">
+<!ENTITY ssl-observatory.warning.defense "Pokud jste se na tÄ›chto stránkách pÅ™ihlásili, doporuÄujeme zmÄ›nit si heslo, až budete pÅ™ipojeni bezpeÄným pÅ™ipojením.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Odesílat a prověrovat certifikáty podepsané sami sebou">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Tuto možnost dopruÄujeme zapnout; kryprografické problémy jsou obzvášť Äasté u takto podepsaných vestavÄ›ných zařízení">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/da/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/da/https-everywhere.dtd
new file mode 100644
index 0000000..83ef71a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/da/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Om HTTPS Overalt">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Overalt">
+<!ENTITY https-everywhere.about.ext_description "Kryptér nettet! Brug HTTPS-sikkerhed automatisk på mange steder.">
+<!ENTITY https-everywhere.about.version "Version">
+<!ENTITY https-everywhere.about.created_by "Oprettet af">
+<!ENTITY https-everywhere.about.librarians "Regelsæt-bibliotekarer">
+<!ENTITY https-everywhere.about.thanks "Tak til">
+<!ENTITY https-everywhere.about.contribute "Hvis du kan lide HTTPS Overalt, så vil du måske overveje">
+<!ENTITY https-everywhere.about.donate_tor "Giv bidrag til Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "da">
+<!ENTITY https-everywhere.about.donate_eff "Giv bidrag til EFF">
+
+<!ENTITY https-everywhere.menu.about "Om HTTPS Overalt">
+<!ENTITY https-everywhere.menu.observatory "Indstillinger for SSL-observatorie">
+<!ENTITY https-everywhere.menu.globalEnable "Aktivér HTTPS Overalt">
+<!ENTITY https-everywhere.menu.globalDisable "Deaktivér HTTPS Overalt">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Indstillinger for HTTPS Overalt">
+<!ENTITY https-everywhere.prefs.enable_all "Aktivér alle">
+<!ENTITY https-everywhere.prefs.disable_all "Deaktivér alle">
+<!ENTITY https-everywhere.prefs.reset_defaults "Nulstil til standardindstillinger">
+<!ENTITY https-everywhere.prefs.search "Søg">
+<!ENTITY https-everywhere.prefs.site "Sted">
+<!ENTITY https-everywhere.prefs.notes "Noter">
+<!ENTITY https-everywhere.prefs.list_caption "Hvilke HTTPS-regler skal anvendes?">
+<!ENTITY https-everywhere.prefs.enabled "Aktiveret">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Du kan lære om at skrive dine egne regelsæt (for at føje understøttelse til andre websteder)">
+<!ENTITY https-everywhere.prefs.here_link "her">
+<!ENTITY https-everywhere.prefs.toggle "Slå til/fra">
+<!ENTITY https-everywhere.prefs.reset_default "Nulstil til standardindstilling">
+<!ENTITY https-everywhere.prefs.view_xml_source "Vis XML-kilde">
+
+<!ENTITY https-everywhere.source.downloading "Henter">
+<!ENTITY https-everywhere.source.filename "Filnavn">
+<!ENTITY https-everywhere.source.unable_to_download "Kan ikke hente kilde">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 meddelelse">
+<!ENTITY https-everywhere.popup.paragraph1 "Ups. Du anvendte den stabile version af HTTPS Everywhere, men vi har ved et uheld måske opdateret til udvikler-versionen ved den sidste opdatering.">
+<!ENTITY https-everywhere.popup.paragraph2 "Vil du skifte tilbage til den stabile version?">
+<!ENTITY https-everywhere.popup.paragraph3 "Vi ville sætte pris på at du fortsatte med at anvende vores udvikler-version, og derved hjalp os med at gøre HTTPS Everywhere bedre! Der er optræder måske fejl her og der, som du kan rapportere på https-everywhere@eff.org, på engelsk. Vi beklager besværet. Tak fordi du anvender HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Behold udvikler-versionen">
+<!ENTITY https-everywhere.popup.revert "Hent den seneste stabile version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/da/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/da/https-everywhere.properties
new file mode 100644
index 0000000..dcd8a36
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/da/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Aktivér HTTPS Overalt
+https-everywhere.menu.globalDisable = Deaktivér HTTPS Overalt
+https-everywhere.menu.enableDisable = Aktivér / Deaktivér regler
+https-everywhere.menu.noRules = (Der er ikke opsat regler for denne side)
+https-everywhere.menu.unknownRules = (Regler for denne side ukendt)
+https-everywhere.toolbar.hint = HTTPS Everywhere er nu aktiv. De kan tænde den ved et side-ved-side basis ved at klikke på ikonet i adresse baren.
+https-everywhere.migration.notification0 = For at rette en vigtig fejl, nulstiller denne opdatering dine HTTPS Everywhere indstillinger til deres oprindelige værdier.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/da/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/da/ssl-observatory.dtd
new file mode 100644
index 0000000..05722e8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/da/ssl-observatory.dtd
@@ -0,0 +1,100 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Detaljer og information om privatliv">
+<!ENTITY ssl-observatory.popup.later "Spørg mig senere">
+<!ENTITY ssl-observatory.popup.no "Nej">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Overalt kan registrere angreb
+mod din browser ved at sende certifikaterne du modtager til
+Observatoriet. Slå dette til?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Skal HTTPS Overalt anvende SSL-observatoriet?">
+
+<!ENTITY ssl-observatory.popup.yes "Ja">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Dette kan trygt aktiveres, medmindre du brug et virksomhedsnetværk
+som er udsat for meget indtrængen:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Sikker, medmindre du bruger et virksomhedsnetværk med skjulte intranet-servernavne:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Indsend og tjek certifikater signeret af ikke-standardiserede rod-certifikat-autoriteter">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Det er sikkert (og en god ide) at aktivere denne valgmulighed, medmindre du bruger virksomhedsnetværk med meget indtrængen eller antivirus-software fra Kaspersky, der overvåger din browserbrug med en TLS-proxy og en privat rod-certifikat-autoritet. Hvis den er aktiveret på sådan et netværk, så kan dette tilvalg risikere at udgive spor af hvilke https://-domæner som blev benyttet gennem proxy'en, som følge af de unikke certifikater den ville fremstille. Lad den derfor være slået fra som standard.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Tjek certifikater med brug af Tor for anonymitet">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Tjek certifikater med brug af Tor for anonymitet (kræver Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Dette tilvalg kræver at Tor og Torbutton er installerede.">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Når du ser et nyt certifikat, så fortæl Observatoriet hvilken internetudbyder du er tilsluttet til">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Dette vil hente og sende det &quot;autonome systemnummer&quot; for dit netværk. Dette vil hjælpe os med at lokalisere angreb mod HTTPS, og afgøre hvorvidt vi har observationer fra netværk fra steder som Iran og Syrien, hvor angreb set under sammenligning forekommer hyppigt.">
+
+<!ENTITY ssl-observatory.prefs.done "Færdig">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Overalt kan benytte EFFs SSL-observatorie. Dette indebærer to
+ting: (1) der sendes kopier af HTTPS-certifikater til observatoriet, der
+hjælper os med at registrere 'manden i midten'-angreb og forøge sikkerheden på nettet; og (2) giver os mulighed for at advare dig om usikre forbindelser eller angreb på din browser.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Som eksempel, når du besøger https://www.etellerandet.com, så vil
+certifikatet som Observatoriet har modtaget indikere at nogen besøgte
+www.etellerandet.com, men ikke hvem som besøgte stedet, eller hvilken
+specifik side de kiggede på. Hold musen over valgmuligheder for at flere
+detaljer:">
+
+<!ENTITY ssl-observatory.prefs.hide "Skjul avancerede valgmuligheder">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Tjek certifikater, selv når Tor ikke er tilgængelig">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Vi vil stadig forsøge at bevare data anonyme, men denne valgmulighed er mindre sikker">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Indsend og tjek certifikater for DNS-navne som ikke er offentlige">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Medmindre denne valgmulighed er valgt, så vil observatoriet ikke registrere certifikater for navne som den ikke kan opløse gennem DNS-systemet.">
+
+<!ENTITY ssl-observatory.prefs.show "Vis avanceret valgmuligheder">
+
+<!ENTITY ssl-observatory.prefs.title "Indstillinger for SSL-Observatoriet">
+
+<!ENTITY ssl-observatory.prefs.use "Brug Observatoriet?">
+<!ENTITY ssl-observatory.warning.title "ADVARSEL fra EFF's SSL-observatorie">
+<!ENTITY ssl-observatory.warning.showcert "Vis certifikat-kæden">
+<!ENTITY ssl-observatory.warning.okay "Jeg forstår">
+<!ENTITY ssl-observatory.warning.text "EFF's SSL-observatorie har udsted en advarsel om HTTPS-certifikaterne for dette sted:">
+<!ENTITY ssl-observatory.warning.defense "Hvis du er logget ind på dette sted, så kan det tilrådes at ændre din adgangskode når du har etableret en sikker forbindelse. ">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Indsend og tjek selvsignerede certifikater">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Dette er anbefalet, da kryptografiske problemer er oftere findes i selvsignerede indlejrede enheder">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/de/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/de/https-everywhere.dtd
new file mode 100644
index 0000000..75c8630
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/de/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Über HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Sichere deine Internet Anbindung! Automatische HTTPS-Sicherheit auf vielen Web-Seiten.">
+<!ENTITY https-everywhere.about.version "Version">
+<!ENTITY https-everywhere.about.created_by "Entwickelt durch">
+<!ENTITY https-everywhere.about.librarians "Regelliste">
+<!ENTITY https-everywhere.about.thanks "Dank an">
+<!ENTITY https-everywhere.about.contribute "Wenn du HTTPS-Everywhere magst, solltest du mal dieses ausprobieren">
+<!ENTITY https-everywhere.about.donate_tor "Spende an Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "de-DE">
+<!ENTITY https-everywhere.about.donate_eff "Spende an EFF">
+
+<!ENTITY https-everywhere.menu.about "Über HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL Observatory Einstellungen">
+<!ENTITY https-everywhere.menu.globalEnable "HTTPS Everywhere aktivieren">
+<!ENTITY https-everywhere.menu.globalDisable "HTTPS Everywhere deaktivieren">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere Einstellungen">
+<!ENTITY https-everywhere.prefs.enable_all "Alle aktivieren">
+<!ENTITY https-everywhere.prefs.disable_all "Alle deaktivieren">
+<!ENTITY https-everywhere.prefs.reset_defaults "Zurücksetzen">
+<!ENTITY https-everywhere.prefs.search "Suchen">
+<!ENTITY https-everywhere.prefs.site "Seite">
+<!ENTITY https-everywhere.prefs.notes "Notizen">
+<!ENTITY https-everywhere.prefs.list_caption "Welche HTTPS-Weiterleitung soll gewählt werden?">
+<!ENTITY https-everywhere.prefs.enabled "Gestartet">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Lerne, deine eigene Regelliste zu schreiben (Füge Regeln für andere Web-Seiten hinzu)">
+<!ENTITY https-everywhere.prefs.here_link "Hier">
+<!ENTITY https-everywhere.prefs.toggle "Toggle">
+<!ENTITY https-everywhere.prefs.reset_default "Reset to Default">
+<!ENTITY https-everywhere.prefs.view_xml_source "XML-Quelle ansehen">
+
+<!ENTITY https-everywhere.source.downloading "Downloade">
+<!ENTITY https-everywhere.source.filename "Dateiname">
+<!ENTITY https-everywhere.source.unable_to_download "Quelle konnte nicht heruntergeladen werden.">
+
+<!ENTITY https-everywhere.popup.title "Nachricht von HTTPS Everywhere 4.0development.11">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. Du hattest die stabile Version von HTTPS Everywhere benutzt, aber wir haben dich möglicherweise in unserem letztdem Update auf eine Entwickler-Version geupgraded.">
+<!ENTITY https-everywhere.popup.paragraph2 "Möchtest du zurück zur stabilen Version?">
+<!ENTITY https-everywhere.popup.paragraph3 "Wir würden uns freuen, wenn du weiterhin die Entwickler-Version benutzen würdest, um uns zu helfen HTTPS Everywhere zu verbessern! Es könnte sein, dass du hier und da einige Fehler findest, welche du an https-everywhere@eff.org melden kannst. Entschuldige die Unannehmlichkeit und danke, dass du HTTPS Everywhere benutzt.">
+<!ENTITY https-everywhere.popup.keep "Entwickler-Version beibehalten.">
+<!ENTITY https-everywhere.popup.revert "Die letzte stabile Version herunterladen">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/de/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/de/https-everywhere.properties
new file mode 100644
index 0000000..c1d3438
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/de/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = HTTPS Everywhere aktivieren
+https-everywhere.menu.globalDisable = HTTPS Everywhere deaktivieren
+https-everywhere.menu.enableDisable = Regeln Aktivieren / Deaktivieren
+https-everywhere.menu.noRules = (Keine Regeln für diese Seite)
+https-everywhere.menu.unknownRules = (Regeln für diese Seite unbekannt)
+https-everywhere.toolbar.hint = HTTPS Everywhere ist nun aktiv. Sie können es für bestimmte Seiten ein- oder ausschalten, indem Sie auf das Icon in der Adresszeile klicken.
+https-everywhere.migration.notification0 = Um einen wichtigen Fix zu implementieren, wird dieses Update deine HTTPS Everywhere Regel-Einstellungen zurücksetzen.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/de/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/de/ssl-observatory.dtd
new file mode 100644
index 0000000..74483cc
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/de/ssl-observatory.dtd
@@ -0,0 +1,91 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Details und Datenschutz Informationen">
+<!ENTITY ssl-observatory.popup.later "Später nachfragen">
+<!ENTITY ssl-observatory.popup.no "Nein">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere kann Angriffe gegen Ihren Browser erkennen, indem es Zertifikate, die Sie empfangen, zum SSL Observatory sendet. Einstellung aktivieren?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Soll HTTPS Everywhere SSL Observatory benutzen?">
+
+<!ENTITY ssl-observatory.popup.yes "Ja">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Es ist sicher, diese Option zu aktivieren, es sei denn, Sie benutzen ein sehr aufdringliches Firmennetzwerk:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Sicher, es sei denn, Sie benutzen ein Firmennetzwerk mit geheimen Intranet Servernamen:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Sende und überprüfe Zertifikate, die nicht von Stammzertifizierungsstellen ausgestellt wurden">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Es ist sicher (und eine gute Idee), diese Option zu aktivieren, es sei denn, Sie benutzen ein aufdringliches Firmennetzwerk, oder Kaspersky Antiviren-Software, die Sie beim Browsen mittels eines TLS Proxyservers und einer privaten Zertifizierungsstelle überwacht. Wenn diese Option in einem solchen Netzwerk verwendet wird, könnte Sie Hinweise (in Form der dadurch erstellten eindeutigen Zertifikate) auf die durch diesen Proxyserver besuchten https:// Domains hinterlassen.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Überprüfe Zertifikate mit Tor, um Anonymität zu bewahren">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Überprüfte Zertifikate mit Tor, um Anonymität zu bewahren (benötigt Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Diese Option macht die Installation von Tor und Torbutton erforderlich">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Dem SSL Observatory mitteilen, welchen ISP Sie verwenden, wenn Sie ein neues Zertifikat zu sehen bekommen">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Diese Option verwendet die 'Autonome System Zahl' Ihres Netzwerks. Das hilft uns, Angriffe gegen HTTPS zu orten und festzustellen, ob es sich um Angriffe von Netzwerken in Ländern wie Iran und Syrien handelt, in denen solche Angriffe vergleichsweise häufig sind.">
+
+<!ENTITY ssl-observatory.prefs.done "Fertig">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere kann EFF's SSL Observatory verwenden. Das ermöglicht uns 1. die Erkennung von 'man in the middle' Angriffen und damit eine Verbesserung der Internetsicherheit, indem Kopien der HTTPS Zertifikate an das SSL Observatory gesendet werden; und 2. können wir Sie bei unsicheren Verbindungen oder Angriffen gegen Ihren Browser warnen.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Beispiel: Wenn Sie https://www.irgendetwas.com besuchen, kann das SSL Observatory lediglich feststellen, dass irgendjemand www.irgendetwas.com besucht hat, aber nicht wer es war oder welche genaue Informationen aufgerufen wurde. Für mehr Informationen, fahren Sie mit der Maus über diese Option:">
+
+<!ENTITY ssl-observatory.prefs.hide "Verstecke erweiterte Optionen">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Zertifikate auch überprüfen, wenn Tor nicht verfügbar ist">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Wir bemühen uns, die Daten dennoch anonym zu halten, aber diese Option ist weniger sicher.">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Zertifikate für nicht-öffentliche DNS-Namen Senden und Überprüfen">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Wenn diese Option nicht aktiviert ist, wird das Observatory keine Zertifikate für Domain Namen aufnehmen, die es nicht über das DNS-System auflösen kann.">
+
+<!ENTITY ssl-observatory.prefs.show "Zeige erweiterte Optionen">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Observatory Einstellungen">
+
+<!ENTITY ssl-observatory.prefs.use "SSL Observatory verwenden?">
+<!ENTITY ssl-observatory.warning.title "WARNUNG von EFF's SSL Observatory">
+<!ENTITY ssl-observatory.warning.showcert "Zertifikatskette anzeigen">
+<!ENTITY ssl-observatory.warning.okay "Ich verstehe">
+<!ENTITY ssl-observatory.warning.text "EFF's SSL Observatory hat eine Warnung zu dem HTTPS Zertifikat dieser Seite veröffentlicht:">
+<!ENTITY ssl-observatory.warning.defense "Wenn Sie auf dieser Seite eingeloggt sind, kann es empfehlenswert sein, das Passwort zu ändern, sobald Sie eine sichere Verbindung haben.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Selbstsignierte Zertifikate Senden und Überprüfen">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Empfehlenswert; kryptographische Probleme sind in selbstsignierten eingebetteten Geräten besonders häufig.">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/el/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/el/https-everywhere.dtd
new file mode 100644
index 0000000..f8658cd
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/el/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Σχετικά με το HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "ΚÏυπτογÏαφήστε τον Παγκόσμιο Ιστό! ΧÏησιμοποιήστε ασφάλεια HTTPS σε πολλοÏÏ‚ δικτυακοÏÏ‚ τόπους.">
+<!ENTITY https-everywhere.about.version "Έκδοση">
+<!ENTITY https-everywhere.about.created_by "ΔημιουÏγήθηκε από">
+<!ENTITY https-everywhere.about.librarians "Βιβλιοθήκες για κανόνες">
+<!ENTITY https-everywhere.about.thanks "ΕυχαÏιστοÏμε τους">
+<!ENTITY https-everywhere.about.contribute "Αν σας αÏέσει το HTTPS Everywhere, δοκιμάστε">
+<!ENTITY https-everywhere.about.donate_tor "ΔωÏίστε στο Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "ΔωÏίστε στο EFF">
+
+<!ENTITY https-everywhere.menu.about "Σχετικά με το HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "ΠÏοτιμήσεις για το ΠαÏατηÏητήÏιο SSL">
+<!ENTITY https-everywhere.menu.globalEnable "ΕνεÏγοποίηση του HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "ΑπενεÏγοποίηση του HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "ΠÏοτιμήσεις του HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "ΕνεÏγοποίηση όλων">
+<!ENTITY https-everywhere.prefs.disable_all "ΑπενεÏγοποίηση όλων">
+<!ENTITY https-everywhere.prefs.reset_defaults "ΕπαναφοÏά Ï€Ïοεπιλεγμένων κανόνων">
+<!ENTITY https-everywhere.prefs.search "Αναζήτηση">
+<!ENTITY https-everywhere.prefs.site "Δικτυακός τόπος">
+<!ENTITY https-everywhere.prefs.notes "Σημειώσεις">
+<!ENTITY https-everywhere.prefs.list_caption "Ποιοι κανόνες ανακατεÏθυνσης σε HTTPS να εφαÏμοστοÏν;">
+<!ENTITY https-everywhere.prefs.enabled "ΕνεÏγοποιημένο">
+<!ENTITY https-everywhere.prefs.ruleset_howto "ΜποÏείτε να μάθετε πώς να γÏάφετε τους δικοÏÏ‚ σας κανόνες (ώστε να υποστηÏίξετε και άλλους δικτυακοÏÏ‚ τόπους)">
+<!ENTITY https-everywhere.prefs.here_link "εδώ">
+<!ENTITY https-everywhere.prefs.toggle "Εναλλαγή">
+<!ENTITY https-everywhere.prefs.reset_default "ΕπαναφοÏά Ï€Ïοεπιλογών">
+<!ENTITY https-everywhere.prefs.view_xml_source "ΠÏοβολή του Πηγαίου Κώδικα XML">
+
+<!ENTITY https-everywhere.source.downloading "Γίνεται λήψη">
+<!ENTITY https-everywhere.source.filename "Όνομα αÏχείου">
+<!ENTITY https-everywhere.source.unable_to_download "Αδυναμί λήψης πηγαίου κώδικα.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/el/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/el/https-everywhere.properties
new file mode 100644
index 0000000..1906756
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/el/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = ΕνεÏγοποίηση του HTTPS Everywhere
+https-everywhere.menu.globalDisable = ΑπενεÏγοποίηση του HTTPS Everywhere
+https-everywhere.menu.enableDisable = ΕνεÏγοποίηση / ΑπενεÏγοποίηση των κανόνων
+https-everywhere.menu.noRules = (Δεν υπάÏχουν κανόνες για αυτή την σελίδα)
+https-everywhere.menu.unknownRules = (Κανόνες για αυτή τη σελίδα: Άγνωστοι)
+https-everywhere.toolbar.hint = Το HTTPS Everywhere ειναι τωÏα ενεÏγοποιημενο. ΜποÏείτε να το αλλάξετε με βάση την τοποθεσία ανά τοποθεσία, κάνοντας κλικ στο εικονίδιο στη γÏαμμή διευθÏνσεων.
+https-everywhere.migration.notification0 = Αυτή η ενημέÏωση επαναφέÏει τις Ïυθμίσεις κανόνων του HTTPS Everywhere στις Ï€Ïοεπιλεγμένες τιμές, με σκοπό να εφαÏμοστεί μια κÏίσιμη διόÏθωση.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/el/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/el/ssl-observatory.dtd
new file mode 100644
index 0000000..28641ed
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/el/ssl-observatory.dtd
@@ -0,0 +1,99 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "ΛεπτομέÏειες και ΠληÏοφοÏίες Ιδιωτικότητας">
+<!ENTITY ssl-observatory.popup.later "Θέλω να ΕνημεÏωθώ ΑÏγότεÏα">
+<!ENTITY ssl-observatory.popup.no "Όχι">
+
+<!ENTITY ssl-observatory.popup.text "Το HTTPS Everywhere μποÏεί να εντοπίσει επιθέσεις
+εναντίον του φυλλομετÏητή σου στέλνοντας τα πιστοποιητικά που λαμβάνεις
+στο ΠαÏατηÏητήÏιο. Επιθυμείς ενεÏγοποίηση;">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Επιθυμείς το HTTPS Everywhere να χÏησιμοποιεί το ΠαÏατηÏητήÏιο SSL;">
+
+<!ENTITY ssl-observatory.popup.yes "Îαι">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Η ενεÏγοποίηση της επιλογής είναι ασφαλής, εκτός αν χÏησιμοποιείς εταιÏικό δίκτυο
+υψηλής παÏεμβατικότητας:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Η ενεÏγοποίηση της επιλογής είναι ασφαλής, εκτός αν χÏησιμοποιείς εταιÏικό δίκτυο με μυστικά ονόματα διακομιστών:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Υποβολή και έλεγχος πιστοποιητικών υπογεγÏαμμένων από μη-εγκεκÏιμένες ΑÏχές Πιστοποίησης πιστοποιητικών">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Είναι ασφαλές (και καλή ιδέα) να ενεÏγοποιηθεί η συγκεκÏιμένη επιλογή, εκτός αν χÏησιμοποιείς εταιÏικό δίκτυο υψηλής παÏεμβατικότητας ή το λογισμικό Ï€Ïοστασίας από ιοÏÏ‚ 'Kaspersky' το οποίο παÏακολουθεί την πεÏιήγηση μέσω ενός TLS διακομιστή μεσολάβησης και μιας ιδιωτικής ΑÏχής Πιστοποίησης πιστοποιητικών. Αν ενεÏγοποιηθεί σε ένα τέτοιο δίκτυο, μποÏεί να δημοσιοποιήσει στοιχεία για το ποια https:// ονόματα ιστοτόπων επισκέφθηκες μέσω Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… διακομιστή μεσολάβησης, εξαιτίας της μοναδικότητας των πιστοποιητικών που θα παÏάγει. Γι' αυτό το έχουμε αφήσει εξ' αÏχής απενεÏγοποιημένο.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Έλεγχος πιστοποιητικών χÏησιμοποιώντας το Tor για εξασφάλιση ανωνυμίας">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Έλεγχος πιστοποιητικών χÏησιμοποιώντας το Tor για εξασφάλιση ανωνυμίας (απαιτείται η εγκατάσταση του Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Η συγκεκÏιμένη επιλογή απαιτεί την εγκατάσταση του Tor και του Torbutton">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Όταν βλέπεις ένα νέο πιστοποιητικό, πες στο ΠαÏατηÏητήÏιο με ποιον ΠάÏοχο ΥπηÏεσιών ΔιαδικτÏου έχεις συνδεθεί.">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Η συγκεκÏιμένη επιλογή θα ανακτήσει και θα αποστείλει τον &quot;Αυτόνομο ΑÏιθμό Συστήματος&quot; (Autonomous System number) του δικτÏου σου. Αυτό θα μας βοηθήσει να εντοπίσουμε επιθέσεις εναντίον του HTTPS και να καθοÏίσουμε αν έχουν παÏατηÏηθεί επιθέσεις από μέÏη όπως η ΣυÏία και το ΙÏάν όπου αυτές οι επιθέσεις είναι συγκÏιτικά πιο συνηθισμένες.">
+
+<!ENTITY ssl-observatory.prefs.done "Έγινε">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"Το HTTPS Everywhere μποÏεί να χÏησιμοποιήσει το ΠαÏατηÏητήÏιο SSL του EFF, το οποίο Ï€Ïαγματοποιεί τα εξής: (1)
+στέλνει αντίγÏαφα των πιστοποιητικών HTTPS στο ΠαÏατηÏητήÏιο, για να μας βοηθήσει να ανιχνεÏσουμε επιθέσεις 'ενδιάμεσου παÏατηÏητή' και να βελτιώσει την ασφάλεια του Παγκόσμιου Î™ÏƒÏ„Î¿Ï (2)
+μας επιτÏέπει να σε Ï€ÏοειδοποιοÏμε σχετικά με μη-ασφαλείς συνδέσεις ή επιθέσεις στο φυλλομετÏητή σου.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Για παÏάδειγμα, όταν επισκέπτεσαι το https://www.example.com, το πιστοποιητικό
+που λαμβάνει το ΠαÏατηÏητήÏιο θα δείξει ότι κάποιος κάποιος επισκέφθηκε
+τον ιστότοπο www.something.com, αλλά όχι ποιος επισκέφθηκε τον ιστότοπο ή ποια συγκεκÏιμένη σελίδα
+είδε. ΣÏÏε το ποντίκι πάνω από τις επιλογές για πεÏισσότεÏες πληÏοφοÏίες:">
+
+<!ENTITY ssl-observatory.prefs.hide "ΑπόκÏυψη επιλογών για Ï€ÏοχωÏημένους">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Έλεγχος πιστοποιητικών ακόμα κι αν το Tor δεν είναι διαθέσιμο ">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Συνεχίζουμε την Ï€Ïοσπάθεια να κÏατήσουμε ανώνυμα τα δεδομένα, αλλά αυτή η επιλογή είναι λιγότεÏο ασφαλής">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Υποβολή και έλεγχος πιστοποιητικών για μη δημόσια DNS ονόματα">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Εκτός αν η συγκεκÏιμένη επιλογή ενεÏγοποιηθεί, το ΠαÏατηÏητήÏιο δε θα καταγÏάφει Πιστοποιητικά για ονόματα που δε θα μποÏεί να εξακÏιβώσει μέσω του συστήματος DNS">
+
+<!ENTITY ssl-observatory.prefs.show "ΠÏοβολή επιλογών για Ï€ÏοχωÏημένους">
+
+<!ENTITY ssl-observatory.prefs.title "ΠÏοτιμήσεις ΠαÏατηÏητηÏίου SSL">
+
+<!ENTITY ssl-observatory.prefs.use "Îα χÏησιμοποιηθεί το ΠαÏατηÏητήÏιο;">
+<!ENTITY ssl-observatory.warning.title "ΠΡΟΕΙΔΟΠΟΙΗΣΗ από το ΠαÏατηÏητήÏιο SSL του EFF">
+<!ENTITY ssl-observatory.warning.showcert "ΠÏοβολή της αλυσίδας πιστοποιητικών">
+<!ENTITY ssl-observatory.warning.okay "Καταλαβαίνω">
+<!ENTITY ssl-observatory.warning.text "Το ΠαÏατηÏητήÏιο SSL του EFF έχει εκδώσει μια Ï€Ïοειδοποίηση σχετικά με το πιστοποιητικό HTTPS του συγκεκÏιμένου ιστότοπου:">
+<!ENTITY ssl-observatory.warning.defense "Αν είσαι συνδεδεμένος στο συγκεκÏιμένο ιστότοπο, Ï€Ïοτείνεται να αλλάξεις τον κωδικό ασφαλείας σου όταν αποκτήσεις ασφαλή σÏνδεση.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Υποβολή και αυτο-υπογεγÏαμμένα πιστοποιητικά">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Συνιστώμενη ενέÏγεια· τα κÏυπτογÏαφικά Ï€Ïοβλήματα είναι ιδιαιτέÏως κοινά στις αυτο-υπογεγÏαμμένες ενσωματωμένες συσκευές">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/en/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/en/https-everywhere.dtd
new file mode 100644
index 0000000..9a63c45
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/en/https-everywhere.dtd
@@ -0,0 +1,47 @@
+<!ENTITY https-everywhere.about.title "About HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Encrypt the Web! Automatically use HTTPS security on many sites.">
+<!ENTITY https-everywhere.about.version "Version">
+<!ENTITY https-everywhere.about.created_by "Created by">
+<!ENTITY https-everywhere.about.librarians "Ruleset Librarians">
+<!ENTITY https-everywhere.about.thanks "Thanks to">
+<!ENTITY https-everywhere.about.contribute "If you like HTTPS Everywhere, you might consider">
+<!ENTITY https-everywhere.about.donate_tor "Donating to Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "Donating to EFF">
+
+<!ENTITY https-everywhere.menu.about "About HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL Observatory Preferences">
+<!ENTITY https-everywhere.menu.globalEnable "Enable HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Disable HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere Preferences">
+<!ENTITY https-everywhere.prefs.enable_all "Enable All">
+<!ENTITY https-everywhere.prefs.disable_all "Disable All">
+<!ENTITY https-everywhere.prefs.reset_defaults "Reset to Defaults">
+<!ENTITY https-everywhere.prefs.search "Search">
+<!ENTITY https-everywhere.prefs.site "Site">
+<!ENTITY https-everywhere.prefs.notes "Notes">
+<!ENTITY https-everywhere.prefs.list_caption "Which HTTPS redirection rules should apply?">
+<!ENTITY https-everywhere.prefs.enabled "Enabled">
+<!ENTITY https-everywhere.prefs.ruleset_howto "You can learn how to write your own rulesets (to add support for other web sites)">
+<!ENTITY https-everywhere.prefs.here_link "here">
+<!ENTITY https-everywhere.prefs.toggle "Toggle">
+<!ENTITY https-everywhere.prefs.reset_default "Reset to Default">
+<!ENTITY https-everywhere.prefs.view_xml_source "View XML Source">
+
+<!ENTITY https-everywhere.source.downloading "Downloading">
+<!ENTITY https-everywhere.source.filename "Filename">
+<!ENTITY https-everywhere.source.unable_to_download "Unable to download source.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/en/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/en/https-everywhere.properties
new file mode 100644
index 0000000..be83831
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/en/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Enable HTTPS Everywhere
+https-everywhere.menu.globalDisable = Disable HTTPS Everywhere
+https-everywhere.menu.enableDisable = Enable / Disable Rules
+https-everywhere.menu.noRules = (No Rules for This Page)
+https-everywhere.menu.unknownRules = (Rules for This Page Unknown)
+https-everywhere.toolbar.hint = HTTPS Everywhere is now active. You can toggle it on a site-by-site basis by clicking the icon in the address bar.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/en/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/en/ssl-observatory.dtd
new file mode 100644
index 0000000..8564082
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/en/ssl-observatory.dtd
@@ -0,0 +1,95 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Details and Privacy Information">
+<!ENTITY ssl-observatory.popup.later "Ask Me Later">
+<!ENTITY ssl-observatory.popup.no "No">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere can detect attacks
+against your browser by sending the certificates you receive to the
+Observatory. Turn this on?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Should HTTPS Everywhere use the SSL Observatory?">
+
+<!ENTITY ssl-observatory.popup.yes "Yes">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"It is safe to enable this, unless you use a very
+intrusive corporate network:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Safe, unless you use a corporate network with secret intranet server names:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Submit and check certificates signed by non-standard root CAs">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"It is safe (and a good idea) to enable this option, unless you use an intrusive corporate network or Kaspersky antivirus software that monitors your browsing with a TLS proxy and a private root Certificate Authority. If enabled on such a network, this option might publish evidence of which https:// domains were being visited through that proxy, because of the unique certificates it would produce. So we leave it off by default.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Check certificates using Tor for anonymity">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Check certificates using Tor for anonymity (requires Tor)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"This option requires Tor to be installed and running">
+
+<!ENTITY ssl-observatory.prefs.asn
+'When you see a new certificate, tell the Observatory which ISP you are connected to'>
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+'This will fetch and send the "Autonomous System number" of your network. This will help us locate attacks against HTTPS, and to determine whether we have observations from networks in places like Iran and Syria where attacks are comparatively common.'>
+
+<!ENTITY ssl-observatory.prefs.done "Done">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere can use EFF's SSL Observatory. This does two things: (1)
+sends copies of HTTPS certificates to the Observatory, to help us
+detect 'man in the middle' attacks and improve the Web's security; and (2)
+lets us warn you about insecure connections or attacks on your browser.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"For example, when you visit https://www.something.com, the certificate
+received by the Observatory will indicate that somebody visited
+www.something.com, but not who visited the site, or what specific page they
+looked at. Mouseover the options for further details:">
+
+<!ENTITY ssl-observatory.prefs.hide "Hide advanced options">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Check certificates even if Tor is not available">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"We will still try to keep the data anonymous, but this option is less secure">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Submit and check certificates for non-public DNS names">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Unless this option is checked, the Observatory will not record certificates for names that it cannot resolve through the DNS system.">
+
+<!ENTITY ssl-observatory.prefs.show "Show advanced options">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Observatory Preferences">
+
+<!ENTITY ssl-observatory.prefs.use "Use the Observatory?">
+<!ENTITY ssl-observatory.warning.title "WARNING from EFF's SSL Observatory">
+<!ENTITY ssl-observatory.warning.showcert "Show the certificate chain">
+<!ENTITY ssl-observatory.warning.okay "I understand">
+<!ENTITY ssl-observatory.warning.text "EFF's SSL Observatory has issued a warning about the HTTPS certificiate(s) for this site:">
+<!ENTITY ssl-observatory.warning.defense "If you are logged in to this site, it may be advisable to change your password once you have a safe connection.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Submit and check self-signed certificates">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"This is recommended; cryptographic problems are especially common in self-signed embedded devices">
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/es/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/es/https-everywhere.dtd
new file mode 100644
index 0000000..70456d2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/es/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Acerca de HTTPS Everywhere (HTTPS en cualquier sitio)">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "¡Cifre la Web! Utilice automáticamente la seguridad HTTPS en muchos sitios.">
+<!ENTITY https-everywhere.about.version "Versión">
+<!ENTITY https-everywhere.about.created_by "Creado por">
+<!ENTITY https-everywhere.about.librarians "Bibliotecarios de las reglas">
+<!ENTITY https-everywhere.about.thanks "Agradecimientos para">
+<!ENTITY https-everywhere.about.contribute "Si le agrada HTTPS Everywhere (HTTPS en cualquier sitio), podría considerar">
+<!ENTITY https-everywhere.about.donate_tor "donar a Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "es">
+<!ENTITY https-everywhere.about.donate_eff "donar a la Fundación Fronteras Electrónicas (EFF)">
+
+<!ENTITY https-everywhere.menu.about "Acerca de HTTPS Everywhere (HTTPS en cualquier sitio)">
+<!ENTITY https-everywhere.menu.observatory "Opciones del Observatorio SSL">
+<!ENTITY https-everywhere.menu.globalEnable "Activar HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Desactivar HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Preferencias de HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "Habilitar todo">
+<!ENTITY https-everywhere.prefs.disable_all "Deshabilitar todo">
+<!ENTITY https-everywhere.prefs.reset_defaults "Restablecer configuraciones predeterminadas">
+<!ENTITY https-everywhere.prefs.search "Buscar">
+<!ENTITY https-everywhere.prefs.site "Sitio">
+<!ENTITY https-everywhere.prefs.notes "Notas">
+<!ENTITY https-everywhere.prefs.list_caption "¿Qué reglas de redirección HTTPS deberían aplicarse?">
+<!ENTITY https-everywhere.prefs.enabled "Habilitado">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Puede aprender a escribir sus propias reglas (para añadir soporte para otros sitios web)">
+<!ENTITY https-everywhere.prefs.here_link "aquí">
+<!ENTITY https-everywhere.prefs.toggle "Cambiar">
+<!ENTITY https-everywhere.prefs.reset_default "Restablecer configuración predeterminada">
+<!ENTITY https-everywhere.prefs.view_xml_source "Ver código XML">
+
+<!ENTITY https-everywhere.source.downloading "Descargando">
+<!ENTITY https-everywhere.source.filename "Nombre de fichero">
+<!ENTITY https-everywhere.source.unable_to_download "No fue posible descargar el código.">
+
+<!ENTITY https-everywhere.popup.title "Notificación de HTTPS Everywhere 4.0development.11">
+<!ENTITY https-everywhere.popup.paragraph1 "Uups. Está usted usando la versión estable de HTTPS Everywhere, pero podríamos haberle elevado accidentalmente a la versión de desarrollo al publicar la última versión.">
+<!ENTITY https-everywhere.popup.paragraph2 "¿Le gustaría volver a la versión estable?">
+<!ENTITY https-everywhere.popup.paragraph3 "Nos encantaría que continuase usando nuestra versión de desarrollo ¡y nos ayudara a hacer HTTPS Everywhere mejor! Podría encontrar que hay unos pocos fallos más aquí y allá, de los que puede informar a 'https-everywhere@eff.org'. Disculpe la inconveniencia, y gracias por usar HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Manténganme en la versión de desarrollo.">
+<!ENTITY https-everywhere.popup.revert "Descargar la última versión estable.">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/es/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/es/https-everywhere.properties
new file mode 100644
index 0000000..8952158
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/es/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Activar HTTPS Everywhere
+https-everywhere.menu.globalDisable = Desactivar HTTPS Everywhere
+https-everywhere.menu.enableDisable = Habilitar/Deshabilitar reglas
+https-everywhere.menu.noRules = (No hay reglas para esta página)
+https-everywhere.menu.unknownRules = (No se conocen reglas para esta página)
+https-everywhere.toolbar.hint = HTTPS Everywhere no está activo. Puede activarlo sitio por sitio haciendo clic en el icono de la barra de direcciones.
+https-everywhere.migration.notification0 = Para implementar esta reparación crucial, esta actualización restablece sus preferencias de reglas de HTTPS Everywhere a los valores predeterminados.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/es/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/es/ssl-observatory.dtd
new file mode 100644
index 0000000..b5ded80
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/es/ssl-observatory.dtd
@@ -0,0 +1,100 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Detalles e información de privacidad">
+<!ENTITY ssl-observatory.popup.later "Preguntarme luego">
+<!ENTITY ssl-observatory.popup.no "No">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere puede detectar ataques
+contra su navegador enviando los certificados que reciba
+al Observatorio. ¿Quiere activarlo?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"¿Debe HTTPS Everywhere utilizar el Observatorio SSL?">
+
+<!ENTITY ssl-observatory.popup.yes "Sí">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Habilitar esto es seguro, a menos que use
+una red corporativa muy intrusiva:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Seguro, a menos que use una red corporativa con nombres de servidores de intranet secretos:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Envía y verifica los certificados firmados por autoridades de certificación raíz (ACs/CAs) no standard">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Es seguro (y una buena idea) habilitar esta opción, a menos que utilice una red corporativa intrusiva o el software antivirus Kaspersky que monitoriza su navegación con un proxy TLS y una Autoridad de Certificación raíz privada. Si se habilita en una red así, esta opción podría evidenciar qué dominios https:// fueron visitados por medio de ese proxy, debido a los certificados únicos que produciría. Por ello viene desactivado por defecto.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Verificar certificados utilizando Tor para obtener anonimato">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Verificar certificados utilizando Tor para obtener anonimato (requiere Tor)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Esta opción precisa tener Tor instalado y ejecutandose">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Al ver un nuevo certificado, comunicar al Observatorio a qué ISP se está conectado">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Esto obtendrá y enviará el &quot;número de Sistema Autónomo&quot; (AS) de su red. Esto nos ayudará a ubicar ataques contra HTTPS, y a determinar si tenemos observaciones desde redes en lugares como Irán o Siria donde los ataques son comparativamente más comunes.">
+
+<!ENTITY ssl-observatory.prefs.done "Listo">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere puede utilizar el Observatorio SSL de EFF. Esto hace dos cosas:
+(1) envía copias de los certificados HTTPS al Observatorio, para ayudarnos
+a detectar ataques de 'hombre en el medio' (MitM) y mejorar la seguridad de la Web; y
+(2) nos permite advertirle de conexiones inseguras o ataques sobre su navegador.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Por ejemplo, cuando visite https://www.algo.com, el certificado
+recibido por el Observatorio indicará que alguien visitó
+www.algo.com, pero no quién visitó el sitio, o qué página específica
+consultó. Pase el ratón sobre las opciones para mayores detalles:">
+
+<!ENTITY ssl-observatory.prefs.hide "Ocultar opciones avanzadas">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Verificar certificados incluso si Tor no está disponible">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Aún trataremos de mantener anónimos los datos, pero esta opción es menos segura">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Enviar y verificar certificados para nombres no públicados en DNS">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"A menos que esta opción esté marcada, el Observatorio no registra certificados para nombres que no pueda resolver a través de DNS.">
+
+<!ENTITY ssl-observatory.prefs.show "Mostrar opciones avanzadas">
+
+<!ENTITY ssl-observatory.prefs.title "Opciones del Observatorio SSL">
+
+<!ENTITY ssl-observatory.prefs.use "¿Utilizar el Observatorio?">
+<!ENTITY ssl-observatory.warning.title "ADVERTENCIA del Observatorio SSL de la EFF">
+<!ENTITY ssl-observatory.warning.showcert "Mostrar la cadena del certificado">
+<!ENTITY ssl-observatory.warning.okay "Entendido">
+<!ENTITY ssl-observatory.warning.text "El Observatorio SSL de la EFF ha emitido una advertencia sobre el(los) certificado(s) para este sitio:">
+<!ENTITY ssl-observatory.warning.defense "Si está autentificado en este sitio, sería aconsejable cambiar su contraseña una vez que se vuelva a autentificar de forma segura.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Enviar y verificar certificados auto-firmados">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Esto es recomendable; los problemas de cifrado son especialmente comunes en dispositivos embebidos auto-firmados">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/eu/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/eu/https-everywhere.dtd
new file mode 100644
index 0000000..bb7989c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/eu/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "HTTPS Everywhere buruz">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Weba enkriptatu! Automatikoki erabili HTTPS segurtasuna leku askotan.">
+<!ENTITY https-everywhere.about.version "Bertsioa">
+<!ENTITY https-everywhere.about.created_by "Sortzaileak">
+<!ENTITY https-everywhere.about.librarians "Arau-sorta Liburuzainak">
+<!ENTITY https-everywhere.about.thanks "Eskerrak">
+<!ENTITY https-everywhere.about.contribute "HTTPS Everywhere gustoko baduzu, kontutan har zenezake">
+<!ENTITY https-everywhere.about.donate_tor "Torera dohaintza eman">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "EFFra dohaintza eman">
+
+<!ENTITY https-everywhere.menu.about "HTTPS Everywhere buruz">
+<!ENTITY https-everywhere.menu.observatory "SSL Behatokiaren Hobespenak">
+<!ENTITY https-everywhere.menu.globalEnable "HTTPS Everywhere gaitu">
+<!ENTITY https-everywhere.menu.globalDisable "HTTPS Everywhere ezgaitu">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere Hobespenak">
+<!ENTITY https-everywhere.prefs.enable_all "Gaitu dena">
+<!ENTITY https-everywhere.prefs.disable_all "Ezgaitu dena">
+<!ENTITY https-everywhere.prefs.reset_defaults "Lehenetsiak berrezarri">
+<!ENTITY https-everywhere.prefs.search "Bilatu">
+<!ENTITY https-everywhere.prefs.site "Lekua">
+<!ENTITY https-everywhere.prefs.notes "Oharrak">
+<!ENTITY https-everywhere.prefs.list_caption "Zein HTTPS berbiderapen arau aplikatu beharko nituzke?">
+<!ENTITY https-everywhere.prefs.enabled "Gaituta">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Zure arau-sortak nola idatzi ikas dezakezu (beste webguneentzako laguntza gehitzeko)">
+<!ENTITY https-everywhere.prefs.here_link "hemen">
+<!ENTITY https-everywhere.prefs.toggle "Aldatu">
+<!ENTITY https-everywhere.prefs.reset_default "Lehenetsia berrezarri">
+<!ENTITY https-everywhere.prefs.view_xml_source "XML Iturria ikusi">
+
+<!ENTITY https-everywhere.source.downloading "Deskargatzen">
+<!ENTITY https-everywhere.source.filename "Fitxategi izena">
+<!ENTITY https-everywhere.source.unable_to_download "Ezin izan da iturria deskargatu">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/eu/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/eu/https-everywhere.properties
new file mode 100644
index 0000000..20460eb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/eu/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = HTTPS Everywhere gaitu
+https-everywhere.menu.globalDisable = HTTPS Everywhere ezgaitu
+https-everywhere.menu.enableDisable = Gaitu / Ezgaitu arauak
+https-everywhere.menu.noRules = (Araurik ez gune honetarako)
+https-everywhere.menu.unknownRules = (Gune honetarako arauak ezezagunak)
+https-everywhere.toolbar.hint = HTTPS Everywhere aktibo dago orain. Gunez-gune bere egoera txandakatu dezakezu nabigazio tresna-barrako ikonoan sakatuz.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/eu/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/eu/ssl-observatory.dtd
new file mode 100644
index 0000000..2936b43
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/eu/ssl-observatory.dtd
@@ -0,0 +1,95 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Xehetasunak eta Pribatutasun Informazioa">
+<!ENTITY ssl-observatory.popup.later "Beranduago galdeidazu">
+<!ENTITY ssl-observatory.popup.no "Ez">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywherek zure nabigatzailearen aurkako erasoak antzeman ditzake jaso dituzun ziurtagiriak Behatokira bidaliz. Gaitu hau?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"HTTPS Everywherek SSL Behatokia erabili beharko luke?">
+
+<!ENTITY ssl-observatory.popup.yes "Bai">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Hau gaitzea segurua da, sare korporatibo oso intrusibo bat erabiltzen ez duzun bitartean:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Segurua, sare korporatibo bat intranet zerbitzari izen sekretuekin erabiltzen ez duzun bitartean:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"CA erro ez-estandarrek sinatutako ziurtagiriak egiaztatu eta aurkeztu">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Aukera hau gaitzea segurua (eta ideia ona) da, sare korporatibo intrusibo bat edo TLS proxy batekin eta Ziurtagiri Aginpide erro pribatu batekin zure nabigazioa jarraitzen duen Kaspersky antibirus softwarea erabiltzen ez duzun bitartean. Horrelako sare batean gaitzen baduzu, aukera honek proxy horren bitartez zein https:// domeinu bisitatu diren argitara dezake, sortuko dituen ziurtagiri bakarrengatik. Beraz itzalita uztea lehentsi dugu.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Egiaztatu ziurtagiriak Tor anonimotasunerako erabiliz">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Egiaztatu ziurtagiriak Tor anonimotasunerako erabiliz (Torbutton behar du)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Aukera honek Tor eta Torbutton instalatuta izatea behar du">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Ziurtagiri berri bat ikusten duzunean, Behatokiari zein ISPra konektatuta zauden esan">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Honek zure sarearen &quot;Sistema Autonomo zenbakia&quot; lortu eta bidaliko du. Hau HTTPSren aurkako erasoak aurkitzen lagunduko gaitu, eta erasoak konparatiboki arruntak diren Iran eta Siria bezalako lekuetan behaketak ditugun zehaztu.">
+
+<!ENTITY ssl-observatory.prefs.done "Eginda">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywherek EFFren SSL Behatokia erabili dezake. Honek bi gauza egiten ditu: (1)
+HTTPS ziurtagirien kopiak Behatokira bidaltzen ditu, 'man in the middle' erasoak detektatzen eta Webguneen segurtasuna hobetzen lagun gaitzan; eta (2)
+seguruak ez diren konexioetaz edo zure nabigatzailearen aurkako erasoetaz abisa zaitzagun baimentzen digu.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Esate baterako, https://www.zerbait.com bisitatzen duzunean, Behatokiak jasotzen duen ziurtagiriak
+ norbait www.zerbait.com bisitatu duela adieraziko du, baina ez nork bisitatu duen, edo zehazki zein orri ikusi duen.
+Xehetasun gehiagorako pasa ezazu sagua aukeren gainetik:">
+
+<!ENTITY ssl-observatory.prefs.hide "Aukera aurreratuak ezkutatu">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Ziurtagiriak egiaztatu Tor eskuragarri ez badago ere">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Oraindik datuak anonimoki mantentzen saiatuko gara, baina aukera hau ez da hain segurua">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"DNS izen ez-publikoentzako ziurtagiriak egiaztatu eta aurkeztu">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Aukera hau gaituta ez dagoen bitartean, Behatokiak DNS sistemaren bitartez ebatzi ezin dituen izenentzako ziurtagiriak ez ditu erregistraruko.">
+
+<!ENTITY ssl-observatory.prefs.show "Aukera aurreratuak erakutsi">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Behatokiaren Hobespenak">
+
+<!ENTITY ssl-observatory.prefs.use "Behatokia erabili?">
+<!ENTITY ssl-observatory.warning.title "EFFren SSL Behatokiaren ABISUA">
+<!ENTITY ssl-observatory.warning.showcert "Ziurtagiri katea erakutsi">
+<!ENTITY ssl-observatory.warning.okay "Ulertzen dut">
+<!ENTITY ssl-observatory.warning.text "EFFren SSL Behatokiak leku honen HTTPS ziurtagiri(ar)entzako abisua igorri du:">
+<!ENTITY ssl-observatory.warning.defense "Leku honetan saioa hasi baduzu, konexio seguru bat duzunean zure pasahitza aldatzea komeni da.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Bidali eta egiaztatu norberak-sinatutako ziurtagiriak">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Hau gomendatzen da; arazo kriptografikoak norberak-sinatutako kapsulatutako gailuetan bereziki arruntak dira">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fa/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fa/https-everywhere.dtd
new file mode 100644
index 0000000..75ea17f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fa/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "درباره‌ی HTTPS همه‌جا">
+<!ENTITY https-everywhere.about.ext_name "HTTPS همه‌جا">
+<!ENTITY https-everywhere.about.ext_description "وب را رمزگذاری کنید! از امنیت HTTPS بصورت خودکار برای بسیاری از وب‌سایت‌ها Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید.">
+<!ENTITY https-everywhere.about.version "نسخه">
+<!ENTITY https-everywhere.about.created_by "نوشته‌شده توسط">
+<!ENTITY https-everywhere.about.librarians "Ruleset Librarians">
+<!ENTITY https-everywhere.about.thanks "با تشکر از">
+<!ENTITY https-everywhere.about.contribute "اگر شما از HTTPS همه‌جا راضی هستید، پیشنهاد می‌کنیم">
+<!ENTITY https-everywhere.about.donate_tor "به Tor کمک مالی کنید.">
+<!ENTITY https-everywhere.about.tor_lang_code "fa">
+<!ENTITY https-everywhere.about.donate_eff "به EFF کمک مالی کنید.">
+
+<!ENTITY https-everywhere.menu.about "درباره‌ی HTTPS همه‌جا">
+<!ENTITY https-everywhere.menu.observatory "تنظیم‌های رصدخانه‌ی SSL">
+<!ENTITY https-everywhere.menu.globalEnable "HTTPS همه‌جا را ÙØ¹Ø§Ù„ کنید">
+<!ENTITY https-everywhere.menu.globalDisable "HTTPS همه‌جا را ØºÛŒØ±ÙØ¹Ø§Ù„ کنید">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "تنظیم‌های HTTPS همه‌جا">
+<!ENTITY https-everywhere.prefs.enable_all "همه‌ی موارد را ÙØ¹Ø§Ù„ کنید">
+<!ENTITY https-everywhere.prefs.disable_all "همه‌ی موارد را ØºÛŒØ±ÙØ¹Ø§Ù„ کنید">
+<!ENTITY https-everywhere.prefs.reset_defaults "بازگشت به تنظیم‌های اولیه">
+<!ENTITY https-everywhere.prefs.search "جستجو">
+<!ENTITY https-everywhere.prefs.site "وب‌سایت">
+<!ENTITY https-everywhere.prefs.notes "یادداشت‌ها">
+<!ENTITY https-everywhere.prefs.list_caption "کدام روال‌های تغییر مسیر HTTPS باید اعمال شوند؟">
+<!ENTITY https-everywhere.prefs.enabled "ÙØ¹Ø§Ù„">
+<!ENTITY https-everywhere.prefs.ruleset_howto "شما می‌توانید یادبگیرید که مجموعه روال‌های خود را بنویسید (تا از وب‌سایت‌های دیگر پشتیبانی کنید)">
+<!ENTITY https-everywhere.prefs.here_link "اینجا">
+<!ENTITY https-everywhere.prefs.toggle "تغییر">
+<!ENTITY https-everywhere.prefs.reset_default "بازگشت به تنظیم‌های اولیه">
+<!ENTITY https-everywhere.prefs.view_xml_source "مشاهده منبع XML">
+
+<!ENTITY https-everywhere.source.downloading "در حال دانلود">
+<!ENTITY https-everywhere.source.filename "نام ÙØ§ÛŒÙ„">
+<!ENTITY https-everywhere.source.unable_to_download "امکان دانلود منبع وجود ندارد.">
+
+<!ENTITY https-everywhere.popup.title "آگهی از همه جا HTTPS نسخه 4.0development.11">
+<!ENTITY https-everywhere.popup.paragraph1 "اوه! شما از نسخه پایدار «همه جا HTTPS» Ø§Ø³ØªÙØ§Ø¯Ù‡ Ù…ÛŒ کردید، اما احتمالا ما به طور تصادÙÛŒ در حین آخرین انتشار، شما را به نسخه در حال توسعه ارتقا دادیم. ">
+<!ENTITY https-everywhere.popup.paragraph2 "آیا مایلید به نسخه‌ی پایدار بازگردید؟">
+<!ENTITY https-everywhere.popup.paragraph3 "ما خوشحال Ù…ÛŒ شویم اگر شما همچنان از آخرین نسخه‌ی در حال توسعه منتشر شده ما Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید! شاید اینجا Ùˆ آنجا به یکی دو مشکل برخورد کنید Ú©Ù‡ Ù…ÛŒ توانید آنها را به آدرس https-everywhere@eff.org اطلاع دهید. با عرض پوزش به خاطر مشکلات احتمالی Ùˆ با تشکر به خاطر Ø§Ø³ØªÙØ§Ø¯Ù‡ از «همه جا HTTPS».">
+<!ENTITY https-everywhere.popup.keep "آخرین نسخه پایدار را داونلود کن">
+<!ENTITY https-everywhere.popup.revert "آخرین نسخه پایدار را داونلود کن">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fa/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fa/https-everywhere.properties
new file mode 100644
index 0000000..7e7959c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fa/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = HTTPS همه‌جا را ÙØ¹Ø§Ù„ کنید
+https-everywhere.menu.globalDisable = HTTPS همه‌جا را ØºÛŒØ±ÙØ¹Ø§Ù„ کنید
+https-everywhere.menu.enableDisable = ÙØ¹Ø§Ù„/غیر ÙØ¹Ø§Ù„ کردن قوانین
+https-everywhere.menu.noRules = (هیچ قانونی برای این ØµÙØ­Ù‡ وجود ندارد)
+https-everywhere.menu.unknownRules = (قوانین مربوط به این ØµÙØ­Ù‡ ناشناخته است)
+https-everywhere.toolbar.hint = HTTPS همه‌جا ÙØ¹Ø§Ù„ شد. می‌توانید آن را برای هر سایتی Ú©Ù‡ خواستید ÙØ¹Ø§Ù„ یا ØºÛŒØ±ÙØ¹Ø§Ù„ کنید. کاÙیست روی نمایه آن در نوار آدرس کلیک کنید.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fa/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fa/ssl-observatory.dtd
new file mode 100644
index 0000000..3bec572
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fa/ssl-observatory.dtd
@@ -0,0 +1,91 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "جزییات Ùˆ Ø­ÙØ¸ حریم شخصی">
+<!ENTITY ssl-observatory.popup.later "بعدا بپرس">
+<!ENTITY ssl-observatory.popup.no "خیر">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS همه‌جا می‌تواند جمله به مرورگر شما را از طریق ارسال گواهینامه‌هایی Ú©Ù‡ شما Ø¯Ø±ÛŒØ§ÙØª می‌کنید به رصدگر کش٠کند. آیا می‌خواهید این امکان ÙØ¹Ø§Ù„ شود؟">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"آیا HTTPS همه‌جا باید از رصدگر SSL Ø§Ø³ØªÙØ§Ø¯Ù‡ کند؟">
+
+<!ENTITY ssl-observatory.popup.yes "بله">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"ÙØ¹Ø§Ù„‌کردن این گزینه امن است، مگر این‌که شما از یک شبکه‌ی کاری با درجه‌ی نظارت بالا Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"امن، مگر اینکه شما از یک شبکه‌ی کاری با نام‌های مخÙÛŒ در شبکه‌ی داخلی Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"گواهینامه‌های امضا شده توسط نهادهای تایید (CA) غیراستاندارد را برای بررسی ارسال کنید. ">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"این یک انتخاب امن (Ùˆ یک پیشنهاد خوب) است Ú©Ù‡ شما این گزینه را ÙØ¹Ø§Ù„ کنید، مگر اینکه شما از یک شبکه‌ی کاری با درجه‌ی نظارت بالا Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید یا Ù†Ø±Ù…â€ŒØ§ÙØ²Ø§Ø± ضدویروس کاسپرسکی، Ú©Ù‡ Ø±ÙØªØ§Ø± شما روی وب را به‌کمک TLS proxy Ùˆ یک نهاد تایید (CA) خصوصی بازرسی می‌کند، روی کامپیوتر شما نصب شده‌باشد. اگر روی شبکه‌ای مانند آن‌چه Ú¯ÙØªÙ‡â€ŒØ´Ø¯ قرار دارید، این گزینه می‌توانند این تصور را ایجاد کند Ú©Ù‡ آدرس‌های https:// از طریق یک پروکسی باز شده‌اند. این به‌دلیل گواهینامه‌های Ù…Ù†Ø­ØµØ±Ø¨Ù‡â€ŒÙØ±Ø¯ÛŒ است Ú©Ù‡ در این ÙØ±Ø§ÛŒÙ†Ø¯ تولید می‌شوند. بنابراین، ما این گزینه را بصورت پیشنهاده خاموش کرده‌ایم.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Ø§Ø³ØªÙØ§Ø¯Ù‡ از Tor برای مخÙÛŒ کردن هویت در زمان آزمایش گواهینامه">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Ø§Ø³ØªÙØ§Ø¯Ù‡ از Tor برای مخÙÛŒ کردن هویت در زمان آزمایش گواهینامه (نیاز به Torbutton دارد)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"برای Ø§Ø³ØªÙØ§Ø¯Ù‡ از این امکان لازم است Tor Ùˆ Torbutton نصب شده‌باشند">
+
+<!ENTITY ssl-observatory.prefs.asn
+"ارسال نام ISPی که ارتباط را ایجاد کرده است به رصدگر زمانی که یک گواهینامه‌ی جدید دیده شد">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"این گزینه محتوای Autonomous System number شما را بازیابی کرده Ùˆ ارسال خواهد کرد. این اطلاع به ما Ú©Ù…Ú© خواهد کرد Ú©Ù‡ حمله علیه HTTPS را مکان‌یابی کنیم Ùˆ از این طریق ما خواهیم دانست Ú©Ù‡ آیا این مشاهدات به شبکه‌هایی در مناطقی نظیر ایران Ùˆ سوریه مربوط هستند یا خیر. حملاتی نظیر آنچه Ú¯ÙØªÙ‡â€ŒØ´Ø¯ در این مناطق نسبتا معمول هستند.">
+
+<!ENTITY ssl-observatory.prefs.done "انجام شد">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS همه‌جا می‌تواند از رصدگر SSLÛŒ Ú©Ù‡ توسط EFF اداره می‌شود Ø§Ø³ØªÙØ§Ø¯Ù‡ کند. این امکان منتهی به دو اقدام می‌شود. Û±- به این‌ترتیب نسخه‌هایی از گواهینامه‌های HTTPS به رصدگر ÙØ±Ø³ØªØ§Ø¯Ù‡ می‌شوند. این مساله به ما این امکان را می‌دهد Ú©Ù‡ حملات «مردی در میان» را کش٠کنیم Ùˆ به این‌ترتیب به امنیت وب Ú©Ù…Ú© کنیم. Û²- ما این امکان را خواهیم داشت Ú©Ù‡ به شما درباره‌ی ارتباطات ناامن یا حملات به مرورگر شما هشدار بدهیم.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"برای مثال، زمانی Ú©Ù‡ شما ØµÙØ­Ù‡â€ŒÛŒ https://www.something.com را بازدید می‌کنید، گواهینامه‌ای Ú©Ù‡ برای رصدگر ارسال می‌شود نشان خواهد داد Ú©Ù‡ کسی از www.something.com بازدید کرده‌است، اما اینکه دقیقا چه‌کسی یا از Ú†Ù‡ ØµÙØ­Ù‡â€ŒØ§ÛŒ بازدید کرده‌است برای رصدگر دانسته نخواهد بود. موشواره‌ را روی این گزینه ببرید تا اطلاعات بیشتری در این زمینه بگیرید:">
+
+<!ENTITY ssl-observatory.prefs.hide "مخÙی‌کردن گزینه‌های Ù¾ÛŒØ´Ø±ÙØªÙ‡">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"آزمایش گواهینامه حتی اگر Tor نیز نصب نشده‌باشد">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"ما هم‌چنان تلاش خواهیم کرد که اطلاعات شما را محرمانه نگه‌داریم، اما این گزینه امنیت کمتری دارد">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"ارسال و آزمایش گواهینامه‌ی برای نام‌های DNS غیرعمومی">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"اگر این گزینه انتخاب نشده‌باشد، رصدگر اطلاعات گواهینامه‌هایی که نام آن‌ها از طریق DNS تعیین‌تکلی٠نشود را ذخیره نخواهد کرد.">
+
+<!ENTITY ssl-observatory.prefs.show "نمایش گزینه‌های Ù¾ÛŒØ´Ø±ÙØªÙ‡">
+
+<!ENTITY ssl-observatory.prefs.title "تنظیم‌های رصدگر SSL">
+
+<!ENTITY ssl-observatory.prefs.use "آیا باید از رصدگر Ø§Ø³ØªÙØ§Ø¯Ù‡ شود؟">
+<!ENTITY ssl-observatory.warning.title "هشدار از رصدگر SSLی که توسط EFF اداره می‌شود">
+<!ENTITY ssl-observatory.warning.showcert "نمایش زنجیره‌ی گواهینامه">
+<!ENTITY ssl-observatory.warning.okay "می‌Ùهمم">
+<!ENTITY ssl-observatory.warning.text "رصدگر SSLی که توسط EFF اداره می‌شود برای گواهینامه(ها)ی HTTPS این وب‌سایت هشدار صادر کرده‌است:">
+<!ENTITY ssl-observatory.warning.defense "اگر شما در این وب‌سایت لاگین کرده‌اید، پیشنهاد می‌کنیم که زمانی که با یک اتصال امن وارد شدید رمز ورود خود را تغییر دهید.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"ارسال و گواهینامه های خود-امضا را بررسی کن">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"این پیشنهاد میشه؛ مشکلات رمزنگاری بویژه در دستگاههای تعبیه شده خود-امضا رایج هستند">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fi/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fi/https-everywhere.dtd
new file mode 100644
index 0000000..91da15b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fi/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Tietoja HTTPS Everywheresta">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Salaa Web! Käytä automaattisesti HTTPS-suojausta useilla sivustoilla.">
+<!ENTITY https-everywhere.about.version "Versio">
+<!ENTITY https-everywhere.about.created_by "Tekijät">
+<!ENTITY https-everywhere.about.librarians "Sääntöjen hallinnoijat">
+<!ENTITY https-everywhere.about.thanks "Kiitokset">
+<!ENTITY https-everywhere.about.contribute "Jos pidät HTTPS Everywheresta, sinun on mahdollista">
+<!ENTITY https-everywhere.about.donate_tor "lahjoittaa Torille">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "lahjoittaa EFFille">
+
+<!ENTITY https-everywhere.menu.about "Tietoja HTTPS Everywheresta">
+<!ENTITY https-everywhere.menu.observatory "SSL Observatoryn asetukset">
+<!ENTITY https-everywhere.menu.globalEnable "Ota HTTPS Everywhere käyttöön">
+<!ENTITY https-everywhere.menu.globalDisable "Poista HTTPS Everywhere käytöstä">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywheren asetukset">
+<!ENTITY https-everywhere.prefs.enable_all "Ota kaikki käyttöön">
+<!ENTITY https-everywhere.prefs.disable_all "Poista kaikki käytöstä">
+<!ENTITY https-everywhere.prefs.reset_defaults "Palauta oletusarvoihin">
+<!ENTITY https-everywhere.prefs.search "Hae">
+<!ENTITY https-everywhere.prefs.site "Sivusto">
+<!ENTITY https-everywhere.prefs.notes "Huomautus">
+<!ENTITY https-everywhere.prefs.list_caption "Mitä HTTPS-uudelleenohjauksia tulisi käyttää?">
+<!ENTITY https-everywhere.prefs.enabled "Käytössä">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Voit opetella kirjoittamaan omia sääntöjäsi (laajentaaksesi muiden sivustojen tukea)">
+<!ENTITY https-everywhere.prefs.here_link "täällä">
+<!ENTITY https-everywhere.prefs.toggle "Vaihda tilaa">
+<!ENTITY https-everywhere.prefs.reset_default "Palauta oletusasetus">
+<!ENTITY https-everywhere.prefs.view_xml_source "Katso XML-lähde">
+
+<!ENTITY https-everywhere.source.downloading "Ladataan">
+<!ENTITY https-everywhere.source.filename "Tiedostonimi">
+<!ENTITY https-everywhere.source.unable_to_download "Lähteen lataaminen epäonnistui.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fi/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fi/https-everywhere.properties
new file mode 100644
index 0000000..ada876f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fi/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Ota HTTPS Everywhere käyttöön
+https-everywhere.menu.globalDisable = Poista HTTPS Everywhere käytöstä
+https-everywhere.menu.enableDisable = Ota sääntöjä käyttöön / poista käytöstä
+https-everywhere.menu.noRules = (Tälle sivulle ei ole sääntöjä)
+https-everywhere.menu.unknownRules = (Sivun sääntöä ei tunnistettu)
+https-everywhere.toolbar.hint = HTTPS Everywhere on käytössä. Voit valita, millä sivustoilla ohjelmaa käytetään, kun napsautat osoiterivissä olevaa kuvaketta.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fi/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fi/ssl-observatory.dtd
new file mode 100644
index 0000000..2d53a25
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fi/ssl-observatory.dtd
@@ -0,0 +1,91 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Lisä- ja yksityisyystiedot">
+<!ENTITY ssl-observatory.popup.later "Kysy myöhemmin">
+<!ENTITY ssl-observatory.popup.no "Ei">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere voi tunnistaa selaimeen kohdistuvat hyökkäykset lähettämällä varmenteet Observatoryyn. Otetaanko toiminto käyttöön?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Tulisiko HTTPS Everywheren käyttää SSL Observatorya?">
+
+<!ENTITY ssl-observatory.popup.yes "Kyllä">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Käyttöön ottaminen on turvallista, jos et käytä hyvin tunkeilevaa yritysverkkoa:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Turvallista, jos et käytä yritysverkkoa, jonka intranetin palvelinten nimet on salattu:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Lähetä ja tarkista varmenteet, jotka on allekirjoittanut epävirallinen päämyöntäjä">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"On turvallista (ja hyvä idea) valita tämä, jos et käytä tunkeilevaa yritysverkkoa tai Kasperskyn viruksentorjuntaohjelmaa, joka seuraa selaamista TLS-välipalvelimen ja yksityisen varmenteen päämyöntäjän avulla. Tällaisessa verkossa tämä asetus voi antaa vihjeitä siitä, missä HTTPS-verkkotunnuksissa välipalvelimen avulla on vierailtu. Vihjeiden syynä ovat niiden tuottamat ainutlaatuiset varmenteet. Tästä syystä valinta ei ole päällä oletusasetuksena.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Tarkista varmenteet anonyymisti Torilla">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Tarkista varmenteet anonyymisti Torilla (vaatii Torin)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Tämä valinta edellyttää, että Tor on asennettu ja käytössä.">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Kun näet uuden varmenteen, kerro Observatorylle, mihin palveluntarjoajaan olet yhteydessä">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Tämä noutaa ja lähettää verkkosi autonomisen järjestelmän numerotunnuksen (ASN). Näin pystymme paikantamaan HTTPS:ään kohdistuvat hyökkäykset ja voimme selvittää, ovatko havainnot Iranin ja Syyrian kaltaisten alueiden verkoista, joissa hyökkäykset ovat yleisiä.">
+
+<!ENTITY ssl-observatory.prefs.done "Valmis">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere voi hyödyntää EFFin SSL Observatorya. Sillä on kaksi tehtävää: (1) Se lähettää HTTPS-varmenteiden kopiot Observatoryyn, jotta pystyisimme tunnistamaan epärehellisen välittäjän (MitM) hyökkäykset ja edistämään WWW:n turvallisuutta. (2) Sen avulla voimme varoittaa sinua turvattomista yhteyksistä ja selaimeen kohdistuvista hyökkäyksistä.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Jos esimerkiksi käyt sivustolla https://www.something.com, Observatoryn vastaanottama varmenne kertoo, että joku on vieraillut osoitteessa www.something.com. Varmenne ei kuitenkaan kerro, kuka on käynyt sivustolla ja mitä tiettyjä sivuja on katseltu. Saat lisätietoja, kun kohdistat hiiren osoittimen valinnan päälle:">
+
+<!ENTITY ssl-observatory.prefs.hide "Piilota lisäasetukset">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Tarkista varmenteet, vaikka Tor ei ole käytössä">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Yritämme pitää tiedot nimettömänä, mutta tämä valinta on aina turvattomampi.">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Lähetä ja tarkista yksityisten DNS-nimien varmenteet">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Jos tätä valintaa ei ole valittu, Observatory ei kerää varmenteita, joiden nimiä se ei pysty selvittämään nimipalvelujärjestelmällä (DNS).">
+
+<!ENTITY ssl-observatory.prefs.show "Näytä lisäasetukset">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Observatoryn asetukset">
+
+<!ENTITY ssl-observatory.prefs.use "Käytä Observatorya?">
+<!ENTITY ssl-observatory.warning.title "VAROITUS EFFin SSL Observatorylta">
+<!ENTITY ssl-observatory.warning.showcert "Näytä palvelimen varmenneketju">
+<!ENTITY ssl-observatory.warning.okay "Ymmärrän">
+<!ENTITY ssl-observatory.warning.text "EFFin SSL Observatory on varoittanut tämän sivuston yhdestä tai useammasta HTTPS-varmenteesta:">
+<!ENTITY ssl-observatory.warning.defense "Jos olet kirjautunut sivustolle, voi olla suositeltavaa vaihtaa salasana, sitten kun käytössäsi on turvallinen yhteys.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Lähetä ja tarkista sivuston itsensä allekirjoittama varmenne">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Tämä on suositeltavaa. Salaukseen liittyvät ongelmat ovat hyvin yleisiä itsensä allekirjoittaneissa sulautetuissa järjestelmissä.">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fr/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fr/https-everywhere.dtd
new file mode 100644
index 0000000..bae723d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fr/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "À propos de HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Chiffrer le Web ! Utilisez HTTPS automatiquement avec de nombreux sites.">
+<!ENTITY https-everywhere.about.version "Version">
+<!ENTITY https-everywhere.about.created_by "Créé par">
+<!ENTITY https-everywhere.about.librarians "Bibliothécaires de règles">
+<!ENTITY https-everywhere.about.thanks "Merci à">
+<!ENTITY https-everywhere.about.contribute "Si vous aimez HTTPS Everywhere, vous pouvez">
+<!ENTITY https-everywhere.about.donate_tor "Donner à Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "Donner à l'EFF">
+
+<!ENTITY https-everywhere.menu.about "À propos de HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "Préférences de l'Observatoire SSL ">
+<!ENTITY https-everywhere.menu.globalEnable "Activer HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Désactiver HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Préférences de HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "Tout activer">
+<!ENTITY https-everywhere.prefs.disable_all "Tout désactiver">
+<!ENTITY https-everywhere.prefs.reset_defaults "Revenir aux paramètres par défaut">
+<!ENTITY https-everywhere.prefs.search "Recherche">
+<!ENTITY https-everywhere.prefs.site "Site">
+<!ENTITY https-everywhere.prefs.notes "Notes">
+<!ENTITY https-everywhere.prefs.list_caption "Quelles règles de redirection HTTPS devraient s'appliquer ?">
+<!ENTITY https-everywhere.prefs.enabled "Activé">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Vous pouvez apprendre à rédiger vos propres règles de redirection (pour la prise en charge d'autres sites Internet)">
+<!ENTITY https-everywhere.prefs.here_link "Ici">
+<!ENTITY https-everywhere.prefs.toggle "Retour">
+<!ENTITY https-everywhere.prefs.reset_default "Revenir aux paramètres par défaut.">
+<!ENTITY https-everywhere.prefs.view_xml_source "Regarder le code source XML">
+
+<!ENTITY https-everywhere.source.downloading "Telécharger">
+<!ENTITY https-everywhere.source.filename "Nom du fichier">
+<!ENTITY https-everywhere.source.unable_to_download "Impossible de télécharger le code source.">
+
+<!ENTITY https-everywhere.popup.title "Notification de HTTPS Everywhere 4.0development.11">
+<!ENTITY https-everywhere.popup.paragraph1 "Oups. Vous utilisiez la version stable de HTTPS Everywhere, mais notre dernière version a pu accidentellement effectuer la mise à jour vers la version de développement.">
+<!ENTITY https-everywhere.popup.paragraph2 "Est-ce que vous souhaitez revenir vers la version stable ?">
+<!ENTITY https-everywhere.popup.paragraph3 "Nous aimerions vous voir continuer à utiliser notre version de développement et à nous aider à améliorer HTTPS Everywhere ! Vous allez peut-être trouver des bugs ça et là, que vous pouvez rapporter (en anglais) en écrivant à https-everywhere@eff.org. Désolé pour le dérangement, et merci d'utiliser HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Rester sur la version de développement">
+<!ENTITY https-everywhere.popup.revert "Télécharger la dernière version stable">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fr/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fr/https-everywhere.properties
new file mode 100644
index 0000000..a64e511
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fr/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Activer HTTPS Everywhere
+https-everywhere.menu.globalDisable = Désactiver HTTPS Everywhere
+https-everywhere.menu.enableDisable = Activer / Désactiver les règles
+https-everywhere.menu.noRules = (Aucune règle pour cette page)
+https-everywhere.menu.unknownRules = (Règles inconnues pour cette page)
+https-everywhere.toolbar.hint = HTTPS Everywhere est désormais actif. Vous pouvez l'activer sur les sites au cas par cas en cliquant sur l'icône dans la barre d'adresse.
+https-everywhere.migration.notification0 = Afin d'appliquer un correctif crucial, cette mise à jour réinitialise vos règles de préférences HTTPS Everywhere, à leurs valeurs par défaut.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fr/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fr/ssl-observatory.dtd
new file mode 100644
index 0000000..0d4d394
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/fr/ssl-observatory.dtd
@@ -0,0 +1,90 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Informations relatives à la vie privée">
+<!ENTITY ssl-observatory.popup.later "Plus tard">
+<!ENTITY ssl-observatory.popup.no "Non">
+
+<!ENTITY ssl-observatory.popup.text " HTTPS Everywhere peut détecter les attaques contre votre navigateur en adressant les certificats reçus à l'Observatoire. Souhaitez-vous activer cette fonctionnalité ?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Activer l'usage de l'Observatoire SSL par HTTPS Everywhere ?">
+
+<!ENTITY ssl-observatory.popup.yes "Oui">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Cette option est sécurisée, sauf si vous vous connectez via un réseau d'entreprise très intrusif :">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Cette option est sécurisée, sauf si vous passez par un réseau d'entreprise qui comporte des serveurs Intranet masqués :">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Soumettre et vérifier les certificats signés par des autorités inhabituelles">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+" Il est sûr (et c'est une bonne idée) d'activer cette option, sauf si vous utilisez un réseau d'entreprise intrusif ou le logiciel antivirus Kaspersky qui surveille votre navigation avec un proxy TLS et une autorité racine privée du certificat. Si elle est activée sur un tel réseau, cette option pourrait publier des preuves que tel ou tel domaine a été visité en https:// à travers ce proxy, à cause des certificats uniques qu'elle produirait. Nous la désactivons donc par défaut">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Vérifier les certificats et utiliser l'outil d'anonymat TOR">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Vérifier les certificats et utiliser l'outil d'anonymat TOR (installation du TORbutton indispensable)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Cette option requiert l'installation de TOR et du Torbutton">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Quand vous voyez un nouveau certificat, indiquez à l'Observatoire quel FAI vous utilisez maintenant.">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Cette option récupérera et rapportera le « Autonomous System number » de votre réseau. Cela nous aidera à localiser les attaques contre HTTPS, et savoir si nous avons des observations à partir de réseaux dans des pays comme l'Iran et la Syrie où ces attaques sont fréquentes.">
+
+<!ENTITY ssl-observatory.prefs.done "OK">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere peut également faire appel à l'Observatoire SSL de l'EFF. Cela permet deux choses: (1)
+cela adresse les copies des certificats HTTPS à l'Observatoire, ce qui permet de détecter les attaques de type Homme du milieu et d'améliorer la sécurité globale de l'Internet ; et (2)
+cela nous permet de mieux vous informer quant aux connexions non sécurisées et aux attaques sur votre navigateur.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Par exemple, si vous visitez https://www.something.com, le certificat reçu par l'Observatoire indiquera que quelqu'un a visité
+www.something.com, mais pas qui a visité le site, ou quelle page a été lue. Passez votre souris sur les options pour plus d'informations:">
+
+<!ENTITY ssl-observatory.prefs.hide "Cacher les options avancées">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Vérifier les certificats même si TOR n'est pas disponible">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Nous essaierons toujours de faire en sorte que les données restent confidentielles, mais cette option est moins sécurisée">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Soumettre et vérifier les certificats des DNS privés">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Si cette option est activée, l'Observatoire conservera les certificats des domaines qui ne peuvent être résolus par le système DNS public">
+
+<!ENTITY ssl-observatory.prefs.show "Options avancées">
+
+<!ENTITY ssl-observatory.prefs.title "Préférences de l'Observatoire SSL">
+
+<!ENTITY ssl-observatory.prefs.use "Utiliser l'Observatoire ?">
+<!ENTITY ssl-observatory.warning.title "Avertissement de l'Observatoire SSL">
+<!ENTITY ssl-observatory.warning.showcert "Montrer l'empreinte du certificat">
+<!ENTITY ssl-observatory.warning.okay "Je comprends">
+<!ENTITY ssl-observatory.warning.text "L'Observatoire SSL de l'EFF a publié un avertissement sur les certificats SSL émis par ce site :">
+<!ENTITY ssl-observatory.warning.defense "Si vous vous êtes connecté à ce site, vous devriez changer de mot de passe dès que vous retrouvez une connexion sécurisée.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Envoyer et vérifier des certificats auto-signés">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Ceci est recommandé ; les problèmes cryptographiques sont particulièrement fréquents dans les systèmes embarqués auto-signés">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/he/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/he/https-everywhere.dtd
new file mode 100644
index 0000000..dd33377
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/he/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "×ודות HTTPS בכל מקו×">
+<!ENTITY https-everywhere.about.ext_name "HTTPS בכל מקו×">
+<!ENTITY https-everywhere.about.ext_description "הצפן ×ת הרשת! השתמש ב-HTTPS ×וטומטית">
+<!ENTITY https-everywhere.about.version "גרסה">
+<!ENTITY https-everywhere.about.created_by "נבנה על ידי">
+<!ENTITY https-everywhere.about.librarians "ספרני מערכת כללי×">
+<!ENTITY https-everywhere.about.thanks "תודות ל">
+<!ENTITY https-everywhere.about.contribute "×× ×הבת ×ת HTTPS בכל מקו×, ×ולי תרצה">
+<!ENTITY https-everywhere.about.donate_tor "×œ×ª×¨×•× ×œ-Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "×נגלית">
+<!ENTITY https-everywhere.about.donate_eff "תרומה לEFF">
+
+<!ENTITY https-everywhere.menu.about "×ודות HTTPS בכל מקו×">
+<!ENTITY https-everywhere.menu.observatory "העדפות SSL Observatory">
+<!ENTITY https-everywhere.menu.globalEnable "הפעל ×ת HTTPS בכל מקו×">
+<!ENTITY https-everywhere.menu.globalDisable "השבת ×ת HTTPS בכל מקו×">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "הגדרות HTTPS בכל מקו×">
+<!ENTITY https-everywhere.prefs.enable_all "הפעל הכל">
+<!ENTITY https-everywhere.prefs.disable_all "השבת הכל">
+<!ENTITY https-everywhere.prefs.reset_defaults "×יפוס לברירת מחדל">
+<!ENTITY https-everywhere.prefs.search "חפש">
+<!ENTITY https-everywhere.prefs.site "×תר">
+<!ENTITY https-everywhere.prefs.notes "פתקי×">
+<!ENTITY https-everywhere.prefs.list_caption "×ילו הגדרות ניתוב HTTPS לייש×?">
+<!ENTITY https-everywhere.prefs.enabled "פועל">
+<!ENTITY https-everywhere.prefs.ruleset_howto "×תה יכול ללמוד ×יך לכתוב rulesets משלך (להוספת תמיכה ב×תרי ×ינטרנט ×חרי×)">
+<!ENTITY https-everywhere.prefs.here_link "פה">
+<!ENTITY https-everywhere.prefs.toggle "Toggle">
+<!ENTITY https-everywhere.prefs.reset_default "החזר לברירת מחדל">
+<!ENTITY https-everywhere.prefs.view_xml_source "הצג מקור XML">
+
+<!ENTITY https-everywhere.source.downloading "מוריד">
+<!ENTITY https-everywhere.source.filename "×©× ×”×§×•×‘×¥">
+<!ENTITY https-everywhere.source.unable_to_download "הורדת המקור נכשלה">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/he/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/he/https-everywhere.properties
new file mode 100644
index 0000000..434edd3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/he/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = להפעיל ×ת HTTPS Everywhere
+https-everywhere.menu.globalDisable = להשבית ×ת HTTPS Everywhere
+https-everywhere.menu.enableDisable = להפעיל/להשבית כללי×
+https-everywhere.menu.noRules = (×ין ×›×œ×œ×™× ×¢×‘×•×¨ דף ×–×”)
+https-everywhere.menu.unknownRules = (×›×œ×œ×™× ×œ×“×£ ×–×” ××™× × ×™×“×•×¢×™×)
+https-everywhere.toolbar.hint = HTTPS Everywhere is now active. You can toggle it on a site-by-site basis by clicking the icon in the address bar.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/he/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/he/ssl-observatory.dtd
new file mode 100644
index 0000000..ab3ed77
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/he/ssl-observatory.dtd
@@ -0,0 +1,92 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "×¤×¨×˜×™× ×•×ž×™×“×¢ ×ישי">
+<!ENTITY ssl-observatory.popup.later "ש×ל ×ותי ×חר כך">
+<!ENTITY ssl-observatory.popup.no "ל×">
+
+<!ENTITY ssl-observatory.popup.text " ">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"×”×× ×›×“××™ ש- HTTPS בכל ×ž×§×•× ×™×©×ª×ž×© בתצפית SSL?">
+
+<!ENTITY ssl-observatory.popup.yes "כן">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"בטוח ל×פשר ×–×ת, ××œ× ×× ×›×Ÿ ×תה משתמש ברשת ת×גידית פולשנית מ×וד:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"בטוח, ××œ× ×× ×›×Ÿ ×תה משתמש ברשת ת×גידית ×¢× ×©×ž×•×ª ×©×¨×ª×™× ×¡×•×“×™×™× ×‘×¨×©×ª זמנית:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"שלח ובדוק ××™×©×•×¨×™× ×”×—×ª×•×ž×™× ×¢×œ ידי רשויות ×”××™×©×•×¨×™× ×”×¢×œ×™×•× ×•×ª ×”×œ× ×¨×’×™×œ×•×ª">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"×–×” בטוח (ורעיון טוב) ל×פשר ×פשרות ×–×ת, ××œ× ×× ×›×Ÿ ×תה משתמש ברשת ת×גידית פולשנית ×ו תוכנת ×נטיוירוס קספרסקי שמנטרת ×ת הגלישה שלך ×¢× ×¤×¨×•×§×¡×™ TLS ורשות ××™×©×•×¨×™× ×¢×œ×™×•× ×” ×ישית. ×× ×ž×ופשרת רשת ×›×–×ת, ×פשרות ×–×ת יכולה ×œ×¤×¨×¡× ×¢×“×•×ª של ×ילו כתובות שמתחילות ב https:// בוקרו דרך הפרוקסי ×”×–×”, בשל ×”×ישור המיוחד ×©×”×•× ×ž×™×™×¦×¨. לכן נש×יר ×–×ת כבוי כברירת מחדל.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "בדוק ××™×©×•×¨×™× ×œ×©×™×ž×•×© ב TOR ב×נונימיות">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"בדוק ××™×©×•×¨×™× ×œ×©×™×ž×•×© ב Tor ב×נונימיות (דורש Tor )">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"×פשרות ×–×ת דורשת ש Tor יותקן וירוץ ">
+
+<!ENTITY ssl-observatory.prefs.asn
+"×›×שר ×תה רו××” ×ישור חדש, תגיד למצפה ל××™×–×” ספק ×תה מחובר">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"×–×” ×ž×‘×™× ×•×©×•×œ×— ×ת &quot;מספר המערכת ×”×נונימי&quot; של הרשת שלך. ×–×” יעזור לנו ×œ×ž×§× ×”×ª×§×¤×•×ª נגד HTTPS, ולקבוע ×”×× ×™×© לנו תצפיות מרשתות במקומות כמו ×יר×ן וסוריה ×©×‘×”× ×”×ª×§×¤×•×ª נפוצות ב×ופן השוו×תי.">
+
+<!ENTITY ssl-observatory.prefs.done "הושל×">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS בכל ×ž×§×•× ×™×›×•×œ להשתמש במצפה SSL של EFF. ×–×” ×ž×§×™×™× ×©× ×™ דברי×:
+(1) שולח ×¢×•×ª×§×™× ×©×œ ×ישורי HTTPS למצפה, כדי לעזור לנו לגלות התקפות '×יש ב×מצע' ולשפר ×ת ×בטחת הרשת; ו (2) מ×פשר לנו להזהיר ×ותך מפני ×—×™×‘×•×¨×™× ×œ× ×ž××•×‘×˜×—×™× ×ו התקפות על הדפדפן שלך.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"לדוגמ×, ×›×שר ×תה מבקר ב https://www.something.com, ×”×ישור שהתקבל על ידי המצפה יציין שמישהו ביקר ב www.something.com, ×בל ×œ× ×ž×™ ביקר ב×תר, ×ו על ××™×–×” עמוד ספציפי ×”× ×”×¡×ª×›×œ×•. תעבור ×¢× ×”×¢×›×‘×¨ על ×”×פשרויות בשביל ×¤×¨×˜×™× × ×•×¡×¤×™×:">
+
+<!ENTITY ssl-observatory.prefs.hide "הסתר ×פשרויות מתקדמות">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"בדוק ××™×©×•×¨×™× ×פילו ×× Tor ×œ× ×–×ž×™×Ÿ">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"עדיין ננסה לשמור ×ת ×”× ×ª×•× ×™× ×נונימיי×, ×בל ×פשרות ×–×ת פחות מ×ובטחת">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"שלח ובדוק ××™×©×•×¨×™× ×¢×‘×•×¨ שמות DNS ×œ× ×¦×™×‘×•×¨×™×™×">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"××œ× ×× ×›×Ÿ ×”×פשרות ×”×–×ת נבדקה, המצפה ×œ× ×™×ª×¢×“ ××™×©×•×¨×™× ×¢×‘×•×¨ שמות ×©×”×•× ×œ× ×™×›×•×œ לגלות דרך מערכת ×” DNS ">
+
+<!ENTITY ssl-observatory.prefs.show "הר××” ×פשרויות מתקדמות">
+
+<!ENTITY ssl-observatory.prefs.title "עדיפויות מצפה SSL">
+
+<!ENTITY ssl-observatory.prefs.use "×”×× ×œ×”×©×ª×ž×© במצפה?">
+<!ENTITY ssl-observatory.warning.title "×זהרה ממצפה SSL של EFF">
+<!ENTITY ssl-observatory.warning.showcert "הר××” ×ת שרשרת ×”×ישורי×">
+<!ENTITY ssl-observatory.warning.okay "×× ×™ מבין">
+<!ENTITY ssl-observatory.warning.text "מצפה SSL של EFF עוסק ב×זהרה מפני ×”×ישור(×™×) של HTTPS עבור ×”×תר ×”×–×”:">
+<!ENTITY ssl-observatory.warning.defense "×× × ×¨×©×ž×ª ל×תר ×”×–×”, כד××™ לשנות ×ת ×”×¡×™×¡×ž× ×©×œ×š ברגע שיש לך חיבור בטוח.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"שלח ובדוק ×ת ×”××™×©×•×¨×™× ×”×—×ª×•×ž×™× ×¢×œ ידך">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"×–×” מומלץ; בעיות הצפנה נפוצות במיוחד ×‘×›×œ×™× ×ž×©×•×‘×¦×™× ×—×ª×•×ž×™× ×¢×¦×ž×™×ª">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hr/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hr/https-everywhere.dtd
new file mode 100644
index 0000000..87a30bc
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hr/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "About HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Encrypt the Web! Automatically use HTTPS security on many sites.">
+<!ENTITY https-everywhere.about.version "Version">
+<!ENTITY https-everywhere.about.created_by "Created by">
+<!ENTITY https-everywhere.about.librarians "Ruleset Librarians">
+<!ENTITY https-everywhere.about.thanks "Thanks to">
+<!ENTITY https-everywhere.about.contribute "If you like HTTPS Everywhere, you might consider">
+<!ENTITY https-everywhere.about.donate_tor "Donating to Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "Donating to EFF">
+
+<!ENTITY https-everywhere.menu.about "About HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL Observatory Preferences">
+<!ENTITY https-everywhere.menu.globalEnable "Enable HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Disable HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere Preferences">
+<!ENTITY https-everywhere.prefs.enable_all "Enable All">
+<!ENTITY https-everywhere.prefs.disable_all "Disable All">
+<!ENTITY https-everywhere.prefs.reset_defaults "Reset to Defaults">
+<!ENTITY https-everywhere.prefs.search "Search">
+<!ENTITY https-everywhere.prefs.site "Site">
+<!ENTITY https-everywhere.prefs.notes "Notes">
+<!ENTITY https-everywhere.prefs.list_caption "Which HTTPS redirection rules should apply?">
+<!ENTITY https-everywhere.prefs.enabled "Enabled">
+<!ENTITY https-everywhere.prefs.ruleset_howto "You can learn how to write your own rulesets (to add support for other web sites)">
+<!ENTITY https-everywhere.prefs.here_link "here">
+<!ENTITY https-everywhere.prefs.toggle "Toggle">
+<!ENTITY https-everywhere.prefs.reset_default "Reset to Default">
+<!ENTITY https-everywhere.prefs.view_xml_source "View XML Source">
+
+<!ENTITY https-everywhere.source.downloading "Downloading">
+<!ENTITY https-everywhere.source.filename "Filename">
+<!ENTITY https-everywhere.source.unable_to_download "Unable to download source.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hr/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hr/https-everywhere.properties
new file mode 100644
index 0000000..7f5aca3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hr/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Omogući HTTPS Svuda
+https-everywhere.menu.globalDisable = Onemogući HTTPS Svuda
+https-everywhere.menu.enableDisable = Omogući / Onemogući Pravila
+https-everywhere.menu.noRules = (Nema Pravila za Ovu Stranicu)
+https-everywhere.menu.unknownRules = (Pravila za Ovu Stranicu Nepoznata)
+https-everywhere.toolbar.hint = HTTPS Svuda je aktivan. Možete ga prebacivati od stranice do stranice tako da kliknete na ikonu na adresnoj traci.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hr/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hr/ssl-observatory.dtd
new file mode 100644
index 0000000..430846f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hr/ssl-observatory.dtd
@@ -0,0 +1,98 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Pojedinosti i informacije privatnosti">
+<!ENTITY ssl-observatory.popup.later "Pitaj me kasnije">
+<!ENTITY ssl-observatory.popup.no "Ne">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere može otkriti napade
+na vaš preglednik šaljući certifikate koje primite
+Opservatoriju. Želite li ukljuÄiti ovo?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Treba li HTTPS Everywhere koristiti SSL Opservatorij?">
+
+<!ENTITY ssl-observatory.popup.yes "Da">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Sigurnije je da omogućite ovo, osim ako koristite jako ometajuću korporativnu mrežu:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Sigurno, osim ako koristite korporativnu mrežu sa tajnim internet nazivima poslužitelja:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Prijavi i provjeri certifikate potpisanim od ne-standardnih korijenskih certifikata">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Sigurno je (i dobra je ideja) da omogućite ovu mogućnost, osim ako koristite ometajuću korporativnu mrežu ili Kaspersky antivirusni softver koji nadgleda vaÅ¡e surfanje sa TLS proxyjem i privatnim korijenskim certifikatima ovlasti. Ako je omogućeno na takvoj mreži, ova mogućnost bi mogla objaviti dokaz koja https:// domena je bila posjećena kroz taj proxy, zbog jedinstvenog certifikata kojeg bi proizvela. Stoga je zadano, ostavljena iskljuÄena.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Provjeri certifikate koristeći Tor za anonimnost">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Provjeri certifikate koristeći Tor za anonimnost (zahtijeva Tortipku)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Ova mogućnost zahtijeva instalirani Tor i Tortipku">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Kada vidite novi certifikat, recite Opservatoriju na koji ste ISP spojeni">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Ovo će dohvatiti i poslati &quot;Autonomni broj sustava&quot; vaÅ¡e mreže. To će nam pomoći u lociranju napada na HTTPS i u otkrivanju kada nas promatraju iz mreža sa mjesta poput Irana i Sirije odkuda stižu uÄestali napadi.">
+
+<!ENTITY ssl-observatory.prefs.done "UÄinjeno">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere može koristiti EFF-ov SSL Opservatorij. Ovo Äini dvije stvari: (1)
+Å¡alje kopije HTTPS certifikata Opservatoriju, da nam pomogne otkriti 'glavnog u sredini' napadaÄa i poboljÅ¡a Web sigurnost; i (2)
+da vas upozorimo o nesigurnim vezama ili napadima na vaš preglednik.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Npr., kada posjetite https://www.something.com, certifikat
+primljen od Opservatorija će naznaÄiti da je netko posjetio
+www.something.com, ali ne tko je posjetio stranicu, ili koju su određenu
+stranicu tražili. Prelazak mišem za daljnje pojedinosti:">
+
+<!ENTITY ssl-observatory.prefs.hide "Sakrij napredne mogućnpsti">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Provjeri certifikate iako Tor nije dostupan">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Mi ćemo još uvijek pokušati držati podatke anonimnim, ali ova mogućnost je manje sigurna">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Prijavite i provjerite certifikate za ne-javne DNS nazive">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Ako ova mogućnost nije odabrana, Opservatorij neće snimati certifikate za nazive koji se ne mogu razriješiti kroz DNS sustav.">
+
+<!ENTITY ssl-observatory.prefs.show "Prikaži napredne mogućnosti ">
+
+<!ENTITY ssl-observatory.prefs.title "Osobitosti SSL Opservatorija">
+
+<!ENTITY ssl-observatory.prefs.use "Koristi Opservatorij?">
+<!ENTITY ssl-observatory.warning.title "UPOZORENJE iz EFF-ovog SSL Opservatorija">
+<!ENTITY ssl-observatory.warning.showcert "Prikaži podatak certifikata">
+<!ENTITY ssl-observatory.warning.okay "Razumijem">
+<!ENTITY ssl-observatory.warning.text "EFF-ov SSL Opservatorij je izdao upozorenje o HTTPS certifikatu(ima) za ovu stranicu:">
+<!ENTITY ssl-observatory.warning.defense "Ako ste povezani sa ovom stranicom, preporuÄljivo je da promijenite svoju lozinku kada uspostavite sigurnu povezanost.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Prijavite i provijerite samopotpisane certifikate">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"To je preporuÄljivo; kriptografski problemi su naroÄito Äesti u samopotpisanim ugraÄ‘enim ureÄ‘ajima">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hu/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hu/https-everywhere.dtd
new file mode 100644
index 0000000..b9fa569
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hu/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "A HTTPS Everywhere névjegye">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Titkosítsa a Web-et! Automatikusan használja a HTTPS titkosítást a legtöbb oldalon.">
+<!ENTITY https-everywhere.about.version "Verzió">
+<!ENTITY https-everywhere.about.created_by "Készítette:">
+<!ENTITY https-everywhere.about.librarians "Szabálykészlet könyvtárosok">
+<!ENTITY https-everywhere.about.thanks "Köszönet:">
+<!ENTITY https-everywhere.about.contribute "Ha tetszik a HTTPS Everywhere, talán megfontolja a következőket:">
+<!ENTITY https-everywhere.about.donate_tor "A Tor támogatása">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "Az EFF támogatása">
+
+<!ENTITY https-everywhere.menu.about "A HTTPS Everywhere névjegye">
+<!ENTITY https-everywhere.menu.observatory "SSL Observatory Beállítások">
+<!ENTITY https-everywhere.menu.globalEnable "HTTPS Everywhere bekapcsolása">
+<!ENTITY https-everywhere.menu.globalDisable "HTTPS Everywhere kikapcsolása">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere Preferences">
+<!ENTITY https-everywhere.prefs.enable_all "Mind bekapcsolása">
+<!ENTITY https-everywhere.prefs.disable_all "Mind kikapcsolása">
+<!ENTITY https-everywhere.prefs.reset_defaults "Visszaállítás alaphelyzetre">
+<!ENTITY https-everywhere.prefs.search "Keresés">
+<!ENTITY https-everywhere.prefs.site "Oldal">
+<!ENTITY https-everywhere.prefs.notes "Megjegyzések">
+<!ENTITY https-everywhere.prefs.list_caption "Mely HTTPS átirányításokat szeretné használni?">
+<!ENTITY https-everywhere.prefs.enabled "Bekapcsolva">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Megtanulhatja, hogy adhatja hozzá a saját szabálykészletét (hogy további oldalakat támogasson) ">
+<!ENTITY https-everywhere.prefs.here_link "itt">
+<!ENTITY https-everywhere.prefs.toggle "Vált">
+<!ENTITY https-everywhere.prefs.reset_default "Visszaállítás alaphelyzetre">
+<!ENTITY https-everywhere.prefs.view_xml_source "Az XML forrás megtekintése">
+
+<!ENTITY https-everywhere.source.downloading "Letöltés">
+<!ENTITY https-everywhere.source.filename "Fájlnév">
+<!ENTITY https-everywhere.source.unable_to_download "A forrás letöltése sikertelen.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hu/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hu/https-everywhere.properties
new file mode 100644
index 0000000..1c95984
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hu/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = HTTPS Everywhere bekapcsolása
+https-everywhere.menu.globalDisable = HTTPS Everywhere kikapcsolása
+https-everywhere.menu.enableDisable = Szabályok Engedélyezése / Tiltása
+https-everywhere.menu.noRules = (nincs szabály ehhez az oldalhoz)
+https-everywhere.menu.unknownRules = (az oldalhoz tartozó szabályok ismeretlenek)
+https-everywhere.toolbar.hint = HTTPS Everywhere is now active. You can toggle it on a site-by-site basis by clicking the icon in the address bar.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hu/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hu/ssl-observatory.dtd
new file mode 100644
index 0000000..d8291e4
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/hu/ssl-observatory.dtd
@@ -0,0 +1,96 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Részletek és adatvédelmi információk">
+<!ENTITY ssl-observatory.popup.later "Kérdezzen meg később">
+<!ENTITY ssl-observatory.popup.no "Nem">
+
+<!ENTITY ssl-observatory.popup.text "A HTTPS Everywhere a böngésző elleni támadásokat képes észlelni, azzal ,hogy elküldi a megkapott tanúsítványokat az Observatory részére. Bekapcsoljuk ezt a funkciót?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Használja a HTTPS Everywhere az SSL Observatory-t?">
+
+<!ENTITY ssl-observatory.popup.yes "Igen">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Biztonságos, ha bekapcsolja, kivéve, ha nagyon privát szférába hatoló vállalati hálózatot használ:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Biztonságos, ha nem használ titkos internet szerver nevekkel rendelkező vállalati hálózatot:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Küldje be és ellenőrizze azon tanúsítványokat, amelyek nem standard tanúsítványkiadótól származnak">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Biztonságos (és javasolt) ha bekapcsolja ezt az opciót, kivéve ha nagyon figyelt vállalati hálózatról vagy Kaspersky víruskereső szoftvert használ, ami figyeli a böngészést egy TLS proxy-val, és egy helyi tanúsítványkiadóval.
+Ha bekapcsolja, az az opció nyomokat hagyhat arról, hogy mely https:// oldalakor látogatott meg azon a proxy-n keresztül, mert egyedi tanúsítványokat hoz létre.
+Tehát hagyja kikapcsolva alapértelmezetten.
+">
+
+<!ENTITY ssl-observatory.prefs.anonymous "A tanúsítványok ellenőrzése Tor-on keresztül az anonimitás megőrzéséhez.">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"A tanúsítványok ellenőrzése Tor-on keresztül az anonimitás megőrzéséhez. (Torbutton szükséges hozzá)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Ez az opció a Tor és Torbutton szoftverek telepítését igényli.">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Ha új tanúsítványt lát, küldje el az Observatory-nak, hogy mely internet szolgáltatóhoz csatlakozik éppen">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Ez kiolvassa és elküldi az ASN számát a hálózatának. Ez segít a HTTPS elleni támadások észlelésében, és lehetővé teszi az észlelést annak, hogy a támadás olyan hálózatokon zajlik-e mint Irán vagy Szíria, ahol a támadások meglehetősen gyakoriak.">
+
+<!ENTITY ssl-observatory.prefs.done "Kész">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"A HTTPS Everywhere használni tudja az EFF's SSL Obszervatóriumát (Observatory). Ez két dolgot jelent: (1)
+elküldi a másolatát a HTTPS kapcoslatok tanúsítványainak az Obszervatóriumba, hogy segítse a MITM támadások észlelését, és növelje a Web biztonságát; és (2)
+lehetővé teszi, hogy figyelmeztessük, ha nem biztonságos a kapcoslata, vagy valaki támadja a böngészőjét.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Például, ha meglátogatja a https://www.valami.hu oldalt, a tanúsítvány amit az Obszervatórium megkap, azt jelzi majd, hogy valaki meglátogatta a www.valami.hu oldalt, de nem mutatja, hogy ki, és hogy melyik oldalt nézte. Húzza az egeret az opciók felé a részletekért:">
+
+<!ENTITY ssl-observatory.prefs.hide "Speciális beállítások elrejtése">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"A tanúsítványok ellenőrzése akkor is, ha a Tor nem elérhető">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Továbbra is megpróbáljuk az adatot névtelenül kezelni, de ez a beállítás kevésbé biztonságos">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Nem publikus DNS nevekhez tartozó tanúsítványok elküldése és ellenőrzése">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Ha ez az opció nicns bejelölve, akkor az Observatory nem rögzíti azon tanúsítványokat, amelyek nem feloldhatók publikus DNS rendszereken keresztül.">
+
+<!ENTITY ssl-observatory.prefs.show "Speciális beállítások megjelenítése">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Observatory Beállítások">
+
+<!ENTITY ssl-observatory.prefs.use "Az Observatory használata?">
+<!ENTITY ssl-observatory.warning.title "FIGYELMEZTETÉS az EFF SSL Observatory-tól">
+<!ENTITY ssl-observatory.warning.showcert "A tanúsítványlánc megjelenítése">
+<!ENTITY ssl-observatory.warning.okay "Megértettem">
+<!ENTITY ssl-observatory.warning.text "Az EFF SSL Oeservatory figyelmeztetést bocsátott az alábbi tanúsítványokról, ehhez az oldalhoz:">
+<!ENTITY ssl-observatory.warning.defense "Ha belépett erre az oldalra, ha már biztonságos kapcsolattal rendelkezik, hogy lecserélje a jelszavát.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"A használt önaláírt tanúsítványok feltöltése és ellenőrzése">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Ez ajánlott; a kriptográfiai problémák széles körben elterjedtek az önaláírt tanúsítvánnyal ellátott céleszközöknél.">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/it/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/it/https-everywhere.dtd
new file mode 100644
index 0000000..782711f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/it/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Informazioni su HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Cripta il Web! Usa HTTPS automaticamente su numerosi siti.">
+<!ENTITY https-everywhere.about.version "Versione">
+<!ENTITY https-everywhere.about.created_by "Creato da">
+<!ENTITY https-everywhere.about.librarians "Autori regole">
+<!ENTITY https-everywhere.about.thanks "Grazie a">
+<!ENTITY https-everywhere.about.contribute "Se ti piace HTTPS Everywhere, considera anche">
+<!ENTITY https-everywhere.about.donate_tor "Donazioni a Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "it">
+<!ENTITY https-everywhere.about.donate_eff "Donazioni a EFF">
+
+<!ENTITY https-everywhere.menu.about "Informazioni su HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "Preferenze Osservatorio SSL">
+<!ENTITY https-everywhere.menu.globalEnable "Abilita HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Disabilita HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Preferenze di HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "Abilita Tutto">
+<!ENTITY https-everywhere.prefs.disable_all "Disabilita Tutto">
+<!ENTITY https-everywhere.prefs.reset_defaults "Ripristina Predefiniti">
+<!ENTITY https-everywhere.prefs.search "Cerca">
+<!ENTITY https-everywhere.prefs.site "Sito">
+<!ENTITY https-everywhere.prefs.notes "Note">
+<!ENTITY https-everywhere.prefs.list_caption "Quali regole di reindirizzamento HTTPS dovrebbero essere applicate?">
+<!ENTITY https-everywhere.prefs.enabled "Abilitato">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Puoi imparare a scrivere i tuoi set di regole (per aggiungere supporto ad altri siti)">
+<!ENTITY https-everywhere.prefs.here_link "qui">
+<!ENTITY https-everywhere.prefs.toggle "Commuta">
+<!ENTITY https-everywhere.prefs.reset_default "Ripristina Predefiniti">
+<!ENTITY https-everywhere.prefs.view_xml_source "Mostra Sorgente XML">
+
+<!ENTITY https-everywhere.source.downloading "Scaricamento">
+<!ENTITY https-everywhere.source.filename "Nome file">
+<!ENTITY https-everywhere.source.unable_to_download "Impossibile scaricare la sorgente.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/it/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/it/https-everywhere.properties
new file mode 100644
index 0000000..a6150b2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/it/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Abilita HTTPS Everywhere
+https-everywhere.menu.globalDisable = Disabilita HTTPS Everywhere
+https-everywhere.menu.enableDisable = Abilita / Disabilita Regole
+https-everywhere.menu.noRules = (Nessuna Regola per Questa Pagina)
+https-everywhere.menu.unknownRules = (Regole per Questa Pagina Sconosciute)
+https-everywhere.toolbar.hint = HTTPS Everywhere is now active. You can toggle it on a site-by-site basis by clicking the icon in the address bar.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/it/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/it/ssl-observatory.dtd
new file mode 100644
index 0000000..40cbb9f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/it/ssl-observatory.dtd
@@ -0,0 +1,98 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Dettagli e informazioni sulla privacy">
+<!ENTITY ssl-observatory.popup.later "Chiedimelo più tardi">
+<!ENTITY ssl-observatory.popup.no "No">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere può rilevare attacchi
+contro il tuo browser inviando i certificati che ricevi all'
+Osservatorio. Vuoi abilitarla?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Vuoi che HTTPS Everywhere usi l' Osservatorio SSL?">
+
+<!ENTITY ssl-observatory.popup.yes "Sì">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"È consigliato abilitarla, a meno che non utilizzi una rete aziendale molto intrusiva:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Consigliato, a meno che non utilizzi una rete aziendale con nomi server intranet segreti:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Invia e controlla certificati firmati da CA root non standard">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"È una buona idea abilitare questa opzione, a meno che non utilizzi una rete aziendale intrusiva o l'antivirus Kaspersky che monitora la tua navigazione con un proxy TLS e una Certificate Authority root privata. Se viene abilitata in quel caso, questa opzione può pubblicare prove evidenti su quali domini https:// sono stati visitati attraverso quel proxy, a causa di certificati unici che produrrebbe. Per questo la lasciamo disabilitata in partenza.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Controlla i certificati usando Tor per l'anonimato">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Controlla i certificati usando Tor per l'anonimato (richiede Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Questa opzione richiede Tor e Torbutton installati">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Quando trovi un certificato nuovo, comunica all' Osservatorio a quale ISP sei connesso">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Recupera e invia il &quot;numero di Sistema Autonomo&quot; della tua rete. Questo ci aiuterà a localizzare gli attacchi contro HTTPS e a determinare se abbiamo osservazioni provenienti da reti in luoghi come Iran e Siria dove gli attacchi sono relativamente comuni.">
+
+<!ENTITY ssl-observatory.prefs.done "Fatto">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere può usare l' Osservatorio SSL di EFF. Questo fa due cose: (1)
+invia copie dei certificati HTTPS all' Osservatorio per aiutarci ad individuare attacchi 'man in the middle' e migliorare la sicurezza del Web; e (2)
+ci consente di metterti in guardia da connessioni insicure o attacchi al tuo browser.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Ad esempio, quando visiti https://www.qualcosa.com, il certificato
+ricevuto dall' Osservatorio indicherà che qualcuno ha visitato
+www.qualcosa.com, ma non chi ha visitato il sito, o quale particolare pagina
+ha visto. Passa sopra le opzioni con il mouse per maggiori dettagli:">
+
+<!ENTITY ssl-observatory.prefs.hide "Nascondi opzioni avanzate">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Controlla certificati anche se Tor non è disponibile">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Cercheremo comunque di mantenere i dati anonimi, ma questa opzione è meno sicura">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Invia e controlla certificati per nomi DNS non pubblici">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"A meno che questa opzione sia selezionata, l' Osservatorio non registrerà i certificati per nomi che non può risolvere attraverso il sistema DNS.">
+
+<!ENTITY ssl-observatory.prefs.show "Mostra opzioni avanzate">
+
+<!ENTITY ssl-observatory.prefs.title "Preferenze Osservatorio SSL">
+
+<!ENTITY ssl-observatory.prefs.use "Usare l' Osservatorio?">
+<!ENTITY ssl-observatory.warning.title "AVVISO dall' Osservatorio SSL di EFF">
+<!ENTITY ssl-observatory.warning.showcert "Mostra la catena di certificati">
+<!ENTITY ssl-observatory.warning.okay "Capisco">
+<!ENTITY ssl-observatory.warning.text "L' Osservatorio SSL di EFF ha emesso un avviso sul(i) certificato(i) HTTPS di questo sito:">
+<!ENTITY ssl-observatory.warning.defense "Se hai effettuato l'accesso a questo sito, può essere consigliabile cambiare la password appena hai una connessione sicura.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Invia e controlla certificati autofirmati">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Consigliato; problemi di crittografia sono particolarmente comuni in dispositivi embedded autofirmati">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ja/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ja/https-everywhere.dtd
new file mode 100644
index 0000000..724a2bd
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ja/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "HTTPS Everywhereã«ã¤ã„ã¦">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "ã‚¦ã‚§ãƒ–ã®æš—å·åŒ–ï¼è‡ªå‹•çš„ã«å¤šãã®ã‚µã‚¤ãƒˆã«HTTPSセキュリティを使用ã—ã¾ã™ã€‚">
+<!ENTITY https-everywhere.about.version "ãƒãƒ¼ã‚¸ãƒ§ãƒ³">
+<!ENTITY https-everywhere.about.created_by "作æˆè€…:">
+<!ENTITY https-everywhere.about.librarians "ルール設定ライブラリ">
+<!ENTITY https-everywhere.about.thanks "Thanks to">
+<!ENTITY https-everywhere.about.contribute "HTTPS EverywhereãŒå¥½ããªã‚‰ã€æ¤œè¨Žã—ã¦ãã ã•ã„">
+<!ENTITY https-everywhere.about.donate_tor "Torã«å¯„付ã™ã‚‹">
+<!ENTITY https-everywhere.about.tor_lang_code "英語">
+<!ENTITY https-everywhere.about.donate_eff "EFFã«å¯„付ã™ã‚‹">
+
+<!ENTITY https-everywhere.menu.about "HTTPS Everywhereã«ã¤ã„ã¦">
+<!ENTITY https-everywhere.menu.observatory "ssl Observatoryã®è¨­å®š">
+<!ENTITY https-everywhere.menu.globalEnable "HTTPS Everywhereを有効化">
+<!ENTITY https-everywhere.menu.globalDisable "HTTPS Everywhereを無効化">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhereã®è¨­å®š">
+<!ENTITY https-everywhere.prefs.enable_all "å…¨ã¦æœ‰åŠ¹åŒ–">
+<!ENTITY https-everywhere.prefs.disable_all "ã™ã¹ã¦ç„¡åŠ¹åŒ–">
+<!ENTITY https-everywhere.prefs.reset_defaults "デフォルトã«ãƒªã‚»ãƒƒãƒˆ">
+<!ENTITY https-everywhere.prefs.search "検索">
+<!ENTITY https-everywhere.prefs.site "サイト">
+<!ENTITY https-everywhere.prefs.notes "履歴">
+<!ENTITY https-everywhere.prefs.list_caption "ã©ã®HTTPSリダイレクトスールをé©ç”¨ã—ã¾ã™ã‹ï¼Ÿ">
+<!ENTITY https-everywhere.prefs.enabled "有効">
+<!ENTITY https-everywhere.prefs.ruleset_howto "自分ã®ãƒ«ãƒ¼ãƒ«è¨­å®šã®æ›¸ã方を学ã¹ã¾ã™ (ä»–ã®ã‚¦ã‚§ãƒ–サイトã¸ã®ã‚µãƒãƒ¼ãƒˆã‚’追加)">
+<!ENTITY https-everywhere.prefs.here_link "ã“ã“">
+<!ENTITY https-everywhere.prefs.toggle "切り替ãˆ">
+<!ENTITY https-everywhere.prefs.reset_default "デフォルトã«ãƒªã‚»ãƒƒãƒˆ">
+<!ENTITY https-everywhere.prefs.view_xml_source "XMLソースを表示">
+
+<!ENTITY https-everywhere.source.downloading "ダウンロード中">
+<!ENTITY https-everywhere.source.filename "ファイルå">
+<!ENTITY https-everywhere.source.unable_to_download "ソースをダウンロード出æ¥ã¾ã›ã‚“。">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ja/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ja/https-everywhere.properties
new file mode 100644
index 0000000..2135ddd
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ja/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = HTTPS Everywhereを有効化
+https-everywhere.menu.globalDisable = HTTPS Everywhereを無効化
+https-everywhere.menu.enableDisable = ルールを有効化/無効化
+https-everywhere.menu.noRules = (ã“ã®ãƒšãƒ¼ã‚¸ã«ãƒ«ãƒ¼ãƒ«ã¯ã‚りã¾ã›ã‚“)
+https-everywhere.menu.unknownRules = (ã“ã®ãƒšãƒ¼ã‚¸ã®ãƒ«ãƒ¼ãƒ«ã¯ä¸æ˜Ž)
+https-everywhere.toolbar.hint = HTTPS Everywhereã¯ã’ã‚“ã–ã„æœ‰åйã§ã™ã€‚アドレスãƒãƒ¼ã®ã‚¢ã‚¤ã‚³ãƒ³ã‚’クリックã™ã‚‹ã¨ã‚µã‚¤ãƒˆã”ã¨ã‚’基本ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ja/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ja/ssl-observatory.dtd
new file mode 100644
index 0000000..d9be24f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ja/ssl-observatory.dtd
@@ -0,0 +1,94 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "詳細ã¨ãƒ—ライãƒã‚·ãƒ¼æƒ…å ±">
+<!ENTITY ssl-observatory.popup.later "後ã§é€šçŸ¥ã™ã‚‹">
+<!ENTITY ssl-observatory.popup.no "ã„ã„ãˆ">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhereã¯Observatoryã«å—ã‘å–る証明書をé€ä¿¡ã™ã‚‹ã“ã¨ã§ã€ã‚ãªãŸã®ãƒ–ラウザã«å¯¾ã™ã‚‹æ”»æ’ƒã‚’検知ã§ãã¾ã™ã€‚ã“れを有効ã«ã—ã¾ã™ã‹ï¼Ÿ">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"HTTPS Everywhereã¯SSL Observatoryを使用ã™ã‚‹ã¹ãã§ã™ã‹ï¼Ÿ">
+
+<!ENTITY ssl-observatory.popup.yes "ã¯ã„">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"éžå¸¸ã«é‘‘賞ã•ã‚Œã‚‹ä¼æ¥­ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’使用ã—ã¦ã„ãªã‘れã°ã€ã“れを有効ã«ã™ã‚‹æ–¹ãŒå®‰å…¨ã§ã™:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"次ã®ç§˜å¯†ã‚¤ãƒ³ãƒˆãƒ©ãƒãƒƒãƒˆã®ã‚µãƒ¼ãƒãƒ¼åã§ä¼æ¥­ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’使用ã—ãªã‘れã°ã€å®‰å…¨ã§ã™:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"éžæ¨™æº–ã®ãƒ«ãƒ¼ãƒˆCAã«ã‚ˆã£ã¦ç½²åã•れãŸè¨¼æ˜Žæ›¸ã‚’確èªã—ã¦æƒ…å ±æä¾›ã™ã‚‹ã€‚">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"干渉ã•ã‚Œã‚‹ä¼æ¥­ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚„ã€TLSプロキシã¨ãƒ—ライベートルートèªè¨¼å±€ã§ã‚ãªãŸã®ãƒ–ラウジングをモニターã—ã¦ã„ã‚‹Kasperskyアンãƒã‚¦ã‚¤ãƒ«ã‚¹ã‚½ãƒ•トウェアを使用ã—ã¦ã„ãªã‘れã°ã€ã“ã®ã‚ªãƒ—ションを有効ã«ã™ã‚‹ã“ã¨ã¯å®‰å…¨ã§ã™ (ãã—ã¦ã€è‰¯ã„アイディアã§ã™)。ãã®ã‚ˆã†ãªãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã§æœ‰åйã«ã—ãŸå ´åˆã€ã“ã®ã‚ªãƒ—ションã¯ã€ãれãŒç™ºè¡Œã™ã‚‹ä¸€æ„ãªè¨¼æ˜Žæ›¸ã®ãŸã‚ã«ã€ã©ã‚“ãªhttps:// domainsãŒãã®ãƒ—ロキシを通ã˜ã¦è¨ªã‚Œã‚‰ã‚ŒãŸã‹ã®è¨¼æ‹ ã‚’æä¾›ã—ã¦ã—ã¾ã†æã‚ŒãŒã‚りã¾ã™ã€‚ãã®ãŸã‚ã«ã€ç§ãŸã¡ã¯ãƒ‡ãƒ•ォルトã§ã¯ãれをオフã«ã—ã¦ã„ã¾ã™ã€‚">
+
+<!ENTITY ssl-observatory.prefs.anonymous "åŒ¿åæ€§ã®ãŸã‚ã«è¨¼æ˜Žæ›¸ã®ãƒã‚§ãƒƒã‚¯ã«Torを使ã†ã€‚">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"åŒ¿åæ€§ã®ãŸã‚ã«è¨¼æ˜Žæ›¸ã®ãƒã‚§ãƒƒã‚¯ã«Torを使ㆠ(TorãŒå¿…è¦)。">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"ã“ã®ã‚ªãƒ—ションã¯TorãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã€å‹•作ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚">
+
+<!ENTITY ssl-observatory.prefs.asn
+"æ–°ã—ã„証明書を確èªã—ãŸã¨ãã€Observatoryã«ã‚ãªãŸãŒã©ã®ISPã«æŽ¥ç¶šã—ã¦ã„ã‚‹ã®ã‹ä¼ãˆã‚‹">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"ã“れã¯ã‚ãªãŸã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ã€Œè‡ªå¾‹ã‚·ã‚¹ãƒ†ãƒ ç•ªå·ã€ã‚’åŽé›†ã—ã€é€ä¿¡ã—ã¾ã™ã€‚ã“れã¯ç§ãŸã¡ãŒHTTPSã«å¯¾ã™ã‚‹æ”»æ’ƒã‚’検出ã—ã™ã‚‹ã®ã‚’支æ´ã—ã¾ã™ã€‚ã¾ãŸã€ç§ãŸã¡ãŒæ”»æ’ƒãŒæ¯”較的一般的ã§ã‚るイランやシリアã®ã‚ˆã†ãªå ´æ‰€ã§ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«è¦³æ¸¬æ‰€ã‚’æŒã£ã¦ã„ã‚‹ã®ã‹ç¢ºèªã™ã‚‹ã®ã«å½¹ç«‹ã¡ã¾ã™ã€‚">
+
+<!ENTITY ssl-observatory.prefs.done "完了">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhereã¯EFFã®SSL Observatoryを使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れã¯ï¼’ã¤ã®åƒãã‚’ã—ã¾ã™: (1)
+ç§ãŸã¡ãŒä¸­é–“者攻撃を検出ã—ã€ã‚¦ã‚§ãƒ–セキュリティをå‘上ã•ã›ã‚‹ã®ã‚’支æ´ã™ã‚‹ãŸã‚ã«ã€HTTP証明書ã®ã‚³ãƒ”ーを観測所ã«é€ä¿¡ã—ã¾ã™ã€‚
+ãã—ã¦ã€(2)
+ç§ãŸã¡ãŒå®‰å…¨ã§ãªã„接続やブラウザã¸ã®æ”»æ’ƒã‚’警告ã§ãるよã†ã«ã—ã¾ã™ã€‚">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"例ãˆã°ã€https://www.something.com を訪れるã¨ãã€è¦³æ¸¬æ‰€ãŒå—ä¿¡ã—ãŸè¨¼æ˜Žæ›¸ã¯èª°ã‹ãŒwww.something.comを訪れãŸã“ã¨ã‚’示ã—ã¾ã™ãŒã€èª°ãŒã“ã®ã‚µã‚¤ãƒˆã‚’訪れãŸã®ã‹ã€ã©ã®ç‰¹å®šã®ãƒšãƒ¼ã‚¸ã‚’見ã¦ã„ãŸã®ã‹ã¯ç¤ºã•れã¾ã›ã‚“。詳細ã¯ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã—ã¦ãã ã•ã„:">
+
+<!ENTITY ssl-observatory.prefs.hide "高度ãªè¨­å®šã‚’éš ã™">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"TorãŒåˆ©ç”¨ã§ããªã„å ´åˆã§ã‚‚証明書をãƒã‚§ãƒƒã‚¯ã™ã‚‹">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"ç§ãŸã¡ã¯ä»Šã¾ã§é€šã‚Šãƒ‡ãƒ¼ã‚¿ã‚’匿åã«ä¿ã¨ã†ã¨ã™ã‚‹ã§ã—ょã†ãŒã€ã“ã®ã‚ªãƒ—ションã¯å®‰å…¨æ€§ã‚’低下ã•ã›ã¾ã™">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"éžå…¬é–‹DNSåã®è¨¼æ˜Žæ›¸ã‚’確èªã—ã¦æä¾›ã™ã‚‹">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"ã“ã®ã‚ªãƒ—ションãŒãƒã‚§ãƒƒã‚¯ã•れã¦ã„ãªã„å ´åˆã€Observatoryã¯DNSシステムを通ã—ã¦è§£æ±ºã§ããªã„åå‰ã¸ã®è¨¼æ˜Žæ›¸ã‚’記録ã—ã¾ã›ã‚“。">
+
+<!ENTITY ssl-observatory.prefs.show "高度ãªè¨­å®šã‚’表示ã™ã‚‹">
+
+<!ENTITY ssl-observatory.prefs.title "ssl Observatoryã®è¨­å®š">
+
+<!ENTITY ssl-observatory.prefs.use "Observatoryを使用ã—ã¾ã™ã‹?">
+<!ENTITY ssl-observatory.warning.title "EFFã®SSL Observatoryã‹ã‚‰è­¦å‘Š">
+<!ENTITY ssl-observatory.warning.showcert "証明書ã®ãƒã‚§ãƒ¼ãƒ³ã‚’表示">
+<!ENTITY ssl-observatory.warning.okay "了解ã—ã¾ã™">
+<!ENTITY ssl-observatory.warning.text "EFFã®SSL Observatoryã¯ã“ã®ã‚µã‚¤ãƒˆã¸ã®HTTPS証明書ã«ã¤ã„ã¦ã®è­¦å‘Šã‚’出ã—ã¾ã—ãŸã€‚()">
+<!ENTITY ssl-observatory.warning.defense "ã“ã®ã‚µã‚¤ãƒˆã«ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã„ã‚‹å ´åˆã€ä¸€åº¦å®‰å…¨ãªæŽ¥ç¶šã‚’確ä¿ã—ã¦ã‹ã‚‰ãƒ‘スワードを変更ã™ã‚‹ã®ãŒè³¢æ˜Žã‹ã‚‚ã—れã¾ã›ã‚“。">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"自己署åã®è¨¼æ˜Žæ›¸ã‚’確èªã—ã¦æä¾›ã™ã‚‹">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"ã“ã‚Œã¯æŽ¨å¥¨ã•れã¾ã™ã€‚æš—å·åŒ–ã®å•題ã¯ã€è‡ªå·±ç½²åã•れãŸçµ„ã¿è¾¼ã¿ãƒ‡ãƒã‚¤ã‚¹ã§ç‰¹ã«ä¸€èˆ¬çš„ã§ã™ã€‚">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ko/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ko/https-everywhere.dtd
new file mode 100644
index 0000000..93d22f4
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ko/https-everywhere.dtd
@@ -0,0 +1,49 @@
+<!ENTITY https-everywhere.about.title "HTTPS Everywhereì— ëŒ€í•˜ì—¬
+">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "웹 암호화! ìžë™ìœ¼ë¡œ 여러 사ì´íŠ¸ì— HTTPS ë³´ì•ˆì„ ì‚¬ìš©í•©ë‹ˆë‹¤.">
+<!ENTITY https-everywhere.about.version "Version">
+<!ENTITY https-everywhere.about.created_by "작성">
+<!ENTITY https-everywhere.about.librarians "규칙설정 ë¼ì´ë¸ŒëŸ¬ë¦¬">
+<!ENTITY https-everywhere.about.thanks "Thanks to">
+<!ENTITY https-everywhere.about.contribute "모든곳ì—서 HTTPS를 사용하려면, 고려해 보십시오">
+<!ENTITY https-everywhere.about.donate_tor "Torì— ê¸°ë¶€í•˜ê¸°">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "EFFì— ê¸°ë¶€í•˜ê¸°">
+
+<!ENTITY https-everywhere.menu.about "HTTPS Everywhereì— ëŒ€í•˜ì—¬">
+<!ENTITY https-everywhere.menu.observatory "SSL 관측 환경 설정">
+<!ENTITY https-everywhere.menu.globalEnable "모든곳ì—서 HTTPS 사용">
+<!ENTITY https-everywhere.menu.globalDisable "모든곳ì—서 HTTPS 사용 안 함">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS 모든곳 사용 환경 설정">
+<!ENTITY https-everywhere.prefs.enable_all "ëª¨ë‘ ì‚¬ìš©">
+<!ENTITY https-everywhere.prefs.disable_all "ëª¨ë‘ ì‚¬ìš© 안 함">
+<!ENTITY https-everywhere.prefs.reset_defaults "기본값으로 다시 설정">
+<!ENTITY https-everywhere.prefs.search "검색">
+<!ENTITY https-everywhere.prefs.site "사ì´íЏ">
+<!ENTITY https-everywhere.prefs.notes "참고">
+<!ENTITY https-everywhere.prefs.list_caption "HTTPS 리디렉션 ê·œì¹™ì„ ì ìš©í•˜ì‹œê²ŸìŠµë‹ˆê¹Œ?">
+<!ENTITY https-everywhere.prefs.enabled "사용">
+<!ENTITY https-everywhere.prefs.ruleset_howto "ìžì‹ ì˜ 규칙 작성 ë°©ë²•ì„ ë°°ìš¸ 수 있습니다 (다른 웹 사ì´íŠ¸ì— ëŒ€í•œ ì§€ì› ì¶”ê°€)">
+<!ENTITY https-everywhere.prefs.here_link "여기">
+<!ENTITY https-everywhere.prefs.toggle "전환">
+<!ENTITY https-everywhere.prefs.reset_default "기본값으로 다시 설정">
+<!ENTITY https-everywhere.prefs.view_xml_source "XML 소스 보기">
+
+<!ENTITY https-everywhere.source.downloading "다운로드">
+<!ENTITY https-everywhere.source.filename "파ì¼ëª…">
+<!ENTITY https-everywhere.source.unable_to_download "소스를 다운로드할 수 없습니다.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ko/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ko/https-everywhere.properties
new file mode 100644
index 0000000..110e0b8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ko/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = 모든 ê³³ì—서 HTTPS 사용
+https-everywhere.menu.globalDisable = 모든 ê³³ì—서 HTTPS 사용 안 함
+https-everywhere.menu.enableDisable = 규칙 활성화 / 비활성화
+https-everywhere.menu.noRules = (ì´ íŽ˜ì´ì§€ë¥¼ 위한 규칙 ì—†ìŒ)
+https-everywhere.menu.unknownRules = (알 수 없는 ì´ íŽ˜ì´ì§€ë¥¼ 위한 규칙)
+https-everywhere.toolbar.hint = HTTPS Everywhere is now active. You can toggle it on a site-by-site basis by clicking the icon in the address bar.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ko/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ko/ssl-observatory.dtd
new file mode 100644
index 0000000..83deb59
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ko/ssl-observatory.dtd
@@ -0,0 +1,92 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "세부 사항과 사ìƒí™œ ì •ë³´">
+<!ENTITY ssl-observatory.popup.later "ë‚˜ì¤‘ì— ì•Œë¦¼">
+<!ENTITY ssl-observatory.popup.no "아니ë„">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"HTTPS Everywhereì´ SSL 관측소를 사용해야 합니까?">
+
+<!ENTITY ssl-observatory.popup.yes "예">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"매우 방해하는 기업 네트워í¬ë¥¼ 사용중ì´ì§€ 않으면, ì´ê²ƒì„ 사용하는 ê²ƒì´ ì•ˆì „ì••ë‹ˆë‹¤.">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"ë‹¤ìŒ ë¹„ë°€ 서버 ì´ë¦„ê³¼ 기업 네트워í¬ë¥¼ 사용하지 않는다면, 안전합니다.">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"비표준 루트 CA로부터 서명ë˜ì§€ ì•Šì€ ì¸ì¦ì„œë¥¼ 확ì¸í•˜ê³  제보함.">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"ê°œì¸ ë£¨íŠ¸ ì¸ì¦ì„œ 권한과 ë¶€ë¼ìš°ì§•ì„ ëª¨ë‹ˆí„°í•˜ëŠ” 방해하는 기업 네트워í¬ë‚˜ TLS 프ë¡ì‹œì™€ 카스í¼ìŠ¤í‚¤ 안티바ì´ëŸ¬ìŠ¤ë¥¼ 사용하지 않는다면, ì´ ì˜µì…˜ì„ í™œì„±í™”í•˜ëŠ” ê²ƒì€ ì•ˆì „í•©ë‹ˆë‹¤(그리고 ì¢‹ì€ ìƒê°ìž…니다). ê·¸ 네트워í¬ì—서 활성화ëœë‹¤ë©´, ì´ ì˜µì…˜ì€ ì œê³µë˜ì–´ì ¸ì•¼í•˜ëŠ” 드문 ì¸ì¦ì„œ ë•Œë¬¸ì— https:// ë„ë©”ì¸ì„ ê·¸ 프ë¡ì‹œë¥¼ 통해 방문한 ì¦ê±°ë¥¼ 알릴 것입니다. 그래서 우리는 기본값으로 ë‘는 ê²ƒì„ ì¶”ì²œí•©ë‹ˆë‹¤.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "ìµëª…ì„ ìœ„í•´ Tor를 사용하는 ë™ì•ˆ ì¸ì¦ì„œ 확ì¸">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"ìµëª…ì„ ìœ„í•´ Tor를 사용하는 ë™ì•ˆ ì¸ì¦ì„œ í™•ì¸ (Torcheck 권장)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"ì´ ì˜µì…˜ì€ Tor와 Torbuttonì´ ì„¤ì¹˜ëœ ê²½ìš° 권장ë©ë‹ˆë‹¤.">
+
+<!ENTITY ssl-observatory.prefs.asn
+"새로운 ì¸ì¦ì„œë¥¼ ë³¼ 때, ì–´ë–¤ ISPì— ì—°ê²°ë˜ì–´ 있는지 ê´€ì¸¡ì†Œì— ë§í•˜ì‹­ì‹œì˜¤.">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"ì´ê²ƒì€ ê·€í•˜ì˜ ë„¤íŠ¸ì›Œí¬ì˜ &quot;ìžìœ¨ 시스템 번호&quot;를 수집하고 전송할 것입니다. ì´ê²ƒì€ 우리가 HTTPSì— ëŒ€í•­í•˜ëŠ” ê³µê²©ì„ ì°¾ëŠ” ê²ƒì— ëŒ€í•´ ë„ì›€ì„ ì¤„ 것입니다. 그리고 우리는 ê³µê²©ì´ ë¹„êµì  ì¼ë°˜ì ì¸ ì´ëž€ê³¼ 시리아와 ê°™ì€ ìž¥ì†Œì—서 네트워í¬ì—서 관측소를 가지고 ìžˆëŠ”ì§€ì— ëŒ€í•œ 여부를 확ì¸í•˜ëŠ” ë° ë„ì›€ì´ ë  ê²ƒìž…ë‹ˆë‹¤.">
+
+<!ENTITY ssl-observatory.prefs.done "완료">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhereì€ EFFì˜ SSL 관측소를 사용할 수 있습니다. ì´ê²ƒì€ ë‘ ê°€ì§€ ì¼ì„ 합니다: (1)
+ì¤‘ê°„ìž ê³µê²©ì„ ê°ì§€í•˜ê³  ì›¹ì˜ ë³´ì•ˆì„ í–¥ìƒì‹œí‚¤ëŠ” ê²ƒì„ ë•기 위해, HTTPS ì¸ì¦ì„œì˜ ë³µì‚¬ë³¸ì„ SSL 관측소로 보냅니다. 그리고 (2) 우리가 귀하ì—게 보안ì ì´ì§€ 않는 ì—°ê²°ì´ë‚˜ 브ë¼ìš°ì €ì— 대한 ê³µê²©ì— ëŒ€í•´ 경고하ë„ë¡ í•©ë‹ˆë‹¤.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"예를 들어, https://www.something.comì„ ë°©ë¬¸í•  때, 관측소ì—서 ë°›ì€ ì¸ì¦ì„œëŠ” 누가 사ì´íŠ¸ë¥¼ 방문했는지가 아닌, 누가 www.something.comì„ ë°©ë¬¸í–ˆê±°ë‚˜, ê·¸ë“¤ì´ ë³¸ 특정한 페ì´ì§€ 키를 표시할 것입니다. ë” ë§Žì€ ì„¸ë¶€ì‚¬í•­ì„ ìœ„í•´ ì˜µì…˜ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤.">
+
+<!ENTITY ssl-observatory.prefs.hide "고급 설정 숨기기">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Torê°€ 가능하지 않ë”ë¼ë„ ì¸ì¦ì„œ 확ì¸">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"우리는 ê³„ì† ë°ì´í„°ë¥¼ ìµëª…으로 보내겠지만, ì´ ì„ íƒì€ ëœ ë³´ì•ˆì ìž…니다.">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"non-public DNS ì´ë¦„ì„ ìœ„í•œ ì¸ì¦ì„œ 확ì¸ê³¼ 제출">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"ì´ ì˜µì…˜ì´ ì„ íƒë˜ì§€ 않는다면, 관측소는 DNS ì‹œìŠ¤í…œì„ í†µí•´ ë¶„ì„ë  ìˆ˜ 없는 ì¸ì¦ì„œë¥¼ 기ë¡í•˜ì§€ ì•Šì„ ê²ƒìž…ë‹ˆë‹¤.">
+
+<!ENTITY ssl-observatory.prefs.show "고급 설정 ë³´ì´ê¸°">
+
+<!ENTITY ssl-observatory.prefs.title "SSL 관측소 설정">
+
+<!ENTITY ssl-observatory.prefs.use "관측소 사용?">
+<!ENTITY ssl-observatory.warning.title "EFFì˜ SSL ê´€ì¸¡ì†Œë¡œë¶€í„°ì˜ ê²½ê³ ">
+<!ENTITY ssl-observatory.warning.showcert "ì¸ì¦ì„œ ì²´ì¸ ë³´ì´ê¸°">
+<!ENTITY ssl-observatory.warning.okay "ì´í•´í–ˆìŠµë‹ˆë‹¤.">
+<!ENTITY ssl-observatory.warning.text "EFFì˜ SSL 관측소가 ë‹¤ìŒ ì‚¬ì´íŠ¸ë¥¼ 위한 HTTPS ì¸ì¦ì„œì— 대한 경고를 보내왔습니다.">
+<!ENTITY ssl-observatory.warning.defense "만약 ì´ ì‚¬ì´íŠ¸ì— ë¡œê·¸ì¸ë˜ì–´ 있다면, 안전한 ì—°ê²°ì— ì¼ë‹¨ 연결한 ë’¤, 비밀번호를 바꾸는 ê²ƒì´ ê¶Œìž¥ë©ë‹ˆë‹¤.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"ìžì‹ -서명 ì¸ì¦ì„œ í™•ì¸ ë° ì œë³´">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"ì´ê²ƒì€ 추천ë©ë‹ˆë‹¤: 암호화 문제는 ìžê¸° ì„œëª…ëœ ìž„ë² ë””ë“œ 장치ì—서 특히 ì¼ë°˜ì ìž…니다.">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lt/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lt/https-everywhere.dtd
new file mode 100644
index 0000000..e249494
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lt/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Apie HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Šifruokite žiniatinklį! Automatiškai naudokite HTTPS apsaugą daugelyje svetainių.">
+<!ENTITY https-everywhere.about.version "Versija">
+<!ENTITY https-everywhere.about.created_by "Sukūrė">
+<!ENTITY https-everywhere.about.librarians "Taisyklių bibliotekininkai">
+<!ENTITY https-everywhere.about.thanks "DÄ—kojame">
+<!ENTITY https-everywhere.about.contribute "Jei Jums patinka HTTPS Everywhere, galbūt norėsite">
+<!ENTITY https-everywhere.about.donate_tor "Paaukoti Tor projektui">
+<!ENTITY https-everywhere.about.tor_lang_code "lt">
+<!ENTITY https-everywhere.about.donate_eff "Paaukoti EFF">
+
+<!ENTITY https-everywhere.menu.about "Apie HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL Observatorijos nustatymai">
+<!ENTITY https-everywhere.menu.globalEnable "Įgalinti HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Išjungti HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere nustatymai">
+<!ENTITY https-everywhere.prefs.enable_all "Įgalinti visas">
+<!ENTITY https-everywhere.prefs.disable_all "Uždrausti visas">
+<!ENTITY https-everywhere.prefs.reset_defaults "Atstatyti numatytas">
+<!ENTITY https-everywhere.prefs.search "Ieškoti">
+<!ENTITY https-everywhere.prefs.site "Tinklapis">
+<!ENTITY https-everywhere.prefs.notes "Pastabos">
+<!ENTITY https-everywhere.prefs.list_caption "Kurias HTTPS nukreipimo taisykles naudoti?">
+<!ENTITY https-everywhere.prefs.enabled "Įgalinta">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Galite sužinoti, kaip patiems rašyti nukreipimo taisykles (kad pridėtumėte kitų svetainių palaikymą)">
+<!ENTITY https-everywhere.prefs.here_link "Äia">
+<!ENTITY https-everywhere.prefs.toggle "Perjungti">
+<!ENTITY https-everywhere.prefs.reset_default "Atstatyti numatytÄ…">
+<!ENTITY https-everywhere.prefs.view_xml_source "Žiūrėti XML šaltinį">
+
+<!ENTITY https-everywhere.source.downloading "AtsisiunÄiama">
+<!ENTITY https-everywhere.source.filename "Failo pavadinimas">
+<!ENTITY https-everywhere.source.unable_to_download "Nepavyko atsisiųsti šaltinio">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lt/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lt/https-everywhere.properties
new file mode 100644
index 0000000..00fdde9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lt/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = \u012ejungti HTTPS Everywhere
+https-everywhere.menu.globalDisable = I\u0161jungti HTTPS Everywhere
+https-everywhere.menu.enableDisable = Ijungti/i\u0161jungti taisykles
+https-everywhere.menu.noRules = (\u0160iam puslapiui taisykli\u0173 n\u0117ra)
+https-everywhere.menu.unknownRules = (\u0160io puslapio taisykl\u0117s ne\u017einomos)
+https-everywhere.toolbar.hint = HTTPS Everywhere aktyvuotas. Galite \u012fjungti/i\u0161jungti j\u012f konkre\u010dioje svetain\u0117je spausdami \u017eenkliuk\u0105 adresyno juostoje.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lt/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lt/ssl-observatory.dtd
new file mode 100644
index 0000000..f17e52c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lt/ssl-observatory.dtd
@@ -0,0 +1,100 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "DetalÄ—s ir informacija apie privatumÄ…">
+<!ENTITY ssl-observatory.popup.later "Klausti vÄ—liau">
+<!ENTITY ssl-observatory.popup.no "Ne">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere gali aptikti atakas
+nukreiptas prieš jūsų naršyklę, siųsdama gautus sertifikatus į SSL
+Observatoriją. Ar įjungti?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Ar HTTPS Everywhere turėtų naudoti SSL Observatoriją?">
+
+<!ENTITY ssl-observatory.popup.yes "Taip">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Įjungti yra saugu, nebent naudojate labai ribojamą
+korporatyvinį tinklą:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Saugu, nebent naudojate korporatyvinį tinklą su slaptais vidinio tinklo serverių pavadinimais:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Siųsti ir tikrinti sertifikatus, pasirašytus nestandartinių sertifikavimo centrų">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Ä®jungti Å¡iÄ… parinktį yra saugu (ir gera mintis), nebent naudojate ribojamÄ… korporatyvinį tinklÄ…, kuris stebi jÅ«sų narÅ¡ymÄ… su TLS įgaliotuoju serveriu ir privaÄiu sertifikavimo centru. Jei įjungsite tokiame tinkle, Å¡i parinktis gali palikti informacijos apie tai, kurios https:// svetainÄ—s buvo aplankytos naudojant šį įgaliotÄ…jį serverį, nes bus naudojami unikalÅ«s sertifikatai. TodÄ—l pagal nutylÄ—jimÄ… tai iÅ¡jungiame.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Tikrinti sertifikatus naudojant Tor tinklą anonimiškumui">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Tikrinti sertifikatus naudojant Tor tinklą anonimiškumui (reikalauja Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Ši parinktis reikalauja, kad būtų įdiegti Tor ir Torbutton">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Sutikus naują sertifikatą pranešti Observatorijai, prie kokio interneto paslaugų tiekėjo esate prisijungę">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Gaus ir išsiųs jūsų tinklo &quot;autonominį sistemos numerį&quot;. Tai padės mums aptikti atakas nukreiptas prieš HTTPS ir nustatyti, ar mes turime duomenų apie tinklus iš tokių vietų kaip Iranas ar Sirija, kur atakos yra gana dažnos.">
+
+<!ENTITY ssl-observatory.prefs.done "Atlikta">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere gali naudoti EFF SSL ObservatorijÄ…. Ji atlieka du dalykus: (1)
+siunÄia HTTPS sertifikatų kopijas į ObservatorijÄ…, kad padÄ—tų mums
+aptikti 'žmogaus viduryje' atakas ir pagerinti žiniatinkio saugumą; ir (2)
+leidžia mums įspėti jus apie nesaugius prisijungimus ar atakas nukreiptas prieš jūsų naršyklę.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Pavyzdžiui, kai aplankote https://www.kazkas.com, Observatorijos
+gautas sertifikatas rodys, kad kažkas aplankė www.kazkas.com,
+bet ne tai, kas aplankÄ— svetainÄ™, ar kokį konkreÄiai puslapį jie
+žiÅ«rÄ—jo. IÅ¡samesniai informacijai, užveskite pelÄ—s žymeklį virÅ¡ parinkÄių:">
+
+<!ENTITY ssl-observatory.prefs.hide "Slėpti išsamesnius nustatymus">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Tikrinti sertifikatus net jei Tor nepasiekiamas">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Mes vis vien bandysime išlaikyti duomenis anonimiškus, bet ši parinktis yra mažiau saugi">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Siųsti ir tikrinti sertifikatus gautus iš neviešų DNS vardų">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Jei ši parinktis išjungta, Observatorija neįrašinės tų sertifikatų, kurių vardų nepavyksta gauti per DNS sistemą.">
+
+<!ENTITY ssl-observatory.prefs.show "Rodyti išsamesnius nustatymus">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Observatorijos nustatymai">
+
+<!ENTITY ssl-observatory.prefs.use "Naudoti ObservatorijÄ…?">
+<!ENTITY ssl-observatory.warning.title "ĮSPĖJIMAS iš EFF SSL Observatorijos">
+<!ENTITY ssl-observatory.warning.showcert "Rodyti sertifikatų grandinę">
+<!ENTITY ssl-observatory.warning.okay "Suprantu">
+<!ENTITY ssl-observatory.warning.text "EFF SSL Observatorija įspėja apie šių svetainių HTTPS sertifikatus:">
+<!ENTITY ssl-observatory.warning.defense "Jei esate prisiregistravę prie šios svetainės, patartina pasikeisti slaptažodį, kai turėsite saugų ryšį.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Teikti ir tikrinti savo paties pasirašytus sertifikatus">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Rekomenduojama. Kriptografijos problemos ypaÄ dažnos savo paties pasiraÅ¡ytuose įmontuotuosiuose įtaisuose">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lv/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lv/https-everywhere.dtd
new file mode 100644
index 0000000..c7659af
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lv/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Par HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Å ifrÄ“t tÄ«mekli! AutomÄtiski lietot HTTPS drošību daudzÄs vietnÄ“s.">
+<!ENTITY https-everywhere.about.version "Versija">
+<!ENTITY https-everywhere.about.created_by "Autori">
+<!ENTITY https-everywhere.about.librarians "Ruleset Librarians">
+<!ENTITY https-everywhere.about.thanks "Pateicoties">
+<!ENTITY https-everywhere.about.contribute "ja Jums patīk HTTPS Everywhere, iespējams vēlaties">
+<!ENTITY https-everywhere.about.donate_tor "ziedot Tor'am">
+<!ENTITY https-everywhere.about.tor_lang_code "an">
+<!ENTITY https-everywhere.about.donate_eff "ziedot EFF'am">
+
+<!ENTITY https-everywhere.menu.about "Par HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL Observatory preferences">
+<!ENTITY https-everywhere.menu.globalEnable "Iespējot HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Atspējot HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere preferences">
+<!ENTITY https-everywhere.prefs.enable_all "Iespējot visus">
+<!ENTITY https-everywhere.prefs.disable_all "Atspējot visus">
+<!ENTITY https-everywhere.prefs.reset_defaults "AtiestatÄ«t uz noklusÄ“juma vÄ“rtÄ«bÄm">
+<!ENTITY https-everywhere.prefs.search "Meklēt">
+<!ENTITY https-everywhere.prefs.site "Vietne">
+<!ENTITY https-everywhere.prefs.notes "Piezīmes">
+<!ENTITY https-everywhere.prefs.list_caption "Kurus HTTPS pÄradresÄcijas noteikumus lietot?">
+<!ENTITY https-everywhere.prefs.enabled "Iespējots">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Variet iemÄcÄ«ties kÄ rakstÄ«t savus noteikumu komplektus (lai pievienotu citu tÄ«mekļa vietņu atbalstu)">
+<!ENTITY https-everywhere.prefs.here_link "te">
+<!ENTITY https-everywhere.prefs.toggle "PÄrslÄ“gt">
+<!ENTITY https-everywhere.prefs.reset_default "AtiestatÄ«t uz noklusÄ“juma vÄ“rtÄ«bÄm">
+<!ENTITY https-everywhere.prefs.view_xml_source "Skatīt XML avotu">
+
+<!ENTITY https-everywhere.source.downloading "LejupielÄdÄ“">
+<!ENTITY https-everywhere.source.filename "Datnes_nosaukums">
+<!ENTITY https-everywhere.source.unable_to_download "Nevar lejupielÄdÄ“t avotu.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 paziņojums">
+<!ENTITY https-everywhere.popup.paragraph1 "OpÄ! JÅ«s lietojÄt stabilu HTTPS Everywhere versiju, bet, iespÄ“jams, mÅ«su jaunÄkajÄ laidienÄ mÄ“s nejauÅ¡i jauninÄjÄm JÅ«su lÄ«dzÅ¡inÄ“jo versiju ar izstrÄdÄtÄju versiju.">
+<!ENTITY https-everywhere.popup.paragraph2 "Vai vÄ“laties atgriezties pie stabilÄs versijas?">
+<!ENTITY https-everywhere.popup.paragraph3 "MÄ“s ļoti priecÄtos, ja JÅ«s turpinÄtu lietot izstrÄdÄtÄju versiju un palÄ«dzÄ“tu padarÄ«t HTTPS Everywhere labÄku! IespÄ“jams, ka laiku pa laikam pamanÄ«sit kÄdas kļūdas, par kurÄm varat ziņot rakstot angļu valodÄ https-everywhere@eff.org . Atvainojamies par sagÄdÄtajÄm neÄ“rtÄ«bÄm un pateicamies par to, ka lietojat HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "IzvÄ“los strÄdÄt ar izstrÄdÄtÄja versiju">
+<!ENTITY https-everywhere.popup.revert "LejuplÄdÄ“t jaunÄko stabilo versiju">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lv/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lv/https-everywhere.properties
new file mode 100644
index 0000000..aeef29d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lv/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Iespējot HTTPS visur
+https-everywhere.menu.globalDisable = Izslēgt HTTPS visur
+https-everywhere.menu.enableDisable = IespÄ“jot / IzslÄ“gt kÄrtulas
+https-everywhere.menu.noRules = (Å ai lapai kÄrtulu nav)
+https-everywhere.menu.unknownRules = (šīs lapas kÄrtulas nav zinÄmas)
+https-everywhere.toolbar.hint = HTTPS Everywhere tagad ir aktÄ«vs. Klikšķinot ikonu adreses joslÄ, JÅ«s varat to pÄrslÄ“gt ikvienÄ vietnÄ“.
+https-everywhere.migration.notification0 = Lai ieviestu kritisku labojumu, Å¡is jauninÄjums atiestata JÅ«su HTTPS visur kÄrtulu preferences uz to noklusÄ“juma vÄ“rtÄ«bÄm.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lv/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lv/ssl-observatory.dtd
new file mode 100644
index 0000000..a0e33e3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/lv/ssl-observatory.dtd
@@ -0,0 +1,99 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Papildu informÄcija un privÄtums">
+<!ENTITY ssl-observatory.popup.later "JautÄt man vÄ“lÄk">
+<!ENTITY ssl-observatory.popup.no "NÄ“">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS visur var atklÄt uzbrukumus JÅ«su pÄrlÅ«kam, nosÅ«tot uz Observatory sertifikÄtus, kurus saņemat.
+Ieslēgt šo funkciju?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Vai HTTPS visur jÄizmanto SSL Observatory?">
+
+<!ENTITY ssl-observatory.popup.yes "JÄ">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Iespējot ir droši, ja vien neizmantojat
+ļoti traucÄ“joÅ¡u jeb uzmÄcÄ«gu korporatÄ«vo tÄ«klu:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"DroÅ¡i, ja vien neizmantojat korporatÄ«vo tÄ«klu ar slepeniem iekÅ¡tÄ«kla serveru vÄrdiem:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Iesniegt un pÄrbaudÄ«t sertifikÄtus, kurus parakstÄ«juÅ¡as nestandarta saknes CA jeb sertifikÄcijas iestÄdes">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Ir droÅ¡i (un arÄ« ir laba doma) iespÄ“jot Å¡o opciju, ja vien neizmantojat traucÄ“joÅ¡u jeb uzmÄcÄ«gu korporatÄ«vu tÄ«klu, kurÅ¡ jÅ«su veiktajai pÄrlÅ«koÅ¡anai seko, izmantojot TLS starpniekserveri un privÄto saknes sertifikÄcijas iestÄdi.
+Opcija, kas iespÄ“jota Å¡ÄdÄ tÄ«klÄ, varÄ“tu publicÄ“t pierÄdÄ«jumus tam, kuri https:// domÄ“ni tiek skatÄ«ti caur Å¡o starpniekserveri, tÄ izsniegto unikÄlo sertifikÄtu dēļ. TÄdēļ, pÄ“c noklusÄ“juma, mÄ“s Å¡o izvÄ“li esam izslÄ“guÅ¡i.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "AnonimitÄtes nodroÅ¡inÄÅ¡anai pÄrbaudÄ«t sertifikÄtus izmantojot Tor">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"AnonimitÄtes nodroÅ¡inÄÅ¡anai pÄrbaudÄ«t sertifikÄtus izmantojot Tor (nepiecieÅ¡ams Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Opcijas lietošanai nepieciešams instalēt Tor un Torbutton">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Kad redzat jaunu sertifikÄtu, informÄ“jiet Observatory par ISP, pie kura esat pieslÄ“dzies">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Darbība nolasīs un nosūtīs jūsu tīkla &quot;Autonomo sistēmas numuru&quot;.
+Tas palÄ«dzÄ“s mums noteikt uzbrukumus pret HTTPS, un atklÄt vai no tÄ«kliem tiek veikta pÄrraudzÄ«ba tÄdÄs valstÄ«s kÄ IrÄna un SÄ«rija, kur uzbrukumi notiek salÄ«dzinoÅ¡i bieži.">
+
+<!ENTITY ssl-observatory.prefs.done "Gatavs">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS visur var lietot EFF's SSL Observatory.
+Tas veic divas darbības: (1)
+sÅ«ta Obsevatory HTTPS sertifikÄtu kopijas, lai palÄ«dzÄ“tu mums
+noteikt &quot;starpnieka&quot; uzbrukumus, un palielinÄtu tÄ«mekļa drošību, un (2)
+ļauj mums brÄ«dinÄt jÅ«s par nedroÅ¡iem savienojumiem vai uzbrukumiem jÅ«su pÄrlÅ«kam.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"PiemÄ“ram, kad apmeklÄ“jat https://www.something.com , tad sertifikÄts, kuru saņem Observatory, rÄdÄ«s, ka kÄds ir apmeklÄ“jis www.something.com , bet nerÄdÄ«s ne to, kurÅ¡ ir apmeklÄ“jis Å¡o vietni, ne ari to kuras lapas skatÄ«tas. Slidiniet peli pÄr opcijÄm, lai iegÅ«tu papildu informÄciju:">
+
+<!ENTITY ssl-observatory.prefs.hide "Slēpt papildu opcijas">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"PÄrbaudÄ«t sertifikÄtus pat ja Tor nav pieejams">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"MÄ“s joprojÄm centÄ«simies nodroÅ¡inÄt datu anonimitÄti, tomÄ“r šī opcija ir mazÄk droÅ¡a">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Iesniegt un pÄrbaudÄ«t sertifikÄtus DNS nosaukumiem, kuri nav publiski ">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Ja vien šī opcija nav atzÄ«mÄ“ta, Observatory neierakstÄ«s sertifikÄtus nosaukumiem, kurus tÄ nevar atrisinÄt caur DNS sistÄ“mu.">
+
+<!ENTITY ssl-observatory.prefs.show "ParÄdÄ«t papildu opcijas">
+
+<!ENTITY ssl-observatory.prefs.title "Observatory SSL preferences">
+
+<!ENTITY ssl-observatory.prefs.use "Izmantot Observatory?">
+<!ENTITY ssl-observatory.warning.title "EFF's Observatory SSL BRĪDINĀJUMS">
+<!ENTITY ssl-observatory.warning.showcert "ParÄdÄ«t sertificēšanas Ä·Ä“di">
+<!ENTITY ssl-observatory.warning.okay "Es saprotu">
+<!ENTITY ssl-observatory.warning.text "EFF's SSL Observatory SSL izsniedza brÄ«dinÄjumu saistÄ«bÄ ar norÄdÄ«tÄs vietnes HTTPS sertifikÄtu(iem):">
+<!ENTITY ssl-observatory.warning.defense "Ja Å¡ajÄ vietnÄ“ esat reÄ£istrÄ“jies darbam, tad pÄ“c droÅ¡a savienojuma izveides apsveriet paroles maiņu.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Iesniegt un pÄrbaudÄ«t paÅ¡parakstÄ«tus sertifikÄtus">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Tiek rekomendÄ“ts; ar Å¡ifrēšanu saistÄ«tas problÄ“mas ir Ä«paÅ¡i biežas iegultÄs, paÅ¡parakstoÅ¡Äs iekÄrtÄs">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ms/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ms/https-everywhere.dtd
new file mode 100644
index 0000000..358e781
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ms/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Mengenai HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Encrypt laman sesawang! Gunakan HTTPS secara automatik di kebanyakan laman sesawang.">
+<!ENTITY https-everywhere.about.version "Versi">
+<!ENTITY https-everywhere.about.created_by "Dihasilkan oleh">
+<!ENTITY https-everywhere.about.librarians "Pustaka set aturan">
+<!ENTITY https-everywhere.about.thanks "Terima kasih kepada">
+<!ENTITY https-everywhere.about.contribute "Sekiranya anda menyukai HTTPS Everywhere, anda mungkin ingin mempertimbangkan untuk">
+<!ENTITY https-everywhere.about.donate_tor "Menderma kepada Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "ms-MY">
+<!ENTITY https-everywhere.about.donate_eff "Menderma kepada EFF">
+
+<!ENTITY https-everywhere.menu.about "Mengenai HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "Tetapan Pemantau SSL">
+<!ENTITY https-everywhere.menu.globalEnable "Pengaktifan HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Nyah-aktifkan HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Tetapan HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "Pengaktifan semua">
+<!ENTITY https-everywhere.prefs.disable_all "Nyah-aktifkan All">
+<!ENTITY https-everywhere.prefs.reset_defaults "Tetapan semula kepada asal">
+<!ENTITY https-everywhere.prefs.search "Carian">
+<!ENTITY https-everywhere.prefs.site "Laman">
+<!ENTITY https-everywhere.prefs.notes "Nota">
+<!ENTITY https-everywhere.prefs.list_caption "Penghalaan aturan HTTPS yang manakah patut digunakan?">
+<!ENTITY https-everywhere.prefs.enabled "Pengaktifan">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Anda boleh mempelajari penulisan set aturan tersendiri (bagi menambah sokongan kepada laman sesawang yang lain)">
+<!ENTITY https-everywhere.prefs.here_link "di sini">
+<!ENTITY https-everywhere.prefs.toggle "Togol">
+<!ENTITY https-everywhere.prefs.reset_default "Tetapan semula kepada asal">
+<!ENTITY https-everywhere.prefs.view_xml_source "Papar Sumber XML">
+
+<!ENTITY https-everywhere.source.downloading "Sedang memuat turun">
+<!ENTITY https-everywhere.source.filename "Nama fail">
+<!ENTITY https-everywhere.source.unable_to_download "Gagal untuk memuat turun sumber.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ms/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ms/https-everywhere.properties
new file mode 100644
index 0000000..c369b37
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ms/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Pengaktifan HTTPS Everywhere
+https-everywhere.menu.globalDisable = Nyah-aktifkan HTTPS Everywhere
+https-everywhere.menu.enableDisable = Enable / Disable Rules
+https-everywhere.menu.noRules = (No Rules for This Page)
+https-everywhere.menu.unknownRules = (Rules for This Page Unknown)
+https-everywhere.toolbar.hint = HTTPS Everywhere is now active. You can toggle it on a site-by-site basis by clicking the icon in the address bar.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ms/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ms/ssl-observatory.dtd
new file mode 100644
index 0000000..9b95cc0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ms/ssl-observatory.dtd
@@ -0,0 +1,104 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Keterangan dan Maklumat Privasi">
+<!ENTITY ssl-observatory.popup.later "Tanya Saya Kemudian">
+<!ENTITY ssl-observatory.popup.no "Tidak">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere boleh mengesan serangan
+terhadap pelayar web anda dengan menghantar sijil SSL yang anda terima ke
+Pemantau SSL. Aktifkan fungsi ini?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Perlukah HTTPS Everywhere mengunakan Pemantau SSL?">
+
+<!ENTITY ssl-observatory.popup.yes "Ya">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Ianya adalah selamat untuk pengaktifan, melainkan
+anda menggunakan rangkaian koprat yang sangat merejah:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Selamat, melainkan anda menggunakan rangkaian koprat
+dengan pelayan nama internet rahsia:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Hantar dan semak sijil SSL yang ditandatangani oleh
+root CA yang tidak standard">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Ianya adalah selamat (dan satu idea yang bagus) untuk mengaktifkan pilihan ini, melainkan anda menggunakan rangkaian koprat yang sangat merejah atau perisian Kaspersky antivirus yang memantau pelayaran anda dengan proksi TLS dan root Certificate Authority persendirian. Sekiranya diaktifkan di atas rangkaian berkenaan, pilihan ini mungkin akan memaparkan bukti domain https:// yang telah dilawati menggunakan proksi tersebut, disebabkan oleh sijil SSL yang unik yang dihasilkan. Oleh itu kami, secara asalnya kami biarkan ia tidak aktif.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Semak sijil SSL menggunakan Tor untuk ujuan anonymiti">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Semak sijil SSL menggunakan Tor untuk tujuan anonimiti (memerlukan Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Pemilihan ini memerlukan Tor and Torbutton sedia terpasang">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Apabila terpapar sijil SSL yang baru, maklumkan kepada Pemantau SSL tentang ISP yang telah berjaya disambungkan">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Ini akan capai dan hantar &quot;Autonomous System number&quot; rangkaian anda. Ia akan membantu mengesan serangan terhadap HTTPS, dan untuk menentukan samada terdapat pemantauan dari rangkaian seperti Iran dan Syria di mana serangan sering berlaku.">
+
+<!ENTITY ssl-observatory.prefs.done "Selesai">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere boleh menggunakan Pemantau SSL EFF. Terdapat dua
+perkara yang dilakukan iaitu: (1) menghantar salinan sijil SSL kepada
+Pemantau bagi tujuan mengesan serangan &quot;man in the middle&quot; serta
+menambah baik keselamatan web; dan (2) memberi amaran kepada anda tentang
+rangkaian yang tidak selamat atau serangan ke atas pelayar web anda.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Contohnya, apabila melawati laman https://www.something.com, sijil SSL
+yang diterima oleh Pemantau SSL akan memberitahu bahawa ada pelawat yang
+telah ke laman tersebut, tetapi bukan siapa yang telah melawatinya, atau
+halaman yang mereka telah kunjungi. Halakan tetikus kepada senarai pilihan
+untuk butiran lanjut:">
+
+<!ENTITY ssl-observatory.prefs.hide "Sembunyikan tetapan maju">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Semak sijil SSL walaupun ketiadaan Tor">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Kami akan cuba menyimpan data secara anonimus, namun langkah ini adalah kurang selamat">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Hantar dan semak sijil SSL untuk nama DNS yang tidak awam">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Pemantau SSL tidak akan merakam sijil SSL yang namanya tidak dapat diselesaikan oleh sistem DNS, selagi pilihan ini tidak terpilih.">
+
+<!ENTITY ssl-observatory.prefs.show "Paparkan pilihan maju">
+
+<!ENTITY ssl-observatory.prefs.title "Tetapan Pemantau SSL">
+
+<!ENTITY ssl-observatory.prefs.use "Gunakan Pemantau SSL?">
+<!ENTITY ssl-observatory.warning.title "AMARAN dari Pemantau SSL EFF">
+<!ENTITY ssl-observatory.warning.showcert "Paparkan rantaian sijil SSL">
+<!ENTITY ssl-observatory.warning.okay "Saya faham">
+<!ENTITY ssl-observatory.warning.text "Amaran tentang sijil SSL untuk laman ini telah diberikan oleh Pemantau SSL EFF:">
+<!ENTITY ssl-observatory.warning.defense "Jika anda berjaya memasuki laman sesawang ini, anda dinasihatkan supaya menukar kata laluan setelah berada dalam sambungan yang selamat.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Hantar dan periksa sijil sendiri-bertanda">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Disarankan, masalah kriptografik adalah biasa pada peranti self-signed ">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nb/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nb/https-everywhere.dtd
new file mode 100644
index 0000000..797be6f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nb/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Om HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Kryptér nettet. Bruk HTTPS-sikkerhet automatisk på mange nettsider.">
+<!ENTITY https-everywhere.about.version "Versjon">
+<!ENTITY https-everywhere.about.created_by "Lagd av">
+<!ENTITY https-everywhere.about.librarians "Regelsettbibliotekarer">
+<!ENTITY https-everywhere.about.thanks "Takk til">
+<!ENTITY https-everywhere.about.contribute "Hvis du liker HTTPS Everywhere, vurder å">
+<!ENTITY https-everywhere.about.donate_tor "Donére til Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "Donére til EFF">
+
+<!ENTITY https-everywhere.menu.about "Om HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL Observatory Innstillinger">
+<!ENTITY https-everywhere.menu.globalEnable "Aktiver HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Deaktiver HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere Innstillinger">
+<!ENTITY https-everywhere.prefs.enable_all "Aktiver Alle">
+<!ENTITY https-everywhere.prefs.disable_all "Deaktiver Alle">
+<!ENTITY https-everywhere.prefs.reset_defaults "Gjenopprett Standardinnstillinger">
+<!ENTITY https-everywhere.prefs.search "Søk">
+<!ENTITY https-everywhere.prefs.site "Side">
+<!ENTITY https-everywhere.prefs.notes "Merknader">
+<!ENTITY https-everywhere.prefs.list_caption "Hvilke HTTPS omdirigeringsregler skal gjelde?">
+<!ENTITY https-everywhere.prefs.enabled "Aktivert">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Du kan lære mer om hvordan du lager dine egne regelsett (for å støtte andre websider)">
+<!ENTITY https-everywhere.prefs.here_link "her">
+<!ENTITY https-everywhere.prefs.toggle "Av/PÃ¥">
+<!ENTITY https-everywhere.prefs.reset_default "Gjenopprett Standardinnstilling">
+<!ENTITY https-everywhere.prefs.view_xml_source "Vis XML Kilde">
+
+<!ENTITY https-everywhere.source.downloading "Laster ned">
+<!ENTITY https-everywhere.source.filename "Filnavn">
+<!ENTITY https-everywhere.source.unable_to_download "Klarte ikke å laste ned kilde.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nb/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nb/https-everywhere.properties
new file mode 100644
index 0000000..0bf50bc
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nb/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Aktiver HTTPS Everywhere
+https-everywhere.menu.globalDisable = Deaktiver HTTPS Everywhere
+https-everywhere.menu.enableDisable = Aktiver / Deaktiver Regler
+https-everywhere.menu.noRules = (Ingen regler for denne siden)
+https-everywhere.menu.unknownRules = (Reglene for denne siden er ukjente)
+https-everywhere.toolbar.hint = HTTPS Everywhere er nå aktiv. Du kan aktivere/deaktivere fra side til side ved å klikke på ikonet i adresselinjen.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nb/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nb/ssl-observatory.dtd
new file mode 100644
index 0000000..a7fce63
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nb/ssl-observatory.dtd
@@ -0,0 +1,100 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Detaljer og Personvernsinformasjon">
+<!ENTITY ssl-observatory.popup.later "Spør Meg Senere">
+<!ENTITY ssl-observatory.popup.no "Nei">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere kan oppdage angrep
+mot nettleseren din ved å sende sertifikatene du mottar til
+Observatory. Aktivere dette?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Skal HTTPS Everywhere bruke SSL Observatory?">
+
+<!ENTITY ssl-observatory.popup.yes "Ja">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Det er trygt å aktivere dette, hvis du ikke er på et veldig
+påtrengende bedriftsnettverk:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Trygt, med mindre du bruker et bedriftsnettverk med hemmelige intranett servernavn.">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Send inn og sjekk sertifikater signert av ikke-standardiserte rotsertifiseringsinstanser">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Det er trygt (og en god idé) å aktivere denne innstillingen, med mindre du bruker et påtrengende bedriftsnettverk eller Kaspersky antivirusprogramvare som overvåker surfingen din med en TLS proxy og en privat rotsertifiseringsinstans. Hvis du aktiverer dette på et slikt nettverk, kan innstillingen publisere bevis på hvilke https://-domener som ble besøk gjennom den proxyen, som følge av de unike sertifkatene den vil lage. Så vi deaktiverer den som standard.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Sjekk sertifikatene ved å bruke Tor for anonymitet">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Sjekk sertifikater anonymt ved å bruke Tor (Tor kreves)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Denne innstillingen krever at Tor installeres og aktiveres">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Når du ser et nytt sertifikat, fortell Observatory hvilken internettleverandør du er tilkoblet">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Dette vil hente og sende ditt nettverks &quot;autonome systemnummer&quot;. Dette vil hjelpe oss med å lokalisere angrep mot HTTPS og med å avgjøre om vi har observasjoner fra nettverk i Iran og Syria, hvor angrep er relativt vanlige.">
+
+<!ENTITY ssl-observatory.prefs.done "Ferdig">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere kan bruke EFF's SSL Observatory. Dette gjør to ting: (1)
+sender kopier av HTTPS sertifikater til Observatory, for å hjelpe oss å
+avsløre 'mellommann'-angrep og forbedre sikkerheten på nettet; og (2)
+lar oss advare deg mot usikre tilkoblinger og angrep på nettleseren din.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"For eksempel, hvis du besøker https://www.something.com, vil sertifikatet
+Observatory mottar indikere at noen besøkte
+www.something.com, men ikke hvem som besøkte siden, eller spesifikt hvilken side
+de så på. Hold muspekeren over innstillingene for flere detaljer:">
+
+<!ENTITY ssl-observatory.prefs.hide "Skjul avanserte innstillinger">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Sjekk sertifikater selv om Tor ikke er tilgjengelig.">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Vil vil fortsatt prøve å holde dataene anonyme, men denne innstillingen er mindre sikker">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Send inn og sjekk sertifikater til DNS-navn som ikke er offentlige">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Hvis denne innstillingen ikke er aktivert, vil ikke Observatory registrere sertikatene til navn som ikke kan analyseres gjennom DNS-systemet.">
+
+<!ENTITY ssl-observatory.prefs.show "Vis avanserte innstillinger">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Observatory Innstillinger">
+
+<!ENTITY ssl-observatory.prefs.use "Bruke Observatory?">
+<!ENTITY ssl-observatory.warning.title "ADVARSEL fra EFF's SSL Observatory ">
+<!ENTITY ssl-observatory.warning.showcert "Vis sertifikatkjede">
+<!ENTITY ssl-observatory.warning.okay "Jeg forstår">
+<!ENTITY ssl-observatory.warning.text "EFF's SSL Observatory har utstedt en advarsel om bruk av HTTPS sertifikatene på denne siden:">
+<!ENTITY ssl-observatory.warning.defense "Hvis du er innlogget på denne siden, er det anbefalt at du forandrer passordet så snart du har en sikker tilkobling.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Send og sjekk selvsignerte sertifikater">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Dette er anbefalt; kryptografiske problemer er spesielt vanlig i selvsignerte enheter">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nl/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nl/https-everywhere.dtd
new file mode 100644
index 0000000..04bb6c5
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nl/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Over HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Versleutel het web! Gebruik HTTPS-beveiliging automatisch op vele sites.">
+<!ENTITY https-everywhere.about.version "Versie">
+<!ENTITY https-everywhere.about.created_by "Gemaakt door">
+<!ENTITY https-everywhere.about.librarians "Regelsetbibliothecarissen">
+<!ENTITY https-everywhere.about.thanks "Met dank aan">
+<!ENTITY https-everywhere.about.contribute "Als HTTPS Everywhere u bevalt, kunt u overwegen">
+<!ENTITY https-everywhere.about.donate_tor "te doneren aan Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "te doneren aan het EFF">
+
+<!ENTITY https-everywhere.menu.about "Over HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL-observatoriumvoorkeuren">
+<!ENTITY https-everywhere.menu.globalEnable "HTTPS Everywhere inschakelen">
+<!ENTITY https-everywhere.menu.globalDisable "HTTPS Everywhere uitschakelen">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere-voorkeuren">
+<!ENTITY https-everywhere.prefs.enable_all "Alles inschakelen">
+<!ENTITY https-everywhere.prefs.disable_all "Alles uitschakelen">
+<!ENTITY https-everywhere.prefs.reset_defaults "Standaardwaarden herstellen">
+<!ENTITY https-everywhere.prefs.search "Zoeken">
+<!ENTITY https-everywhere.prefs.site "Site">
+<!ENTITY https-everywhere.prefs.notes "Opmerkingen">
+<!ENTITY https-everywhere.prefs.list_caption "Welke HTTPS-omleidingsregels moeten worden toegepast?">
+<!ENTITY https-everywhere.prefs.enabled "Ingeschakeld">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Om ondersteuning voor andere websites toe te voegen, kunt u">
+<!ENTITY https-everywhere.prefs.here_link "zelf regelsets opstellen">
+<!ENTITY https-everywhere.prefs.toggle "Schakelen">
+<!ENTITY https-everywhere.prefs.reset_default "Standaardwaarden herstellen">
+<!ENTITY https-everywhere.prefs.view_xml_source "XML-broncode bekijken">
+
+<!ENTITY https-everywhere.source.downloading "Bezig met downloaden">
+<!ENTITY https-everywhere.source.filename "Bestandsnaam">
+<!ENTITY https-everywhere.source.unable_to_download "Kan broncode niet downloaden.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 bericht">
+<!ENTITY https-everywhere.popup.paragraph1 "Oeps! U gebruikte de stabiele versie van HTTPS Everywhere, maar het is mogelijk dat we u tijdens de laatste uitgave per ongeluk naar de ontwikkelversie hebben geupgrade.">
+<!ENTITY https-everywhere.popup.paragraph2 "Wilt u teruggaan naar de stabiele versie?">
+<!ENTITY https-everywhere.popup.paragraph3 "We zouden het op prijs stellen als u doorging met het gebruik van onze ontwikkelde versie en ons hielp met het verbeteren van HTTPS Everywhere! U zult hier en daar wat bugs tegenkomen, die u kunt melden aan https-everywhere@eff.org. Excuses voor het ongemak, en veel dank voor het gebruik van HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Hou me op de ontwikkelde versie">
+<!ENTITY https-everywhere.popup.revert "Download de meest recenste stabiele uitgave.">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nl/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nl/https-everywhere.properties
new file mode 100644
index 0000000..a96fdc7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nl/https-everywhere.properties
@@ -0,0 +1,7 @@
+https-everywhere.menu.globalEnable = HTTPS Everywhere inschakelen
+https-everywhere.menu.globalDisable = HTTPS Everywhere uitschakelen
+https-everywhere.menu.enableDisable = Regels in-/uitschakelen
+https-everywhere.menu.noRules = (Geen regels voor deze pagina)
+https-everywhere.menu.unknownRules = (Regels voor deze pagina zijn onbekend)
+https-everywhere.toolbar.hint = HTTPS Everywhere is nu geactiveerd. Je kan dit aanpassen door op een site-by-site basis te clicken op het icoon naast de adres bar.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nl/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nl/ssl-observatory.dtd
new file mode 100644
index 0000000..e576db5
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/nl/ssl-observatory.dtd
@@ -0,0 +1,99 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Details en privacy-informatie">
+<!ENTITY ssl-observatory.popup.later "Later opnieuw vragen">
+<!ENTITY ssl-observatory.popup.no "Nee">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere kan aanvallen op uw browser detecteren door
+de certificaten die u ontvangt, naar het observatorium door te sturen. Wilt u dit inschakelen?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"SSL-observatorium gebruiken?">
+
+<!ENTITY ssl-observatory.popup.yes "Ja">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Het is veilig om dit in te schakelen, tenzij u een zeer indringend bedrijfsnetwerk gebruikt:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Veilig, tenzij u een bedrijfsnetwerk met geheime intranetservernamen gebruikt:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Certificaten ondertekend door niet-standaard hoofd-CA’s opsturen en controleren">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Het is veilig (en aangeraden) om deze optie in te schakelen, tenzij u een indringend
+bedrijfsnetwerk gebruikt dat uw surfgedrag met een TLS-proxy en een
+privé-hoofdcertificaatautoriteit monitort. Indien deze optie op een dergelijk netwerk is ingeschakeld,
+kan deze bewijs publiceren over welke HTTPS-domeinen via die proxy werden bezocht, vanwege de unieke
+certificaten die dan worden geproduceerd. De optie is daarom standaard uitgeschakeld.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Certificaten omwille van anonimiteit via Tor controleren">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Certificaten omwille van anonimiteit via Tor controleren (vereist Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Voor deze optie zijn Tor en Torbutton vereist">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Melden met welke ISP u bent verbonden indien u een nieuwe certificaat ziet">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Dit zal het Autonoom Systeem-nummer van uw netwerk ophalen en verzenden als het observatorium een
+waarschuwing afgeeft over een certificaat dat u zag. Dit helpt ons aanvallen op HTTPS te lokaliseren.">
+
+<!ENTITY ssl-observatory.prefs.done "OK">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere kan het SSL-observatorium van EFF gebruiken. Dit doet twee dingen: ten eerste zendt
+het kopieën van HTTPS-certificaten naar het observatorium om ons te helpen man-in-the-middle-aanvallen
+te detecteren en de veiligheid van het web te verbeteren; ten tweede laat het ons u waarschuwen over
+onveilige verbindingen en aanvallen op uw browser.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Als u bijvoorbeeld https://www.iets.nl bezoekt, geeft het certificaat dat het observatorium ontvangt aan
+dat iemand www.iets.nl bezocht, maar niet wie de site bezocht of welke specifieke pagina de bezoeker
+bekeek. Plaats uw muis boven de opties voor meer details:">
+
+<!ENTITY ssl-observatory.prefs.hide "Geavanceerde opties verbergen">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Certificaten controleren zelfs als Tor niet beschikbaar is">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"We zullen nog steeds proberen de gegevens anoniem te houden, maar deze optie is minder veilig">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Certificaten voor niet-openbare DNS-namen opsturen en controleren">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Tenzij deze optie is aangevinkt, legt het observatorium geen certificaten vast voor namen die niet via
+het DNS-systeem zijn op te lossen.">
+
+<!ENTITY ssl-observatory.prefs.show "Geavanceerde opties tonen">
+
+<!ENTITY ssl-observatory.prefs.title "Voorkeuren SSL-observatorium">
+
+<!ENTITY ssl-observatory.prefs.use "Het observatorium gebruiken?">
+<!ENTITY ssl-observatory.warning.title "WAARSCHUWING van SSL-observatorium van EFF">
+<!ENTITY ssl-observatory.warning.showcert "Toon de certificaatketen">
+<!ENTITY ssl-observatory.warning.okay "Ik begrijp het">
+<!ENTITY ssl-observatory.warning.text "Het SSL-observatorium van EFF heeft een waarschuwing uitgegeven over een HTTPS-certificaat voor deze site:">
+<!ENTITY ssl-observatory.warning.defense "Als u bent ingelogd op deze site, is het aan te raden uw wachtwoord te wijzigen zodra u een veilige verbinding hebt.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Verstuur en controleer zelf-getekende certificaten">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Dit is aanbevolen; cryptografische problemen zijn veel voorkomend in zelf-getekende embedded apparaten">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pl/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pl/https-everywhere.dtd
new file mode 100644
index 0000000..e0194a6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pl/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "O HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Szyfruj sieć! Automatycznie używaj zabezpieczeń HTTPS na wielu stronach.">
+<!ENTITY https-everywhere.about.version "Wersja">
+<!ENTITY https-everywhere.about.created_by "Stworzone przez">
+<!ENTITY https-everywhere.about.librarians "Ruleset Librarians">
+<!ENTITY https-everywhere.about.thanks "Dzięki dla">
+<!ENTITY https-everywhere.about.contribute "Jeżeli lubisz HTTPS Everywhere, możesz rozważyć ">
+<!ENTITY https-everywhere.about.donate_tor "Dotacje dla Tora">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "Dotacje dla Electronic Frontier Foundation">
+
+<!ENTITY https-everywhere.menu.about "O HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "Ustawienia SSL Observatory">
+<!ENTITY https-everywhere.menu.globalEnable "Włącz HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Wyłącz HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Ustawienia HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "Włącz wszystko">
+<!ENTITY https-everywhere.prefs.disable_all "Wyłącz wszystko">
+<!ENTITY https-everywhere.prefs.reset_defaults "Przywróć ustawienia fabryczne">
+<!ENTITY https-everywhere.prefs.search "Szukaj">
+<!ENTITY https-everywhere.prefs.site "Strona">
+<!ENTITY https-everywhere.prefs.notes "Notatki">
+<!ENTITY https-everywhere.prefs.list_caption "Które z opcji przekierowań HTTPS należy zastosować?">
+<!ENTITY https-everywhere.prefs.enabled "Włączone">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Możesz nauczyć się jak pisać własne pakiety reguł (by dać wsparcie innym stronom)">
+<!ENTITY https-everywhere.prefs.here_link "tutaj">
+<!ENTITY https-everywhere.prefs.toggle "Przełączanie">
+<!ENTITY https-everywhere.prefs.reset_default "Przywróć ustawienia fabryczne">
+<!ENTITY https-everywhere.prefs.view_xml_source "Zobacz źródło XML ">
+
+<!ENTITY https-everywhere.source.downloading "ÅšciÄ…ganie">
+<!ENTITY https-everywhere.source.filename "Nazwa pliku">
+<!ENTITY https-everywhere.source.unable_to_download "Nie można ściągnąć źródła. ">
+
+<!ENTITY https-everywhere.popup.title "Powiadomienie o wersji HTTPS Everywhere 4.0development.11">
+<!ENTITY https-everywhere.popup.paragraph1 "Ojej. Używałeś stabilnej wersji HTTPS Everywhere, ale mogliśmy wraz z najnowszą wersją przypadkowo zaktualizować Twój system do wersji rozwojowej.">
+<!ENTITY https-everywhere.popup.paragraph2 "Czy chciałbyś wrócić do wersji stabilnej?">
+<!ENTITY https-everywhere.popup.paragraph3 "Pragnęlibyśmy abyś dalej używał naszej wersji rozwojowej i pomógł nam uczyć HTTPS Everywhere lepszym! Może się okazać, że jest trochę więcej błędów tu i tam, które możesz zgłosić pod adres https-everywhere@eff.org. Wybacz proszę tę niedogodność. Dziękujemy za używanie HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Pozostań przy wersji rozwojowej">
+<!ENTITY https-everywhere.popup.revert "Pobierz najnowszÄ… wersjÄ™ stabilnÄ…">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pl/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pl/https-everywhere.properties
new file mode 100644
index 0000000..03428a2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pl/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Włącz HTTPS Everywhere
+https-everywhere.menu.globalDisable = Wyłącz HTTPS Everywhere
+https-everywhere.menu.enableDisable = Włącz/Wyłącz reguły
+https-everywhere.menu.noRules = (brak reguł dla tej strony)
+https-everywhere.menu.unknownRules = (reguły dla strony nieznane)
+https-everywhere.toolbar.hint = HTTPS Everywhere jest teraz aktywne. Możesz przełączać to dla poszczególnych stron, klikając ikonę w pasku adresu.
+https-everywhere.migration.notification0 = W celu implementacji pewnej kluczowej poprawki, ta aktualizacja zresetuje ustawienia reguł HTTPS Everywhere do ich domyślnych wartości.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pl/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pl/ssl-observatory.dtd
new file mode 100644
index 0000000..bd515b3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pl/ssl-observatory.dtd
@@ -0,0 +1,91 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Szczegóły i Polityka Prywatności">
+<!ENTITY ssl-observatory.popup.later "Zapytaj mnie później">
+<!ENTITY ssl-observatory.popup.no "Nie">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere może wykryć ataki
+na twoją przeglądarkę przez wysyłanie do ciebie certyfikatów, które otrzymujesz
+do &quot;SSL Observatory&quot;. Włączyć tą opcję?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Czy HTTPS Everywhere ma używać &quot;SSL Observatory&quot;?">
+
+<!ENTITY ssl-observatory.popup.yes "Tak">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Bezpiecznym jest używanie tej opcji, chyba że korzystasz
+z intruzywnej sieci korporacyjnej.">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Bezpieczne, jeżeli używasz sieci korporacyjnej z ukrytymi nazwami serwerów Intranetowych.">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Wysyłaj i sprawdzaj certyfikaty podpisane przez niestandardowe ośrodki certyfikacji">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Jest bezpiecznym, (i dobrym pomysłem), by włączyć tą opcję, chyba że używasz intruzywnej sieci korporacyjnej lub antywirusa firmy Kaspersky, które monitorują twoje przeglądanie za pomocą TLS proxy i prywatnego roota CA. Jeżeli ta opcja jest włączona na takich właśnie sieciach, opcja ta może przyczynić się do publikacji dowodów na temat stron, które były odwiedzane przez ten proxy, ponieważ unikalne certyfikaty zostaną utworzone. Dlatego też opcja ta domyślnie jest wyłączona.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Sprawdź certyfikaty używając Tora dla prywatności">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Sprawdź certyfikaty używając Tora dla prywatności (wymaga aplikacji Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Ta opcja, do instalacji, wymaga Tora oraz aplikacji Torbutton ">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Jeżeli dostrzeżesz nowe certyfikaty, potwierdź SLL Observatory, do którego ISP jesteś obecnie podłączony">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"To pobierze i wyśle &quot;numer Autonomicznego Systemu&quot; Twojej sieci.
+To pomoże nam zlokalizować ataki na HTTPS i określić, czy mamy obserwacje sieci w miejscach takich jak Iran czy Syria, gdzie ataki są porównywalnie częste.">
+
+<!ENTITY ssl-observatory.prefs.done "Gotowe">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere może używać EFF's SSL Observatory. Daje to dwie rzeczy: (1) wysyła kopie certyfikatów HTTPS do SSL Observatory, pomagając nam wykryć ataki osób podsłuchujących; i (2) daje nam znać o niezabezpieczonych połączeniach lub atakach na twoją przeklądarkę.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Dla przykładu, jeżeli odwiedzasz https://www.something.com, certyfikat otrzymany przez SSL Observatory wskaże, że ktoś odwiedził https://www.something.com ale nie wskaże kto dokładnie ją odwiedzał i jakie strony przeglądał. Najedź kursorem na opcje by zobaczyć więcej szczegółów ">
+
+<!ENTITY ssl-observatory.prefs.hide "Schowaj zaawansowane opcje">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Sprawdź certyfikaty nawet jeżeli Tor nie jest dostępny">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Postaramy się zachować anonimowość twoich danych, jednak ta opcja jest mniej bezpieczna.">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Wyślij i sprawdź certyfikaty dla niepublicznych nazw DNSów">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Jeśli ta opcja nie jest włączona, Obserwatorium nie zarejestruje certyfikatów dla nazw, których nie można znaleźć w systemie DNS.">
+
+<!ENTITY ssl-observatory.prefs.show "Pokaż zaawansowane opcje">
+
+<!ENTITY ssl-observatory.prefs.title "Preferencje SLL Observatory">
+
+<!ENTITY ssl-observatory.prefs.use "Użyj Observatory?">
+<!ENTITY ssl-observatory.warning.title "OSTRZEŻENIE od EFF's SSL Observatory">
+<!ENTITY ssl-observatory.warning.showcert "Pokaż łańcuch certyfikatu">
+<!ENTITY ssl-observatory.warning.okay "Tak rozumie">
+<!ENTITY ssl-observatory.warning.text "EFF's SSL Observatory wystawił ostrzeżenie na temat certyfikatów HTTPS dla tej stron:">
+<!ENTITY ssl-observatory.warning.defense "Jeżeli zalogowałeś się do tej strony, bezpiecznym będzie zmiana hasła, po ponownym połączeniu się z bezpieczną siecią.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Wysyłaj i sprawdzaj samopodpisane certyfikaty">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"To jest zalecane; problemy kryptograficzne są szczególnie częste w samopodpisanych urządzeniach wbudowanych.">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pt/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pt/https-everywhere.dtd
new file mode 100644
index 0000000..805b7c5
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pt/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Sobre o HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Criptografe a Web! Use automaticamente a segurança HTTPS em diversos sites.">
+<!ENTITY https-everywhere.about.version "Versão">
+<!ENTITY https-everywhere.about.created_by "Criado por">
+<!ENTITY https-everywhere.about.librarians "Bibliotecários dos Conjuntos de Regras">
+<!ENTITY https-everywhere.about.thanks "Obrigado a">
+<!ENTITY https-everywhere.about.contribute "Se você gostar do HTTPS Everywhere, considere">
+<!ENTITY https-everywhere.about.donate_tor "Fazer uma doação para o Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "Fazer uma doação para a EFF">
+
+<!ENTITY https-everywhere.menu.about "Sobre o HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "Preferências do Observatório SSL">
+<!ENTITY https-everywhere.menu.globalEnable "Habilitar HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Desabilitar HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Preferências do HTTPS Everywhere ">
+<!ENTITY https-everywhere.prefs.enable_all "Habilitar tudo">
+<!ENTITY https-everywhere.prefs.disable_all "Desabilitar tudo">
+<!ENTITY https-everywhere.prefs.reset_defaults "Restaurar as configurações padrão">
+<!ENTITY https-everywhere.prefs.search "Procurar">
+<!ENTITY https-everywhere.prefs.site "Site">
+<!ENTITY https-everywhere.prefs.notes "Notas">
+<!ENTITY https-everywhere.prefs.list_caption "Quais regras de redirecionamento HTTPS devem ser aplicadas?">
+<!ENTITY https-everywhere.prefs.enabled "Habilitado(a)">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Você pode aprender como escrever seu próprio conjunto de regras (para adicionar suporte para outros websites)">
+<!ENTITY https-everywhere.prefs.here_link "aqui">
+<!ENTITY https-everywhere.prefs.toggle "Alternar">
+<!ENTITY https-everywhere.prefs.reset_default "Restaurar as configurações padrão">
+<!ENTITY https-everywhere.prefs.view_xml_source "Ver Fonte XML">
+
+<!ENTITY https-everywhere.source.downloading "Fazendo download">
+<!ENTITY https-everywhere.source.filename "Nome do Arquivo">
+<!ENTITY https-everywhere.source.unable_to_download "Impossível fazer download da origem.">
+
+<!ENTITY https-everywhere.popup.title "Aviso do HTTPS Everywhere 4.0development.11">
+<!ENTITY https-everywhere.popup.paragraph1 "Desculpe. Você usava a versão estável do HTTPS Everywhere, mas, na nossa última liberação, sem querer podemos ter atualizado seu navegador para a versão de desenvolvimento.">
+<!ENTITY https-everywhere.popup.paragraph2 "Gostaria de voltar à versão estável?">
+<!ENTITY https-everywhere.popup.paragraph3 "Seria útil para o nosso projeto se quiser continuar a usar a versão de desenvolvimento para ajudar-nos a melhorar o HTTPS Everywhere. Porém, pode encontrar mais bugs; pode informar sobre eles escrevendo para https-everywhere@eff.org. Desculpe pelo incômodo, e obrigado por usar o HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Manter o navegador na versão de desenvolvimento">
+<!ENTITY https-everywhere.popup.revert "Baixar a versão estável mais recente">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pt/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pt/https-everywhere.properties
new file mode 100644
index 0000000..66160e4
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pt/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Habilitar HTTPS Everywhere
+https-everywhere.menu.globalDisable = Desabilitar HTTPS Everywhere
+https-everywhere.menu.enableDisable = Habilitar / Desabilitar Regras
+https-everywhere.menu.noRules = (Não há Regras para Esta Página)
+https-everywhere.menu.unknownRules = (Regras Desconhecidas para Esta Página)
+https-everywhere.toolbar.hint = HTTPS Everywhere foi ativado. Você pode habilitá-lo individualmente para cada site, clicando no ícone na barra de endereços.
+https-everywhere.migration.notification0 = Para implementar uma reparação crucial, esta atualização limpa sua preferência de regras do HTTPS Everywhere para valores padrão.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pt/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pt/ssl-observatory.dtd
new file mode 100644
index 0000000..7ef2617
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/pt/ssl-observatory.dtd
@@ -0,0 +1,94 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Detalhes e Informações sobre a Privacidade">
+<!ENTITY ssl-observatory.popup.later "Pergunte-me mais tarde">
+<!ENTITY ssl-observatory.popup.no "Não">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere detecta ataques
+contra seu navegador enviando os certificados que você receber
+ao Observatório. Você gostaria de ativá-lo?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"O HTTPS Everywhere deverá usar o Observatório SSL?">
+
+<!ENTITY ssl-observatory.popup.yes "Sim">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"É seguro habilitar isto, a não ser que você use uma
+rede corporativa muito intrusiva:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Seguro, a não ser que você use uma rede corporativa com nomes de servidores secretos na intranet:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Submeta e verifique os certificados assinados pelas non-standard root CAs">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"É seguro (e uma boa idéia) habilitar esta opção, a não ser que você use uma rede corporativa intrusiva ou o Kapersky antivirus que monitora sua navegação com uma proxy TLS e um certificado Certificate Authority privado raiz. Se habilitado em uma rede deste tipo, esta opção pode publicar evidências de quais domínios httpss:// foram visitados através daquele proxy, por causa dos certificados únicos que serão produzidos. Então nós deixamos isto desabilitado por padrão.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Checar certificados usando Tor para anonimato">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Checar certificados usando Tor para anonimato (requer Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Esta opção requer que o Tor e o Torbutton estejam instalados">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Quando você vir um novo certificado, diga ao Observatório a qual ISP você está conectado">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Isto irá buscar e enviar o &quot;Autonomous System Number&quot; de sua rede. Isto irá nos ajudar a localizar ataques contra HTTPS, e a determinar se nós temos observações das redes localizadas em lugares como Irã e Síria, onde os ataques são relativamente mais comuns.">
+
+<!ENTITY ssl-observatory.prefs.done "Pronto">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere pode usar o Observatório SSL de EFF, para realizar duas funções: (1) enviar cópias dos certificados HTTPS ao Observatório, para ajudar-nos
+a detectar o &quot;homem no meio&quot; dos ataques e melhorar a segurança da Web; e (2)
+Avisar-nos sobre conexões não seguras ou ataques ao seu navegador.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Por exemplo, quando você visita https://www.algumacoisa.com, o certificado
+recebido pelo Observatório indicará que alguém visitou
+www.algumacoisa.com, mas não quem visitou o site, ou qual página específica foi vista. Passe o mouse sobre as opções para mais detalhes:">
+
+<!ENTITY ssl-observatory.prefs.hide "Ocultar opções avançadas">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Checar os certificados mesmo se o Tor não estiver disponível">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Nós continuaremos tentando manter os dados anônimos, mas esta opção é menos segura">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Submeter e checar os certificados para nomes de DNS não-públicos">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"A não ser que esta opção esteja marcada, o Observatório gravará os certificados para os nomes impossíveis de resolver através do sistema DNS.">
+
+<!ENTITY ssl-observatory.prefs.show "Mostrar opções avançadas">
+
+<!ENTITY ssl-observatory.prefs.title "Preferências do Observatório SSL">
+
+<!ENTITY ssl-observatory.prefs.use "Usar este Observatório?">
+<!ENTITY ssl-observatory.warning.title "AVISO do Observatório SSL de EFF">
+<!ENTITY ssl-observatory.warning.showcert "Mostrar a série do certificado">
+<!ENTITY ssl-observatory.warning.okay "Eu entendi">
+<!ENTITY ssl-observatory.warning.text "O Observatório SSL de EFF emitiu um aviso sobre o(s) certificados(s) HTTPS para este site:">
+<!ENTITY ssl-observatory.warning.defense "Se você estiver logado neste site, é aconselhável trocar sua senha assim que você tiver uma conexão segura.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Envie e verifique os certificados auto-assinados">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Isto é recomendado; problemas de criptografia são especialmente comuns em certificados auto-assinados de sistemas embarcados">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ru/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ru/https-everywhere.dtd
new file mode 100644
index 0000000..86d3da2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ru/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "О HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Зашифруйте Ñеть! ÐвтоматичеÑки переключайтеÑÑŒ на безопаÑный протокол HTTPS там, где Ñто возможно.">
+<!ENTITY https-everywhere.about.version "ВерÑиÑ">
+<!ENTITY https-everywhere.about.created_by "Ðвторы">
+<!ENTITY https-everywhere.about.librarians "Хранители правил">
+<!ENTITY https-everywhere.about.thanks "БлагодарноÑти">
+<!ENTITY https-everywhere.about.contribute "ЕÑли Вам нравитÑÑ HTTPS Everywhere, возможно, Ð’Ñ‹ хотели бы Ñделать">
+<!ENTITY https-everywhere.about.donate_tor "пожертвование Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "ru">
+<!ENTITY https-everywhere.about.donate_eff "пожертвование EFF">
+
+<!ENTITY https-everywhere.menu.about "О HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "ÐаÑтройки SSL Observatory">
+<!ENTITY https-everywhere.menu.globalEnable "Включить HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Выключить HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "ÐаÑтройки HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "Включить вÑÑ‘">
+<!ENTITY https-everywhere.prefs.disable_all "Выключить вÑÑ‘">
+<!ENTITY https-everywhere.prefs.reset_defaults "По умолчанию">
+<!ENTITY https-everywhere.prefs.search "ПоиÑк">
+<!ENTITY https-everywhere.prefs.site "Сайт">
+<!ENTITY https-everywhere.prefs.notes "ПримечаниÑ">
+<!ENTITY https-everywhere.prefs.list_caption "Какие правила перенаправлений Ñледует иÑпользовать?">
+<!ENTITY https-everywhere.prefs.enabled "Включено">
+<!ENTITY https-everywhere.prefs.ruleset_howto "РуководÑтво по Ñозданию новых правил находитÑÑ">
+<!ENTITY https-everywhere.prefs.here_link "здеÑÑŒ">
+<!ENTITY https-everywhere.prefs.toggle "Переключить">
+<!ENTITY https-everywhere.prefs.reset_default "СброÑить к значению по умолчанию">
+<!ENTITY https-everywhere.prefs.view_xml_source "ПроÑмотреть иÑходник XML">
+
+<!ENTITY https-everywhere.source.downloading "Загрузка">
+<!ENTITY https-everywhere.source.filename "Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°">
+<!ENTITY https-everywhere.source.unable_to_download "Ðе могу загрузить иÑходник">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 уведомление">
+<!ENTITY https-everywhere.popup.paragraph1 "Ой. Ð’Ñ‹ иÑпользовали Ñтабильную верÑию HTTPS Everywhere, но мы, возможно, Ñлучайно обновили Вам её до разрабатываемой верÑии.">
+<!ENTITY https-everywhere.popup.paragraph2 "Хотели бы Ð’Ñ‹ вернутьÑÑ Ðº Ñтабильной верÑии?">
+<!ENTITY https-everywhere.popup.paragraph3 "Мы были бы рады, еÑли бы Ð’Ñ‹ продолжили иÑпользовать разрабатываемую верÑию, и помогли нам Ñделать HTTPS Everywhere лучше! Ð’Ñ‹ могли бы найти неÑколько ошибок, и приÑлать их нам на https-everywhere@eff.org. Извините за неудобÑтва, и ÑпаÑибо за иÑпользование HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "ОÑтатьÑÑ Ð½Ð° разрабатываемой верÑии">
+<!ENTITY https-everywhere.popup.revert "Загрузить поÑледнюю Ñтабильную верÑию">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ru/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ru/https-everywhere.properties
new file mode 100644
index 0000000..36530f3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ru/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Включить HTTPS Everywhere
+https-everywhere.menu.globalDisable = Выключить HTTPS Everywhere
+https-everywhere.menu.enableDisable = Включить / Выключить правила
+https-everywhere.menu.noRules = Ðет правил Ð´Ð»Ñ Ñтой Ñтраницы
+https-everywhere.menu.unknownRules = Правила Ð´Ð»Ñ Ñтой Ñтраницы неизвеÑтны
+https-everywhere.toolbar.hint = HTTPS Everywhere активен. Ð’Ñ‹ можете отключить его Ð´Ð»Ñ Ñтого Ñайта кликнув по значку.
+https-everywhere.migration.notification0 = Ð’ целÑÑ… реализации критичеÑких иÑправлений, Ñто обновление ÑбраÑывает наÑтройки правил HTTPS Everywhere к значениÑм по умолчанию.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ru/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ru/ssl-observatory.dtd
new file mode 100644
index 0000000..f0f06bd
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/ru/ssl-observatory.dtd
@@ -0,0 +1,120 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "ÐŸÐ¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸ ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ конфиденциальноÑти">
+<!ENTITY ssl-observatory.popup.later "СпроÑить позже">
+<!ENTITY ssl-observatory.popup.no "Ðет">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere может раÑпознавать атаки на Ваш браузер,
+путём отправки получаемых Ñертификатов в SSL Observatory.
+Включить данную опцию?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Должен ли HTTPS Everywhere иÑпользовать SSL Observatory?">
+
+<!ENTITY ssl-observatory.popup.yes "Да">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Включение данной опции безопаÑно, кроме ÑÐ»ÑƒÑ‡Ð°Ñ ÐºÐ¾Ð³Ð´Ð°
+Ð’Ñ‹ иÑпользуете очень навÑзчивую корпоративную Ñеть">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"БезопаÑно, кроме ÑÐ»ÑƒÑ‡Ð°Ñ ÐºÐ¾Ð³Ð´Ð° Ð’Ñ‹ иÑпользуете
+корпоративную Ñеть Ñ Ñекретными именами Ñерверов">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Отправить и проверить Ñертификаты, подпиÑанные
+неÑтандартными корневыми центрами Ñертификации">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Это безопаÑно (а так же Ñ…Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ð¸Ð´ÐµÑ) включить данную опцию,
+кроме ÑлучаÑ, когда Ð’Ñ‹ иÑпользуете навÑзчивую корпоративную Ñеть
+или ÐÐ½Ñ‚Ð¸Ð²Ð¸Ñ€ÑƒÑ ÐšÐ°ÑперÑкого, который Ñледит за Вашей работой в Ñети
+Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ TLS прокÑи и чаÑтного корневого Центра Сертификации.
+ЕÑли она будет включена в такой Ñети, то может обнародовать
+ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ том какие домены https:// были поÑещены через Ñтот
+прокÑи, вÑледÑтвие уникальных Ñертификатов которые он будет
+издавать. ПоÑтому мы оÑтавили её выключенной по умолчанию.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Проверить Ñертификаты иÑпользуемые Tor Ð´Ð»Ñ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð¾Ñти">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Проверить Ñертификаты иÑпользуемые Tor
+Ð´Ð»Ñ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð¾Ñти (требует Tor)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Эта Ð¾Ð¿Ñ†Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ ÑƒÑтановленного и включенного Tor.">
+
+<!ENTITY ssl-observatory.prefs.asn
+"При получении нового Ñертификата, Ñообщить
+SSL Observatory к какому провайдеру Вы подключены">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Будет получать и отправлÑть &quot;Ðомер Ðвтономной СиÑтемы&quot;
+Вашей Ñети. Это поможет нам локализовать атаки против HTTPS
+и определить наличие наблюдений Ð´Ð»Ñ Ñетей в таких меÑтах как
+Иран и СириÑ, где атаки Ñравнительно чаÑты.">
+
+<!ENTITY ssl-observatory.prefs.done "Готово">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere может иÑпользовать SSL Observatory. Это
+обеÑпечивает две вещи: (1) отправлÑет копии Ñертификатов в SSL
+Observatory, что бы помочь нам определить атаки 'человек
+поÑередине' и улучшить безопаÑноÑть Веб; и (2) позволÑет нам
+предупреждать Ð’Ð°Ñ Ð¾ небезопаÑных ÑоединениÑÑ… или атаках на
+Ваш браузер.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Ðапример, когда Ð’Ñ‹ заходите на https://www.something.com,
+Ñертификат полученный SSL Observatory будет означать что кто-то
+поÑетил www.something.com, но не кто именно его поÑетил, или
+какую конкретную Ñтраницу он проÑматривал. Ðаведите курÑор на
+опции Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ подробной информации:">
+
+<!ENTITY ssl-observatory.prefs.hide "Скрыть дополнительные опции">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"ПроверÑть Ñертификаты даже еÑли Tor недоÑтупен">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Мы по-прежнему ÑтараемÑÑ Ñохранить Ваши
+данные анонимными, но Ñта Ð¾Ð¿Ñ†Ð¸Ñ Ð¼ÐµÐ½ÐµÐµ безопаÑна.">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Отправить и проверить Ñертификаты Ð´Ð»Ñ Ð½ÐµÐ¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… DNS имён">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"ЕÑли Ð´Ð°Ð½Ð½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°, SSL Observatory не будет
+региÑтрировать Ñертификаты Ð´Ð»Ñ Ð¸Ð¼Ñ‘Ð½, которые он не может
+разрешить через DNS.">
+
+<!ENTITY ssl-observatory.prefs.show "Показать дополнительные опции">
+
+<!ENTITY ssl-observatory.prefs.title "ÐаÑтройки SSL Observatory">
+
+<!ENTITY ssl-observatory.prefs.use "ИÑпользовать SSL Observatory?">
+<!ENTITY ssl-observatory.warning.title "ПРЕДУПРЕЖДЕÐИЕ от SSL Observatory">
+<!ENTITY ssl-observatory.warning.showcert "Показать цепочку Ñертификатов">
+<!ENTITY ssl-observatory.warning.okay "Я понимаю">
+<!ENTITY ssl-observatory.warning.text "SSL Observatory выдал предупреждение
+Ð´Ð»Ñ Ñертификат(-а/-ов) данного Ñайта:">
+<!ENTITY ssl-observatory.warning.defense "ЕÑли Ð’Ñ‹ вошли в учётную запиÑÑŒ на данном Ñайте, может быть
+целеÑообразно Ñменить пароль поÑле уÑтановки безопаÑного
+ÑоединениÑ.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Подтвердите и проверьте ÑобÑтвенные Ñертификаты">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"РекомендуетÑÑ. КриптографичеÑкие проблемы оÑобенно
+раÑпроÑтранены в ÑамоподпиÑанных вÑтраиваемых уÑтройÑтвах.">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/si/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/si/https-everywhere.dtd
new file mode 100644
index 0000000..f528d07
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/si/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "HTTPS Everywhere පිලිබඳව">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "බොහ෠වෙබ් අඩවි සඳහ෠HTTPS ආරක්ෂà·à·€ ස්වයංක්â€à¶»à·“යව à¶´à·à·€à·’à¶ à·Šà¶ à·’ කරන්න.">
+<!ENTITY https-everywhere.about.version "සංස්කරණය">
+<!ENTITY https-everywhere.about.created_by "නිර්මිත">
+<!ENTITY https-everywhere.about.librarians "Ruleset Librarians">
+<!ENTITY https-everywhere.about.thanks "ස්තුතිය">
+<!ENTITY https-everywhere.about.contribute "HTTPS Everywhere පිලිබඳව ඔබ à¶šà·à¶¸à¶­à·’නම් මේව෠සලක෠බà·à¶½à·’ය යුතුය">
+<!ENTITY https-everywhere.about.donate_tor "Tor වලට ආධà·à¶» කිරීම">
+<!ENTITY https-everywhere.about.tor_lang_code "ඉංග්â€à¶»à·“සි">
+<!ENTITY https-everywhere.about.donate_eff " EFF වලට ආධà·à¶» කරන්න">
+
+<!ENTITY https-everywhere.menu.about "HTTPS Everywhere පිලිබඳව">
+<!ENTITY https-everywhere.menu.observatory "SSL නිරික්ෂණà·à¶œà·à¶» මනà·à¶´ ">
+<!ENTITY https-everywhere.menu.globalEnable "HTTPS Everywhere à¶šà·Šâ€à¶»à·’යà·à¶šà¶»à·€à¶±à·Šà¶±">
+<!ENTITY https-everywhere.menu.globalDisable "HTTPS Everywhere à¶šà·Šâ€à¶»à·’යà·à·€à·’රහිත කරවන්න">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere මනà·à¶´ ">
+<!ENTITY https-everywhere.prefs.enable_all "සියල්ල සබල කරන්න ">
+<!ENTITY https-everywhere.prefs.disable_all "සියල්ල අබල කරන්න ">
+<!ENTITY https-everywhere.prefs.reset_defaults "යථ෠තත්වයට පත් කරන්න">
+<!ENTITY https-everywhere.prefs.search "සොයන්න">
+<!ENTITY https-everywhere.prefs.site "අඩවිය">
+<!ENTITY https-everywhere.prefs.notes "සටහන්">
+<!ENTITY https-everywhere.prefs.list_caption "කුමන HTTPS à·„à·à¶»à·€à·”ම් කොන්දේසිය à¶­à·à¶»à¶œà¶±à·Šà¶±à¶¯ ? ">
+<!ENTITY https-everywhere.prefs.enabled "සබල කරන ලදී ">
+<!ENTITY https-everywhere.prefs.ruleset_howto "ඔබගේ rulesets ලියන ආකà·à¶»à¶º පිළිබද ඔබට ඉගෙනගත à·„à·à¶š(අනෙකුත් වෙබ් අඩවි සදහ෠සහය à¶‘à¶šà¶­à·” කිරීමට) ">
+<!ENTITY https-everywhere.prefs.here_link "මෙහි ">
+<!ENTITY https-everywhere.prefs.toggle "ටොගලය ">
+<!ENTITY https-everywhere.prefs.reset_default "යථ෠තත්වයට පත් කරන්න">
+<!ENTITY https-everywhere.prefs.view_xml_source "XML කේත පෙන්වන්න ">
+
+<!ENTITY https-everywhere.source.downloading "à¶·à·à¶œà¶­ වෙමින්">
+<!ENTITY https-everywhere.source.filename "ගොනු නම">
+<!ENTITY https-everywhere.source.unable_to_download "à¶·à·à¶œà¶­ කිරීම සිදුකල නොහà·à¶š.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/si/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/si/https-everywhere.properties
new file mode 100644
index 0000000..7cdeccb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/si/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = HTTPS Everywhere සබල කරවන්න
+https-everywhere.menu.globalDisable = HTTPS Everywhere අබල කරවන්න
+https-everywhere.menu.enableDisable = සබල/ දුබල කරවීමේ නීති
+https-everywhere.menu.noRules = (මෙම පිටුව සදහ෠නීති කිසිවක් à¶±à·à¶­)
+https-everywhere.menu.unknownRules = (මෙම පිටුව සම්බන්ද නීති පිළිබද සදහනක් à¶±à·à¶­)
+https-everywhere.toolbar.hint = HTTPS Everywhere දà·à¶±à·Š à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶šà¶ºà·’. ඔබට එය දà·à¶±à·Š යොමු තීරුවේ ඇති නිරූපකය ඔබමින් අඩවියෙන් අඩවියට ටොගල් à¶šà¶½ à·„à·à¶š.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/si/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/si/ssl-observatory.dtd
new file mode 100644
index 0000000..0064466
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/si/ssl-observatory.dtd
@@ -0,0 +1,100 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "විස්තර හ෠පෞද්ගලික තොරතුරු ">
+<!ENTITY ssl-observatory.popup.later "පසුව මගෙන් අසන්න.">
+<!ENTITY ssl-observatory.popup.no "à¶±à·à¶­">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere ඔබේ à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶»à¶ºà¶§ එරෙහිව ඇතිවන ආක්â€à¶»à¶¸à¶«
+හදුනà·à¶œà¶±à·Šà¶±à· à¶…à¶­à¶», ඔබට à¶½à·à¶¶à·™à¶± සහතික නිරික්ෂණà·à¶œà·à¶»à¶ºà¶§ යවයි.
+මෙම à¶šà·Šâ€à¶»à·’යà·à·€à¶½à·’ය සිදුකරනවà·à¶§ ඔබ à¶šà·à¶¸à¶­à·’ද?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"HTTPS Everywhere SSL නිරික්ෂණà·à¶œà·à¶»à¶º à¶·à·à·€à·’à¶­à· à¶šà¶½ යුතුද?">
+
+<!ENTITY ssl-observatory.popup.yes "ඔව්">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"ආගන්තුක සංයුක්ත à¶¢à·à¶½à¶ºà¶šà·Š à¶·à·à·€à·’ත෠කරන විට à·„à·à¶»à·™à¶±à·Šà¶±
+මෙය සබල කිරීම සුරක්ෂිත වේ:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"ඔබ රහසිගත අන්තඃජà·à¶½ සේවà·à¶¯à·à¶ºà¶š නමක් සමග සංයුක්ත à¶¢à·à¶½à¶ºà¶šà·Š à¶·à·à·€à·’ත෠නොකරන්නේ නම් ඔබ සුරක්ෂිතය.">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"යොමුකරීමෙන් පසු අසම්මත මුල සහතික බලධà·à¶»à·“න් අත්සන් à¶šà¶½ සහතික පරික්ෂ෠කරන්න.">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"ආගන්තුක සංයුක්ත à¶¢à·à¶½à¶ºà¶šà·Š à·„à· TLS proxy හ෠පෞද්ගලික සහතික බලධà·à¶»à·’ය෠විසින් ඔබේ පිරික්සුම් නිරීක්ෂණය කරන ලබන Kaspersky à¶´à·Šâ€à¶»à¶­à·’වයිරස මෘදුකà·à¶‚ගයක් à·„à· à¶·à·à·€à·’ත෠කරන විට මෙම විකල්පය සබල කිරීම සුරක්ෂිත නොවේ (එමෙන්ම මෙය අනුවණ අදහසකි). මෙවà·à¶±à·’ à¶¢à·à¶½à¶ºà¶š මෙම විකල්පය සබල à¶šà¶» à¶­à·à¶¶à·”වහොත් එම proxy යොද෠ගිය https:// වසම් පිළිබද à·ƒà·à¶šà·Šà·‚à·’ හෙළිවිය à·„à·à¶š. à¶’ නිස෠මෙම විකල්පය à·ƒà·à¶¸à·à¶±à·Šâ€à¶ºà¶ºà·™à¶±à·Š à¶…à¶¶à¶½ à¶šà¶» ඇත.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "නිර්නà·à¶¸à·’à¶šà¶­à·à·€ සදහ෠Tor යොදà·à¶œà¶±à·Šà¶±à· සහතික බලන්න.">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"නිර්නà·à¶¸à·’à¶šà¶­à·à·€ උදෙස෠Tor à¶·à·à·€à·’ත෠කරන (Tor à¶…à·€à·à·Šâ€à¶º වන) සහතික පරික්ෂ෠කරන්න">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"මෙම විකල්පය සදහ෠Tor ස්ථà·à¶´à¶±à¶º à¶šà¶» à¶šà·Šâ€à¶»à·’යà·à¶­à·Šà¶¸à¶š à¶šà¶½ යුතුයි.">
+
+<!ENTITY ssl-observatory.prefs.asn
+"ඔබ නව සහතිකයක් දකිනවිට නිරික්ෂනà·à¶œà·à¶»à¶ºà¶§ ඔබ සම්බන්ධ වී ඇති ISPය පවසන්න.">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"මෙමගින් ඔබේ à¶¢à·à¶½à¶ºà·š &quot;ස්වතන්ත්â€à¶» පද්ධති අංකය&quot; අමුණ෠යවයි. මෙමගින් à¶…à¶´à¶§ HTTPS වලට විරුද්ධව හටගන්න෠ආක්â€à¶»à¶¸à¶« හදුනà·à¶œà·à¶±à·“මටත්, අපගේ à¶¢à·à¶½à¶º කවුරුන් හ෠නිරීක්ෂණය කරන්නේ දà·à¶ºà·’ දà·à¶±à¶œà·à¶±à·“මටත් à¶‹à¶´à¶šà·à¶»à·“ වේ. සිරියà·à·€ හ෠ඉරà·à¶±à¶º à·€à·à¶±à·’ රටවල්වල මෙවà·à¶±à·’ ආක්â€à¶»à¶¸à¶« ඉත෠සුලබ වේ.">
+
+<!ENTITY ssl-observatory.prefs.done "à¶šà·à¶»à·Šà¶ºà¶º ඉටු කරන ලදී">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere මගින් EFF's SSL නිරික්ෂණà·à¶œà·à¶»à¶º à¶·à·à·€à·’à¶­à· à¶šà¶½ à·„à·à¶š. මෙමගින් කර්තව්â€à¶ºà¶ºà¶±à·Š 2 à¶šà·Š සිදුවේ: (1)
+HTTPS සහතිකවල අනුපිටපත් නිරික්ෂණà·à¶œà·à¶»à¶ºà¶§ යà·à·€à·“මෙන්,
+'man in the middle' ආක්â€à¶»à¶¸à¶«à¶º හදුනà·à¶œà·à¶±à·“මට à·„à· à¶¢à·à¶½ ආරක්ෂà·à·€ සදහ෠උපකà·à¶»à·“ වේ; තවද (2)
+මෙමගින් ඔබට à¶…à¶±à·à¶»à¶šà·Šà·‚à·’à¶­ සබà·à¶¯à·’ය෠හ෠ඔබේ à¶¶à·Šâ€à¶»à·€à·Šà·ƒà¶»à¶ºà¶§ එල්ලවන ආක්â€à¶»à¶¸à¶«à¶º පිළිබද අනතුරු අගවයි.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"උදà·à·„රණයක් ලෙස ඔබ https://www.something.com නම් වෙබ් අඩවියට ඇතුළු වූ විට,
+නිරික්ෂණà·à¶œà·à¶»à¶ºà¶§ à¶½à·à¶¶à·™à¶± සහතිකයෙන් යම් පුද්ගලයෙක් www.something.com වෙබ් අඩවියට à¶´à·Šâ€à¶»à·€à·šà· වූ à¶¶à·€ සදහන් කෙරුනද,
+ මෙම වෙබ් අඩවියට à¶´à·Šâ€à¶»à·€à·šà· à¶šà¶½ පුද්ගලය෠හ෠එම පුද්ගලය෠නරඹන ලද වෙබ් පිටුවන් පිළිබද තොරතුරු à¶½à·à¶¶à·™à¶±à·Šà¶±à·š à¶±à·à¶­.
+à·€à·à¶©à·’පුර විස්තර දà·à¶±à¶œà·à¶±à·“මට මෙම විකල්ප මත මුසකය තබන්න:">
+
+<!ENTITY ssl-observatory.prefs.hide "à¶´à·Šâ€à¶»à¶œà¶¸à¶± විකල්ප සගවන්න.">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Tor උපයà·à¶¢à·Šâ€à¶º නොවන අවස්ථ෠වලදී ද සහතික පරික්ෂ෠කරන්න.">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"මෙම විකල්පය එතරම් සුරක්ෂිත නොවන නමුදු, ඔබේ දත්ත නිර්නà·à¶¸à·’à¶šà·€ à¶­à¶¶à·à¶œà·à¶±à·“මට à¶…à¶´ උත්සහ කරමු">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"යොමුකිරීමෙන් පසු පොදු -නොවන DNS නම් සදහ෠සහතික පරික්ෂ෠කරන්න ">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"මෙම විකල්පය à¶­à·à¶»à·à¶œà·™à¶± නොමà·à¶­à·’ නම්, නිරික්ෂණà·à¶œà·à¶»à¶º මගින් DNS à¶±à·à¶¸ නිà·à·Šà¶ à¶º කරගà·à¶±à·“මට නොහà·à¶šà·’ සහතික සටහන් කරගන්නේ à¶±à·à¶­. ">
+
+<!ENTITY ssl-observatory.prefs.show "à¶´à·Šâ€à¶»à¶œà¶¸à¶± විකල්පයන් පෙන්වන්න ">
+
+<!ENTITY ssl-observatory.prefs.title "SSL නිරික්ෂණà·à¶œà·à¶» මනà·à¶´ ">
+
+<!ENTITY ssl-observatory.prefs.use "නිරික්ෂණà·à¶œà·à¶»à¶º à¶·à·à·€à·’ත෠කරයි ද?">
+<!ENTITY ssl-observatory.warning.title "EFF à·„à·“ SSL නිරික්ෂණà·à¶œà·à¶»à¶º අවවà·à¶¯à¶ºà¶šà·Š නිකුත් කරයි ">
+<!ENTITY ssl-observatory.warning.showcert "සහතික දà·à¶¸à¶º පෙන්වන්න ">
+<!ENTITY ssl-observatory.warning.okay "මම වටහà·à¶œà¶­à·’මි">
+<!ENTITY ssl-observatory.warning.text "EFF à·„à·“ SSL නිරික්ෂණà·à¶œà·à¶»à¶º මෙම වෙබ් අඩවියෙහි HTTPS සහතික(ය) පිළිබද අවවà·à¶¯à¶ºà¶šà·Š නිකුත් à¶šà¶» ඇත:">
+<!ENTITY ssl-observatory.warning.defense "ඔබ මෙම වෙබ් අඩවියට පුරන වී ඇති නම්, ඔබට සුරක්ෂිත සම්බන්ධතà·à·€à¶šà·Š ඇතිවිට ඔබේ මුරපදය වෙනස් කිරීම වඩ෠උචිත වේ.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"යොමු කිරීමෙන් පසු ස්වයං-අත්සන් යොදන ලද සහතික පරික්ෂ෠කරන්න.">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"මෙය නිර්දේà·à·’තයි; සංකේතන à¶œà·à¶§à¶½à·” ස්‌වයං-අත්සන් කරන ලද à¶‹à¶´à¶šà·Šâ€à¶»à¶¸à·€à¶½ බහුලය.">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sk/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sk/https-everywhere.dtd
new file mode 100644
index 0000000..3ea4ae8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sk/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "O HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "ZaÅ¡ifruj Web! Automatické použitie HTTPS zabezpeÄenia na mnohých stránkach.">
+<!ENTITY https-everywhere.about.version "Verzia">
+<!ENTITY https-everywhere.about.created_by "Autori">
+<!ENTITY https-everywhere.about.librarians "Ruleset Librarians">
+<!ENTITY https-everywhere.about.thanks "PoÄakovanie">
+<!ENTITY https-everywhere.about.contribute "Ak sa Vám páÄi HTTPS Everywhere, môžno by ste mohli">
+<!ENTITY https-everywhere.about.donate_tor "Prispieť na Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "sk">
+<!ENTITY https-everywhere.about.donate_eff "Prispieť na EFF">
+
+<!ENTITY https-everywhere.menu.about "O HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "Nastavenia SSL Observatory">
+<!ENTITY https-everywhere.menu.globalEnable "Povoliť HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Zakázať HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Nastavenia HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "Povoliť všetko">
+<!ENTITY https-everywhere.prefs.disable_all "Zakázať všetko">
+<!ENTITY https-everywhere.prefs.reset_defaults "Obnoviť predvolené">
+<!ENTITY https-everywhere.prefs.search "Hľadať">
+<!ENTITY https-everywhere.prefs.site "Stránka">
+<!ENTITY https-everywhere.prefs.notes "Poznámky">
+<!ENTITY https-everywhere.prefs.list_caption "Ktoré pravidlá pre HTTPS presmerovanie mám použiť?">
+<!ENTITY https-everywhere.prefs.enabled "Povolené">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Môžete sa nauÄiÅ¥ ako napísaÅ¥ svoje vlastné pravidlá (pridaÅ¥ podporu pre ÄalÅ¡ie webové stránky)">
+<!ENTITY https-everywhere.prefs.here_link "tu">
+<!ENTITY https-everywhere.prefs.toggle "Prepnúť">
+<!ENTITY https-everywhere.prefs.reset_default "Obnoviť predvolené">
+<!ENTITY https-everywhere.prefs.view_xml_source "Zobraziť zdroj XML">
+
+<!ENTITY https-everywhere.source.downloading "SÅ¥ahovanie">
+<!ENTITY https-everywhere.source.filename "Názov súboru">
+<!ENTITY https-everywhere.source.unable_to_download "Nie je možné stiahnuť zdroj.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sk/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sk/https-everywhere.properties
new file mode 100644
index 0000000..9ceec89
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sk/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Povoliť HTTPS Everywhere
+https-everywhere.menu.globalDisable = Zakázať HTTPS Everywhere
+https-everywhere.menu.enableDisable = Povoliť / Zakázať Pravidlá
+https-everywhere.menu.noRules = (Pre Túto Stránku Neexistujú Žiadne Pravidlá)
+https-everywhere.menu.unknownRules = (Pravidlá Pre Túto Stránku Sú Neznáme)
+https-everywhere.toolbar.hint = HTTPS Everywhere is now active. You can toggle it on a site-by-site basis by clicking the icon in the address bar.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sk/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sk/ssl-observatory.dtd
new file mode 100644
index 0000000..7fd9f57
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sk/ssl-observatory.dtd
@@ -0,0 +1,100 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Podrobnosti a Informácie o súkromí">
+<!ENTITY ssl-observatory.popup.later "Opýtajte sa ma neskôr">
+<!ENTITY ssl-observatory.popup.no "Nie">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere dokáže detekovať útoky
+na Váš prehliadaÄ tak, že poÅ¡le certifikát, ktorý ste dostali do
+Observatory. Zapnúť túto funkciu?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Má HTTPS Everywhere použiť SSL Observatory?">
+
+<!ENTITY ssl-observatory.popup.yes "Ãno">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Použitie tejto funkcie je bezpeÄné, pokiaľ nepoužívate
+firemnú sieť:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"BezpeÄné, pokiaľ nepoužívate firemnú sieÅ¥ s menami utajených intranetových serverov:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"PoÅ¡li a skontroluj certifikáty podpísané neÅ¡tandardnou koreňovou certifikaÄnou autoritou">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"PovoliÅ¥ túto možnosÅ¥ je bezpeÄné (a aj dobrý nápad) pokiaľ nepoužívate firemnú sieÅ¥ alebo antivírový softvér Kaspersky, ktorý monitoruje VaÅ¡e prehliadanie s TLS proxy a súkromné koreňové certifikaÄné autority. Ak povolíte túto možnosÅ¥ na takejto sieti, tak pomocou unikátnych certifikátov sa môžu uverejniÅ¥ dôkazy o tom aké https:// domény ste navÅ¡tívili cez túto proxy. Tak sme ju nechali v predvolenom nastavení vypnutú.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Skontrolovať certifikát pomocou Tor kvôli anonymite">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Skontrolovať certifikát pomocou Tor kvôli anonymite (vyžaduje Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Aby ste mohli použiť toto nastavenie, musíte mať nainštalovaný Tor a Torbutton">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Ak zistíš nový certifikát, povedz Observatory, ku ktorému poskytovateľovi internetového pripojenia si pripojený">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Toto stiahne a poÅ¡le &quot;Autonomous System Number&quot; VaÅ¡ej siete. Pomôže nám to lokalizovaÅ¥ útok proti HTTPS a urÄiÅ¥ Äi máme pozorovania zo sietí z miest ako je Iran a Syria, kde sú útoky pomerne Äasté.">
+
+<!ENTITY ssl-observatory.prefs.done "Hotovo">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere môže používať SSL Observatory od EFF. Toto spraví dve veci: (1)
+pošle kópie HTTPS certifikátov do Observatory, aby nám pomohli detekovať
+'man in the middle' útoky a zdokonaľovaÅ¥ bezpeÄnosÅ¥ na Webe; a (2)
+umožní nám varovaÅ¥ Vás o nebezpeÄných pripojeniach alebo útokoch na Váš prehliadaÄ.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Napríklad, ak navÅ¡tívite https://www.nieÄo.com, certifikát prijatý pomocou
+Observatory indikuje, že niekto navÅ¡tívil www.nieÄo.com, ale nie kto ju navÅ¡tívil
+alebo Äo konkrétne pozeral. Prejdite kurzorom nad jednotlivé možnosti
+pre ÄalÅ¡ie podrobnosti.">
+
+<!ENTITY ssl-observatory.prefs.hide "SkryÅ¥ pokroÄilé možnosti">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Skontrolujte certifikát, aj keÄ Tor nebude k dispozícií">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Pokúsime sa aj naÄalej udržaÅ¥ dáta anonymné, lenže táto možnosÅ¥ je menej bezpeÄná">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Pošli a skontroluj certifikáty pre neverejné názvy DNS">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Ak je táto voľba aktívna, tak Observatory nebude zaznamenávať certifikáty pre názvy, ktoré nedokáže rozoznať pomocou systému DNS.">
+
+<!ENTITY ssl-observatory.prefs.show "UkázaÅ¥ pokroÄilé možnosti">
+
+<!ENTITY ssl-observatory.prefs.title "Nastavenia SSL Observatory">
+
+<!ENTITY ssl-observatory.prefs.use "Použiť Observatory?">
+<!ENTITY ssl-observatory.warning.title "VAROVANIE od EFF SSL Observatory">
+<!ENTITY ssl-observatory.warning.showcert "Zobraziť reťaz certifikátov">
+<!ENTITY ssl-observatory.warning.okay "Porozumel som">
+<!ENTITY ssl-observatory.warning.text "EFF's SSL Observatory vydalo varovanie o HTTPS certifikáte(certifikátoch) pre túto stránku:">
+<!ENTITY ssl-observatory.warning.defense "Ak ste prihlásený na tejto stránke, tak sa odporúÄa, aby ste si zmenili heslo hneÄ ako budete maÅ¥ bezpeÄné pripojenie">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Posielať a preverovať certifikáty podpísané samé sebou">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Toto sa odporúÄa; kryptografické problémy sú veľmi Äasté u vstavaných zariadení, ktoré sú podpísané samé sebou">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sl/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sl/https-everywhere.dtd
new file mode 100644
index 0000000..13bbd7d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sl/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "O HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Zakodirajte internet! Samodejno uporabite HTTPS zaÅ¡Äito na mnogih spletnih straneh.">
+<!ENTITY https-everywhere.about.version "RazliÄica">
+<!ENTITY https-everywhere.about.created_by "Izdelal">
+<!ENTITY https-everywhere.about.librarians "Izdelovalci pravil">
+<!ENTITY https-everywhere.about.thanks "Zahvala">
+<!ENTITY https-everywhere.about.contribute "ÄŒe vam je HTTPS Everywhere vÅ¡eÄ, razmislite o">
+<!ENTITY https-everywhere.about.donate_tor "donaciji za Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "donaciji za EFF">
+
+<!ENTITY https-everywhere.menu.about "O HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "Nastavitve SSL Observatorija">
+<!ENTITY https-everywhere.menu.globalEnable "OmogoÄi HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "OnemogoÄi HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "Nastavitve HTTPS Everywhere">
+<!ENTITY https-everywhere.prefs.enable_all "OmogoÄi vse">
+<!ENTITY https-everywhere.prefs.disable_all "OnemogoÄi vse">
+<!ENTITY https-everywhere.prefs.reset_defaults "Ponastavi na privzeto">
+<!ENTITY https-everywhere.prefs.search "IÅ¡Äi">
+<!ENTITY https-everywhere.prefs.site "Stran">
+<!ENTITY https-everywhere.prefs.notes "Opombe">
+<!ENTITY https-everywhere.prefs.list_caption "Katera pravila za preusmeritev HTTPS naj bodo upoštevana?">
+<!ENTITY https-everywhere.prefs.enabled "OmogoÄeno">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Lahko se nauÄite pisati svoja pravila (da dodate podporo za druge spletne strani)">
+<!ENTITY https-everywhere.prefs.here_link "tukaj">
+<!ENTITY https-everywhere.prefs.toggle "Preklopi">
+<!ENTITY https-everywhere.prefs.reset_default "Ponastavi na privzeto">
+<!ENTITY https-everywhere.prefs.view_xml_source "Ogled XML kode">
+
+<!ENTITY https-everywhere.source.downloading "Prenos">
+<!ENTITY https-everywhere.source.filename "Ime datoteke">
+<!ENTITY https-everywhere.source.unable_to_download "Ne morem prenesti izvora.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sl/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sl/https-everywhere.properties
new file mode 100644
index 0000000..f70d2ee
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sl/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = OmogoÄi HTTPS Everywhere
+https-everywhere.menu.globalDisable = OnemogoÄi HTTPS Everywhere
+https-everywhere.menu.enableDisable = OmogoÄi / OnemogoÄi pravila
+https-everywhere.menu.noRules = (Za to stran ni pravil)
+https-everywhere.menu.unknownRules = (Pravila za to stran neznana)
+https-everywhere.toolbar.hint = HTTPS Everywhere je sedaj aktiven. Za posamezne spletne strani ga lahko preklapljate s klikom na ikono v naslovni vrstici.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sl/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sl/ssl-observatory.dtd
new file mode 100644
index 0000000..26917a3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sl/ssl-observatory.dtd
@@ -0,0 +1,97 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Podrobnosti in informacije o zasebnosti">
+<!ENTITY ssl-observatory.popup.later "Vprašaj me kasneje">
+<!ENTITY ssl-observatory.popup.no "Ne">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere lahko zazna napade
+na vaš brskalnik tako, da pošlje certifikate ki jih prejmete v
+Observatorij. Želite to vkljuÄiti?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Ali naj HTTPS Everywhere uporablja SSL Observatorij?">
+
+<!ENTITY ssl-observatory.popup.yes "Da">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"OmogoÄanje tega je varno, razen Äe uporabljate zelo
+vsiljivo poslovno omrežje:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Varno, razen Äe uporabljate poslovno omrežje s tajnimi imeni lokalnih strežnikov:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Predloži in preveri certifikate nestandardnih overoviteljev">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"OmogoÄanje tega je varno (in priporoÄljivo), razen Äe uporabljate vsiljivo poslovno omrežje ali protivirusni program Kaspersky, ki spremlja vaÅ¡e brskanje s TLS proksijem in privatnim overoviteljem certifikatov. ÄŒe je omogoÄeno v takem omrežju lahko ta možnost objavi dokazila o tem, katere https:// domene so bile obiskane preko tega proksija, ker bi ustvarila edinstvene certifikate. Zato je to privzeto izkljuÄeno.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Anonimno preveri certifikate preko omrežja Tor">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Anonimno preveri certifikate preko omrežja Tor (potrebuje Tor)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Za to možnost mora biti Tor nameÅ¡Äen in zagnan">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Ko zasledite nov certifikat povejte Observatoriju h kateremu internetnemu ponudniku ste prikljuÄeni">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"To bo pridobilo in poslalo &quot;Avtonomno Å¡tevilko sistema&quot; (ASN) vaÅ¡ega omrežja. To nam bo pomagalo locirati napade na HTTPS in doloÄiti, ali so opažanja iz omrežij na podroÄjih kot so Iran in Sirija, kjer so napadi razmeroma pogosti.">
+
+<!ENTITY ssl-observatory.prefs.done "KonÄano">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere lahko uporablja EFF SSL Observatorij. S tem naredi dvoje: (1)
+pošlje kopije HTTPS certifikatov observatoriju, da nam pomaga odkriti napade 'man in the middle' in izboljšati varnost medmrežja; (2)
+nam omogoÄi, da vas opozorimo na nevarne povezave ali napade na vaÅ¡ brskalnik.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Ko na primer obiÅ¡Äete https://www.nekadomena.com bo certifikat, ki ga sprejme observatorij, nakazal, da je nekdo obiskal www.nekadomena.com, ne pa kdo je to bil ali katero stran si je ogledal.
+Pridržite miÅ¡ko nad možnosti za veÄ podrobnosti:">
+
+<!ENTITY ssl-observatory.prefs.hide "Skrij napredne možnosti">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Preveri certifikate tudi Äe ni Tor omrežja">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Poskušali bomo ohraniti anonimnost podatkov, vendar je ta možnost manj varna">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Predloži in preveri certifikate za ne-javna imena DNS">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"ÄŒe je ta možnost ni izbrana, observatorij ne bo zabeležil potrdil za imena, ki jih ni mogoÄe razkriti s sistemom DNS.">
+
+<!ENTITY ssl-observatory.prefs.show "Pokaži napredne možnosti">
+
+<!ENTITY ssl-observatory.prefs.title "Nastavitve SSL Observatorija">
+
+<!ENTITY ssl-observatory.prefs.use "Uporabim Observatorij?">
+<!ENTITY ssl-observatory.warning.title "OPOZORILO s strani EFF SSL Observatorija">
+<!ENTITY ssl-observatory.warning.showcert "Pokaži certifikatno verigo">
+<!ENTITY ssl-observatory.warning.okay "Razumem">
+<!ENTITY ssl-observatory.warning.text "EFF SSL Observatorij je izdal opozorilo za HTTPS certifikat(e) za to stran:">
+<!ENTITY ssl-observatory.warning.defense "ÄŒe ste vpisani na tej strani je priporoÄljivo, da spremenite geslo, ko boste varno povezani.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Predložite in preverite samopodpisana potrdila">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"To je priporoÄljivo; težave s Å¡ifriranjem so posebej pogoste pri samopodpisanih vgnezdenih napravah.">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sv/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sv/https-everywhere.dtd
new file mode 100644
index 0000000..e43cae0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sv/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Om HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Kryptera webben! Använd HTTPS automatiskt på många sidor.">
+<!ENTITY https-everywhere.about.version "Version">
+<!ENTITY https-everywhere.about.created_by "Skapat av">
+<!ENTITY https-everywhere.about.librarians "Regelförfattare">
+<!ENTITY https-everywhere.about.thanks "Tack till">
+<!ENTITY https-everywhere.about.contribute "Om du gillar HTTPS Everywhere, kanske du kan tänka dig">
+<!ENTITY https-everywhere.about.donate_tor "Donera till Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "Donera till EFF">
+
+<!ENTITY https-everywhere.menu.about "Om HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL observerings inställningar">
+<!ENTITY https-everywhere.menu.globalEnable "Aktivera HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "Inaktivera HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Visa räknare">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere: Inställningar">
+<!ENTITY https-everywhere.prefs.enable_all "Aktivera alla">
+<!ENTITY https-everywhere.prefs.disable_all "Inaktivera alla">
+<!ENTITY https-everywhere.prefs.reset_defaults "Återställ till standardvärden">
+<!ENTITY https-everywhere.prefs.search "Sök">
+<!ENTITY https-everywhere.prefs.site "Sida">
+<!ENTITY https-everywhere.prefs.notes "Kommentarer">
+<!ENTITY https-everywhere.prefs.list_caption "Vilka HTTPS omdirigerings regler skall gälla?">
+<!ENTITY https-everywhere.prefs.enabled "Aktiverad">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Du kan lära dig att skriva egna regler (för att lägga till stöd för andra sidor">
+<!ENTITY https-everywhere.prefs.here_link "här">
+<!ENTITY https-everywhere.prefs.toggle "Växla">
+<!ENTITY https-everywhere.prefs.reset_default "Återställ till standardvärden">
+<!ENTITY https-everywhere.prefs.view_xml_source "Visa XML källa">
+
+<!ENTITY https-everywhere.source.downloading "Laddar ner">
+<!ENTITY https-everywhere.source.filename "Filnamn">
+<!ENTITY https-everywhere.source.unable_to_download "Kan inte ladda ner.">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Hoppsan. Du använde den stabila versionen av HTTPS Everywhere, men vi har kanske av misstag uppdaterat dig till utvecklingsversionen i den senaste publiceringen.">
+<!ENTITY https-everywhere.popup.paragraph2 "Vill du gå tillbaka till den stabila versionen?">
+<!ENTITY https-everywhere.popup.paragraph3 "Vi skulle vara tacksamma ifall du fortsatte använda utvecklingsversionen och hjälpte oss göra HTTPS Everywhere ännu bättre! Du kanske hittar någon bugg här och där, som du kan rapportera till https-everywhere@eff.org. Vi ber om ursäkt för besväret. Tack för att du använder HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Fortsätt använda utvecklingsversionen">
+<!ENTITY https-everywhere.popup.revert "Ladda ner den senaste stabila versionen">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "Testa alla HTTPS Everywhere regler">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Avbryt">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Starta">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sv/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sv/https-everywhere.properties
new file mode 100644
index 0000000..fb1cb14
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sv/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = Aktivera HTTPS Everywhere
+https-everywhere.menu.globalDisable = Inaktivera HTTPS Everywhere
+https-everywhere.menu.enableDisable = Aktivera / inaktivera regler
+https-everywhere.menu.noRules = (Inga Regler för Denna Sida)
+https-everywhere.menu.unknownRules = (Regler för Denna Sida Okänt)
+https-everywhere.toolbar.hint = HTTPS Everywhere är nu aktivt. Du kan ändra aktivera / inaktivera det per sida genom att klicka på ikonen i adressfältet.
+https-everywhere.migration.notification0 = För att implementera en kritiskt fix, åteställer denna uppdatering dina HTTPS Everywhere regelinställningar till dereas standardvärden.
+https-everywhere.menu.ruleset-tests = Kör alla regel tester för HTTPS Everywhere.
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sv/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sv/ssl-observatory.dtd
new file mode 100644
index 0000000..4cfac8b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/sv/ssl-observatory.dtd
@@ -0,0 +1,100 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Details and Privacy Information">
+<!ENTITY ssl-observatory.popup.later "Ask Me Later">
+<!ENTITY ssl-observatory.popup.no "No">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere can detect attacks
+against your browser by sending the certificates you receive to the
+Observatory. Turn this on?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"Should HTTPS Everywhere use the SSL Observatory?">
+
+<!ENTITY ssl-observatory.popup.yes "Yes">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"It is safe to enable this, unless you use a very
+intrusive corporate network:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Safe, unless you use a corporate network with secret intranet server names:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Submit and check certificates signed by non-standard root CAs">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"It is safe (and a good idea) to enable this option, unless you use an intrusive corporate network that monitors your browsing with a TLS proxy and a private root Certificate Authority. If enabled on such a network, this option might publish evidence of which https:// domains were being visited through that proxy, because of the unique certificates it would produce. So we leave it off by default.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Check certificates using Tor for anonymity">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Check certificates using Tor for anonymity (requires Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"This option requires Tor and Torbutton to be installed">
+
+<!ENTITY ssl-observatory.prefs.asn
+"When you see a new certificate, tell the Observatory which ISP you are connected to">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"This will fetch and send the &quot;Autonomous System number&quot; of your network. This will help us locate attacks against HTTPS, and to determine whether we have observations from networks in places like Iran and Syria where attacks are comparatively common.">
+
+<!ENTITY ssl-observatory.prefs.done "Done">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere can use EFF's SSL Observatory. This does two things: (1)
+sends copies of HTTPS certificates to the Observatory, to help us
+detect 'man in the middle' attacks and improve the Web's security; and (2)
+lets us warn you about insecure connections or attacks on your browser.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"For example, when you visit https://www.something.com, the certificate
+received by the Observatory will indicate that somebody visited
+www.something.com, but not who visited the site, or what specific page they
+looked at. Mouseover the options for further details:">
+
+<!ENTITY ssl-observatory.prefs.hide "Hide advanced options">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Check certificates even if Tor is not available">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"We will still try to keep the data anonymous, but this option is less secure">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Submit and check certificates for non-public DNS names">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Unless this option is checked, the Observatory will not record certificates for names that it cannot resolve through the DNS system.">
+
+<!ENTITY ssl-observatory.prefs.show "Show advanced options">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Observatory Preferences">
+
+<!ENTITY ssl-observatory.prefs.use "Use the Observatory?">
+<!ENTITY ssl-observatory.warning.title "WARNING from EFF's SSL Observatory">
+<!ENTITY ssl-observatory.warning.showcert "Show the certificate chain">
+<!ENTITY ssl-observatory.warning.okay "I understand">
+<!ENTITY ssl-observatory.warning.text "EFF's SSL Observatory has issued a warning about the HTTPS certificiate(s) for this site:">
+<!ENTITY ssl-observatory.warning.defense "If you are logged in to this site, it may be advisable to change your password once you have a safe connection.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Skicka och kolla själv-signerade certifikat">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Detta är rekommenderat; kryptografiska problem är särskilt vanliga i själv-signerad inbäddad utrustning">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/tr/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/tr/https-everywhere.dtd
new file mode 100644
index 0000000..e686d19
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/tr/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "Hakkında">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "İnternet'i şifrele ! Bir çok sitede otomatik olarak HTTPS kullan.">
+<!ENTITY https-everywhere.about.version "Sürüm">
+<!ENTITY https-everywhere.about.created_by "Yaratıcı">
+<!ENTITY https-everywhere.about.librarians "Kural Seti Kütüphaneleri">
+<!ENTITY https-everywhere.about.thanks "Teşekkürler">
+<!ENTITY https-everywhere.about.contribute "EÄŸer HTTPS Everywhere'i sevdiysen, sen de destek olabilirsin">
+<!ENTITY https-everywhere.about.donate_tor "Tor'a bağışla">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "EFF'e bağışla">
+
+<!ENTITY https-everywhere.menu.about "Hakkında">
+<!ENTITY https-everywhere.menu.observatory "SSL Gözlemcisi Tercihleri">
+<!ENTITY https-everywhere.menu.globalEnable "EtkinleÅŸtir">
+<!ENTITY https-everywhere.menu.globalDisable "Devre Dışı Bırak">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere Tercihleri">
+<!ENTITY https-everywhere.prefs.enable_all "Tümünü Etkinleştir">
+<!ENTITY https-everywhere.prefs.disable_all "Tümünü Devre Dışı Bırak">
+<!ENTITY https-everywhere.prefs.reset_defaults "Varsayılana Dön">
+<!ENTITY https-everywhere.prefs.search "Ara">
+<!ENTITY https-everywhere.prefs.site "Site">
+<!ENTITY https-everywhere.prefs.notes "Notlar">
+<!ENTITY https-everywhere.prefs.list_caption "Hangi HTTPS yönlendirme kuralları etkin olarak uygulansın?">
+<!ENTITY https-everywhere.prefs.enabled "Etkin">
+<!ENTITY https-everywhere.prefs.ruleset_howto "Kendi kural setini nasıl yazabileceğini">
+<!ENTITY https-everywhere.prefs.here_link "öğrenebilirsin.">
+<!ENTITY https-everywhere.prefs.toggle "DeÄŸiÅŸtir">
+<!ENTITY https-everywhere.prefs.reset_default "Varsayılana Dön">
+<!ENTITY https-everywhere.prefs.view_xml_source "XML Kaynağını Görüntüle">
+
+<!ENTITY https-everywhere.source.downloading "İndiriliyor">
+<!ENTITY https-everywhere.source.filename "Dosya Adı">
+<!ENTITY https-everywhere.source.unable_to_download "Kaynak indirmeye uygun deÄŸil">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 notification">
+<!ENTITY https-everywhere.popup.paragraph1 "Oops. You were using the stable version of HTTPS Everywhere, but we might have accidentally upgraded you to the development version in our last release.">
+<!ENTITY https-everywhere.popup.paragraph2 "Would you like to go back to stable?">
+<!ENTITY https-everywhere.popup.paragraph3 "We'd love it if you continued using our development release and helped us make HTTPS Everywhere better! You might find there are a few more bugs here and there, which you can report to https-everywhere@eff.org. Sorry about the inconvenience, and thank you for using HTTPS Everywhere.">
+<!ENTITY https-everywhere.popup.keep "Keep me on the development version">
+<!ENTITY https-everywhere.popup.revert "Download the latest stable version">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/tr/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/tr/https-everywhere.properties
new file mode 100644
index 0000000..37182cf
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/tr/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = EtkinleÅŸtir
+https-everywhere.menu.globalDisable = Devre dışı
+https-everywhere.menu.enableDisable = Kuralları Aç / Kapa
+https-everywhere.menu.noRules = (Bu sayfa için hiçbir kural yok)
+https-everywhere.menu.unknownRules = (Bu sayfa için hangi kuralların kullanılacağı bilinmiyor)
+https-everywhere.toolbar.hint = HTTPS Everywhere şuan etkin. Adres çubuğundaki simgeye tıklayarak istediğiniz sitelerde etkinliğini değiştirebilirsiniz.
+https-everywhere.migration.notification0 = In order to implement a crucial fix, this update resets your HTTPS Everywhere rule preferences to their default values.
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/tr/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/tr/ssl-observatory.dtd
new file mode 100644
index 0000000..f9fd37c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/tr/ssl-observatory.dtd
@@ -0,0 +1,96 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "Detaylar ve Gizlilik Bilgileri">
+<!ENTITY ssl-observatory.popup.later "Daha Sonra Sor">
+<!ENTITY ssl-observatory.popup.no "Hayır">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere tarayıcınıza
+karşı yapılacak saldırıları Gözlemci'ye alır.
+Bu özelliği aktif etmek ister misiniz?">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"HTTPS Everywhere SSL Gözlemcisini kullansın mı?">
+
+<!ENTITY ssl-observatory.popup.yes "Evet">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"Elverişsiz bir şirket ağı kullanmıyorsanız,
+etkinleştirmek sizin için güvenlidir.">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"Güvenli, gizli intranet şirket sunucularını kullanmadığınız sürece:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"Geçerli bir otorite tarafından imzalanmamış sertifikaları gönder ve kontrol et">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"Eğer ki TLS proxy veya özel kök Sertifika Otoritesi ile internet gezintilerini gözlemleyebilen Kaspersky antivirüs yazılımı ya da araya girilebilen bir şirket ağı kullanmıyorsanız bu özelliği etkinleştirmek güvenlidir (ve akıllıca), Eğer ağ üzerinde bunlar etkinse, bu seçenek eşsiz sertifikalar verdiğinden vekil sunucu üzerinden https:// adreslerine eriştiğinize kanıt olmuşturur. Dolayısıyla varsayılan ayarlarda kapalı bıraktık.">
+
+<!ENTITY ssl-observatory.prefs.anonymous "Gizliliğim için Tor kullanırken de sertifikaları kontrol et">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"Gizliliğim için Tor kullanırken de sertifikaları kontrol et (Torbutton gerektirir)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"Bu özellik Tor ve Torbutton'un yüklü olmasını gerektirir.">
+
+<!ENTITY ssl-observatory.prefs.asn
+"Yeni bir sertifika gördüğünde, hangi ISS'den bağlandığımı Gözlemci'ye bildir">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"Bu ağın &quot;Özerk Sistemi numarası&quot; alıp göndereceğiz. Bu bize HTTPS'e karşı gerçekleştirilen yerel saldırıları belirlemekte ve nispeten İran ve Suriye gibi yerlerde ağlara karşı gözlemler olup olmadığını belirlemek için yardımcı olacaktır.">
+
+<!ENTITY ssl-observatory.prefs.done "Tamamlandı">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere EFF'nin SSL Gözlemcisini kullanır. Gözlemci iki olay gerçekleştirir:(1)
+HTTPS sertifikalarının kopyalarını Gözlemci'ye yollar ki MITM saldırılarının tespitinde yardım edelim, internet güvenliğini geliştirebilelim; ve (2)
+seni güvensiz bağlantılar hakkında uyarabilelim.">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"Örneğin, https://www.hack4career.com adresini ziyaret ettiğinde ve eğer ki sayfayı daha önce hiç kimse ziyaret etmemişse sertifika Gözlemci tarafından ileride bu siteyi ziyaret edecekler için alınır. Daha fazla bilgi için aşağıdan gözlemciyi aktif etmelisiniz:">
+
+<!ENTITY ssl-observatory.prefs.hide "Gelişmiş ayarları gizle">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"Tor uygun olmadığında dahi sertifikaları kontrol et">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"Verilerini anonim tutmaya çalışıyoruz, ama bu özellik pek güvenli değil">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"Özel DNS isimleri için olan sertifikaları gönder ve kontrol et">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"Bu seçenek işaretlenmediği sürece, Gözlemci DNS sistemleri üzerinden çözümleyemediği sertifika isimlerini kaydetmeyecektir.">
+
+<!ENTITY ssl-observatory.prefs.show "Gelişmiş ayarları göster">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Gözlemci Tercihleri">
+
+<!ENTITY ssl-observatory.prefs.use "Gözlemci kullanılsın mı?">
+<!ENTITY ssl-observatory.warning.title " EFF'in SSL Gözlemcisi'nden UYARI">
+<!ENTITY ssl-observatory.warning.showcert "Sertifika zincirini göster">
+<!ENTITY ssl-observatory.warning.okay "Anladım">
+<!ENTITY ssl-observatory.warning.text "EFF SSL Gözlemcisi bu sitenin HTTPS serfikası (ları) hakkında bir sorun olduğunu belirtiyor:">
+<!ENTITY ssl-observatory.warning.defense "Eğer bu siteye giriş yaptıysan, güvenli bir bağlantı sağlandığında site sana şifreni değiştirmeni tavsiye edebilir.">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"Kendinden imzalı sertifikaları gönder ve kontrol et">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"Bu bir öneridir; özellikle kendinden imzalanmış gömülü cihazlarda şifreleme problemleri mevcut ">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/https-everywhere.dtd
new file mode 100644
index 0000000..d53c43c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/https-everywhere.dtd
@@ -0,0 +1,48 @@
+<!ENTITY https-everywhere.about.title "关于 HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "加密网络æµè§ˆï¼Œè‡ªåŠ¨ä½¿ç”¨ HTTPS 连接访问站点,更加安全。">
+<!ENTITY https-everywhere.about.version "版本">
+<!ENTITY https-everywhere.about.created_by "创建者">
+<!ENTITY https-everywhere.about.librarians "规则管ç†å‘˜">
+<!ENTITY https-everywhere.about.thanks "致谢">
+<!ENTITY https-everywhere.about.contribute "如果喜欢 HTTPS Everywhere,您å¯ä»¥è€ƒè™‘">
+<!ENTITY https-everywhere.about.donate_tor "æåŠ© Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "en">
+<!ENTITY https-everywhere.about.donate_eff "æåŠ©ç”µå­å‰çº¿åŸºé‡‘会 (EFF)">
+
+<!ENTITY https-everywhere.menu.about "关于 HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL Observatory 首选项">
+<!ENTITY https-everywhere.menu.globalEnable "å¯ç”¨ HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "ç¦ç”¨ HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere 首选项">
+<!ENTITY https-everywhere.prefs.enable_all "全部å¯ç”¨">
+<!ENTITY https-everywhere.prefs.disable_all "全部ç¦ç”¨">
+<!ENTITY https-everywhere.prefs.reset_defaults "é‡ç½®ä¸ºé»˜è®¤å€¼">
+<!ENTITY https-everywhere.prefs.search "æœç´¢">
+<!ENTITY https-everywhere.prefs.site "站点">
+<!ENTITY https-everywhere.prefs.notes "注释">
+<!ENTITY https-everywhere.prefs.list_caption "应用哪些 HTTPS é‡å®šå‘规则?">
+<!ENTITY https-everywhere.prefs.enabled "å·²å¯ç”¨">
+<!ENTITY https-everywhere.prefs.ruleset_howto "您å¯ä»¥å­¦ä¹ å¦‚何编写您自己的规则(以增加对其他网站的支æŒï¼‰">
+<!ENTITY https-everywhere.prefs.here_link "这里">
+<!ENTITY https-everywhere.prefs.toggle "切æ¢">
+<!ENTITY https-everywhere.prefs.reset_default "é‡ç½®ä¸ºé»˜è®¤å€¼">
+<!ENTITY https-everywhere.prefs.view_xml_source "查看 XML æ ¼å¼çš„æºä»£ç ">
+
+<!ENTITY https-everywhere.source.downloading "正在下载">
+<!ENTITY https-everywhere.source.filename "文件å">
+<!ENTITY https-everywhere.source.unable_to_download "无法下载æºä»£ç ã€‚">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0development.11 通知">
+<!ENTITY https-everywhere.popup.paragraph1 "抱歉,你之å‰ç”¨çš„æ˜¯ HTTPS Everywhere 稳定版,在上次å‘布时,我们å¯èƒ½ä¸å°å¿ƒå°†ä½ ç”¨çš„版本å‡çº§ä¸ºå¼€å‘版。">
+<!ENTITY https-everywhere.popup.paragraph2 "是å¦éœ€è¦æ¢ä¸ºç¨³å®šç‰ˆï¼Ÿ">
+<!ENTITY https-everywhere.popup.paragraph3 "如果您愿æ„,我们éžå¸¸æ¬¢è¿Žæ‚¨ç»§ç»­ä½¿ç”¨æˆ‘们的开å‘版本,并以此帮助我们改善 HTTPS Everywhereï¼æ‚¨ä¹Ÿè®¸ä¼šé‡åˆ°æ›´å¤šçš„缺陷问题,您å¯ä»¥æŠ¥å‘Šåˆ° https-everywhere@eff.org。对此带æ¥çš„ä¸ä¾¿æˆ‘们深感抱歉,感谢您使用 HTTPS Everywhere。">
+<!ENTITY https-everywhere.popup.keep "我è¦ç»§ç»­ä½¿ç”¨å¼€å‘版">
+<!ENTITY https-everywhere.popup.revert "下载最新稳定版">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/https-everywhere.properties
new file mode 100644
index 0000000..0e24891
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = å¯ç”¨ HTTPS Everywhere
+https-everywhere.menu.globalDisable = ç¦ç”¨ HTTPS Everywhere
+https-everywhere.menu.enableDisable = å¯ç”¨/ç¦ç”¨è§„则
+https-everywhere.menu.noRules = ï¼ˆæœ¬é¡µé¢æ— è§„则)
+https-everywhere.menu.unknownRules = (此页é¢è§„则未知)
+https-everywhere.toolbar.hint = HTTPS Everywhere 当å‰å·²æ¿€æ´»ã€‚æ ¹æ®æ¯ä¸ªç½‘站,å¯ç‚¹å‡»åœ°å€æ ä¸­å›¾æ ‡å¯ç”¨æˆ–ç¦ç”¨è¯¥åŠŸèƒ½ã€‚
+https-everywhere.migration.notification0 = 为了部署é‡è¦ä¿®è®¢ï¼Œè¯¥æ›´æ–°å°† HTTPS Everywhere 规则å好é‡ç½®ä¸ºé»˜è®¤å€¼ã€‚
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/ssl-observatory.dtd
new file mode 100644
index 0000000..6998aa6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-CN/ssl-observatory.dtd
@@ -0,0 +1,98 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "详情与éšç§ä¿¡æ¯">
+<!ENTITY ssl-observatory.popup.later "以åŽå†è¯´">
+<!ENTITY ssl-observatory.popup.no "å¦">
+
+<!ENTITY ssl-observatory.popup.text "通过将接收到的è¯ä¹¦
+æäº¤è‡³ Observatory,HTTPS Everywhere 能够检测针对æµè§ˆå™¨çš„æ”»å‡»ã€‚
+是å¦å¯ç”¨è¯¥åŠŸèƒ½ï¼Ÿ">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"是å¦å…许 HTTPS Everywhere 使用 SSL Observatory?">
+
+<!ENTITY ssl-observatory.popup.yes "是">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"å¯ç”¨è¿™ä¸ªåŠŸèƒ½æ˜¯å®‰å…¨çš„ï¼Œé™¤éžä½ æ‰€ç”¨çš„æ˜¯é«˜ä¾µå…¥æ€§çš„ä¼ä¸šç½‘络:">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"å®‰å…¨ï¼Œé™¤éžæ‰€ç”¨çš„ä¼ä¸šç½‘络具有加密的内部网æœåС噍å称:">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"æäº¤å¹¶æ£€æŸ¥ç”±éžæ ‡å‡†æ ¹ CA 所签åçš„è¯ä¹¦">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"å¯ç”¨æ­¤é€‰é¡¹æ˜¯å®‰å…¨ï¼ˆè€Œä¸”æœ‰ç›Šçš„ï¼‰ï¼Œé™¤éžæ‰€ç”¨çš„æ˜¯é«˜ä¾µå…¥æ€§çš„å…¬å¸ç½‘络,或者使用å¡å·´æ–¯åŸºé˜²ç—…毒软件通过本地 TLS 代ç†ä¸Žç§æœ‰æ ¹è¯ä¹¦è®¤è¯æ–¹æ£€æµ‹äº’è”网æµè§ˆè¡Œä¸ºã€‚对于这样的网络,由于生æˆçš„æ•°å­—è¯ä¹¦æ˜¯å”¯ä¸€çš„,å¯ç”¨è¯¥é€‰é¡¹å¯èƒ½å°†å…¬å¼€é€šè¿‡è¯¥ä»£ç†è®¿é—®çš„ https:// 网域å称,因此默认关闭该功能。">
+
+<!ENTITY ssl-observatory.prefs.anonymous "通过 Tor 网络进行数字è¯ä¹¦çš„æ£€æŸ¥ï¼Œä»¥ä¿æŠ¤åŒ¿å性">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"通过 Tor 网络进行数字è¯ä¹¦çš„æ£€æŸ¥ï¼Œä»¥ä¿æŠ¤åŒ¿åæ€§ï¼ˆéœ€è¦æœ‰ Tor)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"此选项需è¦å·²ç»å®‰è£…å¹¶è¿è¡Œ Tor">
+
+<!ENTITY ssl-observatory.prefs.asn
+"é‡åˆ°æ–°çš„æ•°å­—è¯ä¹¦æ—¶ï¼Œé€šçŸ¥ Observatory 当å‰ä½¿ç”¨çš„互è”网æœåŠ¡æä¾›å•† (ISP)">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"这将抓å–网络的“自治系统å·ç â€(Autonomous System number)。这将有助于找出对 HTTPS å‘动攻击的æºå¤´ï¼Œå¹¶åˆ¤æ–­åœ¨æ”»å‡»ç›¸å¯¹å¸¸è§çš„地区网络上,如伊朗和å™åˆ©äºšï¼Œæˆ‘们是å¦å…·æœ‰è§‚测数æ®ã€‚">
+
+<!ENTITY ssl-observatory.prefs.done "完æˆ">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere å¯ä»¥ä½¿ç”¨ EFF çš„ SSL 观测站 。 这有两个功能:
+(1) å°† HTTPS æ•°å­—è¯ä¹¦å¯„é€åˆ°è§‚测站,以å助我们侦测中间人å¼çš„æ”»å‡»
+并改善网络的安全性;
+(2) 针对ä¸å®‰å…¨çš„连接以åŠå¯¹ä½ çš„æµè§ˆå™¨è¿›è¡Œçš„æ”»å‡»ï¼Œå‘ä½ å‘出警告。">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"例如,在访问 https://www.something.com 时,观测站收到的数字è¯ä¹¦æ˜¾ç¤º
+æŸäººè®¿é—®äº† www.something.com,但ä¸ä¼šæ˜¾ç¤ºæ˜¯è°è®¿é—®äº†è¯¥ç«™ç‚¹æˆ–者æµè§ˆäº†
+哪些页é¢ã€‚将鼠标移至该选项å¯äº†è§£æ›´å¤šè¯¦ç»†ä¿¡æ¯ï¼š">
+
+<!ENTITY ssl-observatory.prefs.hide "éšè—高级选项">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"在没有 Tor 网络的情况下ä¾ç„¶æ£€æŸ¥æ•°å­—è¯ä¹¦">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"我们ä»å°†å°½åŠ›ç¡®ä¿æ•°æ®çš„åŒ¿åæ€§ï¼Œä½†è¯¥é€‰é¡¹çš„安全性较低">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"æäº¤å¹¶æ£€æŸ¥éžå…¬å¼€ DNS å称的数字è¯ä¹¦">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"除éžå‹¾é€‰è¯¥é€‰é¡¹ï¼Œå¦åˆ™è§‚测站将ä¸ä¼šè®°å½•通过 DNS 系统无法解æžåŸŸåçš„è¯ä¹¦ã€‚">
+
+<!ENTITY ssl-observatory.prefs.show "显示高级选项">
+
+<!ENTITY ssl-observatory.prefs.title "SSL Observatory 首选项">
+
+<!ENTITY ssl-observatory.prefs.use "是å¦ä½¿ç”¨è§‚测站?">
+<!ENTITY ssl-observatory.warning.title "EFF çš„ SSL 观测站å‘布的警告">
+<!ENTITY ssl-observatory.warning.showcert "显示数字è¯ä¹¦é“¾">
+<!ENTITY ssl-observatory.warning.okay "我已了解">
+<!ENTITY ssl-observatory.warning.text "EFF çš„ SSL 观测站已对该 HTTPS æ•°å­—è¯ä¹¦å‘出警告:">
+<!ENTITY ssl-observatory.warning.defense "如果已登录该站点,在使用安全连接时,å¯èƒ½å»ºè®®ä½ ä¿®æ”¹è¯¥ç«™ç‚¹çš„密ç ã€‚">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"æäº¤å¹¶æ£€æŸ¥è‡ªç­¾åè¯ä¹¦">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"我们推è该选项;在自签å的嵌入å¼è®¾å¤‡ä¸­ï¼ŒåŠ å¯†é—®é¢˜å°¤ä¸ºå¸¸è§">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/https-everywhere.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/https-everywhere.dtd
new file mode 100644
index 0000000..1b56a63
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/https-everywhere.dtd
@@ -0,0 +1,49 @@
+<!ENTITY https-everywhere.about.title "關於 HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_name "HTTPS Everywhere">
+<!ENTITY https-everywhere.about.ext_description "Encrypt the Web! Automatically use HTTPS security on many sites.
+ä½¿ç¶²è·¯åŠ å¯†ï¼æ–¼çœ¾å¤šç¶²ç«™ä¸Šè‡ªå‹•使用 HTTPS 安全連線。">
+<!ENTITY https-everywhere.about.version "版本">
+<!ENTITY https-everywhere.about.created_by "建立於">
+<!ENTITY https-everywhere.about.librarians "è¦å‰‡åº«ç®¡ç†">
+<!ENTITY https-everywhere.about.thanks "致è¬">
+<!ENTITY https-everywhere.about.contribute "若喜歡 HTTPS Everywhere,或許您å¯ä»¥è€ƒæ…®">
+<!ENTITY https-everywhere.about.donate_tor "贊助 Tor">
+<!ENTITY https-everywhere.about.tor_lang_code "zh-TW">
+<!ENTITY https-everywhere.about.donate_eff "贊助 EFF">
+
+<!ENTITY https-everywhere.menu.about "關於 HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.observatory "SSL 觀測站å好設定">
+<!ENTITY https-everywhere.menu.globalEnable "啟用 HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.globalDisable "åœç”¨ HTTPS Everywhere">
+<!ENTITY https-everywhere.menu.showCounter "Show Counter">
+
+<!ENTITY https-everywhere.prefs.title "HTTPS Everywhere å好設定">
+<!ENTITY https-everywhere.prefs.enable_all "全部啟用">
+<!ENTITY https-everywhere.prefs.disable_all "全部åœç”¨">
+<!ENTITY https-everywhere.prefs.reset_defaults "æ¢å¾©é è¨­å€¼">
+<!ENTITY https-everywhere.prefs.search "æœå°‹">
+<!ENTITY https-everywhere.prefs.site "網站">
+<!ENTITY https-everywhere.prefs.notes "備註">
+<!ENTITY https-everywhere.prefs.list_caption "è¦ä½¿ç”¨å“ªäº› HTTPS å°Žå‘è¦å‰‡ï¼Ÿ">
+<!ENTITY https-everywhere.prefs.enabled "已啟用">
+<!ENTITY https-everywhere.prefs.ruleset_howto "è¦äº†è§£å¦‚何編寫自訂è¦å‰‡(以增加å°å…¶ä»–網站的支æ´)">
+<!ENTITY https-everywhere.prefs.here_link "請看這裡">
+<!ENTITY https-everywhere.prefs.toggle "切æ›">
+<!ENTITY https-everywhere.prefs.reset_default "æ¢å¾©é è¨­å€¼">
+<!ENTITY https-everywhere.prefs.view_xml_source "檢視 XML 原始碼">
+
+<!ENTITY https-everywhere.source.downloading "下載中">
+<!ENTITY https-everywhere.source.filename "檔案å稱">
+<!ENTITY https-everywhere.source.unable_to_download "無法下載原始碼">
+
+<!ENTITY https-everywhere.popup.title "HTTPS Everywhere 4.0 dev.11通知">
+<!ENTITY https-everywhere.popup.paragraph1 "ç³Ÿç³•ã€‚ä»¥å‰æ‚¨ä¸€ç›´ä½¿ç”¨HTTPS Everywhere 穩定版本,但我們å¯èƒ½å·²ç¶“ä¸å°å¿ƒå‡ç´šæ‚¨åœ¨æˆ‘們最新版本中為開發中版本。">
+<!ENTITY https-everywhere.popup.paragraph2 "您想回復為穩定版本?">
+<!ENTITY https-everywhere.popup.paragraph3 "如果您繼續使用我們的開發中版本,並幫助我們使得HTTPS Everywhere變得更好,我們也很願æ„ï¼æ‚¨å¯èƒ½æœƒç™¼ç¾é€™è£¡å’Œé‚£è£¡æœ‰ä¸€äº›æ›´å¤šçš„錯誤,您å¯ä»¥å‘https-everywhere@eff.orgæäº¤å ±å‘Šï¼Œå°ä¸èµ·æ‚¨æ·»éº»ç…©äº†ï¼Œæ„Ÿè¬æ‚¨ä½¿ç”¨HTTPS Everywhere。">
+<!ENTITY https-everywhere.popup.keep "è®“æˆ‘ç‚ºæŒæ–¼é–‹ç™¼ä¸­ç‰ˆæœ¬">
+<!ENTITY https-everywhere.popup.revert "下載最新的穩定版本">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/https-everywhere.properties b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/https-everywhere.properties
new file mode 100644
index 0000000..e944b0d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/https-everywhere.properties
@@ -0,0 +1,8 @@
+https-everywhere.menu.globalEnable = 啟用 HTTPS Everywhere
+https-everywhere.menu.globalDisable = åœç”¨ HTTPS Everywhere
+https-everywhere.menu.enableDisable = 啟用 / åœç”¨è¦å‰‡
+https-everywhere.menu.noRules = (沒有è¦å‰‡é©ç”¨æ–¼æ­¤ç¶²é )
+https-everywhere.menu.unknownRules = (é©ç”¨æ­¤ç¶²é çš„è¦å‰‡ä¸æ˜Ž)
+https-everywhere.toolbar.hint = HTTPS Everywhere 已啟用。您å¯ä»¥æ ¹æ“šç¶²ç«™ç«™é»žåŸºç¤Žä¸Šé€éŽåˆ‡æ›ç¶²å€åˆ—圖示以啟用。
+https-everywhere.migration.notification0 = 為了徹底è½å¯¦é—œéµä¿®æ­£ï¼Œæ›´æ–°é‡ç½®æ‚¨çš„HTTPS Everywhere è¦å‰‡è¨­å®šè‡³å®ƒå€‘çš„é è¨­å€¼ã€‚
+https-everywhere.menu.ruleset-tests = Run HTTPS Everywhere Ruleset Tests
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/ssl-observatory.dtd b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/ssl-observatory.dtd
new file mode 100644
index 0000000..496c3df
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/locale/zh-TW/ssl-observatory.dtd
@@ -0,0 +1,91 @@
+<!-- Observatory popup window -->
+<!ENTITY ssl-observatory.popup.details "詳細資料與隱ç§è¨Šæ¯">
+<!ENTITY ssl-observatory.popup.later "ç¨å¾Œå†è©¢å•">
+<!ENTITY ssl-observatory.popup.no "å–æ¶ˆ">
+
+<!ENTITY ssl-observatory.popup.text "HTTPS Everywhere 能將您收到的憑證é€åˆ°è§€æ¸¬ç«™ï¼Œä»¥åµæ¸¬å‡ºå°æ‚¨ç€è¦½å™¨çš„æ”»æ“Šã€‚è¦å•Ÿç”¨æœ¬åŠŸèƒ½å—Žï¼Ÿ">
+
+<!--<!ENTITY ssl-observatory.popup.text
+"EFF's SSL Observatory can detect attacks against HTTPS websites by collecting
+and auditing the certificates being presented to your browser. Would you like
+to turn it on?">-->
+
+<!ENTITY ssl-observatory.popup.title
+"è¦è®“ HTTPS Everywhere 使用 SSL 觀測站嗎?">
+
+<!ENTITY ssl-observatory.popup.yes "確定">
+
+<!-- Observatory preferences dialog -->
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts1
+"啟用這個é¸é …æ˜¯å®‰å…¨çš„ï¼Œé™¤éžæ‚¨ä½¿ç”¨é«˜ä¾µå…¥æ€§çš„伿¥­ç¶²è·¯ï¼ˆcorporate network):">
+
+<!ENTITY ssl-observatory.prefs.adv_priv_opts2
+"啟用這個é¸é …æ˜¯å®‰å…¨çš„ï¼Œé™¤éžæ‚¨ä½¿ç”¨å«æœ‰éš±å¯†å…§éƒ¨ç¶²è·¯ä¼ºæœå™¨åç¨±çš„ä¼æ¥­ç¶²è·¯ï¼ˆcorporate network):">
+
+<!ENTITY ssl-observatory.prefs.alt_roots
+"é€å‡ºä¸¦æª¢æŸ¥ç”±éžæ­£è¦çš„æ ¹æ†‘證所簽署的憑證">
+
+<!ENTITY ssl-observatory.prefs.alt_roots_tooltip
+"啟用這個é¸é …æ˜¯å®‰å…¨çš„ï¼ˆè€Œä¸”ä¹ŸæŽ¨è–¦å•Ÿç”¨ï¼‰ï¼Œé™¤éžæ‚¨ä½¿ç”¨ä¾µå…¥æ€§çš„伿¥­ç¶²è·¯ï¼Œæˆ–者 Kaspersky 防毒軟體監控到您é€éŽ TLS proxy ç€è¦½ä¸¦ä½¿ç”¨ç§äººçš„æ ¹æ†‘證。 在這類的網路環境啟用此é¸é …,å¯èƒ½æœƒå› ç‚ºæ‰€ç”¢ç”Ÿçš„特有憑證,導致經由此代ç†ä¼ºæœå™¨ç€è¦½ç‰¹å®š https:// 網域的證明被公開。 å› æ­¤é è¨­ç‚ºä¸å•Ÿç”¨æ­¤é¸é …。">
+
+<!ENTITY ssl-observatory.prefs.anonymous "以 Tor åŒ¿åæª¢æ¸¬æ†‘è­‰">
+<!ENTITY ssl-observatory.prefs.anonymous_unavailable
+"以 Tor åŒ¿åæª¢æ¸¬æ†‘è­‰ï¼ˆéœ€å®‰è£ Torbutton)">
+<!ENTITY ssl-observatory.prefs.anonymous_tooltip
+"這個é¸é …å¿…é ˆå®‰è£ Tor åŠ Torbutton">
+
+<!ENTITY ssl-observatory.prefs.asn
+"看到新的憑證時,告訴觀測站您連線的 ISP">
+
+<!ENTITY ssl-observatory.prefs.asn_tooltip
+"這個é¸é …會å–得並回傳您的網路的自治系統號碼(Autonomous System Number)。 這個動作能å”助我們定ä½å° HTTPS çš„æ”»æ“Šï¼Œä¸¦åˆ¤å®šæˆ‘å€‘æ‰€è§€æ¸¬åˆ°ç™¼è‡ªä¼Šæœ—åŠæ•˜åˆ©äºžç­‰åœ°ç¶²è·¯çš„æ”»æ“Šæ˜¯å¦è¼ƒç‚ºå¸¸è¦‹ã€‚">
+
+<!ENTITY ssl-observatory.prefs.done "完æˆ">
+
+<!ENTITY ssl-observatory.prefs.explanation
+"HTTPS Everywhere å¯ä»¥ä½¿ç”¨ EFF çš„ SSL è§€æ¸¬ç«™ã€‚é€™éº¼åšæœ‰å…©å€‹æ•ˆæžœï¼š(1) å°‡ HTTPS 憑證的副本傳é€åˆ°è§€æ¸¬ç«™ï¼Œå”åŠ©æˆ‘å€‘åµæ¸¬ã€Œä¸­é–“äººã€æ”»æ“Šä¸¦å¢žé€²ç¶²è·¯å®‰å…¨æ€§ï¼›(2) 當您é‡åˆ°ä¸å®‰å…¨çš„連線或ç€è¦½å™¨é­åˆ°æ”»æ“Šæ™‚,我們能夠æå‡ºè­¦å‘Šã€‚">
+
+<!--<!ENTITY ssl-observatory.prefs.explanation2
+"When you visit https://www.example.com, the Observatory will learn that
+somebody visited that site, but will not know who or what page they looked at.
+Mouseover the options for further details:">-->
+
+<!ENTITY ssl-observatory.prefs.explanation2
+
+"例如當您開啟 https://www.something.com(範例網å€ï¼‰æ™‚,觀測站所收到的憑證會顯示有人ç€è¦½ www.something.comï¼Œä½†ä¸æœƒæŒ‡å‡ºç€è¦½è€…身分或者觀看的是哪些特定é é¢ã€‚將游標移至é¸é …上å¯å¾—到詳細說明:">
+
+<!ENTITY ssl-observatory.prefs.hide "éš±è—進階é¸é …">
+
+<!ENTITY ssl-observatory.prefs.nonanon
+"在 Tor ç„¡æ³•ä½¿ç”¨æ™‚ä»æª¢æŸ¥æ†‘è­‰">
+
+<!ENTITY ssl-observatory.prefs.nonanon_tooltip
+"æˆ‘å€‘ä»æœƒè©¦åœ–ç¶­æŒè³‡æ–™çš„åŒ¿åæ€§ï¼Œä½†é€™å€‹é¸é …的安全性較低">
+
+<!ENTITY ssl-observatory.prefs.priv_dns
+"é€å‡ºä¸¦æª¢æŸ¥éžå…¬å…±åŸŸå系統(non-public DNS)å稱的憑證">
+
+<!ENTITY ssl-observatory.prefs.priv_dns_tooltip
+"è§€æ¸¬ç«™ä¸æœƒè¨˜éŒ„å稱未經 DNS 系統解æžçš„æ†‘è­‰ï¼Œé™¤éžæ‚¨æœ‰å‹¾é¸é€™å€‹é¸é …。">
+
+<!ENTITY ssl-observatory.prefs.show "顯示進階é¸é …">
+
+<!ENTITY ssl-observatory.prefs.title "SSL 觀測站å好設定">
+
+<!ENTITY ssl-observatory.prefs.use "使用觀測站?">
+<!ENTITY ssl-observatory.warning.title "EFF çš„ SSL 觀測站æå‡ºè­¦å‘Š">
+<!ENTITY ssl-observatory.warning.showcert "顯示憑證éŠï¼ˆcertificate chain)">
+<!ENTITY ssl-observatory.warning.okay "我了解">
+<!ENTITY ssl-observatory.warning.text "EFF çš„ SSL 觀測站å°é€™å€‹ç¶²ç«™çš„ HTTPS 憑證æå‡ºè­¦å‘Š:">
+<!ENTITY ssl-observatory.warning.defense "若您已登入此網站,當您能使用安全連線時最好變更一下密碼。">
+
+<!ENTITY ssl-observatory.prefs.self_signed
+"é€å‡ºä¸¦æª¢æŸ¥è‡ªæˆ‘簽署的憑證">
+<!ENTITY ssl-observatory.prefs.self_signed_tooltip
+"建議啟用;加密å•題在自我簽署的嵌入å¼è£ç½®æ¥µç‚ºå¸¸è¦‹ã€‚">
+
+<!ENTITY https-everywhere.ruleset-tests.status_title "HTTPS Everywhere Ruleset Tests">
+<!ENTITY https-everywhere.ruleset-tests.status_cancel_button "Cancel">
+<!ENTITY https-everywhere.ruleset-tests.status_start_button "Start">
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/cross.png b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/cross.png
new file mode 100644
index 0000000..e39a083
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/cross.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-16-gray.png b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-16-gray.png
new file mode 100644
index 0000000..dc362dc
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-16-gray.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-16.png b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-16.png
new file mode 100644
index 0000000..a207180
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-16.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-24-gray.png b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-24-gray.png
new file mode 100644
index 0000000..9cf0798
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-24-gray.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-24.png b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-24.png
new file mode 100644
index 0000000..b4bffc0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-24.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-banner.jpg b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-banner.jpg
new file mode 100644
index 0000000..6154da6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-banner.jpg
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-half-24.png b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-half-24.png
new file mode 100644
index 0000000..b4bffc0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere-half-24.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere.css b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere.css
new file mode 100644
index 0000000..6c03b83
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere.css
@@ -0,0 +1,72 @@
+#https-everywhere-button {
+ -moz-binding: url("chrome://https-everywhere/content/toolbar_button_binding.xml#https-everywhere-binding");
+}
+
+#https-everywhere-button > .https-everywhere-button {
+ list-style-image: url("chrome://https-everywhere/skin/https-everywhere-24.png");
+}
+
+toolbar[iconsize="small"] #https-everywhere-button > .https-everywhere-button {
+ list-style-image: url("chrome://https-everywhere/skin/https-everywhere-16.png");
+}
+
+toolbar #https-everywhere-button,
+toolbar #https-everywhere-button > .https-everywhere-button {
+ -moz-box-orient: horizontal;
+}
+
+/* Use CSS attribute selector for changing icon */
+#https-everywhere-button[status="disabled"] > .https-everywhere-button {
+ list-style-image: url("chrome://https-everywhere/skin/https-everywhere-24-gray.png");
+}
+
+toolbar[iconsize="small"] #https-everywhere-button[status="disabled"] > .https-everywhere-button {
+ list-style-image: url("chrome://https-everywhere/skin/https-everywhere-16-gray.png");
+}
+
+/* ruleset counter */
+#rscounter {
+ margin: 3px -12px 0 -8px;
+ display: block;
+ -moz-box-sizing: border-box;
+}
+
+/* increase negative margins in the palette and panel so the button isn't too wide. */
+#wrapper-https-everywhere-button[place="palette"] > #https-everywhere-button > #rscounter,
+#https-everywhere-button[cui-areatype="menu-panel"] > #rscounter {
+ margin: 3px -16px 0 -8px;
+}
+
+/* rulesets applied label */
+#rsapplied {
+ -moz-box-sizing: border-box;
+ font-size: 12px;
+ color: #000;
+ background-color: #FFF;
+ border-width: 1px;
+ border-style: solid;
+ padding: 1px 1px 1px 1px;
+ visibility: hidden;
+}
+
+#https-everywhere-button:not([rulesetsApplied="0"]) #rsapplied {
+ visibility: visible;
+}
+
+#https-everywhere-button menuitem.active-item label {
+ color: #9AD100;
+ font-weight: bold;
+}
+#https-everywhere-button menuitem.moot-item label {
+ color: #9AD100;
+ opacity: 0.5;
+ font-weight: bold;
+}
+#https-everywhere-button menuitem.breaking-item label {
+ color: #b99999;
+ font-weight: bold;
+}
+#https-everywhere-button menuitem.inactive-item label {
+ color: #999999;
+ font-weight: bold;
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere.png b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere.png
new file mode 100644
index 0000000..5e21688
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/https-everywhere.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/loop.png b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/loop.png
new file mode 100644
index 0000000..33dfd42
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/loop.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/ssl-observatory-messy.jpg b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/ssl-observatory-messy.jpg
new file mode 100644
index 0000000..84c43e9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/ssl-observatory-messy.jpg
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/tick-moot.png b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/tick-moot.png
new file mode 100644
index 0000000..5d3c085
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/tick-moot.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/tick.png b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/tick.png
new file mode 100644
index 0000000..f055312
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/chrome/skin/tick.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/components/https-everywhere.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/components/https-everywhere.js
new file mode 100644
index 0000000..90f55e2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/components/https-everywhere.js
@@ -0,0 +1,832 @@
+// LOG LEVELS ---
+
+VERB=1;
+DBUG=2;
+INFO=3;
+NOTE=4;
+WARN=5;
+
+// PREFERENCE BRANCHES
+PREFBRANCH_ROOT=0;
+PREFBRANCH_RULE_TOGGLE=1;
+
+//---------------
+
+https_domains = {}; // maps domain patterns (with at most one
+ // wildcard) to RuleSets
+
+https_everywhere_blacklist = {}; // URLs we've given up on rewriting because
+ // of redirection loops
+
+https_blacklist_domains = {}; // domains for which there is at least one
+ // blacklisted URL
+
+//
+const CI = Components.interfaces;
+const CC = Components.classes;
+const CU = Components.utils;
+const CR = Components.results;
+const Ci = Components.interfaces;
+const Cc = Components.classes;
+const Cu = Components.utils;
+const Cr = Components.results;
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/FileUtils.jsm");
+
+const CP_SHOULDPROCESS = 4;
+
+const SERVICE_CTRID = "@eff.org/https-everywhere;1";
+const SERVICE_ID=Components.ID("{32c165b4-fe5e-4964-9250-603c410631b4}");
+const SERVICE_NAME = "Encrypts your communications with a number of major websites";
+
+const LLVAR = "LogLevel";
+
+const IOS = CC["@mozilla.org/network/io-service;1"].getService(CI.nsIIOService);
+const OS = CC['@mozilla.org/observer-service;1'].getService(CI.nsIObserverService);
+const LOADER = CC["@mozilla.org/moz/jssubscript-loader;1"].getService(CI.mozIJSSubScriptLoader);
+const _INCLUDED = {};
+
+// NoScript uses this blob to include js constructs that stored in the chrome/
+// directory, but are not attached to the Firefox UI (normally, js located
+// there is attached to an Overlay and therefore is part of the UI).
+
+// Reasons for this: things in components/ directory cannot be split into
+// separate files; things in chrome/ can be
+
+const INCLUDE = function(name) {
+ if (arguments.length > 1)
+ for (var j = 0, len = arguments.length; j < len; j++)
+ INCLUDE(arguments[j]);
+ else if (!_INCLUDED[name]) {
+ // we used to try/catch here, but that was less useful because it didn't
+ // produce line numbers for syntax errors
+ LOADER.loadSubScript("chrome://https-everywhere/content/code/"
+ + name + ".js");
+ _INCLUDED[name] = true;
+ }
+};
+
+const WP_STATE_START = CI.nsIWebProgressListener.STATE_START;
+const WP_STATE_STOP = CI.nsIWebProgressListener.STATE_STOP;
+const WP_STATE_DOC = CI.nsIWebProgressListener.STATE_IS_DOCUMENT;
+const WP_STATE_START_DOC = WP_STATE_START | WP_STATE_DOC;
+const WP_STATE_RESTORING = CI.nsIWebProgressListener.STATE_RESTORING;
+
+const LF_VALIDATE_ALWAYS = CI.nsIRequest.VALIDATE_ALWAYS;
+const LF_LOAD_BYPASS_ALL_CACHES = CI.nsIRequest.LOAD_BYPASS_CACHE | CI.nsICachingChannel.LOAD_BYPASS_LOCAL_CACHE;
+
+const NS_OK = 0;
+const NS_BINDING_ABORTED = 0x804b0002;
+const NS_BINDING_REDIRECTED = 0x804b0003;
+const NS_ERROR_UNKNOWN_HOST = 0x804b001e;
+const NS_ERROR_REDIRECT_LOOP = 0x804b001f;
+const NS_ERROR_CONNECTION_REFUSED = 0x804b000e;
+const NS_ERROR_NOT_AVAILABLE = 0x804b0111;
+
+const LOG_CONTENT_BLOCK = 1;
+const LOG_CONTENT_CALL = 2;
+const LOG_CONTENT_INTERCEPT = 4;
+const LOG_CHROME_WIN = 8;
+const LOG_XSS_FILTER = 16;
+const LOG_INJECTION_CHECK = 32;
+const LOG_DOM = 64;
+const LOG_JS = 128;
+const LOG_LEAKS = 1024;
+const LOG_SNIFF = 2048;
+const LOG_CLEARCLICK = 4096;
+const LOG_ABE = 8192;
+
+const HTML_NS = "http://www.w3.org/1999/xhtml";
+
+const WHERE_UNTRUSTED = 1;
+const WHERE_TRUSTED = 2;
+const ANYWHERE = 3;
+
+const N_COHORTS = 1000;
+
+const DUMMY_OBJ = {};
+DUMMY_OBJ.wrappedJSObject = DUMMY_OBJ;
+const DUMMY_FUNC = function() {};
+const DUMMY_ARRAY = [];
+
+const EARLY_VERSION_CHECK = !("nsISessionStore" in CI && typeof(/ /) === "object");
+
+// This is probably obsolete since the switch to the channel.redirectTo API
+const OBSERVER_TOPIC_URI_REWRITE = "https-everywhere-uri-rewrite";
+
+// XXX: Better plan for this?
+// We need it to exist to make our updates of ChannelReplacement.js easier.
+var ABE = {
+ consoleDump: false,
+ log: function(str) {
+ https_everywhereLog(WARN, str);
+ }
+};
+
+function xpcom_generateQI(iids) {
+ var checks = [];
+ for each (var iid in iids) {
+ checks.push("CI." + iid.name + ".equals(iid)");
+ }
+ var src = checks.length
+ ? "if (" + checks.join(" || ") + ") return this;\n"
+ : "";
+ return new Function("iid", src + "throw Components.results.NS_ERROR_NO_INTERFACE;");
+}
+
+function xpcom_checkInterfaces(iid,iids,ex) {
+ for (var j = iids.length; j-- >0;) {
+ if (iid.equals(iids[j])) return true;
+ }
+ throw ex;
+}
+
+INCLUDE('ChannelReplacement', 'IOUtil', 'HTTPSRules', 'HTTPS', 'Thread', 'ApplicableList');
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
+// This is black magic for storing Expando data w/ an nsIDOMWindow
+// See http://pastebin.com/qY28Jwbv ,
+// https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIControllers
+
+StorageController.prototype = {
+ QueryInterface: XPCOMUtils.generateQI(
+ [ Components.interfaces.nsISupports,
+ Components.interfaces.nsIController ]),
+ wrappedJSObject: null, // Initialized by constructor
+ supportsCommand: function (cmd) {return (cmd == this.command);},
+ isCommandEnabled: function (cmd) {return (cmd == this.command);},
+ onEvent: function(eventName) {return true;},
+ doCommand: function() {return true;}
+};
+
+function StorageController(command) {
+ this.command = command;
+ this.data = {};
+ this.wrappedJSObject = this;
+}
+
+/*var Controller = Class("Controller", XPCOM(CI.nsIController), {
+ init: function (command, data) {
+ this.command = command;
+ this.data = data;
+ },
+ supportsCommand: function (cmd) cmd === this.command
+});*/
+
+function HTTPSEverywhere() {
+
+ // Set up logging in each component:
+ HTTPS.log = HTTPSRules.log = RuleWriter.log = this.log = https_everywhereLog;
+
+ this.log = https_everywhereLog;
+ this.wrappedJSObject = this;
+ this.https_rules = HTTPSRules;
+ this.INCLUDE=INCLUDE;
+ this.ApplicableList = ApplicableList;
+ this.browser_initialised = false; // the browser is completely loaded
+
+ this.prefs = this.get_prefs();
+ this.rule_toggle_prefs = this.get_prefs(PREFBRANCH_RULE_TOGGLE);
+
+ // We need to use observers instead of categories for FF3.0 for these:
+ // https://developer.mozilla.org/en/Observer_Notifications
+ // https://developer.mozilla.org/en/nsIObserverService.
+ // https://developer.mozilla.org/en/nsIObserver
+ // We also use the observer service to let other extensions know about URIs
+ // we rewrite.
+ this.obsService = CC["@mozilla.org/observer-service;1"]
+ .getService(Components.interfaces.nsIObserverService);
+
+ if(this.prefs.getBoolPref("globalEnabled")){
+ this.obsService.addObserver(this, "profile-before-change", false);
+ this.obsService.addObserver(this, "profile-after-change", false);
+ this.obsService.addObserver(this, "sessionstore-windows-restored", false);
+ this.obsService.addObserver(this, "browser:purge-session-history", false);
+ }
+
+ var pref_service = Components.classes["@mozilla.org/preferences-service;1"]
+ .getService(Components.interfaces.nsIPrefBranchInternal);
+ var branch = pref_service.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
+
+ branch.addObserver("extensions.https_everywhere.enable_mixed_rulesets",
+ this, false);
+ branch.addObserver("security.mixed_content.block_active_content",
+ this, false);
+
+ return;
+}
+
+
+// nsIContentPolicy interface
+// we use numeric constants for performance sake:
+const TYPE_OTHER = 1;
+const TYPE_SCRIPT = 2;
+const TYPE_IMAGE = 3;
+const TYPE_STYLESHEET = 4;
+const TYPE_OBJECT = 5;
+const TYPE_DOCUMENT = 6;
+const TYPE_SUBDOCUMENT = 7;
+const TYPE_REFRESH = 8;
+const TYPE_XBL = 9;
+const TYPE_PING = 10;
+const TYPE_XMLHTTPREQUEST = 11;
+const TYPE_OBJECT_SUBREQUEST = 12;
+const TYPE_DTD = 13;
+const TYPE_FONT = 14;
+const TYPE_MEDIA = 15;
+// --------------
+// REJECT_SERVER = -3
+// ACCEPT = 1
+
+
+// Some of these types are known by arbitrary assertion at
+// https://bugzilla.mozilla.org/show_bug.cgi?id=677643#c47
+// TYPE_FONT was required to fix https://trac.torproject.org/projects/tor/ticket/4194
+// TYPE_SUBDOCUMENT was required to fix https://trac.torproject.org/projects/tor/ticket/4149
+// I have NO IDEA why JS won't let me use the constants above in defining this
+const shouldLoadTargets = {
+ 1 : true,
+ 3 : true,
+ 5 : true,
+ 12 : true,
+ 14 : true,
+ 7 : true
+};
+
+
+
+/*
+In recent versions of Firefox and HTTPS Everywhere, the call stack for performing an HTTP -> HTTPS rewrite looks like this:
+
+1. HTTPSEverywhere.observe() gets a callback with the "http-on-modify-request" topic, and the channel as a subject
+
+ 2. HTTPS.replaceChannel()
+
+ 3. HTTPSRules.rewrittenURI()
+
+ 4. HTTPSRules.potentiallyApplicableRulesets uses <target host=""> elements to identify relevant rulesets
+
+ foreach RuleSet:
+
+ 4. RuleSet.transformURI()
+
+ 5. RuleSet.apply() does the tests and rewrites with RegExps, returning a string
+
+ 4. RuleSet.transformURI() makes a new uri object for the destination string, if required
+
+ 2. HTTPS.replaceChannel() calls channel.redirectTo() if a redirect is needed
+
+
+In addition, the following other important tasks happen along the way:
+
+HTTPSEverywhere.observe() aborts if there is a redirect loop
+ finds a reference to the ApplicableList or alist that represents the toolbar context menu
+
+HTTPS.replaceChannel() notices redirect loops (and used to do much more complex XPCOM API work in the NoScript-based past)
+
+HTTPSRules.rewrittenURI() works around weird URI types like about: and http://user:pass@example.com/
+ and notifies the alist of what it should display for each ruleset
+
+*/
+
+// This defines for Mozilla what stuff HTTPSEverywhere will implement.
+
+// ChannelEventSink used to be necessary in order to handle redirects (eg
+// HTTP redirects) correctly. It may now be obsolete? XXX
+
+HTTPSEverywhere.prototype = {
+ prefs: null,
+ // properties required for XPCOM registration:
+ classDescription: SERVICE_NAME,
+ classID: SERVICE_ID,
+ contractID: SERVICE_CTRID,
+
+ _xpcom_factory: {
+ createInstance: function (outer, iid) {
+ if (outer != null)
+ throw Components.results.NS_ERROR_NO_AGGREGATION;
+ if (!HTTPSEverywhere.instance)
+ HTTPSEverywhere.instance = new HTTPSEverywhere();
+ return HTTPSEverywhere.instance.QueryInterface(iid);
+ },
+
+ QueryInterface: XPCOMUtils.generateQI(
+ [ Components.interfaces.nsISupports,
+ Components.interfaces.nsIModule,
+ Components.interfaces.nsIFactory ])
+ },
+
+ // [optional] an array of categories to register this component in.
+ _xpcom_categories: [
+ {
+ category: "app-startup",
+ },
+ ],
+
+ // QueryInterface implementation, e.g. using the generateQI helper
+ QueryInterface: XPCOMUtils.generateQI(
+ [ Components.interfaces.nsIObserver,
+ Components.interfaces.nsISupports,
+ Components.interfaces.nsISupportsWeakReference,
+ Components.interfaces.nsIWebProgressListener,
+ Components.interfaces.nsIWebProgressListener2,
+ Components.interfaces.nsIChannelEventSink ]),
+
+ wrappedJSObject: null, // Initialized by constructor
+
+ getWeakReference: function () {
+ return Components.utils.getWeakReference(this);
+ },
+
+ // An "expando" is an attribute glued onto something. From NoScript.
+ getExpando: function(domWin, key) {
+ var c = domWin.controllers.getControllerForCommand("https-everywhere-storage");
+ try {
+ if (c) {
+ c = c.wrappedJSObject;
+ //this.log(DBUG, "Found a controller, returning data");
+ return c.data[key];
+ } else {
+ this.log(INFO, "No controller attached to " + domWin);
+ return null;
+ }
+ } catch(e) {
+ // Firefox 3.5
+ this.log(WARN,"exception in getExpando");
+ this.getExpando = this.getExpando_old;
+ this.setExpando = this.setExpando_old;
+ return this.getExpando_old(domWin, key, null);
+ }
+ },
+ setExpando: function(domWin, key, value) {
+ var c = domWin.controllers.getControllerForCommand("https-everywhere-storage");
+ try {
+ if (!c) {
+ this.log(DBUG, "Appending new StorageController for " + domWin);
+ c = new StorageController("https-everywhere-storage");
+ domWin.controllers.appendController(c);
+ } else {
+ c = c.wrappedJSObject;
+ }
+ c.data[key] = value;
+ } catch(e) {
+ this.log(WARN,"exception in setExpando");
+ this.getExpando = this.getExpando_old;
+ this.setExpando = this.setExpando_old;
+ this.setExpando_old(domWin, key, value);
+ }
+ },
+
+ // This method is straight out of NoScript... we fall back to it in FF 3.*?
+ getExpando_old: function(domWin, key, defValue) {
+ var domObject = domWin.document;
+ return domObject && domObject.__httpsEStorage && domObject.__httpsEStorage[key] ||
+ (defValue ? this.setExpando(domObject, key, defValue) : null);
+ },
+ setExpando_old: function(domWin, key, value) {
+ var domObject = domWin.document;
+ if (!domObject) return null;
+ if (!domObject.__httpsEStorage) domObject.__httpsEStorage = {};
+ if (domObject.__httpsEStorage) domObject.__httpsEStorage[key] = value;
+ else this.log(WARN, "Warning: cannot set expando " + key + " to value " + value);
+ return value;
+ },
+
+ // We use onLocationChange to make a fresh list of rulesets that could have
+ // applied to the content in the current page (the "applicable list" is used
+ // for the context menu in the UI). This will be appended to as various
+ // content is embedded / requested by JavaScript.
+ onLocationChange: function(wp, req, uri) {
+ if (wp instanceof CI.nsIWebProgress) {
+ if (!this.newApplicableListForDOMWin(wp.DOMWindow))
+ this.log(WARN,"Something went wrong in onLocationChange");
+ } else {
+ this.log(WARN,"onLocationChange: no nsIWebProgress");
+ }
+ },
+
+ getWindowForChannel: function(channel) {
+ // Obtain an nsIDOMWindow from a channel
+ let loadContext;
+ try {
+ loadContext = channel.notificationCallbacks.getInterface(CI.nsILoadContext);
+ } catch(e) {
+ try {
+ loadContext = channel.loadGroup.notificationCallbacks.getInterface(CI.nsILoadContext);
+ } catch(e) {
+ this.log(NOTE, "No loadContext for " + channel.URI.spec);
+ return null;
+ }
+ }
+
+ let domWin = loadContext.associatedWindow;
+ if (!domWin) {
+ this.log(NOTE, "failed to get DOMWin for " + channel.URI.spec);
+ return null;
+ }
+
+ domWin = domWin.top;
+ return domWin;
+ },
+
+ // the lists get made when the urlbar is loading something new, but they
+ // need to be appended to with reference only to the channel
+ getApplicableListForChannel: function(channel) {
+ var domWin = this.getWindowForChannel(channel);
+ return this.getApplicableListForDOMWin(domWin, "on-modify-request w " + domWin);
+ },
+
+ newApplicableListForDOMWin: function(domWin) {
+ if (!domWin || !(domWin instanceof CI.nsIDOMWindow)) {
+ this.log(WARN, "Get alist without domWin");
+ return null;
+ }
+ var dw = domWin.top;
+ var alist = new ApplicableList(this.log,dw.document,dw);
+ this.setExpando(dw,"applicable_rules",alist);
+ return alist;
+ },
+
+ getApplicableListForDOMWin: function(domWin, where) {
+ if (!domWin || !(domWin instanceof CI.nsIDOMWindow)) {
+ //this.log(WARN, "Get alist without domWin");
+ return null;
+ }
+ var dw = domWin.top;
+ var alist= this.getExpando(dw,"applicable_rules",null);
+ if (alist) {
+ //this.log(DBUG,"get AL success in " + where);
+ return alist;
+ } else {
+ //this.log(DBUG, "Making new AL in getApplicableListForDOMWin in " + where);
+ alist = new ApplicableList(this.log,dw.document,dw);
+ this.setExpando(dw,"applicable_rules",alist);
+ }
+ return alist;
+ },
+
+ observe: function(subject, topic, data) {
+ // Top level glue for the nsIObserver API
+ var channel = subject;
+ //this.log(VERB,"Got observer topic: "+topic);
+
+ if (topic == "http-on-modify-request") {
+ if (!(channel instanceof CI.nsIHttpChannel)) return;
+
+ this.log(DBUG,"Got http-on-modify-request: "+channel.URI.spec);
+ var lst = this.getApplicableListForChannel(channel); // null if no window is associated (ex: xhr)
+ if (channel.URI.spec in https_everywhere_blacklist) {
+ this.log(DBUG, "Avoiding blacklisted " + channel.URI.spec);
+ if (lst) lst.breaking_rule(https_everywhere_blacklist[channel.URI.spec]);
+ else this.log(NOTE,"Failed to indicate breakage in content menu");
+ return;
+ }
+ HTTPS.replaceChannel(lst, channel);
+ } else if (topic == "http-on-examine-response") {
+ this.log(DBUG, "Got http-on-examine-response @ "+ (channel.URI ? channel.URI.spec : '') );
+ HTTPS.handleSecureCookies(channel);
+ } else if (topic == "http-on-examine-merged-response") {
+ this.log(DBUG, "Got http-on-examine-merged-response ");
+ HTTPS.handleSecureCookies(channel);
+ } else if (topic == "cookie-changed") {
+ // Javascript can add cookies via document.cookie that are insecure.
+ if (data == "added" || data == "changed") {
+ // subject can also be an nsIArray! bleh.
+ try {
+ subject.QueryInterface(CI.nsIArray);
+ var elems = subject.enumerate();
+ while (elems.hasMoreElements()) {
+ var cookie = elems.getNext()
+ .QueryInterface(CI.nsICookie2);
+ if (!cookie.isSecure) {
+ HTTPS.handleInsecureCookie(cookie);
+ }
+ }
+ } catch(e) {
+ subject.QueryInterface(CI.nsICookie2);
+ if(!subject.isSecure) {
+ HTTPS.handleInsecureCookie(subject);
+ }
+ }
+ }
+ } else if (topic == "profile-before-change") {
+ this.log(INFO, "Got profile-before-change");
+ var catman = Components.classes["@mozilla.org/categorymanager;1"]
+ .getService(Components.interfaces.nsICategoryManager);
+ catman.deleteCategoryEntry("net-channel-event-sinks", SERVICE_CTRID, true);
+ Thread.hostRunning = false;
+ } else if (topic == "profile-after-change") {
+ this.log(DBUG, "Got profile-after-change");
+
+ if(this.prefs.getBoolPref("globalEnabled")){
+ OS.addObserver(this, "cookie-changed", false);
+ OS.addObserver(this, "http-on-modify-request", false);
+ OS.addObserver(this, "http-on-examine-merged-response", false);
+ OS.addObserver(this, "http-on-examine-response", false);
+
+ var dls = CC['@mozilla.org/docloaderservice;1']
+ .getService(CI.nsIWebProgress);
+ dls.addProgressListener(this, CI.nsIWebProgress.NOTIFY_LOCATION);
+ this.log(INFO,"ChannelReplacement.supported = "+ChannelReplacement.supported);
+
+ HTTPSRules.init();
+
+ Thread.hostRunning = true;
+ var catman = Components.classes["@mozilla.org/categorymanager;1"]
+ .getService(Components.interfaces.nsICategoryManager);
+ // hook on redirections (non persistent, otherwise crashes on 1.8.x)
+ catman.addCategoryEntry("net-channel-event-sinks", SERVICE_CTRID,
+ SERVICE_CTRID, false, true);
+ }
+ } else if (topic == "sessionstore-windows-restored") {
+ this.log(DBUG,"Got sessionstore-windows-restored");
+ this.maybeShowObservatoryPopup();
+ this.browser_initialised = true;
+ } else if (topic == "nsPref:changed") {
+ // If the user toggles the Mixed Content Blocker settings, reload the rulesets
+ // to enable/disable the mixedcontent ones
+
+ // this pref gets set to false and then true during FF 26 startup!
+ // so do nothing if we're being notified during startup
+ if (!this.browser_initialised)
+ return;
+ switch (data) {
+ case "security.mixed_content.block_active_content":
+ case "extensions.https_everywhere.enable_mixed_rulesets":
+ var p = CC["@mozilla.org/preferences-service;1"].getService(CI.nsIPrefBranch);
+ var val = p.getBoolPref("security.mixed_content.block_active_content");
+ this.log(INFO,"nsPref:changed for "+data + " to " + val);
+ HTTPSRules.init();
+ break;
+ }
+ } else if (topic == "browser:purge-session-history") {
+ // The list of rulesets that have been loaded from the sqlite DB
+ // constitutes a parallel history store, so we have to clear it.
+ this.log(DBUG, "History cleared, reloading HTTPSRules to avoid information leak.");
+ HTTPSRules.init();
+ }
+ return;
+ },
+
+ maybeShowObservatoryPopup: function() {
+ // Show the popup at most once. Users who enabled the Observatory before
+ // a version that would have shown it to them, don't need to see it
+ // again.
+ var ssl_observatory = CC["@eff.org/ssl-observatory;1"]
+ .getService(Components.interfaces.nsISupports)
+ .wrappedJSObject;
+ var shown = ssl_observatory.myGetBoolPref("popup_shown");
+ var enabled = ssl_observatory.myGetBoolPref("enabled");
+ var that = this;
+ var obs_popup_callback = function(result) {
+ if (result) that.log(INFO, "Got positive proxy test.");
+ else that.log(INFO, "Got negative proxy text.");
+ // We are now ready to show the popup in its most informative state
+ that.chrome_opener("chrome://https-everywhere/content/observatory-popup.xul");
+ };
+ if (!shown && !enabled)
+ ssl_observatory.registerProxyTestNotification(obs_popup_callback);
+
+ if (shown && enabled)
+ this.maybeCleanupObservatoryPrefs(ssl_observatory);
+ },
+
+ maybeCleanupObservatoryPrefs: function(ssl_observatory) {
+ // Recover from a past UI processing bug that would leave the Obsevatory
+ // accidentally disabled for some users
+ // https://trac.torproject.org/projects/tor/ticket/10728
+ var clean = ssl_observatory.myGetBoolPref("clean_config");
+ if (clean) return;
+
+ // unchanged: returns true if a pref has not been modified
+ var unchanged = function(p){return !ssl_observatory.prefs.prefHasUserValue("extensions.https_everywhere._observatory."+p)};
+ var cleanup_obsprefs_callback = function(tor_avail) {
+ // we only run this once
+ ssl_observatory.prefs.setBoolPref("extensions.https_everywhere._observatory.clean_config", true);
+ if (!tor_avail) {
+ // use_custom_proxy is the variable that is often false when it should be true;
+ if (!ssl_observatory.myGetBoolPref("use_custom_proxy")) {
+ // however don't do anything if any of the prefs have been set by the user
+ if (unchanged("alt_roots") && unchanged("self_signed") && unchanged ("send_asn") && unchanged("priv_dns")) {
+ ssl_observatory.prefs.setBoolPref("extensions.https_everywhere._observatory.use_custom_proxy", true);
+ }
+ }
+ }
+ }
+ ssl_observatory.registerProxyTestNotification(cleanup_obsprefs_callback);
+ },
+
+
+ getExperimentalFeatureCohort: function() {
+ // This variable is used for gradually turning on features for testing and
+ // scalability purposes. It is a random integer [0,N_COHORTS) generated
+ // once and stored thereafter.
+ //
+ // This is not currently used/called in the development branch
+ var cohort;
+ try {
+ cohort = this.prefs.getIntPref("experimental_feature_cohort");
+ } catch(e) {
+ cohort = Math.round(Math.random() * N_COHORTS);
+ this.prefs.setIntPref("experimental_feature_cohort", cohort);
+ }
+ return cohort;
+ },
+
+ // nsIChannelEventSink implementation
+ // XXX This was here for rewrites in the past. Do we still need it?
+ onChannelRedirect: function(oldChannel, newChannel, flags) {
+ const uri = newChannel.URI;
+ this.log(DBUG,"Got onChannelRedirect to "+uri.spec);
+ if (!(newChannel instanceof CI.nsIHttpChannel)) {
+ this.log(DBUG, newChannel + " is not an instance of nsIHttpChannel");
+ return;
+ }
+ var alist = this.juggleApplicableListsDuringRedirection(oldChannel, newChannel);
+ HTTPS.replaceChannel(alist,newChannel);
+ },
+
+ juggleApplicableListsDuringRedirection: function(oldChannel, newChannel) {
+ // If the new channel doesn't yet have a list of applicable rulesets, start
+ // with the old one because that's probably a better representation of how
+ // secure the load process was for this page
+ var domWin = this.getWindowForChannel(oldChannel);
+ var old_alist = null;
+ if (domWin)
+ old_alist = this.getExpando(domWin,"applicable_rules", null);
+ domWin = this.getWindowForChannel(newChannel);
+ if (!domWin) return null;
+ var new_alist = this.getExpando(domWin,"applicable_rules", null);
+ if (old_alist && !new_alist) {
+ new_alist = old_alist;
+ this.setExpando(domWin,"applicable_rules",new_alist);
+ } else if (!new_alist) {
+ new_alist = new ApplicableList(this.log, domWin.document, domWin);
+ this.setExpando(domWin,"applicable_rules",new_alist);
+ }
+ return new_alist;
+ },
+
+ asyncOnChannelRedirect: function(oldChannel, newChannel, flags, callback) {
+ this.onChannelRedirect(oldChannel, newChannel, flags);
+ callback.onRedirectVerifyCallback(0);
+ },
+
+ get_prefs: function(prefBranch) {
+ if(!prefBranch) prefBranch = PREFBRANCH_ROOT;
+
+ // get our preferences branch object
+ // FIXME: Ugly hack stolen from https
+ var branch_name;
+ if(prefBranch == PREFBRANCH_RULE_TOGGLE)
+ branch_name = "extensions.https_everywhere.rule_toggle.";
+ else
+ branch_name = "extensions.https_everywhere.";
+ var o_prefs = false;
+ var o_branch = false;
+ // this function needs to be called from inside https_everywhereLog, so
+ // it needs to do its own logging...
+ var econsole = Components.classes["@mozilla.org/consoleservice;1"]
+ .getService(Components.interfaces.nsIConsoleService);
+
+ o_prefs = Components.classes["@mozilla.org/preferences-service;1"]
+ .getService(Components.interfaces.nsIPrefService);
+
+ if (!o_prefs)
+ {
+ econsole.logStringMessage("HTTPS Everywhere: Failed to get preferences-service!");
+ return false;
+ }
+
+ o_branch = o_prefs.getBranch(branch_name);
+ if (!o_branch)
+ {
+ econsole.logStringMessage("HTTPS Everywhere: Failed to get prefs branch!");
+ return false;
+ }
+
+ if(prefBranch == PREFBRANCH_ROOT) {
+ // make sure there's an entry for our log level
+ try {
+ o_branch.getIntPref(LLVAR);
+ } catch (e) {
+ econsole.logStringMessage("Creating new about:config https_everywhere.LogLevel variable");
+ o_branch.setIntPref(LLVAR, WARN);
+ }
+ }
+
+ return o_branch;
+ },
+
+ chrome_opener: function(uri, args) {
+ // we don't use window.open, because we need to work around TorButton's
+ // state control
+ args = args || 'chrome,centerscreen';
+ return CC['@mozilla.org/appshell/window-mediator;1']
+ .getService(CI.nsIWindowMediator)
+ .getMostRecentWindow('navigator:browser')
+ .open(uri,'', args );
+ },
+
+ tab_opener: function(uri) {
+ var gb = CC['@mozilla.org/appshell/window-mediator;1']
+ .getService(CI.nsIWindowMediator)
+ .getMostRecentWindow('navigator:browser')
+ .gBrowser;
+ var tab = gb.addTab(uri);
+ gb.selectedTab = tab;
+ return tab;
+ },
+
+ toggleEnabledState: function() {
+ if(this.prefs.getBoolPref("globalEnabled")){
+ try{
+ this.obsService.removeObserver(this, "profile-before-change");
+ this.obsService.removeObserver(this, "profile-after-change");
+ this.obsService.removeObserver(this, "sessionstore-windows-restored");
+ OS.removeObserver(this, "cookie-changed");
+ OS.removeObserver(this, "http-on-modify-request");
+ OS.removeObserver(this, "http-on-examine-merged-response");
+ OS.removeObserver(this, "http-on-examine-response");
+
+ var catman = Components.classes["@mozilla.org/categorymanager;1"]
+ .getService(Components.interfaces.nsICategoryManager);
+ catman.deleteCategoryEntry("net-channel-event-sinks", SERVICE_CTRID, true);
+
+ var dls = CC['@mozilla.org/docloaderservice;1']
+ .getService(CI.nsIWebProgress);
+ dls.removeProgressListener(this);
+
+ this.prefs.setBoolPref("globalEnabled", false);
+ }
+ catch(e){
+ this.log(WARN, "Couldn't remove observers: " + e);
+ }
+ }
+ else{
+ try{
+ this.obsService.addObserver(this, "profile-before-change", false);
+ this.obsService.addObserver(this, "profile-after-change", false);
+ this.obsService.addObserver(this, "sessionstore-windows-restored", false);
+ OS.addObserver(this, "cookie-changed", false);
+ OS.addObserver(this, "http-on-modify-request", false);
+ OS.addObserver(this, "http-on-examine-merged-response", false);
+ OS.addObserver(this, "http-on-examine-response", false);
+
+ var dls = CC['@mozilla.org/docloaderservice;1']
+ .getService(CI.nsIWebProgress);
+ dls.addProgressListener(this, CI.nsIWebProgress.NOTIFY_LOCATION);
+
+ this.log(INFO,"ChannelReplacement.supported = "+ChannelReplacement.supported);
+
+ if(!Thread.hostRunning)
+ Thread.hostRunning = true;
+
+ var catman = Components.classes["@mozilla.org/categorymanager;1"]
+ .getService(Components.interfaces.nsICategoryManager);
+ // hook on redirections (non persistent, otherwise crashes on 1.8.x)
+ catman.addCategoryEntry("net-channel-event-sinks", SERVICE_CTRID,
+ SERVICE_CTRID, false, true);
+
+ HTTPSRules.init();
+ this.prefs.setBoolPref("globalEnabled", true);
+ }
+ catch(e){
+ this.log(WARN, "Couldn't add observers: " + e);
+ }
+ }
+ }
+};
+
+var prefs = 0;
+var econsole = 0;
+function https_everywhereLog(level, str) {
+ if (prefs == 0) {
+ prefs = HTTPSEverywhere.instance.get_prefs();
+ econsole = Components.classes["@mozilla.org/consoleservice;1"]
+ .getService(Components.interfaces.nsIConsoleService);
+ }
+ try {
+ var threshold = prefs.getIntPref(LLVAR);
+ } catch (e) {
+ econsole.logStringMessage( "HTTPS Everywhere: Failed to read about:config LogLevel");
+ threshold = WARN;
+ }
+ if (level >= threshold) {
+ dump("HTTPS Everywhere: "+str+"\n");
+ econsole.logStringMessage("HTTPS Everywhere: " +str);
+ }
+}
+
+/**
+* XPCOMUtils.generateNSGetFactory was introduced in Mozilla 2 (Firefox 4).
+* XPCOMUtils.generateNSGetModule is for Mozilla 1.9.2 (Firefox 3.6).
+*/
+if (XPCOMUtils.generateNSGetFactory)
+ var NSGetFactory = XPCOMUtils.generateNSGetFactory([HTTPSEverywhere]);
+else
+ var NSGetModule = XPCOMUtils.generateNSGetModule([HTTPSEverywhere]);
+
+/* vim: set tabstop=4 expandtab: */
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/components/ssl-observatory.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/components/ssl-observatory.js
new file mode 100644
index 0000000..7b301d1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/components/ssl-observatory.js
@@ -0,0 +1,1026 @@
+const Ci = Components.interfaces;
+const Cc = Components.classes;
+const Cr = Components.results;
+
+const CI = Components.interfaces;
+const CC = Components.classes;
+const CR = Components.results;
+const CU = Components.utils;
+
+// Log levels
+VERB=1;
+DBUG=2;
+INFO=3;
+NOTE=4;
+WARN=5;
+
+BASE_REQ_SIZE=4096;
+MAX_OUTSTANDING = 20; // Max # submission XHRs in progress
+MAX_DELAYED = 32; // Max # XHRs are waiting around to be sent or retried
+TIMEOUT = 60000;
+
+ASN_PRIVATE = -1; // Do not record the ASN this cert was seen on
+ASN_IMPLICIT = -2; // ASN can be learned from connecting IP
+ASN_UNKNOWABLE = -3; // Cert was seen in the absence of [trustworthy] Internet access
+
+// XXX: We should make the _observatory tree relative.
+LLVAR="extensions.https_everywhere.LogLevel";
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+Components.utils.import("resource://gre/modules/ctypes.jsm");
+
+
+const OS = Cc['@mozilla.org/observer-service;1'].getService(CI.nsIObserverService);
+
+const SERVICE_CTRID = "@eff.org/ssl-observatory;1";
+const SERVICE_ID=Components.ID("{0f9ab521-986d-4ad8-9c1f-6934e195c15c}");
+const SERVICE_NAME = "Anonymously Submits SSL certificates to EFF for security auditing.";
+const LOADER = CC["@mozilla.org/moz/jssubscript-loader;1"].getService(CI.mozIJSSubScriptLoader);
+
+const _INCLUDED = {};
+
+const INCLUDE = function(name) {
+ if (arguments.length > 1)
+ for (var j = 0, len = arguments.length; j < len; j++)
+ INCLUDE(arguments[j]);
+ else if (!_INCLUDED[name]) {
+ try {
+ LOADER.loadSubScript("chrome://https-everywhere/content/code/"
+ + name + ".js");
+ _INCLUDED[name] = true;
+ } catch(e) {
+ dump("INCLUDE " + name + ": " + e + "\n");
+ }
+ }
+};
+
+INCLUDE('Root-CAs');
+INCLUDE('sha256');
+INCLUDE('X509ChainWhitelist');
+INCLUDE('NSS');
+
+function SSLObservatory() {
+ this.prefs = CC["@mozilla.org/preferences-service;1"]
+ .getService(CI.nsIPrefBranch);
+
+ try {
+ // Check for torbutton
+ this.tor_logger = CC["@torproject.org/torbutton-logger;1"]
+ .getService(CI.nsISupports).wrappedJSObject;
+ this.torbutton_installed = true;
+ } catch(e) {
+ this.torbutton_installed = false;
+ }
+
+ this.HTTPSEverywhere = CC["@eff.org/https-everywhere;1"]
+ .getService(Components.interfaces.nsISupports)
+ .wrappedJSObject;
+
+ /* The proxy test result starts out null until the test is attempted.
+ * This is for UI notification purposes */
+ this.proxy_test_successful = null;
+ this.proxy_test_callback = null;
+ this.cto_url = "https://check.torproject.org/?TorButton=true";
+ // a regexp to match the above URL
+ this.cto_regexp = RegExp("^https://check\\.torproject\\.org/");
+
+ this.public_roots = root_ca_hashes;
+
+ // Clear these on cookies-cleared observer event
+ this.already_submitted = {};
+ this.delayed_submissions = {};
+
+ // Figure out the url to submit to
+ this.submit_host = null;
+ this.findSubmissionTarget();
+
+ // Used to track current number of pending requests to the server
+ this.current_outstanding_requests = 0;
+
+ // We can't always know private browsing state per request, sometimes
+ // we have to guess based on what we've seen in the past
+ this.everSeenPrivateBrowsing = false;
+
+ // Generate nonce to append to url, to catch in nsIProtocolProxyFilter
+ // and to protect against CSRF
+ this.csrf_nonce = "#"+Math.random().toString()+Math.random().toString();
+
+ this.compatJSON = Cc["@mozilla.org/dom/json;1"].createInstance(Ci.nsIJSON);
+
+ var pref_service = Components.classes["@mozilla.org/preferences-service;1"]
+ .getService(Components.interfaces.nsIPrefBranchInternal);
+ var branch = pref_service.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
+
+ branch.addObserver("extensions.https_everywhere._observatory.enabled",
+ this, false);
+
+ if (this.myGetBoolPref("enabled")) {
+ OS.addObserver(this, "cookie-changed", false);
+ OS.addObserver(this, "http-on-examine-response", false);
+
+ var dls = CC['@mozilla.org/docloaderservice;1']
+ .getService(CI.nsIWebProgress);
+ dls.addProgressListener(this,
+ Ci.nsIWebProgress.NOTIFY_STATE_REQUEST);
+ }
+
+ // Register protocolproxyfilter
+ this.pps = CC["@mozilla.org/network/protocol-proxy-service;1"]
+ .getService(CI.nsIProtocolProxyService);
+
+ this.pps.registerFilter(this, 0);
+ this.wrappedJSObject = this;
+
+ this.client_asn = ASN_PRIVATE;
+ if (this.myGetBoolPref("send_asn"))
+ this.setupASNWatcher();
+
+ try {
+ NSS.initialize("");
+ } catch(e) {
+ this.log(WARN, "Failed to initialize NSS component:" + e);
+ }
+
+ this.testProxySettings();
+
+ this.log(DBUG, "Loaded observatory component!");
+}
+
+SSLObservatory.prototype = {
+ // QueryInterface implementation, e.g. using the generateQI helper
+ QueryInterface: XPCOMUtils.generateQI(
+ [ CI.nsIObserver,
+ CI.nsIProtocolProxyFilter,
+ //CI.nsIWifiListener,
+ CI.nsIWebProgressListener,
+ CI.nsISupportsWeakReference,
+ CI.nsIInterfaceRequestor]),
+
+ wrappedJSObject: null, // Initialized by constructor
+
+ // properties required for XPCOM registration:
+ classDescription: SERVICE_NAME,
+ classID: SERVICE_ID,
+ contractID: SERVICE_CTRID,
+
+ // https://developer.mozilla.org/En/How_to_check_the_security_state_of_an_XMLHTTPRequest_over_SSL
+ getSSLCertChain: function(channel) {
+ try {
+ // Do we have a valid channel argument?
+ if (!channel instanceof Ci.nsIChannel) {
+ return null;
+ }
+ var secInfo = channel.securityInfo;
+
+ // Print general connection security state
+ if (secInfo instanceof Ci.nsITransportSecurityInfo) {
+ secInfo.QueryInterface(Ci.nsITransportSecurityInfo);
+ } else {
+ return null;
+ }
+
+ if (secInfo instanceof Ci.nsISSLStatusProvider) {
+ return secInfo.QueryInterface(Ci.nsISSLStatusProvider).
+ SSLStatus.QueryInterface(Ci.nsISSLStatus).serverCert;
+ }
+ return null;
+ } catch(err) {
+ return null;
+ }
+ },
+
+ findSubmissionTarget: function() {
+ // Compute the URL that the Observatory will currently submit to
+ var host = this.prefs.getCharPref("extensions.https_everywhere._observatory.server_host");
+ // Rebuild the regexp iff the host has changed
+ if (host != this.submit_host) {
+ this.submit_host = host;
+ this.submit_url = "https://" + host + "/submit_cert";
+ this.submission_regexp = RegExp("^" + this.regExpEscape(this.submit_url));
+ }
+ },
+
+ regExpEscape: function(s) {
+ // Borrowed from the Closure Library,
+ // https://closure-library.googlecode.com/svn/docs/closure_goog_string_string.js.source.html
+ return String(s).replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, '\\$1').replace(/\x08/g, '\\x08');
+ },
+
+ notifyCertProblem: function(socketInfo, status, targetSite) {
+ this.log(NOTE, "cert warning for " + targetSite);
+ if (targetSite == "observatory.eff.org") {
+ this.log(WARN, "Surpressing observatory warning");
+ return true;
+ }
+ return false;
+ },
+
+ setupASNWatcher: function() {
+ this.getClientASN();
+ this.max_ap = null;
+
+ // we currently do not actually do *any* ASN watching from the client
+ // (in other words, the db will not have ASNs for certs submitted
+ // through Tor, even if the user checks the "send ASN" option)
+ // all of this code for guessing at changes in our public IP via WiFi hints
+ // is therefore disabled
+ /*
+ // Observe network changes to get new ASNs
+ OS.addObserver(this, "network:offline-status-changed", false);
+ var pref_service = Cc["@mozilla.org/preferences-service;1"]
+ .getService(Ci.nsIPrefBranchInternal);
+ var proxy_branch = pref_service.QueryInterface(Ci.nsIPrefBranchInternal);
+ proxy_branch.addObserver("network.proxy", this, false);
+
+ try {
+ var wifi_service = Cc["@mozilla.org/wifi/monitor;1"].getService(Ci.nsIWifiMonitor);
+ wifi_service.startWatching(this);
+ } catch(e) {
+ this.log(INFO, "Failed to register ASN change monitor: "+e);
+ }*/
+ },
+
+ stopASNWatcher: function() {
+ this.client_asn = ASN_PRIVATE;
+ /*
+ // unhook the observers we registered above
+ OS.removeObserver(this, "network:offline-status-changed");
+ var pref_service = Cc["@mozilla.org/preferences-service;1"]
+ .getService(Ci.nsIPrefBranchInternal);
+ var proxy_branch = pref_service.QueryInterface(Ci.nsIPrefBranchInternal);
+ proxy_branch.removeObserver(this, "network.proxy");
+ try {
+ var wifi_service = Cc["@mozilla.org/wifi/monitor;1"].getService(Ci.nsIWifiMonitor);
+ wifi_service.stopWatching(this);
+ } catch(e) {
+ this.log(WARN, "Failed to stop wifi state monitor: "+e);
+ }*/
+ },
+
+ getClientASN: function() {
+ // Fetch a new client ASN..
+ if (!this.myGetBoolPref("send_asn")) {
+ this.client_asn = ASN_PRIVATE;
+ return;
+ }
+ else if (!this.torbutton_installed) {
+ this.client_asn = ASN_IMPLICIT;
+ return;
+ }
+ // XXX As a possible base case: the user is running Tor, is not using
+ // bridges, and has send_asn enabled: should we ping an eff.org URL to
+ // learn our ASN?
+ return;
+ },
+
+ /*
+ // Wifi status listener
+ onChange: function(accessPoints) {
+ try {
+ var max_ap = accessPoints[0].mac;
+ } catch(e) {
+ return null; // accessPoints[0] is undefined
+ }
+ var max_signal = accessPoints[0].signal;
+ var old_max_present = false;
+ for (var i=0; i<accessPoints.length; i++) {
+ if (accessPoints[i].mac == this.max_ap) {
+ old_max_present = true;
+ }
+ if (accessPoints[i].signal > max_signal) {
+ max_ap = accessPoints[i].mac;
+ max_signal = accessPoints[i].signal;
+ }
+ }
+ this.max_ap = max_ap;
+ if (!old_max_present) {
+ this.log(INFO, "Old access point is out of range. Getting new ASN");
+ this.getClientASN();
+ } else {
+ this.log(DBUG, "Old access point is still in range.");
+ }
+ },
+
+ // Wifi status listener
+ onError: function(value) {
+ // XXX: Do we care?
+ this.log(NOTE, "ASN change observer got an error: "+value);
+ this.getClientASN();
+ },
+ */
+
+ ourFingerprint: function(cert) {
+ // Calculate our custom fingerprint from an nsIX509Cert
+ return (cert.md5Fingerprint+cert.sha1Fingerprint).replace(":", "", "g");
+ },
+
+ // onSecurity is used to listen for bad cert warnings
+ // There is also onSecurityStateChange, but it does not handle subdocuments. See git
+ // history for an implementation stub.
+ onStateChange: function(aProgress, aRequest, aState, aStatus) {
+ if (!aRequest) return;
+ var chan = null;
+ try {
+ chan = aRequest.QueryInterface(Ci.nsIHttpChannel);
+ } catch(e) {
+ return;
+ }
+ if (chan) {
+ if (!this.observatoryActive(chan)) return;
+ var certchain = this.getSSLCertChain(chan);
+ if (certchain) {
+ this.log(INFO, "Got state cert chain for "
+ + chan.originalURI.spec + "->" + chan.URI.spec + ", state: " + aState);
+ var warning = true;
+ this.submitCertChainForChannel(certchain, chan, warning);
+ }
+ }
+ },
+
+ observe: function(subject, topic, data) {
+ if (topic == "cookie-changed" && data == "cleared") {
+ this.already_submitted = {};
+ this.delayed_submissions = {};
+ this.log(INFO, "Cookies were cleared. Purging list of pending and already submitted certs");
+ return;
+ }
+
+ if ("http-on-examine-response" == topic) {
+ var channel = subject;
+ if (!this.observatoryActive(channel)) return;
+
+ var certchain = this.getSSLCertChain(subject);
+ var warning = false;
+ this.submitCertChainForChannel(certchain, channel, warning);
+ }
+
+ if (topic == "network:offline-status-changed" && data == "online") {
+ this.log(INFO, "Browser back online. Getting new ASN.");
+ this.getClientASN();
+ return;
+ }
+
+ if (topic == "nsPref:changed") {
+ // If the user toggles the SSL Observatory settings, we need to add or remove
+ // our observers
+ switch (data) {
+ case "network.proxy.ssl":
+ case "network.proxy.ssl_port":
+ case "network.proxy.socks":
+ case "network.proxy.socks_port":
+ // XXX: We somehow need to only call this once. Right now, we'll make
+ // like 3 calls to getClientASN().. The only thing I can think
+ // of is a timer...
+ this.log(INFO, "Proxy settings have changed. Getting new ASN");
+ this.getClientASN();
+ break;
+ case "extensions.https_everywhere._observatory.enabled":
+ if (this.myGetBoolPref("enabled")) {
+ this.pps.registerFilter(this, 0);
+ OS.addObserver(this, "cookie-changed", false);
+ OS.addObserver(this, "http-on-examine-response", false);
+
+ var dls = CC['@mozilla.org/docloaderservice;1']
+ .getService(CI.nsIWebProgress);
+ dls.addProgressListener(this,
+ Ci.nsIWebProgress.NOTIFY_STATE_REQUEST);
+ this.log(INFO,"SSL Observatory is now enabled via pref change!");
+ } else {
+ try {
+ this.pps.unregisterFilter(this);
+ OS.removeObserver(this, "cookie-changed");
+ OS.removeObserver(this, "http-on-examine-response");
+
+ var dls = CC['@mozilla.org/docloaderservice;1']
+ .getService(CI.nsIWebProgress);
+ dls.removeProgressListener(this);
+ this.log(INFO,"SSL Observatory is now disabled via pref change!");
+ } catch(e) {
+ this.log(WARN, "Removing SSL Observatory observers failed: "+e);
+ }
+ }
+ break;
+ }
+ return;
+ }
+
+ },
+
+ submitCertChainForChannel: function(certchain, channel, warning) {
+ if (!certchain) {
+ return;
+ }
+ var host_ip = "-1";
+ var httpchannelinternal = channel.QueryInterface(Ci.nsIHttpChannelInternal);
+ try {
+ host_ip = httpchannelinternal.remoteAddress;
+ } catch(e) {
+ this.log(INFO, "Could not get server IP address.");
+ }
+
+ channel.QueryInterface(Ci.nsIHttpChannel);
+ var chainEnum = certchain.getChain();
+ var chainArray = [];
+ var chainArrayFpStr = '';
+ var fps = [];
+ for(var i = 0; i < chainEnum.length; i++) {
+ var cert = chainEnum.queryElementAt(i, Ci.nsIX509Cert);
+ chainArray.push(cert);
+ var fp = this.ourFingerprint(cert);
+ fps.push(fp);
+ chainArrayFpStr = chainArrayFpStr + fp;
+ }
+ var chain_hash = sha256_digest(chainArrayFpStr).toUpperCase();
+ this.log(INFO, "SHA-256 hash of cert chain for "+new String(channel.URI.host)+" is "+ chain_hash);
+
+ if(!this.myGetBoolPref("use_whitelist")) {
+ this.log(WARN, "Not using whitelist to filter cert chains.");
+ }
+ else if (this.isChainWhitelisted(chain_hash)) {
+ this.log(INFO, "This cert chain is whitelisted. Not submitting.");
+ return;
+ }
+ else {
+ this.log(INFO, "Cert chain is NOT whitelisted. Proceeding with submission.");
+ }
+
+ if (channel.URI.port == -1) {
+ this.submitChainArray(chainArray, fps, new String(channel.URI.host), channel, host_ip, warning, false);
+ } else {
+ this.submitChainArray(chainArray, fps, channel.URI.host+":"+channel.URI.port, channel, host_ip, warning, false);
+ }
+ },
+
+ observatoryActive: function(channel) {
+
+ if (!this.myGetBoolPref("enabled"))
+ return false;
+
+ if (this.torbutton_installed && this.proxy_test_successful) {
+ // Allow Tor users to choose if they want to submit
+ // during tor and/or non-tor
+ if (this.myGetBoolPref("submit_during_tor") &&
+ this.prefs.getBoolPref("extensions.torbutton.tor_enabled"))
+ return true;
+
+ if (this.myGetBoolPref("submit_during_nontor") &&
+ !this.prefs.getBoolPref("extensions.torbutton.tor_enabled"))
+ return true;
+
+ return false;
+ }
+
+ if (this.proxy_test_successful) {
+ return true;
+ } else if (this.myGetBoolPref("use_custom_proxy")) {
+ // no torbutton; the custom proxy is probably the user opting to
+ // submit certs without strong anonymisation. Because the
+ // anonymisation is weak, we avoid submitting during private browsing
+ // mode.
+ var pbm = this.inPrivateBrowsingMode(channel);
+ this.log(DBUG, "Private browsing mode: " + pbm);
+ return !pbm;
+ }
+ },
+
+ inPrivateBrowsingMode: function(channel) {
+ // In classic firefox fashion, there are multiple versions of this API
+ // https://developer.mozilla.org/EN/docs/Supporting_per-window_private_browsing
+ try {
+ // Firefox 20+, this state is per-window;
+ // should raise an exception on FF < 20
+ CU.import("resource://gre/modules/PrivateBrowsingUtils.jsm");
+ if (!(channel instanceof CI.nsIHttpChannel)) {
+ this.log(NOTE, "observatoryActive() without a channel");
+ // This is a windowless request. We cannot tell if private browsing
+ // applies. Conservatively, if we have ever seen PBM, it might be
+ // active now
+ return this.everSeenPrivateBrowsing;
+ }
+ var win = this.HTTPSEverywhere.getWindowForChannel(channel);
+ if (!win) return this.everSeenPrivateBrowsing; // windowless request
+
+ if (PrivateBrowsingUtils.isWindowPrivate(win)) {
+ this.everSeenPrivateBrowsing = true;
+ return true;
+ }
+ } catch (e) {
+ // Firefox < 20, this state is global
+ try {
+ var pbs = CC["@mozilla.org/privatebrowsing;1"].getService(CI.nsIPrivateBrowsingService);
+ if (pbs.privateBrowsingEnabled) {
+ this.everSeenPrivateBrowsing = true;
+ return true;
+ }
+ } catch (e) { /* seamonkey or very old firefox */ }
+ }
+ return false;
+ },
+
+ myGetBoolPref: function(prefstring) {
+ // syntactic sugar
+ return this.prefs.getBoolPref ("extensions.https_everywhere._observatory." + prefstring);
+ },
+
+ isChainWhitelisted: function(chainhash) {
+ if (X509ChainWhitelist == null) {
+ this.log(WARN, "Could not find whitelist of popular certificate chains, so ignoring whitelist");
+ return false;
+ }
+ if (X509ChainWhitelist[chainhash] != null) {
+ return true;
+ }
+ return false;
+ },
+
+ findRootInChain: function(certArray) {
+ // Return the position in the chain Array of the/a root CA
+ var rootidx = -1;
+ var nextInChain = certArray[0].issuer;
+ for (var i = 0; i < certArray.length; i++) {
+ // Find the next cert in the valid chain
+ if (certArray[i].equals(nextInChain)) {
+ if (certArray[i].issuerName == certArray[i].subjectName) {
+ // All X509 root certs are self-signed
+ this.log(INFO, "Got root cert at position: "+i);
+ rootidx = i;
+ break;
+ } else {
+ // This is an intermediate CA cert; keep looking for the root
+ nextInChain = certArray[i].issuer;
+ }
+ }
+ }
+ return rootidx;
+ },
+
+ processConvergenceChain: function(chain) {
+ // Make sure the chain we're working with is sane, even if Convergence is
+ // present.
+
+ // Convergence currently performs MITMs against the Firefox in order to
+ // get around https://bugzilla.mozilla.org/show_bug.cgi?id=644640. The
+ // end-entity cert produced by Convergence contains a copy of the real
+ // end-entity cert inside an X509v3 extension. We extract this and send
+ // it rather than the Convergence certs.
+ var convergence = Components.classes['@thoughtcrime.org/convergence;1'];
+ if (!convergence) return null;
+ convergence = convergence.getService().wrappedJSObject;
+ if (!convergence || !convergence.enabled) return null;
+
+ this.log(INFO, "Convergence uses its own internal root certs; not submitting those");
+
+ //this.log(WARN, convergence.certificateStatus.getVerificiationStatus(chain.certArray[0]));
+ try {
+ var certInfo = this.extractRealLeafFromConveregenceLeaf(chain.certArray[0]);
+ var b64Cert = certInfo["certificate"];
+ var certDB = Cc["@mozilla.org/security/x509certdb;1"].getService(Ci.nsIX509CertDB);
+ chain.leaf = certDB.constructX509FromBase64(b64Cert);
+ chain.certArray = [chain.leaf];
+ chain.fps = [this.ourFingerprint(chain.leaf)];
+ } catch (e) {
+ this.log(WARN, "Failed to extract leaf cert from Convergence cert " + e);
+ chain.certArray = chain.certArray.slice(0,1);
+ chain.fps = chain.fps.slice(0,1);
+ }
+
+ },
+
+ extractRealLeafFromConveregenceLeaf: function(certificate) {
+ // Copied from Convergence's CertificateStatus.getVerificiationStatus
+ var len = {};
+ var derEncoding = certificate.getRawDER(len);
+
+ var derItem = NSS.types.SECItem();
+ derItem.data = NSS.lib.ubuffer(derEncoding);
+ derItem.len = len.value;
+
+ var completeCertificate = NSS.lib.CERT_DecodeDERCertificate(derItem.address(), 1, null);
+
+ var extItem = NSS.types.SECItem();
+ var status = NSS.lib.CERT_FindCertExtension(completeCertificate,
+ NSS.lib.SEC_OID_NS_CERT_EXT_COMMENT,
+ extItem.address());
+ if (status != -1) {
+ var encoded = '';
+ var asArray = ctypes.cast(extItem.data, ctypes.ArrayType(ctypes.unsigned_char, extItem.len).ptr).contents;
+ var marker = false;
+
+ for (var i=0;i<asArray.length;i++) {
+ if (marker) {
+ encoded += String.fromCharCode(asArray[i]);
+ } else if (asArray[i] == 0x00) {
+ marker = true;
+ }
+ }
+
+ return JSON.parse(encoded);
+ }
+ },
+
+ shouldSubmit: function(chain, domain) {
+ // Return true if we should submit this chain to the SSL Observatory
+ var rootidx = this.findRootInChain(chain.certArray);
+ var ss = false; // ss: self-signed
+
+ if (chain.leaf.issuerName == chain.leaf.subjectName)
+ ss = true;
+
+ if (!this.myGetBoolPref("self_signed") && ss) {
+ this.log(INFO, "Not submitting self-signed cert for " + domain);
+ return false;
+ }
+
+ if (!ss && !this.myGetBoolPref("alt_roots")) {
+ if (rootidx == -1) {
+ // A cert with an unknown/absent Issuer. Out of caution, don't submit these
+ this.log(INFO, "Cert for " + domain + " issued by unknown CA " +
+ chain.leaf.issuerName + " (not submitting due to settings)");
+ return false;
+ } else if (!(chain.fps[rootidx] in this.public_roots)) {
+ // A cert with a known but non-public Issuer
+ this.log(INFO, "Got a private root cert. Ignoring domain "
+ +domain+" with root "+chain.fps[rootidx]);
+ return false;
+ }
+ }
+
+ if (chain.fps[0] in this.already_submitted) {
+ this.log(INFO, "Already submitted cert for "+domain+". Ignoring");
+ return false;
+ }
+ return true;
+ },
+
+ submitChainArray: function(certArray, fps, domain, channel, host_ip, warning, resubmitting) {
+ var base64Certs = [];
+ // Put all this chain data in one object so that it can be modified by
+ // subroutines if required
+ var c = {}; c.certArray = certArray; c.fps = fps; c.leaf = certArray[0];
+ this.processConvergenceChain(c);
+ if (!this.shouldSubmit(c,domain)) return;
+
+ // only try to submit now if there aren't too many outstanding requests
+ if (this.current_outstanding_requests > MAX_OUTSTANDING) {
+ this.log(WARN, "Too many outstanding requests ("+this.current_outstanding_requests+"), not submitting");
+
+ // if there are too many current requests but not too many
+ // delayed/pending ones, then delay this one
+ if (Object.keys(this.delayed_submissions).length < MAX_DELAYED)
+ if (!(c.fps[0] in this.delayed_submissions)) {
+ this.log(WARN, "Planning to retry submission...");
+ let retry = function() { this.submitChainArray(certArray, fps, domain, channel, host_ip, warning, true); };
+ this.delayed_submissions[c.fps[0]] = retry;
+ }
+ return;
+ }
+
+ for (var i = 0; i < c.certArray.length; i++) {
+ var len = new Object();
+ var derData = c.certArray[i].getRawDER(len);
+ let result = "";
+ for (let j = 0, dataLength = derData.length; j < dataLength; ++j)
+ result += String.fromCharCode(derData[j]);
+ base64Certs.push(btoa(result));
+ }
+
+ var reqParams = [];
+ reqParams.push("domain="+domain);
+ reqParams.push("server_ip="+host_ip);
+ if (this.myGetBoolPref("testing")) {
+ reqParams.push("testing=1");
+ // The server can compute these, but they're a nice test suite item!
+ reqParams.push("fplist="+this.compatJSON.encode(c.fps));
+ }
+ reqParams.push("certlist="+this.compatJSON.encode(base64Certs));
+
+ if (resubmitting) {
+ reqParams.push("client_asn="+ASN_UNKNOWABLE);
+ } else {
+ reqParams.push("client_asn="+this.client_asn);
+ }
+
+ if (this.myGetBoolPref("priv_dns")) {
+ reqParams.push("private_opt_in=1");
+ } else {
+ reqParams.push("private_opt_in=0");
+ }
+
+ if (warning) {
+ reqParams.push("browser_warning=1");
+ } else {
+ reqParams.push("browser_warning=0");
+ }
+
+ var params = reqParams.join("&") + "&padding=0";
+ var tot_len = BASE_REQ_SIZE;
+
+ this.log(INFO, "Submitting cert for "+domain);
+ this.log(DBUG, "submit_cert params: "+params);
+
+ // Pad to exp scale. This is done because the distribution of cert sizes
+ // is almost certainly pareto, and definitely not uniform.
+ for (tot_len = BASE_REQ_SIZE; tot_len < params.length; tot_len*=2);
+
+ while (params.length != tot_len) {
+ params += "0";
+ }
+
+ var that = this; // We have neither SSLObservatory nor this in scope in the lambda
+
+ var win = channel ? this.HTTPSEverywhere.getWindowForChannel(channel) : null;
+ var req = this.buildRequest(params);
+ req.timeout = TIMEOUT;
+
+ req.onreadystatechange = function(evt) {
+ if (req.readyState == 4) {
+ // pop off one outstanding request
+ that.current_outstanding_requests -= 1;
+ that.log(DBUG, "Popping one off of outstanding requests, current num is: "+that.current_outstanding_requests);
+
+ if (req.status == 200) {
+ that.log(INFO, "Successful cert submission");
+ if (!that.prefs.getBoolPref("extensions.https_everywhere._observatory.cache_submitted"))
+ if (c.fps[0] in that.already_submitted)
+ delete that.already_submitted[c.fps[0]];
+
+ // Retry up to two previously failed submissions
+ let n = 0;
+ for (let fp in that.delayed_submissions) {
+ that.log(WARN, "Retrying a submission...");
+ that.delayed_submissions[fp]();
+ delete that.delayed_submissions[fp];
+ if (++n >= 2) break;
+ }
+ } else if (req.status == 403) {
+ that.log(WARN, "The SSL Observatory has issued a warning about this certificate for " + domain);
+ try {
+ var warningObj = JSON.parse(req.responseText);
+ if (win) that.warnUser(warningObj, win, c.certArray[0]);
+ } catch(e) {
+ that.log(WARN, "Failed to process SSL Observatory cert warnings :( " + e);
+ that.log(WARN, req.responseText);
+ }
+ } else {
+ // Submission failed
+ if (c.fps[0] in that.already_submitted)
+ delete that.already_submitted[c.fps[0]];
+ try {
+ that.log(WARN, "Cert submission failure "+req.status+": "+req.responseText);
+ } catch(e) {
+ that.log(WARN, "Cert submission failure and exception: "+e);
+ }
+ // If we don't have too many delayed submissions, and this isn't
+ // (somehow?) one of them, then plan to retry this submission later
+ if (Object.keys(that.delayed_submissions).length < MAX_DELAYED)
+ if (!(c.fps[0] in that.delayed_submissions)) {
+ that.log(WARN, "Planning to retry submission...");
+ let retry = function() { that.submitChainArray(certArray, fps, domain, channel, host_ip, warning, true); };
+ that.delayed_submissions[c.fps[0]] = retry;
+ }
+
+ }
+ }
+ };
+
+ // Cache this here to prevent multiple submissions for all the content elements.
+ that.already_submitted[c.fps[0]] = true;
+
+ // add one to current outstanding request number
+ that.current_outstanding_requests += 1;
+ that.log(DBUG, "Adding outstanding request, current num is: "+that.current_outstanding_requests);
+ req.send(params);
+ },
+
+ buildRequest: function(params) {
+ var req = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
+ .createInstance(Ci.nsIXMLHttpRequest);
+
+ // We do this again in case the user altered about:config
+ this.findSubmissionTarget();
+ req.open("POST", this.submit_url+this.csrf_nonce, true);
+
+ // Send the proper header information along with the request
+ // Do not set gzip header.. It will ruin the padding
+ req.setRequestHeader("X-Privacy-Info", "EFF SSL Observatory: https://eff.org/r.22c");
+ req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+ req.setRequestHeader("Content-length", params.length);
+ req.setRequestHeader("Connection", "close");
+ // Need to clear useragent and other headers..
+ req.setRequestHeader("User-Agent", "");
+ req.setRequestHeader("Accept", "");
+ req.setRequestHeader("Accept-Language", "");
+ req.setRequestHeader("Accept-Encoding", "");
+ req.setRequestHeader("Accept-Charset", "");
+ return req;
+ },
+
+ warnUser: function(warningObj, win, cert) {
+ var aWin = CC['@mozilla.org/appshell/window-mediator;1']
+ .getService(CI.nsIWindowMediator)
+ .getMostRecentWindow('navigator:browser');
+ aWin.openDialog("chrome://https-everywhere/content/observatory-warning.xul",
+ "","chrome,centerscreen", warningObj, win, cert);
+ },
+
+ registerProxyTestNotification: function(callback_fcn) {
+ if (this.proxy_test_successful != null) {
+ /* Proxy test already ran. Callback immediately. */
+ callback_fcn(this.proxy_test_successful);
+ this.proxy_test_callback = null;
+ return;
+ } else {
+ this.proxy_test_callback = callback_fcn;
+ }
+ },
+
+ testProxySettings: function() {
+ /* Plan:
+ * 1. Launch an async XMLHttpRequest to check.tp.o with magic nonce
+ * 3. Filter the nonce in protocolProxyFilter to use proxy settings
+ * 4. Async result function sets test result status based on check.tp.o
+ */
+ this.proxy_test_successful = null;
+
+ try {
+ var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
+ .createInstance(Components.interfaces.nsIXMLHttpRequest);
+ var url = this.cto_url + this.csrf_nonce;
+ req.open('GET', url, true);
+ req.channel.loadFlags |= Ci.nsIRequest.LOAD_BYPASS_CACHE;
+ req.overrideMimeType("text/xml");
+ var that = this; // Scope gymnastics for async callback
+ req.onreadystatechange = function (oEvent) {
+ if (req.readyState === 4) {
+ that.proxy_test_successful = false;
+
+ if(req.status == 200) {
+ if(!req.responseXML) {
+ that.log(INFO, "Tor check failed: No XML returned by check service.");
+ that.proxyTestFinished();
+ return;
+ }
+
+ var result = req.responseXML.getElementById('TorCheckResult');
+ if(result===null) {
+ that.log(INFO, "Tor check failed: Non-XML returned by check service.");
+ } else if(typeof(result.target) == 'undefined'
+ || result.target === null) {
+ that.log(INFO, "Tor check failed: Busted XML returned by check service.");
+ } else if(result.target === "success") {
+ that.log(INFO, "Tor check succeeded.");
+ that.proxy_test_successful = true;
+ } else {
+ that.log(INFO, "Tor check failed: "+result.target);
+ }
+ } else {
+ that.log(INFO, "Tor check failed: HTTP Error "+req.status);
+ }
+
+ /* Notify the UI of the test result */
+ if (that.proxy_test_callback) {
+ that.proxy_test_callback(that.proxy_test_successful);
+ that.proxy_test_callback = null;
+ }
+ that.proxyTestFinished();
+ }
+ };
+ req.send(null);
+ } catch(e) {
+ this.proxy_test_successful = false;
+ if(e.result == 0x80004005) { // NS_ERROR_FAILURE
+ this.log(INFO, "Tor check failed: Proxy not running.");
+ }
+ this.log(INFO, "Tor check failed: Internal error: "+e);
+ if (this.proxy_test_callback) {
+ this.proxy_test_callback(this.proxy_test_successful);
+ this.proxy_test_callback = null;
+ }
+ that.proxyTestFinished();
+ }
+ },
+
+ proxyTestFinished: function() {
+ if (!this.myGetBoolPref("enabled")) {
+ this.pps.unregisterFilter(this);
+ }
+ },
+
+ getProxySettings: function(testingForTor) {
+ // This may be called either for an Observatory submission, or during a test to see if Tor is
+ // present. The testingForTor argument is true in the latter case.
+ var proxy_settings = ["direct", "", 0];
+ this.log(INFO,"in getProxySettings()");
+ var custom_proxy_type = this.prefs.getCharPref("extensions.https_everywhere._observatory.proxy_type");
+ if (this.torbutton_installed && this.myGetBoolPref("use_tor_proxy")) {
+ this.log(INFO,"CASE: use_tor_proxy");
+ // extract torbutton proxy settings
+ proxy_settings[0] = "http";
+ proxy_settings[1] = this.prefs.getCharPref("extensions.torbutton.https_proxy");
+ proxy_settings[2] = this.prefs.getIntPref("extensions.torbutton.https_port");
+
+ if (proxy_settings[2] == 0) {
+ proxy_settings[0] = "socks";
+ proxy_settings[1] = this.prefs.getCharPref("extensions.torbutton.socks_host");
+ proxy_settings[2] = this.prefs.getIntPref("extensions.torbutton.socks_port");
+ }
+ /* Regarding the test below:
+ *
+ * custom_proxy_type == "direct" is indicative of the user having selected "submit certs even if
+ * Tor is not available", rather than true custom Tor proxy settings. So in that case, there's
+ * not much point probing to see if the direct proxy is actually a Tor connection, and
+ * localhost:9050 is a better bet. People whose networks send all traffc through Tor can just
+ * tell the Observatory to submit certs without Tor.
+ */
+ } else if (this.myGetBoolPref("use_custom_proxy") && !(testingForTor && custom_proxy_type == "direct")) {
+ this.log(INFO,"CASE: use_custom_proxy");
+ proxy_settings[0] = custom_proxy_type;
+ proxy_settings[1] = this.prefs.getCharPref("extensions.https_everywhere._observatory.proxy_host");
+ proxy_settings[2] = this.prefs.getIntPref("extensions.https_everywhere._observatory.proxy_port");
+ } else {
+ /* Take a guess at default tor proxy settings */
+ this.log(INFO,"CASE: try localhost:9050");
+ proxy_settings[0] = "socks";
+ proxy_settings[1] = "localhost";
+ proxy_settings[2] = 9050;
+ }
+ this.log(INFO, "Using proxy: " + proxy_settings);
+ return proxy_settings;
+ },
+
+ applyFilter: function(aProxyService, inURI, aProxy) {
+
+ try {
+ if (inURI instanceof Ci.nsIURI) {
+ var aURI = inURI.QueryInterface(Ci.nsIURI);
+ if (!aURI) this.log(WARN, "Failed to QI to nsIURI!");
+ } else {
+ this.log(WARN, "applyFilter called without URI");
+ }
+ } catch (e) {
+ this.log(WARN, "EXPLOSION: " + e);
+ }
+
+ var isSubmission = this.submission_regexp.test(aURI.spec);
+ var testingForTor = this.cto_regexp.test(aURI.spec);
+
+ if (isSubmission || testingForTor) {
+ if (aURI.path.search(this.csrf_nonce+"$") != -1) {
+
+ this.log(INFO, "Got observatory url + nonce: "+aURI.spec);
+ var proxy_settings = null;
+ var proxy = null;
+
+ // Send it through tor by creating an nsIProxy instance
+ // for the torbutton proxy settings.
+ try {
+ proxy_settings = this.getProxySettings(testingForTor);
+ proxy = this.pps.newProxyInfo(proxy_settings[0], proxy_settings[1],
+ proxy_settings[2],
+ Ci.nsIProxyInfo.TRANSPARENT_PROXY_RESOLVES_HOST,
+ 0xFFFFFFFF, null);
+ } catch(e) {
+ this.log(WARN, "Error specifying proxy for observatory: "+e);
+ }
+
+ this.log(INFO, "Specifying proxy: "+proxy);
+
+ // TODO: Use new identity or socks u/p to ensure we get a unique
+ // tor circuit for this request
+ return proxy;
+ }
+ }
+ return aProxy;
+ },
+
+ // [optional] an array of categories to register this component in.
+ // Hack to cause us to get instantiate early
+ _xpcom_categories: [ { category: "profile-after-change" }, ],
+
+ encString: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
+ encStringS: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',
+
+ log: function(level, str) {
+ var econsole = CC["@mozilla.org/consoleservice;1"]
+ .getService(CI.nsIConsoleService);
+ try {
+ var threshold = this.prefs.getIntPref(LLVAR);
+ } catch (e) {
+ econsole.logStringMessage( "SSL Observatory: Failed to read about:config LogLevel");
+ threshold = WARN;
+ }
+ if (level >= threshold) {
+ dump("SSL Observatory: "+str+"\n");
+ econsole.logStringMessage("SSL Observatory: " +str);
+ }
+ }
+};
+
+/**
+* XPCOMUtils.generateNSGetFactory was introduced in Mozilla 2 (Firefox 4).
+* XPCOMUtils.generateNSGetModule is for Mozilla 1.9.2 (Firefox 3.6).
+*/
+if (XPCOMUtils.generateNSGetFactory)
+ var NSGetFactory = XPCOMUtils.generateNSGetFactory([SSLObservatory]);
+else
+ var NSGetModule = XPCOMUtils.generateNSGetModule([SSLObservatory]);
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/defaults/preferences/preferences.js b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/defaults/preferences/preferences.js
new file mode 100644
index 0000000..205bf8d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/defaults/preferences/preferences.js
@@ -0,0 +1,45 @@
+pref("extensions.https_everywhere.LogLevel", 5);
+pref("extensions.https_everywhere.globalEnabled",true);
+
+// this is the HTTPS Everywhere preferences version (for migrations)
+pref("extensions.https_everywhere.prefs_version", 0);
+
+// this is a popup asking whether the user really meant to be on the dev branch
+pref("extensions.https_everywhere.dev_popup_shown", false);
+
+// show ruleset tests in the menu
+pref("extensions.https_everywhere.show_ruleset_tests", false);
+// run a ruleset performance test at startup
+pref("extensions.https_everywhere.performance_tests", false);
+
+// enable rulesets that trigger mixed content blocking
+pref("extensions.https_everywhere.enable_mixed_rulesets", false);
+
+
+// SSl Observatory preferences
+pref("extensions.https_everywhere._observatory.enabled",false);
+
+// "testing" currently means send unecessary fingerprints and other test-suite
+// type stuff
+pref("extensions.https_everywhere._observatory.testing",false);
+
+pref("extensions.https_everywhere._observatory.server_host","observatory.eff.org");
+pref("extensions.https_everywhere._observatory.use_tor_proxy",true);
+pref("extensions.https_everywhere._observatory.submit_during_tor",true);
+pref("extensions.https_everywhere._observatory.submit_during_nontor",true);
+
+pref("extensions.https_everywhere._observatory.cache_submitted",true);
+
+pref("extensions.https_everywhere._observatory.use_custom_proxy",false);
+pref("extensions.https_everywhere._observatory.popup_shown",true);
+pref("extensions.https_everywhere.toolbar_hint_shown",true);
+pref("extensions.https_everywhere._observatory.proxy_host","");
+pref("extensions.https_everywhere._observatory.proxy_port",0);
+pref("extensions.https_everywhere._observatory.proxy_type","direct");
+pref("extensions.https_everywhere._observatory.use_tor_proxy",true);
+pref("extensions.https_everywhere._observatory.alt_roots",false);
+pref("extensions.https_everywhere._observatory.self_signed",true);
+pref("extensions.https_everywhere._observatory.priv_dns",false);
+pref("extensions.https_everywhere._observatory.send_asn",true);
+pref("extensions.https_everywhere._observatory.use_whitelist",true);
+pref("extensions.https_everywhere._observatory.clean_config",false);
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/defaults/rulesets.sqlite b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/defaults/rulesets.sqlite
new file mode 100644
index 0000000..6141547
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/defaults/rulesets.sqlite
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/install.rdf b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/install.rdf
new file mode 100644
index 0000000..ddb6e14
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/https-everywhere@eff.org/install.rdf
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+
+ <Description about="urn:mozilla:install-manifest">
+ <em:name>HTTPS-Everywhere</em:name>
+ <em:creator>Mike Perry &amp; Peter Eckersley</em:creator>
+ <em:aboutURL>chrome://https-everywhere/content/about.xul</em:aboutURL>
+ <em:id>https-everywhere@eff.org</em:id>
+ <em:description>Encrypt the Web! Automatically use HTTPS security on many sites.</em:description>
+ <em:version>3.5.1</em:version>
+ <em:homepageURL>https://www.eff.org/https-everywhere</em:homepageURL>
+ <em:optionsURL>chrome://https-everywhere/content/meta-preferences.xul</em:optionsURL>
+ <em:iconURL>chrome://https-everywhere/skin/https-everywhere.png</em:iconURL>
+ <em:updateURL>https://www.eff.org/files/https-everywhere-update-2048.rdf</em:updateURL>
+ <em:unpack>true</em:unpack> <!-- Required for Firefox 4 -->
+ <em:updateKey>MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6MR8W/galdxnpGqBsYbqOzQb2eyW15YFjDDEMI0ZOzt8f504obNs920lDnpPD2/KqgsfjOgw2K7xWDJIj/18xUvWPk3LDkrnokNiRkA3KOx3W6fHycKL+zID7zy+xZYBuh2fLyQtWV1VGQ45iNRp9+Zo7rH86cdfgkdnWTlNSHyTLW9NbXvyv/E12bppPcEvgCTAQXgnDVJ0/sqmeiijn9tTFh03aM+R2V/21h8aTraAS24qiPCz6gkmYGC8yr6mglcnNoYbsLNYZ69zF1XHcXPduCPdPdfLlzVlKK1/U7hkA28eG3BIAMh6uJYBRJTpiGgaGdPd7YekUB8S6cy+CQIDAQAB</em:updateKey>
+ <!-- firefox -->
+ <em:targetApplication>
+ <Description>
+ <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
+ <em:minVersion>20</em:minVersion>
+ <em:maxVersion>32.*</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ <!-- Seamonkey -->
+ <em:targetApplication>
+ <Description>
+ <em:id>{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}</em:id>
+ <em:minVersion>2.17</em:minVersion>
+ <em:maxVersion>3.*</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ <!-- thunderbird -->
+ <em:targetApplication>
+ <Description>
+ <em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</em:id>
+ <em:minVersion>17.0.5</em:minVersion>
+ <em:maxVersion>32</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ <!-- Conkeror -->
+ <em:targetApplication>
+ <Description>
+ <em:id>{a79fe89b-6662-4ff4-8e88-09950ad4dfde}</em:id>
+ <em:minVersion>0.1</em:minVersion>
+ <em:maxVersion>99.*</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ </Description>
+</RDF>
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/bootstrap.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/bootstrap.js
new file mode 100644
index 0000000..840103a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/bootstrap.js
@@ -0,0 +1,350 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// @see http://mxr.mozilla.org/mozilla-central/source/js/src/xpconnect/loader/mozJSComponentLoader.cpp
+
+'use strict';
+
+// IMPORTANT: Avoid adding any initialization tasks here, if you need to do
+// something before add-on is loaded consider addon/runner module instead!
+
+const { classes: Cc, Constructor: CC, interfaces: Ci, utils: Cu,
+ results: Cr, manager: Cm } = Components;
+const ioService = Cc['@mozilla.org/network/io-service;1'].
+ getService(Ci.nsIIOService);
+const resourceHandler = ioService.getProtocolHandler('resource').
+ QueryInterface(Ci.nsIResProtocolHandler);
+const systemPrincipal = CC('@mozilla.org/systemprincipal;1', 'nsIPrincipal')();
+const scriptLoader = Cc['@mozilla.org/moz/jssubscript-loader;1'].
+ getService(Ci.mozIJSSubScriptLoader);
+const prefService = Cc['@mozilla.org/preferences-service;1'].
+ getService(Ci.nsIPrefService).
+ QueryInterface(Ci.nsIPrefBranch);
+const appInfo = Cc["@mozilla.org/xre/app-info;1"].
+ getService(Ci.nsIXULAppInfo);
+const vc = Cc["@mozilla.org/xpcom/version-comparator;1"].
+ getService(Ci.nsIVersionComparator);
+
+
+const REASON = [ 'unknown', 'startup', 'shutdown', 'enable', 'disable',
+ 'install', 'uninstall', 'upgrade', 'downgrade' ];
+
+const bind = Function.call.bind(Function.bind);
+
+let loader = null;
+let unload = null;
+let cuddlefishSandbox = null;
+let nukeTimer = null;
+
+let resourceDomains = [];
+function setResourceSubstitution(domain, uri) {
+ resourceDomains.push(domain);
+ resourceHandler.setSubstitution(domain, uri);
+}
+
+// Utility function that synchronously reads local resource from the given
+// `uri` and returns content string.
+function readURI(uri) {
+ let ioservice = Cc['@mozilla.org/network/io-service;1'].
+ getService(Ci.nsIIOService);
+ let channel = ioservice.newChannel(uri, 'UTF-8', null);
+ let stream = channel.open();
+
+ let cstream = Cc['@mozilla.org/intl/converter-input-stream;1'].
+ createInstance(Ci.nsIConverterInputStream);
+ cstream.init(stream, 'UTF-8', 0, 0);
+
+ let str = {};
+ let data = '';
+ let read = 0;
+ do {
+ read = cstream.readString(0xffffffff, str);
+ data += str.value;
+ } while (read != 0);
+
+ cstream.close();
+
+ return data;
+}
+
+// We don't do anything on install & uninstall yet, but in a future
+// we should allow add-ons to cleanup after uninstall.
+function install(data, reason) {}
+function uninstall(data, reason) {}
+
+function startup(data, reasonCode) {
+ try {
+ let reason = REASON[reasonCode];
+ // URI for the root of the XPI file.
+ // 'jar:' URI if the addon is packed, 'file:' URI otherwise.
+ // (Used by l10n module in order to fetch `locale` folder)
+ let rootURI = data.resourceURI.spec;
+
+ // TODO: Maybe we should perform read harness-options.json asynchronously,
+ // since we can't do anything until 'sessionstore-windows-restored' anyway.
+ let options = JSON.parse(readURI(rootURI + './harness-options.json'));
+
+ let id = options.jetpackID;
+ let name = options.name;
+
+ // Clean the metadata
+ options.metadata[name]['permissions'] = options.metadata[name]['permissions'] || {};
+
+ // freeze the permissionss
+ Object.freeze(options.metadata[name]['permissions']);
+ // freeze the metadata
+ Object.freeze(options.metadata[name]);
+
+ // Register a new resource 'domain' for this addon which is mapping to
+ // XPI's `resources` folder.
+ // Generate the domain name by using jetpack ID, which is the extension ID
+ // by stripping common characters that doesn't work as a domain name:
+ let uuidRe =
+ /^\{([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\}$/;
+
+ let domain = id.
+ toLowerCase().
+ replace(/@/g, '-at-').
+ replace(/\./g, '-dot-').
+ replace(uuidRe, '$1');
+
+ let prefixURI = 'resource://' + domain + '/';
+ let resourcesURI = ioService.newURI(rootURI + '/resources/', null, null);
+ setResourceSubstitution(domain, resourcesURI);
+
+ // Create path to URLs mapping supported by loader.
+ let paths = {
+ // Relative modules resolve to add-on package lib
+ './': prefixURI + name + '/lib/',
+ './tests/': prefixURI + name + '/tests/',
+ '': 'resource://gre/modules/commonjs/'
+ };
+
+ // Maps addon lib and tests ressource folders for each package
+ paths = Object.keys(options.metadata).reduce(function(result, name) {
+ result[name + '/'] = prefixURI + name + '/lib/'
+ result[name + '/tests/'] = prefixURI + name + '/tests/'
+ return result;
+ }, paths);
+
+ // We need to map tests folder when we run sdk tests whose package name
+ // is stripped
+ if (name == 'addon-sdk')
+ paths['tests/'] = prefixURI + name + '/tests/';
+
+ let useBundledSDK = options['force-use-bundled-sdk'];
+ if (!useBundledSDK) {
+ try {
+ useBundledSDK = prefService.getBoolPref("extensions.addon-sdk.useBundledSDK");
+ }
+ catch (e) {
+ // Pref doesn't exist, allow using Firefox shipped SDK
+ }
+ }
+
+ // Starting with Firefox 21.0a1, we start using modules shipped into firefox
+ // Still allow using modules from the xpi if the manifest tell us to do so.
+ // And only try to look for sdk modules in xpi if the xpi actually ship them
+ if (options['is-sdk-bundled'] &&
+ (vc.compare(appInfo.version, '21.0a1') < 0 || useBundledSDK)) {
+ // Maps sdk module folders to their resource folder
+ paths[''] = prefixURI + 'addon-sdk/lib/';
+ // test.js is usually found in root commonjs or SDK_ROOT/lib/ folder,
+ // so that it isn't shipped in the xpi. Keep a copy of it in sdk/ folder
+ // until we no longer support SDK modules in XPI:
+ paths['test'] = prefixURI + 'addon-sdk/lib/sdk/test.js';
+ }
+
+ // Retrieve list of module folder overloads based on preferences in order to
+ // eventually used a local modules instead of files shipped into Firefox.
+ let branch = prefService.getBranch('extensions.modules.' + id + '.path');
+ paths = branch.getChildList('', {}).reduce(function (result, name) {
+ // Allows overloading of any sub folder by replacing . by / in pref name
+ let path = name.substr(1).split('.').join('/');
+ // Only accept overloading folder by ensuring always ending with `/`
+ if (path) path += '/';
+ let fileURI = branch.getCharPref(name);
+
+ // On mobile, file URI has to end with a `/` otherwise, setSubstitution
+ // takes the parent folder instead.
+ if (fileURI[fileURI.length-1] !== '/')
+ fileURI += '/';
+
+ // Maps the given file:// URI to a resource:// in order to avoid various
+ // failure that happens with file:// URI and be close to production env
+ let resourcesURI = ioService.newURI(fileURI, null, null);
+ let resName = 'extensions.modules.' + domain + '.commonjs.path' + name;
+ setResourceSubstitution(resName, resourcesURI);
+
+ result[path] = 'resource://' + resName + '/';
+ return result;
+ }, paths);
+
+ // Make version 2 of the manifest
+ let manifest = options.manifest;
+
+ // Import `cuddlefish.js` module using a Sandbox and bootstrap loader.
+ let cuddlefishPath = 'loader/cuddlefish.js';
+ let cuddlefishURI = 'resource://gre/modules/commonjs/sdk/' + cuddlefishPath;
+ if (paths['sdk/']) { // sdk folder has been overloaded
+ // (from pref, or cuddlefish is still in the xpi)
+ cuddlefishURI = paths['sdk/'] + cuddlefishPath;
+ }
+ else if (paths['']) { // root modules folder has been overloaded
+ cuddlefishURI = paths[''] + 'sdk/' + cuddlefishPath;
+ }
+
+ cuddlefishSandbox = loadSandbox(cuddlefishURI);
+ let cuddlefish = cuddlefishSandbox.exports;
+
+ // Normalize `options.mainPath` so that it looks like one that will come
+ // in a new version of linker.
+ let main = options.mainPath;
+
+ unload = cuddlefish.unload;
+ loader = cuddlefish.Loader({
+ paths: paths,
+ // modules manifest.
+ manifest: manifest,
+
+ // Add-on ID used by different APIs as a unique identifier.
+ id: id,
+ // Add-on name.
+ name: name,
+ // Add-on version.
+ version: options.metadata[name].version,
+ // Add-on package descriptor.
+ metadata: options.metadata[name],
+ // Add-on load reason.
+ loadReason: reason,
+
+ prefixURI: prefixURI,
+ // Add-on URI.
+ rootURI: rootURI,
+ // options used by system module.
+ // File to write 'OK' or 'FAIL' (exit code emulation).
+ resultFile: options.resultFile,
+ // Arguments passed as --static-args
+ staticArgs: options.staticArgs,
+ // Add-on preferences branch name
+ preferencesBranch: options.preferencesBranch,
+
+ // Arguments related to test runner.
+ modules: {
+ '@test/options': {
+ allTestModules: options.allTestModules,
+ iterations: options.iterations,
+ filter: options.filter,
+ profileMemory: options.profileMemory,
+ stopOnError: options.stopOnError,
+ verbose: options.verbose,
+ parseable: options.parseable,
+ checkMemory: options.check_memory,
+ }
+ }
+ });
+
+ let module = cuddlefish.Module('sdk/loader/cuddlefish', cuddlefishURI);
+ let require = cuddlefish.Require(loader, module);
+
+ require('sdk/addon/runner').startup(reason, {
+ loader: loader,
+ main: main,
+ prefsURI: rootURI + 'defaults/preferences/prefs.js'
+ });
+ } catch (error) {
+ dump('Bootstrap error: ' +
+ (error.message ? error.message : String(error)) + '\n' +
+ (error.stack || error.fileName + ': ' + error.lineNumber) + '\n');
+ throw error;
+ }
+};
+
+function loadSandbox(uri) {
+ let proto = {
+ sandboxPrototype: {
+ loadSandbox: loadSandbox,
+ ChromeWorker: ChromeWorker
+ }
+ };
+ let sandbox = Cu.Sandbox(systemPrincipal, proto);
+ // Create a fake commonjs environnement just to enable loading loader.js
+ // correctly
+ sandbox.exports = {};
+ sandbox.module = { uri: uri, exports: sandbox.exports };
+ sandbox.require = function (id) {
+ if (id !== "chrome")
+ throw new Error("Bootstrap sandbox `require` method isn't implemented.");
+
+ return Object.freeze({ Cc: Cc, Ci: Ci, Cu: Cu, Cr: Cr, Cm: Cm,
+ CC: bind(CC, Components), components: Components,
+ ChromeWorker: ChromeWorker });
+ };
+ scriptLoader.loadSubScript(uri, sandbox, 'UTF-8');
+ return sandbox;
+}
+
+function unloadSandbox(sandbox) {
+ if ("nukeSandbox" in Cu)
+ Cu.nukeSandbox(sandbox);
+}
+
+function setTimeout(callback, delay) {
+ let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ timer.initWithCallback({ notify: callback }, delay,
+ Ci.nsITimer.TYPE_ONE_SHOT);
+ return timer;
+}
+
+function shutdown(data, reasonCode) {
+ let reason = REASON[reasonCode];
+ if (loader) {
+ unload(loader, reason);
+ unload = null;
+
+ // Don't waste time cleaning up if the application is shutting down
+ if (reason != "shutdown") {
+ // Avoid leaking all modules when something goes wrong with one particular
+ // module. Do not clean it up immediatly in order to allow executing some
+ // actions on addon disabling.
+ // We need to keep a reference to the timer, otherwise it is collected
+ // and won't ever fire.
+ nukeTimer = setTimeout(nukeModules, 1000);
+
+ // Bug 944951 - bootstrap.js must remove the added resource: URIs on unload
+ resourceDomains.forEach(domain => {
+ resourceHandler.setSubstitution(domain, null);
+ })
+ }
+ }
+};
+
+function nukeModules() {
+ nukeTimer = null;
+ // module objects store `exports` which comes from sandboxes
+ // We should avoid keeping link to these object to avoid leaking sandboxes
+ for (let key in loader.modules) {
+ delete loader.modules[key];
+ }
+ // Direct links to sandboxes should be removed too
+ for (let key in loader.sandboxes) {
+ let sandbox = loader.sandboxes[key];
+ delete loader.sandboxes[key];
+ // Bug 775067: From FF17 we can kill all CCW from a given sandbox
+ unloadSandbox(sandbox);
+ }
+ loader = null;
+
+ // both `toolkit/loader` and `system/xul-app` are loaded as JSM's via
+ // `cuddlefish.js`, and needs to be unloaded to avoid memory leaks, when
+ // the addon is unload.
+
+ unloadSandbox(cuddlefishSandbox.loaderSandbox);
+ unloadSandbox(cuddlefishSandbox.xulappSandbox);
+
+ // Bug 764840: We need to unload cuddlefish otherwise it will stay alive
+ // and keep a reference to this compartment.
+ unloadSandbox(cuddlefishSandbox);
+ cuddlefishSandbox = null;
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/defaults/preferences/prefs.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/defaults/preferences/prefs.js
new file mode 100644
index 0000000..d5b39bf
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/defaults/preferences/prefs.js
@@ -0,0 +1,3 @@
+pref("extensions.jid1-KtlZuoiikVfFew@jetpack.whitelist", "");
+pref("extensions.jid1-KtlZuoiikVfFew@jetpack.complaint_tab", true);
+pref("extensions.jid1-KtlZuoiikVfFew@jetpack.display_notifications", false);
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/harness-options.json b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/harness-options.json
new file mode 100644
index 0000000..abb45db
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/harness-options.json
@@ -0,0 +1,737 @@
+{
+ "abort_on_missing": false,
+ "check_memory": false,
+ "enable_e10s": false,
+ "is-sdk-bundled": false,
+ "jetpackID": "jid1-KtlZuoiikVfFew@jetpack",
+ "loader": "addon-sdk/lib/sdk/loader/cuddlefish.js",
+ "main": "lib/main",
+ "mainPath": "librejs/main",
+ "manifest": {
+ "addon-tab/addon-tab": {
+ "docsSHA256": null,
+ "jsSHA256": "8b277dc27d85a72bfba1becfe6f57dceb5c9c717e5bc52a3bea936ec957a6893",
+ "moduleName": "addon-tab",
+ "packageName": "addon-tab",
+ "requirements": {
+ "sdk/core/namespace": "sdk/core/namespace",
+ "sdk/deprecated/window-utils": "sdk/deprecated/window-utils",
+ "sdk/lang/functional": "sdk/lang/functional",
+ "sdk/self": "sdk/self",
+ "sdk/tabs": "sdk/tabs",
+ "sdk/tabs/utils": "sdk/tabs/utils",
+ "sdk/util/array": "sdk/util/array",
+ "sdk/window/utils": "sdk/window/utils"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/addon_management/install_uninstall": {
+ "docsSHA256": null,
+ "jsSHA256": "6a16abeaed2a4983ce58d1895166abf3d93726cd6ca9e1506bfc6910c9840414",
+ "moduleName": "addon_management/install_uninstall",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "http_observer/caching": "librejs/http_observer/caching",
+ "http_observer/http_request_observer": "librejs/http_observer/http_request_observer",
+ "narcissus_parser/narcissus_worker": "librejs/narcissus_parser/narcissus_worker",
+ "sdk/tabs": "sdk/tabs",
+ "settings/storage": "librejs/settings/storage"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/addon_management/prefchange": {
+ "docsSHA256": null,
+ "jsSHA256": "692562f0c44ad53551cbf60d7c7f6ff066455c114f174d1ce875e287d5c1b1d0",
+ "moduleName": "addon_management/prefchange",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "script_entries/scripts_cache": "librejs/script_entries/scripts_cache",
+ "sdk/simple-prefs": "sdk/simple-prefs"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/bug_fix": {
+ "docsSHA256": null,
+ "jsSHA256": "0a5bf0ff6dcb522bd39dcc60d37d0b0eb3b897487ff41656521c7594d0b6a018",
+ "moduleName": "html_script_finder/bug_fix",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/dom_handler": {
+ "docsSHA256": null,
+ "jsSHA256": "556cd3e5df38a622958fa4b7710f59f2edc896407e0e3d2b21b36bfa71d869f4",
+ "moduleName": "html_script_finder/dom_handler",
+ "packageName": "librejs",
+ "requirements": {
+ "addon_management/prefchange": "librejs/addon_management/prefchange",
+ "chrome": "chrome",
+ "html_script_finder/dom_handler/attributes": "librejs/html_script_finder/dom_handler/attributes",
+ "html_script_finder/dom_handler/dom_checker": "librejs/html_script_finder/dom_handler/dom_checker",
+ "html_script_finder/dom_handler/dom_gatherer": "librejs/html_script_finder/dom_handler/dom_gatherer",
+ "html_script_finder/dom_handler/script_object": "librejs/html_script_finder/dom_handler/script_object",
+ "html_script_finder/dom_handler/script_properties": "librejs/html_script_finder/dom_handler/script_properties",
+ "html_script_finder/web_labels/js_web_labels": "librejs/html_script_finder/web_labels/js_web_labels",
+ "http_observer/allowed_referrers": "librejs/http_observer/allowed_referrers",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/js_checker": "librejs/js_checker/js_checker",
+ "js_checker/privacy_checker": "librejs/js_checker/privacy_checker",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/dom_handler/attributes": {
+ "docsSHA256": null,
+ "jsSHA256": "6a7af82d8e90742721060a9eba70f49562d099570b5e7ea6cc4f4d0634a0a78a",
+ "moduleName": "html_script_finder/dom_handler/attributes",
+ "packageName": "librejs",
+ "requirements": {
+ "html_script_finder/dom_handler/script_object": "librejs/html_script_finder/dom_handler/script_object",
+ "html_script_finder/dom_handler/script_properties": "librejs/html_script_finder/dom_handler/script_properties"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/dom_handler/dom_checker": {
+ "docsSHA256": null,
+ "jsSHA256": "efecce628d06b18b820da370bf5e9408b9d9e33ab6cc4b82c8f2063e95701489",
+ "moduleName": "html_script_finder/dom_handler/dom_checker",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "html_script_finder/dom_handler/request": "librejs/html_script_finder/dom_handler/request",
+ "html_script_finder/dom_handler/script_properties": "librejs/html_script_finder/dom_handler/script_properties",
+ "html_script_finder/url_seen_tester": "librejs/html_script_finder/url_seen_tester",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/js_checker": "librejs/js_checker/js_checker",
+ "js_checker/privacy_checker": "librejs/js_checker/privacy_checker",
+ "script_entries/scripts_cache": "librejs/script_entries/scripts_cache",
+ "sdk/timers": "sdk/timers",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/dom_handler/dom_gatherer": {
+ "docsSHA256": null,
+ "jsSHA256": "d90a852c6abfd418085b243e18795471c695590cad7829490d0e079a2f550b6d",
+ "moduleName": "html_script_finder/dom_handler/dom_gatherer",
+ "packageName": "librejs",
+ "requirements": {
+ "html_script_finder/bug_fix": "librejs/html_script_finder/bug_fix",
+ "html_script_finder/dom_handler/attributes": "librejs/html_script_finder/dom_handler/attributes",
+ "html_script_finder/dom_handler/script_object": "librejs/html_script_finder/dom_handler/script_object",
+ "html_script_finder/dom_handler/script_properties": "librejs/html_script_finder/dom_handler/script_properties",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/privacy_checker": "librejs/js_checker/privacy_checker",
+ "script_entries/scripts_cache": "librejs/script_entries/scripts_cache",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/dom_handler/request": {
+ "docsSHA256": null,
+ "jsSHA256": "af49bc14e9ee3d561a698a4dc149e6436368caba47504620ece88e9b43446d78",
+ "moduleName": "html_script_finder/dom_handler/request",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "html_script_finder/url_seen_tester": "librejs/html_script_finder/url_seen_tester",
+ "script_entries/scripts_cache": "librejs/script_entries/scripts_cache",
+ "sdk/timers": "sdk/timers",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/dom_handler/script_object": {
+ "docsSHA256": null,
+ "jsSHA256": "947f425475661a1f7572bb58a49763dfb6bb628e2dfaa34aad626a63ebe04c08",
+ "moduleName": "html_script_finder/dom_handler/script_object",
+ "packageName": "librejs",
+ "requirements": {
+ "script_entries/accepted_scripts": "librejs/script_entries/accepted_scripts",
+ "script_entries/dryrun_scripts": "librejs/script_entries/dryrun_scripts",
+ "script_entries/removed_scripts": "librejs/script_entries/removed_scripts"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/dom_handler/script_properties": {
+ "docsSHA256": null,
+ "jsSHA256": "2faf007239a9f519ce4d563e462a3940cb5176ddcc3c0baf9ab13130d6050b37",
+ "moduleName": "html_script_finder/dom_handler/script_properties",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/html_parser": {
+ "docsSHA256": null,
+ "jsSHA256": "00b174d23d15dd7d7833f35fe9c1bd56a1142f3b6066f8160123be2fc707adf5",
+ "moduleName": "html_script_finder/html_parser",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "html_script_finder/dom_handler": "librejs/html_script_finder/dom_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/url_seen_tester": {
+ "docsSHA256": null,
+ "jsSHA256": "80b2a59407826b389b6eaa15409ecdd6ebe6039de0a19933858f0a73f3de6286",
+ "moduleName": "html_script_finder/url_seen_tester",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/web_labels/find_js_labels": {
+ "docsSHA256": null,
+ "jsSHA256": "503889ed95b612c82413ebd1ac690ee9a8621b60f5125a0419f10c68d0a92027",
+ "moduleName": "html_script_finder/web_labels/find_js_labels",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/web_labels/js_web_labels": {
+ "docsSHA256": null,
+ "jsSHA256": "3440132dcaecc725d0ab81691c7830decb8408a56a6d525b9ab13cb413359eec",
+ "moduleName": "html_script_finder/web_labels/js_web_labels",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "html_script_finder/web_labels/find_js_labels": "librejs/html_script_finder/web_labels/find_js_labels",
+ "html_script_finder/web_labels/script_hash_worker": "librejs/html_script_finder/web_labels/script_hash_worker",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/license_definitions": "librejs/js_checker/license_definitions",
+ "sdk/self": "sdk/self",
+ "sdk/timers": "sdk/timers",
+ "sdk/url": "sdk/url",
+ "ui/notification": "librejs/ui/notification",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/html_script_finder/web_labels/script_hash_worker": {
+ "docsSHA256": null,
+ "jsSHA256": "396431bed43197096e21a086b65e39edaa05c4c07d29ae9533ef95654a4f9add",
+ "moduleName": "html_script_finder/web_labels/script_hash_worker",
+ "packageName": "librejs",
+ "requirements": {
+ "html_script_finder/dom_handler/dom_checker": "librejs/html_script_finder/dom_handler/dom_checker",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "script_entries/scripts_cache": "librejs/script_entries/scripts_cache",
+ "sdk/timers": "sdk/timers"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/http_observer/allowed_referrers": {
+ "docsSHA256": null,
+ "jsSHA256": "6792a243c6413f20b719a5526eac3be4b75d48888922d978b0d2dfa0b0449ea3",
+ "moduleName": "http_observer/allowed_referrers",
+ "packageName": "librejs",
+ "requirements": {
+ "addon_management/prefchange": "librejs/addon_management/prefchange"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/http_observer/caching": {
+ "docsSHA256": null,
+ "jsSHA256": "2e1d459f007aaa88133d97af8d994c23030d4b5057450772cb482dea49c38c6e",
+ "moduleName": "http_observer/caching",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/http_observer/http_request_observer": {
+ "docsSHA256": null,
+ "jsSHA256": "d7dcb48aa57f7970401a8a5385130eb74fb71d981eb44b3387ef5decd84a9fe2",
+ "moduleName": "http_observer/http_request_observer",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "html_script_finder/url_seen_tester": "librejs/html_script_finder/url_seen_tester",
+ "http_observer/stream_loader": "librejs/http_observer/stream_loader"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/http_observer/process_response": {
+ "docsSHA256": null,
+ "jsSHA256": "2e8a93d70ba811a090bc2876f958818d87c0b79ac00d3122acfe36717d933209",
+ "moduleName": "http_observer/process_response",
+ "packageName": "librejs",
+ "requirements": {
+ "addon_management/prefchange": "librejs/addon_management/prefchange",
+ "chrome": "chrome",
+ "html_script_finder/html_parser": "librejs/html_script_finder/html_parser",
+ "html_script_finder/web_labels/js_web_labels": "librejs/html_script_finder/web_labels/js_web_labels",
+ "http_observer/allowed_referrers": "librejs/http_observer/allowed_referrers",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/js_checker": "librejs/js_checker/js_checker",
+ "script_entries/accepted_scripts": "librejs/script_entries/accepted_scripts",
+ "script_entries/dryrun_scripts": "librejs/script_entries/dryrun_scripts",
+ "script_entries/removed_scripts": "librejs/script_entries/removed_scripts",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/http_observer/stream_loader": {
+ "docsSHA256": null,
+ "jsSHA256": "4f3eb2c9cf163cd95932b74b1df6f765121a8d014f42db238d03c83e0f5fced4",
+ "moduleName": "http_observer/stream_loader",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "http_observer/process_response": "librejs/http_observer/process_response"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/js_checker/constant_types": {
+ "docsSHA256": null,
+ "jsSHA256": "96273f784e92749ffa833ae2993987fbab7be40d7293dd01d990def147bc29a5",
+ "moduleName": "js_checker/constant_types",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/js_checker/free_checker": {
+ "docsSHA256": null,
+ "jsSHA256": "22433f7aeb3f6c41c8c36b083501ad9805b21e703074602b8d50d194467ffb6a",
+ "moduleName": "js_checker/free_checker",
+ "packageName": "librejs",
+ "requirements": {
+ "html_script_finder/bug_fix": "librejs/html_script_finder/bug_fix",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/license_definitions": "librejs/js_checker/license_definitions",
+ "js_checker/pattern_utils": "librejs/js_checker/pattern_utils",
+ "sdk/simple-storage": "sdk/simple-storage"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/js_checker/js_checker": {
+ "docsSHA256": null,
+ "jsSHA256": "e40794e96193a92eab003a9b028c52319e6c6c033eceb41e25893708292f519d",
+ "moduleName": "js_checker/js_checker",
+ "packageName": "librejs",
+ "requirements": {
+ "addon_management/prefchange": "librejs/addon_management/prefchange",
+ "chrome": "chrome",
+ "html_script_finder/bug_fix": "librejs/html_script_finder/bug_fix",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/free_checker": "librejs/js_checker/free_checker",
+ "js_checker/nontrivial_checker": "librejs/js_checker/nontrivial_checker",
+ "js_checker/relation_checker": "librejs/js_checker/relation_checker",
+ "narcissus_parser/narcissus_worker": "librejs/narcissus_parser/narcissus_worker",
+ "script_entries/scripts_cache": "librejs/script_entries/scripts_cache",
+ "sdk/timers": "sdk/timers",
+ "ui/notification": "librejs/ui/notification"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/js_checker/license_definitions": {
+ "docsSHA256": null,
+ "jsSHA256": "26c979a2ec71a6134e4564f2f00d7c27ad878716948a31491189d8c7e4c0041b",
+ "moduleName": "js_checker/license_definitions",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/js_checker/nontrivial_checker": {
+ "docsSHA256": null,
+ "jsSHA256": "a14b688c0d54918ea0c1649e8f44e7d627706278c9732c9f14b5887a6cf69ce5",
+ "moduleName": "js_checker/nontrivial_checker",
+ "packageName": "librejs",
+ "requirements": {
+ "js_checker/constant_types": "librejs/js_checker/constant_types"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/js_checker/pattern_utils": {
+ "docsSHA256": null,
+ "jsSHA256": "6680b0a5f803eb1f0e40119f87c4149ed3a29011e74215322be2f8e4a9b47c66",
+ "moduleName": "js_checker/pattern_utils",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/js_checker/privacy_checker": {
+ "docsSHA256": null,
+ "jsSHA256": "aa7e796cd77ed096a9a47a9cca55b85f8359f670aed7391bc5225d348b5e3848",
+ "moduleName": "js_checker/privacy_checker",
+ "packageName": "librejs",
+ "requirements": {
+ "js_checker/pattern_utils": "librejs/js_checker/pattern_utils",
+ "js_checker/privacy_threat_definitions.js": "librejs/js_checker/privacy_threat_definitions"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/js_checker/privacy_threat_definitions": {
+ "docsSHA256": null,
+ "jsSHA256": "08c681d4827f52bd8cdfc939224577a22194ee32337b9334a4f8b423f17f8ade",
+ "moduleName": "js_checker/privacy_threat_definitions.js",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/js_checker/relation_checker": {
+ "docsSHA256": null,
+ "jsSHA256": "b81106d3a439da67f6a87c6dd76ff9a6759febc6b77305040718eccf4a4dfb41",
+ "moduleName": "js_checker/relation_checker",
+ "packageName": "librejs",
+ "requirements": {
+ "js_checker/constant_types": "librejs/js_checker/constant_types"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/main": {
+ "docsSHA256": null,
+ "jsSHA256": "b60c8856a74381b7c06fef7e0573778492746f3b6984644965bb5bb909ab3d11",
+ "moduleName": "main",
+ "packageName": "librejs",
+ "requirements": {
+ "addon_management/install_uninstall": "librejs/addon_management/install_uninstall",
+ "addon_management/prefchange": "librejs/addon_management/prefchange",
+ "chrome": "chrome",
+ "http_observer/allowed_referrers": "librejs/http_observer/allowed_referrers",
+ "http_observer/http_request_observer": "librejs/http_observer/http_request_observer",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/js_checker": "librejs/js_checker/js_checker",
+ "menuitems": "menuitems/menuitems",
+ "script_entries/accepted_scripts": "librejs/script_entries/accepted_scripts",
+ "script_entries/dryrun_scripts": "librejs/script_entries/dryrun_scripts",
+ "script_entries/removed_scripts": "librejs/script_entries/removed_scripts",
+ "script_entries/scripts_cache": "librejs/script_entries/scripts_cache",
+ "sdk/page-worker": "sdk/page-worker",
+ "sdk/panel": "sdk/panel",
+ "sdk/self": "sdk/self",
+ "sdk/simple-storage": "sdk/simple-storage",
+ "sdk/tabs": "sdk/tabs",
+ "sdk/ui/button/toggle": "sdk/ui/button/toggle",
+ "sdk/window/utils": "sdk/window/utils",
+ "settings/settings_tab": "librejs/settings/settings_tab",
+ "settings/storage": "librejs/settings/storage",
+ "ui/script_panel.js": "librejs/ui/script_panel",
+ "ui/ui_info": "librejs/ui/ui_info",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/narcissus_parser/narcissus_worker": {
+ "docsSHA256": null,
+ "jsSHA256": "bcd4350373fe0b4364a7bcdc6013feea837720e9a8792e84f905cc86dd346ce0",
+ "moduleName": "narcissus_parser/narcissus_worker",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "js_checker/js_checker": "librejs/js_checker/js_checker",
+ "sdk/self": "sdk/self"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/script_entries/accepted_scripts": {
+ "docsSHA256": null,
+ "jsSHA256": "ee96b355fb087aadca3c51a77cc9f14321aad96c834dda5a0812724fa26a7a7e",
+ "moduleName": "script_entries/accepted_scripts",
+ "packageName": "librejs",
+ "requirements": {
+ "script_entries/all_scripts": "librejs/script_entries/all_scripts"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/script_entries/all_scripts": {
+ "docsSHA256": null,
+ "jsSHA256": "6530feda85a57e12f47b4ab6c07d403e4b0fdb4d7b6e433ad1eeb60af90756aa",
+ "moduleName": "script_entries/all_scripts",
+ "packageName": "librejs",
+ "requirements": {
+ "script_entries/crypto": "librejs/script_entries/crypto"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/script_entries/crypto": {
+ "docsSHA256": null,
+ "jsSHA256": "c77e0067499b2f99fb6a3c0302e156ef89a4d3834f1fdac4f323a9d2ad966679",
+ "moduleName": "script_entries/crypto",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/script_entries/dryrun_scripts": {
+ "docsSHA256": null,
+ "jsSHA256": "808d0fa10cf794277f4bf26edf43b916695b32466edb2a2a5ebdb71a761f0773",
+ "moduleName": "script_entries/dryrun_scripts",
+ "packageName": "librejs",
+ "requirements": {
+ "script_entries/all_scripts": "librejs/script_entries/all_scripts",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/script_entries/free_libraries": {
+ "docsSHA256": null,
+ "jsSHA256": "a716922a4a427d0ae177e92cf7b94710573f162bd17302dc24871bd876f4b60f",
+ "moduleName": "script_entries/free_libraries",
+ "packageName": "librejs",
+ "requirements": {
+ "./scripts_cache": "librejs/script_entries/scripts_cache",
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/relation_checker": "librejs/js_checker/relation_checker",
+ "sdk/self": "sdk/self"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/script_entries/removed_scripts": {
+ "docsSHA256": null,
+ "jsSHA256": "529ad3d10162a836e3d481592e078bf913b762848c0673686ef0317d7a28f212",
+ "moduleName": "script_entries/removed_scripts",
+ "packageName": "librejs",
+ "requirements": {
+ "script_entries/all_scripts": "librejs/script_entries/all_scripts",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/script_entries/scripts_cache": {
+ "docsSHA256": null,
+ "jsSHA256": "2a6c61f5422a4285aeadb2d3108f4b7cc710d20701062e30f42d0dbf5f162cc9",
+ "moduleName": "script_entries/scripts_cache",
+ "packageName": "librejs",
+ "requirements": {
+ "js_checker/constant_types": "librejs/js_checker/constant_types",
+ "js_checker/relation_checker": "librejs/js_checker/relation_checker",
+ "script_entries/crypto": "librejs/script_entries/crypto",
+ "ui/notification": "librejs/ui/notification"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/settings/settings_tab": {
+ "docsSHA256": null,
+ "jsSHA256": "fe6fa07ad3ca1b9e1ce4219af1f046ba7a21e0757e9cffc772b80b094bd56af0",
+ "moduleName": "settings/settings_tab",
+ "packageName": "librejs",
+ "requirements": {
+ "addon-tab": "addon-tab/addon-tab",
+ "script_entries/scripts_cache": "librejs/script_entries/scripts_cache",
+ "sdk/self": "sdk/self",
+ "settings/storage": "librejs/settings/storage"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/settings/storage": {
+ "docsSHA256": null,
+ "jsSHA256": "25e0a3d6f9551f736b60375eeefde289ecd9b216995eb824d99559eef040f244",
+ "moduleName": "settings/storage",
+ "packageName": "librejs",
+ "requirements": {
+ "chrome": "chrome",
+ "js_checker/relation_checker": "librejs/js_checker/relation_checker",
+ "script_entries/free_libraries": "librejs/script_entries/free_libraries",
+ "script_entries/scripts_cache": "librejs/script_entries/scripts_cache"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/ui/notification": {
+ "docsSHA256": null,
+ "jsSHA256": "4cef86f9d21cbda8633ea595968c9a6ba189d30923cf895c1f5453a362ab028b",
+ "moduleName": "ui/notification",
+ "packageName": "librejs",
+ "requirements": {
+ "addon_management/prefchange": "librejs/addon_management/prefchange",
+ "notification-box": "notification-box/notification-box",
+ "sdk/self": "sdk/self",
+ "sdk/timers": "sdk/timers"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/ui/script_panel": {
+ "docsSHA256": null,
+ "jsSHA256": "9bd52a58004737dd85ca814dfbdd23cc87541dcfe661124db4cbdd068c2a84fe",
+ "moduleName": "ui/script_panel.js",
+ "packageName": "librejs",
+ "requirements": {
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/ui/ui_info": {
+ "docsSHA256": null,
+ "jsSHA256": "6ee2f0d991aa0535487c3c431f3bd8990636c6739405f3a89485bbb414fd317f",
+ "moduleName": "ui/ui_info",
+ "packageName": "librejs",
+ "requirements": {
+ "addon_management/prefchange": "librejs/addon_management/prefchange",
+ "sdk/page-mod": "sdk/page-mod",
+ "sdk/page-worker": "sdk/page-worker",
+ "sdk/self": "sdk/self",
+ "sdk/tabs": "sdk/tabs",
+ "url_handler/url_handler": "librejs/url_handler/url_handler"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/url_handler/node_punycode": {
+ "docsSHA256": null,
+ "jsSHA256": "8f604c209e3f9913fbcda68b2cfe203335e0117e145031e4a5c826d6b021c3f2",
+ "moduleName": "url_handler/node_punycode",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/url_handler/node_querystring": {
+ "docsSHA256": null,
+ "jsSHA256": "e25cebb6984e5c84b1b6a4d100e87a66a9763a2573cf093a2923160fa704b083",
+ "moduleName": "url_handler/node_querystring",
+ "packageName": "librejs",
+ "requirements": {},
+ "sectionName": "lib"
+ },
+ "librejs/url_handler/node_url": {
+ "docsSHA256": null,
+ "jsSHA256": "a73dd5be86af3e6a2fff3c250fb9a860d14aa4688babc87efd69eba4d9315a2a",
+ "moduleName": "url_handler/node_url",
+ "packageName": "librejs",
+ "requirements": {
+ "url_handler/node_punycode": "librejs/url_handler/node_punycode",
+ "url_handler/node_querystring": "librejs/url_handler/node_querystring"
+ },
+ "sectionName": "lib"
+ },
+ "librejs/url_handler/url_handler": {
+ "docsSHA256": null,
+ "jsSHA256": "dd5c54c8e8220e7334c50d11f841a988ae0fb29c259cd91cb012f16ca93b76df",
+ "moduleName": "url_handler/url_handler",
+ "packageName": "librejs",
+ "requirements": {
+ "url_handler/node_url": "librejs/url_handler/node_url"
+ },
+ "sectionName": "lib"
+ },
+ "menuitems/menuitems": {
+ "docsSHA256": "58ad1ff182b33d89a46eb8e0b4847ff84f5403840ddbd03b017a4a855d2008fc",
+ "jsSHA256": "30d5fc7421841e6ac4ec3756515ac8f2dc3850bed7334f3ff038528d18262524",
+ "moduleName": "menuitems",
+ "packageName": "menuitems",
+ "requirements": {
+ "sdk/core/heritage": "sdk/core/heritage",
+ "sdk/core/namespace": "sdk/core/namespace",
+ "sdk/deprecated/api-utils": "sdk/deprecated/api-utils",
+ "sdk/deprecated/window-utils": "sdk/deprecated/window-utils",
+ "sdk/event/core": "sdk/event/core",
+ "sdk/event/target": "sdk/event/target",
+ "sdk/window/utils": "sdk/window/utils",
+ "unload+": "vold-utils/unload+"
+ },
+ "sectionName": "lib"
+ },
+ "notification-box/notification-box": {
+ "docsSHA256": null,
+ "jsSHA256": "d7e5a8b906ff408b90622769e175d02e243b1e9b238d7a54ad4be213e03c8454",
+ "moduleName": "notification-box",
+ "packageName": "notification-box",
+ "requirements": {
+ "chrome": "chrome",
+ "sdk/window/utils": "sdk/window/utils"
+ },
+ "sectionName": "lib"
+ },
+ "vold-utils/unload+": {
+ "docsSHA256": "465618992a8bbf3da6425fd79aaec54b92db0353d9670d8dcc1373d14c25b69b",
+ "jsSHA256": "fbbdfe29fd5cd3ed3593d5720278df4091bd208fc14478fcbff6776fad6c4dd1",
+ "moduleName": "unload+",
+ "packageName": "vold-utils",
+ "requirements": {
+ "sdk/core/heritage": "sdk/core/heritage",
+ "sdk/core/namespace": "sdk/core/namespace",
+ "sdk/system/unload": "sdk/system/unload"
+ },
+ "sectionName": "lib"
+ }
+ },
+ "metadata": {
+ "addon-sdk": {
+ "description": "Add-on development made easy.",
+ "keywords": [
+ "javascript",
+ "engine",
+ "addon",
+ "extension",
+ "xulrunner",
+ "firefox",
+ "browser"
+ ],
+ "license": "MPL 2.0",
+ "name": "addon-sdk"
+ },
+ "addon-tab": {
+ "author": "Loic J. Duros",
+ "description": "Opens a tab with a local page, hiding the location/search bars, and allows to set styles directly on the tab element (see example). This is ideal if your addon has a complex UI requiring a complex html page (and using such frameworks as jQuery UI, Bootstrap, etc, ...)",
+ "license": "MPL 2.0",
+ "main": "main",
+ "name": "addon-tab",
+ "version": "0.1"
+ },
+ "librejs": {
+ "author": "Loic J. Duros",
+ "description": "GNU LibreJS is an add-on for Mozilla-based browsers (IceCat, Firefox, Abrowser, Iceweasel)\n that prevents the execution of nonfree nontrivial JavaScript as described in \"The Javascript Trap\": http://www.gnu.org/philosophy/javascript-trap.html",
+ "license": "GPL v3.0 and later",
+ "main": "lib/main",
+ "name": "librejs",
+ "permissions": {
+ "unsafe-content-script": true
+ },
+ "version": "6.0.1"
+ },
+ "menuitems": {
+ "author": "Erik Vold (http://erikvold.com/) <erikvvold@gmail.com>",
+ "description": "Menuitems for Jetpacks",
+ "keywords": [
+ "menu",
+ "menuitems",
+ "button",
+ "ui"
+ ],
+ "license": "MPL 2.0",
+ "name": "menuitems",
+ "version": "1.1.1"
+ },
+ "notification-box": {
+ "description": "a basic add-on",
+ "license": "MPL 2.0",
+ "main": "main",
+ "name": "notification-box",
+ "version": "0.1"
+ },
+ "vold-utils": {
+ "author": "Erik Vold (http://erikvold.com/) <erikvvold@gmail.com>",
+ "description": "Utilitys for Jetpacks",
+ "name": "vold-utils",
+ "version": "1.1"
+ }
+ },
+ "name": "librejs",
+ "parseable": false,
+ "preferences": [
+ {
+ "name": "whitelist",
+ "title": "Whitelist domain, separated by comma, omit protocol, e.g.: gnu.org, wildcard is *",
+ "type": "string",
+ "value": ""
+ },
+ {
+ "name": "complaint_tab",
+ "title": "Display complaint tab on sites where nonfree nontrivial JavaScript is detected",
+ "type": "bool",
+ "value": true
+ },
+ {
+ "name": "display_notifications",
+ "title": "Display notifications of the JavaScript code being analyzed by LibreJS.",
+ "type": "bool",
+ "value": false
+ }
+ ],
+ "preferencesBranch": "jid1-KtlZuoiikVfFew@jetpack",
+ "sdkVersion": "1.17",
+ "staticArgs": {},
+ "verbose": false
+} \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/install.rdf b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/install.rdf
new file mode 100644
index 0000000..dc20696
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/install.rdf
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?><!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --><RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+ <Description about="urn:mozilla:install-manifest">
+ <em:id>jid1-KtlZuoiikVfFew@jetpack</em:id>
+ <em:version>6.0.1</em:version>
+ <em:type>2</em:type>
+ <em:bootstrap>true</em:bootstrap>
+ <em:unpack>false</em:unpack>
+
+ <!-- Firefox -->
+ <em:targetApplication>
+ <Description>
+ <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
+ <em:minVersion>26.0</em:minVersion>
+ <em:maxVersion>30.0</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+
+ <!-- Front End MetaData -->
+ <em:name>GNU LibreJS</em:name>
+ <em:description>GNU LibreJS is an add-on for Mozilla-based browsers (IceCat, Firefox, Abrowser, Iceweasel)
+ that prevents the execution of nonfree nontrivial JavaScript as described in &quot;The Javascript Trap&quot;: http://www.gnu.org/philosophy/javascript-trap.html</em:description>
+ <em:creator>Loic J. Duros</em:creator>
+
+ <em:optionsType>2</em:optionsType>
+
+ </Description>
+</RDF> \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/locales.json b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/locales.json
new file mode 100644
index 0000000..303e186
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/locales.json
@@ -0,0 +1 @@
+{"locales": []}
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/options.xul b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/options.xul
new file mode 100644
index 0000000..70c2c77
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/options.xul
@@ -0,0 +1,6 @@
+<?xml version="1.0" ?>
+<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+ <setting data-jetpack-id="jid1-KtlZuoiikVfFew@jetpack" pref="extensions.jid1-KtlZuoiikVfFew@jetpack.whitelist" pref-name="whitelist" title="Whitelist domain, separated by comma, omit protocol, e.g.: gnu.org, wildcard is *" type="string"/>
+ <setting data-jetpack-id="jid1-KtlZuoiikVfFew@jetpack" pref="extensions.jid1-KtlZuoiikVfFew@jetpack.complaint_tab" pref-name="complaint_tab" title="Display complaint tab on sites where nonfree nontrivial JavaScript is detected" type="bool"/>
+ <setting data-jetpack-id="jid1-KtlZuoiikVfFew@jetpack" pref="extensions.jid1-KtlZuoiikVfFew@jetpack.display_notifications" pref-name="display_notifications" title="Display notifications of the JavaScript code being analyzed by LibreJS." type="bool"/>
+</vbox>
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/addon-tab/lib/addon-tab.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/addon-tab/lib/addon-tab.js
new file mode 100644
index 0000000..0236161
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/addon-tab/lib/addon-tab.js
@@ -0,0 +1,153 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+'use strict';
+
+module.metadata = {
+ 'stability': 'experimental'
+};
+
+const { WindowTracker } = require('sdk/deprecated/window-utils');
+const { isXULBrowser } = require('sdk/window/utils');
+const { add, remove } = require('sdk/util/array');
+const { getTabs, closeTab, getURI, getTabURL, getBrowserForTab } = require('sdk/tabs/utils');
+const { data } = require('sdk/self');
+const { ns } = require("sdk/core/namespace");
+
+const tabs = require("sdk/tabs");
+
+const { defer } = require("sdk/lang/functional");
+
+// store list of addon URLs to hide the navigation bar from
+// and to add proper style.
+// the url is used as the key for lookup efficiency.
+// Objects contained are: {[url]: { [styles] }}
+let addonTabs = {};
+
+const windows = ns();
+
+/* Add tab to a list of URL/styles. Can be called
+ * from other scripts */
+let addTabToList = function (options) {
+
+ options = options || {};
+ let url;
+
+ if (options.url) {
+ addonTabs[options.url] = {};
+ }
+ else {
+ throw new Error("No url provided for the AddonTab page");
+ }
+
+ if (options.tabStyle)
+ addonTabs[options.url] = options.tabStyle;
+ else
+ addonTabs[options.tabStyle] = null;
+
+};
+
+exports.removeAddonTab = function (url) {
+ if (url && url in addonTabs)
+ delete addonTabs[url];
+};
+
+let applyStyle = function (tab, property, value) {
+ tab.style.setProperty(property,
+ value,
+ 'important');
+};
+
+let applyStyles = function (tab, url) {
+ if (!url) {
+ url = getURI(tab);
+ }
+
+ if (url in addonTabs && addonTabs[url] != null) {
+ for (let item in addonTabs[url]) {
+ applyStyle(tab, item, addonTabs[url][item]);
+ }
+ }
+};
+
+/* Simply adds the URL/style to the list,
+ * and then just open a tab using the high-level
+ * tab module.
+ */
+exports.open = function (options) {
+ addTabToList(options);
+ let tab = tabs.open(options);
+ return tab;
+};
+
+/*
+ * Track tabs opened and closed.
+ * Once you have a tab open, get the browser for it
+ * and figure out the location (which turns out to be the right one, not about:blank)
+ */
+tabs.on('open', function onOpen(tab) {
+ let browser = getBrowserForTab(tab);
+
+ tab.on('load', function onTabLoad(e) {
+ if (typeof browser == 'undefined') {
+ return;
+ }
+ // let's get the location of the document.
+ applyStyles(tab, browser.contentDocument.location);
+ }, true);
+});
+
+
+WindowTracker({
+ onTrack: function onTrack(window) {
+ if (!isXULBrowser(window) || windows(window).hideChromeForLocation)
+ return;
+
+ let { XULBrowserWindow } = window;
+ let { hideChromeForLocation } = XULBrowserWindow;
+
+ windows(window).hideChromeForLocation = hideChromeForLocation;
+
+ // Augmenting the behavior of `hideChromeForLocation` method, as
+ // suggested by https://developer.mozilla.org/en-US/docs/Hiding_browser_chrome
+ XULBrowserWindow.hideChromeForLocation = function(url) {
+
+ if (url in addonTabs)
+ return true;
+
+ return hideChromeForLocation.call(this, url);
+ };
+ },
+
+ onUntrack: function onUntrack(window) {
+ if (isXULBrowser(window))
+ getTabs(window).filter(tabFilter).forEach(untrackTab.bind(null, window));
+
+ }
+});
+
+
+function tabFilter(tab) {
+ if (getURI(tab) in addonTabs) {
+ return true;
+ }
+
+ return false;
+}
+
+function untrackTab(window, tab) {
+ // Note: `onUntrack` will be called for all windows on add-on unloads,
+ // so we want to clean them up from these URLs.
+ let { hideChromeForLocation } = windows(window);
+
+ if (hideChromeForLocation) {
+ window.XULBrowserWindow.hideChromeForLocation = hideChromeForLocation;
+ windows(window).hideChromeForLocation = null;
+ }
+ // had to remove closeTab call to prevent a TypeError: element is
+ // undefined.
+ //closeTab(tab);
+}
+
+
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/README b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/README
new file mode 100644
index 0000000..6633b5e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/README
@@ -0,0 +1,2 @@
+The stylesheets, HTML files, and images provided in this folder and
+its subfolders are released under the GPL version 3 or later. \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/css/style.css b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/css/style.css
new file mode 100644
index 0000000..84b9ab3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/css/style.css
@@ -0,0 +1,150 @@
+/*
+
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+
+
+
+*/
+/* quick reset for box and children */
+#librejs-complaint-box, #librejs-complaint-box *, #librejs-complaint-box a:hover, #librejs-complaint-box a:active, #librejs-complaint-box a:visited, #librejs-time-mention, #librejs-time-mention:hover {
+ margin:0;
+ padding:0;
+ line-height:1;
+ list-style:square;
+ color:#000;
+ text-align:left;
+ border:0;
+ content: '';
+ font-style:normal;
+ font-weight:normal;
+ font-size:12px;
+ text-decoration:none;
+ font-variant:normal;
+ font-family:sans-serif !important;
+ text-shadow:none !important;
+ text-transform:none !important;
+ background-image:none;
+ background-color:transparent;
+}
+
+#librejs-time-mention, #librejs-time-mention:hover {
+ font-size:14px;
+ font-weight:bold;
+ text-align:center;
+}
+
+#librejs-complaint-box, #librejs-complaint-box * {
+ width:auto;
+}
+
+div {
+ width:auto;
+}
+
+#librejs-tab-button, #librejs-tab-button:hover, #librejs-tab-button:visited, #librejs-tab-button:active {
+ display: block;
+ width: 18px;
+ height: 70px;
+ color: rgb(255, 255, 255);
+ padding: 30px !important;
+ background-color:#e3dedb !important;
+ background-image:url("../images/torchy.png"), url("../images/separator.png") !important;
+ background-position: 19px 23px, 55px 16px !important;
+ background-repeat: no-repeat !important;
+ border:solid #454545 3px !important;
+ border-right:none !important;
+ overflow: hidden;
+ text-indent: -1000em;
+ border-top-left-radius:20px !important;
+ border-bottom-left-radius:20px !important;
+ float:left;
+ z-index:50;
+ position:relative;
+}
+
+#librejs-complaint-box {
+ position: fixed;
+ top: 15%;
+ z-index: 2147483647 !important; /* fix for tech crunch big number */
+ right:-530px;
+ display:none;
+}
+
+#librejs-complaint-info {
+ border:solid #454545 3px;
+ background-color:#e3dedb !important;
+ width:460px !important;
+ margin-left:78px !important;
+ border-bottom-left-radius:30px;
+ z-index:0;
+ padding:0 20px 50px;
+ text-align:center;
+ position:relative;
+}
+
+#librejs-complaint-info:hover {
+ background-color:#e3dedb !important;
+}
+
+#librejs-complaint-info-text {
+ overflow:auto !important;
+ height:auto;
+ padding:0 30px;
+}
+
+#librejs-complaint-info h1 {
+ z-index:1;
+ font:"Century Schoolbook";
+ font-size:25px;
+ text-align:center;
+ background:url('../images/info-title.png') no-repeat 50% 30px !important;
+ overflow:hidden;
+ text-indent:-3000em;
+ height:100px;
+ padding:30px;
+ margin:0 !important;
+ line-height:0 !important;
+ display:block !important;
+ clear:none !important;
+ width:auto !important;
+}
+
+#librejs-complaint-info h1 span.huge {
+ display:block;
+ font-size:35px;
+ font-weight:bold;
+}
+
+#librejs-complaint-info h2 {
+ font-weight:bold !important;
+ font-size:14px !important;
+ margin:20px 0 10px !important;
+ display:none;
+ border-top:1px solid #CCC;
+ padding:10px 0 10px;
+ text-shadow: 0 1px 0 #FFF !important;
+}
+
+#librejs-complaint-info ul {
+ margin-left:15px;
+}
+
+#librejs-complaint-info ul li a {
+ font-size:14px !important;
+} \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/README b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/README
new file mode 100644
index 0000000..e442861
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/README
@@ -0,0 +1,21 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+All images in this directory are free, released under the GPLv3 or later. \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/complain-button3.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/complain-button3.png
new file mode 100644
index 0000000..5e3b4e3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/complain-button3.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/info-title.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/info-title.png
new file mode 100644
index 0000000..02ebbfa
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/info-title.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/separator.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/separator.png
new file mode 100644
index 0000000..7eedd12
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/separator.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/torchy.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/torchy.png
new file mode 100644
index 0000000..363e0a3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/torchy.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/torchy2.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/torchy2.png
new file mode 100644
index 0000000..60da8fc
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/assets/images/torchy2.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jsdefs.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jsdefs.js
new file mode 100644
index 0000000..aff5c08
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jsdefs.js
@@ -0,0 +1,751 @@
+/* vim: set sw=4 ts=4 et tw=78: */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Narcissus JavaScript engine.
+ *
+ * The Initial Developer of the Original Code is
+ * Brendan Eich <brendan@mozilla.org>.
+ * Portions created by the Initial Developer are Copyright (C) 2004
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Tom Austin <taustin@ucsc.edu>
+ * Brendan Eich <brendan@mozilla.org>
+ * Shu-Yu Guo <shu@rfrn.org>
+ * Dave Herman <dherman@mozilla.com>
+ * Dimitris Vardoulakis <dimvar@ccs.neu.edu>
+ * Patrick Walton <pcwalton@mozilla.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/*
+ * Narcissus - JS implemented in JS.
+ *
+ * Well-known constants and lookup tables. Many consts are generated from the
+ * tokens table via eval to minimize redundancy, so consumers must be compiled
+ * separately to take advantage of the simple switch-case constant propagation
+ * done by SpiderMonkey.
+ */
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+//"use scrict";
+
+var Narcissus = {};
+(function() {
+
+ var narcissus = {
+ options: {
+ version: 185,
+ // Global variables to hide from the interpreter
+ hiddenHostGlobals: { Narcissus: true },
+ // Desugar SpiderMonkey language extensions?
+ desugarExtensions: false
+ },
+ hostSupportsEvalConst: (function() {
+ try {
+ return eval("(function(s) { eval(s); return x })('const x = true;')");
+ } catch (e) {
+ return false;
+ }
+ })(),
+ hostGlobal: this
+ };
+ Narcissus = narcissus;
+})();
+
+Narcissus.definitions = (function() {
+
+ var tokens = [
+ // End of source.
+ "END",
+
+ // Operators and punctuators. Some pair-wise order matters, e.g. (+, -)
+ // and (UNARY_PLUS, UNARY_MINUS).
+ "\n", ";",
+ ",",
+ "=",
+ "?", ":", "CONDITIONAL",
+ "||",
+ "&&",
+ "|",
+ "^",
+ "&",
+ "==", "!=", "===", "!==",
+ "<", "<=", ">=", ">",
+ "<<", ">>", ">>>",
+ "+", "-",
+ "*", "/", "%",
+ "!", "~", "UNARY_PLUS", "UNARY_MINUS",
+ "++", "--",
+ ".",
+ "[", "]",
+ "{", "}",
+ "(", ")",
+
+ // Nonterminal tree node type codes.
+ "SCRIPT", "BLOCK", "LABEL", "FOR_IN", "CALL", "NEW_WITH_ARGS", "INDEX",
+ "ARRAY_INIT", "OBJECT_INIT", "PROPERTY_INIT", "GETTER", "SETTER",
+ "GROUP", "LIST", "LET_BLOCK", "ARRAY_COMP", "GENERATOR", "COMP_TAIL",
+
+ // Terminals.
+ "IDENTIFIER", "NUMBER", "STRING", "REGEXP",
+
+ // Keywords.
+ "break",
+ "case", "catch", "const", "continue",
+ "debugger", "default", "delete", "do",
+ "else", "export",
+ "false", "finally", "for", "function",
+ "if", "import", "in", "instanceof",
+ "let", "module",
+ "new", "null",
+ "return",
+ "switch",
+ "this", "throw", "true", "try", "typeof",
+ "var", "void",
+ "yield",
+ "while", "with",
+ ];
+
+ var statementStartTokens = [
+ "break",
+ "const", "continue",
+ "debugger", "do",
+ "for",
+ "if",
+ "return",
+ "switch",
+ "throw", "try",
+ "var",
+ "yield",
+ "while", "with",
+ ];
+
+ // Whitespace characters (see ECMA-262 7.2)
+ var whitespaceChars = [
+ // normal whitespace:
+ "\u0009", "\u000B", "\u000C", "\u0020", "\u00A0", "\uFEFF",
+
+ // high-Unicode whitespace:
+ "\u1680", "\u180E",
+ "\u2000", "\u2001", "\u2002", "\u2003", "\u2004", "\u2005", "\u2006",
+ "\u2007", "\u2008", "\u2009", "\u200A",
+ "\u202F", "\u205F", "\u3000"
+ ];
+
+ var whitespace = {};
+ for (var i = 0; i < whitespaceChars.length; i++) {
+ whitespace[whitespaceChars[i]] = true;
+ }
+
+ // Operator and punctuator mapping from token to tree node type name.
+ // NB: because the lexer doesn't backtrack, all token prefixes must themselves
+ // be valid tokens (e.g. !== is acceptable because its prefixes are the valid
+ // tokens != and !).
+ var opTypeNames = {
+ '\n': "NEWLINE",
+ ';': "SEMICOLON",
+ ',': "COMMA",
+ '?': "HOOK",
+ ':': "COLON",
+ '||': "OR",
+ '&&': "AND",
+ '|': "BITWISE_OR",
+ '^': "BITWISE_XOR",
+ '&': "BITWISE_AND",
+ '===': "STRICT_EQ",
+ '==': "EQ",
+ '=': "ASSIGN",
+ '!==': "STRICT_NE",
+ '!=': "NE",
+ '<<': "LSH",
+ '<=': "LE",
+ '<': "LT",
+ '>>>': "URSH",
+ '>>': "RSH",
+ '>=': "GE",
+ '>': "GT",
+ '++': "INCREMENT",
+ '--': "DECREMENT",
+ '+': "PLUS",
+ '-': "MINUS",
+ '*': "MUL",
+ '/': "DIV",
+ '%': "MOD",
+ '!': "NOT",
+ '~': "BITWISE_NOT",
+ '.': "DOT",
+ '[': "LEFT_BRACKET",
+ ']': "RIGHT_BRACKET",
+ '{': "LEFT_CURLY",
+ '}': "RIGHT_CURLY",
+ '(': "LEFT_PAREN",
+ ')': "RIGHT_PAREN"
+ };
+
+ // Hash of keyword identifier to tokens index. NB: we must null __proto__ to
+ // avoid toString, etc. namespace pollution.
+ var keywords = {__proto__: null};
+
+ // Define const END, etc., based on the token names. Also map name to index.
+ var tokenIds = {};
+
+ // Building up a string to be eval'd in different contexts.
+ var consts = Narcissus.hostSupportsEvalConst ? "const " : "var ";
+ for (var i = 0, j = tokens.length; i < j; i++) {
+ if (i > 0)
+ consts += ", ";
+ var t = tokens[i];
+ var name;
+ if (/^[a-z]/.test(t)) {
+ name = t.toUpperCase();
+ keywords[t] = i;
+ } else {
+ name = (/^\W/.test(t) ? opTypeNames[t] : t);
+ }
+ consts += name + " = " + i;
+ tokenIds[name] = i;
+ tokens[t] = i;
+ }
+ consts += ";";
+
+ var isStatementStartCode = {__proto__: null};
+ for (i = 0, j = statementStartTokens.length; i < j; i++)
+ isStatementStartCode[keywords[statementStartTokens[i]]] = true;
+
+ // Map assignment operators to their indexes in the tokens array.
+ var assignOps = ['|', '^', '&', '<<', '>>', '>>>', '+', '-', '*', '/', '%'];
+
+ for (i = 0, j = assignOps.length; i < j; i++) {
+ t = assignOps[i];
+ assignOps[t] = tokens[t];
+ }
+
+ function defineGetter(obj, prop, fn, dontDelete, dontEnum) {
+ Object.defineProperty(obj, prop,
+ { get: fn, configurable: !dontDelete, enumerable: !dontEnum });
+ }
+
+ function defineGetterSetter(obj, prop, getter, setter, dontDelete, dontEnum) {
+ Object.defineProperty(obj, prop, {
+ get: getter,
+ set: setter,
+ configurable: !dontDelete,
+ enumerable: !dontEnum
+ });
+ }
+
+ function defineMemoGetter(obj, prop, fn, dontDelete, dontEnum) {
+ Object.defineProperty(obj, prop, {
+ get: function() {
+ var val = fn();
+ defineProperty(obj, prop, val, dontDelete, true, dontEnum);
+ return val;
+ },
+ configurable: true,
+ enumerable: !dontEnum
+ });
+ }
+
+ function defineProperty(obj, prop, val, dontDelete, readOnly, dontEnum) {
+ Object.defineProperty(obj, prop,
+ { value: val, writable: !readOnly, configurable: !dontDelete,
+ enumerable: !dontEnum });
+ }
+
+ // Returns true if fn is a native function. (Note: SpiderMonkey specific.)
+ function isNativeCode(fn) {
+ // Relies on the toString method to identify native code.
+ return ((typeof fn) === "function") && fn.toString().match(/\[native code\]/);
+ }
+
+ var Fpapply = Function.prototype.apply;
+
+ function apply(f, o, a) {
+ return Fpapply.call(f, [o].concat(a));
+ }
+
+ var applyNew;
+
+ // ES5's bind is a simpler way to implement applyNew
+ if (Function.prototype.bind) {
+ applyNew = function applyNew(f, a) {
+ return new (f.bind.apply(f, [,].concat(a)))();
+ };
+ } else {
+ applyNew = function applyNew(f, a) {
+ switch (a.length) {
+ case 0:
+ return new f();
+ case 1:
+ return new f(a[0]);
+ case 2:
+ return new f(a[0], a[1]);
+ case 3:
+ return new f(a[0], a[1], a[2]);
+ default:
+ var argStr = "a[0]";
+ for (var i = 1, n = a.length; i < n; i++)
+ argStr += ",a[" + i + "]";
+ return eval("new f(" + argStr + ")");
+ }
+ };
+ }
+
+ function getPropertyDescriptor(obj, name) {
+ while (obj) {
+ if (({}).hasOwnProperty.call(obj, name))
+ return Object.getOwnPropertyDescriptor(obj, name);
+ obj = Object.getPrototypeOf(obj);
+ }
+ return undefined;
+ }
+
+ function getPropertyNames(obj) {
+ var table = Object.create(null, {});
+ while (obj) {
+ var names = Object.getOwnPropertyNames(obj);
+ for (var i = 0, n = names.length; i < n; i++)
+ table[names[i]] = true;
+ obj = Object.getPrototypeOf(obj);
+ }
+ return Object.keys(table);
+ }
+
+ function getOwnProperties(obj) {
+ var map = {};
+ for (var name in Object.getOwnPropertyNames(obj))
+ map[name] = Object.getOwnPropertyDescriptor(obj, name);
+ return map;
+ }
+
+ function blacklistHandler(target, blacklist) {
+ var mask = Object.create(null, {});
+ var redirect = StringMap.create(blacklist).mapObject(function(name) { return mask; });
+ return mixinHandler(redirect, target);
+ }
+
+ function whitelistHandler(target, whitelist) {
+ var catchall = Object.create(null, {});
+ var redirect = StringMap.create(whitelist).mapObject(function(name) { return target; });
+ return mixinHandler(redirect, catchall);
+ }
+
+ function mirrorHandler(target, writable) {
+ var handler = makePassthruHandler(target);
+
+ var defineProperty = handler.defineProperty;
+ handler.defineProperty = function(name, desc) {
+ if (!desc.enumerable)
+ throw new Error("mirror property must be enumerable");
+ if (!desc.configurable)
+ throw new Error("mirror property must be configurable");
+ if (desc.writable !== writable)
+ throw new Error("mirror property must " + (writable ? "" : "not ") + "be writable");
+ defineProperty(name, desc);
+ };
+
+ handler.fix = function() { };
+ handler.getOwnPropertyDescriptor = handler.getPropertyDescriptor;
+ handler.getOwnPropertyNames = getPropertyNames.bind(handler, target);
+ handler.keys = handler.enumerate;
+ handler["delete"] = function() { return false; };
+ handler.hasOwn = handler.has;
+ return handler;
+ }
+
+ /*
+ * Mixin proxies break the single-inheritance model of prototypes, so
+ * the handler treats all properties as own-properties:
+ *
+ * X
+ * |
+ * +------------+------------+
+ * | O |
+ * | | |
+ * | O O O |
+ * | | | | |
+ * | O O O O |
+ * | | | | | |
+ * | O O O O O |
+ * | | | | | | |
+ * +-(*)--(w)--(x)--(y)--(z)-+
+ */
+
+ function mixinHandler(redirect, catchall) {
+ function targetFor(name) {
+ return hasOwn(redirect, name) ? redirect[name] : catchall;
+ }
+
+ function getMuxPropertyDescriptor(name) {
+ var desc = getPropertyDescriptor(targetFor(name), name);
+ if (desc)
+ desc.configurable = true;
+ return desc;
+ }
+
+ function getMuxPropertyNames() {
+ var names1 = Object.getOwnPropertyNames(redirect).filter(function(name) {
+ return name in redirect[name];
+ });
+ var names2 = getPropertyNames(catchall).filter(function(name) {
+ return !hasOwn(redirect, name);
+ });
+ return names1.concat(names2);
+ }
+
+ function enumerateMux() {
+ var result = Object.getOwnPropertyNames(redirect).filter(function(name) {
+ return name in redirect[name];
+ });
+ for (name in catchall) {
+ if (!hasOwn(redirect, name))
+ result.push(name);
+ };
+ return result;
+ }
+
+ function hasMux(name) {
+ return name in targetFor(name);
+ }
+
+ return {
+ getOwnPropertyDescriptor: getMuxPropertyDescriptor,
+ getPropertyDescriptor: getMuxPropertyDescriptor,
+ getOwnPropertyNames: getMuxPropertyNames,
+ defineProperty: function(name, desc) {
+ Object.defineProperty(targetFor(name), name, desc);
+ },
+ "delete": function(name) {
+ var target = targetFor(name);
+ return delete target[name];
+ },
+ // FIXME: ha ha ha
+ fix: function() { },
+ has: hasMux,
+ hasOwn: hasMux,
+ get: function(receiver, name) {
+ var target = targetFor(name);
+ return target[name];
+ },
+ set: function(receiver, name, val) {
+ var target = targetFor(name);
+ target[name] = val;
+ return true;
+ },
+ enumerate: enumerateMux,
+ keys: enumerateMux
+ };
+ }
+
+ function makePassthruHandler(obj) {
+ // Handler copied from
+ // http://wiki.ecmascript.org/doku.php?id=harmony:proxies&s=proxy%20object#examplea_no-op_forwarding_proxy
+ return {
+ getOwnPropertyDescriptor: function(name) {
+ var desc = Object.getOwnPropertyDescriptor(obj, name);
+
+ // a trapping proxy's properties must always be configurable
+ desc.configurable = true;
+ return desc;
+ },
+ getPropertyDescriptor: function(name) {
+ var desc = getPropertyDescriptor(obj, name);
+
+ // a trapping proxy's properties must always be configurable
+ desc.configurable = true;
+ return desc;
+ },
+ getOwnPropertyNames: function() {
+ return Object.getOwnPropertyNames(obj);
+ },
+ defineProperty: function(name, desc) {
+ Object.defineProperty(obj, name, desc);
+ },
+ "delete": function(name) { return delete obj[name]; },
+ fix: function() {
+ if (Object.isFrozen(obj)) {
+ return getOwnProperties(obj);
+ }
+
+ // As long as obj is not frozen, the proxy won't allow itself to be fixed.
+ return undefined; // will cause a TypeError to be thrown
+ },
+
+ has: function(name) { return name in obj; },
+ hasOwn: function(name) { return ({}).hasOwnProperty.call(obj, name); },
+ get: function(receiver, name) { return obj[name]; },
+
+ // bad behavior when set fails in non-strict mode
+ set: function(receiver, name, val) { obj[name] = val; return true; },
+ enumerate: function() {
+ var result = [];
+ for (name in obj) { result.push(name); };
+ return result;
+ },
+ keys: function() { return Object.keys(obj); }
+ };
+ }
+
+ var hasOwnProperty = ({}).hasOwnProperty;
+
+ function hasOwn(obj, name) {
+ return hasOwnProperty.call(obj, name);
+ }
+
+ function StringMap(table, size) {
+ this.table = table || Object.create(null, {});
+ this.size = size || 0;
+ }
+
+ StringMap.create = function(table) {
+ var init = Object.create(null, {});
+ var size = 0;
+ var names = Object.getOwnPropertyNames(table);
+ for (var i = 0, n = names.length; i < n; i++) {
+ var name = names[i];
+ init[name] = table[name];
+ size++;
+ }
+ return new StringMap(init, size);
+ };
+
+ StringMap.prototype = {
+ has: function(x) { return hasOwnProperty.call(this.table, x); },
+ set: function(x, v) {
+ if (!hasOwnProperty.call(this.table, x))
+ this.size++;
+ this.table[x] = v;
+ },
+ get: function(x) { return this.table[x]; },
+ getDef: function(x, thunk) {
+ if (!hasOwnProperty.call(this.table, x)) {
+ this.size++;
+ this.table[x] = thunk();
+ }
+ return this.table[x];
+ },
+ forEach: function(f) {
+ var table = this.table;
+ for (var key in table)
+ f.call(this, key, table[key]);
+ },
+ map: function(f) {
+ var table1 = this.table;
+ var table2 = Object.create(null, {});
+ this.forEach(function(key, val) {
+ table2[key] = f.call(this, val, key);
+ });
+ return new StringMap(table2, this.size);
+ },
+ mapObject: function(f) {
+ var table1 = this.table;
+ var table2 = Object.create(null, {});
+ this.forEach(function(key, val) {
+ table2[key] = f.call(this, val, key);
+ });
+ return table2;
+ },
+ toObject: function() {
+ return this.mapObject(function(val) { return val; });
+ },
+ choose: function() {
+ return Object.getOwnPropertyNames(this.table)[0];
+ },
+ remove: function(x) {
+ if (hasOwnProperty.call(this.table, x)) {
+ this.size--;
+ delete this.table[x];
+ }
+ },
+ copy: function() {
+ var table = Object.create(null, {});
+ for (var key in this.table)
+ table[key] = this.table[key];
+ return new StringMap(table, this.size);
+ },
+ keys: function() {
+ return Object.keys(this.table);
+ },
+ toString: function() { return "[object StringMap]" }
+ };
+
+ // an object-key table with poor asymptotics (replace with WeakMap when possible)
+ function ObjectMap(array) {
+ this.array = array || [];
+ }
+
+ function searchMap(map, key, found, notFound) {
+ var a = map.array;
+ for (var i = 0, n = a.length; i < n; i++) {
+ var pair = a[i];
+ if (pair.key === key)
+ return found(pair, i);
+ }
+ return notFound();
+ }
+
+ ObjectMap.prototype = {
+ has: function(x) {
+ return searchMap(this, x, function() { return true }, function() { return false });
+ },
+ set: function(x, v) {
+ var a = this.array;
+ searchMap(this, x,
+ function(pair) { pair.value = v },
+ function() { a.push({ key: x, value: v }) });
+ },
+ get: function(x) {
+ return searchMap(this, x,
+ function(pair) { return pair.value },
+ function() { return null });
+ },
+ getDef: function(x, thunk) {
+ var a = this.array;
+ return searchMap(this, x,
+ function(pair) { return pair.value },
+ function() {
+ var v = thunk();
+ a.push({ key: x, value: v });
+ return v;
+ });
+ },
+ forEach: function(f) {
+ var a = this.array;
+ for (var i = 0, n = a.length; i < n; i++) {
+ var pair = a[i];
+ f.call(this, pair.key, pair.value);
+ }
+ },
+ choose: function() {
+ return this.array[0].key;
+ },
+ get size() {
+ return this.array.length;
+ },
+ remove: function(x) {
+ var a = this.array;
+ searchMap(this, x,
+ function(pair, i) { a.splice(i, 1) },
+ function() { });
+ },
+ copy: function() {
+ return new ObjectMap(this.array.map(function(pair) {
+ return { key: pair.key, value: pair.value }
+ }));
+ },
+ clear: function() {
+ this.array = [];
+ },
+ toString: function() { return "[object ObjectMap]" }
+ };
+
+ // non-destructive stack
+ function Stack(elts) {
+ this.elts = elts || null;
+ }
+
+ Stack.prototype = {
+ push: function(x) {
+ return new Stack({ top: x, rest: this.elts });
+ },
+ top: function() {
+ if (!this.elts)
+ throw new Error("empty stack");
+ return this.elts.top;
+ },
+ isEmpty: function() {
+ return this.top === null;
+ },
+ find: function(test) {
+ for (var elts = this.elts; elts; elts = elts.rest) {
+ if (test(elts.top))
+ return elts.top;
+ }
+ return null;
+ },
+ has: function(x) {
+ return Boolean(this.find(function(elt) { return elt === x }));
+ },
+ forEach: function(f) {
+ for (var elts = this.elts; elts; elts = elts.rest) {
+ f(elts.top);
+ }
+ }
+ };
+
+ if (!Array.prototype.copy) {
+ Array.prototype.copy = function() {
+ var result = [];
+ for (var i = 0, n = this.length; i < n; i++)
+ result[i] = this[i];
+ return result;
+ };
+ }
+
+ return {
+ tokens: tokens,
+ whitespace: whitespace,
+ opTypeNames: opTypeNames,
+ keywords: keywords,
+ isStatementStartCode: isStatementStartCode,
+ tokenIds: tokenIds,
+ consts: consts,
+ assignOps: assignOps,
+ defineGetter: defineGetter,
+ defineGetterSetter: defineGetterSetter,
+ defineMemoGetter: defineMemoGetter,
+ defineProperty: defineProperty,
+ isNativeCode: isNativeCode,
+ apply: apply,
+ applyNew: applyNew,
+ mirrorHandler: mirrorHandler,
+ mixinHandler: mixinHandler,
+ whitelistHandler: whitelistHandler,
+ blacklistHandler: blacklistHandler,
+ makePassthruHandler: makePassthruHandler,
+ StringMap: StringMap,
+ ObjectMap: ObjectMap,
+ Stack: Stack
+ };
+}());
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jslex.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jslex.js
new file mode 100644
index 0000000..c5c2673
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jslex.js
@@ -0,0 +1,719 @@
+/* vim: set sw=4 ts=4 et tw=78: */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Narcissus JavaScript engine.
+ *
+ * The Initial Developer of the Original Code is
+ * Brendan Eich <brendan@mozilla.org>.
+ * Portions created by the Initial Developer are Copyright (C) 2004
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Tom Austin <taustin@ucsc.edu>
+ * Brendan Eich <brendan@mozilla.org>
+ * Shu-Yu Guo <shu@rfrn.org>
+ * Stephan Herhut <stephan.a.herhut@intel.com>
+ * Dave Herman <dherman@mozilla.com>
+ * Dimitris Vardoulakis <dimvar@ccs.neu.edu>
+ * Patrick Walton <pcwalton@mozilla.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+/*
+ * Narcissus - JS implemented in JS.
+ *
+ * Lexical scanner.
+ */
+
+"use strict";
+
+Narcissus.lexer = (function() {
+
+ var definitions = Narcissus.definitions;
+
+ //throw Error (definitions.consts);
+
+ // Set constants in the local scope.
+ //eval(definitions.consts);
+ const END = 0,
+ NEWLINE = 1,
+ SEMICOLON = 2,
+ COMMA = 3,
+ ASSIGN = 4,
+ HOOK = 5,
+ COLON = 6,
+ CONDITIONAL = 7,
+ OR = 8,
+ AND = 9,
+ BITWISE_OR = 10,
+ BITWISE_XOR = 11,
+ BITWISE_AND = 12,
+ EQ = 13,
+ NE = 14,
+ STRICT_EQ = 15,
+ STRICT_NE = 16,
+ LT = 17,
+ LE = 18,
+ GE = 19,
+ GT = 20,
+ LSH = 21,
+ RSH = 22,
+ URSH = 23,
+ PLUS = 24,
+ MINUS = 25,
+ MUL = 26,
+ DIV = 27,
+ MOD = 28,
+ NOT = 29,
+ BITWISE_NOT = 30,
+ UNARY_PLUS = 31,
+ UNARY_MINUS = 32,
+ INCREMENT = 33,
+ DECREMENT = 34,
+ DOT = 35,
+ LEFT_BRACKET = 36,
+ RIGHT_BRACKET = 37,
+ LEFT_CURLY = 38,
+ RIGHT_CURLY = 39,
+ LEFT_PAREN = 40,
+ RIGHT_PAREN = 41,
+ SCRIPT = 42,
+ BLOCK = 43,
+ LABEL = 44,
+ FOR_IN = 45,
+ CALL = 46,
+ NEW_WITH_ARGS = 47,
+ INDEX = 48,
+ ARRAY_INIT = 49,
+ OBJECT_INIT = 50,
+ PROPERTY_INIT = 51,
+ GETTER = 52,
+ SETTER = 53,
+ GROUP = 54,
+ LIST = 55,
+ LET_BLOCK = 56,
+ ARRAY_COMP = 57,
+ GENERATOR = 58,
+ COMP_TAIL = 59,
+ IDENTIFIER = 60,
+ NUMBER = 61,
+ STRING = 62,
+ REGEXP = 63,
+ BREAK = 64,
+ CASE = 65,
+ CATCH = 66,
+ CONST = 67,
+ CONTINUE = 68,
+ DEBUGGER = 69,
+ DEFAULT = 70,
+ DELETE = 71,
+ DO = 72,
+ ELSE = 73,
+ EXPORT = 74,
+ FALSE = 75,
+ FINALLY = 76,
+ FOR = 77,
+ FUNCTION = 78,
+ IF = 79,
+ IMPORT = 80,
+ IN = 81,
+ INSTANCEOF = 82,
+ LET = 83,
+ MODULE = 84,
+ NEW = 85,
+ NULL = 86,
+ RETURN = 87,
+ SWITCH = 88,
+ THIS = 89,
+ THROW = 90,
+ TRUE = 91,
+ TRY = 92,
+ TYPEOF = 93,
+ VAR = 94,
+ VOID = 95,
+ YIELD = 96,
+ WHILE = 97,
+ WITH = 98;
+
+ // Banned keywords by language version
+ const blackLists = { 160: {}, 185: {}, harmony: {} };
+/* blackLists[160][LET] = true;
+ blackLists[160][MODULE] = true;
+ blackLists[160][YIELD] = true;
+ blackLists[185][MODULE] = true;
+*/
+ // Build up a trie of operator tokens.
+ var opTokens = {};
+ for (var op in definitions.opTypeNames) {
+ if (op === '\n' || op === '.')
+ continue;
+
+ var node = opTokens;
+ for (var i = 0; i < op.length; i++) {
+ var ch = op[i];
+ if (!(ch in node))
+ node[ch] = {};
+ node = node[ch];
+ node.op = op;
+ }
+ }
+
+ /*
+ * Since JavaScript provides no convenient way to determine if a
+ * character is in a particular Unicode category, we use
+ * metacircularity to accomplish this (oh yeaaaah!)
+ */
+ function isValidIdentifierChar(ch, first) {
+ // check directly for ASCII
+ if (ch <= "\u007F") {
+ if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || ch === '$' || ch === '_' ||
+ (!first && (ch >= '0' && ch <= '9'))) {
+ return true;
+ }
+ return false;
+ }
+
+ // create an object to test this in
+ var x = {};
+ x["x"+ch] = true;
+ x[ch] = true;
+
+ // then use eval to determine if it's a valid character
+ var valid = false;
+ try {
+ valid = (Function("x", "return (x." + (first?"":"x") + ch + ");")(x) === true);
+ } catch (ex) {}
+
+ return valid;
+ }
+
+ function isIdentifier(str) {
+ if (typeof str !== "string")
+ return false;
+
+ if (str.length === 0)
+ return false;
+
+ if (!isValidIdentifierChar(str[0], true))
+ return false;
+
+ for (var i = 1; i < str.length; i++) {
+ if (!isValidIdentifierChar(str[i], false))
+ return false;
+ }
+
+ return true;
+ }
+
+ /*
+ * Tokenizer :: (source, filename, line number) -> Tokenizer
+ */
+ function Tokenizer(s, f, l) {
+ this.cursor = 0;
+ this.source = String(s);
+ this.tokens = [];
+ this.tokenIndex = 0;
+ this.lookahead = 0;
+ this.scanNewlines = false;
+ this.unexpectedEOF = false;
+ this.filename = f || "";
+ this.lineno = l || 1;
+ this.blackList = blackLists[Narcissus.options.version];
+ this.blockComments = null;
+ }
+
+ Tokenizer.prototype = {
+ get done() {
+ // We need to set scanOperand to true here because the first thing
+ // might be a regexp.
+ return this.peek(true) === END;
+ },
+
+ get token() {
+ return this.tokens[this.tokenIndex];
+ },
+
+ match: function (tt, scanOperand) {
+ return this.get(scanOperand) === tt || this.unget();
+ },
+
+ mustMatch: function (tt) {
+ if (!this.match(tt)) {
+ throw this.newSyntaxError("Missing " +
+ definitions.tokens[tt].toLowerCase());
+ }
+ return this.token;
+ },
+
+ peek: function (scanOperand) {
+ var tt, next;
+ if (this.lookahead) {
+ next = this.tokens[(this.tokenIndex + this.lookahead) & 3];
+ tt = (this.scanNewlines && next.lineno !== this.lineno)
+ ? NEWLINE
+ : next.type;
+ } else {
+ tt = this.get(scanOperand);
+ this.unget();
+ }
+ return tt;
+ },
+
+ peekOnSameLine: function (scanOperand) {
+ this.scanNewlines = true;
+ var tt = this.peek(scanOperand);
+ this.scanNewlines = false;
+ return tt;
+ },
+
+ lastBlockComment: function() {
+ var length = this.blockComments.length;
+ return length ? this.blockComments[length - 1] : null;
+ },
+
+ // Eat comments and whitespace.
+ skip: function () {
+ var input = this.source;
+ this.blockComments = [];
+ for (;;) {
+ var ch = input[this.cursor++];
+ var next = input[this.cursor];
+ // handle \r, \r\n and (always preferable) \n
+ if (ch === '\r') {
+ // if the next character is \n, we don't care about this at all
+ if (next === '\n') continue;
+
+ // otherwise, we want to consider this as a newline
+ ch = '\n';
+ }
+
+ if (ch === '\n' && !this.scanNewlines) {
+ this.lineno++;
+ } else if (ch === '/' && next === '*') {
+ var commentStart = ++this.cursor;
+ for (;;) {
+ ch = input[this.cursor++];
+ if (ch === undefined)
+ throw this.newSyntaxError("Unterminated comment");
+
+ if (ch === '*') {
+ next = input[this.cursor];
+ if (next === '/') {
+ var commentEnd = this.cursor - 1;
+ this.cursor++;
+ break;
+ }
+ } else if (ch === '\n') {
+ this.lineno++;
+ }
+ }
+ this.blockComments.push(input.substring(commentStart, commentEnd));
+ }
+ else if (ch === '-' && next === '-' &&
+ input[this.cursor + 1] === '>') {
+ this.cursor += 2;
+ }
+ else if ((ch === '/' && next === '/') ||
+ (ch === '<' && next === '!' &&
+ input[this.cursor + 1] === '-' &&
+ input[this.cursor + 2] === '-' &&
+ (this.cursor += 2))) {
+
+ // capture single line comments starts.
+ var commentStart = ++this.cursor;
+ for (;;) {
+ ch = input[this.cursor++];
+ if (ch === undefined) {
+ //this.lineno++;
+ break;
+ //throw this.newSyntaxError("Unterminated comment");
+ }
+ if (ch === '\r') {
+ // check for \r\n
+ if (next !== '\n') ch = '\n';
+ var commentEnd = this.cursor - 1;
+ }
+
+ if (ch === '\n') {
+ if (this.scanNewlines) {
+ this.cursor--;
+ } else {
+ this.lineno++;
+ }
+ var commentEnd = this.cursor - 1;
+ break;
+ }
+ }
+ this.blockComments.push(input.substring(commentStart, commentEnd));
+ // capture single line comments ends.
+ } else if (!(ch in definitions.whitespace)) {
+ this.cursor--;
+ return;
+ }
+ }
+ },
+
+ // Lex the exponential part of a number, if present. Return true iff an
+ // exponential part was found.
+ lexExponent: function() {
+ var input = this.source;
+ var next = input[this.cursor];
+ if (next === 'e' || next === 'E') {
+ this.cursor++;
+ ch = input[this.cursor++];
+ if (ch === '+' || ch === '-')
+ ch = input[this.cursor++];
+
+ if (ch < '0' || ch > '9')
+ throw this.newSyntaxError("Missing exponent");
+
+ do {
+ ch = input[this.cursor++];
+ } while (ch >= '0' && ch <= '9');
+ this.cursor--;
+
+ return true;
+ }
+
+ return false;
+ },
+
+ lexZeroNumber: function (ch) {
+ var token = this.token, input = this.source;
+ token.type = NUMBER;
+
+ ch = input[this.cursor++];
+ if (ch === '.') {
+ do {
+ ch = input[this.cursor++];
+ } while (ch >= '0' && ch <= '9');
+ this.cursor--;
+
+ this.lexExponent();
+ token.value = parseFloat(
+ input.substring(token.start, this.cursor));
+ } else if (ch === 'x' || ch === 'X') {
+ do {
+ ch = input[this.cursor++];
+ } while ((ch >= '0' && ch <= '9') || (ch >= 'a' && ch <= 'f') ||
+ (ch >= 'A' && ch <= 'F'));
+ this.cursor--;
+
+ token.value = parseInt(input.substring(token.start, this.cursor));
+ } else if (ch >= '0' && ch <= '7') {
+ do {
+ ch = input[this.cursor++];
+ } while (ch >= '0' && ch <= '7');
+ this.cursor--;
+
+ token.value = parseInt(input.substring(token.start, this.cursor));
+ } else {
+ this.cursor--;
+ this.lexExponent(); // 0E1, &c.
+ token.value = 0;
+ }
+ },
+
+ lexNumber: function (ch) {
+ var token = this.token, input = this.source;
+ token.type = NUMBER;
+
+ var floating = false;
+ do {
+ ch = input[this.cursor++];
+ if (ch === '.' && !floating) {
+ floating = true;
+ ch = input[this.cursor++];
+ }
+ } while (ch >= '0' && ch <= '9');
+
+ this.cursor--;
+
+ var exponent = this.lexExponent();
+ floating = floating || exponent;
+
+ var str = input.substring(token.start, this.cursor);
+ token.value = floating ? parseFloat(str) : parseInt(str);
+ },
+
+ lexDot: function (ch) {
+ var token = this.token, input = this.source;
+ var next = input[this.cursor];
+ if (next >= '0' && next <= '9') {
+ do {
+ ch = input[this.cursor++];
+ } while (ch >= '0' && ch <= '9');
+ this.cursor--;
+
+ this.lexExponent();
+
+ token.type = NUMBER;
+ token.value = parseFloat(
+ input.substring(token.start, this.cursor));
+ } else {
+ token.type = DOT;
+ token.assignOp = null;
+ token.value = '.';
+ }
+ },
+
+ lexString: function (ch) {
+ var token = this.token, input = this.source;
+ token.type = STRING;
+
+ var hasEscapes = false;
+ var delim = ch;
+ if (input.length <= this.cursor)
+ throw this.newSyntaxError("Unterminated string literal");
+ while ((ch = input[this.cursor++]) !== delim) {
+ if (this.cursor == input.length)
+ throw this.newSyntaxError("Unterminated string literal");
+ if (ch === '\\') {
+ hasEscapes = true;
+ if (++this.cursor == input.length)
+ throw this.newSyntaxError("Unterminated string literal");
+ }
+ }
+
+ token.value = hasEscapes
+ ? eval(input.substring(token.start, this.cursor))
+ : input.substring(token.start + 1, this.cursor - 1);
+ },
+
+ lexRegExp: function (ch) {
+ var token = this.token, input = this.source;
+ token.type = REGEXP;
+
+ do {
+ ch = input[this.cursor++];
+ if (ch === '\\') {
+ this.cursor++;
+ } else if (ch === '[') {
+ do {
+ if (ch === undefined)
+ throw this.newSyntaxError("Unterminated character class");
+
+ if (ch === '\\')
+ this.cursor++;
+
+ ch = input[this.cursor++];
+ } while (ch !== ']');
+ } else if (ch === undefined) {
+ throw this.newSyntaxError("Unterminated regex");
+ }
+ } while (ch !== '/');
+
+ do {
+ ch = input[this.cursor++];
+ } while (ch >= 'a' && ch <= 'z');
+
+ this.cursor--;
+
+ token.value = eval(input.substring(token.start, this.cursor));
+ },
+
+ lexOp: function (ch) {
+ var token = this.token, input = this.source;
+
+ // A bit ugly, but it seems wasteful to write a trie lookup routine
+ // for only 3 characters...
+ var node = opTokens[ch];
+ var next = input[this.cursor];
+ if (next in node) {
+ node = node[next];
+ this.cursor++;
+ next = input[this.cursor];
+ if (next in node) {
+ node = node[next];
+ this.cursor++;
+ next = input[this.cursor];
+ }
+ }
+
+ var op = node.op;
+ if (definitions.assignOps[op] && input[this.cursor] === '=') {
+ this.cursor++;
+ token.type = ASSIGN;
+ token.assignOp = definitions.tokenIds[definitions.opTypeNames[op]];
+ op += '=';
+ } else {
+ token.type = definitions.tokenIds[definitions.opTypeNames[op]];
+ token.assignOp = null;
+ }
+
+ token.value = op;
+ },
+
+ // FIXME: Unicode escape sequences
+ lexIdent: function (ch) {
+ var token = this.token;
+ var id = ch;
+
+ while ((ch = this.getValidIdentifierChar(false)) !== null) {
+ id += ch;
+ }
+
+ token.type = definitions.keywords[id] || IDENTIFIER;
+ if (token.type in this.blackList) {
+ // banned keyword, this is an identifier
+ token.type = IDENTIFIER;
+ }
+ token.value = id;
+ },
+
+ /*
+ * Tokenizer.get :: void -> token type
+ *
+ * Consume input *only* if there is no lookahead.
+ * Dispatch to the appropriate lexing function depending on the input.
+ */
+ get: function (scanOperand) {
+ var token;
+ while (this.lookahead) {
+ --this.lookahead;
+ this.tokenIndex = (this.tokenIndex + 1) & 3;
+ token = this.tokens[this.tokenIndex];
+ if (token.type !== NEWLINE || this.scanNewlines)
+ return token.type;
+ }
+
+ this.skip();
+
+ this.tokenIndex = (this.tokenIndex + 1) & 3;
+ token = this.tokens[this.tokenIndex];
+ if (!token)
+ this.tokens[this.tokenIndex] = token = {};
+
+ var input = this.source;
+ if (this.cursor >= input.length)
+ return token.type = END;
+
+ token.start = this.cursor;
+ token.lineno = this.lineno;
+
+ var ich = this.getValidIdentifierChar(true);
+ var ch = (ich === null) ? input[this.cursor++] : null;
+ if (ich !== null) {
+ this.lexIdent(ich);
+ } else if (scanOperand && ch === '/') {
+ this.lexRegExp(ch);
+ } else if (ch in opTokens) {
+ this.lexOp(ch);
+ } else if (ch === '.') {
+ this.lexDot(ch);
+ } else if (ch >= '1' && ch <= '9') {
+ this.lexNumber(ch);
+ } else if (ch === '0') {
+ this.lexZeroNumber(ch);
+ } else if (ch === '"' || ch === "'") {
+ this.lexString(ch);
+ } else if (this.scanNewlines && (ch === '\n' || ch === '\r')) {
+ // if this was a \r, look for \r\n
+ if (ch === '\r' && input[this.cursor] === '\n') this.cursor++;
+ token.type = NEWLINE;
+ token.value = '\n';
+ this.lineno++;
+ } else {
+ throw this.newSyntaxError("Illegal token");
+ }
+
+ token.end = this.cursor;
+ return token.type;
+ },
+
+ /*
+ * Tokenizer.unget :: void -> undefined
+ *
+ * Match depends on unget returning undefined.
+ */
+ unget: function () {
+ if (++this.lookahead === 4) throw "PANIC: too much lookahead!";
+ this.tokenIndex = (this.tokenIndex - 1) & 3;
+ },
+
+ newSyntaxError: function (m) {
+ m = (this.filename ? this.filename + ":" : "") + this.lineno + ": " + m;
+ var e = new SyntaxError(m, this.filename, this.lineno);
+ e.source = this.source;
+ e.cursor = this.lookahead
+ ? this.tokens[(this.tokenIndex + this.lookahead) & 3].start
+ : this.cursor;
+ return e;
+ },
+
+
+ /* Gets a single valid identifier char from the input stream, or null
+ * if there is none.
+ */
+ getValidIdentifierChar: function(first) {
+ var input = this.source;
+ if (this.cursor >= input.length) return null;
+ var ch = input[this.cursor];
+
+ // first check for \u escapes
+ if (ch === '\\' && input[this.cursor+1] === 'u') {
+ // get the character value
+ try {
+ ch = String.fromCharCode(parseInt(
+ input.substring(this.cursor + 2, this.cursor + 6),
+ 16));
+ } catch (ex) {
+ return null;
+ }
+ this.cursor += 5;
+ }
+
+ var valid = isValidIdentifierChar(ch, first);
+ if (valid) this.cursor++;
+ return (valid ? ch : null);
+ },
+ };
+
+
+ return {
+ isIdentifier: isIdentifier,
+ Tokenizer: Tokenizer
+ };
+
+}());
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jsparse.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jsparse.js
new file mode 100644
index 0000000..b78078c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/jsparse.js
@@ -0,0 +1,2042 @@
+/* -*- Mode: JS; tab-width: 4; indent-tabs-mode: nil; -*-
+ * vim: set sw=4 ts=4 et tw=78:
+ * ***** BEGIN LICENSE BLOCK *****
+ *
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Narcissus JavaScript engine.
+ *
+ * The Initial Developer of the Original Code is
+ * Brendan Eich <brendan@mozilla.org>.
+ * Portions created by the Initial Developer are Copyright (C) 2004
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Tom Austin <taustin@ucsc.edu>
+ * Brendan Eich <brendan@mozilla.org>
+ * Shu-Yu Guo <shu@rfrn.org>
+ * Dave Herman <dherman@mozilla.com>
+ * Dimitris Vardoulakis <dimvar@ccs.neu.edu>
+ * Patrick Walton <pcwalton@mozilla.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+/*
+ * Narcissus - JS implemented in JS.
+ *
+ * Parser.
+ */
+
+"use strict";
+
+Narcissus.parser = (function() {
+
+ var lexer = Narcissus.lexer;
+ var definitions = Narcissus.definitions;
+
+ const StringMap = definitions.StringMap;
+ const Stack = definitions.Stack;
+
+ var comment;
+
+ // Set constants in the local scope.
+ //eval(definitions.consts);
+ const END = 0,
+ NEWLINE = 1,
+ SEMICOLON = 2,
+ COMMA = 3,
+ ASSIGN = 4,
+ HOOK = 5,
+ COLON = 6,
+ CONDITIONAL = 7,
+ OR = 8,
+ AND = 9,
+ BITWISE_OR = 10,
+ BITWISE_XOR = 11,
+ BITWISE_AND = 12,
+ EQ = 13,
+ NE = 14,
+ STRICT_EQ = 15,
+ STRICT_NE = 16,
+ LT = 17,
+ LE = 18,
+ GE = 19,
+ GT = 20,
+ LSH = 21,
+ RSH = 22,
+ URSH = 23,
+ PLUS = 24,
+ MINUS = 25,
+ MUL = 26,
+ DIV = 27,
+ MOD = 28,
+ NOT = 29,
+ BITWISE_NOT = 30,
+ UNARY_PLUS = 31,
+ UNARY_MINUS = 32,
+ INCREMENT = 33,
+ DECREMENT = 34,
+ DOT = 35,
+ LEFT_BRACKET = 36,
+ RIGHT_BRACKET = 37,
+ LEFT_CURLY = 38,
+ RIGHT_CURLY = 39,
+ LEFT_PAREN = 40,
+ RIGHT_PAREN = 41,
+ SCRIPT = 42,
+ BLOCK = 43,
+ LABEL = 44,
+ FOR_IN = 45,
+ CALL = 46,
+ NEW_WITH_ARGS = 47,
+ INDEX = 48,
+ ARRAY_INIT = 49,
+ OBJECT_INIT = 50,
+ PROPERTY_INIT = 51,
+ GETTER = 52,
+ SETTER = 53,
+ GROUP = 54,
+ LIST = 55,
+ LET_BLOCK = 56,
+ ARRAY_COMP = 57,
+ GENERATOR = 58,
+ COMP_TAIL = 59,
+ IDENTIFIER = 60,
+ NUMBER = 61,
+ STRING = 62,
+ REGEXP = 63,
+ BREAK = 64,
+ CASE = 65,
+ CATCH = 66,
+ CONST = 67,
+ CONTINUE = 68,
+ DEBUGGER = 69,
+ DEFAULT = 70,
+ DELETE = 71,
+ DO = 72,
+ ELSE = 73,
+ EXPORT = 74,
+ FALSE = 75,
+ FINALLY = 76,
+ FOR = 77,
+ FUNCTION = 78,
+ IF = 79,
+ IMPORT = 80,
+ IN = 81,
+ INSTANCEOF = 82,
+ LET = 83,
+ MODULE = 84,
+ NEW = 85,
+ NULL = 86,
+ RETURN = 87,
+ SWITCH = 88,
+ THIS = 89,
+ THROW = 90,
+ TRUE = 91,
+ TRY = 92,
+ TYPEOF = 93,
+ VAR = 94,
+ VOID = 95,
+ YIELD = 96,
+ WHILE = 97,
+ WITH = 98;
+
+ // Banned statement types by language version.
+ const blackLists = { 160: {}, 185: {}, harmony: {} };
+ /* blackLists[160][IMPORT] = true;
+ blackLists[160][EXPORT] = true;
+ blackLists[160][LET] = true;
+ blackLists[160][MODULE] = true;
+ blackLists[160][YIELD] = true;
+ blackLists[185][IMPORT] = true;
+ blackLists[185][EXPORT] = true;
+ blackLists[185][MODULE] = true;
+ blackLists.harmony[WITH] = true;
+*/
+ /*
+ * pushDestructuringVarDecls :: (node, hoisting node) -> void
+ *
+ * Recursively add all destructured declarations to varDecls.
+ */
+ function pushDestructuringVarDecls(n, s) {
+ for (var i in n) {
+ var sub = n[i];
+ if (sub.type === IDENTIFIER) {
+ s.varDecls.push(sub);
+ } else {
+ pushDestructuringVarDecls(sub, s);
+ }
+ }
+ }
+
+ function StaticContext(parentScript, parentBlock, inModule, inFunction) {
+ this.parentScript = parentScript;
+ this.parentBlock = parentBlock || parentScript;
+ this.inModule = inModule || false;
+ this.inFunction = inFunction || false;
+ this.inForLoopInit = false;
+ this.topLevel = true;
+ this.allLabels = new Stack();
+ this.currentLabels = new Stack();
+ this.labeledTargets = new Stack();
+ this.defaultLoopTarget = null;
+ this.defaultTarget = null;
+ this.blackList = blackLists[Narcissus.options.version];
+ Narcissus.options.ecma3OnlyMode && (this.ecma3OnlyMode = true);
+ Narcissus.options.parenFreeMode && (this.parenFreeMode = true);
+ }
+
+ StaticContext.prototype = {
+ ecma3OnlyMode: false,
+ parenFreeMode: false,
+ // non-destructive update via prototype extension
+ update: function(ext) {
+ var desc = {};
+ for (var key in ext) {
+ desc[key] = {
+ value: ext[key],
+ writable: true,
+ enumerable: true,
+ configurable: true
+ }
+ }
+ return Object.create(this, desc);
+ },
+ pushLabel: function(label) {
+ return this.update({ currentLabels: this.currentLabels.push(label),
+ allLabels: this.allLabels.push(label) });
+ },
+ pushTarget: function(target) {
+ var isDefaultLoopTarget = target.isLoop;
+ var isDefaultTarget = isDefaultLoopTarget || target.type === SWITCH;
+
+ if (this.currentLabels.isEmpty()) {
+ if (isDefaultLoopTarget) this.update({ defaultLoopTarget: target });
+ if (isDefaultTarget) this.update({ defaultTarget: target });
+ return this;
+ }
+
+ target.labels = new StringMap();
+ this.currentLabels.forEach(function(label) {
+ target.labels.set(label, true);
+ });
+ return this.update({ currentLabels: new Stack(),
+ labeledTargets: this.labeledTargets.push(target),
+ defaultLoopTarget: isDefaultLoopTarget
+ ? target
+ : this.defaultLoopTarget,
+ defaultTarget: isDefaultTarget
+ ? target
+ : this.defaultTarget });
+ },
+ nest: function() {
+ return this.topLevel ? this.update({ topLevel: false }) : this;
+ },
+ allow: function(type) {
+ switch (type) {
+ case EXPORT:
+ if (!this.inModule || this.inFunction || !this.topLevel)
+ return false;
+ // FALL THROUGH
+
+ case IMPORT:
+ return !this.inFunction && this.topLevel;
+
+ case MODULE:
+ return !this.inFunction && this.topLevel;
+
+ default:
+ return true;
+ }
+ }
+ };
+
+ /*
+ * Script :: (tokenizer, boolean, boolean) -> node
+ *
+ * Parses the toplevel and module/function bodies.
+ */
+ function Script(t, inModule, inFunction) {
+ var n = new Node(t, scriptInit());
+ Statements(t, new StaticContext(n, n, inModule, inFunction), n);
+ return n;
+ }
+
+ // We extend Array slightly with a top-of-stack method.
+ definitions.defineProperty(Array.prototype, "top",
+ function() {
+ return this.length && this[this.length-1];
+ }, false, false, true);
+
+ /*
+ * Node :: (tokenizer, optional init object) -> node
+ */
+ function Node(t, init) {
+ var token = t.token;
+ if (token) {
+ // If init.type exists it will override token.type.
+ this.type = token.type;
+ this.value = token.value;
+ this.lineno = token.lineno;
+
+ // Start and end are file positions for error handling.
+ this.start = token.start;
+ this.end = token.end;
+ } else {
+ this.lineno = t.lineno;
+ }
+
+ // Node uses a tokenizer for debugging (getSource, filename getter).
+ this.tokenizer = t;
+ this.children = [];
+
+ for (var prop in init)
+ this[prop] = init[prop];
+ }
+
+ /*
+ * SyntheticNode :: (tokenizer, optional init object) -> node
+ */
+ function SyntheticNode(t, init) {
+ // print("SYNTHETIC NODE");
+ // if (init.type === COMMA) {
+ // print("SYNTHETIC COMMA");
+ // print(init);
+ // }
+ this.tokenizer = t;
+ this.children = [];
+ for (var prop in init)
+ this[prop] = init[prop];
+ this.synthetic = true;
+ }
+
+ var Np = Node.prototype = SyntheticNode.prototype = {};
+ Np.constructor = Node;
+
+ const TO_SOURCE_SKIP = {
+ type: true,
+ value: true,
+ lineno: true,
+ start: true,
+ end: true,
+ tokenizer: true,
+ assignOp: true
+ };
+ function unevalableConst(code) {
+ var token = definitions.tokens[code];
+ var constName = definitions.opTypeNames.hasOwnProperty(token)
+ ? definitions.opTypeNames[token]
+ : token in definitions.keywords
+ ? token.toUpperCase()
+ : token;
+ return { toSource: function() { return constName } };
+ }
+ Np.toSource = function toSource() {
+ var mock = {};
+ var self = this;
+ mock.type = unevalableConst(this.type);
+ if ("value" in this)
+ mock.value = this.value;
+ if ("lineno" in this)
+ mock.lineno = this.lineno;
+ if ("start" in this)
+ mock.start = this.start;
+ if ("end" in this)
+ mock.end = this.end;
+ if (this.assignOp)
+ mock.assignOp = unevalableConst(this.assignOp);
+ for (var key in this) {
+ if (this.hasOwnProperty(key) && !(key in TO_SOURCE_SKIP))
+ mock[key] = this[key];
+ }
+ return mock.toSource();
+ };
+
+ // Always use push to add operands to an expression, to update start and end.
+ Np.push = function (kid) {
+ // kid can be null e.g. [1, , 2].
+ if (kid !== null) {
+ if (kid.start < this.start)
+ this.start = kid.start;
+ if (this.end < kid.end)
+ this.end = kid.end;
+ }
+ return this.children.push(kid);
+ }
+
+ Node.indentLevel = 0;
+
+ function tokenString(tt) {
+ var t = definitions.tokens[tt];
+ return /^\W/.test(t) ? definitions.opTypeNames[t] : t.toUpperCase();
+ }
+
+ Np.toString = function () {
+ var a = [];
+ for (var i in this) {
+ if (this.hasOwnProperty(i) && i !== 'type' && i !== 'target')
+ a.push({id: i, value: this[i]});
+ }
+ a.sort(function (a,b) { return (a.id < b.id) ? -1 : 1; });
+ const INDENTATION = " ";
+ var n = ++Node.indentLevel;
+ var s = "{\n" + INDENTATION.repeat(n) + "type: " + tokenString(this.type);
+ for (i = 0; i < a.length; i++)
+ s += ",\n" + INDENTATION.repeat(n) + a[i].id + ": " + a[i].value;
+ n = --Node.indentLevel;
+ s += "\n" + INDENTATION.repeat(n) + "}";
+ return s;
+ }
+
+ Np.getSource = function () {
+ return this.tokenizer.source.slice(this.start, this.end);
+ };
+
+ /*
+ * Helper init objects for common nodes.
+ */
+
+ const LOOP_INIT = { isLoop: true };
+
+ function blockInit() {
+ return { type: BLOCK, varDecls: [] };
+ }
+
+ function scriptInit() {
+ return { type: SCRIPT,
+ funDecls: [],
+ varDecls: [],
+ modDefns: new StringMap(),
+ modAssns: new StringMap(),
+ modDecls: new StringMap(),
+ modLoads: new StringMap(),
+ impDecls: [],
+ expDecls: [],
+ exports: new StringMap(),
+ hasEmptyReturn: false,
+ hasReturnWithValue: false,
+ isGenerator: false };
+ }
+
+ definitions.defineGetter(Np, "filename",
+ function() {
+ return this.tokenizer.filename;
+ });
+
+ definitions.defineGetter(Np, "length",
+ function() {
+ throw new Error("Node.prototype.length is gone; " +
+ "use n.children.length instead");
+ });
+
+ definitions.defineProperty(String.prototype, "repeat",
+ function(n) {
+ var s = "", t = this + s;
+ while (--n >= 0)
+ s += t;
+ return s;
+ }, false, false, true);
+
+ function MaybeLeftParen(t, x) {
+ if (x.parenFreeMode)
+ return t.match(LEFT_PAREN) ? LEFT_PAREN : END;
+ return t.mustMatch(LEFT_PAREN).type;
+ }
+
+ function MaybeRightParen(t, p) {
+ if (p === LEFT_PAREN)
+ t.mustMatch(RIGHT_PAREN);
+ }
+
+ /*
+ * Statements :: (tokenizer, compiler context, node) -> void
+ *
+ * Parses a sequence of Statements.
+ */
+ function Statements(t, x, n) {
+ try {
+ while (!t.done && t.peek(true) !== RIGHT_CURLY)
+ n.push(Statement(t, x));
+ } catch (e) {
+ if (t.done)
+ t.unexpectedEOF = true;
+ throw e;
+ }
+ }
+
+ function Block(t, x) {
+ t.mustMatch(LEFT_CURLY);
+ var n = new Node(t, blockInit());
+ Statements(t, x.update({ parentBlock: n }).pushTarget(n), n);
+ t.mustMatch(RIGHT_CURLY);
+ return n;
+ }
+
+ const DECLARED_FORM = 0, EXPRESSED_FORM = 1, STATEMENT_FORM = 2;
+
+ /*
+ * Export :: (binding node, boolean) -> Export
+ *
+ * Static semantic representation of a module export.
+ */
+ function Export(node, isDefinition) {
+ this.node = node; // the AST node declaring this individual export
+ this.isDefinition = isDefinition; // is the node an 'export'-annotated definition?
+ this.resolved = null; // resolved pointer to the target of this export
+ }
+
+ /*
+ * registerExport :: (StringMap, EXPORT node) -> void
+ */
+ function registerExport(exports, decl) {
+ function register(name, exp) {
+ if (exports.has(name))
+ throw new SyntaxError("multiple exports of " + name);
+ exports.set(name, exp);
+ }
+
+ switch (decl.type) {
+ case MODULE:
+ case FUNCTION:
+ register(decl.name, new Export(decl, true));
+ break;
+
+ case VAR:
+ for (var i = 0; i < decl.children.length; i++)
+ register(decl.children[i].name, new Export(decl.children[i], true));
+ break;
+
+ case LET:
+ case CONST:
+ throw new Error("NYI: " + definitions.tokens[decl.type]);
+
+ case EXPORT:
+ for (var i = 0; i < decl.pathList.length; i++) {
+ var path = decl.pathList[i];
+ switch (path.type) {
+ case OBJECT_INIT:
+ for (var j = 0; j < path.children.length; j++) {
+ // init :: IDENTIFIER | PROPERTY_INIT
+ var init = path.children[j];
+ if (init.type === IDENTIFIER)
+ register(init.value, new Export(init, false));
+ else
+ register(init.children[0].value, new Export(init.children[1], false));
+ }
+ break;
+
+ case DOT:
+ register(path.children[1].value, new Export(path, false));
+ break;
+
+ case IDENTIFIER:
+ register(path.value, new Export(path, false));
+ break;
+
+ default:
+ throw new Error("unexpected export path: " + definitions.tokens[path.type]);
+ }
+ }
+ break;
+
+ default:
+ throw new Error("unexpected export decl: " + definitions.tokens[exp.type]);
+ }
+ }
+
+ /*
+ * Module :: (node) -> Module
+ *
+ * Static semantic representation of a module.
+ */
+ function Module(node) {
+ var exports = node.body.exports;
+ var modDefns = node.body.modDefns;
+
+ var exportedModules = new StringMap();
+
+ exports.forEach(function(name, exp) {
+ var node = exp.node;
+ if (node.type === MODULE) {
+ exportedModules.set(name, node);
+ } else if (!exp.isDefinition && node.type === IDENTIFIER && modDefns.has(node.value)) {
+ var mod = modDefns.get(node.value);
+ exportedModules.set(name, mod);
+ }
+ });
+
+ this.node = node;
+ this.exports = exports;
+ this.exportedModules = exportedModules;
+ }
+
+ /*
+ * Statement :: (tokenizer, compiler context) -> node
+ *
+ * Parses a Statement.
+ */
+ function Statement(t, x) {
+ var i, label, n, n2, p, c, ss, tt = t.get(true), tt2, x2, x3;
+
+ var comments = t.blockComments;
+
+ if (x.blackList[tt])
+ throw t.newSyntaxError(definitions.tokens[tt] + " statements only allowed in Harmony");
+ if (!x.allow(tt))
+ throw t.newSyntaxError(definitions.tokens[tt] + " statement in illegal context");
+
+ // Cases for statements ending in a right curly return early, avoiding the
+ // common semicolon insertion magic after this switch.
+ switch (tt) {
+ case IMPORT:
+ n = new Node(t);
+ n.pathList = ImportPathList(t, x);
+ x.parentScript.impDecls.push(n);
+ n.blockComments = comments;
+ break;
+
+ case EXPORT:
+ switch (t.peek()) {
+ case MODULE:
+ case FUNCTION:
+ case LET:
+ case VAR:
+ case CONST:
+ n = Statement(t, x);
+ n.blockComments = comments;
+ n.exported = true;
+ x.parentScript.expDecls.push(n);
+ registerExport(x.parentScript.exports, n);
+ return n;
+
+ default:
+ n = new Node(t);
+ n.blockComments = comments;
+ n.pathList = ExportPathList(t, x);
+ break;
+ }
+ x.parentScript.expDecls.push(n);
+ registerExport(x.parentScript.exports, n);
+ break;
+
+ case MODULE:
+ n = new Node(t);
+ n.blockComments = comments;
+ t.mustMatch(IDENTIFIER);
+ label = t.token.value;
+
+ if (t.match(LEFT_CURLY)) {
+ n.name = label;
+ n.body = Script(t, true, false);
+ n.module = new Module(n);
+ t.mustMatch(RIGHT_CURLY);
+ x.parentScript.modDefns.set(n.name, n);
+ return n;
+ }
+
+ t.unget();
+ ModuleVariables(t, x, n);
+ return n;
+
+ case FUNCTION:
+ // DECLARED_FORM extends funDecls of x, STATEMENT_FORM doesn't.
+ return FunctionDefinition(t, x, true, x.topLevel ? DECLARED_FORM : STATEMENT_FORM, comments);
+
+ case LEFT_CURLY:
+ n = new Node(t, blockInit());
+ n.blockComments = comments;
+ Statements(t, x.update({ parentBlock: n }).pushTarget(n).nest(), n);
+ t.mustMatch(RIGHT_CURLY);
+ return n;
+
+ case IF:
+ n = new Node(t);
+ n.blockComments = comments;
+ n.condition = HeadExpression(t, x);
+ x2 = x.pushTarget(n).nest();
+ n.thenPart = Statement(t, x2);
+ n.elsePart = t.match(ELSE, true) ? Statement(t, x2) : null;
+ return n;
+
+ case SWITCH:
+ // This allows CASEs after a DEFAULT, which is in the standard.
+ n = new Node(t, { cases: [], defaultIndex: -1 });
+ n.blockComments = comments;
+ n.discriminant = HeadExpression(t, x);
+ x2 = x.pushTarget(n).nest();
+ t.mustMatch(LEFT_CURLY);
+ while ((tt = t.get()) !== RIGHT_CURLY) {
+ switch (tt) {
+ case DEFAULT:
+ if (n.defaultIndex >= 0)
+ throw t.newSyntaxError("More than one switch default");
+ // FALL THROUGH
+ case CASE:
+ n2 = new Node(t);
+ if (tt === DEFAULT)
+ n.defaultIndex = n.cases.length;
+ else
+ n2.caseLabel = Expression(t, x2, COLON);
+ break;
+
+ default:
+ throw t.newSyntaxError("Invalid switch case");
+ }
+ t.mustMatch(COLON);
+ n2.statements = new Node(t, blockInit());
+ while ((tt=t.peek(true)) !== CASE && tt !== DEFAULT &&
+ tt !== RIGHT_CURLY)
+ n2.statements.push(Statement(t, x2));
+ n.cases.push(n2);
+ }
+ return n;
+
+ case FOR:
+ n = new Node(t, LOOP_INIT);
+ n.blockComments = comments;
+ if (t.match(IDENTIFIER)) {
+ if (t.token.value === "each")
+ n.isEach = true;
+ else
+ t.unget();
+ }
+ if (!x.parenFreeMode)
+ t.mustMatch(LEFT_PAREN);
+ x2 = x.pushTarget(n).nest();
+ x3 = x.update({ inForLoopInit: true });
+ n2 = null;
+ if ((tt = t.peek(true)) !== SEMICOLON) {
+ if (tt === VAR || tt === CONST) {
+ t.get();
+ n2 = Variables(t, x3);
+ } else if (tt === LET) {
+ t.get();
+ if (t.peek() === LEFT_PAREN) {
+ n2 = LetBlock(t, x3, false);
+ } else {
+ // Let in for head, we need to add an implicit block
+ // around the rest of the for.
+ x3.parentBlock = n;
+ n.varDecls = [];
+ n2 = Variables(t, x3);
+ }
+ } else {
+ n2 = Expression(t, x3);
+ }
+ }
+ if (n2 && t.match(IN)) {
+ n.type = FOR_IN;
+ n.object = Expression(t, x3);
+ if (n2.type === VAR || n2.type === LET) {
+ c = n2.children;
+
+ // Destructuring turns one decl into multiples, so either
+ // there must be only one destructuring or only one
+ // decl.
+ if (c.length !== 1 && n2.destructurings.length !== 1) {
+ throw new SyntaxError("Invalid for..in left-hand side",
+ t.filename, n2.lineno);
+ }
+ if (n2.destructurings.length > 0) {
+ n.iterator = n2.destructurings[0];
+ } else {
+ n.iterator = c[0];
+ }
+ n.varDecl = n2;
+ } else {
+ if (n2.type === ARRAY_INIT || n2.type === OBJECT_INIT) {
+ n2.destructuredNames = checkDestructuring(t, x3, n2);
+ }
+ n.iterator = n2;
+ }
+ } else {
+ x3.inForLoopInit = false;
+ n.setup = n2;
+ t.mustMatch(SEMICOLON);
+ if (n.isEach)
+ throw t.newSyntaxError("Invalid for each..in loop");
+ n.condition = (t.peek(true) === SEMICOLON)
+ ? null
+ : Expression(t, x3);
+ t.mustMatch(SEMICOLON);
+ tt2 = t.peek(true);
+ n.update = (x.parenFreeMode
+ ? tt2 === LEFT_CURLY || definitions.isStatementStartCode[tt2]
+ : tt2 === RIGHT_PAREN)
+ ? null
+ : Expression(t, x3);
+ }
+ if (!x.parenFreeMode)
+ t.mustMatch(RIGHT_PAREN);
+ n.body = Statement(t, x2);
+ return n;
+
+ case WHILE:
+ n = new Node(t, { isLoop: true });
+ n.blockComments = comments;
+ n.condition = HeadExpression(t, x);
+ n.body = Statement(t, x.pushTarget(n).nest());
+ return n;
+
+ case DO:
+ n = new Node(t, { isLoop: true });
+ n.blockComments = comments;
+ n.body = Statement(t, x.pushTarget(n).nest());
+ t.mustMatch(WHILE);
+ n.condition = HeadExpression(t, x);
+ if (!x.ecmaStrictMode) {
+ // <script language="JavaScript"> (without version hints) may need
+ // automatic semicolon insertion without a newline after do-while.
+ // See http://bugzilla.mozilla.org/show_bug.cgi?id=238945.
+ t.match(SEMICOLON);
+ return n;
+ }
+ break;
+
+ case BREAK:
+ case CONTINUE:
+ n = new Node(t);
+ n.blockComments = comments;
+
+ // handle the |foo: break foo;| corner case
+ x2 = x.pushTarget(n);
+
+ if (t.peekOnSameLine() === IDENTIFIER) {
+ t.get();
+ n.label = t.token.value;
+ }
+
+ if (n.label) {
+ n.target = x2.labeledTargets.find(function(target) { return target.labels.has(n.label) });
+ } else if (tt === CONTINUE) {
+ n.target = x2.defaultLoopTarget;
+ } else {
+ n.target = x2.defaultTarget;
+ }
+
+ if (!n.target)
+ throw t.newSyntaxError("Invalid " + ((tt === BREAK) ? "break" : "continue"));
+ if (!n.target.isLoop && tt === CONTINUE)
+ throw t.newSyntaxError("Invalid continue");
+
+ break;
+
+ case TRY:
+ n = new Node(t, { catchClauses: [] });
+ n.blockComments = comments;
+ n.tryBlock = Block(t, x);
+ while (t.match(CATCH)) {
+ n2 = new Node(t);
+ p = MaybeLeftParen(t, x);
+ switch (t.get()) {
+ case LEFT_BRACKET:
+ case LEFT_CURLY:
+ // Destructured catch identifiers.
+ t.unget();
+ n2.varName = DestructuringExpression(t, x, true);
+ break;
+ case IDENTIFIER:
+ n2.varName = t.token.value;
+ break;
+ default:
+ throw t.newSyntaxError("missing identifier in catch");
+ break;
+ }
+ if (t.match(IF)) {
+ if (x.ecma3OnlyMode)
+ throw t.newSyntaxError("Illegal catch guard");
+ if (n.catchClauses.length && !n.catchClauses.top().guard)
+ throw t.newSyntaxError("Guarded catch after unguarded");
+ n2.guard = Expression(t, x);
+ }
+ MaybeRightParen(t, p);
+ n2.block = Block(t, x);
+ n.catchClauses.push(n2);
+ }
+ if (t.match(FINALLY))
+ n.finallyBlock = Block(t, x);
+ if (!n.catchClauses.length && !n.finallyBlock)
+ throw t.newSyntaxError("Invalid try statement");
+ return n;
+
+ case CATCH:
+ case FINALLY:
+ throw t.newSyntaxError(definitions.tokens[tt] + " without preceding try");
+
+ case THROW:
+ n = new Node(t);
+ n.blockComments = comments;
+ n.exception = Expression(t, x);
+ break;
+
+ case RETURN:
+ n = ReturnOrYield(t, x);
+ break;
+
+ case WITH:
+ n = new Node(t);
+ n.blockComments = comments;
+ n.object = HeadExpression(t, x);
+ n.body = Statement(t, x.pushTarget(n).nest());
+ return n;
+
+ case VAR:
+ case CONST:
+ n = Variables(t, x);
+ break;
+
+ case LET:
+ if (t.peek() === LEFT_PAREN)
+ n = LetBlock(t, x, true);
+ else
+ n = Variables(t, x);
+ break;
+
+ case DEBUGGER:
+ n = new Node(t);
+ n.blockComments = comments;
+ break;
+
+ case NEWLINE:
+ case SEMICOLON:
+ n = new Node(t, { type: SEMICOLON });
+ n.blockComments = comments;
+ n.expression = null;
+ return n;
+
+ default:
+ if (tt === IDENTIFIER) {
+ tt = t.peek();
+ // Labeled statement.
+ if (tt === COLON) {
+ label = t.token.value;
+ if (x.allLabels.has(label))
+ throw t.newSyntaxError("Duplicate label");
+ t.get();
+ n = new Node(t, { type: LABEL, label: label });
+ n.blockComments = comments;
+ n.statement = Statement(t, x.pushLabel(label).nest());
+ n.target = (n.statement.type === LABEL) ? n.statement.target : n.statement;
+ return n;
+ }
+ }
+
+ // Expression statement.
+ // We unget the current token to parse the expression as a whole.
+ n = new Node(t, { type: SEMICOLON });
+ t.unget();
+ n.blockComments = comments;
+ n.expression = Expression(t, x);
+ n.end = n.expression.end;
+ break;
+ }
+
+ n.blockComments = comments;
+ MagicalSemicolon(t);
+ return n;
+ }
+
+ /*
+ * MagicalSemicolon :: (tokenizer) -> void
+ */
+ function MagicalSemicolon(t) {
+ var tt;
+ if (t.lineno === t.token.lineno) {
+ tt = t.peekOnSameLine();
+ if (tt !== END && tt !== NEWLINE && tt !== SEMICOLON && tt !== RIGHT_CURLY)
+ throw t.newSyntaxError("missing ; before statement");
+ }
+ t.match(SEMICOLON);
+ }
+
+ /*
+ * ReturnOrYield :: (tokenizer, compiler context) -> (RETURN | YIELD) node
+ */
+ function ReturnOrYield(t, x) {
+ var n, b, tt = t.token.type, tt2;
+
+ var parentScript = x.parentScript;
+
+ if (tt === RETURN) {
+ if (!x.inFunction) {
+ // pass
+ //throw t.newSyntaxError("Return not in function");
+ }
+
+ } else /* if (tt === YIELD) */ {
+ if (!x.inFunction)
+ throw t.newSyntaxError("Yield not in function");
+ parentScript.isGenerator = true;
+ }
+ n = new Node(t, { value: undefined });
+
+ tt2 = (tt === RETURN) ? t.peekOnSameLine(true) : t.peek(true);
+ if (tt2 !== END && tt2 !== NEWLINE &&
+ tt2 !== SEMICOLON && tt2 !== RIGHT_CURLY
+ && (tt !== YIELD ||
+ (tt2 !== tt && tt2 !== RIGHT_BRACKET && tt2 !== RIGHT_PAREN &&
+ tt2 !== COLON && tt2 !== COMMA))) {
+ if (tt === RETURN) {
+ n.value = Expression(t, x);
+ parentScript.hasReturnWithValue = true;
+ } else {
+ n.value = AssignExpression(t, x);
+ }
+ } else if (tt === RETURN) {
+ parentScript.hasEmptyReturn = true;
+ }
+
+ // Disallow return v; in generator.
+ if (parentScript.hasReturnWithValue && parentScript.isGenerator)
+ throw t.newSyntaxError("Generator returns a value");
+
+ return n;
+ }
+
+ /*
+ * ModuleExpression :: (tokenizer, compiler context) -> (STRING | IDENTIFIER | DOT) node
+ */
+ function ModuleExpression(t, x) {
+ return t.match(STRING) ? new Node(t) : QualifiedPath(t, x);
+ }
+
+ /*
+ * ImportPathList :: (tokenizer, compiler context) -> Array[DOT node]
+ */
+ function ImportPathList(t, x) {
+ var a = [];
+ do {
+ a.push(ImportPath(t, x));
+ } while (t.match(COMMA));
+ return a;
+ }
+
+ /*
+ * ImportPath :: (tokenizer, compiler context) -> DOT node
+ */
+ function ImportPath(t, x) {
+ var n = QualifiedPath(t, x);
+ if (!t.match(DOT)) {
+ if (n.type === IDENTIFIER)
+ throw t.newSyntaxError("cannot import local variable");
+ return n;
+ }
+
+ var n2 = new Node(t);
+ n2.push(n);
+ n2.push(ImportSpecifierSet(t, x));
+ return n2;
+ }
+
+ /*
+ * ExplicitSpecifierSet :: (tokenizer, compiler context, (tokenizer, compiler context) -> node)
+ * -> OBJECT_INIT node
+ */
+ function ExplicitSpecifierSet(t, x, SpecifierRHS) {
+ var n, n2, id, tt;
+
+ n = new Node(t, { type: OBJECT_INIT });
+ t.mustMatch(LEFT_CURLY);
+
+ if (!t.match(RIGHT_CURLY)) {
+ do {
+ id = Identifier(t, x);
+ if (t.match(COLON)) {
+ n2 = new Node(t, { type: PROPERTY_INIT });
+ n2.push(id);
+ n2.push(SpecifierRHS(t, x));
+ n.push(n2);
+ } else {
+ n.push(id);
+ }
+ } while (!t.match(RIGHT_CURLY) && t.mustMatch(COMMA));
+ }
+
+ return n;
+ }
+
+ /*
+ * ImportSpecifierSet :: (tokenizer, compiler context) -> (IDENTIFIER | OBJECT_INIT) node
+ */
+ function ImportSpecifierSet(t, x) {
+ return t.match(MUL)
+ ? new Node(t, { type: IDENTIFIER, name: "*" })
+ : ExplicitSpecifierSet(t, x, Identifier);
+ }
+
+ /*
+ * Identifier :: (tokenizer, compiler context) -> IDENTIFIER node
+ */
+ function Identifier(t, x) {
+ t.mustMatch(IDENTIFIER);
+ return new Node(t, { type: IDENTIFIER });
+ }
+
+ /*
+ * IdentifierName :: (tokenizer) -> IDENTIFIER node
+ */
+ function IdentifierName(t) {
+ if (t.match(IDENTIFIER))
+ return new Node(t, { type: IDENTIFIER });
+ t.get();
+ if (t.token.value in definitions.keywords)
+ return new Node(t, { type: IDENTIFIER });
+ throw t.newSyntaxError("missing IdentifierName");
+ }
+
+ /*
+ * QualifiedPath :: (tokenizer, compiler context) -> (IDENTIFIER | DOT) node
+ */
+ function QualifiedPath(t, x) {
+ var n, n2;
+
+ n = Identifier(t, x);
+
+ while (t.match(DOT)) {
+ if (t.peek() !== IDENTIFIER) {
+ // Unget the '.' token, which isn't part of the QualifiedPath.
+ t.unget();
+ break;
+ }
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(Identifier(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ /*
+ * ExportPath :: (tokenizer, compiler context) -> (IDENTIFIER | DOT | OBJECT_INIT) node
+ */
+ function ExportPath(t, x) {
+ if (t.peek() === LEFT_CURLY)
+ return ExplicitSpecifierSet(t, x, QualifiedPath);
+ return QualifiedPath(t, x);
+ }
+
+ /*
+ * ExportPathList :: (tokenizer, compiler context)
+ * -> Array[(IDENTIFIER | DOT | OBJECT_INIT) node]
+ */
+ function ExportPathList(t, x) {
+ var a = [];
+ do {
+ a.push(ExportPath(t, x));
+ } while (t.match(COMMA));
+ return a;
+ }
+
+ /*
+ * FunctionDefinition :: (tokenizer, compiler context, boolean,
+ * DECLARED_FORM or EXPRESSED_FORM or STATEMENT_FORM,
+ * [string] or null or undefined)
+ * -> node
+ */
+ function FunctionDefinition(t, x, requireName, functionForm, comments) {
+ var tt;
+ var f = new Node(t, { params: [], paramComments: [] });
+ if (typeof comment === "undefined")
+ comment = null;
+ f.blockComments = comments;
+ if (f.type !== FUNCTION)
+ f.type = (f.value === "get") ? GETTER : SETTER;
+ if (t.match(IDENTIFIER))
+ f.name = t.token.value;
+ else if (requireName)
+ throw t.newSyntaxError("missing function identifier");
+
+ var inModule = x ? x.inModule : false;
+ var x2 = new StaticContext(null, null, inModule, true);
+
+ t.mustMatch(LEFT_PAREN);
+ if (!t.match(RIGHT_PAREN)) {
+ do {
+ tt = t.get();
+ f.paramComments.push(t.lastBlockComment());
+ switch (tt) {
+ case LEFT_BRACKET:
+ case LEFT_CURLY:
+ // Destructured formal parameters.
+ t.unget();
+ f.params.push(DestructuringExpression(t, x2));
+ break;
+ case IDENTIFIER:
+ f.params.push(t.token.value);
+ break;
+ default:
+ throw t.newSyntaxError("missing formal parameter");
+ break;
+ }
+ } while (t.match(COMMA));
+ t.mustMatch(RIGHT_PAREN);
+ }
+
+ // Do we have an expression closure or a normal body?
+ tt = t.get();
+ if (tt !== LEFT_CURLY)
+ t.unget();
+
+ if (tt !== LEFT_CURLY) {
+ f.body = AssignExpression(t, x2);
+ if (f.body.isGenerator)
+ throw t.newSyntaxError("Generator returns a value");
+ } else {
+ f.body = Script(t, inModule, true);
+ }
+
+ if (tt === LEFT_CURLY)
+ t.mustMatch(RIGHT_CURLY);
+
+ f.end = t.token.end;
+ f.functionForm = functionForm;
+ if (functionForm === DECLARED_FORM)
+ x.parentScript.funDecls.push(f);
+ return f;
+ }
+
+ /*
+ * ModuleVariables :: (tokenizer, compiler context, MODULE node) -> void
+ *
+ * Parses a comma-separated list of module declarations (and maybe
+ * initializations).
+ */
+ function ModuleVariables(t, x, n) {
+ var n1, n2;
+ do {
+ n1 = Identifier(t, x);
+ if (t.match(ASSIGN)) {
+ n2 = ModuleExpression(t, x);
+ n1.initializer = n2;
+ if (n2.type === STRING)
+ x.parentScript.modLoads.set(n1.value, n2.value);
+ else
+ x.parentScript.modAssns.set(n1.value, n1);
+ }
+ n.push(n1);
+ } while (t.match(COMMA));
+ }
+
+ /*
+ * Variables :: (tokenizer, compiler context) -> node
+ *
+ * Parses a comma-separated list of var declarations (and maybe
+ * initializations).
+ */
+ function Variables(t, x, letBlock) {
+ var n, n2, ss, i, s, tt;
+
+ tt = t.token.type;
+ switch (tt) {
+ case VAR:
+ case CONST:
+ s = x.parentScript;
+ break;
+ case LET:
+ s = x.parentBlock;
+ break;
+ case LEFT_PAREN:
+ tt = LET;
+ s = letBlock;
+ break;
+ }
+
+ n = new Node(t, { type: tt, destructurings: [] });
+
+ do {
+ tt = t.get();
+ if (tt === LEFT_BRACKET || tt === LEFT_CURLY) {
+ // Need to unget to parse the full destructured expression.
+ t.unget();
+
+ var dexp = DestructuringExpression(t, x, true);
+
+ n2 = new Node(t, { type: IDENTIFIER,
+ name: dexp,
+ readOnly: n.type === CONST });
+ n.push(n2);
+ pushDestructuringVarDecls(n2.name.destructuredNames, s);
+ n.destructurings.push({ exp: dexp, decl: n2 });
+
+ if (x.inForLoopInit && t.peek() === IN) {
+ continue;
+ }
+
+ t.mustMatch(ASSIGN);
+ if (t.token.assignOp)
+ throw t.newSyntaxError("Invalid variable initialization");
+
+ n2.blockComment = t.lastBlockComment();
+ n2.initializer = AssignExpression(t, x);
+
+ continue;
+ }
+
+ if (tt !== IDENTIFIER)
+ throw t.newSyntaxError("missing variable name");
+
+ n2 = new Node(t, { type: IDENTIFIER,
+ name: t.token.value,
+ readOnly: n.type === CONST });
+ n.push(n2);
+ s.varDecls.push(n2);
+
+ if (t.match(ASSIGN)) {
+ var comment = t.lastBlockComment();
+ if (t.token.assignOp)
+ throw t.newSyntaxError("Invalid variable initialization");
+
+ n2.initializer = AssignExpression(t, x);
+ } else {
+ var comment = t.lastBlockComment();
+ }
+ n2.blockComment = comment;
+ } while (t.match(COMMA));
+
+ return n;
+ }
+
+ /*
+ * LetBlock :: (tokenizer, compiler context, boolean) -> node
+ *
+ * Does not handle let inside of for loop init.
+ */
+ function LetBlock(t, x, isStatement) {
+ var n, n2;
+
+ // t.token.type must be LET
+ n = new Node(t, { type: LET_BLOCK, varDecls: [] });
+ t.mustMatch(LEFT_PAREN);
+ n.variables = Variables(t, x, n);
+ t.mustMatch(RIGHT_PAREN);
+
+ if (isStatement && t.peek() !== LEFT_CURLY) {
+ /*
+ * If this is really an expression in let statement guise, then we
+ * need to wrap the LET_BLOCK node in a SEMICOLON node so that we pop
+ * the return value of the expression.
+ */
+ n2 = new Node(t, { type: SEMICOLON,
+ expression: n });
+ isStatement = false;
+ }
+
+ if (isStatement)
+ n.block = Block(t, x);
+ else
+ n.expression = AssignExpression(t, x);
+
+ return n;
+ }
+
+ function checkDestructuring(t, x, n, simpleNamesOnly) {
+ if (n.type === ARRAY_COMP)
+ throw t.newSyntaxError("Invalid array comprehension left-hand side");
+ if (n.type !== ARRAY_INIT && n.type !== OBJECT_INIT)
+ return undefined;
+
+ var lhss = {};
+ var nn, n2, idx, sub, cc, c = n.children;
+ for (var i = 0, j = c.length; i < j; i++) {
+ if (!(nn = c[i]))
+ continue;
+ if (nn.type === PROPERTY_INIT) {
+ cc = nn.children;
+ sub = cc[1];
+ idx = cc[0].value;
+ } else if (n.type === OBJECT_INIT) {
+ // Do we have destructuring shorthand {foo, bar}?
+ sub = nn;
+ idx = nn.value;
+ } else {
+ sub = nn;
+ idx = i;
+ }
+
+ if (sub.type === ARRAY_INIT || sub.type === OBJECT_INIT) {
+ lhss[idx] = checkDestructuring(t, x, sub, simpleNamesOnly);
+ } else {
+ if (simpleNamesOnly && sub.type !== IDENTIFIER) {
+ // In declarations, lhs must be simple names
+ throw t.newSyntaxError("missing name in pattern");
+ }
+
+ lhss[idx] = sub;
+ }
+ }
+
+ return lhss;
+ }
+
+ function DestructuringExpression(t, x, simpleNamesOnly) {
+ var n = PrimaryExpression(t, x);
+ // Keep the list of lefthand sides for varDecls
+ n.destructuredNames = checkDestructuring(t, x, n, simpleNamesOnly);
+ return n;
+ }
+
+ function GeneratorExpression(t, x, e) {
+ return new Node(t, { type: GENERATOR,
+ expression: e,
+ tail: ComprehensionTail(t, x) });
+ }
+
+ function ComprehensionTail(t, x) {
+ var body, n, n2, n3, p;
+
+ // t.token.type must be FOR
+ body = new Node(t, { type: COMP_TAIL });
+
+ do {
+ // Comprehension tails are always for..in loops.
+ n = new Node(t, { type: FOR_IN, isLoop: true });
+ if (t.match(IDENTIFIER)) {
+ // But sometimes they're for each..in.
+ if (t.token.value === "each")
+ n.isEach = true;
+ else
+ t.unget();
+ }
+ p = MaybeLeftParen(t, x);
+ switch(t.get()) {
+ case LEFT_BRACKET:
+ case LEFT_CURLY:
+ t.unget();
+ // Destructured left side of for in comprehension tails.
+ n.iterator = DestructuringExpression(t, x);
+ break;
+
+ case IDENTIFIER:
+ n.iterator = n3 = new Node(t, { type: IDENTIFIER });
+ n3.name = n3.value;
+ n.varDecl = n2 = new Node(t, { type: VAR });
+ n2.push(n3);
+ x.parentScript.varDecls.push(n3);
+ // Don't add to varDecls since the semantics of comprehensions is
+ // such that the variables are in their own function when
+ // desugared.
+ break;
+
+ default:
+ throw t.newSyntaxError("missing identifier");
+ }
+ t.mustMatch(IN);
+ n.object = Expression(t, x);
+ MaybeRightParen(t, p);
+ body.push(n);
+ } while (t.match(FOR));
+
+ // Optional guard.
+ if (t.match(IF))
+ body.guard = HeadExpression(t, x);
+
+ return body;
+ }
+
+ function HeadExpression(t, x) {
+ var p = MaybeLeftParen(t, x);
+ var n = ParenExpression(t, x);
+ MaybeRightParen(t, p);
+ if (p === END && !n.parenthesized) {
+ var tt = t.peek();
+ if (tt !== LEFT_CURLY && !definitions.isStatementStartCode[tt])
+ throw t.newSyntaxError("Unparenthesized head followed by unbraced body");
+ }
+ return n;
+ }
+
+ function ParenExpression(t, x) {
+ // Always accept the 'in' operator in a parenthesized expression,
+ // where it's unambiguous, even if we might be parsing the init of a
+ // for statement.
+ var n = Expression(t, x.update({ inForLoopInit: x.inForLoopInit &&
+ (t.token.type === LEFT_PAREN) }));
+
+ if (t.match(FOR)) {
+ if (n.type === YIELD && !n.parenthesized)
+ throw t.newSyntaxError("Yield expression must be parenthesized");
+ if (n.type === COMMA && !n.parenthesized)
+ throw t.newSyntaxError("Generator expression must be parenthesized");
+ n = GeneratorExpression(t, x, n);
+ }
+
+ return n;
+ }
+
+ /*
+ * Expression :: (tokenizer, compiler context) -> node
+ *
+ * Top-down expression parser matched against SpiderMonkey.
+ */
+ function Expression(t, x) {
+ var n, n2;
+
+ n = AssignExpression(t, x);
+ if (t.match(COMMA)) {
+ n2 = new Node(t, { type: COMMA });
+ n2.push(n);
+ n = n2;
+ do {
+ n2 = n.children[n.children.length-1];
+ if (n2.type === YIELD && !n2.parenthesized)
+ throw t.newSyntaxError("Yield expression must be parenthesized");
+ n.push(AssignExpression(t, x));
+ } while (t.match(COMMA));
+ }
+
+ return n;
+ }
+
+ function AssignExpression(t, x) {
+ var n, lhs;
+
+ // Have to treat yield like an operand because it could be the leftmost
+ // operand of the expression.
+ if (t.match(YIELD, true))
+ return ReturnOrYield(t, x);
+
+ n = new Node(t, { type: ASSIGN });
+ lhs = ConditionalExpression(t, x);
+
+ if (!t.match(ASSIGN)) {
+ return lhs;
+ }
+
+ n.blockComment = t.lastBlockComment();
+
+ switch (lhs.type) {
+ case OBJECT_INIT:
+ case ARRAY_INIT:
+ lhs.destructuredNames = checkDestructuring(t, x, lhs);
+ // FALL THROUGH
+ case IDENTIFIER: case DOT: case INDEX: case CALL:
+ break;
+ default:
+ throw t.newSyntaxError("Bad left-hand side of assignment");
+ break;
+ }
+
+ n.assignOp = lhs.assignOp = t.token.assignOp;
+ n.push(lhs);
+ n.push(AssignExpression(t, x));
+
+ return n;
+ }
+
+ function ConditionalExpression(t, x) {
+ var n, n2;
+
+ n = OrExpression(t, x);
+ if (t.match(HOOK)) {
+ n2 = n;
+ n = new Node(t, { type: HOOK });
+ n.push(n2);
+ /*
+ * Always accept the 'in' operator in the middle clause of a ternary,
+ * where it's unambiguous, even if we might be parsing the init of a
+ * for statement.
+ */
+ n.push(AssignExpression(t, x.update({ inForLoopInit: false })));
+ if (!t.match(COLON))
+ throw t.newSyntaxError("missing : after ?");
+ n.push(AssignExpression(t, x));
+ }
+
+ return n;
+ }
+
+ function OrExpression(t, x) {
+ var n, n2;
+
+ n = AndExpression(t, x);
+ while (t.match(OR)) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(AndExpression(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function AndExpression(t, x) {
+ var n, n2;
+
+ n = BitwiseOrExpression(t, x);
+ while (t.match(AND)) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(BitwiseOrExpression(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function BitwiseOrExpression(t, x) {
+ var n, n2;
+
+ n = BitwiseXorExpression(t, x);
+ while (t.match(BITWISE_OR)) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(BitwiseXorExpression(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function BitwiseXorExpression(t, x) {
+ var n, n2;
+
+ n = BitwiseAndExpression(t, x);
+ while (t.match(BITWISE_XOR)) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(BitwiseAndExpression(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function BitwiseAndExpression(t, x) {
+ var n, n2;
+
+ n = EqualityExpression(t, x);
+ while (t.match(BITWISE_AND)) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(EqualityExpression(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function EqualityExpression(t, x) {
+ var n, n2;
+
+ n = RelationalExpression(t, x);
+ while (t.match(EQ) || t.match(NE) ||
+ t.match(STRICT_EQ) || t.match(STRICT_NE)) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(RelationalExpression(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function RelationalExpression(t, x) {
+ var n, n2;
+
+ /*
+ * Uses of the in operator in shiftExprs are always unambiguous,
+ * so unset the flag that prohibits recognizing it.
+ */
+ var x2 = x.update({ inForLoopInit: false });
+ n = ShiftExpression(t, x2);
+ while ((t.match(LT) || t.match(LE) || t.match(GE) || t.match(GT) ||
+ (!x.inForLoopInit && t.match(IN)) ||
+ t.match(INSTANCEOF))) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(ShiftExpression(t, x2));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function ShiftExpression(t, x) {
+ var n, n2;
+
+ n = AddExpression(t, x);
+ while (t.match(LSH) || t.match(RSH) || t.match(URSH)) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(AddExpression(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function AddExpression(t, x) {
+ var n, n2;
+
+ n = MultiplyExpression(t, x);
+ while (t.match(PLUS) || t.match(MINUS)) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(MultiplyExpression(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function MultiplyExpression(t, x) {
+ var n, n2;
+
+ n = UnaryExpression(t, x);
+ while (t.match(MUL) || t.match(DIV) || t.match(MOD)) {
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(UnaryExpression(t, x));
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function UnaryExpression(t, x) {
+ var n, n2, tt;
+
+ switch (tt = t.get(true)) {
+ case DELETE: case VOID: case TYPEOF:
+ case NOT: case BITWISE_NOT: case PLUS: case MINUS:
+ if (tt === PLUS)
+ n = new Node(t, { type: UNARY_PLUS });
+ else if (tt === MINUS)
+ n = new Node(t, { type: UNARY_MINUS });
+ else
+ n = new Node(t);
+ n.push(UnaryExpression(t, x));
+ break;
+
+ case INCREMENT:
+ case DECREMENT:
+ // Prefix increment/decrement.
+ n = new Node(t);
+ n.push(MemberExpression(t, x, true));
+ break;
+
+ default:
+ t.unget();
+ n = MemberExpression(t, x, true);
+
+ // Don't look across a newline boundary for a postfix {in,de}crement.
+ if (t.tokens[(t.tokenIndex + t.lookahead - 1) & 3].lineno ===
+ t.lineno) {
+ if (t.match(INCREMENT) || t.match(DECREMENT)) {
+ n2 = new Node(t, { postfix: true });
+ n2.push(n);
+ n = n2;
+ }
+ }
+ break;
+ }
+
+ return n;
+ }
+
+ function MemberExpression(t, x, allowCallSyntax) {
+ var n, n2, name, tt;
+
+ if (t.match(NEW)) {
+ n = new Node(t);
+ n.push(MemberExpression(t, x, false));
+ if (t.match(LEFT_PAREN)) {
+ n.type = NEW_WITH_ARGS;
+ n.push(ArgumentList(t, x));
+ }
+ } else {
+ n = PrimaryExpression(t, x);
+ }
+
+ while ((tt = t.get()) !== END) {
+ switch (tt) {
+ case DOT:
+ n2 = new Node(t);
+ n2.push(n);
+ n2.push(IdentifierName(t));
+ break;
+
+ case LEFT_BRACKET:
+ n2 = new Node(t, { type: INDEX });
+ n2.push(n);
+ n2.push(Expression(t, x));
+ t.mustMatch(RIGHT_BRACKET);
+ break;
+
+ case LEFT_PAREN:
+ if (allowCallSyntax) {
+ n2 = new Node(t, { type: CALL });
+ n2.push(n);
+ n2.push(ArgumentList(t, x));
+ break;
+ }
+
+ // FALL THROUGH
+ default:
+ t.unget();
+ return n;
+ }
+
+ n = n2;
+ }
+
+ return n;
+ }
+
+ function ArgumentList(t, x) {
+ var n, n2;
+
+ n = new Node(t, { type: LIST });
+ if (t.match(RIGHT_PAREN, true))
+ return n;
+ do {
+ n2 = AssignExpression(t, x);
+ if (n2.type === YIELD && !n2.parenthesized && t.peek() === COMMA)
+ throw t.newSyntaxError("Yield expression must be parenthesized");
+ if (t.match(FOR)) {
+ n2 = GeneratorExpression(t, x, n2);
+ if (n.children.length > 1 || t.peek(true) === COMMA)
+ throw t.newSyntaxError("Generator expression must be parenthesized");
+ }
+ n.push(n2);
+ } while (t.match(COMMA));
+ t.mustMatch(RIGHT_PAREN);
+
+ return n;
+ }
+
+ function PrimaryExpression(t, x) {
+ var n, n2, tt = t.get(true);
+
+ switch (tt) {
+ case FUNCTION:
+ n = FunctionDefinition(t, x, false, EXPRESSED_FORM);
+ break;
+
+ case LEFT_BRACKET:
+ n = new Node(t, { type: ARRAY_INIT });
+ while ((tt = t.peek(true)) !== RIGHT_BRACKET) {
+ if (tt === COMMA) {
+ t.get();
+ n.push(null);
+ continue;
+ }
+ n.push(AssignExpression(t, x));
+ if (tt !== COMMA && !t.match(COMMA))
+ break;
+ }
+
+ // If we matched exactly one element and got a FOR, we have an
+ // array comprehension.
+ if (n.children.length === 1 && t.match(FOR)) {
+ n2 = new Node(t, { type: ARRAY_COMP,
+ expression: n.children[0],
+ tail: ComprehensionTail(t, x) });
+ n = n2;
+ }
+ t.mustMatch(RIGHT_BRACKET);
+ break;
+
+ case LEFT_CURLY:
+ var id, fd;
+ n = new Node(t, { type: OBJECT_INIT });
+
+ object_init:
+ if (!t.match(RIGHT_CURLY)) {
+ do {
+ tt = t.get();
+ if ((t.token.value === "get" || t.token.value === "set") &&
+ t.peek() === IDENTIFIER) {
+ if (x.ecma3OnlyMode)
+ throw t.newSyntaxError("Illegal property accessor");
+ n.push(FunctionDefinition(t, x, true, EXPRESSED_FORM));
+ } else {
+ var comments = t.blockComments;
+ switch (tt) {
+ case IDENTIFIER: case NUMBER: case STRING:
+ id = new Node(t, { type: IDENTIFIER });
+ break;
+ case RIGHT_CURLY:
+ if (x.ecma3OnlyMode)
+ throw t.newSyntaxError("Illegal trailing ,");
+ break object_init;
+ default:
+ if (t.token.value in definitions.keywords) {
+ id = new Node(t, { type: IDENTIFIER });
+ break;
+ }
+ throw t.newSyntaxError("Invalid property name");
+ }
+ if (t.match(COLON)) {
+ n2 = new Node(t, { type: PROPERTY_INIT });
+ n2.push(id);
+ n2.push(AssignExpression(t, x));
+ n2.blockComments = comments;
+ n.push(n2);
+ } else {
+ // Support, e.g., |var {x, y} = o| as destructuring shorthand
+ // for |var {x: x, y: y} = o|, per proposed JS2/ES4 for JS1.8.
+ if (t.peek() !== COMMA && t.peek() !== RIGHT_CURLY)
+ throw t.newSyntaxError("missing : after property");
+ n.push(id);
+ }
+ }
+ } while (t.match(COMMA));
+ t.mustMatch(RIGHT_CURLY);
+ }
+ break;
+
+ case LEFT_PAREN:
+ n = ParenExpression(t, x);
+ t.mustMatch(RIGHT_PAREN);
+ n.parenthesized = true;
+ break;
+
+ case LET:
+ n = LetBlock(t, x, false);
+ break;
+
+ case NULL: case THIS: case TRUE: case FALSE:
+ case IDENTIFIER: case NUMBER: case STRING: case REGEXP:
+ n = new Node(t);
+ break;
+
+ default:
+ n = new Node(t);
+ // don't throw an error by default. Just make it a node and forget it :-}
+ //throw t.newSyntaxError("missing operand");
+ break;
+ }
+
+ return n;
+ }
+
+ /*
+ * parse :: (source, filename, line number) -> node
+ */
+ function parse(s, f, l) {
+ var t = new lexer.Tokenizer(s, f, l);
+ var n = Script(t, false, false);
+ if (!t.done)
+ throw t.newSyntaxError("Syntax error");
+
+ return n;
+ }
+
+ /*
+ * parseStdin :: (source, {line number}, string, (string) -> boolean) -> program node
+ */
+ function parseStdin(s, ln, prefix, isCommand) {
+ // the special .begin command is only recognized at the beginning
+ if (s.match(/^[\s]*\.begin[\s]*$/)) {
+ ++ln.value;
+ return parseMultiline(ln, prefix);
+ }
+
+ // commands at the beginning are treated as the entire input
+ if (isCommand(s.trim()))
+ s = "";
+
+ for (;;) {
+ try {
+ var t = new lexer.Tokenizer(s, "stdin", ln.value);
+ var n = Script(t, false, false);
+ ln.value = t.lineno;
+ return n;
+ } catch (e) {
+ if (!t.unexpectedEOF)
+ throw e;
+
+ // commands in the middle are not treated as part of the input
+ var more;
+ do {
+ if (prefix)
+ putstr(prefix);
+ more = readline();
+ if (!more)
+ throw e;
+ } while (isCommand(more.trim()));
+
+ s += "\n" + more;
+ }
+ }
+ }
+
+ /*
+ * parseMultiline :: ({line number}, string | null) -> program node
+ */
+ function parseMultiline(ln, prefix) {
+ var s = "";
+ for (;;) {
+ if (prefix)
+ putstr(prefix);
+ var more = readline();
+ if (more === null)
+ return null;
+ // the only command recognized in multiline mode is .end
+ if (more.match(/^[\s]*\.end[\s]*$/))
+ break;
+ s += "\n" + more;
+ }
+ var t = new lexer.Tokenizer(s, "stdin", ln.value);
+ var n = Script(t, false, false);
+ ln.value = t.lineno;
+ return n;
+ }
+
+ return {
+ parse: parse,
+ parseStdin: parseStdin,
+ Node: Node,
+ SyntheticNode: SyntheticNode,
+ DECLARED_FORM: DECLARED_FORM,
+ EXPRESSED_FORM: EXPRESSED_FORM,
+ STATEMENT_FORM: STATEMENT_FORM,
+ Tokenizer: lexer.Tokenizer,
+ FunctionDefinition: FunctionDefinition,
+ Module: Module,
+ Export: Export
+ };
+
+}());
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/narcissus_parse.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/narcissus_parse.js
new file mode 100644
index 0000000..d5565e8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/chrome_worker/narcissus_parser/narcissus_parse.js
@@ -0,0 +1,58 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * narcissus_parse.js
+ *
+ * A chrome worker that we keep working for the duration
+ * of the session.
+ *
+ * It takes about 10-12M in memory when not actively running, and it
+ * is much faster than reloading the Narcissus scripts for every
+ * script.
+ *
+ */
+
+importScripts('./jsdefs.js', './jslex.js', './jsparse.js');
+
+self.onmessage = function (event) {
+
+ if (event.data === 'stop') {
+ // destroy chrome worker.
+ self.close();
+ return;
+ }
+
+ var obj = JSON.parse(event.data),
+ tree;
+
+// try {
+ tree = new Narcissus.parser.parse(obj.code);
+ self.postMessage({'tree': tree, 'hash': obj.hash});
+/* } catch (x) {
+ // error with parsing. Delete all.
+ self.postMessage({'hash': obj.hash});
+ }
+ */
+ tree = null;
+ obj = null;
+
+};
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/contact_finder.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/contact_finder.js
new file mode 100644
index 0000000..cbdfb39
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/contact_finder.js
@@ -0,0 +1,465 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var contactFinder = {
+
+ // initial full list of links
+ // on a page.
+ pageLinks:null,
+
+ // arrays of links.
+ certainLinks: null,
+ probableLinks: null,
+ uncertainLinks: null,
+
+ // if not page worker,
+ // then allow to trigger a page worker.
+ isPageWorker: false,
+
+ // keep track of links already visited.
+ visitedLinks: {},
+
+ // keep track of the hostname of the original page.
+ originalHostname: null,
+
+ init: function (isPageWorker) {
+
+ if (isPageWorker) {
+
+ this.isPageWorker = true;
+ console.debug('visiting', document.location.href);
+ }
+
+ this.convertStringToRegexp();
+
+ },
+
+ /**
+ * searchForContactLink Main interface method to call from outside
+ * the object.
+ */
+ searchForContactLink: function (originalUrl) {
+
+ // find hostname of original page.
+ this.originalHostname = this.getHostname(originalUrl);
+
+ // initialize arrays of links to keep.
+ this.certainLinks = [];
+ this.probableLinks = [];
+ this.uncertainLinks = [];
+
+ // select all a tags.
+ this.pageLinks = $('a').get();
+
+ this.searchForUSPhoneNumber($('body').text());
+
+ // run through list of links.
+ this.processLinks();
+ },
+
+ /**
+ * loopThroughLanguages
+ * Select strings for all languages.
+ */
+ loopThroughLanguages: function (callback) {
+ var le;
+
+ for (var language in contactStr) {
+ for (var degree in contactStr[language]) {
+ le = contactStr[language][degree].length;
+ callback(degree, contactStr[language][degree], le);
+ }
+ }
+
+ },
+
+ /**
+ * convertStringToRegexp
+ *
+ */
+ convertStringToRegexp: function () {
+
+ var regexpList, i, le;
+
+ this.loopThroughLanguages(function (degreeName, arr, le) {
+
+ for (i = 0; i < le; i++) {
+ arr[i] = new RegExp(arr[i], 'i');
+ }
+
+ });
+
+ },
+
+ /**
+ * processLinks
+ *
+ * Run through the list of links in a page
+ * and call the method that checks the regexs
+ * for each of them.
+ *
+ */
+ processLinks: function () {
+
+ var start = Date.now();
+ var currentLink;
+
+ while (this.pageLinks.length) {
+
+ currentLink = this.pageLinks.pop();
+
+ if (currentLink !== undefined) {
+
+ this.matchContact(currentLink);
+
+ }
+
+ var end = Date.now();
+
+ if (this.pageLinks.length) {
+
+ if ((end - start) > 8) {
+
+ setTimeout(this.processLinks.bind(this), 100);
+ return;
+
+ }
+
+ }
+
+ else if (this.isPageWorker) {
+
+ self.postMessage({event: 'destroy'});
+ return;
+
+ }
+
+
+ }
+
+
+
+
+ },
+
+ /**
+ * searchForUSPhoneNumber
+ *
+ */
+ searchForUSPhoneNumber: function (str) {
+ var phoneMatch, phone;
+ var regClutter = /[\(\)\-\. ]+/gm;
+
+ while ((phoneMatch = usaPhoneNumber.exec(str)) !== null) {
+
+ phone = $.trim(phoneMatch).replace(regClutter, '-').replace(/^\-/, '');
+ phone = phone.replace(/[^0-9]$/, '');
+
+ self.postMessage(
+ { event: linkTypes.PHONE_NUMBER_FOUND,
+ contact: {
+ 'label': phone,
+ 'link': 'javascript:void("' + phone + '")' }
+ }
+ );
+ }
+ },
+
+ /**
+ * searchForSocialMedia
+ *
+ * Match a Twitter or identi.ca url.
+ *
+ */
+ searchForSocialMedia: function (link) {
+
+ var elem = $(link),
+ eventType;
+
+ var text = this.notEmptyOrUri(link);
+
+ if (reTwitter.test(elem.attr('href'))) {
+ eventType = linkTypes.TWITTER_LINK_FOUND;
+ }
+
+ else if (reIdentiCa.test(elem.attr('href'))) {
+ eventType = linkTypes.IDENTICA_LINK_FOUND;
+ }
+
+ if (eventType) {
+ self.postMessage(
+ { event: eventType,
+ contact: {
+ 'label': text,
+ 'link': elem.attr('href')}
+ }
+ );
+ return true;
+ }
+
+ return false;
+ },
+
+ /**
+ * notEmptyOrUri
+ *
+ * If link has text, use it, if not,
+ * then return uri.
+ *
+ */
+ notEmptyOrUri: function (link) {
+
+ var elem = $(link);
+
+ if (/([^\s]*)]/.test(elem.text())) {
+ // contains something else than just space.
+ // It is valid.
+ return elem.text();
+
+ } else {
+
+ return link.href;
+
+ }
+
+ },
+
+ /**
+ * searchForContactEmail
+ *
+ * Sends a particular message if a matching email
+ * is found.
+ *
+ */
+ searchForContactEmail: function (link) {
+
+ var elem = $(link),
+ eventType;
+
+ if (reEmail.test(elem.attr('href'))) {
+ console.debug('found an email address', elem.attr('href'));
+ if (this.isSameHostname(elem.attr('href'))) {
+ // this is a good email with same hostname, priceless!
+ eventType = linkTypes.CERTAIN_EMAIL_ADDRESS_FOUND;
+ } else {
+ // not the same hostname... we'll keep it just in case.
+ eventType = linkTypes.UNCERTAIN_EMAIL_ADDRESS_FOUND;
+ }
+
+ } else if (reAnyEmail.test(elem.attr('href'))) {
+
+ if (this.isSameHostname(elem.attr('href'))) {
+ eventType = linkTypes.UNCERTAIN_EMAIL_ADDRESS_FOUND;
+ }
+
+ }
+ if (eventType) {
+ // we found an email address.
+ // send message with whatever event type was found.
+ self.postMessage({event: eventType,
+ contact: {
+ 'label': elem.attr('href').replace('mailto:', ''),
+ 'link': elem.attr('href')}
+ });
+ return true;
+
+ }
+ else {
+ // not an email address.
+ return false;
+ }
+
+ },
+
+ /**
+ * matchContact
+ *
+ * Loop through the regexp and try to find a match.
+ *
+ */
+ matchContact: function (currentLink) {
+
+ // search for an email address.
+ if (this.searchForContactEmail(currentLink)) {
+ return true;
+ }
+ if (this.searchForSocialMedia(currentLink)) {
+ return true;
+ }
+
+ // check all contact link strings.
+ this.matchContactLink(currentLink);
+
+ // this link is worth nothing.
+ //return false;
+
+ },
+
+ /**
+ * matchContactLink
+ *
+ * loop through regexp for a contact link.
+ * And send a message to trigger a page worker
+ * if not currently a page worker.
+ *
+ */
+ matchContactLink: function (currentLink) {
+
+ var that = this;
+
+ this.loopThroughLanguages(
+ function (degreeName, arr, le) {
+
+ var text, j, href;
+
+ for (j = 0; j < le; j++) {
+
+ text = $(currentLink).text();
+ href = currentLink.href;
+
+ if (arr[j].test(text)) {
+
+ if (degreeName === 'certain') {
+
+ self.postMessage(
+ { event: linkTypes.CERTAIN_LINK_FOUND,
+ contact: {
+ 'label': text,
+ 'link': href}
+ }
+ );
+
+ if (!that.isPageWorker) {
+ that.complaintSearch(linkTypes.CERTAIN_LINK_FOUND, href);
+ }
+
+
+ } else if (degreeName === 'probable'){
+
+ self.postMessage(
+ { event: linkTypes.PROBABLE_LINK_FOUND,
+ contact: {
+ 'label': text,
+ 'link': href}
+ }
+ );
+
+ if (!that.isPageWorker) {
+ that.complaintSearch(linkTypes.PROBABLE_LINK_FOUND, href);
+ }
+
+ } else if (degreeName === 'uncertain') {
+
+ self.postMessage(
+ { event: linkTypes.UNCERTAIN_LINK_FOUND,
+ contact: {
+ 'label': text,
+ 'link': href}
+ }
+ );
+
+
+ if (!that.isPageWorker) {
+ that.complaintSearch(linkTypes.UNCERTAIN_LINK_FOUND, href);
+ }
+ }
+ }
+
+ }
+ });
+
+ },
+
+ /**
+ * complaintSearch
+ * returns to ui_info a link to open.
+ */
+ complaintSearch: function (linkType, link) {
+
+ console.debug('the complaint search url is', link);
+
+ if (!this.isEmailLink(link)) {
+
+ // we don't want to "visit" mailto links.
+ self.postMessage({event: 'complaintSearch',
+ urlSearch: {'type': linkType, 'linkValue': link}
+ });
+
+ }
+ },
+
+ /**
+ * getHostname
+ * small regex taken from
+ * http://beardscratchers.com/journal/using-javascript-to-get-the-hostname-of-a-url
+ * to extract hostname from url.
+ * do not consider www as subdomain.
+ *
+ */
+ getHostname: function (str) {
+
+ // remove www, but not other kind of subdomains (which most likely
+ // may not be the same site than the domain itself.)
+ str = this.removeWWW(str);
+ var urlHostname = /^(?:f|ht)tp(?:s)?\:\/\/([^\/]+)/im;
+ var emailHostname = /^mailto:[A-Z0-9\.\_\+\-]+\@([A-Z0-9\.\-]+\.[A-Z]{2,6})$/im;
+ var match1 = urlHostname.exec(str);
+ var match2 = emailHostname.exec(str);
+
+ if (match1) {
+ return match1[1];
+ }
+ else if (match2) {
+ return match2[1];
+ }
+
+ // no match.
+ return false;
+
+ },
+
+ /**
+ * isSameHostname
+ *
+ * Checks a link has the same hostname than the original url.
+ *
+ */
+ isSameHostname: function (url) {
+
+ return this.getHostname(url) === this.originalHostname;
+
+ },
+
+ /**
+ * remove www from hostname.
+ */
+ removeWWW: function (str) {
+
+ return str.replace("www.", "", 'i');
+
+ },
+
+ isEmailLink: function (str) {
+
+ return /^mailto:/i.test(str);
+
+ }
+
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/contact_regex.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/contact_regex.js
new file mode 100644
index 0000000..e797b5e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/contact_regex.js
@@ -0,0 +1,49 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+// email address regexp
+var reEmail = /^mailto\:(admin|feedback|webmaster|info|contact|support|comments|team|help)\@[a-z0-9.\-]+\.[a-z]{2,4}$/i;
+
+var reAnyEmail = /^mailto\:.*?\@[a-z0-9\.\-]+\.[a-z]{2,4}$/i;
+
+// twitter address regexp
+var reTwitter = /twitter\.com\/(\!?#\/)?[a-z0-9]*/i;
+
+// identi.ca address regexp
+var reIdentiCa = /identi\.ca\/(?!notice\/)[a-z0-9]*/i;
+
+/**
+ * contactSearchStrings
+ * Contains arrays of strings classified by language
+ * and by degree of certainty.
+ */
+var contactStr = {
+ 'english': {
+ 'certain': ['^[\s]*Contact Us[\s]*$', '^[\s]*Email Us[\s]*$', '^[\s]*Contact[\s]*$', '^[\s]*Feedback[\s]*$', '^[\s]*Web.?site Feedback[\s]*$'],
+ 'probable': ['^[\s]Contact', '^[\s]*Email'],
+ 'uncertain': ['^[\s]*About Us', '^[\s]*About', 'Who we are', 'Who I am', 'Company Info', 'Customer Service']
+ },
+ 'french': {
+ 'certain': ['^[\s]*Contactez nous[\s]*$', '^[\s]*(Nous )?contacter[\s]*$', '^[\s]*Email[\s]*$', '^[\s]*Contact[\s]*$', '^[\s]*Commentaires[\s]*$'],
+ 'probable': ['^[\s]Contact', '^[\s]*Email'],
+ 'uncertain': ['^[\s]*(A|À) propos', 'Qui nous sommes', 'Qui suis(-| )?je', 'Info', 'Service Client(e|è)le']
+ },
+};
+
+var usaPhoneNumber = /(?:\+ ?1 ?)?\(?[2-9]{1}[0-9]{2}\)?(?:\-|\.| )?[0-9]{3}(?:\-|\.| )[0-9]{4}(?:[^0-9])/mg; \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/link_types.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/link_types.js
new file mode 100644
index 0000000..fefd4fd
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/link_types.js
@@ -0,0 +1,42 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var linkTypes = {
+
+ // constants. Also available in lib/ui_info.js
+ 'CERTAIN_EMAIL_ADDRESS_FOUND': 'certainEmailAddressFound',
+ 'UNCERTAIN_EMAIL_ADDRESS_FOUND': 'uncertainEmailAddressFound',
+
+ // Looking for contact links
+ 'CERTAIN_LINK_FOUND': 'certainLinkFound',
+ 'PROBABLE_LINK_FOUND': 'probableLinkFound',
+ 'UNCERTAIN_LINK_FOUND': 'uncertainLinkFound',
+ 'LINK_NOT_FOUND': 'contactLinkNotFound',
+
+ // Looking for identi.ca and twitter accounts.
+ 'TWITTER_LINK_FOUND': 'twitterLinkFound',
+ 'IDENTICA_LINK_FOUND': 'identicaLinkFound',
+
+ // phone number and address
+ 'PHONE_NUMBER_FOUND': 'phoneNumberFound',
+ 'SNAIL_ADDRESS_FOUND': 'snailAddressFound'
+
+};
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/pagemod_finder.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/pagemod_finder.js
new file mode 100644
index 0000000..036f5f6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/pagemod_finder.js
@@ -0,0 +1,291 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+var pageModFinder = {
+
+
+ image: null,
+
+ stylesheet: null,
+
+ button: null,
+
+ displayPanel: false,
+
+ links: null,
+
+ box: null,
+
+ infoBox: null,
+
+ init: function () {
+
+ var that = this, le;
+
+ this.links = [];
+
+
+ self.on('message', function (respData) {
+
+ if (respData.event === 'assets-uri') {
+ that.setComplaintPanel(respData.value);
+ }
+
+ else if (respData.event === 'page-url') {
+
+ // search for contact list. Top level.
+ contactFinder.init();
+ //console.debug('page url is', respData.value);
+ contactFinder.searchForContactLink(respData.value);
+
+ }
+
+ else if (respData.contact !== undefined){
+ that.displayLinkByPriority(respData);
+ }
+ });
+
+ },
+
+ /**
+ * setComplaintPanel
+ *
+ * Create complaint panel and assign properties to the
+ * dom elements.
+ *
+ */
+ setComplaintPanel: function (uri) {
+
+ // provide uri of stylesheet
+ this.stylesheet = uri + 'css/style.css';
+
+ // add stylesheet.
+ $('head').append($('<link/>').attr({'rel': 'stylesheet',
+ 'href': this.stylesheet,
+ 'type': 'text/css'}));
+
+ $('body').prepend('<div id="librejs-complaint-box" style="display:none">' +
+ '\n\n ' +
+ '<a id="librejs-tab-button" href="#" title="LibreJS -- Complain to this site">LibreJS -- Complain to this site.</a>' +
+ '\n\n ' +
+ '<div id="librejs-complaint-info">' +
+ '\n\n ' +
+ '<h1 title="Nonfree JavaScript -- Complain">\n Nonfree JavaScript Complain\n </h1>' +
+ '\n\n' +
+ '<p id="librejs-time-mention">Searching for contact links in this website...</p>' +
+ '\n\n' +
+ '<div id="librejs-complaint-info-text">' +
+
+ '<h2>Emails you should use</h2>' +
+ '<ul id="librejs-certain-emails"></ul>' +
+
+ '<h2>Non-webmaster Emails you might want to use</h2>' +
+ '<ul id="librejs-uncertain-emails"></ul>' +
+
+ '<h2>Contact form or useful Contact Information</h2>' +
+ '<ul id="librejs-certain-links"></ul>' +
+
+ '<h2>Twitter Links</h2>' +
+ '<ul id="librejs-twitter-links"></ul>' +
+
+ '<h2>Identi.ca Links</h2>' +
+ '<ul id="librejs-identica-links"></ul>' +
+
+ '<h2>May be of interest</h2>' +
+ '<ul id="librejs-uncertain-links"></ul>' +
+
+ '<h2>May be of interest</h2>' +
+ '<ul id="librejs-probable-links"></ul>' +
+
+ '<h2>Phone Numbers</h2>' +
+ '<ul id="librejs-phone-numbers"></ul>' +
+
+ '<h2>Snail Mail Addresses</h2>' +
+ '<ul id="librejs-snail-addresses"></ul>' +
+ '</div>' +
+ ' </div></div>');
+
+ // main elements of the complaint panel.
+ this.infoBox = $('#librejs-complaint-info');
+ this.infoBoxText = $('#librejs-complaint-info-text');
+
+ // all lists.
+ this.certainEmails = $("#librejs-certain-emails");
+ this.uncertainEmails = $("#librejs-uncertain-emails");
+ this.certainLinks = $("#librejs-certain-links");
+ this.uncertainLinks = $("#librejs-uncertain-links");
+ this.probableLinks = $("#librejs-probable-links");
+ this.twitterLinks = $("#librejs-twitter-links");
+ this.identicaLinks = $("#librejs-identica-links");
+ this.phoneNumbers = $("#librejs-phone-numbers");
+ this.snailAddresses = $("#librejs-snail-addresses");
+
+ this.button = $('#librejs-tab-button');
+ this.box = $('#librejs-complaint-box');
+
+ this.infoBox.height(window.innerHeight / 1.3);
+ this.infoBoxText.height(this.infoBox.height() - 150);
+
+ },
+
+
+ /**
+ *
+ * displayLinkByPriority
+ *
+ * Place the link in the correct list depending
+ * on the correct
+ */
+ displayLinkByPriority: function (respData) {
+
+ // we have a link to show. Add it to the button.
+ // first time finalLinkFound is triggered.
+ if (this.displayPanel === false) {
+
+ this.addComplaintOverlay();
+ this.displayPanel = true;
+ this.hideBox(true);
+ }
+
+ // check link isn't already added.
+ if (respData.contact !== undefined &&
+ !this.isInLinks(respData.contact.link)) {
+
+ // push link to list.
+ le = this.links.push(respData);
+
+ // making sure this is the latest link added.
+ this.addALinkToPanel(this.links[le -1]);
+
+ }
+
+
+ },
+
+ isInLinks: function (searchValue) {
+ var i = 0,
+ le = this.links.length;
+
+ for (; i < le; i++) {
+
+ if (this.links[i].contact.link.replace(/\/$/, '') === searchValue.replace(/\/$/, '')) {
+ return true;
+ }
+ }
+
+ // no match has been found.
+ return false;
+
+ },
+
+ /**
+ * addALinkToPanel
+ *
+ * Check the type of link and place it in the
+ * appropriate list in the complaint panel.
+ *
+ */
+ addALinkToPanel: function (link) {
+
+ var listElem;
+
+ switch (link.event) {
+
+ case linkTypes.CERTAIN_EMAIL_ADDRESS_FOUND:
+ listElem = this.certainEmails;
+ break;
+
+ case linkTypes.UNCERTAIN_EMAIL_ADDRESS_FOUND:
+ listElem = this.uncertainEmails;
+ break;
+
+ case linkTypes.CERTAIN_LINK_FOUND:
+ listElem = this.certainLinks;
+ break;
+
+ case linkTypes.PROBABLE_LINK_FOUND:
+ listElem = this.probableLinks;
+ break;
+
+ case linkTypes.UNCERTAIN_LINK_FOUND:
+ listElem = this.uncertainLinks;
+ break;
+
+ case linkTypes.TWITTER_LINK_FOUND:
+ listElem = this.twitterLinks;
+ break;
+
+ case linkTypes.IDENTICA_LINK_FOUND:
+ listElem = this.identicaLinks;
+ break;
+
+ case linkTypes.PHONE_NUMBER_FOUND:
+ listElem = this.phoneNumbers;
+ break;
+
+ case linkTypes.SNAIL_ADDRESS_FOUND:
+ listElem = this.snailAddresses;
+ break;
+ }
+
+ listElem.prev('h2').css({'display': 'block'});
+ listElem.append($('<li/>').append($('<a/>').attr({'href': link.contact.link,
+ 'target': '_blank'}).text(link.contact.label)));
+
+
+ },
+
+ addComplaintOverlay: function () {
+ var that = this;
+
+ this.button.bind('mouseenter', function () { that.showBox(); });
+
+ this.box.bind('mouseleave', function () { that.hideBox(); });
+
+ this.button.bind('focus', function () { that.showBox(); });
+ this.box.bind('blur', function () { that.hideBox(); });
+
+ this.box.css({'display': 'block'});
+
+ //this.hideBox(true);
+ },
+
+ showBox: function () {
+ this.box.stop().animate({
+ right: '-5px'
+ }, {queue: false, duration: 1500, easing: 'easeInOutQuart'});
+ },
+
+ hideBox: function (hint) {
+ var rightMargin = '-550px';
+
+ if (hint) {
+ rightMargin = '-530px';
+ }
+
+ this.box.stop().delay(10000).animate({
+ right: rightMargin
+ }, {queue:false, duration: 1500, easing: 'easeInOutQuart'});
+
+ }
+
+
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/worker_finder.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/worker_finder.js
new file mode 100644
index 0000000..2cda32e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/complain/worker_finder.js
@@ -0,0 +1,35 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var workerFinder = {
+
+ init: function () {
+
+ var that = this;
+ console.debug('searching with pageworker');
+
+ contactFinder.init(true);
+ contactFinder.searchForContactLink(window.location.href);
+
+ }
+
+};
+
+workerFinder.init();
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/README b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/README
new file mode 100644
index 0000000..e442861
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/README
@@ -0,0 +1,21 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+All images in this directory are free, released under the GPLv3 or later. \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/background-panel.jpg b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/background-panel.jpg
new file mode 100644
index 0000000..67f56a9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/background-panel.jpg
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/display-panel.html b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/display-panel.html
new file mode 100644
index 0000000..4ae7cde
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/display-panel.html
@@ -0,0 +1,56 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>Display JS Monitoring Panel</title>
+<link rel="stylesheet" type="text/css" href="./panel-styles.css"/>
+
+<!-- /**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+-->
+</head>
+
+<body>
+
+
+<a class="libre" id="ljs-settings" href="javascript:void"><h1 class="libre">LibreJS</h1></a>
+
+<div id='info'>
+
+<div id="dryrun">
+<h2 class="dryrun-js"></h2>
+<ul class="dryrun-js"></ul>
+</div>
+
+<div id="accepted">
+<h2 class="accepted-js"></h2>
+<ul class="accepted-js"></ul>
+</div>
+
+<div id="blocked">
+<h2 class="blocked-js"></h2>
+<ul class="blocked-js">
+</div>
+
+</ul>
+
+</div>
+</body>
+</html>
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/librejs-title-old.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/librejs-title-old.png
new file mode 100644
index 0000000..8a11527
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/librejs-title-old.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/librejs-title.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/librejs-title.png
new file mode 100644
index 0000000..c1a911c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/librejs-title.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/panel-styles.css b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/panel-styles.css
new file mode 100644
index 0000000..66b0696
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/content/panel-styles.css
@@ -0,0 +1,177 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+html {
+ padding:10px;
+ color:#000 !important;
+ background:url('background-panel.jpg') !important;
+}
+document {
+ padding:10px;
+}
+body {
+ padding:10px;
+ font-size:67.5%;
+ overflow-x:hidden;
+ overflow-y:visible;
+ color:#000;
+}
+
+.libre {
+ width:230px;
+ height:104px;
+ display:block;
+}
+h1.libre {
+ font-size:1.5em;
+ font-weight:normal;
+ font-family:Arial;
+ margin:-20px 0 0 0;
+ padding:0;
+ font-weight:bold;
+ background:url('librejs-title.png') no-repeat top left;
+ text-indent:-1000px;
+ overflow:hidden;
+}
+h2 {
+ font-size:1.5em;
+ font-weight:bold;
+ font-family:arial;
+ border-bottom:4px solid #444;
+ padding-bottom:0;
+ margin:30px 0 0 0;
+ width:710px;
+ line-height:140%;
+}
+code {
+ font-size:1.2em;
+ margin:0;
+ padding:0;
+}
+ul {
+ margin:0;
+ padding:0;
+ list-style:none;
+}
+ul.blocked-js li, ul.accepted-js li, ul.dryrun-js li {
+ padding:5px;
+ border-bottom:2px solid #CCC;
+ margin:0;
+ width:700px;
+}
+
+ul ul {
+ margin:10px;
+ list-style:disc;
+}
+ul.blocked-js ul li, ul.accepted-js ul li, ul.dryrun-js ul li {
+ padding:5px;
+ border-bottom:0;
+ width:auto;
+}
+#info {
+ clear:both;
+}
+.button {
+ float:right;
+ padding:10px;
+ display:none;
+ clear:both;
+ margin:10px;
+}
+
+/*
+ Pure JS button styles below taken from:
+ http://webdesignerwall.com/tutorials/css3-gradient-buttons
+ */
+.button {
+ display: inline-block;
+ outline: none;
+ cursor: pointer;
+ text-align: center;
+ text-decoration: none;
+ font: 14px/100% Arial, Helvetica, sans-serif;
+ padding: .5em 2em .55em;
+ text-shadow: 0 1px 1px rgba(0,0,0,.3);
+ -webkit-border-radius: .5em;
+ -moz-border-radius: .5em;
+ border-radius: .5em;
+ -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.2);
+ -moz-box-shadow: 0 1px 2px rgba(0,0,0,.2);
+ box-shadow: 0 1px 2px rgba(0,0,0,.2);
+}
+.small.button {
+ font-size:11px;
+ padding:.5em .5em;
+ margin-top:10px;
+}
+.button:hover {
+ text-decoration: none;
+}
+.button:active {
+ position: relative;
+ top: 1px;
+}
+.orange {
+ color: #fef4e9;
+ border: solid 1px #da7c0c;
+ background: #f78d1d;
+ background: -webkit-gradient(linear, left top, left bottom, from(#faa51a), to(#f47a20));
+ background: -moz-linear-gradient(top, #faa51a, #f47a20);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#faa51a', endColorstr='#f47a20');
+}
+.orange:hover {
+ background: #f47c20;
+ background: -webkit-gradient(linear, left top, left bottom, from(#f88e11), to(#f06015));
+ background: -moz-linear-gradient(top, #f88e11, #f06015);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f88e11', endColorstr='#f06015');
+}
+.orange:active {
+ color: #fcd3a5;
+ background: -webkit-gradient(linear, left top, left bottom, from(#f47a20), to(#faa51a));
+ background: -moz-linear-gradient(top, #f47a20, #faa51a);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f47a20', endColorstr='#faa51a');
+}
+.white {
+ background: -moz-linear-gradient(center top , #FFFFFF, #EDEDED) repeat scroll 0 0 transparent;
+ border: 1px solid #B7B7B7;
+ /* color: #606060;*/
+ color:#9d0d0d;
+}
+.white:hover {
+ background: -moz-linear-gradient(center top , #FFFFFF, #DCDCDC) repeat scroll 0 0 transparent;
+}
+.white:active {
+ background: -moz-linear-gradient(center top , #EDEDED, #FFFFFF) repeat scroll 0 0 transparent;
+/*color: #999999;*/
+
+}
+
+span.accepted, span.blocked {
+ color:#008e00;
+ font-size:145%;
+ font-variant:small-caps;
+ font-weight:bold;
+}
+ul.blocked-js li {
+ overflow:hidden;
+}
+span.blocked {
+ color:#8e0000;
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/main_panel.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/main_panel.js
new file mode 100644
index 0000000..dfe2b73
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/display_panel/main_panel.js
@@ -0,0 +1,319 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+var arraySrc, pageURL, urlData;
+
+
+var displayPanel = {
+ complainButton: null,
+ button1: null,
+ button2: null,
+ pageURL: null,
+ urlData: null,
+
+ init: function () {
+ // add the buttons to the panel dynamically.
+ $('body').prepend(
+ '<a id="complain-contact" class="button white" href="#">' +
+ '<span>Complain to site owner</span>' +
+ '</a>' +
+ '<a id="allow-button" class="button white" href="#">' +
+ '<span>Allow all scripts in this page</span>' +
+ '</a>' +
+ '<a id="disallow-button" class="button white" href="#">' +
+ '<span>Block all nonfree/nontrivial scripts from this page</span>' +
+ '</a>' +
+ '<a id="open-in-tab" class="button white" href="#">' +
+ '<span>Open this report in a new tab</span>' +
+ '</a>'
+ );
+
+ // assign properties to these new elements.
+ this.complainButton = $('#complain-contact');
+ this.button1 = $('#allow-button');
+ this.button2 = $('#disallow-button');
+
+ // start listening for messages sent from modules.
+ this.messageListen();
+ this.openInNewTab();
+ this.logoClick();
+ },
+ logoClick: function () {
+ $("#ljs-settings").click(function (e) {
+ e.preventDefault();
+ self.port.emit('openSesame');
+ });
+ },
+ openInNewTab: function () {
+ $('#open-in-tab').click(function (e) {
+ console.debug("open in tab clicked");
+ try {
+ var html = $("#info").html();
+ var text = window.btoa(unescape(encodeURIComponent(html)));
+ self.port.emit('openInTab', text);
+ } catch (x) {
+ console.debug("error", x.lineNumber, x.message);
+ }
+ return false;
+ });
+
+ },
+ messageListen: function () {
+ var that = this;
+ self.on("message", function onMessage(message) {
+ that.handleMessage(message);
+ });
+ },
+
+ getHostname: function (str) {
+ var re = new RegExp('^(http(?:s)?://[^/]+)', 'im');
+ return str.match(re)[1].toString();
+ },
+
+ /**
+ * formatListScript
+ * Depending on the type of script in the item,
+ * will return a preformatted code element with
+ * on-page JavaScript or a link to an external
+ * JavaScript file.
+ */
+ formatListScript: function (item, canWhitelist) {
+ var li, pre, code, a, reason = '';
+ li = $("<li/>");
+ if (item.reason !== undefined) {
+ reason = item.reason;
+ }
+ if (item.inline === true) {
+ pre = $('<pre/>');
+ pre.css('white-space', 'pre-wrap');
+ code = $('<code/>');
+ reason_obj = $('<span class="reason"/>').text(reason);
+ code.text(item.contents);
+ code.prepend($('<br/>'));
+ code.prepend(reason_obj);
+
+ pre.append(code);
+ li.append(pre);
+ } else {
+ console.debug("item url is %s", item.url);
+ reason_obj = $('<span class="reason"/>').text(reason);
+ li.text(item.contents);
+ li.prepend($('<br/>'));
+ li.prepend(reason_obj);
+ a = $('<a/>');
+ a.attr('href', item.url);
+ a.attr('target', '_blank');
+ a.text(item.url);
+ li.append(a);
+ }
+ if (canWhitelist) {
+ li.prepend(
+ $('<a class="small button white whitelist">Whitelist</a>')
+ .data('librejs-hash', item.hash));
+ }
+ else if (item.reason.indexOf('whitelisted by user') > -1) {
+ // a hack until LibreJS version 6.1. Need to have a value attached
+ // to item.whitelisted for this.
+ li.prepend(
+ $('<a class="small button white rm-whitelist">Remove from Whitelist</a>')
+ .data('librejs-hash', item.hash));
+ }
+ return li;
+ },
+
+ resetButtons: function (message) {
+ this.complainButton.hide().unbind('click');
+ if (message.contact === undefined) {
+ this.button1.hide();
+ this.button2.hide();
+ }
+ },
+
+ siteContactFound: function (url) {
+ this.complainButton.show();
+
+ this.complainButton.bind('click',
+ function (e) {
+ e.preventDefault();
+ self.port.emit('complainButtonClicked');
+ window.open(url,'_blank');
+ });
+ },
+
+ handleMessage: function (message) {
+ var removedLen, acceptedLen;
+
+ this.resetButtons(message);
+
+ // handle complaint feature message
+ if (message.event === 'contactLinkFound' ||
+ message.event === 'uncertainLinkFound') {
+ this.siteContactFound(message.absolute);
+ return;
+ } else if (message.event === 'contactLinkNotFound') {
+ // no contact link was found.
+ this.complainButton.hide();
+ }
+
+ if (message.isAllowed !== undefined) {
+ this.button2.show();
+ } else if (message.contact === undefined) {
+ this.button1.show();
+ }
+
+ var li, code, pre, len, i;
+
+ if (message.pageURL !== undefined) {
+
+ this.button1.attr('href', message.pageURL);
+ this.button2.attr('href', message.pageURL);
+ if (message.pageURL == 'resource://jid1-ktlzuoiikvffew-at-jetpack/librejs/data/settings/index.html') {
+ message.pageURL = "LibreJS Whitelist";
+ }
+ $('#info').css({'opacity': 0});
+ $('h2.blocked-js')
+ .html("List of <span class='blocked'>blocked</span> JavaScript in " +
+ $('<div/>').text(message.pageURL).html());
+ $('#dryrun').hide();
+ $('ul.blocked-js').empty();
+ $('ul.accepted-js').empty();
+ $('ul.dryrun-js').empty();
+
+ removedLen = message.urlData.removed.length;
+ acceptedLen = message.urlData.accepted.length;
+ dryRunLen = message.urlData.dryRun.length;
+ if (dryRunLen > 0) {
+ $dryRun = $("#dryrun");
+ $dryRun.show();
+ $('h2.dryrun-js')
+ .html("List of loaded <span class='blocked'>scripts that should be blocked</span> (but were allowed by you) in " +
+ $('<div/>').text(message.pageURL).html());
+ for (i = 0; i < dryRunLen; i++) {
+ li = this.formatListScript(message.urlData.dryRun[i],
+ true);
+ $('ul.dryrun-js').append(li);
+ }
+ }
+ if (removedLen > 0) {
+ $("#blocked").insertBefore($('#accepted'));
+ for (i = 0; i < removedLen; i++) {
+ this.button1.fadeIn();
+ li = this.formatListScript(message.urlData.removed[i],
+ true);
+ $('ul.blocked-js').append(li);
+ }
+ } else {
+
+ this.button1.hide();
+
+ $('ul.blocked-js').append('<li>LibreJS did not block any script on this page: \n\n<ul><li>There may be no script on this page (check source, C-u).</li><li>All the scripts on this page may be trivial and/or free.</li><li>You may have whitelisted this domain name or url from the preferences (Type about:addons in your location bar to check)</li><li>You may have clicked the "allow all scripts" button, which causes LibreJS to load all JavaScript on a page regardless of whether it is free, trivial, nontrivial or nonfree. This policy is effective for the entire duration of a Firefox session.</li><li>If for any reason you think LibreJS should have blocked JavaScript code on this page, please report this issue to: <a id="report" href="" target="_blank">lduros@gnu.org</a></li></ul></li>');
+
+ $('#report').attr('href',
+ 'mailto:lduros@gnu.org?subject=LibreJS bug Report&body=LibreJS issue with page: ' +
+ message.pageURL);
+ }
+
+ // get accepted scripts.
+ $('h2.accepted-js')
+ .html("List of <span class='accepted'>accepted</span> JavaScript in " +
+ $('<div/>').text(message.pageURL).html());
+
+ if (acceptedLen > 0) {
+ $('#accepted').insertBefore($('#blocked'));
+ for (i = 0; i < acceptedLen; i++) {
+
+ li = this.formatListScript(message.urlData.accepted[i],
+ false);
+ $('ul.accepted-js').append(li);
+
+ }
+
+ } else {
+ $('ul.accepted-js').append(
+ '<li>LibreJS did not allow the execution of any script on this page: \n\n\'' +
+ '<ul>' +
+ '<li>There may be no script on this page (check source, C-u)</li>' +
+ '<li>The inline and on-page JavaScript code may not be free and/or may not have proper license information and external scripts (if present) may have been removed by default.</li>' +
+ '<li>External scripts may not be free and/or may not have proper licensing and are not part of the whitelist of free JavaScript libraries.</li></ul></li>');
+ }
+
+ $('#info').animate({opacity: 1});
+
+ // emit allowAllClicked when button is clicked.
+ this.button1.bind(
+ 'click',
+ function(e) {
+ console.debug('clicked allow button');
+ e.preventDefault();
+ var url = $(this).attr('href');
+
+ var urlForDisplay = (url.length > 100) ?
+ url.substr(0,100) + '…' : url;
+ var areYouSure = window.confirm(
+ "Allow all nonfree/nontrivial scripts on this page?\n\n" +
+ urlForDisplay);
+
+ if (areYouSure) {
+ self.port.emit('allowAllClicked', url);
+ }
+
+ });
+
+ this.button2.bind(
+ 'click',
+ function(e) {
+ e.preventDefault();
+ var url = $(this).attr('href');
+ self.port.emit('disallowAllClicked', url);
+ });
+ var that = this;
+ // whitelist a script
+ $('.whitelist').bind(
+ 'click',
+ function (e) {
+ e.preventDefault();
+ // get the url of the page from main button.
+ var url = that.button1.attr('href');
+ var hash = $(this).data('librejs-hash');
+ var reason = $(this).parent('li').children('.reason')
+ .text();
+ if (!reason) {
+ reason = $(this).parent('li').children('pre')
+ .find('.reason').text();
+ }
+ self.port.emit('whitelistByHash', hash, url, '', reason);
+ $(this).parent().append(
+ $('<span style="font-weight:bold"/>')
+ .text("Reload page to load script"));
+ $(this).remove();
+ });
+
+ $('.rm-whitelist').bind(
+ 'click',
+ function (e) {
+ e.preventDefault();
+ var hash = $(this).data('librejs-hash');
+ self.port.emit('removeFromWhitelistByHash', hash);
+ $(this).text("Reload page to take effect");
+ });
+ }
+ }
+};
+
+displayPanel.init();
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon-white.ico b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon-white.ico
new file mode 100644
index 0000000..c053584
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon-white.ico
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon.ico b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon.ico
new file mode 100644
index 0000000..709de01
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon.ico
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon.png
new file mode 100644
index 0000000..7c603f0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/images/gnu-icon.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/librejs-settings.html b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/librejs-settings.html
new file mode 100644
index 0000000..1292280
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/librejs-settings.html
@@ -0,0 +1,23 @@
+<!doctype html>
+<html>
+<head>
+<meta charset=utf-8 />
+<title>LibreJS - Settings</title>
+<link rel="icon"
+ type="image/icon"
+ href="images/gnu-icon.ico">
+<style>
+body {
+ background:#e3dedb;
+ color:#1b1615;
+ font-family:Sans-Serif;
+
+}
+h1 {
+ font-family:Georgia;
+}
+</style>
+</head>
+<body>
+</body>
+</html>
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/Boost-1.0.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/Boost-1.0.txt
new file mode 100644
index 0000000..36b7cd9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/Boost-1.0.txt
@@ -0,0 +1,23 @@
+Boost Software License - Version 1.0 - August 17th, 2003
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/ISC.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/ISC.txt
new file mode 100644
index 0000000..9f68299
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/ISC.txt
@@ -0,0 +1,12 @@
+Permission to use, copy, modify, and/or distribute this software for
+any purpose with or without fee is hereby granted, provided that the
+above copyright notice and this permission notice appear in all
+copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY
+SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/IntelACPI.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/IntelACPI.txt
new file mode 100644
index 0000000..8152ad6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/IntelACPI.txt
@@ -0,0 +1,116 @@
+ACPI - Software License Agreement
+
+
+Software License Agreement IMPORTANT - READ BEFORE COPYING, INSTALLING OR USING.
+
+Do not use or load this software and any associated materials
+(collectively, the "Software") until you have carefully read the
+following terms and conditions. By loading or using the Software, you
+agree to the terms of this Agreement. If you do not wish to so agree,
+do not install or use the Software.
+
+1. COPYRIGHT NOTICE Some or all of this work - Copyright © 1999-2005,
+Intel Corp. All rights reserved.
+
+2. LICENSE
+
+2.1. This is your license from Intel Corp. under its intellectual
+property rights. You may have additional license terms from the party
+that provided you this software, covering your right to use that
+party's intellectual property rights.
+
+2.2. Intel grants, free of charge, to any person ("Licensee")
+obtaining a copy of the source code appearing in this file ("Covered
+Code") an irrevocable, perpetual, worldwide license under Intel's
+copyrights in the base code distributed originally by Intel ("Original
+Intel Code") to copy, make derivatives, distribute, use and display
+any portion of the Covered Code in any form, with the right to
+sublicense such rights; and
+
+2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+license (with the right to sublicense), under only those claims of
+Intel patents that are infringed by the Original Intel Code, to make,
+use, sell, offer to sell, and import the Covered Code and derivative
+works thereof solely to the minimum extent necessary to exercise the
+above copyright license, and in no event shall the patent license
+extend to any additions to or modifications of the Original Intel
+Code. No other license or right is granted directly or by implication,
+estoppel or otherwise; The above copyright and patent license is
+granted only if the following conditions are met:
+
+3. CONDITIONS
+
+3.1. Redistribution of Source with Rights to Further Distribute
+Source. Redistribution of source code of any substantial portion of
+the Covered Code or modification with rights to further distribute
+source must include the above Copyright Notice, the above License,
+this list of Conditions, and the following Disclaimer and Export
+Compliance provision. In addition, Licensee must cause all Covered
+Code to which Licensee contributes to contain a file documenting the
+changes Licensee made to create that Covered Code and the date of any
+change. Licensee must include in that file the documentation of any
+changes made by any predecessor Licensee. Licensee must include a
+prominent statement that the modification is derived, directly or
+indirectly, from Original Intel Code.
+
+3.2. Redistribution of Source with no Rights to Further Distribute
+Source. Redistribution of source code of any substantial portion of
+the Covered Code or modification without rights to further distribute
+source must include the following Disclaimer and Export Compliance
+provision in the documentation and/or other materials provided with
+distribution. In addition, Licensee may not authorize further
+sublicense of source of any portion of the Covered Code, and must
+include terms to the effect that the license from Licensee to its
+licensee is limited to the intellectual property embodied in the
+software Licensee provides to its licensee, and not to intellectual
+property embodied in modifications its licensee may make.
+
+3.3. Redistribution of Executable. Redistribution in executable form
+of any substantial portion of the Covered Code or modification must
+reproduce the above Copyright Notice, and the following Disclaimer and
+Export Compliance provision in the documentation and/or other
+materials provided with the distribution.
+
+3.4. Intel retains all right, title, and interest in and to the
+Original Intel Code.
+
+3.5. Neither the name Intel nor any other trademark owned or
+controlled by Intel shall be used in advertising or otherwise to
+promote the sale, use or other dealings in products derived from or
+relating to the Covered Code without prior written authorization from
+Intel.
+
+4. DISCLAIMER AND EXPORT COMPLIANCE
+
+4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE
+PROVIDED HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM
+INTEL SOFTWARE IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY
+SUPPORT, ASSISTANCE, INSTALLATION, TRAINING OR OTHER SERVICES. INTEL
+WILL NOT PROVIDE ANY UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL
+SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY,
+NONINFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE.
+
+4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS
+LICENSEES OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA,
+LOSS OF USE OR COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
+OR FOR ANY INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF
+THIS AGREEMENT, UNDER ANY CAUSE OF ACTION OR THEORY OF LIABILITY, AND
+IRRESPECTIVE OF WHETHER INTEL HAS ADVANCE NOTICE OF THE POSSIBILITY OF
+SUCH DAMAGES. THESE LIMITATIONS SHALL APPLY NOTWITHSTANDING THE
+FAILURE OF THE ESSENTIAL PURPOSE OF ANY LIMITED REMEDY.
+
+4.3. Licensee shall not export, either directly or indirectly, any of
+this software or system incorporating such software without first
+obtaining any required license or other approval from the
+U. S. Department of Commerce or any other agency or department of the
+United States Government. In the event Licensee exports any such
+software from the United States or re-exports any such software from a
+foreign destination, Licensee shall ensure that the distribution and
+export/re-export of the software is in compliance with all laws,
+regulations, orders, or other restrictions of the U.S. Export
+Administration Regulations. Licensee agrees that neither it nor any of
+its subsidiaries will export/re-export any technical data, process,
+software, or service, directly or indirectly, to any country for which
+the United States government or any agency thereof requires an export
+license, other governmental approval, or letter of assurance, without
+first obtaining such license, approval or letter.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/agpl-3.0.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/agpl-3.0.txt
new file mode 100644
index 0000000..dba13ed
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/agpl-3.0.txt
@@ -0,0 +1,661 @@
+ GNU AFFERO GENERAL PUBLIC LICENSE
+ Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+ A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate. Many developers of free software are heartened and
+encouraged by the resulting cooperation. However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+ The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community. It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server. Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+ An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals. This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU Affero General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Remote Network Interaction; Use with the GNU General Public License.
+
+ Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software. This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time. Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source. For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code. There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<http://www.gnu.org/licenses/>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/apache-2.0.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/apache-2.0.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/apache-2.0.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/artistic-2.0.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/artistic-2.0.txt
new file mode 100644
index 0000000..ddb9a46
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/artistic-2.0.txt
@@ -0,0 +1,201 @@
+ The Artistic License 2.0
+
+ Copyright (c) 2000-2006, The Perl Foundation.
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+Preamble
+
+This license establishes the terms under which a given free software
+Package may be copied, modified, distributed, and/or redistributed.
+The intent is that the Copyright Holder maintains some artistic
+control over the development of that Package while still keeping the
+Package available as open source and free software.
+
+You are always permitted to make arrangements wholly outside of this
+license directly with the Copyright Holder of a given Package. If the
+terms of this license do not permit the full use that you propose to
+make of the Package, you should contact the Copyright Holder and seek
+a different licensing arrangement.
+
+Definitions
+
+ "Copyright Holder" means the individual(s) or organization(s)
+ named in the copyright notice for the entire Package.
+
+ "Contributor" means any party that has contributed code or other
+ material to the Package, in accordance with the Copyright Holder's
+ procedures.
+
+ "You" and "your" means any person who would like to copy,
+ distribute, or modify the Package.
+
+ "Package" means the collection of files distributed by the
+ Copyright Holder, and derivatives of that collection and/or of
+ those files. A given Package may consist of either the Standard
+ Version, or a Modified Version.
+
+ "Distribute" means providing a copy of the Package or making it
+ accessible to anyone else, or in the case of a company or
+ organization, to others outside of your company or organization.
+
+ "Distributor Fee" means any fee that you charge for Distributing
+ this Package or providing support for this Package to another
+ party. It does not mean licensing fees.
+
+ "Standard Version" refers to the Package if it has not been
+ modified, or has been modified only in ways explicitly requested
+ by the Copyright Holder.
+
+ "Modified Version" means the Package, if it has been changed, and
+ such changes were not explicitly requested by the Copyright
+ Holder.
+
+ "Original License" means this Artistic License as Distributed with
+ the Standard Version of the Package, in its current version or as
+ it may be modified by The Perl Foundation in the future.
+
+ "Source" form means the source code, documentation source, and
+ configuration files for the Package.
+
+ "Compiled" form means the compiled bytecode, object code, binary,
+ or any other form resulting from mechanical transformation or
+ translation of the Source form.
+
+
+Permission for Use and Modification Without Distribution
+
+(1) You are permitted to use the Standard Version and create and use
+Modified Versions for any purpose without restriction, provided that
+you do not Distribute the Modified Version.
+
+
+Permissions for Redistribution of the Standard Version
+
+(2) You may Distribute verbatim copies of the Source form of the
+Standard Version of this Package in any medium without restriction,
+either gratis or for a Distributor Fee, provided that you duplicate
+all of the original copyright notices and associated disclaimers. At
+your discretion, such verbatim copies may or may not include a
+Compiled form of the Package.
+
+(3) You may apply any bug fixes, portability changes, and other
+modifications made available from the Copyright Holder. The resulting
+Package will still be considered the Standard Version, and as such
+will be subject to the Original License.
+
+
+Distribution of Modified Versions of the Package as Source
+
+(4) You may Distribute your Modified Version as Source (either gratis
+or for a Distributor Fee, and with or without a Compiled form of the
+Modified Version) provided that you clearly document how it differs
+from the Standard Version, including, but not limited to, documenting
+any non-standard features, executables, or modules, and provided that
+you do at least ONE of the following:
+
+ (a) make the Modified Version available to the Copyright Holder
+ of the Standard Version, under the Original License, so that the
+ Copyright Holder may include your modifications in the Standard
+ Version.
+
+ (b) ensure that installation of your Modified Version does not
+ prevent the user installing or running the Standard Version. In
+ addition, the Modified Version must bear a name that is different
+ from the name of the Standard Version.
+
+ (c) allow anyone who receives a copy of the Modified Version to
+ make the Source form of the Modified Version available to others
+ under
+
+ (i) the Original License or
+
+ (ii) a license that permits the licensee to freely copy,
+ modify and redistribute the Modified Version using the same
+ licensing terms that apply to the copy that the licensee
+ received, and requires that the Source form of the Modified
+ Version, and of any works derived from it, be made freely
+ available in that license fees are prohibited but Distributor
+ Fees are allowed.
+
+
+Distribution of Compiled Forms of the Standard Version
+or Modified Versions without the Source
+
+(5) You may Distribute Compiled forms of the Standard Version without
+the Source, provided that you include complete instructions on how to
+get the Source of the Standard Version. Such instructions must be
+valid at the time of your distribution. If these instructions, at any
+time while you are carrying out such distribution, become invalid, you
+must provide new instructions on demand or cease further distribution.
+If you provide valid instructions or cease distribution within thirty
+days after you become aware that the instructions are invalid, then
+you do not forfeit any of your rights under this license.
+
+(6) You may Distribute a Modified Version in Compiled form without
+the Source, provided that you comply with Section 4 with respect to
+the Source of the Modified Version.
+
+
+Aggregating or Linking the Package
+
+(7) You may aggregate the Package (either the Standard Version or
+Modified Version) with other packages and Distribute the resulting
+aggregation provided that you do not charge a licensing fee for the
+Package. Distributor Fees are permitted, and licensing fees for other
+components in the aggregation are permitted. The terms of this license
+apply to the use and Distribution of the Standard or Modified Versions
+as included in the aggregation.
+
+(8) You are permitted to link Modified and Standard Versions with
+other works, to embed the Package in a larger work of your own, or to
+build stand-alone binary or bytecode versions of applications that
+include the Package, and Distribute the result without restriction,
+provided the result does not expose a direct interface to the Package.
+
+
+Items That are Not Considered Part of a Modified Version
+
+(9) Works (including, but not limited to, modules and scripts) that
+merely extend or make use of the Package, do not, by themselves, cause
+the Package to be a Modified Version. In addition, such works are not
+considered parts of the Package itself, and are not subject to the
+terms of this license.
+
+
+General Provisions
+
+(10) Any use, modification, and distribution of the Standard or
+Modified Versions is governed by this Artistic License. By using,
+modifying or distributing the Package, you accept this license. Do not
+use, modify, or distribute the Package, if you do not accept this
+license.
+
+(11) If your Modified Version has been derived from a Modified
+Version made by someone other than you, you are nevertheless required
+to ensure that your Modified Version complies with the requirements of
+this license.
+
+(12) This license does not grant you the right to use any trademark,
+service mark, tradename, or logo of the Copyright Holder.
+
+(13) This license includes the non-exclusive, worldwide,
+free-of-charge patent license to make, have made, use, offer to sell,
+sell, import and otherwise transfer the Package with respect to any
+patent claims licensable by the Copyright Holder that are necessarily
+infringed by the Package. If you institute patent litigation
+(including a cross-claim or counterclaim) against any party alleging
+that the Package constitutes direct or contributory patent
+infringement, then this Artistic License to you shall terminate on the
+date that such litigation is filed.
+
+(14) Disclaimer of Warranty:
+THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS
+IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL
+LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/bsd-3-clause.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/bsd-3-clause.txt
new file mode 100644
index 0000000..0a0fa15
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/bsd-3-clause.txt
@@ -0,0 +1,27 @@
+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.
+
+ (3)The name of the author may not be used to
+ endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/cc0.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/cc0.txt
new file mode 100644
index 0000000..bdfff7a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/cc0.txt
@@ -0,0 +1,118 @@
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT
+ PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT
+ CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES
+ THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO
+ WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION
+ OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES
+ RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR
+ WORKS PROVIDED HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically
+confer exclusive Copyright and Related Rights (defined below) upon the
+creator and subsequent owner(s) (each and all, an "owner") of an
+original work of authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work
+for the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without
+fear of later claims of infringement build upon, modify, incorporate
+in other works, reuse and redistribute as freely as possible in any
+form whatsoever and for any purposes, including without limitation
+commercial purposes. These owners may contribute to the Commons to
+promote the ideal of a free culture and the further production of
+creative, cultural and scientific works, or to gain reputation or
+greater distribution for their Work in part through the use and
+efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or
+she is an owner of Copyright and Related Rights in the Work,
+voluntarily elects to apply CC0 to the Work and publicly distribute
+the Work under its terms, with knowledge of his or her Copyright and
+Related Rights in the Work and the meaning and intended legal effect
+of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may
+be protected by copyright and related or neighboring rights
+("Copyright and Related Rights"). Copyright and Related Rights
+include, but are not limited to, the following:
+
+ the right to reproduce, adapt, distribute, perform, display,
+ communicate, and translate a Work; moral rights retained by the
+ original author(s) and/or performer(s); publicity and privacy
+ rights pertaining to a person's image or likeness depicted in a
+ Work; rights protecting against unfair competition in regards to a
+ Work, subject to the limitations in paragraph 4(a), below; rights
+ protecting the extraction, dissemination, use and reuse of data in
+ a Work; database rights (such as those arising under Directive
+ 96/9/EC of the European Parliament and of the Council of 11 March
+ 1996 on the legal protection of databases, and under any national
+ implementation thereof, including any amended or successor version
+ of such directive); and other similar, equivalent or corresponding
+ rights throughout the world based on applicable law or treaty, and
+ any national implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in
+contravention of, applicable law, Affirmer hereby overtly, fully,
+permanently, irrevocably and unconditionally waives, abandons, and
+surrenders all of Affirmer's Copyright and Related Rights and
+associated claims and causes of action, whether now known or unknown
+(including existing as well as future claims and causes of action), in
+the Work (i) in all territories worldwide, (ii) for the maximum
+duration provided by applicable law or treaty (including future time
+extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"Waiver"). Affirmer makes the Waiver for the benefit of each member of
+the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal
+or equitable action to disrupt the quiet enjoyment of the Work by the
+public as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any
+reason be judged legally invalid or ineffective under applicable law,
+then the Waiver shall be preserved to the maximum extent permitted
+taking into account Affirmer's express Statement of Purpose. In
+addition, to the extent the Waiver is so judged Affirmer hereby grants
+to each affected person a royalty-free, non transferable, non
+sublicensable, non exclusive, irrevocable and unconditional license to
+exercise Affirmer's Copyright and Related Rights in the Work (i) in
+all territories worldwide, (ii) for the maximum duration provided by
+applicable law or treaty (including future time extensions), (iii) in
+any current or future medium and for any number of copies, and (iv)
+for any purpose whatsoever, including without limitation commercial,
+advertising or promotional purposes (the "License"). The License shall
+be deemed effective as of the date CC0 was applied by Affirmer to the
+Work. Should any part of the License for any reason be judged legally
+invalid or ineffective under applicable law, such partial invalidity
+or ineffectiveness shall not invalidate the remainder of the License,
+and in such case Affirmer hereby affirms that he or she will not (i)
+exercise any of his or her remaining Copyright and Related Rights in
+the Work or (ii) assert any associated claims and causes of action
+with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ No trademark or patent rights held by Affirmer are waived,
+ abandoned, surrendered, licensed or otherwise affected by this
+ document. Affirmer offers the Work as-is and makes no
+ representations or warranties of any kind concerning the Work,
+ express, implied, statutory or otherwise, including without
+ limitation warranties of title, merchantability, fitness for a
+ particular purpose, non infringement, or the absence of latent or
+ other defects, accuracy, or the present or absence of errors,
+ whether or not discoverable, all to the greatest extent
+ permissible under applicable law. Affirmer disclaims
+ responsibility for clearing rights of other persons that may apply
+ to the Work or any use thereof, including without limitation any
+ person's Copyright and Related Rights in the Work. Further,
+ Affirmer disclaims responsibility for obtaining any necessary
+ consents, permissions or other rights required for any use of the
+ Work. Affirmer understands and acknowledges that Creative Commons
+ is not a party to this document and has no duty or obligation with
+ respect to this CC0 or use of the Work.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/clear-bsd.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/clear-bsd.txt
new file mode 100644
index 0000000..550cf5b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/clear-bsd.txt
@@ -0,0 +1,33 @@
+The Clear BSD License
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted (subject to the limitations in the
+disclaimer below) provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the
+ distribution.
+
+ * Neither the name of <Owner Organization> nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
+GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
+HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/cpal-1.0.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/cpal-1.0.txt
new file mode 100644
index 0000000..c7ca984
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/cpal-1.0.txt
@@ -0,0 +1,105 @@
+Common Public Attribution License Version 1.0 (CPAL)
+1. "Definitions"
+1.0.1 "Commercial Use" means distribution or otherwise making the Covered Code available to a third party.
+1.1 "Contributor" means each entity that creates or contributes to the creation of Modifications.
+1.2 "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor.
+1.3 "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof.
+1.4 "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data.
+1.5 "Executable" means Covered Code in any form other than Source Code.
+1.6 "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A.
+1.7 "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License.
+1.8 "License" means this document.
+1.8.1 "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.
+1.9 "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is:
+A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications.
+B. Any new file that contains any part of the Original Code or previous Modifications.
+1.10 "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License.
+1.10.1 "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor.
+1.11 "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge.
+1.12 "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.
+2. Source Code License.
+2.1 The Initial Developer Grant.
+The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims:
+(a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and
+(b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof).
+(c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License.
+(d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices.
+2.2 Contributor Grant.
+Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license
+(a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and
+(b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination).
+(c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code.
+(d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor.
+3. Distribution Obligations.
+3.1 Application of License.
+The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5.
+3.2 Availability of Source Code.
+Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party.
+3.3 Description of Modifications.
+You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code.
+3.4 Intellectual Property Matters
+(a) Third Party Claims.
+If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained.
+(b) Contributor APIs.
+If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file.
+(c) Representations.
+Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License.
+3.5 Required Notices.
+You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.
+3.6 Distribution of Executable Versions.
+You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer.
+3.7 Larger Works.
+You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code.
+4. Inability to Comply Due to Statute or Regulation.
+If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it.
+5. Application of this License.
+This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code.
+6. Versions of the License.
+6.1 New Versions.
+Socialtext, Inc. ("Socialtext") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number.
+6.2 Effect of New Versions.
+Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License.
+6.3 Derivative Works.
+If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "Socialtext", "CPAL" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.)
+7. DISCLAIMER OF WARRANTY.
+COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+8. TERMINATION.
+8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
+8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as "Participant") alleging that:
+(a) such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above.
+(b) any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant.
+8.3 If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license.
+8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination.
+9. LIMITATION OF LIABILITY.
+UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+10. U.S. GOVERNMENT END USERS.
+The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein.
+11. MISCELLANEOUS.
+This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License.
+12. RESPONSIBILITY FOR CLAIMS.
+As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
+13. MULTIPLE-LICENSED CODE.
+Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A.
+14. ADDITIONAL TERM: ATTRIBUTION
+(a) As a modest attribution to the organizer of the development of the Original Code ("Original Developer"), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B ("Attribution Information") a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer's Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an "about" display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice.
+(b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL ("Attribution Information") and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the "Attribution Limits").
+(c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer.
+(d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License.
+15. ADDITIONAL TERM: NETWORK USE.
+The term "External Deployment" means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2.
+EXHIBIT A. Common Public Attribution License Version 1.0.
+"The contents of this file are subject to the Common Public Attribution License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at _____________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B.
+Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License.
+The Original Code is______________________.
+The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer.
+The Initial Developer of the Original Code is ____________. All portions of the code written by ___________ are Copyright (c) _____. All Rights Reserved.
+Contributor ______________________.
+Alternatively, the contents of this file may be used under the terms of the _____ license (the (___) License), in which case the provisions of (______) License are applicable instead of those above.
+If you wish to allow use of your version of this file only under the terms of the (____) License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the (___) License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the (___) License."
+(NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.)
+EXHIBIT B. Attribution Information
+Attribution Copyright Notice: _______________________
+Attribution Phrase (not exceeding 10 words): _______________________
+Attribution URL: _______________________
+Graphic Image as provided in the Covered Code, if any.
+Display of Attribution Information is (required/not required) in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/create-magnets.sh b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/create-magnets.sh
new file mode 100644
index 0000000..b20be4b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/create-magnets.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+
+# This file is part of GNU LibreJS.
+#
+# GNU LibreJS is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# GNU LibreJS is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+
+# this script requires transmission-daemon. Install it as a package.
+echo "" > magnet-links.txt
+curtorrent=""
+for f in *.txt
+do
+ echo "Processing $f"
+ curtorrent="torrents/$f.torrent"
+ echo "Creating $curtorrent"
+ transmission-create -o "$curtorrent" "$f"
+ transmission-show --magnet "$curtorrent" >> magnet-links.txt
+done
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/expat.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/expat.txt
new file mode 100644
index 0000000..1f95d26
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/expat.txt
@@ -0,0 +1,5 @@
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/freebsd.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/freebsd.txt
new file mode 100644
index 0000000..29b4d8e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/freebsd.txt
@@ -0,0 +1,25 @@
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer. Redistributions
+in binary form must reproduce the above copyright notice, this list of
+conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution. THIS SOFTWARE IS
+PROVIDED BY THE FREEBSD PROJECT ``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 FREEBSD PROJECT OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The views and conclusions contained in the software and documentation
+are those of the authors and should not be interpreted as representing
+official policies, either expressed or implied, of the FreeBSD
+Project.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/gpl-2.0.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/gpl-2.0.txt
new file mode 100644
index 0000000..d159169
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/gpl-2.0.txt
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/gpl-3.0.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/gpl-3.0.txt
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/gpl-3.0.txt
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/illinois-NCSA.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/illinois-NCSA.txt
new file mode 100644
index 0000000..4f2da6c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/illinois-NCSA.txt
@@ -0,0 +1,24 @@
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+“Softwareâ€), to deal with the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimers.
+Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimers in the
+documentation and/or other materials provided with the distribution.
+Neither the names of <Name of Development Group, Name of Institution>,
+nor the names of its contributors may be used to endorse or promote
+products derived from this Software without specific prior written
+permission. THE SOFTWARE IS PROVIDED “AS ISâ€, WITHOUT WARRANTY OF ANY
+KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/imlib2.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/imlib2.txt
new file mode 100644
index 0000000..5fc3f71
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/imlib2.txt
@@ -0,0 +1,31 @@
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies of the Software and its Copyright notices. In addition publicly
+documented acknowledgment must be given that this software has been used if no
+source code of this software is made available publicly. Making the source
+available publicly means including the source for this software with the
+distribution, or a method to get this software via some reasonable mechanism
+(electronic transfer via a network or media) as well as making an offer to
+supply the source on request. This Copyright notice serves as an offer to
+supply the source on on request as well. Instead of this, supplying
+acknowledgments of use of this software in either Copyright notices, Manuals,
+Publicity and Marketing documents or any documentation provided with any
+product containing this software. This License does not apply to any software
+that links to the libraries provided by this software (statically or
+dynamically), but only to the software provided.
+
+Please see the COPYING-PLAIN for a plain-english explanation of this notice
+and its intent.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-2.0.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-2.0.txt
new file mode 100644
index 0000000..5bc8fb2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-2.0.txt
@@ -0,0 +1,481 @@
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-2.1.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-2.1.txt
new file mode 100644
index 0000000..4362b49
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-2.1.txt
@@ -0,0 +1,502 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-3.0.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-3.0.txt
new file mode 100644
index 0000000..65c5ca8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/lgpl-3.0.txt
@@ -0,0 +1,165 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/magnet-links.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/magnet-links.txt
new file mode 100644
index 0000000..8026b91
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/magnet-links.txt
@@ -0,0 +1,26 @@
+
+magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt
+magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7&dn=apache-2.0.txt
+magnet:?xt=urn:btih:54fd2283f9dbdf29466d2df1a98bf8f65cafe314&dn=artistic-2.0.txt
+magnet:?xt=urn:btih:89a97c535628232f2f3888c2b7b8ffd4c078cec0&dn=Boost-1.0.txt
+magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt
+magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt
+magnet:?xt=urn:btih:e8823381a12cbaec8042d8f5928ed9ca427ae6ed&dn=clear-bsd.txt
+magnet:?xt=urn:btih:84143bc45939fc8fa42921d619a95462c2031c5c&dn=cpal-1.0.txt
+magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt
+magnet:?xt=urn:btih:0c9737ee7c3f64a549ae792605960b900d0bab7f&dn=freebsd.txt
+magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt
+magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt
+magnet:?xt=urn:btih:035da57b2e51467406d7f737ce130844ceb555e1&dn=illinois-NCSA.txt
+magnet:?xt=urn:btih:34b1392ce6108db166bd9ee4a37e655c67891e5b&dn=imlib2.txt
+magnet:?xt=urn:btih:3254dcf4f9d9dadad8dfb4951177854d5d0e2491&dn=IntelACPI.txt
+magnet:?xt=urn:btih:b8999bbaf509c08d127678643c515b9ab0836bae&dn=ISC.txt
+magnet:?xt=urn:btih:fcd495f3ca5fb96b147041401bcf213eec0a6439&dn=lgpl-2.0.txt
+magnet:?xt=urn:btih:5de60da917303dbfad4f93fb1b985ced5a89eac2&dn=lgpl-2.1.txt
+magnet:?xt=urn:btih:0ef1b8170b3b615170ff270def6427c317705f85&dn=lgpl-3.0.txt
+magnet:?xt=urn:btih:3877d6d54b3accd4bc32f8a48bf32ebc0901502a&dn=mpl-2.0.txt
+magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt
+magnet:?xt=urn:btih:5866afca5f37889c0c1fdd108f4922d4fcdb5e3d&dn=unlicense.txt
+magnet:?xt=urn:btih:723febf9f6185544f57f0660a41489c7d6b4931b&dn=wtfpl.txt
+magnet:?xt=urn:btih:5305d91886084f776adcf57509a648432709a7c7&dn=x11.txt
+magnet:?xt=urn:btih:12f2ec9e8de2a3b0002a33d518d6010cc8ab2ae9&dn=xfree86.txt
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/mpl-2.0.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/mpl-2.0.txt
new file mode 100644
index 0000000..14e2f77
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/mpl-2.0.txt
@@ -0,0 +1,373 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ (a) that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+
+ (b) that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+1.6. "Executable Form"
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+1.8. "License"
+ means this document.
+
+1.9. "Licensable"
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+1.10. "Modifications"
+ means any of the following:
+
+ (a) any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+
+ (b) any new file in Source Code Form that contains any Covered
+ Software.
+
+1.11. "Patent Claims" of a Contributor
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+1.12. "Secondary License"
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those
+ licenses.
+
+1.13. "Source Code Form"
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, "control" means (a) the power, direct
+ or indirect, to cause the direction or management of such entity,
+ whether by contract or otherwise, or (b) ownership of more than
+ fifty percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+ for sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+ or
+
+(b) for infringements caused by: (i) Your and any other third party's
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+ Form, as described in Section 3.1, and You must inform recipients of
+ the Executable Form how they can obtain a copy of such Source Code
+ Form by reasonable means in a timely manner, at a charge no more
+ than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter
+ the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+* *
+* 6. Disclaimer of Warranty *
+* ------------------------- *
+* *
+* Covered Software is provided under this License on an "as is" *
+* basis, without warranty of any kind, either expressed, implied, or *
+* statutory, including, without limitation, warranties that the *
+* Covered Software is free of defects, merchantable, fit for a *
+* particular purpose or non-infringing. The entire risk as to the *
+* quality and performance of the Covered Software is with You. *
+* Should any Covered Software prove defective in any respect, You *
+* (not any Contributor) assume the cost of any necessary servicing, *
+* repair, or correction. This disclaimer of warranty constitutes an *
+* essential part of this License. No use of any Covered Software is *
+* authorized under this License except under this disclaimer. *
+* *
+************************************************************************
+
+************************************************************************
+* *
+* 7. Limitation of Liability *
+* -------------------------- *
+* *
+* Under no circumstances and under no legal theory, whether tort *
+* (including negligence), contract, or otherwise, shall any *
+* Contributor, or anyone who distributes Covered Software as *
+* permitted above, be liable to You for any direct, indirect, *
+* special, incidental, or consequential damages of any character *
+* including, without limitation, damages for lost profits, loss of *
+* goodwill, work stoppage, computer failure or malfunction, or any *
+* and all other commercial damages or losses, even if such party *
+* shall have been informed of the possibility of such damages. This *
+* limitation of liability shall not apply to liability for death or *
+* personal injury resulting from such party's negligence to the *
+* extent applicable law prohibits such limitation. Some *
+* jurisdictions do not allow the exclusion or limitation of *
+* incidental or consequential damages, so this exclusion and *
+* limitation may not apply to You. *
+* *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+ This Source Code Form is "Incompatible With Secondary Licenses", as
+ defined by the Mozilla Public License, v. 2.0.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/public-domain.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/public-domain.txt
new file mode 100644
index 0000000..68cf1a8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/public-domain.txt
@@ -0,0 +1,18 @@
+Being in the public domain is not a license; rather, it means the
+material is not copyrighted and no license is needed. Practically
+speaking, though, if a work is in the public domain, it might as well
+have an all-permissive non-copyleft free software license. Public
+domain material is compatible with the GNU GPL.
+
+If you want to release your work to the public domain, we encourage
+you to use formal tools to do so. We ask people who make small
+contributions to GNU to sign a disclaimer form; that's one
+solution. If you're working on a project that doesn't have formal
+contribution policies like that, CC0 is a good tool that anyone can
+use. It formally dedicates your work to the public domain, and
+provides a fallback license for cases where that is not legally
+possible.
+
+http://directory.fsf.org/wiki/License:CC0
+
+Source: http://www.gnu.org/licenses/license-list.html#PublicDomain
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/Boost-1.0.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/Boost-1.0.txt.torrent
new file mode 100644
index 0000000..d859c22
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/Boost-1.0.txt.torrent
@@ -0,0 +1,2 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343399e8:encoding5:UTF-84:infod6:lengthi1338e4:name13:Boost-1.0.txt12:piece lengthi32768e6:pieces20:<º)â¹ÕŸbÖú
+8k-½7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/ISC.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/ISC.txt.torrent
new file mode 100644
index 0000000..c221f05
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/ISC.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343405e8:encoding5:UTF-84:infod6:lengthi683e4:name7:ISC.txt12:piece lengthi32768e6:pieces20:_9tq””ø…ç-°ä~.ŽÎw 7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/IntelACPI.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/IntelACPI.txt.torrent
new file mode 100644
index 0000000..8de0ded
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/IntelACPI.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343405e8:encoding5:UTF-84:infod6:lengthi6080e4:name13:IntelACPI.txt12:piece lengthi32768e6:pieces20: ¹×æo°Ÿ†ê*-|í_(7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/agpl-3.0.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/agpl-3.0.txt.torrent
new file mode 100644
index 0000000..21f7000
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/agpl-3.0.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343398e8:encoding5:UTF-84:infod6:lengthi34520e4:name12:agpl-3.0.txt12:piece lengthi32768e6:pieces40:‚¥¢öIß='5íN?bý¨¤.ÐÅİNʯÈúï¸ÕJ¡”6ÿœ7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/apache-2.0.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/apache-2.0.txt.torrent
new file mode 100644
index 0000000..f0b13ab
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/apache-2.0.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343398e8:encoding5:UTF-84:infod6:lengthi11358e4:name14:apache-2.0.txt12:piece lengthi32768e6:pieces20:+‹R)ªŠaäƒûK X‹‹lI7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/artistic-2.0.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/artistic-2.0.txt.torrent
new file mode 100644
index 0000000..5bb11db
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/artistic-2.0.txt.torrent
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/bsd-3-clause.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/bsd-3-clause.txt.torrent
new file mode 100644
index 0000000..9dfc19a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/bsd-3-clause.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343400e8:encoding5:UTF-84:infod6:lengthi1373e4:name16:bsd-3-clause.txt12:piece lengthi32768e6:pieces20:ëÒP©`ïã‰ôZ†Œó#ô²°à‰7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/cc0.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/cc0.txt.torrent
new file mode 100644
index 0000000..02991e9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/cc0.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343400e8:encoding5:UTF-84:infod6:lengthi6982e4:name7:cc0.txt12:piece lengthi32768e6:pieces20:¢&Nq˜L/bQV¾ ÕÊ–™\Â7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/clear-bsd.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/clear-bsd.txt.torrent
new file mode 100644
index 0000000..5f56d34
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/clear-bsd.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343401e8:encoding5:UTF-84:infod6:lengthi1633e4:name13:clear-bsd.txt12:piece lengthi32768e6:pieces20:Ÿ ”1m? „Á§[>$k™Ž7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/cpal-1.0.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/cpal-1.0.txt.torrent
new file mode 100644
index 0000000..93e5631
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/cpal-1.0.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343401e8:encoding5:UTF-84:infod6:lengthi28079e4:name12:cpal-1.0.txt12:piece lengthi32768e6:pieces20:Î*²T#Ѹ X;ÀhÔ è?ÚÛæ…7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/expat.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/expat.txt.torrent
new file mode 100644
index 0000000..62f134f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/expat.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343402e8:encoding5:UTF-84:infod6:lengthi1023e4:name9:expat.txt12:piece lengthi32768e6:pieces20:©ó|+®þDàݶî( ¡²¹ï957:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/freebsd.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/freebsd.txt.torrent
new file mode 100644
index 0000000..8d07cb1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/freebsd.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343402e8:encoding5:UTF-84:infod6:lengthi1426e4:name11:freebsd.txt12:piece lengthi32768e6:pieces20: ÛS­ VuÓ;¦´‡™3àÜöGí7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/gpl-2.0.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/gpl-2.0.txt.torrent
new file mode 100644
index 0000000..55830d3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/gpl-2.0.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343403e8:encoding5:UTF-84:infod6:lengthi18092e4:name11:gpl-2.0.txt12:piece lengthi32768e6:pieces20:LÇ{¯‘æ¦JàH“ýÿ§“¸L7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/gpl-3.0.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/gpl-3.0.txt.torrent
new file mode 100644
index 0000000..b101841
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/gpl-3.0.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343403e8:encoding5:UTF-84:infod6:lengthi35147e4:name11:gpl-3.0.txt12:piece lengthi32768e6:pieces40:N@ˆ˜ã™Þšmýê¢Íô’M焎š¥F–)f"&"`ÕHŠå~üw7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/illinois-NCSA.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/illinois-NCSA.txt.torrent
new file mode 100644
index 0000000..3ce156a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/illinois-NCSA.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343404e8:encoding5:UTF-84:infod6:lengthi1462e4:name17:illinois-NCSA.txt12:piece lengthi32768e6:pieces20:Wá¢1úíõiÐé$±F¸´J–*Ê7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/imlib2.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/imlib2.txt.torrent
new file mode 100644
index 0000000..5975ed3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/imlib2.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343404e8:encoding5:UTF-84:infod6:lengthi1987e4:name10:imlib2.txt12:piece lengthi32768e6:pieces20:÷´Øpi.§Ó»?ÉßtRî7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-2.0.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-2.0.txt.torrent
new file mode 100644
index 0000000..fe8e055
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-2.0.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343406e8:encoding5:UTF-84:infod6:lengthi25383e4:name12:lgpl-2.0.txt12:piece lengthi32768e6:pieces20:º‰fâG:™i½Ê³Ü‚'L|ý˜¡7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-2.1.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-2.1.txt.torrent
new file mode 100644
index 0000000..ae6e06b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-2.1.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343406e8:encoding5:UTF-84:infod6:lengthi26530e4:name12:lgpl-2.1.txt12:piece lengthi32768e6:pieces20:¦´¿y¬©µV‚&jú¸nŒO¿7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-3.0.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-3.0.txt.torrent
new file mode 100644
index 0000000..c518b15
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/lgpl-3.0.txt.torrent
@@ -0,0 +1,2 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343407e8:encoding5:UTF-84:infod6:lengthi7651e4:name12:lgpl-3.0.txt12:piece lengthi32768e6:pieces20:ô^áÇedh´BÊXÞrâ
+d§Ýº7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/magnet-links.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/magnet-links.txt.torrent
new file mode 100644
index 0000000..9e7641b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/magnet-links.txt.torrent
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/mpl-2.0.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/mpl-2.0.txt.torrent
new file mode 100644
index 0000000..cbe4ec0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/mpl-2.0.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343408e8:encoding5:UTF-84:infod6:lengthi16726e4:name11:mpl-2.0.txt12:piece lengthi32768e6:pieces20:—DÎÜà™÷'³'Í™¡ýÅŠU™7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/public-domain.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/public-domain.txt.torrent
new file mode 100644
index 0000000..a1efd8a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/public-domain.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343408e8:encoding5:UTF-84:infod6:lengthi889e4:name17:public-domain.txt12:piece lengthi32768e6:pieces20:â§JaHûã2’IÛO‡4 ó¾(7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/unlicense.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/unlicense.txt.torrent
new file mode 100644
index 0000000..c77ff26
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/unlicense.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343409e8:encoding5:UTF-84:infod6:lengthi1212e4:name13:unlicense.txt12:piece lengthi32768e6:pieces20:§y’¯FAÞm¡†@$š² Žm— 7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/wtfpl.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/wtfpl.txt.torrent
new file mode 100644
index 0000000..7819326
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/wtfpl.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343409e8:encoding5:UTF-84:infod6:lengthi432e4:name9:wtfpl.txt12:piece lengthi32768e6:pieces20:ÔHÙÿ’šÂ·O.KªßýUi7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/x11.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/x11.txt.torrent
new file mode 100644
index 0000000..f6239e2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/x11.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343410e8:encoding5:UTF-84:infod6:lengthi1293e4:name7:x11.txt12:piece lengthi32768e6:pieces20:&×¾;T‚#¢+j‹¶H,uÜq7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/xfree86.txt.torrent b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/xfree86.txt.torrent
new file mode 100644
index 0000000..b4c430e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/torrents/xfree86.txt.torrent
@@ -0,0 +1 @@
+d10:created by25:Transmission/2.82 (14160)13:creation datei1408343411e8:encoding5:UTF-84:infod6:lengthi2297e4:name11:xfree86.txt12:piece lengthi32768e6:pieces20:)~ŽSÅÿHu¤×í–;y0°h>7:privatei0eee \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/unlicense.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/unlicense.txt
new file mode 100644
index 0000000..471f09f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/unlicense.txt
@@ -0,0 +1,25 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <http://unlicense.org/>
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/wtfpl.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/wtfpl.txt
new file mode 100644
index 0000000..0557e73
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/wtfpl.txt
@@ -0,0 +1,11 @@
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ Version 2, December 2004
+
+ Everyone is permitted to copy and distribute verbatim or modified
+ copies of this license document, and changing it is allowed as long
+ as the name is changed.
+
+ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. You just DO WHAT THE FUCK YOU WANT TO.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/x11.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/x11.txt
new file mode 100644
index 0000000..e133cb3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/x11.txt
@@ -0,0 +1,26 @@
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from the X Consortium.
+
+X Window System is a trademark of X Consortium, Inc.
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/xfree86.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/xfree86.txt
new file mode 100644
index 0000000..b41fc74
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/licenses/xfree86.txt
@@ -0,0 +1,43 @@
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+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,
+and in the same place and form as other copyright, license and
+disclaimer information.
+
+3. The end-user documentation included with the redistribution, if
+any, must include the following acknowledgment: "This product includes
+software developed by The XFree86 Project, Inc
+(http://www.xfree86.org/) and its contributors", in the same place and
+form as other third-party acknowledgments. Alternately, this
+acknowledgment may appear in the software itself, in the same form and
+location as other such third-party acknowledgments.
+
+4. Except as contained in this notice, the name of The XFree86
+Project, Inc shall not be used in advertising or otherwise to promote
+the sale, use or other dealings in this Software without prior written
+authorization from The XFree86 Project, Inc.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 XFREE86 PROJECT, INC 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.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/loading/loader.gif b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/loading/loader.gif
new file mode 100644
index 0000000..22a5bb3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/loading/loader.gif
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/loading/loading-panel.html b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/loading/loading-panel.html
new file mode 100644
index 0000000..4db4709
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/loading/loading-panel.html
@@ -0,0 +1,31 @@
+<!doctype html>
+
+<html>
+<head>
+<!-- /**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+-->
+</head>
+
+<body>
+<h1>LibreJS: Analyzing JavaScript</h1>
+<img src="./loader.gif"/>
+</body>
+</html>
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/preferences_panel/contentscript.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/preferences_panel/contentscript.js
new file mode 100644
index 0000000..6ac7578
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/preferences_panel/contentscript.js
@@ -0,0 +1,70 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/*
+ * Handle messages sent from add-on to the content script
+ */
+//onMessage = function onMessage(message) {
+self.on('message', function (message) {
+ var reason = message[0];
+
+ if(reason == "INCOMINGPREFS") {
+ // These are the prefs we need to set up the pref panel
+
+ initPanel(message);
+ }
+});
+
+function initPanel(prefObject) {
+
+ for(var i in prefObject) {
+ if(prefObject[i]) {
+ if(prefObject[i].split(":")[1]) {
+ try {
+ var item = this.document.getElementById("pref_" + prefObject[i].split(":")[0]);
+ item.checked = prefObject[i].split(":")[1] == "true";
+ } catch(e) {
+ //"ERROR: " + //console.log(i);
+ }
+ }
+ }
+ }
+
+
+ var inputs = this.document.getElementsByTagName("input");
+
+ for(i in inputs) {
+
+ input = inputs[i]; // correct version
+
+ if(input) {
+ if(input.nodeName == "INPUT") {
+ input.onclick = function() {
+ self.postMessage("SETPREF:" + this.id.split("pref_")[1] + ":" + this.checked);
+ };
+ }
+ }
+ }
+
+
+
+
+ prefObject = null;
+} \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/preferences_panel/preferences_panel.html b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/preferences_panel/preferences_panel.html
new file mode 100644
index 0000000..ffb1c5a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/preferences_panel/preferences_panel.html
@@ -0,0 +1,71 @@
+<html>
+ <head>
+<!-- /**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+-->
+ <title>
+ LibreJS preferences
+ </title>
+ <style>
+ body > div {
+ border: 1px black;
+ }
+ div.choice {
+ background: #555;
+ color:#c4c4c4;
+ margin:10px;
+
+ padding:10px;
+ font-size:13px;
+ clear:both;
+ overflow:hidden;
+ }
+ input {
+ float:left;
+ display:inline;
+ }
+ div.choice p {
+ display:block;
+ width:200px;
+ float:left;
+ margin-left:0;
+ }
+ span.notdone {
+ color:red;
+ }
+ #pref_whitelist {
+ width:240px;
+ }
+ </style>
+
+ </head>
+
+ <body>
+ <h3>
+ LibreJS Preferences
+ </h1>
+ <div>
+ <div>
+ <div class="choice">
+ <input id="pref_nolazy" type="checkbox"/><p>Do not consider lazy license mentions as free (e.g.: dual-licensed under MIT and GPL, ...)</p>
+ </div>
+ </div>
+ </body>
+</html>
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_detector/script_detector.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_detector/script_detector.js
new file mode 100644
index 0000000..b16b9dd
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_detector/script_detector.js
@@ -0,0 +1,363 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+// array reflects valid types as listed in
+// http://mxr.mozilla.org/mozilla-central/source/content/base/src/nsScriptLoader.cpp#437
+// anything appended to end of strings is considered valid:
+var jsValidTypes = [
+ /^text\/javascript/i,
+ /^text\/ecmascript/i,
+ /^application\/javascript/i,
+ /^application\/ecmascript/i,
+ /^application\/x-javascript/i
+];
+
+// the list of all available event attributes
+var intrinsecEvents = [
+ "onload",
+ "onunload",
+ "onclick",
+ "ondblclick",
+ "onmousedown",
+ "onmouseup",
+ "onmouseover",
+ "onmousemove",
+ "onmouseout",
+ "onfocus",
+ "onblur",
+ "onkeypress",
+ "onkeydown",
+ "onkeyup",
+ "onsubmit",
+ "onreset",
+ "onselect",
+ "onchange"];
+
+
+/**
+ * scriptHasInvalidType
+ *
+ * Checks that a script does not have a js "template" type.
+ * Normally any script that has a type attribute other than the
+ * few allowed ones is not interpreted. But by security, we only
+ * discard a few of them.
+ *
+ * @param script obj The script element.
+ * @return returns true if it matches a template type.
+ *
+ */
+var scriptHasInvalidType = function (type) {
+
+ var i = 0,
+ le = jsValidTypes.length;
+
+ if (type === 'librejs/blocked') {
+ // js has already been blocked.
+ return true;
+ }
+
+ if (!type) {
+ // type isn't set, don't look further.
+ return false;
+ }
+
+ for (; i < le; i++) {
+ if (jsValidTypes[i].test(type)) {
+ return false;
+ }
+ }
+
+ // type is invalid and
+ // hence cannot be executed.
+ return true;
+
+};
+
+
+/**
+ * scriptDetector
+ * Detects all scripts (inline, onpage, and external)
+ * and checks whether they have been blocked or if they
+ * are being executed.
+ */
+
+var scriptDetector = {
+ contactLink: null,
+ blockedScripts: null,
+ acceptedScripts: null,
+ dryRunScripts: null,
+ acceptedAttributes: null,
+ acceptedCode: [],
+ blockedCode: [],
+ dryRunCode: [],
+
+ init: function() {
+ if (typeof $ !== 'function') {
+ return;
+ }
+ this.blockedScripts = $('script[type="librejs/blocked"]');
+ this.acceptedScripts = $('script[type!="librejs/blocked"]')
+ .not('script[data-librejs-dryrun]');
+ this.dryRunScripts = $('script[data-librejs-dryrun]');
+ console.debug(this.dryRunScripts);
+ this.fetchAllNonScriptTags();
+
+ if (this.blockedScripts.length) {
+
+ // display noscript tags if applicable.
+ this.displayNoScriptTags();
+ try {
+ // initialize the page mod code.
+ pageModFinder.init();
+ } catch (e) {
+ // fail silently.
+ }
+ this.fetchBlockedScripts();
+ }
+
+ if (this.acceptedScripts.length) {
+ this.fetchAcceptedScripts();
+ }
+ if (this.dryRunScripts.length) {
+ this.fetchDryRunScripts();
+ }
+
+ self.postMessage({
+ 'event': 'scriptsFetched',
+ 'value': {
+ 'blocked': this.blockedCode,
+ 'accepted': this.acceptedCode,
+ 'dryRun': this.dryRunCode
+ }
+ });
+ },
+
+ /**
+ * fetchBlockedScripts
+ *
+ * Gather blocked scripts.
+ *
+ */
+ fetchBlockedScripts: function () {
+ var that = this,
+ singleton = '', reason;
+
+ this.blockedScripts.each(function() {
+ singleton = '';
+ reason = "";
+
+
+ if ($(this).data('librejs-reason') && $(this).data('librejs-reason').length > 9) {
+ reason = $(this).data('librejs-reason') + ': ';
+ }
+
+ if ($(this).text()) {
+
+ if ($(this).data('singleton') === true) {
+ singleton = 'This script was removed before LibreJS analysis: ';
+ }
+
+ that.blockedCode.push({'contents': singleton + reason + that.truncateText($(this).text()),
+ 'inline': true});
+ }
+
+ if ($(this).data('librejs-blocked-src')) {
+
+ that.blockedCode.push({'url': $(this).data('librejs-blocked-src'), 'contents': reason, 'inline': false});
+ }
+
+ });
+ },
+
+ /**
+ * fetchAcceptedScripts
+ *
+ * Gather accepted scripts.
+ *
+ */
+ fetchAcceptedScripts: function () {
+
+ var that = this, typeMessage = '', reason = "";
+
+ this.acceptedScripts.each(function() {
+ reason = "";
+
+ if ($(this).data('librejs-reason') && $(this).data('librejs-reason').length > 9) {
+ reason = $(this).data('librejs-reason') + ':';
+ }
+
+ if ($(this).attr('type') &&
+ scriptHasInvalidType($(this).attr('type'))) {
+ typeMessage = 'script type is not valid (js is not executed): '+ $(this).attr('type') + ' ';
+ }
+
+ if ($(this).text()) {
+ that.acceptedCode.push({'contents': reason + typeMessage + that.truncateText($(this).text()),
+ 'inline': true});
+ }
+
+ if ($(this).attr('src')) {
+ that.acceptedCode.push({'url': $(this).attr('src'), 'contents': reason + typeMessage,
+ 'inline': false});
+ }
+
+ });
+
+ },
+
+ /**
+ * fetchDryRunScripts
+ *
+ * Gather accepted scripts.
+ *
+ */
+ fetchDryRunScripts: function () {
+
+ var that = this, typeMessage = '', reason = "";
+
+ this.dryRunScripts.each(function() {
+ reason = "";
+
+ if ($(this).data('librejs-reason') && $(this).data('librejs-reason').length > 9) {
+ reason = $(this).data('librejs-reason') + ':';
+ }
+
+ if ($(this).attr('type') &&
+ scriptHasInvalidType($(this).attr('type'))) {
+ typeMessage = 'script type is not valid (js is not executed): '+ $(this).attr('type') + ' ';
+ }
+
+ if ($(this).text()) {
+ that.dryRunCode.push({'contents': reason + typeMessage + that.truncateText($(this).text()),
+ 'inline': true});
+ }
+
+ if ($(this).attr('src')) {
+ that.dryRunCode.push({'url': $(this).attr('src'), 'contents': reason + typeMessage,
+ 'inline': false});
+ }
+
+ });
+
+ },
+
+ fetchAllNonScriptTags: function () {
+ var that = this;
+ var blockedAnchors = $('*[data-librejs="rejected"]').not('script');
+ var acceptedAnchors = $('*[data-librejs="accepted"]').not('script');
+ var i = 0, le, attributes;
+
+ acceptedAnchors.each(function () {
+
+ var content = "";
+
+ if ($(this).attr('href')) {
+
+ content = $(this).attr('href');
+
+ }
+
+ else {
+ content = that.findOnAttributeContent($(this));
+ }
+
+ that.acceptedCode.push(
+ {contents: 'in attribute: ' + content,
+ inline: true}
+ );
+
+ });
+
+ blockedAnchors.each(function () {
+
+ var content = "";
+
+ if ($(this).attr('href')) {
+ content = $(this).attr('href');
+ } else if ($(this).data('librejs-blocked-event')) {
+ attributes = $(this).data('librejs-blocked-event');
+ le = attributes.length;
+ for (i = 0; i < le; i++) {
+ content += attributes[i].attribute + ":" + attributes[i].value + ";\n";
+ }
+ }
+
+ that.blockedCode.push(
+ {contents: 'in attribute: ' + content,
+ inline: true}
+ );
+ });
+ },
+
+ findOnAttributeContent: function (elem) {
+ var i = 0,
+ le = intrinsecEvents.length,
+ content = "";
+
+ for (; i < le; i++) {
+
+ if (elem.attr(intrinsecEvents[i])) {
+
+ content += elem.attr(intrinsecEvents[i]) + " -- ";
+
+ }
+
+ }
+ return content;
+ },
+
+ /**
+ * displayNoScriptTags
+ * Whenever blocked scripts are found, deep clone noscript tags
+ * and place them in a new div.
+ */
+ displayNoScriptTags: function () {
+
+ var noscripts = $('body noscript'),
+ div, content;
+
+ noscripts.each(function (index) {
+ div = $('<div/>');
+
+
+ content = $(this).contents();
+ content = $("<div>").html(content).text();
+
+ div.append(content);
+ div.children('style, script, meta').remove();
+
+
+ // insert noscript content right after the
+ // original noscript tag.
+ div.insertAfter($(this));
+ });
+
+ },
+ truncateText: function (str) {
+
+ if (str.length > 1000) {
+ str = str.slice(0, 1000) + '…';
+ }
+ return str;
+ }
+
+};
+
+scriptDetector.init();
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_libraries/gethash.sh b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_libraries/gethash.sh
new file mode 100644
index 0000000..f55b45c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_libraries/gethash.sh
@@ -0,0 +1,10 @@
+#!/usr/bin/env bash
+#
+# gethash.sh
+#
+# Get the hash of a js file for use in the librejs database.
+#
+
+FILE=$1
+wget -O /tmp/jsfile $FILE
+iconv -f LATIN1 -t UTF8 /tmp/jsfile | sha1sum
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_libraries/script-libraries.json b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_libraries/script-libraries.json
new file mode 100644
index 0000000..437f70b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/script_libraries/script-libraries.json
@@ -0,0 +1,1440 @@
+{
+ "9d6f8bdcadd59eba977e9e31066bf393c9fdf8a4": {
+ "filename": "http://code.jquery.com/jquery-1.0.4.js",
+ "result": "[freelib]"
+ },
+ "31555f340a206de7622fb760718ef4a1b296ed44": {
+ "filename": "http://code.jquery.com/jquery-1.1.js",
+ "result": "[freelib]"
+ },
+ "88c03b5c437ac3551661ecfbe6e1de155c3099c4": {
+ "filename": "http://code.jquery.com/jquery-1.0.pack.js",
+ "result": "[freelib]"
+ },
+ "08341cd159e29f561ca0ec16c99bf4b85e43d30f": {
+ "filename": "http://code.jquery.com/jquery-1.0.1.pack.js",
+ "result": "[freelib]"
+ },
+ "84b1514a01def3bc0b52f6fa03d0d9fa349bef72": {
+ "filename": "http://code.jquery.com/jquery-1.0.2.pack.js",
+ "result": "[freelib]"
+ },
+ "d3b30b0fead39e4c40fb0c91408e74439020a279": {
+ "filename": "http://code.jquery.com/jquery-1.0.2.js",
+ "result": "[freelib]"
+ },
+ "fa05290dadfb7d2659a55c50b77595e23f999a74": {
+ "filename": "http://code.jquery.com/jquery-1.0.1.js",
+ "result": "[freelib]"
+ },
+ "4a2c9fd552e1ca9ad66feaaad365990b1e664a8f": {
+ "filename": "http://code.jquery.com/jquery-1.0.4.pack.js",
+ "result": "[freelib]"
+ },
+ "ddb4126bf4713cb4e0f2310401e58cb9e3f98997": {
+ "filename": "http://code.jquery.com/jquery-1.0.3.pack.js",
+ "result": "[freelib]"
+ },
+ "4c12e01d990bd2b1075812d9f28e3ffa50ca59df": {
+ "filename": "http://code.jquery.com/jquery-1.0.3.js",
+ "result": "[freelib]"
+ },
+ "16306f8187df578589821e6eb6b807ac4d467d1f": {
+ "filename": "http://code.jquery.com/jquery-1.1.pack.js",
+ "result": "[freelib]"
+ },
+ "24dd74d65d2e02aae973af97ebbb31b9820a5bbb": {
+ "filename": "http://code.jquery.com/jquery-1.1.1.pack.js",
+ "result": "[freelib]"
+ },
+ "24fdaa88685c8b2dadcc94559ceef318fdcd115b": {
+ "filename": "http://code.jquery.com/jquery-1.1.1.js",
+ "result": "[freelib]"
+ },
+ "07c089df7b7a5da16f434870087d6b0e1c45d3b5": {
+ "filename": "http://code.jquery.com/jquery-1.1.2.pack.js",
+ "result": "[freelib]"
+ },
+ "788bb58005b75a004cd7abbd26f942eea0391f47": {
+ "filename": "http://code.jquery.com/jquery-1.1.2.js",
+ "result": "[freelib]"
+ },
+ "a7e07121debf460f86aa77073676c1e936478c22": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.1.3.js",
+ "result": "[freelib]"
+ },
+ "d0d4200eedc83fe692dd65aeab5a548bfe840d06": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.1.3.1.pack.js",
+ "result": "[freelib]"
+ },
+ "e1c9252b3e60673e4fa1bb1648cb18cd33139535": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.1.3.1.js",
+ "result": "[freelib]"
+ },
+ "0c80055d513ce3103bb70ca956be005f63e32922": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.1.4.pack.js",
+ "result": "[freelib]"
+ },
+ "5af7abb29b3b091080db17e53ef6ddcfa555dbe6": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.1.4.js",
+ "result": "[freelib]"
+ },
+ "e0c497fc264d7706da23235266ed52acf2c7b89a": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.min.js",
+ "result": "[freelib]"
+ },
+ "3aca6488dfb65cf0e600a7a70376ca1354b7377c": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.js",
+ "result": "[freelib]"
+ },
+ "0cafb88edcaebad82c207cdf124de1889364c9f3": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.1.min.js",
+ "result": "[freelib]"
+ },
+ "384cbfe95d92a30d7c86ac07ea5de56f79c15f6a": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.1.js",
+ "result": "[freelib]"
+ },
+ "2710cce192fcc4dc676d9572cd852f104ea59387": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.2.pack.js",
+ "result": "[freelib]"
+ },
+ "6869cb783670d6a4923aaccfe4331015961ed8d6": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.4.pack.js",
+ "result": "[freelib]"
+ },
+ "55c7f265deba4afc1335071fafbbf7fda8f02bbe": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.6.js",
+ "result": "[freelib]"
+ },
+ "f3abd53f3725675e3e049c414749e16df11951ba": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.3.js",
+ "result": "[freelib]"
+ },
+ "7b9e8594368d30387059e5fdef9d662095dbbf7a": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.3.min.js",
+ "result": "[freelib]"
+ },
+ "6be187a67b639b65dc8427eb8e790e42bbe4d7dd": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.3.1.js",
+ "result": "[freelib]"
+ },
+ "fed603a4db640b82de54b246de4be7a1cffa8780": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.3.1.min.js",
+ "result": "[freelib]"
+ },
+ "f0b95e99225f314fbe37ccf6b74ce2f916c517de": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.3.2.js",
+ "result": "[freelib]"
+ },
+ "3dc9f7c2642efff4482e68c9d9df874bf98f5bcb": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js",
+ "result": "[freelib]"
+ },
+ "ea6cc893792569fdbb344181034eb668261f2b24": {
+ "filename": "http://code.jquery.com/jquery-1.5.1.js",
+ "result": "[freelib]"
+ },
+ "fe7b4d1b72fc22fc397f3df3f1fd891c78f8fc96": {
+ "filename": "http://code.jquery.com/jquery-1.5.2.min.js",
+ "result": "[freelib]"
+ },
+ "b509dd44ba3f9c72cf8bba6fcb5f06fae15cabf6": {
+ "filename": "http://code.jquery.com/jquery-1.5.2.js",
+ "result": "[freelib]"
+ },
+ "22c1eefcce5be20a3e0966f5bcdf88ed81e9f5e7": {
+ "filename": "http://code.jquery.com/jquery-1.6.1.js",
+ "result": "[freelib]"
+ },
+ "7fa300666dadade0d006e4c496bf1c85f4b0ab0c": {
+ "filename": "http://code.jquery.com/jquery-1.6.2.min.js",
+ "result": "[freelib]"
+ },
+ "eeee9d4604e71f2e01b818fc1439f7b5baf1be7a": {
+ "filename": "http://code.jquery.com/jquery-1.6.2.js",
+ "result": "[freelib]"
+ },
+ "aee58a81bea80c20176c61ff03caaf0aa273f9a1": {
+ "filename": "http://code.jquery.com/jquery-1.6.3.min.js",
+ "result": "[freelib]"
+ },
+ "61a11f601d70a331de6444c11e72eab2ffd86427": {
+ "filename": "http://code.jquery.com/jquery-1.6.4.min.js",
+ "result": "[freelib]"
+ },
+ "3e5c6d7c6e09965d36df8c1e3d9dca6462c41ec1": {
+ "filename": "http://code.jquery.com/jquery-1.6.3.js",
+ "result": "[freelib]"
+ },
+ "921e7702ac9e4c4a4bca052b7bc83b0304440ee3": {
+ "filename": "http://code.jquery.com/jquery-1.6.4.js",
+ "result": "[freelib]"
+ },
+ "13184e03cd6a0fc0020cf5ad4eee3d8cb3fadac1": {
+ "filename": "http://code.jquery.com/jquery-1.7.min.js",
+ "result": "[freelib]"
+ },
+ "7f389928e5f9d3cb2ae273ae1a6913741d18f0a6": {
+ "filename": "http://code.jquery.com/jquery-1.7.js",
+ "result": "[freelib]"
+ },
+ "b47730ffaec4272a8a01756af2ef13ecea1c4e92": {
+ "filename": "http://code.jquery.com/jquery-1.7.1.js",
+ "result": "[freelib]"
+ },
+ "0b6da89c21e1dd2093fb26366dd90ffeea635c6a": {
+ "filename": "http://code.jquery.com/jquery-1.7.1.min.js",
+ "result": "[freelib]"
+ },
+ "7c64f79dbeeebaa7accd13bf68302c7adb195d7d": {
+ "filename": "http://code.jquery.com/jquery-1.7.2.min.js",
+ "result": "[freelib]"
+ },
+ "0d7896e2bb23f88e26e52b22a075350b354df447": {
+ "filename": "http://code.jquery.com/jquery-1.7.2.js",
+ "result": "[freelib]"
+ },
+ "0eaabd478dd9538ac53334276b8ff784180140a6": {
+ "filename": "http://code.jquery.com/jquery-1.8.0.js",
+ "result": "[freelib]"
+ },
+ "b567b6dd8cb0cb5c1183e55d2f2d1466f32edb39": {
+ "filename": "http://code.jquery.com/jquery-1.8.2.min.js",
+ "result": "[freelib]"
+ },
+ "229d5537173d1f006b744b014a28f64912988c61": {
+ "filename": "http://code.jquery.com/jquery-1.8.2.js",
+ "result": "[freelib]"
+ },
+ "8b6babff47b8a9793f37036fd1b1a3ad41d38423": {
+ "filename": "http://code.jquery.com/jquery-1.8.3.min.js",
+ "result": "[freelib]"
+ },
+ "49a6d1346f3d5a167331a8a5de4f34b5fcc1f6d0": {
+ "filename": "http://code.jquery.com/jquery-1.8.3.js",
+ "result": "[freelib]"
+ },
+ "002da8cbe90fcf32fbdebb72386125079e3805ee": {
+ "filename": "http://code.jquery.com/jquery-1.9.0.min.js",
+ "result": "[freelib]"
+ },
+ "bfc05b695dfa4f23e11d04b84993585da7a764bf": {
+ "filename": "http://code.jquery.com/jquery-1.9.0.js",
+ "result": "[freelib]"
+ },
+ "6c6f10e003ad0c7f462802c0e6422971577c3532": {
+ "filename": "http://code.jquery.com/jquery-1.8.1.min.js",
+ "result": "[freelib]"
+ },
+ "45efe8797f5a875878fec7fdaaa90d99532dbf16": {
+ "filename": "http://code.jquery.com/jquery-1.8.1.js",
+ "result": "[freelib]"
+ },
+ "ebc4e804054a68c177e9c67cc58e7960d3a8706f": {
+ "filename": "http://code.jquery.com/jquery-1.8.0.min.js",
+ "result": "[freelib]"
+ },
+ "ae49e56999d82802727455f0ba83b63acd90a22b": {
+ "filename": "http://code.jquery.com/jquery-1.9.1.min.js",
+ "result": "[freelib]"
+ },
+ "9257afd2d46c3a189ec0d40a45722701d47e9ca5": {
+ "filename": "http://code.jquery.com/jquery-1.9.1.js",
+ "result": "[freelib]"
+ },
+ "348ab13488f5ab45e048dfb39bb4bc8ed9d840c2": {
+ "filename": "http://code.jquery.com/jquery-1.10.0.js",
+ "result": "[freelib]"
+ },
+ "19715ffee604b54e95a0e9db76f6de2b5125c29e": {
+ "filename": "http://code.jquery.com/jquery-1.10.0.min.js",
+ "result": "[freelib]"
+ },
+ "b39b6f7d8c5f62a40960ded5c40cc288c10b438d": {
+ "filename": "http://code.jquery.com/jquery-1.10.1.js",
+ "result": "[freelib]"
+ },
+ "161b78ec52f28657a835e4a5423f03782fd35806": {
+ "filename": "http://code.jquery.com/jquery-1.10.1.min.js",
+ "result": "[freelib]"
+ },
+ "1d85f0f3464e5e49b0522744bf7314e176ac76d9": {
+ "filename": "http://code.jquery.com/jquery-1.10.2.js",
+ "result": "[freelib]"
+ },
+ "0511abe9863c2ea7084efa7e24d1d86c5b3974f1": {
+ "filename": "http://code.jquery.com/jquery-1.10.2.min.js",
+ "result": "[freelib]"
+ },
+ "6945741107601d402c70a13ce46eb72fd1168bc8": {
+ "filename": "http://code.jquery.com/jquery-1.11.0.js",
+ "result": "[freelib]"
+ },
+ "b66ed708717bf0b4a005a4d0113af8843ef3b8ff": {
+ "filename": "http://code.jquery.com/jquery-1.11.0.min.js",
+ "result": "[freelib]"
+ },
+ "73e5d044bd153dd912930e8be433059454ce19cd": {
+ "filename": "http://code.jquery.com/jquery-1.11.1.js",
+ "result": "[freelib]"
+ },
+ "d6c1f41972de07b09bfa63d2e50f9ab41ec372bd": {
+ "filename": "http://code.jquery.com/jquery-1.11.1.min.js",
+ "result": "[freelib]"
+ },
+ "0be05c714a7e6cf28fe692629ece5b3769901dca": {
+ "filename": "http://code.jquery.com/jquery-2.0.0.min.js",
+ "result": "[freelib]"
+ },
+ "79db35e3a94da9ce724c4d3c8ccc5d1864b23a95": {
+ "filename": "http://code.jquery.com/jquery-2.0.0.js",
+ "result": "[freelib]"
+ },
+ "d193cc22196566fce6b7a54d483f8ca55b38a2f5": {
+ "filename": "http://code.jquery.com/jquery-2.0.1.js",
+ "result": "[freelib]"
+ },
+ "2a35d61baf7dde4a800b08fd7b495a62a8a1e620": {
+ "filename": "http://code.jquery.com/jquery-2.0.1.min.js",
+ "result": "[freelib]"
+ },
+ "37fc3e651159cf6b9353a3f6f3bfe6e5e63e0092": {
+ "filename": "http://code.jquery.com/jquery-2.0.2.js",
+ "result": "[freelib]"
+ },
+ "1e0331b6dd11e6b511d2e3d75805f5ccdb3b83df": {
+ "filename": "http://code.jquery.com/jquery-2.0.2.min.js",
+ "result": "[freelib]"
+ },
+ "ad73590c92b4c3f08d02a0751ba4e4aef658daa0": {
+ "filename": "http://code.jquery.com/jquery-2.0.3.js",
+ "result": "[freelib]"
+ },
+ "fbf9c77d0c4e3c34a485980c1e5316b6212160c8": {
+ "filename": "http://code.jquery.com/jquery-2.0.3.min.js",
+ "result": "[freelib]"
+ },
+ "0fe3e567e0776226ee98326ba8cae7680683c112": {
+ "filename": "http://code.jquery.com/jquery-2.1.0.js",
+ "result": "[freelib]"
+ },
+ "98884258cbdb0d939fa2c5e74fc7ac9e56d8170f": {
+ "filename": "http://code.jquery.com/jquery-2.1.0.min.js",
+ "result": "[freelib]"
+ },
+ "8d55aabf2b76486cc311fdc553a3613cad46aa3f": {
+ "filename": "http://code.jquery.com/jquery-2.1.1.js",
+ "result": "[freelib]"
+ },
+ "afb90752e0a90c24b7f724faca86c5f3d15d1178": {
+ "filename": "http://code.jquery.com/jquery-2.1.1.min.js",
+ "result": "[freelib]"
+ },
+
+ "5f99079e4564f94a1d5e45d22d6dc18acbb148da": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.21/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "a2035b74876c5212cfe3e4e35dfd070e74e8c3fd": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.22/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "2a3fa481079f9e02043810cbeee6b5481abf51c0": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.20/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "0881516b541abe68d79724c08c1a665872f8f2c2": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "85b15aef55b1eede971c7febd0c00ba04dc16edf": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.17/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "d9b48fef067caa58d4e1dec54801c22fe0ea7449": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "990dbb08231ef9c9c59653051f5ac7c1e2185d46": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.15/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "2e140b943f459e383f569227b3e5569f0dbc6f34": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.14/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "53dd39212504739ac18790a4461b9a67c50f2728": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "5cd73db8238d48c08c88f12fe9e5b99b6fa644f7": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.12/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "0c3d725fac553c73368496769ff77c3045103704": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.11/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "e5de581f09ac990adae2b4aede35264f1dc5cd72": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "e1e87320b2d14e36a9bba1b637b5247645df7185": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.19/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "8b71e136c6275d0eeed2b55b9e718a54ce343015": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "c71ddb1b3843c24e909a31595b7e873d7e6da45d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "d5203dbbb97db1a68ca5a3adf265f17cdaea738d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.8/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "1b96be82b697e835b903c6c22799c8e4e55e285c": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "2804fac51308f459c3eb9c3d20e7ee009a8ba31c": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.5/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "5d61b19cbee2f8047f518a58ceff7fdaeeb24921": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "7f7859e006f0644a43a7294b50b39e7e9159b3a2": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "842cb8f83614f6de98f70fa7de2f866eecae7ab4": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.1/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "90fab357529f510e5134ad0dcdad3f654894d4fc": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.3/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "960e36796c42dadf66fafb63bba6087c7d6e1d85": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.0/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "1f102103bea71c5e173a916137c563dc62a97cdb": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "61c88c8898ae6bd653737a9dae52209a98998def": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "b87f7150da2b0811ed143443af4038e3e2d41eda": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.0/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "429282063ca7f3bae9797d70a6f09f2e3e05458a": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "e398b87b98ae72cbee9f7d3044189ea638f3f80c": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.22/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "e9b5baec45507c35477aac5d19afbca8cad92426": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.21/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "431b7ebb5e36d5af5e7890b782789ac983e28d00": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.19/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "680f1bd5b4021dbac8b82d68a818d3a94f097ffd": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "fc4c1a4691f3819ecd16eaefa68f96f764538f1e": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.17/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "1d97dd4111b504abc8f6dee45daf6f358aa40140": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.5.3/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "aff393e11d2122a6026df1e2f75d46de4ead89ff": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.5.2/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "d81b246f0f221f4d9a6eb74a8994c4041d2b7215": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.6.0/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "8e8b0dccbacc70dc6406023be9e35dfa4f3a944e": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "67070ff953d6b0f886083edba723f6d66fa6cbca": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.15/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "6952564ff6404bd93cb523f1634b451ac1cc8fec": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.14/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "b48e01c35c1e6ad622386b9a3161bd1bf02723c8": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "34d32c47711aa10bdeb196c55d489962296a64c4": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.12/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "33f5808531e82f2f6e8859da3a765c4d8a0073d2": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.11/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "973e1554af7d9240e059e38165f2e7b5fc7aa0a5": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "ae74362cdb2fadb2eee6c962f47f1e33af51c79d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.20/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "31d0cb90f7b82088df6c4e00b5765f9dccc48329": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.js",
+ "result": "[freelib]"
+ },
+ "a192b2ef3371febba192179ff86e3da3f633160d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "db895a7ed5c8b42e27de2b3ef3199d038a259fdb": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.8/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "06adc576409427237ce3c269bb9a568d3cd53c9b": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.7/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "8fdfbe7ccaf0bdcde4c0b34738c0cd73b4587a45": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.6/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "02d2e4a524b0da52c3cb236619ad065fec44d69a": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.5/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "42936431058c6c4663e64e2c07931b9159083c31": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.4/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "bbf7ce8f5ce8d8f9d207f8973328527ac0093b17": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "09fdd3d9aebc9086b27b45b3fb051ebded272b39": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "e002b335c75b5edefcd251962f61f53a2ab8e0f2": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.0/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "b5f2733aac4e257929a5f1ff93410ee0bda311b6": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.3/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "f978dcb9ea6ecfbc7f8a2f9948bacd679c0cd1b4": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "f78ae3cdaf4a6a21dfb2565491f5d295462d8be3": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.1/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "5ed6bdacae842fc530dbc83aabb9a466c7f2b5a1": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.6.0/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "fe810f47883364fbc4dc2c61e03a3aca0f74fed7": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.5.3/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "da851ac384c279992d1855d59257f8d98c603063": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.7.0/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+ "5b59bc1a7087c3a83abd5b9ff559a88428ceab0a": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/jqueryui/1.5.2/jquery-ui.min.js",
+ "result": "[freelib]"
+ },
+
+ "0a2054143eddc76447bacf3da455ffc1c726e304": {
+ "filename": "http://yui.yahooapis.com/3.6.0/build/yui-base/yui-base.js",
+ "result": "[freelib]"
+ },
+ "5f47da5d3c8902e763ef6ae02e9307a63a95ae5a": {
+ "filename": "http://yui.yahooapis.com/2.6.0/build/yuiloader/yuiloader-min.js",
+ "result": "[freelib]"
+ },
+ "52ebc252c54e6cdaa9e349e1fea37a2950f6af96": {
+ "filename": "http://yui.yahooapis.com/2.7.0/build/yuiloader/yuiloader-min.js",
+ "result": "[freelib]"
+ },
+ "e77f9c1022bb48425d63cbaf309d7718ff5d3fbd": {
+ "filename": "http://yui.yahooapis.com/2.8.0r4/build/yuiloader/yuiloader-min.js",
+ "result": "[freelib]"
+ },
+ "8f1cfeefecc782f53f411de1bf64c77b48b8ba56": {
+ "filename": "http://yui.yahooapis.com/2.8.1/build/yuiloader/yuiloader-min.js",
+ "result": "[freelib]"
+ },
+ "aa113da84ddbad46a8002ea22393a238eccf9ee4": {
+ "filename": "http://yui.yahooapis.com/2.9.0/build/yuiloader/yuiloader-min.js",
+ "result": "[freelib]"
+ },
+ "a4fadcd6f68d7823a9fd9d1f6089025041a3212a": {
+ "filename": "http://yui.yahooapis.com/2.8.2/build/yuiloader/yuiloader-min.js",
+ "result": "[freelib]"
+ },
+ "c398b7eab95bfe84816f60311eaf91194f3bfec8": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/aes.js",
+ "result": "[freelib]"
+ },
+ "a7eba31001379f751d1a54b988ccdb500d873ec1": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/enc-base64.js",
+ "result": "[freelib]"
+ },
+ "9bdf0dfad487422fd36693d4119b59175f0112ee": {
+ "filename": "http://yui.yahooapis.com/2.8.1/build/yuiloader/yuiloader.js",
+ "result": "[freelib]"
+ },
+ "d9f710afddaba467707c0d6e7b187a8beae1e1f2": {
+ "filename": "http://yui.yahooapis.com/2.8.2/build/yuiloader/yuiloader.js",
+ "result": "[freelib]"
+ },
+ "5f8d372d7b385588f61dd53c588608f47a3c3b60": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/enc-utf16.js",
+ "result": "[freelib]"
+ },
+ "4dc6c77a03258ee7fbe5e877a1ed97311bc45652": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject_src.js",
+ "result": "[freelib]"
+ },
+ "5847ed101f55d51c53538a7078971e7de8fb6762": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js",
+ "result": "[freelib]"
+ },
+ "fe91b37266d1cdb4b4f51297f69326e271704f35": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.3.1/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "493afa22594fdff6e6fc4f21f99c626533c35b06": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.3.0/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "9fa29ea8f3ec6714b3b6236eb2ce6e1ce905c560": {
+ "filename": "http://yui.yahooapis.com/2.6.0/build/yuiloader/yuiloader.js",
+ "result": "[freelib]"
+ },
+ "1523029ce227a35976407408c5d08039c8fe4f0e": {
+ "filename": "http://yui.yahooapis.com/2.7.0/build/yuiloader/yuiloader.js",
+ "result": "[freelib]"
+ },
+ "9514b1927292acf4c670fae6492e9ce2e263472f": {
+ "filename": "http://yui.yahooapis.com/2.8.0r4/build/yuiloader/yuiloader.js",
+ "result": "[freelib]"
+ },
+ "6b911b0dc178423b946b0299851d9661004c21ef": {
+ "filename": "http://code.jquery.com/jquery-1.4.1.js",
+ "result": "[freelib]"
+ },
+ "65cbff4e9d95d47a6f31d96ab4ea361c1f538a7b": {
+ "filename": "http://code.jquery.com/jquery-1.4.2.min.js",
+ "result": "[freelib]"
+ },
+ "f02e1f7f1bb966d5fcf16b03daa79ee077a993f8": {
+ "filename": "http://code.jquery.com/jquery-1.4.js",
+ "result": "[freelib]"
+ },
+ "b9c72aa78de3c124248f30234c64bf6f3b1a7cb5": {
+ "filename": "http://code.jquery.com/jquery-1.1.3.pack.js",
+ "result": "[freelib]"
+ },
+ "bff995d3a845903f281b0b51fea421059459a808": {
+ "filename": "http://code.jquery.com/jquery-1.4.1.min.js",
+ "result": "[freelib]"
+ },
+ "b5efe44645f5358e3d785091af3440f80afa85e3": {
+ "filename": "http://code.jquery.com/jquery-1.4.min.js",
+ "result": "[freelib]"
+ },
+ "0e9545b59077541c44f521769243a8b717d83aae": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.5/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "e80905e4a45e31075b89189f5ba4913fc0451fdf": {
+ "filename": "http://yui.yahooapis.com/2.9.0/build/yuiloader/yuiloader.js",
+ "result": "[freelib]"
+ },
+ "80494ad8eb98e317ffec3671b00944cdc30cee02": {
+ "filename": "http://yui.yahooapis.com/3.4.0/build/yui-base/yui-base-min.js",
+ "result": "[freelib]"
+ },
+ "83d1b489e30275a03f568f7e3fa6537d695e0197": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.pack.js",
+ "result": "[freelib]"
+ },
+ "e956e4de8f223992e2d1362d78c5b5bb33e27497": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.4/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "3c737636f4789a45b73f5365cd4cfc8c0922f458": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/hmac.js",
+ "result": "[freelib]"
+ },
+ "42a8029d12e24767778fc1c6d978b4696b445524": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/mode-cfb.js",
+ "result": "[freelib]"
+ },
+ "14682f01c5c15f8656cb01425487ad675676df8e": {
+ "filename": "http://yui.yahooapis.com/3.5.1/build/yui-base/yui-base-min.js",
+ "result": "[freelib]"
+ },
+ "e1ae2c72f8c5e1b6c423c015349a476f8a908b22": {
+ "filename": "http://yui.yahooapis.com/3.4.1/build/yui-base/yui-base-min.js",
+ "result": "[freelib]"
+ },
+ "ca0aea084a63d0a56e1bbf17fde5061f631b391f": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.1.pack.js",
+ "result": "[freelib]"
+ },
+ "265a86a9d9df5dfdbad77e06c85605bec4beb32a": {
+ "filename": "http://code.jquery.com/jquery-1.4.2.js",
+ "result": "[freelib]"
+ },
+ "a2358d630d1a5dad24b679d52e9777b7349910b2": {
+ "filename": "http://yui.yahooapis.com/3.5.0/build/yui-base/yui-base-min.js",
+ "result": "[freelib]"
+ },
+ "65fe3b80fae349ecb3acd6541ef651d1ff4961f6": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.1/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "66851ab2133e27b97c4f3048416b947aa7ed82c5": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/swfobject/2.1/swfobject.js",
+ "result": "[freelib]"
+ },
+ "08f37f8169e620c6ecd87635c18fc2b22e3e850e": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/scriptaculous.js",
+ "result": "[freelib]"
+ },
+ "28780fdb8fc54bf7d80b1f223abca4f77cd89e85": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/swfobject/2.1/swfobject_src.js",
+ "result": "[freelib]"
+ },
+ "00a5e26ff9ed4b84fc93c764225684c33588a41e": {
+ "filename": "http://yui.yahooapis.com/3.6.0/build/yui-base/yui-base-min.js",
+ "result": "[freelib]"
+ },
+ "fe56013bb04c602e676feb34bb49add4da2e0225": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.3/scriptaculous.js",
+ "result": "[freelib]"
+ },
+ "6c445baf655cccb16ee2788714827ab186ed94bf": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.2/scriptaculous.js",
+ "result": "[freelib]"
+ },
+ "74974f9dc0810ea359367589cb273dd5174d80df": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.1/scriptaculous.js",
+ "result": "[freelib]"
+ },
+ "c7e9c7f2fb17e0d2ca2391e33007bf3547fec465": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/prototype/1.7.1.0/prototype.js",
+ "result": "[freelib]"
+ },
+ "d97ecac3f1b3ccf1f0f68434e8406f87f5acc907": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.2.min.js",
+ "result": "[freelib]"
+ },
+ "97be02d1785b7bb4f41ae116a6a9bef74cb018d6": {
+ "filename": "http://code.jquery.com/jquery-1.4.3.min.js",
+ "result": "[freelib]"
+ },
+ "6a7a7d88fa4e7369003de24164f5961852731e0e": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/mode-ctr.js",
+ "result": "[freelib]"
+ },
+ "d65a39fc4b09df061a30172f080019ef9d800ca4": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/mode-ecb.js",
+ "result": "[freelib]"
+ },
+ "427300f82762288c5af967dbf642fbec58c201ea": {
+ "filename": "http://code.jquery.com/jquery-1.4.4.js",
+ "result": "[freelib]"
+ },
+ "94ec4a3bcd6b30353584026c0e109e79fb21b6ad": {
+ "filename": "http://code.jquery.com/jquery-1.5.min.js",
+ "result": "[freelib]"
+ },
+ "71adcc2cae87e412e521e4a7276efeaee2347927": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.2.js",
+ "result": "[freelib]"
+ },
+ "677c1ad6d84705c818d63a43298ee3a12959c1b3": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.3.pack.js",
+ "result": "[freelib]"
+ },
+ "3d542e33a9f3eb3cb45e06fe93d08dd4b7490496": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/prototype/1.7.0.0/prototype.js",
+ "result": "[freelib]"
+ },
+ "e70997dd3dbadadebf375908515617059d0c597e": {
+ "filename": "http://yui.yahooapis.com/3.4.1/build/yui-base/yui-base.js",
+ "result": "[freelib]"
+ },
+ "b3db6906c1c0641b7a3098e547e0a8039accd80a": {
+ "filename": "http://yui.yahooapis.com/3.5.0/build/yui-base/yui-base.js",
+ "result": "[freelib]"
+ },
+ "cc66556593e147584f19b41b697405f828f7562e": {
+ "filename": "http://code.jquery.com/jquery-1.5.js",
+ "result": "[freelib]"
+ },
+ "c147a1a86a2c33e60f160b8861501f43f4638c8d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js",
+ "result": "[freelib]"
+ },
+ "d45787e64e233eb17f3f1492b12a682f294f866a": {
+ "filename": "http://code.jquery.com/jquery-1.5.1.min.js",
+ "result": "[freelib]"
+ },
+ "278d68b8e9edad4895836e272fbc8f78ec4f2f3e": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/prototype/1.6.0.3/prototype.js",
+ "result": "[freelib]"
+ },
+ "b98bb654c88a9b7da659fe8dad95a5c7376bb166": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/md5.js",
+ "result": "[freelib]"
+ },
+ "6463e558dd79d51a2e8464806824c7bbc18c77fd": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.3.min.js",
+ "result": "[freelib]"
+ },
+ "5cc87d3fcd5cb3c5913c08bad17ff80f4d0d7f46": {
+ "filename": "http://yui.yahooapis.com/3.4.0/build/yui-base/yui-base.js",
+ "result": "[freelib]"
+ },
+ "333b6d92a99eac873b1de2045c670fbdb61970ab": {
+ "filename": "http://yui.yahooapis.com/3.5.1/build/yui-base/yui-base.js",
+ "result": "[freelib]"
+ },
+ "522f0852b91775306ca47138c1d6ceeb87677880": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/mode-ofb.js",
+ "result": "[freelib]"
+ },
+ "4407f7b9602539e80f1569ae734696fd92deeff0": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/pad-ansix923.js",
+ "result": "[freelib]"
+ },
+ "c82ea9768b18696832408b6cc729e2e121def691": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.3.js",
+ "result": "[freelib]"
+ },
+ "0d2bc9db63acd9cc238a4925e79f9a3079490970": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.4.min.js",
+ "result": "[freelib]"
+ },
+ "5900300a75ed7917eaa6f75077afe9ef49e66986": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js",
+ "result": "[freelib]"
+ },
+ "2cc787ebd4d29f2e24646f76f9c525336949783e": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.5/mootools.js",
+ "result": "[freelib]"
+ },
+ "a965003ea3313be11a02743f4807411c9eb71f04": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/pad-iso10126.js",
+ "result": "[freelib]"
+ },
+ "3bb92e84642c03cf0fe49174d0e1c420d46d2e18": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.4.js",
+ "result": "[freelib]"
+ },
+ "325edd57857f7a3160cfe2512dff5526d7e647db": {
+ "filename": "http://code.jquery.com/jquery-1.6.min.js",
+ "result": "[freelib]"
+ },
+ "034970f98cb529c779c8f961b2b7c09ecb499240": {
+ "filename": "http://code.jquery.com/jquery-1.6.js",
+ "result": "[freelib]"
+ },
+ "341a7a52109c3abfb23d5a5b4f363fd8d6a52f6c": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/pad-iso97971.js",
+ "result": "[freelib]"
+ },
+ "c654cdaa3ca1184d9b18d0c31f8369a04c63f7f5": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/pad-nopadding.js",
+ "result": "[freelib]"
+ },
+ "20860bad9c83c3890be57052f009b9d97848c9ec": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.5.min.js",
+ "result": "[freelib]"
+ },
+ "6111fcf6c2277eba8821ca365dbbea472a3206e7": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.4/mootools.js",
+ "result": "[freelib]"
+ },
+ "9025fe9334566eb919ddca85a8f949b01c7d837d": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.5.pack.js",
+ "result": "[freelib]"
+ },
+ "0e9a07ee104153a459cdbcb9fa28293b4bbb429f": {
+ "filename": "http://code.jquery.com/jquery-1.6.1.min.js",
+ "result": "[freelib]"
+ },
+ "e55462193a857ffe36e42bfcbecfebf1ca33d0b8": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.3.2/mootools.js",
+ "result": "[freelib]"
+ },
+ "7df0e9aae795337db012b3efd0b9ee9cc7719b56": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.3.0/mootools.js",
+ "result": "[freelib]"
+ },
+ "8963108fa84c2033a1052d47079d7f75a7e5b60e": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.5.js",
+ "result": "[freelib]"
+ },
+ "aa7020d6c8d5475ae588640954caa9e4cdd7eca0": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/pad-zeropadding.js",
+ "result": "[freelib]"
+ },
+ "1be9c3684054001f53fa7ff6d85ec3cb573a9cd2": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js",
+ "result": "[freelib]"
+ },
+ "e0f3225498158bc63af7bfba636b091ea4ee5fcd": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/pbkdf2.js",
+ "result": "[freelib]"
+ },
+ "c415b533f7edda8b9de417cc0517904f86e9fe1f": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/rabbit.js",
+ "result": "[freelib]"
+ },
+ "c10dbe0c2b23444d0794f3376398702d84f41583": {
+ "filename": "http://jqueryjs.googlecode.com/files/jquery-1.2.6.pack.js",
+ "result": "[freelib]"
+ },
+ "f4d4125bcd5151aad69dd849a11fc1ca589cc64b": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.3.1/mootools.js",
+ "result": "[freelib]"
+ },
+ "4ee6675ca57dda3255aa669d8ec4d35760eb47c3": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.0/mootools.js",
+ "result": "[freelib]"
+ },
+ "0c89448016629bb2ea758f4e98529c2e166a122d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.1/mootools.js",
+ "result": "[freelib]"
+ },
+ "b4096385cad3144e81c255aa6e4b7dabb30bc19f": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/rc4.js",
+ "result": "[freelib]"
+ },
+ "037f4fadbc2020ccb4935384b8ae5af62bdd0145": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/sha1.js",
+ "result": "[freelib]"
+ },
+ "bc018ec49a5c7757577bb63e5d5f8a99be0e3954": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.2/mootools.js",
+ "result": "[freelib]"
+ },
+ "aa5c283b9e094eeacdd080b44951406abbc9e58c": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/sha224.js",
+ "result": "[freelib]"
+ },
+ "6dc7644a54d5cc254a1f6d7cb7154128b2b6570a": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.3/mootools.js",
+ "result": "[freelib]"
+ },
+ "c0c37b7d3119f29d3759fdaf7eb8bc4670ea9e7f": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.1.1/mootools.js",
+ "result": "[freelib]"
+ },
+ "b38f741b43f6ddcce3f1b47274d1683cca9f07a8": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/sha256.js",
+ "result": "[freelib]"
+ },
+ "e29701dd85d792bddbf52d1e1fc3d1ada41b6192": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/sha384.js",
+ "result": "[freelib]"
+ },
+ "cc019ac09f68258ee3442fe7cc440adf78a3cef2": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.5/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "e88bb2c302b41a4cc5b97604354a48d068e3e1eb": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/sha512.js",
+ "result": "[freelib]"
+ },
+ "fc39ed8ca4a58668124471e509506443de4467f2": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.4/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "b1a271458ae47d0b47c9e0996956091a93dec16f": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.1/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "86f0df8662b511142dfc4e0ce9c81d805c8d7a7e": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.0/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "e0bfed3ffc741a9f4e59e6004a1dec9c71241a59": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/x64-core.js",
+ "result": "[freelib]"
+ },
+ "fc21f8084ad4040ddbf620ba79acd3998fb3dc7b": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.3.2/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "1e8f9e1614db771782bc9e871fb712b06610b9f4": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.2/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "c7e2076a3af9997731499bc1f7dc3941b522c1eb": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.4.3/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "dd7783b4c8d4ecaad4091d1d32df2f97d7b10ddc": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.1.2/mootools.js",
+ "result": "[freelib]"
+ },
+ "55bba460dcbb70562536ddd5c8734b311f38c42d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.1/mootools.js",
+ "result": "[freelib]"
+ },
+ "3c1ddf62af20a1f5c5de7a3af180b32528dc47db": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.2/mootools.js",
+ "result": "[freelib]"
+ },
+ "c43a38fce1aa745d59b1a6f7ab7def81f28701a4": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.3/mootools.js",
+ "result": "[freelib]"
+ },
+ "e5335c2a82f26e49b1324edc21e452de040d5cdc": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.4/mootools.js",
+ "result": "[freelib]"
+ },
+ "ccf015fcd45618c6b116977c96539d93ee10b542": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/tripledes.js",
+ "result": "[freelib]"
+ },
+ "3d9fc65389ce7de16f87909039aa2e728c693b3d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.5/mootools.js",
+ "result": "[freelib]"
+ },
+ "5f970c3c8ca26a94c14a1ae1e7321621cf4eae0c": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.1.2/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "03a65e56fc95caea1b85a591c984e9b6c080726d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.1.1/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "669d164e3bff6156b21084cf035979d62433df75": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.2/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "f3e20ad41082a93dbd09202590717da71aebd316": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/mootools/1.2.3/mootools-yui-compressed.js",
+ "result": "[freelib]"
+ },
+ "8dda5f159c9bedee9f4a6b7a7a6028a554977994": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.4.3/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "15c3f73c75bb3ab87040fe55240f9dd5ea69b6bf": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/ext-core/3.1.0/ext-core-debug.js",
+ "result": "[freelib]"
+ },
+ "5c83aac1a3409dc1ec3a228e4c765292eb4434d4": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/ext-core/3.0.0/ext-core-debug.js",
+ "result": "[freelib]"
+ },
+ "7dc1b4f3e358c58030c4676c990eff60a0fc838f": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/ext-core/3.1.0/ext-core.js",
+ "result": "[freelib]"
+ },
+ "d19d40a20252730e9fd9af1c7867c0f5417ebe32": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/ext-core/3.0.0/ext-core.js",
+ "result": "[freelib]"
+ },
+ "e1db767afb82018ab6a695fe52334f2f5d81a0e3": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "a90b5f6afb6c78b30c3539392d49e45fd9dfe3d9": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.5.1/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "0a0a820f2bc4f2dac8dcfde2282411275e2dc697": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.5/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "b6d2c0b655b327407966b52303449dedce084ded": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.4.3/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "4cc838a3be933fda21bbbfc8f52b01e14a1e70a5": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.4.1/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "2ef4341a4ca0b9a0fc1aea422d85b5d9771fde87": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.4.0/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "df435b881e8364ddfbd44d5f786b10c75f964175": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.3.2/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "19214655c4152b79f204e222a481d1e18da84972": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.3.1/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "f444ee6b041735ee6109dd2fe3c3a7755fa949f7": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.3.0/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "c7f5b42b2306a79f67988ee073ac98c2a1d5782f": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.2.3/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "d8afec39893c1a99139212feb40888847f8a5253": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.2.0/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "a6edefef305d9164212fa140426629c7d8a58c93": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.1.1/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "a3e5c42f93722ad28cda811f8635bddf213819ed": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "741b8eeb65774256a8a76ea1af91f976357fcd81": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.5.1/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "911a35988b8540414cfbc990fbc112eb124fd968": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.5/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "c753cf372377ef0b5a18204cd86df8d4792fa8f5": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.4.1/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "8b95d59f6b28b072ceb4228a6db107b934500a02": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.4.0/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "8c135fc57355fe5d5a18f3dbe5736bc772bb20a7": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.3.2/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "70b1fe9dd4ebec0b5d417647e549bca8f9200020": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.3.1/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "8980e43d4750c63eb57cfff5f0723f118d243c67": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.3.0/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "d2fc56e1b9f2014fb7710d186a355a57e3acd283": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.2.3/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "2bab42610adee25cdc0d3a4ba96b94f1e9ccd115": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.2.0/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "6bb906d86dd239add79d0779a9fcdf9740aa7e3b": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.1.1/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "3d96f61e48510cbe595081ef8b2d5c8479f95d3e": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.7.1/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "1e4cb0dcb97df9a15433477f9f8a666914eedc3c": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.7.0/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "47732fb5e03d251aff1a7c0b550a3af74c7ceea5": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.7.3/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "85399dd9527026afc66a6fb43ad5c0d4ea97f83e": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.7.2/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "147eab514dfe1d88506a5e158b782cb5c504c056": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.8.0/dojo/dojo.xd.js.uncompressed.js",
+ "result": "[freelib]"
+ },
+ "229e4025f71b0b94d98505f56c5cfd7cd41d06aa": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.7.3/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "135ade1e60da3e3b79fd73c3a6a005a250e2a7f7": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.8.0/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "135188b624daae8f4b015b0b8b75875a6132aa3d": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.7.1/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "fac80a6188865418344d4b6c5d4955ee7e7362c2": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.7.0/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "311d8f38b12a09f16f5a19e1dfb6575b5ce0f83c": {
+ "filename": "https://ajax.googleapis.com/ajax/libs/dojo/1.7.2/dojo/dojo.xd.js",
+ "result": "[freelib]"
+ },
+ "ca2868985811d45cfbad118a297869707572e0bb": {
+ "filename": "https://raw.github.com/voldsoftware/toolbarbutton-jplib/stable/lib/toolbarbutton.js",
+ "result": "[freelib]"
+ },
+ "32d542564913a016f1cea340ba8ac164c160004d": {
+ "filename": "http://yui.yahooapis.com/3.3.0/build/yui-base/yui-base.js",
+ "result": "[freelib]"
+ },
+ "012cc186912c473552a341b2eaffb71240688ccd": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/cipher-core.js",
+ "result": "[freelib]"
+ },
+ "d1c9d4d91c1c3c76f601778cb5e0489e0f80a10d": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/evpkdf.js",
+ "result": "[freelib]"
+ },
+ "794503310ed31a11f233e1acdddc10f2ce91748e": {
+ "filename": "http://crypto-js.googlecode.com/svn/tags/3.0.2/src/core.js",
+ "result": "[freelib]"
+ },
+ "5717e22c3b2c7caf870fc0772a64344962b59ee6": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.6/underscore.js",
+ "result": "[freelib]"
+ },
+ "7e0294019938a772f4ddd7799501496074e0f0fb": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.7/underscore.js",
+ "result": "[freelib]"
+ },
+ "28e41c3ce9232633468013342c49fd62a4f5f6bd": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.2/underscore.js",
+ "result": "[freelib]"
+ },
+ "8d84b347dfe4f5b75f7b5f670326ca5c8041b7a9": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.3/underscore.js",
+ "result": "[freelib]"
+ },
+ "9564fa7a6a001e4e56b0244ccda03eef3940813e": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.3/underscore.js",
+ "result": "[freelib]"
+ },
+ "058cbd179f032f667823545519aa2d10b0b69508": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.2/underscore.js",
+ "result": "[freelib]"
+ },
+ "868141351efa758d031779c776e608e3a049d823": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.4/underscore.js",
+ "result": "[freelib]"
+ },
+ "2fee700150a7de876acc21403f77e57dae2f5618": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.5/underscore.js",
+ "result": "[freelib]"
+ },
+ "40946800c5c8bee189ca3e7f8017661f9456e490": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.0/underscore.js",
+ "result": "[freelib]"
+ },
+ "b842a8ca5e996e001e648fc8c73316cd55e496ed": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.4/underscore.js",
+ "result": "[freelib]"
+ },
+ "f2fa9179d764f6a688dc0c99b1b5283f1b680249": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.1/underscore.js",
+ "result": "[freelib]"
+ },
+ "c1dff1c5dbb68af6e22bd401afd28aab970a8aff": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.3/underscore.js",
+ "result": "[freelib]"
+ },
+ "5846c870e0f1daca152db22277915adb6520ffa3": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.0/underscore.js",
+ "result": "[freelib]"
+ },
+ "cdacc2b0045fa1b920b64664b88b155d0c0df169": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.2/underscore.js",
+ "result": "[freelib]"
+ },
+ "baa693e82387a328abccf9694c6d2db571ac8aca": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.3.3/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "e67cf6a985999c7ef5595772e4ffefeacd0c6ac3": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.1/underscore.js",
+ "result": "[freelib]"
+ },
+ "0a15952061f6fb7a5493281f6ff8eb916a417e2f": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.3.1/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "bd9624f882f7d3d29292ddc7f484987b3e991cb5": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.3.0/underscore.js",
+ "result": "[freelib]"
+ },
+ "ede1d022640f26eaa6109da9e924670f6ed14cce": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.3.2/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "63f6a94752e5fde78627529763e67ecd4ef78f12": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.4/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "1185da1043863517c6aa0a4e0a3bc433dfb98313": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.2/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "86752ba2e4f3855a8a5e45d5f07567ea70a9cc98": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.3.0/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "cfbc3fa20d685d100308e123c3310dc9600ef0fd": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.3/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "083bbcd739b7b1336f13c72603e1704b164c02bd": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.1/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "f665459959c5167c0905974a62ffe923f2c19813": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.5/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "2de2ecea5ba12e7235ffb44d6892cc77fe6f4abe": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.4/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "81afb4cd3755671fea5e74d7118d7d460c475308": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.7/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "9e389ede8ed7f782c5ecf2f87c3afa3b1e309bff": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.3/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "703d6a61f31ddb45252c55813556a92e8cc2ee22": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.6/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "7d6e352b0d26655ba851863561b5d912cc24caa7": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.0/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "5de53da57fc8b7ab6c77d597c22875d747352fef": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.1/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "bcdd63e18a8a7cf728253f738556ad3b88d74649": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.2/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "ee68308411c690cd51cc8a43fe6ae60d3d1678af": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.4/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "49a747d3284b1d04f3eb823a4188f7725004f823": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.1.0/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "97f93241957893ebd7febc5b5bac9a7bd1d94a0f": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.3/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "710c3a99f0bd456c2fd6dcbcbd1e500e0646ec19": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.1/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "7361e8afa72bd0098e2520584786474c9c4a5064": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.2/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "ad0775c89a87111019840dc7bbf902d832e4ccdf": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.0.0/underscore-min.js",
+ "result": "[freelib]"
+ },
+ "34454bfed864addf8ec4aacdd9adf872f8360ed3": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.3.1/underscore.js",
+ "result": "[freelib]"
+ },
+ "07916c0b7274275f916fe288d01b254545b17d9a": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.4/underscore.js",
+ "result": "[freelib]"
+ },
+ "133de2283d03193cb06f62f92c494afe098460a5": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.0/underscore.js",
+ "result": "[freelib]"
+ },
+ "4c977634c87efbd2b7113993d36dad603b8dcf2f": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.2.1/underscore.js",
+ "result": "[freelib]"
+ },
+ "3fa74bb289537fcdee796b26968e47d53d38f903": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.3.2/underscore.js",
+ "result": "[freelib]"
+ },
+ "772b2587aa2fa345fb760eff9ebe5acd97937243": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.3.3/underscore.js",
+ "result": "[freelib]"
+ },
+ "562c6c44b39809ec07c047f4ed6c591f3ae7c034": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.4.0/underscore.js",
+ "result": "[freelib]"
+ },
+ "063a7d75792dff2b46eee81cc12de63def672911": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.4.1/underscore.js",
+ "result": "[freelib]"
+ },
+ "47479149fe12fc56685a9de90c5a9903390cb451": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.4.2/underscore.js",
+ "result": "[freelib]"
+ },
+ "d53fbd7308ae3d7eeb4a536c2cbfe739648850b4": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.4.3/underscore.js",
+ "result": "[freelib]"
+ },
+ "6d9ee62759cb911ec03b21078c9f92f0f2afa25c": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.4.4/underscore.js",
+ "result": "[freelib]"
+ },
+ "5d42ed92480d3a88efa270449f38c6d88d653af5": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.5.0/underscore.js",
+ "result": "[freelib]"
+ },
+ "9ee15c1f1a84a258ba5f48de72da3538c8b7c375": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.5.1/underscore.js",
+ "result": "[freelib]"
+ },
+ "c9ae7b502c521d2f53b9065ef4fc7d7cc97dce4c": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.5.2/underscore.js",
+ "result": "[freelib]"
+ },
+ "fe1b87838b7328273812380d26837f58348103b0": {
+ "filename": "https://raw.github.com/documentcloud/underscore/1.6.0/underscore.js",
+ "result": "[freelib]"
+ }
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/beta-ribbon-cropped.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/beta-ribbon-cropped.png
new file mode 100644
index 0000000..738a0ea
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/beta-ribbon-cropped.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/beta-ribbon.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/beta-ribbon.png
new file mode 100644
index 0000000..3ba267b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/beta-ribbon.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/button-download.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/button-download.png
new file mode 100644
index 0000000..5ca5430
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/button-download.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/collapsed-nonfree.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/collapsed-nonfree.png
new file mode 100644
index 0000000..0790b1b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/collapsed-nonfree.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/expanded-nonfree.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/expanded-nonfree.png
new file mode 100644
index 0000000..0d8bc70
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/expanded-nonfree.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/libre.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/libre.png
new file mode 100644
index 0000000..8042caa
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/libre.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/librejs-running-blocked-wikipedia.jpg b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/librejs-running-blocked-wikipedia.jpg
new file mode 100644
index 0000000..c54d839
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/librejs-running-blocked-wikipedia.jpg
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/logo-medium.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/logo-medium.png
new file mode 100644
index 0000000..0bb6eb2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/images/logo-medium.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/index.html b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/index.html
new file mode 100644
index 0000000..5bbc3aa
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/index.html
@@ -0,0 +1,131 @@
+<!doctype html>
+<html lang="en">
+
+ <head>
+ <meta charset="utf-8" />
+ <title>LibreJS | Whitelist </title>
+
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
+
+ <!-- Your styles -->
+ <link rel="stylesheet" href="styles/styles.css" type="text/css" media="screen" />
+ <script type="text/javascript">
+ /**
+ *
+ * @licstart The following is the entire license notice for the
+ * JavaScript code in this page.
+ *
+ *
+ * Copyright (C) 2011, 2014 Loic J. Duros
+ *
+ * The JavaScript code in this page is free software: you can
+ * redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GNU GPL) as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option)
+ * any later version. The code is distributed WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
+ *
+ * As additional permission under GNU GPL version 3 section 7, you
+ * may distribute non-source (e.g., minimized or compacted) forms of
+ * that code without the copy of the GNU GPL normally required by
+ * section 4, provided you include this license notice and a URL
+ * through which recipients can access the Corresponding Source.
+ *
+ *
+ *
+ * @licend The above is the entire license notice
+ * for the JavaScript code in this page.
+ *
+ *
+ *
+ */
+ </script>
+ <!-- Bootstrap CSS (APL 2.0)-->
+ <link href="third-party/bootstrap/css/bootstrap.min.css" rel="stylesheet" media="screen">
+ <link href="third-party/jquery-ui/css/ui-lightness/jquery-ui.theme.min.css" rel="stylesheet" media="screen">
+
+ <link media="screen" rel="stylesheet" href="styles/form.css">
+ <script src="third-party/jquery/jquery.min.js"></script>
+ <script src="third-party/jquery-ui/js/jquery-ui.min.js"></script>
+ <script src="third-party/bootstrap/js/bootstrap.min.js"></script>
+
+ <link href="third-party/editable/bootstrap-editable/css/bootstrap-editable.css" rel="stylesheet">
+ <script src="third-party/editable/bootstrap-editable/js/bootstrap-editable-inline.min.js"></script>
+ <script src="third-party/block-ui/jquery.blockUI.js"></script>
+ <!--<script src="js/form-types.js"></script>-->
+ <script src="js/form-row.js"></script>
+ <style>
+ #rules button {
+ margin-top:0 !important;
+ }
+ .drag-handle {
+ cursor:pointer;
+ }
+ #loadingBox {
+ display:none;
+ }
+ </style>
+
+ </head>
+
+ <body>
+ <header id="site-header">
+ <div class="container">
+ <hgroup class="row">
+ <h1><a id="logo" target="_blank" href="http://www.gnu.org/s/librejs/" title="LibreJS -- Free JavaScript in your browser">LibreJS -- Free JavaScript in your browser</a></h1>
+ </hgroup>
+ </div>
+ </header>
+
+ <div id="main">
+ <div id="promotional">
+ <div class="container">
+
+ <div class="row">
+
+ <div class="span12">
+ <div class="page-header">
+ <h1>LibreJS | Whitelist</h1>
+ </div>
+ <div>
+ <button class="deleteall btn">reset whitelist to default.</button>
+ <table style="max-width:800px" id="whitelist" class="table table-bordered table-striped">
+ <thead>
+ <tr>
+ <th class="rule-type">JavaScript contents hash-code</th>
+ <th class="url">Found at URL</th>
+ <th class="reason">Reason</th>
+ <th class="delete-rule">Delete script from whitelist</th>
+ </tr>
+ </thead>
+ <tbody>
+
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+
+ </div>
+ <div id="loadingBox"><img src="images/ajax-loader.gif"/></div>
+
+ </div>
+ <div id="banners" class="row">
+ <div class="twelvecol">
+ <a href="http://www.gnu.org/philosophy/free-sw.html"><img src="images/libre.png"></a>
+
+ </div>
+ </div>
+
+ </div>
+ <footer>
+ <p class="copyrights">
+ Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros<br/>
+ </p>
+ </footer>
+
+ </body>
+
+</html>
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/form-row.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/form-row.js
new file mode 100644
index 0000000..13390eb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/form-row.js
@@ -0,0 +1,110 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var GenerateForm = {
+ $trContainer: null, // will jQuery element for rules table tboby
+
+ le: 0,
+
+ init: function () {
+ var that = this;
+ $(document).ready(function (e) {
+ that.$trContainer = $("#whitelist").children('tbody');
+
+ // listen for when data is ready to populate form.
+ document.documentElement.addEventListener(
+ "populate-form",
+ function (event) {
+ //console.log("populate-form event triggered in form-row.js");
+ that.populateForm(event.detail.data);
+
+ }, false);
+ that.$trContainer.on("click", ".delete", function (event) {
+ that.deleteRow($(this));
+ });
+ $('deleteall').click(function (e) {
+ that.deleteAll();
+ });
+ });
+ },
+
+ deleteAll: function () {
+ event.initCustomEvent("librejs-settings-change", true, true, {event: 'rules-form-delete-all', value: ''});
+ },
+
+ deleteRow: function ($button) {
+ var hash = $button.parents('tr').children('.hash').text();
+ //console.log("hash is", hash);
+ this.le--;
+ this.changeTitle();
+ $button.parents('tr').remove();
+ var event = document.createEvent("CustomEvent");
+ event.initCustomEvent("librejs-settings-change", true, true, {event: 'rules-form-delete', value: hash});
+ document.documentElement.dispatchEvent(event);
+ },
+
+ createRow: function (key, url, reason) {
+
+ var $tr = $("<tr/>");//.addClass('sortable');
+ var $td = $('<td/>').addClass('hash').text(key);
+ var $delete, $button;
+ $tr.append($td);
+ $td = $('<td/>').append($('<a/>').attr({"href": url,
+ "target": "_blank"}).text(url));
+ $tr.append($td);
+ $td = $('<td/>').text(reason);
+ $tr.append($td);
+
+ //$tr.append($('<td/>').append("<span class='drag-handle ui-icon ui-icon-arrowthick-2-n-s'>drag</span>"));
+ $delete = $("<td/>");
+ $button = $("<button/>").addClass("delete btn").attr({'value': 'delete'}).text("delete");
+ $delete.append($button);
+ $tr.append($delete);
+ return $tr;
+ },
+
+ appendNewRow: function (key, rowData) {
+ if (key && rowData !== undefined) {
+ //console.log(rowData);
+ this.$trContainer.append(this.createRow(key, (rowData.filename || rowData.url), (rowData.result.reason || "no reason recorded")));
+ }
+ },
+ clearForm: function () {
+ $('#whitelist').children('tbody').empty();
+ },
+ changeTitle: function () {
+ var tt = this.le + " scripts whitelisted";
+ $('div.page-header h1').text(tt);
+ $('title').text(tt);
+ },
+ populateForm: function (data) {
+ var key;
+ this.le = Object.keys(data).length;
+ this.changeTitle();
+ //console.log("populateForm triggered");
+ this.clearForm();
+ for (key in data) {
+ this.appendNewRow(key, data[key]);
+ }
+
+ }
+};
+
+GenerateForm.init();
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/form-types.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/form-types.js
new file mode 100644
index 0000000..3d0d6de
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/form-types.js
@@ -0,0 +1,150 @@
+/**
+ * Permafrost - Protect your privacy!
+ * *
+ * Copyright (C) 2012 2013 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+/*jslint indent: 2 */
+/*jslint white: false */
+/*jslint eqeq: true */
+/*jslint plusplus: true*/
+/*global clearInterval: false, clearTimeout: false, document: false, event: false, frames: false, history: false, Image: false, location: false, name: false, navigator: false, Option: false, parent: false, screen: false, setInterval: false, setTimeout: false, window: false, XMLHttpRequest: false */
+
+var FORM_TYPES;
+
+/* constructor for form types options */
+function FormType(options) {
+ "use strict";
+ var item;
+ for (item in options) {
+ this[item] = options[item];
+ }
+}
+
+FormType.prototype = {
+ onblur: 'submit',
+ showbuttons: true,
+ pk: null,
+ name: null,
+ value: null,
+ url: function (params) {
+ "use strict";
+ // see https://addons.mozilla.org/en-US/developers/docs/sdk/latest/dev-guide/guides/content-scripts/communicating-with-other-scripts.html#Using%20Custom%20DOM%20Events for information on this.
+ FORM_TYPES.triggerEvent({'event': 'rules-form-update', 'value': params});
+
+ }
+};
+
+
+FORM_TYPES = {
+
+ patternPlaceholder: 'Enter wildcard patterns or regular expression ' +
+ 'patterns, one per line',
+
+ ruleType: null,
+
+ requestOrigin: null,
+
+ visitingSite: null,
+
+ contentType: null,
+
+ blockUI: function () {
+ "use strict";
+ $.blockUI({
+ message: null,
+ overlayCSS: { backgroundColor: 'none' }});
+ },
+
+ unblockUI: function () {
+ "use strict";
+ window.setTimeout($.unblockUI, 500);
+ },
+
+ triggerEvent: function (msg) {
+ "use strict";
+ var event = document.createEvent("CustomEvent");
+ var that = this;
+ event.initCustomEvent("permafrost-settings-change", true, true, msg);
+ document.documentElement.dispatchEvent(event);
+ this.blockUI();
+
+ var success = function (event) {
+ that.unblockUI();
+ document.documentElement.removeListener("rules-form-data-written", success, false);
+ };
+
+ document.documentElement.addEventListener("rules-form-data-written", success, false);
+
+ },
+
+ init: function () {
+ "use strict";
+
+ var formTypesHelper = this;
+
+ // these four objects will be used to represent all the
+ // form items in the table, and will hold different values
+ // depending on the last active html form object.
+
+ this.ruleType = new FormType({
+ type: 'select',
+ name: 'rule',
+ source: [
+ {value: 'block', text: 'Block'},
+ {value: 'allow', text: 'Allow'}
+ ]
+ });
+
+ this.requestOrigin = new FormType({
+ type: 'textarea',
+ name: 'content-location',
+ title: 'Requests originating from',
+ placeholder: formTypesHelper.patternPlaceholder
+ });
+
+ this.visitingSite = new FormType({
+ type: 'textarea',
+ name: 'request-origin',
+ title: 'when visiting (referrer)',
+ placeholder: formTypesHelper.patternPlaceholder
+ });
+
+ this.contentType = new FormType({
+ type: 'checklist',
+ name: 'content-type',
+ title: 'and are of type',
+ separator: ',',
+ source: [
+ { value: 'script', text: 'scripts' },
+ { value: 'image', text: 'images' },
+ { value: 'stylesheet', text: 'stylesheets' },
+ { value: 'object', text: 'objects and plugin contents' },
+ { value: 'object-request', text: 'requests made by plugins' },
+ { value: 'subdocument', text: 'subdocuments (iframes, frames, and objects)' },
+ { value: 'font', text: 'web font (@font-face)' },
+ { value: 'media', text: 'video or audio content' },
+ { value: 'xbl', text: 'XBL binding request' },
+ { value: 'dtd', text: 'DTD loaded by an XML document' },
+ { value: 'xrh', text: 'Ajax requests (XMLHttpRequests)' },
+ { value: 'others', text: 'miscellaneous content' }
+ ]
+ });
+
+
+ }
+
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/pagescript-emitter.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/pagescript-emitter.js
new file mode 100644
index 0000000..a29c806
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/pagescript-emitter.js
@@ -0,0 +1,14 @@
+// listen for addon script emit and pass on the object to the page script.
+self.port.on("populate-form", function (data) {
+ // custom DOM event
+ var event = document.createEvent('CustomEvent');
+ event.initCustomEvent("populate-form", true, true, { data: data });
+ document.documentElement.dispatchEvent(event);
+});
+
+/*self.port.on("rules-form-data-written", function (data) {
+ // custom DOM event
+ var event = document.createEvent('CustomEvent');
+ event.initCustomEvent("rules-form-data-written", true, true, {});
+ document.documentElement.dispatchEvent(event);
+});*/
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/pagescript-listener.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/pagescript-listener.js
new file mode 100644
index 0000000..af01544
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/pagescript-listener.js
@@ -0,0 +1,59 @@
+/**
+ * Permafrost - Protect your privacy!
+ * *
+ * Copyright (C) 2012 2013 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/*jslint indent: 2 */
+/*jslint white: false */
+/*jslint eqeq: true */
+/*jslint plusplus: true*/
+/*jslint forin: true */
+/*global document: false, self: false */
+
+// listen for a message from the pagescript
+document.documentElement.addEventListener("librejs-settings-change", function (event) {
+ "use strict";
+
+ switch (event.detail.event) {
+
+ case 'rules-form-update':
+ self.port.emit('rules-form-update', event.detail.value);
+ break;
+
+ case 'rules-form-delete':
+ //console.log('hash is', event.detail.value);
+ self.port.emit('rules-form-delete', event.detail.value);
+ break;
+
+ case 'rules-form-delete-all':
+ self.port.emit('rules-form-delete-all');
+ break;
+
+ case 'rules-form-reorder':
+ self.port.emit('rules-form-reorder', event.detail.value);
+ break;
+
+ case 'rules-form-add-empty-row':
+ self.port.emit('rules-form-add-empty-row', event.detail.value);
+ break;
+
+ }
+
+}, false);
+
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/permafrost-info-box.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/permafrost-info-box.js
new file mode 100644
index 0000000..51c33cb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/js/permafrost-info-box.js
@@ -0,0 +1,21 @@
+/**
+ * Permafrost - Protect your privacy!
+ * *
+ * Copyright (C) 2012 2013 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var box = '<div id="permafrost-info-panel" style="width: 250px; height: auto; padding: 20px; background-color: rgba(255, 255, 255, 0.9); box-shadow: 0px 0px 50px rgb(255, 255, 255); margin: 2%; border-radius: 15px 15px 0 0; font-family: Droid Sans,Helvetica,Arial,Sans; font-size: 12px; z-index: 20000; position: fixed; right: 3%; bottom: -10px; margin-bottom:0;;"> <ul> <li>test 1</li> <li>test 2</li> <li>test 3</li> <li>test 4</li><li>blah</li><li>blobl</li> </ul></div>';
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/1140.css b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/1140.css
new file mode 100644
index 0000000..b8d6fa2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/1140.css
@@ -0,0 +1,130 @@
+/* CSS Resets */
+
+html,body,div,span,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,address,cite,code,del,dfn,em,img,ins,q,small,strong,sub,sup,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{border:0;margin:0;padding:0}article,aside,figure,figure img,figcaption,hgroup,footer,header,nav,section,video,object{display:block}a img{border:0}figure{position:relative}figure img{width:100%}
+
+
+/* ==================================================================================================================== */
+/* ! The 1140px Grid V2 by Andy Taylor \ http://cssgrid.net \ http://www.twitter.com/andytlr \ http://www.andytlr.com */
+/* ==================================================================================================================== */
+
+.container {
+padding-left: 20px;
+padding-right: 20px;
+}
+
+.row {
+width: 100%;
+max-width: 1140px;
+min-width: 755px;
+margin: 0 auto;
+overflow: hidden;
+}
+
+.onecol, .twocol, .threecol, .fourcol, .fivecol, .sixcol, .sevencol, .eightcol, .ninecol, .tencol, .elevencol {
+margin-right: 3.8%;
+float: left;
+min-height: 1px;
+}
+
+.row .onecol {
+width: 4.85%;
+}
+
+.row .twocol {
+width: 13.45%;
+}
+
+.row .threecol {
+width: 22.05%;
+}
+
+.row .fourcol {
+width: 30.75%;
+}
+
+.row .fivecol {
+width: 39.45%;
+}
+
+.row .sixcol {
+width: 48%;
+}
+
+.row .sevencol {
+width: 56.75%;
+}
+
+.row .eightcol {
+width: 65.4%;
+}
+
+.row .ninecol {
+width: 74.05%;
+}
+
+.row .tencol {
+width: 82.7%;
+}
+
+.row .elevencol {
+width: 91.35%;
+}
+
+.row .twelvecol {
+width: 100%;
+float: left;
+}
+
+.last {
+margin-right: 0px;
+}
+
+img, object, embed {
+max-width: 100%;
+}
+
+img {
+ height: auto;
+}
+
+
+/* Smaller screens */
+
+@media only screen and (max-width: 1023px) {
+
+ body {
+ font-size: 0.8em;
+ line-height: 1.5em;
+ }
+
+ }
+
+
+/* Mobile */
+
+@media handheld, only screen and (max-width: 767px) {
+
+ body {
+ font-size: 16px;
+ -webkit-text-size-adjust: none;
+ }
+
+ .row, body, .container {
+ width: 100%;
+ min-width: 0;
+ margin-left: 0px;
+ margin-right: 0px;
+ padding-left: 0px;
+ padding-right: 0px;
+ }
+
+ .row .onecol, .row .twocol, .row .threecol, .row .fourcol, .row .fivecol, .row .sixcol, .row .sevencol, .row .eightcol, .row .ninecol, .row .tencol, .row .elevencol, .row .twelvecol {
+ width: auto;
+ float: none;
+ margin-left: 0px;
+ margin-right: 0px;
+ padding-left: 20px;
+ padding-right: 20px;
+ }
+
+} \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/form.css b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/form.css
new file mode 100644
index 0000000..3e8c3bf
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/form.css
@@ -0,0 +1,8 @@
+tr.ui-sortable-helper > td {
+ background: #229ac1 !important;
+}
+
+#whitelist td {
+ max-width:350px;
+ word-wrap: break-word;
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/index.html b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/index.html
new file mode 100644
index 0000000..2883db3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/index.html
@@ -0,0 +1,277 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8" />
+ <title>The 1140px Grid &middot; Fluid down to mobile</title>
+
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
+ <!-- 1140px Grid styles for IE -->
+ <!--[if lte IE 9]><link rel="stylesheet" href="css/ie.css" type="text/css" media="screen" /><![endif]-->
+
+ <!-- The 1140px Grid - http://cssgrid.net/ -->
+ <link rel="stylesheet" href="css/1140.css" type="text/css" media="screen" />
+
+ <!-- Your styles -->
+ <link rel="stylesheet" href="css/styles.css" type="text/css" media="screen" />
+
+ <!--css3-mediaqueries-js - http://code.google.com/p/css3-mediaqueries-js/ - Enables media queries in some unsupported browsers-->
+ <script type="text/javascript" src="js/css3-mediaqueries.js"></script>
+
+ <!--Delete embedded styles, just for example.-->
+ <style type="text/css">
+
+ body {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ }
+
+ .container p {
+ color: #fff;
+ line-height: 100px;
+ background: #000;
+ text-align: center;
+ margin: 20px 0 0 0;
+ }
+
+ </style>
+
+</head>
+
+
+<body>
+
+<div class="container">
+ <div class="row">
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="onecol last">
+ <p>One</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="twocol">
+ <p>Two columns</p>
+ </div>
+ <div class="twocol">
+ <p>Two columns</p>
+ </div>
+ <div class="twocol">
+ <p>Two columns</p>
+ </div>
+ <div class="twocol">
+ <p>Two columns</p>
+ </div>
+ <div class="twocol">
+ <p>Two columns</p>
+ </div>
+ <div class="twocol last">
+ <p>Two columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="threecol">
+ <p>Three columns</p>
+ </div>
+ <div class="threecol">
+ <p>Three columns</p>
+ </div>
+ <div class="threecol">
+ <p>Three columns</p>
+ </div>
+ <div class="threecol last">
+ <p>Three columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="fourcol">
+ <p>Four columns</p>
+ </div>
+ <div class="fourcol">
+ <p>Four columns</p>
+ </div>
+ <div class="fourcol last">
+ <p>Four columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="onecol">
+ <p>One</p>
+ </div>
+ <div class="elevencol last">
+ <p>Eleven columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="twocol">
+ <p>Two columns</p>
+ </div>
+ <div class="tencol last">
+ <p>Ten columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="threecol">
+ <p>Three columns</p>
+ </div>
+ <div class="ninecol last">
+ <p>Nine columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="fourcol">
+ <p>Four columns</p>
+ </div>
+ <div class="eightcol last">
+ <p>Eight columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="fivecol">
+ <p>Five columns</p>
+ </div>
+ <div class="sevencol last">
+ <p>Seven columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="sixcol">
+ <p>Six columns</p>
+ </div>
+ <div class="sixcol last">
+ <p>Six columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="sevencol">
+ <p>Seven columns</p>
+ </div>
+ <div class="fivecol last">
+ <p>Five columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="eightcol">
+ <p>Eight columns</p>
+ </div>
+ <div class="fourcol last">
+ <p>Four columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="ninecol">
+ <p>Nine columns</p>
+ </div>
+ <div class="threecol last">
+ <p>Three columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="tencol">
+ <p>Ten columns</p>
+ </div>
+ <div class="twocol last">
+ <p>Two columns</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="elevencol">
+ <p>Eleven columns</p>
+ </div>
+ <div class="onecol last">
+ <p>One</p>
+ </div>
+ </div>
+</div>
+
+<div class="container">
+ <div class="row">
+ <div class="threecol">
+ <p>Three columns</p>
+ </div>
+ <div class="sixcol">
+ <p>Six columns</p>
+ </div>
+ <div class="threecol last">
+ <p>Three columns</p>
+ </div>
+ </div>
+</div>
+
+
+</body>
+
+</html> \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/styles.css b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/styles.css
new file mode 100644
index 0000000..7e50c65
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/styles/styles.css
@@ -0,0 +1,135 @@
+body {
+ font-size:67.5%;
+ background:#CCC;
+}
+#site-header {
+ background:#898168;
+ min-height:130px;
+ position:relative;
+ border-bottom:#916f6f solid 10px;
+ overflow:hidden;
+}
+
+#logo {
+ background:url('../images/logo-medium.png') top left no-repeat;
+ width:269px;
+ height:119px;
+ display:block;
+ text-indent:-1000em;
+ overflow:hidden;
+ margin:10px 0;
+}
+
+#ribbon {
+ position:absolute;
+ right:-50px;
+ top:-15px;
+ z-index:2;
+}
+
+header nav {
+ position:absolute;
+ bottom:0;
+ right:3em;
+ z-index:3;
+}
+
+header nav ul li {
+ display:inline;
+}
+header nav ul li a {
+ display:block;
+ float:left;
+ background:#916f6f;
+ width:auto;
+ height:10px;
+ padding:10px;
+ text-align:center;
+ margin:0 0.5em;
+ text-decoration:none;
+ color:#000;
+ font-family:Georgia Serif;
+ font-weight:bold;
+ font-size:1.1em;
+}
+header nav ul li a:visited {
+ color:#000;
+}
+
+#main {
+ background:#CCC;
+ padding:1em 0;
+}
+div.screenshot img {
+ float:right;
+ display:block;
+}
+.description {
+ padding-top:5px;
+ font-family:Georgia, Serif;
+ font-size:1.2em;
+ line-height:2em;
+}
+article p, article ul {
+ padding-top:1em;
+}
+article li {
+ padding-top:0.7em;
+}
+#promotional {
+ padding-top:30px;
+
+}
+
+a.download {
+ background:url('../images/button-download.png') top left no-repeat;
+ width:192px;
+ height:57px;
+ display:block;
+ margin:20px auto;
+ overflow:hidden;
+ text-indent:-10000em;
+}
+
+#main ul {
+ list-style-type:disc;
+}
+
+#main h1 {
+ color:#453B35;
+ font-family:arial, sans-serif;
+ font-size:3.5em;
+}
+#main h2 {
+ color:#453B35;
+ font-size:2em;
+ margin:1.5em 0 0;
+}
+#banners {
+ text-align:center;
+ padding:3em 0;
+}
+#banners a {
+ margin:0 5em;
+}
+
+footer p.copyrights {
+ text-align:center;
+ padding:2em 0;
+
+}
+
+figcaption {
+ font-style:italic;
+ font-size:1em;
+ padding:0 3em;
+}
+
+div.intro {
+ padding-top:2em;
+}
+.announcement {
+ color:#453B35;
+ font-size:1.2em;
+ margin:1em 0;
+} \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/block-ui/jquery.blockUI.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/block-ui/jquery.blockUI.js
new file mode 100644
index 0000000..d60303d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/block-ui/jquery.blockUI.js
@@ -0,0 +1,574 @@
+/*!
+ * jQuery blockUI plugin
+ * Version 2.54 (17-DEC-2012)
+ * @requires jQuery v1.3 or later
+ *
+ * Examples at: http://malsup.com/jquery/block/
+ * Copyright (c) 2007-2012 M. Alsup
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Thanks to Amir-Hossein Sobhi for some excellent contributions!
+ */
+
+;(function() {
+"use strict";
+
+ function setup($) {
+ if (/^1\.(0|1|2)/.test($.fn.jquery)) {
+ /*global alert:true */
+ alert('blockUI requires jQuery v1.3 or later! You are using v' + $.fn.jquery);
+ return;
+ }
+
+ $.fn._fadeIn = $.fn.fadeIn;
+
+ var noOp = $.noop || function() {};
+
+ // this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle
+ // retarded userAgent strings on Vista)
+ var msie = /MSIE/.test(navigator.userAgent);
+ var ie6 = /MSIE 6.0/.test(navigator.userAgent);
+ var mode = document.documentMode || 0;
+ // var setExpr = msie && (($.browser.version < 8 && !mode) || mode < 8);
+ var setExpr = $.isFunction( document.createElement('div').style.setExpression );
+
+ // global $ methods for blocking/unblocking the entire page
+ $.blockUI = function(opts) { install(window, opts); };
+ $.unblockUI = function(opts) { remove(window, opts); };
+
+ // convenience method for quick growl-like notifications (http://www.google.com/search?q=growl)
+ $.growlUI = function(title, message, timeout, onClose) {
+ var $m = $('<div class="growlUI"></div>');
+ if (title) $m.append('<h1>'+title+'</h1>');
+ if (message) $m.append('<h2>'+message+'</h2>');
+ if (timeout === undefined) timeout = 3000;
+ $.blockUI({
+ message: $m, fadeIn: 700, fadeOut: 1000, centerY: false,
+ timeout: timeout, showOverlay: false,
+ onUnblock: onClose,
+ css: $.blockUI.defaults.growlCSS
+ });
+ };
+
+ // plugin method for blocking element content
+ $.fn.block = function(opts) {
+ var fullOpts = $.extend({}, $.blockUI.defaults, opts || {});
+ this.each(function() {
+ var $el = $(this);
+ if (fullOpts.ignoreIfBlocked && $el.data('blockUI.isBlocked'))
+ return;
+ $el.unblock({ fadeOut: 0 });
+ });
+
+ return this.each(function() {
+ if ($.css(this,'position') == 'static')
+ this.style.position = 'relative';
+ this.style.zoom = 1; // force 'hasLayout' in ie
+ install(this, opts);
+ });
+ };
+
+ // plugin method for unblocking element content
+ $.fn.unblock = function(opts) {
+ return this.each(function() {
+ remove(this, opts);
+ });
+ };
+
+ $.blockUI.version = 2.54; // 2nd generation blocking at no extra cost!
+
+ // override these in your code to change the default behavior and style
+ $.blockUI.defaults = {
+ // message displayed when blocking (use null for no message)
+ message: '<h1>Please wait...</h1>',
+
+ title: null, // title string; only used when theme == true
+ draggable: true, // only used when theme == true (requires jquery-ui.js to be loaded)
+
+ theme: false, // set to true to use with jQuery UI themes
+
+ // styles for the message when blocking; if you wish to disable
+ // these and use an external stylesheet then do this in your code:
+ // $.blockUI.defaults.css = {};
+ css: {
+ padding: 0,
+ margin: 0,
+ width: '30%',
+ top: '40%',
+ left: '35%',
+ textAlign: 'center',
+ color: '#000',
+ border: '3px solid #aaa',
+ backgroundColor:'#fff',
+ cursor: 'wait'
+ },
+
+ // minimal style set used when themes are used
+ themedCSS: {
+ width: '30%',
+ top: '40%',
+ left: '35%'
+ },
+
+ // styles for the overlay
+ overlayCSS: {
+ backgroundColor: '#000',
+ opacity: 0.6,
+ cursor: 'wait'
+ },
+
+ // style to replace wait cursor before unblocking to correct issue
+ // of lingering wait cursor
+ cursorReset: 'default',
+
+ // styles applied when using $.growlUI
+ growlCSS: {
+ width: '350px',
+ top: '10px',
+ left: '',
+ right: '10px',
+ border: 'none',
+ padding: '5px',
+ opacity: 0.6,
+ cursor: 'default',
+ color: '#fff',
+ backgroundColor: '#000',
+ '-webkit-border-radius':'10px',
+ '-moz-border-radius': '10px',
+ 'border-radius': '10px'
+ },
+
+ // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w
+ // (hat tip to Jorge H. N. de Vasconcelos)
+ /*jshint scripturl:true */
+ iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',
+
+ // force usage of iframe in non-IE browsers (handy for blocking applets)
+ forceIframe: false,
+
+ // z-index for the blocking overlay
+ baseZ: 1000,
+
+ // set these to true to have the message automatically centered
+ centerX: true, // <-- only effects element blocking (page block controlled via css above)
+ centerY: true,
+
+ // allow body element to be stetched in ie6; this makes blocking look better
+ // on "short" pages. disable if you wish to prevent changes to the body height
+ allowBodyStretch: true,
+
+ // enable if you want key and mouse events to be disabled for content that is blocked
+ bindEvents: true,
+
+ // be default blockUI will supress tab navigation from leaving blocking content
+ // (if bindEvents is true)
+ constrainTabKey: true,
+
+ // fadeIn time in millis; set to 0 to disable fadeIn on block
+ fadeIn: 200,
+
+ // fadeOut time in millis; set to 0 to disable fadeOut on unblock
+ fadeOut: 400,
+
+ // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock
+ timeout: 0,
+
+ // disable if you don't want to show the overlay
+ showOverlay: true,
+
+ // if true, focus will be placed in the first available input field when
+ // page blocking
+ focusInput: true,
+
+ // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)
+ // no longer needed in 2012
+ // applyPlatformOpacityRules: true,
+
+ // callback method invoked when fadeIn has completed and blocking message is visible
+ onBlock: null,
+
+ // callback method invoked when unblocking has completed; the callback is
+ // passed the element that has been unblocked (which is the window object for page
+ // blocks) and the options that were passed to the unblock call:
+ // onUnblock(element, options)
+ onUnblock: null,
+
+ // callback method invoked when the overlay area is clicked.
+ // setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used.
+ onOverlayClick: null,
+
+ // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493
+ quirksmodeOffsetHack: 4,
+
+ // class name of the message block
+ blockMsgClass: 'blockMsg',
+
+ // if it is already blocked, then ignore it (don't unblock and reblock)
+ ignoreIfBlocked: false
+ };
+
+ // private data and functions follow...
+
+ var pageBlock = null;
+ var pageBlockEls = [];
+
+ function install(el, opts) {
+ var css, themedCSS;
+ var full = (el == window);
+ var msg = (opts && opts.message !== undefined ? opts.message : undefined);
+ opts = $.extend({}, $.blockUI.defaults, opts || {});
+
+ if (opts.ignoreIfBlocked && $(el).data('blockUI.isBlocked'))
+ return;
+
+ opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});
+ css = $.extend({}, $.blockUI.defaults.css, opts.css || {});
+ if (opts.onOverlayClick)
+ opts.overlayCSS.cursor = 'pointer';
+
+ themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});
+ msg = msg === undefined ? opts.message : msg;
+
+ // remove the current block (if there is one)
+ if (full && pageBlock)
+ remove(window, {fadeOut:0});
+
+ // if an existing element is being used as the blocking content then we capture
+ // its current place in the DOM (and current display style) so we can restore
+ // it when we unblock
+ if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) {
+ var node = msg.jquery ? msg[0] : msg;
+ var data = {};
+ $(el).data('blockUI.history', data);
+ data.el = node;
+ data.parent = node.parentNode;
+ data.display = node.style.display;
+ data.position = node.style.position;
+ if (data.parent)
+ data.parent.removeChild(node);
+ }
+
+ $(el).data('blockUI.onUnblock', opts.onUnblock);
+ var z = opts.baseZ;
+
+ // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;
+ // layer1 is the iframe layer which is used to supress bleed through of underlying content
+ // layer2 is the overlay layer which has opacity and a wait cursor (by default)
+ // layer3 is the message content that is displayed while blocking
+ var lyr1, lyr2, lyr3, s;
+ if (msie || opts.forceIframe)
+ lyr1 = $('<iframe class="blockUI" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="'+opts.iframeSrc+'"></iframe>');
+ else
+ lyr1 = $('<div class="blockUI" style="display:none"></div>');
+
+ if (opts.theme)
+ lyr2 = $('<div class="blockUI blockOverlay ui-widget-overlay" style="z-index:'+ (z++) +';display:none"></div>');
+ else
+ lyr2 = $('<div class="blockUI blockOverlay" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>');
+
+ if (opts.theme && full) {
+ s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage ui-dialog ui-widget ui-corner-all" style="z-index:'+(z+10)+';display:none;position:fixed">';
+ if ( opts.title ) {
+ s += '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>';
+ }
+ s += '<div class="ui-widget-content ui-dialog-content"></div>';
+ s += '</div>';
+ }
+ else if (opts.theme) {
+ s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement ui-dialog ui-widget ui-corner-all" style="z-index:'+(z+10)+';display:none;position:absolute">';
+ if ( opts.title ) {
+ s += '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>';
+ }
+ s += '<div class="ui-widget-content ui-dialog-content"></div>';
+ s += '</div>';
+ }
+ else if (full) {
+ s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage" style="z-index:'+(z+10)+';display:none;position:fixed"></div>';
+ }
+ else {
+ s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement" style="z-index:'+(z+10)+';display:none;position:absolute"></div>';
+ }
+ lyr3 = $(s);
+
+ // if we have a message, style it
+ if (msg) {
+ if (opts.theme) {
+ lyr3.css(themedCSS);
+ lyr3.addClass('ui-widget-content');
+ }
+ else
+ lyr3.css(css);
+ }
+
+ // style the overlay
+ if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/)
+ lyr2.css(opts.overlayCSS);
+ lyr2.css('position', full ? 'fixed' : 'absolute');
+
+ // make iframe layer transparent in IE
+ if (msie || opts.forceIframe)
+ lyr1.css('opacity',0.0);
+
+ //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);
+ var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el);
+ $.each(layers, function() {
+ this.appendTo($par);
+ });
+
+ if (opts.theme && opts.draggable && $.fn.draggable) {
+ lyr3.draggable({
+ handle: '.ui-dialog-titlebar',
+ cancel: 'li'
+ });
+ }
+
+ // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)
+ var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0);
+ if (ie6 || expr) {
+ // give body 100% height
+ if (full && opts.allowBodyStretch && $.support.boxModel)
+ $('html,body').css('height','100%');
+
+ // fix ie6 issue when blocked element has a border width
+ if ((ie6 || !$.support.boxModel) && !full) {
+ var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth');
+ var fixT = t ? '(0 - '+t+')' : 0;
+ var fixL = l ? '(0 - '+l+')' : 0;
+ }
+
+ // simulate fixed position
+ $.each(layers, function(i,o) {
+ var s = o[0].style;
+ s.position = 'absolute';
+ if (i < 2) {
+ if (full)
+ s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"');
+ else
+ s.setExpression('height','this.parentNode.offsetHeight + "px"');
+ if (full)
+ s.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"');
+ else
+ s.setExpression('width','this.parentNode.offsetWidth + "px"');
+ if (fixL) s.setExpression('left', fixL);
+ if (fixT) s.setExpression('top', fixT);
+ }
+ else if (opts.centerY) {
+ if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"');
+ s.marginTop = 0;
+ }
+ else if (!opts.centerY && full) {
+ var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0;
+ var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"';
+ s.setExpression('top',expression);
+ }
+ });
+ }
+
+ // show the message
+ if (msg) {
+ if (opts.theme)
+ lyr3.find('.ui-widget-content').append(msg);
+ else
+ lyr3.append(msg);
+ if (msg.jquery || msg.nodeType)
+ $(msg).show();
+ }
+
+ if ((msie || opts.forceIframe) && opts.showOverlay)
+ lyr1.show(); // opacity is zero
+ if (opts.fadeIn) {
+ var cb = opts.onBlock ? opts.onBlock : noOp;
+ var cb1 = (opts.showOverlay && !msg) ? cb : noOp;
+ var cb2 = msg ? cb : noOp;
+ if (opts.showOverlay)
+ lyr2._fadeIn(opts.fadeIn, cb1);
+ if (msg)
+ lyr3._fadeIn(opts.fadeIn, cb2);
+ }
+ else {
+ if (opts.showOverlay)
+ lyr2.show();
+ if (msg)
+ lyr3.show();
+ if (opts.onBlock)
+ opts.onBlock();
+ }
+
+ // bind key and mouse events
+ bind(1, el, opts);
+
+ if (full) {
+ pageBlock = lyr3[0];
+ pageBlockEls = $(':input:enabled:visible',pageBlock);
+ if (opts.focusInput)
+ setTimeout(focus, 20);
+ }
+ else
+ center(lyr3[0], opts.centerX, opts.centerY);
+
+ if (opts.timeout) {
+ // auto-unblock
+ var to = setTimeout(function() {
+ if (full)
+ $.unblockUI(opts);
+ else
+ $(el).unblock(opts);
+ }, opts.timeout);
+ $(el).data('blockUI.timeout', to);
+ }
+ }
+
+ // remove the block
+ function remove(el, opts) {
+ var full = (el == window);
+ var $el = $(el);
+ var data = $el.data('blockUI.history');
+ var to = $el.data('blockUI.timeout');
+ if (to) {
+ clearTimeout(to);
+ $el.removeData('blockUI.timeout');
+ }
+ opts = $.extend({}, $.blockUI.defaults, opts || {});
+ bind(0, el, opts); // unbind events
+
+ if (opts.onUnblock === null) {
+ opts.onUnblock = $el.data('blockUI.onUnblock');
+ $el.removeData('blockUI.onUnblock');
+ }
+
+ var els;
+ if (full) // crazy selector to handle odd field errors in ie6/7
+ els = $('body').children().filter('.blockUI').add('body > .blockUI');
+ else
+ els = $el.find('>.blockUI');
+
+ // fix cursor issue
+ if ( opts.cursorReset ) {
+ if ( els.length > 1 )
+ els[1].style.cursor = opts.cursorReset;
+ if ( els.length > 2 )
+ els[2].style.cursor = opts.cursorReset;
+ }
+
+ if (full)
+ pageBlock = pageBlockEls = null;
+
+ if (opts.fadeOut) {
+ els.fadeOut(opts.fadeOut);
+ setTimeout(function() { reset(els,data,opts,el); }, opts.fadeOut);
+ }
+ else
+ reset(els, data, opts, el);
+ }
+
+ // move blocking element back into the DOM where it started
+ function reset(els,data,opts,el) {
+ els.each(function(i,o) {
+ // remove via DOM calls so we don't lose event handlers
+ if (this.parentNode)
+ this.parentNode.removeChild(this);
+ });
+
+ if (data && data.el) {
+ data.el.style.display = data.display;
+ data.el.style.position = data.position;
+ if (data.parent)
+ data.parent.appendChild(data.el);
+ $(el).removeData('blockUI.history');
+ }
+
+ if (typeof opts.onUnblock == 'function')
+ opts.onUnblock(el,opts);
+
+ // fix issue in Safari 6 where block artifacts remain until reflow
+ var body = $(document.body), w = body.width(), cssW = body[0].style.width;
+ body.width(w-1).width(w);
+ body[0].style.width = cssW;
+ }
+
+ // bind/unbind the handler
+ function bind(b, el, opts) {
+ var full = el == window, $el = $(el);
+
+ // don't bother unbinding if there is nothing to unbind
+ if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked')))
+ return;
+
+ $el.data('blockUI.isBlocked', b);
+
+ // don't bind events when overlay is not in use or if bindEvents is false
+ if (!opts.bindEvents || (b && !opts.showOverlay))
+ return;
+
+ // bind anchors and inputs for mouse and key events
+ var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove';
+ if (b)
+ $(document).bind(events, opts, handler);
+ else
+ $(document).unbind(events, handler);
+
+ // former impl...
+ // var $e = $('a,:input');
+ // b ? $e.bind(events, opts, handler) : $e.unbind(events, handler);
+ }
+
+ // event handler to suppress keyboard/mouse events when blocking
+ function handler(e) {
+ // allow tab navigation (conditionally)
+ if (e.keyCode && e.keyCode == 9) {
+ if (pageBlock && e.data.constrainTabKey) {
+ var els = pageBlockEls;
+ var fwd = !e.shiftKey && e.target === els[els.length-1];
+ var back = e.shiftKey && e.target === els[0];
+ if (fwd || back) {
+ setTimeout(function(){focus(back);},10);
+ return false;
+ }
+ }
+ }
+ var opts = e.data;
+ var target = $(e.target);
+ if (target.hasClass('blockOverlay') && opts.onOverlayClick)
+ opts.onOverlayClick();
+
+ // allow events within the message content
+ if (target.parents('div.' + opts.blockMsgClass).length > 0)
+ return true;
+
+ // allow events for content that is not being blocked
+ return target.parents().children().filter('div.blockUI').length === 0;
+ }
+
+ function focus(back) {
+ if (!pageBlockEls)
+ return;
+ var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0];
+ if (e)
+ e.focus();
+ }
+
+ function center(el, x, y) {
+ var p = el.parentNode, s = el.style;
+ var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth');
+ var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth');
+ if (x) s.left = l > 0 ? (l+'px') : '0';
+ if (y) s.top = t > 0 ? (t+'px') : '0';
+ }
+
+ function sz(el, p) {
+ return parseInt($.css(el,p),10)||0;
+ }
+
+ }
+
+
+ /*global define:true */
+ if (typeof define === 'function' && define.amd && define.amd.jQuery) {
+ define(['jquery'], setup);
+ } else {
+ setup(jQuery);
+ }
+
+})();
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/css/bootstrap-responsive.min.css b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/css/bootstrap-responsive.min.css
new file mode 100644
index 0000000..96a435b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/css/bootstrap-responsive.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap Responsive v2.3.2
+ *
+ * Copyright 2013 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}}
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/css/bootstrap.min.css b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/css/bootstrap.min.css
new file mode 100644
index 0000000..df96c86
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/css/bootstrap.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap v2.3.2
+ *
+ * Copyright 2013 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/img/glyphicons-halflings-white.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/img/glyphicons-halflings-white.png
new file mode 100644
index 0000000..3bf6484
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/img/glyphicons-halflings-white.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/img/glyphicons-halflings.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/img/glyphicons-halflings.png
new file mode 100644
index 0000000..8815a8a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/img/glyphicons-halflings.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/js/bootstrap.min.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/js/bootstrap.min.js
new file mode 100644
index 0000000..848258d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/bootstrap/js/bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+* Bootstrap.js by @fat & @mdo
+* Copyright 2013 Twitter, Inc.
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(".dropdown-backdrop").remove(),e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||("ontouchstart"in document.documentElement&&e('<div class="dropdown-backdrop"/>').insertBefore(e(this)).on("click",r),s.toggleClass("open")),n.focus(),!1},keydown:function(n){var r,s,o,u,a,f;if(!/(38|40|27)/.test(n.keyCode))return;r=e(this),n.preventDefault(),n.stopPropagation();if(r.is(".disabled, :disabled"))return;u=i(r),a=u.hasClass("open");if(!a||a&&n.keyCode==27)return n.which==27&&u.find(t).focus(),r.click();s=e("[role=menu] li:not(.divider):visible a",u);if(!s.length)return;f=s.index(s.filter(":focus")),n.keyCode==38&&f>0&&f--,n.keyCode==40&&f<s.length-1&&f++,~f||(f=0),s.eq(f).focus()}};var s=e.fn.dropdown;e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e.fn.dropdown.noConflict=function(){return e.fn.dropdown=s,this},e(document).on("click.dropdown.data-api",r).on("click.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.focus().trigger("shown")}):t.$element.focus().trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(){var e=this;this.$element.hide(),this.backdrop(function(){e.removeBackdrop(),e.$element.trigger("hidden")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.$backdrop.click(this.options.backdrop=="static"?e.proxy(this.$element[0].focus,this.$element[0]):e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in");if(!t)return;i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,t):t()):t&&t()}};var n=e.fn.modal;e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e.fn.modal.noConflict=function(){return e.fn.modal=n,this},e(document).on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s,o,u,a;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,o=this.options.trigger.split(" ");for(a=o.length;a--;)u=o[a],u=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):u!="manual"&&(i=u=="hover"?"mouseenter":"focus",s=u=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this)));this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,this.$element.data(),t),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e.fn[this.type].defaults,r={},i;this._options&&e.each(this._options,function(e,t){n[e]!=t&&(r[e]=t)},this),i=e(t.currentTarget)[this.type](r).data(this.type);if(!i.options.delay||!i.options.delay.show)return i.show();clearTimeout(this.timeout),i.hoverState="in",this.timeout=setTimeout(function(){i.hoverState=="in"&&i.show()},i.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var t,n,r,i,s,o,u=e.Event("show");if(this.hasContent()&&this.enabled){this.$element.trigger(u);if(u.isDefaultPrevented())return;t=this.tip(),this.setContent(),this.options.animation&&t.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,t[0],this.$element[0]):this.options.placement,t.detach().css({top:0,left:0,display:"block"}),this.options.container?t.appendTo(this.options.container):t.insertAfter(this.$element),n=this.getPosition(),r=t[0].offsetWidth,i=t[0].offsetHeight;switch(s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}this.applyPlacement(o,s),this.$element.trigger("shown")}},applyPlacement:function(e,t){var n=this.tip(),r=n[0].offsetWidth,i=n[0].offsetHeight,s,o,u,a;n.offset(e).addClass(t).addClass("in"),s=n[0].offsetWidth,o=n[0].offsetHeight,t=="top"&&o!=i&&(e.top=e.top+i-o,a=!0),t=="bottom"||t=="top"?(u=0,e.left<0&&(u=e.left*-2,e.left=0,n.offset(e),s=n[0].offsetWidth,o=n[0].offsetHeight),this.replaceArrow(u-r+s,s,"left")):this.replaceArrow(o-i,o,"top"),a&&n.offset(e)},replaceArrow:function(e,t,n){this.arrow().css(n,e?50*(1-e/t)+"%":"")},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function i(){var t=setTimeout(function(){n.off(e.support.transition.end).detach()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.detach()})}var t=this,n=this.tip(),r=e.Event("hide");this.$element.trigger(r);if(r.isDefaultPrevented())return;return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?i():n.detach(),this.$element.trigger("hidden"),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").attr("title","")},hasContent:function(){return this.getTitle()},getPosition:function(){var t=this.$element[0];return e.extend({},typeof t.getBoundingClientRect=="function"?t.getBoundingClientRect():{width:t.offsetWidth,height:t.offsetHeight},this.$element.offset())},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},arrow:function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(t){var n=t?e(t.currentTarget)[this.type](this._options).data(this.type):this;n.tip().hasClass("in")?n.hide():n.show()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var n=e.fn.tooltip;e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},e.fn.tooltip.noConflict=function(){return e.fn.tooltip=n,this}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=(typeof n.content=="function"?n.content.call(t[0]):n.content)||t.attr("data-content"),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var n=e.fn.popover;e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var n=e(this),r=n.data("target")||n.attr("href"),i=/^#\w/.test(r)&&e(r);return i&&i.length&&[[i.position().top+(!e.isWindow(t.$scrollElement.get(0))&&t.$scrollElement.scrollTop()),r]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}};var n=e.fn.scrollspy;e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e.fn.scrollspy.noConflict=function(){return e.fn.scrollspy=n,this},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active:last a")[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}};var n=e.fn.tab;e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=n,this},e(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=e(this.options.menu),this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:t.top+t.height,left:t.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("focus",e.proxy(this.focus,this)).on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this)).on("mouseleave","li",e.proxy(this.mouseleave,this))},eventSupported:function(e){var t=e in this.$element;return t||(this.$element.setAttribute(e,"return;"),t=typeof this.$element[e]=="function"),t},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},focus:function(e){this.focused=!0},blur:function(e){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(e){e.stopPropagation(),e.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(t){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var n=e.fn.typeahead;e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e.fn.typeahead.noConflict=function(){return e.fn.typeahead=n,this},e(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;n.typeahead(n.data())})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))};var n=e.fn.affix;e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery); \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/CHANGELOG.txt b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/CHANGELOG.txt
new file mode 100644
index 0000000..5c410ec
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/CHANGELOG.txt
@@ -0,0 +1,103 @@
+X-editable changelog
+=============================
+
+
+Version 1.3.0 Dec 10, 2012
+----------------------------
+[enh] added html5 inputs support: password, email, url, tel, number, range (vitalets)
+[bug #43] fix for bootstrap 2.2.2 (vitalets)
+[enh #41] 'abstract' class renamed to 'abstractinput' as abstract is reserved word (vitalets)
+[enh #40] 'params' option defined as function overwrites original ajax data instead of appending (vitalets)
+[bug] datepicker: error when click on arrows after clear date (vitalets)
+[enh] 'hidden' event: added possible value of reason param - 'nochange'. Occurs when form is submitted but value was not changed (vitalets)
+[enh] 'submit' method changed: error-callback's parameter simplified (vitalets)
+[enh] 'submit' method changed: now when response 200 OK it does not set pk automatically (vitalets)
+[enh] 'submit' method changed: removed dataType='json'. Use 'ajaxOptions' to specify dataType if needed (vitalets)
+[enh] removed default ajax dataType='json'. Use 'ajaxOptions' to specify dataType if needed (vitalets)
+[enh] select: do not show 'sourceError' in element during autotext execution (vitalets)
+
+
+Version 1.2.0 Dec 6, 2012
+----------------------------
+[enh #36] 'submit' method: added 'ajaxOptions' property to modify ajax request (vitalets)
+[enh] inputs now internally use 'value2submit' method instead of previous 'value2str' (vitalets)
+[enh] editableContainer removed from docs (vitalets)
+[enh] editableContainer: removed 'autohide' option and 'cancel' event. Use 'hidden' event instead (vitalets)
+[enh] 'hidden' event: added param 'reason' that points to reason caused hiding (vitalets)
+[enh] 'select' submit by enter (vitalets)
+[bug #37] fix incorrectly shown datepicker in jquery 1.7.1 + webkit (vitalets)
+[enh] added url param 'jquery' to run tests in different versions of jquery, e.g. '&jquery=1.7.2' (vitalets)
+[enh] 'enablefocus' option removed. More efficient to use 'save/hide' events to set focus to any element (vitalets)
+[enh] 'init' event was added due to removal of render event (vitalets)
+[enh] 'render' event was removed, use 'display' callback instead (vitalets)
+[enh] 'checklist' submit value as array, not comma separated string (vitalets)
+[enh] 'checklist' was refactored: options 'viewseparator', 'limit', 'limitText' are supressed by 'display' callback (vitalets)
+[enh] new option: 'display' callback. Makes far more flexible rendering value into element's text. (vitalets)
+[bug] fix typos (atrophic)
+[enh] all callbacks scope changed to element (vitalets)
+[enh] new option: 'savenochange' to save or cancel value when it was not changed in form (vitalets)
+[enh] composite pk can be defined as JSON in data-pk attribute (vitalets)
+[enh #30] new option 'sourceCache' true|false to disable cache for select (vitalets)
+[bug #34] inputclass span* broken with fluid bootstrap layout. Classes changed to 'input-*'. (vitalets)
+[enh] utils now added to $.fn.editableutils instead of $.fn.editableform.utils (vitalets)
+[enh] input types now added to $.fn.editabletypes instead of $.fn.editableform.types (vitalets)
+[enh] playground and tests now use requirejs (vitalets)
+[bug #27] 'today' button toggle bug in bootstrap-datepicker (vitalets)
+
+
+Version 1.1.1 Nov 30, 2012
+----------------------------
+[enh] 'showbuttons' option to hide buttons in form (vitalets)
+[enh] object can be passed in 'option' method to set several options at once (vitalets)
+[enh #20] toggle editable by 'dblclick' and 'mouseenter' (vitalets)
+[enh] added 'inputs-ext' directory with sample input 'address'. They will not be concatenated to main files (vitalets)
+[enh #13] 'onblur' option: to cancel, submit or ignore when user clicks outside the form (vitalets)
+[enh] 'ajaxOptions' parameter for advanced ajax configuration (vitalets)
+[enh] 'success' callback can return object to overwrite submitted value (vitalets)
+
+
+Version 1.1.0 Nov 27, 2012
+----------------------------
+[enh #11] icon cancel changed to 'cross' (tarciozemel)
+[enh] added support for IE7+ (vitalets)
+[enh #9] 'name' or 'id' is not required anymore (vitalets)
+[enh] 'clear' button added in date and dateui (vitalets)
+[enh] form template changed: added DIV.editable-input, DIV.editable.buttons and $.fn.editableform.buttons (vitalets)
+[enh] new input type: checklist (vitalets)
+[enh] updated docs: inputs dropdown menu, global templates section (vitalets)
+
+
+Version 1.0.1 Nov 22, 2012
+----------------------------
+[enh] contribution guide in README.md (vitalets)
+[enh #7] 'shown', 'hidden' events added (vitalets)
+[enh #1] params can be a function to calculate it dynamically (vitalets)
+[enh #6] do not preventDefault() in click when toggle='manual'. This allows to have clickable links (vitalets)
+[bug #3] should not mark element with unsave css if url is user's function (vitalets)
+
+
+Version 1.0.0 Nov 19, 2012
+----------------------------
+Initial release. This library is new life of bootstrap-editable (1.1.4) that was strongly refactored and improved.
+Main features:
+- support not only bootstrap but any core library: bootstrap, jquery-ui or pure jquery
+- different container classes to show form: popover, tooltip, poshytip, etc
+- inline and popup versions
+- new directory structure and logic in separate js files allowing easy contribution
+
+It is not fully compatible with bootstrap-editable but has mainly the same interface and api.
+Here list of differences to help you to upgrade your application:
+
+[change] 'toggle' option value can be only click|manual (not toggling element id). In case of 'manual' you should write handler calling 'show' method.
+[change] 'validate' option cannot be defined as object anymore.
+[change] events 'init', 'update', 'shown', 'hidden' removed. Events 'save', 'cancel' added. Event 'render' remains.
+[change] input's option 'template' renamed to 'tpl' (to exclude conflict with container's template).
+[change] value can be stored internally as object (previously was always string). Useful for date input.
+[change] 'error' callback option is removed. 'success' callback remained.
+[enh] 'source' option in select can be array of structure [{value: 1, text: 'abc'}, {...}]. This allows to keep ordering of items in dropdown list. Previous format is supported for compatibility.
+[enh] api method 'setValue' to set manually value of editable.
+[change] locales directory is excluded from bootstrap-datepicker input. If you need localization you should jus download corresponding file from github.
+[change] date and dateui specific options can be set only via 'datepicker' option in first level of config (previously it was possible to set some options directly in config, e.g. weekStart).
+[change] if 'url' option defined as function - it is used as submit method instead of ajax (previously it was dynamically return url string and ajax occurred anyway)
+
+Also all known bugs of bootstrap-editable were closed.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/LICENSE-MIT b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/LICENSE-MIT
new file mode 100644
index 0000000..bc67d5b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/LICENSE-MIT
@@ -0,0 +1,22 @@
+Copyright (c) 2012 Vitaliy Potapov
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/README.md b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/README.md
new file mode 100644
index 0000000..38aacf7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/README.md
@@ -0,0 +1,71 @@
+# X-editable
+
+In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery.
+It is a new life of [bootstrap-editable plugin](http://github.com/vitalets/bootstrap-editable) that was strongly refactored and improved.
+
+## Demo + Docs + Download
+See **http://vitalets.github.com/x-editable**
+
+## Reporting issues
+When creating issues please provide [jsFiddle](http://jsfiddle.net) example. You can easily fork one of **jsFiddle templates**:
+1. [bootstrap](http://jsfiddle.net/xBB5x/25/)
+2. [jqueryui](http://jsfiddle.net/xBB5x/24/)
+3. [plain](http://jsfiddle.net/xBB5x/23/)
+Your feedback is very appreciated!
+
+## Contribution
+A few steps how to start contributing:
+
+1.[Fork X-editable](https://github.com/vitalets/x-editable/fork) and pull the latest changes from <code>dev</code> branch
+
+2.Arrange local directory structure. It should be:
+**x-editable**
+ | -- **lib** (repo related to <code>dev</code> and <code>master</code> branches)
+ | -- **gh-pages** (repo related to <code>gh-pages</code> branch for docs & demo)
+ | -- **playground** (simple node-server and html page for testing, [playground_1.2.zip](https://github.com/downloads/vitalets/x-editable/playground_1.2.zip), **updated in 1.2.0!**)
+
+To make it easy follow this script ( _assuming you have [nodejs](http://nodejs.org) installed_ ).
+Please replace <code>&lt;your-github-name&gt;</code> with your name:
+````
+mkdir x-editable
+cd x-editable
+
+#lib
+git clone https://github.com/<your-github-name>/x-editable.git -b dev lib
+cd lib
+#install gruntjs globally - building tool
+npm install -g grunt
+#install other dependencies - grunt-contrib
+npm install
+cd ..
+
+#gh-pages
+git clone https://github.com/<your-github-name>/x-editable.git -b gh-pages gh-pages
+cd gh-pages
+npm install
+cd ..
+
+#playground
+#download playground.zip from https://github.com/downloads/vitalets/x-editable/playground_1.2.zip
+unzip playground.zip
+cd playground
+npm install
+````
+3.That's it! You can start editing files in **lib/src** directory or create new editable input/container/whatever.
+To test the result go to **playground**, start server <code>node server.js</code> and open in your browser [http://localhost:3000/playground](http://localhost:3000/playground).
+
+4.To run unit tests you can open it directly in browser **lib/test/index.html**.
+Or use grunt's _qunit_ task <code>grunt test</code>. For that you also need to [install PhantomJS](https://github.com/gruntjs/grunt/blob/master/docs/faq.md#why-does-grunt-complain-that-phantomjs-isnt-installed)
+
+5.To build distributive run <code>grunt build</code> in **lib** directory. Result will appear in **lib/dist**.
+
+6.To build docs run <code>build data-docs-dist</code> in **gh-pages** directory. Result will appear in **gh-pages/*.html**.
+Do not edit **index.html** and **docs.html** directly! Instead look at [Handlebars](https://github.com/wycats/handlebars.js) templates in **generator/templates**.
+
+7.Commit changes on <code>dev</code> / <code>gh-pages-dev</code> branch and make pull request as usual.
+
+Thanks for your support!
+
+## License
+Copyright (c) 2012 Vitaliy Potapov
+Licensed under the MIT licenses. \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/css/bootstrap-editable.css b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/css/bootstrap-editable.css
new file mode 100644
index 0000000..7c0b1c2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/css/bootstrap-editable.css
@@ -0,0 +1,434 @@
+/*! X-editable - v1.3.0
+* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery
+* http://github.com/vitalets/x-editable
+* Copyright (c) 2012 Vitaliy Potapov; Licensed MIT */
+
+.editableform {
+ margin-bottom: 0; /* overwrites bootstrap margin */
+}
+
+.editableform .control-group {
+ margin-bottom: 0; /* overwrites bootstrap margin */
+ white-space: nowrap; /* prevent wrapping buttons on new line */
+}
+
+.editable-buttons {
+ display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */
+ vertical-align: top;
+ margin-left: 7px;
+ /* display-inline emulation for IE7*/
+ zoom: 1;
+ *display: inline;
+}
+
+
+
+.editable-input {
+ vertical-align: top;
+ display: inline-block; /* should be inline to take effect of parent's white-space: nowrap */
+ width: auto; /* bootstrap-responsive has width: 100% that breakes layout */
+ white-space: normal; /* reset white-space decalred in parent*/
+ /* display-inline emulation for IE7*/
+ zoom: 1;
+ *display: inline;
+}
+
+.editable-buttons .editable-cancel {
+ margin-left: 7px;
+}
+
+/*for jquery-ui buttons need set height to look more pretty*/
+.editable-buttons button.ui-button-icon-only {
+ height: 24px;
+ width: 30px;
+}
+
+.editableform-loading {
+ background: url('img/loading.gif') center center no-repeat;
+ height: 25px;
+ width: auto;
+ min-width: 25px;
+}
+
+.editable-inline .editableform-loading {
+ background-position: left 5px;
+}
+
+ .editable-error-block {
+ max-width: 300px;
+ margin: 5px 0 0 0;
+ width: auto;
+ white-space: normal;
+}
+
+/*add padding for jquery ui*/
+.editable-error-block.ui-state-error {
+ padding: 3px;
+}
+
+.editable-error {
+ color: red;
+}
+
+.editableform textarea {
+ height: 150px; /*default height for textarea*/
+}
+
+.editableform .editable-date {
+ padding: 0;
+ margin: 0;
+ float: left;
+}
+
+
+/* checklist vertical alignment */
+.editable-checklist label input[type="checkbox"],
+.editable-checklist label span {
+ vertical-align: middle;
+ margin: 0;
+}
+
+.editable-checklist label {
+ white-space: nowrap;
+}
+
+.editable-clear {
+ clear: both;
+ font-size: 0.9em;
+ text-decoration: none;
+ text-align: right;
+}
+.editable-container {
+ max-width: none !important; /* without this rule poshytip/tooltip does not stretch */
+}
+
+.editable-container.popover {
+/* width: 300px;*/ /* debug */
+ width: auto; /* without this rule popover does not stretch */
+}
+
+.editable-container.editable-inline {
+/* display: inline; */ /* display: inline does not correctly work with show()/hide() in jquery <= 1.7.2 */
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.editable-container.ui-widget {
+ font-size: inherit; /* jqueryui widget font 1.1em too big, overwrite it */
+}
+.editable-click,
+a.editable-click,
+a.editable-click:hover {
+ text-decoration: none;
+ border-bottom: dashed 1px #0088cc;
+}
+
+.editable-click.editable-disabled,
+a.editable-click.editable-disabled,
+a.editable-click.editable-disabled:hover {
+ color: #585858;
+ cursor: default;
+ border-bottom: none;
+}
+
+.editable-empty, .editable-empty:hover{
+ font-style: italic;
+ color: #DD1144;
+ border-bottom: none;
+ text-decoration: none;
+}
+
+.editable-unsaved {
+ font-weight: bold;
+}
+
+.editable-unsaved:after {
+/* content: '*'*/
+}
+
+
+/*!
+ * Datepicker for Bootstrap
+ *
+ * Copyright 2012 Stefan Petre
+ * Improvements by Andrew Rowls
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ */
+.datepicker {
+ padding: 4px;
+ margin-top: 1px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ /*.dow {
+ border-top: 1px solid #ddd !important;
+ }*/
+}
+
+.datepicker-inline {
+ width: 220px;
+/* height: 220px; */
+}
+
+.datepicker-float {
+ top: 0;
+ left: 0;
+}
+
+.datepicker-float:before {
+ content: '';
+ display: inline-block;
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ border-bottom: 7px solid #ccc;
+ border-bottom-color: rgba(0, 0, 0, 0.2);
+ position: absolute;
+ top: -7px;
+ left: 6px;
+}
+.datepicker-float:after {
+ content: '';
+ display: inline-block;
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid #ffffff;
+ position: absolute;
+ top: -6px;
+ left: 7px;
+}
+.datepicker > div {
+ display: none;
+}
+.datepicker.days div.datepicker-days {
+ display: block;
+}
+.datepicker.months div.datepicker-months {
+ display: block;
+}
+.datepicker.years div.datepicker-years {
+ display: block;
+}
+.datepicker table {
+ margin: 0;
+}
+.datepicker td,
+.datepicker th {
+ text-align: center;
+ width: 20px;
+ height: 20px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ /* vitalets: required to disable css inheritance when display inline inside table */
+ border: none !important;
+ background-color: transparent !important;
+}
+.datepicker td.day:hover {
+ background: #eeeeee !important; /* disable inheritance for inline */
+ cursor: pointer;
+}
+.datepicker td.old,
+.datepicker td.new {
+ color: #999999;
+}
+.datepicker td.disabled,
+.datepicker td.disabled:hover {
+ background: none;
+ color: #999999;
+ cursor: default;
+}
+.datepicker td.today,
+.datepicker td.today:hover,
+.datepicker td.today.disabled,
+.datepicker td.today.disabled:hover {
+ background-color: #fde19a !important; /* disable inheritance for inline */
+ background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a);
+ background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));
+ background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a);
+ background-image: -o-linear-gradient(top, #fdd49a, #fdf59a);
+ background-image: linear-gradient(top, #fdd49a, #fdf59a);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);
+ border-color: #fdf59a #fdf59a #fbed50;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+}
+.datepicker td.today:hover,
+.datepicker td.today:hover:hover,
+.datepicker td.today.disabled:hover,
+.datepicker td.today.disabled:hover:hover,
+.datepicker td.today:active,
+.datepicker td.today:hover:active,
+.datepicker td.today.disabled:active,
+.datepicker td.today.disabled:hover:active,
+.datepicker td.today.active,
+.datepicker td.today:hover.active,
+.datepicker td.today.disabled.active,
+.datepicker td.today.disabled:hover.active,
+.datepicker td.today.disabled,
+.datepicker td.today:hover.disabled,
+.datepicker td.today.disabled.disabled,
+.datepicker td.today.disabled:hover.disabled,
+.datepicker td.today[disabled],
+.datepicker td.today:hover[disabled],
+.datepicker td.today.disabled[disabled],
+.datepicker td.today.disabled:hover[disabled] {
+ background-color: #fdf59a !important; /* disable inheritance for inline */
+}
+.datepicker td.today:active,
+.datepicker td.today:hover:active,
+.datepicker td.today.disabled:active,
+.datepicker td.today.disabled:hover:active,
+.datepicker td.today.active,
+.datepicker td.today:hover.active,
+.datepicker td.today.disabled.active,
+.datepicker td.today.disabled:hover.active {
+ background-color: #fbf069 \9;
+}
+.datepicker td.active,
+.datepicker td.active:hover,
+.datepicker td.active.disabled,
+.datepicker td.active.disabled:hover {
+ background-color: #006dcc !important; /* disable inheritance for inline */
+ background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -ms-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+ background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+ background-image: linear-gradient(top, #0088cc, #0044cc);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
+ border-color: #0044cc #0044cc #002a80;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+ color: #fff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker td.active:hover,
+.datepicker td.active:hover:hover,
+.datepicker td.active.disabled:hover,
+.datepicker td.active.disabled:hover:hover,
+.datepicker td.active:active,
+.datepicker td.active:hover:active,
+.datepicker td.active.disabled:active,
+.datepicker td.active.disabled:hover:active,
+.datepicker td.active.active,
+.datepicker td.active:hover.active,
+.datepicker td.active.disabled.active,
+.datepicker td.active.disabled:hover.active,
+.datepicker td.active.disabled,
+.datepicker td.active:hover.disabled,
+.datepicker td.active.disabled.disabled,
+.datepicker td.active.disabled:hover.disabled,
+.datepicker td.active[disabled],
+.datepicker td.active:hover[disabled],
+.datepicker td.active.disabled[disabled],
+.datepicker td.active.disabled:hover[disabled] {
+ background-color: #0044cc;
+}
+.datepicker td.active:active,
+.datepicker td.active:hover:active,
+.datepicker td.active.disabled:active,
+.datepicker td.active.disabled:hover:active,
+.datepicker td.active.active,
+.datepicker td.active:hover.active,
+.datepicker td.active.disabled.active,
+.datepicker td.active.disabled:hover.active {
+ background-color: #003399 \9;
+}
+.datepicker td span {
+ display: block;
+ width: 23%;
+ height: 54px;
+ line-height: 54px;
+ float: left;
+ margin: 1%;
+ cursor: pointer;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+.datepicker td span:hover {
+ background: #eeeeee;
+}
+.datepicker td span.disabled,
+.datepicker td span.disabled:hover {
+ background: none;
+ color: #999999;
+ cursor: default;
+}
+.datepicker td span.active,
+.datepicker td span.active:hover,
+.datepicker td span.active.disabled,
+.datepicker td span.active.disabled:hover {
+ background-color: #006dcc;
+ background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -ms-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+ background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+ background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+ background-image: linear-gradient(top, #0088cc, #0044cc);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
+ border-color: #0044cc #0044cc #002a80;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+ color: #fff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.datepicker td span.active:hover,
+.datepicker td span.active:hover:hover,
+.datepicker td span.active.disabled:hover,
+.datepicker td span.active.disabled:hover:hover,
+.datepicker td span.active:active,
+.datepicker td span.active:hover:active,
+.datepicker td span.active.disabled:active,
+.datepicker td span.active.disabled:hover:active,
+.datepicker td span.active.active,
+.datepicker td span.active:hover.active,
+.datepicker td span.active.disabled.active,
+.datepicker td span.active.disabled:hover.active,
+.datepicker td span.active.disabled,
+.datepicker td span.active:hover.disabled,
+.datepicker td span.active.disabled.disabled,
+.datepicker td span.active.disabled:hover.disabled,
+.datepicker td span.active[disabled],
+.datepicker td span.active:hover[disabled],
+.datepicker td span.active.disabled[disabled],
+.datepicker td span.active.disabled:hover[disabled] {
+ background-color: #0044cc;
+}
+.datepicker td span.active:active,
+.datepicker td span.active:hover:active,
+.datepicker td span.active.disabled:active,
+.datepicker td span.active.disabled:hover:active,
+.datepicker td span.active.active,
+.datepicker td span.active:hover.active,
+.datepicker td span.active.disabled.active,
+.datepicker td span.active.disabled:hover.active {
+ background-color: #003399 \9;
+}
+.datepicker td span.old {
+ color: #999999;
+}
+.datepicker th.switch {
+ width: 145px;
+}
+.datepicker thead tr:first-child th,
+.datepicker tfoot tr:first-child th {
+ cursor: pointer;
+}
+.datepicker thead tr:first-child th:hover,
+.datepicker tfoot tr:first-child th:hover {
+ background: #eeeeee;
+}
+.input-append.date .add-on i,
+.input-prepend.date .add-on i {
+ display: block;
+ cursor: pointer;
+ width: 16px;
+ height: 16px;
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/css/img/loading.gif b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/css/img/loading.gif
new file mode 100644
index 0000000..5b33f7e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/css/img/loading.gif
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/js/bootstrap-editable-inline.min.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/js/bootstrap-editable-inline.min.js
new file mode 100644
index 0000000..ed749a3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/editable/bootstrap-editable/js/bootstrap-editable-inline.min.js
@@ -0,0 +1,5 @@
+/*! X-editable - v1.3.0
+* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery
+* http://github.com/vitalets/x-editable
+* Copyright (c) 2012 Vitaliy Potapov; Licensed MIT */
+(function(e){var t=function(t,n){this.options=e.extend({},e.fn.editableform.defaults,n),this.$div=e(t),this.options.scope||(this.options.scope=this),this.initInput()};t.prototype={constructor:t,initInput:function(){var t,n;if(typeof e.fn.editabletypes[this.options.type]!="function"){e.error("Unknown type: "+this.options.type);return}t=e.fn.editabletypes[this.options.type],n=e.fn.editableutils.sliceObj(this.options,e.fn.editableutils.objectKeys(t.defaults)),this.input=new t(n),this.value=this.input.str2value(this.options.value)},initTemplate:function(){this.$form=e(e.fn.editableform.template)},initButtons:function(){this.$form.find(".editable-buttons").append(e.fn.editableform.buttons)},render:function(){this.$loading=e(e.fn.editableform.loading),this.$div.empty().append(this.$loading),this.showLoading(),this.initTemplate(),this.options.showbuttons?this.initButtons():this.$form.find(".editable-buttons").remove(),this.$div.triggerHandler("rendering"),e.when(this.input.render()).then(e.proxy(function(){this.$form.find("div.editable-input").append(this.input.$input),this.options.showbuttons||this.input.autosubmit(),this.input.$clear&&this.$form.find("div.editable-input").append(e('<div class="editable-clear">').append(this.input.$clear)),this.$div.append(this.$form),this.$form.find(".editable-cancel").click(e.proxy(this.cancel,this)),this.input.error?(this.error(this.input.error),this.$form.find(".editable-submit").attr("disabled",!0),this.input.$input.attr("disabled",!0),this.$form.submit(function(e){e.preventDefault()})):(this.error(!1),this.input.$input.removeAttr("disabled"),this.$form.find(".editable-submit").removeAttr("disabled"),this.input.value2input(this.value),this.$form.submit(e.proxy(this.submit,this))),this.$div.triggerHandler("rendered"),this.showForm()},this))},cancel:function(){this.$div.triggerHandler("cancel")},showLoading:function(){var e;this.$form?(this.$loading.width(this.$form.outerWidth()),this.$loading.height(this.$form.outerHeight()),this.$form.hide()):(e=this.$loading.parent().width(),e&&this.$loading.width(e)),this.$loading.show()},showForm:function(e){this.$loading.hide(),this.$form.show(),e!==!1&&this.input.activate(),this.$div.triggerHandler("show")},error:function(t){var n=this.$form.find(".control-group"),r=this.$form.find(".editable-error-block");t===!1?(n.removeClass(e.fn.editableform.errorGroupClass),r.removeClass(e.fn.editableform.errorBlockClass).empty().hide()):(n.addClass(e.fn.editableform.errorGroupClass),r.addClass(e.fn.editableform.errorBlockClass).text(t).show())},submit:function(t){t.stopPropagation(),t.preventDefault();var n,r=this.input.input2value();if(n=this.validate(r)){this.error(n),this.showForm();return}if(!this.options.savenochange&&this.input.value2str(r)==this.input.value2str(this.value)){this.$div.triggerHandler("nochange");return}e.when(this.save(r)).done(e.proxy(function(e){var t=typeof this.options.success=="function"?this.options.success.call(this.options.scope,e,r):null;if(t===!1){this.error(!1),this.showForm(!1);return}if(typeof t=="string"){this.error(t),this.showForm();return}t&&typeof t=="object"&&t.hasOwnProperty("newValue")&&(r=t.newValue),this.error(!1),this.value=r,this.$div.triggerHandler("save",{newValue:r,response:e})},this)).fail(e.proxy(function(e){this.error(typeof e=="string"?e:e.responseText||e.statusText||"Unknown error!"),this.showForm()},this))},save:function(t){var n=this.input.value2submit(t);this.options.pk=e.fn.editableutils.tryParseJson(this.options.pk,!0);var r=typeof this.options.pk=="function"?this.options.pk.call(this.options.scope):this.options.pk,i=!!(typeof this.options.url=="function"||this.options.url&&(this.options.send==="always"||this.options.send==="auto"&&r)),s;if(i)return this.showLoading(),s={name:this.options.name||"",value:n,pk:r},typeof this.options.params=="function"?s=this.options.params.call(this.options.scope,s):(this.options.params=e.fn.editableutils.tryParseJson(this.options.params,!0),e.extend(s,this.options.params)),typeof this.options.url=="function"?this.options.url.call(this.options.scope,s):e.ajax(e.extend({url:this.options.url,data:s,type:"POST"},this.options.ajaxOptions))},validate:function(e){e===undefined&&(e=this.value);if(typeof this.options.validate=="function")return this.options.validate.call(this.options.scope,e)},option:function(e,t){this.options[e]=t,e==="value"&&this.setValue(t)},setValue:function(e,t){t?this.value=this.input.str2value(e):this.value=e}},e.fn.editableform=function(n){var r=arguments;return this.each(function(){var i=e(this),s=i.data("editableform"),o=typeof n=="object"&&n;s||i.data("editableform",s=new t(this,o)),typeof n=="string"&&s[n].apply(s,Array.prototype.slice.call(r,1))})},e.fn.editableform.Constructor=t,e.fn.editableform.defaults={type:"text",url:null,params:null,name:null,pk:null,value:null,send:"auto",validate:null,success:null,ajaxOptions:null,showbuttons:!0,scope:null,savenochange:!1},e.fn.editableform.template='<form class="form-inline editableform"><div class="control-group"><div><div class="editable-input"></div><div class="editable-buttons"></div></div><div class="editable-error-block"></div></div></form>',e.fn.editableform.loading='<div class="editableform-loading"></div>',e.fn.editableform.buttons='<button type="submit" class="editable-submit">ok</button><button type="button" class="editable-cancel">cancel</button>',e.fn.editableform.errorGroupClass=null,e.fn.editableform.errorBlockClass="editable-error"})(window.jQuery),function(e){e.fn.editableutils={inherit:function(e,t){var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e,e.superclass=t.prototype},setCursorPosition:function(e,t){if(e.setSelectionRange)e.setSelectionRange(t,t);else if(e.createTextRange){var n=e.createTextRange();n.collapse(!0),n.moveEnd("character",t),n.moveStart("character",t),n.select()}},tryParseJson:function(e,t){if(typeof e=="string"&&e.length&&e.match(/^[\{\[].*[\}\]]$/))if(t)try{e=(new Function("return "+e))()}catch(n){}finally{return e}else e=(new Function("return "+e))();return e},sliceObj:function(t,n,r){var i,s,o={};if(!e.isArray(n)||!n.length)return o;for(var u=0;u<n.length;u++){i=n[u],t.hasOwnProperty(i)&&(o[i]=t[i]);if(r===!0)continue;s=i.toLowerCase(),t.hasOwnProperty(s)&&(o[i]=t[s])}return o},getConfigData:function(t){var n={};return e.each(t.data(),function(e,t){if(typeof t!="object"||t&&typeof t=="object"&&t.constructor===Object)n[e]=t}),n},objectKeys:function(e){if(Object.keys)return Object.keys(e);if(e!==Object(e))throw new TypeError("Object.keys called on a non-object");var t=[],n;for(n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.push(n);return t},escape:function(t){return e("<div>").text(t).html()}}}(window.jQuery),function(e){var t=function(e,t){this.init(e,t)};t.prototype={containerName:null,innerCss:null,init:function(n,r){this.$element=e(n),this.options=e.extend({},e.fn.editableContainer.defaults,e.fn.editableutils.getConfigData(this.$element),r),this.splitOptions(),this.initContainer(),this.$element.on("destroyed",e.proxy(function(){this.destroy()},this)),e(document).data("editable-handlers-attached")||(e(document).on("keyup.editable",function(t){t.which===27&&e(".editable-open").editableContainer("hide")}),e(document).on("click.editable",function(n){var r=e(n.target);if(r.is(".editable-container")||r.parents(".editable-container").length||r.parents(".ui-datepicker-header").length)return;t.prototype.closeOthers(n.target)}),e(document).data("editable-handlers-attached",!0))},splitOptions:function(){this.containerOptions={},this.formOptions={};var t=e.fn[this.containerName].defaults;for(var n in this.options)n in t?this.containerOptions[n]=this.options[n]:this.formOptions[n]=this.options[n]},initContainer:function(){this.call(this.containerOptions)},initForm:function(){return this.formOptions.scope=this.$element[0],this.$form=e("<div>").editableform(this.formOptions).on({save:e.proxy(this.save,this),cancel:e.proxy(function(){this.hide("cancel")},this),nochange:e.proxy(function(){this.hide("nochange")},this),show:e.proxy(this.setPosition,this),rendering:e.proxy(this.setPosition,this),rendered:e.proxy(function(){this.$element.triggerHandler("shown")},this)}),this.$form},tip:function(){return this.container().$tip},container:function(){return this.$element.data(this.containerName)},call:function(){this.$element[this.containerName].apply(this.$element,arguments)},show:function(e){this.$element.addClass("editable-open"),e!==!1&&this.closeOthers(this.$element[0]),this.innerShow()},innerShow:function(){this.call("show"),this.tip().addClass("editable-container"),this.initForm(),this.tip().find(this.innerCss).empty().append(this.$form),this.$form.editableform("render")},hide:function(e){if(!this.tip()||!this.tip().is(":visible")||!this.$element.hasClass("editable-open"))return;this.$element.removeClass("editable-open"),this.innerHide(),this.$element.triggerHandler("hidden",e)},innerHide:function(){this.call("hide")},toggle:function(e){this.tip&&this.tip().is(":visible")?this.hide():this.show(e)},setPosition:function(){},save:function(e,t){this.hide("save"),this.$element.triggerHandler("save",t)},option:function(e,t){this.options[e]=t,e in this.containerOptions?(this.containerOptions[e]=t,this.setContainerOption(e,t)):(this.formOptions[e]=t,this.$form&&this.$form.editableform("option",e,t))},setContainerOption:function(e,t){this.call("option",e,t)},destroy:function(){this.call("destroy")},closeOthers:function(t){e(".editable-open").each(function(n,r){if(r===t||e(r).find(t).length)return;var i=e(r),s=i.data("editableContainer");if(!s)return;s.options.onblur==="cancel"?i.data("editableContainer").hide("onblur"):s.options.onblur==="submit"&&i.data("editableContainer").tip().find("form").submit()})},activate:function(){this.tip&&this.tip().is(":visible")&&this.$form&&this.$form.data("editableform").input.activate()}},e.fn.editableContainer=function(n){var r=arguments;return this.each(function(){var i=e(this),s="editableContainer",o=i.data(s),u=typeof n=="object"&&n;o||i.data(s,o=new t(this,u)),typeof n=="string"&&o[n].apply(o,Array.prototype.slice.call(r,1))})},e.fn.editableContainer.Constructor=t,e.fn.editableContainer.defaults={value:null,placement:"top",autohide:!0,onblur:"cancel"},jQuery.event.special.destroyed={remove:function(e){e.handler&&e.handler()}}}(window.jQuery),function(e){var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.editable.defaults,e.fn.editableutils.getConfigData(this.$element),n),this.init()};t.prototype={constructor:t,init:function(){var t,n=!1,r,i;if(!e.fn.editableContainer){e.error("You must define $.fn.editableContainer via including corresponding file (e.g. editable-popover.js)");return}this.options.name=this.options.name||this.$element.attr("id");if(typeof e.fn.editabletypes[this.options.type]!="function"){e.error("Unknown type: "+this.options.type);return}t=e.fn.editabletypes[this.options.type],this.typeOptions=e.fn.editableutils.sliceObj(this.options,e.fn.editableutils.objectKeys(t.defaults)),this.input=new t(this.typeOptions),this.options.value===undefined||this.options.value===null?(this.value=this.input.html2value(e.trim(this.$element.html())),n=!0):(this.options.value=e.fn.editableutils.tryParseJson(this.options.value,!0),typeof this.options.value=="string"?this.value=this.input.str2value(this.options.value):this.value=this.options.value),this.$element.addClass("editable"),this.options.toggle!=="manual"?(this.$element.addClass("editable-click"),this.$element.on(this.options.toggle+".editable",e.proxy(function(e){e.preventDefault();if(this.options.toggle==="mouseenter")this.show();else{var t=this.options.toggle!=="click";this.toggle(t)}},this))):this.$element.attr("tabindex",-1),r=!n&&this.value!==null&&this.value!==undefined,r&=this.options.autotext==="always"||this.options.autotext==="auto"&&!this.$element.text().length,e.when(r?this.render():!0).then(e.proxy(function(){this.options.disabled?this.disable():this.enable(),this.$element.triggerHandler("init",this)},this))},render:function(){if(this.options.display===!1)return;return this.input.options.hasOwnProperty("source")?this.input.value2html(this.value,this.$element[0],this.options.display):typeof this.options.display=="function"?this.options.display.call(this.$element[0],this.value):this.input.value2html(this.value,this.$element[0])},enable:function(){this.options.disabled=!1,this.$element.removeClass("editable-disabled"),this.handleEmpty(),this.options.toggle!=="manual"&&this.$element.attr("tabindex")==="-1"&&this.$element.removeAttr("tabindex")},disable:function(){this.options.disabled=!0,this.hide(),this.$element.addClass("editable-disabled"),this.handleEmpty(),this.$element.attr("tabindex",-1)},toggleDisabled:function(){this.options.disabled?this.enable():this.disable()},option:function(t,n){if(t&&typeof t=="object"){e.each(t,e.proxy(function(t,n){this.option(e.trim(t),n)},this));return}this.options[t]=n;if(t==="disabled"){n?this.disable():this.enable();return}t==="value"&&this.setValue(n),this.container&&this.container.option(t,n)},handleEmpty:function(){if(this.options.display===!1)return;var t="editable-empty";this.options.disabled?this.$element.hasClass(t)&&(this.$element.empty(),this.$element.removeClass(t)):e.trim(this.$element.text())===""?this.$element.addClass(t).text(this.options.emptytext):this.$element.removeClass(t)},show:function(t){if(this.options.disabled)return;if(!this.container){var n=e.extend({},this.options,{value:this.value});this.$element.editableContainer(n),this.$element.on("save.internal",e.proxy(this.save,this)),this.container=this.$element.data("editableContainer")}else if(this.container.tip().is(":visible"))return;this.container.show(t)},hide:function(){this.container&&this.container.hide()},toggle:function(e){this.container&&this.container.tip().is(":visible")?this.hide():this.show(e)},save:function(e,t){typeof this.options.url!="function"&&this.options.display!==!1&&t.response===undefined&&this.input.value2str(this.value)!==this.input.value2str(t.newValue)?this.$element.addClass("editable-unsaved"):this.$element.removeClass("editable-unsaved"),this.setValue(t.newValue)},validate:function(){if(typeof this.options.validate=="function")return this.options.validate.call(this,this.value)},setValue:function(t,n){n?this.value=this.input.str2value(t):this.value=t,this.container&&this.container.option("value",this.value),e.when(this.render()).then(e.proxy(function(){this.handleEmpty()},this))},activate:function(){this.container&&this.container.activate()}},e.fn.editable=function(n){var r={},i=arguments,s="editable";switch(n){case"validate":return this.each(function(){var t=e(this),n=t.data(s),i;n&&(i=n.validate())&&(r[n.options.name]=i)}),r;case"getValue":return this.each(function(){var t=e(this),n=t.data(s);n&&n.value!==undefined&&n.value!==null&&(r[n.options.name]=n.input.value2submit(n.value))}),r;case"submit":var o=arguments[1]||{},u=this,a=this.editable("validate"),f;return e.isEmptyObject(a)?(f=this.editable("getValue"),o.data&&e.extend(f,o.data),e.ajax(e.extend({url:o.url,data:f,type:"POST"},o.ajaxOptions)).success(function(e){typeof o.success=="function"&&o.success.call(u,e,o)}).error(function(){typeof o.error=="function"&&o.error.apply(u,arguments)})):typeof o.error=="function"&&o.error.call(u,a),this}return this.each(function(){var r=e(this),o=r.data(s),u=typeof n=="object"&&n;o||r.data(s,o=new t(this,u)),typeof n=="string"&&o[n].apply(o,Array.prototype.slice.call(i,1))})},e.fn.editable.defaults={type:"text",disabled:!1,toggle:"click",emptytext:"Empty",autotext:"auto",value:null,display:null}}(window.jQuery),function(e){e.fn.editabletypes={};var t=function(){};t.prototype={init:function(t,n,r){this.type=t,this.options=e.extend({},r,n),this.$input=null,this.$clear=null,this.error=null},render:function(){this.$input=e(this.options.tpl),this.options.inputclass&&this.$input.addClass(this.options.inputclass),this.options.placeholder&&this.$input.attr("placeholder",this.options.placeholder)},value2html:function(t,n){e(n).text(t)},html2value:function(t){return e("<div>").html(t).text()},value2str:function(e){return e},str2value:function(e){return e},value2submit:function(e){return e},value2input:function(e){this.$input.val(e)},input2value:function(){return this.$input.val()},activate:function(){this.$input.is(":visible")&&this.$input.focus()},clear:function(){this.$input.val(null)},escape:function(t){return e("<div>").text(t).html()},autosubmit:function(){}},t.defaults={tpl:"",inputclass:"input-medium",name:null},e.extend(e.fn.editabletypes,{abstractinput:t})}(window.jQuery),function(e){var t=function(e){};e.fn.editableutils.inherit(t,e.fn.editabletypes.abstractinput),e.extend(t.prototype,{render:function(){t.superclass.render.call(this);var n=e.Deferred();return this.error=null,this.sourceData=null,this.prependData=null,this.onSourceReady(function(){this.renderList(),n.resolve()},function(){this.error=this.options.sourceError,n.resolve()}),n.promise()},html2value:function(e){return null},value2html:function(t,n,r){var i=e.Deferred();return this.onSourceReady(function(){typeof r=="function"?r.call(n,t,this.sourceData):this.value2htmlFinal(t,n),i.resolve()},function(){i.resolve()}),i.promise()},onSourceReady:function(t,n){if(e.isArray(this.sourceData)){t.call(this);return}try{this.options.source=e.fn.editableutils.tryParseJson(this.options.source,!1)}catch(r){n.call(this);return}if(typeof this.options.source=="string"){if(this.options.sourceCache){var i=this.options.source+(this.options.name?"-"+this.options.name:""),s;e(document).data(i)||e(document).data(i,{}),s=e(document).data(i);if(s.loading===!1&&s.sourceData){this.sourceData=s.sourceData,t.call(this);return}if(s.loading===!0){s.callbacks.push(e.proxy(function(){this.sourceData=s.sourceData,t.call(this)},this)),s.err_callbacks.push(e.proxy(n,this));return}s.loading=!0,s.callbacks=[],s.err_callbacks=[]}e.ajax({url:this.options.source,type:"get",cache:!1,data:this.options.name?{name:this.options.name}:{},dataType:"json",success:e.proxy(function(r){s&&(s.loading=!1),this.sourceData=this.makeArray(r),e.isArray(this.sourceData)?(this.doPrepend(),t.call(this),s&&(s.sourceData=this.sourceData,e.each(s.callbacks,function(){this.call()}))):(n.call(this),s&&e.each(s.err_callbacks,function(){this.call()}))},this),error:e.proxy(function(){n.call(this),s&&(s.loading=!1,e.each(s.err_callbacks,function(){this.call()}))},this)})}else this.sourceData=this.makeArray(this.options.source),e.isArray(this.sourceData)?(this.doPrepend(),t.call(this)):n.call(this)},doPrepend:function(){if(this.options.prepend===null||this.options.prepend===undefined)return;e.isArray(this.prependData)||(this.options.prepend=e.fn.editableutils.tryParseJson(this.options.prepend,!0),typeof this.options.prepend=="string"&&(this.options.prepend={"":this.options.prepend}),this.prependData=this.makeArray(this.options.prepend)),e.isArray(this.prependData)&&e.isArray(this.sourceData)&&(this.sourceData=this.prependData.concat(this.sourceData))},renderList:function(){},value2htmlFinal:function(e,t){},makeArray:function(t){var n,r,i=[],s;if(!t||typeof t=="string")return null;if(e.isArray(t)){s=function(e,t){r={value:e,text:t};if(n++>=2)return!1};for(var o=0;o<t.length;o++)typeof t[o]=="object"?(n=0,e.each(t[o],s),n===1?i.push(r):n>1&&t[o].hasOwnProperty("value")&&t[o].hasOwnProperty("text")&&i.push(t[o])):i.push({value:t[o],text:t[o]})}else e.each(t,function(e,t){i.push({value:e,text:t})});return i},itemByVal:function(t){if(e.isArray(this.sourceData))for(var n=0;n<this.sourceData.length;n++)if(this.sourceData[n].value==t)return this.sourceData[n]}}),t.defaults=e.extend({},e.fn.editabletypes.abstractinput.defaults,{source:null,prepend:!1,sourceError:"Error when loading list",sourceCache:!0}),e.fn.editabletypes.list=t}(window.jQuery),function(e){var t=function(e){this.init("text",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.abstractinput),e.extend(t.prototype,{activate:function(){this.$input.is(":visible")&&(this.$input.focus(),e.fn.editableutils.setCursorPosition(this.$input.get(0),this.$input.val().length))}}),t.defaults=e.extend({},e.fn.editabletypes.abstractinput.defaults,{tpl:'<input type="text">',placeholder:null}),e.fn.editabletypes.text=t}(window.jQuery),function(e){var t=function(e){this.init("textarea",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.abstractinput),e.extend(t.prototype,{render:function(){t.superclass.render.call(this),this.$input.keydown(function(t){t.ctrlKey&&t.which===13&&e(this).closest("form").submit()})},value2html:function(t,n){var r="",i;if(t){i=t.split("\n");for(var s=0;s<i.length;s++)i[s]=e("<div>").text(i[s]).html();r=i.join("<br>")}e(n).html(r)},html2value:function(t){if(!t)return"";var n=t.split(/<br\s*\/?>/i);for(var r=0;r<n.length;r++)n[r]=e("<div>").html(n[r]).text();return n.join("\n")},activate:function(){this.$input.is(":visible")&&(e.fn.editableutils.setCursorPosition(this.$input.get(0),this.$input.val().length),this.$input.focus())}}),t.defaults=e.extend({},e.fn.editabletypes.abstractinput.defaults,{tpl:"<textarea></textarea>",inputclass:"input-large",placeholder:null}),e.fn.editabletypes.textarea=t}(window.jQuery),function(e){var t=function(e){this.init("select",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.list),e.extend(t.prototype,{renderList:function(){if(!e.isArray(this.sourceData))return;for(var t=0;t<this.sourceData.length;t++)this.$input.append(e("<option>",{value:this.sourceData[t].value}).text(this.sourceData[t].text));this.$input.on("keydown.editable",function(t){t.which===13&&e(this).closest("form").submit()})},value2htmlFinal:function(e,n){var r="",i=this.itemByVal(e);i&&(r=i.text),t.superclass.constructor.superclass.value2html(r,n)},autosubmit:function(){this.$input.off("keydown.editable").on("change.editable",function(){e(this).closest("form").submit()})}}),t.defaults=e.extend({},e.fn.editabletypes.list.defaults,{tpl:"<select></select>"}),e.fn.editabletypes.select=t}(window.jQuery),function(e){var t=function(e){this.init("checklist",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.list),e.extend(t.prototype,{renderList:function(){var t,n;if(!e.isArray(this.sourceData))return;for(var r=0;r<this.sourceData.length;r++)t=e("<label>").append(e("<input>",{type:"checkbox",value:this.sourceData[r].value,name:this.options.name})).append(e("<span>").text(" "+this.sourceData[r].text)),e("<div>").append(t).appendTo(this.$input)},value2str:function(t){return e.isArray(t)?t.sort().join(e.trim(this.options.separator)):""},str2value:function(t){var n,r=null;return typeof t=="string"&&t.length?(n=new RegExp("\\s*"+e.trim(this.options.separator)+"\\s*"),r=t.split(n)):e.isArray(t)&&(r=t),r},value2input:function(t){var n=this.$input.find('input[type="checkbox"]');n.removeAttr("checked"),e.isArray(t)&&t.length&&n.each(function(n,r){var i=e(r);e.each(t,function(e,t){i.val()==t&&i.attr("checked","checked")})})},input2value:function(){var t=[];return this.$input.find("input:checked").each(function(n,r){t.push(e(r).val())}),t},value2htmlFinal:function(t,n){var r=[],i=e.grep(this.sourceData,function(n){return e.grep(t,function(e){return e==n.value}).length});i.length?(e.each(i,function(t,n){r.push(e.fn.editableutils.escape(n.text))}),e(n).html(r.join("<br>"))):e(n).empty()},activate:function(){this.$input.find('input[type="checkbox"]').first().focus()},autosubmit:function(){this.$input.find('input[type="checkbox"]').on("keydown",function(t){t.which===13&&e(this).closest("form").submit()})}}),t.defaults=e.extend({},e.fn.editabletypes.list.defaults,{tpl:"<div></div>",inputclass:"editable-checklist",separator:","}),e.fn.editabletypes.checklist=t}(window.jQuery),function(e){var t=function(e){this.init("password",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.text),e.extend(t.prototype,{value2html:function(t,n){t?e(n).text("[hidden]"):e(n).empty()},html2value:function(e){return null}}),t.defaults=e.extend({},e.fn.editabletypes.text.defaults,{tpl:'<input type="password">'}),e.fn.editabletypes.password=t}(window.jQuery),function(e){var t=function(e){this.init("email",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.text),t.defaults=e.extend({},e.fn.editabletypes.text.defaults,{tpl:'<input type="email">'}),e.fn.editabletypes.email=t}(window.jQuery),function(e){var t=function(e){this.init("url",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.text),t.defaults=e.extend({},e.fn.editabletypes.text.defaults,{tpl:'<input type="url">'}),e.fn.editabletypes.url=t}(window.jQuery),function(e){var t=function(e){this.init("tel",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.text),t.defaults=e.extend({},e.fn.editabletypes.text.defaults,{tpl:'<input type="tel">'}),e.fn.editabletypes.tel=t}(window.jQuery),function(e){var t=function(e){this.init("number",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.text),e.extend(t.prototype,{render:function(){t.superclass.render.call(this),this.options.min!==null&&this.$input.attr("min",this.options.min),this.options.max!==null&&this.$input.attr("max",this.options.max),this.options.step!==null&&this.$input.attr("step",this.options.step)}}),t.defaults=e.extend({},e.fn.editabletypes.text.defaults,{tpl:'<input type="number">',inputclass:"input-mini",min:null,max:null,step:null}),e.fn.editabletypes.number=t}(window.jQuery),function(e){var t=function(e){this.init("range",e,t.defaults)};e.fn.editableutils.inherit(t,e.fn.editabletypes.number),e.extend(t.prototype,{render:function(){this.$input=e(this.options.tpl);var t=this.$input.filter("input");this.options.inputclass&&t.addClass(this.options.inputclass),this.options.min!==null&&t.attr("min",this.options.min),this.options.max!==null&&t.attr("max",this.options.max),this.options.step!==null&&t.attr("step",this.options.step),t.on("input",function(){e(this).siblings("output").text(e(this).val())})},activate:function(){this.$input.filter("input").focus()}}),t.defaults=e.extend({},e.fn.editabletypes.number.defaults,{tpl:'<input type="range"><output style="width: 30px; display: inline-block"></output>',inputclass:"input-medium"}),e.fn.editabletypes.range=t}(window.jQuery),function(e){e.extend(e.fn.editableform.Constructor.prototype,{initTemplate:function(){this.$form=e(e.fn.editableform.template),this.$form.find(".editable-error-block").addClass("help-block")}}),e.fn.editableform.buttons='<button type="submit" class="btn btn-primary editable-submit"><i class="icon-ok icon-white"></i></button><button type="button" class="btn editable-cancel"><i class="icon-remove"></i></button>',e.fn.editableform.errorGroupClass="error",e.fn.editableform.errorBlockClass=null}(window.jQuery),function(e){e.extend(e.fn.editableContainer.Constructor.prototype,{containerName:"editableform",innerCss:null,initContainer:function(){this.options.anim||(this.options.anim=0)},splitOptions:function(){this.containerOptions={},this.formOptions=this.options},tip:function(){return this.$form},innerShow:function(){this.$element.hide(),this.$form&&this.$form.remove(),this.initForm(),this.tip().addClass("editable-container").addClass("editable-inline"),this.$form.insertAfter(this.$element),this.$form.show(this.options.anim),this.$form.editableform("render")},innerHide:function(){this.$form.hide(this.options.anim,e.proxy(function(){this.$element.show()},this))},destroy:function(){this.tip().remove()}}),e.fn.editableContainer.defaults=e.extend({},e.fn.editableContainer.defaults,{anim:"fast"})}(window.jQuery),function(e){var t=function(n){this.init("date",n,t.defaults);var r=e.fn.editableutils.sliceObj(this.options,["format"]);this.options.datepicker=e.extend({},t.defaults.datepicker,r,n.datepicker),this.options.viewformat||(this.options.viewformat=this.options.datepicker.format),this.options.datepicker.language=this.options.datepicker.language||"en",this.dpg=e.fn.datepicker.DPGlobal,this.parsedFormat=this.dpg.parseFormat(this.options.datepicker.format),this.parsedViewFormat=this.dpg.parseFormat(this.options.viewformat)};e.fn.editableutils.inherit(t,e.fn.editabletypes.abstractinput),e.extend(t.prototype,{render:function(){t.superclass.render.call(this),this.$input.datepicker(this.options.datepicker),this.options.clear&&(this.$clear=e('<a href="#"></a>').html(this.options.clear).click(e.proxy(function(e){e.preventDefault(),e.stopPropagation(),this.clear()},this)))},value2html:function(e,n){var r=e?this.dpg.formatDate(e,this.parsedViewFormat,this.options.datepicker.language):"";t.superclass.value2html(r,n)},html2value:function(e){return e?this.dpg.parseDate(e,this.parsedViewFormat,this.options.datepicker.language):null},value2str:function(e){return e?this.dpg.formatDate(e,this.parsedFormat,this.options.datepicker.language):""},str2value:function(e){return e?this.dpg.parseDate(e,this.parsedFormat,this.options.datepicker.language):null},value2submit:function(e){return this.value2str(e)},value2input:function(e){this.$input.datepicker("update",e)},input2value:function(){return this.$input.data("datepicker").date},activate:function(){},clear:function(){this.$input.data("datepicker").date=null,this.$input.find(".active").removeClass("active")},autosubmit:function(){this.$input.on("changeDate",function(t){var n=e(this).closest("form");setTimeout(function(){n.submit()},200)})}}),t.defaults=e.extend({},e.fn.editabletypes.abstractinput.defaults,{tpl:"<div></div>",inputclass:"editable-date well",format:"yyyy-mm-dd",viewformat:null,datepicker:{weekStart:0,startView:0,autoclose:!1},clear:"&times; clear"}),e.fn.editabletypes.date=t}(window.jQuery),!function(e){function t(){return new Date(Date.UTC.apply(Date,arguments))}function n(){var e=new Date;return t(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate())}var r=function(t,n){var r=this;this.element=e(t),this.language=n.language||this.element.data("date-language")||"en",this.language=this.language in i?this.language:"en",this.format=s.parseFormat(n.format||this.element.data("date-format")||"mm/dd/yyyy"),this.isInline=!1,this.isInput=this.element.is("input"),this.component=this.element.is(".date")?this.element.find(".add-on"):!1,this.hasInput=this.component&&this.element.find("input").length,this.component&&this.component.length===0&&(this.component=!1),this.isInput?this.element.on({focus:e.proxy(this.show,this),keyup:e.proxy(this.update,this),keydown:e.proxy(this.keydown,this)}):this.component&&this.hasInput?(this.element.find("input").on({focus:e.proxy(this.show,this),keyup:e.proxy(this.update,this),keydown:e.proxy(this.keydown,this)}),this.component.on("click",e.proxy(this.show,this))):this.element.is("div")?this.isInline=!0:this.element.on("click",e.proxy(this.show,this)),this.picker=e(s.template).appendTo(this.isInline?this.element:"body").on({click:e.proxy(this.click,this),mousedown:e.proxy(this.mousedown,this)}),this.isInline?this.picker.addClass("datepicker-inline"):this.picker.addClass("dropdown-menu"),e(document).on("mousedown",function(t){e(t.target).closest(".datepicker").length==0&&r.hide()}),this.autoclose=!1,"autoclose"in n?this.autoclose=n.autoclose:"dateAutoclose"in this.element.data()&&(this.autoclose=this.element.data("date-autoclose")),this.keyboardNavigation=!0,"keyboardNavigation"in n?this.keyboardNavigation=n.keyboardNavigation:"dateKeyboardNavigation"in this.element.data()&&(this.keyboardNavigation=this.element.data("date-keyboard-navigation"));switch(n.startView||this.element.data("date-start-view")){case 2:case"decade":this.viewMode=this.startViewMode=2;break;case 1:case"year":this.viewMode=this.startViewMode=1;break;case 0:case"month":default:this.viewMode=this.startViewMode=0}this.todayBtn=n.todayBtn||this.element.data("date-today-btn")||!1,this.todayHighlight=n.todayHighlight||this.element.data("date-today-highlight")||!1,this.weekStart=(n.weekStart||this.element.data("date-weekstart")||i[this.language].weekStart||0)%7,this.weekEnd=(this.weekStart+6)%7,this.startDate=-Infinity,this.endDate=Infinity,this.setStartDate(n.startDate||this.element.data("date-startdate")),this.setEndDate(n.endDate||this.element.data("date-enddate")),this.fillDow(),this.fillMonths(),this.update(),this.showMode(),this.isInline&&this.show()};r.prototype={constructor:r,show:function(t){this.picker.show(),this.height=this.component?this.component.outerHeight():this.element.outerHeight(),this.update(),this.place(),e(window).on("resize",e.proxy(this.place,this)),t&&(t.stopPropagation(),t.preventDefault()),this.element.trigger({type:"show",date:this.date})},hide:function(t){if(this.isInline)return;this.picker.hide(),e(window).off("resize",this.place),this.viewMode=this.startViewMode,this.showMode(),this.isInput||e(document).off("mousedown",this.hide),t&&t.currentTarget.value&&this.setValue(),this.element.trigger({type:"hide",date:this.date})},getDate:function(){var e=this.getUTCDate();return new Date(e.getTime()+e.getTimezoneOffset()*6e4)},getUTCDate:function(){return this.date},setDate:function(e){this.setUTCDate(new Date(e.getTime()-e.getTimezoneOffset()*6e4))},setUTCDate:function(e){this.date=e,this.setValue()},setValue:function(){var e=this.getFormattedDate();this.isInput?this.element.prop("value",e):(this.component&&this.element.find("input").prop("value",e),this.element.data("date",e))},getFormattedDate:function(e){return e==undefined&&(e=this.format),s.formatDate(this.date,e,this.language)},setStartDate:function(e){this.startDate=e||-Infinity,this.startDate!==-Infinity&&(this.startDate=s.parseDate(this.startDate,this.format,this.language)),this.update(),this.updateNavArrows()},setEndDate:function(e){this.endDate=e||Infinity,this.endDate!==Infinity&&(this.endDate=s.parseDate(this.endDate,this.format,this.language)),this.update(),this.updateNavArrows()},place:function(){if(this.isInline)return;var t=parseInt(this.element.parents().filter(function(){return e(this).css("z-index")!="auto"}).first().css("z-index"))+10,n=this.component?this.component.offset():this.element.offset();this.picker.css({top:n.top+this.height,left:n.left,zIndex:t})},update:function(){var e,t=!1;arguments&&arguments.length&&(typeof arguments[0]=="string"||arguments[0]instanceof Date)?(e=arguments[0],t=!0):e=this.isInput?this.element.prop("value"):this.element.data("date")||this.element.find("input").prop("value"),this.date=s.parseDate(e,this.format,this.language),t&&this.setValue(),this.date<this.startDate?this.viewDate=new Date(this.startDate):this.date>this.endDate?this.viewDate=new Date(this.endDate):this.viewDate=new Date(this.date),this.fill()},fillDow:function(){var e=this.weekStart,t="<tr>";while(e<this.weekStart+7)t+='<th class="dow">'+i[this.language].daysMin[e++%7]+"</th>";t+="</tr>",this.picker.find(".datepicker-days thead").append(t)},fillMonths:function(){var e="",t=0;while(t<12)e+='<span class="month">'+i[this.language].monthsShort[t++]+"</span>";this.picker.find(".datepicker-months td").html(e)},fill:function(){var e=new Date(this.viewDate),n=e.getUTCFullYear(),r=e.getUTCMonth(),o=this.startDate!==-Infinity?this.startDate.getUTCFullYear():-Infinity,u=this.startDate!==-Infinity?this.startDate.getUTCMonth():-Infinity,a=this.endDate!==Infinity?this.endDate.getUTCFullYear():Infinity,f=this.endDate!==Infinity?this.endDate.getUTCMonth():Infinity,l=this.date&&this.date.valueOf(),c=new Date;this.picker.find(".datepicker-days thead th:eq(1)").text(i[this.language].months[r]+" "+n),this.picker.find("tfoot th.today").text(i[this.language].today).toggle(this.todayBtn!==!1),this.updateNavArrows(),this.fillMonths();var h=t(n,r-1,28,0,0,0,0),p=s.getDaysInMonth(h.getUTCFullYear(),h.getUTCMonth());h.setUTCDate(p),h.setUTCDate(p-(h.getUTCDay()-this.weekStart+7)%7);var d=new Date(h);d.setUTCDate(d.getUTCDate()+42),d=d.valueOf();var v=[],m;while(h.valueOf()<d){h.getUTCDay()==this.weekStart&&v.push("<tr>"),m="";if(h.getUTCFullYear()<n||h.getUTCFullYear()==n&&h.getUTCMonth()<r)m+=" old";else if(h.getUTCFullYear()>n||h.getUTCFullYear()==n&&h.getUTCMonth()>r)m+=" new";this.todayHighlight&&h.getUTCFullYear()==c.getFullYear()&&h.getUTCMonth()==c.getMonth()&&h.getUTCDate()==c.getDate()&&(m+=" today"),l&&h.valueOf()==l&&(m+=" active");if(h.valueOf()<this.startDate||h.valueOf()>this.endDate)m+=" disabled";v.push('<td class="day'+m+'">'+h.getUTCDate()+"</td>"),h.getUTCDay()==this.weekEnd&&v.push("</tr>"),h.setUTCDate(h.getUTCDate()+1)}this.picker.find(".datepicker-days tbody").empty().append(v.join(""));var g=this.date&&this.date.getUTCFullYear(),y=this.picker.find(".datepicker-months").find("th:eq(1)").text(n).end().find("span").removeClass("active");g&&g==n&&y.eq(this.date.getUTCMonth()).addClass("active"),(n<o||n>a)&&y.addClass("disabled"),n==o&&y.slice(0,u).addClass("disabled"),n==a&&y.slice(f+1).addClass("disabled"),v="",n=parseInt(n/10,10)*10;var b=this.picker.find(".datepicker-years").find("th:eq(1)").text(n+"-"+(n+9)).end().find("td");n-=1;for(var w=-1;w<11;w++)v+='<span class="year'+(w==-1||w==10?" old":"")+(g==n?" active":"")+(n<o||n>a?" disabled":"")+'">'+n+"</span>",n+=1;b.html(v)},updateNavArrows:function(){var e=new Date(this.viewDate),t=e.getUTCFullYear(),n=e.getUTCMonth();switch(this.viewMode){case 0:this.startDate!==-Infinity&&t<=this.startDate.getUTCFullYear()&&n<=this.startDate.getUTCMonth()?this.picker.find(".prev").css({visibility:"hidden"}):this.picker.find(".prev").css({visibility:"visible"}),this.endDate!==Infinity&&t>=this.endDate.getUTCFullYear()&&n>=this.endDate.getUTCMonth()?this.picker.find(".next").css({visibility:"hidden"}):this.picker.find(".next").css({visibility:"visible"});break;case 1:case 2:this.startDate!==-Infinity&&t<=this.startDate.getUTCFullYear()?this.picker.find(".prev").css({visibility:"hidden"}):this.picker.find(".prev").css({visibility:"visible"}),this.endDate!==Infinity&&t>=this.endDate.getUTCFullYear()?this.picker.find(".next").css({visibility:"hidden"}):this.picker.find(".next").css({visibility:"visible"})}},click:function(n){n.stopPropagation(),n.preventDefault();var r=e(n.target).closest("span, td, th");if(r.length==1)switch(r[0].nodeName.toLowerCase()){case"th":switch(r[0].className){case"switch":this.showMode(1);break;case"prev":case"next":var i=s.modes[this.viewMode].navStep*(r[0].className=="prev"?-1:1);switch(this.viewMode){case 0:this.viewDate=this.moveMonth(this.viewDate,i);break;case 1:case 2:this.viewDate=this.moveYear(this.viewDate,i)}this.fill();break;case"today":var o=new Date;o=t(o.getFullYear(),o.getMonth(),o.getDate(),0,0,0),this.showMode(-2);var u=this.todayBtn=="linked"?null:"view";this._setDate(o,u)}break;case"span":if(!r.is(".disabled")){this.viewDate.setUTCDate(1);if(r.is(".month")){var a=r.parent().find("span").index(r);this.viewDate.setUTCMonth(a),this.element.trigger({type:"changeMonth",date:this.viewDate})}else{var f=parseInt(r.text(),10)||0;this.viewDate.setUTCFullYear(f),this.element.trigger({type:"changeYear",date:this.viewDate})}this.showMode(-1),this.fill()}break;case"td":if(r.is(".day")&&!r.is(".disabled")){var l=parseInt(r.text(),10)||1,f=this.viewDate.getUTCFullYear(),a=this.viewDate.getUTCMonth();r.is(".old")?a==0?(a=11,f-=1):a-=1:r.is(".new")&&(a==11?(a=0,f+=1):a+=1),this._setDate(t(f,a,l,0,0,0,0))}}},_setDate:function(e,t){if(!t||t=="date")this.date=e;if(!t||t=="view")this.viewDate=e;this.fill(),this.setValue(),this.element.trigger({type:"changeDate",date:this.date});var n;this.isInput?n=this.element:this.component&&(n=this.element.find("input")),n&&(n.change(),this.autoclose&&this.hide())},moveMonth:function(e,t){if(!t)return e;var n=new Date(e.valueOf()),r=n.getUTCDate(),i=n.getUTCMonth(),s=Math.abs(t),o,u;t=t>0?1:-1;if(s==1){u=t==-1?function(){return n.getUTCMonth()==i}:function(){return n.getUTCMonth()!=o},o=i+t,n.setUTCMonth(o);if(o<0||o>11)o=(o+12)%12}else{for(var a=0;a<s;a++)n=this.moveMonth(n,t);o=n.getUTCMonth(),n.setUTCDate(r),u=function(){return o!=n.getUTCMonth()}}while(u())n.setUTCDate(--r),n.setUTCMonth(o);return n},moveYear:function(e,t){return this.moveMonth(e,t*12)},dateWithinRange:function(e){return e>=this.startDate&&e<=this.endDate},keydown:function(e){if(this.picker.is(":not(:visible)")){e.keyCode==27&&this.show();return}var t=!1,n,r,i,s,o;switch(e.keyCode){case 27:this.hide(),e.preventDefault();break;case 37:case 39:if(!this.keyboardNavigation)break;n=e.keyCode==37?-1:1,e.ctrlKey?(s=this.moveYear(this.date,n),o=this.moveYear(this.viewDate,n)):e.shiftKey?(s=this.moveMonth(this.date,n),o=this.moveMonth(this.viewDate,n)):(s=new Date(this.date),s.setUTCDate(this.date.getUTCDate()+n),o=new Date(this.viewDate),o.setUTCDate(this.viewDate.getUTCDate()+n)),this.dateWithinRange(s)&&(this.date=s,this.viewDate=o,this.setValue(),this.update(),e.preventDefault(),t=!0);break;case 38:case 40:if(!this.keyboardNavigation)break;n=e.keyCode==38?-1:1,e.ctrlKey?(s=this.moveYear(this.date,n),o=this.moveYear(this.viewDate,n)):e.shiftKey?(s=this.moveMonth(this.date,n),o=this.moveMonth(this.viewDate,n)):(s=new Date(this.date),s.setUTCDate(this.date.getUTCDate()+n*7),o=new Date(this.viewDate),o.setUTCDate(this.viewDate.getUTCDate()+n*7)),this.dateWithinRange(s)&&(this.date=s,this.viewDate=o,this.setValue(),this.update(),e.preventDefault(),t=!0);break;case 13:this.hide(),e.preventDefault();break;case 9:this.hide()}if(t){this.element.trigger({type:"changeDate",date:this.date});var u;this.isInput?u=this.element:this.component&&(u=this.element.find("input")),u&&u.change()}},showMode:function(e){e&&(this.viewMode=Math.max(0,Math.min(2,this.viewMode+e))),this.picker.find(">div").hide().filter(".datepicker-"+s.modes[this.viewMode].clsName).css("display","block"),this.updateNavArrows()}},e.fn.datepicker=function(t){var n=Array.apply(null,arguments);return n.shift(),this.each(function(){var i=e(this),s=i.data("datepicker"),o=typeof t=="object"&&t;s||i.data("datepicker",s=new r(this,e.extend({},e.fn.datepicker.defaults,o))),typeof t=="string"&&typeof s[t]=="function"&&s[t].apply(s,n)})},e.fn.datepicker.defaults={},e.fn.datepicker.Constructor=r;var i=e.fn.datepicker.dates={en:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],daysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sun"],daysMin:["Su","Mo","Tu","We","Th","Fr","Sa","Su"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],today:"Today"}},s={modes:[{clsName:"days",navFnc:"Month",navStep:1},{clsName:"months",navFnc:"FullYear",navStep:1},{clsName:"years",navFnc:"FullYear",navStep:10}],isLeapYear:function(e){return e%4===0&&e%100!==0||e%400===0},getDaysInMonth:function(e,t){return[31,s.isLeapYear(e)?29:28,31,30,31,30,31,31,30,31,30,31][t]},validParts:/dd?|mm?|MM?|yy(?:yy)?/g,nonpunctuation:/[^ -\/:-@\[-`{-~\t\n\r]+/g,parseFormat:function(e){var t=e.replace(this.validParts,"\0").split("\0"),n=e.match(this.validParts);if(!t||!t.length||!n||n.length==0)throw new Error("Invalid date format.");return{separators:t,parts:n}},parseDate:function(n,s,o){if(n instanceof Date)return n;if(/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(n)){var u=/([-+]\d+)([dmwy])/,a=n.match(/([-+]\d+)([dmwy])/g),f,l;n=new Date;for(var c=0;c<a.length;c++){f=u.exec(a[c]),l=parseInt(f[1]);switch(f[2]){case"d":n.setUTCDate(n.getUTCDate()+l);break;case"m":n=r.prototype.moveMonth.call(r.prototype,n,l);break;case"w":n.setUTCDate(n.getUTCDate()+l*7);break;case"y":n=r.prototype.moveYear.call(r.prototype,n,l)}}return t(n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate(),0,0,0)}var a=n&&n.match(this.nonpunctuation)||[],n=new Date,h={},p=["yyyy","yy","M","MM","m","mm","d","dd"],d={yyyy:function(e,t){return e.setUTCFullYear(t)},yy:function(e,t){return e.setUTCFullYear(2e3+t)},m:function(e,t){t-=1;while(t<0)t+=12;t%=12,e.setUTCMonth(t);while(e.getUTCMonth()!=t)e.setUTCDate(e.getUTCDate()-1);return e},d:function(e,t){return e.setUTCDate(t)}},v,m,f;d.M=d.MM=d.mm=d.m,d.dd=d.d,n=t(n.getFullYear(),n.getMonth(),n.getDate(),0,0,0);if(a.length==s.parts.length){for(var c=0,g=s.parts.length;c<g;c++){v=parseInt(a[c],10),f=s.parts[c];if(isNaN(v))switch(f){case"MM":m=e(i[o].months).filter(function(){var e=this.slice(0,a[c].length),t=a[c].slice(0,e.length);return e==t}),v=e.inArray(m[0],i[o].months)+1;break;case"M":m=e(i[o].monthsShort).filter(function(){var e=this.slice(0,a[c].length),t=a[c].slice(0,e.length);return e==t}),v=e.inArray(m[0],i[o].monthsShort)+1}h[f]=v}for(var c=0,y;c<p.length;c++)y=p[c],y in h&&d[y](n,h[y])}return n},formatDate:function(t,n,r){var s={d:t.getUTCDate(),m:t.getUTCMonth()+1,M:i[r].monthsShort[t.getUTCMonth()],MM:i[r].months[t.getUTCMonth()],yy:t.getUTCFullYear().toString().substring(2),yyyy:t.getUTCFullYear()};s.dd=(s.d<10?"0":"")+s.d,s.mm=(s.m<10?"0":"")+s.m;var t=[],o=e.extend([],n.separators);for(var u=0,a=n.parts.length;u<a;u++)o.length&&t.push(o.shift()),t.push(s[n.parts[u]]);return t.join("")},headTemplate:'<thead><tr><th class="prev"><i class="icon-arrow-left"/></th><th colspan="5" class="switch"></th><th class="next"><i class="icon-arrow-right"/></th></tr></thead>',contTemplate:'<tbody><tr><td colspan="7"></td></tr></tbody>',footTemplate:'<tfoot><tr><th colspan="7" class="today"></th></tr></tfoot>'};s.template='<div class="datepicker"><div class="datepicker-days"><table class=" table-condensed">'+s.headTemplate+"<tbody></tbody>"+s.footTemplate+"</table>"+"</div>"+'<div class="datepicker-months">'+'<table class="table-condensed">'+s.headTemplate+s.contTemplate+s.footTemplate+"</table>"+"</div>"+'<div class="datepicker-years">'+'<table class="table-condensed">'+s.headTemplate+s.contTemplate+s.footTemplate+"</table>"+"</div>"+"</div>",e.fn.datepicker.DPGlobal=s}(window.jQuery); \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/no-theme/jquery-ui.min.css b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/no-theme/jquery-ui.min.css
new file mode 100644
index 0000000..4649e5d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/no-theme/jquery-ui.min.css
@@ -0,0 +1,7 @@
+/*! jQuery UI - v1.11.1 - 2014-08-23
+* http://jqueryui.com
+* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_228ef1_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffd27a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x;opacity:.2;filter:Alpha(Opacity=20);border-radius:5px} \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/no-theme/jquery-ui.structure.min.css b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/no-theme/jquery-ui.structure.min.css
new file mode 100644
index 0000000..52b2349
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/no-theme/jquery-ui.structure.min.css
@@ -0,0 +1,5 @@
+/*! jQuery UI - v1.11.1 - 2014-08-19
+* http://jqueryui.com
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px} \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png
new file mode 100644
index 0000000..2639bee
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png
new file mode 100644
index 0000000..f2d760e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png
new file mode 100644
index 0000000..ad01bf6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png
new file mode 100644
index 0000000..dad987a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png
new file mode 100644
index 0000000..0875e4f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png
new file mode 100644
index 0000000..0af0537
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png
new file mode 100644
index 0000000..e6e5130
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
new file mode 100644
index 0000000..be87342
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
new file mode 100644
index 0000000..fe75af5
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_222222_256x240.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_222222_256x240.png
new file mode 100644
index 0000000..5977ef2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_222222_256x240.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png
new file mode 100644
index 0000000..8df056f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png
new file mode 100644
index 0000000..9d3db37
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png
new file mode 100644
index 0000000..392fd6e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png
new file mode 100644
index 0000000..a45283b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/jquery-ui.theme.min.css b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/jquery-ui.theme.min.css
new file mode 100644
index 0000000..6bdc4ef
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/css/ui-lightness/jquery-ui.theme.min.css
@@ -0,0 +1,5 @@
+/*! jQuery UI - v1.11.1 - 2014-08-23
+* http://jqueryui.com
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_228ef1_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffd27a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x;opacity:.2;filter:Alpha(Opacity=20);border-radius:5px} \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/js/jquery-ui.min.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/js/jquery-ui.min.js
new file mode 100644
index 0000000..71b02d1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery-ui/js/jquery-ui.min.js
@@ -0,0 +1,13 @@
+/*! jQuery UI - v1.11.1 - 2014-08-19
+* http://jqueryui.com
+* Includes: core.js, widget.js, mouse.js, position.js, draggable.js, droppable.js, resizable.js, selectable.js, sortable.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, menu.js, progressbar.js, selectmenu.js, slider.js, spinner.js, tabs.js, tooltip.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js
+* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+
+(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/input|select|textarea|button|object/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}function s(e){for(var t,i;e.length&&e[0]!==document;){if(t=e.css("position"),("absolute"===t||"relative"===t||"fixed"===t)&&(i=parseInt(e.css("zIndex"),10),!isNaN(i)&&0!==i))return i;e=e.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},e.extend(this._defaults,this.regional[""]),this.regional.en=e.extend(!0,{},this.regional[""]),this.regional["en-US"]=e.extend(!0,{},this.regional.en),this.dpDiv=a(e("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function a(t){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.delegate(i,"mouseout",function(){e(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",o)}function o(){e.datepicker._isDisabledDatepicker(v.inline?v.dpDiv.parent()[0]:v.input[0])||(e(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),e(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).addClass("ui-datepicker-next-hover"))}function r(t,i){e.extend(t,i);for(var s in i)null==i[s]&&(t[s]=i[s]);return t}function h(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.1",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var l=0,u=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,n=u.call(arguments,1),a=0,o=n.length;o>a;a++)for(i in n[a])s=n[a][i],n[a].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(n){var a="string"==typeof n,o=u.call(arguments,1),r=this;return n=!a&&o.length?e.widget.extend.apply(null,[n].concat(o)):n,a?this.each(function(){var i,a=e.data(this,s);return"instance"===n?(r=a,!1):a?e.isFunction(a[n])&&"_"!==n.charAt(0)?(i=a[n].apply(a,o),i!==a&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+n+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+n+"'")}):this.each(function(){var t=e.data(this,s);t?(t.option(n||{}),t._init&&t._init()):e.data(this,s,new i(n,this))}),r}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(e,t){t=(t||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.unbind(t).undelegate(t)},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var d=!1;e(document).mouseup(function(){d=!1}),e.widget("ui.mouse",{version:"1.11.1",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!d){this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),d=!0,!0)):!0}},_mouseMove:function(t){return e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button?this._mouseUp(t):t.which?this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted):this._mouseUp(t)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),d=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.width<t.element[0].scrollWidth,a="scroll"===s||"auto"===s&&t.height<t.element[0].scrollHeight;return{width:a?e.position.scrollbarWidth():0,height:n?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var i=e(t||window),s=e.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s||n?i.width():i.outerWidth(),height:s||n?i.height():i.outerHeight()}}},e.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=e.extend({},n);var p,m,g,v,y,b,_=e(n.of),x=e.position.getWithinInfo(n.within),w=e.position.getScrollInfo(x),k=(n.collision||"flip").split(" "),T={};return b=s(_),_[0].preventDefault&&(n.at="left top"),m=b.width,g=b.height,v=b.offset,y=e.extend({},v),e.each(["my","at"],function(){var e,t,i=(n[this]||"").split(" ");1===i.length&&(i=l.test(i[0])?i.concat(["center"]):u.test(i[0])?["center"].concat(i):["center","center"]),i[0]=l.test(i[0])?i[0]:"center",i[1]=u.test(i[1])?i[1]:"center",e=d.exec(i[0]),t=d.exec(i[1]),T[this]=[e?e[0]:0,t?t[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===n.at[0]?y.left+=m:"center"===n.at[0]&&(y.left+=m/2),"bottom"===n.at[1]?y.top+=g:"center"===n.at[1]&&(y.top+=g/2),p=t(T.at,m,g),y.left+=p[0],y.top+=p[1],this.each(function(){var s,l,u=e(this),d=u.outerWidth(),c=u.outerHeight(),f=i(this,"marginLeft"),b=i(this,"marginTop"),D=d+f+i(this,"marginRight")+w.width,S=c+b+i(this,"marginBottom")+w.height,N=e.extend({},y),M=t(T.my,u.outerWidth(),u.outerHeight());"right"===n.my[0]?N.left-=d:"center"===n.my[0]&&(N.left-=d/2),"bottom"===n.my[1]?N.top-=c:"center"===n.my[1]&&(N.top-=c/2),N.left+=M[0],N.top+=M[1],a||(N.left=h(N.left),N.top=h(N.top)),s={marginLeft:f,marginTop:b},e.each(["left","top"],function(t,i){e.ui.position[k[t]]&&e.ui.position[k[t]][i](N,{targetWidth:m,targetHeight:g,elemWidth:d,elemHeight:c,collisionPosition:s,collisionWidth:D,collisionHeight:S,offset:[p[0]+M[0],p[1]+M[1]],my:n.my,at:n.at,within:x,elem:u})}),n.using&&(l=function(e){var t=v.left-N.left,i=t+m-d,s=v.top-N.top,a=s+g-c,h={target:{element:_,left:v.left,top:v.top,width:m,height:g},element:{element:u,left:N.left,top:N.top,width:d,height:c},horizontal:0>i?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(N,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,e.top+p+f+m>u&&(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,e.top+p+f+m>d&&(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.draggable",e.ui.mouse,{version:"1.11.1",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"!==this.options.helper||/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._setHandleClassName(),this._mouseInit()},_setOption:function(e,t){this._super(e,t),"handle"===e&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(t){var i=this.document[0],s=this.options;try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()&&e(i.activeElement).blur()}catch(n){}return this.helper||s.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(e(s.iframeFix===!0?"iframe":s.iframeFix).each(function(){e("<div class='ui-draggable-iframeFix' style='background: #fff;'></div>").css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(e(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.offsetParentCssPosition=this.offsetParent.css("position"),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.offset.scroll=!1,e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_mouseDrag:function(t,i){if("fixed"===this.offsetParentCssPosition&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1},_mouseUp:function(t){return e("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),this.element.focus(),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this.handleElement.addClass("ui-draggable-handle")},_removeHandleClassName:function(){this.handleElement.removeClass("ui-draggable-handle")},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return s.parents("body").length||s.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s[0]===this.element[0]||/(fixed|absolute)/.test(s.css("position"))||s.css("position","absolute"),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(e){return/(html|body)/i.test(e.tagName)||e===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var e=this.element.position(),t=this._isRootNode(this.scrollParent[0]);return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+(t?0:this.scrollParent.scrollTop()),left:e.left-(parseInt(this.helper.css("left"),10)||0)+(t?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options,a=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,e(a).width()-this.helperProportions.width-this.margins.left,(e(a).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=e(n.containment),s=i[0],s&&(t="hidden"!==i.css("overflow"),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(t?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0)},_convertPositionTo:function(e,t){t||(t=this.position);var i="absolute"===e?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:t.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:t.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(e,t){var i,s,n,a,o=this.options,r=this._isRootNode(this.scrollParent[0]),h=e.pageX,l=e.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),t&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a),"y"===o.axis&&(h=this.originalPageX),"x"===o.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}
+},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s,this],!0),"drag"===t&&(this.positionAbs=this._convertPositionTo("absolute")),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i,s){var n=s.options,a=e.extend({},i,{item:s.element});s.sortables=[],e(n.connectToSortable).each(function(){var i=e(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push({instance:i,shouldRevert:i.options.revert}),i.refreshPositions(),i._trigger("activate",t,a))})},stop:function(t,i,s){var n=e.extend({},i,{item:s.element});e.each(s.sortables,function(){this.instance.isOver?(this.instance.isOver=0,s.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=this.shouldRevert),this.instance._mouseStop(t),this.instance.options.helper=this.instance.options._helper,"original"===s.options.helper&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",t,n))})},drag:function(t,i,s){var n=this;e.each(s.sortables,function(){var a=!1,o=this;this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this.instance._intersectsWith(this.instance.containerCache)&&(a=!0,e.each(s.sortables,function(){return this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this!==o&&this.instance._intersectsWith(this.instance.containerCache)&&e.contains(o.instance.element[0],this.instance.element[0])&&(a=!1),a})),a?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=e(n).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return i.helper[0]},t.target=this.instance.currentItem[0],this.instance._mouseCapture(t,!0),this.instance._mouseStart(t,!0,!0),this.instance.offset.click.top=s.offset.click.top,this.instance.offset.click.left=s.offset.click.left,this.instance.offset.parent.left-=s.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=s.offset.parent.top-this.instance.offset.parent.top,s._trigger("toSortable",t),s.dropped=this.instance.element,s.currentItem=s.element,this.instance.fromOutside=s),this.instance.currentItem&&this.instance._mouseDrag(t)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",t,this.instance._uiHash(this.instance)),this.instance._mouseStop(t,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),s._trigger("fromSortable",t),s.dropped=!1)})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,i,s){var n=e("body"),a=s.options;n.css("cursor")&&(a._cursor=n.css("cursor")),n.css("cursor",a.cursor)},stop:function(t,i,s){var n=s.options;n._cursor&&e("body").css("cursor",n._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("opacity")&&(a._opacity=n.css("opacity")),n.css("opacity",a.opacity)},stop:function(t,i,s){var n=s.options;n._opacity&&e(i.helper).css("opacity",n._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(e,t,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,i,s){var n=s.options,a=!1,o=s.scrollParentNotHidden[0],r=s.document[0];o!==r&&"HTML"!==o.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+o.offsetHeight-t.pageY<n.scrollSensitivity?o.scrollTop=a=o.scrollTop+n.scrollSpeed:t.pageY-s.overflowOffset.top<n.scrollSensitivity&&(o.scrollTop=a=o.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+o.offsetWidth-t.pageX<n.scrollSensitivity?o.scrollLeft=a=o.scrollLeft+n.scrollSpeed:t.pageX-s.overflowOffset.left<n.scrollSensitivity&&(o.scrollLeft=a=o.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(t.pageY-e(r).scrollTop()<n.scrollSensitivity?a=e(r).scrollTop(e(r).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(r).scrollTop())<n.scrollSensitivity&&(a=e(r).scrollTop(e(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(t.pageX-e(r).scrollLeft()<n.scrollSensitivity?a=e(r).scrollLeft(e(r).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(r).scrollLeft())<n.scrollSensitivity&&(a=e(r).scrollLeft(e(r).scrollLeft()+n.scrollSpeed)))),a!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(s,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,i,s){var n=s.options;s.snapElements=[],e(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var t=e(this),i=t.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:i.top,left:i.left})})},drag:function(t,i,s){var n,a,o,r,h,l,u,d,c,p,f=s.options,m=f.snapTolerance,g=i.offset.left,v=g+s.helperProportions.width,y=i.offset.top,b=y+s.helperProportions.height;for(c=s.snapElements.length-1;c>=0;c--)h=s.snapElements[c].left,l=h+s.snapElements[c].width,u=s.snapElements[c].top,d=u+s.snapElements[c].height,h-m>v||g>l+m||u-m>b||y>d+m||!e.contains(s.snapElements[c].item.ownerDocument,s.snapElements[c].item)?(s.snapElements[c].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=!1):("inner"!==f.snapMode&&(n=m>=Math.abs(u-b),a=m>=Math.abs(d-y),o=m>=Math.abs(h-v),r=m>=Math.abs(l-g),n&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top-s.margins.top),a&&(i.position.top=s._convertPositionTo("relative",{top:d,left:0}).top-s.margins.top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left-s.margins.left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left-s.margins.left)),p=n||a||o||r,"outer"!==f.snapMode&&(n=m>=Math.abs(u-y),a=m>=Math.abs(d-b),o=m>=Math.abs(h-g),r=m>=Math.abs(l-v),n&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top-s.margins.top),a&&(i.position.top=s._convertPositionTo("relative",{top:d-s.helperProportions.height,left:0}).top-s.margins.top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left-s.margins.left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left-s.margins.left)),!s.snapElements[c].snapping&&(n||a||o||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=n||a||o||r||p)}}),e.ui.plugin.add("draggable","stack",{start:function(t,i,s){var n,a=s.options,o=e.makeArray(e(a.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});o.length&&(n=parseInt(e(o[0]).css("zIndex"),10)||0,e(o).each(function(t){e(this).css("zIndex",n+t)}),this.css("zIndex",n+o.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("zIndex")&&(a._zIndex=n.css("zIndex")),n.css("zIndex",a.zIndex)},stop:function(t,i,s){var n=s.options;n._zIndex&&e(i.helper).css("zIndex",n._zIndex)}}),e.ui.draggable,e.widget("ui.droppable",{version:"1.11.1",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=e.isFunction(s)?s:function(e){return e.is(s)},this.proportions=function(){return arguments.length?(t=arguments[0],void 0):t?t:t={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this.element.addClass("ui-droppable")},_addToManager:function(t){e.ui.ddmanager.droppables[t]=e.ui.ddmanager.droppables[t]||[],e.ui.ddmanager.droppables[t].push(this)},_splice:function(e){for(var t=0;e.length>t;t++)e[t]===this&&e.splice(t,1)},_destroy:function(){var t=e.ui.ddmanager.droppables[this.options.scope];this._splice(t),this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,i){if("accept"===t)this.accept=e.isFunction(i)?i:function(e){return e.is(i)};else if("scope"===t){var s=e.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(t,i)},_activate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",t,this.ui(i))},_deactivate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",t,this.ui(i))},_over:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(i)))},_out:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(i)))},_drop:function(t,i){var s=i||e.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=e(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&e.ui.intersect(s,e.extend(i,{offset:i.element.offset()}),i.options.tolerance,t)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(s)),this.element):!1):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(){function e(e,t,i){return e>=t&&t+i>e}return function(t,i,s,n){if(!i.offset)return!1;var a=(t.positionAbs||t.position.absolute).left,o=(t.positionAbs||t.position.absolute).top,r=a+t.helperProportions.width,h=o+t.helperProportions.height,l=i.offset.left,u=i.offset.top,d=l+i.proportions().width,c=u+i.proportions().height;switch(s){case"fit":return a>=l&&d>=r&&o>=u&&c>=h;case"intersect":return a+t.helperProportions.width/2>l&&d>r-t.helperProportions.width/2&&o+t.helperProportions.height/2>u&&c>h-t.helperProportions.height/2;case"pointer":return e(n.pageY,u,i.proportions().height)&&e(n.pageX,l,i.proportions().width);case"touch":return(o>=u&&c>=o||h>=u&&c>=h||u>o&&h>c)&&(a>=l&&d>=a||r>=l&&d>=r||l>a&&r>d);default:return!1}}}(),e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,i){var s,n,a=e.ui.ddmanager.droppables[t.options.scope]||[],o=i?i.type:null,r=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();e:for(s=0;a.length>s;s++)if(!(a[s].options.disabled||t&&!a[s].accept.call(a[s].element[0],t.currentItem||t.element))){for(n=0;r.length>n;n++)if(r[n]===a[s].element[0]){a[s].proportions().height=0;continue e}a[s].visible="none"!==a[s].element.css("display"),a[s].visible&&("mousedown"===o&&a[s]._activate.call(a[s],i),a[s].offset=a[s].element.offset(),a[s].proportions({width:a[s].element[0].offsetWidth,height:a[s].element[0].offsetHeight}))}},drop:function(t,i){var s=!1;return e.each((e.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(t,i){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)})},drag:function(t,i){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,i),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,o=e.ui.intersect(t,this,this.options.tolerance,i),r=!o&&this.isover?"isout":o&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(":data(ui-droppable)").filter(function(){return e(this).droppable("instance").options.scope===n}),a.length&&(s=e(a[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(t,i){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)}},e.ui.droppable,e.widget("ui.resizable",e.ui.mouse,{version:"1.11.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(e){return parseInt(e,10)||0},_isNumber:function(e){return!isNaN(parseInt(e,10))},_hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return t[s]>0?!0:(t[s]=1,n=t[s]>0,t[s]=0,n)},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(e("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("<div class='ui-resizable-handle "+a+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String&&(this.handles[i]=this.element.children(this.handles[i]).first().show()),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),e(this.handles[i]).length},this._renderAxis(this.element),this._handles=e(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var i,s,n,a=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),a.containment&&(i+=e(a.containment).scrollLeft()||0,s+=e(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===n?this.axis+"-resize":n),o.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var i,s,n=this.originalMousePosition,a=this.axis,o=t.pageX-n.left||0,r=t.pageY-n.top||0,h=this._change[a];return this._updatePrevProperties(),h?(i=h.apply(this,[t,o,r]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var e={};return this.position.top!==this.prevPosition.top&&(e.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(e.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(e.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(e.height=this.size.height+"px"),this.helper.css(e),e},_updateVirtualBoundaries:function(e){var t,i,s,n,a,o=this.options;a={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||e)&&(t=a.minHeight*this.aspectRatio,s=a.minWidth/this.aspectRatio,i=a.maxHeight*this.aspectRatio,n=a.maxWidth/this.aspectRatio,t>a.minWidth&&(a.minWidth=t),s>a.minHeight&&(a.minHeight=s),a.maxWidth>i&&(a.maxWidth=i),a.maxHeight>n&&(a.maxHeight=n)),this._vBoundaries=a},_updateCache:function(e){this.offset=this.helper.offset(),this._isNumber(e.left)&&(this.position.left=e.left),this._isNumber(e.top)&&(this.position.top=e.top),this._isNumber(e.height)&&(this.size.height=e.height),this._isNumber(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,i=this.size,s=this.axis;return this._isNumber(e.height)?e.width=e.height*this.aspectRatio:this._isNumber(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===s&&(e.left=t.left+(i.width-e.width),e.top=null),"nw"===s&&(e.top=t.top+(i.height-e.height),e.left=t.left+(i.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,i=this.axis,s=this._isNumber(e.width)&&t.maxWidth&&t.maxWidth<e.width,n=this._isNumber(e.height)&&t.maxHeight&&t.maxHeight<e.height,a=this._isNumber(e.width)&&t.minWidth&&t.minWidth>e.width,o=this._isNumber(e.height)&&t.minHeight&&t.minHeight>e.height,r=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,l=/sw|nw|w/.test(i),u=/nw|ne|n/.test(i);return a&&(e.width=t.minWidth),o&&(e.height=t.minHeight),s&&(e.width=t.maxWidth),n&&(e.height=t.maxHeight),a&&l&&(e.left=r-t.minWidth),s&&l&&(e.left=r-t.maxWidth),o&&u&&(e.top=h-t.minHeight),n&&u&&(e.top=h-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_getPaddingPlusBorderDimensions:function(e){for(var t=0,i=[],s=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],n=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];4>t;t++)i[t]=parseInt(s[t],10)||0,i[t]+=parseInt(n[t],10)||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var e,t=0,i=this.helper||this.element;this._proportionallyResizeElements.length>t;t++)e=this._proportionallyResizeElements[t],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(e)),e.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var t,i,s,n,a,o,r,h=e(this).resizable("instance"),l=h.options,u=h.element,d=l.containment,c=d instanceof e?d.get(0):/parent/.test(d)?u.parent().get(0):d;c&&(h.containerElement=e(c),/document/.test(d)||d===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(t=e(c),i=[],e(["Top","Right","Left","Bottom"]).each(function(e,s){i[e]=h._num(t.css("padding"+s))}),h.containerOffset=t.offset(),h.containerPosition=t.position(),h.containerSize={height:t.innerHeight()-i[3],width:t.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,a=h.containerSize.width,o=h._hasScroll(c,"left")?c.scrollWidth:a,r=h._hasScroll(c)?c.scrollHeight:n,h.parentData={element:c,left:s.left,top:s.top,width:o,height:r}))},resize:function(t){var i,s,n,a,o=e(this).resizable("instance"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,d={top:0,left:0},c=o.containerElement,p=!0;c[0]!==document&&/static/.test(c.css("position"))&&(d=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-d.left),u&&(o.size.height=o.size.width/o.aspectRatio,p=!1),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio,p=!1),o.position.top=o._helper?h.top:0),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css("position")),n&&a?(o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top):(o.offset.left=o.element.offset().left,o.offset.top=o.element.offset().top),i=Math.abs(o.sizeDiff.width+(o._helper?o.offset.left-d.left:o.offset.left-h.left)),s=Math.abs(o.sizeDiff.height+(o._helper?o.offset.top-d.top:o.offset.top-h.top)),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio,p=!1)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio,p=!1)),p||(o.position.left=o.prevPosition.left,o.position.top=o.prevPosition.top,o.size.width=o.prevSize.width,o.size.height=o.prevSize.height)},stop:function(){var t=e(this).resizable("instance"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=function(t){e(t).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})};"object"!=typeof i.alsoResize||i.alsoResize.parentNode?s(i.alsoResize):i.alsoResize.length?(i.alsoResize=i.alsoResize[0],s(i.alsoResize)):e.each(i.alsoResize,function(e){s(e)})},resize:function(t,i){var s=e(this).resizable("instance"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0},h=function(t,s){e(t).each(function(){var t=e(this),n=e(this).data("ui-resizable-alsoresize"),a={},o=s&&s.length?s:t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(o,function(e,t){var i=(n[t]||0)+(r[t]||0);i&&i>=0&&(a[t]=i||null)}),t.css(a)})};"object"!=typeof n.alsoResize||n.alsoResize.nodeType?h(n.alsoResize):e.each(n.alsoResize,function(e,t){h(e,t)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t,i=e(this).resizable("instance"),s=i.options,n=i.size,a=i.originalSize,o=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,u=h[1]||1,d=Math.round((n.width-a.width)/l)*l,c=Math.round((n.height-a.height)/u)*u,p=a.width+d,f=a.height+c,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,v=s.minWidth&&s.minWidth>p,y=s.minHeight&&s.minHeight>f;s.grid=h,v&&(p+=l),y&&(f+=u),m&&(p-=l),g&&(f-=u),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=o.top-c):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=o.left-d):((0>=f-u||0>=p-l)&&(t=i._getPaddingPlusBorderDimensions(this)),f-u>0?(i.size.height=f,i.position.top=o.top-c):(f=u-t.height,i.size.height=f,i.position.top=o.top+a.height-f),p-l>0?(i.size.width=p,i.position.left=o.left-d):(p=u-t.height,i.size.width=p,i.position.left=o.left+a.width-p))}}),e.ui.resizable,e.widget("ui.selectable",e.ui.mouse,{version:"1.11.1",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var t,i=this;
+this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){t=e(i.options.filter,i.element[0]),t.addClass("ui-selectee"),t.each(function(){var t=e(this),i=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:i.left,top:i.top,right:i.left+t.outerWidth(),bottom:i.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=t.addClass("ui-selectee"),this._mouseInit(),this.helper=e("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var i=this,s=this.options;this.opos=[t.pageX,t.pageY],this.options.disabled||(this.selectees=e(s.filter,this.element[0]),this._trigger("start",t),e(s.appendTo).append(this.helper),this.helper.css({left:t.pageX,top:t.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=e.data(this,"selectable-item");s.startselected=!0,t.metaKey||t.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",t,{unselecting:s.element}))}),e(t.target).parents().addBack().each(function(){var s,n=e.data(this,"selectable-item");return n?(s=!t.metaKey&&!t.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",t,{selecting:n.element}):i._trigger("unselecting",t,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(t){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,a=this.opos[0],o=this.opos[1],r=t.pageX,h=t.pageY;return a>r&&(i=r,r=a,a=i),o>h&&(i=h,h=o,o=i),this.helper.css({left:a,top:o,width:r-a,height:h-o}),this.selectees.each(function(){var i=e.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||a>i.right||i.top>h||o>i.bottom):"fit"===n.tolerance&&(l=i.left>a&&r>i.right&&i.top>o&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",t,{selecting:i.element}))):(i.selecting&&((t.metaKey||t.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",t,{unselecting:i.element}))),i.selected&&(t.metaKey||t.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",t,{unselecting:i.element})))))}),!1}},_mouseStop:function(t){var i=this;return this.dragged=!1,e(".ui-unselecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",t,{unselected:s.element})}),e(".ui-selecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",t,{selected:s.element})}),this._trigger("stop",t),this.helper.remove(),!1}}),e.widget("ui.sortable",e.ui.mouse,{version:"1.11.1",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(e,t,i){return e>=t&&t+i>e},_isFloating:function(e){return/left|right/.test(e.css("float"))||/inline|table-cell/.test(e.css("display"))},_create:function(){var e=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?"x"===e.axis||this._isFloating(this.items[0].item):!1,this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(e,t){this._super(e,t),"handle"===e&&this._setHandleClassName()},_setHandleClassName:function(){this.element.find(".ui-sortable-handle").removeClass("ui-sortable-handle"),e.each(this.items,function(){(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item).addClass("ui-sortable-handle")})},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").find(".ui-sortable-handle").removeClass("ui-sortable-handle"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(t,i){var s=null,n=!1,a=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(t),e(t.target).parents().each(function(){return e.data(this,a.widgetName+"-item")===a?(s=e(this),!1):void 0}),e.data(t.target,a.widgetName+"-item")===a&&(s=e(t.target)),s?!this.options.handle||i||(e(this.options.handle,s).find("*").addBack().each(function(){this===t.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(t,i,s){var n,a,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(a=this.document.find("body"),this.storedCursor=a.css("cursor"),a.css("cursor",o.cursor),this.storedStylesheet=e("<style>*{ cursor: "+o.cursor+" !important; }</style>").appendTo(a)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",t,this._uiHash(this));return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){var i,s,n,a,o=this.options,r=!1;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+o.scrollSpeed:t.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+o.scrollSpeed:t.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(t.pageY-e(document).scrollTop()<o.scrollSensitivity?r=e(document).scrollTop(e(document).scrollTop()-o.scrollSpeed):e(window).height()-(t.pageY-e(document).scrollTop())<o.scrollSensitivity&&(r=e(document).scrollTop(e(document).scrollTop()+o.scrollSpeed)),t.pageX-e(document).scrollLeft()<o.scrollSensitivity?r=e(document).scrollLeft(e(document).scrollLeft()-o.scrollSpeed):e(window).width()-(t.pageX-e(document).scrollLeft())<o.scrollSensitivity&&(r=e(document).scrollLeft(e(document).scrollLeft()+o.scrollSpeed))),r!==!1&&e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],a=this._intersectsWithPointer(s),a&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===a?"next":"prev"]()[0]!==n&&!e.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!e.contains(this.element[0],n):!0)){if(this.direction=1===a?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger("change",t,this._uiHash());break}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,i){if(t){if(e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t),this.options.revert){var s=this,n=this.placeholder.offset(),a=this.options.axis,o={};a&&"x"!==a||(o.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollLeft)),a&&"y"!==a||(o.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,e(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){s._clear(t)})}else this._clear(t,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},e(i).each(function(){var i=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[\-=_](.+)/);i&&s.push((t.key||i[1]+"[]")+"="+(t.key&&t.expression?i[1]:i[2]))}),!s.length&&t.key&&s.push(t.key+"="),s.join("&")},toArray:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},i.each(function(){s.push(e(t.item||this).attr(t.attribute||"id")||"")}),s},_intersectsWith:function(e){var t=this.positionAbs.left,i=t+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,a=e.left,o=a+e.width,r=e.top,h=r+e.height,l=this.offset.click.top,u=this.offset.click.left,d="x"===this.options.axis||s+l>r&&h>s+l,c="y"===this.options.axis||t+u>a&&o>t+u,p=d&&c;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>e[this.floating?"width":"height"]?p:t+this.helperProportions.width/2>a&&o>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(e){var t="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top,e.height),i="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left,e.width),s=t&&i,n=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return s?this.floating?a&&"right"===a||"down"===n?2:1:n&&("down"===n?2:1):!1},_intersectsWithSides:function(e){var t=this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+e.height/2,e.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+e.width/2,e.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&t||"up"===s&&!t)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return 0!==e&&(e>0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return 0!==e&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor===String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){function i(){r.push(this)}var s,n,a,o,r=[],h=[],l=this._connectWith();if(l&&t)for(s=l.length-1;s>=0;s--)for(a=e(l[s]),n=a.length-1;n>=0;n--)o=e.data(a[n],this.widgetFullName),o&&o!==this&&!o.options.disabled&&h.push([e.isFunction(o.options.items)?o.options.items.call(o.element):e(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(h.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return e(r)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var i=0;t.length>i;i++)if(t[i]===e.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var i,s,n,a,o,r,h,l,u=this.items,d=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],c=this._connectWith();if(c&&this.ready)for(i=c.length-1;i>=0;i--)for(n=e(c[i]),s=n.length-1;s>=0;s--)a=e.data(n[s],this.widgetFullName),a&&a!==this&&!a.options.disabled&&(d.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a));for(i=d.length-1;i>=0;i--)for(o=d[i][1],r=d[i][0],s=0,l=r.length;l>s;s++)h=e(r[s]),h.data(this.widgetName+"-item",o),u.push({item:h,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(t){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,a;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?e(this.options.toleranceElement,s.item):s.item,t||(s.width=n.outerWidth(),s.height=n.outerHeight()),a=n.offset(),s.left=a.left,s.top=a.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)a=this.containers[i].element.offset(),this.containers[i].containerCache.left=a.left,this.containers[i].containerCache.top=a.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(t){t=t||this;var i,s=t.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=t.currentItem[0].nodeName.toLowerCase(),n=e("<"+s+">",t.document[0]).addClass(i||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tr"===s?t.currentItem.children().each(function(){e("<td>&#160;</td>",t.document[0]).attr("colspan",e(this).attr("colspan")||1).appendTo(n)}):"img"===s&&n.attr("src",t.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(e,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10)))}}),t.placeholder=e(s.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),s.placeholder.update(t,t.placeholder)},_contactContainers:function(t){var i,s,n,a,o,r,h,l,u,d,c=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!e.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(c&&e.contains(this.containers[i].element[0],c.element[0]))continue;c=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0);if(c)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,a=null,u=c.floating||this._isFloating(this.currentItem),o=u?"left":"top",r=u?"width":"height",d=u?"clientX":"clientY",s=this.items.length-1;s>=0;s--)e.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[o],l=!1,t[d]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(t[d]-h)&&(n=Math.abs(t[d]-h),a=this.items[s],this.direction=l?"up":"down"));if(!a&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return;a?this._rearrange(t,a,null,!0):this._rearrange(t,null,this.containers[p].element,!0),this._trigger("change",t,this._uiHash()),this.containers[p]._trigger("change",t,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||e("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,e("document"===n.containment?document:window).width()-this.helperProportions.width-this.margins.left,(e("document"===n.containment?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(t=e(n.containment)[0],i=e(n.containment).offset(),s="hidden"!==e(t).css("overflow"),this.containment=[i.left+(parseInt(e(t).css("borderLeftWidth"),10)||0)+(parseInt(e(t).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(e(t).css("borderTopWidth"),10)||0)+(parseInt(e(t).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(e(t).css("borderLeftWidth"),10)||0)-(parseInt(e(t).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(e(t).css("borderTopWidth"),10)||0)-(parseInt(e(t).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,i){i||(i=this.position);var s="absolute"===t?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,a=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():a?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():a?0:n.scrollLeft())*s}},_generatePosition:function(t){var i,s,n=this.options,a=t.pageX,o=t.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==document&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(a=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(a=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((a-this.originalPageX)/n.grid[0])*n.grid[0],a=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(e,t,i,s){i?i[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(e,t){function i(e,t,i){return function(s){i._trigger(e,s,t._uiHash(t))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!t&&n.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||t||n.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(t||(n.push(function(e){this._trigger("remove",e,this._uiHash())}),n.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)t||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,this.cancelHelperRemoval){if(!t){for(this._trigger("beforeStop",e,this._uiHash()),s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!1}if(t||this._trigger("beforeStop",e,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null,!t){for(s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!0},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var i=t||this;return{helper:i.helper,placeholder:i.placeholder||e([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:t?t.element:null}}}),e.widget("ui.accordion",{version:"1.11.1",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),t.collapsible||t.active!==!1&&null!=t.active||(t.active=0),this._processPanels(),0>t.active&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("<span>").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").removeUniqueId(),this._destroyIcons(),e=this.headers.next().removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").css("display","").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&e.css("height","")},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):("event"===e&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),"collapsible"!==e||t||this.options.active!==!1||this._activate(0),"icons"===e&&(this._destroyIcons(),t&&this._createIcons()),"disabled"===e&&(this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)),void 0)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var i=e.ui.keyCode,s=this.headers.length,n=this.headers.index(t.target),a=!1;switch(t.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(t);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(e(t.target).attr("tabIndex",-1),e(a).attr("tabIndex",0),a.focus(),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels(),t.active===!1&&t.collapsible===!0||!this.headers.length?(t.active=!1,this.active=e()):t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-state-default ui-corner-all"),this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide()},_refresh:function(){var t,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(){var t=e(this),i=t.uniqueId().attr("id"),s=t.next(),n=s.uniqueId().attr("id");
+t.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(t=n.height(),this.element.siblings(":visible").each(function(){var i=e(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(t-=i.outerHeight(!0))}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===s&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var i=this._findActive(t)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):e()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?e():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?e():n,newPanel:r};t.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(t){var i=t.newPanel,s=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,t):(s.hide(),i.show(),this._toggleComplete(t)),s.attr({"aria-hidden":"true"}),s.prev().attr("aria-selected","false"),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true",tabIndex:0,"aria-expanded":"true"})},_animate:function(e,t,i){var s,n,a,o=this,r=0,h=e.length&&(!t.length||e.index()<t.index()),l=this.options.animate||{},u=h&&l.down||l,d=function(){o._toggleComplete(i)};return"number"==typeof u&&(a=u),"string"==typeof u&&(n=u),n=n||u.easing||l.easing,a=a||u.duration||l.duration,t.length?e.length?(s=e.show().outerHeight(),t.animate(this.hideProps,{duration:a,easing:n,step:function(e,t){t.now=Math.round(e)}}),e.hide().animate(this.showProps,{duration:a,easing:n,complete:d,step:function(e,i){i.now=Math.round(e),"height"!==i.prop?r+=i.now:"content"!==o.options.heightStyle&&(i.now=Math.round(s-t.outerHeight()-r),r=0)}}),void 0):t.animate(this.hideProps,a,n,d):e.animate(this.showProps,a,n,d)},_toggleComplete:function(e){var t=e.oldPanel;t.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),t.length&&(t.parent()[0].className=t.parent()[0].className),this._trigger("activate",null,e)}}),e.widget("ui.menu",{version:"1.11.1",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},items:"> *",menus:"ul",position:{my:"left-1 top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item":function(e){e.preventDefault()},"click .ui-menu-item":function(t){var i=e(t.target);!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&e(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){var i=e(t.currentTarget);i.siblings(".ui-state-active").removeClass("ui-state-active"),this.focus(t,i)},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var i=this.active||this.element.find(this.options.items).eq(0);t||this.focus(e,i)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){this._closeOnDocumentClick(e)&&this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-menu-icons ui-front").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").removeUniqueId().removeClass("ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){function i(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}var s,n,a,o,r,h=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:h=!1,n=this.previousFilter||"",a=String.fromCharCode(t.keyCode),o=!1,clearTimeout(this.filterTimer),a===n?o=!0:a=n+a,r=RegExp("^"+i(a),"i"),s=this.activeMenu.find(this.options.items).filter(function(){return r.test(e(this).text())}),s=o&&-1!==s.index(this.active.next())?this.active.nextAll(".ui-menu-item"):s,s.length||(a=String.fromCharCode(t.keyCode),r=RegExp("^"+i(a),"i"),s=this.activeMenu.find(this.options.items).filter(function(){return r.test(e(this).text())})),s.length?(this.focus(t,s),s.length>1?(this.previousFilter=a,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter):delete this.previousFilter}h&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.is("[aria-haspopup='true']")?this.expand(e):this.select(e))},refresh:function(){var t,i,s=this,n=this.options.icons.submenu,a=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),a.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-front").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),i=t.parent(),s=e("<span>").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);i.attr("aria-haspopup","true").prepend(s),t.attr("aria-labelledby",i.attr("id"))}),t=a.add(this.element),i=t.find(this.options.items),i.not(".ui-menu-item").each(function(){var t=e(this);s._isDivider(t)&&t.addClass("ui-widget-content ui-menu-divider")}),i.not(".ui-menu-item, .ui-menu-divider").addClass("ui-menu-item").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){"icons"===e&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(t.submenu),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},focus:function(e,t){var i,s;this.blur(e,e&&"focus"===e.type),this._scrollIntoView(t),this.active=t.first(),s=this.active.addClass("ui-state-focus").removeClass("ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").addClass("ui-state-active"),e&&"keydown"===e.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=t.children(".ui-menu"),i.length&&e&&/^mouse/.test(e.type)&&this._startOpening(i),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,n=t.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=t.outerHeight(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(e,t){t||clearTimeout(this.timer),this.active&&(this.active.removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active}))},_startOpening:function(e){clearTimeout(this.timer),"true"===e.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(e)},this.delay))},_open:function(t){var i=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(t,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(t),this.activeMenu=s},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find(".ui-state-active").not(".ui-state-focus").removeClass("ui-state-active")},_closeOnDocumentClick:function(t){return!e(t.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,i){var s;this.active&&(s="first"===e||"last"===e?this.active["first"===e?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[e+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[t]()),this.focus(i,s)},nextPage:function(t){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=e(this),0>i.offset().top-s-n}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(t),void 0)},previousPage:function(t){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=e(this),i.offset().top-s+n>0}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items).first())),void 0):(this.next(t),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||e(t.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,i)}}),e.widget("ui.autocomplete",{version:"1.11.1",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,void 0;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),void 0):(this._searchTimeout(e),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(e),this._change(e),void 0)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(s){s.target===t.element[0]||s.target===i||e.contains(i,s.target)||t.close()})})},menufocus:function(t,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:n})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&e.trim(s).length&&(this.liveRegion.children().hide(),e("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,t){var i=t.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",e,{item:i})&&this._value(i.value),this.term=this._value(),this.close(e),this.selectedItem=i}}),this.liveRegion=e("<span>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),"source"===e&&this._initSource(),"appendTo"===e&&this.menu.element.appendTo(this._appendTo()),"disabled"===e&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_initSource:function(){var t,i,s=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(i,s){s(e.ui.autocomplete.filter(t,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(t,n){s.xhr&&s.xhr.abort(),s.xhr=e.ajax({url:i,data:t,dataType:"json",success:function(e){n(e)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),i=this.menu.element.is(":visible"),s=e.altKey||e.ctrlKey||e.metaKey||e.shiftKey;(!t||t&&!i&&!s)&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){return e=null!=e?e:this._value(),this.term=this._value(),e.length<this.options.minLength?this.close(t):this._trigger("search",t)!==!1?this._search(e):void 0},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var t=++this.requestIndex;return e.proxy(function(e){t===this.requestIndex&&this.__response(e),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},this)},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return"string"==typeof t?{label:t,value:t}:e.extend({},t,{label:t.label||t.value,value:t.value||t.label})})},_suggest:function(t){var i=this.menu.element.empty();this._renderMenu(i,t),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,i){var s=this;e.each(i,function(e,i){s._renderItemData(t,i)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,i){return e("<li>").text(i.label).appendTo(t)},_move:function(e,t){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[e](t),void 0):(this.search(null,t),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(e,t),t.preventDefault())}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,i){var s=RegExp(e.ui.autocomplete.escapeRegex(i),"i");return e.grep(t,function(e){return s.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.children().hide(),e("<div>").text(i).appendTo(this.liveRegion))}}),e.ui.autocomplete;var c,p="ui-button ui-widget ui-state-default ui-corner-all",f="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",m=function(){var t=e(this);setTimeout(function(){t.find(":ui-button").button("refresh")},1)},g=function(t){var i=t.name,s=t.form,n=e([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?e(s).find("[name='"+i+"'][type=radio]"):e("[name='"+i+"'][type=radio]",t.ownerDocument).filter(function(){return!this.form})),n};e.widget("ui.button",{version:"1.11.1",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,m),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var t=this,i=this.options,s="checkbox"===this.type||"radio"===this.type,n=s?"":"ui-state-active";null===i.label&&(i.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(p).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){i.disabled||this===c&&e(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){i.disabled||e(this).removeClass(n)}).bind("click"+this.eventNamespace,function(e){i.disabled&&(e.preventDefault(),e.stopImmediatePropagation())}),this._on({focus:function(){this.buttonElement.addClass("ui-state-focus")},blur:function(){this.buttonElement.removeClass("ui-state-focus")}}),s&&this.element.bind("change"+this.eventNamespace,function(){t.refresh()}),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return i.disabled?!1:void 0}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(i.disabled)return!1;e(this).addClass("ui-state-active"),t.buttonElement.attr("aria-pressed","true");var s=t.element[0];g(s).not(s).map(function(){return e(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return i.disabled?!1:(e(this).addClass("ui-state-active"),c=this,t.document.one("mouseup",function(){c=null}),void 0)}).bind("mouseup"+this.eventNamespace,function(){return i.disabled?!1:(e(this).removeClass("ui-state-active"),void 0)}).bind("keydown"+this.eventNamespace,function(t){return i.disabled?!1:((t.keyCode===e.ui.keyCode.SPACE||t.keyCode===e.ui.keyCode.ENTER)&&e(this).addClass("ui-state-active"),void 0)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){e(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(t){t.keyCode===e.ui.keyCode.SPACE&&e(this).click()})),this._setOption("disabled",i.disabled),this._resetButton()},_determineButtonType:function(){var e,t,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(e=this.element.parents().last(),t="label[for='"+this.element.attr("id")+"']",this.buttonElement=e.find(t),this.buttonElement.length||(e=e.length?e.siblings():this.element.siblings(),this.buttonElement=e.filter(t),this.buttonElement.length||(this.buttonElement=e.find(t))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(p+" ui-state-active "+f).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(e,t){return this._super(e,t),"disabled"===e?(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),t&&("checkbox"===this.type||"radio"===this.type?this.buttonElement.removeClass("ui-state-focus"):this.buttonElement.removeClass("ui-state-focus ui-state-active")),void 0):(this._resetButton(),void 0)},refresh:function(){var t=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOption("disabled",t),"radio"===this.type?g(this.element[0]).each(function(){e(this).is(":checked")?e(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):e(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),void 0;var t=this.buttonElement.removeClass(f),i=e("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(t.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,a=[];s.primary||s.secondary?(this.options.text&&a.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&t.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&t.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(a.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||t.attr("title",e.trim(i)))):a.push("ui-button-text-only"),t.addClass(a.join(" "))}}),e.widget("ui.buttonset",{version:"1.11.1",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(e,t){"disabled"===e&&this.buttons.button("option",e,t),this._super(e,t)},refresh:function(){var t="rtl"===this.element.css("direction"),i=this.element.find(this.options.items),s=i.filter(":ui-button");i.not(":ui-button").button(),s.button("refresh"),this.buttons=i.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(t?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(t?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}}),e.ui.button,e.extend(e.ui,{datepicker:{version:"1.11.1"}});var v;e.extend(n.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return r(this._defaults,e||{}),this},_attachDatepicker:function(t,i){var s,n,a;s=t.nodeName.toLowerCase(),n="div"===s||"span"===s,t.id||(this.uuid+=1,t.id="dp"+this.uuid),a=this._newInst(e(t),n),a.settings=e.extend({},i||{}),"input"===s?this._connectDatepicker(t,a):n&&this._inlineDatepicker(t,a)},_newInst:function(t,i){var s=t[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?a(e("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,i){var s=e(t);i.append=e([]),i.trigger=e([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),e.data(t,"datepicker",i),i.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,i){var s,n,a,o=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),o&&(i.append=e("<span class='"+this._appendClass+"'>"+o+"</span>"),t[r?"before":"after"](i.append)),t.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&t.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),a=this._get(i,"buttonImage"),i.trigger=e(this._get(i,"buttonImageOnly")?e("<img/>").addClass(this._triggerClass).attr({src:a,alt:n,title:n}):e("<button type='button'></button>").addClass(this._triggerClass).html(a?e("<img/>").attr({src:a,alt:n,title:n}):n)),t[r?"before":"after"](i.trigger),i.trigger.click(function(){return e.datepicker._datepickerShowing&&e.datepicker._lastInput===t[0]?e.datepicker._hideDatepicker():e.datepicker._datepickerShowing&&e.datepicker._lastInput!==t[0]?(e.datepicker._hideDatepicker(),e.datepicker._showDatepicker(t[0])):e.datepicker._showDatepicker(t[0]),!1}))},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t,i,s,n,a=new Date(2009,11,20),o=this._get(e,"dateFormat");o.match(/[DM]/)&&(t=function(e){for(i=0,s=0,n=0;e.length>n;n++)e[n].length>i&&(i=e[n].length,s=n);return s},a.setMonth(t(this._get(e,o.match(/MM/)?"monthNames":"monthNamesShort"))),a.setDate(t(this._get(e,o.match(/DD/)?"dayNames":"dayNamesShort"))+20-a.getDay())),e.input.attr("size",this._formatDate(e,a).length)}},_inlineDatepicker:function(t,i){var s=e(t);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),e.data(t,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(t),i.dpDiv.css("display","block"))},_dialogDatepicker:function(t,i,s,n,a){var o,h,l,u,d,c=this._dialogInst;return c||(this.uuid+=1,o="dp"+this.uuid,this._dialogInput=e("<input type='text' id='"+o+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),e("body").append(this._dialogInput),c=this._dialogInst=this._newInst(this._dialogInput,!1),c.settings={},e.data(this._dialogInput[0],"datepicker",c)),r(c.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(c,i):i,this._dialogInput.val(i),this._pos=a?a.length?a:[a.pageX,a.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+u,l/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),c.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),e.blockUI&&e.blockUI(this.dpDiv),e.data(this._dialogInput[0],"datepicker",c),this},_destroyDatepicker:function(t){var i,s=e(t),n=e.data(t,"datepicker");s.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),e.removeData(t,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty())
+},_enableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!1,a.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}))},_disableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!0,a.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}),this._disabledInputs[this._disabledInputs.length]=t)},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;this._disabledInputs.length>t;t++)if(this._disabledInputs[t]===e)return!0;return!1},_getInst:function(t){try{return e.data(t,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,i,s){var n,a,o,h,l=this._getInst(t);return 2===arguments.length&&"string"==typeof i?"defaults"===i?e.extend({},e.datepicker._defaults):l?"all"===i?e.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),a=this._getDateDatepicker(t,!0),o=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),r(l.settings,n),null!==o&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,o)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(e(t),l),this._autoSize(l),this._setDate(l,a),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(e,t,i){this._optionDatepicker(e,t,i)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var i=this._getInst(e);i&&(this._setDate(i,t),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(e,t){var i=this._getInst(e);return i&&!i.inline&&this._setDateFromField(i,t),i?this._getDate(i):null},_doKeyDown:function(t){var i,s,n,a=e.datepicker._getInst(t.target),o=!0,r=a.dpDiv.is(".ui-datepicker-rtl");if(a._keyEvent=!0,e.datepicker._datepickerShowing)switch(t.keyCode){case 9:e.datepicker._hideDatepicker(),o=!1;break;case 13:return n=e("td."+e.datepicker._dayOverClass+":not(."+e.datepicker._currentClass+")",a.dpDiv),n[0]&&e.datepicker._selectDay(t.target,a.selectedMonth,a.selectedYear,n[0]),i=e.datepicker._get(a,"onSelect"),i?(s=e.datepicker._formatDate(a),i.apply(a.input?a.input[0]:null,[s,a])):e.datepicker._hideDatepicker(),!1;case 27:e.datepicker._hideDatepicker();break;case 33:e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 34:e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&e.datepicker._clearDate(t.target),o=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&e.datepicker._gotoToday(t.target),o=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?1:-1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,-7,"D"),o=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?-1:1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,7,"D"),o=t.ctrlKey||t.metaKey;break;default:o=!1}else 36===t.keyCode&&t.ctrlKey?e.datepicker._showDatepicker(this):o=!1;o&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var i,s,n=e.datepicker._getInst(t.target);return e.datepicker._get(n,"constrainInput")?(i=e.datepicker._possibleChars(e.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(t){var i,s=e.datepicker._getInst(t.target);if(s.input.val()!==s.lastVal)try{i=e.datepicker.parseDate(e.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,e.datepicker._getFormatConfig(s)),i&&(e.datepicker._setDateFromField(s),e.datepicker._updateAlternate(s),e.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(t){if(t=t.target||t,"input"!==t.nodeName.toLowerCase()&&(t=e("input",t.parentNode)[0]),!e.datepicker._isDisabledDatepicker(t)&&e.datepicker._lastInput!==t){var i,n,a,o,h,l,u;i=e.datepicker._getInst(t),e.datepicker._curInst&&e.datepicker._curInst!==i&&(e.datepicker._curInst.dpDiv.stop(!0,!0),i&&e.datepicker._datepickerShowing&&e.datepicker._hideDatepicker(e.datepicker._curInst.input[0])),n=e.datepicker._get(i,"beforeShow"),a=n?n.apply(t,[t,i]):{},a!==!1&&(r(i.settings,a),i.lastVal=null,e.datepicker._lastInput=t,e.datepicker._setDateFromField(i),e.datepicker._inDialog&&(t.value=""),e.datepicker._pos||(e.datepicker._pos=e.datepicker._findPos(t),e.datepicker._pos[1]+=t.offsetHeight),o=!1,e(t).parents().each(function(){return o|="fixed"===e(this).css("position"),!o}),h={left:e.datepicker._pos[0],top:e.datepicker._pos[1]},e.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),e.datepicker._updateDatepicker(i),h=e.datepicker._checkOffset(i,h,o),i.dpDiv.css({position:e.datepicker._inDialog&&e.blockUI?"static":o?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),i.inline||(l=e.datepicker._get(i,"showAnim"),u=e.datepicker._get(i,"duration"),i.dpDiv.css("z-index",s(e(t))+1),e.datepicker._datepickerShowing=!0,e.effects&&e.effects.effect[l]?i.dpDiv.show(l,e.datepicker._get(i,"showOptions"),u):i.dpDiv[l||"show"](l?u:null),e.datepicker._shouldFocusInput(i)&&i.input.focus(),e.datepicker._curInst=i))}},_updateDatepicker:function(t){this.maxRows=4,v=t,t.dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t);var i,s=this._getNumberOfMonths(t),n=s[1],a=17,r=t.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&t.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),t.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===e.datepicker._curInst&&e.datepicker._datepickerShowing&&e.datepicker._shouldFocusInput(t)&&t.input.focus(),t.yearshtml&&(i=t.yearshtml,setTimeout(function(){i===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year:first").replaceWith(t.yearshtml),i=t.yearshtml=null},0))},_shouldFocusInput:function(e){return e.input&&e.input.is(":visible")&&!e.input.is(":disabled")&&!e.input.is(":focus")},_checkOffset:function(t,i,s){var n=t.dpDiv.outerWidth(),a=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,r=t.input?t.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:e(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:e(document).scrollTop());return i.left-=this._get(t,"isRTL")?n-o:0,i.left-=s&&i.left===t.input.offset().left?e(document).scrollLeft():0,i.top-=s&&i.top===t.input.offset().top+r?e(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+a>l&&l>a?Math.abs(a+r):0),i},_findPos:function(t){for(var i,s=this._getInst(t),n=this._get(s,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||e.expr.filters.hidden(t));)t=t[n?"previousSibling":"nextSibling"];return i=e(t).offset(),[i.left,i.top]},_hideDatepicker:function(t){var i,s,n,a,o=this._curInst;!o||t&&o!==e.data(t,"datepicker")||this._datepickerShowing&&(i=this._get(o,"showAnim"),s=this._get(o,"duration"),n=function(){e.datepicker._tidyDialog(o)},e.effects&&(e.effects.effect[i]||e.effects[i])?o.dpDiv.hide(i,e.datepicker._get(o,"showOptions"),s,n):o.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,a=this._get(o,"onClose"),a&&a.apply(o.input?o.input[0]:null,[o.input?o.input.val():"",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),e.blockUI&&(e.unblockUI(),e("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(t){if(e.datepicker._curInst){var i=e(t.target),s=e.datepicker._getInst(i[0]);(i[0].id!==e.datepicker._mainDivId&&0===i.parents("#"+e.datepicker._mainDivId).length&&!i.hasClass(e.datepicker.markerClassName)&&!i.closest("."+e.datepicker._triggerClass).length&&e.datepicker._datepickerShowing&&(!e.datepicker._inDialog||!e.blockUI)||i.hasClass(e.datepicker.markerClassName)&&e.datepicker._curInst!==s)&&e.datepicker._hideDatepicker()}},_adjustDate:function(t,i,s){var n=e(t),a=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(a,i+("M"===s?this._get(a,"showCurrentAtPos"):0),s),this._updateDatepicker(a))},_gotoToday:function(t){var i,s=e(t),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(t,i,s){var n=e(t),a=this._getInst(n[0]);a["selected"+("M"===s?"Month":"Year")]=a["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(a),this._adjustDate(n)},_selectDay:function(t,i,s,n){var a,o=e(t);e(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0])||(a=this._getInst(o[0]),a.selectedDay=a.currentDay=e("a",n).html(),a.selectedMonth=a.currentMonth=i,a.selectedYear=a.currentYear=s,this._selectDate(t,this._formatDate(a,a.currentDay,a.currentMonth,a.currentYear)))},_clearDate:function(t){var i=e(t);this._selectDate(i,"")},_selectDate:function(t,i){var s,n=e(t),a=this._getInst(n[0]);i=null!=i?i:this._formatDate(a),a.input&&a.input.val(i),this._updateAlternate(a),s=this._get(a,"onSelect"),s?s.apply(a.input?a.input[0]:null,[i,a]):a.input&&a.input.trigger("change"),a.inline?this._updateDatepicker(a):(this._hideDatepicker(),this._lastInput=a.input[0],"object"!=typeof a.input[0]&&a.input.focus(),this._lastInput=null)},_updateAlternate:function(t){var i,s,n,a=this._get(t,"altField");a&&(i=this._get(t,"altFormat")||this._get(t,"dateFormat"),s=this._getDate(t),n=this.formatDate(i,s,this._getFormatConfig(t)),e(a).each(function(){e(this).val(n)}))},noWeekends:function(e){var t=e.getDay();return[t>0&&6>t,""]},iso8601Week:function(e){var t,i=new Date(e.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),t=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((t-i)/864e5)/7)+1},parseDate:function(t,i,s){if(null==t||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,a,o,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),d=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,c=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,m=-1,g=-1,v=-1,y=-1,b=!1,_=function(e){var i=t.length>n+1&&t.charAt(n+1)===e;return i&&n++,i},x=function(e){var t=_(e),s="@"===e?14:"!"===e?20:"y"===e&&t?4:"o"===e?3:2,n="y"===e?s:1,a=RegExp("^\\d{"+n+","+s+"}"),o=i.substring(h).match(a);if(!o)throw"Missing number at position "+h;return h+=o[0].length,parseInt(o[0],10)},w=function(t,s,n){var a=-1,o=e.map(_(t)?n:s,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)});if(e.each(o,function(e,t){var s=t[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(a=t[0],h+=s.length,!1):void 0}),-1!==a)return a+1;throw"Unknown name at position "+h},k=function(){if(i.charAt(h)!==t.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;t.length>n;n++)if(b)"'"!==t.charAt(n)||_("'")?k():b=!1;else switch(t.charAt(n)){case"d":v=x("d");break;case"D":w("D",d,c);break;case"o":y=x("o");break;case"m":g=x("m");break;case"M":g=w("M",p,f);break;case"y":m=x("y");break;case"@":r=new Date(x("@")),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"!":r=new Date((x("!")-this._ticksTo1970)/1e4),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"'":_("'")?k():b=!0;break;default:k()}if(i.length>h&&(o=i.substr(h),!/^\s+/.test(o)))throw"Extra/unparsed characters found in date: "+o;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),y>-1)for(g=1,v=y;;){if(a=this._getDaysInMonth(m,g-1),a>=v)break;g++,v-=a}if(r=this._daylightSavingAdjust(new Date(m,g-1,v)),r.getFullYear()!==m||r.getMonth()+1!==g||r.getDate()!==v)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(e,t,i){if(!t)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,a=(i?i.dayNames:null)||this._defaults.dayNames,o=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(t){var i=e.length>s+1&&e.charAt(s+1)===t;return i&&s++,i},l=function(e,t,i){var s=""+t;if(h(e))for(;i>s.length;)s="0"+s;return s},u=function(e,t,i,s){return h(e)?s[t]:i[t]},d="",c=!1;if(t)for(s=0;e.length>s;s++)if(c)"'"!==e.charAt(s)||h("'")?d+=e.charAt(s):c=!1;else switch(e.charAt(s)){case"d":d+=l("d",t.getDate(),2);break;case"D":d+=u("D",t.getDay(),n,a);break;case"o":d+=l("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":d+=l("m",t.getMonth()+1,2);break;case"M":d+=u("M",t.getMonth(),o,r);break;case"y":d+=h("y")?t.getFullYear():(10>t.getYear()%100?"0":"")+t.getYear()%100;break;case"@":d+=t.getTime();break;case"!":d+=1e4*t.getTime()+this._ticksTo1970;break;case"'":h("'")?d+="'":c=!0;break;default:d+=e.charAt(s)}return d},_possibleChars:function(e){var t,i="",s=!1,n=function(i){var s=e.length>t+1&&e.charAt(t+1)===i;return s&&t++,s};for(t=0;e.length>t;t++)if(s)"'"!==e.charAt(t)||n("'")?i+=e.charAt(t):s=!1;else switch(e.charAt(t)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=e.charAt(t)}return i},_get:function(e,t){return void 0!==e.settings[t]?e.settings[t]:this._defaults[t]},_setDateFromField:function(e,t){if(e.input.val()!==e.lastVal){var i=this._get(e,"dateFormat"),s=e.lastVal=e.input?e.input.val():null,n=this._getDefaultDate(e),a=n,o=this._getFormatConfig(e);try{a=this.parseDate(i,s,o)||n}catch(r){s=t?"":s}e.selectedDay=a.getDate(),e.drawMonth=e.selectedMonth=a.getMonth(),e.drawYear=e.selectedYear=a.getFullYear(),e.currentDay=s?a.getDate():0,e.currentMonth=s?a.getMonth():0,e.currentYear=s?a.getFullYear():0,this._adjustInstDate(e)}},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,"defaultDate"),new Date))},_determineDate:function(t,i,s){var n=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},a=function(i){try{return e.datepicker.parseDate(e.datepicker._get(t,"dateFormat"),i,e.datepicker._getFormatConfig(t))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?e.datepicker._getDate(t):null)||new Date,a=n.getFullYear(),o=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":o+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o));break;case"y":case"Y":a+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o))}l=h.exec(i)}return new Date(a,o,r)},o=null==i||""===i?s:"string"==typeof i?a(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return o=o&&"Invalid Date"==""+o?s:o,o&&(o.setHours(0),o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)),this._daylightSavingAdjust(o)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,i){var s=!t,n=e.selectedMonth,a=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),n===e.selectedMonth&&a===e.selectedYear||i||this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(s?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&""===e.input.val()?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(t){var i=this._get(t,"stepMonths"),s="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){e.datepicker._adjustDate(s,-i,"M")},next:function(){e.datepicker._adjustDate(s,+i,"M")},hide:function(){e.datepicker._hideDatepicker()},today:function(){e.datepicker._gotoToday(s)},selectDay:function(){return e.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return e.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return e.datepicker._selectMonthYear(s,this,"Y"),!1}};e(this).bind(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t,i,s,n,a,o,r,h,l,u,d,c,p,f,m,g,v,y,b,_,x,w,k,T,D,S,N,M,C,A,P,I,H,z,F,E,W,L,O,j=new Date,R=this._daylightSavingAdjust(new Date(j.getFullYear(),j.getMonth(),j.getDate())),Y=this._get(e,"isRTL"),J=this._get(e,"showButtonPanel"),B=this._get(e,"hideIfNoPrevNext"),K=this._get(e,"navigationAsDateFormat"),V=this._getNumberOfMonths(e),U=this._get(e,"showCurrentAtPos"),q=this._get(e,"stepMonths"),G=1!==V[0]||1!==V[1],X=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),Q=this._getMinMaxDate(e,"min"),$=this._getMinMaxDate(e,"max"),Z=e.drawMonth-U,et=e.drawYear;if(0>Z&&(Z+=12,et--),$)for(t=this._daylightSavingAdjust(new Date($.getFullYear(),$.getMonth()-V[0]*V[1]+1,$.getDate())),t=Q&&Q>t?Q:t;this._daylightSavingAdjust(new Date(et,Z,1))>t;)Z--,0>Z&&(Z=11,et--);for(e.drawMonth=Z,e.drawYear=et,i=this._get(e,"prevText"),i=K?this.formatDate(i,this._daylightSavingAdjust(new Date(et,Z-q,1)),this._getFormatConfig(e)):i,s=this._canAdjustMonth(e,-1,et,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":B?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(e,"nextText"),n=K?this.formatDate(n,this._daylightSavingAdjust(new Date(et,Z+q,1)),this._getFormatConfig(e)):n,a=this._canAdjustMonth(e,1,et,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":B?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",o=this._get(e,"currentText"),r=this._get(e,"gotoCurrent")&&e.currentDay?X:R,o=K?this.formatDate(o,r,this._getFormatConfig(e)):o,h=e.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(e,"closeText")+"</button>",l=J?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(e,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+o+"</button>":"")+(Y?"":h)+"</div>":"",u=parseInt(this._get(e,"firstDay"),10),u=isNaN(u)?0:u,d=this._get(e,"showWeek"),c=this._get(e,"dayNames"),p=this._get(e,"dayNamesMin"),f=this._get(e,"monthNames"),m=this._get(e,"monthNamesShort"),g=this._get(e,"beforeShowDay"),v=this._get(e,"showOtherMonths"),y=this._get(e,"selectOtherMonths"),b=this._getDefaultDate(e),_="",w=0;V[0]>w;w++){for(k="",this.maxRows=4,T=0;V[1]>T;T++){if(D=this._daylightSavingAdjust(new Date(et,Z,e.selectedDay)),S=" ui-corner-all",N="",G){if(N+="<div class='ui-datepicker-group",V[1]>1)switch(T){case 0:N+=" ui-datepicker-group-first",S=" ui-corner-"+(Y?"right":"left");break;case V[1]-1:N+=" ui-datepicker-group-last",S=" ui-corner-"+(Y?"left":"right");break;default:N+=" ui-datepicker-group-middle",S=""}N+="'>"}for(N+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+S+"'>"+(/all|left/.test(S)&&0===w?Y?a:s:"")+(/all|right/.test(S)&&0===w?Y?s:a:"")+this._generateMonthYearHeader(e,Z,et,Q,$,w>0||T>0,f,m)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",M=d?"<th class='ui-datepicker-week-col'>"+this._get(e,"weekHeader")+"</th>":"",x=0;7>x;x++)C=(x+u)%7,M+="<th scope='col'"+((x+u+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+c[C]+"'>"+p[C]+"</span></th>";for(N+=M+"</tr></thead><tbody>",A=this._getDaysInMonth(et,Z),et===e.selectedYear&&Z===e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,A)),P=(this._getFirstDayOfMonth(et,Z)-u+7)%7,I=Math.ceil((P+A)/7),H=G?this.maxRows>I?this.maxRows:I:I,this.maxRows=H,z=this._daylightSavingAdjust(new Date(et,Z,1-P)),F=0;H>F;F++){for(N+="<tr>",E=d?"<td class='ui-datepicker-week-col'>"+this._get(e,"calculateWeek")(z)+"</td>":"",x=0;7>x;x++)W=g?g.apply(e.input?e.input[0]:null,[z]):[!0,""],L=z.getMonth()!==Z,O=L&&!y||!W[0]||Q&&Q>z||$&&z>$,E+="<td class='"+((x+u+6)%7>=5?" ui-datepicker-week-end":"")+(L?" ui-datepicker-other-month":"")+(z.getTime()===D.getTime()&&Z===e.selectedMonth&&e._keyEvent||b.getTime()===z.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(O?" "+this._unselectableClass+" ui-state-disabled":"")+(L&&!v?"":" "+W[1]+(z.getTime()===X.getTime()?" "+this._currentClass:"")+(z.getTime()===R.getTime()?" ui-datepicker-today":""))+"'"+(L&&!v||!W[2]?"":" title='"+W[2].replace(/'/g,"&#39;")+"'")+(O?"":" data-handler='selectDay' data-event='click' data-month='"+z.getMonth()+"' data-year='"+z.getFullYear()+"'")+">"+(L&&!v?"&#xa0;":O?"<span class='ui-state-default'>"+z.getDate()+"</span>":"<a class='ui-state-default"+(z.getTime()===R.getTime()?" ui-state-highlight":"")+(z.getTime()===X.getTime()?" ui-state-active":"")+(L?" ui-priority-secondary":"")+"' href='#'>"+z.getDate()+"</a>")+"</td>",z.setDate(z.getDate()+1),z=this._daylightSavingAdjust(z);N+=E+"</tr>"}Z++,Z>11&&(Z=0,et++),N+="</tbody></table>"+(G?"</div>"+(V[0]>0&&T===V[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),k+=N}_+=k}return _+=l,e._keyEvent=!1,_},_generateMonthYearHeader:function(e,t,i,s,n,a,o,r){var h,l,u,d,c,p,f,m,g=this._get(e,"changeMonth"),v=this._get(e,"changeYear"),y=this._get(e,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",_="";if(a||!g)_+="<span class='ui-datepicker-month'>"+o[t]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,_+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",u=0;12>u;u++)(!h||u>=s.getMonth())&&(!l||n.getMonth()>=u)&&(_+="<option value='"+u+"'"+(u===t?" selected='selected'":"")+">"+r[u]+"</option>");_+="</select>"}if(y||(b+=_+(!a&&g&&v?"":"&#xa0;")),!e.yearshtml)if(e.yearshtml="",a||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(d=this._get(e,"yearRange").split(":"),c=(new Date).getFullYear(),p=function(e){var t=e.match(/c[+\-].*/)?i+parseInt(e.substring(1),10):e.match(/[+\-].*/)?c+parseInt(e,10):parseInt(e,10);return isNaN(t)?c:t},f=p(d[0]),m=Math.max(f,p(d[1]||"")),f=s?Math.max(f,s.getFullYear()):f,m=n?Math.min(m,n.getFullYear()):m,e.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";m>=f;f++)e.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";e.yearshtml+="</select>",b+=e.yearshtml,e.yearshtml=null}return b+=this._get(e,"yearSuffix"),y&&(b+=(!a&&g&&v?"":"&#xa0;")+_),b+="</div>"},_adjustInstDate:function(e,t,i){var s=e.drawYear+("Y"===i?t:0),n=e.drawMonth+("M"===i?t:0),a=Math.min(e.selectedDay,this._getDaysInMonth(s,n))+("D"===i?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(s,n,a)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(e)},_restrictMinMax:function(e,t){var i=this._getMinMaxDate(e,"min"),s=this._getMinMaxDate(e,"max"),n=i&&i>t?i:t;return s&&n>s?s:n},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return null==t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return new Date(e,t,1).getDay()},_canAdjustMonth:function(e,t,i,s){var n=this._getNumberOfMonths(e),a=this._daylightSavingAdjust(new Date(i,s+(0>t?t:n[0]*n[1]),1));return 0>t&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(e,a)},_isInRange:function(e,t){var i,s,n=this._getMinMaxDate(e,"min"),a=this._getMinMaxDate(e,"max"),o=null,r=null,h=this._get(e,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),o=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(o+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||t.getTime()>=n.getTime())&&(!a||t.getTime()<=a.getTime())&&(!o||t.getFullYear()>=o)&&(!r||r>=t.getFullYear())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t="string"!=typeof t?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,i,s){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var n=t?"object"==typeof t?t:this._daylightSavingAdjust(new Date(s,i,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),n,this._getFormatConfig(e))}}),e.fn.datepicker=function(t){if(!this.length)return this;e.datepicker.initialized||(e(document).mousedown(e.datepicker._checkExternalClick),e.datepicker.initialized=!0),0===e("#"+e.datepicker._mainDivId).length&&e("body").append(e.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof t||"isDisabled"!==t&&"getDate"!==t&&"widget"!==t?"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof t?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this].concat(i)):e.datepicker._attachDatepicker(this,t)}):e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i))},e.datepicker=new n,e.datepicker.initialized=!1,e.datepicker.uuid=(new Date).getTime(),e.datepicker.version="1.11.1",e.datepicker,e.widget("ui.dialog",{version:"1.11.1",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"Close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var i=e(this).css(t).offset().top;0>i&&e(this).css("top",t.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&e.fn.draggable&&this._makeDraggable(),this.options.resizable&&e.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?e(t):this.document.find(t||"body").eq(0)},_destroy:function(){var e,t=this.originalPosition;this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},disable:e.noop,enable:e.noop,close:function(t){var i,s=this;if(this._isOpen&&this._trigger("beforeClose",t)!==!1){if(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),!this.opener.filter(":focusable").focus().length)try{i=this.document[0].activeElement,i&&"body"!==i.nodeName.toLowerCase()&&e(i).blur()}catch(n){}this._hide(this.uiDialog,this.options.hide,function(){s._trigger("close",t)})}},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+e(this).css("z-index")}).get(),a=Math.max.apply(null,n);return a>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",a+1),s=!0),s&&!i&&this._trigger("focus",t),s},open:function(){var t=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=e(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var e=this._focusedElement;
+e||(e=this.element.find("[autofocus]")),e.length||(e=this.element.find(":tabbable")),e.length||(e=this.uiDialogButtonPane.find(":tabbable")),e.length||(e=this.uiDialogTitlebarClose.filter(":tabbable")),e.length||(e=this.uiDialog),e.eq(0).focus()},_keepFocus:function(t){function i(){var t=this.document[0].activeElement,i=this.uiDialog[0]===t||e.contains(this.uiDialog[0],t);i||this._focusTabbable()}t.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=e("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===e.ui.keyCode.ESCAPE)return t.preventDefault(),this.close(t),void 0;if(t.keyCode===e.ui.keyCode.TAB&&!t.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");t.target!==n[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==s[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){n.focus()}),t.preventDefault()):(this._delay(function(){s.focus()}),t.preventDefault())}},mousedown:function(e){this._moveToTop(e)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=e("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(t){e(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=e("<button type='button'></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(e){e.preventDefault(),this.close(e)}}),t=e("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(t),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(e){this.options.title||e.html("&#160;"),e.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=e("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=e("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var t=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),e.isEmptyObject(i)||e.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),void 0):(e.each(i,function(i,s){var n,a;s=e.isFunction(s)?{click:s,text:i}:s,s=e.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(t.element[0],arguments)},a={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,e("<button></button>",s).button(a).appendTo(t.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function t(e){return{position:e.position,offset:e.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){e(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,t(n))},drag:function(e,s){i._trigger("drag",e,t(s))},stop:function(n,a){var o=a.offset.left-i.document.scrollLeft(),r=a.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(o>=0?"+":"")+o+" "+"top"+(r>=0?"+":"")+r,of:i.window},e(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,t(a))}})},_makeResizable:function(){function t(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}var i=this,s=this.options,n=s.resizable,a=this.uiDialog.css("position"),o="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:o,start:function(s,n){e(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,t(n))},resize:function(e,s){i._trigger("resize",e,t(s))},stop:function(n,a){var o=i.uiDialog.offset(),r=o.left-i.document.scrollLeft(),h=o.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(h>=0?"+":"")+h,of:i.window},e(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,t(a))}}).css("position",a)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._makeFocusTarget(),this._focusedElement=e(t.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var t=this._trackingInstances(),i=e.inArray(this,t);-1!==i&&t.splice(i,1)},_trackingInstances:function(){var e=this.document.data("ui-dialog-instances");return e||(e=[],this.document.data("ui-dialog-instances",e)),e},_minHeight:function(){var e=this.options;return"auto"===e.height?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(){var e=this.uiDialog.is(":visible");e||this.uiDialog.show(),this.uiDialog.position(this.options.position),e||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};e.each(t,function(e,t){i._setOption(e,t),e in i.sizeRelatedOptions&&(s=!0),e in i.resizableRelatedOptions&&(n[e]=t)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,t){var i,s,n=this.uiDialog;"dialogClass"===e&&n.removeClass(this.options.dialogClass).addClass(t),"disabled"!==e&&(this._super(e,t),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:""+t}),"draggable"===e&&(i=n.is(":data(ui-draggable)"),i&&!t&&n.draggable("destroy"),!i&&t&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(s=n.is(":data(ui-resizable)"),s&&!t&&n.resizable("destroy"),s&&"string"==typeof t&&n.resizable("option","handles",t),s||t===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var e,t,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),e=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),t=Math.max(0,s.minHeight-e),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-e):"none","auto"===s.height?this.element.css({minHeight:t,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-e)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var t=e(this);return e("<div>").css({position:"absolute",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return e(t.target).closest(".ui-dialog").length?!0:!!e(t.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var t=!0;this._delay(function(){t=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(e){t||this._allowInteraction(e)||(e.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=e("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var e=this.document.data("ui-dialog-overlays")-1;e?this.document.data("ui-dialog-overlays",e):this.document.unbind("focusin").removeData("ui-dialog-overlays"),this.overlay.remove(),this.overlay=null}}}),e.widget("ui.progressbar",{version:"1.11.1",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=e("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()},value:function(e){return void 0===e?this.options.value:(this.options.value=this._constrainedValue(e),this._refreshValue(),void 0)},_constrainedValue:function(e){return void 0===e&&(e=this.options.value),this.indeterminate=e===!1,"number"!=typeof e&&(e=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,e))},_setOptions:function(e){var t=e.value;delete e.value,this._super(e),this.options.value=this._constrainedValue(t),this._refreshValue()},_setOption:function(e,t){"max"===e&&(t=Math.max(this.min,t)),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).toggleClass("ui-corner-right",t===this.options.max).width(i.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=e("<div class='ui-progressbar-overlay'></div>").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger("change")),t===this.options.max&&this._trigger("complete")}}),e.widget("ui.selectmenu",{version:"1.11.1",defaultElement:"<select>",options:{appendTo:null,disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:null,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this.options.disabled&&this.disable()},_drawButton:function(){var t=this,i=this.element.attr("tabindex");this.label=e("label[for='"+this.ids.element+"']").attr("for",this.ids.button),this._on(this.label,{click:function(e){this.button.focus(),e.preventDefault()}}),this.element.hide(),this.button=e("<span>",{"class":"ui-selectmenu-button ui-widget ui-state-default ui-corner-all",tabindex:i||this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true"}).insertAfter(this.element),e("<span>",{"class":"ui-icon "+this.options.icons.button}).prependTo(this.button),this.buttonText=e("<span>",{"class":"ui-selectmenu-text"}).appendTo(this.button),this._setText(this.buttonText,this.element.find("option:selected").text()),this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){t.menuItems||t._refreshMenu()}),this._hoverable(this.button),this._focusable(this.button)},_drawMenu:function(){var t=this;this.menu=e("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=e("<div>",{"class":"ui-selectmenu-menu ui-front"}).append(this.menu).appendTo(this._appendTo()),this.menuInstance=this.menu.menu({role:"listbox",select:function(e,i){e.preventDefault(),t._select(i.item.data("ui-selectmenu-item"),e)},focus:function(e,i){var s=i.item.data("ui-selectmenu-item");null!=t.focusIndex&&s.index!==t.focusIndex&&(t._trigger("focus",e,{item:s}),t.isOpen||t._select(s,e)),t.focusIndex=s.index,t.button.attr("aria-activedescendant",t.menuItems.eq(s.index).attr("id"))}}).menu("instance"),this.menu.addClass("ui-corner-bottom").removeClass("ui-corner-all"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this._setText(this.buttonText,this._getSelectedItem().text()),this.options.width||this._resizeButton()},_refreshMenu:function(){this.menu.empty();var e,t=this.element.find("option");t.length&&(this._parseOptions(t),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup"),e=this._getSelectedItem(),this.menuInstance.focus(null,e),this._setAria(e.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(e){this.options.disabled||(this.menuItems?(this.menu.find(".ui-state-focus").removeClass("ui-state-focus"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",e))},_position:function(){this.menuWrap.position(e.extend({of:this.button},this.options.position))},close:function(e){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this._off(this.document),this._trigger("close",e))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderMenu:function(t,i){var s=this,n="";e.each(i,function(i,a){a.optgroup!==n&&(e("<li>",{"class":"ui-selectmenu-optgroup ui-menu-divider"+(a.element.parent("optgroup").prop("disabled")?" ui-state-disabled":""),text:a.optgroup}).appendTo(t),n=a.optgroup),s._renderItemData(t,a)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-selectmenu-item",t)},_renderItem:function(t,i){var s=e("<li>");return i.disabled&&s.addClass("ui-state-disabled"),this._setText(s,i.label),s.appendTo(t)},_setText:function(e,t){t?e.text(t):e.html("&#160;")},_move:function(e,t){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex):(i=this.menuItems.eq(this.element[0].selectedIndex),n+=":not(.ui-state-disabled)"),s="first"===e||"last"===e?i["first"===e?"prevAll":"nextAll"](n).eq(-1):i[e+"All"](n).eq(0),s.length&&this.menuInstance.focus(t,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex)},_toggle:function(e){this[this.isOpen?"close":"open"](e)},_documentClick:{mousedown:function(t){this.isOpen&&(e(t.target).closest(".ui-selectmenu-menu, #"+this.ids.button).length||this.close(t))}},_buttonEvents:{mousedown:function(e){e.preventDefault()},click:"_toggle",keydown:function(t){var i=!0;switch(t.keyCode){case e.ui.keyCode.TAB:case e.ui.keyCode.ESCAPE:this.close(t),i=!1;break;case e.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(t);break;case e.ui.keyCode.UP:t.altKey?this._toggle(t):this._move("prev",t);break;case e.ui.keyCode.DOWN:t.altKey?this._toggle(t):this._move("next",t);break;case e.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(t):this._toggle(t);break;case e.ui.keyCode.LEFT:this._move("prev",t);break;case e.ui.keyCode.RIGHT:this._move("next",t);break;case e.ui.keyCode.HOME:case e.ui.keyCode.PAGE_UP:this._move("first",t);break;case e.ui.keyCode.END:case e.ui.keyCode.PAGE_DOWN:this._move("last",t);break;default:this.menu.trigger(t),i=!1}i&&t.preventDefault()}},_selectFocusedItem:function(e){var t=this.menuItems.eq(this.focusIndex);t.hasClass("ui-state-disabled")||this._select(t.data("ui-selectmenu-item"),e)},_select:function(e,t){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=e.index,this._setText(this.buttonText,e.label),this._setAria(e),this._trigger("select",t,{item:e}),e.index!==i&&this._trigger("change",t,{item:e}),this.close(t)},_setAria:function(e){var t=this.menuItems.eq(e.index).attr("id");this.button.attr({"aria-labelledby":t,"aria-activedescendant":t}),this.menu.attr("aria-activedescendant",t)},_setOption:function(e,t){"icons"===e&&this.button.find("span.ui-icon").removeClass(this.options.icons.button).addClass(t.button),this._super(e,t),"appendTo"===e&&this.menuWrap.appendTo(this._appendTo()),"disabled"===e&&(this.menuInstance.option("disabled",t),this.button.toggleClass("ui-state-disabled",t).attr("aria-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)),"width"===e&&this._resizeButton()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_toggleAttr:function(){this.button.toggleClass("ui-corner-top",this.isOpen).toggleClass("ui-corner-all",!this.isOpen).attr("aria-expanded",this.isOpen),this.menuWrap.toggleClass("ui-selectmenu-open",this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var e=this.options.width;e||(e=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(e)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){return{disabled:this.element.prop("disabled")}},_parseOptions:function(t){var i=[];t.each(function(t,s){var n=e(s),a=n.parent("optgroup");i.push({element:n,index:t,value:n.attr("value"),label:n.text(),optgroup:a.attr("label")||"",disabled:a.prop("disabled")||n.prop("disabled")})}),this.items=i},_destroy:function(){this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.label.attr("for",this.ids.element)}}),e.widget("ui.slider",e.ui.mouse,{version:"1.11.1",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),a="<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",o=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),t=n.length;i>t;t++)o.push(a);this.handles=n.add(e(o.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)})},_createRange:function(){var t=this.options,i="";t.range?(t.range===!0&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:e.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=e("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===t.range||"max"===t.range?" ui-slider-range-"+t.range:""))):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,a,o,r,h,l,u=this,d=this.options;return d.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:t.pageX,y:t.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var i=Math.abs(s-u.values(t));(n>i||n===i&&(t===u._lastChangedValue||u.values(t)===d.min))&&(n=i,a=e(this),o=t)}),r=this._start(t,o),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,a.addClass("ui-state-active").focus(),h=a.offset(),l=!e(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:t.pageX-h.left-a.width()/2,top:t.pageY-h.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},i=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,i),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,i,s,n,a;return"horizontal"===this.orientation?(t=this.elementSize.width,i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/t,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(e,t){var i={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("start",e,i)},_slide:function(e,t,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(t?0:1),2===this.options.values.length&&this.options.range===!0&&(0===t&&i>s||1===t&&s>i)&&(i=s),i!==this.values(t)&&(n=this.values(),n[t]=i,a=this._trigger("slide",e,{handle:this.handles[t],value:i,values:n}),s=this.values(t?0:1),a!==!1&&this.values(t,i))):i!==this.value()&&(a=this._trigger("slide",e,{handle:this.handles[t],value:i}),a!==!1&&this.value(i))},_stop:function(e,t){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("stop",e,i)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._lastChangedValue=t,this._trigger("change",e,i)}},value:function(e){return arguments.length?(this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(t,i){var s,n,a;if(arguments.length>1)return this.options.values[t]=this._trimAlignValue(i),this._refreshValue(),this._change(null,t),void 0;if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);this._refreshValue()},_setOption:function(t,i){var s,n=0;switch("range"===t&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),e.isArray(this.options.values)&&(n=this.options.values.length),"disabled"===t&&this.element.toggleClass("ui-state-disabled",!!i),this._super(t,i),t){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue(),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"min":case"max":this._animateOff=!0,this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e)},_values:function(e){var t,i,s;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(e){if(this._valueMin()>=e)return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,i=(e-this._valueMin())%t,s=e-i;return 2*Math.abs(i)>=t&&(s+=i>0?t:-t),parseFloat(s.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var t,i,s,n,a,o=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),u["horizontal"===h.orientation?"left":"bottom"]=i+"%",e(this).stop(1,1)[l?"animate":"css"](u,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-t+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-t+"%"},{queue:!1,duration:r.animate}))),t=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](u,r.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===o&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===o&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(t){var i,s,n,a,o=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,e(t.target).addClass("ui-state-active"),i=this._start(t,o),i===!1))return}switch(a=this.options.step,s=n=this.options.values&&this.options.values.length?this.values(o):this.value(),t.keyCode){case e.ui.keyCode.HOME:n=this._valueMin();break;case e.ui.keyCode.END:n=this._valueMax();break;case e.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+a);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-a)}this._slide(t,o,n)},keyup:function(t){var i=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,i),this._change(t,i),e(t.target).removeClass("ui-state-active"))}}}),e.widget("ui.spinner",{version:"1.11.1",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var t={},i=this.element;return e.each(["min","max","step"],function(e,s){var n=i.attr(s);void 0!==n&&n.length&&(t[s]=n)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",e),void 0)},mousewheel:function(e,t){if(t){if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()}},"mousedown .ui-spinner-button":function(t){function i(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(t)!==!1&&this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){return e(t.currentTarget).hasClass("ui-state-active")?this._start(t)===!1?!1:(this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var e=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=e.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(.5*e.height())&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()},_keydown:function(t){var i=this.options,s=e.ui.keyCode;switch(t.keyCode){case s.UP:return this._repeat(null,1,t),!0;case s.DOWN:return this._repeat(null,-1,t),!0;case s.PAGE_UP:return this._repeat(null,i.page,t),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,t),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>&#9650;</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>&#9660;</span>"+"</a>"},_start:function(e){return this.spinning||this._trigger("start",e)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(e,t,i){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,i)},e),this._spin(t*this.options.step,i)},_spin:function(e,t){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+e*this._increment(this.counter)),this.spinning&&this._trigger("spin",t,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(t){var i=this.options.incremental;
+return i?e.isFunction(i)?i(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_adjustValue:function(e){var t,i,s=this.options;return t=null!==s.min?s.min:0,i=e-t,i=Math.round(i/s.step)*s.step,e=t+i,e=parseFloat(e.toFixed(this._precision())),null!==s.max&&e>s.max?s.max:null!==s.min&&s.min>e?s.min:e},_stop:function(e){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",e))},_setOption:function(e,t){if("culture"===e||"numberFormat"===e){var i=this._parse(this.element.val());return this.options[e]=t,this.element.val(this._format(i)),void 0}("max"===e||"min"===e||"step"===e)&&"string"==typeof t&&(t=this._parse(t)),"icons"===e&&(this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(t.up),this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(t.down)),this._super(e,t),"disabled"===e&&(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable"))},_setOptions:h(function(e){this._super(e)}),_parse:function(e){return"string"==typeof e&&""!==e&&(e=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(e,10,this.options.culture):+e),""===e||isNaN(e)?null:e},_format:function(e){return""===e?"":window.Globalize&&this.options.numberFormat?Globalize.format(e,this.options.numberFormat,this.options.culture):e},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var e=this.value();return null===e?!1:e===this._adjustValue(e)},_value:function(e,t){var i;""!==e&&(i=this._parse(e),null!==i&&(t||(i=this._adjustValue(i)),e=this._format(i))),this.element.val(e),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:h(function(e){this._stepUp(e)}),_stepUp:function(e){this._start()&&(this._spin((e||1)*this.options.step),this._stop())},stepDown:h(function(e){this._stepDown(e)}),_stepDown:function(e){this._start()&&(this._spin((e||1)*-this.options.step),this._stop())},pageUp:h(function(e){this._stepUp((e||1)*this.options.page)}),pageDown:h(function(e){this._stepDown((e||1)*this.options.page)}),value:function(e){return arguments.length?(h(this._value).call(this,e),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),e.widget("ui.tabs",{version:"1.11.1",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var e=/#.*$/;return function(t){var i,s;t=t.cloneNode(!1),i=t.href.replace(e,""),s=location.href.replace(e,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return t.hash.length>1&&i===s}}(),_create:function(){var t=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible),this._processTabs(),i.active=this._initialActive(),e.isArray(i.disabled)&&(i.disabled=e.unique(i.disabled.concat(e.map(this.tabs.filter(".ui-state-disabled"),function(e){return t.tabs.index(e)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):e(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var t=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===t&&(s&&this.tabs.each(function(i,n){return e(n).attr("aria-controls")===s?(t=i,!1):void 0}),null===t&&(t=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===t||-1===t)&&(t=this.tabs.length?0:!1)),t!==!1&&(t=this.tabs.index(this.tabs.eq(t)),-1===t&&(t=i?!1:0)),!i&&t===!1&&this.anchors.length&&(t=0),t},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var i=e(this.document[0].activeElement).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(t)){switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:s++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:n=!1,s--;break;case e.ui.keyCode.END:s=this.anchors.length-1;break;case e.ui.keyCode.HOME:s=0;break;case e.ui.keyCode.SPACE:return t.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case e.ui.keyCode.ENTER:return t.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}t.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),t.ctrlKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(t){this._handlePageNav(t)||t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){return t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(t,i){function s(){return t>n&&(t=0),0>t&&(t=n),t}for(var n=this.tabs.length-1;-1!==e.inArray(s(),this.options.disabled);)t=i?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):"disabled"===e?(this._setupDisabled(t),void 0):(this._super(e,t),"collapsible"===e&&(this.element.toggleClass("ui-tabs-collapsible",t),t||this.options.active!==!1||this._activate(0)),"event"===e&&this._setupEvents(t),"heightStyle"===e&&this._setupHeightStyle(t),void 0)},_sanitizeSelector:function(e){return e?e.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,i=this.tablist.children(":has(a[href])");t.disabled=e.map(i.filter(".ui-state-disabled"),function(e){return i.index(e)}),this._processTabs(),t.active!==!1&&this.anchors.length?this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active):(t.active=!1,this.active=e()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var t=this;this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist").delegate("> li","mousedown"+this.eventNamespace,function(t){e(this).is(".ui-state-disabled")&&t.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){e(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=e(),this.anchors.each(function(i,s){var n,a,o,r=e(s).uniqueId().attr("id"),h=e(s).closest("li"),l=h.attr("aria-controls");t._isLocal(s)?(n=s.hash,o=n.substring(1),a=t.element.find(t._sanitizeSelector(n))):(o=h.attr("aria-controls")||e({}).uniqueId()[0].id,n="#"+o,a=t.element.find(n),a.length||(a=t._createPanel(o),a.insertAfter(t.panels[i-1]||t.tablist)),a.attr("aria-live","polite")),a.length&&(t.panels=t.panels.add(a)),l&&h.data("ui-tabs-aria-controls",l),h.attr({"aria-controls":o,"aria-labelledby":r}),a.attr("aria-labelledby",r)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel")},_getList:function(){return this.tablist||this.element.find("ol,ul").eq(0)},_createPanel:function(t){return e("<div>").attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var i,s=0;i=this.tabs[s];s++)t===!0||-1!==e.inArray(s,t)?e(i).addClass("ui-state-disabled").attr("aria-disabled","true"):e(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=t},_setupEvents:function(t){var i={};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(e){e.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,s=this.element.parent();"fill"===t?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var t=e(this),s=t.css("position");"absolute"!==s&&"fixed"!==s&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,i-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===t&&(i=0,this.panels.each(function(){i=Math.max(i,e(this).height("").height())}).height(i))},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n.closest("li"),o=a[0]===s[0],r=o&&i.collapsible,h=r?e():this._getPanelForTab(a),l=s.length?this._getPanelForTab(s):e(),u={oldTab:s,oldPanel:l,newTab:r?e():a,newPanel:h};t.preventDefault(),a.hasClass("ui-state-disabled")||a.hasClass("ui-tabs-loading")||this.running||o&&!i.collapsible||this._trigger("beforeActivate",t,u)===!1||(i.active=r?!1:this.tabs.index(a),this.active=o?e():a,this.xhr&&this.xhr.abort(),l.length||h.length||e.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(a),t),this._toggle(t,u))},_toggle:function(t,i){function s(){a.running=!1,a._trigger("activate",t,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),o.length&&a.options.show?a._show(o,a.options.show,s):(o.show(),s())}var a=this,o=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),o.length&&r.length?i.oldTab.attr("tabIndex",-1):o.length&&this.tabs.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),o.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(t){var i,s=this._findActive(t);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+e+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tablist.unbind(this.eventNamespace),this.tabs.add(this.panels).each(function(){e.data(this,"ui-tabs-destroy")?e(this).remove():e(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var t=e(this),i=t.data("ui-tabs-aria-controls");i?t.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):t.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(t){var i=this.options.disabled;i!==!1&&(void 0===t?i=!1:(t=this._getIndex(t),i=e.isArray(i)?e.map(i,function(e){return e!==t?e:null}):e.map(this.tabs,function(e,i){return i!==t?i:null})),this._setupDisabled(i))},disable:function(t){var i=this.options.disabled;if(i!==!0){if(void 0===t)i=!0;else{if(t=this._getIndex(t),-1!==e.inArray(t,i))return;i=e.isArray(i)?e.merge([t],i).sort():[t]}this._setupDisabled(i)}},load:function(t,i){t=this._getIndex(t);var s=this,n=this.tabs.eq(t),a=n.find(".ui-tabs-anchor"),o=this._getPanelForTab(n),r={tab:n,panel:o};this._isLocal(a[0])||(this.xhr=e.ajax(this._ajaxSettings(a,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(n.addClass("ui-tabs-loading"),o.attr("aria-busy","true"),this.xhr.success(function(e){setTimeout(function(){o.html(e),s._trigger("load",i,r)},1)}).complete(function(e,t){setTimeout(function(){"abort"===t&&s.panels.stop(!1,!0),n.removeClass("ui-tabs-loading"),o.removeAttr("aria-busy"),e===s.xhr&&delete s.xhr},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr("href"),beforeSend:function(t,a){return n._trigger("beforeLoad",i,e.extend({jqXHR:t,ajaxSettings:a},s))}}},_getPanelForTab:function(t){var i=e(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),e.widget("ui.tooltip",{version:"1.11.1",options:{content:function(){var t=e(this).attr("title")||"";return e("<a>").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_addDescribedBy:function(t,i){var s=(t.attr("aria-describedby")||"").split(/\s+/);s.push(i),t.data("ui-tooltip-id",i).attr("aria-describedby",e.trim(s.join(" ")))},_removeDescribedBy:function(t){var i=t.data("ui-tooltip-id"),s=(t.attr("aria-describedby")||"").split(/\s+/),n=e.inArray(i,s);-1!==n&&s.splice(n,1),t.removeData("ui-tooltip-id"),s=e.trim(s.join(" ")),s?t.attr("aria-describedby",s):t.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable(),this.liveRegion=e("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body)},_setOption:function(t,i){var s=this;return"disabled"===t?(this[i?"_disable":"_enable"](),this.options[t]=i,void 0):(this._super(t,i),"content"===t&&e.each(this.tooltips,function(e,t){s._updateContent(t)}),void 0)},_disable:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s[0],t.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).removeAttr("title")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var i=this,s=e(t?t.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),t&&"mouseover"===t.type&&s.parents().each(function(){var t,s=e(this);s.data("ui-tooltip-open")&&(t=e.Event("blur"),t.target=t.currentTarget=this,i.close(t,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._updateContent(s,t))},_updateContent:function(e,t){var i,s=this.options.content,n=this,a=t?t.type:null;return"string"==typeof s?this._open(t,e,s):(i=s.call(e[0],function(i){e.data("ui-tooltip-open")&&n._delay(function(){t&&(t.type=a),this._open(t,e,i)})}),i&&this._open(t,e,i),void 0)},_open:function(t,i,s){function n(e){l.of=e,a.is(":hidden")||a.position(l)}var a,o,r,h,l=e.extend({},this.options.position);if(s){if(a=this._find(i),a.length)return a.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(t&&"mouseover"===t.type?i.attr("title",""):i.removeAttr("title")),a=this._tooltip(i),this._addDescribedBy(i,a.attr("id")),a.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),s.clone?(h=s.clone(),h.removeAttr("id").find("[id]").removeAttr("id")):h=s,e("<div>").html(h).appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:n}),n(t)):a.position(e.extend({of:i},this.options.position)),this.hiding=!1,this.closing=!1,a.hide(),this._show(a,this.options.show),this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){a.is(":visible")&&(n(l.of),clearInterval(r))},e.fx.interval)),this._trigger("open",t,{tooltip:a}),o={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var s=e.Event(t);s.currentTarget=i[0],this.close(s,!0)}}},i[0]!==this.element[0]&&(o.remove=function(){this._removeTooltip(a)}),t&&"mouseover"!==t.type||(o.mouseleave="close"),t&&"focusin"!==t.type||(o.focusout="close"),this._on(!0,i,o)}},close:function(t){var i=this,s=e(t?t.currentTarget:this.element),n=this._find(s);this.closing||(clearInterval(this.delayedShow),s.data("ui-tooltip-title")&&!s.attr("title")&&s.attr("title",s.data("ui-tooltip-title")),this._removeDescribedBy(s),this.hiding=!0,n.stop(!0),this._hide(n,this.options.hide,function(){i._removeTooltip(e(this)),this.hiding=!1,this.closing=!1}),s.removeData("ui-tooltip-open"),this._off(s,"mouseleave focusout keyup"),s[0]!==this.element[0]&&this._off(s,"remove"),this._off(this.document,"mousemove"),t&&"mouseleave"===t.type&&e.each(this.parents,function(t,s){e(s.element).attr("title",s.title),delete i.parents[t]}),this.closing=!0,this._trigger("close",t,{tooltip:n}),this.hiding||(this.closing=!1))},_tooltip:function(t){var i=e("<div>").attr("role","tooltip").addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||"")),s=i.uniqueId().attr("id");return e("<div>").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[s]=t,i},_find:function(t){var i=t.data("ui-tooltip-id");return i?e("#"+i):e()},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s[0],t.close(n,!0),e("#"+i).remove(),s.data("ui-tooltip-title")&&(s.attr("title")||s.attr("title",s.data("ui-tooltip-title")),s.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}});var y="ui-effects-",b=e;e.effects={effect:{}},function(e,t){function i(e,t,i){var s=d[t.type]||{};return null==e?i||!t.def?null:t.def:(e=s.floor?~~e:parseFloat(e),isNaN(e)?t.def:s.mod?(e+s.mod)%s.mod:0>e?0:e>s.max?s.max:e)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(e,a){var o,r=a.re.exec(i),h=r&&a.parse(r),l=a.space||"rgba";return h?(o=s[l](h),s[u[l].cache]=o[u[l].cache],n=s._rgba=o._rgba,!1):t}),n.length?("0,0,0,0"===n.join()&&e.extend(n,a.transparent),s):a[i]}function n(e,t,i){return i=(i+1)%1,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+6*(t-e)*(2/3-i):e}var a,o="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[2.55*e[1],2.55*e[2],2.55*e[3],e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],l=e.Color=function(t,i,s,n){return new e.Color.fn.parse(t,i,s,n)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},d={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},c=l.support={},p=e("<p>")[0],f=e.each;p.style.cssText="background-color:rgba(1,1,1,.5)",c.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),l.fn=e.extend(l.prototype,{parse:function(n,o,r,h){if(n===t)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=e(n).css(o),o=t);var d=this,c=e.type(n),p=this._rgba=[];return o!==t&&(n=[n,o,r,h],c="array"),"string"===c?this.parse(s(n)||a._default):"array"===c?(f(u.rgba.props,function(e,t){p[t.idx]=i(n[t.idx],t)}),this):"object"===c?(n instanceof l?f(u,function(e,t){n[t.cache]&&(d[t.cache]=n[t.cache].slice())}):f(u,function(t,s){var a=s.cache;f(s.props,function(e,t){if(!d[a]&&s.to){if("alpha"===e||null==n[e])return;d[a]=s.to(d._rgba)}d[a][t.idx]=i(n[e],t,!0)}),d[a]&&0>e.inArray(null,d[a].slice(0,3))&&(d[a][3]=1,s.from&&(d._rgba=s.from(d[a])))}),this):t},is:function(e){var i=l(e),s=!0,n=this;return f(u,function(e,a){var o,r=i[a.cache];return r&&(o=n[a.cache]||a.to&&a.to(n._rgba)||[],f(a.props,function(e,i){return null!=r[i.idx]?s=r[i.idx]===o[i.idx]:t})),s}),s},_space:function(){var e=[],t=this;return f(u,function(i,s){t[s.cache]&&e.push(i)}),e.pop()},transition:function(e,t){var s=l(e),n=s._space(),a=u[n],o=0===this.alpha()?l("transparent"):this,r=o[a.cache]||a.to(o._rgba),h=r.slice();return s=s[a.cache],f(a.props,function(e,n){var a=n.idx,o=r[a],l=s[a],u=d[n.type]||{};null!==l&&(null===o?h[a]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[a]=i((l-o)*t+o,n)))}),this[n](h)},blend:function(t){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(t)._rgba;return l(e.map(i,function(e,t){return(1-s)*n[t]+s*e}))},toRgbaString:function(){var t="rgba(",i=e.map(this._rgba,function(e,t){return null==e?t>2?1:0:e});return 1===i[3]&&(i.pop(),t="rgb("),t+i.join()+")"},toHslaString:function(){var t="hsla(",i=e.map(this.hsla(),function(e,t){return null==e&&(e=t>2?1:0),t&&3>t&&(e=Math.round(100*e)+"%"),e});return 1===i[3]&&(i.pop(),t="hsl("),t+i.join()+")"},toHexString:function(t){var i=this._rgba.slice(),s=i.pop();return t&&i.push(~~(255*s)),"#"+e.map(i,function(e){return e=(e||0).toString(16),1===e.length?"0"+e:e}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t,i,s=e[0]/255,n=e[1]/255,a=e[2]/255,o=e[3],r=Math.max(s,n,a),h=Math.min(s,n,a),l=r-h,u=r+h,d=.5*u;return t=h===r?0:s===r?60*(n-a)/l+360:n===r?60*(a-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=d?l/u:l/(2-u),[Math.round(t)%360,i,d,null==o?1:o]},u.hsla.from=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t=e[0]/360,i=e[1],s=e[2],a=e[3],o=.5>=s?s*(1+i):s+i-s*i,r=2*s-o;return[Math.round(255*n(r,o,t+1/3)),Math.round(255*n(r,o,t)),Math.round(255*n(r,o,t-1/3)),a]},f(u,function(s,n){var a=n.props,o=n.cache,h=n.to,u=n.from;l.fn[s]=function(s){if(h&&!this[o]&&(this[o]=h(this._rgba)),s===t)return this[o].slice();var n,r=e.type(s),d="array"===r||"object"===r?s:arguments,c=this[o].slice();return f(a,function(e,t){var s=d["object"===r?e:t.idx];null==s&&(s=c[t.idx]),c[t.idx]=i(s,t)}),u?(n=l(u(c)),n[o]=c,n):l(c)},f(a,function(t,i){l.fn[t]||(l.fn[t]=function(n){var a,o=e.type(n),h="alpha"===t?this._hsla?"hsla":"rgba":s,l=this[h](),u=l[i.idx];return"undefined"===o?u:("function"===o&&(n=n.call(this,u),o=e.type(n)),null==n&&i.empty?this:("string"===o&&(a=r.exec(n),a&&(n=u+parseFloat(a[2])*("+"===a[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(t){var i=t.split(" ");f(i,function(t,i){e.cssHooks[i]={set:function(t,n){var a,o,r="";if("transparent"!==n&&("string"!==e.type(n)||(a=s(n)))){if(n=l(a||n),!c.rgba&&1!==n._rgba[3]){for(o="backgroundColor"===i?t.parentNode:t;(""===r||"transparent"===r)&&o&&o.style;)try{r=e.css(o,"backgroundColor"),o=o.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{t.style[i]=n}catch(h){}}},e.fx.step[i]=function(t){t.colorInit||(t.start=l(t.elem,i),t.end=l(t.end),t.colorInit=!0),e.cssHooks[i].set(t.elem,t.start.transition(t.end,t.pos))}})},l.hook(o),e.cssHooks.borderColor={expand:function(e){var t={};return f(["Top","Right","Bottom","Left"],function(i,s){t["border"+s+"Color"]=e}),t}},a=e.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(b),function(){function t(t){var i,s,n=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,a={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(a[e.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(a[i]=n[i]);return a}function i(t,i){var s,a,o={};for(s in i)a=i[s],t[s]!==a&&(n[s]||(e.fx.step[s]||!isNaN(parseFloat(a)))&&(o[s]=a));return o}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,i){e.fx.step[i]=function(e){("none"!==e.end&&!e.setAttr||1===e.pos&&!e.setAttr)&&(b.style(e.elem,i,e.end),e.setAttr=!0)}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(n,a,o,r){var h=e.speed(a,o,r);return this.queue(function(){var a,o=e(this),r=o.attr("class")||"",l=h.children?o.find("*").addBack():o;l=l.map(function(){var i=e(this);return{el:i,start:t(this)}}),a=function(){e.each(s,function(e,t){n[t]&&o[t+"Class"](n[t])})},a(),l=l.map(function(){return this.end=t(this.el[0]),this.diff=i(this.start,this.end),this}),o.attr("class",r),l=l.map(function(){var t=this,i=e.Deferred(),s=e.extend({},h,{queue:!1,complete:function(){i.resolve(t)}});return this.el.animate(this.diff,s),i.promise()}),e.when.apply(e,l.get()).done(function(){a(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),h.complete.call(o[0])})})},e.fn.extend({addClass:function(t){return function(i,s,n,a){return s?e.effects.animateClass.call(this,{add:i},s,n,a):t.apply(this,arguments)}}(e.fn.addClass),removeClass:function(t){return function(i,s,n,a){return arguments.length>1?e.effects.animateClass.call(this,{remove:i},s,n,a):t.apply(this,arguments)}}(e.fn.removeClass),toggleClass:function(t){return function(i,s,n,a,o){return"boolean"==typeof s||void 0===s?n?e.effects.animateClass.call(this,s?{add:i}:{remove:i},n,a,o):t.apply(this,arguments):e.effects.animateClass.call(this,{toggle:i},s,n,a)}}(e.fn.toggleClass),switchClass:function(t,i,s,n,a){return e.effects.animateClass.call(this,{add:i,remove:t},s,n,a)}})}(),function(){function t(t,i,s,n){return e.isPlainObject(t)&&(i=t,t=t.effect),t={effect:t},null==i&&(i={}),e.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||e.fx.speeds[i])&&(n=s,s=i,i={}),e.isFunction(s)&&(n=s,s=null),i&&e.extend(t,i),s=s||i.duration,t.duration=e.fx.off?0:"number"==typeof s?s:s in e.fx.speeds?e.fx.speeds[s]:e.fx.speeds._default,t.complete=n||i.complete,t}function i(t){return!t||"number"==typeof t||e.fx.speeds[t]?!0:"string"!=typeof t||e.effects.effect[t]?e.isFunction(t)?!0:"object"!=typeof t||t.effect?!1:!0:!0}e.extend(e.effects,{version:"1.11.1",save:function(e,t){for(var i=0;t.length>i;i++)null!==t[i]&&e.data(y+t[i],e[0].style[t[i]])},restore:function(e,t){var i,s;for(s=0;t.length>s;s++)null!==t[s]&&(i=e.data(y+t[s]),void 0===i&&(i=""),e.css(t[s],i))},setMode:function(e,t){return"toggle"===t&&(t=e.is(":hidden")?"show":"hide"),t},getBaseline:function(e,t){var i,s;switch(e[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=e[0]/t.height}switch(e[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=e[1]/t.width}return{x:s,y:i}},createWrapper:function(t){if(t.parent().is(".ui-effects-wrapper"))return t.parent();var i={width:t.outerWidth(!0),height:t.outerHeight(!0),"float":t.css("float")},s=e("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:t.width(),height:t.height()},a=document.activeElement;try{a.id}catch(o){a=document.body}return t.wrap(s),(t[0]===a||e.contains(t[0],a))&&e(a).focus(),s=t.parent(),"static"===t.css("position")?(s.css({position:"relative"}),t.css({position:"relative"})):(e.extend(i,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,s){i[s]=t.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(n),s.css(i).show()},removeWrapper:function(t){var i=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===i||e.contains(t[0],i))&&e(i).focus()),t},setTransition:function(t,i,s,n){return n=n||{},e.each(i,function(e,i){var a=t.cssUnit(i);a[0]>0&&(n[i]=a[0]*s+a[1])}),n}}),e.fn.extend({effect:function(){function i(t){function i(){e.isFunction(a)&&a.call(n[0]),e.isFunction(t)&&t()}var n=e(this),a=s.complete,r=s.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),i()):o.call(n[0],s,i)}var s=t.apply(this,arguments),n=s.mode,a=s.queue,o=e.effects.effect[s.effect];return e.fx.off||!o?n?this[n](s.duration,s.complete):this.each(function(){s.complete&&s.complete.call(this)}):a===!1?this.each(i):this.queue(a||"fx",i)},show:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(e.fn.show),hide:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(e.fn.hide),toggle:function(e){return function(s){if(i(s)||"boolean"==typeof s)return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(e.fn.toggle),cssUnit:function(t){var i=this.css(t),s=[];return e.each(["em","px","%","pt"],function(e,t){i.indexOf(t)>0&&(s=[parseFloat(i),t])}),s}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,i){t[i]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)
+},Elastic:function(e){return 0===e||1===e?e:-Math.pow(2,8*(e-1))*Math.sin((80*(e-1)-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){for(var t,i=4;((t=Math.pow(2,--i))-1)/11>e;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*t-2)/22-e,2)}}),e.each(t,function(t,i){e.easing["easeIn"+t]=i,e.easing["easeOut"+t]=function(e){return 1-i(1-e)},e.easing["easeInOut"+t]=function(e){return.5>e?i(2*e)/2:1-i(-2*e+2)/2}})}(),e.effects,e.effects.effect.blind=function(t,i){var s,n,a,o=e(this),r=/up|down|vertical/,h=/up|left|vertical|horizontal/,l=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(o,t.mode||"hide"),d=t.direction||"up",c=r.test(d),p=c?"height":"width",f=c?"top":"left",m=h.test(d),g={},v="show"===u;o.parent().is(".ui-effects-wrapper")?e.effects.save(o.parent(),l):e.effects.save(o,l),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n=s[p](),a=parseFloat(s.css(f))||0,g[p]=v?n:0,m||(o.css(c?"bottom":"right",0).css(c?"top":"left","auto").css({position:"absolute"}),g[f]=v?a:n+a),v&&(s.css(p,0),m||s.css(f,a+n)),s.animate(g,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){"hide"===u&&o.hide(),e.effects.restore(o,l),e.effects.removeWrapper(o),i()}})},e.effects.effect.bounce=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"effect"),l="hide"===h,u="show"===h,d=t.direction||"up",c=t.distance,p=t.times||5,f=2*p+(u||l?1:0),m=t.duration/f,g=t.easing,v="up"===d||"down"===d?"top":"left",y="up"===d||"left"===d,b=o.queue(),_=b.length;for((u||l)&&r.push("opacity"),e.effects.save(o,r),o.show(),e.effects.createWrapper(o),c||(c=o["top"===v?"outerHeight":"outerWidth"]()/3),u&&(a={opacity:1},a[v]=0,o.css("opacity",0).css(v,y?2*-c:2*c).animate(a,m,g)),l&&(c/=Math.pow(2,p-1)),a={},a[v]=0,s=0;p>s;s++)n={},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g).animate(a,m,g),c=l?2*c:c/2;l&&(n={opacity:0},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g)),o.queue(function(){l&&o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}),_>1&&b.splice.apply(b,[1,0].concat(b.splice(_,f+1))),o.dequeue()},e.effects.effect.clip=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"hide"),l="show"===h,u=t.direction||"vertical",d="vertical"===u,c=d?"height":"width",p=d?"top":"left",f={};e.effects.save(o,r),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n="IMG"===o[0].tagName?s:o,a=n[c](),l&&(n.css(c,0),n.css(p,a/2)),f[c]=l?a:0,f[p]=l?0:a/2,n.animate(f,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){l||o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}})},e.effects.effect.drop=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","opacity","height","width"],o=e.effects.setMode(n,t.mode||"hide"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h?"pos":"neg",d={opacity:r?1:0};e.effects.save(n,a),n.show(),e.effects.createWrapper(n),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,r&&n.css("opacity",0).css(l,"pos"===u?-s:s),d[l]=(r?"pos"===u?"+=":"-=":"pos"===u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.explode=function(t,i){function s(){b.push(this),b.length===d*c&&n()}function n(){p.css({visibility:"visible"}),e(b).remove(),m||p.hide(),i()}var a,o,r,h,l,u,d=t.pieces?Math.round(Math.sqrt(t.pieces)):3,c=d,p=e(this),f=e.effects.setMode(p,t.mode||"hide"),m="show"===f,g=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/c),y=Math.ceil(p.outerHeight()/d),b=[];for(a=0;d>a;a++)for(h=g.top+a*y,u=a-(d-1)/2,o=0;c>o;o++)r=g.left+o*v,l=o-(c-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-o*v,top:-a*y}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:y,left:r+(m?l*v:0),top:h+(m?u*y:0),opacity:m?0:1}).animate({left:r+(m?0:l*v),top:h+(m?0:u*y),opacity:m?1:0},t.duration||500,t.easing,s)},e.effects.effect.fade=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"toggle");s.animate({opacity:n},{queue:!1,duration:t.duration,easing:t.easing,complete:i})},e.effects.effect.fold=function(t,i){var s,n,a=e(this),o=["position","top","bottom","left","right","height","width"],r=e.effects.setMode(a,t.mode||"hide"),h="show"===r,l="hide"===r,u=t.size||15,d=/([0-9]+)%/.exec(u),c=!!t.horizFirst,p=h!==c,f=p?["width","height"]:["height","width"],m=t.duration/2,g={},v={};e.effects.save(a,o),a.show(),s=e.effects.createWrapper(a).css({overflow:"hidden"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],d&&(u=parseInt(d[1],10)/100*n[l?0:1]),h&&s.css(c?{height:0,width:u}:{height:u,width:0}),g[f[0]]=h?n[0]:u,v[f[1]]=h?n[1]:0,s.animate(g,m,t.easing).animate(v,m,t.easing,function(){l&&a.hide(),e.effects.restore(a,o),e.effects.removeWrapper(a),i()})},e.effects.effect.highlight=function(t,i){var s=e(this),n=["backgroundImage","backgroundColor","opacity"],a=e.effects.setMode(s,t.mode||"show"),o={backgroundColor:s.css("backgroundColor")};"hide"===a&&(o.opacity=0),e.effects.save(s,n),s.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===a&&s.hide(),e.effects.restore(s,n),i()}})},e.effects.effect.size=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],u=["fontSize"],d=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],c=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=e.effects.setMode(o,t.mode||"effect"),f=t.restore||"effect"!==p,m=t.scale||"both",g=t.origin||["middle","center"],v=o.css("position"),y=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&o.show(),s={height:o.height(),width:o.width(),outerHeight:o.outerHeight(),outerWidth:o.outerWidth()},"toggle"===t.mode&&"show"===p?(o.from=t.to||b,o.to=t.from||s):(o.from=t.from||("show"===p?b:s),o.to=t.to||("hide"===p?b:s)),a={from:{y:o.from.height/s.height,x:o.from.width/s.width},to:{y:o.to.height/s.height,x:o.to.width/s.width}},("box"===m||"both"===m)&&(a.from.y!==a.to.y&&(y=y.concat(d),o.from=e.effects.setTransition(o,d,a.from.y,o.from),o.to=e.effects.setTransition(o,d,a.to.y,o.to)),a.from.x!==a.to.x&&(y=y.concat(c),o.from=e.effects.setTransition(o,c,a.from.x,o.from),o.to=e.effects.setTransition(o,c,a.to.x,o.to))),("content"===m||"both"===m)&&a.from.y!==a.to.y&&(y=y.concat(u).concat(l),o.from=e.effects.setTransition(o,u,a.from.y,o.from),o.to=e.effects.setTransition(o,u,a.to.y,o.to)),e.effects.save(o,y),o.show(),e.effects.createWrapper(o),o.css("overflow","hidden").css(o.from),g&&(n=e.effects.getBaseline(g,s),o.from.top=(s.outerHeight-o.outerHeight())*n.y,o.from.left=(s.outerWidth-o.outerWidth())*n.x,o.to.top=(s.outerHeight-o.to.outerHeight)*n.y,o.to.left=(s.outerWidth-o.to.outerWidth)*n.x),o.css(o.from),("content"===m||"both"===m)&&(d=d.concat(["marginTop","marginBottom"]).concat(u),c=c.concat(["marginLeft","marginRight"]),l=r.concat(d).concat(c),o.find("*[width]").each(function(){var i=e(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()};f&&e.effects.save(i,l),i.from={height:s.height*a.from.y,width:s.width*a.from.x,outerHeight:s.outerHeight*a.from.y,outerWidth:s.outerWidth*a.from.x},i.to={height:s.height*a.to.y,width:s.width*a.to.x,outerHeight:s.height*a.to.y,outerWidth:s.width*a.to.x},a.from.y!==a.to.y&&(i.from=e.effects.setTransition(i,d,a.from.y,i.from),i.to=e.effects.setTransition(i,d,a.to.y,i.to)),a.from.x!==a.to.x&&(i.from=e.effects.setTransition(i,c,a.from.x,i.from),i.to=e.effects.setTransition(i,c,a.to.x,i.to)),i.css(i.from),i.animate(i.to,t.duration,t.easing,function(){f&&e.effects.restore(i,l)})})),o.animate(o.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){0===o.to.opacity&&o.css("opacity",o.from.opacity),"hide"===p&&o.hide(),e.effects.restore(o,y),f||("static"===v?o.css({position:"relative",top:o.to.top,left:o.to.left}):e.each(["top","left"],function(e,t){o.css(t,function(t,i){var s=parseInt(i,10),n=e?o.to.left:o.to.top;return"auto"===i?n+"px":s+n+"px"})})),e.effects.removeWrapper(o),i()}})},e.effects.effect.scale=function(t,i){var s=e(this),n=e.extend(!0,{},t),a=e.effects.setMode(s,t.mode||"effect"),o=parseInt(t.percent,10)||(0===parseInt(t.percent,10)?0:"hide"===a?0:100),r=t.direction||"both",h=t.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},u={y:"horizontal"!==r?o/100:1,x:"vertical"!==r?o/100:1};n.effect="size",n.queue=!1,n.complete=i,"effect"!==a&&(n.origin=h||["middle","center"],n.restore=!0),n.from=t.from||("show"===a?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*u.y,width:l.width*u.x,outerHeight:l.outerHeight*u.y,outerWidth:l.outerWidth*u.x},n.fade&&("show"===a&&(n.from.opacity=0,n.to.opacity=1),"hide"===a&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},e.effects.effect.puff=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"hide"),a="hide"===n,o=parseInt(t.percent,10)||150,r=o/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:n,complete:i,percent:a?o:100,from:a?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(t)},e.effects.effect.pulsate=function(t,i){var s,n=e(this),a=e.effects.setMode(n,t.mode||"show"),o="show"===a,r="hide"===a,h=o||"hide"===a,l=2*(t.times||5)+(h?1:0),u=t.duration/l,d=0,c=n.queue(),p=c.length;for((o||!n.is(":visible"))&&(n.css("opacity",0).show(),d=1),s=1;l>s;s++)n.animate({opacity:d},u,t.easing),d=1-d;n.animate({opacity:d},u,t.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&c.splice.apply(c,[1,0].concat(c.splice(p,l+1))),n.dequeue()},e.effects.effect.shake=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","height","width"],o=e.effects.setMode(n,t.mode||"effect"),r=t.direction||"left",h=t.distance||20,l=t.times||3,u=2*l+1,d=Math.round(t.duration/u),c="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},m={},g={},v=n.queue(),y=v.length;for(e.effects.save(n,a),n.show(),e.effects.createWrapper(n),f[c]=(p?"-=":"+=")+h,m[c]=(p?"+=":"-=")+2*h,g[c]=(p?"-=":"+=")+2*h,n.animate(f,d,t.easing),s=1;l>s;s++)n.animate(m,d,t.easing).animate(g,d,t.easing);n.animate(m,d,t.easing).animate(f,d/2,t.easing).queue(function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}),y>1&&v.splice.apply(v,[1,0].concat(v.splice(y,u+1))),n.dequeue()},e.effects.effect.slide=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","width","height"],o=e.effects.setMode(n,t.mode||"show"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h,d={};e.effects.save(n,a),n.show(),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(n).css({overflow:"hidden"}),r&&n.css(l,u?isNaN(s)?"-"+s:-s:s),d[l]=(r?u?"+=":"-=":u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.transfer=function(t,i){var s=e(this),n=e(t.to),a="fixed"===n.css("position"),o=e("body"),r=a?o.scrollTop():0,h=a?o.scrollLeft():0,l=n.offset(),u={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},d=s.offset(),c=e("<div class='ui-effects-transfer'></div>").appendTo(document.body).addClass(t.className).css({top:d.top-r,left:d.left-h,height:s.innerHeight(),width:s.innerWidth(),position:a?"fixed":"absolute"}).animate(u,t.duration,t.easing,function(){c.remove(),i()})}}); \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery/jquery.min.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery/jquery.min.js
new file mode 100644
index 0000000..9f7b3d3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/settings/third-party/jquery/jquery.min.js
@@ -0,0 +1,9190 @@
+/*!
+ * jQuery JavaScript Library v2.1.1
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-05-01T17:11Z
+ */
+
+(function( global, factory ) {
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+ // For CommonJS and CommonJS-like environments where a proper window is present,
+ // execute the factory and get jQuery
+ // For environments that do not inherently posses a window with a document
+ // (such as Node.js), expose a jQuery-making factory as module.exports
+ // This accentuates the need for the creation of a real window
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//
+
+var arr = [];
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
+
+
+
+var
+ // Use the correct document accordingly with window argument (sandbox)
+ document = window.document,
+
+ version = "2.1.1",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android<4.1
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ };
+
+jQuery.fn = jQuery.prototype = {
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // Start with an empty selector
+ selector: "",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num != null ?
+
+ // Return just the one element from the set
+ ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+
+ // Return all the elements in a clean array
+ slice.call( this );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+ target = {};
+ }
+
+ // extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+ // Only deal with non-null/undefined values
+ if ( (options = arguments[ i ]) != null ) {
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend({
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ // See test/unit/core.js for details concerning isFunction.
+ // Since version 1.3, DOM methods and functions like alert
+ // aren't supported. They return false on IE (#2968).
+ isFunction: function( obj ) {
+ return jQuery.type(obj) === "function";
+ },
+
+ isArray: Array.isArray,
+
+ isWindow: function( obj ) {
+ return obj != null && obj === obj.window;
+ },
+
+ isNumeric: function( obj ) {
+ // parseFloat NaNs numeric-cast false positives (null|true|false|"")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0;
+ },
+
+ isPlainObject: function( obj ) {
+ // Not plain objects:
+ // - Any object or value whose internal [[Class]] property is not "[object Object]"
+ // - DOM nodes
+ // - window
+ if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.constructor &&
+ !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
+ return false;
+ }
+
+ // If the function hasn't returned already, we're confident that
+ // |obj| is a plain object, created by {} or constructed with new Object
+ return true;
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+ // Support: Android < 4.0, iOS < 6 (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call(obj) ] || "object" :
+ typeof obj;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function( code ) {
+ var script,
+ indirect = eval;
+
+ code = jQuery.trim( code );
+
+ if ( code ) {
+ // If the code includes a valid, prologue position
+ // strict mode pragma, execute code by injecting a
+ // script tag into the document.
+ if ( code.indexOf("use strict") === 1 ) {
+ script = document.createElement("script");
+ script.text = code;
+ document.head.appendChild( script ).parentNode.removeChild( script );
+ } else {
+ // Otherwise, avoid the DOM node creation, insertion
+ // and removal by using an indirect global eval
+ indirect( code );
+ }
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ // args is for internal usage only
+ each: function( obj, callback, args ) {
+ var value,
+ i = 0,
+ length = obj.length,
+ isArray = isArraylike( obj );
+
+ if ( args ) {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android<4.1
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArraylike( Object(arr) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var value,
+ i = 0,
+ length = elems.length,
+ isArray = isArraylike( elems ),
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ now: Date.now,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+ var length = obj.length,
+ type = jQuery.type( obj );
+
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.nodeType === 1 && length ) {
+ return true;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v1.10.19
+ * http://sizzlejs.com/
+ *
+ * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-04-18
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + -(new Date()),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // General-purpose constants
+ strundefined = typeof undefined,
+ MAX_NEGATIVE = 1 << 31,
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf if we can't use a native one
+ indexOf = arr.indexOf || function( elem ) {
+ var i = 0,
+ len = this.length;
+ for ( ; i < len; i++ ) {
+ if ( this[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+ // http://www.w3.org/TR/css3-syntax/#characters
+ characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+ // Loosely modeled on CSS identifier characters
+ // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+ // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = characterEncoding.replace( "w", "w#" ),
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + characterEncoding + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+ "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+ "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+ rescape = /'|\\/g,
+
+ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ };
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var match, elem, m, nodeType,
+ // QSA vars
+ i, groups, old, nid, newContext, newSelector;
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+
+ context = context || document;
+ results = results || [];
+
+ if ( !selector || typeof selector !== "string" ) {
+ return results;
+ }
+
+ if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+ return [];
+ }
+
+ if ( documentIsHTML && !seed ) {
+
+ // Shortcuts
+ if ( (match = rquickExpr.exec( selector )) ) {
+ // Speed-up: Sizzle("#ID")
+ if ( (m = match[1]) ) {
+ if ( nodeType === 9 ) {
+ elem = context.getElementById( m );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document (jQuery #6963)
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE, Opera, and Webkit return items
+ // by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+ } else {
+ // Context is not a document
+ if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+ contains( context, elem ) && elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Speed-up: Sizzle("TAG")
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Speed-up: Sizzle(".CLASS")
+ } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // QSA path
+ if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+ nid = old = expando;
+ newContext = context;
+ newSelector = nodeType === 9 && selector;
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+ groups = tokenize( selector );
+
+ if ( (old = context.getAttribute("id")) ) {
+ nid = old.replace( rescape, "\\$&" );
+ } else {
+ context.setAttribute( "id", nid );
+ }
+ nid = "[id='" + nid + "'] ";
+
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = nid + toSelector( groups[i] );
+ }
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
+ newSelector = groups.join(",");
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch(qsaError) {
+ } finally {
+ if ( !old ) {
+ context.removeAttribute("id");
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+ var div = document.createElement("div");
+
+ try {
+ return !!fn( div );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( div.parentNode ) {
+ div.parentNode.removeChild( div );
+ }
+ // release memory in IE
+ div = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = attrs.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ ( ~b.sourceIndex || MAX_NEGATIVE ) -
+ ( ~a.sourceIndex || MAX_NEGATIVE );
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== strundefined && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare,
+ doc = node ? node.ownerDocument || node : preferredDoc,
+ parent = doc.defaultView;
+
+ // If no document and documentElement is available, return
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Set our document
+ document = doc;
+ docElem = doc.documentElement;
+
+ // Support tests
+ documentIsHTML = !isXML( doc );
+
+ // Support: IE>8
+ // If iframe document is assigned to "document" variable and if iframe has been reloaded,
+ // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+ // IE6-8 do not support the defaultView property so parent will be undefined
+ if ( parent && parent !== parent.top ) {
+ // IE11 does not have attachEvent, so all must suffer
+ if ( parent.addEventListener ) {
+ parent.addEventListener( "unload", function() {
+ setDocument();
+ }, false );
+ } else if ( parent.attachEvent ) {
+ parent.attachEvent( "onunload", function() {
+ setDocument();
+ });
+ }
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+ support.attributes = assert(function( div ) {
+ div.className = "i";
+ return !div.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( div ) {
+ div.appendChild( doc.createComment("") );
+ return !div.getElementsByTagName("*").length;
+ });
+
+ // Check if getElementsByClassName can be trusted
+ support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {
+ div.innerHTML = "<div class='a'></div><div class='a i'></div>";
+
+ // Support: Safari<4
+ // Catch class over-caching
+ div.firstChild.className = "i";
+ // Support: Opera<10
+ // Catch gEBCN failure to find non-leading classes
+ return div.getElementsByClassName("i").length === 2;
+ });
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( div ) {
+ docElem.appendChild( div ).id = expando;
+ return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+ });
+
+ // ID find and filter
+ if ( support.getById ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+ var m = context.getElementById( id );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [ m ] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ } else {
+ // Support: IE6/7
+ // getElementById is not reliable as a find shortcut
+ delete Expr.find["ID"];
+
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== strundefined ) {
+ return context.getElementsByTagName( tag );
+ }
+ } :
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See http://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( div ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // http://bugs.jquery.com/ticket/12359
+ div.innerHTML = "<select msallowclip=''><option selected=''></option></select>";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( div.querySelectorAll("[msallowclip^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !div.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+ });
+
+ assert(function( div ) {
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = doc.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ div.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( div.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":enabled").length ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( div ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( div, "div" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( div, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully does not implement inclusive descendent
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === doc ? -1 :
+ b === doc ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return doc;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch(e) {}
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, outerCache, node, diff, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+ // Seek `elem` from a previously-cached index
+ outerCache = parent[ expando ] || (parent[ expando ] = {});
+ cache = outerCache[ type ] || [];
+ nodeIndex = cache[0] === dirruns && cache[1];
+ diff = cache[0] === dirruns && cache[2];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ // Use previously-cached element index if available
+ } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+ diff = cache[1];
+
+ // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ } else {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf.call( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": function( elem ) {
+ return elem.disabled === false;
+ },
+
+ "disabled": function( elem ) {
+ return elem.disabled === true;
+ },
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ checkNonElements = base && dir === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+ if ( (oldCache = outerCache[ dir ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ outerCache[ dir ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf.call( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context !== document && context;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context, xml ) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // Apply set filters to unmatched elements
+ matchedCount += i;
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is no seed and only one group
+ if ( match.length === 1 ) {
+
+ // Take a shortcut and set the context if the root selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome<14
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+ // Should return 1, but returns 4 (following)
+ return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+ div.innerHTML = "<a href='#'></a>";
+ return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+ div.innerHTML = "<input/>";
+ div.firstChild.setAttribute( "value", "" );
+ return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+ return div.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ /* jshint -W018 */
+ return !!qualifier.call( elem, i, elem ) !== not;
+ });
+
+ }
+
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ });
+
+ }
+
+ if ( typeof qualifier === "string" ) {
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ qualifier = jQuery.filter( qualifier, elements );
+ }
+
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
+ });
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 && elem.nodeType === 1 ?
+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ }));
+};
+
+jQuery.fn.extend({
+ find: function( selector ) {
+ var i,
+ len = this.length,
+ ret = [],
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter(function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ }) );
+ }
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+ ret.selector = this.selector ? this.selector + " " + selector : selector;
+ return ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], false) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], true) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+});
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ init = jQuery.fn.init = function( selector, context ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ context = context instanceof jQuery ? context[0] : context;
+
+ // scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[1],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[2] );
+
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if ( elem && elem.parentNode ) {
+ // Inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || rootjQuery ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return typeof rootjQuery.ready !== "undefined" ?
+ rootjQuery.ready( selector ) :
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+ // methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.extend({
+ dir: function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+ },
+
+ sibling: function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+ }
+});
+
+jQuery.fn.extend({
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter(function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[i] ) ) {
+ return true;
+ }
+ }
+ });
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( ; i < l; i++ ) {
+ for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && (pos ?
+ pos.index(cur) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector(cur, selectors)) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
+ },
+
+ // Determine the position of an element within
+ // the matched set of elements
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.unique(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter(selector)
+ );
+ }
+});
+
+function sibling( cur, dir ) {
+ while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each({
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return jQuery.dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return jQuery.dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return jQuery.dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return jQuery.sibling( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.unique( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+});
+var rnotwhite = (/\S+/g);
+
+
+
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+ var object = optionsCache[ options ] = {};
+ jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ });
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ ( optionsCache[ options ] || createOptions( options ) ) :
+ jQuery.extend( {}, options );
+
+ var // Last fire value (for non-forgettable lists)
+ memory,
+ // Flag to know if list was already fired
+ fired,
+ // Flag to know if list is currently firing
+ firing,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
+ // End of the loop when firing
+ firingLength,
+ // Index of currently firing callback (modified by remove if needed)
+ firingIndex,
+ // Actual callback list
+ list = [],
+ // Stack of fire calls for repeatable lists
+ stack = !options.once && [],
+ // Fire callbacks
+ fire = function( data ) {
+ memory = options.memory && data;
+ fired = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ firing = true;
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+ if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+ memory = false; // To prevent further calls using add
+ break;
+ }
+ }
+ firing = false;
+ if ( list ) {
+ if ( stack ) {
+ if ( stack.length ) {
+ fire( stack.shift() );
+ }
+ } else if ( memory ) {
+ list = [];
+ } else {
+ self.disable();
+ }
+ }
+ },
+ // Actual Callbacks object
+ self = {
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+ // First, we save the current length
+ var start = list.length;
+ (function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ var type = jQuery.type( arg );
+ if ( type === "function" ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && type !== "string" ) {
+ // Inspect recursively
+ add( arg );
+ }
+ });
+ })( arguments );
+ // Do we need to add the callbacks to the
+ // current firing batch?
+ if ( firing ) {
+ firingLength = list.length;
+ // With memory, if we're not firing then
+ // we should call right away
+ } else if ( memory ) {
+ firingStart = start;
+ fire( memory );
+ }
+ }
+ return this;
+ },
+ // Remove a callback from the list
+ remove: function() {
+ if ( list ) {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+ // Handle firing indexes
+ if ( firing ) {
+ if ( index <= firingLength ) {
+ firingLength--;
+ }
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ }
+ });
+ }
+ return this;
+ },
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+ },
+ // Remove all callbacks from the list
+ empty: function() {
+ list = [];
+ firingLength = 0;
+ return this;
+ },
+ // Have the list do nothing anymore
+ disable: function() {
+ list = stack = memory = undefined;
+ return this;
+ },
+ // Is it disabled?
+ disabled: function() {
+ return !list;
+ },
+ // Lock the list in its current state
+ lock: function() {
+ stack = undefined;
+ if ( !memory ) {
+ self.disable();
+ }
+ return this;
+ },
+ // Is it locked?
+ locked: function() {
+ return !stack;
+ },
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( list && ( !fired || stack ) ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ if ( firing ) {
+ stack.push( args );
+ } else {
+ fire( args );
+ }
+ }
+ return this;
+ },
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+jQuery.extend({
+
+ Deferred: function( func ) {
+ var tuples = [
+ // action, add listener, listener list, final state
+ [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks("memory") ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[ tuple[1] ](function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .done( newDefer.resolve )
+ .fail( newDefer.reject )
+ .progress( newDefer.notify );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+ }
+ });
+ });
+ fns = null;
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 3 ];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[1] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(function() {
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[0] ] = function() {
+ deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+ return this;
+ };
+ deferred[ tuple[0] + "With" ] = list.fireWith;
+ });
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
+ resolveValues = slice.call( arguments ),
+ length = resolveValues.length,
+
+ // the count of uncompleted subordinates
+ remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+ // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+ // Update function for both resolve and progress values
+ updateFunc = function( i, contexts, values ) {
+ return function( value ) {
+ contexts[ i ] = this;
+ values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( values === progressValues ) {
+ deferred.notifyWith( contexts, values );
+ } else if ( !( --remaining ) ) {
+ deferred.resolveWith( contexts, values );
+ }
+ };
+ },
+
+ progressValues, progressContexts, resolveContexts;
+
+ // add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+ resolveValues[ i ].promise()
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject )
+ .progress( updateFunc( i, progressContexts, progressValues ) );
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // if we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
+ }
+
+ return deferred.promise();
+ }
+});
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+ // Add the callback
+ jQuery.ready.promise().done( fn );
+
+ return this;
+};
+
+jQuery.extend({
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.triggerHandler ) {
+ jQuery( document ).triggerHandler( "ready" );
+ jQuery( document ).off( "ready" );
+ }
+ }
+});
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed, false );
+ window.removeEventListener( "load", completed, false );
+ jQuery.ready();
+}
+
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
+
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called after the browser event has already occurred.
+ // we once tried to use readyState "interactive" here, but it caused issues like the one
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ setTimeout( jQuery.ready );
+
+ } else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed, false );
+ }
+ }
+ return readyList.promise( obj );
+};
+
+// Kick off the DOM ready check even if the user does not
+jQuery.ready.promise();
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ len ? fn( elems[0], key ) : emptyGet;
+};
+
+
+/**
+ * Determines whether an object can have data
+ */
+jQuery.acceptData = function( owner ) {
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ /* jshint -W018 */
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+function Data() {
+ // Support: Android < 4,
+ // Old WebKit does not have Object.preventExtensions/freeze method,
+ // return new empty object instead with no [[set]] accessor
+ Object.defineProperty( this.cache = {}, 0, {
+ get: function() {
+ return {};
+ }
+ });
+
+ this.expando = jQuery.expando + Math.random();
+}
+
+Data.uid = 1;
+Data.accepts = jQuery.acceptData;
+
+Data.prototype = {
+ key: function( owner ) {
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return the key for a frozen object.
+ if ( !Data.accepts( owner ) ) {
+ return 0;
+ }
+
+ var descriptor = {},
+ // Check if the owner object already has a cache key
+ unlock = owner[ this.expando ];
+
+ // If not, create one
+ if ( !unlock ) {
+ unlock = Data.uid++;
+
+ // Secure it in a non-enumerable, non-writable property
+ try {
+ descriptor[ this.expando ] = { value: unlock };
+ Object.defineProperties( owner, descriptor );
+
+ // Support: Android < 4
+ // Fallback to a less secure definition
+ } catch ( e ) {
+ descriptor[ this.expando ] = unlock;
+ jQuery.extend( owner, descriptor );
+ }
+ }
+
+ // Ensure the cache object
+ if ( !this.cache[ unlock ] ) {
+ this.cache[ unlock ] = {};
+ }
+
+ return unlock;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ // There may be an unlock assigned to this node,
+ // if there is no entry for this "owner", create one inline
+ // and set the unlock as though an owner entry had always existed
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ // Handle: [ owner, key, value ] args
+ if ( typeof data === "string" ) {
+ cache[ data ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+ // Fresh assignments by object are shallow copied
+ if ( jQuery.isEmptyObject( cache ) ) {
+ jQuery.extend( this.cache[ unlock ], data );
+ // Otherwise, copy the properties one-by-one to the cache object
+ } else {
+ for ( prop in data ) {
+ cache[ prop ] = data[ prop ];
+ }
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ // Either a valid cache is found, or will be created.
+ // New caches will be created and the unlock returned,
+ // allowing direct access to the newly created
+ // empty data object. A valid owner object must be provided.
+ var cache = this.cache[ this.key( owner ) ];
+
+ return key === undefined ?
+ cache : cache[ key ];
+ },
+ access: function( owner, key, value ) {
+ var stored;
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ((key && typeof key === "string") && value === undefined) ) {
+
+ stored = this.get( owner, key );
+
+ return stored !== undefined ?
+ stored : this.get( owner, jQuery.camelCase(key) );
+ }
+
+ // [*]When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i, name, camel,
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ if ( key === undefined ) {
+ this.cache[ unlock ] = {};
+
+ } else {
+ // Support array or space separated string of keys
+ if ( jQuery.isArray( key ) ) {
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = key.concat( key.map( jQuery.camelCase ) );
+ } else {
+ camel = jQuery.camelCase( key );
+ // Try the string as a key before any manipulation
+ if ( key in cache ) {
+ name = [ key, camel ];
+ } else {
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ name = camel;
+ name = name in cache ?
+ [ name ] : ( name.match( rnotwhite ) || [] );
+ }
+ }
+
+ i = name.length;
+ while ( i-- ) {
+ delete cache[ name[ i ] ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ return !jQuery.isEmptyObject(
+ this.cache[ owner[ this.expando ] ] || {}
+ );
+ },
+ discard: function( owner ) {
+ if ( owner[ this.expando ] ) {
+ delete this.cache[ owner[ this.expando ] ];
+ }
+ }
+};
+var data_priv = new Data();
+
+var data_user = new Data();
+
+
+
+/*
+ Implementation Summary
+
+ 1. Enforce API surface and semantic compatibility with 1.9.x branch
+ 2. Improve the module's maintainability by reducing the storage
+ paths to a single mechanism.
+ 3. Use the same single mechanism to support "private" and "user" data.
+ 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+ 5. Avoid exposing implementation details on user objects (eg. expando properties)
+ 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+*/
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /([A-Z])/g;
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ data_user.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend({
+ hasData: function( elem ) {
+ return data_user.hasData( elem ) || data_priv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return data_user.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ data_user.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to data_priv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return data_priv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ data_priv.remove( elem, name );
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = data_user.get( elem );
+
+ if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE11+
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.slice(5) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ data_priv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each(function() {
+ data_user.set( this, key );
+ });
+ }
+
+ return access( this, function( value ) {
+ var data,
+ camelKey = jQuery.camelCase( key );
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+ // Attempt to get data from the cache
+ // with the key as-is
+ data = data_user.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to get data from the cache
+ // with the key camelized
+ data = data_user.get( elem, camelKey );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, camelKey, undefined );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ this.each(function() {
+ // First, attempt to store a copy or reference of any
+ // data that might've been store with a camelCased key.
+ var data = data_user.get( this, camelKey );
+
+ // For HTML5 data-* attribute interop, we have to
+ // store property names with dashes in a camelCase form.
+ // This might not apply to all properties...*
+ data_user.set( this, camelKey, value );
+
+ // *... In the case of properties that might _actually_
+ // have dashes, we need to also store a copy of that
+ // unchanged property.
+ if ( key.indexOf("-") !== -1 && data !== undefined ) {
+ data_user.set( this, key, value );
+ }
+ });
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each(function() {
+ data_user.remove( this, key );
+ });
+ }
+});
+
+
+jQuery.extend({
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = data_priv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray( data ) ) {
+ queue = data_priv.access( elem, type, jQuery.makeArray(data) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // not intended for public consumption - generates a queueHooks object, or returns the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return data_priv.get( elem, key ) || data_priv.access( elem, key, {
+ empty: jQuery.Callbacks("once memory").add(function() {
+ data_priv.remove( elem, [ type + "queue", key ] );
+ })
+ });
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[0], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each(function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ dequeue: function( type ) {
+ return this.each(function() {
+ jQuery.dequeue( this, type );
+ });
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = data_priv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+});
+var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHidden = function( elem, el ) {
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+ return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+ };
+
+var rcheckableType = (/^(?:checkbox|radio)$/i);
+
+
+
+(function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // #11217 - WebKit loses check when the name is after the checked attribute
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` need .setAttribute for WWA
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
+ // old WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ // Support: IE9-IE11+
+ div.innerHTML = "<textarea>x</textarea>";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+})();
+var strundefined = typeof undefined;
+
+
+
+support.focusinBubbles = "onfocusin" in window;
+
+
+var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.get( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !(events = elemData.events) ) {
+ events = elemData.events = {};
+ }
+ if ( !(eventHandle = elemData.handle) ) {
+ eventHandle = elemData.handle = function( e ) {
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend({
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join(".")
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !(handlers = events[ type ]) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.hasData( elem ) && data_priv.get( elem );
+
+ if ( !elemData || !(events = elemData.events) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ delete elemData.handle;
+ data_priv.remove( elem, "events" );
+ }
+ },
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+
+ var i, cur, tmp, bubbleType, ontype, handle, special,
+ eventPath = [ elem || document ],
+ type = hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+ cur = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf(".") >= 0 ) {
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf(":") < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join(".");
+ event.namespace_re = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === (elem.ownerDocument || document) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
+ event.result = handle.apply( cur, data );
+ if ( event.result === false ) {
+ event.preventDefault();
+ }
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+ if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
+ jQuery.acceptData( elem ) ) {
+
+ // Call a native DOM method on the target with the same name name as the event.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ ontype ];
+
+ if ( tmp ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+ elem[ type ]();
+ jQuery.event.triggered = undefined;
+
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event );
+
+ var i, j, ret, matched, handleObj,
+ handlerQueue = [],
+ args = slice.call( arguments ),
+ handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[0] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or
+ // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+ .apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( (event.result = ret) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, matches, sel, handleObj,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ // Black-hole SVG <use> instance trees (#13180)
+ // Avoid non-left-click bubbling in Firefox (#3861)
+ if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.disabled !== true || event.type !== "click" ) {
+ matches = [];
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matches[ sel ] === undefined ) {
+ matches[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) >= 0 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matches[ sel ] ) {
+ matches.push( handleObj );
+ }
+ }
+ if ( matches.length ) {
+ handlerQueue.push({ elem: cur, handlers: matches });
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+ }
+
+ return handlerQueue;
+ },
+
+ // Includes some event props shared by KeyEvent and MouseEvent
+ props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+ fixHooks: {},
+
+ keyHooks: {
+ props: "char charCode key keyCode".split(" "),
+ filter: function( event, original ) {
+
+ // Add which for key events
+ if ( event.which == null ) {
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
+ }
+
+ return event;
+ }
+ },
+
+ mouseHooks: {
+ props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+ filter: function( event, original ) {
+ var eventDoc, doc, body,
+ button = original.button;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && original.clientX != null ) {
+ eventDoc = event.target.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+ event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && button !== undefined ) {
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+ }
+
+ return event;
+ }
+ },
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop, copy,
+ type = event.type,
+ originalEvent = event,
+ fixHook = this.fixHooks[ type ];
+
+ if ( !fixHook ) {
+ this.fixHooks[ type ] = fixHook =
+ rmouseEvent.test( type ) ? this.mouseHooks :
+ rkeyEvent.test( type ) ? this.keyHooks :
+ {};
+ }
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+ event = new jQuery.Event( originalEvent );
+
+ i = copy.length;
+ while ( i-- ) {
+ prop = copy[ i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Support: Cordova 2.5 (WebKit) (#13255)
+ // All events should have a target; Cordova deviceready doesn't
+ if ( !event.target ) {
+ event.target = document;
+ }
+
+ // Support: Safari 6.0+, Chrome < 28
+ // Target should not be a text node (#504, #13143)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+ },
+
+ special: {
+ load: {
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ focus: {
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== safeActiveElement() && this.focus ) {
+ this.focus();
+ return false;
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function() {
+ if ( this === safeActiveElement() && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+ click: {
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
+ this.click();
+ return false;
+ }
+ },
+
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function( event ) {
+ return jQuery.nodeName( event.target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ },
+
+ simulate: function( type, elem, event, bubble ) {
+ // Piggyback on a donor event to simulate a different one.
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
+ // simulated event prevents default then we do the same on the donor.
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ {
+ type: type,
+ isSimulated: true,
+ originalEvent: {}
+ }
+ );
+ if ( bubble ) {
+ jQuery.event.trigger( e, null, elem );
+ } else {
+ jQuery.event.dispatch.call( elem, e );
+ }
+ if ( e.isDefaultPrevented() ) {
+ event.preventDefault();
+ }
+ }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle, false );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+ // Allow instantiation without the 'new' keyword
+ if ( !(this instanceof jQuery.Event) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+ // Support: Android < 4.0
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && e.preventDefault ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && e.stopPropagation ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && e.stopImmediatePropagation ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// Support: Chrome 15+
+jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mousenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+});
+
+// Create "bubbling" focus and blur events
+// Support: Firefox, Chrome, Safari
+if ( !support.focusinBubbles ) {
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+ // Attach a single capturing handler on the document while someone wants focusin/focusout
+ var handler = function( event ) {
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+ };
+
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix );
+
+ if ( !attaches ) {
+ doc.addEventListener( orig, handler, true );
+ }
+ data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
+ },
+ teardown: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix ) - 1;
+
+ if ( !attaches ) {
+ doc.removeEventListener( orig, handler, true );
+ data_priv.remove( doc, fix );
+
+ } else {
+ data_priv.access( doc, fix, attaches );
+ }
+ }
+ };
+ });
+}
+
+jQuery.fn.extend({
+
+ on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ this.on( type, selector, data, types[ type ], one );
+ }
+ return this;
+ }
+
+ if ( data == null && fn == null ) {
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return this;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return this.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ });
+ },
+ one: function( types, selector, data, fn ) {
+ return this.on( types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each(function() {
+ jQuery.event.remove( this, types, fn, selector );
+ });
+ },
+
+ trigger: function( type, data ) {
+ return this.each(function() {
+ jQuery.event.trigger( type, data, this );
+ });
+ },
+ triggerHandler: function( type, data ) {
+ var elem = this[0];
+ if ( elem ) {
+ return jQuery.event.trigger( type, data, elem, true );
+ }
+ }
+});
+
+
+var
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+ rtagName = /<([\w:]+)/,
+ rhtml = /<|&#?\w+;/,
+ rnoInnerhtml = /<(?:script|style|link)/i,
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rscriptType = /^$|\/(?:java|ecma)script/i,
+ rscriptTypeMasked = /^true\/(.*)/,
+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+ // We have to close these tags to support XHTML (#13200)
+ wrapMap = {
+
+ // Support: IE 9
+ option: [ 1, "<select multiple='multiple'>", "</select>" ],
+
+ thead: [ 1, "<table>", "</table>" ],
+ col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
+ tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+ _default: [ 0, "", "" ]
+ };
+
+// Support: IE 9
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// Support: 1.x compatibility
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+ return jQuery.nodeName( elem, "table" ) &&
+ jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
+
+ elem.getElementsByTagName("tbody")[0] ||
+ elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+ elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+ elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
+ return elem;
+}
+function restoreScript( elem ) {
+ var match = rscriptTypeMasked.exec( elem.type );
+
+ if ( match ) {
+ elem.type = match[ 1 ];
+ } else {
+ elem.removeAttribute("type");
+ }
+
+ return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ data_priv.set(
+ elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+function cloneCopyEvent( src, dest ) {
+ var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+ if ( dest.nodeType !== 1 ) {
+ return;
+ }
+
+ // 1. Copy private data: events, handlers, etc.
+ if ( data_priv.hasData( src ) ) {
+ pdataOld = data_priv.access( src );
+ pdataCur = data_priv.set( dest, pdataOld );
+ events = pdataOld.events;
+
+ if ( events ) {
+ delete pdataCur.handle;
+ pdataCur.events = {};
+
+ for ( type in events ) {
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type, events[ type ][ i ] );
+ }
+ }
+ }
+ }
+
+ // 2. Copy user data
+ if ( data_user.hasData( src ) ) {
+ udataOld = data_user.access( src );
+ udataCur = jQuery.extend( {}, udataOld );
+
+ data_user.set( dest, udataCur );
+ }
+}
+
+function getAll( context, tag ) {
+ var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
+ context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
+ [];
+
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], ret ) :
+ ret;
+}
+
+// Support: IE >= 9
+function fixInput( src, dest ) {
+ var nodeName = dest.nodeName.toLowerCase();
+
+ // Fails to persist the checked state of a cloned checkbox or radio button.
+ if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+ dest.checked = src.checked;
+
+ // Fails to return the selected option to the default selected state when cloning options
+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
+ dest.defaultValue = src.defaultValue;
+ }
+}
+
+jQuery.extend({
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var i, l, srcElements, destElements,
+ clone = elem.cloneNode( true ),
+ inPage = jQuery.contains( elem.ownerDocument, elem );
+
+ // Support: IE >= 9
+ // Fix Cloning issues
+ if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+ !jQuery.isXMLDoc( elem ) ) {
+
+ // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+ destElements = getAll( clone );
+ srcElements = getAll( elem );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ fixInput( srcElements[ i ], destElements[ i ] );
+ }
+ }
+
+ // Copy the events from the original to the clone
+ if ( dataAndEvents ) {
+ if ( deepDataAndEvents ) {
+ srcElements = srcElements || getAll( elem );
+ destElements = destElements || getAll( clone );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+ }
+ } else {
+ cloneCopyEvent( elem, clone );
+ }
+ }
+
+ // Preserve script evaluation history
+ destElements = getAll( clone, "script" );
+ if ( destElements.length > 0 ) {
+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+ }
+
+ // Return the cloned set
+ return clone;
+ },
+
+ buildFragment: function( elems, context, scripts, selection ) {
+ var elem, tmp, tag, wrap, contains, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement("div") );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Fixes #12346
+ // Support: Webkit, IE
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( (elem = nodes[ i++ ]) ) {
+
+ // #4087 - If origin and destination elements are the same, and this is
+ // that element, do not do anything
+ if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( (elem = tmp[ j++ ]) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+ },
+
+ cleanData: function( elems ) {
+ var data, elem, type, key,
+ special = jQuery.event.special,
+ i = 0;
+
+ for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
+ if ( jQuery.acceptData( elem ) ) {
+ key = elem[ data_priv.expando ];
+
+ if ( key && (data = data_priv.cache[ key ]) ) {
+ if ( data.events ) {
+ for ( type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent( elem, type, data.handle );
+ }
+ }
+ }
+ if ( data_priv.cache[ key ] ) {
+ // Discard any remaining `private` data
+ delete data_priv.cache[ key ];
+ }
+ }
+ }
+ // Discard any remaining `user` data
+ delete data_user.cache[ elem[ data_user.expando ] ];
+ }
+ }
+});
+
+jQuery.fn.extend({
+ text: function( value ) {
+ return access( this, function( value ) {
+ return value === undefined ?
+ jQuery.text( this ) :
+ this.empty().each(function() {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ this.textContent = value;
+ }
+ });
+ }, null, value, arguments.length );
+ },
+
+ append: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.appendChild( elem );
+ }
+ });
+ },
+
+ prepend: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.insertBefore( elem, target.firstChild );
+ }
+ });
+ },
+
+ before: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this );
+ }
+ });
+ },
+
+ after: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ }
+ });
+ },
+
+ remove: function( selector, keepData /* Internal Use Only */ ) {
+ var elem,
+ elems = selector ? jQuery.filter( selector, this ) : this,
+ i = 0;
+
+ for ( ; (elem = elems[i]) != null; i++ ) {
+ if ( !keepData && elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem ) );
+ }
+
+ if ( elem.parentNode ) {
+ if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+ setGlobalEval( getAll( elem, "script" ) );
+ }
+ elem.parentNode.removeChild( elem );
+ }
+ }
+
+ return this;
+ },
+
+ empty: function() {
+ var elem,
+ i = 0;
+
+ for ( ; (elem = this[i]) != null; i++ ) {
+ if ( elem.nodeType === 1 ) {
+
+ // Prevent memory leaks
+ jQuery.cleanData( getAll( elem, false ) );
+
+ // Remove any remaining nodes
+ elem.textContent = "";
+ }
+ }
+
+ return this;
+ },
+
+ clone: function( dataAndEvents, deepDataAndEvents ) {
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map(function() {
+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+ });
+ },
+
+ html: function( value ) {
+ return access( this, function( value ) {
+ var elem = this[ 0 ] || {},
+ i = 0,
+ l = this.length;
+
+ if ( value === undefined && elem.nodeType === 1 ) {
+ return elem.innerHTML;
+ }
+
+ // See if we can take a shortcut and just use innerHTML
+ if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+ !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+ value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+ try {
+ for ( ; i < l; i++ ) {
+ elem = this[ i ] || {};
+
+ // Remove element nodes and prevent memory leaks
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem, false ) );
+ elem.innerHTML = value;
+ }
+ }
+
+ elem = 0;
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch( e ) {}
+ }
+
+ if ( elem ) {
+ this.empty().append( value );
+ }
+ }, null, value, arguments.length );
+ },
+
+ replaceWith: function() {
+ var arg = arguments[ 0 ];
+
+ // Make the changes, replacing each context element with the new content
+ this.domManip( arguments, function( elem ) {
+ arg = this.parentNode;
+
+ jQuery.cleanData( getAll( this ) );
+
+ if ( arg ) {
+ arg.replaceChild( elem, this );
+ }
+ });
+
+ // Force removal if there was no new content (e.g., from empty arguments)
+ return arg && (arg.length || arg.nodeType) ? this : this.remove();
+ },
+
+ detach: function( selector ) {
+ return this.remove( selector, true );
+ },
+
+ domManip: function( args, callback ) {
+
+ // Flatten any nested arrays
+ args = concat.apply( [], args );
+
+ var fragment, first, scripts, hasScripts, node, doc,
+ i = 0,
+ l = this.length,
+ set = this,
+ iNoClone = l - 1,
+ value = args[ 0 ],
+ isFunction = jQuery.isFunction( value );
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( isFunction ||
+ ( l > 1 && typeof value === "string" &&
+ !support.checkClone && rchecked.test( value ) ) ) {
+ return this.each(function( index ) {
+ var self = set.eq( index );
+ if ( isFunction ) {
+ args[ 0 ] = value.call( this, index, self.html() );
+ }
+ self.domManip( args, callback );
+ });
+ }
+
+ if ( l ) {
+ fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
+ first = fragment.firstChild;
+
+ if ( fragment.childNodes.length === 1 ) {
+ fragment = first;
+ }
+
+ if ( first ) {
+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+ hasScripts = scripts.length;
+
+ // Use the original fragment for the last item instead of the first because it can end up
+ // being emptied incorrectly in certain situations (#8070).
+ for ( ; i < l; i++ ) {
+ node = fragment;
+
+ if ( i !== iNoClone ) {
+ node = jQuery.clone( node, true, true );
+
+ // Keep references to cloned scripts for later restoration
+ if ( hasScripts ) {
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( scripts, getAll( node, "script" ) );
+ }
+ }
+
+ callback.call( this[ i ], node, i );
+ }
+
+ if ( hasScripts ) {
+ doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+ // Reenable scripts
+ jQuery.map( scripts, restoreScript );
+
+ // Evaluate executable scripts on first document insertion
+ for ( i = 0; i < hasScripts; i++ ) {
+ node = scripts[ i ];
+ if ( rscriptType.test( node.type || "" ) &&
+ !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+ if ( node.src ) {
+ // Optional AJAX dependency, but won't run scripts if not present
+ if ( jQuery._evalUrl ) {
+ jQuery._evalUrl( node.src );
+ }
+ } else {
+ jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return this;
+ }
+});
+
+jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function( name, original ) {
+ jQuery.fn[ name ] = function( selector ) {
+ var elems,
+ ret = [],
+ insert = jQuery( selector ),
+ last = insert.length - 1,
+ i = 0;
+
+ for ( ; i <= last; i++ ) {
+ elems = i === last ? this : this.clone( true );
+ jQuery( insert[ i ] )[ original ]( elems );
+
+ // Support: QtWebKit
+ // .get() because push.apply(_, arraylike) throws
+ push.apply( ret, elems.get() );
+ }
+
+ return this.pushStack( ret );
+ };
+});
+
+
+var iframe,
+ elemdisplay = {};
+
+/**
+ * Retrieve the actual display of a element
+ * @param {String} name nodeName of the element
+ * @param {Object} doc Document object
+ */
+// Called only from within defaultDisplay
+function actualDisplay( name, doc ) {
+ var style,
+ elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+
+ // getDefaultComputedStyle might be reliably used only on attached element
+ display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
+
+ // Use of this method is a temporary fix (more like optmization) until something better comes along,
+ // since it was removed from specification and supported only in FF
+ style.display : jQuery.css( elem[ 0 ], "display" );
+
+ // We don't have any data stored on the element,
+ // so use "detach" method as fast way to get rid of the element
+ elem.detach();
+
+ return display;
+}
+
+/**
+ * Try to determine the default display value of an element
+ * @param {String} nodeName
+ */
+function defaultDisplay( nodeName ) {
+ var doc = document,
+ display = elemdisplay[ nodeName ];
+
+ if ( !display ) {
+ display = actualDisplay( nodeName, doc );
+
+ // If the simple way fails, read from inside an iframe
+ if ( display === "none" || !display ) {
+
+ // Use the already-created iframe if possible
+ iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
+
+ // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+ doc = iframe[ 0 ].contentDocument;
+
+ // Support: IE
+ doc.write();
+ doc.close();
+
+ display = actualDisplay( nodeName, doc );
+ iframe.detach();
+ }
+
+ // Store the correct default display
+ elemdisplay[ nodeName ] = display;
+ }
+
+ return display;
+}
+var rmargin = (/^margin/);
+
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+ return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+ };
+
+
+
+function curCSS( elem, name, computed ) {
+ var width, minWidth, maxWidth, ret,
+ style = elem.style;
+
+ computed = computed || getStyles( elem );
+
+ // Support: IE9
+ // getPropertyValue is only needed for .css('filter') in IE9, see #12537
+ if ( computed ) {
+ ret = computed.getPropertyValue( name ) || computed[ name ];
+ }
+
+ if ( computed ) {
+
+ if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+ ret = jQuery.style( elem, name );
+ }
+
+ // Support: iOS < 6
+ // A tribute to the "awesome hack by Dean Edwards"
+ // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+ // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+ if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+ // Remember the original values
+ width = style.width;
+ minWidth = style.minWidth;
+ maxWidth = style.maxWidth;
+
+ // Put in the new values to get a computed value out
+ style.minWidth = style.maxWidth = style.width = ret;
+ ret = computed.width;
+
+ // Revert the changed values
+ style.width = width;
+ style.minWidth = minWidth;
+ style.maxWidth = maxWidth;
+ }
+ }
+
+ return ret !== undefined ?
+ // Support: IE
+ // IE returns zIndex value as an integer.
+ ret + "" :
+ ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+ // Define the hook, we'll check on the first run if it's really needed.
+ return {
+ get: function() {
+ if ( conditionFn() ) {
+ // Hook not needed (or it's not possible to use it due to missing dependency),
+ // remove it.
+ // Since there are no other hooks for marginRight, remove the whole object.
+ delete this.get;
+ return;
+ }
+
+ // Hook needed; redefine it so that the support test is not executed again.
+
+ return (this.get = hookFn).apply( this, arguments );
+ }
+ };
+}
+
+
+(function() {
+ var pixelPositionVal, boxSizingReliableVal,
+ docElem = document.documentElement,
+ container = document.createElement( "div" ),
+ div = document.createElement( "div" );
+
+ if ( !div.style ) {
+ return;
+ }
+
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" +
+ "position:absolute";
+ container.appendChild( div );
+
+ // Executing both pixelPosition & boxSizingReliable tests require only one layout
+ // so they're executed at the same time to save the second computation.
+ function computePixelPositionAndBoxSizingReliable() {
+ div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
+ "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
+ "border:1px;padding:1px;width:4px;position:absolute";
+ div.innerHTML = "";
+ docElem.appendChild( container );
+
+ var divStyle = window.getComputedStyle( div, null );
+ pixelPositionVal = divStyle.top !== "1%";
+ boxSizingReliableVal = divStyle.width === "4px";
+
+ docElem.removeChild( container );
+ }
+
+ // Support: node.js jsdom
+ // Don't assume that getComputedStyle is a property of the global object
+ if ( window.getComputedStyle ) {
+ jQuery.extend( support, {
+ pixelPosition: function() {
+ // This test is executed only once but we still do memoizing
+ // since we can use the boxSizingReliable pre-computing.
+ // No need to check if the test was already performed, though.
+ computePixelPositionAndBoxSizingReliable();
+ return pixelPositionVal;
+ },
+ boxSizingReliable: function() {
+ if ( boxSizingReliableVal == null ) {
+ computePixelPositionAndBoxSizingReliable();
+ }
+ return boxSizingReliableVal;
+ },
+ reliableMarginRight: function() {
+ // Support: Android 2.3
+ // Check if div with explicit width and no margin-right incorrectly
+ // gets computed margin-right based on width of container. (#3333)
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // This support function is only executed once so no memoizing is needed.
+ var ret,
+ marginDiv = div.appendChild( document.createElement( "div" ) );
+
+ // Reset CSS: box-sizing; display; margin; border; padding
+ marginDiv.style.cssText = div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+ "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
+ marginDiv.style.marginRight = marginDiv.style.width = "0";
+ div.style.width = "1px";
+ docElem.appendChild( container );
+
+ ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
+
+ docElem.removeChild( container );
+
+ return ret;
+ }
+ });
+ }
+})();
+
+
+// A method for quickly swapping in/out CSS properties to get correct calculations.
+jQuery.swap = function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
+var
+ // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+ // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+ rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
+ rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
+
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+ cssNormalTransform = {
+ letterSpacing: "0",
+ fontWeight: "400"
+ },
+
+ cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+ // shortcut for names that are not vendor prefixed
+ if ( name in style ) {
+ return name;
+ }
+
+ // check for vendor prefixed names
+ var capName = name[0].toUpperCase() + name.slice(1),
+ origName = name,
+ i = cssPrefixes.length;
+
+ while ( i-- ) {
+ name = cssPrefixes[ i ] + capName;
+ if ( name in style ) {
+ return name;
+ }
+ }
+
+ return origName;
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+ var matches = rnumsplit.exec( value );
+ return matches ?
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+ value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+ var i = extra === ( isBorderBox ? "border" : "content" ) ?
+ // If we already have the right measurement, avoid augmentation
+ 4 :
+ // Otherwise initialize for horizontal or vertical properties
+ name === "width" ? 1 : 0,
+
+ val = 0;
+
+ for ( ; i < 4; i += 2 ) {
+ // both box models exclude margin, so add it if we want it
+ if ( extra === "margin" ) {
+ val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+ }
+
+ if ( isBorderBox ) {
+ // border-box includes padding, so remove it if we want content
+ if ( extra === "content" ) {
+ val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+ }
+
+ // at this point, extra isn't border nor margin, so remove border
+ if ( extra !== "margin" ) {
+ val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ } else {
+ // at this point, extra isn't content, so add padding
+ val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+ // at this point, extra isn't content nor padding, so add border
+ if ( extra !== "padding" ) {
+ val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ }
+ }
+
+ return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+ // Start with offset property, which is equivalent to the border-box value
+ var valueIsBorderBox = true,
+ val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+ styles = getStyles( elem ),
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+ // some non-html elements return undefined for offsetWidth, so check for null/undefined
+ // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+ // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+ if ( val <= 0 || val == null ) {
+ // Fall back to computed then uncomputed css if necessary
+ val = curCSS( elem, name, styles );
+ if ( val < 0 || val == null ) {
+ val = elem.style[ name ];
+ }
+
+ // Computed unit is not pixels. Stop here and return.
+ if ( rnumnonpx.test(val) ) {
+ return val;
+ }
+
+ // we need the check for style in case a browser which returns unreliable values
+ // for getComputedStyle silently falls back to the reliable elem.style
+ valueIsBorderBox = isBorderBox &&
+ ( support.boxSizingReliable() || val === elem.style[ name ] );
+
+ // Normalize "", auto, and prepare for extra
+ val = parseFloat( val ) || 0;
+ }
+
+ // use the active box-sizing model to add/subtract irrelevant styles
+ return ( val +
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra || ( isBorderBox ? "border" : "content" ),
+ valueIsBorderBox,
+ styles
+ )
+ ) + "px";
+}
+
+function showHide( elements, show ) {
+ var display, elem, hidden,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+
+ values[ index ] = data_priv.get( elem, "olddisplay" );
+ display = elem.style.display;
+ if ( show ) {
+ // Reset the inline display of this element to learn if it is
+ // being hidden by cascaded rules or not
+ if ( !values[ index ] && display === "none" ) {
+ elem.style.display = "";
+ }
+
+ // Set elements which have been overridden with display: none
+ // in a stylesheet to whatever the default browser style is
+ // for such an element
+ if ( elem.style.display === "" && isHidden( elem ) ) {
+ values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+ }
+ } else {
+ hidden = isHidden( elem );
+
+ if ( display !== "none" || !hidden ) {
+ data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+ }
+ }
+ }
+
+ // Set the display of most of the elements in a second loop
+ // to avoid the constant reflow
+ for ( index = 0; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+ if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+ elem.style.display = show ? values[ index ] || "" : "none";
+ }
+ }
+
+ return elements;
+}
+
+jQuery.extend({
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function( elem, computed ) {
+ if ( computed ) {
+ // We should always get a number back from opacity
+ var ret = curCSS( elem, "opacity" );
+ return ret === "" ? "1" : ret;
+ }
+ }
+ }
+ },
+
+ // Don't automatically add "px" to these possibly-unitless properties
+ cssNumber: {
+ "columnCount": true,
+ "fillOpacity": true,
+ "flexGrow": true,
+ "flexShrink": true,
+ "fontWeight": true,
+ "lineHeight": true,
+ "opacity": true,
+ "order": true,
+ "orphans": true,
+ "widows": true,
+ "zIndex": true,
+ "zoom": true
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {
+ // normalize float css property
+ "float": "cssFloat"
+ },
+
+ // Get and set the style property on a DOM Node
+ style: function( elem, name, value, extra ) {
+ // Don't set styles on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret, type, hooks,
+ origName = jQuery.camelCase( name ),
+ style = elem.style;
+
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+ // gets hook for the prefixed version
+ // followed by the unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // Check if we're setting a value
+ if ( value !== undefined ) {
+ type = typeof value;
+
+ // convert relative number strings (+= or -=) to relative numbers. #7345
+ if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+ value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+ // Fixes bug #9237
+ type = "number";
+ }
+
+ // Make sure that null and NaN values aren't set. See: #7116
+ if ( value == null || value !== value ) {
+ return;
+ }
+
+ // If a number was passed in, add 'px' to the (except for certain CSS properties)
+ if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+ value += "px";
+ }
+
+ // Fixes #8908, it can be done more correctly by specifying setters in cssHooks,
+ // but it would mean to define eight (for every problematic property) identical functions
+ if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+ style[ name ] = "inherit";
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+ style[ name ] = value;
+ }
+
+ } else {
+ // If a hook was provided get the non-computed value from there
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[ name ];
+ }
+ },
+
+ css: function( elem, name, extra, styles ) {
+ var val, num, hooks,
+ origName = jQuery.camelCase( name );
+
+ // Make sure that we're working with the right name
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+ // gets hook for the prefixed version
+ // followed by the unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // If a hook was provided get the computed value from there
+ if ( hooks && "get" in hooks ) {
+ val = hooks.get( elem, true, extra );
+ }
+
+ // Otherwise, if a way to get the computed value exists, use that
+ if ( val === undefined ) {
+ val = curCSS( elem, name, styles );
+ }
+
+ //convert "normal" to computed value
+ if ( val === "normal" && name in cssNormalTransform ) {
+ val = cssNormalTransform[ name ];
+ }
+
+ // Return, converting to number if forced or a qualifier was provided and val looks numeric
+ if ( extra === "" || extra ) {
+ num = parseFloat( val );
+ return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+ }
+ return val;
+ }
+});
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+ jQuery.cssHooks[ name ] = {
+ get: function( elem, computed, extra ) {
+ if ( computed ) {
+ // certain elements can have dimension info if we invisibly show them
+ // however, it must have a current display style that would benefit from this
+ return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
+ jQuery.swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, name, extra );
+ }) :
+ getWidthOrHeight( elem, name, extra );
+ }
+ },
+
+ set: function( elem, value, extra ) {
+ var styles = extra && getStyles( elem );
+ return setPositiveNumber( elem, value, extra ?
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra,
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ styles
+ ) : 0
+ );
+ }
+ };
+});
+
+// Support: Android 2.3
+jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
+ function( elem, computed ) {
+ if ( computed ) {
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // Work around by temporarily setting element display to inline-block
+ return jQuery.swap( elem, { "display": "inline-block" },
+ curCSS, [ elem, "marginRight" ] );
+ }
+ }
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+ margin: "",
+ padding: "",
+ border: "Width"
+}, function( prefix, suffix ) {
+ jQuery.cssHooks[ prefix + suffix ] = {
+ expand: function( value ) {
+ var i = 0,
+ expanded = {},
+
+ // assumes a single number if not a string
+ parts = typeof value === "string" ? value.split(" ") : [ value ];
+
+ for ( ; i < 4; i++ ) {
+ expanded[ prefix + cssExpand[ i ] + suffix ] =
+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+ }
+
+ return expanded;
+ }
+ };
+
+ if ( !rmargin.test( prefix ) ) {
+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+ }
+});
+
+jQuery.fn.extend({
+ css: function( name, value ) {
+ return access( this, function( elem, name, value ) {
+ var styles, len,
+ map = {},
+ i = 0;
+
+ if ( jQuery.isArray( name ) ) {
+ styles = getStyles( elem );
+ len = name.length;
+
+ for ( ; i < len; i++ ) {
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+ }
+
+ return map;
+ }
+
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ }, name, value, arguments.length > 1 );
+ },
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each(function() {
+ if ( isHidden( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ });
+ }
+});
+
+
+function Tween( elem, options, prop, end, easing ) {
+ return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+ constructor: Tween,
+ init: function( elem, options, prop, end, easing, unit ) {
+ this.elem = elem;
+ this.prop = prop;
+ this.easing = easing || "swing";
+ this.options = options;
+ this.start = this.now = this.cur();
+ this.end = end;
+ this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+ },
+ cur: function() {
+ var hooks = Tween.propHooks[ this.prop ];
+
+ return hooks && hooks.get ?
+ hooks.get( this ) :
+ Tween.propHooks._default.get( this );
+ },
+ run: function( percent ) {
+ var eased,
+ hooks = Tween.propHooks[ this.prop ];
+
+ if ( this.options.duration ) {
+ this.pos = eased = jQuery.easing[ this.easing ](
+ percent, this.options.duration * percent, 0, 1, this.options.duration
+ );
+ } else {
+ this.pos = eased = percent;
+ }
+ this.now = ( this.end - this.start ) * eased + this.start;
+
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
+
+ if ( hooks && hooks.set ) {
+ hooks.set( this );
+ } else {
+ Tween.propHooks._default.set( this );
+ }
+ return this;
+ }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+ _default: {
+ get: function( tween ) {
+ var result;
+
+ if ( tween.elem[ tween.prop ] != null &&
+ (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+ return tween.elem[ tween.prop ];
+ }
+
+ // passing an empty string as a 3rd parameter to .css will automatically
+ // attempt a parseFloat and fallback to a string if the parse fails
+ // so, simple values such as "10px" are parsed to Float.
+ // complex values such as "rotate(1rad)" are returned as is.
+ result = jQuery.css( tween.elem, tween.prop, "" );
+ // Empty strings, null, undefined and "auto" are converted to 0.
+ return !result || result === "auto" ? 0 : result;
+ },
+ set: function( tween ) {
+ // use step hook for back compat - use cssHook if its there - use .style if its
+ // available and use plain properties where available
+ if ( jQuery.fx.step[ tween.prop ] ) {
+ jQuery.fx.step[ tween.prop ]( tween );
+ } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+ } else {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+ }
+};
+
+// Support: IE9
+// Panic based approach to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+ set: function( tween ) {
+ if ( tween.elem.nodeType && tween.elem.parentNode ) {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+};
+
+jQuery.easing = {
+ linear: function( p ) {
+ return p;
+ },
+ swing: function( p ) {
+ return 0.5 - Math.cos( p * Math.PI ) / 2;
+ }
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+ fxNow, timerId,
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
+ rrun = /queueHooks$/,
+ animationPrefilters = [ defaultPrefilter ],
+ tweeners = {
+ "*": [ function( prop, value ) {
+ var tween = this.createTween( prop, value ),
+ target = tween.cur(),
+ parts = rfxnum.exec( value ),
+ unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+ rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+ scale = 1,
+ maxIterations = 20;
+
+ if ( start && start[ 3 ] !== unit ) {
+ // Trust units reported by jQuery.css
+ unit = unit || start[ 3 ];
+
+ // Make sure we update the tween properties later on
+ parts = parts || [];
+
+ // Iteratively approximate from a nonzero starting point
+ start = +target || 1;
+
+ do {
+ // If previous iteration zeroed out, double until we get *something*
+ // Use a string for doubling factor so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ start = start / scale;
+ jQuery.style( tween.elem, prop, start + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur()
+ // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+ } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+ }
+
+ // Update tween properties
+ if ( parts ) {
+ start = tween.start = +start || +target || 0;
+ tween.unit = unit;
+ // If a +=/-= token was provided, we're doing a relative animation
+ tween.end = parts[ 1 ] ?
+ start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+ +parts[ 2 ];
+ }
+
+ return tween;
+ } ]
+ };
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+ setTimeout(function() {
+ fxNow = undefined;
+ });
+ return ( fxNow = jQuery.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+ var which,
+ i = 0,
+ attrs = { height: type };
+
+ // if we include width, step value is 1 to do all cssExpand values,
+ // if we don't include width, step value is 2 to skip over Left and Right
+ includeWidth = includeWidth ? 1 : 0;
+ for ( ; i < 4 ; i += 2 - includeWidth ) {
+ which = cssExpand[ i ];
+ attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+ }
+
+ if ( includeWidth ) {
+ attrs.opacity = attrs.width = type;
+ }
+
+ return attrs;
+}
+
+function createTween( value, prop, animation ) {
+ var tween,
+ collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+ index = 0,
+ length = collection.length;
+ for ( ; index < length; index++ ) {
+ if ( (tween = collection[ index ].call( animation, prop, value )) ) {
+
+ // we're done with this property
+ return tween;
+ }
+ }
+}
+
+function defaultPrefilter( elem, props, opts ) {
+ /* jshint validthis: true */
+ var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
+ anim = this,
+ orig = {},
+ style = elem.style,
+ hidden = elem.nodeType && isHidden( elem ),
+ dataShow = data_priv.get( elem, "fxshow" );
+
+ // handle queue: false promises
+ if ( !opts.queue ) {
+ hooks = jQuery._queueHooks( elem, "fx" );
+ if ( hooks.unqueued == null ) {
+ hooks.unqueued = 0;
+ oldfire = hooks.empty.fire;
+ hooks.empty.fire = function() {
+ if ( !hooks.unqueued ) {
+ oldfire();
+ }
+ };
+ }
+ hooks.unqueued++;
+
+ anim.always(function() {
+ // doing this makes sure that the complete handler will be called
+ // before this completes
+ anim.always(function() {
+ hooks.unqueued--;
+ if ( !jQuery.queue( elem, "fx" ).length ) {
+ hooks.empty.fire();
+ }
+ });
+ });
+ }
+
+ // height/width overflow pass
+ if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+ // Make sure that nothing sneaks out
+ // Record all 3 overflow attributes because IE9-10 do not
+ // change the overflow attribute when overflowX and
+ // overflowY are set to the same value
+ opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+ // Set display property to inline-block for height/width
+ // animations on inline elements that are having width/height animated
+ display = jQuery.css( elem, "display" );
+
+ // Test default display if display is currently "none"
+ checkDisplay = display === "none" ?
+ data_priv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
+
+ if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
+ style.display = "inline-block";
+ }
+ }
+
+ if ( opts.overflow ) {
+ style.overflow = "hidden";
+ anim.always(function() {
+ style.overflow = opts.overflow[ 0 ];
+ style.overflowX = opts.overflow[ 1 ];
+ style.overflowY = opts.overflow[ 2 ];
+ });
+ }
+
+ // show/hide pass
+ for ( prop in props ) {
+ value = props[ prop ];
+ if ( rfxtypes.exec( value ) ) {
+ delete props[ prop ];
+ toggle = toggle || value === "toggle";
+ if ( value === ( hidden ? "hide" : "show" ) ) {
+
+ // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
+ if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+ hidden = true;
+ } else {
+ continue;
+ }
+ }
+ orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+
+ // Any non-fx value stops us from restoring the original display value
+ } else {
+ display = undefined;
+ }
+ }
+
+ if ( !jQuery.isEmptyObject( orig ) ) {
+ if ( dataShow ) {
+ if ( "hidden" in dataShow ) {
+ hidden = dataShow.hidden;
+ }
+ } else {
+ dataShow = data_priv.access( elem, "fxshow", {} );
+ }
+
+ // store state if its toggle - enables .stop().toggle() to "reverse"
+ if ( toggle ) {
+ dataShow.hidden = !hidden;
+ }
+ if ( hidden ) {
+ jQuery( elem ).show();
+ } else {
+ anim.done(function() {
+ jQuery( elem ).hide();
+ });
+ }
+ anim.done(function() {
+ var prop;
+
+ data_priv.remove( elem, "fxshow" );
+ for ( prop in orig ) {
+ jQuery.style( elem, prop, orig[ prop ] );
+ }
+ });
+ for ( prop in orig ) {
+ tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+ if ( !( prop in dataShow ) ) {
+ dataShow[ prop ] = tween.start;
+ if ( hidden ) {
+ tween.end = tween.start;
+ tween.start = prop === "width" || prop === "height" ? 1 : 0;
+ }
+ }
+ }
+
+ // If this is a noop like .hide().hide(), restore an overwritten display value
+ } else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
+ style.display = display;
+ }
+}
+
+function propFilter( props, specialEasing ) {
+ var index, name, easing, value, hooks;
+
+ // camelCase, specialEasing and expand cssHook pass
+ for ( index in props ) {
+ name = jQuery.camelCase( index );
+ easing = specialEasing[ name ];
+ value = props[ index ];
+ if ( jQuery.isArray( value ) ) {
+ easing = value[ 1 ];
+ value = props[ index ] = value[ 0 ];
+ }
+
+ if ( index !== name ) {
+ props[ name ] = value;
+ delete props[ index ];
+ }
+
+ hooks = jQuery.cssHooks[ name ];
+ if ( hooks && "expand" in hooks ) {
+ value = hooks.expand( value );
+ delete props[ name ];
+
+ // not quite $.extend, this wont overwrite keys already present.
+ // also - reusing 'index' from above because we have the correct "name"
+ for ( index in value ) {
+ if ( !( index in props ) ) {
+ props[ index ] = value[ index ];
+ specialEasing[ index ] = easing;
+ }
+ }
+ } else {
+ specialEasing[ name ] = easing;
+ }
+ }
+}
+
+function Animation( elem, properties, options ) {
+ var result,
+ stopped,
+ index = 0,
+ length = animationPrefilters.length,
+ deferred = jQuery.Deferred().always( function() {
+ // don't match elem in the :animated selector
+ delete tick.elem;
+ }),
+ tick = function() {
+ if ( stopped ) {
+ return false;
+ }
+ var currentTime = fxNow || createFxNow(),
+ remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+ // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+ temp = remaining / animation.duration || 0,
+ percent = 1 - temp,
+ index = 0,
+ length = animation.tweens.length;
+
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( percent );
+ }
+
+ deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+ if ( percent < 1 && length ) {
+ return remaining;
+ } else {
+ deferred.resolveWith( elem, [ animation ] );
+ return false;
+ }
+ },
+ animation = deferred.promise({
+ elem: elem,
+ props: jQuery.extend( {}, properties ),
+ opts: jQuery.extend( true, { specialEasing: {} }, options ),
+ originalProperties: properties,
+ originalOptions: options,
+ startTime: fxNow || createFxNow(),
+ duration: options.duration,
+ tweens: [],
+ createTween: function( prop, end ) {
+ var tween = jQuery.Tween( elem, animation.opts, prop, end,
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.tweens.push( tween );
+ return tween;
+ },
+ stop: function( gotoEnd ) {
+ var index = 0,
+ // if we are going to the end, we want to run all the tweens
+ // otherwise we skip this part
+ length = gotoEnd ? animation.tweens.length : 0;
+ if ( stopped ) {
+ return this;
+ }
+ stopped = true;
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( 1 );
+ }
+
+ // resolve when we played the last frame
+ // otherwise, reject
+ if ( gotoEnd ) {
+ deferred.resolveWith( elem, [ animation, gotoEnd ] );
+ } else {
+ deferred.rejectWith( elem, [ animation, gotoEnd ] );
+ }
+ return this;
+ }
+ }),
+ props = animation.props;
+
+ propFilter( props, animation.opts.specialEasing );
+
+ for ( ; index < length ; index++ ) {
+ result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+ if ( result ) {
+ return result;
+ }
+ }
+
+ jQuery.map( props, createTween, animation );
+
+ if ( jQuery.isFunction( animation.opts.start ) ) {
+ animation.opts.start.call( elem, animation );
+ }
+
+ jQuery.fx.timer(
+ jQuery.extend( tick, {
+ elem: elem,
+ anim: animation,
+ queue: animation.opts.queue
+ })
+ );
+
+ // attach callbacks from options
+ return animation.progress( animation.opts.progress )
+ .done( animation.opts.done, animation.opts.complete )
+ .fail( animation.opts.fail )
+ .always( animation.opts.always );
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+ tweener: function( props, callback ) {
+ if ( jQuery.isFunction( props ) ) {
+ callback = props;
+ props = [ "*" ];
+ } else {
+ props = props.split(" ");
+ }
+
+ var prop,
+ index = 0,
+ length = props.length;
+
+ for ( ; index < length ; index++ ) {
+ prop = props[ index ];
+ tweeners[ prop ] = tweeners[ prop ] || [];
+ tweeners[ prop ].unshift( callback );
+ }
+ },
+
+ prefilter: function( callback, prepend ) {
+ if ( prepend ) {
+ animationPrefilters.unshift( callback );
+ } else {
+ animationPrefilters.push( callback );
+ }
+ }
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+ };
+
+ opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+ // normalize opt.queue - true/undefined/null -> "fx"
+ if ( opt.queue == null || opt.queue === true ) {
+ opt.queue = "fx";
+ }
+
+ // Queueing
+ opt.old = opt.complete;
+
+ opt.complete = function() {
+ if ( jQuery.isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+
+ if ( opt.queue ) {
+ jQuery.dequeue( this, opt.queue );
+ }
+ };
+
+ return opt;
+};
+
+jQuery.fn.extend({
+ fadeTo: function( speed, to, easing, callback ) {
+
+ // show any hidden elements after setting opacity to 0
+ return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+ // animate to the value specified
+ .end().animate({ opacity: to }, speed, easing, callback );
+ },
+ animate: function( prop, speed, easing, callback ) {
+ var empty = jQuery.isEmptyObject( prop ),
+ optall = jQuery.speed( speed, easing, callback ),
+ doAnimation = function() {
+ // Operate on a copy of prop so per-property easing won't be lost
+ var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+ // Empty animations, or finishing resolves immediately
+ if ( empty || data_priv.get( this, "finish" ) ) {
+ anim.stop( true );
+ }
+ };
+ doAnimation.finish = doAnimation;
+
+ return empty || optall.queue === false ?
+ this.each( doAnimation ) :
+ this.queue( optall.queue, doAnimation );
+ },
+ stop: function( type, clearQueue, gotoEnd ) {
+ var stopQueue = function( hooks ) {
+ var stop = hooks.stop;
+ delete hooks.stop;
+ stop( gotoEnd );
+ };
+
+ if ( typeof type !== "string" ) {
+ gotoEnd = clearQueue;
+ clearQueue = type;
+ type = undefined;
+ }
+ if ( clearQueue && type !== false ) {
+ this.queue( type || "fx", [] );
+ }
+
+ return this.each(function() {
+ var dequeue = true,
+ index = type != null && type + "queueHooks",
+ timers = jQuery.timers,
+ data = data_priv.get( this );
+
+ if ( index ) {
+ if ( data[ index ] && data[ index ].stop ) {
+ stopQueue( data[ index ] );
+ }
+ } else {
+ for ( index in data ) {
+ if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+ stopQueue( data[ index ] );
+ }
+ }
+ }
+
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+ timers[ index ].anim.stop( gotoEnd );
+ dequeue = false;
+ timers.splice( index, 1 );
+ }
+ }
+
+ // start the next in the queue if the last step wasn't forced
+ // timers currently will call their complete callbacks, which will dequeue
+ // but only if they were gotoEnd
+ if ( dequeue || !gotoEnd ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ finish: function( type ) {
+ if ( type !== false ) {
+ type = type || "fx";
+ }
+ return this.each(function() {
+ var index,
+ data = data_priv.get( this ),
+ queue = data[ type + "queue" ],
+ hooks = data[ type + "queueHooks" ],
+ timers = jQuery.timers,
+ length = queue ? queue.length : 0;
+
+ // enable finishing flag on private data
+ data.finish = true;
+
+ // empty the queue first
+ jQuery.queue( this, type, [] );
+
+ if ( hooks && hooks.stop ) {
+ hooks.stop.call( this, true );
+ }
+
+ // look for any active animations, and finish them
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+ timers[ index ].anim.stop( true );
+ timers.splice( index, 1 );
+ }
+ }
+
+ // look for any animations in the old queue and finish them
+ for ( index = 0; index < length; index++ ) {
+ if ( queue[ index ] && queue[ index ].finish ) {
+ queue[ index ].finish.call( this );
+ }
+ }
+
+ // turn off finishing flag
+ delete data.finish;
+ });
+ }
+});
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+ var cssFn = jQuery.fn[ name ];
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return speed == null || typeof speed === "boolean" ?
+ cssFn.apply( this, arguments ) :
+ this.animate( genFx( name, true ), speed, easing, callback );
+ };
+});
+
+// Generate shortcuts for custom animations
+jQuery.each({
+ slideDown: genFx("show"),
+ slideUp: genFx("hide"),
+ slideToggle: genFx("toggle"),
+ fadeIn: { opacity: "show" },
+ fadeOut: { opacity: "hide" },
+ fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return this.animate( props, speed, easing, callback );
+ };
+});
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+ var timer,
+ i = 0,
+ timers = jQuery.timers;
+
+ fxNow = jQuery.now();
+
+ for ( ; i < timers.length; i++ ) {
+ timer = timers[ i ];
+ // Checks the timer has not already been removed
+ if ( !timer() && timers[ i ] === timer ) {
+ timers.splice( i--, 1 );
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+ jQuery.timers.push( timer );
+ if ( timer() ) {
+ jQuery.fx.start();
+ } else {
+ jQuery.timers.pop();
+ }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+ if ( !timerId ) {
+ timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+ }
+};
+
+jQuery.fx.stop = function() {
+ clearInterval( timerId );
+ timerId = null;
+};
+
+jQuery.fx.speeds = {
+ slow: 600,
+ fast: 200,
+ // Default speed
+ _default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = setTimeout( next, time );
+ hooks.stop = function() {
+ clearTimeout( timeout );
+ };
+ });
+};
+
+
+(function() {
+ var input = document.createElement( "input" ),
+ select = document.createElement( "select" ),
+ opt = select.appendChild( document.createElement( "option" ) );
+
+ input.type = "checkbox";
+
+ // Support: iOS 5.1, Android 4.x, Android 2.3
+ // Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere)
+ support.checkOn = input.value !== "";
+
+ // Must access the parent to make an option select properly
+ // Support: IE9, IE10
+ support.optSelected = opt.selected;
+
+ // Make sure that the options inside disabled selects aren't marked as disabled
+ // (WebKit marks them as disabled)
+ select.disabled = true;
+ support.optDisabled = !opt.disabled;
+
+ // Check if an input maintains its value after becoming a radio
+ // Support: IE9, IE10
+ input = document.createElement( "input" );
+ input.value = "t";
+ input.type = "radio";
+ support.radioValue = input.value === "t";
+})();
+
+
+var nodeHook, boolHook,
+ attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return access( this, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr: function( name ) {
+ return this.each(function() {
+ jQuery.removeAttr( this, name );
+ });
+ }
+});
+
+jQuery.extend({
+ attr: function( elem, name, value ) {
+ var hooks, ret,
+ nType = elem.nodeType;
+
+ // don't get/set attributes on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( typeof elem.getAttribute === strundefined ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ // All attributes are lowercase
+ // Grab necessary hook if one is defined
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+ name = name.toLowerCase();
+ hooks = jQuery.attrHooks[ name ] ||
+ ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+ }
+
+ if ( value !== undefined ) {
+
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+
+ } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ elem.setAttribute( name, value + "" );
+ return value;
+ }
+
+ } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+ ret = jQuery.find.attr( elem, name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ?
+ undefined :
+ ret;
+ }
+ },
+
+ removeAttr: function( elem, value ) {
+ var name, propName,
+ i = 0,
+ attrNames = value && value.match( rnotwhite );
+
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( (name = attrNames[i++]) ) {
+ propName = jQuery.propFix[ name ] || name;
+
+ // Boolean attributes get special treatment (#10870)
+ if ( jQuery.expr.match.bool.test( name ) ) {
+ // Set corresponding property to false
+ elem[ propName ] = false;
+ }
+
+ elem.removeAttribute( name );
+ }
+ }
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ if ( !support.radioValue && value === "radio" &&
+ jQuery.nodeName( elem, "input" ) ) {
+ // Setting the type on a radio button after the value resets the value in IE6-9
+ // Reset value to default in case type is set after value during creation
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
+ }
+});
+
+// Hooks for boolean attributes
+boolHook = {
+ set: function( elem, value, name ) {
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else {
+ elem.setAttribute( name, name );
+ }
+ return name;
+ }
+};
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+ var getter = attrHandle[ name ] || jQuery.find.attr;
+
+ attrHandle[ name ] = function( elem, name, isXML ) {
+ var ret, handle;
+ if ( !isXML ) {
+ // Avoid an infinite loop by temporarily removing this function from the getter
+ handle = attrHandle[ name ];
+ attrHandle[ name ] = ret;
+ ret = getter( elem, name, isXML ) != null ?
+ name.toLowerCase() :
+ null;
+ attrHandle[ name ] = handle;
+ }
+ return ret;
+ };
+});
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i;
+
+jQuery.fn.extend({
+ prop: function( name, value ) {
+ return access( this, jQuery.prop, name, value, arguments.length > 1 );
+ },
+
+ removeProp: function( name ) {
+ return this.each(function() {
+ delete this[ jQuery.propFix[ name ] || name ];
+ });
+ }
+});
+
+jQuery.extend({
+ propFix: {
+ "for": "htmlFor",
+ "class": "className"
+ },
+
+ prop: function( elem, name, value ) {
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
+ // don't get/set properties on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ if ( notxml ) {
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+ ret :
+ ( elem[ name ] = value );
+
+ } else {
+ return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+ ret :
+ elem[ name ];
+ }
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+ return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
+ elem.tabIndex :
+ -1;
+ }
+ }
+ }
+});
+
+// Support: IE9+
+// Selectedness for an option in an optgroup can be inaccurate
+if ( !support.optSelected ) {
+ jQuery.propHooks.selected = {
+ get: function( elem ) {
+ var parent = elem.parentNode;
+ if ( parent && parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ return null;
+ }
+ };
+}
+
+jQuery.each([
+ "tabIndex",
+ "readOnly",
+ "maxLength",
+ "cellSpacing",
+ "cellPadding",
+ "rowSpan",
+ "colSpan",
+ "useMap",
+ "frameBorder",
+ "contentEditable"
+], function() {
+ jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+
+
+
+var rclass = /[\t\r\n\f]/g;
+
+jQuery.fn.extend({
+ addClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).addClass( value.call( this, j, this.className ) );
+ });
+ }
+
+ if ( proceed ) {
+ // The disjunction here is for better compressibility (see removeClass)
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ " "
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
+ }
+ }
+
+ // only assign if different to avoid unneeded rendering.
+ finalValue = jQuery.trim( cur );
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = arguments.length === 0 || typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).removeClass( value.call( this, j, this.className ) );
+ });
+ }
+ if ( proceed ) {
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ ""
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
+ }
+ }
+
+ // only assign if different to avoid unneeded rendering.
+ finalValue = value ? jQuery.trim( cur ) : "";
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value;
+
+ if ( typeof stateVal === "boolean" && type === "string" ) {
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
+ }
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery( this ),
+ classNames = value.match( rnotwhite ) || [];
+
+ while ( (className = classNames[ i++ ]) ) {
+ // check each className given, space separated list
+ if ( self.hasClass( className ) ) {
+ self.removeClass( className );
+ } else {
+ self.addClass( className );
+ }
+ }
+
+ // Toggle whole class name
+ } else if ( type === strundefined || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ data_priv.set( this, "__className__", this.className );
+ }
+
+ // If the element has a class name or if we're passed "false",
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
+ }
+ });
+ },
+
+ hasClass: function( selector ) {
+ var className = " " + selector + " ",
+ i = 0,
+ l = this.length;
+ for ( ; i < l; i++ ) {
+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+});
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend({
+ val: function( value ) {
+ var hooks, ret, isFunction,
+ elem = this[0];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ return typeof ret === "string" ?
+ // handle most common string cases
+ ret.replace(rreturn, "") :
+ // handle cases where value is null/undef or number
+ ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ isFunction = jQuery.isFunction( value );
+
+ return this.each(function( i ) {
+ var val;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call( this, i, jQuery( this ).val() );
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+
+ } else if ( typeof val === "number" ) {
+ val += "";
+
+ } else if ( jQuery.isArray( val ) ) {
+ val = jQuery.map( val, function( value ) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+ this.value = val;
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ valHooks: {
+ option: {
+ get: function( elem ) {
+ var val = jQuery.find.attr( elem, "value" );
+ return val != null ?
+ val :
+ // Support: IE10-11+
+ // option.text throws exceptions (#14686, #14858)
+ jQuery.trim( jQuery.text( elem ) );
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, option,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one" || index < 0,
+ values = one ? null : [],
+ max = one ? index + 1 : options.length,
+ i = index < 0 ?
+ max :
+ one ? index : 0;
+
+ // Loop through all the selected options
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // IE6-9 doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+ // Don't return options that are disabled or in a disabled optgroup
+ ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) &&
+ ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var optionSet, option,
+ options = elem.options,
+ values = jQuery.makeArray( value ),
+ i = options.length;
+
+ while ( i-- ) {
+ option = options[ i ];
+ if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {
+ optionSet = true;
+ }
+ }
+
+ // force browsers to behave consistently when non-matching value is set
+ if ( !optionSet ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ }
+});
+
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ set: function( elem, value ) {
+ if ( jQuery.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+ }
+ }
+ };
+ if ( !support.checkOn ) {
+ jQuery.valHooks[ this ].get = function( elem ) {
+ // Support: Webkit
+ // "" is returned instead of "on" if a value isn't specified
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ };
+ }
+});
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+});
+
+jQuery.fn.extend({
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ },
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+ }
+});
+
+
+var nonce = jQuery.now();
+
+var rquery = (/\?/);
+
+
+
+// Support: Android 2.3
+// Workaround failure to string-cast null input
+jQuery.parseJSON = function( data ) {
+ return JSON.parse( data + "" );
+};
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+ var xml, tmp;
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+
+ // Support: IE9
+ try {
+ tmp = new DOMParser();
+ xml = tmp.parseFromString( data, "text/xml" );
+ } catch ( e ) {
+ xml = undefined;
+ }
+
+ if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
+ jQuery.error( "Invalid XML: " + data );
+ }
+ return xml;
+};
+
+
+var
+ // Document location
+ ajaxLocParts,
+ ajaxLocation,
+
+ rhash = /#.*$/,
+ rts = /([?&])_=[^&]*/,
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+ // #7653, #8125, #8152: local protocol detection
+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rprotocol = /^\/\//,
+ rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
+
+ /* Prefilters
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+ * 2) These are called:
+ * - BEFORE asking for a transport
+ * - AFTER param serialization (s.data is a string if s.processData is true)
+ * 3) key is the dataType
+ * 4) the catchall symbol "*" can be used
+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+ */
+ prefilters = {},
+
+ /* Transports bindings
+ * 1) key is the dataType
+ * 2) the catchall symbol "*" can be used
+ * 3) selection will start with transport dataType and THEN go to "*" if needed
+ */
+ transports = {},
+
+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+ allTypes = "*/".concat("*");
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+ ajaxLocation = location.href;
+} catch( e ) {
+ // Use the href attribute of an A element
+ // since IE will modify it given document.location
+ ajaxLocation = document.createElement( "a" );
+ ajaxLocation.href = "";
+ ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+ // dataTypeExpression is optional and defaults to "*"
+ return function( dataTypeExpression, func ) {
+
+ if ( typeof dataTypeExpression !== "string" ) {
+ func = dataTypeExpression;
+ dataTypeExpression = "*";
+ }
+
+ var dataType,
+ i = 0,
+ dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
+
+ if ( jQuery.isFunction( func ) ) {
+ // For each dataType in the dataTypeExpression
+ while ( (dataType = dataTypes[i++]) ) {
+ // Prepend if requested
+ if ( dataType[0] === "+" ) {
+ dataType = dataType.slice( 1 ) || "*";
+ (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+ // Otherwise append
+ } else {
+ (structure[ dataType ] = structure[ dataType ] || []).push( func );
+ }
+ }
+ }
+ };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+ var inspected = {},
+ seekingTransport = ( structure === transports );
+
+ function inspect( dataType ) {
+ var selected;
+ inspected[ dataType ] = true;
+ jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+ var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+ if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+ options.dataTypes.unshift( dataTypeOrTransport );
+ inspect( dataTypeOrTransport );
+ return false;
+ } else if ( seekingTransport ) {
+ return !( selected = dataTypeOrTransport );
+ }
+ });
+ return selected;
+ }
+
+ return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+ var key, deep,
+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+ for ( key in src ) {
+ if ( src[ key ] !== undefined ) {
+ ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
+ }
+ }
+ if ( deep ) {
+ jQuery.extend( true, target, deep );
+ }
+
+ return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+ var ct, type, finalDataType, firstDataType,
+ contents = s.contents,
+ dataTypes = s.dataTypes;
+
+ // Remove auto dataType and get content-type in the process
+ while ( dataTypes[ 0 ] === "*" ) {
+ dataTypes.shift();
+ if ( ct === undefined ) {
+ ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+ }
+ }
+
+ // Check if we're dealing with a known content-type
+ if ( ct ) {
+ for ( type in contents ) {
+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
+ dataTypes.unshift( type );
+ break;
+ }
+ }
+ }
+
+ // Check to see if we have a response for the expected dataType
+ if ( dataTypes[ 0 ] in responses ) {
+ finalDataType = dataTypes[ 0 ];
+ } else {
+ // Try convertible dataTypes
+ for ( type in responses ) {
+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+ finalDataType = type;
+ break;
+ }
+ if ( !firstDataType ) {
+ firstDataType = type;
+ }
+ }
+ // Or just use first one
+ finalDataType = finalDataType || firstDataType;
+ }
+
+ // If we found a dataType
+ // We add the dataType to the list if needed
+ // and return the corresponding response
+ if ( finalDataType ) {
+ if ( finalDataType !== dataTypes[ 0 ] ) {
+ dataTypes.unshift( finalDataType );
+ }
+ return responses[ finalDataType ];
+ }
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+ var conv2, current, conv, tmp, prev,
+ converters = {},
+ // Work with a copy of dataTypes in case we need to modify it for conversion
+ dataTypes = s.dataTypes.slice();
+
+ // Create converters map with lowercased keys
+ if ( dataTypes[ 1 ] ) {
+ for ( conv in s.converters ) {
+ converters[ conv.toLowerCase() ] = s.converters[ conv ];
+ }
+ }
+
+ current = dataTypes.shift();
+
+ // Convert to each sequential dataType
+ while ( current ) {
+
+ if ( s.responseFields[ current ] ) {
+ jqXHR[ s.responseFields[ current ] ] = response;
+ }
+
+ // Apply the dataFilter if provided
+ if ( !prev && isSuccess && s.dataFilter ) {
+ response = s.dataFilter( response, s.dataType );
+ }
+
+ prev = current;
+ current = dataTypes.shift();
+
+ if ( current ) {
+
+ // There's only work to do if current dataType is non-auto
+ if ( current === "*" ) {
+
+ current = prev;
+
+ // Convert response if prev dataType is non-auto and differs from current
+ } else if ( prev !== "*" && prev !== current ) {
+
+ // Seek a direct converter
+ conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+ // If none found, seek a pair
+ if ( !conv ) {
+ for ( conv2 in converters ) {
+
+ // If conv2 outputs current
+ tmp = conv2.split( " " );
+ if ( tmp[ 1 ] === current ) {
+
+ // If prev can be converted to accepted input
+ conv = converters[ prev + " " + tmp[ 0 ] ] ||
+ converters[ "* " + tmp[ 0 ] ];
+ if ( conv ) {
+ // Condense equivalence converters
+ if ( conv === true ) {
+ conv = converters[ conv2 ];
+
+ // Otherwise, insert the intermediate dataType
+ } else if ( converters[ conv2 ] !== true ) {
+ current = tmp[ 0 ];
+ dataTypes.unshift( tmp[ 1 ] );
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ // Apply converter (if not an equivalence)
+ if ( conv !== true ) {
+
+ // Unless errors are allowed to bubble, catch and return them
+ if ( conv && s[ "throws" ] ) {
+ response = conv( response );
+ } else {
+ try {
+ response = conv( response );
+ } catch ( e ) {
+ return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return { state: "success", data: response };
+}
+
+jQuery.extend({
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {},
+
+ ajaxSettings: {
+ url: ajaxLocation,
+ type: "GET",
+ isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+ global: true,
+ processData: true,
+ async: true,
+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+ /*
+ timeout: 0,
+ data: null,
+ dataType: null,
+ username: null,
+ password: null,
+ cache: null,
+ throws: false,
+ traditional: false,
+ headers: {},
+ */
+
+ accepts: {
+ "*": allTypes,
+ text: "text/plain",
+ html: "text/html",
+ xml: "application/xml, text/xml",
+ json: "application/json, text/javascript"
+ },
+
+ contents: {
+ xml: /xml/,
+ html: /html/,
+ json: /json/
+ },
+
+ responseFields: {
+ xml: "responseXML",
+ text: "responseText",
+ json: "responseJSON"
+ },
+
+ // Data converters
+ // Keys separate source (or catchall "*") and destination types with a single space
+ converters: {
+
+ // Convert anything to text
+ "* text": String,
+
+ // Text to html (true = no transformation)
+ "text html": true,
+
+ // Evaluate text as a json expression
+ "text json": jQuery.parseJSON,
+
+ // Parse text as xml
+ "text xml": jQuery.parseXML
+ },
+
+ // For options that shouldn't be deep extended:
+ // you can add your own custom options here if
+ // and when you create one that shouldn't be
+ // deep extended (see ajaxExtend)
+ flatOptions: {
+ url: true,
+ context: true
+ }
+ },
+
+ // Creates a full fledged settings object into target
+ // with both ajaxSettings and settings fields.
+ // If target is omitted, writes into ajaxSettings.
+ ajaxSetup: function( target, settings ) {
+ return settings ?
+
+ // Building a settings object
+ ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+ // Extending ajaxSettings
+ ajaxExtend( jQuery.ajaxSettings, target );
+ },
+
+ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+ ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+ // Main method
+ ajax: function( url, options ) {
+
+ // If url is an object, simulate pre-1.5 signature
+ if ( typeof url === "object" ) {
+ options = url;
+ url = undefined;
+ }
+
+ // Force options to be an object
+ options = options || {};
+
+ var transport,
+ // URL without anti-cache param
+ cacheURL,
+ // Response headers
+ responseHeadersString,
+ responseHeaders,
+ // timeout handle
+ timeoutTimer,
+ // Cross-domain detection vars
+ parts,
+ // To know if global events are to be dispatched
+ fireGlobals,
+ // Loop variable
+ i,
+ // Create the final options object
+ s = jQuery.ajaxSetup( {}, options ),
+ // Callbacks context
+ callbackContext = s.context || s,
+ // Context for global events is callbackContext if it is a DOM node or jQuery collection
+ globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+ jQuery( callbackContext ) :
+ jQuery.event,
+ // Deferreds
+ deferred = jQuery.Deferred(),
+ completeDeferred = jQuery.Callbacks("once memory"),
+ // Status-dependent callbacks
+ statusCode = s.statusCode || {},
+ // Headers (they are sent all at once)
+ requestHeaders = {},
+ requestHeadersNames = {},
+ // The jqXHR state
+ state = 0,
+ // Default abort message
+ strAbort = "canceled",
+ // Fake xhr
+ jqXHR = {
+ readyState: 0,
+
+ // Builds headers hashtable if needed
+ getResponseHeader: function( key ) {
+ var match;
+ if ( state === 2 ) {
+ if ( !responseHeaders ) {
+ responseHeaders = {};
+ while ( (match = rheaders.exec( responseHeadersString )) ) {
+ responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+ }
+ }
+ match = responseHeaders[ key.toLowerCase() ];
+ }
+ return match == null ? null : match;
+ },
+
+ // Raw string
+ getAllResponseHeaders: function() {
+ return state === 2 ? responseHeadersString : null;
+ },
+
+ // Caches the header
+ setRequestHeader: function( name, value ) {
+ var lname = name.toLowerCase();
+ if ( !state ) {
+ name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+ requestHeaders[ name ] = value;
+ }
+ return this;
+ },
+
+ // Overrides response content-type header
+ overrideMimeType: function( type ) {
+ if ( !state ) {
+ s.mimeType = type;
+ }
+ return this;
+ },
+
+ // Status-dependent callbacks
+ statusCode: function( map ) {
+ var code;
+ if ( map ) {
+ if ( state < 2 ) {
+ for ( code in map ) {
+ // Lazy-add the new callback in a way that preserves old ones
+ statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+ }
+ } else {
+ // Execute the appropriate callbacks
+ jqXHR.always( map[ jqXHR.status ] );
+ }
+ }
+ return this;
+ },
+
+ // Cancel the request
+ abort: function( statusText ) {
+ var finalText = statusText || strAbort;
+ if ( transport ) {
+ transport.abort( finalText );
+ }
+ done( 0, finalText );
+ return this;
+ }
+ };
+
+ // Attach deferreds
+ deferred.promise( jqXHR ).complete = completeDeferred.add;
+ jqXHR.success = jqXHR.done;
+ jqXHR.error = jqXHR.fail;
+
+ // Remove hash character (#7531: and string promotion)
+ // Add protocol if not provided (prefilters might expect it)
+ // Handle falsy url in the settings object (#10093: consistency with old signature)
+ // We also use the url parameter if available
+ s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
+ .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+ // Alias method option to type as per ticket #12004
+ s.type = options.method || options.type || s.method || s.type;
+
+ // Extract dataTypes list
+ s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
+
+ // A cross-domain request is in order when we have a protocol:host:port mismatch
+ if ( s.crossDomain == null ) {
+ parts = rurl.exec( s.url.toLowerCase() );
+ s.crossDomain = !!( parts &&
+ ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+ ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+ ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+ );
+ }
+
+ // Convert data if not already a string
+ if ( s.data && s.processData && typeof s.data !== "string" ) {
+ s.data = jQuery.param( s.data, s.traditional );
+ }
+
+ // Apply prefilters
+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+ // If request was aborted inside a prefilter, stop there
+ if ( state === 2 ) {
+ return jqXHR;
+ }
+
+ // We can fire global events as of now if asked to
+ fireGlobals = s.global;
+
+ // Watch for a new set of requests
+ if ( fireGlobals && jQuery.active++ === 0 ) {
+ jQuery.event.trigger("ajaxStart");
+ }
+
+ // Uppercase the type
+ s.type = s.type.toUpperCase();
+
+ // Determine if request has content
+ s.hasContent = !rnoContent.test( s.type );
+
+ // Save the URL in case we're toying with the If-Modified-Since
+ // and/or If-None-Match header later on
+ cacheURL = s.url;
+
+ // More options handling for requests with no content
+ if ( !s.hasContent ) {
+
+ // If data is available, append data to url
+ if ( s.data ) {
+ cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+ // #9682: remove data so that it's not used in an eventual retry
+ delete s.data;
+ }
+
+ // Add anti-cache in url if needed
+ if ( s.cache === false ) {
+ s.url = rts.test( cacheURL ) ?
+
+ // If there is already a '_' parameter, set its value
+ cacheURL.replace( rts, "$1_=" + nonce++ ) :
+
+ // Otherwise add one to the end
+ cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
+ }
+ }
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ if ( jQuery.lastModified[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+ }
+ if ( jQuery.etag[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+ }
+ }
+
+ // Set the correct header, if data is being sent
+ if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+ jqXHR.setRequestHeader( "Content-Type", s.contentType );
+ }
+
+ // Set the Accepts header for the server, depending on the dataType
+ jqXHR.setRequestHeader(
+ "Accept",
+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+ s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+ s.accepts[ "*" ]
+ );
+
+ // Check for headers option
+ for ( i in s.headers ) {
+ jqXHR.setRequestHeader( i, s.headers[ i ] );
+ }
+
+ // Allow custom headers/mimetypes and early abort
+ if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+ // Abort if not done already and return
+ return jqXHR.abort();
+ }
+
+ // aborting is no longer a cancellation
+ strAbort = "abort";
+
+ // Install callbacks on deferreds
+ for ( i in { success: 1, error: 1, complete: 1 } ) {
+ jqXHR[ i ]( s[ i ] );
+ }
+
+ // Get transport
+ transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+ // If no transport, we auto-abort
+ if ( !transport ) {
+ done( -1, "No Transport" );
+ } else {
+ jqXHR.readyState = 1;
+
+ // Send global event
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+ }
+ // Timeout
+ if ( s.async && s.timeout > 0 ) {
+ timeoutTimer = setTimeout(function() {
+ jqXHR.abort("timeout");
+ }, s.timeout );
+ }
+
+ try {
+ state = 1;
+ transport.send( requestHeaders, done );
+ } catch ( e ) {
+ // Propagate exception as error if not done
+ if ( state < 2 ) {
+ done( -1, e );
+ // Simply rethrow otherwise
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ // Callback for when everything is done
+ function done( status, nativeStatusText, responses, headers ) {
+ var isSuccess, success, error, response, modified,
+ statusText = nativeStatusText;
+
+ // Called once
+ if ( state === 2 ) {
+ return;
+ }
+
+ // State is "done" now
+ state = 2;
+
+ // Clear timeout if it exists
+ if ( timeoutTimer ) {
+ clearTimeout( timeoutTimer );
+ }
+
+ // Dereference transport for early garbage collection
+ // (no matter how long the jqXHR object will be used)
+ transport = undefined;
+
+ // Cache response headers
+ responseHeadersString = headers || "";
+
+ // Set readyState
+ jqXHR.readyState = status > 0 ? 4 : 0;
+
+ // Determine if successful
+ isSuccess = status >= 200 && status < 300 || status === 304;
+
+ // Get response data
+ if ( responses ) {
+ response = ajaxHandleResponses( s, jqXHR, responses );
+ }
+
+ // Convert no matter what (that way responseXXX fields are always set)
+ response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+ // If successful, handle type chaining
+ if ( isSuccess ) {
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ modified = jqXHR.getResponseHeader("Last-Modified");
+ if ( modified ) {
+ jQuery.lastModified[ cacheURL ] = modified;
+ }
+ modified = jqXHR.getResponseHeader("etag");
+ if ( modified ) {
+ jQuery.etag[ cacheURL ] = modified;
+ }
+ }
+
+ // if no content
+ if ( status === 204 || s.type === "HEAD" ) {
+ statusText = "nocontent";
+
+ // if not modified
+ } else if ( status === 304 ) {
+ statusText = "notmodified";
+
+ // If we have data, let's convert it
+ } else {
+ statusText = response.state;
+ success = response.data;
+ error = response.error;
+ isSuccess = !error;
+ }
+ } else {
+ // We extract error from statusText
+ // then normalize statusText and status for non-aborts
+ error = statusText;
+ if ( status || !statusText ) {
+ statusText = "error";
+ if ( status < 0 ) {
+ status = 0;
+ }
+ }
+ }
+
+ // Set data for the fake xhr object
+ jqXHR.status = status;
+ jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+ // Success/Error
+ if ( isSuccess ) {
+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+ } else {
+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+ }
+
+ // Status-dependent callbacks
+ jqXHR.statusCode( statusCode );
+ statusCode = undefined;
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+ [ jqXHR, s, isSuccess ? success : error ] );
+ }
+
+ // Complete
+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+ // Handle the global AJAX counter
+ if ( !( --jQuery.active ) ) {
+ jQuery.event.trigger("ajaxStop");
+ }
+ }
+ }
+
+ return jqXHR;
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get( url, data, callback, "json" );
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get( url, undefined, callback, "script" );
+ }
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+ jQuery[ method ] = function( url, data, callback, type ) {
+ // shift arguments if data argument was omitted
+ if ( jQuery.isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = undefined;
+ }
+
+ return jQuery.ajax({
+ url: url,
+ type: method,
+ dataType: type,
+ data: data,
+ success: callback
+ });
+ };
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
+ jQuery.fn[ type ] = function( fn ) {
+ return this.on( type, fn );
+ };
+});
+
+
+jQuery._evalUrl = function( url ) {
+ return jQuery.ajax({
+ url: url,
+ type: "GET",
+ dataType: "script",
+ async: false,
+ global: false,
+ "throws": true
+ });
+};
+
+
+jQuery.fn.extend({
+ wrapAll: function( html ) {
+ var wrap;
+
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( html.call(this, i) );
+ });
+ }
+
+ if ( this[ 0 ] ) {
+
+ // The elements to wrap the target around
+ wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+ if ( this[ 0 ].parentNode ) {
+ wrap.insertBefore( this[ 0 ] );
+ }
+
+ wrap.map(function() {
+ var elem = this;
+
+ while ( elem.firstElementChild ) {
+ elem = elem.firstElementChild;
+ }
+
+ return elem;
+ }).append( this );
+ }
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapInner( html.call(this, i) );
+ });
+ }
+
+ return this.each(function() {
+ var self = jQuery( this ),
+ contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
+ }
+ });
+ },
+
+ wrap: function( html ) {
+ var isFunction = jQuery.isFunction( html );
+
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+ });
+ },
+
+ unwrap: function() {
+ return this.parent().each(function() {
+ if ( !jQuery.nodeName( this, "body" ) ) {
+ jQuery( this ).replaceWith( this.childNodes );
+ }
+ }).end();
+ }
+});
+
+
+jQuery.expr.filters.hidden = function( elem ) {
+ // Support: Opera <= 12.12
+ // Opera reports offsetWidths and offsetHeights less than zero on some elements
+ return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
+};
+jQuery.expr.filters.visible = function( elem ) {
+ return !jQuery.expr.filters.hidden( elem );
+};
+
+
+
+
+var r20 = /%20/g,
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+ var name;
+
+ if ( jQuery.isArray( obj ) ) {
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || rbracket.test( prefix ) ) {
+ // Treat each array item as a scalar.
+ add( prefix, v );
+
+ } else {
+ // Item is non-scalar (array or object), encode its numeric index.
+ buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+ }
+ });
+
+ } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+ // Serialize object item.
+ for ( name in obj ) {
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+ }
+
+ } else {
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+ var prefix,
+ s = [],
+ add = function( key, value ) {
+ // If value is a function, invoke it and return its value
+ value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+ s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+ };
+
+ // Set traditional to true for jQuery <= 1.3.2 behavior.
+ if ( traditional === undefined ) {
+ traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ });
+
+ } else {
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( prefix in a ) {
+ buildParams( prefix, a[ prefix ], traditional, add );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join( "&" ).replace( r20, "+" );
+};
+
+jQuery.fn.extend({
+ serialize: function() {
+ return jQuery.param( this.serializeArray() );
+ },
+ serializeArray: function() {
+ return this.map(function() {
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop( this, "elements" );
+ return elements ? jQuery.makeArray( elements ) : this;
+ })
+ .filter(function() {
+ var type = this.type;
+
+ // Use .is( ":disabled" ) so that fieldset[disabled] works
+ return this.name && !jQuery( this ).is( ":disabled" ) &&
+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+ ( this.checked || !rcheckableType.test( type ) );
+ })
+ .map(function( i, elem ) {
+ var val = jQuery( this ).val();
+
+ return val == null ?
+ null :
+ jQuery.isArray( val ) ?
+ jQuery.map( val, function( val ) {
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }) :
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }).get();
+ }
+});
+
+
+jQuery.ajaxSettings.xhr = function() {
+ try {
+ return new XMLHttpRequest();
+ } catch( e ) {}
+};
+
+var xhrId = 0,
+ xhrCallbacks = {},
+ xhrSuccessStatus = {
+ // file protocol always yields status code 0, assume 200
+ 0: 200,
+ // Support: IE9
+ // #1450: sometimes IE returns 1223 when it should be 204
+ 1223: 204
+ },
+ xhrSupported = jQuery.ajaxSettings.xhr();
+
+// Support: IE9
+// Open requests must be manually aborted on unload (#5280)
+if ( window.ActiveXObject ) {
+ jQuery( window ).on( "unload", function() {
+ for ( var key in xhrCallbacks ) {
+ xhrCallbacks[ key ]();
+ }
+ });
+}
+
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport(function( options ) {
+ var callback;
+
+ // Cross domain only allowed if supported through XMLHttpRequest
+ if ( support.cors || xhrSupported && !options.crossDomain ) {
+ return {
+ send: function( headers, complete ) {
+ var i,
+ xhr = options.xhr(),
+ id = ++xhrId;
+
+ xhr.open( options.type, options.url, options.async, options.username, options.password );
+
+ // Apply custom fields if provided
+ if ( options.xhrFields ) {
+ for ( i in options.xhrFields ) {
+ xhr[ i ] = options.xhrFields[ i ];
+ }
+ }
+
+ // Override mime type if needed
+ if ( options.mimeType && xhr.overrideMimeType ) {
+ xhr.overrideMimeType( options.mimeType );
+ }
+
+ // X-Requested-With header
+ // For cross-domain requests, seeing as conditions for a preflight are
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
+ // (it can always be set on a per-request basis or even using ajaxSetup)
+ // For same-domain requests, won't change header if already provided.
+ if ( !options.crossDomain && !headers["X-Requested-With"] ) {
+ headers["X-Requested-With"] = "XMLHttpRequest";
+ }
+
+ // Set headers
+ for ( i in headers ) {
+ xhr.setRequestHeader( i, headers[ i ] );
+ }
+
+ // Callback
+ callback = function( type ) {
+ return function() {
+ if ( callback ) {
+ delete xhrCallbacks[ id ];
+ callback = xhr.onload = xhr.onerror = null;
+
+ if ( type === "abort" ) {
+ xhr.abort();
+ } else if ( type === "error" ) {
+ complete(
+ // file: protocol always yields status 0; see #8605, #14207
+ xhr.status,
+ xhr.statusText
+ );
+ } else {
+ complete(
+ xhrSuccessStatus[ xhr.status ] || xhr.status,
+ xhr.statusText,
+ // Support: IE9
+ // Accessing binary-data responseText throws an exception
+ // (#11426)
+ typeof xhr.responseText === "string" ? {
+ text: xhr.responseText
+ } : undefined,
+ xhr.getAllResponseHeaders()
+ );
+ }
+ }
+ };
+ };
+
+ // Listen to events
+ xhr.onload = callback();
+ xhr.onerror = callback("error");
+
+ // Create the abort callback
+ callback = xhrCallbacks[ id ] = callback("abort");
+
+ try {
+ // Do send the request (this may raise an exception)
+ xhr.send( options.hasContent && options.data || null );
+ } catch ( e ) {
+ // #14683: Only rethrow if this hasn't been notified as an error yet
+ if ( callback ) {
+ throw e;
+ }
+ }
+ },
+
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+ accepts: {
+ script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+ },
+ contents: {
+ script: /(?:java|ecma)script/
+ },
+ converters: {
+ "text script": function( text ) {
+ jQuery.globalEval( text );
+ return text;
+ }
+ }
+});
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+ if ( s.cache === undefined ) {
+ s.cache = false;
+ }
+ if ( s.crossDomain ) {
+ s.type = "GET";
+ }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+ // This transport only deals with cross domain requests
+ if ( s.crossDomain ) {
+ var script, callback;
+ return {
+ send: function( _, complete ) {
+ script = jQuery("<script>").prop({
+ async: true,
+ charset: s.scriptCharset,
+ src: s.url
+ }).on(
+ "load error",
+ callback = function( evt ) {
+ script.remove();
+ callback = null;
+ if ( evt ) {
+ complete( evt.type === "error" ? 404 : 200, evt.type );
+ }
+ }
+ );
+ document.head.appendChild( script[ 0 ] );
+ },
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+var oldCallbacks = [],
+ rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+ jsonp: "callback",
+ jsonpCallback: function() {
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+ this[ callback ] = true;
+ return callback;
+ }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+ var callbackName, overwritten, responseContainer,
+ jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+ "url" :
+ typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+ );
+
+ // Handle iff the expected data type is "jsonp" or we have a parameter to set
+ if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+ // Get callback name, remembering preexisting value associated with it
+ callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+ s.jsonpCallback() :
+ s.jsonpCallback;
+
+ // Insert callback into url or form data
+ if ( jsonProp ) {
+ s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+ } else if ( s.jsonp !== false ) {
+ s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+ }
+
+ // Use data converter to retrieve json after script execution
+ s.converters["script json"] = function() {
+ if ( !responseContainer ) {
+ jQuery.error( callbackName + " was not called" );
+ }
+ return responseContainer[ 0 ];
+ };
+
+ // force json dataType
+ s.dataTypes[ 0 ] = "json";
+
+ // Install callback
+ overwritten = window[ callbackName ];
+ window[ callbackName ] = function() {
+ responseContainer = arguments;
+ };
+
+ // Clean-up function (fires after converters)
+ jqXHR.always(function() {
+ // Restore preexisting value
+ window[ callbackName ] = overwritten;
+
+ // Save back as free
+ if ( s[ callbackName ] ) {
+ // make sure that re-using the options doesn't screw things around
+ s.jsonpCallback = originalSettings.jsonpCallback;
+
+ // save the callback name for future use
+ oldCallbacks.push( callbackName );
+ }
+
+ // Call if it was a function and we have a response
+ if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+ overwritten( responseContainer[ 0 ] );
+ }
+
+ responseContainer = overwritten = undefined;
+ });
+
+ // Delegate to script
+ return "script";
+ }
+});
+
+
+
+
+// data: string of html
+// context (optional): If specified, the fragment will be created in this context, defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+ if ( typeof context === "boolean" ) {
+ keepScripts = context;
+ context = false;
+ }
+ context = context || document;
+
+ var parsed = rsingleTag.exec( data ),
+ scripts = !keepScripts && [];
+
+ // Single tag
+ if ( parsed ) {
+ return [ context.createElement( parsed[1] ) ];
+ }
+
+ parsed = jQuery.buildFragment( [ data ], context, scripts );
+
+ if ( scripts && scripts.length ) {
+ jQuery( scripts ).remove();
+ }
+
+ return jQuery.merge( [], parsed.childNodes );
+};
+
+
+// Keep a copy of the old load method
+var _load = jQuery.fn.load;
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+ if ( typeof url !== "string" && _load ) {
+ return _load.apply( this, arguments );
+ }
+
+ var selector, type, response,
+ self = this,
+ off = url.indexOf(" ");
+
+ if ( off >= 0 ) {
+ selector = jQuery.trim( url.slice( off ) );
+ url = url.slice( 0, off );
+ }
+
+ // If it's a function
+ if ( jQuery.isFunction( params ) ) {
+
+ // We assume that it's the callback
+ callback = params;
+ params = undefined;
+
+ // Otherwise, build a param string
+ } else if ( params && typeof params === "object" ) {
+ type = "POST";
+ }
+
+ // If we have elements to modify, make the request
+ if ( self.length > 0 ) {
+ jQuery.ajax({
+ url: url,
+
+ // if "type" variable is undefined, then "GET" method will be used
+ type: type,
+ dataType: "html",
+ data: params
+ }).done(function( responseText ) {
+
+ // Save response for use in complete callback
+ response = arguments;
+
+ self.html( selector ?
+
+ // If a selector was specified, locate the right elements in a dummy div
+ // Exclude scripts to avoid IE 'Permission Denied' errors
+ jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+ // Otherwise use the full result
+ responseText );
+
+ }).complete( callback && function( jqXHR, status ) {
+ self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+ });
+ }
+
+ return this;
+};
+
+
+
+
+jQuery.expr.filters.animated = function( elem ) {
+ return jQuery.grep(jQuery.timers, function( fn ) {
+ return elem === fn.elem;
+ }).length;
+};
+
+
+
+
+var docElem = window.document.documentElement;
+
+/**
+ * Gets a window from an element
+ */
+function getWindow( elem ) {
+ return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
+}
+
+jQuery.offset = {
+ setOffset: function( elem, options, i ) {
+ var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+ position = jQuery.css( elem, "position" ),
+ curElem = jQuery( elem ),
+ props = {};
+
+ // Set position first, in-case top/left are set even on static elem
+ if ( position === "static" ) {
+ elem.style.position = "relative";
+ }
+
+ curOffset = curElem.offset();
+ curCSSTop = jQuery.css( elem, "top" );
+ curCSSLeft = jQuery.css( elem, "left" );
+ calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+ ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
+
+ // Need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+ if ( calculatePosition ) {
+ curPosition = curElem.position();
+ curTop = curPosition.top;
+ curLeft = curPosition.left;
+
+ } else {
+ curTop = parseFloat( curCSSTop ) || 0;
+ curLeft = parseFloat( curCSSLeft ) || 0;
+ }
+
+ if ( jQuery.isFunction( options ) ) {
+ options = options.call( elem, i, curOffset );
+ }
+
+ if ( options.top != null ) {
+ props.top = ( options.top - curOffset.top ) + curTop;
+ }
+ if ( options.left != null ) {
+ props.left = ( options.left - curOffset.left ) + curLeft;
+ }
+
+ if ( "using" in options ) {
+ options.using.call( elem, props );
+
+ } else {
+ curElem.css( props );
+ }
+ }
+};
+
+jQuery.fn.extend({
+ offset: function( options ) {
+ if ( arguments.length ) {
+ return options === undefined ?
+ this :
+ this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ var docElem, win,
+ elem = this[ 0 ],
+ box = { top: 0, left: 0 },
+ doc = elem && elem.ownerDocument;
+
+ if ( !doc ) {
+ return;
+ }
+
+ docElem = doc.documentElement;
+
+ // Make sure it's not a disconnected DOM node
+ if ( !jQuery.contains( docElem, elem ) ) {
+ return box;
+ }
+
+ // If we don't have gBCR, just use 0,0 rather than error
+ // BlackBerry 5, iOS 3 (original iPhone)
+ if ( typeof elem.getBoundingClientRect !== strundefined ) {
+ box = elem.getBoundingClientRect();
+ }
+ win = getWindow( doc );
+ return {
+ top: box.top + win.pageYOffset - docElem.clientTop,
+ left: box.left + win.pageXOffset - docElem.clientLeft
+ };
+ },
+
+ position: function() {
+ if ( !this[ 0 ] ) {
+ return;
+ }
+
+ var offsetParent, offset,
+ elem = this[ 0 ],
+ parentOffset = { top: 0, left: 0 };
+
+ // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
+ if ( jQuery.css( elem, "position" ) === "fixed" ) {
+ // We assume that getBoundingClientRect is available when computed position is fixed
+ offset = elem.getBoundingClientRect();
+
+ } else {
+ // Get *real* offsetParent
+ offsetParent = this.offsetParent();
+
+ // Get correct offsets
+ offset = this.offset();
+ if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+ parentOffset = offsetParent.offset();
+ }
+
+ // Add offsetParent borders
+ parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+ parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+ }
+
+ // Subtract parent offsets and element margins
+ return {
+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+ };
+ },
+
+ offsetParent: function() {
+ return this.map(function() {
+ var offsetParent = this.offsetParent || docElem;
+
+ while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
+ offsetParent = offsetParent.offsetParent;
+ }
+
+ return offsetParent || docElem;
+ });
+ }
+});
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+ var top = "pageYOffset" === prop;
+
+ jQuery.fn[ method ] = function( val ) {
+ return access( this, function( elem, method, val ) {
+ var win = getWindow( elem );
+
+ if ( val === undefined ) {
+ return win ? win[ prop ] : elem[ method ];
+ }
+
+ if ( win ) {
+ win.scrollTo(
+ !top ? val : window.pageXOffset,
+ top ? val : window.pageYOffset
+ );
+
+ } else {
+ elem[ method ] = val;
+ }
+ }, method, val, arguments.length, null );
+ };
+});
+
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// getComputedStyle returns percent when specified for top/left/bottom/right
+// rather than make the css module depend on the offset module, we just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+ jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+ function( elem, computed ) {
+ if ( computed ) {
+ computed = curCSS( elem, prop );
+ // if curCSS returns percentage, fallback to offset
+ return rnumnonpx.test( computed ) ?
+ jQuery( elem ).position()[ prop ] + "px" :
+ computed;
+ }
+ }
+ );
+});
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+ jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+ // margin is only for outerHeight, outerWidth
+ jQuery.fn[ funcName ] = function( margin, value ) {
+ var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+ extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+ return access( this, function( elem, type, value ) {
+ var doc;
+
+ if ( jQuery.isWindow( elem ) ) {
+ // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+ // isn't a whole lot we can do. See pull request at this URL for discussion:
+ // https://github.com/jquery/jquery/pull/764
+ return elem.document.documentElement[ "client" + name ];
+ }
+
+ // Get document width or height
+ if ( elem.nodeType === 9 ) {
+ doc = elem.documentElement;
+
+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+ // whichever is greatest
+ return Math.max(
+ elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+ elem.body[ "offset" + name ], doc[ "offset" + name ],
+ doc[ "client" + name ]
+ );
+ }
+
+ return value === undefined ?
+ // Get width or height on the element, requesting but not forcing parseFloat
+ jQuery.css( elem, type, extra ) :
+
+ // Set width or height on the element
+ jQuery.style( elem, type, value, extra );
+ }, type, chainable ? margin : undefined, chainable, null );
+ };
+ });
+});
+
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+ return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+ define( "jquery", [], function() {
+ return jQuery;
+ });
+}
+
+
+
+
+var
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
+
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in
+// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( typeof noGlobal === strundefined ) {
+ window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+
+}));
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/README b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/README
new file mode 100644
index 0000000..a8c11c4
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/README
@@ -0,0 +1,14 @@
+The following is the license information for the file jquery-src.js
+/*!
+ * jQuery JavaScript Library v2.1.1
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-05-01T17:11Z
+ */
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/jquery-src.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/jquery-src.js
new file mode 100644
index 0000000..9f7b3d3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/jquery-src.js
@@ -0,0 +1,9190 @@
+/*!
+ * jQuery JavaScript Library v2.1.1
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-05-01T17:11Z
+ */
+
+(function( global, factory ) {
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+ // For CommonJS and CommonJS-like environments where a proper window is present,
+ // execute the factory and get jQuery
+ // For environments that do not inherently posses a window with a document
+ // (such as Node.js), expose a jQuery-making factory as module.exports
+ // This accentuates the need for the creation of a real window
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//
+
+var arr = [];
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var support = {};
+
+
+
+var
+ // Use the correct document accordingly with window argument (sandbox)
+ document = window.document,
+
+ version = "2.1.1",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android<4.1
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+ // Matches dashed string for camelizing
+ rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([\da-z])/gi,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return letter.toUpperCase();
+ };
+
+jQuery.fn = jQuery.prototype = {
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // Start with an empty selector
+ selector: "",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num != null ?
+
+ // Return just the one element from the set
+ ( num < 0 ? this[ num + this.length ] : this[ num ] ) :
+
+ // Return all the elements in a clean array
+ slice.call( this );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+ ret.context = this.context;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+ target = {};
+ }
+
+ // extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+ // Only deal with non-null/undefined values
+ if ( (options = arguments[ i ]) != null ) {
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend({
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ // See test/unit/core.js for details concerning isFunction.
+ // Since version 1.3, DOM methods and functions like alert
+ // aren't supported. They return false on IE (#2968).
+ isFunction: function( obj ) {
+ return jQuery.type(obj) === "function";
+ },
+
+ isArray: Array.isArray,
+
+ isWindow: function( obj ) {
+ return obj != null && obj === obj.window;
+ },
+
+ isNumeric: function( obj ) {
+ // parseFloat NaNs numeric-cast false positives (null|true|false|"")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0;
+ },
+
+ isPlainObject: function( obj ) {
+ // Not plain objects:
+ // - Any object or value whose internal [[Class]] property is not "[object Object]"
+ // - DOM nodes
+ // - window
+ if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.constructor &&
+ !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
+ return false;
+ }
+
+ // If the function hasn't returned already, we're confident that
+ // |obj| is a plain object, created by {} or constructed with new Object
+ return true;
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ type: function( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+ // Support: Android < 4.0, iOS < 6 (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call(obj) ] || "object" :
+ typeof obj;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function( code ) {
+ var script,
+ indirect = eval;
+
+ code = jQuery.trim( code );
+
+ if ( code ) {
+ // If the code includes a valid, prologue position
+ // strict mode pragma, execute code by injecting a
+ // script tag into the document.
+ if ( code.indexOf("use strict") === 1 ) {
+ script = document.createElement("script");
+ script.text = code;
+ document.head.appendChild( script ).parentNode.removeChild( script );
+ } else {
+ // Otherwise, avoid the DOM node creation, insertion
+ // and removal by using an indirect global eval
+ indirect( code );
+ }
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ },
+
+ // args is for internal usage only
+ each: function( obj, callback, args ) {
+ var value,
+ i = 0,
+ length = obj.length,
+ isArray = isArraylike( obj );
+
+ if ( args ) {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.apply( obj[ i ], args );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ value = callback.call( obj[ i ], i, obj[ i ] );
+
+ if ( value === false ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android<4.1
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArraylike( Object(arr) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var value,
+ i = 0,
+ length = elems.length,
+ isArray = isArraylike( elems ),
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ now: Date.now,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+ var length = obj.length,
+ type = jQuery.type( obj );
+
+ if ( type === "function" || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ if ( obj.nodeType === 1 && length ) {
+ return true;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v1.10.19
+ * http://sizzlejs.com/
+ *
+ * Copyright 2013 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2014-04-18
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + -(new Date()),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // General-purpose constants
+ strundefined = typeof undefined,
+ MAX_NEGATIVE = 1 << 31,
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf if we can't use a native one
+ indexOf = arr.indexOf || function( elem ) {
+ var i = 0,
+ len = this.length;
+ for ( ; i < len; i++ ) {
+ if ( this[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+ // http://www.w3.org/TR/css3-syntax/#characters
+ characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+ // Loosely modeled on CSS identifier characters
+ // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+ // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = characterEncoding.replace( "w", "w#" ),
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + characterEncoding + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + characterEncoding + ")" ),
+ "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+ "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+ rescape = /'|\\/g,
+
+ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ };
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var match, elem, m, nodeType,
+ // QSA vars
+ i, groups, old, nid, newContext, newSelector;
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+
+ context = context || document;
+ results = results || [];
+
+ if ( !selector || typeof selector !== "string" ) {
+ return results;
+ }
+
+ if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+ return [];
+ }
+
+ if ( documentIsHTML && !seed ) {
+
+ // Shortcuts
+ if ( (match = rquickExpr.exec( selector )) ) {
+ // Speed-up: Sizzle("#ID")
+ if ( (m = match[1]) ) {
+ if ( nodeType === 9 ) {
+ elem = context.getElementById( m );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document (jQuery #6963)
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE, Opera, and Webkit return items
+ // by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+ } else {
+ // Context is not a document
+ if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+ contains( context, elem ) && elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Speed-up: Sizzle("TAG")
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Speed-up: Sizzle(".CLASS")
+ } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // QSA path
+ if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+ nid = old = expando;
+ newContext = context;
+ newSelector = nodeType === 9 && selector;
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+ groups = tokenize( selector );
+
+ if ( (old = context.getAttribute("id")) ) {
+ nid = old.replace( rescape, "\\$&" );
+ } else {
+ context.setAttribute( "id", nid );
+ }
+ nid = "[id='" + nid + "'] ";
+
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = nid + toSelector( groups[i] );
+ }
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
+ newSelector = groups.join(",");
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch(qsaError) {
+ } finally {
+ if ( !old ) {
+ context.removeAttribute("id");
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+ var div = document.createElement("div");
+
+ try {
+ return !!fn( div );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( div.parentNode ) {
+ div.parentNode.removeChild( div );
+ }
+ // release memory in IE
+ div = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = attrs.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ ( ~b.sourceIndex || MAX_NEGATIVE ) -
+ ( ~a.sourceIndex || MAX_NEGATIVE );
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== strundefined && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare,
+ doc = node ? node.ownerDocument || node : preferredDoc,
+ parent = doc.defaultView;
+
+ // If no document and documentElement is available, return
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Set our document
+ document = doc;
+ docElem = doc.documentElement;
+
+ // Support tests
+ documentIsHTML = !isXML( doc );
+
+ // Support: IE>8
+ // If iframe document is assigned to "document" variable and if iframe has been reloaded,
+ // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
+ // IE6-8 do not support the defaultView property so parent will be undefined
+ if ( parent && parent !== parent.top ) {
+ // IE11 does not have attachEvent, so all must suffer
+ if ( parent.addEventListener ) {
+ parent.addEventListener( "unload", function() {
+ setDocument();
+ }, false );
+ } else if ( parent.attachEvent ) {
+ parent.attachEvent( "onunload", function() {
+ setDocument();
+ });
+ }
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
+ support.attributes = assert(function( div ) {
+ div.className = "i";
+ return !div.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( div ) {
+ div.appendChild( doc.createComment("") );
+ return !div.getElementsByTagName("*").length;
+ });
+
+ // Check if getElementsByClassName can be trusted
+ support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {
+ div.innerHTML = "<div class='a'></div><div class='a i'></div>";
+
+ // Support: Safari<4
+ // Catch class over-caching
+ div.firstChild.className = "i";
+ // Support: Opera<10
+ // Catch gEBCN failure to find non-leading classes
+ return div.getElementsByClassName("i").length === 2;
+ });
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( div ) {
+ docElem.appendChild( div ).id = expando;
+ return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
+ });
+
+ // ID find and filter
+ if ( support.getById ) {
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
+ var m = context.getElementById( id );
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [ m ] : [];
+ }
+ };
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ } else {
+ // Support: IE6/7
+ // getElementById is not reliable as a find shortcut
+ delete Expr.find["ID"];
+
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== strundefined ) {
+ return context.getElementsByTagName( tag );
+ }
+ } :
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See http://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( div ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // http://bugs.jquery.com/ticket/12359
+ div.innerHTML = "<select msallowclip=''><option selected=''></option></select>";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( div.querySelectorAll("[msallowclip^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !div.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+ });
+
+ assert(function( div ) {
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = doc.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ div.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( div.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( !div.querySelectorAll(":enabled").length ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ div.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( div ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( div, "div" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( div, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully does not implement inclusive descendent
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === doc ? -1 :
+ b === doc ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return doc;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch(e) {}
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, outerCache, node, diff, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+ // Seek `elem` from a previously-cached index
+ outerCache = parent[ expando ] || (parent[ expando ] = {});
+ cache = outerCache[ type ] || [];
+ nodeIndex = cache[0] === dirruns && cache[1];
+ diff = cache[0] === dirruns && cache[2];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ // Use previously-cached element index if available
+ } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+ diff = cache[1];
+
+ // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ } else {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf.call( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": function( elem ) {
+ return elem.disabled === false;
+ },
+
+ "disabled": function( elem ) {
+ return elem.disabled === true;
+ },
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ checkNonElements = base && dir === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+ if ( (oldCache = outerCache[ dir ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ outerCache[ dir ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf.call( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context !== document && context;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context, xml ) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // Apply set filters to unmatched elements
+ matchedCount += i;
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is no seed and only one group
+ if ( match.length === 1 ) {
+
+ // Take a shortcut and set the context if the root selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ support.getById && context.nodeType === 9 && documentIsHTML &&
+ Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome<14
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( div1 ) {
+ // Should return 1, but returns 4 (following)
+ return div1.compareDocumentPosition( document.createElement("div") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( div ) {
+ div.innerHTML = "<a href='#'></a>";
+ return div.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( div ) {
+ div.innerHTML = "<input/>";
+ div.firstChild.setAttribute( "value", "" );
+ return div.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( div ) {
+ return div.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
+
+
+
+var risSimple = /^.[^:#\[\.,]*$/;
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ /* jshint -W018 */
+ return !!qualifier.call( elem, i, elem ) !== not;
+ });
+
+ }
+
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ });
+
+ }
+
+ if ( typeof qualifier === "string" ) {
+ if ( risSimple.test( qualifier ) ) {
+ return jQuery.filter( qualifier, elements, not );
+ }
+
+ qualifier = jQuery.filter( qualifier, elements );
+ }
+
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
+ });
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 && elem.nodeType === 1 ?
+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ }));
+};
+
+jQuery.fn.extend({
+ find: function( selector ) {
+ var i,
+ len = this.length,
+ ret = [],
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter(function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ }) );
+ }
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ // Needed because $( selector, context ) becomes $( context ).find( selector )
+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+ ret.selector = this.selector ? this.selector + " " + selector : selector;
+ return ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], false) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow(this, selector || [], true) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+});
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+ init = jQuery.fn.init = function( selector, context ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ context = context instanceof jQuery ? context[0] : context;
+
+ // scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[1],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+ // Properties of context are called as methods if possible
+ if ( jQuery.isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[2] );
+
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if ( elem && elem.parentNode ) {
+ // Inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || rootjQuery ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return typeof rootjQuery.ready !== "undefined" ?
+ rootjQuery.ready( selector ) :
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+ // methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.extend({
+ dir: function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+ },
+
+ sibling: function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+ }
+});
+
+jQuery.fn.extend({
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter(function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[i] ) ) {
+ return true;
+ }
+ }
+ });
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( ; i < l; i++ ) {
+ for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && (pos ?
+ pos.index(cur) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector(cur, selectors)) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
+ },
+
+ // Determine the position of an element within
+ // the matched set of elements
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.unique(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter(selector)
+ );
+ }
+});
+
+function sibling( cur, dir ) {
+ while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each({
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return jQuery.dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return jQuery.dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return jQuery.dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return jQuery.sibling( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.unique( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+});
+var rnotwhite = (/\S+/g);
+
+
+
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+ var object = optionsCache[ options ] = {};
+ jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ });
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ ( optionsCache[ options ] || createOptions( options ) ) :
+ jQuery.extend( {}, options );
+
+ var // Last fire value (for non-forgettable lists)
+ memory,
+ // Flag to know if list was already fired
+ fired,
+ // Flag to know if list is currently firing
+ firing,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
+ // End of the loop when firing
+ firingLength,
+ // Index of currently firing callback (modified by remove if needed)
+ firingIndex,
+ // Actual callback list
+ list = [],
+ // Stack of fire calls for repeatable lists
+ stack = !options.once && [],
+ // Fire callbacks
+ fire = function( data ) {
+ memory = options.memory && data;
+ fired = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ firing = true;
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+ if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+ memory = false; // To prevent further calls using add
+ break;
+ }
+ }
+ firing = false;
+ if ( list ) {
+ if ( stack ) {
+ if ( stack.length ) {
+ fire( stack.shift() );
+ }
+ } else if ( memory ) {
+ list = [];
+ } else {
+ self.disable();
+ }
+ }
+ },
+ // Actual Callbacks object
+ self = {
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+ // First, we save the current length
+ var start = list.length;
+ (function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ var type = jQuery.type( arg );
+ if ( type === "function" ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && type !== "string" ) {
+ // Inspect recursively
+ add( arg );
+ }
+ });
+ })( arguments );
+ // Do we need to add the callbacks to the
+ // current firing batch?
+ if ( firing ) {
+ firingLength = list.length;
+ // With memory, if we're not firing then
+ // we should call right away
+ } else if ( memory ) {
+ firingStart = start;
+ fire( memory );
+ }
+ }
+ return this;
+ },
+ // Remove a callback from the list
+ remove: function() {
+ if ( list ) {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+ // Handle firing indexes
+ if ( firing ) {
+ if ( index <= firingLength ) {
+ firingLength--;
+ }
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ }
+ });
+ }
+ return this;
+ },
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+ },
+ // Remove all callbacks from the list
+ empty: function() {
+ list = [];
+ firingLength = 0;
+ return this;
+ },
+ // Have the list do nothing anymore
+ disable: function() {
+ list = stack = memory = undefined;
+ return this;
+ },
+ // Is it disabled?
+ disabled: function() {
+ return !list;
+ },
+ // Lock the list in its current state
+ lock: function() {
+ stack = undefined;
+ if ( !memory ) {
+ self.disable();
+ }
+ return this;
+ },
+ // Is it locked?
+ locked: function() {
+ return !stack;
+ },
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( list && ( !fired || stack ) ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ if ( firing ) {
+ stack.push( args );
+ } else {
+ fire( args );
+ }
+ }
+ return this;
+ },
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+jQuery.extend({
+
+ Deferred: function( func ) {
+ var tuples = [
+ // action, add listener, listener list, final state
+ [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+ [ "notify", "progress", jQuery.Callbacks("memory") ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ then: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+ var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+ // deferred[ done | fail | progress ] for forwarding actions to newDefer
+ deferred[ tuple[1] ](function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise()
+ .done( newDefer.resolve )
+ .fail( newDefer.reject )
+ .progress( newDefer.notify );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+ }
+ });
+ });
+ fns = null;
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Keep pipe for back-compat
+ promise.pipe = promise.then;
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 3 ];
+
+ // promise[ done | fail | progress ] = list.add
+ promise[ tuple[1] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(function() {
+ // state = [ resolved | rejected ]
+ state = stateString;
+
+ // [ reject_list | resolve_list ].disable; progress_list.lock
+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+ }
+
+ // deferred[ resolve | reject | notify ]
+ deferred[ tuple[0] ] = function() {
+ deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+ return this;
+ };
+ deferred[ tuple[0] + "With" ] = list.fireWith;
+ });
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( subordinate /* , ..., subordinateN */ ) {
+ var i = 0,
+ resolveValues = slice.call( arguments ),
+ length = resolveValues.length,
+
+ // the count of uncompleted subordinates
+ remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+ // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+ // Update function for both resolve and progress values
+ updateFunc = function( i, contexts, values ) {
+ return function( value ) {
+ contexts[ i ] = this;
+ values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( values === progressValues ) {
+ deferred.notifyWith( contexts, values );
+ } else if ( !( --remaining ) ) {
+ deferred.resolveWith( contexts, values );
+ }
+ };
+ },
+
+ progressValues, progressContexts, resolveContexts;
+
+ // add listeners to Deferred subordinates; treat others as resolved
+ if ( length > 1 ) {
+ progressValues = new Array( length );
+ progressContexts = new Array( length );
+ resolveContexts = new Array( length );
+ for ( ; i < length; i++ ) {
+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+ resolveValues[ i ].promise()
+ .done( updateFunc( i, resolveContexts, resolveValues ) )
+ .fail( deferred.reject )
+ .progress( updateFunc( i, progressContexts, progressValues ) );
+ } else {
+ --remaining;
+ }
+ }
+ }
+
+ // if we're not waiting on anything, resolve the master
+ if ( !remaining ) {
+ deferred.resolveWith( resolveContexts, resolveValues );
+ }
+
+ return deferred.promise();
+ }
+});
+
+
+// The deferred used on DOM ready
+var readyList;
+
+jQuery.fn.ready = function( fn ) {
+ // Add the callback
+ jQuery.ready.promise().done( fn );
+
+ return this;
+};
+
+jQuery.extend({
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.triggerHandler ) {
+ jQuery( document ).triggerHandler( "ready" );
+ jQuery( document ).off( "ready" );
+ }
+ }
+});
+
+/**
+ * The ready event handler and self cleanup method
+ */
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed, false );
+ window.removeEventListener( "load", completed, false );
+ jQuery.ready();
+}
+
+jQuery.ready.promise = function( obj ) {
+ if ( !readyList ) {
+
+ readyList = jQuery.Deferred();
+
+ // Catch cases where $(document).ready() is called after the browser event has already occurred.
+ // we once tried to use readyState "interactive" here, but it caused issues like the one
+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ setTimeout( jQuery.ready );
+
+ } else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed, false );
+ }
+ }
+ return readyList.promise( obj );
+};
+
+// Kick off the DOM ready check even if the user does not
+jQuery.ready.promise();
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( jQuery.type( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !jQuery.isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+ }
+ }
+ }
+
+ return chainable ?
+ elems :
+
+ // Gets
+ bulk ?
+ fn.call( elems ) :
+ len ? fn( elems[0], key ) : emptyGet;
+};
+
+
+/**
+ * Determines whether an object can have data
+ */
+jQuery.acceptData = function( owner ) {
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ /* jshint -W018 */
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+function Data() {
+ // Support: Android < 4,
+ // Old WebKit does not have Object.preventExtensions/freeze method,
+ // return new empty object instead with no [[set]] accessor
+ Object.defineProperty( this.cache = {}, 0, {
+ get: function() {
+ return {};
+ }
+ });
+
+ this.expando = jQuery.expando + Math.random();
+}
+
+Data.uid = 1;
+Data.accepts = jQuery.acceptData;
+
+Data.prototype = {
+ key: function( owner ) {
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return the key for a frozen object.
+ if ( !Data.accepts( owner ) ) {
+ return 0;
+ }
+
+ var descriptor = {},
+ // Check if the owner object already has a cache key
+ unlock = owner[ this.expando ];
+
+ // If not, create one
+ if ( !unlock ) {
+ unlock = Data.uid++;
+
+ // Secure it in a non-enumerable, non-writable property
+ try {
+ descriptor[ this.expando ] = { value: unlock };
+ Object.defineProperties( owner, descriptor );
+
+ // Support: Android < 4
+ // Fallback to a less secure definition
+ } catch ( e ) {
+ descriptor[ this.expando ] = unlock;
+ jQuery.extend( owner, descriptor );
+ }
+ }
+
+ // Ensure the cache object
+ if ( !this.cache[ unlock ] ) {
+ this.cache[ unlock ] = {};
+ }
+
+ return unlock;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ // There may be an unlock assigned to this node,
+ // if there is no entry for this "owner", create one inline
+ // and set the unlock as though an owner entry had always existed
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ // Handle: [ owner, key, value ] args
+ if ( typeof data === "string" ) {
+ cache[ data ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+ // Fresh assignments by object are shallow copied
+ if ( jQuery.isEmptyObject( cache ) ) {
+ jQuery.extend( this.cache[ unlock ], data );
+ // Otherwise, copy the properties one-by-one to the cache object
+ } else {
+ for ( prop in data ) {
+ cache[ prop ] = data[ prop ];
+ }
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ // Either a valid cache is found, or will be created.
+ // New caches will be created and the unlock returned,
+ // allowing direct access to the newly created
+ // empty data object. A valid owner object must be provided.
+ var cache = this.cache[ this.key( owner ) ];
+
+ return key === undefined ?
+ cache : cache[ key ];
+ },
+ access: function( owner, key, value ) {
+ var stored;
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ((key && typeof key === "string") && value === undefined) ) {
+
+ stored = this.get( owner, key );
+
+ return stored !== undefined ?
+ stored : this.get( owner, jQuery.camelCase(key) );
+ }
+
+ // [*]When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i, name, camel,
+ unlock = this.key( owner ),
+ cache = this.cache[ unlock ];
+
+ if ( key === undefined ) {
+ this.cache[ unlock ] = {};
+
+ } else {
+ // Support array or space separated string of keys
+ if ( jQuery.isArray( key ) ) {
+ // If "name" is an array of keys...
+ // When data is initially created, via ("key", "val") signature,
+ // keys will be converted to camelCase.
+ // Since there is no way to tell _how_ a key was added, remove
+ // both plain key and camelCase key. #12786
+ // This will only penalize the array argument path.
+ name = key.concat( key.map( jQuery.camelCase ) );
+ } else {
+ camel = jQuery.camelCase( key );
+ // Try the string as a key before any manipulation
+ if ( key in cache ) {
+ name = [ key, camel ];
+ } else {
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ name = camel;
+ name = name in cache ?
+ [ name ] : ( name.match( rnotwhite ) || [] );
+ }
+ }
+
+ i = name.length;
+ while ( i-- ) {
+ delete cache[ name[ i ] ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ return !jQuery.isEmptyObject(
+ this.cache[ owner[ this.expando ] ] || {}
+ );
+ },
+ discard: function( owner ) {
+ if ( owner[ this.expando ] ) {
+ delete this.cache[ owner[ this.expando ] ];
+ }
+ }
+};
+var data_priv = new Data();
+
+var data_user = new Data();
+
+
+
+/*
+ Implementation Summary
+
+ 1. Enforce API surface and semantic compatibility with 1.9.x branch
+ 2. Improve the module's maintainability by reducing the storage
+ paths to a single mechanism.
+ 3. Use the same single mechanism to support "private" and "user" data.
+ 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+ 5. Avoid exposing implementation details on user objects (eg. expando properties)
+ 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+*/
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /([A-Z])/g;
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ // Only convert to a number if it doesn't change the string
+ +data + "" === data ? +data :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ data_user.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend({
+ hasData: function( elem ) {
+ return data_user.hasData( elem ) || data_priv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return data_user.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ data_user.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to data_priv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return data_priv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ data_priv.remove( elem, name );
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = data_user.get( elem );
+
+ if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE11+
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.slice(5) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ data_priv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each(function() {
+ data_user.set( this, key );
+ });
+ }
+
+ return access( this, function( value ) {
+ var data,
+ camelKey = jQuery.camelCase( key );
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+ // Attempt to get data from the cache
+ // with the key as-is
+ data = data_user.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to get data from the cache
+ // with the key camelized
+ data = data_user.get( elem, camelKey );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, camelKey, undefined );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ this.each(function() {
+ // First, attempt to store a copy or reference of any
+ // data that might've been store with a camelCased key.
+ var data = data_user.get( this, camelKey );
+
+ // For HTML5 data-* attribute interop, we have to
+ // store property names with dashes in a camelCase form.
+ // This might not apply to all properties...*
+ data_user.set( this, camelKey, value );
+
+ // *... In the case of properties that might _actually_
+ // have dashes, we need to also store a copy of that
+ // unchanged property.
+ if ( key.indexOf("-") !== -1 && data !== undefined ) {
+ data_user.set( this, key, value );
+ }
+ });
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each(function() {
+ data_user.remove( this, key );
+ });
+ }
+});
+
+
+jQuery.extend({
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = data_priv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || jQuery.isArray( data ) ) {
+ queue = data_priv.access( elem, type, jQuery.makeArray(data) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // not intended for public consumption - generates a queueHooks object, or returns the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return data_priv.get( elem, key ) || data_priv.access( elem, key, {
+ empty: jQuery.Callbacks("once memory").add(function() {
+ data_priv.remove( elem, [ type + "queue", key ] );
+ })
+ });
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[0], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each(function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ dequeue: function( type ) {
+ return this.each(function() {
+ jQuery.dequeue( this, type );
+ });
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = data_priv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+});
+var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHidden = function( elem, el ) {
+ // isHidden might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+ return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+ };
+
+var rcheckableType = (/^(?:checkbox|radio)$/i);
+
+
+
+(function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // #11217 - WebKit loses check when the name is after the checked attribute
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` need .setAttribute for WWA
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
+ // old WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ // Support: IE9-IE11+
+ div.innerHTML = "<textarea>x</textarea>";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+})();
+var strundefined = typeof undefined;
+
+
+
+support.focusinBubbles = "onfocusin" in window;
+
+
+var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.get( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !(events = elemData.events) ) {
+ events = elemData.events = {};
+ }
+ if ( !(eventHandle = elemData.handle) ) {
+ eventHandle = elemData.handle = function( e ) {
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend({
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join(".")
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !(handlers = events[ type ]) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = data_priv.hasData( elem ) && data_priv.get( elem );
+
+ if ( !elemData || !(events = elemData.events) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnotwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[t] ) || [];
+ type = origType = tmp[1];
+ namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ delete elemData.handle;
+ data_priv.remove( elem, "events" );
+ }
+ },
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+
+ var i, cur, tmp, bubbleType, ontype, handle, special,
+ eventPath = [ elem || document ],
+ type = hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+ cur = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf(".") >= 0 ) {
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf(":") < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join(".");
+ event.namespace_re = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === (elem.ownerDocument || document) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
+ event.result = handle.apply( cur, data );
+ if ( event.result === false ) {
+ event.preventDefault();
+ }
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+ if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
+ jQuery.acceptData( elem ) ) {
+
+ // Call a native DOM method on the target with the same name name as the event.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ ontype ];
+
+ if ( tmp ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+ elem[ type ]();
+ jQuery.event.triggered = undefined;
+
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event );
+
+ var i, j, ret, matched, handleObj,
+ handlerQueue = [],
+ args = slice.call( arguments ),
+ handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[0] = event;
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or
+ // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+ .apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( (event.result = ret) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, matches, sel, handleObj,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ // Black-hole SVG <use> instance trees (#13180)
+ // Avoid non-left-click bubbling in Firefox (#3861)
+ if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.disabled !== true || event.type !== "click" ) {
+ matches = [];
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matches[ sel ] === undefined ) {
+ matches[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) >= 0 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matches[ sel ] ) {
+ matches.push( handleObj );
+ }
+ }
+ if ( matches.length ) {
+ handlerQueue.push({ elem: cur, handlers: matches });
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+ }
+
+ return handlerQueue;
+ },
+
+ // Includes some event props shared by KeyEvent and MouseEvent
+ props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+ fixHooks: {},
+
+ keyHooks: {
+ props: "char charCode key keyCode".split(" "),
+ filter: function( event, original ) {
+
+ // Add which for key events
+ if ( event.which == null ) {
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
+ }
+
+ return event;
+ }
+ },
+
+ mouseHooks: {
+ props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+ filter: function( event, original ) {
+ var eventDoc, doc, body,
+ button = original.button;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && original.clientX != null ) {
+ eventDoc = event.target.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+ event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && button !== undefined ) {
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+ }
+
+ return event;
+ }
+ },
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop, copy,
+ type = event.type,
+ originalEvent = event,
+ fixHook = this.fixHooks[ type ];
+
+ if ( !fixHook ) {
+ this.fixHooks[ type ] = fixHook =
+ rmouseEvent.test( type ) ? this.mouseHooks :
+ rkeyEvent.test( type ) ? this.keyHooks :
+ {};
+ }
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+ event = new jQuery.Event( originalEvent );
+
+ i = copy.length;
+ while ( i-- ) {
+ prop = copy[ i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Support: Cordova 2.5 (WebKit) (#13255)
+ // All events should have a target; Cordova deviceready doesn't
+ if ( !event.target ) {
+ event.target = document;
+ }
+
+ // Support: Safari 6.0+, Chrome < 28
+ // Target should not be a text node (#504, #13143)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+ },
+
+ special: {
+ load: {
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ focus: {
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== safeActiveElement() && this.focus ) {
+ this.focus();
+ return false;
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function() {
+ if ( this === safeActiveElement() && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+ click: {
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
+ this.click();
+ return false;
+ }
+ },
+
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function( event ) {
+ return jQuery.nodeName( event.target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ },
+
+ simulate: function( type, elem, event, bubble ) {
+ // Piggyback on a donor event to simulate a different one.
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
+ // simulated event prevents default then we do the same on the donor.
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ {
+ type: type,
+ isSimulated: true,
+ originalEvent: {}
+ }
+ );
+ if ( bubble ) {
+ jQuery.event.trigger( e, null, elem );
+ } else {
+ jQuery.event.dispatch.call( elem, e );
+ }
+ if ( e.isDefaultPrevented() ) {
+ event.preventDefault();
+ }
+ }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle, false );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+ // Allow instantiation without the 'new' keyword
+ if ( !(this instanceof jQuery.Event) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+ // Support: Android < 4.0
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && e.preventDefault ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && e.stopPropagation ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && e.stopImmediatePropagation ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// Support: Chrome 15+
+jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mousenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+});
+
+// Create "bubbling" focus and blur events
+// Support: Firefox, Chrome, Safari
+if ( !support.focusinBubbles ) {
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+ // Attach a single capturing handler on the document while someone wants focusin/focusout
+ var handler = function( event ) {
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+ };
+
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix );
+
+ if ( !attaches ) {
+ doc.addEventListener( orig, handler, true );
+ }
+ data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
+ },
+ teardown: function() {
+ var doc = this.ownerDocument || this,
+ attaches = data_priv.access( doc, fix ) - 1;
+
+ if ( !attaches ) {
+ doc.removeEventListener( orig, handler, true );
+ data_priv.remove( doc, fix );
+
+ } else {
+ data_priv.access( doc, fix, attaches );
+ }
+ }
+ };
+ });
+}
+
+jQuery.fn.extend({
+
+ on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ this.on( type, selector, data, types[ type ], one );
+ }
+ return this;
+ }
+
+ if ( data == null && fn == null ) {
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return this;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return this.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ });
+ },
+ one: function( types, selector, data, fn ) {
+ return this.on( types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each(function() {
+ jQuery.event.remove( this, types, fn, selector );
+ });
+ },
+
+ trigger: function( type, data ) {
+ return this.each(function() {
+ jQuery.event.trigger( type, data, this );
+ });
+ },
+ triggerHandler: function( type, data ) {
+ var elem = this[0];
+ if ( elem ) {
+ return jQuery.event.trigger( type, data, elem, true );
+ }
+ }
+});
+
+
+var
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+ rtagName = /<([\w:]+)/,
+ rhtml = /<|&#?\w+;/,
+ rnoInnerhtml = /<(?:script|style|link)/i,
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rscriptType = /^$|\/(?:java|ecma)script/i,
+ rscriptTypeMasked = /^true\/(.*)/,
+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+ // We have to close these tags to support XHTML (#13200)
+ wrapMap = {
+
+ // Support: IE 9
+ option: [ 1, "<select multiple='multiple'>", "</select>" ],
+
+ thead: [ 1, "<table>", "</table>" ],
+ col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
+ tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+ _default: [ 0, "", "" ]
+ };
+
+// Support: IE 9
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// Support: 1.x compatibility
+// Manipulating tables requires a tbody
+function manipulationTarget( elem, content ) {
+ return jQuery.nodeName( elem, "table" ) &&
+ jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
+
+ elem.getElementsByTagName("tbody")[0] ||
+ elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
+ elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+ elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
+ return elem;
+}
+function restoreScript( elem ) {
+ var match = rscriptTypeMasked.exec( elem.type );
+
+ if ( match ) {
+ elem.type = match[ 1 ];
+ } else {
+ elem.removeAttribute("type");
+ }
+
+ return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ data_priv.set(
+ elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+function cloneCopyEvent( src, dest ) {
+ var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+ if ( dest.nodeType !== 1 ) {
+ return;
+ }
+
+ // 1. Copy private data: events, handlers, etc.
+ if ( data_priv.hasData( src ) ) {
+ pdataOld = data_priv.access( src );
+ pdataCur = data_priv.set( dest, pdataOld );
+ events = pdataOld.events;
+
+ if ( events ) {
+ delete pdataCur.handle;
+ pdataCur.events = {};
+
+ for ( type in events ) {
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type, events[ type ][ i ] );
+ }
+ }
+ }
+ }
+
+ // 2. Copy user data
+ if ( data_user.hasData( src ) ) {
+ udataOld = data_user.access( src );
+ udataCur = jQuery.extend( {}, udataOld );
+
+ data_user.set( dest, udataCur );
+ }
+}
+
+function getAll( context, tag ) {
+ var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
+ context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
+ [];
+
+ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+ jQuery.merge( [ context ], ret ) :
+ ret;
+}
+
+// Support: IE >= 9
+function fixInput( src, dest ) {
+ var nodeName = dest.nodeName.toLowerCase();
+
+ // Fails to persist the checked state of a cloned checkbox or radio button.
+ if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+ dest.checked = src.checked;
+
+ // Fails to return the selected option to the default selected state when cloning options
+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
+ dest.defaultValue = src.defaultValue;
+ }
+}
+
+jQuery.extend({
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var i, l, srcElements, destElements,
+ clone = elem.cloneNode( true ),
+ inPage = jQuery.contains( elem.ownerDocument, elem );
+
+ // Support: IE >= 9
+ // Fix Cloning issues
+ if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+ !jQuery.isXMLDoc( elem ) ) {
+
+ // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+ destElements = getAll( clone );
+ srcElements = getAll( elem );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ fixInput( srcElements[ i ], destElements[ i ] );
+ }
+ }
+
+ // Copy the events from the original to the clone
+ if ( dataAndEvents ) {
+ if ( deepDataAndEvents ) {
+ srcElements = srcElements || getAll( elem );
+ destElements = destElements || getAll( clone );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+ }
+ } else {
+ cloneCopyEvent( elem, clone );
+ }
+ }
+
+ // Preserve script evaluation history
+ destElements = getAll( clone, "script" );
+ if ( destElements.length > 0 ) {
+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+ }
+
+ // Return the cloned set
+ return clone;
+ },
+
+ buildFragment: function( elems, context, scripts, selection ) {
+ var elem, tmp, tag, wrap, contains, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( jQuery.type( elem ) === "object" ) {
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement("div") );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Fixes #12346
+ // Support: Webkit, IE
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( (elem = nodes[ i++ ]) ) {
+
+ // #4087 - If origin and destination elements are the same, and this is
+ // that element, do not do anything
+ if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( (elem = tmp[ j++ ]) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+ },
+
+ cleanData: function( elems ) {
+ var data, elem, type, key,
+ special = jQuery.event.special,
+ i = 0;
+
+ for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
+ if ( jQuery.acceptData( elem ) ) {
+ key = elem[ data_priv.expando ];
+
+ if ( key && (data = data_priv.cache[ key ]) ) {
+ if ( data.events ) {
+ for ( type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent( elem, type, data.handle );
+ }
+ }
+ }
+ if ( data_priv.cache[ key ] ) {
+ // Discard any remaining `private` data
+ delete data_priv.cache[ key ];
+ }
+ }
+ }
+ // Discard any remaining `user` data
+ delete data_user.cache[ elem[ data_user.expando ] ];
+ }
+ }
+});
+
+jQuery.fn.extend({
+ text: function( value ) {
+ return access( this, function( value ) {
+ return value === undefined ?
+ jQuery.text( this ) :
+ this.empty().each(function() {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ this.textContent = value;
+ }
+ });
+ }, null, value, arguments.length );
+ },
+
+ append: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.appendChild( elem );
+ }
+ });
+ },
+
+ prepend: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.insertBefore( elem, target.firstChild );
+ }
+ });
+ },
+
+ before: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this );
+ }
+ });
+ },
+
+ after: function() {
+ return this.domManip( arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ }
+ });
+ },
+
+ remove: function( selector, keepData /* Internal Use Only */ ) {
+ var elem,
+ elems = selector ? jQuery.filter( selector, this ) : this,
+ i = 0;
+
+ for ( ; (elem = elems[i]) != null; i++ ) {
+ if ( !keepData && elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem ) );
+ }
+
+ if ( elem.parentNode ) {
+ if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+ setGlobalEval( getAll( elem, "script" ) );
+ }
+ elem.parentNode.removeChild( elem );
+ }
+ }
+
+ return this;
+ },
+
+ empty: function() {
+ var elem,
+ i = 0;
+
+ for ( ; (elem = this[i]) != null; i++ ) {
+ if ( elem.nodeType === 1 ) {
+
+ // Prevent memory leaks
+ jQuery.cleanData( getAll( elem, false ) );
+
+ // Remove any remaining nodes
+ elem.textContent = "";
+ }
+ }
+
+ return this;
+ },
+
+ clone: function( dataAndEvents, deepDataAndEvents ) {
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map(function() {
+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+ });
+ },
+
+ html: function( value ) {
+ return access( this, function( value ) {
+ var elem = this[ 0 ] || {},
+ i = 0,
+ l = this.length;
+
+ if ( value === undefined && elem.nodeType === 1 ) {
+ return elem.innerHTML;
+ }
+
+ // See if we can take a shortcut and just use innerHTML
+ if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+ !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+ value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+ try {
+ for ( ; i < l; i++ ) {
+ elem = this[ i ] || {};
+
+ // Remove element nodes and prevent memory leaks
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem, false ) );
+ elem.innerHTML = value;
+ }
+ }
+
+ elem = 0;
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch( e ) {}
+ }
+
+ if ( elem ) {
+ this.empty().append( value );
+ }
+ }, null, value, arguments.length );
+ },
+
+ replaceWith: function() {
+ var arg = arguments[ 0 ];
+
+ // Make the changes, replacing each context element with the new content
+ this.domManip( arguments, function( elem ) {
+ arg = this.parentNode;
+
+ jQuery.cleanData( getAll( this ) );
+
+ if ( arg ) {
+ arg.replaceChild( elem, this );
+ }
+ });
+
+ // Force removal if there was no new content (e.g., from empty arguments)
+ return arg && (arg.length || arg.nodeType) ? this : this.remove();
+ },
+
+ detach: function( selector ) {
+ return this.remove( selector, true );
+ },
+
+ domManip: function( args, callback ) {
+
+ // Flatten any nested arrays
+ args = concat.apply( [], args );
+
+ var fragment, first, scripts, hasScripts, node, doc,
+ i = 0,
+ l = this.length,
+ set = this,
+ iNoClone = l - 1,
+ value = args[ 0 ],
+ isFunction = jQuery.isFunction( value );
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( isFunction ||
+ ( l > 1 && typeof value === "string" &&
+ !support.checkClone && rchecked.test( value ) ) ) {
+ return this.each(function( index ) {
+ var self = set.eq( index );
+ if ( isFunction ) {
+ args[ 0 ] = value.call( this, index, self.html() );
+ }
+ self.domManip( args, callback );
+ });
+ }
+
+ if ( l ) {
+ fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
+ first = fragment.firstChild;
+
+ if ( fragment.childNodes.length === 1 ) {
+ fragment = first;
+ }
+
+ if ( first ) {
+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+ hasScripts = scripts.length;
+
+ // Use the original fragment for the last item instead of the first because it can end up
+ // being emptied incorrectly in certain situations (#8070).
+ for ( ; i < l; i++ ) {
+ node = fragment;
+
+ if ( i !== iNoClone ) {
+ node = jQuery.clone( node, true, true );
+
+ // Keep references to cloned scripts for later restoration
+ if ( hasScripts ) {
+ // Support: QtWebKit
+ // jQuery.merge because push.apply(_, arraylike) throws
+ jQuery.merge( scripts, getAll( node, "script" ) );
+ }
+ }
+
+ callback.call( this[ i ], node, i );
+ }
+
+ if ( hasScripts ) {
+ doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+ // Reenable scripts
+ jQuery.map( scripts, restoreScript );
+
+ // Evaluate executable scripts on first document insertion
+ for ( i = 0; i < hasScripts; i++ ) {
+ node = scripts[ i ];
+ if ( rscriptType.test( node.type || "" ) &&
+ !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+ if ( node.src ) {
+ // Optional AJAX dependency, but won't run scripts if not present
+ if ( jQuery._evalUrl ) {
+ jQuery._evalUrl( node.src );
+ }
+ } else {
+ jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return this;
+ }
+});
+
+jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function( name, original ) {
+ jQuery.fn[ name ] = function( selector ) {
+ var elems,
+ ret = [],
+ insert = jQuery( selector ),
+ last = insert.length - 1,
+ i = 0;
+
+ for ( ; i <= last; i++ ) {
+ elems = i === last ? this : this.clone( true );
+ jQuery( insert[ i ] )[ original ]( elems );
+
+ // Support: QtWebKit
+ // .get() because push.apply(_, arraylike) throws
+ push.apply( ret, elems.get() );
+ }
+
+ return this.pushStack( ret );
+ };
+});
+
+
+var iframe,
+ elemdisplay = {};
+
+/**
+ * Retrieve the actual display of a element
+ * @param {String} name nodeName of the element
+ * @param {Object} doc Document object
+ */
+// Called only from within defaultDisplay
+function actualDisplay( name, doc ) {
+ var style,
+ elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+
+ // getDefaultComputedStyle might be reliably used only on attached element
+ display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
+
+ // Use of this method is a temporary fix (more like optmization) until something better comes along,
+ // since it was removed from specification and supported only in FF
+ style.display : jQuery.css( elem[ 0 ], "display" );
+
+ // We don't have any data stored on the element,
+ // so use "detach" method as fast way to get rid of the element
+ elem.detach();
+
+ return display;
+}
+
+/**
+ * Try to determine the default display value of an element
+ * @param {String} nodeName
+ */
+function defaultDisplay( nodeName ) {
+ var doc = document,
+ display = elemdisplay[ nodeName ];
+
+ if ( !display ) {
+ display = actualDisplay( nodeName, doc );
+
+ // If the simple way fails, read from inside an iframe
+ if ( display === "none" || !display ) {
+
+ // Use the already-created iframe if possible
+ iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
+
+ // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+ doc = iframe[ 0 ].contentDocument;
+
+ // Support: IE
+ doc.write();
+ doc.close();
+
+ display = actualDisplay( nodeName, doc );
+ iframe.detach();
+ }
+
+ // Store the correct default display
+ elemdisplay[ nodeName ] = display;
+ }
+
+ return display;
+}
+var rmargin = (/^margin/);
+
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+ return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
+ };
+
+
+
+function curCSS( elem, name, computed ) {
+ var width, minWidth, maxWidth, ret,
+ style = elem.style;
+
+ computed = computed || getStyles( elem );
+
+ // Support: IE9
+ // getPropertyValue is only needed for .css('filter') in IE9, see #12537
+ if ( computed ) {
+ ret = computed.getPropertyValue( name ) || computed[ name ];
+ }
+
+ if ( computed ) {
+
+ if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+ ret = jQuery.style( elem, name );
+ }
+
+ // Support: iOS < 6
+ // A tribute to the "awesome hack by Dean Edwards"
+ // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+ // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+ if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+ // Remember the original values
+ width = style.width;
+ minWidth = style.minWidth;
+ maxWidth = style.maxWidth;
+
+ // Put in the new values to get a computed value out
+ style.minWidth = style.maxWidth = style.width = ret;
+ ret = computed.width;
+
+ // Revert the changed values
+ style.width = width;
+ style.minWidth = minWidth;
+ style.maxWidth = maxWidth;
+ }
+ }
+
+ return ret !== undefined ?
+ // Support: IE
+ // IE returns zIndex value as an integer.
+ ret + "" :
+ ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+ // Define the hook, we'll check on the first run if it's really needed.
+ return {
+ get: function() {
+ if ( conditionFn() ) {
+ // Hook not needed (or it's not possible to use it due to missing dependency),
+ // remove it.
+ // Since there are no other hooks for marginRight, remove the whole object.
+ delete this.get;
+ return;
+ }
+
+ // Hook needed; redefine it so that the support test is not executed again.
+
+ return (this.get = hookFn).apply( this, arguments );
+ }
+ };
+}
+
+
+(function() {
+ var pixelPositionVal, boxSizingReliableVal,
+ docElem = document.documentElement,
+ container = document.createElement( "div" ),
+ div = document.createElement( "div" );
+
+ if ( !div.style ) {
+ return;
+ }
+
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" +
+ "position:absolute";
+ container.appendChild( div );
+
+ // Executing both pixelPosition & boxSizingReliable tests require only one layout
+ // so they're executed at the same time to save the second computation.
+ function computePixelPositionAndBoxSizingReliable() {
+ div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
+ "box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
+ "border:1px;padding:1px;width:4px;position:absolute";
+ div.innerHTML = "";
+ docElem.appendChild( container );
+
+ var divStyle = window.getComputedStyle( div, null );
+ pixelPositionVal = divStyle.top !== "1%";
+ boxSizingReliableVal = divStyle.width === "4px";
+
+ docElem.removeChild( container );
+ }
+
+ // Support: node.js jsdom
+ // Don't assume that getComputedStyle is a property of the global object
+ if ( window.getComputedStyle ) {
+ jQuery.extend( support, {
+ pixelPosition: function() {
+ // This test is executed only once but we still do memoizing
+ // since we can use the boxSizingReliable pre-computing.
+ // No need to check if the test was already performed, though.
+ computePixelPositionAndBoxSizingReliable();
+ return pixelPositionVal;
+ },
+ boxSizingReliable: function() {
+ if ( boxSizingReliableVal == null ) {
+ computePixelPositionAndBoxSizingReliable();
+ }
+ return boxSizingReliableVal;
+ },
+ reliableMarginRight: function() {
+ // Support: Android 2.3
+ // Check if div with explicit width and no margin-right incorrectly
+ // gets computed margin-right based on width of container. (#3333)
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // This support function is only executed once so no memoizing is needed.
+ var ret,
+ marginDiv = div.appendChild( document.createElement( "div" ) );
+
+ // Reset CSS: box-sizing; display; margin; border; padding
+ marginDiv.style.cssText = div.style.cssText =
+ // Support: Firefox<29, Android 2.3
+ // Vendor-prefix box-sizing
+ "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
+ "box-sizing:content-box;display:block;margin:0;border:0;padding:0";
+ marginDiv.style.marginRight = marginDiv.style.width = "0";
+ div.style.width = "1px";
+ docElem.appendChild( container );
+
+ ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
+
+ docElem.removeChild( container );
+
+ return ret;
+ }
+ });
+ }
+})();
+
+
+// A method for quickly swapping in/out CSS properties to get correct calculations.
+jQuery.swap = function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
+var
+ // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+ // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+ rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
+ rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
+
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+ cssNormalTransform = {
+ letterSpacing: "0",
+ fontWeight: "400"
+ },
+
+ cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+ // shortcut for names that are not vendor prefixed
+ if ( name in style ) {
+ return name;
+ }
+
+ // check for vendor prefixed names
+ var capName = name[0].toUpperCase() + name.slice(1),
+ origName = name,
+ i = cssPrefixes.length;
+
+ while ( i-- ) {
+ name = cssPrefixes[ i ] + capName;
+ if ( name in style ) {
+ return name;
+ }
+ }
+
+ return origName;
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+ var matches = rnumsplit.exec( value );
+ return matches ?
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+ value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+ var i = extra === ( isBorderBox ? "border" : "content" ) ?
+ // If we already have the right measurement, avoid augmentation
+ 4 :
+ // Otherwise initialize for horizontal or vertical properties
+ name === "width" ? 1 : 0,
+
+ val = 0;
+
+ for ( ; i < 4; i += 2 ) {
+ // both box models exclude margin, so add it if we want it
+ if ( extra === "margin" ) {
+ val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+ }
+
+ if ( isBorderBox ) {
+ // border-box includes padding, so remove it if we want content
+ if ( extra === "content" ) {
+ val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+ }
+
+ // at this point, extra isn't border nor margin, so remove border
+ if ( extra !== "margin" ) {
+ val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ } else {
+ // at this point, extra isn't content, so add padding
+ val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+ // at this point, extra isn't content nor padding, so add border
+ if ( extra !== "padding" ) {
+ val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ }
+ }
+
+ return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+ // Start with offset property, which is equivalent to the border-box value
+ var valueIsBorderBox = true,
+ val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+ styles = getStyles( elem ),
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+ // some non-html elements return undefined for offsetWidth, so check for null/undefined
+ // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+ // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+ if ( val <= 0 || val == null ) {
+ // Fall back to computed then uncomputed css if necessary
+ val = curCSS( elem, name, styles );
+ if ( val < 0 || val == null ) {
+ val = elem.style[ name ];
+ }
+
+ // Computed unit is not pixels. Stop here and return.
+ if ( rnumnonpx.test(val) ) {
+ return val;
+ }
+
+ // we need the check for style in case a browser which returns unreliable values
+ // for getComputedStyle silently falls back to the reliable elem.style
+ valueIsBorderBox = isBorderBox &&
+ ( support.boxSizingReliable() || val === elem.style[ name ] );
+
+ // Normalize "", auto, and prepare for extra
+ val = parseFloat( val ) || 0;
+ }
+
+ // use the active box-sizing model to add/subtract irrelevant styles
+ return ( val +
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra || ( isBorderBox ? "border" : "content" ),
+ valueIsBorderBox,
+ styles
+ )
+ ) + "px";
+}
+
+function showHide( elements, show ) {
+ var display, elem, hidden,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+
+ values[ index ] = data_priv.get( elem, "olddisplay" );
+ display = elem.style.display;
+ if ( show ) {
+ // Reset the inline display of this element to learn if it is
+ // being hidden by cascaded rules or not
+ if ( !values[ index ] && display === "none" ) {
+ elem.style.display = "";
+ }
+
+ // Set elements which have been overridden with display: none
+ // in a stylesheet to whatever the default browser style is
+ // for such an element
+ if ( elem.style.display === "" && isHidden( elem ) ) {
+ values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+ }
+ } else {
+ hidden = isHidden( elem );
+
+ if ( display !== "none" || !hidden ) {
+ data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+ }
+ }
+ }
+
+ // Set the display of most of the elements in a second loop
+ // to avoid the constant reflow
+ for ( index = 0; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+ if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+ elem.style.display = show ? values[ index ] || "" : "none";
+ }
+ }
+
+ return elements;
+}
+
+jQuery.extend({
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function( elem, computed ) {
+ if ( computed ) {
+ // We should always get a number back from opacity
+ var ret = curCSS( elem, "opacity" );
+ return ret === "" ? "1" : ret;
+ }
+ }
+ }
+ },
+
+ // Don't automatically add "px" to these possibly-unitless properties
+ cssNumber: {
+ "columnCount": true,
+ "fillOpacity": true,
+ "flexGrow": true,
+ "flexShrink": true,
+ "fontWeight": true,
+ "lineHeight": true,
+ "opacity": true,
+ "order": true,
+ "orphans": true,
+ "widows": true,
+ "zIndex": true,
+ "zoom": true
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {
+ // normalize float css property
+ "float": "cssFloat"
+ },
+
+ // Get and set the style property on a DOM Node
+ style: function( elem, name, value, extra ) {
+ // Don't set styles on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret, type, hooks,
+ origName = jQuery.camelCase( name ),
+ style = elem.style;
+
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+ // gets hook for the prefixed version
+ // followed by the unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // Check if we're setting a value
+ if ( value !== undefined ) {
+ type = typeof value;
+
+ // convert relative number strings (+= or -=) to relative numbers. #7345
+ if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+ value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+ // Fixes bug #9237
+ type = "number";
+ }
+
+ // Make sure that null and NaN values aren't set. See: #7116
+ if ( value == null || value !== value ) {
+ return;
+ }
+
+ // If a number was passed in, add 'px' to the (except for certain CSS properties)
+ if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+ value += "px";
+ }
+
+ // Fixes #8908, it can be done more correctly by specifying setters in cssHooks,
+ // but it would mean to define eight (for every problematic property) identical functions
+ if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+ style[ name ] = "inherit";
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+ style[ name ] = value;
+ }
+
+ } else {
+ // If a hook was provided get the non-computed value from there
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[ name ];
+ }
+ },
+
+ css: function( elem, name, extra, styles ) {
+ var val, num, hooks,
+ origName = jQuery.camelCase( name );
+
+ // Make sure that we're working with the right name
+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+ // gets hook for the prefixed version
+ // followed by the unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // If a hook was provided get the computed value from there
+ if ( hooks && "get" in hooks ) {
+ val = hooks.get( elem, true, extra );
+ }
+
+ // Otherwise, if a way to get the computed value exists, use that
+ if ( val === undefined ) {
+ val = curCSS( elem, name, styles );
+ }
+
+ //convert "normal" to computed value
+ if ( val === "normal" && name in cssNormalTransform ) {
+ val = cssNormalTransform[ name ];
+ }
+
+ // Return, converting to number if forced or a qualifier was provided and val looks numeric
+ if ( extra === "" || extra ) {
+ num = parseFloat( val );
+ return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+ }
+ return val;
+ }
+});
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+ jQuery.cssHooks[ name ] = {
+ get: function( elem, computed, extra ) {
+ if ( computed ) {
+ // certain elements can have dimension info if we invisibly show them
+ // however, it must have a current display style that would benefit from this
+ return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
+ jQuery.swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, name, extra );
+ }) :
+ getWidthOrHeight( elem, name, extra );
+ }
+ },
+
+ set: function( elem, value, extra ) {
+ var styles = extra && getStyles( elem );
+ return setPositiveNumber( elem, value, extra ?
+ augmentWidthOrHeight(
+ elem,
+ name,
+ extra,
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ styles
+ ) : 0
+ );
+ }
+ };
+});
+
+// Support: Android 2.3
+jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
+ function( elem, computed ) {
+ if ( computed ) {
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // Work around by temporarily setting element display to inline-block
+ return jQuery.swap( elem, { "display": "inline-block" },
+ curCSS, [ elem, "marginRight" ] );
+ }
+ }
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+ margin: "",
+ padding: "",
+ border: "Width"
+}, function( prefix, suffix ) {
+ jQuery.cssHooks[ prefix + suffix ] = {
+ expand: function( value ) {
+ var i = 0,
+ expanded = {},
+
+ // assumes a single number if not a string
+ parts = typeof value === "string" ? value.split(" ") : [ value ];
+
+ for ( ; i < 4; i++ ) {
+ expanded[ prefix + cssExpand[ i ] + suffix ] =
+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+ }
+
+ return expanded;
+ }
+ };
+
+ if ( !rmargin.test( prefix ) ) {
+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+ }
+});
+
+jQuery.fn.extend({
+ css: function( name, value ) {
+ return access( this, function( elem, name, value ) {
+ var styles, len,
+ map = {},
+ i = 0;
+
+ if ( jQuery.isArray( name ) ) {
+ styles = getStyles( elem );
+ len = name.length;
+
+ for ( ; i < len; i++ ) {
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+ }
+
+ return map;
+ }
+
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ }, name, value, arguments.length > 1 );
+ },
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each(function() {
+ if ( isHidden( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ });
+ }
+});
+
+
+function Tween( elem, options, prop, end, easing ) {
+ return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+ constructor: Tween,
+ init: function( elem, options, prop, end, easing, unit ) {
+ this.elem = elem;
+ this.prop = prop;
+ this.easing = easing || "swing";
+ this.options = options;
+ this.start = this.now = this.cur();
+ this.end = end;
+ this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+ },
+ cur: function() {
+ var hooks = Tween.propHooks[ this.prop ];
+
+ return hooks && hooks.get ?
+ hooks.get( this ) :
+ Tween.propHooks._default.get( this );
+ },
+ run: function( percent ) {
+ var eased,
+ hooks = Tween.propHooks[ this.prop ];
+
+ if ( this.options.duration ) {
+ this.pos = eased = jQuery.easing[ this.easing ](
+ percent, this.options.duration * percent, 0, 1, this.options.duration
+ );
+ } else {
+ this.pos = eased = percent;
+ }
+ this.now = ( this.end - this.start ) * eased + this.start;
+
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
+
+ if ( hooks && hooks.set ) {
+ hooks.set( this );
+ } else {
+ Tween.propHooks._default.set( this );
+ }
+ return this;
+ }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+ _default: {
+ get: function( tween ) {
+ var result;
+
+ if ( tween.elem[ tween.prop ] != null &&
+ (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+ return tween.elem[ tween.prop ];
+ }
+
+ // passing an empty string as a 3rd parameter to .css will automatically
+ // attempt a parseFloat and fallback to a string if the parse fails
+ // so, simple values such as "10px" are parsed to Float.
+ // complex values such as "rotate(1rad)" are returned as is.
+ result = jQuery.css( tween.elem, tween.prop, "" );
+ // Empty strings, null, undefined and "auto" are converted to 0.
+ return !result || result === "auto" ? 0 : result;
+ },
+ set: function( tween ) {
+ // use step hook for back compat - use cssHook if its there - use .style if its
+ // available and use plain properties where available
+ if ( jQuery.fx.step[ tween.prop ] ) {
+ jQuery.fx.step[ tween.prop ]( tween );
+ } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+ } else {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+ }
+};
+
+// Support: IE9
+// Panic based approach to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+ set: function( tween ) {
+ if ( tween.elem.nodeType && tween.elem.parentNode ) {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+};
+
+jQuery.easing = {
+ linear: function( p ) {
+ return p;
+ },
+ swing: function( p ) {
+ return 0.5 - Math.cos( p * Math.PI ) / 2;
+ }
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+ fxNow, timerId,
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
+ rrun = /queueHooks$/,
+ animationPrefilters = [ defaultPrefilter ],
+ tweeners = {
+ "*": [ function( prop, value ) {
+ var tween = this.createTween( prop, value ),
+ target = tween.cur(),
+ parts = rfxnum.exec( value ),
+ unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
+ rfxnum.exec( jQuery.css( tween.elem, prop ) ),
+ scale = 1,
+ maxIterations = 20;
+
+ if ( start && start[ 3 ] !== unit ) {
+ // Trust units reported by jQuery.css
+ unit = unit || start[ 3 ];
+
+ // Make sure we update the tween properties later on
+ parts = parts || [];
+
+ // Iteratively approximate from a nonzero starting point
+ start = +target || 1;
+
+ do {
+ // If previous iteration zeroed out, double until we get *something*
+ // Use a string for doubling factor so we don't accidentally see scale as unchanged below
+ scale = scale || ".5";
+
+ // Adjust and apply
+ start = start / scale;
+ jQuery.style( tween.elem, prop, start + unit );
+
+ // Update scale, tolerating zero or NaN from tween.cur()
+ // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+ } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+ }
+
+ // Update tween properties
+ if ( parts ) {
+ start = tween.start = +start || +target || 0;
+ tween.unit = unit;
+ // If a +=/-= token was provided, we're doing a relative animation
+ tween.end = parts[ 1 ] ?
+ start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
+ +parts[ 2 ];
+ }
+
+ return tween;
+ } ]
+ };
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+ setTimeout(function() {
+ fxNow = undefined;
+ });
+ return ( fxNow = jQuery.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+ var which,
+ i = 0,
+ attrs = { height: type };
+
+ // if we include width, step value is 1 to do all cssExpand values,
+ // if we don't include width, step value is 2 to skip over Left and Right
+ includeWidth = includeWidth ? 1 : 0;
+ for ( ; i < 4 ; i += 2 - includeWidth ) {
+ which = cssExpand[ i ];
+ attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+ }
+
+ if ( includeWidth ) {
+ attrs.opacity = attrs.width = type;
+ }
+
+ return attrs;
+}
+
+function createTween( value, prop, animation ) {
+ var tween,
+ collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+ index = 0,
+ length = collection.length;
+ for ( ; index < length; index++ ) {
+ if ( (tween = collection[ index ].call( animation, prop, value )) ) {
+
+ // we're done with this property
+ return tween;
+ }
+ }
+}
+
+function defaultPrefilter( elem, props, opts ) {
+ /* jshint validthis: true */
+ var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
+ anim = this,
+ orig = {},
+ style = elem.style,
+ hidden = elem.nodeType && isHidden( elem ),
+ dataShow = data_priv.get( elem, "fxshow" );
+
+ // handle queue: false promises
+ if ( !opts.queue ) {
+ hooks = jQuery._queueHooks( elem, "fx" );
+ if ( hooks.unqueued == null ) {
+ hooks.unqueued = 0;
+ oldfire = hooks.empty.fire;
+ hooks.empty.fire = function() {
+ if ( !hooks.unqueued ) {
+ oldfire();
+ }
+ };
+ }
+ hooks.unqueued++;
+
+ anim.always(function() {
+ // doing this makes sure that the complete handler will be called
+ // before this completes
+ anim.always(function() {
+ hooks.unqueued--;
+ if ( !jQuery.queue( elem, "fx" ).length ) {
+ hooks.empty.fire();
+ }
+ });
+ });
+ }
+
+ // height/width overflow pass
+ if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+ // Make sure that nothing sneaks out
+ // Record all 3 overflow attributes because IE9-10 do not
+ // change the overflow attribute when overflowX and
+ // overflowY are set to the same value
+ opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+ // Set display property to inline-block for height/width
+ // animations on inline elements that are having width/height animated
+ display = jQuery.css( elem, "display" );
+
+ // Test default display if display is currently "none"
+ checkDisplay = display === "none" ?
+ data_priv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
+
+ if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
+ style.display = "inline-block";
+ }
+ }
+
+ if ( opts.overflow ) {
+ style.overflow = "hidden";
+ anim.always(function() {
+ style.overflow = opts.overflow[ 0 ];
+ style.overflowX = opts.overflow[ 1 ];
+ style.overflowY = opts.overflow[ 2 ];
+ });
+ }
+
+ // show/hide pass
+ for ( prop in props ) {
+ value = props[ prop ];
+ if ( rfxtypes.exec( value ) ) {
+ delete props[ prop ];
+ toggle = toggle || value === "toggle";
+ if ( value === ( hidden ? "hide" : "show" ) ) {
+
+ // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
+ if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+ hidden = true;
+ } else {
+ continue;
+ }
+ }
+ orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+
+ // Any non-fx value stops us from restoring the original display value
+ } else {
+ display = undefined;
+ }
+ }
+
+ if ( !jQuery.isEmptyObject( orig ) ) {
+ if ( dataShow ) {
+ if ( "hidden" in dataShow ) {
+ hidden = dataShow.hidden;
+ }
+ } else {
+ dataShow = data_priv.access( elem, "fxshow", {} );
+ }
+
+ // store state if its toggle - enables .stop().toggle() to "reverse"
+ if ( toggle ) {
+ dataShow.hidden = !hidden;
+ }
+ if ( hidden ) {
+ jQuery( elem ).show();
+ } else {
+ anim.done(function() {
+ jQuery( elem ).hide();
+ });
+ }
+ anim.done(function() {
+ var prop;
+
+ data_priv.remove( elem, "fxshow" );
+ for ( prop in orig ) {
+ jQuery.style( elem, prop, orig[ prop ] );
+ }
+ });
+ for ( prop in orig ) {
+ tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+
+ if ( !( prop in dataShow ) ) {
+ dataShow[ prop ] = tween.start;
+ if ( hidden ) {
+ tween.end = tween.start;
+ tween.start = prop === "width" || prop === "height" ? 1 : 0;
+ }
+ }
+ }
+
+ // If this is a noop like .hide().hide(), restore an overwritten display value
+ } else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
+ style.display = display;
+ }
+}
+
+function propFilter( props, specialEasing ) {
+ var index, name, easing, value, hooks;
+
+ // camelCase, specialEasing and expand cssHook pass
+ for ( index in props ) {
+ name = jQuery.camelCase( index );
+ easing = specialEasing[ name ];
+ value = props[ index ];
+ if ( jQuery.isArray( value ) ) {
+ easing = value[ 1 ];
+ value = props[ index ] = value[ 0 ];
+ }
+
+ if ( index !== name ) {
+ props[ name ] = value;
+ delete props[ index ];
+ }
+
+ hooks = jQuery.cssHooks[ name ];
+ if ( hooks && "expand" in hooks ) {
+ value = hooks.expand( value );
+ delete props[ name ];
+
+ // not quite $.extend, this wont overwrite keys already present.
+ // also - reusing 'index' from above because we have the correct "name"
+ for ( index in value ) {
+ if ( !( index in props ) ) {
+ props[ index ] = value[ index ];
+ specialEasing[ index ] = easing;
+ }
+ }
+ } else {
+ specialEasing[ name ] = easing;
+ }
+ }
+}
+
+function Animation( elem, properties, options ) {
+ var result,
+ stopped,
+ index = 0,
+ length = animationPrefilters.length,
+ deferred = jQuery.Deferred().always( function() {
+ // don't match elem in the :animated selector
+ delete tick.elem;
+ }),
+ tick = function() {
+ if ( stopped ) {
+ return false;
+ }
+ var currentTime = fxNow || createFxNow(),
+ remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+ // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+ temp = remaining / animation.duration || 0,
+ percent = 1 - temp,
+ index = 0,
+ length = animation.tweens.length;
+
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( percent );
+ }
+
+ deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+ if ( percent < 1 && length ) {
+ return remaining;
+ } else {
+ deferred.resolveWith( elem, [ animation ] );
+ return false;
+ }
+ },
+ animation = deferred.promise({
+ elem: elem,
+ props: jQuery.extend( {}, properties ),
+ opts: jQuery.extend( true, { specialEasing: {} }, options ),
+ originalProperties: properties,
+ originalOptions: options,
+ startTime: fxNow || createFxNow(),
+ duration: options.duration,
+ tweens: [],
+ createTween: function( prop, end ) {
+ var tween = jQuery.Tween( elem, animation.opts, prop, end,
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.tweens.push( tween );
+ return tween;
+ },
+ stop: function( gotoEnd ) {
+ var index = 0,
+ // if we are going to the end, we want to run all the tweens
+ // otherwise we skip this part
+ length = gotoEnd ? animation.tweens.length : 0;
+ if ( stopped ) {
+ return this;
+ }
+ stopped = true;
+ for ( ; index < length ; index++ ) {
+ animation.tweens[ index ].run( 1 );
+ }
+
+ // resolve when we played the last frame
+ // otherwise, reject
+ if ( gotoEnd ) {
+ deferred.resolveWith( elem, [ animation, gotoEnd ] );
+ } else {
+ deferred.rejectWith( elem, [ animation, gotoEnd ] );
+ }
+ return this;
+ }
+ }),
+ props = animation.props;
+
+ propFilter( props, animation.opts.specialEasing );
+
+ for ( ; index < length ; index++ ) {
+ result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+ if ( result ) {
+ return result;
+ }
+ }
+
+ jQuery.map( props, createTween, animation );
+
+ if ( jQuery.isFunction( animation.opts.start ) ) {
+ animation.opts.start.call( elem, animation );
+ }
+
+ jQuery.fx.timer(
+ jQuery.extend( tick, {
+ elem: elem,
+ anim: animation,
+ queue: animation.opts.queue
+ })
+ );
+
+ // attach callbacks from options
+ return animation.progress( animation.opts.progress )
+ .done( animation.opts.done, animation.opts.complete )
+ .fail( animation.opts.fail )
+ .always( animation.opts.always );
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+ tweener: function( props, callback ) {
+ if ( jQuery.isFunction( props ) ) {
+ callback = props;
+ props = [ "*" ];
+ } else {
+ props = props.split(" ");
+ }
+
+ var prop,
+ index = 0,
+ length = props.length;
+
+ for ( ; index < length ; index++ ) {
+ prop = props[ index ];
+ tweeners[ prop ] = tweeners[ prop ] || [];
+ tweeners[ prop ].unshift( callback );
+ }
+ },
+
+ prefilter: function( callback, prepend ) {
+ if ( prepend ) {
+ animationPrefilters.unshift( callback );
+ } else {
+ animationPrefilters.push( callback );
+ }
+ }
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+ };
+
+ opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+ // normalize opt.queue - true/undefined/null -> "fx"
+ if ( opt.queue == null || opt.queue === true ) {
+ opt.queue = "fx";
+ }
+
+ // Queueing
+ opt.old = opt.complete;
+
+ opt.complete = function() {
+ if ( jQuery.isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+
+ if ( opt.queue ) {
+ jQuery.dequeue( this, opt.queue );
+ }
+ };
+
+ return opt;
+};
+
+jQuery.fn.extend({
+ fadeTo: function( speed, to, easing, callback ) {
+
+ // show any hidden elements after setting opacity to 0
+ return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+ // animate to the value specified
+ .end().animate({ opacity: to }, speed, easing, callback );
+ },
+ animate: function( prop, speed, easing, callback ) {
+ var empty = jQuery.isEmptyObject( prop ),
+ optall = jQuery.speed( speed, easing, callback ),
+ doAnimation = function() {
+ // Operate on a copy of prop so per-property easing won't be lost
+ var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+ // Empty animations, or finishing resolves immediately
+ if ( empty || data_priv.get( this, "finish" ) ) {
+ anim.stop( true );
+ }
+ };
+ doAnimation.finish = doAnimation;
+
+ return empty || optall.queue === false ?
+ this.each( doAnimation ) :
+ this.queue( optall.queue, doAnimation );
+ },
+ stop: function( type, clearQueue, gotoEnd ) {
+ var stopQueue = function( hooks ) {
+ var stop = hooks.stop;
+ delete hooks.stop;
+ stop( gotoEnd );
+ };
+
+ if ( typeof type !== "string" ) {
+ gotoEnd = clearQueue;
+ clearQueue = type;
+ type = undefined;
+ }
+ if ( clearQueue && type !== false ) {
+ this.queue( type || "fx", [] );
+ }
+
+ return this.each(function() {
+ var dequeue = true,
+ index = type != null && type + "queueHooks",
+ timers = jQuery.timers,
+ data = data_priv.get( this );
+
+ if ( index ) {
+ if ( data[ index ] && data[ index ].stop ) {
+ stopQueue( data[ index ] );
+ }
+ } else {
+ for ( index in data ) {
+ if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+ stopQueue( data[ index ] );
+ }
+ }
+ }
+
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+ timers[ index ].anim.stop( gotoEnd );
+ dequeue = false;
+ timers.splice( index, 1 );
+ }
+ }
+
+ // start the next in the queue if the last step wasn't forced
+ // timers currently will call their complete callbacks, which will dequeue
+ // but only if they were gotoEnd
+ if ( dequeue || !gotoEnd ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ finish: function( type ) {
+ if ( type !== false ) {
+ type = type || "fx";
+ }
+ return this.each(function() {
+ var index,
+ data = data_priv.get( this ),
+ queue = data[ type + "queue" ],
+ hooks = data[ type + "queueHooks" ],
+ timers = jQuery.timers,
+ length = queue ? queue.length : 0;
+
+ // enable finishing flag on private data
+ data.finish = true;
+
+ // empty the queue first
+ jQuery.queue( this, type, [] );
+
+ if ( hooks && hooks.stop ) {
+ hooks.stop.call( this, true );
+ }
+
+ // look for any active animations, and finish them
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+ timers[ index ].anim.stop( true );
+ timers.splice( index, 1 );
+ }
+ }
+
+ // look for any animations in the old queue and finish them
+ for ( index = 0; index < length; index++ ) {
+ if ( queue[ index ] && queue[ index ].finish ) {
+ queue[ index ].finish.call( this );
+ }
+ }
+
+ // turn off finishing flag
+ delete data.finish;
+ });
+ }
+});
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+ var cssFn = jQuery.fn[ name ];
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return speed == null || typeof speed === "boolean" ?
+ cssFn.apply( this, arguments ) :
+ this.animate( genFx( name, true ), speed, easing, callback );
+ };
+});
+
+// Generate shortcuts for custom animations
+jQuery.each({
+ slideDown: genFx("show"),
+ slideUp: genFx("hide"),
+ slideToggle: genFx("toggle"),
+ fadeIn: { opacity: "show" },
+ fadeOut: { opacity: "hide" },
+ fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return this.animate( props, speed, easing, callback );
+ };
+});
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+ var timer,
+ i = 0,
+ timers = jQuery.timers;
+
+ fxNow = jQuery.now();
+
+ for ( ; i < timers.length; i++ ) {
+ timer = timers[ i ];
+ // Checks the timer has not already been removed
+ if ( !timer() && timers[ i ] === timer ) {
+ timers.splice( i--, 1 );
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+ jQuery.timers.push( timer );
+ if ( timer() ) {
+ jQuery.fx.start();
+ } else {
+ jQuery.timers.pop();
+ }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+ if ( !timerId ) {
+ timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+ }
+};
+
+jQuery.fx.stop = function() {
+ clearInterval( timerId );
+ timerId = null;
+};
+
+jQuery.fx.speeds = {
+ slow: 600,
+ fast: 200,
+ // Default speed
+ _default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = setTimeout( next, time );
+ hooks.stop = function() {
+ clearTimeout( timeout );
+ };
+ });
+};
+
+
+(function() {
+ var input = document.createElement( "input" ),
+ select = document.createElement( "select" ),
+ opt = select.appendChild( document.createElement( "option" ) );
+
+ input.type = "checkbox";
+
+ // Support: iOS 5.1, Android 4.x, Android 2.3
+ // Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere)
+ support.checkOn = input.value !== "";
+
+ // Must access the parent to make an option select properly
+ // Support: IE9, IE10
+ support.optSelected = opt.selected;
+
+ // Make sure that the options inside disabled selects aren't marked as disabled
+ // (WebKit marks them as disabled)
+ select.disabled = true;
+ support.optDisabled = !opt.disabled;
+
+ // Check if an input maintains its value after becoming a radio
+ // Support: IE9, IE10
+ input = document.createElement( "input" );
+ input.value = "t";
+ input.type = "radio";
+ support.radioValue = input.value === "t";
+})();
+
+
+var nodeHook, boolHook,
+ attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return access( this, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr: function( name ) {
+ return this.each(function() {
+ jQuery.removeAttr( this, name );
+ });
+ }
+});
+
+jQuery.extend({
+ attr: function( elem, name, value ) {
+ var hooks, ret,
+ nType = elem.nodeType;
+
+ // don't get/set attributes on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( typeof elem.getAttribute === strundefined ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ // All attributes are lowercase
+ // Grab necessary hook if one is defined
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+ name = name.toLowerCase();
+ hooks = jQuery.attrHooks[ name ] ||
+ ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
+ }
+
+ if ( value !== undefined ) {
+
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+
+ } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ elem.setAttribute( name, value + "" );
+ return value;
+ }
+
+ } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+ ret = jQuery.find.attr( elem, name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ?
+ undefined :
+ ret;
+ }
+ },
+
+ removeAttr: function( elem, value ) {
+ var name, propName,
+ i = 0,
+ attrNames = value && value.match( rnotwhite );
+
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( (name = attrNames[i++]) ) {
+ propName = jQuery.propFix[ name ] || name;
+
+ // Boolean attributes get special treatment (#10870)
+ if ( jQuery.expr.match.bool.test( name ) ) {
+ // Set corresponding property to false
+ elem[ propName ] = false;
+ }
+
+ elem.removeAttribute( name );
+ }
+ }
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ if ( !support.radioValue && value === "radio" &&
+ jQuery.nodeName( elem, "input" ) ) {
+ // Setting the type on a radio button after the value resets the value in IE6-9
+ // Reset value to default in case type is set after value during creation
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
+ }
+});
+
+// Hooks for boolean attributes
+boolHook = {
+ set: function( elem, value, name ) {
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else {
+ elem.setAttribute( name, name );
+ }
+ return name;
+ }
+};
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+ var getter = attrHandle[ name ] || jQuery.find.attr;
+
+ attrHandle[ name ] = function( elem, name, isXML ) {
+ var ret, handle;
+ if ( !isXML ) {
+ // Avoid an infinite loop by temporarily removing this function from the getter
+ handle = attrHandle[ name ];
+ attrHandle[ name ] = ret;
+ ret = getter( elem, name, isXML ) != null ?
+ name.toLowerCase() :
+ null;
+ attrHandle[ name ] = handle;
+ }
+ return ret;
+ };
+});
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i;
+
+jQuery.fn.extend({
+ prop: function( name, value ) {
+ return access( this, jQuery.prop, name, value, arguments.length > 1 );
+ },
+
+ removeProp: function( name ) {
+ return this.each(function() {
+ delete this[ jQuery.propFix[ name ] || name ];
+ });
+ }
+});
+
+jQuery.extend({
+ propFix: {
+ "for": "htmlFor",
+ "class": "className"
+ },
+
+ prop: function( elem, name, value ) {
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
+ // don't get/set properties on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ if ( notxml ) {
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
+ ret :
+ ( elem[ name ] = value );
+
+ } else {
+ return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
+ ret :
+ elem[ name ];
+ }
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+ return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
+ elem.tabIndex :
+ -1;
+ }
+ }
+ }
+});
+
+// Support: IE9+
+// Selectedness for an option in an optgroup can be inaccurate
+if ( !support.optSelected ) {
+ jQuery.propHooks.selected = {
+ get: function( elem ) {
+ var parent = elem.parentNode;
+ if ( parent && parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ return null;
+ }
+ };
+}
+
+jQuery.each([
+ "tabIndex",
+ "readOnly",
+ "maxLength",
+ "cellSpacing",
+ "cellPadding",
+ "rowSpan",
+ "colSpan",
+ "useMap",
+ "frameBorder",
+ "contentEditable"
+], function() {
+ jQuery.propFix[ this.toLowerCase() ] = this;
+});
+
+
+
+
+var rclass = /[\t\r\n\f]/g;
+
+jQuery.fn.extend({
+ addClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).addClass( value.call( this, j, this.className ) );
+ });
+ }
+
+ if ( proceed ) {
+ // The disjunction here is for better compressibility (see removeClass)
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ " "
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
+ }
+ }
+
+ // only assign if different to avoid unneeded rendering.
+ finalValue = jQuery.trim( cur );
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classes, elem, cur, clazz, j, finalValue,
+ proceed = arguments.length === 0 || typeof value === "string" && value,
+ i = 0,
+ len = this.length;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).removeClass( value.call( this, j, this.className ) );
+ });
+ }
+ if ( proceed ) {
+ classes = ( value || "" ).match( rnotwhite ) || [];
+
+ for ( ; i < len; i++ ) {
+ elem = this[ i ];
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( elem.className ?
+ ( " " + elem.className + " " ).replace( rclass, " " ) :
+ ""
+ );
+
+ if ( cur ) {
+ j = 0;
+ while ( (clazz = classes[j++]) ) {
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
+ }
+ }
+
+ // only assign if different to avoid unneeded rendering.
+ finalValue = value ? jQuery.trim( cur ) : "";
+ if ( elem.className !== finalValue ) {
+ elem.className = finalValue;
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value;
+
+ if ( typeof stateVal === "boolean" && type === "string" ) {
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
+ }
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery( this ),
+ classNames = value.match( rnotwhite ) || [];
+
+ while ( (className = classNames[ i++ ]) ) {
+ // check each className given, space separated list
+ if ( self.hasClass( className ) ) {
+ self.removeClass( className );
+ } else {
+ self.addClass( className );
+ }
+ }
+
+ // Toggle whole class name
+ } else if ( type === strundefined || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ data_priv.set( this, "__className__", this.className );
+ }
+
+ // If the element has a class name or if we're passed "false",
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
+ }
+ });
+ },
+
+ hasClass: function( selector ) {
+ var className = " " + selector + " ",
+ i = 0,
+ l = this.length;
+ for ( ; i < l; i++ ) {
+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+});
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend({
+ val: function( value ) {
+ var hooks, ret, isFunction,
+ elem = this[0];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ return typeof ret === "string" ?
+ // handle most common string cases
+ ret.replace(rreturn, "") :
+ // handle cases where value is null/undef or number
+ ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ isFunction = jQuery.isFunction( value );
+
+ return this.each(function( i ) {
+ var val;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call( this, i, jQuery( this ).val() );
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+
+ } else if ( typeof val === "number" ) {
+ val += "";
+
+ } else if ( jQuery.isArray( val ) ) {
+ val = jQuery.map( val, function( value ) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+ this.value = val;
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ valHooks: {
+ option: {
+ get: function( elem ) {
+ var val = jQuery.find.attr( elem, "value" );
+ return val != null ?
+ val :
+ // Support: IE10-11+
+ // option.text throws exceptions (#14686, #14858)
+ jQuery.trim( jQuery.text( elem ) );
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, option,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one" || index < 0,
+ values = one ? null : [],
+ max = one ? index + 1 : options.length,
+ i = index < 0 ?
+ max :
+ one ? index : 0;
+
+ // Loop through all the selected options
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // IE6-9 doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+ // Don't return options that are disabled or in a disabled optgroup
+ ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) &&
+ ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var optionSet, option,
+ options = elem.options,
+ values = jQuery.makeArray( value ),
+ i = options.length;
+
+ while ( i-- ) {
+ option = options[ i ];
+ if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {
+ optionSet = true;
+ }
+ }
+
+ // force browsers to behave consistently when non-matching value is set
+ if ( !optionSet ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ }
+});
+
+// Radios and checkboxes getter/setter
+jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ set: function( elem, value ) {
+ if ( jQuery.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+ }
+ }
+ };
+ if ( !support.checkOn ) {
+ jQuery.valHooks[ this ].get = function( elem ) {
+ // Support: Webkit
+ // "" is returned instead of "on" if a value isn't specified
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ };
+ }
+});
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+});
+
+jQuery.fn.extend({
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ },
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+ }
+});
+
+
+var nonce = jQuery.now();
+
+var rquery = (/\?/);
+
+
+
+// Support: Android 2.3
+// Workaround failure to string-cast null input
+jQuery.parseJSON = function( data ) {
+ return JSON.parse( data + "" );
+};
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+ var xml, tmp;
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+
+ // Support: IE9
+ try {
+ tmp = new DOMParser();
+ xml = tmp.parseFromString( data, "text/xml" );
+ } catch ( e ) {
+ xml = undefined;
+ }
+
+ if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
+ jQuery.error( "Invalid XML: " + data );
+ }
+ return xml;
+};
+
+
+var
+ // Document location
+ ajaxLocParts,
+ ajaxLocation,
+
+ rhash = /#.*$/,
+ rts = /([?&])_=[^&]*/,
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+ // #7653, #8125, #8152: local protocol detection
+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rprotocol = /^\/\//,
+ rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
+
+ /* Prefilters
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+ * 2) These are called:
+ * - BEFORE asking for a transport
+ * - AFTER param serialization (s.data is a string if s.processData is true)
+ * 3) key is the dataType
+ * 4) the catchall symbol "*" can be used
+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+ */
+ prefilters = {},
+
+ /* Transports bindings
+ * 1) key is the dataType
+ * 2) the catchall symbol "*" can be used
+ * 3) selection will start with transport dataType and THEN go to "*" if needed
+ */
+ transports = {},
+
+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+ allTypes = "*/".concat("*");
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+ ajaxLocation = location.href;
+} catch( e ) {
+ // Use the href attribute of an A element
+ // since IE will modify it given document.location
+ ajaxLocation = document.createElement( "a" );
+ ajaxLocation.href = "";
+ ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+ // dataTypeExpression is optional and defaults to "*"
+ return function( dataTypeExpression, func ) {
+
+ if ( typeof dataTypeExpression !== "string" ) {
+ func = dataTypeExpression;
+ dataTypeExpression = "*";
+ }
+
+ var dataType,
+ i = 0,
+ dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
+
+ if ( jQuery.isFunction( func ) ) {
+ // For each dataType in the dataTypeExpression
+ while ( (dataType = dataTypes[i++]) ) {
+ // Prepend if requested
+ if ( dataType[0] === "+" ) {
+ dataType = dataType.slice( 1 ) || "*";
+ (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+ // Otherwise append
+ } else {
+ (structure[ dataType ] = structure[ dataType ] || []).push( func );
+ }
+ }
+ }
+ };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+ var inspected = {},
+ seekingTransport = ( structure === transports );
+
+ function inspect( dataType ) {
+ var selected;
+ inspected[ dataType ] = true;
+ jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+ var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+ if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+ options.dataTypes.unshift( dataTypeOrTransport );
+ inspect( dataTypeOrTransport );
+ return false;
+ } else if ( seekingTransport ) {
+ return !( selected = dataTypeOrTransport );
+ }
+ });
+ return selected;
+ }
+
+ return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+ var key, deep,
+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+ for ( key in src ) {
+ if ( src[ key ] !== undefined ) {
+ ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
+ }
+ }
+ if ( deep ) {
+ jQuery.extend( true, target, deep );
+ }
+
+ return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+ var ct, type, finalDataType, firstDataType,
+ contents = s.contents,
+ dataTypes = s.dataTypes;
+
+ // Remove auto dataType and get content-type in the process
+ while ( dataTypes[ 0 ] === "*" ) {
+ dataTypes.shift();
+ if ( ct === undefined ) {
+ ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+ }
+ }
+
+ // Check if we're dealing with a known content-type
+ if ( ct ) {
+ for ( type in contents ) {
+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
+ dataTypes.unshift( type );
+ break;
+ }
+ }
+ }
+
+ // Check to see if we have a response for the expected dataType
+ if ( dataTypes[ 0 ] in responses ) {
+ finalDataType = dataTypes[ 0 ];
+ } else {
+ // Try convertible dataTypes
+ for ( type in responses ) {
+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+ finalDataType = type;
+ break;
+ }
+ if ( !firstDataType ) {
+ firstDataType = type;
+ }
+ }
+ // Or just use first one
+ finalDataType = finalDataType || firstDataType;
+ }
+
+ // If we found a dataType
+ // We add the dataType to the list if needed
+ // and return the corresponding response
+ if ( finalDataType ) {
+ if ( finalDataType !== dataTypes[ 0 ] ) {
+ dataTypes.unshift( finalDataType );
+ }
+ return responses[ finalDataType ];
+ }
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+ var conv2, current, conv, tmp, prev,
+ converters = {},
+ // Work with a copy of dataTypes in case we need to modify it for conversion
+ dataTypes = s.dataTypes.slice();
+
+ // Create converters map with lowercased keys
+ if ( dataTypes[ 1 ] ) {
+ for ( conv in s.converters ) {
+ converters[ conv.toLowerCase() ] = s.converters[ conv ];
+ }
+ }
+
+ current = dataTypes.shift();
+
+ // Convert to each sequential dataType
+ while ( current ) {
+
+ if ( s.responseFields[ current ] ) {
+ jqXHR[ s.responseFields[ current ] ] = response;
+ }
+
+ // Apply the dataFilter if provided
+ if ( !prev && isSuccess && s.dataFilter ) {
+ response = s.dataFilter( response, s.dataType );
+ }
+
+ prev = current;
+ current = dataTypes.shift();
+
+ if ( current ) {
+
+ // There's only work to do if current dataType is non-auto
+ if ( current === "*" ) {
+
+ current = prev;
+
+ // Convert response if prev dataType is non-auto and differs from current
+ } else if ( prev !== "*" && prev !== current ) {
+
+ // Seek a direct converter
+ conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+ // If none found, seek a pair
+ if ( !conv ) {
+ for ( conv2 in converters ) {
+
+ // If conv2 outputs current
+ tmp = conv2.split( " " );
+ if ( tmp[ 1 ] === current ) {
+
+ // If prev can be converted to accepted input
+ conv = converters[ prev + " " + tmp[ 0 ] ] ||
+ converters[ "* " + tmp[ 0 ] ];
+ if ( conv ) {
+ // Condense equivalence converters
+ if ( conv === true ) {
+ conv = converters[ conv2 ];
+
+ // Otherwise, insert the intermediate dataType
+ } else if ( converters[ conv2 ] !== true ) {
+ current = tmp[ 0 ];
+ dataTypes.unshift( tmp[ 1 ] );
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ // Apply converter (if not an equivalence)
+ if ( conv !== true ) {
+
+ // Unless errors are allowed to bubble, catch and return them
+ if ( conv && s[ "throws" ] ) {
+ response = conv( response );
+ } else {
+ try {
+ response = conv( response );
+ } catch ( e ) {
+ return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return { state: "success", data: response };
+}
+
+jQuery.extend({
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {},
+
+ ajaxSettings: {
+ url: ajaxLocation,
+ type: "GET",
+ isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+ global: true,
+ processData: true,
+ async: true,
+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+ /*
+ timeout: 0,
+ data: null,
+ dataType: null,
+ username: null,
+ password: null,
+ cache: null,
+ throws: false,
+ traditional: false,
+ headers: {},
+ */
+
+ accepts: {
+ "*": allTypes,
+ text: "text/plain",
+ html: "text/html",
+ xml: "application/xml, text/xml",
+ json: "application/json, text/javascript"
+ },
+
+ contents: {
+ xml: /xml/,
+ html: /html/,
+ json: /json/
+ },
+
+ responseFields: {
+ xml: "responseXML",
+ text: "responseText",
+ json: "responseJSON"
+ },
+
+ // Data converters
+ // Keys separate source (or catchall "*") and destination types with a single space
+ converters: {
+
+ // Convert anything to text
+ "* text": String,
+
+ // Text to html (true = no transformation)
+ "text html": true,
+
+ // Evaluate text as a json expression
+ "text json": jQuery.parseJSON,
+
+ // Parse text as xml
+ "text xml": jQuery.parseXML
+ },
+
+ // For options that shouldn't be deep extended:
+ // you can add your own custom options here if
+ // and when you create one that shouldn't be
+ // deep extended (see ajaxExtend)
+ flatOptions: {
+ url: true,
+ context: true
+ }
+ },
+
+ // Creates a full fledged settings object into target
+ // with both ajaxSettings and settings fields.
+ // If target is omitted, writes into ajaxSettings.
+ ajaxSetup: function( target, settings ) {
+ return settings ?
+
+ // Building a settings object
+ ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+ // Extending ajaxSettings
+ ajaxExtend( jQuery.ajaxSettings, target );
+ },
+
+ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+ ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+ // Main method
+ ajax: function( url, options ) {
+
+ // If url is an object, simulate pre-1.5 signature
+ if ( typeof url === "object" ) {
+ options = url;
+ url = undefined;
+ }
+
+ // Force options to be an object
+ options = options || {};
+
+ var transport,
+ // URL without anti-cache param
+ cacheURL,
+ // Response headers
+ responseHeadersString,
+ responseHeaders,
+ // timeout handle
+ timeoutTimer,
+ // Cross-domain detection vars
+ parts,
+ // To know if global events are to be dispatched
+ fireGlobals,
+ // Loop variable
+ i,
+ // Create the final options object
+ s = jQuery.ajaxSetup( {}, options ),
+ // Callbacks context
+ callbackContext = s.context || s,
+ // Context for global events is callbackContext if it is a DOM node or jQuery collection
+ globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+ jQuery( callbackContext ) :
+ jQuery.event,
+ // Deferreds
+ deferred = jQuery.Deferred(),
+ completeDeferred = jQuery.Callbacks("once memory"),
+ // Status-dependent callbacks
+ statusCode = s.statusCode || {},
+ // Headers (they are sent all at once)
+ requestHeaders = {},
+ requestHeadersNames = {},
+ // The jqXHR state
+ state = 0,
+ // Default abort message
+ strAbort = "canceled",
+ // Fake xhr
+ jqXHR = {
+ readyState: 0,
+
+ // Builds headers hashtable if needed
+ getResponseHeader: function( key ) {
+ var match;
+ if ( state === 2 ) {
+ if ( !responseHeaders ) {
+ responseHeaders = {};
+ while ( (match = rheaders.exec( responseHeadersString )) ) {
+ responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+ }
+ }
+ match = responseHeaders[ key.toLowerCase() ];
+ }
+ return match == null ? null : match;
+ },
+
+ // Raw string
+ getAllResponseHeaders: function() {
+ return state === 2 ? responseHeadersString : null;
+ },
+
+ // Caches the header
+ setRequestHeader: function( name, value ) {
+ var lname = name.toLowerCase();
+ if ( !state ) {
+ name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+ requestHeaders[ name ] = value;
+ }
+ return this;
+ },
+
+ // Overrides response content-type header
+ overrideMimeType: function( type ) {
+ if ( !state ) {
+ s.mimeType = type;
+ }
+ return this;
+ },
+
+ // Status-dependent callbacks
+ statusCode: function( map ) {
+ var code;
+ if ( map ) {
+ if ( state < 2 ) {
+ for ( code in map ) {
+ // Lazy-add the new callback in a way that preserves old ones
+ statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+ }
+ } else {
+ // Execute the appropriate callbacks
+ jqXHR.always( map[ jqXHR.status ] );
+ }
+ }
+ return this;
+ },
+
+ // Cancel the request
+ abort: function( statusText ) {
+ var finalText = statusText || strAbort;
+ if ( transport ) {
+ transport.abort( finalText );
+ }
+ done( 0, finalText );
+ return this;
+ }
+ };
+
+ // Attach deferreds
+ deferred.promise( jqXHR ).complete = completeDeferred.add;
+ jqXHR.success = jqXHR.done;
+ jqXHR.error = jqXHR.fail;
+
+ // Remove hash character (#7531: and string promotion)
+ // Add protocol if not provided (prefilters might expect it)
+ // Handle falsy url in the settings object (#10093: consistency with old signature)
+ // We also use the url parameter if available
+ s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
+ .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+ // Alias method option to type as per ticket #12004
+ s.type = options.method || options.type || s.method || s.type;
+
+ // Extract dataTypes list
+ s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
+
+ // A cross-domain request is in order when we have a protocol:host:port mismatch
+ if ( s.crossDomain == null ) {
+ parts = rurl.exec( s.url.toLowerCase() );
+ s.crossDomain = !!( parts &&
+ ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+ ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
+ ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
+ );
+ }
+
+ // Convert data if not already a string
+ if ( s.data && s.processData && typeof s.data !== "string" ) {
+ s.data = jQuery.param( s.data, s.traditional );
+ }
+
+ // Apply prefilters
+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+ // If request was aborted inside a prefilter, stop there
+ if ( state === 2 ) {
+ return jqXHR;
+ }
+
+ // We can fire global events as of now if asked to
+ fireGlobals = s.global;
+
+ // Watch for a new set of requests
+ if ( fireGlobals && jQuery.active++ === 0 ) {
+ jQuery.event.trigger("ajaxStart");
+ }
+
+ // Uppercase the type
+ s.type = s.type.toUpperCase();
+
+ // Determine if request has content
+ s.hasContent = !rnoContent.test( s.type );
+
+ // Save the URL in case we're toying with the If-Modified-Since
+ // and/or If-None-Match header later on
+ cacheURL = s.url;
+
+ // More options handling for requests with no content
+ if ( !s.hasContent ) {
+
+ // If data is available, append data to url
+ if ( s.data ) {
+ cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+ // #9682: remove data so that it's not used in an eventual retry
+ delete s.data;
+ }
+
+ // Add anti-cache in url if needed
+ if ( s.cache === false ) {
+ s.url = rts.test( cacheURL ) ?
+
+ // If there is already a '_' parameter, set its value
+ cacheURL.replace( rts, "$1_=" + nonce++ ) :
+
+ // Otherwise add one to the end
+ cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
+ }
+ }
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ if ( jQuery.lastModified[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+ }
+ if ( jQuery.etag[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+ }
+ }
+
+ // Set the correct header, if data is being sent
+ if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+ jqXHR.setRequestHeader( "Content-Type", s.contentType );
+ }
+
+ // Set the Accepts header for the server, depending on the dataType
+ jqXHR.setRequestHeader(
+ "Accept",
+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+ s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+ s.accepts[ "*" ]
+ );
+
+ // Check for headers option
+ for ( i in s.headers ) {
+ jqXHR.setRequestHeader( i, s.headers[ i ] );
+ }
+
+ // Allow custom headers/mimetypes and early abort
+ if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+ // Abort if not done already and return
+ return jqXHR.abort();
+ }
+
+ // aborting is no longer a cancellation
+ strAbort = "abort";
+
+ // Install callbacks on deferreds
+ for ( i in { success: 1, error: 1, complete: 1 } ) {
+ jqXHR[ i ]( s[ i ] );
+ }
+
+ // Get transport
+ transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+ // If no transport, we auto-abort
+ if ( !transport ) {
+ done( -1, "No Transport" );
+ } else {
+ jqXHR.readyState = 1;
+
+ // Send global event
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+ }
+ // Timeout
+ if ( s.async && s.timeout > 0 ) {
+ timeoutTimer = setTimeout(function() {
+ jqXHR.abort("timeout");
+ }, s.timeout );
+ }
+
+ try {
+ state = 1;
+ transport.send( requestHeaders, done );
+ } catch ( e ) {
+ // Propagate exception as error if not done
+ if ( state < 2 ) {
+ done( -1, e );
+ // Simply rethrow otherwise
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ // Callback for when everything is done
+ function done( status, nativeStatusText, responses, headers ) {
+ var isSuccess, success, error, response, modified,
+ statusText = nativeStatusText;
+
+ // Called once
+ if ( state === 2 ) {
+ return;
+ }
+
+ // State is "done" now
+ state = 2;
+
+ // Clear timeout if it exists
+ if ( timeoutTimer ) {
+ clearTimeout( timeoutTimer );
+ }
+
+ // Dereference transport for early garbage collection
+ // (no matter how long the jqXHR object will be used)
+ transport = undefined;
+
+ // Cache response headers
+ responseHeadersString = headers || "";
+
+ // Set readyState
+ jqXHR.readyState = status > 0 ? 4 : 0;
+
+ // Determine if successful
+ isSuccess = status >= 200 && status < 300 || status === 304;
+
+ // Get response data
+ if ( responses ) {
+ response = ajaxHandleResponses( s, jqXHR, responses );
+ }
+
+ // Convert no matter what (that way responseXXX fields are always set)
+ response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+ // If successful, handle type chaining
+ if ( isSuccess ) {
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ modified = jqXHR.getResponseHeader("Last-Modified");
+ if ( modified ) {
+ jQuery.lastModified[ cacheURL ] = modified;
+ }
+ modified = jqXHR.getResponseHeader("etag");
+ if ( modified ) {
+ jQuery.etag[ cacheURL ] = modified;
+ }
+ }
+
+ // if no content
+ if ( status === 204 || s.type === "HEAD" ) {
+ statusText = "nocontent";
+
+ // if not modified
+ } else if ( status === 304 ) {
+ statusText = "notmodified";
+
+ // If we have data, let's convert it
+ } else {
+ statusText = response.state;
+ success = response.data;
+ error = response.error;
+ isSuccess = !error;
+ }
+ } else {
+ // We extract error from statusText
+ // then normalize statusText and status for non-aborts
+ error = statusText;
+ if ( status || !statusText ) {
+ statusText = "error";
+ if ( status < 0 ) {
+ status = 0;
+ }
+ }
+ }
+
+ // Set data for the fake xhr object
+ jqXHR.status = status;
+ jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+ // Success/Error
+ if ( isSuccess ) {
+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+ } else {
+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+ }
+
+ // Status-dependent callbacks
+ jqXHR.statusCode( statusCode );
+ statusCode = undefined;
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+ [ jqXHR, s, isSuccess ? success : error ] );
+ }
+
+ // Complete
+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+ // Handle the global AJAX counter
+ if ( !( --jQuery.active ) ) {
+ jQuery.event.trigger("ajaxStop");
+ }
+ }
+ }
+
+ return jqXHR;
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get( url, data, callback, "json" );
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get( url, undefined, callback, "script" );
+ }
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+ jQuery[ method ] = function( url, data, callback, type ) {
+ // shift arguments if data argument was omitted
+ if ( jQuery.isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = undefined;
+ }
+
+ return jQuery.ajax({
+ url: url,
+ type: method,
+ dataType: type,
+ data: data,
+ success: callback
+ });
+ };
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
+ jQuery.fn[ type ] = function( fn ) {
+ return this.on( type, fn );
+ };
+});
+
+
+jQuery._evalUrl = function( url ) {
+ return jQuery.ajax({
+ url: url,
+ type: "GET",
+ dataType: "script",
+ async: false,
+ global: false,
+ "throws": true
+ });
+};
+
+
+jQuery.fn.extend({
+ wrapAll: function( html ) {
+ var wrap;
+
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( html.call(this, i) );
+ });
+ }
+
+ if ( this[ 0 ] ) {
+
+ // The elements to wrap the target around
+ wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+ if ( this[ 0 ].parentNode ) {
+ wrap.insertBefore( this[ 0 ] );
+ }
+
+ wrap.map(function() {
+ var elem = this;
+
+ while ( elem.firstElementChild ) {
+ elem = elem.firstElementChild;
+ }
+
+ return elem;
+ }).append( this );
+ }
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).wrapInner( html.call(this, i) );
+ });
+ }
+
+ return this.each(function() {
+ var self = jQuery( this ),
+ contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
+ }
+ });
+ },
+
+ wrap: function( html ) {
+ var isFunction = jQuery.isFunction( html );
+
+ return this.each(function( i ) {
+ jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+ });
+ },
+
+ unwrap: function() {
+ return this.parent().each(function() {
+ if ( !jQuery.nodeName( this, "body" ) ) {
+ jQuery( this ).replaceWith( this.childNodes );
+ }
+ }).end();
+ }
+});
+
+
+jQuery.expr.filters.hidden = function( elem ) {
+ // Support: Opera <= 12.12
+ // Opera reports offsetWidths and offsetHeights less than zero on some elements
+ return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
+};
+jQuery.expr.filters.visible = function( elem ) {
+ return !jQuery.expr.filters.hidden( elem );
+};
+
+
+
+
+var r20 = /%20/g,
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+ var name;
+
+ if ( jQuery.isArray( obj ) ) {
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || rbracket.test( prefix ) ) {
+ // Treat each array item as a scalar.
+ add( prefix, v );
+
+ } else {
+ // Item is non-scalar (array or object), encode its numeric index.
+ buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+ }
+ });
+
+ } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+ // Serialize object item.
+ for ( name in obj ) {
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+ }
+
+ } else {
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+ var prefix,
+ s = [],
+ add = function( key, value ) {
+ // If value is a function, invoke it and return its value
+ value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+ s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+ };
+
+ // Set traditional to true for jQuery <= 1.3.2 behavior.
+ if ( traditional === undefined ) {
+ traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ });
+
+ } else {
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( prefix in a ) {
+ buildParams( prefix, a[ prefix ], traditional, add );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join( "&" ).replace( r20, "+" );
+};
+
+jQuery.fn.extend({
+ serialize: function() {
+ return jQuery.param( this.serializeArray() );
+ },
+ serializeArray: function() {
+ return this.map(function() {
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop( this, "elements" );
+ return elements ? jQuery.makeArray( elements ) : this;
+ })
+ .filter(function() {
+ var type = this.type;
+
+ // Use .is( ":disabled" ) so that fieldset[disabled] works
+ return this.name && !jQuery( this ).is( ":disabled" ) &&
+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+ ( this.checked || !rcheckableType.test( type ) );
+ })
+ .map(function( i, elem ) {
+ var val = jQuery( this ).val();
+
+ return val == null ?
+ null :
+ jQuery.isArray( val ) ?
+ jQuery.map( val, function( val ) {
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }) :
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }).get();
+ }
+});
+
+
+jQuery.ajaxSettings.xhr = function() {
+ try {
+ return new XMLHttpRequest();
+ } catch( e ) {}
+};
+
+var xhrId = 0,
+ xhrCallbacks = {},
+ xhrSuccessStatus = {
+ // file protocol always yields status code 0, assume 200
+ 0: 200,
+ // Support: IE9
+ // #1450: sometimes IE returns 1223 when it should be 204
+ 1223: 204
+ },
+ xhrSupported = jQuery.ajaxSettings.xhr();
+
+// Support: IE9
+// Open requests must be manually aborted on unload (#5280)
+if ( window.ActiveXObject ) {
+ jQuery( window ).on( "unload", function() {
+ for ( var key in xhrCallbacks ) {
+ xhrCallbacks[ key ]();
+ }
+ });
+}
+
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport(function( options ) {
+ var callback;
+
+ // Cross domain only allowed if supported through XMLHttpRequest
+ if ( support.cors || xhrSupported && !options.crossDomain ) {
+ return {
+ send: function( headers, complete ) {
+ var i,
+ xhr = options.xhr(),
+ id = ++xhrId;
+
+ xhr.open( options.type, options.url, options.async, options.username, options.password );
+
+ // Apply custom fields if provided
+ if ( options.xhrFields ) {
+ for ( i in options.xhrFields ) {
+ xhr[ i ] = options.xhrFields[ i ];
+ }
+ }
+
+ // Override mime type if needed
+ if ( options.mimeType && xhr.overrideMimeType ) {
+ xhr.overrideMimeType( options.mimeType );
+ }
+
+ // X-Requested-With header
+ // For cross-domain requests, seeing as conditions for a preflight are
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
+ // (it can always be set on a per-request basis or even using ajaxSetup)
+ // For same-domain requests, won't change header if already provided.
+ if ( !options.crossDomain && !headers["X-Requested-With"] ) {
+ headers["X-Requested-With"] = "XMLHttpRequest";
+ }
+
+ // Set headers
+ for ( i in headers ) {
+ xhr.setRequestHeader( i, headers[ i ] );
+ }
+
+ // Callback
+ callback = function( type ) {
+ return function() {
+ if ( callback ) {
+ delete xhrCallbacks[ id ];
+ callback = xhr.onload = xhr.onerror = null;
+
+ if ( type === "abort" ) {
+ xhr.abort();
+ } else if ( type === "error" ) {
+ complete(
+ // file: protocol always yields status 0; see #8605, #14207
+ xhr.status,
+ xhr.statusText
+ );
+ } else {
+ complete(
+ xhrSuccessStatus[ xhr.status ] || xhr.status,
+ xhr.statusText,
+ // Support: IE9
+ // Accessing binary-data responseText throws an exception
+ // (#11426)
+ typeof xhr.responseText === "string" ? {
+ text: xhr.responseText
+ } : undefined,
+ xhr.getAllResponseHeaders()
+ );
+ }
+ }
+ };
+ };
+
+ // Listen to events
+ xhr.onload = callback();
+ xhr.onerror = callback("error");
+
+ // Create the abort callback
+ callback = xhrCallbacks[ id ] = callback("abort");
+
+ try {
+ // Do send the request (this may raise an exception)
+ xhr.send( options.hasContent && options.data || null );
+ } catch ( e ) {
+ // #14683: Only rethrow if this hasn't been notified as an error yet
+ if ( callback ) {
+ throw e;
+ }
+ }
+ },
+
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+ accepts: {
+ script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+ },
+ contents: {
+ script: /(?:java|ecma)script/
+ },
+ converters: {
+ "text script": function( text ) {
+ jQuery.globalEval( text );
+ return text;
+ }
+ }
+});
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+ if ( s.cache === undefined ) {
+ s.cache = false;
+ }
+ if ( s.crossDomain ) {
+ s.type = "GET";
+ }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+ // This transport only deals with cross domain requests
+ if ( s.crossDomain ) {
+ var script, callback;
+ return {
+ send: function( _, complete ) {
+ script = jQuery("<script>").prop({
+ async: true,
+ charset: s.scriptCharset,
+ src: s.url
+ }).on(
+ "load error",
+ callback = function( evt ) {
+ script.remove();
+ callback = null;
+ if ( evt ) {
+ complete( evt.type === "error" ? 404 : 200, evt.type );
+ }
+ }
+ );
+ document.head.appendChild( script[ 0 ] );
+ },
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+});
+
+
+
+
+var oldCallbacks = [],
+ rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+ jsonp: "callback",
+ jsonpCallback: function() {
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+ this[ callback ] = true;
+ return callback;
+ }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+ var callbackName, overwritten, responseContainer,
+ jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+ "url" :
+ typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+ );
+
+ // Handle iff the expected data type is "jsonp" or we have a parameter to set
+ if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+ // Get callback name, remembering preexisting value associated with it
+ callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+ s.jsonpCallback() :
+ s.jsonpCallback;
+
+ // Insert callback into url or form data
+ if ( jsonProp ) {
+ s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+ } else if ( s.jsonp !== false ) {
+ s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+ }
+
+ // Use data converter to retrieve json after script execution
+ s.converters["script json"] = function() {
+ if ( !responseContainer ) {
+ jQuery.error( callbackName + " was not called" );
+ }
+ return responseContainer[ 0 ];
+ };
+
+ // force json dataType
+ s.dataTypes[ 0 ] = "json";
+
+ // Install callback
+ overwritten = window[ callbackName ];
+ window[ callbackName ] = function() {
+ responseContainer = arguments;
+ };
+
+ // Clean-up function (fires after converters)
+ jqXHR.always(function() {
+ // Restore preexisting value
+ window[ callbackName ] = overwritten;
+
+ // Save back as free
+ if ( s[ callbackName ] ) {
+ // make sure that re-using the options doesn't screw things around
+ s.jsonpCallback = originalSettings.jsonpCallback;
+
+ // save the callback name for future use
+ oldCallbacks.push( callbackName );
+ }
+
+ // Call if it was a function and we have a response
+ if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+ overwritten( responseContainer[ 0 ] );
+ }
+
+ responseContainer = overwritten = undefined;
+ });
+
+ // Delegate to script
+ return "script";
+ }
+});
+
+
+
+
+// data: string of html
+// context (optional): If specified, the fragment will be created in this context, defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+ if ( typeof context === "boolean" ) {
+ keepScripts = context;
+ context = false;
+ }
+ context = context || document;
+
+ var parsed = rsingleTag.exec( data ),
+ scripts = !keepScripts && [];
+
+ // Single tag
+ if ( parsed ) {
+ return [ context.createElement( parsed[1] ) ];
+ }
+
+ parsed = jQuery.buildFragment( [ data ], context, scripts );
+
+ if ( scripts && scripts.length ) {
+ jQuery( scripts ).remove();
+ }
+
+ return jQuery.merge( [], parsed.childNodes );
+};
+
+
+// Keep a copy of the old load method
+var _load = jQuery.fn.load;
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+ if ( typeof url !== "string" && _load ) {
+ return _load.apply( this, arguments );
+ }
+
+ var selector, type, response,
+ self = this,
+ off = url.indexOf(" ");
+
+ if ( off >= 0 ) {
+ selector = jQuery.trim( url.slice( off ) );
+ url = url.slice( 0, off );
+ }
+
+ // If it's a function
+ if ( jQuery.isFunction( params ) ) {
+
+ // We assume that it's the callback
+ callback = params;
+ params = undefined;
+
+ // Otherwise, build a param string
+ } else if ( params && typeof params === "object" ) {
+ type = "POST";
+ }
+
+ // If we have elements to modify, make the request
+ if ( self.length > 0 ) {
+ jQuery.ajax({
+ url: url,
+
+ // if "type" variable is undefined, then "GET" method will be used
+ type: type,
+ dataType: "html",
+ data: params
+ }).done(function( responseText ) {
+
+ // Save response for use in complete callback
+ response = arguments;
+
+ self.html( selector ?
+
+ // If a selector was specified, locate the right elements in a dummy div
+ // Exclude scripts to avoid IE 'Permission Denied' errors
+ jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+ // Otherwise use the full result
+ responseText );
+
+ }).complete( callback && function( jqXHR, status ) {
+ self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+ });
+ }
+
+ return this;
+};
+
+
+
+
+jQuery.expr.filters.animated = function( elem ) {
+ return jQuery.grep(jQuery.timers, function( fn ) {
+ return elem === fn.elem;
+ }).length;
+};
+
+
+
+
+var docElem = window.document.documentElement;
+
+/**
+ * Gets a window from an element
+ */
+function getWindow( elem ) {
+ return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
+}
+
+jQuery.offset = {
+ setOffset: function( elem, options, i ) {
+ var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+ position = jQuery.css( elem, "position" ),
+ curElem = jQuery( elem ),
+ props = {};
+
+ // Set position first, in-case top/left are set even on static elem
+ if ( position === "static" ) {
+ elem.style.position = "relative";
+ }
+
+ curOffset = curElem.offset();
+ curCSSTop = jQuery.css( elem, "top" );
+ curCSSLeft = jQuery.css( elem, "left" );
+ calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+ ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
+
+ // Need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+ if ( calculatePosition ) {
+ curPosition = curElem.position();
+ curTop = curPosition.top;
+ curLeft = curPosition.left;
+
+ } else {
+ curTop = parseFloat( curCSSTop ) || 0;
+ curLeft = parseFloat( curCSSLeft ) || 0;
+ }
+
+ if ( jQuery.isFunction( options ) ) {
+ options = options.call( elem, i, curOffset );
+ }
+
+ if ( options.top != null ) {
+ props.top = ( options.top - curOffset.top ) + curTop;
+ }
+ if ( options.left != null ) {
+ props.left = ( options.left - curOffset.left ) + curLeft;
+ }
+
+ if ( "using" in options ) {
+ options.using.call( elem, props );
+
+ } else {
+ curElem.css( props );
+ }
+ }
+};
+
+jQuery.fn.extend({
+ offset: function( options ) {
+ if ( arguments.length ) {
+ return options === undefined ?
+ this :
+ this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ var docElem, win,
+ elem = this[ 0 ],
+ box = { top: 0, left: 0 },
+ doc = elem && elem.ownerDocument;
+
+ if ( !doc ) {
+ return;
+ }
+
+ docElem = doc.documentElement;
+
+ // Make sure it's not a disconnected DOM node
+ if ( !jQuery.contains( docElem, elem ) ) {
+ return box;
+ }
+
+ // If we don't have gBCR, just use 0,0 rather than error
+ // BlackBerry 5, iOS 3 (original iPhone)
+ if ( typeof elem.getBoundingClientRect !== strundefined ) {
+ box = elem.getBoundingClientRect();
+ }
+ win = getWindow( doc );
+ return {
+ top: box.top + win.pageYOffset - docElem.clientTop,
+ left: box.left + win.pageXOffset - docElem.clientLeft
+ };
+ },
+
+ position: function() {
+ if ( !this[ 0 ] ) {
+ return;
+ }
+
+ var offsetParent, offset,
+ elem = this[ 0 ],
+ parentOffset = { top: 0, left: 0 };
+
+ // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
+ if ( jQuery.css( elem, "position" ) === "fixed" ) {
+ // We assume that getBoundingClientRect is available when computed position is fixed
+ offset = elem.getBoundingClientRect();
+
+ } else {
+ // Get *real* offsetParent
+ offsetParent = this.offsetParent();
+
+ // Get correct offsets
+ offset = this.offset();
+ if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+ parentOffset = offsetParent.offset();
+ }
+
+ // Add offsetParent borders
+ parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+ parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+ }
+
+ // Subtract parent offsets and element margins
+ return {
+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+ };
+ },
+
+ offsetParent: function() {
+ return this.map(function() {
+ var offsetParent = this.offsetParent || docElem;
+
+ while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
+ offsetParent = offsetParent.offsetParent;
+ }
+
+ return offsetParent || docElem;
+ });
+ }
+});
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+ var top = "pageYOffset" === prop;
+
+ jQuery.fn[ method ] = function( val ) {
+ return access( this, function( elem, method, val ) {
+ var win = getWindow( elem );
+
+ if ( val === undefined ) {
+ return win ? win[ prop ] : elem[ method ];
+ }
+
+ if ( win ) {
+ win.scrollTo(
+ !top ? val : window.pageXOffset,
+ top ? val : window.pageYOffset
+ );
+
+ } else {
+ elem[ method ] = val;
+ }
+ }, method, val, arguments.length, null );
+ };
+});
+
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// getComputedStyle returns percent when specified for top/left/bottom/right
+// rather than make the css module depend on the offset module, we just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+ jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+ function( elem, computed ) {
+ if ( computed ) {
+ computed = curCSS( elem, prop );
+ // if curCSS returns percentage, fallback to offset
+ return rnumnonpx.test( computed ) ?
+ jQuery( elem ).position()[ prop ] + "px" :
+ computed;
+ }
+ }
+ );
+});
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+ jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+ // margin is only for outerHeight, outerWidth
+ jQuery.fn[ funcName ] = function( margin, value ) {
+ var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+ extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+ return access( this, function( elem, type, value ) {
+ var doc;
+
+ if ( jQuery.isWindow( elem ) ) {
+ // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+ // isn't a whole lot we can do. See pull request at this URL for discussion:
+ // https://github.com/jquery/jquery/pull/764
+ return elem.document.documentElement[ "client" + name ];
+ }
+
+ // Get document width or height
+ if ( elem.nodeType === 9 ) {
+ doc = elem.documentElement;
+
+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+ // whichever is greatest
+ return Math.max(
+ elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+ elem.body[ "offset" + name ], doc[ "offset" + name ],
+ doc[ "client" + name ]
+ );
+ }
+
+ return value === undefined ?
+ // Get width or height on the element, requesting but not forcing parseFloat
+ jQuery.css( elem, type, extra ) :
+
+ // Set width or height on the element
+ jQuery.style( elem, type, value, extra );
+ }, type, chainable ? margin : undefined, chainable, null );
+ };
+ });
+});
+
+
+// The number of elements contained in the matched element set
+jQuery.fn.size = function() {
+ return this.length;
+};
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+ define( "jquery", [], function() {
+ return jQuery;
+ });
+}
+
+
+
+
+var
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
+
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in
+// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( typeof noGlobal === strundefined ) {
+ window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+
+}));
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/jquery.easing.1.3.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/jquery.easing.1.3.js
new file mode 100644
index 0000000..ef74321
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/third_party/jquery.easing.1.3.js
@@ -0,0 +1,205 @@
+/*
+ * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
+ *
+ * Uses the built in easing capabilities added In jQuery 1.1
+ * to offer multiple easing options
+ *
+ * TERMS OF USE - jQuery Easing
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright © 2008 George McGinley Smith
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * Neither the name of the author nor the names of contributors may be used to endorse
+ * or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+*/
+
+// t: current time, b: begInnIng value, c: change In value, d: duration
+jQuery.easing['jswing'] = jQuery.easing['swing'];
+
+jQuery.extend( jQuery.easing,
+{
+ def: 'easeOutQuad',
+ swing: function (x, t, b, c, d) {
+ //alert(jQuery.easing.default);
+ return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
+ },
+ easeInQuad: function (x, t, b, c, d) {
+ return c*(t/=d)*t + b;
+ },
+ easeOutQuad: function (x, t, b, c, d) {
+ return -c *(t/=d)*(t-2) + b;
+ },
+ easeInOutQuad: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t + b;
+ return -c/2 * ((--t)*(t-2) - 1) + b;
+ },
+ easeInCubic: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t + b;
+ },
+ easeOutCubic: function (x, t, b, c, d) {
+ return c*((t=t/d-1)*t*t + 1) + b;
+ },
+ easeInOutCubic: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t + b;
+ return c/2*((t-=2)*t*t + 2) + b;
+ },
+ easeInQuart: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t*t + b;
+ },
+ easeOutQuart: function (x, t, b, c, d) {
+ return -c * ((t=t/d-1)*t*t*t - 1) + b;
+ },
+ easeInOutQuart: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
+ return -c/2 * ((t-=2)*t*t*t - 2) + b;
+ },
+ easeInQuint: function (x, t, b, c, d) {
+ return c*(t/=d)*t*t*t*t + b;
+ },
+ easeOutQuint: function (x, t, b, c, d) {
+ return c*((t=t/d-1)*t*t*t*t + 1) + b;
+ },
+ easeInOutQuint: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
+ return c/2*((t-=2)*t*t*t*t + 2) + b;
+ },
+ easeInSine: function (x, t, b, c, d) {
+ return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
+ },
+ easeOutSine: function (x, t, b, c, d) {
+ return c * Math.sin(t/d * (Math.PI/2)) + b;
+ },
+ easeInOutSine: function (x, t, b, c, d) {
+ return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
+ },
+ easeInExpo: function (x, t, b, c, d) {
+ return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;
+ },
+ easeOutExpo: function (x, t, b, c, d) {
+ return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;
+ },
+ easeInOutExpo: function (x, t, b, c, d) {
+ if (t==0) return b;
+ if (t==d) return b+c;
+ if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
+ return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
+ },
+ easeInCirc: function (x, t, b, c, d) {
+ return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
+ },
+ easeOutCirc: function (x, t, b, c, d) {
+ return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
+ },
+ easeInOutCirc: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
+ return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
+ },
+ easeInElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+ },
+ easeOutElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
+ },
+ easeInOutElastic: function (x, t, b, c, d) {
+ var s=1.70158;var p=0;var a=c;
+ if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);
+ if (a < Math.abs(c)) { a=c; var s=p/4; }
+ else var s = p/(2*Math.PI) * Math.asin (c/a);
+ if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
+ return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
+ },
+ easeInBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ return c*(t/=d)*t*((s+1)*t - s) + b;
+ },
+ easeOutBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
+ },
+ easeInOutBack: function (x, t, b, c, d, s) {
+ if (s == undefined) s = 1.70158;
+ if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
+ return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
+ },
+ easeInBounce: function (x, t, b, c, d) {
+ return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
+ },
+ easeOutBounce: function (x, t, b, c, d) {
+ if ((t/=d) < (1/2.75)) {
+ return c*(7.5625*t*t) + b;
+ } else if (t < (2/2.75)) {
+ return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
+ } else if (t < (2.5/2.75)) {
+ return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
+ } else {
+ return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
+ }
+ },
+ easeInOutBounce: function (x, t, b, c, d) {
+ if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
+ return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
+ }
+});
+
+/*
+ *
+ * TERMS OF USE - EASING EQUATIONS
+ *
+ * Open source under the BSD License.
+ *
+ * Copyright © 2001 Robert Penner
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * Neither the name of the author nor the names of contributors may be used to endorse
+ * or promote products derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */ \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/README b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/README
new file mode 100644
index 0000000..e442861
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/README
@@ -0,0 +1,21 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+All images in this directory are free, released under the GPLv3 or later. \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/librejs-off.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/librejs-off.png
new file mode 100644
index 0000000..abb7b95
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/librejs-off.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/librejs.png b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/librejs.png
new file mode 100644
index 0000000..ee6a59b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/images/librejs.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/widget.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/widget.js
new file mode 100644
index 0000000..5bbb77a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/data/widget/widget.js
@@ -0,0 +1,32 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+this.addEventListener('click', function(event) {
+ if(event.button === 0 && event.shiftKey === false) {
+
+ self.port.emit('left-click');
+
+ }
+
+ if(event.button == 2 || (event.button === 0 && event.shiftKey === true)){
+ self.port.emit('right-click');
+ }
+ event.preventDefault();
+}, true);
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/addon_management/install_uninstall.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/addon_management/install_uninstall.js
new file mode 100644
index 0000000..6a4999d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/addon_management/install_uninstall.js
@@ -0,0 +1,68 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * The following module is intended to perform tasks when the
+ * add-on is enabled and disabled.
+ */
+
+const {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+const httpObserver = require("http_observer/http_request_observer");
+
+const narcissusWorker = require("narcissus_parser/narcissus_worker");
+
+const caching = require("http_observer/caching");
+
+const prompt = Cc["@mozilla.org/embedcomp/prompt-service;1"].
+ getService(Ci.nsIPromptService);
+
+
+const tabs = require('sdk/tabs');
+
+/**
+ * Stop the httpObserver when the add-on
+ * is disabled or removed.
+ */
+exports.onUnload = function(reason) {
+
+ if (reason == "disable" ||
+ reason == "shutdown" ||
+ reason == "upgrade" ||
+ reason == "downgrade") {
+ require("settings/storage").librejsStorage.writeCacheToDB();
+ // remove all http notifications
+ httpObserver.removeHttpObserver();
+ // remove worker.
+ narcissusWorker.stopWorker();
+ }
+
+};
+
+exports.onLoad = function () {
+ try {
+ var clearCache = prompt.dialog(null, "LibreJS installation", "If you have tabs and windows opened prior to installing LibreJS, you will have to refresh them for their JavaScript to be analyzed and blocked. Press OK to clear the browser cache.");
+ if (clearCache) {
+ caching.clearAllCache();
+ }
+ } catch (e) {
+ console.debug(e);
+ }
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/addon_management/prefchange.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/addon_management/prefchange.js
new file mode 100644
index 0000000..532dd81
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/addon_management/prefchange.js
@@ -0,0 +1,118 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var whitelist = [];
+
+var prefSet = require("sdk/simple-prefs");
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+var prompt = Cc['@mozilla.org/embedcomp/prompt-service;1'].
+ getService(Ci.nsIPromptService);
+var scriptsCached = require("script_entries/scripts_cache").scriptsCached;
+
+var setWhitelist = function () {
+
+ whitelist = [];
+
+ var str;
+
+ var whitelistString = prefSet.prefs.whitelist.split(',');
+
+ for (var i = 0; i < whitelistString.length; i++) {
+
+ // remove space, trailing slash, escape any nonalpha except *, replace * with .*
+ str = whitelistString[i].replace(" ", "").replace(/\/$/, "").replace(/[^a-z0-9\*]/ig, "\\$&").replace("*", ".*");
+
+ if (str !== '') {
+ whitelist.push(new RegExp('^https?:\/\/(www\.)?' + str + '/', 'i'));
+ }
+
+ }
+
+};
+
+exports.getWhitelist = function () {
+ return whitelist;
+};
+
+exports.init = function () {
+ setWhitelist();
+};
+
+prefSet.on("whitelist", setWhitelist);
+
+var setDryRun = function () {
+ var dryRun = prefSet.prefs.dryrun;
+ if (dryRun === true) {
+ prompt.alert(null, "LibreJS Dry Run Mode", "Is Dry Run Mode really what you want? LibreJS will still analyze JavaScript on a page, but it will not block any of it. As a result, ALL of the JavaScript on a page will run as is, whether it is free and trivial or not. You will not be warned again. Uncheck that box if you are unsure.");
+ scriptsCached.resetCache();
+ } else {
+ prompt.alert(null, "LibreJS Dry Run Mode", "LibreJS Dry Run Mode is now disabled");
+ }
+};
+
+//prefSet.on("dryrun", setDryRun);
+
+exports.isDryRun = function () {
+ /**
+ * Returns true if dryRun mode is enabled. False otherwise.
+ */
+ //return prefSet.prefs.dryrun;
+ return false;
+};
+
+
+
+var setComplaintTab = function () {
+ var complaintTab = prefSet.prefs.complaint_tab;
+ if (complaintTab === true) {
+ prompt.alert(null, "Turning on complaint tab", "A complaint tab will be displayed on pages where nonfree nontrivial JavaScript is found and contact information is found as well.");
+ } else {
+ prompt.alert(null, "Turning off complaint tab", "No complaint tab will appear on pages, even when nonfree nontrivial JavaScript is found.");
+ }
+};
+prefSet.on("complaint_tab", setComplaintTab);
+
+exports.isComplaintTab = function () {
+ /**
+ * Returns true if complaint tab mode is enabled. False otherwise.
+ */
+ return prefSet.prefs.complaint_tab;
+};
+
+
+
+var setDisplayNotifications = function () {
+ var displayNotifications = prefSet.prefs.display_notifications;
+ if (displayNotifications === true) {
+ prompt.alert(null, "Turning on notifications", "Notifications with code snippets will now appear while LibreJS is analyzing JavaScript on a page.");
+ } else {
+ prompt.alert(null, "Turning off notifications", "Notifications of code being analyzed will not be displayed.");
+ }
+};
+
+prefSet.on("display_notifications", setDisplayNotifications);
+
+exports.isDisplayNotifications = function () {
+ /**
+ * Returns true if complaint tab mode is enabled. False otherwise.
+ */
+ return prefSet.prefs.display_notifications;
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/bug_fix.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/bug_fix.js
new file mode 100644
index 0000000..bba7653
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/bug_fix.js
@@ -0,0 +1,23 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+exports.END_OF_SCRIPT = 'this.narcissusBugFixLibreJS'; // value from parse tree without \n\n
+exports.narcissusBugFixLibreJS = '\n\n' + exports.END_OF_SCRIPT; // real value from source.
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler.js
new file mode 100644
index 0000000..db0c46c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler.js
@@ -0,0 +1,560 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ *
+ * dom_handler.js
+ *
+ * After the HTML DOM has been parsed, domHandler finds all the scripts
+ * on a page (including inline, on-page, and external files), and triggers the
+ * JavaScript analysis for each of them.
+ *
+ */
+
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+var scriptProperties = require("html_script_finder/dom_handler/script_properties");
+
+const scriptTypes = scriptProperties.scriptTypes;
+
+const statusTypes = scriptProperties.statusTypes;
+
+const reasons = scriptProperties.reasons;
+
+var urlHandler = require("url_handler/url_handler");
+
+var WebLabelFinder = require("html_script_finder/web_labels/js_web_labels").WebLabelFinder;
+
+// object model for script entries.
+var scriptObject = require("html_script_finder/dom_handler/script_object");
+
+var privacyChecker = require("js_checker/privacy_checker").privacyCheck;
+var jsChecker = require("js_checker/js_checker");
+
+const types = require("js_checker/constant_types");
+
+var checkTypes = types.checkTypes;
+
+var stripCDATAOpen = /<\!\[CDATA\[/gi;
+var stripCDATAClose = /]]>/g;
+
+var isDryRun = require("addon_management/prefchange").isDryRun;
+var allowedRef = require('http_observer/allowed_referrers').allowedReferrers;
+
+var attributeHelpers = require("html_script_finder/dom_handler/attributes");
+
+// javascript:*
+var jsInAttrRe = attributeHelpers.jsInAttrRe;
+
+// the list of all available event attributes
+var intrinsecEvents = attributeHelpers.intrinsecEvents;
+
+var domGatherer = require("html_script_finder/dom_handler/dom_gatherer").domGatherer;
+
+var domChecker = require("html_script_finder/dom_handler/dom_checker").domChecker;
+
+/**
+ * The DomHandler object takes a whole document,
+ * finds script elements within that DOM, analyzes them
+ * using the js_checker module and finally returns a cleaned
+ * DOM depending on the result.
+ */
+var DomHandler = function() {
+ // external object with methods used
+ // in DomHandler
+ this.domGatherer = null;
+
+ // external object with methods used
+ // in DomHandler
+ this.domChecker = null;
+
+ this.dom = null;
+ this.pageURL = null;
+
+ // fragment found in url.
+ this.fragment = null;
+
+ // array containing all scripts on a page.
+ this.domScripts = null;
+
+ // array containing all scripts on a page,
+ // data related to them, such as parse tree, ...
+ this.inlineScripts = null;
+
+ this.externalScripts = null;
+
+ // all scripts.
+ this.scripts = null;
+
+ // keeps track of the number of scripts.
+ this.numScripts = 0;
+
+ // store the reference to the callback method
+ // presumably from htmlParser.
+ this.callback = null;
+
+ // boolean set to true if external scripts are loaded
+ // from the html page.
+ this.loadsHtmlExternalScripts = false;
+
+ this.jsCheckString = null;
+
+ /* object containing boolean property set to false if trivialness
+ is not allowed anymore (if another script defines ajax requests,
+ ...) */
+ this.allowTrivial = null;
+
+ // boolean set to true if inline JavaScript
+ // is found to be free.
+ this.inlineJsFree = null;
+
+ // boolean set to true when at least one script
+ // has been removed.
+ this.hasRemovedScripts = null;
+
+ // boolean to check if scripts were removed
+ // prevents removeAllJs from running multiple times.
+ this.removedAllScripts = null;
+
+ // will eventually contain an array of data
+ // for the js web labels licenses.
+ this.licenseList = null;
+
+ // the response status for the page (200, 404, ...)
+ this.responseStatus = null;
+
+ // count the number of scripts fully tested.
+ this.scriptsTested = null;
+
+ // number of external scripts to be tested.
+ this.numExternalScripts = null;
+
+ // number of inline/inattribute scripts
+ this.numInlineScripts = null;
+};
+
+/**
+ * Initialize properties of the object
+ *
+ * @param {domObject} obj A reference of the DOM object being
+ * analyzed.
+ *
+ * @param {pageURL} string The formatted URL (with fragment
+ * removed) of the corresponding page for this DOM
+ *
+ * @param {fragment} the #fragment from the url if applicable.
+ *
+ * @param {callback} the callback function.
+ *
+ */
+DomHandler.prototype.init = function(
+ domObject, pageURL, fragment, responseStatus, callback) {
+ // initialize object properties.
+
+ console.debug('init', pageURL);
+ var that = this;
+
+ this.reset();
+
+ // arguments passed.
+ this.dom = domObject;
+ this.pageURL = pageURL;
+ this.fragment = fragment;
+ this.responseStatus = responseStatus;
+
+ console.debug('in dom handler, responseStatus is', this.responseStatus);
+
+ // make callback function available
+ // for the entire object.
+ this.callback = function (dom) {
+ callback(dom);
+ that.destroy();
+ };
+};
+
+DomHandler.prototype.reset = function () {
+
+ this.dom = null;
+ // arrays.
+ this.onEventElement = [];
+ this.scriptStatus = [];
+ this.inlineScripts = [];
+ this.externalScripts = [];
+ this.scripts = [];
+
+ // booleans
+ this.allowTrivial = true;
+ this.inlineJsFree = false;
+ this.hasRemovedScripts = false;
+ this.removedAllScripts = false;
+
+ // we start with 0, and will increment in
+ // dom_checker.
+ this.numExternalScripts = 0;
+
+ this.numInlineScripts = 0;
+
+ this.scriptsTested = 0;
+
+};
+
+DomHandler.prototype.destroy = function () {
+ this.domGatherer = null;
+ this.domChecker = null;
+ /* destroy callback so that it can't be called multiple times. */
+ this.callback = function() {};
+ //this.reset();
+};
+
+DomHandler.prototype.scriptHasBeenTested = function () {
+ this.scriptsTested++;
+};
+
+/**
+ * scriptHasJsWebLabel
+ *
+ * Checks if a script was found earlier in a Js License Web Label
+ * table. See http://www.gnu.org/licenses/javascript-labels.html
+ * for more information.
+ *
+ */
+DomHandler.prototype.scriptHasJsWebLabel = function (script) {
+ if (this.licenseList) {
+
+ var url = urlHandler.resolve(this.pageURL, script.src),
+ i = 0,
+ len = this.licenseList.length;
+
+ console.debug('looking for web label');
+
+ for (; i < len; i++) {
+ if (this.licenseList[i].fileUrl === url &&
+ this.licenseList[i].free === true) {
+ console.debug('found something true');
+ console.debug(this.licenseList[i].fileUrl, ' is found');
+ return true;
+ }
+ }
+ }
+ return false;
+};
+
+/**
+ * processScripts.
+ * Starts by looking for a js web labels page
+ * then calls the complete function, which runs
+ * the rest of the check.
+ */
+DomHandler.prototype.processScripts = function () {
+ var that = this;
+
+ // check for the existence of the
+ // js web labels first.
+ this.lookForJsWebLabels(function () {
+
+ // gather and check all script elements on
+ // page.
+ console.debug("Calling checkAllScripts");
+ that.checkAllScripts();
+
+ });
+
+};
+
+/**
+ * jsWebLabelsComplete
+ *
+ */
+DomHandler.prototype.checkAllScripts = function () {
+ try {
+ console.debug('found in', this.pageURL, JSON.stringify(this.licenseList));
+ console.debug('checkAllScripts triggered async');
+
+ // use domGatherer to gather scripts.
+ this.domGatherer.findScripts();
+ this.domGatherer.gatherScriptsContent();
+ this.domGatherer.gatherIntrinsecEvents();
+
+ console.debug('fragment is', this.fragment);
+
+ if (
+ (this.fragment === undefined ||
+ this.fragment === null ||
+ this.fragment.indexOf('librejs=true') < 0) &&
+ this.responseStatus != 404
+ ) {
+ try {
+
+ // use domChecker to check scripts.
+ console.debug("Calling checkAllInlineScripts");
+ this.domChecker.checkAllInlineScripts();
+ } catch (x) {
+ console.debug('error in domChecker:', x, x.lineNumber);
+ this.removeAllJs();
+ }
+ } else {
+ console.debug('404 or pageworker, removing all js');
+ // this is the page Worker to find contact link
+ // just remove all the JS since we don't need it.
+ console.debug('fragment found, remove js');
+ this.removeAllJs();
+ }
+ } catch (x) {
+ console.debug('error', x, x.lineNumber, x.fileName);
+ }
+};
+
+/**
+ * lookForJsWebLabels
+ *
+ * Checks if a link to a js web label table exists.
+ * If it does, return an array of objects with the data
+ * gathered (script name, path, license name, url, ...)
+ *
+ */
+DomHandler.prototype.lookForJsWebLabels = function (completed) {
+ var that = this;
+ console.debug("calling lookForJsWebLabels");
+ if (this.fragment != '#librejs=true') {
+ var webLabelFinder = new WebLabelFinder();
+ webLabelFinder.init(
+ this.dom,
+ this.pageURL,
+ function (licenseList) {
+ // assign array returned to property.
+ that.licenseList = licenseList;
+ console.debug("calling completed");
+ completed();
+ });
+ } else {
+ completed();
+ }
+};
+
+DomHandler.prototype.checkScriptForJsWebLabels = function (script) {
+ var scriptEntry;
+
+ if (this.hasSrc(script) && this.scriptHasJsWebLabel(script)) {
+
+ // in the list of allowed scripts (through web labels)
+ scriptEntry = scriptObject.Script({'type': scriptTypes.EXTERNAL,
+ 'status': statusTypes.ACCEPTED,
+ 'element':script,
+ 'url': urlHandler.resolve(this.pageURL, script.src)});
+
+ scriptEntry.tagAsAccepted(this.pageURL, reasons.FREE);
+
+ return true;
+ }
+};
+
+
+/**
+ * hasSrc
+ * Check the given script has an src attribute.
+ * @param script obj The script element.
+ * @return a string with the value of the src attribute.
+ */
+DomHandler.prototype.hasSrc = function(script) {
+ if (script.src) {
+ return script.src;
+ }
+ return false;
+};
+
+/**
+ * Uses relationChecker to guess whether the script only uses
+ * predefined functions/variables or interacts with other scripts
+ * (this is still very experimental and needs improvement.)
+ *
+ */
+DomHandler.prototype.removeScriptIfDependent = function (script) {
+
+ var nonWindowProps = script.tree.relationChecker.nonWindowProperties;
+
+ for (var entry in nonWindowProps) {
+ if (nonWindowProps[entry]) {
+ console.debug('script has non window properties.');
+ this.removeGivenJs(script, reasons.TRIVIAL_NOT_ALLOWED);
+ return true;
+ }
+ }
+
+};
+
+/**
+ * removeGivenJs
+ * Remove a single script from the DOM.
+ * @param script Obj The script element to be removed from the
+ * DOM.
+ *
+ */
+DomHandler.prototype.removeGivenJs = function (script, reason, singleton, hash) {
+ var commentedOut;
+ var isAllowed = allowedRef.urlInAllowedReferrers(this.pageURL);
+ console.debug("removing given js hash", hash);
+
+ if (script.status != statusTypes.REJECTED &&
+ script.status != statusTypes.JSWEBLABEL
+ ) {
+ console.debug('removing a', script.type);
+ if (script.type === scriptTypes.ATTRIBUTE &&
+ !isAllowed
+ ) {
+ this.removeGivenAttribute(script, reason);
+ return;
+ }
+ if (!isAllowed) {
+ // set invalid type if dry run off.
+ script.element.setAttribute('type', 'librejs/blocked');
+ // add entry as removed.
+ console.debug('removeGivenJs hash is', hash);
+ script.tagAsRemoved(this.pageURL, reason, hash);
+ } else {
+ script.element.setAttribute('data-librejs-dryrun', 'librejs/blocked');
+ script.tagAsDryRun(this.pageURL, reason, hash);
+ }
+
+ if (singleton === true) {
+ // flag singletons.
+ script.element.setAttribute('data-singleton', 'true');
+ }
+
+ // remove src if dry run off.
+ if (script.element.getAttribute('src') !== undefined) {
+ script.element.setAttribute('data-librejs-blocked-src', script.element.getAttribute('src'));
+ if (!isAllowed) {
+ script.element.removeAttribute('src');
+ }
+ }
+ if (isAllowed) {
+ comment_str = 'LibreJS: Script should be blocked, but page is whitelisted.';
+ script.status = statusTypes.ACCEPTED;
+ } else {
+ comment_str = 'LibreJS: script blocked.';
+ script.status = statusTypes.REJECTED;
+ }
+
+ commentedOut = this.dom.createComment(comment_str);
+ // add a comment for curious source readers.
+ script.element.parentNode.appendChild(commentedOut);
+ script.element.parentNode.insertBefore(commentedOut, script.element);
+ this.hasRemovedScripts = true;
+ }
+};
+
+DomHandler.prototype.removeGivenAttribute = function (script, reason) {
+ var i = 0,
+ le = script.jsAttributes.length;
+
+ console.debug('removing given attribute', script, reason);
+ script.element.setAttribute('data-librejs-blocked-event',
+ JSON.stringify(script.jsAttributes));
+
+ script.tagAsRemoved(this.pageURL, reason, script.hash || script.tree.hash);
+
+ // might need to be removed.
+ script.element.setAttribute('data-librejs-blocked-value', '');
+
+ if (!allowedRef.urlInAllowedReferrers(this.pageURL)) {
+ // only run if not in dry run mode.
+ for (; i < le; i++) {
+ console.debug('removing attribute', JSON.stringify(script.jsAttributes));
+ script.element.removeAttribute(script.jsAttributes[i].attribute);
+ }
+ } else {
+
+ }
+ this.hasRemovedScripts = true;
+};
+
+/**
+ * removeAllJs
+ * Loop through all scripts from top to bottom and add a type
+ * attribute 'librejs/blocked' to prevent their interpretation
+ * by the browser.
+ *
+ */
+DomHandler.prototype.removeAllJs = function (reason) {
+ // remove all js is useless from now on.
+ console.debug('removeAllJs');
+ this.hasRemovedScripts = true;
+
+ // removeAllJs needs not be run next time.
+ this.removedAllScripts = true;
+
+ try {
+ this.removeAllArray(this.scripts, reason);
+ this.callback(this.dom);
+ } catch (x) {
+ console.debug('in removeAllJs method: ', x, 'number of scripts is', this.numScripts);
+ this.callback(this.dom);
+ }
+
+};
+
+DomHandler.prototype.removeAllArray = function(scriptArray, reason) {
+ var script, i = 0, le;
+ console.debug('removeAllArray');
+ try {
+ le = scriptArray.length;
+ // loop through all scripts.
+
+ for (; i < le; i++) {
+ script = scriptArray[i];
+ if (script.type === scriptTypes.INLINE ||
+ script.type === scriptTypes.EXTERNAL) {
+ this.removeGivenJs(script, reason);
+ }
+ else if (script.type === scriptTypes.ATTRIBUTE) {
+ this.removeGivenAttribute(script, reason);
+ }
+ }
+ } catch (e) {
+ this.callback("");
+ }
+
+};
+
+exports.DomHandler = DomHandler;
+
+/**
+ * exports.domHandler
+ * Instantiates a DomHandler and checks the DOM
+ * @param dom obj The given dom for analysis.
+ * @param pageURL string the URL for the page.
+ * @param callback function callback when all the work has been performed.
+ */
+exports.domHandler = function(
+ dom, pageURL, fragment, responseStatus, callback) {
+ console.debug("Creating domHandler");
+ var domHandler = new DomHandler();
+ domHandler.init(dom, pageURL, fragment, responseStatus, callback);
+
+ // use domGatherer methods.
+ domHandler.domGatherer = domGatherer(domHandler);
+
+ // use domChecker methods.
+ domHandler.domChecker = domChecker(domHandler);
+
+ // launch the whole process.
+ console.debug("Calling processScripts");
+ domHandler.processScripts();
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/attributes.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/attributes.js
new file mode 100644
index 0000000..6e9ace4
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/attributes.js
@@ -0,0 +1,137 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+// object model for script entries.
+var scriptObject = require("html_script_finder/dom_handler/script_object");
+
+var scriptProperties = require("html_script_finder/dom_handler/script_properties");
+
+const scriptTypes = scriptProperties.scriptTypes;
+
+const statusTypes = scriptProperties.statusTypes;
+
+var jsInAttrRe = /javascript:/ig;
+
+// the list of all available event attributes
+var intrinsecEvents = [
+ "onload",
+ "onunload",
+ "onclick",
+ "ondblclick",
+ "onmousedown",
+ "onmouseup",
+ "onmouseover",
+ "onmousemove",
+ "onmouseout",
+ "onfocus",
+ "onblur",
+ "onkeypress",
+ "onkeydown",
+ "onkeyup",
+ "onsubmit",
+ "onreset",
+ "onselect",
+ "onchange"];
+
+exports.jsInAttrRe = jsInAttrRe;
+exports.intrinsecEvents = intrinsecEvents;
+
+
+/**
+ * findJSinAttribute
+ *
+ * Looks for attributes containing 'javascript:'
+ *
+ */
+exports.findJSinAttribute = function (elem, callback) {
+ var i = 0, attrLen = elem.attributes.length;
+
+ var attribPairs = [];
+
+ for (; i < attrLen; i++) {
+
+ //looping through all attributes in elem to look for "javascript:"
+ attrib = elem.attributes[i];
+
+ if (attrib.value.match(jsInAttrRe)) {
+ str = attrib.value.replace(jsInAttrRe, '');
+ attribPairs.push({attribute: attrib.name, value: str});
+ }
+
+ }
+
+ if (attribPairs.length > 0) {
+ // contains in attribute javascript.
+ scriptEntry = scriptObject.Script({'type': scriptTypes.ATTRIBUTE,
+ 'status': statusTypes.UNCHECKED,
+ 'element': elem,
+ 'jsAttributes': attribPairs
+ });
+
+ // push back to DOMHandler
+ callback(scriptEntry);
+
+ } else {
+ callback(false);
+ }
+
+};
+
+/**
+ * findOnJSAttribute.
+ *
+ * Look for attributes in on*
+ *
+ */
+exports.findOnJSAttribute = function (elem, callback) {
+
+ var i = 0, eventsLen = intrinsecEvents.length;
+
+ var attribPairs = [];
+
+ for (; i < eventsLen; i++) {
+
+ // looping through all on* attributes
+ if (elem.hasAttribute(intrinsecEvents[i])) {
+
+ attribPairs.push({
+ attribute: intrinsecEvents[i],
+ value: elem.getAttribute(intrinsecEvents[i])
+ });
+
+ }
+
+ }
+ if (attribPairs.length > 0) {
+
+ console.debug('found an attribute', scriptTypes.ATTRIBUTE);
+ scriptEntry = scriptObject.Script({'type': scriptTypes.ATTRIBUTE,
+ 'status': statusTypes.UNCHECKED,
+ 'element':elem,
+ 'jsAttributes': attribPairs
+ });
+ // Push back to DOMHandler.
+ // push back to DOMHandler
+ callback(scriptEntry);
+
+ } else {
+ callback(false);
+ }
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/dom_checker.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/dom_checker.js
new file mode 100644
index 0000000..76cbc3e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/dom_checker.js
@@ -0,0 +1,464 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * dom_checker.js
+ *
+ * checks scripts for nonfree/nontrivial.
+ *
+ */
+
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+var scriptProperties = require("html_script_finder/dom_handler/script_properties");
+
+const scriptTypes = scriptProperties.scriptTypes;
+
+const statusTypes = scriptProperties.statusTypes;
+
+const reasons = scriptProperties.reasons;
+
+// ensure xhr won't create an infinite loop
+// with html content.
+var urlTester = require("html_script_finder/url_seen_tester").urlSeenTester;
+var urlHandler = require("url_handler/url_handler");
+
+
+var privacyChecker = require("js_checker/privacy_checker").privacyCheck;
+var jsChecker = require("js_checker/js_checker");
+
+const types = require("js_checker/constant_types");
+
+var checkTypes = types.checkTypes;
+
+var stripCDATAOpen = /<\!\[CDATA\[/gi;
+var stripCDATAClose = /]]>/g;
+
+var timer = require("sdk/timers");
+
+const getHash = require("script_entries/scripts_cache").scriptsCached.getHash;
+
+var DomChecker = function() {
+ // reference to domHandler instance
+ // using this object.
+ this.d = null;
+};
+
+/**
+ * init
+ *
+ * assign a reference domHandler object
+ * to access/updates its properties.
+ *
+ */
+DomChecker.prototype.init = function(domHandler) {
+ "use strict";
+
+ this.d = domHandler;
+};
+
+DomChecker.prototype.destroy = function() {
+ "use strict";
+
+ this.d = null;
+};
+
+/**
+ * checkAllInlineScripts
+ *
+ * Sends all the inline/onpage scripts as a whole for a check and
+ * removes all scripts if nonfree nontrivial is found.
+ *
+ */
+DomChecker.prototype.checkAllInlineScripts = function() {
+ "use strict";
+
+ try {
+ var i = 0, len, script;
+
+ if (typeof this.d.inlineScripts !== 'undefined' &&
+ this.d.inlineScripts.length > 0
+ ) {
+ script = this.d.inlineScripts.shift();
+ console.debug("checking script for page",
+ this.d.pageURL
+ /*, JSON.stringify(script)*/);
+ if (this.d.removedAllScripts) {
+ // all js has already been removed.
+ // stop check.
+ console.debug("removed all");
+ return;
+ }
+
+ if (this.d.inlineJsFree === true) {
+ // add entry as accepted.
+ try {
+ hash = getHash(script.text);
+ script.tagAsAccepted(this.d.pageURL, reasons.FREE, hash);
+ } catch (e) {
+ console.debug(e);
+ }
+ }
+
+ // even if page is free we need to check for allow trivial.
+ if (script.type === scriptTypes.INLINE) {
+ console.debug("analyzing script", script);
+ this.analyzeJs(script,
+ script.text,
+ this.checkSingleInlineScript.bind(this));
+ } else if (script.type === scriptTypes.ATTRIBUTE) {
+ console.debug("analyzing inline script", script);
+ this.analyzeJs(script,
+ this.concatAttributes(script),
+ this.checkSingleElementAttributes.bind(this));
+ }
+ } else {
+ // no more inline scripts. Switch to external scripts.
+ this.readyForExternal();
+ }
+ } catch (x) {
+ console.debug('checkAllInlineScripts error',
+ x, x.lineNumber, x.fileName);
+ this.readyForExternal();
+ }
+};
+
+DomChecker.prototype.concatAttributes = function(script) {
+ "use strict";
+ var i = 0,
+ le = script.jsAttributes.length,
+ text = "";
+
+ // we concatenate all js in multiple attributes.
+ // because it's too much of a hassle to keep track
+ // otherwise.
+ for (; i < le; i++) {
+ text += script.jsAttributes[i].value + '\n';
+ }
+
+ return text;
+
+};
+
+/**
+ *
+ * check a single element with attributes
+ */
+DomChecker.prototype.checkSingleElementAttributes = function(
+ script, loadedScript, checker) {
+ "use strict";
+ var check, value,
+ i = 0,
+ le = script.jsAttributes.length,
+ text = "";
+
+ try {
+ check = checker.parseTree.freeTrivialCheck;
+ script.tree = checker;
+ script.result = check;
+ script.status = statusTypes.CHECKED;
+ } catch (e) {
+ console.debug('problem checking inline scripts', e, e.lineNumber);
+ this.d.removeGivenJs(script);
+ }
+
+ this.processInlineCheckResult(script, check, checker);
+};
+
+DomChecker.prototype.processInlineCheckResult = function(
+ script, check, checker) {
+ "use strict";
+ console.debug("check.reason is", check.reason, "and type", check.type);
+ var hash = checker.hash;
+
+ if (this.d.inlineJsFree === true) {
+ console.debug('tagging', script.text, 'as accepted', "with reason", check.reason);
+ script.tagAsAccepted(this.d.pageURL, this.d.freeReason + " -- " + check.reason, hash);
+ }
+
+ // process the result.
+ if (check.type === checkTypes.FREE) {
+ // this is free.
+ console.debug('tagging', script.text, 'as accepted with reason', check.reason);
+ this.d.inlineJsFree = true;
+ this.d.freeReason = check.reason;
+ // add entry as accepted.
+ script.tagAsAccepted(this.d.pageURL, check.reason, hash);
+ } else if (check.type === checkTypes.FREE_SINGLE_ITEM) {
+ // accept this script.
+ console.debug("free single item, ", check.reason);
+ script.tagAsAccepted(this.d.pageURL, check.reason, hash);
+ } else if (check.type === checkTypes.NONTRIVIAL) {
+ console.debug("nontrivial hash is", hash);
+ if (this.d.inlineJsFree) {
+ // inline is free. So accept.
+ console.debug('tagging', script.text, 'as accepted');
+ script.tagAsAccepted(
+ this.d.pageURL,
+ this.d.freeReason + ' -- ' + check.reason,
+ hash);
+ } else {
+ console.debug('tagging', script.text, 'as removed');
+ this.d.removeGivenJs(script, check.reason, false, hash);
+ }
+ } else if (!this.d.inlineJsFree &&
+ this.d.loadsHtmlExternalScripts &&
+ check.type === checkTypes.TRIVIAL_DEFINES_FUNCTION
+ ) {
+ // nontrivial, because defines function and loads
+ // external scripts
+ console.debug('tagging', script.text, 'as removed');
+ this.d.removeGivenJs(script, reasons.FUNCTIONS_INLINE, false, hash);
+ } else if (!this.d.loadsHtmlExternalScripts &&
+ check === checkTypes.TRIVIAL_DEFINES_FUNCTION
+ ) {
+ console.debug("Tag as accepted doesn't load another external script");
+ script.tagAsAccepted(this.d.pageURL, check.reason, hash);
+ } else if (check.type === checkTypes.TRIVIAL ||
+ check.type === checkTypes.TRIVIAL_DEFINES_FUNCTION ||
+ check.type === checkTypes.WHITELISTED
+ ) {
+ // add entry as accepted.
+ console.debug("Trivial accepted");
+ script.tagAsAccepted(this.d.pageURL, check.reason, hash);
+ }
+
+ // next inline script, if applicable.
+ this.checkAllInlineScripts();
+};
+
+DomChecker.prototype.readyForExternal = function() {
+ "use strict";
+
+ // done with those inline scripts, continue with
+ // the rest.
+ this.checkExternalScripts();
+};
+
+/**
+ * check a single inline script.
+ */
+DomChecker.prototype.checkSingleInlineScript = function(
+ script, loadedScript, checker) {
+ "use strict";
+ var check, text;
+
+ try {
+
+ check = checker.parseTree.freeTrivialCheck;
+
+ // update status.
+ script.tree = checker;
+ script.result = check;
+ console.debug("script result is", check.type);
+ script.status = statusTypes.CHECKED;
+
+ } catch (e) {
+ console.debug('problem checking inline scripts', e, e.lineNumber);
+ this.d.removeGivenJs(script, '', false, checker.hash);
+ }
+
+ this.processInlineCheckResult(script, check, checker);
+
+};
+
+/**
+ * checkExternalScripts
+ * Loop through series of external scripts,
+ * perform xhr to get their data, and check them
+ * to see whether they are free/nontrivial
+ *
+ */
+DomChecker.prototype.checkExternalScripts = function() {
+ "use strict";
+ var i = 0,
+ len = this.d.externalScripts.length,
+ that = this;
+ console.debug("externalScripts length", this.d.externalScripts.length);
+ if (this.d.removedAllScripts ||
+ this.d.externalScripts.length === 0) {
+ // all js has already been removed.
+ // stop check.
+ this.wrapUpBeforeLeaving();
+ return;
+
+ }
+
+ for (; i < len; i++) {
+
+ this.xhr(this.d.externalScripts[i],
+
+ function(script, scriptText) {
+ console.debug("doing xhr", script.url);
+ if (scriptText === false) {
+ that.d.removeGivenJs(script);
+ that.d.scriptHasBeenTested();
+ that.externalCheckIsDone();
+ return;
+ }
+
+ that.analyzeJs(script,
+ scriptText,
+ that.checkSingleExternalScript.bind(that));
+ });
+ }
+};
+
+DomChecker.prototype.wrapUpBeforeLeaving = function() {
+ "use strict";
+
+ console.debug("wrap up before leaving triggered");
+ console.debug('wrapping up');
+ this.d.callback(this.d.dom);
+
+};
+
+DomChecker.prototype.analyzeJs = function(script, scriptText, callback) {
+ "use strict";
+ try {
+ console.debug("checking ", script.url);
+ var checker = jsChecker.jsChecker();
+ var url = "";
+ if (typeof script.url !== "undefined") {
+ url = script.url;
+ } else {
+ url = this.pageURL;
+ }
+ checker.searchJs(scriptText, function() {
+ console.debug("Analyze JS"/*, JSON.stringify(checker)*/);
+ timer.setTimeout(function() {
+ callback(script, scriptText, checker);
+ }, 0);
+ }, url);
+ } catch (x) {
+ console.debug('error', x, x.lineNumber, x.fileName);
+ }
+};
+
+/**
+ * Check a single external script.
+ */
+DomChecker.prototype.checkSingleExternalScript = function(
+ script, loadedScript, checker) {
+ "use strict";
+ var check;
+
+ try {
+
+ check = checker.parseTree.freeTrivialCheck;
+
+ script.tree = checker;
+ script.result = check;
+ console.debug('in checkSingleExternalScript, checker.hash is', checker.hash);
+ if (script.status != statusTypes.JSWEBLABEL) {
+ script.status = statusTypes.CHECKED;
+ }
+
+ if (check.type === checkTypes.FREE ||
+ check.type === checkTypes.FREE_SINGLE_ITEM
+ ) {
+ // add entry as accepted.
+ script.tagAsAccepted(this.d.pageURL, check.reason, checker.hash);
+ }
+
+ else if (check.type === checkTypes.NONTRIVIAL) {
+ console.debug("Removing given js", check.reason);
+ this.d.removeGivenJs(script, check.reason, false, checker.hash);
+ }
+
+ else if (check.type === checkTypes.TRIVIAL ||
+ check.type === checkTypes.WHITELISTED
+ ) {
+ // if it's accepted, allow.
+ script.tagAsAccepted(this.d.pageURL, check.reason, checker.hash);
+ } else {
+ // anything else is nontrivial. Including TRIVIAL_DEFINES_FUNCTION.
+ console.debug("checker hash for remove is ", checker.hash);
+ this.d.removeGivenJs(script, reasons.FUNCTIONS_EXTERNAL, false, checker.hash);
+ }
+
+ } catch (e) {
+ console.debug('error in checkExternalScript',
+ e, e.lineNumber, 'for script', script.url);
+
+ this.d.removeAllJs();
+ this.destroy();
+ return;
+ }
+ console.debug('script url is', script.url, 'result is', script.result);
+ this.d.scriptHasBeenTested();
+ this.externalCheckIsDone();
+};
+
+DomChecker.prototype.externalCheckIsDone = function() {
+ "use strict";
+
+ console.debug('scriptsTested is', this.d.scriptsTested);
+ console.debug('num external', this.d.numExternalScripts);
+
+ if (this.d.scriptsTested >= this.d.numExternalScripts) {
+ console.debug('wrapping up external');
+ this.wrapUpBeforeLeaving();
+ }
+};
+
+/**
+ * xhr
+ * Perform a XMLHttpRequest on the url given.
+ * @param url string A URL.
+ * @return The response text.
+ */
+DomChecker.prototype.xhr = function(script, responseCallback) {
+ "use strict";
+
+ var regex = /^text\/html/i;
+ var url = script.url;
+
+ try {
+ // add url to whitelist.
+ urlTester.addUrl(url);
+
+ // request module. Compatible with Https-Everywhere.
+ require('html_script_finder/dom_handler/request')
+ .request(script, responseCallback).request();
+ } catch (x) {
+ console.debug('error', x, x.lineNumber, x.fileName);
+ responseCallback(script, false);
+ }
+};
+
+/**
+ * exports.domChecker
+ * Instantiate a brand new clone of the domChecker.
+ * @param dom obj The given dom for analysis.
+ * @param pageURL string the URL for the page.
+ * @param callback function callback when all the work has been performed.
+ */
+exports.domChecker = function(domHandler) {
+ "use strict";
+
+ var domChecker = new DomChecker();
+
+ domChecker.init(domHandler);
+
+ return domChecker;
+};
+
+exports.xhr = new DomChecker().xhr;
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/dom_gatherer.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/dom_gatherer.js
new file mode 100644
index 0000000..5451f53
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/dom_gatherer.js
@@ -0,0 +1,301 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+var scriptProperties = require("html_script_finder/dom_handler/script_properties");
+
+const scriptTypes = scriptProperties.scriptTypes;
+const scriptsCached = require("script_entries/scripts_cache").scriptsCached;
+
+const statusTypes = scriptProperties.statusTypes;
+// object model for script entries.
+var scriptObject = require("html_script_finder/dom_handler/script_object");
+
+var urlHandler = require("url_handler/url_handler");
+
+var attributeHelpers = require("html_script_finder/dom_handler/attributes");
+
+// javascript:*
+var jsInAttrRe = attributeHelpers.jsInAttrRe;
+
+// the list of all available event attributes
+var intrinsecEvents = attributeHelpers.intrinsecEvents;
+
+var privacyChecker = require("js_checker/privacy_checker").privacyCheck;
+
+const types = require("js_checker/constant_types");
+
+var checkTypes = types.checkTypes;
+
+
+// array reflex valid types as listed in
+// http://mxr.mozilla.org/mozilla-central/source/content/base/src/nsScriptLoader.cpp#437
+// anything appended to end of strings is considered valid:
+var jsValidTypes = [
+ /^text\/javascript/i,
+ /^text\/ecmascript/i,
+ /^application\/javascript/i,
+ /^application\/ecmascript/i,
+ /^application\/x-javascript/i
+];
+
+var stripCDATAOpen = /<\!\[CDATA\[/gi;
+var stripCDATAClose = /]]>/g;
+
+var stripHtmlCommentsInScript = function (s) {
+ s = s.replace(stripCDATAOpen, '');
+ s = s.replace(stripCDATAClose, '');
+ return s;
+};
+
+
+
+// gather scripts and javascript in attributes across a dom object.
+var domGathererObject = {
+
+ // domHandler object.
+ d: null,
+
+ /**
+ * init
+ *
+ * assign a reference domHandler object
+ * to access/updates its properties.
+ *
+ */
+ init: function (domHandler) {
+
+ this.d = domHandler;
+
+ },
+
+ /**
+ * scriptHasInvalidType
+ *
+ * Checks that a script does not have a js "template" type.
+ * Normally any script that has a type attribute other than the
+ * few allowed ones is not interpreted. But by security, we only
+ * discard a few of them.
+ *
+ * @param script obj The script element.
+ * @return returns true if it matches a template type.
+ *
+ */
+ scriptHasInvalidType: function (script) {
+ var i = 0,
+ le = jsValidTypes.length;
+
+ var type = script.getAttribute('type');
+
+ if (type === 'librejs/blocked') {
+ // js has already been blocked.
+ return true;
+ }
+
+ if (!type) {
+ // type isn't set, don't look further.
+ return false;
+ }
+
+ for (; i < le; i++) {
+ if (jsValidTypes[i].test(type)) {
+ return false;
+ }
+ }
+
+ // type is invalid and
+ // hence cannot be executed.
+ return true;
+
+
+ },
+
+ /**
+ * findScripts
+ *
+ * Assigns the array of scripts in the dom to a property
+ * as well as a number of scripts present for looping purposing.
+ */
+ findScripts: function() {
+ this.d.domScripts = this.d.dom.getElementsByTagName('script');
+ this.d.numScripts = this.d.domScripts.length;
+ },
+
+ /**
+ * gatherIntrinsecEvents
+ *
+ * Fetches all the event attributes that might contain JavaScript
+ * as well as all element attributes that start with
+ * "javascript:".
+ *
+ */
+ gatherIntrinsecEvents: function() {
+ var i = 0, j, k,
+ all = this.d.dom.getElementsByTagName('*'),
+ max = all.length,
+ that = this,
+ attrLen, attrib, str, scriptEntry;
+
+
+
+ for (; i < max; i++) {
+
+ // look for attributes with value javascript:*
+ attributeHelpers.findJSinAttribute(all[i],
+ function (scriptEntry) {
+ if (scriptEntry !== false) {
+
+ that.d.inlineScripts.push(scriptEntry);
+ that.d.scripts.push(scriptEntry);
+
+ // add inline script in the count.
+ that.d.numInlineScripts++;
+
+ }
+ });
+
+ // look for attributes of on* (onLoad, ...)
+ attributeHelpers.findOnJSAttribute(all[i],
+ function (scriptEntry) {
+ if (scriptEntry !== false) {
+ that.d.inlineScripts.push(scriptEntry);
+ that.d.scripts.push(scriptEntry);
+
+ // add inline script in the count.
+ that.d.numInlineScripts++;
+ }
+ });
+
+ }
+
+ },
+
+ /**
+ * gatherScriptsContent
+ *
+ * Aggregate all content within on-page JavaScript code.
+ * Keep a list of all absolute urls to external scripts.
+ *
+ */
+ gatherScriptsContent: function() {
+ var i = 0, currentScript = '', absolutePath, scriptEntry,
+ that = this;
+ try {
+ for (; i < this.d.numScripts; i++) {
+
+ if (this.d.checkScriptForJsWebLabels(this.d.domScripts[i])) {
+ //break;
+ absolutePath = urlHandler.resolve(this.d.pageURL, this.d.domScripts[i].src);
+ scriptEntry = scriptObject.Script({'type': scriptTypes.EXTERNAL,
+ 'status': statusTypes.JSWEBLABEL,
+ 'element': this.d.domScripts[i],
+ 'url': absolutePath});
+ scriptEntry.tree = {};
+
+ this.d.externalScripts.push(scriptEntry);
+ that.d.scripts.push(scriptEntry);
+
+ this.d.loadsHtmlExternalScripts = true;
+
+ // increment number of scripts found.
+ this.d.numExternalScripts++;
+
+ }
+
+ // check that script has valid type
+ else if (!this.scriptHasInvalidType(this.d.domScripts[i])) {
+
+
+ if (this.d.hasSrc(this.d.domScripts[i]) &&
+ !this.d.scriptHasJsWebLabel(this.d.domScripts[i])) {
+
+ console.debug('an external script', this.d.domScripts[i]);
+
+ absolutePath = urlHandler.resolve(this.d.pageURL, this.d.domScripts[i].src);
+ scriptEntry = scriptObject.Script({'type': scriptTypes.EXTERNAL,
+ 'status': statusTypes.UNCHECKED,
+ 'element': this.d.domScripts[i],
+ 'url': absolutePath});
+ this.d.externalScripts.push(scriptEntry);
+ that.d.scripts.push(scriptEntry);
+
+ this.d.loadsHtmlExternalScripts = true;
+
+ // increment number of scripts found.
+ this.d.numExternalScripts++;
+
+ }
+
+ else if (privacyChecker.checkScriptPrivacyThreat(this.d.domScripts[i].text)) {
+
+ this.d.removeGivenJs(scriptObject.Script({'type': scriptTypes.SINGLETON,
+ 'status': statusTypes.UNCHECKED,
+ 'element': this.d.domScripts[i],
+ 'text': this.d.domScripts[i].text
+ }), '', true);
+ }
+
+ else if (this.d.domScripts[i].text !== '') {
+ // using else if since script text is
+ // ignored if src attribute is set.
+ // adding this.narcissusBugFixLibreJS to fix comment bug.
+ var bugfix = require('html_script_finder/bug_fix').narcissusBugFixLibreJS;
+ currentScript = stripHtmlCommentsInScript(this.d.domScripts[i].text + bugfix);
+
+ scriptEntry = scriptObject.Script({'type': scriptTypes.INLINE,
+ 'status': statusTypes.UNCHECKED,
+ 'element': this.d.domScripts[i],
+ 'text': currentScript});
+ this.d.inlineScripts.push(scriptEntry);
+ this.d.scripts.push(scriptEntry);
+
+ // add inline script in the count.
+ this.d.numInlineScripts++;
+
+ }
+ }
+ }
+ } catch (e) {
+ // Any problem arising, we remove the script.
+ console.debug('problem gathering scripts', e, e.lineNumber);
+ this.d.removeAllJs();
+ }
+
+ }
+
+
+};
+
+/*
+ * exports.domGatherer
+ * Instantiate a brand new clone of the domGatherer.
+ * @param dom obj The given dom for analysis.
+ * @param pageURL string the URL for the page.
+ * @param callback function callback when all the work has been performed.
+ */
+exports.domGatherer = function (domHandler) {
+
+ var domGatherer = Object.create(domGathererObject);
+
+ domGatherer.init(domHandler);
+
+ return domGatherer;
+
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/request.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/request.js
new file mode 100644
index 0000000..d1d26d8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/request.js
@@ -0,0 +1,112 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var timer = require("sdk/timers");
+
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+var {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+
+// ensure xhr won't create an infinite loop
+// with html content.
+var urlTester = require("html_script_finder/url_seen_tester").urlSeenTester;
+var urlHandler = require("url_handler/url_handler");
+const scriptsCached = require("script_entries/scripts_cache").scriptsCached;
+
+var Request = function() {
+ this.url = null;
+ this.channel = null;
+ this.script = null;
+ this.responseCallback = null;
+};
+
+/**
+ * init
+ */
+Request.prototype.init = function(script, callback) {
+ this.script = script;
+ // set initial url
+ this.url = this.script.url;
+
+ this.responseCallback = callback;
+
+ var iOService = Cc["@mozilla.org/network/io-service;1"]
+ .getService(Ci.nsIIOService);
+
+ this.channel = iOService.newChannel(this.url, null, null);
+};
+
+Request.prototype.request = function() {
+ var that = this;
+ var responseReceived = function (data) {
+ that.responseCallback(that.script, data);
+ };
+ try {
+ this.channel.asyncOpen({
+ QueryInterface: XPCOMUtils.generateQI(
+ [Ci.nsIRequestObserver, Ci.nsIStreamListener]),
+ data: "",
+ charset: null,
+
+ onStartRequest: function(request, context) {
+ this.charset = request.contentCharset || "UTF-8";
+ },
+
+ onDataAvailable: function (request, context, stream, offset, count) {
+ try {
+ var binaryInputStream = Cc["@mozilla.org/binaryinputstream;1"]
+ .createInstance(Ci.nsIBinaryInputStream);
+ binaryInputStream.setInputStream(stream);
+ var data = binaryInputStream.readBytes(count);
+ this.data += data;
+ } catch (x) {
+ console.debug('error in request', x, x.lineNumber);
+ responseReceived("");
+ }
+ },
+
+ onStopRequest: function (request, context, result) {
+ try {
+ if (this.charset.toLowerCase() != "utf-8") {
+ var uConv = Cc["@mozilla.org/intl/utf8converterservice;1"]
+ .createInstance(Ci.nsIUTF8ConverterService);
+
+ this.data = uConv.convertStringToUTF8(this.data, this.charset, true);
+ }
+ } catch (e) {
+ console.debug("Issue with nsIUTF8ConverterService", e);
+ console.debug("Charset was", this.charset);
+ responseReceived("");
+ }
+ responseReceived(this.data);
+ }
+ }, null);
+ } catch(e) {
+ console.debug("asyncOpen exception", e);
+ responseReceived("");
+ }
+};
+
+// Instantiate a Request
+exports.request = function (script, callback) {
+ var obj = new Request();
+ obj.init(script, callback);
+ return obj;
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/script_object.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/script_object.js
new file mode 100644
index 0000000..e919f23
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/script_object.js
@@ -0,0 +1,198 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var removedScripts = require("script_entries/removed_scripts").removedScripts;
+
+var acceptedScripts = require("script_entries/accepted_scripts").acceptedScripts;
+var dryRunScripts = require("script_entries/dryrun_scripts").dryRunScripts;
+
+var Script = function(props) {
+ // can be an attribute, an inline script,
+ // or an external script.
+ this.type = null;
+
+ // flagged whether it is unchecked, checked,
+ // accepted, or rejected, ...
+ this.status = null;
+
+ // contains the dom element
+ this.element = null;
+
+ // the attribute name, if applicable.
+ this.attribute = null;
+
+ // the script text as a string.
+ this.value = null;
+
+ // the src url if external.
+ this.url = null;
+
+ // the script text if inline.
+ this.text = null;
+
+ this.init(props);
+};
+
+Script.prototype.init = function(props) {
+ // check the required elements are present.
+ if (props == undefined) {
+ throw "Error, missing script entry value in script_object.js";
+ }
+
+ // required properties
+ if (props.type != undefined) {
+ this.type = props.type;
+ } else {
+ throw "type is missing";
+ }
+
+ if (props.status != undefined) {
+ this.status = props.status;
+ } else {
+ throw "status is missing";
+ }
+
+ if (props.element != undefined) {
+ this.element = props.element;
+ } else {
+ throw "element is missing";
+ }
+
+ // conditional properties.
+ this.url = (props.url) ? props.url : null;
+ this.text = (props.text) ? props.text : null;
+ this.jsAttributes = (props.jsAttributes) ? props.jsAttributes : null;
+
+ if (typeof this.text !== 'string' &&
+ this.tree !== null &&
+ typeof this.tree === 'object' &&
+ this.tree.hasOwnProperty('jsCode')
+ ) {
+ this.text = this.tree.jsCode;
+ }
+};
+
+Script.prototype.tagAsDryRun = function(pageURL, reason, hash) {
+ var content = this.findContentType();
+ var inline = (this.url != undefined) ? false : true;
+ var url = (inline == false ? this.url : null);
+ console.debug("url is", url);
+ this.element.setAttribute('data-librejs', 'dryrun');
+
+
+ this.element.setAttribute('data-librejs-reason', reason);
+
+ dryRunScripts.addAScript(pageURL, {'inline': inline,
+ 'contents': content,
+ 'reason': reason,
+ 'url': url,
+ 'hash': hash
+ });
+};
+
+Script.prototype.tagAsAccepted = function(pageURL, reason, hash) {
+ var content = this.findContentType();
+ var inline = (this.url != undefined) ? false : true;
+ var url = (inline == false ? this.url : null);
+ console.debug("url is", url);
+ this.element.setAttribute('data-librejs', 'accepted');
+
+
+ this.element.setAttribute('data-librejs-reason', reason);
+
+ acceptedScripts.addAScript(pageURL, {'inline': inline,
+ 'contents': content,
+ 'reason': reason,
+ 'url': url,
+ 'hash': hash
+ });
+
+};
+
+Script.prototype.tagAsRemoved = function(pageURL, reason, hash) {
+ var content = this.findContentType();
+ var inline = (this.url != undefined) ? false : true;
+ var url = (inline == false ? this.url : null);
+ this.element.setAttribute('data-librejs', 'rejected');
+ this.element.setAttribute('data-librejs-reason', reason);
+ console.debug("tagAsRemoved hash is", hash);
+ removedScripts.addAScript(pageURL, {
+ 'inline': inline,
+ 'contents': content,
+ 'reason': reason,
+ 'url': url,
+ 'hash': hash
+ });
+
+};
+
+Script.prototype.tagAsDryRun = function(pageURL, reason, hash) {
+ var content = this.findContentType();
+ var inline = (this.url != undefined) ? false : true;
+ var url = (inline == false ? this.url : null);
+ this.element.setAttribute('data-librejs', 'dryrun');
+ this.element.setAttribute('data-librejs-reason', reason);
+
+ dryRunScripts.addAScript(pageURL, {'inline': inline,
+ 'contents': content,
+ 'reason': reason,
+ 'url': url,
+ 'hash': hash
+ });
+};
+
+/**
+ * removeNarcissusBugLine
+ *
+ * Removes the line that is appended to all
+ * inline scripts and prevent the bug that prevent
+ * script tags with comments only from being checked.
+ *
+ */
+Script.prototype.removeNarcissusBugLine = function(str) {
+ return str.replace('\n\nthis.narcissusBugFixLibreJS', '');
+};
+
+/**
+ * findContentType
+ *
+ * Figure out whether it's an external script,
+ * an inline script, or an attribute from the property
+ * that has been set, rather than blindly trusting the given
+ * constant.
+ */
+Script.prototype.findContentType = function() {
+ if (this.url != undefined) {
+
+ return "";
+
+ } else if (this.text != undefined) {
+
+ return this.element.text;
+
+ } else if (this.jsAttributes != undefined) {
+ // return the array.
+ return JSON.stringify(this.jsAttributes);
+ }
+};
+
+exports.Script = function(props) {
+ return new Script(props);
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/script_properties.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/script_properties.js
new file mode 100644
index 0000000..2eeeedb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/dom_handler/script_properties.js
@@ -0,0 +1,43 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+exports.scriptTypes = {
+ INLINE: 0,
+ EXTERNAL: 1,
+ ATTRIBUTE: 2,
+ SINGLETON: 3
+};
+
+exports.statusTypes = {
+ UNCHECKED: 0,
+ CHECKED: 1,
+ ACCEPTED: 2,
+ REJECTED: 3,
+ JSWEBLABEL: 4
+};
+
+exports.reasons = {
+ 'FUNCTIONS_INLINE': 'This script is detected as inline, nonfree, defining functions or methods, and the rest of the page as loading external scripts',
+ 'FUNCTIONS_EXTERNAL': 'This script is detected as nonfree, external, and as defining functions or methods',
+ 'CONSTRUCT': 'This script is detected as nonfree and as defining nontrivial constructs',
+ 'FREE': 'This script is detected as free',
+ 'TRIVIAL': 'This script is detected as trivial',
+ 'TRIVIAL_NOT_ALLOWED': 'This script is detected as trivial, but trivial is not allowed here because of other scripts'
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/html_parser.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/html_parser.js
new file mode 100644
index 0000000..69b2acc
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/html_parser.js
@@ -0,0 +1,158 @@
+/*
+ # ***** BEGIN LICENSE BLOCK *****
+ # Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ #
+ # The contents of this file are subject to the Mozilla Public License Version
+ # 1.1 (the "License"); you may not use this file except in compliance with
+ # the License. You may obtain a copy of the License at
+ # http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS IS" basis,
+ # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ # for the specific language governing rights and limitations under the
+ # License.
+ #
+ # The Original Code is Microsummarizer.
+ #
+ # The Initial Developer of the Original Code is Mozilla.
+ # Portions created by the Initial Developer are Copyright (C) 2006
+ # the Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s):
+ # Myk Melez <myk@mozilla.org> (Original Author)
+ # Simon Bünzli <zeniko@gmail.com>
+ # Asaf Romano <mano@mozilla.com>
+ # Dan Mills <thunder@mozilla.com>
+ # Ryan Flint <rflint@dslr.net>
+ #
+ # Alternatively, the contents of this file may be used under the terms of
+ # either the GNU General Public License Version 2 or later (the "GPL"), or
+ # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ # in which case the provisions of the GPL or the LGPL are applicable instead
+ # of those above. If you wish to allow use of your version of this file only
+ # under the terms of either the GPL or the LGPL, and not to allow others to
+ # use your version of this file under the terms of the MPL, indicate your
+ # decision by deleting the provisions above and replace them with the notice
+ # and other provisions required by the GPL or the LGPL. If you do not delete
+ # the provisions above, a recipient may use your version of this file under
+ # the terms of any one of the MPL, the GPL or the LGPL.
+ #
+ # ***** END LICENSE BLOCK *****
+ */
+
+/*
+ * The original file is located here:
+ * http://mxr.mozilla.org/mozilla/source/browser/components/microsummaries/src/nsMicrosummaryService.js?raw=1
+ *
+ */
+
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * html_parser
+ *
+ * Takes in an http response (string), loads it into a secured iframe
+ * so that it can be manipulated as a DOM object. It then returns a
+ * modified string to be passed along as a replacement of the original
+ * response.
+ *
+ */
+
+var {Cc, Ci, Cu} = require("chrome");
+
+var domHandlerModule = require("html_script_finder/dom_handler");
+
+const PR_UINT32_MAX = 2147483647;
+
+
+exports.htmlParser = function () {
+
+ return {
+ charset: null,
+ htmlText: null,
+ pageURL: null,
+ fragment: null,
+ contentType: null,
+ responseStatus: null,
+
+ parse: function (htmlText, charset, contentType, url, fragment,
+ responseStatus, parseResult) {
+
+ // DOMParser still has too many issues.
+ this.htmlText = htmlText;
+ this.charset = charset;
+
+ if (this.charset === "" || this.charset === undefined) {
+ this.charset = "utf-8";
+ }
+ this.contentType = contentType;
+ this.pageURL = url;
+ this.fragment = fragment;
+ this.responseStatus = responseStatus;
+ var that = this;
+
+ var domParser = Cc["@mozilla.org/xmlextras/domparser;1"].
+ createInstance(Ci.nsIDOMParser);
+
+ var dom = domParser.parseFromString(this.htmlText, this.contentType);
+ // console.debug(dom.getElementsByTagName('body')[0].innerHTML);
+ domHandlerModule.domHandler(dom, this.pageURL, this.fragment, this.responseStatus, function (newDom) {
+ parseResult(that.serializeToStream(newDom, that));
+ });
+
+ },
+
+ /**
+ * serializeToStream
+ * Serializes an HTML DOM into a binary stream. Uses
+ * nsIDOMSerializer only as a backup to when the
+ * reconstituteHtmlString method fails (not sure if/when it
+ * happens).
+ * @param dom obj Reference to the dom object
+ * @param that obj Reference to the object returned by htmlParser.
+ * This allows to give access to the iframe.
+ * @return a binary stream.
+ */
+ serializeToStream: function (dom, that) {
+
+ var newData, len;
+
+ try {
+ var storageStream = Cc["@mozilla.org/storagestream;1"].createInstance(Ci.nsIStorageStream);
+ var binaryOutputStream = Cc["@mozilla.org/binaryoutputstream;1"].createInstance(Ci.nsIBinaryOutputStream);
+ var serializer = Cc["@mozilla.org/xmlextras/xmlserializer;1"].createInstance(Ci.nsIDOMSerializer);
+ var encoder = Cc["@mozilla.org/layout/documentEncoder;1?type=" + this.contentType]
+ .createInstance(Ci.nsIDocumentEncoder);
+
+ encoder.setCharset(this.charset);
+ encoder.init(dom, this.contentType, 0);
+ storageStream.init(8192, PR_UINT32_MAX, null);
+
+ binaryOutputStream.setOutputStream(storageStream.getOutputStream(0));
+ encoder.encodeToStream(binaryOutputStream);
+ return storageStream;
+ } catch (e) {
+ console.debug('issue with serializer', e, e.lineNumber);
+ }
+ }
+
+ };
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/url_seen_tester.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/url_seen_tester.js
new file mode 100644
index 0000000..6b98ce1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/url_seen_tester.js
@@ -0,0 +1,87 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var httpRe = /^(http:)/i;
+
+var httpsRe = /^(https:)/i;
+
+exports.urlSeenTester = {
+
+ whitelist: {},
+
+
+ httpToHttps: function (url) {
+ try {
+
+ if (httpRe.test(url)) {
+
+ return url.replace(httpRe, 'https:');
+
+ } else if (httpsRe.test(url)) {
+
+ return url.replace(httpsRe, 'http:');
+
+ } else {
+
+ return url;
+
+ }
+ } catch (x) {
+ console.debug('error', x);
+ }
+
+ },
+
+ clearUrls: function () {
+ this.whitelist = {};
+ },
+
+ clearUrl: function (url) {
+
+ if (this.whitelist[url]) {
+
+ // console.debug('disallowing', url);
+ delete this.whitelist[url];
+
+ }
+
+ },
+
+ addUrl: function (url) {
+
+ console.debug('adding', url);
+
+ if (!this.isWhitelisted(url)) {
+
+ console.debug('allowing', url);
+ this.whitelist[url] = true;
+ }
+
+ },
+
+ isWhitelisted: function (url) {
+ if (this.whitelist[url] || this.whitelist[this.httpToHttps(url)]) {
+ console.debug('found to be whitelisted', url);
+ return true;
+ }
+ return false;
+ }
+
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/find_js_labels.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/find_js_labels.js
new file mode 100644
index 0000000..d56d650
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/find_js_labels.js
@@ -0,0 +1,95 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * This file works in conjunction with lib/html_script_finder/js_web_labels.js
+ * to find mentions of external JavaScript files and their license information.
+ * This allows the dom_handler to allow them by default.
+ */
+
+// find table.
+exports.getLicenseList = function (document) {
+
+ var tbl = document.getElementById("jslicense-labels1"),
+ jsList = [],
+ i = 0,
+ le,
+ rows,
+ link,
+ fileCell,
+ licenseCell,
+ sourceCell,
+ row;
+
+
+ if (tbl) {
+
+ try {
+ rows = tbl.getElementsByTagName("tr");
+ le = rows.length;
+ var mockElem = {textContent: "Unknown", href: "Unknown" };
+ // loop through rows, and add each valid element to
+ // the array.
+ for (; i < le; i++) {
+
+ row = rows[i].getElementsByTagName('td');
+
+ if (row[0] && row[0].getElementsByTagName('a')[0]) {
+ fileCell = row[0].getElementsByTagName('a')[0];
+ } else {
+ fileCell = mockElem;
+ }
+
+ if (row[1] && row[1].getElementsByTagName('a')[0]) {
+ licenseCell = row[1].getElementsByTagName('a')[0];
+ } else {
+ licenseCell = mockElem;
+ }
+
+ if (row[2] && row[2].getElementsByTagName('a')[0]) {
+ sourceCell = row[2].getElementsByTagName('a')[0];
+ } else {
+ sourceCell = mockElem;
+ }
+ if (fileCell.href != 'Unknown') {
+ jsList.push({
+
+ 'fileName': fileCell.textContent,
+ 'fileUrl': fileCell.href,
+ 'fileHash': null, // we'll fill this with value when needed to compare script.
+
+ 'licenseName': licenseCell.textContent,
+ 'licenseUrl': licenseCell.href, // this will now be a magnet link, most likely.
+
+ 'sourceName': sourceCell.textContent,
+ 'sourceUrl': sourceCell.href
+ });
+ }
+
+ }
+ } catch (e) {
+ console.debug("Error fetching JS Web Label licenses", e,
+ e.lineNumber, e.fileName, "index is", i);
+ }
+ }
+
+ return jsList;
+
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/js_web_labels.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/js_web_labels.js
new file mode 100644
index 0000000..f13091c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/js_web_labels.js
@@ -0,0 +1,216 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+// node.js url module. Makes it easier to resole
+// urls in that datauri loaded dom
+var urlHandler = require("url_handler/url_handler");
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+var data = require("sdk/self").data;
+
+// license definitions, we are using canonical urls and license
+// identifiers.
+var licenses = require('js_checker/license_definitions').licenses;
+
+var getLicenseList = require('html_script_finder/web_labels/find_js_labels').getLicenseList;
+const types = require("js_checker/constant_types");
+
+const addToCache = require("html_script_finder/web_labels/script_hash_worker").addToCache;
+
+// keep web labels in memory so that they can be checked even when they
+// are embedded dynamically.
+var jsWebLabelEntries = {};
+
+// store the url to js web labels already visited during this session
+var jsLabelsPageVisited = {};
+
+var WebLabelFinder = function () {
+ this.dom = null;
+ this.pageURL = null;
+ this.jslicenseURL = null;
+ this.pageContent = null;
+ this.licenseList = null;
+ this.callback = null;
+};
+
+WebLabelFinder.prototype.init = function(dom, pageURL, callback) {
+ var that = this;
+ this.pageURL = pageURL;
+ this.dom = dom;
+ this.callback = function (a) {
+ if (typeof a == 'undefined') {
+ a = null;
+ }
+
+ // rewrite callback as soon as it is triggered once.
+ that.callback = function () {
+ console.debug("Callback already called");
+ };
+
+ callback(a);
+ };
+ this.findJavaScriptLicenses();
+ this.pageContent = '';
+ this.jslicenseURL = '';
+};
+
+WebLabelFinder.prototype.findJavaScriptLicenses = function () {
+ this.searchForJsLink();
+
+ if (this.jslicenseURL && !(jsLabelsPageVisited[this.jslicenseURL])) {
+ // get content from license page.
+ console.debug('called fetch license page for', this.jslicenseURL);
+ this.pageContent = this.fetchLicensePage();
+ }
+ else {
+ console.debug(this.jslicenseURL, "already visited");
+ this.callback();
+ }
+};
+
+WebLabelFinder.prototype.searchForJsLink = function() {
+ console.debug('triggered searchForJsLink');
+ if (this.dom) {
+ var linkTags = this.dom.getElementsByTagName('a'),
+ i = 0,
+ len = linkTags.length,
+ path;
+
+ // loop through all a tags.
+ for (; i < len; i++) {
+ if (linkTags[i].hasAttribute('rel') &&
+ linkTags[i].getAttribute('rel') === 'jslicense') {
+ return this.formatURL(linkTags[i]);
+ }
+ }
+ }
+ // no js web labels were found. call back.
+ this.callback();
+};
+
+WebLabelFinder.prototype.formatURL = function(link) {
+ this.jslicenseURL = urlHandler.resolve(this.pageURL, link.href);
+ this.jslicenseURL = urlHandler.addFragment(this.jslicenseURL, 'librejs=true');
+ console.debug('license URL found', this.jslicenseURL);
+};
+
+WebLabelFinder.prototype.fetchLicensePage = function() {
+ var that = this;
+ try {
+
+ var req = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance();
+
+ req.onload = function() {
+ console.debug("Fetching License!");
+ console.debug("URL is ", this._url);
+
+ that.licenseList = getLicenseList(this.responseXML);
+ console.debug("the license list", that.licenseList);
+ that.matchListWithDefs(this._url);
+
+ // add these entries to the global
+ // object for dynamically embedded scripts.
+ jsWebLabelEntries[that.pageURL] = that.licenseList;
+ jsLabelsPageVisited[req._url] = 1;
+
+ };
+ console.debug(this.jslicenseURL);
+ req.open('GET', this.jslicenseURL, true);
+ req._url = this.jslicenseURL;
+ req.responseType = "document";
+ req.send();
+
+ } catch (e) {
+ console.debug(e, e.lineNumber, e.fileName, this.jslicenseURL);
+ this.callback({});
+ }
+
+};
+
+WebLabelFinder.prototype.matchListWithDefs = function(jslicenseURL) {
+ var i = 0,
+ len = this.licenseList.length,
+ lic,
+ licDef,
+ urlLength,
+ iUrl,
+ licArray = null,
+ license, script;
+ var cacheCalls = 0;
+ list_check = {};
+ // nested loop.
+ cacheCalls = 0;
+ var callback = function (url) {
+ cacheCalls++;
+ list_check[url] = 1;
+ if (cacheCalls == Object.keys(list_check).length) {
+ console.debug("triggering callback duh");
+ // return array to requester object
+ callback = false;
+ that.callback(that.licenseList);
+ }
+ };
+ require("sdk/timers").setTimeout(function () {
+ // callback after 60 seconds if it's still not returned.
+ // using this as a safeguard.
+ // return array to requester object
+ if (callback !== false) {
+ that.callback(that.licenseList);
+ console.debug(list_check);
+ }
+ }, 15000);
+
+ for (; i < len; i++) {
+ lic = this.licenseList[i];
+ var that = this;
+ for (license in licenses) {
+ licDef = licenses[license];
+ if (licDef.canonicalUrl !== undefined) {
+ if (typeof licDef.canonicalUrl == 'string') {
+ // this is a string. make it an array.
+ licArray = [licDef.canonicalUrl];
+ } else {
+ licArray = licDef.canonicalUrl;
+ }
+
+ urlLength = licArray.length;
+
+ for (iUrl = 0; iUrl < urlLength; iUrl++) {
+ if (urlHandler.removeFragment(licArray[iUrl]) === urlHandler.removeFragment(lic.licenseUrl)) {
+ if (!require("sdk/url").isValidURI(lic.fileUrl)) {
+ console.debug(lic.fileUrl, " is not a valid URL");
+ callback();
+ }
+ lic.free = true;
+ var notif = require("ui/notification").createNotification(lic.fileUrl).notification;
+ console.debug("about TO ADD TO XHR: ", lic.fileUrl);
+ list_check[lic.fileUrl] = 0;
+ addToCache(lic, 0, jslicenseURL, callback);
+ }
+ }
+ }
+ }
+ }
+};
+
+exports.WebLabelFinder = WebLabelFinder;
+
+// store the web labels harvested across webpages (single session).
+exports.jsWebLabelEntries = jsWebLabelEntries;
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/script_hash_worker.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/script_hash_worker.js
new file mode 100644
index 0000000..e62133e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/html_script_finder/web_labels/script_hash_worker.js
@@ -0,0 +1,58 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+const types = require("js_checker/constant_types");
+const scriptsCached = require("script_entries/scripts_cache").scriptsCached;
+const xhr = require('html_script_finder/dom_handler/dom_checker').xhr;
+const timers = require("sdk/timers");
+
+exports.addToCache = function (lic, delay, jsWebLabelsURL, callback) {
+ console.debug("jslicenseURL is", jsWebLabelsURL);
+ if (typeof delay === 'undefined') {
+ delay = 0;
+ }
+
+ // get file hash and store as cached.
+ console.debug('performing xhr for', lic.fileUrl);
+ timers.setTimeout(function() {
+ var cb = function (script, contents) {
+ try {
+ // add a cache entry.
+ var hash = scriptsCached.addEntryIfNotCached(contents,
+ types.freeWithComment(
+ 'This script is free according to a JS Web Labels page visited recently (at ' +
+ jsWebLabelsURL.replace("librejs=true", "") + ' )'),
+ {},
+ true,
+ lic.fileUrl);
+ console.debug('returning xhr from', lic.fileUrl);
+ callback(lic.fileUrl);
+ } catch (e) {
+ callback(lic.fileUrl);
+ }
+ };
+ // just callback after 5 seconds if we don't get the answer yet.
+ timers.setTimeout(function() {
+ cb = function() {};
+ callback(lic.fileUrl); }, 20000);
+
+ xhr({'url': lic.fileUrl}, cb);},
+ delay);
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/allowed_referrers.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/allowed_referrers.js
new file mode 100644
index 0000000..4f524a7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/allowed_referrers.js
@@ -0,0 +1,75 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var prefChange = require("addon_management/prefchange");
+
+/**
+ * Contains a list of pages that are allowed
+ * to execute JavaScript regardless of whether it is
+ * nonfree and nontrivial.
+ */
+exports.allowedReferrers = {
+
+ allowed: {},
+
+ addPage: function (url) {
+ this.allowed[url] = 1;
+ },
+
+ urlInAllowedReferrers: function (url) {
+
+ if (this.allowed[url] === 1) {
+ return true;
+ }
+ // check if whitelisted.
+ return this.urlInWhitelist(url);
+
+ },
+
+ urlInWhitelist: function (url) {
+ var whitelist = prefChange.getWhitelist();
+ var i = 0, le = whitelist.length;
+
+ for (; i < le; i++) {
+
+ if (whitelist[i].test(url)) {
+
+ return true;
+
+ }
+
+ }
+
+ },
+
+ clearSinglePageEntry: function (url) {
+
+ var index = this.allowed[url];
+
+ if (this.allowed[url] === 1) {
+ delete this.allowed[url];
+ }
+
+ },
+
+ clearAllEntries: function () {
+ this.allowed = {};
+ }
+}; \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/caching.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/caching.js
new file mode 100644
index 0000000..1463b1c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/caching.js
@@ -0,0 +1,30 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+const nsICacheService = Ci.nsICacheService;
+const cacheService = Cc["@mozilla.org/network/cache-service;1"].getService(nsICacheService);
+
+exports.clearAllCache = function () {
+ cacheService.evictEntries(Ci.nsICache.STORE_ON_DISK);
+ cacheService.evictEntries(Ci.nsICache.STORE_IN_MEMORY);
+};
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/http_request_observer.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/http_request_observer.js
new file mode 100644
index 0000000..09e66e8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/http_request_observer.js
@@ -0,0 +1,161 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+var observerService = Cc["@mozilla.org/observer-service;1"]
+ .getService(Ci.nsIObserverService);
+
+// these are our target mime types for response interception.
+var targetMimeTypes = /.*(javascript|ecmascript|html).*/i;
+//var targetMimeTypes = /.*(html).*/i;
+
+// ensure xhr won't create an infinite loop
+// with html content.
+var urlTester = require("html_script_finder/url_seen_tester").urlSeenTester;
+
+var streamLoader = require("http_observer/stream_loader").streamLoader;
+
+var httpRequestObserver = {
+
+ observe: function(request, aTopic, aData) {
+
+ console.debug('atopic is', aTopic);
+
+ var url, newListener, status;
+
+ if (aTopic == "http-on-examine-response" ||
+ aTopic == "http-on-examine-cached-response" ||
+ aTopic == "http-on-examine-merged-response") {
+
+ request.QueryInterface(Ci.nsIHttpChannel);
+
+ if (request.URI.scheme != 'chrome' &&
+ (request.responseStatus < 300 ||
+ request.responseStatus > 399) &&
+ (targetMimeTypes.test(request.contentType) ||
+ request.contentType == undefined) &&
+ (!urlTester.isWhitelisted(request.URI.spec) &&
+ !urlTester.isWhitelisted(request.originalURI.spec))) {
+
+ newListener = new TracingListener();
+ request.QueryInterface(Ci.nsITraceableChannel);
+ newListener.originalListener = request.setNewListener(newListener);
+
+ }
+
+ else if (urlTester.isWhitelisted(request.URI.spec) ||
+ urlTester.isWhitelisted(request.originalURI.spec)) {
+ urlTester.clearUrl(request.URI.spec);
+ urlTester.clearUrl(request.originalURI.spec);
+ }
+
+ }
+ },
+
+ QueryInterface : function (aIID) {
+ if (aIID.equals(Ci.nsIObserver) ||
+ aIID.equals(Ci.nsISupports)) {
+ return this;
+ }
+ throw Cr.NS_NOINTERFACE;
+ }
+};
+
+// Copy response listener implementation.
+function TracingListener() {
+ this.originalListener = null;
+ this.streamLoader = streamLoader();
+}
+
+TracingListener.prototype = {
+
+ onDataAvailable: function(request, context, inputStream, offset, count) {
+
+ try {
+ this.streamLoader.loader.onDataAvailable(request, context, inputStream, offset, count);
+ } catch (x) {
+
+ console.debug(x, x.lineNumber, x.fileName, "In this case, charset is");
+
+ }
+
+ },
+
+ onStartRequest: function(request, context) {
+
+ this.streamLoader.setOriginalListener(this.originalListener);
+ this.streamLoader.loader.onStartRequest(request, context);
+ this.originalListener.onStartRequest(request, context);
+
+ },
+
+ onStopRequest: function(request, context, statusCode) {
+
+ try {
+ this.streamLoader.loader.onStopRequest(request, context, statusCode);
+ } catch (e) {
+ console.debug('error in onStopRequest', e, e.lineNumber);
+ }
+ },
+
+ QueryInterface: function (aIID) {
+ if (aIID.equals(Ci.nsIStreamListener) ||
+ aIID.equals(Ci.nsISupports)) {
+ return this;
+ }
+ throw Cr.NS_NOINTERFACE;
+ },
+
+
+};
+
+observerService.addObserver(httpRequestObserver,
+ "http-on-examine-response", false);
+
+observerService.addObserver(httpRequestObserver,
+ "http-on-examine-cached-response", false);
+
+observerService.addObserver(httpRequestObserver,
+ "http-on-examine-merged-response", false);
+
+
+
+/* remove observer */
+exports.removeHttpObserver = function () {
+
+ try {
+
+ observerService.removeObserver(httpRequestObserver,
+ "http-on-examine-response");
+
+ observerService.removeObserver(httpRequestObserver,
+ "http-on-examine-cached-response");
+
+ observerService.removeObserver(httpRequestObserver,
+ "http-on-examine-merged-response");
+
+ console.debug('turned off http observer');
+
+ } catch (e) {
+ console.debug(e);
+ }
+
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/process_response.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/process_response.js
new file mode 100644
index 0000000..759adf7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/process_response.js
@@ -0,0 +1,408 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * This module checks http responses by mime type and returns a
+ * modified response.
+ */
+
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+var jsChecker = require("js_checker/js_checker");
+
+const types = require("js_checker/constant_types");
+var checkTypes = types.checkTypes;
+
+// check if scripts embedded dynamically have a jsWebLabel entry indexed by referrer.
+var jsWebLabelEntries = require("html_script_finder/web_labels/js_web_labels").jsWebLabelEntries;
+
+var htmlParser = require("html_script_finder/html_parser");
+
+var removedScripts = require("script_entries/removed_scripts").removedScripts;
+var allowedRef = require('http_observer/allowed_referrers').allowedReferrers;
+
+var acceptedScripts = require("script_entries/accepted_scripts").acceptedScripts;
+
+// used to display info when a url is whitelisted.
+var dryRunScripts = require("script_entries/dryrun_scripts").dryRunScripts;
+
+// node.js url module. Makes it easier to resolve
+// urls in that datauri loaded dom
+var urlHandler = require("url_handler/url_handler");
+var isDryRun = require("addon_management/prefchange").isDryRun;
+
+var jsMimeTypeRe = /.*(javascript|ecmascript).*/i;
+var htmlMimeTypeRe = /.*(xhtml\+xml|html|multipart\/x-mixed-replace).*/i;
+
+
+var processResponseObject = {
+ data: null,
+ myParser: null,
+ url: null,
+ scriptFinder: null,
+ jsCheckString: null,
+ referrer: null,
+ contentType: null,
+ resInfo: null,
+ listener: null,
+ req: null,
+
+ /**
+ * starts the handling of a new response.
+ */
+ init: function (listener, resInfo) {
+ this.resInfo = resInfo;
+ this.req = resInfo.request;
+ /* needed for this.req.referrer */
+ this.req.QueryInterface(Ci.nsIHttpChannel);
+ this.listener = listener;
+ this.setData();
+ this.setContentType();
+ this.setUrls();
+ },
+
+ /**
+ * genBinaryOutput
+ * Set or reset binaryOutputStream and storageStream.
+ */
+ genBinaryOutput: function () {
+ this.storageStream = Cc["@mozilla.org/storagestream;1"].createInstance(Ci.nsIStorageStream);
+ this.binaryOutputStream = Cc["@mozilla.org/binaryoutputstream;1"].createInstance(Ci.nsIBinaryOutputStream);
+ },
+
+ /**
+ * Gather the data gathered from onDataAvailable.
+ */
+ setData: function () {
+
+ this.data = this.resInfo.receivedData;
+ console.debug("\n\nDump of whole data:\n\n", this.data, "\n\n end of dump");
+ // Prevents the http response body from being empty,
+ // which would throw an error.
+ if (this.data == '' || this.data == undefined) {
+ this.data = " ";
+ }
+
+ },
+
+ /**
+ * Set a standardized lowercase mime type.
+ */
+ setContentType: function() {
+ if (this.req.contentType != undefined) {
+ this.contentType = String(this.req.contentType).toLowerCase();
+ }
+ },
+
+ /**
+ * setUrls
+ * Set the current URL of the response, and
+ * set referrer if applicable.
+ */
+ setUrls: function() {
+
+ if (this.req.URI != undefined) {
+ this.fragment = urlHandler.getFragment(this.req.URI.spec);
+ console.debug('fragment is', this.fragment);
+ this.url = urlHandler.removeFragment(this.req.URI.spec);
+ }
+ if (this.req.referrer != undefined) {
+ this.referrerFragment = urlHandler.getFragment(this.req.referrer.spec);
+ this.referrer = urlHandler.removeFragment(this.req.referrer.spec);
+ }
+ },
+
+ /**
+ * processHTML
+ * Modifies a string of html
+ */
+ processHTML: function() {
+
+ var charset = this.req.contentCharset, myParser;
+
+ if (this.req.contentCharset != undefined && this.req.contentCharset != "") {
+ charset = this.req.contentCharset;
+ } else {
+ charset = "";
+ }
+ acceptedScripts.clearScripts(this.req.URI.spec);
+ removedScripts.clearScripts(this.req.URI.spec);
+ dryRunScripts.clearScripts(this.req.URI.spec);
+
+ console.debug('charset is', charset);
+ console.debug('responseStatus for', this.url, 'is', this.req.responseStatus);
+
+ // send data to htmlParser, and pass on modified data to
+ // originalListener.
+
+ myParser = htmlParser.htmlParser().parse(this.data,
+ charset,
+ this.contentType,
+ this.url,
+ this.fragment,
+ this.req.responseStatus,
+ this.htmlParseCallback.bind(this));
+ },
+
+ /**
+ *
+ * htmlParseCallback
+ *
+ * Passed on the callback result to
+ * the originalListener.
+ *
+ */
+ htmlParseCallback: function(result) {
+
+ var len = result.length;
+
+ try {
+
+ this.listener.onDataAvailable(this.req,
+ this.resInfo.context,
+ result.newInputStream(0), 0, len);
+
+
+ } catch (e) {
+
+ this.req.cancel(this.req.NS_BINDING_ABORTED);
+
+ }
+
+ this.listener.onStopRequest(this.req,
+ this.resInfo.context, this.resInfo.statusCode);
+
+ },
+
+ /**
+ * processJS
+ * Process and modify a string of JavaScript.
+ */
+ processJS: function() {
+ var checker, check, jsCheckString,
+ that = this;
+ //var start = Date.now(), end;
+
+ try {
+ // make sure script isn't already listed as free
+ // in a JS web labels table.
+ if (this.checkJsWebLabelsForScript()) {
+ // this is free. we are done.
+ this.jsListenerCallback();
+ return;
+
+ }
+
+ // analyze javascript in response.
+ checker = jsChecker.jsChecker();
+ check = checker.searchJs(this.data, function () {
+ console.debug("Has been analyzing", that.data);
+ that.processJsCallback(checker);
+ }, that.url);
+
+
+
+ } catch(e) {
+
+ // any error is considered nontrivial.
+ console.debug('js error in js app, removing script', e);
+ console.debug("error", e, e.lineNumber);
+ // modify data that will be sent to the browser.
+ this.data = '// LibreJS: Script contents were removed when it was loaded from a page, because another script attempted to load this one dynamically. Please place your cursor in the url bar and press the enter key to see the source.';
+ this.jsListenerCallback();
+ }
+
+ },
+
+ /**
+ * checkJsWebLabelsForScript
+ *
+ * check whether script that's been received has an entry
+ * in a js web labels table (lookup referrer.)
+ *
+ */
+ checkJsWebLabelsForScript: function () {
+
+ console.debug('checking script', this.url);
+ console.debug('current list is', JSON.stringify(jsWebLabelEntries));
+ if (jsWebLabelEntries[this.referrer] != undefined) {
+
+ var scriptList = jsWebLabelEntries[this.referrer],
+ i = 0,
+ len = scriptList.length;
+
+ for (; i < len; i++) {
+
+ if (scriptList[i].fileUrl === this.url &&
+ scriptList[i].free === true) {
+
+ console.debug(this.url, "is free and dynamic!");
+
+ var scriptObj = {inline: false,
+ url: this.url,
+ contents: this.url,
+ reason: "This script is free (see JS Web Labels page for detail)"};
+
+ acceptedScripts.addAScript(this.req.referrer.spec, scriptObj, "Script is free");
+
+ return true;
+
+ }
+
+ }
+
+
+ }
+
+ },
+
+ processJsCallback: function(checker) {
+ try {
+ var scriptObj;
+
+ var jsCheckString = checker.parseTree.freeTrivialCheck;
+ console.debug("analyzing js callback for", this.url);
+ // for testing only.
+ //var jsCheckString = {'type': checkTypes.FREE_SINGLE_ITEM };
+ console.debug('jscheckstring is', jsCheckString.type);
+
+ if (jsCheckString.type === checkTypes.NONTRIVIAL) {
+ if (!allowedRef.urlInAllowedReferrers(this.req.referrer.spec)) {
+ //if (true) {
+ console.debug("url", this.url, " is found nontrivial", "with reason", jsCheckString.reason);
+ scriptObj = {inline: false,
+ contents: '',
+ removalReason: 'nontrivial',
+ reason: jsCheckString.reason,
+ url: this.url,
+ hash: checker.hash};
+ removedScripts.addAScript(this.req.referrer.spec, scriptObj);
+
+ // modify data that will be sent to the browser.
+ this.data = '// LibreJS: Script contents were removed when it was loaded from a page, because another script attempted to load this one dynamically and its contents appear to be nonfree/nontrivial. Please hit enter in the location bar to see the actual source.';
+ } else {
+ console.debug("writing to dry run", this.url);
+ scriptObj = {inline:false,
+ contents: '',
+ removalReason: 'nontrivial',
+ reason: jsCheckString.reason,
+ url: this.url,
+ hash:checker.hash};
+ dryRunScripts.addAScript(this.req.referrer.spec, scriptObj);
+ }
+
+ this.jsListenerCallback();
+
+ } else if (jsCheckString.type === checkTypes.FREE ||
+ jsCheckString.type === checkTypes.FREE_SINGLE_ITEM ||
+ jsCheckString.type === checkTypes.TRIVIAL ||
+ jsCheckString.type === checkTypes.TRIVIAL_DEFINES_FUNCTION ||
+ jsCheckString.type === checkTypes.WHITELISTED) {
+ console.debug("found a free script for", this.url, this.req.referrer.spec, jsCheckString.reason);
+ console.debug('found a free script', this.req.referrer.spec);
+
+ scriptObj = {inline: false,
+ contents: '',
+ reason: jsCheckString.reason,
+ url: this.url,
+ hash:checker.hash};
+
+ acceptedScripts.addAScript(this.req.referrer.spec, scriptObj);
+ this.jsListenerCallback();
+ }
+
+ //var end = Date.now();
+ console.debug('exec time', this.url, ' -- ', end - start);
+ } catch (x) {
+ console.debug('error', x);
+ }
+ },
+
+ /**
+ * ProcessAllTypes
+ * Calls processHTML or JS if it finds an appropriate content
+ * type. For everything else it just passes on the data to the
+ * original listener.
+ */
+ processAllTypes: function() {
+ // toggle xlibrejs if X-LibreJS is set.
+
+ // process HTML
+ if ((htmlMimeTypeRe.test(this.contentType) ||
+ this.req.contentType === undefined)) {
+ this.processHTML();
+ return;
+ }
+
+ else {
+ // process external JS files that are called from another
+ // file (and hence have a referrer).
+
+ if (this.referrer != undefined &&
+ jsMimeTypeRe.test(this.contentType) &&
+ !(acceptedScripts.isFound(this.referrer, {inline: false, contents: this.url})) &&
+ !(acceptedScripts.isFound(this.referrer, {inline:false, contents:this.req.originalURI.spec}))) {
+
+ // console.debug('process js triggered for', this.url);
+ this.processJS();
+
+ } else {
+ this.jsListenerCallback();
+ }
+
+ }
+
+ },
+
+ jsListenerCallback: function () {
+
+ var len = this.data.length;
+
+ this.genBinaryOutput();
+
+ this.storageStream.init(8192, len, null);
+ this.binaryOutputStream.setOutputStream(this.storageStream.getOutputStream(0));
+ this.binaryOutputStream.writeBytes(this.data, len);
+
+ try {
+ this.listener.onDataAvailable(this.req,
+ this.resInfo.context,
+ this.storageStream.newInputStream(0),
+ 0, len);
+ } catch (e) {
+ this.req.cancel(this.req.NS_BINDING_ABORTED);
+ }
+
+ this.listener.onStopRequest(this.req,
+ this.resInfo.context,
+ this.resInfo.statusCode);
+
+ }
+
+
+};
+
+// creates an instance of processResponseObject.
+exports.ProcessResponse = function (listener, resInfo) {
+ console.debug('triggered');
+ var procResponse = Object.create(processResponseObject);
+ procResponse.init(listener, resInfo);
+ return procResponse;
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/stream_loader.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/stream_loader.js
new file mode 100644
index 0000000..bd27132
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/http_observer/stream_loader.js
@@ -0,0 +1,110 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+const processResponse = require('http_observer/process_response');
+
+var StreamLoader = function() {
+ this.loader = null;
+ this.listener = null;
+ this.originalListener = null;
+}
+
+StreamLoader.prototype.setOriginalListener = function(listener) {
+ this.originalListener = listener;
+};
+
+StreamLoader.prototype.init = function() {
+ try {
+ var that = this;
+ this.listener = new StreamListener();
+
+ this.listener.callback = function (loader, context, status, data) {
+ console.debug("here is the data", data);
+ var responseInfo = {'request': loader.channel,
+ 'context': context,
+ 'statusCode': status,
+ 'receivedData': data};
+ var responseHandler = processResponse.ProcessResponse(that.originalListener, responseInfo);
+ responseHandler.processAllTypes();
+
+ that.destroy();
+ };
+
+ this.loader = Cc["@mozilla.org/network/unichar-stream-loader;1"].
+ createInstance(Ci.nsIUnicharStreamLoader);
+
+ this.loader.init(this.listener);
+ } catch (e) {
+ console.debug(e);
+ }
+};
+
+StreamLoader.prototype.destroy = function () {
+ this.loader = null;
+ this.listener = null;
+};
+
+var getRegexForContentType = function (contentType) {
+ if (/xhtml/i.test(contentType)) {
+ return /<\?[^>]*?encoding=(?:["']*)([^"'\s\?>]+)(?:["']*)/i;
+ }
+
+ // return the regular html regexp for anything else.
+ return /<meta[^>]*?charset=(?:["']*)([^"'\s>]+)(?:["']*)/i;
+};
+
+var StreamListener = function() {};
+
+StreamListener.prototype.QueryInterface = function listener_qi(iid) {
+ if (iid.equals(Ci.nsISupports) ||
+ iid.equals(Ci.nsIUnicharStreamLoaderObserver)) {
+ return this;
+ }
+ throw Cr.NS_ERROR_NO_INTERFACE;
+};
+
+StreamListener.prototype.onStreamComplete = function onStreamComplete(
+ loader, context, status, data) {
+ this.callback(loader, context, status, data);
+};
+
+StreamListener.prototype.onDetermineCharset = function onDetermineCharset(
+ loader, context, data) {
+ var match, regex;
+ if (loader.channel.contentCharset != undefined &&
+ loader.channel.contentCharset != "") {
+ return loader.channel.contentCharset;
+ } else {
+ match = getRegexForContentType(loader.channel.contentType).exec(data);
+ if (match) {
+ loader.channel.contentCharset = match[1];
+ return match[1];
+ } else {
+ return "UTF-8";
+ }
+ }
+};
+
+exports.streamLoader = function () {
+ var l = new StreamLoader();
+ l.init();
+ return l;
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/constant_types.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/constant_types.js
new file mode 100644
index 0000000..1a3b2a9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/constant_types.js
@@ -0,0 +1,190 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+//var debug = require("debug/debug");
+
+// token list from exports.init();
+exports.token = {
+ END: 0,
+ NEWLINE: 1,
+ SEMICOLON: 2,
+ COMMA: 3,
+ ASSIGN: 4,
+ HOOK: 5,
+ COLON: 6,
+ CONDITIONAL: 7,
+ OR: 8,
+ AND: 9,
+ BITWISE_OR: 10,
+ BITWISE_XOR: 11,
+ BITWISE_AND: 12,
+ EQ: 13,
+ NE: 14,
+ STRICT_EQ: 15,
+ STRICT_NE: 16,
+ LT: 17,
+ LE: 18,
+ GE: 19,
+ GT: 20,
+ LSH: 21,
+ RSH: 22,
+ URSH: 23,
+ PLUS: 24,
+ MINUS: 25,
+ MUL: 26,
+ DIV: 27,
+ MOD: 28,
+ NOT: 29,
+ BITWISE_NOT: 30,
+ UNARY_PLUS: 31,
+ UNARY_MINUS: 32,
+ INCREMENT: 33,
+ DECREMENT: 34,
+ DOT: 35,
+ LEFT_BRACKET: 36,
+ RIGHT_BRACKET: 37,
+ LEFT_CURLY: 38,
+ RIGHT_CURLY: 39,
+ LEFT_PAREN: 40,
+ RIGHT_PAREN: 41,
+ SCRIPT: 42,
+ BLOCK: 43,
+ LABEL: 44,
+ FOR_IN: 45,
+ CALL: 46,
+ NEW_WITH_ARGS: 47,
+ INDEX: 48,
+ ARRAY_INIT: 49,
+ OBJECT_INIT: 50,
+ PROPERTY_INIT: 51,
+ GETTER: 52,
+ SETTER: 53,
+ GROUP: 54,
+ LIST: 55,
+ LET_BLOCK: 56,
+ ARRAY_COMP: 57,
+ GENERATOR: 58,
+ COMP_TAIL: 59,
+ IDENTIFIER: 60,
+ NUMBER: 61,
+ STRING: 62,
+ REGEXP: 63,
+ BREAK: 64,
+ CASE: 65,
+ CATCH: 66,
+ CONST: 67,
+ CONTINUE: 68,
+ DEBUGGER: 69,
+ DEFAULT: 70,
+ DELETE: 71,
+ DO: 72,
+ ELSE: 73,
+ EXPORT: 74,
+ FALSE: 75,
+ FINALLY: 76,
+ FOR: 77,
+ FUNCTION: 78,
+ IF: 79,
+ IMPORT: 80,
+ IN: 81,
+ INSTANCEOF: 82,
+ LET: 83,
+ MODULE: 84,
+ NEW: 85,
+ NULL: 86,
+ RETURN: 87,
+ SWITCH: 88,
+ THIS: 89,
+ THROW: 90,
+ TRUE: 91,
+ TRY: 92,
+ TYPEOF: 93,
+ VAR: 94,
+ VOID: 95,
+ YIELD: 96,
+ WHILE: 97,
+ WITH: 98
+};
+
+var checkTypes = {
+ // trivial.
+ TRIVIAL: 1,
+
+ // defines functions, and so might or might not
+ // be trivial in the end.
+ TRIVIAL_DEFINES_FUNCTION: 2,
+
+ NONTRIVIAL: 3,
+
+ // Free
+ FREE: 4,
+ FREE_SINGLE_ITEM: 5,
+ WHITELISTED: 6
+};
+
+exports.checkTypes = checkTypes;
+
+exports.emptyTypeObj = function () {
+ return {
+ 'type': null,
+ 'reason': null
+ };
+};
+
+exports.nontrivialWithComment = function (comment) {
+ return {
+ 'type': checkTypes.NONTRIVIAL,
+ 'reason': comment
+ };
+};
+
+exports.trivialWithComment = function (comment) {
+ return {
+ 'type': checkTypes.TRIVIAL,
+ 'reason': comment
+ };
+};
+
+exports.trivialFuncWithComment = function (comment) {
+ return {
+ 'type': checkTypes.TRIVIAL_DEFINES_FUNCTION,
+ 'reason': comment
+ };
+};
+
+exports.freeWithComment = function (comment) {
+ return {
+ 'type': checkTypes.FREE,
+ 'reason': comment
+ };
+};
+
+exports.singleFreeWithComment = function (comment) {
+ return {
+ 'type': checkTypes.FREE_SINGLE_ITEM,
+ 'reason': comment
+ };
+};
+
+exports.whitelisted = function (comment) {
+ return {
+ 'type': checkTypes.WHITELISTED,
+ 'reason': comment + ' -- whitelisted by user'
+ };
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/free_checker.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/free_checker.js
new file mode 100644
index 0000000..f5690f2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/free_checker.js
@@ -0,0 +1,227 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+
+var licenses = require('js_checker/license_definitions');
+var simpleStorage = require("sdk/simple-storage");
+const LAZY = licenses.types.LAZY;
+var licenseRegex = [];
+const END_OF_SCRIPT = require('html_script_finder/bug_fix').END_OF_SCRIPT;
+const types = require("js_checker/constant_types");
+
+const token = types.token;
+
+var patternUtils = require('js_checker/pattern_utils').patternUtils;
+
+var licStartLicEndRe = /@licstartThefollowingistheentirelicensenoticefortheJavaScriptcodeinthis(?:page|file)(.*)?@licendTheaboveistheentirelicensenoticefortheJavaScriptcodeinthis(?:page|file)/mi;
+var licenseMagnet = /.*@license ?(magnet\:\?xt=urn\:btih\:[0-9A-Za-z]+).*/;
+var licenseEndMagnet = /.*@license-end.*/i;
+exports.freeCheck = {
+ initLicenses: function (licenses) {
+ for (var item in licenses) {
+ this.stripLicenseToRegexp(licenses[item]);
+ }
+ },
+
+ /**
+ * stripLicenseToRegexp
+ *
+ * Removes all non-alphanumeric characters except for the
+ * special tokens, and replace the text values that are
+ * hardcoded in license_definitions.js
+ *
+ */
+ stripLicenseToRegexp: function (license) {
+ var i = 0,
+ max = license.licenseFragments.length,
+ item;
+
+ for (; i < max; i++) {
+ item = license.licenseFragments[i];
+ item.regex = patternUtils.removeNonalpha(item.text);
+
+ if (license.licenseFragments[i].type === LAZY) {
+
+ // do not permit words before. Since "Not" could be added
+ // and make it nonfree. e.g.: Not licensed under the GPLv3.
+ item.regex = '^(?!.*not).*' + item.regex;
+
+ }
+
+ item.regex = new RegExp(patternUtils.replaceTokens(item.regex), 'i');
+ }
+
+ return license;
+ },
+
+ /**
+ * checkNodeFreeLicense
+ *
+ * Check if the node mentions a free license
+ * in one of its comments.
+ *
+ */
+ checkNodeFreeLicense: function (n, queue) {
+ var strippedComment,
+ magnetLink,
+ comment = this.getComment(n),
+ list = licenses.licenses,
+ i, j,
+ max,
+ regex,
+ frag,
+ matchLicStart,
+ matchMagnet,
+ license,
+ isMagnetValid = false;
+
+ if (n.counter === 2 &&
+ n.parent != undefined &&
+ n.parent.type === token.SCRIPT &&
+ comment != undefined &&
+ comment != " ") {
+ strippedComment = patternUtils.removeNonalpha(comment);
+ matchLicStart = strippedComment.match(licStartLicEndRe);
+ console.debug("matchMagnet is", matchMagnet);
+ if (matchLicStart) {
+ strippedComment = matchLicStart[1];
+ for (license in list) {
+ frag = list[license].licenseFragments;
+ max = list[license].licenseFragments.length;
+ for (i = 0;i < max; i++) {
+ if (frag[i].regex.test(strippedComment)) {
+ return {licenseName: list[license].licenseName,
+ type: types.checkTypes.FREE} ;
+
+ }
+ }
+ }
+ }
+ return this.matchMagnet(comment, queue); /// check for @license -- @license-end notation.
+ }
+
+ },
+
+ /**
+ * matchMagnet
+ * Attempts to find valid @license [magnet]
+ * and @license-end notation.
+ */
+ matchMagnet: function (comment, queue) {
+ let matchMagnet = comment.match(licenseMagnet);
+ if (matchMagnet) {
+ let magnetLinkRe = new RegExp(matchMagnet[1].replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"));
+ let list = licenses.licenses;
+ let queue_end = queue.length;
+
+ for (var license in list) {
+ frag = list[license].canonicalUrl;
+ console.debug("frag is ", frag);
+ if (frag != undefined) {
+ max = list[license].canonicalUrl.length;
+ console.debug("max is", max);
+ for (i = 0;i < max; i++) {
+ console.debug("current frag is", frag[i]);
+ if (frag[i].match(magnetLinkRe)) {
+ for (let i = 0; i < queue_end; i++) {
+ console.debug(queue[i]);
+ let n = queue[i];
+ comment = this.getComment(n);
+ if (comment != undefined &&
+ comment.match(licenseEndMagnet) &&
+ this.checkIsLastNode(n)) {
+ // found a closing match. Just accept this script.
+ return {licenseName: list[license].licenseName,
+ type: types.checkTypes.FREE_SINGLE_ITEM};
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return;
+ },
+
+ /**
+ * checkIsLastJsNode.
+ * returns true if n is the last node.
+ * Or if nodes before it are only comments etc (not valid code.)
+ * A special LibreJS node is appended at the end of a script tree to
+ * check if this is the last (and also for narcissus to keep the last comment
+ * in the tree.)
+ * TODO: Refactor LibreJS so that END nodes can have a comment.
+ */
+ checkIsLastNode: function (n) {
+ // first check if the comment is part of the very last statement.
+ if (n.value == "this" && n.next == undefined) {
+ // just make sure the last node is indeed our harmless bit of
+ // js.
+ if (n.tokenizer) {
+ let source = n.tokenizer.source;
+ let substring = source.substr(n.start, n.end+23);
+ if (substring == END_OF_SCRIPT) {
+ return true;
+ }
+ else {
+ console.debug("substring is ", substring);
+ return false;
+ }
+ }
+ console.debug("Hurra! This is the end of our script");
+ return true;
+ }
+
+ // isn't our last node.
+ return false;
+ },
+
+ /**
+ * getComment
+ *
+ * Grab the comment(s) from the node. Concatenates
+ * multiple comments.
+ *
+ */
+ getComment: function (n) {
+
+ var i = 0, length, comment = "";
+
+ if (n.blockComments == undefined || n.blockComments == " ") {
+ return;
+ }
+
+ length = n.blockComments.length;
+ if (length > 0) {
+ for (; i < length; i++) {
+ comment += n.blockComments[i];
+ }
+ }
+ if (comment == "") {
+ return;
+ }
+ return comment;
+
+ }
+
+};
+
+exports.freeCheck.initLicenses(licenses.licenses);
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/js_checker.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/js_checker.js
new file mode 100644
index 0000000..a96eea7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/js_checker.js
@@ -0,0 +1,513 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+const narcissusWorker = require("narcissus_parser/narcissus_worker");
+
+const nonTrivialModule = require("js_checker/nontrivial_checker");
+const freeChecker = require("js_checker/free_checker");
+const relationChecker = require("js_checker/relation_checker");
+const types = require("js_checker/constant_types");
+
+const scriptsCached = require("script_entries/scripts_cache").scriptsCached;
+var isDryRun = require("addon_management/prefchange").isDryRun;
+
+var checkTypes = types.checkTypes;
+
+const token = types.token;
+
+// for setTimeout.
+const timer = require("sdk/timers");
+
+var callbackMap = {};
+
+/**
+ * This module needs to be updated so that it is asynchronous
+ * and to reduce CPU usage --
+ *
+ * Partly already done in:
+ * https://gitorious.org/librejs/librejs/blobs/async/lib/js_checker/js_checker.js
+ * data/complain/contact_finder.js on how to proceed.
+ *
+ */
+/**
+ *
+ * Pairs a hash with a given callback
+ * method from an object.
+ *
+ */
+var setHashCallback = function(hash, callback, notification) {
+ console.debug("hash is now ", hash);
+ if (hash in callbackMap && isDryRun()) {
+ // work around for issue with dryrun after
+ // checking box.
+ // do nothing.
+ callbackMap[hash] = callback;
+ }
+ else if (hash in callbackMap) {
+ // console.debug("callback", callbackMap[hash]);
+ notification.close();
+ throw Error("already being checked.");
+ } else {
+ callbackMap[hash] = callback;
+ }
+ console.debug("callback is type: ", callback.constructor);
+ //callbackMap[hash] = callback;
+};
+
+var removeHashCallback = function(hash) {
+ if (hash in callbackMap) {
+ delete callbackMap[hash];
+ }
+};
+
+/**
+ * find callback and return result (parse tree).
+ *
+ */
+exports.callbackHashResult = function(hash, result) {
+ try {
+ callbackMap[hash](result, hash);
+ } catch (x) {
+ console.debug('error in jsChecker', x, 'hash:', hash);
+ // return tree as false.
+ console.debug("Error with", x);
+ if (typeof callbackMap[hash] == 'function') {
+ callbackMap[hash](false, hash);
+ } else {
+ console.debug('callbackHashResult Error', x);
+ }
+ }
+ // remove callback after it's been called.
+ removeHashCallback(hash);
+};
+
+var JsChecker = function() {
+ this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ this.nonTrivialChecker = null;
+ this.freeToken = false;
+ this.nontrivialness = false;
+ this.parseTree = null;
+ this.relationChecker = null;
+ this.jsCode = null;
+ this.resultReady = null;
+ this.notification = null;
+ this.walkTreeCancelled = false;
+ this.shortText = null;
+ this.hash = null;
+ this.queue = null; // will contain the nodes of the script.
+};
+
+/**
+ * searchJs
+ *
+ * Takes in some javascript code (as string).
+ * Uses Narcissus parser to build an abstract syntax tree.
+ * Checks for trivialness.
+ *
+ */
+JsChecker.prototype.searchJs = function(jsCode, resultReady, url) {
+ var that = this;
+ var bugfix = require('html_script_finder/bug_fix').narcissusBugFixLibreJS;
+ this.url = url;
+ this.resultReady = resultReady;
+ this.jsCode = jsCode;
+ this.shortText = jsCode.replace(bugfix, '').substring(0,100);
+ this.notification = require("ui/notification")
+ .createNotification(this.shortText).notification;
+
+ var verbatimCode = this.jsCode.replace(bugfix, '');
+ this.hash = scriptsCached.getHash(verbatimCode);
+ var isCached = scriptsCached.isCached(verbatimCode, this.hash);
+ if (isCached) {
+ console.debug("We have it cached indeed!");
+ // there is an existing entry for this exact copy
+ // of script text.
+ console.debug('this script result is cached', this.hash, isCached.result.type);
+ console.debug("Return right away");
+ // we are not generating a parse tree.
+ this.parseTree = {};
+ // fake the result is from parse tree.
+ this.parseTree.freeTrivialCheck = isCached.result;
+
+ this.relationChecker = isCached.relationChecker;
+ // leave without doing parsing/analysis part.
+ this.resultReady();
+ this.removeNotification();
+ return;
+ }
+
+ try {
+ // no cache, continue.
+ this.relationChecker = relationChecker.relationChecker();
+ this.freeToken = types.emptyTypeObj();
+ this.nontrivialness = types.emptyTypeObj();
+
+ // use this.hash to keep track of comments made by the nontrivial checker code
+ // about why/how the code is found to be nontrivial.
+ this.nonTrivialChecker = nonTrivialModule.nonTrivialChecker(this.hash);
+
+ // register callback and hash. So that result
+ // can be passed.
+ setHashCallback(this.hash, this.handleTree.bind(this), this.notification);
+
+ // parse using ChromeWorker.
+ narcissusWorker.parse(this.jsCode, this.hash);
+ } catch (x) {
+ console.debug('error', x);
+ this.handleTree(false, x);
+ this.removeNotification();
+ }
+};
+
+JsChecker.prototype.handleTree = function(tree, errorMessage) {
+ var that = this;
+
+ if (tree == false || tree == undefined) {
+ // error parsing tree. Just return nonfree nontrivial.
+ this.parseTree = {};
+ this.parseTree.freeTrivialCheck = types.nontrivialWithComment(
+ 'error parsing: ' + errorMessage);
+
+ // cache result with hash of script for future checks.
+ scriptsCached.addEntry(this.jsCode, this.parseTree.freeTrivialCheck,
+ this.relationChecker, true, this.url);
+ this.resultReady();
+ } else {
+ try {
+ // no need to keep parseTree in property
+ this.parseTree = {}; //tree;
+ console.debug(tree);
+ this.walkTree(tree);
+ } catch (x) {
+ console.debug(x, x.lineNumber, x.fileName);
+ }
+ }
+};
+
+/**
+ * getCheckerResult
+ *
+ * Callback to Assign result from walkTree to property.
+ * reset parse tree. create cache entry.
+ *
+ */
+JsChecker.prototype.getCheckerResult = function(result) {
+ // done with parse tree. Get rid of it.
+ this.parseTree = {};
+ this.removeNotification();
+
+ this.parseTree.nonTrivialChecker = this.nonTrivialChecker;
+
+ // actual result stored here. hack since we used parseTree before.
+ this.parseTree.freeTrivialCheck = result;
+
+ // cache result with hash of script for future checks.
+ scriptsCached.addEntry(this.jsCode, this.parseTree.freeTrivialCheck,
+ this.relationChecker, true, this.url);
+
+ this.resultReady();
+};
+
+/**
+ * trivialCheck
+ *
+ * Runs nodes through a series of conditional statements
+ * to find out whether it is trivial or not.
+ *
+ * @param {object} n. The current node being studied.
+ * @param {string} t. The type of node being studied
+ * (initializer, functionbody, try block, ...)
+ *
+ */
+JsChecker.prototype.trivialCheck = function(n) {
+ return this.nonTrivialChecker.checkNontrivial(n);
+};
+
+/**
+ * freeCheck
+ *
+ * Check if comments above current node could be a free licence.
+ * If it is, then the script will be flagged as free.
+ *
+ * @param {object} n. The current node being studied.
+ * (initializer, functionbody, try block, ...)
+ *
+ */
+JsChecker.prototype.freeCheck = function(n, ntype) {
+ var check = freeChecker.freeCheck.checkNodeFreeLicense(n, this.queue);
+ return check;
+};
+
+/**
+ * walkTree
+ *
+ * An iterative functionwalking the parse tree generated by
+ * Narcissus.
+ *
+ * @param {object} node. The original node.
+ *
+ */
+JsChecker.prototype.walkTree = function(node) {
+ var queue = [node];
+ var i,
+ len,
+ n, counter = 0,
+ result,
+ processQueue,
+ that = this;
+
+ this.queue = queue; // set as property.
+
+ // set top node as visited.
+ node.visited = true;
+
+ /**
+ * functionwalking the tree for a given
+ * amount of time, before calling itself again.
+ */
+ processQueue = function() {
+ var nodeResult, end;
+
+ // record start time of functionexecution.
+ var start = Date.now();
+
+ if (that.walkTreeCancelled) {
+ // tree walking already completed.
+ return;
+ }
+
+ while (queue.length) {
+ n = queue.shift();
+ n.counter = counter++;
+ console.debug("Under review", n.type);
+ if (n.children != undefined) {
+ // fetch all the children.
+ len = n.children.length;
+ for (i = 0; i < len; i++) {
+ if (n.children[i] != undefined &&
+ n.children[i].visited == undefined) {
+ // figure out siblings.
+ if (i > 0) {
+ n.children[i].previous = n.children[i-1];
+ }
+
+ if (i < len) {
+ n.children[i].next = n.children[i+1];
+ }
+ // set parent property.
+ n.children[i].parent = n;
+ n.children[i].visited = true;
+ queue.push(n.children[i]);
+ }
+ }
+ }
+
+ if (n.type != undefined) {
+ // fetch all properties that may have nodes.
+ for (var item in n) {
+ if (item != 'tokenizer' &&
+ item != 'children' &&
+ item != 'length' &&
+ n[item] != null &&
+ typeof n[item] === 'object' &&
+ n[item].type != undefined &&
+ n[item].visited == undefined) {
+ n[item].visited = true;
+ // set parent property
+ n[item].parent = n;
+ queue.push(n[item]);
+ }
+ }
+ }
+
+ that.checkNode(n);
+
+ if (that.freeToken.type === checkTypes.FREE ||
+ that.freeToken.type === checkTypes.FREE_SINGLE_ITEM) {
+ // nothing more to look for. We are done.
+ that.walkTreeComplete(that.freeToken);
+ return;
+ }
+ else if (that.nontrivialness.type === checkTypes.NONTRIVIAL) {
+ // nontrivial
+ // we are done.
+ that.walkTreeComplete(that.nontrivialness);
+ return;
+ }
+ // call processQueue again if needed.
+ end = Date.now();
+
+ if (queue.length) {
+ // there are more nodes in the queue.
+
+ if ((end - start) > 30) {
+
+ // been running more than 20ms, pause
+ // for 10 ms before calling processQueue
+ // again.
+ timer.setTimeout(processQueue, 8);
+ return;
+ }
+ } else {
+ // we are done.
+ that.removeNotification();
+ that.walkTreeComplete();
+ return;
+ }
+ }
+ };
+
+ if (node.type === token.SCRIPT) {
+ // this is the global scope.
+ node.global = true;
+ node.parent = null;
+
+ this.relationChecker.storeGlobalDeclarations(node);
+
+ queue.push(node);
+ processQueue();
+ }
+};
+
+/**
+ * set walk tree cancelled bool as true.
+ * the walk tree method won't run after the variable
+ * is set to true.
+ */
+JsChecker.prototype.cancelWalkTree = function() {
+ // prevent any further work on node codes.
+ this.walkTreeCancelled = true;
+};
+
+/**
+ * walkTreeComplete
+ *
+ * Trigger when the walkTree has been completed or
+ * when it has been cut short.
+ *
+ */
+JsChecker.prototype.walkTreeComplete = function(result) {
+ var that = this;
+ this.removeNotification();
+
+ if (this.walkTreeCancelled) {
+ // we already triggered complete.
+ return;
+ }
+
+ // we set the token to cancel further processing.
+ this.cancelWalkTree();
+
+ if (result != undefined) {
+ // walkTree was returned faster, use it instead.
+ this.getCheckerResult(result);
+
+ // we are done.
+ return;
+ }
+
+ // if all code was fully analyzed.
+ if (this.nontrivialness.type === checkTypes.NONTRIVIAL) {
+ this.getCheckerResult(this.nontrivialness);
+ } else if (this.freeToken.type === checkTypes.FREE) {
+ // this is free and may or may not define functions, we don't care.
+ this.getCheckerResult(this.freeToken);
+ } else if (this.nontrivialness.type ===
+ checkTypes.TRIVIAL_DEFINES_FUNCTION) {
+ // trivial scripts should become nontrivial if an external script.
+ // it may or may not be trivial if inline.
+ this.getCheckerResult(this.nontrivialness);
+ } else {
+ // found no nontrivial constructs or free license, so it's
+ // trivial.
+
+ this.getCheckerResult(
+ types.trivialFuncWithComment("This script is trivial"));
+ }
+};
+
+
+/**
+ * checkNode
+ *
+ * checks a single node.
+ *
+ */
+JsChecker.prototype.checkNode = function(n) {
+ var sub;
+ var fc = this.freeCheck(n);
+ var tc = this.trivialCheck(n);
+
+ var nodeResult;
+
+ // check if identifier may be window property (assumption).
+ this.relationChecker.checkIdentifierIsWindowProperty(n);
+
+ /*if (fc) {
+ console.debug("FC is", fc, "type is", fc.type);
+ }*/
+ if (fc && fc.type == checkTypes.FREE) {
+ // this is free!
+ // freeToken is persistent across nodes analyzed and valid
+ // for an entire script.
+ this.freeToken = types.freeWithComment(
+ "Script appears to be free under the following license: " +
+ fc.licenseName);
+ return;
+ }
+ else if (fc && fc.type == checkTypes.FREE_SINGLE_ITEM) {
+ console.debug("free single item");
+ this.freeToken = types.singleFreeWithComment(
+ "Script appears to be free under the following license: " +
+ fc.licenseName);
+ return;
+ }
+
+ if (tc) {
+ if (tc.type === checkTypes.NONTRIVIAL) {
+ // nontrivial_global is deprecated
+ this.nontrivialness = tc;
+ return;
+ }
+
+ else if (tc.type === checkTypes.TRIVIAL_DEFINES_FUNCTION) {
+ this.nontrivialness = tc;
+ return;
+ }
+ }
+};
+
+JsChecker.prototype.removeNotification = function() {
+ if (this.notification && this.notification.close) {
+ console.debug("removing", this.shortText);
+ // remove notification early on.
+ this.notification.close();
+ this.notification = null;
+ }
+};
+
+// create an instance of JsChecker
+exports.jsChecker = function() {
+ return new JsChecker();
+};
+
+exports.removeHashCallback = removeHashCallback;
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/license_definitions.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/license_definitions.js
new file mode 100644
index 0000000..36711fd
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/license_definitions.js
@@ -0,0 +1,196 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+exports.types = {
+ SHORT: 'short',
+ LAZY: 'lazy',
+ FULL: 'full'
+};
+
+var type = exports.types;
+
+/**
+ * List of all the licenses.
+ * Currently only short substrings are used with regex.
+ */
+exports.licenses = {
+ CC0: {
+ licenseName: 'Creative Commons CC0 1.0 Universal',
+ canonicalUrl: ['http://creativecommons.org/publicdomain/zero/1.0/legalcode',
+ 'magnet:?xt=urn:btih:90dc5c0be029de84e523b9b3922520e79e0e6f08&dn=cc0.txt'],
+ identifier: 'CC0-1.0',
+ licenseFragments: []
+ },
+
+
+ gplv2: {
+ licenseName: 'GNU General Public License (GPL) version 2',
+ canonicalUrl: ['http://www.gnu.org/licenses/gpl-2.0.html',
+ 'magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt'],
+ identifier: 'GNU-GPL-2.0',
+ licenseFragments: [{text: "<THISPROGRAM> is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.", type: type.SHORT},
+ {text:"Alternatively, the contents of this file may be used under the terms of either the GNU General Public License Version 2 or later (the \"GPL\"), or the GNU Lesser General Public License Version 2.1 or later (the \"LGPL\"), in which case the provisions of the GPL or the LGPL are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of either the GPL or the LGPL, and not to allow others to use your version of this file under the terms of the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL or the LGPL. If you do not delete the provisions above, a recipient may use your version of this file under the terms of any one of the MPL, the GPL or the LGPL.", type: type.SHORT}]
+ },
+
+ gplv3: {
+ licenseName: 'GNU General Public License (GPL) version 3',
+ canonicalUrl: ['http://www.gnu.org/licenses/gpl-3.0.html',
+ 'magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt'],
+ identifier: 'GNU-GPL-3.0',
+ licenseFragments: [
+ {text: "The JavaScript code in this page is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License (GNU GPL) as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The code is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. As additional permission under GNU GPL version 3 section 7, you may distribute non-source (e.g., minimized or compacted) forms of that code without the copy of the GNU GPL normally required by section 4, provided you include this license notice and a URL through which recipients can access the Corresponding Source.", type: type.SHORT},
+ {text: "<THISPROGRAM> is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.", type: type.SHORT}]
+ },
+
+ gnuAllPermissive: {
+ licenseName: 'GNU All-Permissive License',
+ licenseFragments: [{text: "Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without any warranty.", type: type.SHORT}]
+ },
+
+ apache_2License: {
+ licenseName: 'Apache License, Version 2.0',
+ canonicalUrl: ['http://www.apache.org/licenses/LICENSE-2.0',
+ 'magnet:?xt=urn:btih:8e4f440f4c65981c5bf93c76d35135ba5064d8b7&dn=apache-2.0.txt'],
+ identifier: 'Apache-2.0',
+ licenseFragments: [{text: "Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0", type: type.SHORT}]
+ },
+
+ lgpl21: {
+ licenseName: 'GNU Lesser General Public License, version 2.1',
+ canonicalUrl: ['http://www.gnu.org/licenses/lgpl-2.1.html',
+ 'magnet:?xt=urn:btih:5de60da917303dbfad4f93fb1b985ced5a89eac2&dn=lgpl-2.1.txt'],
+ identifier: 'GNU-LGPL-2.1',
+ licenseFragments: [{text: "<THISLIBRARY> is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.", type: type.SHORT}]
+ },
+
+ lgplv3: {
+ licenseName: 'GNU Lesser General Public License, version 3',
+ canonicalUrl: ['http://www.gnu.org/licenses/lgpl-3.0.html',
+ 'magnet:?xt=urn:btih:0ef1b8170b3b615170ff270def6427c317705f85&dn=lgpl-3.0.txt'],
+ identifier: 'GNU-LGPL-3.0',
+ licenseFragments: [{text: "<THISPROGRAM> is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.", type: type.SHORT}]
+ },
+
+ agplv3: {
+ licenseName: 'GNU AFFERO GENERAL PUBLIC LICENSE version 3',
+ canonicalUrl: ['http://www.gnu.org/licenses/agpl-3.0.html',
+ 'magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt'],
+ identifier: 'GNU-AGPL-3.0',
+ licenseFragments: [{text: "<THISPROGRAM> is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.", type: type.SHORT}]
+ },
+
+ boostSoftware: {
+ licenseName: 'Boost Software License',
+ canonicalUrl: ["magnet:?xt=urn:btih:89a97c535628232f2f3888c2b7b8ffd4c078cec0&dn=Boost-1.0.txt"],
+ licenseFragments: [{text: "Boost Software License <VERSION> <DATE> Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the \"Software\") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following", type: type.SHORT}]
+ },
+
+ bsd3: {
+ licenseName: "The BSD 3-Clause License",
+ canonicalUrl: ["magnet:?xt=urn:btih:c80d50af7d3db9be66a4d0a86db0286e4fd33292&dn=bsd-3-clause.txt"],
+ licenseFragments: [{text: "Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.", type: type.SHORT}]
+ },
+
+ bsd2: {
+ licenseName: "The BSD 2-Clause License",
+ licenseFragments: [{text: "Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.", type: type.SHORT}]
+ },
+
+ mozillaPublicLicense_2_0: {
+ licenseName: 'Mozilla Public License Version 2.0',
+ identifier: 'MPL-2.0',
+ canonicalUrl: ['http://www.mozilla.org/MPL/2.0',
+ 'magnet:?xt=urn:btih:3877d6d54b3accd4bc32f8a48bf32ebc0901502a&dn=mpl-2.0.txt'],
+ licenseFragments: [{text: "This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.", type: type.SHORT }]
+ },
+
+ expat: {
+ licenseName: 'Expat License (sometimes called MIT Licensed)',
+ identifier: 'Expat',
+ canonicalUrl: ['http://www.jclark.com/xml/copying.txt',
+ 'magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt'],
+ licenseFragments: [{text: "Copyright <YEAR> <NAME> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", type: type.SHORT}]
+ },
+
+ X11: {
+ licenseName: 'X11 License',
+ canonicalUrl: ['magnet:?xt=urn:btih:5305d91886084f776adcf57509a648432709a7c7&dn=x11.txt'],
+ licenseFragments: [{text: "Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.", type: type.SHORT}]
+ },
+
+ XFree86: {
+ licenseName: "XFree86 License",
+ identifier: 'Modified-BSD',
+ canonicalUrl: ['http://www.xfree86.org/3.3.6/COPYRIGHT2.html#3', 'http://www.xfree86.org/current/LICENSE4.html', 'magnet:?xt=urn:btih:12f2ec9e8de2a3b0002a33d518d6010cc8ab2ae9&dn=xfree86.txt'],
+ licenseFragments: [{text: "All rights reserved.\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer.\n2. 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, and in the same place and form as other copyright, license and disclaimer information.\n3. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: \"This product includes software developed by The XFree86 Project, Inc (http://www.xfree86.org/) and its contributors\", in the same place and form as other third-party acknowledgments. Alternately, this acknowledgment may appear in the software itself, in the same form and location as other such third-party acknowledgments.4. Except as contained in this notice, the name of The XFree86 Project, Inc shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The XFree86 Project, Inc.", type: type.SHORT}
+ ]
+ },
+
+ FreeBSD: {
+ licenseName: "FreeBSD License",
+ canonicalUrl: ['http://www.freebsd.org/copyright/freebsd-license.html',
+ 'magnet:?xt=urn:btih:87f119ba0b429ba17a44b4bffcab33165ebdacc0&dn=freebsd.txt'],
+ licenseFragments: [{text: "Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\nRedistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\nRedistributions 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.", type: type.SHORT}]
+ },
+
+ ISC: {
+ licenseName: "The ISC License",
+ canonicalUrl: ['https://www.isc.org/downloads/software-support-policy/isc-license/',
+ 'magnet:?xt=urn:btih:b8999bbaf509c08d127678643c515b9ab0836bae&dn=ISC.txt'],
+ licenseFragments: [{text: "Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.", type: type.SHORT},
+ {text: "Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.", type: type.SHORT}]
+ },
+
+ jQueryTools: {
+ licenseName: "jQuery Tools",
+ licenseFragments: [{text: 'NO COPYRIGHTS OR LICENSES. DO WHAT YOU LIKE.', type: type.SHORT}]
+ },
+
+ ArtisticLicense2: {
+ licenseName: "Artistic License 2.0",
+ canonicalUrl: ["http://www.perlfoundation.org/artistic_license_2_0",
+ "magnet:?xt=urn:btih:54fd2283f9dbdf29466d2df1a98bf8f65cafe314&dn=artistic-2.0.txt"],
+ licenseFragments: []
+ },
+
+ PublicDomain: {
+ licenseName: "Public Domain",
+ canonicalUrl: ['magnet:?xt=urn:btih:e95b018ef3580986a04669f1b5879592219e2a7a&dn=public-domain.txt'],
+ licenseFragments: []
+ },
+
+ CPALv1: {
+ licenseName: 'Common Public Attribution License Version 1.0 (CPAL)',
+ canonicalUrl: [
+ 'http://opensource.org/licenses/cpal_1.0',
+ 'magnet:?xt=urn:btih:84143bc45939fc8fa42921d619a95462c2031c5c&dn=cpal-1.0.txt'
+ ],
+ identifier: 'CPAL-1.0',
+ licenseFragments: [
+ {
+ text: 'The contents of this file are subject to the Common Public Attribution License Version 1.0',
+ type: type.SHORT
+ },
+ {
+ text: 'The term "External Deployment" means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2.',
+ type: type.SHORT
+ }
+ ]
+ }
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/nontrivial_checker.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/nontrivial_checker.js
new file mode 100644
index 0000000..0f7332a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/nontrivial_checker.js
@@ -0,0 +1,389 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+const types = require("js_checker/constant_types");
+
+// constants from Narcissus for function types.
+const DECLARED_FORM = 0, EXPRESSED_FORM = 1, STATEMENT_FORM = 2;
+
+const token = types.token;
+
+var checkTypes = types.checkTypes;
+
+var utils = {
+
+ /**
+ * nodeContains
+ * Checks that node contains both a type and a value.
+ * Shortcut to check for null/undefined.
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if matching.
+ */
+ nodeContains: function (n, type, value) {
+ if (n != undefined) {
+ return n.type === type &&
+ n.value === value;
+ }
+ },
+
+
+ /**
+ * isType
+ * Checks that node is of a certain type.
+ * Shortcut to check for null/undefined.
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean}. True if it's the right type.
+ */
+ isType: function (n, type) {
+ return n != undefined && n.type === type;
+ },
+
+ isNotType: function (n, type) {
+ return n != undefined && n.type !== type;
+ },
+
+
+ /**
+ * hasChildren
+ *
+ * Checks the token on the left
+ * and on the right.
+ *
+ * @param {object} n. The current node being studied.
+ * @param {leftType} token constant. The type on the
+ * left.
+ * @param {rightType} token constant. The type of child
+ * on the right
+ *
+ */
+ hasChildren: function (n, leftType, rightType) {
+ if (types == undefined) {
+ return false;
+ }
+ return this.isType(n.children[0], leftType) &&
+ this.isType(n.children[1], rightType);
+ },
+
+
+ /**
+ * findScriptTag
+ *
+ * This method should probably be replaced with DOM testing
+ * as regex is rather insufficiant, and this wouldn't cover
+ * tricky constructs as shown in http://ha.ckers.org/xss.html.
+ */
+ findScriptTag: function (n) {
+ return n.value != undefined &&
+ /<script[^>]*?>/i.test(n.value);
+ }
+
+};
+
+var nonTrivialChecker = {
+
+ definesFunction: false,
+ hash: null,
+ /**
+ * definesFunctionFound
+ *
+ * Returns true if it finds a node of type FUNCTION
+ * that isn't a callback or an IIFE.
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if found.
+ */
+ definesFunctionFound: function (n) {
+ var isFunction = false;
+ if (n.type === token.FUNCTION &&
+ n.body != undefined) {
+
+ if (n.functionForm !== token.DECLARED_FORM &&
+ ((n.parent.type === token.LIST &&
+ n.parent.parent.type === token.CALL) ||
+ n.parent.type === token.CALL) &&
+ n.name == undefined) {
+ // this is a callback or an immediately
+ // invoked function expression "IIFE".
+ isFunction = false;
+ } else {
+ // this is a regular function declaration or
+ // function expression assigned to a variable.
+ //console.log("THIS DEFINES FUNCTION");
+ isFunction = true;
+ }
+
+ }
+
+ // look for Function constructor.
+ if (n.type === token.IDENTIFIER &&
+ n.value === 'Function' &&
+ (n.parent.type === token.NEW_WITH_ARGS ||
+ n.parent.type === token.CALL)) {
+ // this is a Function constructor.
+ //console.log("THIS DEFINES FUNCTION");
+ isFunction = true;
+ }
+
+ return isFunction;
+ },
+
+
+ /**
+ * invokesEval
+ *
+ * Returns true (nontrivial) if it finds any use of
+ * the eval function. For simplicity, we assume any
+ * use of an identifier "eval" is the eval function.
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if found.
+ */
+ invokesEval: function (n) {
+ return (n.type === token.CALL &&
+ utils.nodeContains(n.children[0], token.IDENTIFIER, 'eval') ||
+ n.type === token.IDENTIFIER && n.value === 'eval');
+ },
+
+ /**
+ * evalIdentifier
+ *
+ * Returns true (nontrivial) if it finds any use of
+ * the eval function. For simplicity, we assume any
+ * use of an identifier "eval" is the eval function.
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if found.
+ */
+ evalIdentifier: function (n) {
+ return n.type === token.IDENTIFIER &&
+ n.value === 'eval';
+ },
+
+
+ /**
+ * invokesMethodBracketSuffix
+ *
+ * Finds a method being invoked using the bracket suffix notation
+ * rather than the dot notation. It is difficult without keeping track of
+ * variable values to check for what method is actually being called.
+ * So we're just flagging any use of this construct as nontrivial.
+ * e.g., should catch: xhr[a+b]('GET', 'http://www.example.com');
+ * Should not catch other uses such as: myArray[num];
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if found.
+ */
+ invokesMethodBracketSuffix: function (n) {
+ return n.type === token.CALL && utils.isType(n.children[0], token.INDEX);
+ },
+
+
+ /**
+ * createsXhrObject
+ *
+ * Creates an xhr object.
+ * Since all "new XMLHttpRequest", "XMLHttpRequest()",
+ * and "new window.XMLHttpRequest" instantiate the xhr object,
+ * we assume (without further proof) that any use
+ * of the identifier "XMLHttpRequest" and "ActiveXObject"
+ * is an xhr object.
+ * Constructs like window[a+b]() are already caught by the
+ * bracket suffix check.
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if found.
+ */
+ createsXhrObject: function (n) {
+ return (n.type === token.IDENTIFIER) &&
+ (n.value === 'XMLHttpRequest' ||
+ n.value === 'ActiveXObject');
+ },
+
+
+ /**
+ * invokesXhrOpen
+ *
+ * Here we assume the call of an open method must be an xhr request
+ * (and not some other object) by checking the number of arguments.
+ * In most cases this method won't be used since createsXhrObject
+ * will already have caught the xhr.
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if found.
+ *
+ */
+ invokesXhrOpen: function (n) {
+ return n.type === token.CALL &&
+ utils.hasChildren(n, token.DOT, token.LIST) &&
+ utils.isType(n.children[0].children[0], token.IDENTIFIER) &&
+ utils.nodeContains(n.children[0].children[1], token.IDENTIFIER, 'open') &&
+ n.children[1].children.length > 1;
+ },
+
+
+ /**
+ * createsScriptElement
+ *
+ * Checks for document.createElement() that create a script. In the case
+ * it creates an element from a variable, we assume it's a script. In the
+ * future we might want to check for the value of that string variable
+ * (e.g., if a variable is assigned 'script', raise a flag)
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if found.
+ *
+ *
+ */
+ createsScriptElement: function (n) {
+ return n.type === token.CALL &&
+ utils.hasChildren(n, token.DOT, token.LIST) &&
+ utils.isType(n.children[0].children[0], token.IDENTIFIER) &&
+ utils.nodeContains(n.children[0].children[1], token.IDENTIFIER, 'createElement') &&
+ (utils.nodeContains(n.children[1].children[0], token.STRING, 'script') ||
+ utils.isType(n.children[1].children[0], token.IDENTIFIER));
+ },
+
+
+ /**
+ * writesScriptAsHtmlString
+ *
+ * catches myObj.write('<script></script>');
+ * or any myObj.write(myStringVariable);
+ * or concatenation such as:
+ * myObj.write('<scri' + stringVariable);
+ * or 'something' + 'somethingelse'.
+ *
+ * To check for javascript here we might want to look at the list
+ * from ha.ckers.org/xss.html for the future.
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if found.
+ *
+ */
+ writesScriptAsHtmlString: function (n) {
+ var listArg;
+
+ if (n.type === token.CALL &&
+ utils.hasChildren(n, token.DOT, token.LIST) &&
+ utils.isType(n.children[0].children[0], token.IDENTIFIER) &&
+ utils.nodeContains(n.children[0].children[1], token.IDENTIFIER, 'write')) {
+
+ if (utils.isNotType(n.children[1].children[0], token.STRING)) {
+ // return true if any operation or concatenation.
+ // We are cautious (as it could
+ // embed a script) and flag this as nontrivial.
+
+ return true;
+ }
+ return utils.findScriptTag(n.children[1].children[0]);
+ } else {
+ return false;
+ }
+ },
+
+ /**
+ * nontrivial anytime we see an identifier as innerHTML
+ */
+ innerHTMLIdentifier: function (n) {
+ if ((n.type === token.IDENTIFIER ||
+ n.type === token.STRING) &&
+ n.value === 'innerHTML') {
+ return true;
+ }
+ },
+
+
+ /**
+ * checkNontrivial
+ *
+ * Contains all the conditionals that try to identify,
+ * step by step, all code that could be flagged as
+ * nontrivial.
+ *
+ * @param {object} n. The current node being studied.
+ * @return {boolean} . True if found.
+ *
+ */
+ checkNontrivial: function (n, t) {
+
+ if (n.type === token.IDENTIFIER && this.evalIdentifier(n)) {
+ //console.log("NONTRIVIAL: eval has been found in code");
+ return types.nontrivialWithComment("NONTRIVIAL: eval has been found in code");
+ }
+
+ if (this.innerHTMLIdentifier(n)) {
+ //console.log("NONTRIVIAL: innerHTML identifier");
+ return types.nontrivialWithComment("NONTRIVIAL: innerHTML identifier");
+ }
+
+ // the node is an identifier
+ if (n.type === token.IDENTIFIER && this.createsXhrObject(n)) {
+ //console.log('NONTRIVIAL: Creates an xhr object');
+ return types.nontrivialWithComment('NONTRIVIAL: Creates an xhr object');
+ }
+
+ // this is a method/function call
+ if (n.type === token.CALL) {
+
+ if (this.invokesEval(n)) {
+ //console.log("NONTRIVIAL: eval has been found in code");
+ return types.nontrivialWithComment("NONTRIVIAL: eval has been found in code");
+ }
+
+ if (this.invokesMethodBracketSuffix(n)) {
+ //console.log('NONTRIVIAL: square bracket suffix method call detected');
+ return types.nontrivialWithComment("NONTRIVIAL: eval has been found in code");
+ }
+
+ if (this.invokesXhrOpen(n)) {
+ //console.log('NONTRIVIAL: an open method similar to xhr.open is used');
+ return types.nontrivialWithComment('NONTRIVIAL: square bracket suffix method call detected');
+ }
+
+ if (this.createsScriptElement(n)) {
+ //console.log('NONTRIVIAL: creates script element dynamically.');
+ return types.nontrivialWithComment('NONTRIVIAL: an open method similar to xhr.open is used');
+ }
+
+ if (this.writesScriptAsHtmlString(n)) {
+ //console.log('NONTRIVIAL: writes script as html dynamically.');
+ return types.nontrivialWithComment('NONTRIVIAL: creates script element dynamically.');
+ }
+ }
+
+ // The node is a function definition.
+ // Most common occurence.
+ if (this.definesFunctionFound(n)) {
+ return types.trivialFuncWithComment("Script is trivial but defines one or more functions");
+ }
+
+ // found nothing else, so trivial.
+ return types.trivialWithComment("Script is trivial");
+
+ }
+};
+
+exports.nonTrivialChecker = function () {
+
+ var checker = Object.create(nonTrivialChecker);
+
+ return checker;
+}; \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/pattern_utils.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/pattern_utils.js
new file mode 100644
index 0000000..10874fc
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/pattern_utils.js
@@ -0,0 +1,40 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+exports.patternUtils = {
+ /**
+ * removeNonalpha
+ *
+ * Remove all nonalphanumeric values, except for
+ * < and >, since they are what we use for tokens.
+ *
+ */
+ removeNonalpha: function (str) {
+ var regex = /[^a-z0-9<>@]+/gi;
+ return str.replace(regex, '');
+ },
+ removeWhitespace: function (str) {
+ return str.replace(/[ \t\r\n]+/gmi,"");
+ },
+ replaceTokens: function (str) {
+ var regex = /<.*?>/gi;
+ return str.replace(regex, '.*?');
+ }
+}; \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/privacy_checker.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/privacy_checker.js
new file mode 100644
index 0000000..b5dad1b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/privacy_checker.js
@@ -0,0 +1,48 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var privacyThreatJs = require('js_checker/privacy_threat_definitions.js');
+var patternUtils = require('js_checker/pattern_utils').patternUtils;
+
+exports.privacyCheck = {
+
+ checkScriptPrivacyThreat: function (currentScript) {
+ var list = privacyThreatJs.js,
+ i,
+ jsRegexp,
+ match,
+ max,
+ check;
+
+ currentScript = patternUtils.removeWhitespace(currentScript);
+
+ for (var item in list) {
+ max = list[item].length;
+
+ for (i = 0; i < max; i++) {
+ if (list[item][i].test(currentScript)) {
+ return true;
+ }
+ }
+
+ }
+ }
+
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/privacy_threat_definitions.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/privacy_threat_definitions.js
new file mode 100644
index 0000000..ea6d279
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/privacy_threat_definitions.js
@@ -0,0 +1,40 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+exports.js = {
+ /**
+ * googleAnalytics
+ * Tracking code for Google Analytics.
+ * It corresponds to:
+ * var _gaq = _gaq || [];
+ * _gaq.push(['_setAccount', 'UA-XXXXXXX-X']);
+ * _gaq.push(['_trackPageview']);
+ *
+ * (function() {
+ * var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ * ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ * var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ * })();
+ *
+ */
+ googleAnalytics: [/var_gaq=_gaq\|\|\[\];_gaq\.push\(\['_setAccount','UA[0-9\-]*?'\]\);(_gaq.push\(\['_setDomainName','[a-z\.]*?'\]\);)?_gaq\.push\(\['_trackPageview'\]\);\(function\(\){varga=document\.createElement\('script'\);ga\.type='text\/javascript\';ga\.async=true;ga\.src=\(\'https:\'==document\.location\.protocol\?'https:\/\/ssl':'http:\/\/www'\)\+'\.google\-analytics\.com\/ga\.js';vars=document\.getElementsByTagName\('script'\)\[0\];s\.parentNode\.insertBefore\(ga,s\);}\)\(\);/ig,
+ /vargaJsHost\=\(\(\"https\:\"\=\=document\.location\.protocol\)\?\"https\:\/\/ssl\.\"\:\"http\:\/\/www\.\"\)\;document\.write\(unescape\(\"\%3Cscriptsrc\=\'\"\+gaJsHost\+\"google\-analytics\.com\/ga\.js\'type\=\'text\/javascript\'\%3E\%3C\/script\%3E\"\)\)\;/ig,
+ /try{varpageTracker\=\_gat\.\_getTracker\(\"UA[0-9\-]*?\"\)\;pageTracker\.\_trackPageview\(\)\;}catch\(err\){}/ig]
+}; \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/relation_checker.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/relation_checker.js
new file mode 100644
index 0000000..1904812
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/js_checker/relation_checker.js
@@ -0,0 +1,289 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+/**
+ * relation_checker.js
+ *
+ * Finds out if two scripts are related to each other.
+ *
+ */
+const types = require("js_checker/constant_types");
+
+const token = types.token;
+
+// all predefined window properties (methods and variables).
+const windowPropertiesHash = {
+ "addEventListener": 1, "alert": 1, "applicationCache": 1,
+ "Array": 1, "ArrayBuffer": 1, "atob": 1, "back": 1, "blur": 1,
+ "Boolean": 1, "btoa": 1, "captureEvents": 1, "CharacterData": 1,
+ "clearInterval": 1, "clearTimeout": 1, "close": 1, "closed": 1,
+ "Components": 1, "confirm": 1, "console": 1, "constructor": 1,
+ "content": 1, "controllers": 1, "crypto": 1,
+ "CSSStyleDeclaration": 1, "Date": 1, "decodeURI": 1,
+ "decodeURIComponent": 1, "defaultStatus": 1,
+ "disableExternalCapture": 1, "dispatchEvent": 1, "Document": 1,
+ "document": 1, "DocumentType": 1, "dump": 1, "Element": 1,
+ "enableExternalCapture": 1, "encodeURI": 1, "encodeURIComponent": 1,
+ "Error": 1, "escape": 1, "eval": 1, "EvalError": 1, "Event": 1,
+ "find": 1, "Float32Array": 1, "Float64Array": 1, "focus": 1,
+ "forward": 1, "frameElement": 1, "frames": 1, "fullScreen": 1,
+ "Function": 1, "Generator": 1, "getComputedStyle": 1,
+ "getInterface": 1, "getSelection": 1, "globalStorage": 1,
+ "history": 1, "home": 1, "HTMLBodyElement": 1, "HTMLCollection": 1,
+ "HTMLDivElement": 1, "HTMLDocument": 1, "HTMLElement": 1,
+ "HTMLHeadElement": 1, "HTMLHeadingElement": 1, "HTMLHtmlElement": 1,
+ "HTMLStyleElement": 1, "HTMLUnknownElement": 1, "Infinity": 1,
+ "innerHeight": 1, "innerWidth": 1, "InstallTrigger": 1,
+ "Int16Array": 1, "Int32Array": 1, "Int8Array": 1, "InternalError": 1,
+ "isFinite": 1, "isNaN": 1, "isXMLName": 1, "Iterator": 1,
+ "JSON": 1, "length": 1, "localStorage": 1, "Location": 1,
+ "location": 1, "locationbar": 1, "matchMedia": 1, "Math": 1,
+ "menubar": 1, "moveBy": 1, "moveTo": 1, "mozAnimationStartTime": 1,
+ "mozIndexedDB": 1, "mozInnerScreenX": 1, "mozInnerScreenY": 1,
+ "mozPaintCount": 1, "mozRequestAnimationFrame": 1, "name": 1,
+ "Namespace": 1, "NaN": 1, "navigator": 1, "netscape": 1,
+ "Node": 1, "NodeList": 1, "Number": 1, "Object": 1, "open": 1,
+ "openDialog": 1, "opener": 1, "outerHeight": 1, "outerWidth": 1,
+ "pageXOffset": 1, "pageYOffset": 1, "parent": 1, "parseFloat": 1,
+ "parseInt": 1, "performance": 1, "personalbar": 1, "pkcs11": 1,
+ "postMessage": 1, "print": 1, "prompt": 1, "QName": 1,
+ "RangeError": 1, "ReferenceError": 1, "RegExp": 1,
+ "releaseEvents": 1, "removeEventListener": 1, "resizeBy": 1,
+ "resizeTo": 1, "routeEvent": 1, "screen": 1, "screenX": 1,
+ "screenY": 1, "scroll": 1, "scrollbars": 1, "scrollBy": 1,
+ "scrollByLines": 1, "scrollByPages": 1, "scrollMaxX": 1,
+ "scrollMaxY": 1, "scrollTo": 1, "scrollX": 1, "scrollY": 1,
+ "self": 1, "sessionStorage": 1, "setInterval": 1, "setResizable": 1,
+ "setTimeout": 1, "showModalDialog": 1, "sizeToContent": 1,
+ "status": 1, "statusbar": 1, "stop": 1, "StopIteration": 1,
+ "StorageList": 1, "String": 1, "SyntaxError": 1, "Text": 1,
+ "toolbar": 1, "top": 1, "TypeError": 1, "Uint16Array": 1,
+ "Uint32Array": 1, "Uint8Array": 1, "Uint8ClampedArray": 1,
+ "undefined": 1, "unescape": 1, "uneval": 1, "updateCommands": 1,
+ "URIError": 1, "URL": 1, "WeakMap": 1, "Window": 1, "window": 1,
+ "XML": 1, "XMLList": 1, "XPCNativeWrapper": 1};
+
+// all predefined document properties.
+const documentPropertiesHash = {'activeElement': 1, 'addBinding': 1,
+ 'addEventListener': 1, 'adoptNode': 1, 'alinkColor': 1, 'anchors': 1,
+ 'appendChild': 1, 'applets': 1, 'ATTRIBUTE_NODE': 1, 'attributes': 1,
+ 'baseURI': 1, 'bgColor': 1, 'body': 1, 'captureEvents': 1,
+ 'CDATA_SECTION_NODE': 1, 'characterSet': 1, 'childNodes': 1, 'clear':
+ 1, 'cloneNode': 1, 'close': 1, 'COMMENT_NODE': 1,
+ 'compareDocumentPosition': 1, 'compatMode': 1, 'contentType': 1,
+ 'cookie': 1, 'createAttribute': 1, 'createAttributeNS': 1,
+ 'createCDATASection': 1, 'createComment': 1, 'createDocumentFragment':
+ 1, 'createElement': 1, 'createElementNS': 1, 'createEvent': 1,
+ 'createExpression': 1, 'createNodeIterator': 1, 'createNSResolver': 1,
+ 'createProcessingInstruction': 1, 'createRange': 1, 'createTextNode':
+ 1, 'createTreeWalker': 1, 'currentScript': 1, 'defaultView': 1,
+ 'designMode': 1, 'dir': 1, 'dispatchEvent': 1, 'doctype': 1,
+ 'DOCUMENT_FRAGMENT_NODE': 1, 'DOCUMENT_NODE': 1,
+ 'DOCUMENT_POSITION_CONTAINED_BY': 1, 'DOCUMENT_POSITION_CONTAINS': 1,
+ 'DOCUMENT_POSITION_DISCONNECTED': 1, 'DOCUMENT_POSITION_FOLLOWING': 1,
+ 'DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC': 1,
+ 'DOCUMENT_POSITION_PRECEDING': 1, 'DOCUMENT_TYPE_NODE': 1,
+ 'documentElement': 1, 'documentURI': 1, 'domain': 1, 'ELEMENT_NODE':
+ 1, 'elementFromPoint': 1, 'embeds': 1, 'enableStyleSheetsForSet': 1,
+ 'ENTITY_NODE': 1, 'ENTITY_REFERENCE_NODE': 1, 'evaluate': 1,
+ 'execCommand': 1, 'execCommandShowHelp': 1, 'fgColor': 1,
+ 'firstChild': 1, 'forms': 1, 'getAnonymousElementByAttribute': 1,
+ 'getAnonymousNodes': 1, 'getBindingParent': 1, 'getElementById': 1,
+ 'getElementsByClassName': 1, 'getElementsByName': 1,
+ 'getElementsByTagName': 1, 'getElementsByTagNameNS': 1,
+ 'getSelection': 1, 'getUserData': 1, 'hasAttributes': 1,
+ 'hasChildNodes': 1, 'hasFocus': 1, 'head': 1, 'images': 1,
+ 'implementation': 1, 'importNode': 1, 'inputEncoding': 1,
+ 'insertBefore': 1, 'isDefaultNamespace': 1, 'isEqualNode': 1,
+ 'isSameNode': 1, 'isSupported': 1, 'lastChild': 1, 'lastModified': 1,
+ 'lastStyleSheetSet': 1, 'linkColor': 1, 'links': 1,
+ 'loadBindingDocument': 1, 'localName': 1, 'location': 1,
+ 'lookupNamespaceURI': 1, 'lookupPrefix': 1, 'mozSetImageElement': 1,
+ 'mozSyntheticDocument': 1, 'namespaceURI': 1, 'nextSibling': 1,
+ 'nodeName': 1, 'nodeType': 1, 'nodeValue': 1, 'normalize': 1,
+ 'NOTATION_NODE': 1, 'open': 1, 'ownerDocument': 1, 'parentNode': 1,
+ 'plugins': 1, 'preferredStyleSheetSet': 1, 'prefix': 1,
+ 'previousSibling': 1, 'PROCESSING_INSTRUCTION_NODE': 1,
+ 'queryCommandEnabled': 1, 'queryCommandIndeterm': 1,
+ 'queryCommandState': 1, 'queryCommandSupported': 1,
+ 'queryCommandText': 1, 'queryCommandValue': 1, 'querySelector': 1,
+ 'querySelectorAll': 1, 'readyState': 1, 'referrer': 1,
+ 'releaseCapture': 1, 'releaseEvents': 1, 'removeBinding': 1,
+ 'removeChild': 1, 'removeEventListener': 1, 'replaceChild': 1,
+ 'routeEvent': 1, 'selectedStyleSheetSet': 1, 'setUserData': 1,
+ 'styleSheets': 1, 'styleSheetSets': 1, 'TEXT_NODE': 1, 'textContent':
+ 1, 'title': 1, 'URL': 1, 'vlinkColor': 1, 'write': 1, 'writeln': 1,
+ 'xmlEncoding': 1, 'xmlStandalone': 1, 'xmlVersion': 1};
+
+var relationChecker = {
+
+ // identifies scripts across modules.
+ scriptId: null,
+
+ // stores all left-side identifier in 'assign' types.
+ assignments: null,
+
+ // stores var declarations in global scope.
+ variableDeclarations: null,
+
+ // stores top declarations in global scope.
+ functionDeclarations: null,
+
+ nonWindowProperties: null,
+
+ init: function (scriptId) {
+ this.scriptId = scriptId;
+ this.assignments = [];
+ this.variableDeclarations = {};
+ this.functionDeclarations = {};
+ this.nonWindowProperties = {};
+ },
+
+ isWindowProperty: function (identifier) {
+ return (identifier in windowPropertiesHash) ? true : false;
+ },
+
+ isDocumentProperty: function (identifier) {
+ return (identifier in documentPropertiesHash) ? true : false;
+ },
+
+ storeNodeVars: function (n) {
+ if (n.varDecls != undefined) {
+ var i = 0, le = n.varDecls.length;
+ for (; i < le; i++) {
+ this.variableDeclarations[n.varDecls[i].value] = 1;
+ }
+ }
+ },
+
+ storeNodeFunctions: function (n) {
+ if (n.funDecls != undefined) {
+ var i = 0, le = n.funDecls.length;
+ for (; i < le; i++) {
+ this.functionDeclarations[n.funDecls[i].name] = 1;
+ }
+ }
+ },
+ storeGlobalDeclarations: function (topNode) {
+ this.storeNodeVars(topNode);
+ this.storeNodeFunctions(topNode);
+ },
+ storeNodeGlobalDeclarations: function (n) {
+ if (n.global === true) {
+ this.storeNodeVars(n);
+ this.storeNodeFunctions(n);
+ }
+ },
+
+ storeNodeAssignments: function (n) {
+ if (n.type === token.ASSIGN &&
+ n.children != undefined &&
+ n.children[0].type === token.IDENTIFIER) {
+ this.assignments.push(n.children[0].value);
+ }
+ },
+
+ // checks the parent script is in global scope.
+ isInGlobalScope: function (n) {
+ var currentNode = n;
+
+ while (currentNode != undefined) {
+ if (currentNode.type === token.SCRIPT &&
+ currentNode.global === true) {
+ return true;
+ } else if (currentNode.type === token.SCRIPT) {
+ return false;
+ }
+ currentNode = currentNode.parent;
+ }
+ },
+
+ // looks for an identifier being declared as either a
+ // variable or a function within the scope. Currently,
+ // we don't care about assignments.
+ lookForIdentifierInAllScopes: function (n, val) {
+
+ var currentNode = n, i, le, vars, funcs;
+ while (currentNode != undefined) {
+ if (currentNode.varDecls != undefined) {
+ vars = currentNode.varDecls;
+ le = vars.length;
+ for (i = 0; i < le; i++) {
+ if (vars[i].value === val) {
+ console.debug('FOUND declaration for', val);
+ return true;
+ }
+ }
+ }
+ if (currentNode.funDecls != undefined) {
+ funcs = currentNode.funDecls;
+ le = funcs.length;
+ for (i = 0; i < le; i++) {
+ if (funcs[i].name === val) {
+ console.debug('FOUND function declaration for', val);
+ return true;
+ }
+ }
+ }
+ currentNode = currentNode.parent;
+ }
+ console.debug('did not find declaration or assignment for', val);
+ },
+
+ // Heuristic method for window properties.
+ // this doesn't prove they are window properties, but
+ // it allows to make a good guess. These variables could have
+ // been assigned to something else...
+ checkIdentifierIsWindowProperty: function (n) {
+
+ if (n.type === token.IDENTIFIER &&
+ (n.parent.type === token.CALL ||
+ (n.parent.type === token.DOT &&
+ n.previous != undefined &&
+ (n.previous.type === token.THIS ||
+ (n.previous.type === token.IDENTIFIER &&
+ n.previous.value === 'window')))) &&
+ n.value in windowPropertiesHash) {
+
+ this.lookForIdentifierInAllScopes(n, n.value);
+
+ }
+
+ else if (n.type === token.IDENTIFIER &&
+ n.parent != undefined &&
+ n.parent.type === token.DOT &&
+ n.previous != undefined &&
+ n.previous.type === token.THIS &&
+ this.isInGlobalScope(n)) {
+ console.debug(n.type, 'use of this in the global scope, seems ok.', n.value);
+ }
+ else if (n.type === token.IDENTIFIER) {
+ // not found.
+ console.debug(n.type, 'probably not a window prop', n.value);
+ this.nonWindowProperties[n.value] = 1;
+ }
+ }
+
+};
+
+exports.relationChecker = function (scriptId) {
+ var obj = Object.create(relationChecker);
+ obj.init(scriptId);
+ return obj;
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/main.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/main.js
new file mode 100644
index 0000000..3038eae
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/main.js
@@ -0,0 +1,212 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+// Uncomment the following to start debugging, or do it from about:config.
+// var name = "extensions.jid1-KtlZuoiikVfFew@jetpack.sdk.console.logLevel";
+// require("sdk/preferences/service").set(name, "all");
+
+const jsAnalyzer = require("js_checker/js_checker");
+
+var { ToggleButton } = require('sdk/ui/button/toggle');
+const panel = require("sdk/panel");
+
+const pageWorker = require("sdk/page-worker");
+
+const data = require("sdk/self").data;
+const httpObserver = require("http_observer/http_request_observer");
+
+const { Cc, Ci } = require("chrome");
+const { getMostRecentBrowserWindow } = require('sdk/window/utils');
+const jetpackID = require("sdk/self").id;
+
+const tabs = require("sdk/tabs");
+//const prefs = require("preferences/preferences");
+const simpleStorage = require("sdk/simple-storage");
+const addonManage = require("addon_management/install_uninstall");
+var removedScripts = require("script_entries/removed_scripts").removedScripts;
+var acceptedScripts = require("script_entries/accepted_scripts").acceptedScripts;
+const dryRunScripts = require("script_entries/dryrun_scripts").dryRunScripts;
+
+const types = require("js_checker/constant_types");
+
+// manage preference whitelist.
+const prefChange = require("addon_management/prefchange");
+// set whitelist at startup.
+prefChange.init();
+
+var allowedRef = require("http_observer/allowed_referrers").allowedReferrers;
+
+var urlHandler = require("url_handler/url_handler");
+
+var widgetIsOn = false;
+
+const librejsStorage = require("settings/storage").librejsStorage;
+// read storage file.
+var cachedResult = librejsStorage.init();
+librejsStorage.generateCacheFromDB();
+
+
+var uiInfo = require("ui/ui_info");
+var scriptPanel = require("ui/script_panel.js");
+const removeHashCallback = require("js_checker/js_checker").removeHashCallback;
+var panelContent = function () {
+
+ let panel = this;
+ var message, externalEntries,
+ externalScripts, urlTabIndex, tabData;
+
+ tabs.activeTab.attach({
+ contentScriptFile: [data.url('third_party/jquery-src.js'),
+ data.url('script_detector/script_detector.js')],
+ contentScriptWhen: 'ready',
+
+ onMessage: function (respData) {
+ var url = urlHandler.removeFragment(tabs.activeTab.url);
+ scriptsData = {'removed': removedScripts.getScripts(url),
+ 'accepted': acceptedScripts.getScripts(url),
+ 'dryRun': dryRunScripts.getScripts(url)};
+ panel.postMessage({'pageURL': url,
+ 'urlData': scriptsData,
+ 'isAllowed': allowedRef.urlInAllowedReferrers(url)});
+ }
+
+ });
+
+};
+
+// page mod was here.
+
+exports.main = function(options, callbacks) {
+ if (options.loadReason === 'enable' ||
+ options.loadReason === 'install') {
+ addonManage.onLoad();
+ }
+};
+
+var mainPanel = panel.Panel({
+ contentURL: data.url('display_panel/content/display-panel.html'),
+ width: 800,
+ height: 500,
+ contentScriptFile: [
+ data.url('third_party/jquery-src.js'),
+ data.url('display_panel/main_panel.js')
+ ],
+ onShow: panelContent,
+ onHide: removePanelContent
+});
+
+var toggleButton = ToggleButton({
+ id: 'librejs-toggle-switch',
+ label: 'LibreJS',
+ icon: {
+ '16': './widget/images/librejs.png',
+ '32': './widget/images/librejs.png',
+ '64': './widget/images/librejs.png'
+ },
+ contentScriptFile: [data.url('widget/widget.js')],
+ contentScriptWhen: 'end',
+ panel: mainPanel,
+ onChange: handleChange
+});
+
+var getWidgetElem = function () {
+ let { document } = getMostRecentBrowserWindow();
+ var name = "widget:" + jetpackID + '-librejs-toggle-switch';
+ var widgetElem = document.getElementById(name);
+ return widgetElem;
+};
+
+function handleChange(state) {
+ if (state.checked) {
+ mainPanel.show({
+ position: toggleButton
+ });
+ }
+}
+
+function removePanelContent() {
+ toggleButton.state('window', { checked: false });
+}
+
+mainPanel.port.on('complainButtonClicked', function () {
+ mainPanel.hide();
+});
+
+mainPanel.port.on('allowAllClicked', function (url) {
+ url = urlHandler.removeFragment(url);
+ allowedRef.addPage(url);
+ tabs.activeTab.reload();
+});
+
+mainPanel.port.on('disallowAllClicked', function (url) {
+ console.debug('url is', url);
+ url = urlHandler.removeFragment(url);
+ console.debug('before clear, url is in allowedRef', allowedRef.urlInAllowedReferrers(url));
+ allowedRef.clearSinglePageEntry(url);
+ console.debug('after clear, url is in allowedRef', allowedRef.urlInAllowedReferrers(url));
+ mainPanel.hide();
+ tabs.activeTab.reload();
+});
+
+mainPanel.port.on('openInTab', function (text) {
+ var str = generateDataURI(text);
+ tabs.open(str);
+});
+
+var generateDataURI = function (encodedText) {
+ return "data:text/html;charset=UTF-8;base64," + encodedText;
+};
+
+exports.onUnload = addonManage.onUnload;
+exports.onLoad = addonManage.onLoad;
+
+// move to sub-module later
+const scriptsCached = require("script_entries/scripts_cache").scriptsCached;
+mainPanel.port.on('whitelistByHash', function (hash, url, name, reason) {
+ console.debug("hash is", hash);
+ url = urlHandler.removeFragment(url);
+ /* var cached_result = scriptsCached.isCached(hash);
+ console.log("cached_result is", cached_result);
+ if (cached_results) {
+ reason = cached_result['reason'];
+ }*/
+ scriptsCached.addEntryByHash(hash, types.whitelisted(reason), {}, true, url);
+});
+
+mainPanel.port.on('removeFromWhitelistByHash', function (hash) {
+ scriptsCached.removeEntryByHash(hash);
+ removeHashCallback(hash);
+});
+const settings_tab = require("settings/settings_tab");
+var menuitem = require("menuitems").Menuitem({
+ id: 'librejs_settings',
+ menuid: "menu_ToolsPopup",
+ label: "LibreJS",
+ onCommand: function() {
+ settings_tab.settingsManager.open();
+ },
+ insertbefore: "menu_pageInfo"
+});
+
+mainPanel.port.on('openSesame', function () {
+ // open the settings tab.
+ settings_tab.settingsManager.open();
+});
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/narcissus_parser/narcissus_worker.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/narcissus_parser/narcissus_worker.js
new file mode 100644
index 0000000..5e28dbb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/narcissus_parser/narcissus_worker.js
@@ -0,0 +1,67 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var data = require("sdk/self").data;
+var {Cu} = require("chrome");
+
+var {ChromeWorker} = Cu.import("resource://gre/modules/Services.jsm", null);
+
+
+var worker = new ChromeWorker(data.url("chrome_worker/narcissus_parser/narcissus_parse.js"));
+
+worker.onmessage = function (e) {
+
+ var jsChecker = require("js_checker/js_checker");
+
+ try {
+
+ jsChecker.callbackHashResult(e.data.hash, e.data.tree);
+
+ } catch (x) {
+
+ console.debug('error on message', x);
+ jsChecker.callbackHashResult(e.data.hash, false);
+
+ }
+ jsChecker = null;
+};
+
+exports.parse = function (scriptText, hash) {
+
+ try {
+ // dont display errors for main version.
+ worker.onerror = function (e) {
+ console.debug('error', e.lineno, 'in', e.filename, 'e', e.message, 'full message', e);
+ worker.postMessage(JSON.stringify({'hash': hash}));
+ };
+
+ var obj = {'code': scriptText, 'hash': hash};
+ worker.postMessage(JSON.stringify(obj));
+
+ } catch (x) {
+ console.debug('error in lib/narcissus_worker.js', x, x.lineNumber);
+ }
+
+};
+
+exports.stopWorker = function () {
+ console.debug('stopping worker');
+ worker.postMessage('stop');
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/accepted_scripts.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/accepted_scripts.js
new file mode 100644
index 0000000..1a8ac9a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/accepted_scripts.js
@@ -0,0 +1,67 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var allScripts = require('script_entries/all_scripts').allScripts;
+
+var AcceptedScripts = function() {
+ this.scripts = {};
+ this.truncateJsData = allScripts.truncateJsData;
+ this.getScripts = allScripts.getScripts;
+ this.isFound = allScripts.isFound;
+ this.returnWhenFound = allScripts.returnWhenFound;
+ this.getOrInitScripts = allScripts.getOrInitScripts;
+ this.setHash = allScripts.setHash;
+};
+
+AcceptedScripts.prototype.clearScripts = function (url) {
+ this.scripts[url] = [];
+};
+
+/**
+ * addAScript
+ * adds a single script to the scripts array.
+ * @param {string} url - the url of the page where it is loaded.
+ * @param {object} scriptObj - Additional data regarding this script,
+ * including: inline: boolean,
+ * contents: string,
+ * removalReason: string.
+ */
+AcceptedScripts.prototype.addAScript = function (url, scriptObj) {
+ var exists;
+
+ if (this.scripts[url] === undefined) {
+ this.clearScripts(url);
+ }
+
+ // check if content is actually js code.
+ if (scriptObj.inline === true) {
+ this.setHash(scriptObj);
+ this.truncateJsData(scriptObj);
+ }
+ exists = this.isFound(url, scriptObj);
+ if (!exists) {
+ this.scripts[url].push(scriptObj);
+ return true;
+ } else {
+ return false;
+ }
+};
+
+exports.acceptedScripts = new AcceptedScripts();
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/all_scripts.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/all_scripts.js
new file mode 100644
index 0000000..c08b4ac
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/all_scripts.js
@@ -0,0 +1,108 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var crypto = require('script_entries/crypto');
+
+var AllScripts = function() {
+ this.scripts = {};
+};
+
+AllScripts.prototype.truncateJsData = function (scriptObj) {
+ if (scriptObj.contents === undefined) {
+ console.debug('this is an inline script', scriptObj.value);
+ console.debug('this is an src', scriptObj.url);
+ }
+ if (scriptObj.contents.length > 1000) {
+ scriptObj.contents = scriptObj.contents.substring(0, 1000);
+ scriptObj.contents += '…';
+ }
+};
+
+AllScripts.prototype.setHash = function (scriptObj) {
+ scriptObj.hash = crypto.sha1Encrypt(scriptObj.contents);
+ return scriptObj.hash;
+};
+
+AllScripts.prototype.getScripts = function (url) {
+ if (!this.scripts[url]) {
+ return false;
+ } else {
+ return this.scripts[url];
+ }
+};
+
+AllScripts.prototype.reverseArray = function (url) {
+ this.scripts[url].reverse();
+};
+
+AllScripts.prototype.getOrInitScripts = function (url) {
+ if (this.scripts[url] === undefined) {
+ this.scripts[url] = [];
+ }
+ return this.scripts[url];
+};
+
+AllScripts.prototype.returnWhenFound = function(url, data) {
+ var pageScripts = this.getOrInitScripts(url),
+ i = 0,
+ le = pageScripts.length;
+
+ // check that entry doesn't exist.
+ if (data.inline === false) {
+ for (; i < le; i++) {
+ if (pageScripts[i].contents === data.url) {
+ return pageScripts[i];
+ }
+ }
+ } else if (data.inline === true) {
+ for (; i < le; i++) {
+ if (pageScripts[i].hash === crypto.sha1Encrypt(data.contents)) {
+ return pageScripts[i];
+ }
+ }
+ }
+
+ return false;
+};
+
+AllScripts.prototype.isFound = function(url, data) {
+ var pageScripts = this.getOrInitScripts(url),
+ i = 0,
+ le = pageScripts.length;
+
+ // check that entry doesn't exist.
+ if (data.inline === false) {
+ for (; i < le; i++) {
+ if (pageScripts[i].url === data.url) {
+ return true;
+ }
+ }
+ } else if (data.inline === true) {
+ for (; i < le; i++) {
+ if (pageScripts[i].hash === crypto.sha1Encrypt(data.contents)) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+};
+
+exports.allScripts = new AllScripts();
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/crypto.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/crypto.js
new file mode 100644
index 0000000..e8844b1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/crypto.js
@@ -0,0 +1,60 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var {Cc, Ci, Cu, Cm, Cr} = require("chrome");
+
+var CryptoString = function() {
+ this.cryptoHash = Cc["@mozilla.org/security/hash;1"]
+ .createInstance(Ci.nsICryptoHash);
+ this.converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
+ createInstance(Ci.nsIScriptableUnicodeConverter);
+ this.hashAlgorithm = null;
+};
+
+CryptoString.prototype.init = function(hashAlgorithm, charset) {
+ this.converter.charset = charset;
+ this.hashAlgorithm = hashAlgorithm;
+ this.cryptoHash.init(this.cryptoHash[this.hashAlgorithm]);
+
+};
+
+CryptoString.prototype.encryptString = function(str) {
+ var result = {};
+ var data = this.converter.convertToByteArray(str, result);
+ this.cryptoHash.update(data, data.length);
+ var hash = this.cryptoHash.finish(false);
+ return [this.toHexString(hash.charCodeAt(i)) for (i in hash)].join("");
+};
+
+CryptoString.prototype.toHexString = function(charCode) {
+ return ("0" + charCode.toString(16)).slice(-2);
+};
+
+var cryptoString = new CryptoString();
+
+exports.sha1Encrypt = function(str) {
+ cryptoString.init('SHA1', 'UTF-8');
+ return cryptoString.encryptString(str);
+};
+
+exports.sha256Encrypt = function(str) {
+ cryptoString.init('SHA256', 'UTF-8');
+ return cryptoString.encryptString(str);
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/dryrun_scripts.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/dryrun_scripts.js
new file mode 100644
index 0000000..d32263b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/dryrun_scripts.js
@@ -0,0 +1,76 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var allScripts = require('script_entries/all_scripts').allScripts;
+const urlHandler = require('url_handler/url_handler');
+
+exports.dryRunScripts = {
+ scripts: {},
+
+ truncateJsData: allScripts.truncateJsData,
+
+ getScripts: allScripts.getScripts,
+
+ isFound: allScripts.isFound,
+
+ returnWhenFound: allScripts.returnWhenFound,
+
+ getOrInitScripts: allScripts.getOrInitScripts,
+
+ reverseArray: allScripts.reverseArray,
+
+ setHash: allScripts.setHash,
+
+ clearScripts: function (url) {
+ this.scripts[url] = [];
+ },
+
+ /**
+ * addAScript
+ * adds a single script to the scripts array.
+ * @param {string} url - the url of the page where it is loaded.
+ * @param {object} scriptObj - Additional data regarding this script,
+ * including: inline: boolean,
+ * contents: string,
+ * removalReason: string.
+ */
+ addAScript: function (url, scriptObj, absoluteUrl) {
+ var exists;
+
+ if (this.scripts[url] === undefined) {
+ this.clearScripts(url);
+ }
+ if (scriptObj.inline === true) {
+ this.setHash(scriptObj);
+ this.truncateJsData(scriptObj);
+ } else if (absoluteUrl !== undefined &&
+ scriptObj.inline === false) {
+ scriptObj.contents = urlHandler.resolve(absoluteUrl, scriptObj.contents);
+ }
+ exists = this.isFound(url, scriptObj);
+
+ if (!exists) {
+ this.scripts[url].push(scriptObj);
+ return true;
+ } else {
+ return false;
+ }
+ }
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/free_libraries.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/free_libraries.js
new file mode 100644
index 0000000..5aff728
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/free_libraries.js
@@ -0,0 +1,67 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+// THIS MODULE IS DEPRECATED IN FAVOR OF THE NEW WHITELISTING MODULE (LibreJS 6.0)
+
+var relationChecker = require("js_checker/relation_checker").relationChecker;
+var checkTypes = require("js_checker/constant_types").checkTypes;
+var scriptsCached = require("./scripts_cache").scriptsCached;
+
+
+// find the json database path.
+var dbContents = require("sdk/self").data.load("script_libraries/script-libraries.json");
+
+const AUTHOR_REASON = "this script has been tagged as free software by LibreJS authors";
+
+var freeLibraries = JSON.parse(dbContents); /* a database of the free libraries recognized by default */
+
+/*
+ *
+ * List of free libraries and their SHA256 hash.
+ * This is used to recognize the most common free libraries.
+ *
+ */
+
+var init = function () {
+
+ // relationChecker, which roughly checks if variables are window
+ // variables or not, is useless in this case. Use the same
+ // object for all entries.
+ var rc = relationChecker();
+ var library, hash;
+ var freeObj = { "type": 4, "reason": AUTHOR_REASON};
+ console.debug("Building init");
+ for (hash in freeLibraries) {
+ library = freeLibraries[hash];
+
+ // assign empty relationChecker object.
+ library.relationChecker = rc;
+
+ // make them free and nontrivial.
+ library.result = freeObj;
+
+ scriptsCached.addObjectEntry(hash, library);
+ }
+};
+
+//init();
+
+exports.init = init;
+exports.AUTHOR_REASON = AUTHOR_REASON;
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/removed_scripts.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/removed_scripts.js
new file mode 100644
index 0000000..8f65c4d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/removed_scripts.js
@@ -0,0 +1,71 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var allScripts = require('script_entries/all_scripts').allScripts;
+const urlHandler = require('url_handler/url_handler');
+
+var RemovedScripts = function() {
+ this.scripts = {};
+ this.truncateJsData = allScripts.truncateJsData;
+ this.getScripts = allScripts.getScripts;
+ this.isFound = allScripts.isFound;
+ this.returnWhenFound = allScripts.returnWhenFound;
+ this.getOrInitScripts = allScripts.getOrInitScripts;
+ this.reverseArray = allScripts.reverseArray;
+ this.setHash = allScripts.setHash;
+};
+
+RemovedScripts.prototype.clearScripts = function (url) {
+ this.scripts[url] = [];
+};
+
+/**
+ * addAScript
+ * adds a single script to the scripts array.
+ * @param {string} url - the url of the page where it is loaded.
+ * @param {object} scriptObj - Additional data regarding this script,
+ * including: inline: boolean,
+ * contents: string,
+ * removalReason: string.
+ */
+RemovedScripts.prototype.addAScript = function (url, scriptObj, absoluteUrl) {
+ var exists;
+
+ if (this.scripts[url] === undefined) {
+ this.clearScripts(url);
+ }
+ if (scriptObj.inline === true) {
+ this.setHash(scriptObj);
+ this.truncateJsData(scriptObj);
+ } else if (absoluteUrl !== undefined &&
+ scriptObj.inline === false) {
+ scriptObj.contents = urlHandler.resolve(absoluteUrl, scriptObj.contents);
+ }
+ exists = this.isFound(url, scriptObj);
+
+ if (!exists) {
+ this.scripts[url].push(scriptObj);
+ return true;
+ } else {
+ return false;
+ }
+};
+
+exports.removedScripts = new RemovedScripts();
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/scripts_cache.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/scripts_cache.js
new file mode 100644
index 0000000..5bc5c8a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/script_entries/scripts_cache.js
@@ -0,0 +1,182 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+var relationCheckerObj = require("js_checker/relation_checker").relationChecker;
+
+var crypto = require('script_entries/crypto');
+//const librejsStorage = require("settings/storage").librejsStorage;
+const checkTypes = require("js_checker/constant_types").checkTypes;
+
+// cachedResults contains objects with result/relationChecker for
+// scripts entries indexed by SHA1sum
+var cachedResults = {};
+
+var ScriptsCached = function() {};
+
+ScriptsCached.prototype.getHash = function(scriptText) {
+ require('ui/notification').createNotification(scriptText.substring(0,100));
+
+ return crypto.sha1Encrypt(scriptText);
+};
+
+/**
+ * resetCache
+ * Resets the full cache and re-initialize
+ * the free libraries list.
+ */
+ScriptsCached.prototype.resetCache = function () {
+ cachedResults = {};
+ free_libraries.init();
+};
+
+/**
+ *
+ * addEntry
+ *
+ * Adds a script entry to the cache by providing the results
+ * and the actual script text.
+ *
+ */
+ScriptsCached.prototype.addEntry = function(
+ scriptText, result, relationChecker, allowTrivial, url) {
+ console.debug("result addEntry is", JSON.stringify(result));
+ cachedResults[this.getHash(scriptText)] = {
+ 'result': result,
+ 'relationChecker': relationCheckerObj(),
+ 'allowTrivial': allowTrivial,
+ 'url': url
+ };
+};
+
+/**
+ *
+ * addEntry
+ *
+ * Adds a script entry to the cache by providing the results
+ * using the script's hash.
+ *
+ */
+ScriptsCached.prototype.addEntryByHash = function(
+ hash, result, relationChecker, allowTrivial, url) {
+ cachedResults[hash] = {
+ 'result': result,
+ 'relationChecker': relationCheckerObj(),
+ 'allowTrivial': allowTrivial,
+ 'url': url || ''
+ };
+};
+
+/**
+ * removeEntryByHash
+ *
+ * Remove an entry from the cache using hash key.
+ */
+ScriptsCached.prototype.removeEntryByHash = function(hash) {
+ delete cachedResults[hash];
+};
+
+/**
+ * addEntryIfNotCached
+ *
+ * Checks first if entry is cached before attempting to cache result.
+ */
+ScriptsCached.prototype.addEntryIfNotCached = function(
+ scriptText, result, relationChecker, allowTrivial, url) {
+ // save a bit of computing by getting hash once.
+ var hash = this.getHash(scriptText);
+ console.debug('hash is then', hash);
+ if (!this.isCached(scriptText, hash)) {
+ cachedResults[hash] = {
+ 'result': result,
+ 'relationChecker': relationCheckerObj(),
+ 'allowTrivial': allowTrivial,
+ 'url': url || ''
+ };
+ }
+ return hash;
+};
+
+/**
+ *
+ * addObjectEntry
+ *
+ * Adds a script entry by providing an object.
+ * Used to provide free library hashes from free_libraries.js
+ *
+ */
+ScriptsCached.prototype.addObjectEntry = function(hash, script) {
+ cachedResults[hash] = script;
+};
+
+ScriptsCached.prototype.isCached = function(scriptText, hash) {
+ var scriptHash;
+ console.debug("Is CACHED start?");
+ try {
+ if (typeof hash === 'string') {
+ scriptHash = hash;
+ } else {
+ scriptHash = this.getHash(scriptText);
+ }
+ if (typeof scriptHash === 'string') {
+ let cachedResult = cachedResults[scriptHash];
+ if (cachedResult) {
+ // exact copy of file has already been cached.
+ console.debug('scriptHash is', cachedResult);
+ if (cachedResult.relationChecker == "[rl]") {
+ cachedResult.relationChecker = {}; //relationCheckerObj();
+ }
+ console.debug("Is Cached ENd TRUE");
+ return cachedResult;
+ }
+ }
+ return false;
+ } catch (e) {
+ console.debug("an error", scriptHash, e, e.linenumber, e.filename);
+ }
+};
+
+/**
+ * Writes allowed scripts to the cache.
+ * nonfree/nontrivial scripts are not added to the cache.
+ */
+ScriptsCached.prototype.getCacheForWriting = function() {
+ var formattedResults = {};
+ for (let item in cachedResults) {
+ let type = cachedResults[item].result.type;
+ if (type != checkTypes.NONTRIVIAL &&
+ type != checkTypes.TRIVIAL_DEFINES_FUNCTION) {
+ formattedResults[item] = cachedResults[item];
+ }
+ }
+ return formattedResults;
+};
+
+/**
+ * Import data from database into cachedResults.
+ * Calling this function replaces the current cache if it exists.
+ */
+ScriptsCached.prototype.bulkImportCache = function(data) {
+ cachedResults = data;
+ console.debug("Imported data. Number of keys ISSS ", Object.keys(cachedResults).length);
+ console.debug("It looks like ", JSON.stringify(cachedResults));
+};
+
+// import free_libraries to populate the cache hash map.
+//var free_libraries = require("script_entries/free_libraries");
+exports.scriptsCached = new ScriptsCached();
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/settings/settings_tab.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/settings/settings_tab.js
new file mode 100644
index 0000000..c99deb5
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/settings/settings_tab.js
@@ -0,0 +1,84 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+const addonTab = require("addon-tab");
+const data = require("sdk/self").data;
+const storage = require("settings/storage").librejsStorage;
+const scriptsCached = require("script_entries/scripts_cache").scriptsCached;
+
+exports.settingsManager = settingsManager;
+
+
+
+let settingsManager = {
+ settings_tab: {
+ url: data.url("settings/index.html"),
+ tabStyle: {
+ 'background-color': '#898168',
+ 'background-image': 'none', // important to overwrite bckg when tab is active.
+ 'font-weight': 'normal',
+ 'font-size': '1.1em',
+ 'color': '#444'
+ },
+ onReady: function (tab) {
+ console.debug("populating form");
+ var that = this;
+ let cache_data = scriptsCached.getCacheForWriting();
+ let worker = tab.attach({contentScriptFile: [data.url('settings/js/pagescript-listener.js'),
+ data.url('settings/js/pagescript-emitter.js')]});
+ worker.port.emit("populate-form", cache_data);
+ worker.port.on("rules-form-delete", function (hash) {
+ try {
+ scriptsCached.removeEntryByHash(hash);
+ } catch (e) {
+ console.log(e, e.lineNumber, e.filename);
+ }
+ //worker.port.emit("populate-form", scriptsCached.getCacheForWriting());
+ });
+ worker.port.on("rules-form-delete-all", function () {
+ console.log("delete all triggered.");
+ scriptsCached.resetCache();
+ });
+ },
+ onActivate: function (tab) {
+ // just reload the form.
+ console.log("Tab is activated again");
+ var that = this;
+ let cache_data = scriptsCached.getCacheForWriting();
+ let worker = tab.attach({contentScriptFile: [data.url('settings/js/pagescript-listener.js'),
+ data.url('settings/js/pagescript-emitter.js')]});
+ worker.port.emit("populate-form", cache_data);
+
+ }
+ },
+
+
+ init: function () {
+ // do some first time magic.
+ settings.onLoad(function (data) {
+
+ });
+ },
+ open: function () {
+ console.debug("settings tab data url is", this.settings_tab.url);
+ addonTab.open(this.settings_tab);
+ }
+};
+
+exports.settingsManager = settingsManager;
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/settings/storage.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/settings/storage.js
new file mode 100644
index 0000000..f77bd13
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/settings/storage.js
@@ -0,0 +1,164 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+/*jshint esnext: true */
+
+const { Cc, Ci, Cu, components } = require("chrome");
+
+var { NetUtil } = Cu.import("resource://gre/modules/NetUtil.jsm");
+var { FileUtils } = Cu.import("resource://gre/modules/FileUtils.jsm");
+var relationChecker = require("js_checker/relation_checker").relationChecker;
+var rc = relationChecker(); // a dummy object for legacy module.
+const AUTHOR_REASON = require("script_entries/free_libraries").AUTHOR_REASON;
+var relationChecker = require("js_checker/relation_checker").relationChecker;
+
+const scriptsCached = require("script_entries/scripts_cache").scriptsCached;
+
+let librejsStorage = {
+
+ file: null,
+ filename: 'librejs-whitelist.json',
+ data: [],
+
+ onLoad: function (callback) {
+ // will read the json file.
+ this.init();
+ this.read(callback);
+ },
+
+
+ init: function () {
+ // get the "librejs-whitelist.json" file in the profile directory
+ this.file = FileUtils.getFile("ProfD", [this.filename]);
+ },
+ read: function (callback) {
+ // Content type hint is useful on mobile platforms where the filesystem
+ // would otherwise try to determine the content type.
+ var channel = NetUtil.newChannel(this.file);
+ var that = this;
+ channel.contentType = "application/json";
+ try {
+ NetUtil.asyncFetch(channel, function(inputStream, status) {
+
+ if (!components.isSuccessCode(status)) {
+ require("script_entries/free_libraries").init();
+ that.initialWrite();
+ }
+
+ var raw_data = NetUtil.readInputStreamToString(inputStream, inputStream.available());
+ // expand json file back to original contents.
+ var re = new RegExp("[freelib]".replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g');
+ raw_data = raw_data.replace(re, AUTHOR_REASON);
+ console.debug("raw_data is ", raw_data);
+ // The file data is contained within inputStream.
+ // You can read it into a string with
+ // get string into json also
+ that.data = JSON.parse(raw_data);
+
+ callback(that.data);
+ });
+ } catch (e) {
+ that.initialWrite();
+ }
+ },
+
+ initialWrite: function (callback) {
+ console.debug("About to write free libraries");
+ // our file is not populated with default contents.
+ // use free_libraries.js to populate.
+ require("script_entries/free_libraries").init();
+ this.writeCacheToDB(callback);
+ },
+ /**
+ * writes the contents of scriptsCached to the persistent
+ * JSON file.
+ */
+ writeCacheToDB: function (callback) {
+ console.debug("writing to db");
+ data = scriptsCached.getCacheForWriting();
+ json = JSON.stringify(data);
+
+ // make json file smaller.
+ var re = new RegExp(AUTHOR_REASON.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g');
+ json = json.replace(re, "[freelib]");
+
+ var rc = JSON.stringify(relationChecker());
+ re = new RegExp(rc.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g');
+ json = json.replace(re, "\"[rl]\"");
+ console.debug("this.data is now", this.data);
+ this.write(callback, json);
+ },
+ generateCacheFromDB: function (callback) {
+ if (callback === undefined) {
+ callback = function () {
+ // nothing to do.
+ };
+ }
+ this.read(function (data) {
+ scriptsCached.bulkImportCache(data);
+ });
+ },
+ write: function (onDataWritten, json) {
+
+ this.init();
+ var str;
+ if (json === undefined) {
+ str = JSON.stringify(this.data);
+ } else {
+ // we are passing json already formatted.
+ str = json;
+ }
+ var ostream = FileUtils.openSafeFileOutputStream(this.file);
+ var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
+ converter.charset = "UTF-8";
+ var istream = converter.convertToInputStream(str);
+ // The last argument (the callback) is optional.
+ NetUtil.asyncCopy(istream, ostream, function(status) {
+ if (!components.isSuccessCode(status)) {
+ // Handle error!
+ return;
+ }
+ if (!onDataWritten) {
+ console.debug("onDataWritten is not defined");
+ onDataWritten = function () {
+ console.debug("onDataWritten dummy callback triggered");
+ };
+ }
+ // Data has been written to the file.
+ onDataWritten();
+ });
+ },
+
+ /**
+ * getEntry -- Returns a storage entry if it is present.
+ */
+ getEntry: function (hash) {
+ var entry = this.data[hash];
+ if (entry) {
+ if (entry.result == "[freelib]") {
+ entry.result = { "type": 4, "reason": "this script has been tagged as free software by LibreJS authors" };
+ }
+ entry.relationChecker = rc;
+ return entry;
+ }
+ return false;
+ }
+};
+
+exports.librejsStorage = librejsStorage;
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/notification.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/notification.js
new file mode 100644
index 0000000..aeb279a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/notification.js
@@ -0,0 +1,77 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+// this module is used to display a notification when LibreJS
+// is running to inform the user it is indeed busy working.
+const timer = require("sdk/timers");
+const self = require("sdk/self");
+const isDisplayNotifications = require("addon_management/prefchange").isDisplayNotifications;
+
+exports.createCriticalNotification = function (text) {
+ if (text === undefined) {
+ text = "";
+ }
+ var self = require('sdk/self');
+ var randomnumber = Math.floor(Math.random()*11);
+ var notif = require("notification-box").NotificationBox({
+ 'value': 'librejs-critical-notification-js-web-labels',
+ 'label': text,
+ 'priority': 'CRITICAL_LOW',
+ 'image': self.data.url("assets/images/torchy2.png"),
+ });
+ return notif;
+};
+
+var fakeNotification = {
+ 'close': function () {
+ return;
+ }
+};
+
+exports.createNotification = function (jsValue) {
+ if (!isDisplayNotifications()) {
+ return fakeNotification;
+ }
+ if (jsValue === undefined) {
+ jsValue = "";
+ }
+ var self = require('sdk/self');
+ var randomnumber = Math.floor(Math.random()*11);
+ var notif = require("notification-box").NotificationBox({
+ 'value': 'librejs-message',
+ 'label': 'LibreJS is analyzing: ' + jsValue + " ...",
+ 'priority': 'INFO_LOW',
+ 'image': self.data.url("assets/images/torchy2.png"),
+ /*'buttons': [{'label': "Fine",
+ 'onClick': function () { }}]*/
+ });
+ timer.setTimeout(function () {
+ // ensure notifications are ALWAYS removed at some point.
+ console.debug("removing after 2 seconds");
+ try {
+ var n = notif.notificationbox
+ .getNotificationWithValue('librejs-message');
+ n.close();
+ } catch(x) {
+ // do nothing
+ }
+ }, 2000);
+ return notif;
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/script_panel.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/script_panel.js
new file mode 100644
index 0000000..85c22a4
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/script_panel.js
@@ -0,0 +1,73 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+var urlHandler = require("url_handler/url_handler");
+
+/**
+ * addScriptsToPanelList
+ *
+ * Looks for scripts that are either valid or flagged with libreJS
+ *
+ */
+exports.addScriptsToPanelList = function (url, respData) {
+
+ var panelRemovedScripts = [];
+ var panelAcceptedScripts = [];
+ var panelDryRunScripts = [];
+
+ // use url. remove fragment.
+ url = urlHandler.removeFragment(url);
+ var contents, i, reason;
+
+ for (i = 0; i < respData.value.blocked.length; i++) {
+ // if external script only.
+ pathToUrl(respData.value.blocked[i], url);
+ panelRemovedScripts.push(respData.value.blocked[i]);
+ }
+
+ for (i = 0; i < respData.value.accepted.length; i++) {
+
+ // if external script only.
+ pathToUrl(respData.value.accepted[i], url);
+ panelAcceptedScripts.push(respData.value.accepted[i]);
+ }
+ for (i = 0; i < respData.value.dryRun.length; i++) {
+ // if external script only.
+ pathToUrl(respData.value.dryRun[i], url);
+ panelDryRunScripts.push(respData.value.dryRun[i]);
+ }
+
+ return {'removed': panelRemovedScripts,
+ 'accepted': panelAcceptedScripts,
+ 'dryRun': panelDryRunScripts};
+};
+
+
+/**
+ * pathToUrl
+ *
+ * convert a relative path to a url.
+ *
+ */
+var pathToUrl = function (scriptEntry, url) {
+ if (scriptEntry.inline === false) {
+ scriptEntry.url = urlHandler.resolve(url, scriptEntry.url);
+ }
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/ui_info.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/ui_info.js
new file mode 100644
index 0000000..5e0c2a8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/ui/ui_info.js
@@ -0,0 +1,232 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+
+// page mod executing content script at every page load.
+
+var data = require("sdk/self").data;
+var pageMod = require("sdk/page-mod");
+
+var urlHandler = require("url_handler/url_handler");
+
+var pageWorker = require("sdk/page-worker");
+
+var tabs = require("sdk/tabs");
+var isComplaintTab = require("addon_management/prefchange").isComplaintTab;
+
+// contain list of recently found contact links or email addresses.
+var contactList = {};
+
+// constants. Also available in lib/ui_info.js
+const CERTAIN_EMAIL_ADDRESS_FOUND = 'certainEmailAddressFound';
+const UNCERTAIN_EMAIL_ADDRESS_FOUND = 'uncertainEmailAddresFound';
+
+// Looking for contact links
+const CERTAIN_LINK_FOUND = 'certainLinkFound';
+const PROBABLE_LINK_FOUND = 'probableLinkFound';
+const UNCERTAIN_LINK_FOUND = 'uncertainLinkFound';
+const LINK_NOT_FOUND = 'contactLinkNotFound';
+
+// Looking for identi.ca and twitter accounts.
+const TWITTER_LINK_FOUND = 'twitterLinkFound';
+const IDENTICA_LINK_FOUND = 'identicaLinkFound';
+
+// phone number and address
+const PHONE_NUMBER_FOUND = 'phoneNumberFound';
+const SNAIL_ADDRESS_FOUND = 'snailAddressFound';
+
+/**
+ * main pageMod.
+ * Find blocked script in all pages being opened.
+ * Launch the scripts that search for a complaint contact.
+ *
+ */
+
+pageMod.PageMod({
+
+ include: ['file://*','*', 'data:*', 'about:*'],
+
+ contentScriptWhen: 'end',
+
+ contentScriptFile: [
+ data.url('complain/contact_regex.js'),
+ data.url('complain/link_types.js'),
+ data.url('third_party/jquery-src.js'),
+ data.url('third_party/jquery.easing.1.3.js'),
+ data.url('complain/contact_finder.js'),
+ data.url('complain/pagemod_finder.js'),
+ data.url('script_detector/script_detector.js')
+ ],
+
+ onAttach: function onAttach(worker) {
+
+ if (worker.tab !== undefined && isComplaintTab()) {
+
+ // this is a tab.
+ if (!foundInContactList(worker.url)) {
+ // the hostname doesn't appear in the object literal.
+ // run script fetching/complaint feature if applicable.
+ tabProcess(worker);
+ } else {
+ worker.postMessage(foundInContactList(worker.url));
+ }
+ }
+
+ }
+});
+
+/**
+ * foundInContactList
+ *
+ * Provides link if contact link is found for given url, or else
+ * false.
+ */
+var foundInContactList = function (url) {
+
+ var hostname = urlHandler.getHostname(url);
+
+ if (contactList[hostname] !== undefined) {
+
+ return contactList[hostname];
+
+ } else {
+
+ return false;
+
+ }
+
+};
+
+/**
+ * tabProcess
+ * Find blocked/accepted scripts, prepare
+ * display panel and complaint panel, ...
+ *
+ */
+var tabProcess = function (worker) {
+
+ var visitedUrl = {};
+
+ // webmaster email is better than a webpage.
+ worker.emailFound = false;
+ var modUrl = '',
+ searchUrl = '';
+
+ modUrl = worker.url;
+
+ console.debug('pagemod triggered');
+
+ // send local path to complain button graphic.
+ worker.postMessage({'event': 'assets-uri', 'value': data.url('assets/')});
+ worker.postMessage({'event': 'page-url', 'value': modUrl});
+
+ worker.on('message', function (respData) {
+
+ // console.debug('worker is receiving a message', respData.event);
+
+ var pw;
+
+ worker.on('detach', function () {
+ console.debug('detaching worker');
+ if (pw) {
+ pw.destroy();
+
+ }
+ });
+ if (respData.contact !== undefined) {
+ // pass the message to the complaint display panel.
+ worker.postMessage(respData);
+ }
+
+ else if (respData.event === 'complaintSearch') {
+
+ console.debug('complaintSearch triggered');
+ console.debug('worker tab url', worker.tab.url);
+ if (!(respData.urlSearch.linkValue in visitedUrl)) {
+
+ visitedUrl[respData.urlSearch.linkValue] = 1;
+
+ respData.urlSearch.linkValue = urlHandler.addFragment(respData.urlSearch.linkValue, 'librejs=true');
+ pw = searchSecondLevelPage(this, respData.urlSearch.linkValue, this.url);
+
+ }
+ // currently not needed.
+ /*else {
+ console.debug(respData.urlSearch.linkValue, 'already visited');
+ }*/
+ }
+
+
+ });
+
+};
+
+var searchSecondLevelPage = function(
+ worker, urlToSearch, originalUrl) {
+ return;
+ var originalWorker = worker;
+
+ console.debug('url to search is', urlToSearch);
+
+ console.debug(urlToSearch, 'and', originalUrl);
+
+ if (urlHandler.haveSameHostname(urlToSearch, originalUrl)) {
+ return pageWorker.Page({
+ contentURL: urlToSearch,
+ contentScriptFile: [
+ data.url('complain/contact_regex.js'),
+ data.url('complain/link_types.js'),
+ data.url('third_party/jquery-src.js'),
+ data.url('third_party/jquery.easing.1.3.js'),
+ data.url('complain/contact_finder.js'),
+ data.url('complain/worker_finder.js')
+ ],
+ contentScriptWhen: "end",
+ onMessage: function (respData) {
+ console.debug(JSON.stringify(respData));
+ console.debug(originalWorker.url);
+ originalWorker.postMessage(respData);
+
+ if (respData.event === 'destroy') {
+ try {
+ console.debug('destroying worker', this.contentURL);
+ this.destroy();
+ } catch (e) {
+ console.debug('in worker', e);
+ }
+ }
+ }
+ });
+ }
+};
+
+
+
+
+exports.testModule = {
+
+ 'contactList': contactList,
+
+ 'foundInContactList': foundInContactList,
+
+ 'tabProcess': tabProcess
+
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_punycode.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_punycode.js
new file mode 100644
index 0000000..64d8c61
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_punycode.js
@@ -0,0 +1,219 @@
+// Copyright (C) 2011 by Ben Noordhuis <info@bnoordhuis.nl>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+exports.encode = encode;
+exports.decode = decode;
+
+var TMIN = 1;
+var TMAX = 26;
+var BASE = 36;
+var SKEW = 38;
+var DAMP = 700; // initial bias scaler
+var INITIAL_N = 128;
+var INITIAL_BIAS = 72;
+var MAX_INTEGER = Math.pow(2, 53);
+
+function adapt_bias(delta, n_points, is_first) {
+ // scale back, then increase delta
+ delta /= is_first ? DAMP : 2;
+ delta += ~~(delta / n_points);
+
+ var s = (BASE - TMIN);
+ var t = ~~((s * TMAX) / 2); // threshold=455
+
+ for (var k = 0; delta > t; k += BASE) {
+ delta = ~~(delta / s);
+ }
+
+ var a = (BASE - TMIN + 1) * delta;
+ var b = (delta + SKEW);
+
+ return k + ~~(a / b);
+}
+
+function next_smallest_codepoint(codepoints, n) {
+ var m = 0x110000; // unicode upper bound + 1
+
+ for (var i = 0, len = codepoints.length; i < len; ++i) {
+ var c = codepoints[i];
+ if (c >= n && c < m) {
+ m = c;
+ }
+ }
+
+ // sanity check - should not happen
+ if (m >= 0x110000) {
+ throw new Error('Next smallest code point not found.');
+ }
+
+ return m;
+}
+
+function encode_digit(d) {
+ return d + (d < 26 ? 97 : 22);
+}
+
+function decode_digit(d) {
+ if (d >= 48 && d <= 57) {
+ return d - 22; // 0..9
+ }
+ if (d >= 65 && d <= 90) {
+ return d - 65; // A..Z
+ }
+ if (d >= 97 && d <= 122) {
+ return d - 97; // a..z
+ }
+ throw new Error('Illegal digit #' + d);
+}
+
+function threshold(k, bias) {
+ if (k <= bias + TMIN) {
+ return TMIN;
+ }
+ if (k >= bias + TMAX) {
+ return TMAX;
+ }
+ return k - bias;
+}
+
+function encode_int(bias, delta) {
+ var result = [];
+
+ for (var k = BASE, q = delta;; k += BASE) {
+ var t = threshold(k, bias);
+ if (q < t) {
+ result.push(encode_digit(q));
+ break;
+ }
+ else {
+ result.push(encode_digit(t + ((q - t) % (BASE - t))));
+ q = ~~((q - t) / (BASE - t));
+ }
+ }
+
+ return result;
+}
+
+function encode(input) {
+ if (typeof input != 'string') {
+ throw new Error('Argument must be a string.');
+ }
+
+ input = input.split('').map(function(c) {
+ return c.charCodeAt(0);
+ });
+
+ var output = [];
+ var non_basic = [];
+
+ for (var i = 0, len = input.length; i < len; ++i) {
+ var c = input[i];
+ if (c < 128) {
+ output.push(c);
+ }
+ else {
+ non_basic.push(c);
+ }
+ }
+
+ var b, h;
+ b = h = output.length;
+
+ if (b) {
+ output.push(45); // delimiter '-'
+ }
+
+ var n = INITIAL_N;
+ var bias = INITIAL_BIAS;
+ var delta = 0;
+
+ for (var len = input.length; h < len; ++n, ++delta) {
+ var m = next_smallest_codepoint(non_basic, n);
+ delta += (m - n) * (h + 1);
+ n = m;
+
+ for (var i = 0; i < len; ++i) {
+ var c = input[i];
+ if (c < n) {
+ if (++delta == MAX_INTEGER) {
+ throw new Error('Delta overflow.');
+ }
+ }
+ else if (c == n) {
+ // TODO append in-place?
+ // i.e. -> output.push.apply(output, encode_int(bias, delta));
+ output = output.concat(encode_int(bias, delta));
+ bias = adapt_bias(delta, h + 1, b == h);
+ delta = 0;
+ h++;
+ }
+ }
+ }
+
+ return String.fromCharCode.apply(String, output);
+}
+
+function decode(input) {
+ if (typeof input != 'string') {
+ throw new Error('Argument must be a string.');
+ }
+
+ // find basic code points/delta separator
+ var b = 1 + input.lastIndexOf('-');
+
+ input = input.split('').map(function(c) {
+ return c.charCodeAt(0);
+ });
+
+ // start with a copy of the basic code points
+ var output = input.slice(0, b ? (b - 1) : 0);
+
+ var n = INITIAL_N;
+ var bias = INITIAL_BIAS;
+
+ for (var i = 0, len = input.length; b < len; ++i) {
+ var org_i = i;
+
+ for (var k = BASE, w = 1;; k += BASE) {
+ var d = decode_digit(input[b++]);
+
+ // TODO overflow check
+ i += d * w;
+
+ var t = threshold(k, bias);
+ if (d < t) {
+ break;
+ }
+
+ // TODO overflow check
+ w *= BASE - t;
+ }
+
+ var x = 1 + output.length;
+ bias = adapt_bias(i - org_i, x, org_i == 0);
+ // TODO overflow check
+ n += ~~(i / x);
+ i %= x;
+
+ output.splice(i, 0, n);
+ }
+
+ return String.fromCharCode.apply(String, output);
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_querystring.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_querystring.js
new file mode 100644
index 0000000..3314061
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_querystring.js
@@ -0,0 +1,187 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// Query String Utilities
+
+var QueryString = exports;
+//var urlDecode = process.binding('http_parser').urlDecode;
+
+
+// If obj.hasOwnProperty has been overridden, then calling
+// obj.hasOwnProperty(prop) will break.
+// See: https://github.com/joyent/node/issues/1707
+function hasOwnProperty(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+}
+
+
+function charCode(c) {
+ return c.charCodeAt(0);
+}
+
+
+// a safe fast alternative to decodeURIComponent
+QueryString.unescapeBuffer = function(s, decodeSpaces) {
+ var out = new Buffer(s.length);
+ var state = 'CHAR'; // states: CHAR, HEX0, HEX1
+ var n, m, hexchar;
+
+ for (var inIndex = 0, outIndex = 0; inIndex <= s.length; inIndex++) {
+ var c = s.charCodeAt(inIndex);
+ switch (state) {
+ case 'CHAR':
+ switch (c) {
+ case charCode('%'):
+ n = 0;
+ m = 0;
+ state = 'HEX0';
+ break;
+ case charCode('+'):
+ if (decodeSpaces) c = charCode(' ');
+ // pass thru
+ default:
+ out[outIndex++] = c;
+ break;
+ }
+ break;
+
+ case 'HEX0':
+ state = 'HEX1';
+ hexchar = c;
+ if (charCode('0') <= c && c <= charCode('9')) {
+ n = c - charCode('0');
+ } else if (charCode('a') <= c && c <= charCode('f')) {
+ n = c - charCode('a') + 10;
+ } else if (charCode('A') <= c && c <= charCode('F')) {
+ n = c - charCode('A') + 10;
+ } else {
+ out[outIndex++] = charCode('%');
+ out[outIndex++] = c;
+ state = 'CHAR';
+ break;
+ }
+ break;
+
+ case 'HEX1':
+ state = 'CHAR';
+ if (charCode('0') <= c && c <= charCode('9')) {
+ m = c - charCode('0');
+ } else if (charCode('a') <= c && c <= charCode('f')) {
+ m = c - charCode('a') + 10;
+ } else if (charCode('A') <= c && c <= charCode('F')) {
+ m = c - charCode('A') + 10;
+ } else {
+ out[outIndex++] = charCode('%');
+ out[outIndex++] = hexchar;
+ out[outIndex++] = c;
+ break;
+ }
+ out[outIndex++] = 16 * n + m;
+ break;
+ }
+ }
+
+ // TODO support returning arbitrary buffers.
+
+ return out.slice(0, outIndex - 1);
+};
+
+
+QueryString.unescape = function(s, decodeSpaces) {
+ return QueryString.unescapeBuffer(s, decodeSpaces).toString();
+};
+
+
+QueryString.escape = function(str) {
+ return encodeURIComponent(str);
+};
+
+var stringifyPrimitive = function(v) {
+ switch (typeof v) {
+ case 'string':
+ return v;
+
+ case 'boolean':
+ return v ? 'true' : 'false';
+
+ case 'number':
+ return isFinite(v) ? v : '';
+
+ default:
+ return '';
+ }
+};
+
+
+QueryString.stringify = QueryString.encode = function(obj, sep, eq, name) {
+ sep = sep || '&';
+ eq = eq || '=';
+ obj = (obj === null) ? undefined : obj;
+
+ switch (typeof obj) {
+ case 'object':
+ return Object.keys(obj).map(function(k) {
+ if (Array.isArray(obj[k])) {
+ return obj[k].map(function(v) {
+ return QueryString.escape(stringifyPrimitive(k)) +
+ eq +
+ QueryString.escape(stringifyPrimitive(v));
+ }).join(sep);
+ } else {
+ return QueryString.escape(stringifyPrimitive(k)) +
+ eq +
+ QueryString.escape(stringifyPrimitive(obj[k]));
+ }
+ }).join(sep);
+
+ default:
+ if (!name) return '';
+ return QueryString.escape(stringifyPrimitive(name)) + eq +
+ QueryString.escape(stringifyPrimitive(obj));
+ }
+};
+
+// Parse a key=val string.
+QueryString.parse = QueryString.decode = function(qs, sep, eq) {
+ sep = sep || '&';
+ eq = eq || '=';
+ var obj = {};
+
+ if (typeof qs !== 'string' || qs.length === 0) {
+ return obj;
+ }
+
+ qs.split(sep).forEach(function(kvp) {
+ var x = kvp.split(eq);
+ var k = QueryString.unescape(x[0], true);
+ var v = QueryString.unescape(x.slice(1).join(eq), true);
+
+ if (!hasOwnProperty(obj, k)) {
+ obj[k] = v;
+ } else if (!Array.isArray(obj[k])) {
+ obj[k] = [obj[k], v];
+ } else {
+ obj[k].push(v);
+ }
+ });
+
+ return obj;
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_url.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_url.js
new file mode 100644
index 0000000..6b4940f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/node_url.js
@@ -0,0 +1,611 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var punycode = require('url_handler/node_punycode');
+
+exports.parse = urlParse;
+exports.resolve = urlResolve;
+exports.resolveObject = urlResolveObject;
+exports.format = urlFormat;
+
+// Reference: RFC 3986, RFC 1808, RFC 2396
+
+// define these here so at least they only have to be
+// compiled once on the first module load.
+var protocolPattern = /^([a-z0-9.+-]+:)/i,
+ portPattern = /:[0-9]+$/,
+ // RFC 2396: characters reserved for delimiting URLs.
+ delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'],
+ // RFC 2396: characters not allowed for various reasons.
+ unwise = ['{', '}', '|', '\\', '^', '~', '[', ']', '`'].concat(delims),
+ // Allowed by RFCs, but cause of XSS attacks. Always escape these.
+ autoEscape = ['\''],
+ // Characters that are never ever allowed in a hostname.
+ // Note that any invalid chars are also handled, but these
+ // are the ones that are *expected* to be seen, so we fast-path
+ // them.
+ nonHostChars = ['%', '/', '?', ';', '#']
+ .concat(unwise).concat(autoEscape),
+ nonAuthChars = ['/', '@', '?', '#'].concat(delims),
+ hostnameMaxLen = 255,
+ hostnamePartPattern = /^[a-zA-Z0-9][a-z0-9A-Z_-]{0,62}$/,
+ hostnamePartStart = /^([a-zA-Z0-9][a-z0-9A-Z_-]{0,62})(.*)$/,
+ // protocols that can allow "unsafe" and "unwise" chars.
+ unsafeProtocol = {
+ 'javascript': true,
+ 'javascript:': true
+ },
+ // protocols that never have a hostname.
+ hostlessProtocol = {
+ 'javascript': true,
+ 'javascript:': true
+ },
+ // protocols that always have a path component.
+ pathedProtocol = {
+ 'http': true,
+ 'https': true,
+ 'ftp': true,
+ 'gopher': true,
+ 'file': true,
+ 'http:': true,
+ 'ftp:': true,
+ 'gopher:': true,
+ 'file:': true
+ },
+ // protocols that always contain a // bit.
+ slashedProtocol = {
+ 'http': true,
+ 'https': true,
+ 'ftp': true,
+ 'gopher': true,
+ 'file': true,
+ 'http:': true,
+ 'https:': true,
+ 'ftp:': true,
+ 'gopher:': true,
+ 'file:': true
+ },
+ querystring = require('url_handler/node_querystring');
+
+function urlParse(url, parseQueryString, slashesDenoteHost) {
+ if (url && typeof(url) === 'object' && url.href) return url;
+
+ if (typeof url !== 'string') {
+ throw new TypeError("Parameter 'url' must be a string, not " + typeof url);
+ }
+
+ var out = {},
+ rest = url;
+ out.href = "";
+ // cut off any delimiters.
+ // This is to support parse stuff like "<http://foo.com>"
+ for (var i = 0, l = rest.length; i < l; i++) {
+ if (delims.indexOf(rest.charAt(i)) === -1) break;
+ }
+ if (i !== 0) rest = rest.substr(i);
+
+
+ var proto = protocolPattern.exec(rest);
+ if (proto) {
+ proto = proto[0];
+ var lowerProto = proto.toLowerCase();
+ out.protocol = lowerProto;
+ rest = rest.substr(proto.length);
+ }
+
+ // figure out if it's got a host
+ // user@server is *always* interpreted as a hostname, and url
+ // resolution will treat //foo/bar as host=foo,path=bar because that's
+ // how the browser resolves relative URLs.
+ if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) {
+ var slashes = rest.substr(0, 2) === '//';
+ if (slashes && !(proto && hostlessProtocol[proto])) {
+ rest = rest.substr(2);
+ out.slashes = true;
+ }
+ }
+
+ if (!hostlessProtocol[proto] &&
+ (slashes || (proto && !slashedProtocol[proto]))) {
+ // there's a hostname.
+ // the first instance of /, ?, ;, or # ends the host.
+ // don't enforce full RFC correctness, just be unstupid about it.
+
+ // If there is an @ in the hostname, then non-host chars *are* allowed
+ // to the left of the first @ sign, unless some non-auth character
+ // comes *before* the @-sign.
+ // URLs are obnoxious.
+ var atSign = rest.indexOf('@');
+ if (atSign !== -1) {
+ // there *may be* an auth
+ var hasAuth = true;
+ for (var i = 0, l = nonAuthChars.length; i < l; i++) {
+ var index = rest.indexOf(nonAuthChars[i]);
+ if (index !== -1 && index < atSign) {
+ // not a valid auth. Something like http://foo.com/bar@baz/
+ hasAuth = false;
+ break;
+ }
+ }
+ if (hasAuth) {
+ // pluck off the auth portion.
+ out.auth = rest.substr(0, atSign);
+ rest = rest.substr(atSign + 1);
+ }
+ }
+
+ var firstNonHost = -1;
+ for (var i = 0, l = nonHostChars.length; i < l; i++) {
+ var index = rest.indexOf(nonHostChars[i]);
+ if (index !== -1 &&
+ (firstNonHost < 0 || index < firstNonHost)) firstNonHost = index;
+ }
+
+ if (firstNonHost !== -1) {
+ out.host = rest.substr(0, firstNonHost);
+ rest = rest.substr(firstNonHost);
+ } else {
+ out.host = rest;
+ rest = '';
+ }
+
+ // pull out port.
+ var p = parseHost(out.host);
+ var keys = Object.keys(p);
+ for (var i = 0, l = keys.length; i < l; i++) {
+ var key = keys[i];
+ out[key] = p[key];
+ }
+
+ // we've indicated that there is a hostname,
+ // so even if it's empty, it has to be present.
+ out.hostname = out.hostname || '';
+
+ // validate a little.
+ if (out.hostname.length > hostnameMaxLen) {
+ out.hostname = '';
+ } else {
+ var hostparts = out.hostname.split(/\./);
+ for (var i = 0, l = hostparts.length; i < l; i++) {
+ var part = hostparts[i];
+ if (!part) continue;
+ if (!part.match(hostnamePartPattern)) {
+ var newpart = '';
+ for (var j = 0, k = part.length; j < k; j++) {
+ if (part.charCodeAt(j) > 127) {
+ // we replace non-ASCII char with a temporary placeholder
+ // we need this to make sure size of hostname is not
+ // broken by replacing non-ASCII by nothing
+ newpart += 'x';
+ } else {
+ newpart += part[j];
+ }
+ }
+ // we test again with ASCII char only
+ if (!newpart.match(hostnamePartPattern)) {
+ var validParts = hostparts.slice(0, i);
+ var notHost = hostparts.slice(i + 1);
+ var bit = part.match(hostnamePartStart);
+ if (bit) {
+ validParts.push(bit[1]);
+ notHost.unshift(bit[2]);
+ }
+ if (notHost.length) {
+ rest = '/' + notHost.join('.') + rest;
+ }
+ out.hostname = validParts.join('.');
+ break;
+ }
+ }
+ }
+ }
+
+ // hostnames are always lower case.
+ out.hostname = out.hostname.toLowerCase();
+
+ // IDNA Support: Returns a puny coded representation of "domain".
+ // It only converts the part of the domain name that
+ // has non ASCII characters. I.e. it dosent matter if
+ // you call it with a domain that already is in ASCII.
+ var domainArray = out.hostname.split('.');
+ var newOut = [];
+ for (var i = 0; i < domainArray.length; ++i) {
+ var s = domainArray[i];
+ newOut.push(s.match(/[^A-Za-z0-9_-]/) ?
+ 'xn--' + punycode.encode(s) : s);
+ }
+ out.hostname = newOut.join('.');
+
+ out.host = (out.hostname || '') +
+ ((out.port) ? ':' + out.port : '');
+ out.href += out.host;
+ }
+
+ // now rest is set to the post-host stuff.
+ // chop off any delim chars.
+ if (!unsafeProtocol[lowerProto]) {
+
+ // First, make 100% sure that any "autoEscape" chars get
+ // escaped, even if encodeURIComponent doesn't think they
+ // need to be.
+ for (var i = 0, l = autoEscape.length; i < l; i++) {
+ var ae = autoEscape[i];
+ var esc = encodeURIComponent(ae);
+ if (esc === ae) {
+ esc = escape(ae);
+ }
+ rest = rest.split(ae).join(esc);
+ }
+
+ // Now make sure that delims never appear in a url.
+ var chop = rest.length;
+ for (var i = 0, l = delims.length; i < l; i++) {
+ var c = rest.indexOf(delims[i]);
+ if (c !== -1) {
+ chop = Math.min(c, chop);
+ }
+ }
+ rest = rest.substr(0, chop);
+ }
+
+
+ // chop off from the tail first.
+ var hash = rest.indexOf('#');
+ if (hash !== -1) {
+ // got a fragment string.
+ out.hash = rest.substr(hash);
+ rest = rest.slice(0, hash);
+ }
+ var qm = rest.indexOf('?');
+ if (qm !== -1) {
+ out.search = rest.substr(qm);
+ out.query = rest.substr(qm + 1);
+ if (parseQueryString) {
+ out.query = querystring.parse(out.query);
+ }
+ rest = rest.slice(0, qm);
+ } else if (parseQueryString) {
+ // no query string, but parseQueryString still requested
+ out.search = '';
+ out.query = {};
+ }
+ if (rest) out.pathname = rest;
+ if (slashedProtocol[proto] &&
+ out.hostname && !out.pathname) {
+ out.pathname = '/';
+ }
+
+ //to support http.request
+ if (out.pathname || out.search) {
+ out.path = (out.pathname ? out.pathname : '') +
+ (out.search ? out.search : '');
+ }
+
+ // finally, reconstruct the href based on what has been validated.
+ out.href = urlFormat(out);
+ return out;
+}
+
+// format a parsed object into a url string
+function urlFormat(obj) {
+ // ensure it's an object, and not a string url.
+ // If it's an obj, this is a no-op.
+ // this way, you can call url_format() on strings
+ // to clean up potentially wonky urls.
+ if (typeof(obj) === 'string') obj = urlParse(obj);
+
+ var auth = obj.auth || '';
+ if (auth) {
+ auth = auth.split('@').join('%40');
+ for (var i = 0, l = nonAuthChars.length; i < l; i++) {
+ var nAC = nonAuthChars[i];
+ auth = auth.split(nAC).join(encodeURIComponent(nAC));
+ }
+ auth += '@';
+ }
+
+ var protocol = obj.protocol || '',
+ host = (obj.host !== undefined) ? auth + obj.host :
+ obj.hostname !== undefined ? (
+ auth + obj.hostname +
+ (obj.port ? ':' + obj.port : '')
+ ) :
+ false,
+ pathname = obj.pathname || '',
+ query = obj.query &&
+ ((typeof obj.query === 'object' &&
+ Object.keys(obj.query).length) ?
+ querystring.stringify(obj.query) :
+ '') || '',
+ search = obj.search || (query && ('?' + query)) || '',
+ hash = obj.hash || '';
+
+ if (protocol && protocol.substr(-1) !== ':') protocol += ':';
+
+ // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.
+ // unless they had them to begin with.
+ if (obj.slashes ||
+ (!protocol || slashedProtocol[protocol]) && host !== false) {
+ host = '//' + (host || '');
+ if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;
+ } else if (!host) {
+ host = '';
+ }
+
+ if (hash && hash.charAt(0) !== '#') hash = '#' + hash;
+ if (search && search.charAt(0) !== '?') search = '?' + search;
+
+ return protocol + host + pathname + search + hash;
+}
+
+function urlResolve(source, relative) {
+ return urlFormat(urlResolveObject(source, relative));
+}
+
+function urlResolveObject(source, relative) {
+ if (!source) return relative;
+
+ source = urlParse(urlFormat(source), false, true);
+ relative = urlParse(urlFormat(relative), false, true);
+
+ // hash is always overridden, no matter what.
+ source.hash = relative.hash;
+
+ if (relative.href === '') {
+ source.href = urlFormat(source);
+ return source;
+ }
+
+ // hrefs like //foo/bar always cut to the protocol.
+ if (relative.slashes && !relative.protocol) {
+ relative.protocol = source.protocol;
+ //urlParse appends trailing / to urls like http://www.example.com
+ if (slashedProtocol[relative.protocol] &&
+ relative.hostname && !relative.pathname) {
+ relative.path = relative.pathname = '/';
+ }
+ relative.href = urlFormat(relative);
+ return relative;
+ }
+
+ if (relative.protocol && relative.protocol !== source.protocol) {
+ // if it's a known url protocol, then changing
+ // the protocol does weird things
+ // first, if it's not file:, then we MUST have a host,
+ // and if there was a path
+ // to begin with, then we MUST have a path.
+ // if it is file:, then the host is dropped,
+ // because that's known to be hostless.
+ // anything else is assumed to be absolute.
+ if (!slashedProtocol[relative.protocol]) {
+ relative.href = urlFormat(relative);
+ return relative;
+ }
+ source.protocol = relative.protocol;
+ if (!relative.host && !hostlessProtocol[relative.protocol]) {
+ var relPath = (relative.pathname || '').split('/');
+ while (relPath.length && !(relative.host = relPath.shift()));
+ if (!relative.host) relative.host = '';
+ if (!relative.hostname) relative.hostname = '';
+ if (relPath[0] !== '') relPath.unshift('');
+ if (relPath.length < 2) relPath.unshift('');
+ relative.pathname = relPath.join('/');
+ }
+ source.pathname = relative.pathname;
+ source.search = relative.search;
+ source.query = relative.query;
+ source.host = relative.host || '';
+ source.auth = relative.auth;
+ source.hostname = relative.hostname || relative.host;
+ source.port = relative.port;
+ //to support http.request
+ if (source.pathname !== undefined || source.search !== undefined) {
+ source.path = (source.pathname ? source.pathname : '') +
+ (source.search ? source.search : '');
+ }
+ source.slashes = source.slashes || relative.slashes;
+ source.href = urlFormat(source);
+ return source;
+ }
+
+ var isSourceAbs = (source.pathname && source.pathname.charAt(0) === '/'),
+ isRelAbs = (
+ relative.host !== undefined ||
+ relative.pathname && relative.pathname.charAt(0) === '/'
+ ),
+ mustEndAbs = (isRelAbs || isSourceAbs ||
+ (source.host && relative.pathname)),
+ removeAllDots = mustEndAbs,
+ srcPath = source.pathname && source.pathname.split('/') || [],
+ relPath = relative.pathname && relative.pathname.split('/') || [],
+ psychotic = source.protocol &&
+ !slashedProtocol[source.protocol];
+
+ // if the url is a non-slashed url, then relative
+ // links like ../.. should be able
+ // to crawl up to the hostname, as well. This is strange.
+ // source.protocol has already been set by now.
+ // Later on, put the first path part into the host field.
+ if (psychotic) {
+
+ delete source.hostname;
+ delete source.port;
+ if (source.host) {
+ if (srcPath[0] === '') srcPath[0] = source.host;
+ else srcPath.unshift(source.host);
+ }
+ delete source.host;
+ if (relative.protocol) {
+ delete relative.hostname;
+ delete relative.port;
+ if (relative.host) {
+ if (relPath[0] === '') relPath[0] = relative.host;
+ else relPath.unshift(relative.host);
+ }
+ delete relative.host;
+ }
+ mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');
+ }
+
+ if (isRelAbs) {
+ // it's absolute.
+ source.host = (relative.host || relative.host === '') ?
+ relative.host : source.host;
+ source.hostname = (relative.hostname || relative.hostname === '') ?
+ relative.hostname : source.hostname;
+ source.search = relative.search;
+ source.query = relative.query;
+ srcPath = relPath;
+ // fall through to the dot-handling below.
+ } else if (relPath.length) {
+ // it's relative
+ // throw away the existing file, and take the new path instead.
+ if (!srcPath) srcPath = [];
+ srcPath.pop();
+ srcPath = srcPath.concat(relPath);
+ source.search = relative.search;
+ source.query = relative.query;
+ } else if ('search' in relative) {
+ // just pull out the search.
+ // like href='?foo'.
+ // Put this after the other two cases because it simplifies the booleans
+ if (psychotic) {
+ source.hostname = source.host = srcPath.shift();
+ //occationaly the auth can get stuck only in host
+ //this especialy happens in cases like
+ //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
+ var authInHost = source.host && source.host.indexOf('@') > 0 ?
+ source.host.split('@') : false;
+ if (authInHost) {
+ source.auth = authInHost.shift();
+ source.host = source.hostname = authInHost.shift();
+ }
+ }
+ source.search = relative.search;
+ source.query = relative.query;
+ //to support http.request
+ if (source.pathname !== undefined || source.search !== undefined) {
+ source.path = (source.pathname ? source.pathname : '') +
+ (source.search ? source.search : '');
+ }
+ source.href = urlFormat(source);
+ return source;
+ }
+ if (!srcPath.length) {
+ // no path at all. easy.
+ // we've already handled the other stuff above.
+ delete source.pathname;
+ //to support http.request
+ if (!source.search) {
+ source.path = '/' + source.search;
+ } else {
+ delete source.path;
+ }
+ source.href = urlFormat(source);
+ return source;
+ }
+ // if a url ENDs in . or .., then it must get a trailing slash.
+ // however, if it ends in anything else non-slashy,
+ // then it must NOT get a trailing slash.
+ var last = srcPath.slice(-1)[0];
+ var hasTrailingSlash = (
+ (source.host || relative.host) && (last === '.' || last === '..') ||
+ last === '');
+
+ // strip single dots, resolve double dots to parent dir
+ // if the path tries to go above the root, `up` ends up > 0
+ var up = 0;
+ for (var i = srcPath.length; i >= 0; i--) {
+ last = srcPath[i];
+ if (last == '.') {
+ srcPath.splice(i, 1);
+ } else if (last === '..') {
+ srcPath.splice(i, 1);
+ up++;
+ } else if (up) {
+ srcPath.splice(i, 1);
+ up--;
+ }
+ }
+
+ // if the path is allowed to go above the root, restore leading ..s
+ if (!mustEndAbs && !removeAllDots) {
+ for (; up--; up) {
+ srcPath.unshift('..');
+ }
+ }
+
+ if (mustEndAbs && srcPath[0] !== '' &&
+ (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {
+ srcPath.unshift('');
+ }
+
+ if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {
+ srcPath.push('');
+ }
+
+ var isAbsolute = srcPath[0] === '' ||
+ (srcPath[0] && srcPath[0].charAt(0) === '/');
+
+ // put the host back
+ if (psychotic) {
+ source.hostname = source.host = isAbsolute ? '' :
+ srcPath.length ? srcPath.shift() : '';
+ //occationaly the auth can get stuck only in host
+ //this especialy happens in cases like
+ //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
+ var authInHost = source.host && source.host.indexOf('@') > 0 ?
+ source.host.split('@') : false;
+ if (authInHost) {
+ source.auth = authInHost.shift();
+ source.host = source.hostname = authInHost.shift();
+ }
+ }
+
+ mustEndAbs = mustEndAbs || (source.host && srcPath.length);
+
+ if (mustEndAbs && !isAbsolute) {
+ srcPath.unshift('');
+ }
+
+ source.pathname = srcPath.join('/');
+ //to support request.http
+ if (source.pathname !== undefined || source.search !== undefined) {
+ source.path = (source.pathname ? source.pathname : '') +
+ (source.search ? source.search : '');
+ }
+ source.auth = relative.auth || source.auth;
+ source.slashes = source.slashes || relative.slashes;
+ source.href = urlFormat(source);
+ return source;
+}
+
+function parseHost(host) {
+ var out = {};
+ var port = portPattern.exec(host);
+ if (port) {
+ port = port[0];
+ out.port = port.substr(1);
+ host = host.substr(0, host.length - port.length);
+ }
+ if (host) out.hostname = host;
+ return out;
+} \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/url_handler.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/url_handler.js
new file mode 100644
index 0000000..41ec82e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/librejs/lib/url_handler/url_handler.js
@@ -0,0 +1,120 @@
+/**
+ * GNU LibreJS - A browser add-on to block nonfree nontrivial JavaScript.
+ * *
+ * Copyright (C) 2011, 2012, 2013, 2014 Loic J. Duros
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * url_handler
+ * A module using the url tool from Node.js to perform operations on
+ * urls at various spots (tabs, caching, ...) in the add-on.
+ *
+ */
+
+// node.js url module. Makes it easier to resole
+// urls in that datauri loaded dom
+var nodeJsUrl = require("url_handler/node_url");
+
+var urlUtils = {
+
+ getFragment: function (url) {
+ var parse = nodeJsUrl.parse(url);
+ if (parse.hash !== undefined) {
+ return(parse.hash);
+ }
+ },
+
+ removeFragment: function (url) {
+ var parse = nodeJsUrl.parse(url);
+ if (parse.hash !== undefined) {
+ // Amazon track package bug fix.
+ // when url has query string and fragment
+ // the add-on wouldn't remove cache entry
+ // properly.
+ delete parse.hash;
+ }
+ return nodeJsUrl.format(parse);
+ },
+
+ addFragment: function (url, query) {
+ var parse = nodeJsUrl.parse(url);
+
+ // replace hash if it exists.
+ parse.hash = '#' + query;
+
+ return nodeJsUrl.format(parse);
+ },
+
+ addQuery: function (url, query) {
+ var parse = nodeJsUrl.parse(url);
+ console.debug('my parse search', parse.search);
+ if (parse.search === undefined) {
+ parse.search = '?' + query;
+ } else {
+ parse.search = parse.search + '&' + query;
+ console.debug('parse search is now' + parse.search);
+ }
+ return nodeJsUrl.format(parse);
+ },
+
+ getHostname: function (url) {
+ return nodeJsUrl.parse(url).hostname;
+ },
+
+ /**
+ * remove www from hostname.
+ */
+ removeWWW: function (str) {
+ if (str !== undefined) {
+ return str.replace("www.", "", 'i');
+ }
+ return "";
+ },
+
+ /**
+ *
+ * haveSameHostname
+ * Compare that two urls have the same hostname.
+ *
+ */
+ haveSameHostname: function (url1, url2) {
+
+ try {
+
+ var host1 = this.removeWWW(this.getHostname(url1)).toLowerCase();
+ var host2 = this.removeWWW(this.getHostname(url2)).toLowerCase();
+ return host1 === host2;
+
+ } catch (x) {
+
+ console.debug('error with url_handler', x, x.fileName, x.lineNumber);
+
+ }
+ }
+};
+
+exports.parse = nodeJsUrl.parse;
+exports.resolve = nodeJsUrl.resolve;
+exports.resolveObject = nodeJsUrl.resolveObject;
+exports.format = nodeJsUrl.format;
+exports.removeFragment = urlUtils.removeFragment;
+exports.addQuery = urlUtils.addQuery;
+exports.getFragment = urlUtils.getFragment;
+exports.addFragment = urlUtils.addFragment;
+exports.getHostname = urlUtils.getHostname;
+exports.haveSameHostname = urlUtils.haveSameHostname;
+exports.removeWWW = urlUtils.removeWWW;
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/menuitems/lib/menuitems.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/menuitems/lib/menuitems.js
new file mode 100644
index 0000000..075d690
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/menuitems/lib/menuitems.js
@@ -0,0 +1,195 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+const windowUtils = require("sdk/deprecated/window-utils");
+const { Class } = require("sdk/core/heritage");
+const { validateOptions } = require("sdk/deprecated/api-utils");
+const { on, emit, once, off } = require("sdk/event/core");
+const { isBrowser } = require("sdk/window/utils");
+const { EventTarget } = require('sdk/event/target');
+const { unload } = require("unload+");
+
+const menuitemNS = require("sdk/core/namespace").ns();
+const NS_XUL = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
+
+function MenuitemOptions(options) {
+ return validateOptions(options, {
+ id: { is: ['string'] },
+ menuid: { is: ['undefined', 'string'] },
+ insertbefore: { is: ['undefined', 'string', 'object'] },
+ label: { is: ["string"] },
+ disabled: { is: ["undefined", "boolean"], map: function(v) !!v},
+ accesskey: { is: ["undefined", "string"] },
+ key: { is: ["undefined", "string"] },
+ checked: { is: ['undefined', 'boolean'] },
+ className: { is: ["undefined", "string"] },
+ onCommand: { is: ['undefined', 'function'] }
+ });
+}
+
+let Menuitem = Class({
+ extends: EventTarget,
+ initialize: function(options) {
+ options = menuitemNS(this).options = MenuitemOptions(options);
+ EventTarget.prototype.initialize.call(this, options);
+
+ menuitemNS(this).destroyed = false;
+ menuitemNS(this).unloaders = [];
+ menuitemNS(this).menuitems = addMenuitems(this, options).menuitems;
+ },
+ get id() menuitemNS(this).options.id,
+ get label() menuitemNS(this).options.label,
+ set label(val) updateProperty(this, 'label', val),
+ get checked() menuitemNS(this).options.checked,
+ set checked(val) updateProperty(this, 'checked', !!val),
+ get disabled() menuitemNS(this).options.disabled,
+ set disabled(val) updateProperty(this, 'disabled', !!val),
+ get key() menuitemNS(this).options.key,
+ set key(val) updateProperty(this, 'key', val),
+ clone: function (overwrites) {
+ let opts = Object.clone(menuitemNS(this).options);
+ for (let key in overwrites) {
+ opts[key] = ovrewrites[key];
+ }
+ return Menuitem(opts);
+ },
+ get menuid() menuitemNS(this).options.menuid,
+ set menuid(val) {
+ let options = menuitemNS(this).options;
+ options.menuid = val;
+
+ forEachMI(function(menuitem, i, $) {
+ updateMenuitemParent(menuitem, options, $);
+ });
+ },
+ destroy: function() {
+ if (!menuitemNS(this).destroyed) {
+ menuitemNS(this).destroyed = true;
+ menuitemNS(this).unloaders.forEach(function(u) u());
+ menuitemNS(this).unloaders = null;
+ menuitemNS(this).menuitems = null;
+ }
+ return true;
+ }
+});
+
+function addMenuitems(self, options) {
+ let menuitems = [];
+
+ // setup window tracker
+ windowUtils.WindowTracker({
+ onTrack: function (window) {
+ if (!isBrowser(window) || menuitemNS(self).destroyed) return;
+
+ // add the new menuitem to a menu
+ var menuitem = updateMenuitemAttributes(
+ window.document.createElementNS(NS_XUL, "menuitem"), options);
+ var menuitems_i = menuitems.push(menuitem) - 1;
+
+ // add the menutiem to the ui
+ updateMenuitemParent(menuitem, options, function(id) window.document.getElementById(id));
+
+ menuitem.addEventListener("command", function() {
+ if (!self.disabled)
+ emit(self, 'command');
+ }, true);
+
+ // add unloader
+ let unloader = function unloader() {
+ menuitem.parentNode && menuitem.parentNode.removeChild(menuitem);
+ menuitems[menuitems_i] = null;
+ };
+ menuitemNS(self).unloaders.push(function() {
+ remover();
+ unloader();
+ });
+ let remover = unload(unloader, window);
+ }
+ });
+ return {menuitems: menuitems};
+}
+
+function updateMenuitemParent(menuitem, options, $) {
+ // add the menutiem to the ui
+ if (Array.isArray(options.menuid)) {
+ let ids = options.menuid;
+ for (var len = ids.length, i = 0; i < len; i++) {
+ if (tryParent($(ids[i]), menuitem, options.insertbefore))
+ return true;
+ }
+ }
+ else {
+ return tryParent($(options.menuid), menuitem, options.insertbefore);
+ }
+ return false;
+}
+
+function updateMenuitemAttributes(menuitem, options) {
+ menuitem.setAttribute("id", options.id);
+ menuitem.setAttribute("label", options.label);
+
+ if (options.accesskey)
+ menuitem.setAttribute("accesskey", options.accesskey);
+
+ if (options.key)
+ menuitem.setAttribute("key", options.key);
+
+ menuitem.setAttribute("disabled", !!options.disabled);
+
+ if (options.image) {
+ menuitem.classList.add("menuitem-iconic");
+ menuitem.style.listStyleImage = "url('" + options.image + "')";
+ }
+
+ if (options.checked)
+ menuitem.setAttribute('checked', options.checked);
+
+ if (options.className)
+ options.className.split(/\s+/).forEach(function(name) menuitem.classList.add(name));
+
+ return menuitem;
+}
+
+function updateProperty(menuitem, key, val) {
+ menuitemNS(menuitem).options[key] = val;
+
+ forEachMI(function(menuitem) {
+ menuitem.setAttribute(key, val);
+ }, menuitem);
+ return val;
+}
+
+function forEachMI(callback, menuitem) {
+ menuitemNS(menuitem).menuitems.forEach(function(mi, i) {
+ if (!mi) return;
+ callback(mi, i, function(id) mi.ownerDocument.getElementById(id));
+ });
+}
+
+function tryParent(parent, menuitem, before) {
+ if (parent) parent.insertBefore(menuitem, insertBefore(parent, before));
+ return !!parent;
+}
+
+function insertBefore(parent, insertBefore) {
+ if (typeof insertBefore == "number") {
+ switch (insertBefore) {
+ case MenuitemExport.FIRST_CHILD:
+ return parent.firstChild;
+ }
+ return null;
+ }
+ else if (typeof insertBefore == "string") {
+ return parent.querySelector("#" + insertBefore);
+ }
+ return insertBefore;
+}
+
+function MenuitemExport(options) {
+ return Menuitem(options);
+}
+MenuitemExport.FIRST_CHILD = 1;
+
+exports.Menuitem = MenuitemExport;
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/notification-box/lib/notification-box.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/notification-box/lib/notification-box.js
new file mode 100644
index 0000000..94b26cd
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/notification-box/lib/notification-box.js
@@ -0,0 +1,129 @@
+/*
+ * Copyrights Loic J. Duros 2012
+ * lduros@member.fsf.org
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const { Cc, Ci } = require("chrome");
+const { getMostRecentBrowserWindow } = require('sdk/window/utils');
+/* I haven't found this sort of validation functions in the SDK,
+except for the deprecated api-utils module. */
+let isString = function (str) {
+ return typeof(str) == 'string' || str instanceof String;
+};
+
+let isArray = function (obj) {
+ return Object.prototype.toString.call(obj) === '[object Array]';
+};
+
+exports.NotificationBox = function (options) {
+ options = options || {};
+ let mainWindow = getWindow();
+ let nb = mainWindow.gBrowser.getNotificationBox();
+ let notification, priority, label, image, value, buttons = [];
+
+ if (options.value && isString(options.value)) {
+ notification = nb.getNotificationWithValue(options.value);
+ value = options.value;
+ }
+ else {
+ notification = nb.getNotificationWithValue('');
+ value = '';
+ }
+
+ // Add label or create empty notification.
+ if (options.label && isString(options.label))
+ label = options.label;
+ else
+ label = "";
+
+ // Set priority of the notification (from info low, to critical
+ // block.
+ if (options.priority && options.priority in PRIORITY)
+ priority = nb[PRIORITY[options.priority]];
+ else
+ priority = nb[PRIORITY.INFO_LOW];
+
+ // Set a custom icon for the notification or use the regular info
+ // icon.
+ if (options.image && isString(options.image))
+ image = options.image;
+ else
+ image = 'chrome://browser/skin/Info.png';
+
+ // Add buttons.
+ if (isArray(options.buttons)) {
+ for (let i = 0, length = options.buttons.length; i < length; i++) {
+ buttons.push(NotificationButton(options.buttons[i]));
+ }
+ }
+ else if (typeof(options.buttons) === 'object') {
+ // If it's not an array of buttons, then it should be a single button.
+ buttons.push(NotificationButton(options.buttons));
+ }
+ else {
+ buttons = null;
+ }
+
+ // add new notification to notificationbox.
+ nb.appendNotification(label, value,
+ image,
+ priority, buttons);
+
+ return {'notificationbox': nb, 'notification': notification};
+};
+
+
+
+var NotificationButton = function (options) {
+
+ options = options || {};
+ let accessKey, onClick, label, popup;
+
+ if (options.accessKey)
+ accessKey = options.accessKey;
+ else
+ accessKey = '';
+
+ if (options.onClick)
+ onClick = options.onClick;
+ else
+ onClick = function () {};
+
+ if (options.label)
+ label = options.label;
+ else
+ label = "";
+
+ // no popup for now... maybe we can use a panel later.
+ popup = null;
+
+ return {label: label,
+ accessKey: accessKey,
+ callback: onClick,
+ popup: popup};
+
+};
+
+const PRIORITY = {
+ 'INFO_LOW': 'PRIORITY_INFO_LOW',
+ 'INFO_MEDIUM': 'PRIORITY_INFO_MEDIUM',
+ 'INFO_HIGH': 'PRIORITY_INFO_HIGH',
+ 'WARNING_LOW': 'PRIORITY_WARNING_LOW',
+ 'WARNING_MEDIUM': 'PRIORITY_WARNING_MEDIUM',
+ 'WARNING_HIGH': 'PRIORITY_WARNING_HIGH',
+ 'CRITICAL_LOW': 'PRIORITY_CRITICAL_LOW',
+ 'CRITICAL_MEDIUM': 'PRIORITY_CRITICAL_MEDIUM',
+ 'CRITICAL_HIGH': 'PRIORITY_CRITICAL_HIGH',
+ 'CRITICAL_BLOCK': 'PRIORITY_CRITICAL_BLOCK'
+};
+
+let getWindow = function () {
+ return getMostRecentBrowserWindow();
+};
+
+exports.PRIORITY = PRIORITY;
+
diff --git a/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/vold-utils/lib/unload+.js b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/vold-utils/lib/unload+.js
new file mode 100644
index 0000000..285fd46
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/jid1-KtlZuoiikVfFew@jetpack/resources/vold-utils/lib/unload+.js
@@ -0,0 +1,80 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+const { Class } = require("sdk/core/heritage");
+const unloadNS = require("sdk/core/namespace").ns();
+
+var Unloader = exports.Unloader = Class({
+ initialize: function Unloader() {
+ let unloaders = unloadNS(this).unloaders = [];
+
+ let unloadersUnlaod = unloadNS(this).unloadersUnlaod = function() {
+ unloaders.slice().forEach(function(u) u());
+ unloaders.length = 0;
+ }
+
+ require("sdk/system/unload").when(unloadersUnlaod);
+ },
+ unload: function unload(callback, container) {
+ // Calling with no arguments runs all the unloader callbacks
+ if (callback == null) {
+ unloadNS(this).unloadersUnlaod();
+ return null;
+ }
+
+ var remover = removeUnloader.bind(null, unloader, unloadNS(this).unloaders);
+
+ // The callback is bound to the lifetime of the container if we have one
+ if (container != null) {
+ // Remove the unloader when the container unloads
+ container.addEventListener("unload", remover, false);
+
+ // Wrap the callback to additionally remove the unload listener
+ let origCallback = callback;
+ callback = function() {
+ container.removeEventListener("unload", remover, false);
+ origCallback();
+ }
+ }
+
+ // Wrap the callback in a function that ignores failures
+ function unloader() {
+ try {
+ callback();
+ }
+ catch(e) {
+ console.error(e);
+ }
+ }
+ unloadNS(this).unloaders.push(unloader);
+
+ // Provide a way to remove the unloader
+ return remover;
+ }
+});
+
+function removeUnloader(unloader, unloaders) {
+ let index = unloaders.indexOf(unloader);
+ if (index != -1)
+ unloaders.splice(index, 1);
+}
+
+/**
+ * Save callbacks to run when unloading. Optionally scope the callback to a
+ * container, e.g., window. Provide a way to run all the callbacks.
+ *
+ * @usage unload(): Run all callbacks and release them.
+ *
+ * @usage unload(callback): Add a callback to run on unload.
+ * @param [function] callback: 0-parameter function to call on unload.
+ * @return [function]: A 0-parameter function that undoes adding the callback.
+ *
+ * @usage unload(callback, container) Add a scoped callback to run on unload.
+ * @param [function] callback: 0-parameter function to call on unload.
+ * @param [node] container: Remove the callback when this container unloads.
+ * @return [function]: A 0-parameter function that undoes adding the callback.
+ */
+const gUnload = Unloader();
+exports.unload = gUnload.unload.bind(gUnload);
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/bootstrap.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/bootstrap.js
new file mode 100644
index 0000000..09530b9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/bootstrap.js
@@ -0,0 +1,169 @@
+/*
+ * This file is part of the Adblock Plus build tools,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cr = Components.results;
+const Cu = Components.utils;
+
+let {Services, atob, btoa, File, TextDecoder, TextEncoder} = Cu.import("resource://gre/modules/Services.jsm", null);
+let XMLHttpRequest = Components.Constructor("@mozilla.org/xmlextras/xmlhttprequest;1", "nsIXMLHttpRequest");
+
+let addonData = null;
+
+function startup(params, reason)
+{
+ addonData = params;
+ Services.obs.addObserver(RequireObserver, "adblockplus-require", true);
+ onShutdown.add(function() Services.obs.removeObserver(RequireObserver, "adblockplus-require"));
+
+ require("main");
+}
+
+function shutdown(params, reason)
+{
+ let windowNames = ["abp:subscriptionSelection", "abp:composer", "abp:filters"];
+ for (let i = 0; i < windowNames.length; i++)
+ {
+ let enumerator = Services.wm.getEnumerator(windowNames[i]);
+ while (enumerator.hasMoreElements())
+ {
+ let window = enumerator.getNext().QueryInterface(Ci.nsIDOMWindow);
+ window.setTimeout("window.close()", 0); // Closing immediately might not work due to modal windows
+ try
+ {
+ window.close();
+ } catch(e) {}
+ }
+ }
+ onShutdown.done = true;
+ for (let i = shutdownHandlers.length - 1; i >= 0; i --)
+ {
+ try
+ {
+ shutdownHandlers[i]();
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ }
+ }
+ shutdownHandlers = null;
+
+ // Make sure to release our ties to the modules even if the sandbox cannot be
+ // released for some reason.
+ for (let key in require.scopes)
+ {
+ let scope = require.scopes[key];
+ let list = Object.keys(scope);
+ for (let i = 0; i < list.length; i++)
+ scope[list[i]] = null;
+ }
+ require.scopes = null;
+ addonData = null;
+}
+
+function install(params, reason) {}
+
+function uninstall(params, reason)
+{
+ const ADDON_UNINSTALL = 6; // https://developer.mozilla.org/en/Extensions/Bootstrapped_extensions#Reason_constants
+ if (reason == ADDON_UNINSTALL)
+ {
+ // Users often uninstall/reinstall extension to "fix" issues. Clear current
+ // version number on uninstall to rerun first-run actions in this scenario.
+ Services.prefs.clearUserPref("extensions.adblockplus.currentVersion");
+ }
+}
+let shutdownHandlers = [];
+let onShutdown =
+{
+ done: false,
+ add: function(handler)
+ {
+ if (shutdownHandlers.indexOf(handler) < 0)
+ shutdownHandlers.push(handler);
+ },
+ remove: function(handler)
+ {
+ let index = shutdownHandlers.indexOf(handler);
+ if (index >= 0)
+ shutdownHandlers.splice(index, 1);
+ }
+};
+
+function require(module)
+{
+ let scopes = require.scopes;
+ if (!(module in scopes))
+ {
+ if (module == "info")
+ {
+ let applications = {"{a23983c0-fd0e-11dc-95ff-0800200c9a66}": "fennec", "toolkit@mozilla.org": "toolkit", "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}": "firefox", "dlm@emusic.com": "emusic", "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}": "seamonkey", "{aa3c5121-dab2-40e2-81ca-7ea25febc110}": "fennec2", "{a79fe89b-6662-4ff4-8e88-09950ad4dfde}": "conkeror", "{aa5ca914-c309-495d-91cf-3141bbb04115}": "midbrowser", "songbird@songbirdnest.com": "songbird", "prism@developer.mozilla.org": "prism", "{3550f703-e582-4d05-9a08-453d09bdfdc6}": "thunderbird"};
+ let appInfo = Services.appinfo;
+
+ scopes[module] = {};
+ scopes[module].exports =
+ {
+ addonID: addonData.id,
+ addonVersion: addonData.version,
+ addonRoot: addonData.resourceURI.spec,
+ addonName: "adblockplus",
+ application: (appInfo.ID in applications ? applications[appInfo.ID] : "other"),
+ applicationVersion: appInfo.version,
+ platform: "gecko",
+ platformVersion: appInfo.platformVersion
+ };
+ }
+ else
+ {
+ let url = addonData.resourceURI.spec + "lib/" + module + ".js";
+ scopes[module] = {
+ Cc: Cc,
+ Ci: Ci,
+ Cr: Cr,
+ Cu: Cu,
+ atob: atob,
+ btoa: btoa,
+ File: File,
+ require: require,
+
+ onShutdown: onShutdown,
+
+ XMLHttpRequest: XMLHttpRequest,
+
+ exports: {}};
+ Services.scriptloader.loadSubScript(url, scopes[module]);
+ }
+ }
+ return scopes[module].exports;
+}
+require.scopes = {__proto__: null};
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+let RequireObserver =
+{
+ observe: function(subject, topic, data)
+ {
+ if (topic == "adblockplus-require")
+ {
+ subject.wrappedJSObject.exports = require(data);
+ }
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver])
+}; \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome.manifest b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome.manifest
new file mode 100644
index 0000000..9778eda
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome.manifest
@@ -0,0 +1,58 @@
+content adblockplus chrome/content/
+skin adblockplus classic/1.0 chrome/skin/
+locale adblockplus en-US chrome/locale/en-US/
+locale adblockplus ar chrome/locale/ar/
+locale adblockplus bg chrome/locale/bg/
+locale adblockplus ca chrome/locale/ca/
+locale adblockplus cs chrome/locale/cs/
+locale adblockplus da chrome/locale/da/
+locale adblockplus de chrome/locale/de/
+locale adblockplus dsb chrome/locale/dsb/
+locale adblockplus el chrome/locale/el/
+locale adblockplus en-GB chrome/locale/en-GB/
+locale adblockplus eo chrome/locale/eo/
+locale adblockplus es-AR chrome/locale/es-AR/
+locale adblockplus es-ES chrome/locale/es-ES/
+locale adblockplus es-MX chrome/locale/es-MX/
+locale adblockplus et chrome/locale/et/
+locale adblockplus eu chrome/locale/eu/
+locale adblockplus fa chrome/locale/fa/
+locale adblockplus fi chrome/locale/fi/
+locale adblockplus fr chrome/locale/fr/
+locale adblockplus fy-NL chrome/locale/fy-NL/
+locale adblockplus gl chrome/locale/gl/
+locale adblockplus he chrome/locale/he/
+locale adblockplus hr chrome/locale/hr/
+locale adblockplus hsb chrome/locale/hsb/
+locale adblockplus hu chrome/locale/hu/
+locale adblockplus hy-AM chrome/locale/hy-AM/
+locale adblockplus id chrome/locale/id/
+locale adblockplus is chrome/locale/is/
+locale adblockplus it chrome/locale/it/
+locale adblockplus ja chrome/locale/ja/
+locale adblockplus kk chrome/locale/kk/
+locale adblockplus ko chrome/locale/ko/
+locale adblockplus lt chrome/locale/lt/
+locale adblockplus lv chrome/locale/lv/
+locale adblockplus ms chrome/locale/ms/
+locale adblockplus nb-NO chrome/locale/nb-NO/
+locale adblockplus nl chrome/locale/nl/
+locale adblockplus pl chrome/locale/pl/
+locale adblockplus pt-BR chrome/locale/pt-BR/
+locale adblockplus pt-PT chrome/locale/pt-PT/
+locale adblockplus ro chrome/locale/ro/
+locale adblockplus ru chrome/locale/ru/
+locale adblockplus sk chrome/locale/sk/
+locale adblockplus sl chrome/locale/sl/
+locale adblockplus sq chrome/locale/sq/
+locale adblockplus sr chrome/locale/sr/
+locale adblockplus sv-SE chrome/locale/sv-SE/
+locale adblockplus th chrome/locale/th/
+locale adblockplus tr chrome/locale/tr/
+locale adblockplus uk chrome/locale/uk/
+locale adblockplus vi chrome/locale/vi/
+locale adblockplus zh-CN chrome/locale/zh-CN/
+locale adblockplus zh-TW chrome/locale/zh-TW/
+
+# fennec settings
+override chrome://adblockplus/content/ui/settings.xul chrome://adblockplus/content/ui/fennecSettings.xul application={a23983c0-fd0e-11dc-95ff-0800200c9a66} application={aa3c5121-dab2-40e2-81ca-7ea25febc110}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/errors.html b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/errors.html
new file mode 100644
index 0000000..5c18929
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/errors.html
@@ -0,0 +1,111 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <title>Adblock Plus Errors</title>
+ <style type="text/css">
+ .warning, .error
+ {
+ border: 1px dashed black;
+ margin: 5px;
+ padding: 2px;
+ white-space: pre-wrap;
+ }
+
+ .error
+ {
+ background-color: #fff0f0;
+ }
+
+ .warning
+ {
+ background-color: #ffffe0;
+ }
+
+ button
+ {
+ float: right;
+ }
+ </style>
+</head>
+<body>
+ <button onclick="window.location.reload();">Refresh</button>
+ <button onclick="clearErrors();">Clear errors</button>
+
+ <script type="application/x-javascript;version=1.7">
+ let id = null;
+ try {
+ let {addonVersion, addonID} = require("info");
+
+ let text = "You are running Adblock Plus " + addonVersion;
+ text += ".";
+ document.write("<p>" + text + "</p>");
+
+ id = addonID.replace(/[\{\}]/g, "");
+ } catch (e) {}
+
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=664695 - starting with
+ // Gecko 19 this function returns the result, before that it wrote to a
+ // parameter.
+ let outparam = {};
+ let messages = Components.classes["@mozilla.org/consoleservice;1"]
+ .getService(Components.interfaces.nsIConsoleService)
+ .getMessageArray(outparam, {});
+ messages = messages || outparam.value || [];
+ messages = messages.filter(function(message)
+ {
+ return (message instanceof Components.interfaces.nsIScriptError &&
+ !/^https?:/i.test(message.sourceName) &&
+ (/adblock/i.test(message.errorMessage) || /adblock/i.test(message.sourceName) ||
+ id && (message.errorMessage.indexOf(id) >= 0 || message.sourceName && message.sourceName.indexOf(id) >= 0)));
+ });
+
+ if (messages.length)
+ {
+ document.write("<p>Errors related to Adblock Plus:</p>");
+
+ for each (let message in messages)
+ {
+ let type = (message.flags & Components.interfaces.nsIScriptError.warningFlag ? "warning" : "error");
+ let html = "<b>" + (type == "warning" ? "Warning:" : "Error:") + "</b><br>";
+ html += encodeHTML(message.errorMessage) + "<br><br>";
+ if (message.sourceLine)
+ html += "Source line: " + encodeHTML(message.sourceLine) + "<br>";
+ if (message.sourceName)
+ html += "Location: " + encodeHTML(message.sourceName) + " line " + message.lineNumber + "<br>";
+ html = html.replace(/(<br>)+$/, "");
+ document.write("<div class='" + type + "'>" +
+ html +
+ "</div>");
+ }
+ }
+ else
+ {
+ document.write("<p>No errors found.</p>");
+ }
+
+ function require(module)
+ {
+ let {Services} = Components.utils.import("resource://gre/modules/Services.jsm");
+ let result = {};
+ result.wrappedJSObject = result;
+ Services.obs.notifyObservers(result, "adblockplus-require", module);
+ return result.exports;
+ }
+
+ function encodeHTML(string)
+ {
+ return string.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
+ }
+
+ function clearErrors()
+ {
+ Components.classes["@mozilla.org/consoleservice;1"]
+ .getService(Components.interfaces.nsIConsoleService)
+ .reset();
+ window.location.reload();
+ }
+ </script>
+</body>
+</html>
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/objtabs.css b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/objtabs.css
new file mode 100644
index 0000000..ce3a830
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/objtabs.css
@@ -0,0 +1,82 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+@namespace url("http://www.w3.org/1999/xhtml");
+
+.%%CLASSVISIBLETOP%%, .%%CLASSVISIBLEBOTTOM%%, .%%CLASSHIDDEN%%
+{
+ position: fixed !important;
+ display: block !important;
+
+ width: auto !important;
+ height: auto !important;
+ right: auto !important;
+ bottom: auto !important;
+ z-index: 65535 !important;
+ float: left !important;
+ border-color: black !important;
+ border-style: solid !important;
+ background: white !important;
+ color: black !important;
+ cursor: pointer !important;
+ white-space: nowrap !important;
+ font-family: Arial,Helvetica,Sans-Serif !important;
+ font-size: 10px !important;
+ font-style: normal !important;
+ font-variant: normal !important;
+ font-weight: normal !important;
+ letter-spacing: normal !important;
+ line-height: normal !important;
+ text-align: center !important;
+ text-decoration: none !important;
+ text-indent: 0px !important;
+ text-transform: none !important;
+ direction: ltr !important;
+ padding: 0px 5px !important;
+ -moz-binding: none !important;
+ -moz-user-focus: none !important;
+ -moz-user-input: none !important;
+ -moz-user-select: none !important;
+}
+
+.%%CLASSVISIBLETOP%%, .%%CLASSHIDDEN%%
+{
+ border-width: 1px 1px 0px 1px !important;
+ border-top-left-radius: 10px !important;
+ border-top-right-radius: 10px !important;
+ border-bottom-left-radius: 0px !important;
+ border-bottom-right-radius: 0px !important;
+}
+
+.%%CLASSVISIBLEBOTTOM%%
+{
+ border-width: 0px 1px 1px 1px !important;
+ border-top-left-radius: 0px !important;
+ border-top-right-radius: 0px !important;
+ border-bottom-left-radius: 10px !important;
+ border-bottom-right-radius: 10px !important;
+}
+
+.%%CLASSVISIBLETOP%%, .%%CLASSVISIBLEBOTTOM%%
+{
+ visibility: visible !important;
+}
+
+.%%CLASSHIDDEN%%
+{
+ visibility: hidden !important;
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/composer.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/composer.js
new file mode 100644
index 0000000..f7b8087
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/composer.js
@@ -0,0 +1,412 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+let nodes = null;
+let item = null;
+let advancedMode = false;
+
+function init()
+{
+ [nodes, item] = window.arguments;
+
+ E("filterType").value = (!item.filter || item.filter.disabled || item.filter instanceof WhitelistFilter ? "filterlist" : "whitelist");
+ E("customPattern").value = item.location;
+
+ let insertionPoint = E("customPatternBox");
+ let addSuggestion = function(address)
+ {
+ // Always drop protocol and www. from the suggestion
+ address = address.replace(/^[\w\-]+:\/+(?:www\.)?/, "");
+
+ let suggestion = document.createElement("radio");
+ suggestion.setAttribute("value", address);
+ suggestion.setAttribute("label", address);
+ suggestion.setAttribute("crop", "center");
+ suggestion.setAttribute("class", "suggestion");
+ insertionPoint.parentNode.insertBefore(suggestion, insertionPoint);
+
+ return address;
+ }
+
+ let ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
+ try
+ {
+ let suggestions = [""];
+
+ let url = ioService.newURI(item.location, null, null)
+ .QueryInterface(Ci.nsIURL);
+ let suffix = (url.query ? "?*" : "");
+ url.query = "";
+ url.ref = "";
+ suggestions[1] = addSuggestion(url.spec + suffix);
+
+ let parentURL = ioService.newURI(url.fileName == "" ? ".." : ".", null, url);
+ if (!parentURL.equals(url))
+ suggestions[2] = addSuggestion(parentURL.spec + "*");
+ else
+ suggestions[2] = suggestions[1];
+
+ let rootURL = ioService.newURI("/", null, url);
+ if (!rootURL.equals(parentURL) && !rootURL.equals(url))
+ suggestions[3] = addSuggestion(rootURL.spec + "*");
+ else
+ suggestions[3] = suggestions[2];
+
+ try
+ {
+ suggestions[4] = addSuggestion(url.host.replace(/^www\./, "") + "^");
+
+ // Prefer example.com^ to example.com/*
+ let undesired = suggestions[4].replace(/\^$/, "/*");
+ for (let i = 0; i < suggestions.length - 1; i++)
+ if (suggestions[i] == undesired)
+ suggestions[i] = suggestions[4];
+
+ for (let child = insertionPoint.parentNode.firstChild; child; child = child.nextSibling)
+ {
+ if (child.localName == "radio" && child.getAttribute("value") == undesired)
+ {
+ child.parentNode.removeChild(child);
+ break;
+ }
+ }
+ }
+ catch (e)
+ {
+ suggestions[4] = suggestions[3];
+ }
+
+ try
+ {
+ let effectiveTLD = Cc["@mozilla.org/network/effective-tld-service;1"].getService(Ci.nsIEffectiveTLDService);
+ let host = url.host;
+ let baseDomain = effectiveTLD.getBaseDomainFromHost(host);
+ if (baseDomain != host.replace(/^www\./, ""))
+ suggestions[5] = addSuggestion(baseDomain + "^");
+ else
+ suggestions[5] = suggestions[4];
+ }
+ catch (e)
+ {
+ suggestions[5] = suggestions[4];
+ }
+
+ E("patternGroup").value = (Prefs.composer_default in suggestions ? suggestions[Prefs.composer_default] : suggestions[1]);
+ }
+ catch (e)
+ {
+ // IOService returned nsIURI - not much we can do with it
+ addSuggestion(item.location);
+ E("patternGroup").value = "";
+ }
+ if (Prefs.composer_default == 0)
+ E("customPattern").focus();
+ else
+ E("patternGroup").focus();
+
+ let types = [];
+ for (let type in Policy.localizedDescr)
+ {
+ types.push(parseInt(type));
+ }
+ types.sort(function(a, b) {
+ if (a < b)
+ return -1;
+ else if (a > b)
+ return 1;
+ else
+ return 0;
+ });
+
+ let docDomain = item.docDomain;
+ let thirdParty = item.thirdParty;
+
+ if (docDomain)
+ docDomain = docDomain.replace(/^www\./i, "").replace(/\.+$/, "");
+ if (docDomain)
+ E("domainRestriction").value = docDomain;
+
+ E("thirdParty").hidden = !thirdParty;
+ E("firstParty").hidden = thirdParty;
+
+ let typeGroup = E("typeGroup");
+ let defaultTypes = RegExpFilter.prototype.contentType & ~RegExpFilter.typeMap.DOCUMENT;
+ let isDefaultType = (RegExpFilter.typeMap[item.typeDescr] & defaultTypes) != 0;
+ for each (let type in types)
+ {
+ if (type == Policy.type.ELEMHIDE)
+ continue;
+
+ let typeNode = document.createElement("checkbox");
+ typeNode.setAttribute("value", Policy.typeDescr[type].toLowerCase().replace(/\_/g, "-"));
+ typeNode.setAttribute("label", Policy.localizedDescr[type].toLowerCase());
+
+ let typeMask = RegExpFilter.typeMap[Policy.typeDescr[type]];
+ typeNode._defaultType = (typeMask & defaultTypes) != 0;
+ if ((isDefaultType && typeNode._defaultType) || (!isDefaultType && item.type == type))
+ typeNode.setAttribute("checked", "true");
+
+ if (item.type == type)
+ typeNode.setAttribute("disabled", "true");
+ typeNode.addEventListener("command", function() checkboxUpdated(this), false);
+ typeGroup.appendChild(typeNode);
+ }
+
+ let collapseDefault = E("collapseDefault");
+ collapseDefault.label = collapseDefault.getAttribute(Prefs.fastcollapse ? "label_no" : "label_yes");
+ E("collapse").value = "";
+ E("collapse").setAttribute("label", collapseDefault.label);
+
+ let warning = E("disabledWarning");
+ generateLinkText(warning);
+ warning.hidden = Prefs.enabled;
+
+ updatePatternSelection();
+}
+
+function checkboxUpdated(checkbox)
+{
+ checkbox._lastChange = Date.now();
+ updateFilter();
+}
+
+function updateFilter()
+{
+ let filter = "";
+
+ let type = E("filterType").value
+ if (type == "whitelist")
+ filter += "@@";
+
+ let pattern = E("patternGroup").value;
+ if (pattern == "")
+ pattern = E("customPattern").value;
+
+ if (E("anchorStart").checked)
+ filter += E("anchorStart").flexibleAnchor ? "||" : "|";
+
+ filter += pattern;
+
+ if (E("anchorEnd").checked)
+ filter += "|";
+
+ if (advancedMode)
+ {
+ let options = [];
+
+ if (E("domainRestrictionEnabled").checked)
+ {
+ let domainRestriction = E("domainRestriction").value.replace(/[,\s]/g, "").replace(/\.+$/, "");
+ if (domainRestriction)
+ options.push([E("domainRestrictionEnabled")._lastChange || 0, "domain=" + domainRestriction]);
+ }
+
+ if (E("firstParty").checked)
+ options.push([E("firstParty")._lastChange || 0, "~third-party"]);
+ if (E("thirdParty").checked)
+ options.push([E("thirdParty")._lastChange || 0, "third-party"]);
+
+ if (E("matchCase").checked)
+ options.push([E("matchCase")._lastChange || 0, "match-case"]);
+
+ let collapse = E("collapse");
+ disableElement(collapse, type == "whitelist", "value", "");
+ if (collapse.value != "")
+ options.push([collapse._lastChange, collapse.value]);
+
+ let enabledTypes = [];
+ let disabledTypes = [];
+ let forceEnabledTypes = [];
+ for (let typeNode = E("typeGroup").firstChild; typeNode; typeNode = typeNode.nextSibling)
+ {
+ let value = typeNode.getAttribute("value");
+ if (value == "document")
+ disableElement(typeNode, type != "whitelist", "checked", false);
+
+ if (!typeNode._defaultType)
+ {
+ if (typeNode.getAttribute("checked") == "true")
+ forceEnabledTypes.push([typeNode._lastChange || 0, value]);
+ }
+ else if (typeNode.getAttribute("checked") == "true")
+ enabledTypes.push([typeNode._lastChange || 0, value]);
+ else
+ disabledTypes.push([typeNode._lastChange || 0, "~" + value]);
+ }
+ if (!forceEnabledTypes.length && disabledTypes.length < enabledTypes.length)
+ options.push.apply(options, disabledTypes);
+ else
+ options.push.apply(options, enabledTypes);
+ options.push.apply(options, forceEnabledTypes);
+
+ if (options.length)
+ {
+ options.sort(function(a, b) a[0] - b[0]);
+ filter += "$" + options.map(function(o) o[1]).join(",");
+ }
+ }
+ else
+ {
+ let defaultTypes = RegExpFilter.prototype.contentType & ~RegExpFilter.typeMap.DOCUMENT;
+ let isDefaultType = (RegExpFilter.typeMap[item.typeDescr] & defaultTypes) != 0;
+ if (!isDefaultType)
+ filter += "$" + item.typeDescr.toLowerCase().replace(/\_/g, "-");
+ }
+
+ filter = Filter.normalize(filter);
+ E("regexpWarning").hidden = !Filter.regexpRegExp.test(filter);
+
+ let isSlow = false;
+ let compiledFilter = Filter.fromText(filter);
+ if (E("regexpWarning").hidden)
+ {
+ if (compiledFilter instanceof RegExpFilter && defaultMatcher.isSlowFilter(compiledFilter))
+ isSlow = true;
+ }
+ E("shortpatternWarning").hidden = !isSlow;
+
+ E("matchWarning").hidden = compiledFilter instanceof RegExpFilter && compiledFilter.matches(item.location, item.typeDescr, item.docDomain, item.thirdParty);
+
+ E("filter").value = filter;
+}
+
+function generateLinkText(element, replacement)
+{
+ let template = element.getAttribute("textTemplate");
+ if (typeof replacement != "undefined")
+ template = template.replace(/\?1\?/g, replacement)
+
+ let [, beforeLink, linkText, afterLink] = /(.*)\[link\](.*)\[\/link\](.*)/.exec(template) || [null, "", template, ""];
+ while (element.firstChild && element.firstChild.nodeType != Node.ELEMENT_NODE)
+ element.removeChild(element.firstChild);
+ while (element.lastChild && element.lastChild.nodeType != Node.ELEMENT_NODE)
+ element.removeChild(element.lastChild);
+ if (!element.firstChild)
+ return;
+
+ element.firstChild.textContent = linkText;
+ element.insertBefore(document.createTextNode(beforeLink), element.firstChild);
+ element.appendChild(document.createTextNode(afterLink));
+}
+
+function updatePatternSelection()
+{
+ let pattern = E("patternGroup").value;
+ if (pattern == "")
+ {
+ pattern = E("customPattern").value;
+ }
+ else
+ {
+ E("anchorStart").checked = true;
+ E("anchorEnd").checked = false;
+ }
+
+ function testFilter(/**String*/ filter) /**Boolean*/
+ {
+ return RegExpFilter.fromText(filter + "$" + item.typeDescr).matches(item.location, item.typeDescr, item.docDomain, item.thirdParty);
+ }
+
+ let anchorStartCheckbox = E("anchorStart");
+ if (!/^\*/.test(pattern) && testFilter("||" + pattern))
+ {
+ disableElement(anchorStartCheckbox, false, "checked", false);
+ [anchorStartCheckbox.label, anchorStartCheckbox.accessKey] = Utils.splitLabel(anchorStartCheckbox.getAttribute("labelFlexible"));
+ anchorStartCheckbox.flexibleAnchor = true;
+ }
+ else
+ {
+ disableElement(anchorStartCheckbox, /^\*/.test(pattern) || !testFilter("|" + pattern), "checked", false);
+ [anchorStartCheckbox.label, anchorStartCheckbox.accessKey] = Utils.splitLabel(anchorStartCheckbox.getAttribute("labelRegular"));
+ anchorStartCheckbox.flexibleAnchor = false;
+ }
+ disableElement(E("anchorEnd"), /[\*\^]$/.test(pattern) || !testFilter(pattern + "|"), "checked", false);
+
+ updateFilter();
+ setAdvancedMode(document.documentElement.getAttribute("advancedMode") == "true");
+}
+
+function updateCustomPattern()
+{
+ E("patternGroup").value = "";
+ updatePatternSelection();
+}
+
+function addFilter() {
+ let filter = Filter.fromText(document.getElementById("filter").value);
+ filter.disabled = false;
+
+ FilterStorage.addFilter(filter);
+
+ if (nodes)
+ Policy.refilterNodes(nodes, item);
+
+ return true;
+}
+
+function setAdvancedMode(mode) {
+ advancedMode = mode;
+
+ var dialog = document.documentElement;
+ dialog.setAttribute("advancedMode", advancedMode);
+
+ var button = dialog.getButton("disclosure");
+ button.setAttribute("label", dialog.getAttribute(advancedMode ? "buttonlabeldisclosure_off" : "buttonlabeldisclosure_on"));
+
+ updateFilter();
+}
+
+function disableElement(element, disable, valueProperty, disabledValue) {
+ if ((element.getAttribute("disabled") == "true") == disable)
+ return;
+
+ if (disable)
+ {
+ element.setAttribute("disabled", "true");
+ element._abpStoredValue = element[valueProperty];
+ element[valueProperty] = disabledValue;
+ }
+ else
+ {
+ element.removeAttribute("disabled");
+ if ("_abpStoredValue" in element)
+ element[valueProperty] = element._abpStoredValue;
+ delete element._abpStoredValue;
+ }
+}
+
+function openPreferences()
+{
+ UI.openFiltersDialog(Filter.fromText(E("filter").value));
+}
+
+function doEnable() {
+ Prefs.enabled = true;
+ E("disabledWarning").hidden = true;
+}
+
+/**
+ * Selects or unselects all type checkboxes except those
+ * that are disabled.
+ */
+function selectAllTypes(/**Boolean*/ select)
+{
+ for (let typeNode = E("typeGroup").firstChild; typeNode; typeNode = typeNode.nextSibling)
+ if (typeNode.getAttribute("disabled") != "true")
+ typeNode.checked = select;
+ updateFilter();
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/composer.xul b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/composer.xul
new file mode 100644
index 0000000..8931e16
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/composer.xul
@@ -0,0 +1,118 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<!DOCTYPE overlay SYSTEM "chrome://adblockplus/locale/composer.dtd">
+
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://adblockplus/skin/composer.css" type="text/css"?>
+
+<dialog id="abp-composer"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ title="&dialog.title;"
+ onload="init()"
+ ondialogaccept="return addFilter()"
+ ondialogdisclosure="setAdvancedMode(!advancedMode)"
+ buttons="accept,cancel,disclosure"
+ width="800px"
+ height="400px"
+ persist="screenX screenY width height sizemode advancedMode"
+ advancedMode="false"
+ buttonlabelaccept="&accept.label;"
+ buttonlabeldisclosure="&advanced.label;"
+ buttonlabeldisclosure_on="&advanced.label;"
+ buttonlabeldisclosure_off="&basic.label;"
+ windowtype="abp:composer">
+
+ <script type="application/x-javascript;version=1.7" src="utils.js"/>
+ <script type="application/x-javascript;version=1.7" src="composer.js"/>
+
+ <popupset>
+ <tooltip id="domainRestrictionHelp" label="&domainRestriction.help;"/>
+ </popupset>
+
+ <description id="disabledWarning" hidden="true" textTemplate="&disabled.warning;">
+ <label class="text-link" onclick="doEnable()"/>
+ </description>
+
+ <hbox id="filterBox" align="center">
+ <label control="filter" value="&filter.label;"/>
+ <textbox id="filter" flex="1" tabindex="-1" readonly="true"/>
+ <button id="preferences" label="&preferences.label;" oncommand="openPreferences()"/>
+ </hbox>
+
+ <radiogroup orient="horizontal" id="filterType" oncommand="updateFilter()">
+ <radio label="&type.filter.label;" value="filterlist" flex="1"/>
+ <radio label="&type.whitelist.label;" value="whitelist" flex="1"/>
+ </radiogroup>
+
+ <hbox flex="1">
+ <groupbox id="pattern" flex="1">
+ <caption label="&pattern.label;"/>
+ <radiogroup id="patternGroup" flex="1" oncommand="updatePatternSelection()" style="overflow: auto;">
+ <description id="patternExplanation">&pattern.explanation;</description>
+ <description id="regexpWarning" hidden="true">&regexp.warning;</description>
+ <description id="shortpatternWarning" hidden="true">&shortpattern.warning;</description>
+ <description id="matchWarning" hidden="true">&match.warning;</description>
+ <hbox id="customPatternBox">
+ <radio id="customPatternRadio" label="&custom.pattern.label;" value="" control="customPattern"/>
+ <textbox id="customPattern" flex="1" oninput="updateCustomPattern()"/>
+ </hbox>
+ </radiogroup>
+ <hbox id="anchorGroup" pack="start" align="baseline">
+ <label value="&anchors.label;"/>
+ <description flex="1" style="margin: 0; padding: 0;">
+ <checkbox id="anchorStart" labelRegular="&anchor.start.label;"
+ labelFlexible="&anchor.start.flexible.label;"
+ oncommand="updateFilter()"/>
+ <checkbox id="anchorEnd" label="&anchor.end.label;" oncommand="updateFilter()"/>
+ </description>
+ </hbox>
+ </groupbox>
+ <groupbox id="options">
+ <caption label="&options.label;"/>
+ <checkbox id="firstParty" label="&firstParty.label;" oncommand="checkboxUpdated(this);"/>
+ <checkbox id="thirdParty" label="&thirdParty.label;" oncommand="checkboxUpdated(this);"/>
+ <checkbox id="matchCase" label="&matchCase.label;" oncommand="checkboxUpdated(this);"/>
+ <hbox align="baseline">
+ <checkbox id="domainRestrictionEnabled" label="&domainRestriction.label;" oncommand="checkboxUpdated(this);"/>
+ <description class="help" value="?" tooltip="domainRestrictionHelp"/>
+ </hbox>
+ <textbox id="domainRestriction" oninput="updateFilter()"/>
+
+ <label id="typeGroupLabel" value="&types.label;"/>
+ <hbox>
+ <label id="selectAllTypes" class="text-link" value="&selectAllTypes.label;" onclick="selectAllTypes(true)"/>
+ <spacer flex="1"/>
+ <label id="unselectAllTypes" class="text-link" value="&unselectAllTypes.label;" onclick="selectAllTypes(false)"/>
+ </hbox>
+ <vbox flex="1" id="typeGroup"/>
+
+ <vbox>
+ <label control="collapse" value="&collapse.label;"/>
+ <menulist id="collapse" oncommand="updateFilter()">
+ <menupopup>
+ <menuitem id="collapseDefault" value="" label_yes="&collapse.default.yes.label;" label_no="&collapse.default.no.label;" selected="true"/>
+ <menuitem label="&collapse.yes.label;" value="collapse"/>
+ <menuitem label="&collapse.no.label;" value="~collapse"/>
+ </menupopup>
+ </menulist>
+ </vbox>
+ </groupbox>
+ </hbox>
+</dialog>
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/fennecSettings.xul b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/fennecSettings.xul
new file mode 100644
index 0000000..9063ba3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/fennecSettings.xul
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<!DOCTYPE vbox [
+<!ENTITY % overlayDTD SYSTEM "chrome://adblockplus/locale/overlay.dtd">
+%overlayDTD;
+<!ENTITY % filtersDTD SYSTEM "chrome://adblockplus/locale/filters.dtd">
+%filtersDTD;
+]>
+
+<vbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+ <setting pref="extensions.adblockplus.enabled" type="bool" inverted="true" title="&disable.label;"/>
+ <setting type="control" title="&subscriptions.tab.label;">
+ <menulist id="adblockplus-subscription-list"/>
+ </setting>
+ <setting id="adblockplus-acceptableAds" type="bool" title="&acceptableAds2.label;"
+ oncommand="/**See bug 762015*/ if (event.type == 'oncommand') {event = document.createEvent('Events'); event.initEvent('command', false, false); this.dispatchEvent(event);}"/>
+ <setting pref="extensions.adblockplus.fastcollapse" type="bool" title="&hideplaceholders.label;"
+ inverted="true"/>
+ <setting id="adblockplus-sync" type="bool" title="&sync.label;"
+ oncommand="/**See bug 762015*/ if (event.type == 'oncommand') {event = document.createEvent('Events'); event.initEvent('command', false, false); this.dispatchEvent(event);}"/>
+</vbox>
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-backup.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-backup.js
new file mode 100644
index 0000000..3ef38c6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-backup.js
@@ -0,0 +1,348 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/FileUtils.jsm");
+
+/**
+ * Implementation of backup and restore functionality.
+ * @class
+ */
+var Backup =
+{
+ /**
+ * Template for menu items to be displayed in the Restore menu (for automated
+ * backups).
+ * @type Element
+ */
+ restoreTemplate: null,
+
+ /**
+ * Element after which restore items should be inserted.
+ * @type Element
+ */
+ restoreInsertionPoint: null,
+
+ /**
+ * Regular expression to recognize checksum comments.
+ */
+ CHECKSUM_REGEXP: /^!\s*checksum[\s\-:]+([\w\+\/]+)/i,
+
+ /**
+ * Regular expression to recognize group title comments.
+ */
+ GROUPTITLE_REGEXP: /^!\s*\[(.*)\]((?:\/\w+)*)\s*$/,
+
+
+ /**
+ * Initializes backup UI.
+ */
+ init: function()
+ {
+ this.restoreTemplate = E("restoreBackupTemplate");
+ this.restoreInsertionPoint = this.restoreTemplate.previousSibling;
+ this.restoreTemplate.parentNode.removeChild(this.restoreTemplate);
+ this.restoreTemplate.removeAttribute("id");
+ this.restoreTemplate.removeAttribute("hidden");
+ },
+
+ /**
+ * Gets the default download dir, as used by the browser itself.
+ */
+ getDefaultDir: function() /**nsIFile*/
+ {
+ try
+ {
+ return Utils.prefService.getComplexValue("browser.download.lastDir", Ci.nsILocalFile);
+ }
+ catch (e)
+ {
+ // No default download location. Default to desktop.
+ return FileUtils.getDir("Desk", [], false);
+ }
+ },
+
+ /**
+ * Saves new default download dir after the user chose a different directory to
+ * save his files to.
+ */
+ saveDefaultDir: function(/**nsIFile*/ dir)
+ {
+ try
+ {
+ Utils.prefService.setComplexValue("browser.download.lastDir", Ci.nsILocalFile, dir);
+ } catch(e) {};
+ },
+
+ /**
+ * Called when the Restore menu is being opened, fills in "Automated backup"
+ * entries.
+ */
+ fillRestorePopup: function()
+ {
+ while (this.restoreInsertionPoint.nextSibling && !this.restoreInsertionPoint.nextSibling.id)
+ this.restoreInsertionPoint.parentNode.removeChild(this.restoreInsertionPoint.nextSibling);
+
+ let files = FilterStorage.getBackupFiles().reverse();
+ for (let i = 0; i < files.length; i++)
+ {
+ let file = files[i];
+ let item = this.restoreTemplate.cloneNode(true);
+ let label = item.getAttribute("label");
+ label = label.replace(/\?1\?/, Utils.formatTime(file.lastModifiedTime));
+ item.setAttribute("label", label);
+ item.addEventListener("command", function()
+ {
+ Backup.restoreAllData(file);
+ }, false);
+ this.restoreInsertionPoint.parentNode.insertBefore(item, this.restoreInsertionPoint.nextSibling);
+ }
+ },
+
+ /**
+ * Lets the user choose a file to restore filters from.
+ */
+ restoreFromFile: function()
+ {
+ let picker = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
+ picker.init(window, E("backupButton").getAttribute("_restoreDialogTitle"), picker.modeOpen);
+ picker.defaultExtension = ".ini";
+ picker.appendFilter(E("backupButton").getAttribute("_fileFilterComplete"), "*.ini");
+ picker.appendFilter(E("backupButton").getAttribute("_fileFilterCustom"), "*.txt");
+
+ if (picker.show() != picker.returnCancel)
+ {
+ this.saveDefaultDir(picker.file.parent);
+ if (picker.filterIndex == 0)
+ this.restoreAllData(picker.file);
+ else
+ this.restoreCustomFilters(picker.file);
+ }
+ },
+
+ /**
+ * Restores patterns.ini from a file.
+ */
+ restoreAllData: function(/**nsIFile*/ file)
+ {
+ let stream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
+ stream.init(file, FileUtils.MODE_RDONLY, FileUtils.PERMS_FILE, 0);
+ stream.QueryInterface(Ci.nsILineInputStream);
+
+ let lines = [];
+ let line = {value: null};
+ if (stream.readLine(line))
+ lines.push(line.value);
+ if (stream.readLine(line))
+ lines.push(line.value);
+ stream.close();
+
+ let match;
+ if (lines.length < 2 || lines[0] != "# Adblock Plus preferences" || !(match = /version=(\d+)/.exec(lines[1])))
+ {
+ Utils.alert(window, E("backupButton").getAttribute("_restoreError"), E("backupButton").getAttribute("_restoreDialogTitle"));
+ return;
+ }
+
+ let warning = E("backupButton").getAttribute("_restoreCompleteWarning");
+ let minVersion = parseInt(match[1], 10);
+ if (minVersion > FilterStorage.formatVersion)
+ warning += "\n\n" + E("backupButton").getAttribute("_restoreVersionWarning");
+
+ if (!Utils.confirm(window, warning, E("backupButton").getAttribute("_restoreDialogTitle")))
+ return;
+
+ FilterStorage.loadFromDisk(file);
+ },
+
+ /**
+ * Restores custom filters from a file.
+ */
+ restoreCustomFilters: function(/**nsIFile*/ file)
+ {
+ IO.readFromFile(file, {
+ seenHeader: false,
+ subscription: null,
+ process: function(line)
+ {
+ if (!this.seenHeader)
+ {
+ // This should be a header
+ this.seenHeader = true;
+ let match = /\[Adblock(?:\s*Plus\s*([\d\.]+)?)?\]/i.exec(line);
+ if (match)
+ {
+ let warning = E("backupButton").getAttribute("_restoreCustomWarning");
+ let minVersion = match[1];
+ if (minVersion && Utils.versionComparator.compare(minVersion, Utils.addonVersion) > 0)
+ warning += "\n\n" + E("backupButton").getAttribute("_restoreVersionWarning");
+
+ if (Utils.confirm(window, warning, E("backupButton").getAttribute("_restoreDialogTitle")))
+ {
+ let subscriptions = FilterStorage.subscriptions.filter(function(s) s instanceof SpecialSubscription);
+ for (let i = 0; i < subscriptions.length; i++)
+ FilterStorage.removeSubscription(subscriptions[i]);
+
+ return;
+ }
+ else
+ throw Cr.NS_BASE_STREAM_WOULD_BLOCK;
+ }
+ else
+ throw new Error("Invalid file");
+ }
+ else if (line === null)
+ {
+ // End of file
+ if (this.subscription)
+ FilterStorage.addSubscription(this.subscription);
+ E("tabs").selectedIndex = 1;
+ }
+ else if (Backup.CHECKSUM_REGEXP.test(line))
+ {
+ // Ignore checksums
+ }
+ else if (Backup.GROUPTITLE_REGEXP.test(line))
+ {
+ // New group start
+ if (this.subscription)
+ FilterStorage.addSubscription(this.subscription);
+
+ let [, title, options] = Backup.GROUPTITLE_REGEXP.exec(line);
+ this.subscription = SpecialSubscription.create(title);
+
+ let defaults = [];
+ if (options)
+ options = options.split("/");
+ for (let j = 0; j < options.length; j++)
+ if (options[j] in SpecialSubscription.defaultsMap)
+ defaults.push(options[j]);
+ if (defaults.length)
+ this.subscription.defaults = defaults;
+ }
+ else
+ {
+ // Regular filter
+ line = Filter.normalize(line);
+ if (line)
+ {
+ if (!this.subscription)
+ this.subscription = SpecialSubscription.create(Utils.getString("newGroup_title"));
+ this.subscription.filters.push(Filter.fromText(line));
+ }
+ }
+ }
+ }, function(e)
+ {
+ if (e && e.result != Cr.NS_BASE_STREAM_WOULD_BLOCK)
+ {
+ Cu.reportError(e);
+ Utils.alert(window, E("backupButton").getAttribute("_restoreError"), E("backupButton").getAttribute("_restoreDialogTitle"));
+ }
+ });
+ },
+
+ /**
+ * Lets the user choose a file to backup filters to.
+ */
+ backupToFile: function()
+ {
+ let picker = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
+ picker.init(window, E("backupButton").getAttribute("_backupDialogTitle"), picker.modeSave);
+ picker.defaultExtension = ".ini";
+ picker.appendFilter(E("backupButton").getAttribute("_fileFilterComplete"), "*.ini");
+ picker.appendFilter(E("backupButton").getAttribute("_fileFilterCustom"), "*.txt");
+
+ if (picker.show() != picker.returnCancel)
+ {
+ this.saveDefaultDir(picker.file.parent);
+ if (picker.filterIndex == 0)
+ this.backupAllData(picker.file);
+ else
+ this.backupCustomFilters(picker.file);
+ }
+ },
+
+ /**
+ * Writes all patterns.ini data to a file.
+ */
+ backupAllData: function(/**nsIFile*/ file)
+ {
+ FilterStorage.saveToDisk(file);
+ },
+
+ /**
+ * Writes user's custom filters to a file.
+ */
+ backupCustomFilters: function(/**nsIFile*/ file)
+ {
+ let subscriptions = FilterStorage.subscriptions.filter(function(s) s instanceof SpecialSubscription);
+ let minVersion = "2.0"
+ let list = [];
+ for (let i = 0; i < subscriptions.length; i++)
+ {
+ let subscription = subscriptions[i];
+ let typeAddition = "";
+ if (subscription.defaults)
+ typeAddition = "/" + subscription.defaults.join("/");
+ list.push("! [" + subscription.title + "]" + typeAddition);
+ for (let j = 0; j < subscription.filters.length; j++)
+ {
+ let filter = subscription.filters[j];
+ // Skip checksums
+ if (filter instanceof CommentFilter && this.CHECKSUM_REGEXP.test(filter.text))
+ continue;
+ // Skip group headers
+ if (filter instanceof CommentFilter && this.GROUPTITLE_REGEXP.test(filter.text))
+ continue;
+ list.push(filter.text);
+
+ if (filter instanceof ElemHideException && Services.vc.compare(minVersion, "2.1") < 0)
+ minVersion = "2.1";
+ }
+ }
+ list.unshift("[Adblock Plus " + minVersion + "]");
+
+ // Insert checksum. Have to add an empty line to the end of the list to
+ // account for the trailing newline in the file.
+ list.push("");
+ let checksum = Utils.generateChecksum(list);
+ list.pop();
+ if (checksum)
+ list.splice(1, 0, "! Checksum: " + checksum);
+
+ function generator()
+ {
+ for (let i = 0; i < list.length; i++)
+ yield list[i];
+ }
+
+ IO.writeToFile(file, generator(), function(e)
+ {
+ if (e)
+ {
+ Cu.reportError(e);
+ Utils.alert(window, E("backupButton").getAttribute("_backupError"), E("backupButton").getAttribute("_backupDialogTitle"));
+ }
+ });
+ }
+};
+
+window.addEventListener("load", function()
+{
+ Backup.init();
+}, false);
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-filteractions.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-filteractions.js
new file mode 100644
index 0000000..5512fda
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-filteractions.js
@@ -0,0 +1,561 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * Implementation of the various actions performed on the filters.
+ * @class
+ */
+var FilterActions =
+{
+ /**
+ * Initializes filter actions.
+ */
+ init: function()
+ {
+ let me = this;
+ this.treeElement.parentNode.addEventListener("keypress", function(event)
+ {
+ me.keyPress(event);
+ }, true);
+ this.treeElement.view = FilterView;
+
+ // Work around https://bugzilla.mozilla.org/show_bug.cgi?id=777832, don't
+ // allow the tree to receive keypress/keydown events triggered by cursor
+ // keys pressed in the editor, it will call preventDefault() on them.
+ let propagationStopper = function(event)
+ {
+ if (event.keyCode >= event.DOM_VK_PAGE_UP && event.keyCode <= event.DOM_VK_DOWN)
+ event.stopPropagation();
+ };
+
+ this.treeElement.inputField.addEventListener("keypress", propagationStopper, false);
+ this.treeElement.inputField.addEventListener("keydown", propagationStopper, false);
+
+ // Create a copy of the view menu
+ function fixId(node, newId)
+ {
+ if (node.nodeType == node.ELEMENT_NODE)
+ {
+ if (node.hasAttribute("id"))
+ node.setAttribute("id", node.getAttribute("id").replace(/\d+$/, newId));
+
+ for (let i = 0, len = node.childNodes.length; i < len; i++)
+ fixId(node.childNodes[i], newId);
+ }
+ return node;
+ }
+ E("viewMenu").appendChild(fixId(E("filters-view-menu1").cloneNode(true), "2"));
+ },
+
+ /**
+ * <tree> element containing the filters.
+ * @type XULElement
+ */
+ get treeElement() E("filtersTree"),
+
+ /**
+ * Tests whether the tree is currently visible.
+ */
+ get visible()
+ {
+ return !this.treeElement.parentNode.collapsed;
+ },
+
+ /**
+ * Tests whether the tree is currently focused.
+ * @type Boolean
+ */
+ get focused()
+ {
+ let focused = document.commandDispatcher.focusedElement;
+ while (focused)
+ {
+ if ("treeBoxObject" in focused && focused.treeBoxObject == FilterView.boxObject)
+ return true;
+ focused = focused.parentNode;
+ }
+ return false;
+ },
+
+ /**
+ * Updates visible filter commands whenever the selected subscription changes.
+ */
+ updateCommands: function()
+ {
+ E("filters-add-command").setAttribute("disabled", !FilterView.editable);
+ },
+
+ /**
+ * Called whenever filter actions menu is opened, initializes menu items.
+ */
+ fillActionsPopup: function()
+ {
+ let editable = FilterView.editable;
+ let items = FilterView.selectedItems.filter(function(i) !i.filter.dummy);
+ items.sort(function(entry1, entry2) entry1.index - entry2.index);
+ let activeItems = items.filter(function(i) i.filter instanceof ActiveFilter);
+
+ E("filters-edit-command").setAttribute("disabled", !editable || !items.length);
+ E("filters-delete-command").setAttribute("disabled", !editable || !items.length);
+ E("filters-resetHitCounts-command").setAttribute("disabled", !activeItems.length);
+ E("filters-moveUp-command").setAttribute("disabled", !editable || FilterView.isSorted() || !items.length || items[0].index == 0);
+ E("filters-moveDown-command").setAttribute("disabled", !editable || FilterView.isSorted() || !items.length || items[items.length - 1].index == FilterView.rowCount - 1);
+ E("filters-copy-command").setAttribute("disabled", !items.length);
+ E("filters-cut-command").setAttribute("disabled", !editable || !items.length);
+ E("filters-paste-command").setAttribute("disabled", !editable || !Utils.clipboard.hasDataMatchingFlavors(["text/unicode"], 1, Utils.clipboard.kGlobalClipboard));
+ },
+
+ /**
+ * Changes sort current order for the tree. Sorts by filter column if the list is unsorted.
+ * @param {String} order either "ascending" or "descending"
+ */
+ setSortOrder: function(sortOrder)
+ {
+ let col = (FilterView.sortColumn ? FilterView.sortColumn.id : "col-filter");
+ FilterView.sortBy(col, sortOrder);
+ },
+
+ /**
+ * Toggles the visibility of a tree column.
+ */
+ toggleColumn: function(/**String*/ id)
+ {
+ let col = E(id);
+ col.setAttribute("hidden", col.hidden ? "false" : "true");
+ },
+
+ /**
+ * Enables or disables all filters in the current selection.
+ */
+ selectionToggleDisabled: function()
+ {
+ if (this.treeElement.editingColumn)
+ return;
+
+ let items = FilterView.selectedItems.filter(function(i) i.filter instanceof ActiveFilter);
+ if (items.length)
+ {
+ FilterView.boxObject.beginUpdateBatch();
+ let newValue = !items[0].filter.disabled;
+ for (let i = 0; i < items.length; i++)
+ items[i].filter.disabled = newValue;
+ FilterView.boxObject.endUpdateBatch();
+ }
+ },
+
+ /**
+ * Selects all entries in the list.
+ */
+ selectAll: function()
+ {
+ if (this.treeElement.editingColumn)
+ return;
+
+ FilterView.selection.selectAll();
+ this.treeElement.focus();
+ },
+
+ /**
+ * Starts editing the current filter.
+ */
+ startEditing: function()
+ {
+ if (this.treeElement.editingColumn)
+ return;
+
+ this.treeElement.startEditing(FilterView.selection.currentIndex, FilterView.boxObject.columns.getNamedColumn("col-filter"));
+ },
+
+ /**
+ * Starts editing a new filter at the current position.
+ */
+ insertFilter: function()
+ {
+ if (!FilterView.editable || this.treeElement.editingColumn)
+ return;
+
+ FilterView.insertEditDummy();
+ this.startEditing();
+
+ let tree = this.treeElement;
+ let listener = function(event)
+ {
+ if (event.attrName == "editing" && tree.editingRow < 0)
+ {
+ tree.removeEventListener("DOMAttrModified", listener, false);
+ FilterView.removeEditDummy();
+ }
+ }
+ tree.addEventListener("DOMAttrModified", listener, false);
+ },
+
+ /**
+ * Deletes items from the list.
+ */
+ deleteItems: function(/**Array*/ items)
+ {
+ let oldIndex = FilterView.selection.currentIndex;
+ items.sort(function(entry1, entry2) entry2.index - entry1.index);
+
+ for (let i = 0; i < items.length; i++)
+ FilterStorage.removeFilter(items[i].filter, FilterView._subscription, items[i].index);
+
+ FilterView.selectRow(oldIndex);
+ },
+
+ /**
+ * Deletes selected filters.
+ */
+ deleteSelected: function()
+ {
+ if (!FilterView.editable || this.treeElement.editingColumn)
+ return;
+
+ let items = FilterView.selectedItems;
+ if (items.length == 0 || (items.length >= 2 && !Utils.confirm(window, this.treeElement.getAttribute("_removewarning"))))
+ return;
+
+ this.deleteItems(items)
+ },
+
+ /**
+ * Resets hit counts of the selected filters.
+ */
+ resetHitCounts: function()
+ {
+ if (this.treeElement.editingColumn)
+ return;
+
+ let items = FilterView.selectedItems.filter(function(i) i.filter instanceof ActiveFilter);
+ if (items.length)
+ FilterStorage.resetHitCounts(items.map(function(i) i.filter));
+ },
+
+ /**
+ * Moves items to a different position in the list.
+ * @param {Array} items
+ * @param {Integer} offset negative offsets move the items up, positive down
+ */
+ _moveItems: function(/**Array*/ items, /**Integer*/ offset)
+ {
+ if (!items.length)
+ return;
+
+ if (offset < 0)
+ {
+ items.sort(function(entry1, entry2) entry1.index - entry2.index);
+ let position = items[0].index + offset;
+ if (position < 0)
+ return;
+
+ for (let i = 0; i < items.length; i++)
+ FilterStorage.moveFilter(items[i].filter, FilterView._subscription, items[i].index, position++);
+ FilterView.selection.rangedSelect(position - items.length, position - 1, false);
+ }
+ else if (offset > 0)
+ {
+ items.sort(function(entry1, entry2) entry2.index - entry1.index);
+ let position = items[0].index + offset;
+ if (position >= FilterView.rowCount)
+ return;
+
+ for (let i = 0; i < items.length; i++)
+ FilterStorage.moveFilter(items[i].filter, FilterView._subscription, items[i].index, position--);
+ FilterView.selection.rangedSelect(position + 1, position + items.length, false);
+ }
+ },
+
+ /**
+ * Moves selected filters one line up.
+ */
+ moveUp: function()
+ {
+ if (!FilterView.editable || FilterView.isEmpty || FilterView.isSorted() || this.treeElement.editingColumn)
+ return;
+
+ this._moveItems(FilterView.selectedItems, -1);
+ },
+
+ /**
+ * Moves selected filters one line down.
+ */
+ moveDown: function()
+ {
+ if (!FilterView.editable || FilterView.isEmpty || FilterView.isSorted() || this.treeElement.editingColumn)
+ return;
+
+ this._moveItems(FilterView.selectedItems, 1);
+ },
+
+ /**
+ * Fills the context menu of the filters columns.
+ */
+ fillColumnPopup: function(/**Element*/ element)
+ {
+ let suffix = element.id.match(/\d+$/)[0] || "1";
+
+ E("filters-view-filter" + suffix).setAttribute("checked", !E("col-filter").hidden);
+ E("filters-view-slow" + suffix).setAttribute("checked", !E("col-slow").hidden);
+ E("filters-view-enabled" + suffix).setAttribute("checked", !E("col-enabled").hidden);
+ E("filters-view-hitcount" + suffix).setAttribute("checked", !E("col-hitcount").hidden);
+ E("filters-view-lasthit" + suffix).setAttribute("checked", !E("col-lasthit").hidden);
+
+ let sortColumn = FilterView.sortColumn;
+ let sortColumnID = (sortColumn ? sortColumn.id : null);
+ let sortDir = (sortColumn ? sortColumn.getAttribute("sortDirection") : "natural");
+ E("filters-sort-none" + suffix).setAttribute("checked", sortColumn == null);
+ E("filters-sort-filter" + suffix).setAttribute("checked", sortColumnID == "col-filter");
+ E("filters-sort-enabled" + suffix).setAttribute("checked", sortColumnID == "col-enabled");
+ E("filters-sort-hitcount" + suffix).setAttribute("checked", sortColumnID == "col-hitcount");
+ E("filters-sort-lasthit" + suffix).setAttribute("checked", sortColumnID == "col-lasthit");
+ E("filters-sort-asc" + suffix).setAttribute("checked", sortDir == "ascending");
+ E("filters-sort-desc" + suffix).setAttribute("checked", sortDir == "descending");
+ },
+
+ /**
+ * Fills tooltip with the item data.
+ */
+ fillTooltip: function(event)
+ {
+ let item = FilterView.getItemAt(event.clientX, event.clientY);
+ if (!item || item.filter.dummy)
+ {
+ event.preventDefault();
+ return;
+ }
+
+ function setMultilineContent(box, text)
+ {
+ while (box.firstChild)
+ box.removeChild(box.firstChild);
+
+ for (var i = 0; i < text.length; i += 80)
+ {
+ var description = document.createElement("description");
+ description.setAttribute("value", text.substr(i, 80));
+ box.appendChild(description);
+ }
+ }
+
+ setMultilineContent(E("tooltip-filter"), item.filter.text);
+
+ E("tooltip-hitcount-row").hidden = !(item.filter instanceof ActiveFilter);
+ E("tooltip-lasthit-row").hidden = !(item.filter instanceof ActiveFilter) || !item.filter.lastHit;
+ if (item.filter instanceof ActiveFilter)
+ {
+ E("tooltip-hitcount").setAttribute("value", item.filter.hitCount)
+ E("tooltip-lasthit").setAttribute("value", Utils.formatTime(item.filter.lastHit))
+ }
+
+ E("tooltip-additional").hidden = false;
+ if (item.filter instanceof InvalidFilter && item.filter.reason)
+ E("tooltip-additional").textContent = item.filter.reason;
+ else if (item.filter instanceof RegExpFilter && defaultMatcher.isSlowFilter(item.filter))
+ E("tooltip-additional").textContent = Utils.getString("filter_regexp_tooltip");
+ else
+ E("tooltip-additional").hidden = true;
+ },
+
+ /**
+ * Called whenever a key is pressed on the list.
+ */
+ keyPress: function(/**Event*/ event)
+ {
+ if (event.target != E("filtersTree"))
+ return;
+
+ let modifiers = 0;
+ if (event.altKey)
+ modifiers |= SubscriptionActions._altMask;
+ if (event.ctrlKey)
+ modifiers |= SubscriptionActions._ctrlMask;
+ if (event.metaKey)
+ modifiers |= SubscriptionActions._metaMask;
+
+ if (event.charCode == " ".charCodeAt(0) && modifiers == 0 && !E("col-enabled").hidden)
+ this.selectionToggleDisabled();
+ else if (event.keyCode == Ci.nsIDOMKeyEvent.DOM_VK_UP && modifiers == SubscriptionActions._accelMask)
+ {
+ E("filters-moveUp-command").doCommand();
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ else if (event.keyCode == Ci.nsIDOMKeyEvent.DOM_VK_DOWN && modifiers == SubscriptionActions._accelMask)
+ {
+ E("filters-moveDown-command").doCommand();
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ },
+
+ /**
+ * Copies selected items to clipboard and optionally removes them from the
+ * list after that.
+ */
+ copySelected: function(/**Boolean*/ keep)
+ {
+ let items = FilterView.selectedItems;
+ if (!items.length)
+ return;
+
+ items.sort(function(entry1, entry2) entry1.index - entry2.index);
+ let text = items.map(function(i) i.filter.text).join(IO.lineBreak);
+ Utils.clipboardHelper.copyString(text);
+
+ if (!keep && FilterView.editable && !this.treeElement.editingColumn)
+ this.deleteItems(items);
+ },
+
+ /**
+ * Pastes text from clipboard as filters at the current position.
+ */
+ paste: function()
+ {
+ if (!FilterView.editable || this.treeElement.editingColumn)
+ return;
+
+ let transferable = Cc["@mozilla.org/widget/transferable;1"].createInstance(Ci.nsITransferable);
+ transferable.addDataFlavor("text/unicode");
+
+ let data;
+ try
+ {
+ data = {};
+ Utils.clipboard.getData(transferable, Utils.clipboard.kGlobalClipboard);
+ transferable.getTransferData("text/unicode", data, {});
+ data = data.value.QueryInterface(Ci.nsISupportsString).data;
+ }
+ catch (e) {
+ return;
+ }
+
+ let item = FilterView.currentItem;
+ let position = (item ? item.index : FilterView.data.length);
+
+ let lines = data.replace(/\r/g, "").split("\n");
+ for (let i = 0; i < lines.length; i++)
+ {
+ let line = Filter.normalize(lines[i]);
+ if (line)
+ {
+ let filter = Filter.fromText(line);
+ FilterStorage.addFilter(filter, FilterView._subscription, position++);
+ }
+ }
+ },
+
+ dragItems: null,
+
+ /**
+ * Called whenever the user starts a drag operation.
+ */
+ startDrag: function(/**Event*/ event)
+ {
+ let items = FilterView.selectedItems;
+ if (!items.length)
+ return;
+
+ items.sort(function(entry1, entry2) entry1.index - entry2.index);
+ event.dataTransfer.setData("text/plain", items.map(function(i) i.filter.text).join(IO.lineBreak));
+ this.dragItems = items;
+ event.stopPropagation();
+ },
+
+ /**
+ * Called to check whether moving the items to the given position is possible.
+ */
+ canDrop: function(/**Integer*/ newPosition, /**nsIDOMDataTransfer*/ dataTransfer)
+ {
+ if (!FilterView.editable || this.treeElement.editingColumn)
+ return false;
+
+ // If we aren't dragging items then maybe we got filters as plain text
+ if (!this.dragItems)
+ return dataTransfer && dataTransfer.getData("text/plain");
+
+ if (FilterView.isEmpty || FilterView.isSorted())
+ return false;
+
+ if (newPosition < this.dragItems[0].index)
+ return true;
+ else if (newPosition > this.dragItems[this.dragItems.length - 1].index + 1)
+ return true;
+ else
+ return false;
+ },
+
+ /**
+ * Called when the user decides to drop the items.
+ */
+ drop: function(/**Integer*/ newPosition, /**nsIDOMDataTransfer*/ dataTransfer)
+ {
+ if (!FilterView.editable || this.treeElement.editingColumn)
+ return;
+
+ if (!this.dragItems)
+ {
+ // We got filters as plain text, insert them into the list
+ let data = (dataTransfer ? dataTransfer.getData("text/plain") : null);
+ if (data)
+ {
+ let lines = data.replace(/\r/g, "").split("\n");
+ for (let i = 0; i < lines.length; i++)
+ {
+ let line = Filter.normalize(lines[i]);
+ if (line)
+ {
+ let filter = Filter.fromText(line);
+ FilterStorage.addFilter(filter, FilterView._subscription, newPosition++);
+ }
+ }
+ }
+ return;
+ }
+
+ if (FilterView.isEmpty || FilterView.isSorted())
+ return;
+
+ if (newPosition < this.dragItems[0].index)
+ this._moveItems(this.dragItems, newPosition - this.dragItems[0].index);
+ else if (newPosition > this.dragItems[this.dragItems.length - 1].index + 1)
+ this._moveItems(this.dragItems, newPosition - this.dragItems[this.dragItems.length - 1].index - 1);
+ },
+
+ /**
+ * Called whenever the a drag operation finishes.
+ */
+ endDrag: function(/**Event*/ event)
+ {
+ this.dragItems = null;
+ },
+
+ /**
+ * Called if filters have been dragged into a subscription and need to be removed.
+ */
+ removeDraggedFilters: function()
+ {
+ if (!this.dragItems)
+ return;
+
+ this.deleteItems(this.dragItems);
+ }
+};
+
+window.addEventListener("load", function()
+{
+ FilterActions.init();
+}, false);
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-filterview.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-filterview.js
new file mode 100644
index 0000000..dcee183
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-filterview.js
@@ -0,0 +1,849 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+/**
+ * nsITreeView implementation to display filters of a particular filter
+ * subscription.
+ * @class
+ */
+var FilterView =
+{
+ /**
+ * Initialization function.
+ */
+ init: function()
+ {
+ // "Manually" remove access key for col-slow tooltip, Utils.splitAllLabels()
+ // won't do it.
+ let slowColumn = document.getElementById("col-slow");
+ if (slowColumn)
+ {
+ for (let attr of ["display", "tooltiptext"])
+ {
+ let value = slowColumn.getAttribute(attr);
+ if (!value)
+ continue;
+ let [label, accessKey] = Utils.splitLabel(value);
+ if (label != value)
+ slowColumn.setAttribute(attr, label);
+ }
+ }
+
+ if (this.sortProcs)
+ return;
+
+ function compareText(/**Filter*/ filter1, /**Filter*/ filter2)
+ {
+ if (filter1.text < filter2.text)
+ return -1;
+ else if (filter1.text > filter2.text)
+ return 1;
+ else
+ return 0;
+ }
+ function compareSlow(/**Filter*/ filter1, /**Filter*/ filter2)
+ {
+ let isSlow1 = filter1 instanceof RegExpFilter && defaultMatcher.isSlowFilter(filter1);
+ let isSlow2 = filter2 instanceof RegExpFilter && defaultMatcher.isSlowFilter(filter2);
+ return isSlow1 - isSlow2;
+ }
+ function compareEnabled(/**Filter*/ filter1, /**Filter*/ filter2)
+ {
+ let hasEnabled1 = (filter1 instanceof ActiveFilter ? 1 : 0);
+ let hasEnabled2 = (filter2 instanceof ActiveFilter ? 1 : 0);
+ if (hasEnabled1 != hasEnabled2)
+ return hasEnabled1 - hasEnabled2;
+ else if (hasEnabled1)
+ return (filter2.disabled - filter1.disabled);
+ else
+ return 0;
+ }
+ function compareHitCount(/**Filter*/ filter1, /**Filter*/ filter2)
+ {
+ let hasHitCount1 = (filter1 instanceof ActiveFilter ? 1 : 0);
+ let hasHitCount2 = (filter2 instanceof ActiveFilter ? 1 : 0);
+ if (hasHitCount1 != hasHitCount2)
+ return hasHitCount1 - hasHitCount2;
+ else if (hasHitCount1)
+ return filter1.hitCount - filter2.hitCount;
+ else
+ return 0;
+ }
+ function compareLastHit(/**Filter*/ filter1, /**Filter*/ filter2)
+ {
+ let hasLastHit1 = (filter1 instanceof ActiveFilter ? 1 : 0);
+ let hasLastHit2 = (filter2 instanceof ActiveFilter ? 1 : 0);
+ if (hasLastHit1 != hasLastHit2)
+ return hasLastHit1 - hasLastHit2;
+ else if (hasLastHit1)
+ return filter1.lastHit - filter2.lastHit;
+ else
+ return 0;
+ }
+
+ /**
+ * Creates a sort function from a primary and a secondary comparison function.
+ * @param {Function} cmpFunc comparison function to be called first
+ * @param {Function} fallbackFunc (optional) comparison function to be called if primary function returns 0
+ * @param {Boolean} desc if true, the result of the primary function (not the secondary function) will be reversed - sorting in descending order
+ * @result {Function} comparison function to be used
+ */
+ function createSortFunction(cmpFunc, fallbackFunc, desc)
+ {
+ let factor = (desc ? -1 : 1);
+
+ return function(entry1, entry2)
+ {
+ // Comment replacements not bound to a filter always go last
+ let isLast1 = ("origFilter" in entry1 && entry1.filter == null);
+ let isLast2 = ("origFilter" in entry2 && entry2.filter == null);
+ if (isLast1)
+ return (isLast2 ? 0 : 1)
+ else if (isLast2)
+ return -1;
+
+ let ret = cmpFunc(entry1.filter, entry2.filter);
+ if (ret == 0 && fallbackFunc)
+ return fallbackFunc(entry1.filter, entry2.filter);
+ else
+ return factor * ret;
+ }
+ }
+
+ this.sortProcs = {
+ filter: createSortFunction(compareText, null, false),
+ filterDesc: createSortFunction(compareText, null, true),
+ slow: createSortFunction(compareSlow, compareText, true),
+ slowDesc: createSortFunction(compareSlow, compareText, false),
+ enabled: createSortFunction(compareEnabled, compareText, false),
+ enabledDesc: createSortFunction(compareEnabled, compareText, true),
+ hitcount: createSortFunction(compareHitCount, compareText, false),
+ hitcountDesc: createSortFunction(compareHitCount, compareText, true),
+ lasthit: createSortFunction(compareLastHit, compareText, false),
+ lasthitDesc: createSortFunction(compareLastHit, compareText, true)
+ };
+
+ let me = this;
+ let proxy = function()
+ {
+ return me._onChange.apply(me, arguments);
+ };
+ FilterNotifier.addListener(proxy);
+ window.addEventListener("unload", function()
+ {
+ FilterNotifier.removeListener(proxy);
+ }, false);
+ },
+
+ /**
+ * Filter change processing.
+ * @see FilterNotifier.addListener()
+ */
+ _onChange: function(action, item, param1, param2, param3)
+ {
+ switch (action)
+ {
+ case "subscription.updated":
+ {
+ if (item == this._subscription)
+ this.refresh(true);
+ break;
+ }
+ case "filter.disabled":
+ case "filter.hitCount":
+ case "filter.lastHit":
+ {
+ this.updateFilter(item);
+ break;
+ }
+ case "filter.added":
+ {
+ let subscription = param1;
+ let position = param2;
+ if (subscription == this._subscription)
+ this.addFilterAt(position, item);
+ break;
+ }
+ case "filter.removed":
+ {
+ let subscription = param1;
+ let position = param2;
+ if (subscription == this._subscription)
+ this.removeFilterAt(position);
+ break;
+ }
+ case "filter.moved":
+ {
+ let subscription = param1;
+ let oldPosition = param2;
+ let newPosition = param3;
+ if (subscription == this._subscription)
+ this.moveFilterAt(oldPosition, newPosition);
+ break;
+ }
+ }
+ },
+
+ /**
+ * Box object of the tree that this view is attached to.
+ * @type nsITreeBoxObject
+ */
+ boxObject: null,
+
+ /**
+ * Map of used cell properties to the corresponding nsIAtom representations.
+ */
+ atoms: null,
+
+ /**
+ * "Filter" to be displayed if no filter group is selected.
+ */
+ noGroupDummy: null,
+
+ /**
+ * "Filter" to be displayed if the selected group is empty.
+ */
+ noFiltersDummy: null,
+
+ /**
+ * "Filter" to be displayed for a new filter being edited.
+ */
+ editDummy: null,
+
+ /**
+ * Displayed list of filters, might be sorted.
+ * @type Filter[]
+ */
+ data: [],
+
+ /**
+ * <tree> element that the view is attached to.
+ * @type XULElement
+ */
+ get treeElement() this.boxObject ? this.boxObject.treeBody.parentNode : null,
+
+ /**
+ * Checks whether the list is currently empty (regardless of dummy entries).
+ * @type Boolean
+ */
+ get isEmpty()
+ {
+ return !this._subscription || !this._subscription.filters.length;
+ },
+
+ /**
+ * Checks whether the filters in the view can be changed.
+ * @type Boolean
+ */
+ get editable()
+ {
+ return (FilterView._subscription instanceof SpecialSubscription);
+ },
+
+ /**
+ * Returns current item of the list.
+ * @type Object
+ */
+ get currentItem()
+ {
+ let index = this.selection.currentIndex;
+ if (index >= 0 && index < this.data.length)
+ return this.data[index];
+ return null;
+ },
+
+ /**
+ * Returns items that are currently selected in the list.
+ * @type Object[]
+ */
+ get selectedItems()
+ {
+ let items = []
+ for (let i = 0; i < this.selection.getRangeCount(); i++)
+ {
+ let min = {};
+ let max = {};
+ this.selection.getRangeAt(i, min, max);
+ for (let j = min.value; j <= max.value; j++)
+ if (j >= 0 && j < this.data.length)
+ items.push(this.data[j]);
+ }
+ return items;
+ },
+
+ getItemAt: function(x, y)
+ {
+ let row = this.boxObject.getRowAt(x, y);
+ if (row >= 0 && row < this.data.length)
+ return this.data[row];
+ else
+ return null;
+ },
+
+ _subscription: 0,
+
+ /**
+ * Filter subscription being displayed.
+ * @type Subscription
+ */
+ get subscription() this._subscription,
+ set subscription(value)
+ {
+ if (value == this._subscription)
+ return;
+
+ // Make sure the editor is done before we update the list.
+ if (this.treeElement)
+ this.treeElement.stopEditing(true);
+
+ this._subscription = value;
+ this.refresh(true);
+ },
+
+ /**
+ * Will be true if updates are outstanding because the list was hidden.
+ */
+ _dirty: false,
+
+ /**
+ * Updates internal view data after a change.
+ * @param {Boolean} force if false, a refresh will only happen if previous
+ * changes were suppressed because the list was hidden
+ */
+ refresh: function(force)
+ {
+ if (FilterActions.visible)
+ {
+ if (!force && !this._dirty)
+ return;
+ this._dirty = false;
+ this.updateData();
+ this.selectRow(0);
+ }
+ else
+ this._dirty = true;
+ },
+
+ /**
+ * Map of comparison functions by column ID or column ID + "Desc" for
+ * descending sort order.
+ * @const
+ */
+ sortProcs: null,
+
+ /**
+ * Column that the list is currently sorted on.
+ * @type Element
+ */
+ sortColumn: null,
+
+ /**
+ * Sorting function currently in use.
+ * @type Function
+ */
+ sortProc: null,
+
+ /**
+ * Resorts the list.
+ * @param {String} col ID of the column to sort on. If null, the natural order is restored.
+ * @param {String} direction "ascending" or "descending", if null the sort order is toggled.
+ */
+ sortBy: function(col, direction)
+ {
+ let newSortColumn = null;
+ if (col)
+ {
+ newSortColumn = this.boxObject.columns.getNamedColumn(col).element;
+ if (!direction)
+ {
+ if (this.sortColumn == newSortColumn)
+ direction = (newSortColumn.getAttribute("sortDirection") == "ascending" ? "descending" : "ascending");
+ else
+ direction = "ascending";
+ }
+ }
+
+ if (this.sortColumn && this.sortColumn != newSortColumn)
+ this.sortColumn.removeAttribute("sortDirection");
+
+ this.sortColumn = newSortColumn;
+ if (this.sortColumn)
+ {
+ this.sortColumn.setAttribute("sortDirection", direction);
+ this.sortProc = this.sortProcs[col.replace(/^col-/, "") + (direction == "descending" ? "Desc" : "")];
+ }
+ else
+ this.sortProc = null;
+
+ if (this.data.length > 1)
+ {
+ this.updateData();
+ this.boxObject.invalidate();
+ }
+ },
+
+ /**
+ * Inserts dummy entry into the list if necessary.
+ */
+ addDummyRow: function()
+ {
+ if (this.boxObject && this.data.length == 0)
+ {
+ if (this._subscription)
+ this.data.splice(0, 0, this.noFiltersDummy);
+ else
+ this.data.splice(0, 0, this.noGroupDummy);
+ this.boxObject.rowCountChanged(0, 1);
+ }
+ },
+
+ /**
+ * Removes dummy entry from the list if present.
+ */
+ removeDummyRow: function()
+ {
+ if (this.boxObject && this.isEmpty && this.data.length)
+ {
+ this.data.splice(0, 1);
+ this.boxObject.rowCountChanged(0, -1);
+ }
+ },
+
+ /**
+ * Inserts dummy row when a new filter is being edited.
+ */
+ insertEditDummy: function()
+ {
+ FilterView.removeDummyRow();
+ let position = this.selection.currentIndex;
+ if (position >= this.data.length)
+ position = this.data.length - 1;
+ if (position < 0)
+ position = 0;
+
+ this.editDummy.index = (position < this.data.length ? this.data[position].index : this.data.length);
+ this.editDummy.position = position;
+ this.data.splice(position, 0, this.editDummy);
+ this.boxObject.rowCountChanged(position, 1);
+ this.selectRow(position);
+ },
+
+ /**
+ * Removes dummy row once the edit is finished.
+ */
+ removeEditDummy: function()
+ {
+ let position = this.editDummy.position;
+ if (typeof position != "undefined" && position < this.data.length && this.data[position] == this.editDummy)
+ {
+ this.data.splice(position, 1);
+ this.boxObject.rowCountChanged(position, -1);
+ FilterView.addDummyRow();
+
+ this.selectRow(position);
+ }
+ },
+
+ /**
+ * Selects a row in the tree and makes sure it is visible.
+ */
+ selectRow: function(row)
+ {
+ if (this.selection)
+ {
+ row = Math.min(Math.max(row, 0), this.data.length - 1);
+ this.selection.select(row);
+ this.boxObject.ensureRowIsVisible(row);
+ }
+ },
+
+ /**
+ * Finds a particular filter in the list and selects it.
+ */
+ selectFilter: function(/**Filter*/ filter)
+ {
+ let index = -1;
+ for (let i = 0; i < this.data.length; i++)
+ {
+ if (this.data[i].filter == filter)
+ {
+ index = i;
+ break;
+ }
+ }
+ if (index >= 0)
+ {
+ this.selectRow(index);
+ this.treeElement.focus();
+ }
+ },
+
+ /**
+ * Updates value of data property on sorting or filter subscription changes.
+ */
+ updateData: function()
+ {
+ let oldCount = this.rowCount;
+ if (this._subscription && this._subscription.filters.length)
+ {
+ this.data = this._subscription.filters.map(function(f, i) ({index: i, filter: f}));
+ if (this.sortProc)
+ {
+ // Hide comments in the list, they should be sorted like the filter following them
+ let followingFilter = null;
+ for (let i = this.data.length - 1; i >= 0; i--)
+ {
+ if (this.data[i].filter instanceof CommentFilter)
+ {
+ this.data[i].origFilter = this.data[i].filter;
+ this.data[i].filter = followingFilter;
+ }
+ else
+ followingFilter = this.data[i].filter;
+ }
+
+ this.data.sort(this.sortProc);
+
+ // Restore comments
+ for (let i = 0; i < this.data.length; i++)
+ {
+ if ("origFilter" in this.data[i])
+ {
+ this.data[i].filter = this.data[i].origFilter;
+ delete this.data[i].origFilter;
+ }
+ }
+ }
+ }
+ else
+ this.data = [];
+
+ if (this.boxObject)
+ {
+ this.boxObject.rowCountChanged(0, -oldCount);
+ this.boxObject.rowCountChanged(0, this.rowCount);
+ }
+
+ this.addDummyRow();
+ },
+
+ /**
+ * Called to update the view when a filter property is changed.
+ */
+ updateFilter: function(/**Filter*/ filter)
+ {
+ for (let i = 0; i < this.data.length; i++)
+ if (this.data[i].filter == filter)
+ this.boxObject.invalidateRow(i);
+ },
+
+ /**
+ * Called if a filter has been inserted at the specified position.
+ */
+ addFilterAt: function(/**Integer*/ position, /**Filter*/ filter)
+ {
+ if (this.data.length == 1 && this.data[0].filter.dummy)
+ {
+ this.data.splice(0, 1);
+ this.boxObject.rowCountChanged(0, -1);
+ }
+
+ if (this.sortProc)
+ {
+ this.updateData();
+ for (let i = 0; i < this.data.length; i++)
+ {
+ if (this.data[i].index == position)
+ {
+ position = i;
+ break;
+ }
+ }
+ }
+ else
+ {
+ for (let i = 0; i < this.data.length; i++)
+ if (this.data[i].index >= position)
+ this.data[i].index++;
+ this.data.splice(position, 0, {index: position, filter: filter});
+ }
+ this.boxObject.rowCountChanged(position, 1);
+ this.selectRow(position);
+ },
+
+ /**
+ * Called if a filter has been removed at the specified position.
+ */
+ removeFilterAt: function(/**Integer*/ position)
+ {
+ for (let i = 0; i < this.data.length; i++)
+ {
+ if (this.data[i].index == position)
+ {
+ this.data.splice(i, 1);
+ this.boxObject.rowCountChanged(i, -1);
+ i--;
+ }
+ else if (this.data[i].index > position)
+ this.data[i].index--;
+ }
+ this.addDummyRow();
+ },
+
+ /**
+ * Called if a filter has been moved within the list.
+ */
+ moveFilterAt: function(/**Integer*/ oldPosition, /**Integer*/ newPosition)
+ {
+ let dir = (oldPosition < newPosition ? 1 : -1);
+ for (let i = 0; i < this.data.length; i++)
+ {
+ if (this.data[i].index == oldPosition)
+ this.data[i].index = newPosition;
+ else if (dir * this.data[i].index > dir * oldPosition && dir * this.data[i].index <= dir * newPosition)
+ this.data[i].index -= dir;
+ }
+
+ if (!this.sortProc)
+ {
+ let item = this.data[oldPosition];
+ this.data.splice(oldPosition, 1);
+ this.data.splice(newPosition, 0, item);
+ this.boxObject.invalidateRange(Math.min(oldPosition, newPosition), Math.max(oldPosition, newPosition));
+ }
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsITreeView]),
+
+ setTree: function(boxObject)
+ {
+ this.init();
+ this.boxObject = boxObject;
+
+ if (this.boxObject)
+ {
+ this.noGroupDummy = {index: 0, filter: {text: this.boxObject.treeBody.getAttribute("noGroupText"), dummy: true}};
+ this.noFiltersDummy = {index: 0, filter: {text: this.boxObject.treeBody.getAttribute("noFiltersText"), dummy: true}};
+ this.editDummy = {filter: {text: ""}};
+
+ let atomService = Cc["@mozilla.org/atom-service;1"].getService(Ci.nsIAtomService);
+ let stringAtoms = ["col-filter", "col-enabled", "col-hitcount", "col-lasthit", "type-comment", "type-filterlist", "type-whitelist", "type-elemhide", "type-elemhideexception", "type-invalid"];
+ let boolAtoms = ["selected", "dummy", "slow", "disabled"];
+
+ this.atoms = {};
+ for each (let atom in stringAtoms)
+ this.atoms[atom] = atomService.getAtom(atom);
+ for each (let atom in boolAtoms)
+ {
+ this.atoms[atom + "-true"] = atomService.getAtom(atom + "-true");
+ this.atoms[atom + "-false"] = atomService.getAtom(atom + "-false");
+ }
+
+ let columns = this.boxObject.columns;
+ for (let i = 0; i < columns.length; i++)
+ if (columns[i].element.hasAttribute("sortDirection"))
+ this.sortBy(columns[i].id, columns[i].element.getAttribute("sortDirection"));
+
+ this.refresh(true);
+ }
+ },
+
+ selection: null,
+
+ get rowCount() this.data.length,
+
+ getCellText: function(row, col)
+ {
+ if (row < 0 || row >= this.data.length)
+ return null;
+
+ col = col.id;
+ if (col != "col-filter" && col != "col-slow" && col != "col-hitcount" && col != "col-lasthit")
+ return null;
+
+ let filter = this.data[row].filter;
+ if (col == "col-filter")
+ return filter.text;
+ else if (col == "col-slow")
+ return (filter instanceof RegExpFilter && defaultMatcher.isSlowFilter(filter) ? "!" : null);
+ else if (filter instanceof ActiveFilter)
+ {
+ if (col == "col-hitcount")
+ return filter.hitCount;
+ else if (col == "col-lasthit")
+ return (filter.lastHit ? Utils.formatTime(filter.lastHit) : null);
+ }
+
+ return null;
+ },
+
+ generateProperties: function(list, properties)
+ {
+ if (properties)
+ {
+ // Gecko 21 and below: we have an nsISupportsArray parameter, add atoms
+ // to that.
+ for (let i = 0; i < list.length; i++)
+ if (list[i] in this.atoms)
+ properties.AppendElement(this.atoms[list[i]]);
+ return null;
+ }
+ else
+ {
+ // Gecko 22+: no parameter, just return a string
+ return list.join(" ");
+ }
+ },
+
+ getColumnProperties: function(col, properties)
+ {
+ return this.generateProperties(["col-" + col.id], properties);
+ },
+
+ getRowProperties: function(row, properties)
+ {
+ if (row < 0 || row >= this.data.length)
+ return "";
+
+ let list = [];
+ let filter = this.data[row].filter;
+ list.push("selected-" + this.selection.isSelected(row));
+ list.push("slow-" + (filter instanceof RegExpFilter && defaultMatcher.isSlowFilter(filter)));
+ if (filter instanceof ActiveFilter)
+ list.push("disabled-" + filter.disabled);
+ list.push("dummy-" + ("dummy" in filter));
+
+ if (filter instanceof CommentFilter)
+ list.push("type-comment");
+ else if (filter instanceof BlockingFilter)
+ list.push("type-filterlist");
+ else if (filter instanceof WhitelistFilter)
+ list.push("type-whitelist");
+ else if (filter instanceof ElemHideFilter)
+ list.push("type-elemhide");
+ else if (filter instanceof ElemHideException)
+ list.push("type-elemhideexception");
+ else if (filter instanceof InvalidFilter)
+ list.push("type-invalid");
+
+ return this.generateProperties(list, properties);
+ },
+
+ getCellProperties: function(row, col, properties)
+ {
+ return this.getRowProperties(row, properties) + " " + this.getColumnProperties(col, properties);
+ },
+
+ cycleHeader: function(col)
+ {
+ let oldDirection = col.element.getAttribute("sortDirection");
+ if (oldDirection == "ascending")
+ this.sortBy(col.id, "descending");
+ else if (oldDirection == "descending")
+ this.sortBy(null, null);
+ else
+ this.sortBy(col.id, "ascending");
+ },
+
+ isSorted: function()
+ {
+ return (this.sortProc != null);
+ },
+
+ canDrop: function(row, orientation, dataTransfer)
+ {
+ if (orientation == Ci.nsITreeView.DROP_ON || row < 0 || row >= this.data.length || !this.editable)
+ return false;
+
+ let item = this.data[row];
+ let position = (orientation == Ci.nsITreeView.DROP_BEFORE ? item.index : item.index + 1);
+ return FilterActions.canDrop(position, dataTransfer);
+ },
+
+ drop: function(row, orientation, dataTransfer)
+ {
+ if (orientation == Ci.nsITreeView.DROP_ON || row < 0 || row >= this.data.length || !this.editable)
+ return;
+
+ let item = this.data[row];
+ let position = (orientation == Ci.nsITreeView.DROP_BEFORE ? item.index : item.index + 1);
+ FilterActions.drop(position, dataTransfer);
+ },
+
+ isEditable: function(row, col)
+ {
+ if (row < 0 || row >= this.data.length || !this.editable)
+ return false;
+
+ let filter = this.data[row].filter;
+ if (col.id == "col-filter")
+ return !("dummy" in filter);
+ else
+ return false;
+ },
+
+ setCellText: function(row, col, value)
+ {
+ if (row < 0 || row >= this.data.length || col.id != "col-filter")
+ return;
+
+ let oldFilter = this.data[row].filter;
+ let position = this.data[row].index;
+ value = Filter.normalize(value);
+ if (!value || value == oldFilter.text)
+ return;
+
+ // Make sure we don't get called recursively (see https://adblockplus.org/forum/viewtopic.php?t=9003)
+ this.treeElement.stopEditing();
+
+ let newFilter = Filter.fromText(value);
+ if (this.data[row] == this.editDummy)
+ this.removeEditDummy();
+ else
+ FilterStorage.removeFilter(oldFilter, this._subscription, position);
+ FilterStorage.addFilter(newFilter, this._subscription, position);
+ },
+
+ cycleCell: function(row, col)
+ {
+ if (row < 0 || row >= this.data.length || col.id != "col-enabled")
+ return;
+
+ let filter = this.data[row].filter;
+ if (filter instanceof ActiveFilter)
+ filter.disabled = !filter.disabled;
+ },
+
+ isContainer: function(row) false,
+ isContainerOpen: function(row) false,
+ isContainerEmpty: function(row) true,
+ getLevel: function(row) 0,
+ getParentIndex: function(row) -1,
+ hasNextSibling: function(row, afterRow) false,
+ toggleOpenState: function(row) {},
+ getProgressMode: function() null,
+ getImageSrc: function() null,
+ isSeparator: function() false,
+ performAction: function() {},
+ performActionOnRow: function() {},
+ performActionOnCell: function() {},
+ getCellValue: function() null,
+ setCellValue: function() {},
+ selectionChanged: function() {},
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-search.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-search.js
new file mode 100644
index 0000000..4e817ac
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-search.js
@@ -0,0 +1,269 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * Implementation of the filter search functionality.
+ * @class
+ */
+var FilterSearch =
+{
+ /**
+ * Initializes findbar widget.
+ */
+ init: function()
+ {
+ let findbar = E("findbar");
+ findbar.browser = FilterSearch.fakeBrowser;
+
+ findbar.addEventListener("keypress", function(event)
+ {
+ // Work-around for bug 490047
+ if (event.keyCode == KeyEvent.DOM_VK_RETURN)
+ event.preventDefault();
+ }, false);
+
+ // Hack to prevent "highlight all" from getting enabled
+ findbar.toggleHighlight = function() {};
+ },
+
+ /**
+ * Performs a text search.
+ * @param {String} text text to be searched
+ * @param {Integer} direction search direction: -1 (backwards), 0 (forwards
+ * starting with current), 1 (forwards starting with next)
+ * @param {Boolean} caseSensitive if true, a case-sensitive search is performed
+ * @result {Integer} one of the nsITypeAheadFind constants
+ */
+ search: function(text, direction, caseSensitive)
+ {
+ function normalizeString(string) caseSensitive ? string : string.toLowerCase();
+
+ function findText(text, direction, startIndex)
+ {
+ let list = E("filtersTree");
+ let col = list.columns.getNamedColumn("col-filter");
+ let count = list.view.rowCount;
+ for (let i = startIndex + direction; i >= 0 && i < count; i += (direction || 1))
+ {
+ let filter = normalizeString(list.view.getCellText(i, col));
+ if (filter.indexOf(text) >= 0)
+ {
+ FilterView.selectRow(i);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ text = normalizeString(text);
+
+ // First try to find the entry in the current list
+ if (findText(text, direction, E("filtersTree").currentIndex))
+ return Ci.nsITypeAheadFind.FIND_FOUND;
+
+ // Now go through the other subscriptions
+ let result = Ci.nsITypeAheadFind.FIND_FOUND;
+ let subscriptions = FilterStorage.subscriptions.slice();
+ subscriptions.sort(function(s1, s2) (s1 instanceof SpecialSubscription) - (s2 instanceof SpecialSubscription));
+ let current = subscriptions.indexOf(FilterView.subscription);
+ direction = direction || 1;
+ for (let i = current + direction; ; i+= direction)
+ {
+ if (i < 0)
+ {
+ i = subscriptions.length - 1;
+ result = Ci.nsITypeAheadFind.FIND_WRAPPED;
+ }
+ else if (i >= subscriptions.length)
+ {
+ i = 0;
+ result = Ci.nsITypeAheadFind.FIND_WRAPPED;
+ }
+ if (i == current)
+ break;
+
+ let subscription = subscriptions[i];
+ for (let j = 0; j < subscription.filters.length; j++)
+ {
+ let filter = normalizeString(subscription.filters[j].text);
+ if (filter.indexOf(text) >= 0)
+ {
+ let list = E(subscription instanceof SpecialSubscription ? "groups" : "subscriptions");
+ let node = Templater.getNodeForData(list, "subscription", subscription);
+ if (!node)
+ break;
+
+ // Select subscription in its list and restore focus after that
+ let oldFocus = document.commandDispatcher.focusedElement;
+ E("tabs").selectedIndex = (subscription instanceof SpecialSubscription ? 1 : 0);
+ list.ensureElementIsVisible(node);
+ list.selectItem(node);
+ if (oldFocus)
+ {
+ oldFocus.focus();
+ Utils.runAsync(oldFocus.focus, oldFocus);
+ }
+
+ Utils.runAsync(findText, null, text, direction, direction == 1 ? -1 : subscription.filters.length);
+ return result;
+ }
+ }
+ }
+
+ return Ci.nsITypeAheadFind.FIND_NOTFOUND;
+ }
+};
+
+/**
+ * Fake browser implementation to make findbar widget happy - searches in
+ * the filter list.
+ */
+FilterSearch.fakeBrowser =
+{
+ finder:
+ {
+ _resultListeners: [],
+ searchString: null,
+ caseSensitive: false,
+ lastResult: null,
+
+ _notifyResultListeners: function(result, findBackwards)
+ {
+ this.lastResult = result;
+ for each (let listener in this._resultListeners)
+ listener.onFindResult(result, findBackwards);
+ },
+
+ fastFind: function(searchString, linksOnly, drawOutline)
+ {
+ this.searchString = searchString;
+ let result = FilterSearch.search(this.searchString, 0,
+ this.caseSensitive);
+ this._notifyResultListeners(result, false);
+ },
+
+ findAgain: function(findBackwards, linksOnly, drawOutline)
+ {
+ let result = FilterSearch.search(this.searchString,
+ findBackwards ? -1 : 1,
+ this.caseSensitive);
+ this._notifyResultListeners(result, findBackwards);
+ },
+
+ addResultListener: function(listener)
+ {
+ if (this._resultListeners.indexOf(listener) === -1)
+ this._resultListeners.push(listener);
+ },
+
+ removeResultListener: function(listener)
+ {
+ let index = this._resultListeners.indexOf(listener);
+ if (index !== -1)
+ this._resultListeners.splice(index, 1);
+ },
+
+ // Irrelevant for us
+ highlight: function(highlight, word) {},
+ enableSelection: function() {},
+ removeSelection: function() {},
+ focusContent: function() {},
+ keyPress: function() {}
+ },
+
+ get _lastSearchString()
+ {
+ return this.finder.searchString;
+ },
+
+ // This was used before Firefox 27 instead of the "finder" property.
+ fastFind:
+ {
+ get searchString()
+ {
+ return FilterSearch.fakeBrowser.finder.searchString;
+ },
+
+ set searchString(searchString)
+ {
+ FilterSearch.fakeBrowser.finder.searchString = searchString;
+ },
+
+ foundLink: null,
+ foundEditable: null,
+
+ get caseSensitive()
+ {
+ return FilterSearch.fakeBrowser.finder.caseSensitive;
+ },
+
+ set caseSensitive(caseSensitive)
+ {
+ FilterSearch.fakeBrowser.finder.caseSensitive = caseSensitive;
+ },
+
+ get currentWindow() FilterSearch.fakeBrowser.contentWindow,
+
+ find: function(searchString, linksOnly)
+ {
+ FilterSearch.fakeBrowser.finder.fastFind(searchString, linksOnly);
+ return FilterSearch.fakeBrowser.finder.lastResult;
+ },
+
+ findAgain: function(findBackwards, linksOnly)
+ {
+ FilterSearch.fakeBrowser.finder.findAgain(findBackwards, linksOnly);
+ return FilterSearch.fakeBrowser.finder.lastResult;
+ },
+
+ // Irrelevant for us
+ init: function() {},
+ setDocShell: function() {},
+ setSelectionModeAndRepaint: function() {},
+ collapseSelection: function() {}
+ },
+ currentURI: Utils.makeURI("http://example.com/"),
+ contentWindow:
+ {
+ focus: function()
+ {
+ E("filtersTree").focus();
+ },
+ scrollByLines: function(num)
+ {
+ E("filtersTree").boxObject.scrollByLines(num);
+ },
+ scrollByPages: function(num)
+ {
+ E("filtersTree").boxObject.scrollByPages(num);
+ },
+ },
+
+ addEventListener: function(event, handler, capture)
+ {
+ E("filtersTree").addEventListener(event, handler, capture);
+ },
+ removeEventListener: function(event, handler, capture)
+ {
+ E("filtersTree").addEventListener(event, handler, capture);
+ },
+};
+
+window.addEventListener("load", function()
+{
+ FilterSearch.init();
+}, false);
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-subscriptionactions.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-subscriptionactions.js
new file mode 100644
index 0000000..222a4a6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-subscriptionactions.js
@@ -0,0 +1,606 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * Implemetation of the various actions that can be performed on subscriptions.
+ * @class
+ */
+var SubscriptionActions =
+{
+ /**
+ * Returns the subscription list currently having focus if any.
+ * @type Element
+ */
+ get focusedList()
+ {
+ return E("tabs").selectedPanel.getElementsByTagName("richlistbox")[0];
+ },
+
+ /**
+ * Returns the currently selected and focused subscription item if any.
+ * @type Element
+ */
+ get selectedItem()
+ {
+ let list = this.focusedList;
+ return (list ? list.selectedItem : null);
+ },
+
+ /**
+ * Finds the subscription for a particular filter, selects it and selects the
+ * filter.
+ */
+ selectFilter: function(/**Filter*/ filter)
+ {
+ let node = null;
+ let tabIndex = -1;
+ let subscriptions = filter.subscriptions.slice();
+ subscriptions.sort(function(s1, s2) s1.disabled - s2.disabled);
+ for (let i = 0; i < subscriptions.length; i++)
+ {
+ let subscription = subscriptions[i];
+ let list = E(subscription instanceof SpecialSubscription ? "groups" : "subscriptions");
+ tabIndex = (subscription instanceof SpecialSubscription ? 1 : 0);
+ node = Templater.getNodeForData(list, "subscription", subscription);
+ if (node)
+ break;
+ }
+ if (node)
+ {
+ E("tabs").selectedIndex = tabIndex;
+ Utils.runAsync(function()
+ {
+ node.parentNode.ensureElementIsVisible(node);
+ node.parentNode.selectItem(node);
+ if (!FilterActions.visible)
+ E("subscription-showHideFilters-command").doCommand();
+ Utils.runAsync(FilterView.selectFilter, FilterView, filter);
+ });
+ }
+ },
+
+ /**
+ * Updates subscription commands whenever the selected subscription changes.
+ * Note: this method might be called with a wrong "this" value.
+ */
+ updateCommands: function()
+ {
+ let node = SubscriptionActions.selectedItem;
+ let data = Templater.getDataForNode(node);
+ let subscription = (data ? data.subscription : null)
+ E("subscription-editTitle-command").setAttribute("disabled", !subscription ||
+ subscription.fixedTitle);
+ E("subscription-update-command").setAttribute("disabled", !subscription ||
+ !(subscription instanceof DownloadableSubscription) ||
+ Synchronizer.isExecuting(subscription.url));
+ E("subscription-moveUp-command").setAttribute("disabled", !subscription ||
+ !node || !node.previousSibling || !!node.previousSibling.id);
+ E("subscription-moveDown-command").setAttribute("disabled", !subscription ||
+ !node || !node.nextSibling || !!node.nextSibling.id);
+ },
+
+ /**
+ * Starts title editing for the selected subscription.
+ */
+ editTitle: function()
+ {
+ let node = this.selectedItem;
+ if (node)
+ TitleEditor.start(node);
+ },
+
+ /**
+ * Triggers re-download of a filter subscription.
+ */
+ updateFilters: function(/**Node*/ node)
+ {
+ let data = Templater.getDataForNode(node || this.selectedItem);
+ if (data && data.subscription instanceof DownloadableSubscription)
+ Synchronizer.execute(data.subscription, true);
+ },
+
+ /**
+ * Triggers re-download of all filter subscriptions.
+ */
+ updateAllFilters: function()
+ {
+ for (let i = 0; i < FilterStorage.subscriptions.length; i++)
+ {
+ let subscription = FilterStorage.subscriptions[i];
+ if (subscription instanceof DownloadableSubscription)
+ Synchronizer.execute(subscription, true);
+ }
+ },
+
+ /**
+ * Sets Subscription.disabled field to a new value.
+ */
+ setDisabled: function(/**Element*/ node, /**Boolean*/ value)
+ {
+ let data = Templater.getDataForNode(node || this.selectedItem);
+ if (data)
+ data.subscription.disabled = value;
+ },
+
+ /**
+ * Enables all disabled filters in a subscription.
+ */
+ enableFilters: function(/**Element*/ node)
+ {
+ let data = Templater.getDataForNode(node);
+ if (!data)
+ return;
+
+ let filters = data.subscription.filters;
+ for (let i = 0, l = filters.length; i < l; i++)
+ if (filters[i] instanceof ActiveFilter && filters[i].disabled)
+ filters[i].disabled = false;
+ },
+
+ /**
+ * Removes a filter subscription from the list (after a warning).
+ */
+ remove: function(/**Node*/ node)
+ {
+ let data = Templater.getDataForNode(node || this.selectedItem);
+ if (data && Utils.confirm(window, Utils.getString(data.subscription instanceof SpecialSubscription ? "remove_group_warning" : "remove_subscription_warning")))
+ FilterStorage.removeSubscription(data.subscription);
+ },
+
+ /**
+ * Adds a new filter group and allows the user to change its title.
+ */
+ addGroup: function()
+ {
+ let subscription = SpecialSubscription.create();
+ FilterStorage.addSubscription(subscription);
+
+ let list = E("groups");
+ let node = Templater.getNodeForData(list, "subscription", subscription);
+ if (node)
+ {
+ list.focus();
+ list.ensureElementIsVisible(node);
+ list.selectedItem = node;
+ this.editTitle();
+ }
+ },
+
+ /**
+ * Moves a filter subscription one line up.
+ */
+ moveUp: function(/**Node*/ node)
+ {
+ node = Templater.getDataNode(node || this.selectedItem);
+ let data = Templater.getDataForNode(node);
+ if (!data)
+ return;
+
+ let previousData = Templater.getDataForNode(node.previousSibling);
+ if (!previousData)
+ return;
+
+ FilterStorage.moveSubscription(data.subscription, previousData.subscription);
+ },
+
+ /**
+ * Moves a filter subscription one line down.
+ */
+ moveDown: function(/**Node*/ node)
+ {
+ node = Templater.getDataNode(node || this.selectedItem);
+ let data = Templater.getDataForNode(node);
+ if (!data)
+ return;
+
+ let nextNode = node.nextSibling;
+ if (!Templater.getDataForNode(nextNode))
+ return;
+
+ let nextData = Templater.getDataForNode(nextNode.nextSibling);
+ FilterStorage.moveSubscription(data.subscription, nextData ? nextData.subscription : null);
+ },
+
+ /**
+ * Opens the context menu for a subscription node.
+ */
+ openMenu: function(/**Event*/ event, /**Node*/ node)
+ {
+ node.getElementsByClassName("actionMenu")[0].openPopupAtScreen(event.screenX, event.screenY, true);
+ },
+
+ _altMask: 2,
+ _ctrlMask: 4,
+ _metaMask: 8,
+ get _accelMask()
+ {
+ let result = this._ctrlMask;
+ try {
+ let accelKey = Utils.prefService.getIntPref("ui.key.accelKey");
+ if (accelKey == Ci.nsIDOMKeyEvent.DOM_VK_META)
+ result = this._metaMask;
+ else if (accelKey == Ci.nsIDOMKeyEvent.DOM_VK_ALT)
+ result = this._altMask;
+ } catch(e) {}
+ this.__defineGetter__("_accelMask", function() result);
+ return result;
+ },
+
+ /**
+ * Called when a key is pressed on the subscription list.
+ */
+ keyPress: function(/**Event*/ event)
+ {
+ let modifiers = 0;
+ if (event.altKey)
+ modifiers |= this._altMask;
+ if (event.ctrlKey)
+ modifiers |= this._ctrlMask;
+ if (event.metaKey)
+ modifiers |= this._metaMask;
+
+ if (event.charCode == " ".charCodeAt(0) && modifiers == 0)
+ {
+ // Ignore if Space is pressed on a button
+ for (let node = event.target; node; node = node.parentNode)
+ if (node.localName == "button")
+ return;
+
+ let data = Templater.getDataForNode(this.selectedItem);
+ if (data)
+ data.subscription.disabled = !data.subscription.disabled;
+ }
+ else if (event.keyCode == Ci.nsIDOMKeyEvent.DOM_VK_UP && modifiers == this._accelMask)
+ {
+ E("subscription-moveUp-command").doCommand();
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ else if (event.keyCode == Ci.nsIDOMKeyEvent.DOM_VK_DOWN && modifiers == this._accelMask)
+ {
+ E("subscription-moveDown-command").doCommand();
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ },
+
+ /**
+ * Subscription currently being dragged if any.
+ * @type Subscription
+ */
+ dragSubscription: null,
+
+ /**
+ * Called when a subscription entry is dragged.
+ */
+ startDrag: function(/**Event*/ event, /**Node*/ node)
+ {
+ let data = Templater.getDataForNode(node);
+ if (!data)
+ return;
+
+ event.dataTransfer.addElement(node);
+ event.dataTransfer.setData("text/x-moz-url", data.subscription.url);
+ event.dataTransfer.setData("text/plain", data.subscription.title);
+ this.dragSubscription = data.subscription;
+ event.stopPropagation();
+ },
+
+ /**
+ * Called when something is dragged over a subscription entry or subscriptions list.
+ */
+ dragOver: function(/**Event*/ event)
+ {
+ // Don't allow dragging onto a scroll bar
+ for (let node = event.originalTarget; node; node = node.parentNode)
+ if (node.localName == "scrollbar")
+ return;
+
+ // Don't allow dragging onto element's borders
+ let target = event.originalTarget;
+ while (target && target.localName != "richlistitem")
+ target = target.parentNode;
+ if (!target)
+ target = event.originalTarget;
+
+ let styles = window.getComputedStyle(target, null);
+ let rect = target.getBoundingClientRect();
+ if (event.clientX < rect.left + parseInt(styles.borderLeftWidth, 10) ||
+ event.clientY < rect.top + parseInt(styles.borderTopWidth, 10) ||
+ event.clientX > rect.right - parseInt(styles.borderRightWidth, 10) - 1 ||
+ event.clientY > rect.bottom - parseInt(styles.borderBottomWidth, 10) - 1)
+ {
+ return;
+ }
+
+ // If not dragging a subscription check whether we can accept plain text
+ if (!this.dragSubscription)
+ {
+ let data = Templater.getDataForNode(event.target);
+ if (!data || !(data.subscription instanceof SpecialSubscription) || !event.dataTransfer.getData("text/plain"))
+ return;
+ }
+
+ event.preventDefault();
+ event.stopPropagation();
+ },
+
+ /**
+ * Called when something is dropped on a subscription entry or subscriptions list.
+ */
+ drop: function(/**Event*/ event, /**Node*/ node)
+ {
+ if (!this.dragSubscription)
+ {
+ // Not dragging a subscription, maybe this is plain text that we can add as filters?
+ let data = Templater.getDataForNode(node);
+ if (data && data.subscription instanceof SpecialSubscription)
+ {
+ let lines = event.dataTransfer.getData("text/plain").replace(/\r/g, "").split("\n");
+ for (let i = 0; i < lines.length; i++)
+ {
+ let line = Filter.normalize(lines[i]);
+ if (line)
+ {
+ let filter = Filter.fromText(line);
+ FilterStorage.addFilter(filter, data.subscription);
+ }
+ }
+ FilterActions.removeDraggedFilters();
+ event.stopPropagation();
+ }
+ return;
+ }
+
+ // When dragging down we need to insert after the drop node, otherwise before it.
+ node = Templater.getDataNode(node);
+ if (node)
+ {
+ let dragNode = Templater.getNodeForData(node.parentNode, "subscription", this.dragSubscription);
+ if (node.compareDocumentPosition(dragNode) & node.DOCUMENT_POSITION_PRECEDING)
+ node = node.nextSibling;
+ }
+
+ let data = Templater.getDataForNode(node);
+ FilterStorage.moveSubscription(this.dragSubscription, data ? data.subscription : null);
+ event.stopPropagation();
+ },
+
+ /**
+ * Called when the drag operation for a subscription is finished.
+ */
+ endDrag: function()
+ {
+ this.dragSubscription = null;
+ }
+};
+
+/**
+ * Subscription title editing functionality.
+ * @class
+ */
+var TitleEditor =
+{
+ /**
+ * List item corresponding with the currently edited subscription if any.
+ * @type Node
+ */
+ subscriptionEdited: null,
+
+ /**
+ * Starts editing of a subscription title.
+ * @param {Node} node subscription list entry or a child node
+ * @param {Boolean} [checkSelection] if true the editor will not start if the
+ * item was selected in the preceding mousedown event
+ */
+ start: function(node, checkSelection)
+ {
+ if (this.subscriptionEdited)
+ this.end(true);
+
+ let subscriptionNode = Templater.getDataNode(node);
+ if (!subscriptionNode || (checkSelection && !subscriptionNode._wasSelected))
+ return;
+
+ let subscription = Templater.getDataForNode(subscriptionNode).subscription;
+ if (!subscription || subscription.fixedTitle)
+ return;
+
+ subscriptionNode.getElementsByClassName("titleBox")[0].selectedIndex = 1;
+ let editor = subscriptionNode.getElementsByClassName("titleEditor")[0];
+ editor.value = subscription.title;
+ editor.setSelectionRange(0, editor.value.length);
+ this.subscriptionEdited = subscriptionNode;
+ editor.focus();
+ },
+
+ /**
+ * Stops editing of a subscription title.
+ * @param {Boolean} save if true the entered value will be saved, otherwise dismissed
+ */
+ end: function(save)
+ {
+ if (!this.subscriptionEdited)
+ return;
+
+ let subscriptionNode = this.subscriptionEdited;
+ this.subscriptionEdited = null;
+
+ let newTitle = null;
+ if (save)
+ {
+ newTitle = subscriptionNode.getElementsByClassName("titleEditor")[0].value;
+ newTitle = newTitle.replace(/^\s+/, "").replace(/\s+$/, "");
+ }
+
+ let subscription = Templater.getDataForNode(subscriptionNode).subscription
+ if (newTitle && newTitle != subscription.title)
+ subscription.title = newTitle;
+ else
+ {
+ subscriptionNode.getElementsByClassName("titleBox")[0].selectedIndex = 0;
+ subscriptionNode.parentNode.focus();
+ }
+ },
+
+ /**
+ * Processes keypress events on the subscription title editor field.
+ */
+ keyPress: function(/**Event*/ event)
+ {
+ // Prevent any key presses from triggering outside actions
+ event.stopPropagation();
+
+ if (event.keyCode == event.DOM_VK_RETURN || event.keyCode == event.DOM_VK_ENTER)
+ {
+ event.preventDefault();
+ this.end(true);
+ }
+ else if (event.keyCode == event.DOM_VK_CANCEL || event.keyCode == event.DOM_VK_ESCAPE)
+ {
+ event.preventDefault();
+ this.end(false);
+ }
+ }
+};
+
+/**
+ * Methods called when choosing and adding a new filter subscription.
+ * @class
+ */
+var SelectSubscription =
+{
+ /**
+ * Starts selection of a filter subscription to add.
+ */
+ start: function(/**Event*/ event)
+ {
+ let panel = E("selectSubscriptionPanel");
+ let list = E("selectSubscription");
+ let template = E("selectSubscriptionTemplate");
+ let parent = list.menupopup;
+
+ if (panel.state == "open")
+ {
+ list.focus();
+ return;
+ }
+
+ // Remove existing entries if any
+ while (parent.lastChild)
+ parent.removeChild(parent.lastChild);
+
+ // Load data
+ let request = new XMLHttpRequest();
+ request.open("GET", "subscriptions.xml");
+ request.onload = function()
+ {
+ // Avoid race condition if two downloads are started in parallel
+ if (panel.state == "open")
+ return;
+
+ // Add subscription entries to the list
+ let subscriptions = request.responseXML.getElementsByTagName("subscription");
+ let listedSubscriptions = [];
+ for (let i = 0; i < subscriptions.length; i++)
+ {
+ let subscription = subscriptions[i];
+ let url = subscription.getAttribute("url");
+ if (!url || url in FilterStorage.knownSubscriptions)
+ continue;
+
+ let localePrefix = Utils.checkLocalePrefixMatch(subscription.getAttribute("prefixes"));
+ let node = Templater.process(template, {
+ __proto__: null,
+ node: subscription,
+ localePrefix: localePrefix
+ });
+ parent.appendChild(node);
+ listedSubscriptions.push(subscription);
+ }
+ let selectedNode = Utils.chooseFilterSubscription(listedSubscriptions);
+ list.selectedItem = Templater.getNodeForData(parent, "node", selectedNode) || parent.firstChild;
+
+ // Show panel and focus list
+ let position = (Utils.versionComparator.compare(Utils.platformVersion, "2.0") < 0 ? "after_end" : "bottomcenter topleft");
+ panel.openPopup(E("selectSubscriptionButton"), position, 0, 0, false, false, event);
+ Utils.runAsync(list.focus, list);
+ };
+ request.send();
+ },
+
+ /**
+ * Adds filter subscription that is selected.
+ */
+ add: function()
+ {
+ E("selectSubscriptionPanel").hidePopup();
+
+ let data = Templater.getDataForNode(E("selectSubscription").selectedItem);
+ if (!data)
+ return;
+
+ let subscription = Subscription.fromURL(data.node.getAttribute("url"));
+ if (!subscription)
+ return;
+
+ FilterStorage.addSubscription(subscription);
+ subscription.disabled = false;
+ subscription.title = data.node.getAttribute("title");
+ subscription.homepage = data.node.getAttribute("homepage");
+
+ // Make sure the subscription is visible and selected
+ let list = E("subscriptions");
+ let node = Templater.getNodeForData(list, "subscription", subscription);
+ if (node)
+ {
+ list.ensureElementIsVisible(node);
+ list.selectedItem = node;
+ list.focus();
+ }
+
+ // Trigger download if necessary
+ if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+ Synchronizer.execute(subscription);
+ },
+
+ /**
+ * Called if the user chooses to view the complete subscriptions list.
+ */
+ chooseOther: function()
+ {
+ E("selectSubscriptionPanel").hidePopup();
+ window.openDialog("subscriptionSelection.xul", "_blank", "chrome,centerscreen,modal,resizable,dialog=no", null, null);
+ },
+
+ /**
+ * Called for keys pressed on the subscription selection panel.
+ */
+ keyPress: function(/**Event*/ event)
+ {
+ // Buttons and text links handle Enter key themselves
+ if (event.target.localName == "button" || event.target.localName == "label")
+ return;
+
+ if (event.keyCode == event.DOM_VK_RETURN || event.keyCode == event.DOM_VK_ENTER)
+ {
+ // This shouldn't accept our dialog, only the panel
+ event.preventDefault();
+ E("selectSubscriptionAccept").doCommand();
+ }
+ }
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-subscriptionview.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-subscriptionview.js
new file mode 100644
index 0000000..a1673e4
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters-subscriptionview.js
@@ -0,0 +1,330 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * Fills a list of filter groups and keeps it updated.
+ * @param {Element} list richlistbox element to be filled
+ * @param {Node} template template to use for the groups
+ * @param {Function} filter filter to decide which lists should be included
+ * @param {Function} listener function to be called on changes
+ * @constructor
+ */
+function ListManager(list, template, filter, listener)
+{
+ this._list = list;
+ this._template = template;
+ this._filter = filter;
+ this._listener = listener || function(){};
+
+ this._deck = this._list.parentNode;
+
+ this._list.listManager = this;
+ this.reload();
+
+ let me = this;
+ let proxy = function()
+ {
+ return me._onChange.apply(me, arguments);
+ };
+ FilterNotifier.addListener(proxy);
+ window.addEventListener("unload", function()
+ {
+ FilterNotifier.removeListener(proxy);
+ }, false);
+}
+ListManager.prototype =
+{
+ /**
+ * List element being managed.
+ * @type Element
+ */
+ _list: null,
+ /**
+ * Template used for the groups.
+ * @type Node
+ */
+ _template: null,
+ /**
+ * Filter function to decide which subscriptions should be included.
+ * @type Function
+ */
+ _filter: null,
+ /**
+ * Function to be called whenever list contents change.
+ * @type Function
+ */
+ _listener: null,
+ /**
+ * Deck switching between list display and "no entries" message.
+ * @type Element
+ */
+ _deck: null,
+
+ /**
+ * Completely rebuilds the list.
+ */
+ reload: function()
+ {
+ // Remove existing entries if any
+ while (this._list.firstChild)
+ this._list.removeChild(this._list.firstChild);
+
+ // Now add all subscriptions
+ let subscriptions = FilterStorage.subscriptions.filter(this._filter, this);
+ if (subscriptions.length)
+ {
+ for each (let subscription in subscriptions)
+ this.addSubscription(subscription, null);
+
+ // Make sure first list item is selected after list initialization
+ Utils.runAsync(function()
+ {
+ this._list.selectItem(this._list.getItemAtIndex(this._list.getIndexOfFirstVisibleRow()));
+ }, this);
+ }
+
+ this._deck.selectedIndex = (subscriptions.length ? 1 : 0);
+ this._listener();
+ },
+
+ /**
+ * Adds a filter subscription to the list.
+ */
+ addSubscription: function(/**Subscription*/ subscription, /**Node*/ insertBefore) /**Node*/
+ {
+ let disabledFilters = 0;
+ for (let i = 0, l = subscription.filters.length; i < l; i++)
+ if (subscription.filters[i] instanceof ActiveFilter && subscription.filters[i].disabled)
+ disabledFilters++;
+
+ let node = Templater.process(this._template, {
+ __proto__: null,
+ subscription: subscription,
+ isExternal: subscription instanceof ExternalSubscription,
+ downloading: Synchronizer.isExecuting(subscription.url),
+ disabledFilters: disabledFilters
+ });
+ if (insertBefore)
+ this._list.insertBefore(node, insertBefore);
+ else
+ this._list.appendChild(node);
+ return node;
+ },
+
+ /**
+ * Map indicating subscriptions that need their "disabledFilters" property to
+ * be updated by next updateDisabled() call.
+ * @type Object
+ */
+ _scheduledUpdateDisabled: null,
+
+ /**
+ * Updates subscriptions that had some of their filters enabled/disabled.
+ */
+ updateDisabled: function()
+ {
+ let list = this._scheduledUpdateDisabled;
+ this._scheduledUpdateDisabled = null;
+ for (let url in list)
+ {
+ let subscription = Subscription.fromURL(url);
+ let subscriptionNode = Templater.getNodeForData(this._list, "subscription", subscription);
+ if (subscriptionNode)
+ {
+ let data = Templater.getDataForNode(subscriptionNode);
+ let disabledFilters = 0;
+ for (let i = 0, l = subscription.filters.length; i < l; i++)
+ if (subscription.filters[i] instanceof ActiveFilter && subscription.filters[i].disabled)
+ disabledFilters++;
+
+ if (disabledFilters != data.disabledFilters)
+ {
+ data.disabledFilters = disabledFilters;
+ Templater.update(this._template, subscriptionNode);
+
+ if (!document.commandDispatcher.focusedElement)
+ this._list.focus();
+ }
+ }
+ }
+ },
+
+ /**
+ * Subscriptions change processing.
+ * @see FilterNotifier.addListener()
+ */
+ _onChange: function(action, item, param1, param2)
+ {
+ if ((action == "subscription.added" || action == "subscription.removed") && item.url == Prefs.subscriptions_exceptionsurl)
+ E("acceptableAds").checked = FilterStorage.subscriptions.some(function(s) s.url == Prefs.subscriptions_exceptionsurl);
+
+ if (action == "filter.disabled")
+ {
+ if (this._scheduledUpdateDisabled == null)
+ {
+ this._scheduledUpdateDisabled = {__proto__: null};
+ Utils.runAsync(this.updateDisabled, this);
+ }
+ for (let i = 0; i < item.subscriptions.length; i++)
+ this._scheduledUpdateDisabled[item.subscriptions[i].url] = true;
+ return;
+ }
+
+ if (action != "load" && !this._filter(item))
+ return;
+
+ switch (action)
+ {
+ case "load":
+ {
+ this.reload();
+ break;
+ }
+ case "subscription.added":
+ {
+ let index = FilterStorage.subscriptions.indexOf(item);
+ if (index >= 0)
+ {
+ let insertBefore = null;
+ for (index++; index < FilterStorage.subscriptions.length && !insertBefore; index++)
+ insertBefore = Templater.getNodeForData(this._list, "subscription", FilterStorage.subscriptions[index]);
+ this.addSubscription(item, insertBefore);
+ this._deck.selectedIndex = 1;
+ this._listener();
+ }
+ break;
+ }
+ case "subscription.removed":
+ {
+ let node = Templater.getNodeForData(this._list, "subscription", item);
+ if (node)
+ {
+ let newSelection = node.nextSibling || node.previousSibling;
+ node.parentNode.removeChild(node);
+ if (!this._list.firstChild)
+ {
+ this._deck.selectedIndex = 0;
+ this._list.selectedIndex = -1;
+ }
+ else if (newSelection)
+ {
+ this._list.ensureElementIsVisible(newSelection);
+ this._list.selectedItem = newSelection;
+ }
+ this._listener();
+ }
+ break
+ }
+ case "subscription.moved":
+ {
+ let node = Templater.getNodeForData(this._list, "subscription", item);
+ if (node)
+ {
+ node.parentNode.removeChild(node);
+ let insertBefore = null;
+ let index = FilterStorage.subscriptions.indexOf(item);
+ if (index >= 0)
+ for (index++; index < FilterStorage.subscriptions.length && !insertBefore; index++)
+ insertBefore = Templater.getNodeForData(this._list, "subscription", FilterStorage.subscriptions[index]);
+ this._list.insertBefore(node, insertBefore);
+ this._list.ensureElementIsVisible(node);
+ this._listener();
+ }
+ break;
+ }
+ case "subscription.title":
+ case "subscription.disabled":
+ case "subscription.homepage":
+ case "subscription.lastDownload":
+ case "subscription.downloadStatus":
+ {
+ let subscriptionNode = Templater.getNodeForData(this._list, "subscription", item);
+ if (subscriptionNode)
+ {
+ Templater.getDataForNode(subscriptionNode).downloading = Synchronizer.isExecuting(item.url);
+ Templater.update(this._template, subscriptionNode);
+
+ if (!document.commandDispatcher.focusedElement)
+ this._list.focus();
+ this._listener();
+ }
+ break;
+ }
+ case "subscription.fixedTitle":
+ {
+ SubscriptionActions.updateCommands();
+ break;
+ }
+ case "subscription.updated":
+ {
+ if (this._scheduledUpdateDisabled == null)
+ {
+ this._scheduledUpdateDisabled = {__proto__: null};
+ Utils.runAsync(this.updateDisabled, this);
+ }
+ this._scheduledUpdateDisabled[item.url] = true;
+ break;
+ }
+ }
+ }
+};
+
+/**
+ * Attaches list managers to the lists.
+ */
+ListManager.init = function()
+{
+ new ListManager(E("subscriptions"),
+ E("subscriptionTemplate"),
+ function(s) s instanceof RegularSubscription && !(ListManager.acceptableAdsCheckbox && s.url == Prefs.subscriptions_exceptionsurl),
+ SubscriptionActions.updateCommands);
+ new ListManager(E("groups"),
+ E("groupTemplate"),
+ function(s) s instanceof SpecialSubscription,
+ SubscriptionActions.updateCommands);
+ E("acceptableAds").checked = FilterStorage.subscriptions.some(function(s) s.url == Prefs.subscriptions_exceptionsurl);
+ E("acceptableAds").parentNode.hidden = !ListManager.acceptableAdsCheckbox;
+};
+
+/**
+ * Defines whether the "acceptable ads" subscription needs special treatment.
+ * @type Boolean
+ */
+ListManager.acceptableAdsCheckbox = Prefs.subscriptions_exceptionscheckbox;
+
+/**
+ * Adds or removes filter subscription allowing acceptable ads.
+ */
+ListManager.allowAcceptableAds = function(/**Boolean*/ allow)
+{
+ let subscription = Subscription.fromURL(Prefs.subscriptions_exceptionsurl);
+ if (!subscription)
+ return;
+
+ subscription.disabled = false;
+ subscription.title = "Allow non-intrusive advertising";
+ if (allow)
+ {
+ FilterStorage.addSubscription(subscription);
+ if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+ Synchronizer.execute(subscription);
+ }
+ else
+ FilterStorage.removeSubscription(subscription);
+};
+
+window.addEventListener("load", ListManager.init, false);
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters.js
new file mode 100644
index 0000000..8830fdb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters.js
@@ -0,0 +1,226 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * Initialization function, called when the window is loaded.
+ */
+function init()
+{
+ if (window.arguments && window.arguments.length)
+ {
+ let filter = window.arguments[0].wrappedJSObject;
+ if (filter instanceof Filter)
+ Utils.runAsync(SubscriptionActions.selectFilter, SubscriptionActions, filter);
+ }
+}
+
+/**
+ * Called whenever the currently selected tab changes.
+ */
+function onTabChange(/**Element*/ tabbox)
+{
+ updateSelectedSubscription();
+
+ Utils.runAsync(function()
+ {
+ let panel = tabbox.selectedPanel;
+ if (panel)
+ panel.getElementsByClassName("initialFocus")[0].focus();
+ SubscriptionActions.updateCommands();
+ });
+}
+
+/**
+ * Called whenever the selected subscription changes.
+ */
+function onSelectionChange(/**Element*/ list)
+{
+ SubscriptionActions.updateCommands();
+ updateSelectedSubscription();
+ list.focus();
+
+ // Take elements of the previously selected item out of the tab order
+ if ("previousSelection" in list && list.previousSelection)
+ {
+ let elements = list.previousSelection.getElementsByClassName("tabable");
+ for (let i = 0; i < elements.length; i++)
+ elements[i].setAttribute("tabindex", "-1");
+ }
+ // Put elements of the selected item into tab order
+ if (list.selectedItem)
+ {
+ let elements = list.selectedItem.getElementsByClassName("tabable");
+ for (let i = 0; i < elements.length; i++)
+ elements[i].removeAttribute("tabindex");
+ }
+ list.previousSelection = list.selectedItem;
+}
+
+/**
+ * Called when splitter state changes to make sure it is persisted properly.
+ */
+function onSplitterStateChange(/**Element*/ splitter)
+{
+ let state = splitter.getAttribute("state");
+ if (!state)
+ {
+ splitter.setAttribute("state", "open");
+ document.persist(splitter.id, "state");
+ }
+}
+
+/**
+ * Updates filter list when selected subscription changes.
+ */
+function updateSelectedSubscription()
+{
+ let panel = E("tabs").selectedPanel;
+ if (!panel)
+ return;
+
+ let list = panel.getElementsByTagName("richlistbox")[0];
+ if (!list)
+ return;
+
+ let data = Templater.getDataForNode(list.selectedItem);
+ FilterView.subscription = (data ? data.subscription : null);
+ FilterActions.updateCommands();
+}
+
+/**
+ * Template processing functions.
+ * @class
+ */
+var Templater =
+{
+ /**
+ * Processes a template node using given data object.
+ */
+ process: function(/**Node*/ template, /**Object*/ data) /**Node*/
+ {
+ // Use a sandbox to resolve attributes (for convenience, not security)
+ let sandbox = Cu.Sandbox(window);
+ for (let key in data)
+ sandbox[key] = data[key];
+ sandbox.formatTime = Utils.formatTime;
+
+ // Clone template but remove id/hidden attributes from it
+ let result = template.cloneNode(true);
+ result.removeAttribute("id");
+ result.removeAttribute("hidden");
+ result._data = data;
+
+ // Resolve any attributes of the for attr="{obj.foo}"
+ let conditionals = [];
+ let nodeIterator = document.createNodeIterator(result, NodeFilter.SHOW_ELEMENT, null, false);
+ for (let node = nodeIterator.nextNode(); node; node = nodeIterator.nextNode())
+ {
+ if (node.localName == "if")
+ conditionals.push(node);
+ for (let i = 0; i < node.attributes.length; i++)
+ {
+ let attribute = node.attributes[i];
+ let len = attribute.value.length;
+ if (len >= 2 && attribute.value[0] == "{" && attribute.value[len - 1] == "}")
+ {
+ let value = Cu.evalInSandbox(attribute.value.substr(1, len - 2), sandbox);
+ if (attribute.name == "condition")
+ value = value ? "true" : "false";
+ attribute.value = value;
+ }
+ }
+ }
+
+ // Process <if> tags - remove if condition is false, replace by their children
+ // if it is true
+ for each (let node in conditionals)
+ {
+ let fragment = document.createDocumentFragment();
+ let condition = node.getAttribute("condition");
+ if (condition == "false")
+ condition = false;
+ for (let i = 0; i < node.childNodes.length; i++)
+ {
+ let child = node.childNodes[i];
+ if (child.localName == "elif" || child.localName == "else")
+ {
+ if (condition)
+ break;
+ condition = (child.localName == "elif" ? child.getAttribute("condition") : true);
+ if (condition == "false")
+ condition = false;
+ }
+ else if (condition)
+ fragment.appendChild(node.childNodes[i--]);
+ }
+ node.parentNode.replaceChild(fragment, node);
+ }
+
+ return result;
+ },
+
+ /**
+ * Updates first child of a processed template if the underlying data changed.
+ */
+ update: function(/**Node*/ template, /**Node*/ node)
+ {
+ if (!("_data" in node))
+ return;
+ let newChild = Templater.process(template.firstChild, node._data);
+ delete newChild._data;
+ node.replaceChild(newChild, node.firstChild);
+ },
+
+ /**
+ * Walks up the parent chain for a node until the node corresponding with a
+ * template is found.
+ */
+ getDataNode: function(/**Node*/ node) /**Node*/
+ {
+ while (node)
+ {
+ if ("_data" in node)
+ return node;
+ node = node.parentNode;
+ }
+ return null;
+ },
+
+ /**
+ * Returns the data used to generate the node from a template.
+ */
+ getDataForNode: function(/**Node*/ node) /**Object*/
+ {
+ node = Templater.getDataNode(node);
+ if (node)
+ return node._data;
+ else
+ return null;
+ },
+
+ /**
+ * Returns a node that has been generated from a template using a particular
+ * data object.
+ */
+ getNodeForData: function(/**Node*/ parent, /**String*/ property, /**Object*/ data) /**Node*/
+ {
+ for (let child = parent.firstChild; child; child = child.nextSibling)
+ if ("_data" in child && property in child._data && child._data[property] == data)
+ return child;
+ return null;
+ }
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters.xul b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters.xul
new file mode 100644
index 0000000..ce65659
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/filters.xul
@@ -0,0 +1,400 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://adblockplus/skin/filters.css" type="text/css"?>
+
+<!DOCTYPE dialog SYSTEM "chrome://adblockplus/locale/filters.dtd">
+
+<dialog
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ title="&dialog.title;"
+ id="abpFiltersWindow"
+ onload="init()"
+ buttons="accept"
+ width="950"
+ height="450"
+ persist="screenX screenY width height sizemode"
+ windowtype="abp:filters">
+
+<script type="application/x-javascript;version=1.7" src="utils.js"/>
+<script type="application/x-javascript;version=1.7" src="filters.js"/>
+<script type="application/x-javascript;version=1.7" src="filters-subscriptionview.js"/>
+<script type="application/x-javascript;version=1.7" src="filters-subscriptionactions.js"/>
+<script type="application/x-javascript;version=1.7" src="filters-filterview.js"/>
+<script type="application/x-javascript;version=1.7" src="filters-filteractions.js"/>
+<script type="application/x-javascript;version=1.7" src="filters-backup.js"/>
+<script type="application/x-javascript;version=1.7" src="filters-search.js"/>
+
+<keyset id="filtersKeyset">
+ <key id="subscription-update-key" key="T" modifiers="accel" command="subscription-update-command"/>
+ <key id="subscription-update-all-key" key="T" modifiers="accel,shift" command="subscription-update-all-command"/>
+ <key id="edit-key" keycode="VK_F2" oncommand="E(FilterActions.focused ? 'filters-edit-command' : 'subscription-editTitle-command').doCommand();"/>
+ <key id="delete-key" keycode="VK_DELETE" oncommand="E(FilterActions.focused ? 'filters-delete-command' : 'subscription-delete-command').doCommand();"/>
+ <key id="subscription-showHideFilters-key" key="R" modifiers="accel" command="subscription-showHideFilters-command"/>
+ <key id="moveUp-key" keycode="VK_UP" modifiers="accel"/>
+ <key id="moveDown-key" keycode="VK_DOWN" modifiers="accel"/>
+ <key id="filters-add-key" keycode="VK_INSERT" oncommand="E('filters-add-command').doCommand();"/>
+ <key id="filters-selectAll-key" key="A" modifiers="accel" oncommand="if (FilterActions.focused) E('filters-selectAll-command').doCommand();"/>
+ <key id="filters-copy-key" key="C" modifiers="accel" oncommand="if (FilterActions.focused) E('filters-copy-command').doCommand();"/>
+ <key id="filters-cut-key" key="X" modifiers="accel" oncommand="if (FilterActions.focused) E('filters-cut-command').doCommand();"/>
+ <key id="filters-paste-key" key="V" modifiers="accel" oncommand="if (FilterActions.focused) E('filters-paste-command').doCommand();"/>
+ <key id="backup-key" key="E" modifiers="accel" oncommand="E('backup').doCommand();"/>
+ <key id="restore-key" key="I" modifiers="accel" oncommand="E('restoreOwnBackup').doCommand();"/>
+ <key id="find-key" key="F" modifiers="accel" oncommand="if (FilterActions.visible) E('find-command').doCommand();"/>
+ <key id="find-again-key" key="G" modifiers="accel" oncommand="if (FilterActions.visible) E('find-again-command').doCommand();"/>
+ <key id="find-previous-key" key="G" modifiers="accel,shift" oncommand="if (FilterActions.visible) E('find-previous-command').doCommand();"/>
+ <key id="find-again-key2" keycode="VK_F3" oncommand="if (FilterActions.visible) E('find-again-command').doCommand();"/>
+ <key id="find-previous-key2" keycode="VK_F3" modifiers="shift" oncommand="if (FilterActions.visible) E('find-previous-command').doCommand();"/>
+</keyset>
+
+<commandset id="filtersCommandset">
+ <command id="subscription-update-command" oncommand="SubscriptionActions.updateFilters();"/>
+ <command id="subscription-update-all-command" oncommand="SubscriptionActions.updateAllFilters();"/>
+ <command id="subscription-editTitle-command" oncommand="SubscriptionActions.editTitle();"/>
+ <command id="subscription-delete-command" oncommand="SubscriptionActions.remove();"/>
+ <command id="subscription-showHideFilters-command" oncommand="E('filtersGrippy').doCommand();"/>
+ <command id="subscription-moveUp-command" oncommand="SubscriptionActions.moveUp();"/>
+ <command id="subscription-moveDown-command" oncommand="SubscriptionActions.moveDown();"/>
+ <command id="subscription-add-command" oncommand="SelectSubscription.start(event);"/>
+ <command id="subscription-addSelected-command" oncommand="SelectSubscription.add();"/>
+ <command id="subscription-addOther-command" oncommand="SelectSubscription.chooseOther();"/>
+ <command id="group-add-command" oncommand="SubscriptionActions.addGroup();"/>
+ <command id="filters-selectAll-command" oncommand="FilterActions.selectAll();"/>
+ <command id="filters-edit-command" oncommand="FilterActions.startEditing();"/>
+ <command id="filters-add-command" oncommand="FilterActions.insertFilter();"/>
+ <command id="filters-delete-command" oncommand="FilterActions.deleteSelected();"/>
+ <command id="filters-resetHitCounts-command" oncommand="FilterActions.resetHitCounts();"/>
+ <command id="filters-moveUp-command" oncommand="FilterActions.moveUp();"/>
+ <command id="filters-moveDown-command" oncommand="FilterActions.moveDown();"/>
+ <command id="filters-copy-command" oncommand="FilterActions.copySelected(true);"/>
+ <command id="filters-cut-command" oncommand="FilterActions.copySelected(false);"/>
+ <command id="filters-paste-command" oncommand="FilterActions.paste();"/>
+ <command id="find-command" oncommand="E('findbar').startFind(E('findbar').FIND_NORMAL)"/>
+ <command id="find-again-command" oncommand="E('findbar').onFindAgainCommand(false)"/>
+ <command id="find-previous-command" oncommand="E('findbar').onFindAgainCommand(true)"/>
+</commandset>
+
+<popupset id="filtersPopupset">
+ <menupopup id="filters-view-menu1" onpopupshowing="FilterActions.fillColumnPopup(this);">
+ <menuitem id="filters-view-filter1" label="&filter.column;" type="checkbox" disabled="true"/>
+ <menuitem id="filters-view-slow1" label="&slow.column;" type="checkbox" oncommand="FilterActions.toggleColumn('col-slow')"/>
+ <menuitem id="filters-view-enabled1" label="&enabled.column;" type="checkbox" oncommand="FilterActions.toggleColumn('col-enabled')"/>
+ <menuitem id="filters-view-hitcount1" label="&hitcount.column;" type="checkbox" oncommand="FilterActions.toggleColumn('col-hitcount')"/>
+ <menuitem id="filters-view-lasthit1" label="&lasthit.column;" type="checkbox" oncommand="FilterActions.toggleColumn('col-lasthit')"/>
+ <menuseparator/>
+ <menu id="filters-sort-menu1" label="&sort.label;">
+ <menupopup id="filters-sort-popup1">
+ <menuitem id="filters-sort-none1" label="&sort.none.label;" type="radio" name="sortColumn" oncommand="FilterView.sortBy(null)"/>
+ <menuitem id="filters-sort-filter1" label="&filter.column;" type="radio" name="sortColumn" oncommand="FilterView.sortBy('col-filter')"/>
+ <menuitem id="filters-sort-slow1" label="&slow.column;" type="radio" name="sortColumn" oncommand="FilterView.sortBy('col-slow')"/>
+ <menuitem id="filters-sort-enabled1" label="&enabled.column;" type="radio" name="sortColumn" oncommand="FilterView.sortBy('col-enabled')"/>
+ <menuitem id="filters-sort-hitcount1" label="&hitcount.column;" type="radio" name="sortColumn" oncommand="FilterView.sortBy('col-hitcount')"/>
+ <menuitem id="filters-sort-lasthit1" label="&lasthit.column;" type="radio" name="sortColumn" oncommand="FilterView.sortBy('col-lasthit')"/>
+ <menuseparator/>
+ <menuitem id="filters-sort-asc1" label="&sort.ascending.label;" type="radio" name="sortOrder" oncommand="FilterActions.setSortOrder('ascending')"/>
+ <menuitem id="filters-sort-desc1" label="&sort.descending.label;" type="radio" name="sortOrder" oncommand="FilterActions.setSortOrder('descending')"/>
+ </menupopup>
+ </menu>
+ </menupopup>
+ <tooltip id="filtersTooltip" onpopupshowing="FilterActions.fillTooltip(event);">
+ <grid>
+ <columns>
+ <column/>
+ <column flex="1"/>
+ </columns>
+ <rows>
+ <row id="tooltip-filter-row" align="top">
+ <label class="tooltipLabel" value="&filter.column;"/>
+ <vbox id="tooltip-filter"/>
+ </row>
+ <row id="tooltip-hitcount-row">
+ <label class="tooltipLabel" value="&hitcount.column;"/>
+ <description id="tooltip-hitcount"/>
+ </row>
+ <row id="tooltip-lasthit-row">
+ <label class="tooltipLabel" value="&lasthit.column;"/>
+ <description id="tooltip-lasthit"/>
+ </row>
+ </rows>
+ </grid>
+
+ <description id="tooltip-additional"/>
+ </tooltip>
+</popupset>
+
+<hbox id="content" flex="1">
+ <tabbox id="tabs" flex="1" persist="selectedIndex">
+ <tabs onselect="onTabChange(this.parentNode);">
+ <tab label="&subscriptions.tab.label;"/>
+ <tab label="&filters.tab.label;"/>
+ </tabs>
+ <tabpanels flex="1">
+ <tabpanel id="subscriptionsTab" orient="vertical" flex="1">
+ <hbox pack="end">
+ <button id="selectSubscriptionButton" label="&addSubscription.label;…" command="subscription-add-command"/>
+ </hbox>
+
+ <panel id="selectSubscriptionPanel" type="arrow" position="bottomcenter topleft"
+ orient="vertical" onkeypress="SelectSubscription.keyPress(event);">
+ <menuitem id="selectSubscriptionTemplate" hidden="true"
+ class="{localePrefix ? 'localeMatch' : ''}"
+ label="{node.getAttribute('title')}"
+ value="{node.getAttribute('url')}">
+ <label class="selectSubscriptionItem" value="{node.getAttribute('title') + ' (' + node.getAttribute('specialization') + ')'}"/>
+ </menuitem>
+ <menulist id="selectSubscription">
+ <menupopup/>
+ </menulist>
+ <hbox align="baseline">
+ <label class="text-link" value="&addSubscriptionOther.label;" onclick="E('subscription-addOther-command').doCommand();"/>
+ <spacer flex="1"/>
+ <button id="selectSubscriptionAccept" default="true" label="&addSubscriptionAdd.label;" command="subscription-addSelected-command"/>
+ <spacer flex="1"/>
+ <button label="&addSubscriptionCancel.label;" oncommand="E('selectSubscriptionPanel').hidePopup();"/>
+ </hbox>
+ </panel>
+
+ <richlistitem id="subscriptionTemplate" class="subscription" hidden="true" orient="vertical"
+ onmousedown="this._wasSelected = (this.parentNode.selectedItem == this);"
+ ondragstart="SubscriptionActions.startDrag(event, this);"
+ ondragend="SubscriptionActions.endDrag();"
+ ondragover="SubscriptionActions.dragOver(event);"
+ ondrop="SubscriptionActions.drop(event, this);"
+ oncontextmenu="SubscriptionActions.openMenu(event, this);">
+ <vbox class="{subscription.disabled ? 'disabled' : ''}">
+ <hbox align="center">
+ <checkbox label="&subscription.enabled.label;" class="enabledCheckbox tabable" tabindex="-1"
+ checked="{subscription.disabled ? 'false' : 'true'}" oncommand="SubscriptionActions.setDisabled(this, !this.checked);"/>
+
+ <vbox flex="1">
+ <hbox align="center">
+ <deck class="titleBox" flex="1" selectedIndex="0" onselect="event.stopPropagation();">
+ <description ondblclick="if (event.button == 0) TitleEditor.start(this, true);">
+ <description class="title" value="{subscription.title}" flex="1" crop="end"/>
+ (<if condition="{isExternal}">
+ <description value="&subscription.external.label;"/>
+ <else/>
+ <if condition="{subscription.homepage}">
+ <description class="link" value="&subscription.homepage.label;"
+ _url="{subscription.homepage}" tooltiptext="{subscription.homepage}"
+ onclick="if (event.button == 0) { event.stopPropagation();UI.loadInBrowser(this.getAttribute('_url')); }"/>,&#160;
+ </if>
+ <description class="link" value="&subscription.source.label;"
+ _url="{subscription.url}" tooltiptext="{subscription.url}"
+ onclick="if (event.button == 0) { event.stopPropagation();UI.loadInBrowser(this.getAttribute('_url')); }"/>
+ </if>)
+ </description>
+ <textbox oncontextmenu="event.stopPropagation();" class="titleEditor" onkeypress="TitleEditor.keyPress(event);" onblur="TitleEditor.end(true);"/>
+ </deck>
+ </hbox>
+ <hbox align="center">
+ <description flex="1" class="status">
+ <description value="&subscription.lastDownload.label;"/>&#160;
+ <if condition="{downloading}">
+ <description value="&subscription.lastDownload.inProgress;"/>
+ <elif condition="{!subscription.lastDownload}"/>
+ <description value="&subscription.lastDownload.unknown;"/>
+ <else/>
+ <description value="{formatTime(subscription.lastDownload * 1000)}"/>
+ <if condition="{subscription.downloadStatus}">
+ <description>
+ &#160;(<if condition="{subscription.downloadStatus == 'synchronize_invalid_url'}">
+ <description value="&subscription.lastDownload.invalidURL;"/>
+ <elif condition="{subscription.downloadStatus == 'synchronize_connection_error'}"/>
+ <description value="&subscription.lastDownload.connectionError;"/>
+ <elif condition="{subscription.downloadStatus == 'synchronize_invalid_data'}"/>
+ <description value="&subscription.lastDownload.invalidData;"/>
+ <elif condition="{subscription.downloadStatus == 'synchronize_checksum_mismatch'}"/>
+ <description value="&subscription.lastDownload.checksumMismatch;"/>
+ <else/> <!-- synchronize_ok -->
+ <description value="&subscription.lastDownload.success;"/>
+ </if>)
+ </description>
+ </if>
+ </if>
+ </description>
+ </hbox>
+ </vbox>
+
+ <button class="actionButton tabable" type="menu" label="&subscription.actions.label;" tabindex="-1">
+ <menupopup class="actionMenu">
+ <menuitem label="&subscription.editTitle.label;" key="edit-key" command="subscription-editTitle-command"/>
+ <menuitem label="&subscription.update.label;" key="subscription-update-key" command="subscription-update-command"/>
+ <menuitem label="&subscription.showHideFilters.label;" key="subscription-showHideFilters-key" command="subscription-showHideFilters-command"/>
+ <menuitem label="&subscription.delete.label;…" key="delete-key" command="subscription-delete-command"/>
+ <menuseparator/>
+ <menuitem label="&subscription.moveUp.label;" key="moveUp-key" command="subscription-moveUp-command"/>
+ <menuitem label="&subscription.moveDown.label;" key="moveDown-key" command="subscription-moveDown-command"/>
+ </menupopup>
+ </button>
+ </hbox>
+
+ <description class="warning" hidden="{!subscription.upgradeRequired}">&subscription.minVersion.warning;</description>
+ <description class="warning" hidden="{!disabledFilters}">
+ &subscription.disabledFilters.warning;
+ <description class="link" value="&subscription.disabledFilters.enable;" onclick="SubscriptionActions.enableFilters(this);"/>
+ </description>
+ </vbox>
+ </richlistitem>
+
+ <deck id="noSubscriptionsDeck" flex="1">
+ <description flex="1">&noSubscriptions.text;</description>
+ <richlistbox id="subscriptions" class="initialFocus" flex="1"
+ onselect="onSelectionChange(this);"
+ ondragover="SubscriptionActions.dragOver(event);"
+ ondrop="SubscriptionActions.drop(event, null);"
+ onkeypress="SubscriptionActions.keyPress(event);">
+ </richlistbox>
+ </deck>
+
+ <!--description>
+ <checkbox id="acceptableAds" label="&acceptableAds2.label;" oncommand="ListManager.allowAcceptableAds(this.checked);"/>
+ <label class="text-link" value="&viewList.label;" onclick="UI.loadInBrowser(Prefs.subscriptions_exceptionsurl);"/>
+ <label class="text-link" value="&readMore.label;" onclick="UI.loadDocLink('acceptable_ads');"/>
+ </description-->
+ </tabpanel>
+ <tabpanel id="filtersTab" orient="vertical" flex="1">
+ <hbox pack="end">
+ <button id="addGroupButton" label="&addGroup.label;" command="group-add-command"/>
+ </hbox>
+
+ <richlistitem id="groupTemplate" class="subscription" hidden="true" orient="vertical"
+ onmousedown="this._wasSelected = (this.parentNode.selectedItem == this);"
+ ondragstart="SubscriptionActions.startDrag(event, this);"
+ ondragend="SubscriptionActions.endDrag();"
+ ondragover="SubscriptionActions.dragOver(event);"
+ ondrop="SubscriptionActions.drop(event, this);"
+ oncontextmenu="SubscriptionActions.openMenu(event, this);">
+ <hbox class="{subscription.disabled ? 'disabled' : ''}" align="center">
+ <checkbox label="&subscription.enabled.label;" class="enabledCheckbox tabable" tabindex="-1"
+ checked="{subscription.disabled ? 'false' : 'true'}" oncommand="SubscriptionActions.setDisabled(this, !this.checked);"/>
+ <hbox align="center" flex="1">
+ <deck class="titleBox" flex="1" selectedIndex="0" onselect="event.stopPropagation();">
+ <description class="title" value="{subscription.title}" crop="end" ondblclick="if (event.button == 0) TitleEditor.start(this, true);"/>
+ <textbox oncontextmenu="event.stopPropagation();" class="titleEditor" onkeypress="TitleEditor.keyPress(event);" onblur="TitleEditor.end(true);"/>
+ </deck>
+ </hbox>
+ <button class="actionButton tabable" type="menu" label="&subscription.actions.label;" tabindex="-1">
+ <menupopup class="actionMenu">
+ <menuitem label="&subscription.editTitle.label;" key="edit-key" command="subscription-editTitle-command"/>
+ <menuitem label="&subscription.showHideFilters.label;" key="subscription-showHideFilters-key" command="subscription-showHideFilters-command"/>
+ <menuitem label="&subscription.delete.label;…" key="delete-key" command="subscription-delete-command"/>
+ <menuseparator/>
+ <menuitem label="&subscription.moveUp.label;" key="moveUp-key" command="subscription-moveUp-command"/>
+ <menuitem label="&subscription.moveDown.label;" key="moveDown-key" command="subscription-moveDown-command"/>
+ </menupopup>
+ </button>
+ </hbox>
+ </richlistitem>
+
+ <deck id="noFiltersDeck" flex="1">
+ <description flex="1">&noFilters.text;</description>
+ <richlistbox id="groups" class="initialFocus" flex="1"
+ onselect="onSelectionChange(this);"
+ ondragover="SubscriptionActions.dragOver(event);"
+ ondrop="SubscriptionActions.drop(event, null);"
+ onkeypress="SubscriptionActions.keyPress(event);">
+ </richlistbox>
+ </deck>
+ </tabpanel>
+ </tabpanels>
+ </tabbox>
+
+ <splitter id="filtersSplitter" persist="state" orient="horizontal" collapse="after" state="collapsed" oncommand="FilterView.refresh();onSplitterStateChange(this);">
+ <grippy id="filtersGrippy"/>
+ </splitter>
+
+ <vbox id="filtersContainer" persist="width height" width="500">
+ <hbox pack="end">
+ <button id="findButton" label="&find.label;" command="find-command"/>
+ <button id="filterActionButton" type="menu" label="&filter.actions.label;">
+ <menupopup id="filterActionMenu" onpopupshowing="FilterActions.fillActionsPopup();">
+ <menuitem label="&filter.edit.label;" key="edit-key" command="filters-edit-command"/>
+ <menuitem label="&filter.cut.label;" key="filters-cut-key" command="filters-cut-command"/>
+ <menuitem label="&filter.copy.label;" key="filters-copy-key" command="filters-copy-command"/>
+ <menuitem label="&filter.paste.label;" key="filters-paste-key" command="filters-paste-command"/>
+ <menuitem label="&filter.delete.label;" key="delete-key" command="filters-delete-command"/>
+ <menuseparator/>
+ <menuitem label="&filter.selectAll.label;" key="filters-selectAll-key" command="filters-selectAll-command"/>
+ <menuitem label="&filter.resetHitCounts.label;" command="filters-resetHitCounts-command"/>
+ <menuseparator/>
+ <menuitem label="&filter.moveUp.label;" key="moveUp-key" command="filters-moveUp-command"/>
+ <menuitem label="&filter.moveDown.label;" key="moveDown-key" command="filters-moveDown-command"/>
+ <menuseparator/>
+ <menu id="viewMenu" label="&viewMenu.label;"/>
+ </menupopup>
+ </button>
+ <button id="addFilterButton" label="&addFilter.label;" command="filters-add-command"/>
+ </hbox>
+ <tree id="filtersTree"
+ flex="1"
+ editable="true"
+ seltype="multiple"
+ enableColumnDrag="true"
+ hidecolumnpicker="true"
+ _removewarning="&filters.remove.warning;">
+ <treecols context="filters-view-menu1">
+ <treecol id="col-enabled" label="&enabled.column;" cycler="true" flex="0" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="col-filter" label="&filter.column;" flex="10" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="col-slow" label="!" display="&slow.column;" tooltiptext="&slow.column;" flex="0" width="16" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="col-hitcount" label="&hitcount.column;" flex="0" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="col-lasthit" label="&lasthit.column;" hidden="true" flex="4" persist="width ordinal sortDirection hidden"/>
+ </treecols>
+
+ <treechildren id="filtersTreeChildren"
+ oncontextmenu="E('filterActionMenu').openPopupAtScreen(event.screenX, event.screenY, true);"
+ tooltip="filtersTooltip"
+ noGroupText="&noGroupSelected.text;"
+ noFiltersText="&noFiltersInGroup.text;"
+ ondragstart="FilterActions.startDrag(event);"
+ ondragend="FilterActions.endDrag(event);"/>
+ </tree>
+ </vbox>
+</hbox>
+
+<findbar id="findbar"/>
+
+<hbox id="buttons">
+ <button id="backupButton" type="menu"
+ label="&backupButton.label;"
+ _backupDialogTitle="&backup.label;" _restoreDialogTitle="&restore.own.label;"
+ _fileFilterComplete="&backup.complete.title;" _fileFilterCustom="&backup.custom.title;"
+ _backupError="&backup.error;" _restoreError="&restore.error;"
+ _restoreCompleteWarning="&restore.complete.warning;" _restoreCustomWarning="&restore.custom.warning;"
+ _restoreVersionWarning="&restore.minVersion.warning;"
+ oncommand="if (event.target == this) Utils.runAsync(function() this.open = true, this);">
+ <menupopup onpopupshowing="Backup.fillRestorePopup();">
+ <menuitem id="backup" key="backup-key" label="&backup.label;…" oncommand="Backup.backupToFile();"/>
+ <menuseparator/>
+ <menuitem id="restoreBackupTemplate" label="&restore.default.label;" hidden="true"/>
+ <menuitem id="restoreOwnBackup" key="restore-key" label="&restore.own.label;…" oncommand="Backup.restoreFromFile();"/>
+ </menupopup>
+ </button>
+
+ <spacer flex="1"/>
+
+ <button id="close" dlgtype="accept" label="&close.label;"/>
+</hbox>
+
+</dialog>
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/firstRun.html b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/firstRun.html
new file mode 100644
index 0000000..36f5cf7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/firstRun.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html>
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<html>
+ <head>
+ <title class="i18n_firstRun_title"></title>
+ <meta charset="utf-8">
+ <link type="text/css" href="/skin/firstRun.css" rel="stylesheet"/>
+ <script type="text/javascript" src="utils.js"></script>
+ <script type="text/javascript" src="i18n.js"></script>
+ <script type="text/javascript" src="firstRun.js"></script>
+ </head>
+ <body>
+
+
+ <header>
+ <div id="logo"></div>
+ <h1 id="title-main" class="i18n_firstRun_title"></h1>
+ </header>
+
+ <section id="legacySafariWarning" class="i18n_firstRun_legacySafariWarning warning" hidden="true"></section>
+ <section id="filterlistsReinitializedWarning" class="i18n_firstRun_filterlistsReinitializedWarning warning" hidden="true"></section>
+ <section id="dataCorruptionWarning" class="i18n_firstRun_dataCorruptionWarning warning" hidden="true"></section>
+
+ <section id="acceptable-ads">
+ <h2 class="i18n_firstRun_acceptableAdsHeadline"></h2>
+ <p id="acceptableAdsExplanation" class="i18n_firstRun_acceptableAdsExplanation"></p>
+ </section>
+
+
+ <section id="share">
+ <h2 id="share-headline" class="i18n_firstRun_share_headline"></h2>
+
+ <div id="donate-block">
+ <a id="donate" class="i18n_firstRun_donate" target="_blank"></a>
+ <span id="donate-label" class="i18n_firstRun_donate_label"></span>
+ </div>
+
+ <div id="share-block">
+ <div id="share-general" class="share-buttons">
+ <a id="share-facebook" href="https://www.facebook.com/adblockplus" target="_blank" data-script="https://facebook.com/plugins/like.php?">
+ </a>
+ <a id="share-twitter" href="https://twitter.com/adblockplus" target="_blank" data-script="https://platform.twitter.com/widgets.js">
+ </a>
+ <a id="share-gplus" href="https://www.google.com/+AdblockPlus" target="_blank" data-script="https://apis.google.com/js/plusone.js">
+ </a>
+ </div>
+
+ <!-- Chinese social networks -->
+ <div id="share-chinese" class="share-buttons">
+ <a id="share-renren" href="http://www.renren.com/601651969" target="_blank">
+ </a>
+ <a id="share-weibo" href="http://e.weibo.com/adblockplus/" target="_blank">
+ </a>
+ </div>
+ <span class="i18n_firstRun_share"></span>
+ </div>
+ </section>
+
+
+ <section id="can-do-more">
+ <h2 class="i18n_firstRun_features"></h2>
+
+ <div id="can-do-more-content">
+ <ul id="features">
+ <li id="feature-malware" class="feature">
+ <div class="feature-image feature-malware-image"></div>
+ <div class="feature-description">
+ <div class="feature-description-textblock">
+ <h3 class="i18n_firstRun_feature_malware feature-title"></h3>
+ <span class="i18n_firstRun_feature_malware_description"></span>
+ </div>
+ <div id="toggle-malware" class="toggle">
+ <div class="i18n_firstRun_toggle_on toggle-on"></div>
+ <div class="toggle-blob"></div>
+ <div class="i18n_firstRun_toggle_off toggle-off"></div>
+ </div>
+ </div>
+
+ </li>
+ <li id="feature-social" class="feature">
+ <div class="feature-image feature-social-image"></div>
+ <div class="feature-description">
+ <div class="feature-description-textblock">
+ <h3 class="i18n_firstRun_feature_social feature-title"></h3>
+ <span class="i18n_firstRun_feature_social_description"></span>
+ </div>
+ <div id="toggle-social" class="toggle">
+ <div class="i18n_firstRun_toggle_on toggle-on"></div>
+ <div class="toggle-blob"></div>
+ <div class="i18n_firstRun_toggle_off toggle-off"></div>
+ </div>
+ </div>
+ </li>
+
+ <li id="feature-tracking" class="feature">
+ <div class="feature-image feature-tracking-image"></div>
+ <div class="feature-description">
+ <div class="feature-description-textblock">
+ <h3 class="i18n_firstRun_feature_tracking feature-title"></h3>
+ <span class="i18n_firstRun_feature_tracking_description"></span>
+ </div>
+ <div id="toggle-tracking" class="toggle">
+ <div class="i18n_firstRun_toggle_on toggle-on"></div>
+ <div class="toggle-blob"></div>
+ <div class="i18n_firstRun_toggle_off toggle-off"></div>
+ </div>
+ </div>
+ </li>
+
+ </ul>
+
+ </div>
+ </section>
+
+
+ <footer>
+ <a id="contributors" class="i18n_firstRun_contributor_credits"></a>
+ </footer>
+
+
+ <div id="glass-pane">
+ <iframe id="share-popup" scrolling="no"></iframe>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/firstRun.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/firstRun.js
new file mode 100644
index 0000000..be2caa6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/firstRun.js
@@ -0,0 +1,253 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+"use strict";
+
+(function()
+{
+ // Load subscriptions for features
+ var featureSubscriptions = [
+ {
+ feature: "malware",
+ homepage: "http://malwaredomains.com/",
+ title: "Malware Domains",
+ url: "https://easylist-downloads.adblockplus.org/malwaredomains_full.txt"
+ },
+ {
+ feature: "social",
+ homepage: "https://www.fanboy.co.nz/",
+ title: "Fanboy's Social Blocking List",
+ url: "https://easylist-downloads.adblockplus.org/fanboy-social.txt"
+ },
+ {
+ feature: "tracking",
+ homepage: "https://easylist.adblockplus.org/",
+ title: "EasyPrivacy",
+ url: "https://easylist-downloads.adblockplus.org/easyprivacy.txt"
+ }
+ ];
+
+ function onDOMLoaded()
+ {
+ var locale = require("utils").Utils.appLocale;
+ document.documentElement.setAttribute("lang", locale);
+
+ // Set up URLs
+ var donateLink = E("donate");
+ donateLink.href = Utils.getDocLink("donate");
+
+ var contributors = E("contributors");
+ contributors.href = Utils.getDocLink("contributors");
+
+ setLinks("acceptableAdsExplanation", Utils.getDocLink("acceptable_ads_criteria"), openFilters);
+ setLinks("share-headline", Utils.getDocLink("contribute"));
+
+ if (typeof backgroundPage != "undefined")
+ {
+ // Show warning if data corruption was detected
+ if (backgroundPage.seenDataCorruption)
+ {
+ E("dataCorruptionWarning").removeAttribute("hidden");
+ setLinks("dataCorruptionWarning", Utils.getDocLink("knownIssuesChrome_filterstorage"));
+ }
+
+ // Show warning if filterlists settings were reinitialized
+ if (backgroundPage.filterlistsReinitialized)
+ {
+ E("filterlistsReinitializedWarning").removeAttribute("hidden");
+ setLinks("filterlistsReinitializedWarning", openFilters);
+ }
+ }
+
+ // Show warning if Safari version isn't supported
+ var info = require("info");
+ if (info.platform == "safari" && (
+ Services.vc.compare(info.platformVersion, "6.0") < 0 || // beforeload breaks websites in Safari 5
+ Services.vc.compare(info.platformVersion, "6.1") == 0 || // extensions are broken in 6.1 and 7.0
+ Services.vc.compare(info.platformVersion, "7.0") == 0
+ ))
+ E("legacySafariWarning").removeAttribute("hidden");
+
+ // Set up feature buttons linked to subscriptions
+ featureSubscriptions.forEach(setToggleSubscriptionButton);
+ var filterListener = function(action)
+ {
+ if (/^subscription\.(added|removed|disabled)$/.test(action))
+ {
+ for (var i = 0; i < featureSubscriptions.length; i++)
+ {
+ var featureSubscription = featureSubscriptions[i];
+ updateToggleButton(featureSubscription.feature, isSubscriptionEnabled(featureSubscription));
+ }
+ }
+ }
+ FilterNotifier.addListener(filterListener);
+ window.addEventListener("unload", function(event)
+ {
+ FilterNotifier.removeListener(filterListener);
+ }, false);
+
+ initSocialLinks();
+ }
+
+ function isSubscriptionEnabled(featureSubscription)
+ {
+ return featureSubscription.url in FilterStorage.knownSubscriptions
+ && !Subscription.fromURL(featureSubscription.url).disabled;
+ }
+
+ function setToggleSubscriptionButton(featureSubscription)
+ {
+ var feature = featureSubscription.feature;
+
+ var element = E("toggle-" + feature);
+ updateToggleButton(feature, isSubscriptionEnabled(featureSubscription));
+ element.addEventListener("click", function(event)
+ {
+ var subscription = Subscription.fromURL(featureSubscription.url);
+ if (isSubscriptionEnabled(featureSubscription))
+ FilterStorage.removeSubscription(subscription);
+ else
+ {
+ subscription.disabled = false;
+ subscription.title = featureSubscription.title;
+ subscription.homepage = featureSubscription.homepage;
+ FilterStorage.addSubscription(subscription);
+ if (!subscription.lastDownload)
+ Synchronizer.execute(subscription);
+ }
+ }, false);
+ }
+
+ function openSharePopup(url)
+ {
+ var iframe = E("share-popup");
+ var glassPane = E("glass-pane");
+ var popupMessageReceived = false;
+
+ var popupMessageListener = function(event)
+ {
+ var originFilter = Filter.fromText("||adblockplus.org^");
+ if (!originFilter.matches(event.origin, "OTHER", null, null))
+ return;
+
+ var width = event.data.width;
+ var height = event.data.height;
+ iframe.width = width;
+ iframe.height = height;
+ iframe.style.marginTop = -height/2 + "px";
+ iframe.style.marginLeft = -width/2 + "px";
+ popupMessageReceived = true;
+ window.removeEventListener("message", popupMessageListener);
+ };
+ // Firefox requires last parameter to be true to be triggered by unprivileged pages
+ window.addEventListener("message", popupMessageListener, false, true);
+
+ var popupLoadListener = function()
+ {
+ if (popupMessageReceived)
+ {
+ iframe.className = "visible";
+
+ var popupCloseListener = function()
+ {
+ iframe.className = glassPane.className = "";
+ document.removeEventListener("click", popupCloseListener);
+ };
+ document.addEventListener("click", popupCloseListener, false);
+ }
+ else
+ {
+ glassPane.className = "";
+ window.removeEventListener("message", popupMessageListener);
+ }
+
+ iframe.removeEventListener("load", popupLoadListener);
+ };
+ iframe.addEventListener("load", popupLoadListener, false);
+
+ iframe.src = url;
+ glassPane.className = "visible";
+ }
+
+ function initSocialLinks()
+ {
+ var networks = ["twitter", "facebook", "gplus"];
+ networks.forEach(function(network)
+ {
+ var link = E("share-" + network);
+ link.addEventListener("click", onSocialLinkClick, false);
+ });
+ }
+
+ function onSocialLinkClick(event)
+ {
+ // Don't open the share page if the sharing script would be blocked
+ var filter = defaultMatcher.matchesAny(event.target.getAttribute("data-script"), "SCRIPT", "adblockplus.org", true);
+ if (!(filter instanceof BlockingFilter))
+ {
+ event.preventDefault();
+ openSharePopup(Utils.getDocLink(event.target.id));
+ }
+ }
+
+ function setLinks(id)
+ {
+ var element = E(id);
+ if (!element)
+ {
+ return;
+ }
+
+ var links = element.getElementsByTagName("a");
+
+ for (var i = 0; i < links.length; i++)
+ {
+ if (typeof arguments[i + 1] == "string")
+ {
+ links[i].href = arguments[i + 1];
+ links[i].setAttribute("target", "_blank");
+ }
+ else if (typeof arguments[i + 1] == "function")
+ {
+ links[i].href = "javascript:void(0);";
+ links[i].addEventListener("click", arguments[i + 1], false);
+ }
+ }
+ }
+
+ function openFilters()
+ {
+ if (typeof UI != "undefined")
+ UI.openFiltersDialog();
+ else
+ {
+ backgroundPage.openOptions();
+ }
+ }
+
+ function updateToggleButton(feature, isEnabled)
+ {
+ var button = E("toggle-" + feature);
+ if (isEnabled)
+ button.classList.remove("off");
+ else
+ button.classList.add("off");
+ }
+
+ document.addEventListener("DOMContentLoaded", onDOMLoaded, false);
+})();
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/flasher.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/flasher.js
new file mode 100644
index 0000000..ddb4131
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/flasher.js
@@ -0,0 +1,108 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * Draws a blinking border for a list of matching nodes.
+ */
+
+var flasher = {
+ nodes: null,
+ count: 0,
+ timer: null,
+
+ flash: function(nodes)
+ {
+ this.stop();
+ if (nodes)
+ nodes = nodes.filter(function(node) node.nodeType == Node.ELEMENT_NODE);
+ if (!nodes || !nodes.length)
+ return;
+
+ if (Prefs.flash_scrolltoitem && nodes[0].ownerDocument)
+ {
+ // Ensure that at least one node is visible when flashing
+ let wnd = nodes[0].ownerDocument.defaultView;
+ try
+ {
+ let topWnd = Utils.getChromeWindow(wnd);
+ let {getBrowser} = require("appSupport");
+ let browser = (getBrowser ? getBrowser(topWnd) : null);
+ if (browser)
+ browser.markupDocumentViewer.scrollToNode(nodes[0]);
+ }
+ catch(e)
+ {
+ Cu.reportError(e);
+ }
+ }
+
+ this.nodes = nodes;
+ this.count = 0;
+
+ this.doFlash();
+ },
+
+ doFlash: function() {
+ if (this.count >= 12) {
+ this.stop();
+ return;
+ }
+
+ if (this.count % 2)
+ this.switchOff();
+ else
+ this.switchOn();
+
+ this.count++;
+
+ this.timer = window.setTimeout(function() {flasher.doFlash()}, 300);
+ },
+
+ stop: function() {
+ if (this.timer) {
+ window.clearTimeout(this.timer);
+ this.timer = null;
+ }
+
+ if (this.nodes) {
+ this.switchOff();
+ this.nodes = null;
+ }
+ },
+
+ setOutline: function(outline, offset)
+ {
+ for (var i = 0; i < this.nodes.length; i++)
+ {
+ if ("style" in this.nodes[i])
+ {
+ this.nodes[i].style.outline = outline;
+ this.nodes[i].style.outlineOffset = offset;
+ }
+ }
+ },
+
+ switchOn: function()
+ {
+ this.setOutline("#CC0000 dotted 2px", "-2px");
+ },
+
+ switchOff: function()
+ {
+ this.setOutline("", "");
+ }
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/i18n.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/i18n.js
new file mode 100644
index 0000000..8366268
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/i18n.js
@@ -0,0 +1,150 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+var i18n;
+
+if (typeof ext != "undefined")
+ i18n = ext.i18n;
+else if (typeof chrome != "undefined")
+ // TODO: This check only exist for backwards compatibility, while the Safari
+ // port isn't merged into the adblockpluschrome repo. So this branch should
+ // be removed when the Safari port was merged.
+ i18n = chrome.i18n;
+else
+{
+ // Using Firefox' approach on i18n instead
+
+ // Randomize URI to work around bug 719376
+ var pageName = location.pathname.replace(/.*\//, '').replace(/\..*?$/, '');
+ var stringBundle = Services.strings.createBundle("chrome://adblockplus/locale/" + pageName +
+ ".properties?" + Math.random());
+
+ function getI18nMessage(key)
+ {
+ return {
+ "message": stringBundle.GetStringFromName(key)
+ };
+ }
+
+ i18n = (function()
+ {
+ function getText(message, args)
+ {
+ var text = message.message;
+ var placeholders = message.placeholders;
+
+ if (!args || !placeholders)
+ return text;
+
+ for (var key in placeholders)
+ {
+ var content = placeholders[key].content;
+ if (!content)
+ continue;
+
+ var index = parseInt(content.slice(1), 10);
+ if (isNaN(index))
+ continue;
+
+ var replacement = args[index - 1];
+ if (typeof replacement === "undefined")
+ continue;
+
+ text = text.split("$" + key + "$").join(replacement);
+ }
+ return text;
+ }
+
+ return {
+ getMessage: function(key, args)
+ {
+ try{
+ var message = getI18nMessage(key);
+ return getText(message, args);
+ }
+ catch(e)
+ {
+ Cu.reportError(e);
+ return "Missing translation: " + key;
+ }
+ }
+ };
+ })();
+}
+
+// Inserts i18n strings into matching elements. Any inner HTML already in the element is
+// parsed as JSON and used as parameters to substitute into placeholders in the i18n
+// message.
+i18n.setElementText = function(element, stringName, arguments)
+{
+ function processString(str, element)
+ {
+ var match = /^(.*?)<(a|strong)>(.*?)<\/\2>(.*)$/.exec(str);
+ if (match)
+ {
+ processString(match[1], element);
+
+ var e = document.createElement(match[2]);
+ processString(match[3], e);
+ element.appendChild(e);
+
+ processString(match[4], element);
+ }
+ else
+ element.appendChild(document.createTextNode(str));
+ }
+
+ while (element.lastChild)
+ element.removeChild(element.lastChild);
+ processString(i18n.getMessage(stringName, arguments), element);
+}
+
+// Loads i18n strings
+function loadI18nStrings()
+{
+ var nodes = document.querySelectorAll("[class^='i18n_']");
+ for(var i = 0; i < nodes.length; i++)
+ {
+ var node = nodes[i];
+ var arguments = JSON.parse("[" + node.textContent + "]");
+ if (arguments.length == 0)
+ arguments = null;
+
+ var className = node.className;
+ if (className instanceof SVGAnimatedString)
+ className = className.animVal;
+ var stringName = className.split(/\s/)[0].substring(5);
+
+ i18n.setElementText(node, stringName, arguments);
+ }
+}
+
+// Provides a more readable string of the current date and time
+function i18n_timeDateStrings(when)
+{
+ var d = new Date(when);
+ var timeString = d.toLocaleTimeString();
+
+ var now = new Date();
+ if (d.toDateString() == now.toDateString())
+ return [timeString];
+ else
+ return [timeString, d.toLocaleDateString()];
+}
+
+// Fill in the strings as soon as possible
+window.addEventListener("DOMContentLoaded", loadI18nStrings, true);
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/overlay.xul b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/overlay.xul
new file mode 100644
index 0000000..9724859
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/overlay.xul
@@ -0,0 +1,134 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<!DOCTYPE overlay [
+ <!ENTITY % overlayDTD SYSTEM "chrome://adblockplus/locale/overlay.dtd">
+ %overlayDTD;
+ <!ENTITY % subscriptionsDTD SYSTEM "chrome://adblockplus/locale/subscriptionSelection.dtd">
+ %subscriptionsDTD;
+]>
+
+<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ imagecontextlabel="&context.image.label;…" objectcontextlabel="&context.object.label;…"
+ mediacontextlabel="&context.media.label;…" subdocumentcontextlabel="&context.frame.label;…"
+ whitelistcontextlabel="&context.removeWhitelist.label;"
+ objtabtext="&objecttab.title;…" objtabtooltip="&objecttab.tooltip;"
+ subscriptionDialogTitle="&dialog.title;"
+ subscriptionDialogMessage="&title.label; ?1?&#10;&#10;&location.label; ?2?">
+ <popupset id="abp-popupset">
+ <!-- Icon's tooltip -->
+ <tooltip id="abp-tooltip" orient="vertical">
+ <description id="abp-tooltip-action" hidden="true"/>
+ <label id="abp-tooltip-status-label" value="&status.tooltip;"/>
+ <description id="abp-tooltip-status"/>
+ <label id="abp-tooltip-blocked-label" value="&blocked.tooltip;" hidden="true"/>
+ <description id="abp-tooltip-blocked" hidden="true"/>
+ <label id="abp-tooltip-filters-label" value="&filters.tooltip;" hidden="true"/>
+ <vbox id="abp-tooltip-filters" hidden="true"/>
+ <description id="abp-tooltip-more-filters" value="…" hidden="true"/>
+ </tooltip>
+ </popupset>
+
+ <!-- Icon's context menu -->
+ <menupopup id="abp-status-popup" context="">
+ <menuitem id="abp-status-sendReport" label="&sendReport.label;…" key="abp-key-sendReport" command="abp-command-sendReport"/>
+ <menuitem id="abp-status-openbottombar" label="&opensidebar.label;" key="abp-key-sidebar" command="abp-command-sidebar"/>
+ <menuitem id="abp-status-closebottombar" label="&closesidebar.label;" key="abp-key-sidebar" command="abp-command-sidebar"/>
+ <menuitem id="abp-status-filters" label="&filters.label;…" key="abp-key-filters" command="abp-command-filters"/>
+ <menuseparator id="abp-status-whitelist-sep"/>
+ <menuitem id="abp-status-whitelistsite" labeltempl="&whitelist.site.label;" type="checkbox" command="abp-command-togglesitewhitelist"/>
+ <menuitem id="abp-status-whitelistpage" label="&whitelist.page.label;" type="checkbox" command="abp-command-togglepagewhitelist"/>
+ <menuitem id="abp-status-disabled" label="&disable.label;" type="checkbox" key="abp-key-enable" command="abp-command-enable"/>
+ <menuseparator/>
+ <menu id="abp-status-options" label="&options.label;">
+ <menupopup id="abp-status-options-popup">
+ <menuitem id="abp-status-frameobjects" label="&objecttabs.label;" type="checkbox" command="abp-command-toggleobjtabs"/>
+ <menuitem id="abp-status-slowcollapse" label="&hideplaceholders.label;" type="checkbox" command="abp-command-togglecollapse"/>
+ <menuitem id="abp-status-savestats" label="&counthits.label;" type="checkbox" command="abp-command-togglesavestats"/>
+ <menuitem id="abp-status-sync" label="&sync.label;" type="checkbox" command="abp-command-togglesync"/>
+ <menuseparator id="abp-status-iconSettingsSeparator"/>
+ <menuitem id="abp-status-showintoolbar" label="&showintoolbar.label;" type="checkbox" command="abp-command-toggleshowintoolbar"/>
+ <menuitem id="abp-status-showinstatusbar" label="&showinstatusbar.label;" type="checkbox" command="abp-command-toggleshowinstatusbar"/>
+ </menupopup>
+ </menu>
+
+ <hbox class="abp-contributebutton" id="abp-status-contributebutton" pack="center" align="center">
+ <!-- noautoclose attribute tells Australis menu that it shouldn't close when
+ these are clicked, see https://bugzilla.mozilla.org/show_bug.cgi?id=940693 -->
+ <button class="abp-contributebutton-btn" label="&contribute.label;" command="abp-command-contribute" flex="1" noautoclose="true"/>
+ <toolbarbutton class="abp-contributebutton-close" command="abp-command-contribute-hide" noautoclose="true"/>
+ </hbox>
+ </menupopup>
+
+ <keyset id="abp-keyset"/>
+
+ <!-- Dummy oncommand attributes are work-arounds for bug 371900 -->
+ <commandset id="abp-commandset">
+ <command id="abp-command-sendReport" oncommand="//"/>
+ <command id="abp-command-filters" oncommand="//"/>
+ <command id="abp-command-settings" oncommand="//"/>
+ <command id="abp-command-sidebar" oncommand="//"/>
+ <command id="abp-command-togglesitewhitelist"/>
+ <command id="abp-command-togglepagewhitelist"/>
+ <command id="abp-command-toggleobjtabs"/>
+ <command id="abp-command-togglecollapse"/>
+ <command id="abp-command-togglesavestats"/>
+ <command id="abp-command-togglesync"/>
+ <command id="abp-command-toggleshowintoolbar"/>
+ <command id="abp-command-toggleshowinstatusbar"/>
+ <command id="abp-command-enable" oncommand="//"/>
+ <command id="abp-command-contribute"/>
+ <command id="abp-command-contribute-hide"/>
+ </commandset>
+
+ <statusbarpanel id="abp-status" class="statusbarpanel-iconic"
+ tooltip="abp-tooltip"/>
+
+ <toolbarbutton id="abp-toolbarbutton" class="toolbarbutton-1" label="&toolbarbutton.label;"
+ tooltip="abp-tooltip"/>
+
+ <!-- Tools menu -->
+ <menu id="abp-menuitem" label="&toolbarbutton.label;"/>
+
+ <!-- Bottom bar -->
+ <hbox id="abp-bottombar-container">
+ <splitter id="abp-bottombar-splitter"/>
+ <vbox id="abp-bottombar">
+ <toolbox id="abp-bottombar-header">
+ <toolbar id="abp-bottombar-toolbar" align="center" grippyhidden="true" fullscreentoolbar="true">
+ <label id="abp-bottombar-title" control="abp-bottombar-browser" value="&sidebar.title;" flex="1" crop="end"/>
+ <toolbarbutton id="abp-bottombar-close" command="abp-command-sidebar" tooltiptext="&closesidebar.label;"/>
+ </toolbar>
+ </toolbox>
+ <iframe id="abp-bottombar-browser" src="chrome://adblockplus/content/ui/sidebar.xul" flex="1"/>
+ </vbox>
+ </hbox>
+
+ <!-- Notification panel -->
+ <panel id="abp-notification" type="arrow" orient="vertical"
+ xmlns:html="http://www.w3.org/1999/xhtml">
+ <label id="abp-notification-title" class="header"/>
+ <html:p id="abp-notification-message"/>
+ <hbox id="abp-notification-question">
+ <button id="abp-notification-yes" label="&notification.button.yes;"/>
+ <button id="abp-notification-no" label="&notification.button.no;"/>
+ <toolbarbutton id="abp-notification-close" label="&notification.button.close;"></toolbarbutton>
+ </hbox>
+ </panel>
+</overlay>
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/progressBar.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/progressBar.js
new file mode 100644
index 0000000..659acdd
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/progressBar.js
@@ -0,0 +1,158 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+(function()
+{
+ let progressBar, canvas, headers, isRTL;
+
+ function onLoad()
+ {
+ window.removeEventListener("load", onLoad, false);
+
+ // Init global variables
+ progressBar = document.getElementById("progressBar");
+ canvas = document.getElementById("progressBarCanvas");
+
+ headers = Array.prototype.slice.call(progressBar.getElementsByTagName("label"));
+ for (let i = 0; i < headers.length; i++)
+ canvas.parentNode.appendChild(headers[i]);
+
+ // Expose properties
+ progressBar.__defineGetter__("activeItem", getActiveItem);
+ progressBar.__defineSetter__("activeItem", setActiveItem);
+ progressBar.__defineGetter__("activeItemComplete", getActiveItemComplete);
+ progressBar.__defineSetter__("activeItemComplete", setActiveItemComplete);
+
+ isRTL = (window.getComputedStyle(document.documentElement).direction == "rtl");
+
+ // Run actual drawing delayed, once the sizes are fixed
+ window.setTimeout(init, 0);
+ };
+ window.addEventListener("load", onLoad, false);
+
+ function init()
+ {
+ const gapWidth = 5;
+ const arrowheadWidth = 5;
+
+ let width = canvas.width = canvas.offsetWidth;
+ let height = canvas.height = canvas.offsetHeight;
+
+ let context = canvas.getContext("2d");
+ context.fillStyle = window.getComputedStyle(progressBar, "").color;
+ context.strokeStyle = window.getComputedStyle(progressBar, "").color;
+ context.lineWidth = 1;
+ if (isRTL)
+ {
+ context.translate(width, 0);
+ context.scale(-1, 1);
+ }
+
+ let panelCount = headers.length;
+ let panelWidth = (width - gapWidth * (panelCount - 1) - 1) / panelCount;
+ for (let i = 0; i < panelCount; i++)
+ {
+ context.save();
+ context.translate(Math.round(i * (panelWidth + gapWidth)) + 0.5, 0.5);
+ context.beginPath();
+ if (i)
+ context.moveTo(-arrowheadWidth, 0);
+ else
+ context.moveTo(0, 0);
+ context.lineTo(panelWidth - arrowheadWidth, 0);
+ context.lineTo(panelWidth, (height - 1) / 2);
+ context.lineTo(panelWidth - arrowheadWidth, height - 1);
+ if (i)
+ {
+ context.lineTo(-arrowheadWidth, height - 1);
+ context.lineTo(0, (height - 1) / 2);
+ context.lineTo(-arrowheadWidth, 0);
+ }
+ else
+ {
+ context.lineTo(0, height - 1);
+ context.lineTo(0, 0);
+ }
+
+ context.stroke();
+ context.restore();
+
+ let childLeft = Math.round(i * (panelWidth + gapWidth) + 1);
+ let childWidth = panelWidth - arrowheadWidth - 2;
+ let child = headers[i];
+ child.style.MozMarginStart = childLeft + "px";
+ child.style.MozMarginEnd = (width - childLeft - childWidth) + "px";
+ child.style.width = childWidth + "px";
+ }
+
+ // Resize after initialization should be ignored
+ canvas.parentNode.removeAttribute("flex");
+ }
+
+ function getActiveItem()
+ {
+ for (let i = 0; i < headers.length; i++)
+ {
+ let header = headers[i];
+ if (header.classList.contains("active"))
+ return header;
+ }
+ return null;
+ }
+
+ function setActiveItem(val)
+ {
+ let complete = true;
+ for (let i = 0; i < headers.length; i++)
+ {
+ let header = headers[i];
+ if (header == val)
+ complete = false;
+
+ if (!complete && header.value[0] == "✔")
+ header.value = header.value.replace(/^✔\s*/, "");
+ else if (complete && header.value[0] != "✔")
+ header.value = "✔ " + header.value;
+
+ if (header == val)
+ header.classList.add("active");
+ else
+ header.classList.remove("active");
+ }
+ }
+
+ function getActiveItemComplete()
+ {
+ let activeItem = this.activeItem;
+ if (!activeItem)
+ return false;
+ else
+ return activeItem.value[0] == "✔";
+ }
+
+ function setActiveItemComplete(val)
+ {
+ let activeItem = this.activeItem;
+ if (!activeItem)
+ return;
+
+ if (!val && activeItem.value[0] == "✔")
+ activeItem.value = activeItem.value.replace(/^✔\s*/, "");
+ else if (val && activeItem.value[0] != "✔")
+ activeItem.value = "✔ " + activeItem.value;
+ }
+})();
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/progressBar.xul b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/progressBar.xul
new file mode 100644
index 0000000..d940e61
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/progressBar.xul
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<overlay id="progressBarOverlay"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+ <script type="application/x-javascript;version=1.7" src="progressBar.js"/>
+
+ <hbox id="progressBar" pack="center">
+ <stack flex="1">
+ <canvas xmlns="http://www.w3.org/1999/xhtml" id="progressBarCanvas" width="1" height="1"/>
+ </stack>
+ </hbox>
+</overlay>
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sendReport.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sendReport.js
new file mode 100644
index 0000000..3ccc0e6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sendReport.js
@@ -0,0 +1,1571 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+//
+// Report data template, more data will be added during data collection
+//
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/FileUtils.jsm");
+
+const MILLISECONDS_IN_SECOND = 1000;
+const SECONDS_IN_MINUTE = 60;
+const SECONDS_IN_HOUR = 60 * SECONDS_IN_MINUTE;
+const SECONDS_IN_DAY = 24 * SECONDS_IN_HOUR;
+
+let contentWindow = window.arguments[0];
+let windowURI = (window.arguments[1] instanceof Ci.nsIURI ? window.arguments[1] : null);
+
+let reportData = new DOMParser().parseFromString("<report></report>", "text/xml");
+
+// Some helper functions to work with the report data
+function reportElement(tag)
+{
+ for (let child = reportData.documentElement.firstChild; child; child = child.nextSibling)
+ if (child.nodeType == Node.ELEMENT_NODE && child.tagName == tag)
+ return child;
+ let element = reportData.createElement(tag);
+ reportData.documentElement.appendChild(element);
+ return element;
+}
+function removeReportElement(tag)
+{
+ for (let child = reportData.documentElement.firstChild; child; child = child.nextSibling)
+ if (child.nodeType == Node.ELEMENT_NODE && child.tagName == tag)
+ child.parentNode.removeChild(child);
+}
+function appendElement(parent, tag, attributes, body)
+{
+ let element = parent.ownerDocument.createElement(tag);
+ if (typeof attributes == "object" && attributes !== null)
+ for (let attribute in attributes)
+ if (attributes.hasOwnProperty(attribute))
+ element.setAttribute(attribute, attributes[attribute]);
+ if (typeof body != "undefined" && body !== null)
+ element.textContent = body;
+ parent.appendChild(element);
+ return element;
+}
+function serializeReportData()
+{
+ let result = new XMLSerializer().serializeToString(reportData);
+
+ // Insert line breaks before each new tag
+ result = result.replace(/(<[^\/]([^"<>]*|"[^"]*")*>)/g, "\n$1");
+ result = result.replace(/^\n+/, "");
+ return result;
+}
+
+let (element = reportElement("adblock-plus"))
+{
+ let {addonVersion} = require("info");
+ element.setAttribute("version", addonVersion);
+ element.setAttribute("locale", Utils.appLocale);
+};
+let (element = reportElement("application"))
+{
+ element.setAttribute("name", Services.appinfo.name);
+ element.setAttribute("vendor", Services.appinfo.vendor);
+ element.setAttribute("version", Services.appinfo.version);
+ element.setAttribute("userAgent", window.navigator.userAgent);
+};
+let (element = reportElement("platform"))
+{
+ element.setAttribute("name", "Gecko");
+ element.setAttribute("version", Services.appinfo.platformVersion);
+ element.setAttribute("build", Services.appinfo.platformBuildID);
+};
+let (element = reportElement("options"))
+{
+ appendElement(element, "option", {id: "enabled"}, Prefs.enabled);
+ appendElement(element, "option", {id: "objecttabs"}, Prefs.frameobjects);
+ appendElement(element, "option", {id: "collapse"}, !Prefs.fastcollapse);
+ appendElement(element, "option", {id: "privateBrowsing"}, PrivateBrowsing.enabledForWindow(contentWindow) || PrivateBrowsing.enabled);
+ appendElement(element, "option", {id: "subscriptionsAutoUpdate"}, Prefs.subscriptions_autoupdate);
+ appendElement(element, "option", {id: "javascript"}, Services.prefs.getBoolPref("javascript.enabled"));
+ appendElement(element, "option", {id: "cookieBehavior"}, Services.prefs.getIntPref("network.cookie.cookieBehavior"));
+};
+
+//
+// Data collectors
+//
+
+let reportsListDataSource =
+{
+ list: [],
+
+ collectData: function(wnd, windowURI, callback)
+ {
+ let data = Prefs.recentReports;
+ if (data && "length" in data)
+ {
+ for (let i = 0; i < data.length; i++)
+ {
+ let entry = data[i];
+ if (typeof entry.reportURL == "string" && entry.reportURL &&
+ typeof entry.time == "number" && Date.now() - entry.time < 30*24*60*60*1000)
+ {
+ let newEntry = {site: null, reportURL: entry.reportURL, time: entry.time};
+ if (typeof entry.site == "string" && entry.site)
+ newEntry.site = entry.site;
+ this.list.push(newEntry);
+ }
+ }
+ }
+
+ if (this.list.length > 10)
+ this.list.splice(10);
+
+ E("recentReports").hidden = !this.list.length;
+ if (this.list.length)
+ {
+ let rows = E("recentReportsRows")
+ for (let i = 0; i < this.list.length; i++)
+ {
+ let entry = this.list[i];
+ let row = document.createElement("row");
+
+ let link = document.createElement("description");
+ link.setAttribute("class", "text-link");
+ link.setAttribute("url", entry.reportURL);
+ link.textContent = entry.reportURL.replace(/^.*\/(?=[^\/])/, "");
+ row.appendChild(link);
+
+ let site = document.createElement("description");
+ if (entry.site)
+ site.textContent = entry.site;
+ row.appendChild(site);
+
+ let time = document.createElement("description");
+ time.textContent = Utils.formatTime(entry.time);
+ row.appendChild(time);
+
+ rows.appendChild(row);
+ }
+ }
+
+ callback();
+ },
+
+ addReport: function(site, reportURL)
+ {
+ this.list.unshift({site: site, reportURL: reportURL, time: Date.now()});
+ Prefs.recentReports = this.list;
+ },
+
+ clear: function()
+ {
+ this.list = [];
+ Prefs.recentReports = this.list;
+ E("recentReports").hidden = true;
+ },
+
+ handleClick: function(event)
+ {
+ if (event.button != 0 || !event.target || !event.target.hasAttribute("url"))
+ return;
+
+ UI.loadInBrowser(event.target.getAttribute("url"));
+ }
+};
+
+let requestsDataSource =
+{
+ requests: reportElement("requests"),
+ origRequests: [],
+ requestNotifier: null,
+ callback: null,
+ nodeByKey: {__proto__: null},
+
+ collectData: function(wnd, windowURI, callback)
+ {
+ this.callback = callback;
+ this.requestNotifier = new RequestNotifier(wnd, this.onRequestFound, this);
+ },
+
+ onRequestFound: function(frame, node, entry, scanComplete)
+ {
+ if (entry)
+ {
+ let key = entry.location + " " + entry.typeDescr + " " + entry.docDomain;
+ let requestXML;
+ if (key in this.nodeByKey)
+ {
+ requestXML = this.nodeByKey[key];
+ requestXML.setAttribute("count", parseInt(requestXML.getAttribute("count"), 10) + 1);
+ }
+ else
+ {
+ requestXML = this.nodeByKey[key] = appendElement(this.requests, "request", {
+ location: censorURL(entry.location),
+ type: entry.typeDescr,
+ docDomain: entry.docDomain,
+ thirdParty: entry.thirdParty,
+ count: 1
+ });
+ }
+
+ // Location is meaningless for element hiding hits
+ if (entry.filter && entry.filter instanceof ElemHideBase)
+ requestXML.removeAttribute("location");
+
+ if (entry.filter)
+ requestXML.setAttribute("filter", entry.filter.text);
+
+ if (node instanceof Element)
+ {
+ requestXML.setAttribute("node", (node.namespaceURI ? node.namespaceURI + "#" : "") + node.localName);
+
+ try
+ {
+ requestXML.setAttribute("size", node.offsetWidth + "x" + node.offsetHeight);
+ } catch(e) {}
+ }
+ this.origRequests.push(entry);
+ }
+
+ if (scanComplete)
+ {
+ this.requestNotifier.shutdown();
+ this.requestNotifier = null;
+ this.callback();
+ }
+ }
+};
+
+let filtersDataSource =
+{
+ origFilters: [],
+
+ collectData: function(wnd, windowURI, callback)
+ {
+ let wndStats = RequestNotifier.getWindowStatistics(wnd);
+ if (wndStats)
+ {
+ let filters = reportElement("filters");
+ for (let f in wndStats.filters)
+ {
+ let filter = Filter.fromText(f)
+ let hitCount = wndStats.filters[f];
+ appendElement(filters, "filter", {
+ text: filter.text,
+ subscriptions: filter.subscriptions.filter(subscriptionsDataSource.subscriptionFilter).map(function(s) s.url).join(" "),
+ hitCount: hitCount
+ });
+ this.origFilters.push(filter);
+ }
+ }
+ callback();
+ }
+};
+
+let subscriptionsDataSource =
+{
+ subscriptionFilter: function(s)
+ {
+ if (s.disabled || !(s instanceof RegularSubscription))
+ return false;
+ if (s instanceof DownloadableSubscription && !/^(http|https|ftp):/i.test(s.url))
+ return false;
+ return true;
+ },
+
+ collectData: function(wnd, windowURI, callback)
+ {
+ let subscriptions = reportElement("subscriptions");
+ let now = Math.round(Date.now() / 1000);
+ for (let i = 0; i < FilterStorage.subscriptions.length; i++)
+ {
+ let subscription = FilterStorage.subscriptions[i];
+ if (!this.subscriptionFilter(subscription))
+ continue;
+
+ let subscriptionXML = appendElement(subscriptions, "subscription", {
+ id: subscription.url,
+ disabledFilters: subscription.filters.filter(function(filter) filter instanceof ActiveFilter && filter.disabled).length
+ });
+ if (subscription.version)
+ subscriptionXML.setAttribute("version", subscription.version);
+ if (subscription.lastDownload)
+ subscriptionXML.setAttribute("lastDownloadAttempt", subscription.lastDownload - now);
+ if (subscription instanceof DownloadableSubscription)
+ {
+ if (subscription.lastSuccess)
+ subscriptionXML.setAttribute("lastDownloadSuccess", subscription.lastSuccess - now);
+ if (subscription.softExpiration)
+ subscriptionXML.setAttribute("softExpiration", subscription.softExpiration - now);
+ if (subscription.expires)
+ subscriptionXML.setAttribute("hardExpiration", subscription.expires - now);
+ subscriptionXML.setAttribute("downloadStatus", subscription.downloadStatus);
+ }
+ }
+ callback();
+ }
+};
+
+let screenshotDataSource =
+{
+ imageOffset: 10,
+
+ // Fields used for color reduction
+ _mapping: [0x00, 0x55, 0xAA, 0xFF],
+ _i: null,
+ _max: null,
+ _pixelData: null,
+ _callback: null,
+
+ // Fields used for user interaction
+ _enabled: true,
+ _canvas: null,
+ _context: null,
+ _selectionType: "mark",
+ _currentData: null,
+ _undoQueue: [],
+
+ collectData: function(wnd, windowURI, callback)
+ {
+ this._callback = callback;
+ this._canvas = E("screenshotCanvas");
+ this._canvas.width = this._canvas.offsetWidth;
+
+ // Do not resize canvas any more (no idea why Gecko requires both to be set)
+ this._canvas.parentNode.style.MozBoxAlign = "center";
+ this._canvas.parentNode.align = "center";
+
+ this._context = this._canvas.getContext("2d");
+ let wndWidth = wnd.document.documentElement.scrollWidth;
+ let wndHeight = wnd.document.documentElement.scrollHeight;
+
+ // Copy scaled screenshot of the webpage. We scale the webpage by width
+ // but leave 10px on each side for easier selecting.
+
+ // Gecko doesn't like sizes more than 64k, restrict to 30k to be on the safe side.
+ // Also, make sure height is at most five times the width to keep image size down.
+ let copyWidth = Math.min(wndWidth, 30000);
+ let copyHeight = Math.min(wndHeight, 30000, copyWidth * 5);
+ let copyX = Math.max(Math.min(wnd.scrollX - copyWidth / 2, wndWidth - copyWidth), 0);
+ let copyY = Math.max(Math.min(wnd.scrollY - copyHeight / 2, wndHeight - copyHeight), 0);
+
+ let scalingFactor = (this._canvas.width - this.imageOffset * 2) / copyWidth;
+ this._canvas.height = copyHeight * scalingFactor + this.imageOffset * 2;
+
+ this._context.save();
+ this._context.translate(this.imageOffset, this.imageOffset);
+ this._context.scale(scalingFactor, scalingFactor);
+ this._context.drawWindow(wnd, copyX, copyY, copyWidth, copyHeight, "rgb(255,255,255)");
+ this._context.restore();
+
+ // Init canvas settings
+ this._context.fillStyle = "rgb(0, 0, 0)";
+ this._context.strokeStyle = "rgba(255, 0, 0, 0.7)";
+ this._context.lineWidth = 3;
+ this._context.lineJoin = "round";
+
+ // Reduce colors asynchronously
+ this._pixelData = this._context.getImageData(this.imageOffset, this.imageOffset,
+ this._canvas.width - this.imageOffset * 2,
+ this._canvas.height - this.imageOffset * 2);
+ this._max = this._pixelData.width * this._pixelData.height * 4;
+ this._i = 0;
+ Utils.runAsync(this.run.bind(this));
+ },
+
+ run: function()
+ {
+ // Process only 5000 bytes at a time to prevent browser hangs
+ let endIndex = Math.min(this._i + 5000, this._max);
+ let i = this._i;
+ for (; i < endIndex; i++)
+ this._pixelData.data[i] = this._mapping[this._pixelData.data[i] >> 6];
+
+ if (i >= this._max)
+ {
+ // Save data back and we are done
+ this._context.putImageData(this._pixelData, this.imageOffset, this.imageOffset);
+ this._callback();
+ }
+ else
+ {
+ this._i = i;
+ Utils.runAsync(this.run.bind(this));
+ }
+ },
+
+ get enabled() this._enabled,
+ set enabled(enabled)
+ {
+ if (this._enabled == enabled)
+ return;
+
+ this._enabled = enabled;
+ this._canvas.style.opacity = this._enabled ? "" : "0.3"
+ E("screenshotMarkButton").disabled = !this._enabled;
+ E("screenshotRemoveButton").disabled = !this._enabled;
+ E("screenshotUndoButton").disabled = !this._enabled || !this._undoQueue.length;
+ },
+
+ get selectionType() this._selectionType,
+ set selectionType(type)
+ {
+ if (this._selectionType == type)
+ return;
+
+ // Abort selection already in progress
+ this.abortSelection();
+
+ this._selectionType = type;
+ },
+
+ exportData: function()
+ {
+ removeReportElement("screenshot");
+ if (this.enabled)
+ {
+ appendElement(reportData.documentElement, "screenshot", {
+ edited: (this._undoQueue.length ? 'true' : 'false')
+ }, this._canvas.toDataURL());
+ }
+ },
+
+ abortSelection: function()
+ {
+ if (this._currentData && this._currentData.data)
+ {
+ this._context.putImageData(this._currentData.data,
+ Math.min(this._currentData.anchorX, this._currentData.currentX),
+ Math.min(this._currentData.anchorY, this._currentData.currentY));
+ }
+ document.removeEventListener("keypress", this.handleKeyPress, true);
+ this._currentData = null;
+ },
+
+ handleKeyPress: function(event)
+ {
+ if (event.keyCode == Ci.nsIDOMKeyEvent.DOM_VK_ESCAPE)
+ {
+ event.stopPropagation();
+ event.preventDefault();
+ screenshotDataSource.abortSelection();
+ }
+ },
+
+ startSelection: function(event)
+ {
+ if (event.button == 2)
+ this.abortSelection(); // Right mouse button aborts selection
+
+ if (event.button != 0 || !this.enabled)
+ return;
+
+ // Abort selection already in progress
+ this.abortSelection();
+
+ let boxObject = document.getBoxObjectFor(this._canvas);
+ let [x, y] = [event.screenX - boxObject.screenX, event.screenY - boxObject.screenY];
+ this._currentData = {
+ data: null,
+ anchorX: x,
+ anchorY: y,
+ currentX: -1,
+ currentY: -1
+ };
+ this.updateSelection(event);
+
+ document.addEventListener("keypress", this.handleKeyPress, true);
+ },
+
+ updateSelection: function(event)
+ {
+ if (event.button != 0 || !this._currentData)
+ return;
+
+ let boxObject = document.getBoxObjectFor(this._canvas);
+ let [x, y] = [event.screenX - boxObject.screenX, event.screenY - boxObject.screenY];
+ if (this._currentData.currentX == x && this._currentData.currentY == y)
+ return;
+
+ if (this._currentData.data)
+ {
+ this._context.putImageData(this._currentData.data,
+ Math.min(this._currentData.anchorX, this._currentData.currentX),
+ Math.min(this._currentData.anchorY, this._currentData.currentY));
+ }
+
+ this._currentData.currentX = x;
+ this._currentData.currentY = y;
+
+ let left = Math.min(this._currentData.anchorX, this._currentData.currentX);
+ let right = Math.max(this._currentData.anchorX, this._currentData.currentX);
+ let top = Math.min(this._currentData.anchorY, this._currentData.currentY);
+ let bottom = Math.max(this._currentData.anchorY, this._currentData.currentY);
+
+ let minDiff = (this._selectionType == "mark" ? 3 : 1);
+ if (right - left >= minDiff && bottom - top >= minDiff)
+ this._currentData.data = this._context.getImageData(left, top, right - left, bottom - top);
+ else
+ this._currentData.data = null;
+
+ if (this._selectionType == "mark")
+ {
+ // all coordinates need to be moved 1.5px inwards to get the desired result
+ left += 1.5;
+ right -= 1.5;
+ top += 1.5;
+ bottom -= 1.5;
+ if (left < right && top < bottom)
+ this._context.strokeRect(left, top, right - left, bottom - top);
+ }
+ else if (this._selectionType == "remove")
+ this._context.fillRect(left, top, right - left, bottom - top);
+ },
+
+ stopSelection: function(event)
+ {
+ if (event.button != 0 || !this._currentData)
+ return;
+
+ if (this._currentData.data)
+ {
+ this._undoQueue.push(this._currentData);
+ E("screenshotUndoButton").disabled = false;
+ }
+
+ this._currentData = null;
+ document.removeEventListener("keypress", this.handleKeyPress, true);
+ },
+
+ undo: function()
+ {
+ let op = this._undoQueue.pop();
+ if (!op)
+ return;
+
+ this._context.putImageData(op.data,
+ Math.min(op.anchorX, op.currentX),
+ Math.min(op.anchorY, op.currentY));
+
+ if (!this._undoQueue.length)
+ E("screenshotUndoButton").disabled = true;
+ }
+};
+
+let framesDataSource =
+{
+ site: null,
+
+ collectData: function(wnd, windowURI, callback)
+ {
+ try
+ {
+ this.site = windowURI.host;
+ if (this.site)
+ document.title += " (" + this.site + ")";
+ }
+ catch (e)
+ {
+ // Expected exception - not all URL schemes have a host name
+ }
+
+ let window = reportElement("window");
+ window.setAttribute("url", censorURL(windowURI ? windowURI.spec : wnd.location.href));
+ if (wnd.opener && wnd.opener.location.href)
+ window.setAttribute("opener", censorURL(wnd.opener.location.href));
+ if (wnd.document.referrer)
+ window.setAttribute("referrer", censorURL(wnd.document.referrer));
+ this.scanFrames(wnd, window);
+
+ callback();
+ },
+
+ scanFrames: function(wnd, xmlList)
+ {
+ try
+ {
+ for (let i = 0; i < wnd.frames.length; i++)
+ {
+ let frame = wnd.frames[i];
+ let frameXML = appendElement(xmlList, "frame", {
+ url: censorURL(frame.location.href)
+ });
+ this.scanFrames(frame, frameXML);
+ }
+ }
+ catch (e)
+ {
+ // Don't break if something goes wrong
+ Cu.reportError(e);
+ }
+ }
+};
+
+let errorsDataSource =
+{
+ collectData: function(wnd, windowURI, callback)
+ {
+ let {addonID} = require("info");
+ addonID = addonID.replace(/[\{\}]/g, "");
+
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=664695 - starting with
+ // Gecko 19 this function returns the result, before that it wrote to a
+ // parameter.
+ let outparam = {};
+ let messages = Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService).getMessageArray(outparam, {});
+ messages = messages || outparam.value || [];
+ messages = messages.filter(function(message)
+ {
+ return (message instanceof Ci.nsIScriptError &&
+ !/^https?:/i.test(message.sourceName) &&
+ (/adblock/i.test(message.errorMessage) || /adblock/i.test(message.sourceName) ||
+ message.errorMessage.indexOf(addonID) >= 0 || message.sourceName && message.sourceName.indexOf(addonID) >= 0));
+ });
+ if (messages.length > 10) // Only the last 10 messages
+ messages = messages.slice(messages.length - 10, messages.length);
+
+ // Censor app and profile paths in error messages
+ let censored = {__proto__: null};
+ let pathList = [["ProfD", "%PROFILE%"], ["GreD", "%GRE%"], ["CurProcD", "%APP%"]];
+ for (let i = 0; i < pathList.length; i++)
+ {
+ let [pathID, placeholder] = pathList[i];
+ try
+ {
+ let file = FileUtils.getDir(pathID, [], false);
+ censored[file.path.replace(/[\\\/]+$/, '')] = placeholder;
+ let uri = Utils.ioService.newFileURI(file);
+ censored[uri.spec.replace(/[\\\/]+$/, '')] = placeholder;
+ } catch(e) {}
+ }
+
+ let errors = reportElement("errors");
+ for (let i = 0; i < messages.length; i++)
+ {
+ let message = messages[i];
+
+ let text = message.errorMessage;
+ for (let path in censored)
+ text = text.replace(path, censored[path], "gi");
+ if (text.length > 256)
+ text = text.substr(0, 256) + "...";
+
+ let file = message.sourceName;
+ for (let path in censored)
+ file = file.replace(path, censored[path], "gi");
+ if (file.length > 256)
+ file = file.substr(0, 256) + "...";
+
+ let sourceLine = message.sourceLine;
+ if (sourceLine.length > 256)
+ sourceLine = sourceLine.substr(0, 256) + "...";
+
+ appendElement(errors, "error", {
+ type: message.flags & Ci.nsIScriptError.warningFlag ? "warning" : "error",
+ text: text,
+ file: file,
+ line: message.lineNumber,
+ column: message.columnNumber,
+ sourceLine: sourceLine
+ });
+ }
+
+ callback();
+ }
+};
+
+let extensionsDataSource =
+{
+ data: reportData.createElement("extensions"),
+
+ collectData: function(wnd, windowURI, callback)
+ {
+ try
+ {
+ let AddonManager = Cu.import("resource://gre/modules/AddonManager.jsm", null).AddonManager;
+ AddonManager.getAddonsByTypes(["extension", "plugin"], function(items)
+ {
+ for (let i = 0; i < items.length; i++)
+ {
+ let item = items[i];
+ if (!item.isActive)
+ continue;
+ appendElement(this.data, "extension", {
+ id: item.id,
+ name: item.name,
+ type: item.type,
+ version: item.version
+ });
+ }
+ callback();
+ }.bind(this));
+ }
+ catch (e)
+ {
+ // No add-on manager, what's going on? Skip this step.
+ callback();
+ }
+ },
+
+ exportData: function(doExport)
+ {
+ if (doExport)
+ reportData.documentElement.appendChild(this.data);
+ else if (this.data.parentNode)
+ this.data.parentNode.removeChild(this.data);
+ }
+};
+
+let subscriptionUpdateDataSource =
+{
+ contentWnd: null,
+ type: null,
+ outdated: null,
+ needUpdate: null,
+
+ collectData: function(wnd, windowURI, callback)
+ {
+ this.contentWnd = wnd;
+ let now = Date.now() / MILLISECONDS_IN_SECOND;
+ let outdatedThreshold = now - 14 * SECONDS_IN_DAY;
+ let needUpdateThreshold = now - 1 * SECONDS_IN_HOUR;
+
+ this.outdated = [];
+ this.needUpdate = [];
+
+ let subscriptions = FilterStorage.subscriptions.filter(issuesDataSource.subscriptionFilter);
+ for (let i = 0; i < subscriptions.length; i++)
+ {
+ let lastSuccess = subscriptions[i].lastSuccess;
+ if (lastSuccess < outdatedThreshold)
+ this.outdated.push(subscriptions[i]);
+ if (lastSuccess < needUpdateThreshold)
+ this.needUpdate.push(subscriptions[i]);
+ }
+
+ callback();
+ },
+
+ updatePage: function(type)
+ {
+ this.type = type;
+ E("updateInProgress").hidden = (type != "false positive" || this.needUpdate.length == 0);
+ E("outdatedSubscriptions").hidden = !E("updateInProgress").hidden || this.outdated.length == 0;
+ if (!E("outdatedSubscriptions").hidden)
+ {
+ let template = E("outdatedSubscriptionTemplate");
+ let list = E("outdatedSubscriptionsList");
+ while (list.lastChild)
+ list.removeChild(list.lastChild);
+
+ for (let i = 0; i < this.outdated.length; i++)
+ {
+ let subscription = this.outdated[i];
+ let entry = template.cloneNode(true);
+ entry.removeAttribute("id");
+ entry.removeAttribute("hidden");
+ entry.setAttribute("_url", subscription.url);
+ entry.setAttribute("tooltiptext", subscription.url);
+ entry.textContent = subscription.title;
+ list.appendChild(entry);
+ }
+ }
+ return !E("updateInProgress").hidden || !E("outdatedSubscriptions").hidden;
+ },
+
+ showPage: function()
+ {
+ document.documentElement.canAdvance = false;
+
+ if (!E("updateInProgress").hidden)
+ {
+ document.documentElement.canRewind = false;
+
+ for (let i = 0; i < this.needUpdate.length; i++)
+ Synchronizer.execute(this.needUpdate[i], true);
+
+ let listener = function(action)
+ {
+ if (!/^subscription\./.test(action))
+ return;
+
+ for (let i = 0; i < this.needUpdate.length; i++)
+ if (Synchronizer.isExecuting(this.needUpdate[i].url))
+ return;
+
+ FilterNotifier.removeListener(listener);
+ E("updateInProgress").hidden = "true";
+
+ let filtersRemoved = false;
+ let requests = requestsDataSource.origRequests;
+ for (let i = 0; i < requests.length; i++)
+ if (requests[i].filter && !requests[i].filter.subscriptions.filter(function(s) !s.disabled).length)
+ filtersRemoved = true;
+
+ if (filtersRemoved)
+ {
+ // Force the user to reload the page
+ E("updateFixedIssue").hidden = false;
+ document.documentElement.canAdvance = true;
+
+ let nextButton = document.documentElement.getButton("next");
+ [nextButton.label, nextButton.accessKey] = Utils.splitLabel(E("updatePage").getAttribute("reloadButtonLabel"));
+ document.documentElement.addEventListener("wizardnext", function(event)
+ {
+ event.preventDefault();
+ event.stopPropagation();
+ window.close();
+ this.contentWnd.location.reload();
+ }.bind(this), true);
+ }
+ else
+ {
+ this.collectData(null, null, function() {});
+ this.needUpdate = [];
+ if (this.outdated.length)
+ {
+ document.documentElement.canRewind = true;
+
+ this.updatePage(this.type);
+ this.showPage();
+ }
+ else
+ {
+ // No more issues, make sure to remove this page from history and
+ // advance to the next page.
+ document.documentElement.canRewind = true;
+ document.documentElement.canAdvance = true;
+
+ let next = document.documentElement.currentPage.next;
+ document.documentElement.rewind();
+ document.documentElement.currentPage.next = next;
+
+ document.documentElement.advance();
+ }
+ }
+ }.bind(this);
+
+ FilterNotifier.addListener(listener);
+ window.addEventListener("unload", function()
+ {
+ FilterNotifier.removeListener(listener);
+ });
+ }
+ },
+
+ updateOutdated: function()
+ {
+ for (let i = 0; i < this.outdated.length; i++)
+ Synchronizer.execute(this.outdated[i], true);
+ }
+}
+
+let issuesDataSource =
+{
+ contentWnd: null,
+ isEnabled: Prefs.enabled,
+ whitelistFilter: null,
+ disabledFilters: [],
+ disabledSubscriptions: [],
+ ownFilters: [],
+ numSubscriptions: 0,
+ numAppliedFilters: Infinity,
+
+ subscriptionFilter: function(s)
+ {
+ if (s instanceof DownloadableSubscription)
+ return subscriptionsDataSource.subscriptionFilter(s);
+ else
+ return false;
+ },
+
+ collectData: function(wnd, windowURI, callback)
+ {
+ this.contentWnd = wnd;
+ this.whitelistFilter = Policy.isWindowWhitelisted(wnd);
+
+ if (!this.whitelistFilter && this.isEnabled)
+ {
+ // Find disabled filters in active subscriptions matching any of the requests
+ let disabledMatcher = new CombinedMatcher();
+ for each (let subscription in FilterStorage.subscriptions)
+ {
+ if (subscription.disabled)
+ continue;
+
+ for each (let filter in subscription.filters)
+ if (filter instanceof BlockingFilter && filter.disabled)
+ disabledMatcher.add(filter);
+ }
+
+ let seenFilters = {__proto__: null};
+ for each (let request in requestsDataSource.origRequests)
+ {
+ if (request.filter)
+ continue;
+
+ let filter = disabledMatcher.matchesAny(request.location, request.typeDescr, request.docDomain, request.thirdParty);
+ if (filter && !(filter.text in seenFilters))
+ {
+ this.disabledFilters.push(filter);
+ seenFilters[filter.text] = true;
+ }
+ }
+
+ // Find disabled subscriptions with filters matching any of the requests
+ let seenSubscriptions = {__proto__: null};
+ for each (let subscription in FilterStorage.subscriptions)
+ {
+ if (!subscription.disabled)
+ continue;
+
+ disabledMatcher.clear();
+ for each (let filter in subscription.filters)
+ if (filter instanceof BlockingFilter)
+ disabledMatcher.add(filter);
+
+ for each (let request in requestsDataSource.origRequests)
+ {
+ if (request.filter)
+ continue;
+
+ let filter = disabledMatcher.matchesAny(request.location, request.typeDescr, request.docDomain, request.thirdParty);
+ if (filter && !(subscription.url in seenSubscriptions))
+ {
+ this.disabledSubscriptions.push(subscription);
+ seenSubscriptions[subscription.text] = true;
+ break;
+ }
+ }
+ }
+
+ this.numSubscriptions = FilterStorage.subscriptions.filter(this.subscriptionFilter).length;
+ this.numAppliedFilters = 0;
+ for each (let filter in filtersDataSource.origFilters)
+ {
+ if (filter instanceof WhitelistFilter)
+ continue;
+
+ this.numAppliedFilters++;
+ if (filter.subscriptions.some(function(subscription) subscription instanceof SpecialSubscription))
+ this.ownFilters.push(filter);
+ }
+ }
+
+ callback();
+ },
+
+ updateIssues: function(type)
+ {
+ if (type == "other")
+ {
+ E("typeSelectorPage").next = "typeWarning";
+ return;
+ }
+
+ E("issuesWhitelistBox").hidden = !this.whitelistFilter;
+ E("issuesDisabledBox").hidden = this.isEnabled;
+ E("issuesNoFiltersBox").hidden = (type != "false positive" || this.numAppliedFilters > 0);
+ E("issuesNoSubscriptionsBox").hidden = (type != "false negative" || this.numAppliedFilters > 0 || this.numSubscriptions > 0);
+ E("issuesSubscriptionCountBox").hidden = (this.numSubscriptions < 5);
+
+ let ownFiltersBox = E("issuesOwnFilters");
+ if (this.ownFilters.length && !ownFiltersBox.firstChild)
+ {
+ let template = E("issuesOwnFiltersTemplate");
+ for each (let filter in this.ownFilters)
+ {
+ let element = template.cloneNode(true);
+ element.removeAttribute("id");
+ element.removeAttribute("hidden");
+ element.firstChild.setAttribute("value", filter.text);
+ element.firstChild.setAttribute("tooltiptext", filter.text);
+ element.abpFilter = filter;
+ ownFiltersBox.appendChild(element);
+ }
+ }
+ E("issuesOwnFiltersBox").hidden = (type != "false positive" || this.ownFilters.length == 0);
+
+ let disabledSubscriptionsBox = E("issuesDisabledSubscriptions");
+ if (this.disabledSubscriptions.length && !disabledSubscriptionsBox.firstChild)
+ {
+ let template = E("issuesDisabledSubscriptionsTemplate");
+ for each (let subscription in this.disabledSubscriptions)
+ {
+ let element = template.cloneNode(true);
+ element.removeAttribute("id");
+ element.removeAttribute("hidden");
+ element.firstChild.setAttribute("value", subscription.title);
+ element.setAttribute("tooltiptext", subscription instanceof DownloadableSubscription ? subscription.url : subscription.title);
+ element.abpSubscription = subscription;
+ disabledSubscriptionsBox.appendChild(element);
+ }
+ }
+ E("issuesDisabledSubscriptionsBox").hidden = (type != "false negative" || this.disabledSubscriptions.length == 0);
+
+ let disabledFiltersBox = E("issuesDisabledFilters");
+ if (this.disabledFilters.length && !disabledFiltersBox.firstChild)
+ {
+ let template = E("issuesDisabledFiltersTemplate");
+ for each (let filter in this.disabledFilters)
+ {
+ let element = template.cloneNode(true);
+ element.removeAttribute("id");
+ element.removeAttribute("hidden");
+ element.firstChild.setAttribute("value", filter.text);
+ element.setAttribute("tooltiptext", filter.text);
+ element.abpFilter = filter;
+ disabledFiltersBox.appendChild(element);
+ }
+ }
+ E("issuesDisabledFiltersBox").hidden = (type != "false negative" || this.disabledFilters.length == 0);
+
+ // Don't allow sending report if the page is whitelisted - we need the data.
+ // Also disallow reports without matching filters or without subscriptions,
+ // subscription authors cannot do anything about those.
+ E("issuesOverride").hidden = !E("issuesWhitelistBox").hidden ||
+ !E("issuesDisabledBox").hidden ||
+ !E("issuesNoFiltersBox").hidden ||
+ !E("issuesNoSubscriptionsBox").hidden ||
+ !E("issuesSubscriptionCountBox").hidden;
+
+ let page = E("typeSelectorPage");
+ if (subscriptionUpdateDataSource.updatePage(type))
+ {
+ page.next = "update";
+ page = E("updatePage");
+ }
+
+ if (E("issuesWhitelistBox").hidden && E("issuesDisabledBox").hidden &&
+ E("issuesNoFiltersBox").hidden && E("issuesNoSubscriptionsBox").hidden &&
+ E("issuesOwnFiltersBox").hidden && E("issuesDisabledFiltersBox").hidden &&
+ E("issuesDisabledSubscriptionsBox").hidden && E("issuesSubscriptionCountBox").hidden)
+ {
+ page.next = "screenshot";
+ }
+ else
+ {
+ page.next = "issues";
+ }
+ },
+
+ forceReload: function()
+ {
+ // User changed configuration, don't allow sending report now - page needs
+ // to be reloaded
+ E("issuesOverride").hidden = true;
+ E("issuesChangeMessage").hidden = false;
+ document.documentElement.canRewind = false;
+ document.documentElement.canAdvance = true;
+
+ let contentWnd = this.contentWnd;
+ let nextButton = document.documentElement.getButton("next");
+ [nextButton.label, nextButton.accessKey] = Utils.splitLabel(E("updatePage").getAttribute("reloadButtonLabel"));
+ document.documentElement.addEventListener("wizardnext", function(event)
+ {
+ event.preventDefault();
+ event.stopPropagation();
+ window.close();
+ contentWnd.location.reload();
+ }, true);
+ },
+
+ removeWhitelist: function()
+ {
+ if (this.whitelistFilter && this.whitelistFilter.subscriptions.length)
+ this.whitelistFilter.disabled = true;
+ E("issuesWhitelistBox").hidden = true;
+ this.forceReload();
+ },
+
+ enable: function()
+ {
+ Prefs.enabled = true;
+ E("issuesDisabledBox").hidden = true;
+ this.forceReload();
+ },
+
+ addSubscription: function()
+ {
+ let result = {};
+ openDialog("subscriptionSelection.xul", "_blank", "chrome,centerscreen,modal,resizable,dialog=no", null, result);
+ if (!("url" in result))
+ return;
+
+ let subscriptionResults = [[result.url, result.title]];
+ if ("mainSubscriptionURL" in result)
+ subscriptionResults.push([result.mainSubscriptionURL, result.mainSubscriptionTitle]);
+
+ for each (let [url, title] in subscriptionResults)
+ {
+ let subscription = Subscription.fromURL(url);
+ if (!subscription)
+ continue;
+
+ FilterStorage.addSubscription(subscription);
+
+ subscription.disabled = false;
+ subscription.title = title;
+
+ if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+ Synchronizer.execute(subscription);
+ }
+
+ E("issuesNoSubscriptionsBox").hidden = true;
+ this.forceReload();
+ },
+
+ disableFilter: function(node)
+ {
+ let filter = node.abpFilter;
+ if (filter && filter.subscriptions.length)
+ filter.disabled = true;
+
+ node.parentNode.removeChild(node);
+ if (!E("issuesOwnFilters").firstChild)
+ E("issuesOwnFiltersBox").hidden = true;
+ this.forceReload();
+ },
+
+ enableFilter: function(node)
+ {
+ let filter = node.abpFilter;
+ if (filter && filter.subscriptions.length)
+ filter.disabled = false;
+
+ node.parentNode.removeChild(node);
+ if (!E("issuesDisabledFilters").firstChild)
+ E("issuesDisabledFiltersBox").hidden = true;
+ this.forceReload();
+ },
+
+
+ enableSubscription: function(node)
+ {
+ let subscription = node.abpSubscription;
+ if (subscription)
+ subscription.disabled = false;
+
+ node.parentNode.removeChild(node);
+ if (!E("issuesDisabledSubscriptions").firstChild)
+ E("issuesDisabledSubscriptionsBox").hidden = true;
+ this.forceReload();
+ }
+};
+
+let dataCollectors = [reportsListDataSource, requestsDataSource, filtersDataSource, subscriptionsDataSource,
+ screenshotDataSource, framesDataSource, errorsDataSource, extensionsDataSource,
+ subscriptionUpdateDataSource, issuesDataSource];
+
+//
+// Wizard logic
+//
+
+function initWizard()
+{
+ // Make sure no issue type is selected by default
+ E("typeGroup").selectedItem = null;
+ document.documentElement.addEventListener("pageshow", updateNextButton, false);
+
+ // Move wizard header
+ let header = document.getAnonymousElementByAttribute(document.documentElement, "class", "wizard-header");
+ if (header)
+ {
+ document.getElementById("wizardHeaderLabel").setAttribute("value", document.documentElement.wizardPages[0].getAttribute("label"));
+ document.documentElement.insertBefore(document.getElementById("wizardHeader"), document.documentElement.firstChild);
+ document.documentElement.addEventListener("pageshow", function()
+ {
+ document.getElementById("wizardHeaderDeck").selectedIndex = (document.documentElement.pageIndex == 0 ? 0 : 1);
+ }, false);
+ }
+
+ // Move privacy link
+ let extraButton = document.documentElement.getButton("extra1");
+ extraButton.parentNode.insertBefore(E("privacyLink"), extraButton);
+}
+
+function updateNextButton()
+{
+ let nextButton = document.documentElement.getButton("next");
+ if (!nextButton)
+ return;
+
+ if (document.documentElement.currentPage.id == "commentPage")
+ {
+ if (!("_origLabel" in nextButton))
+ {
+ nextButton._origLabel = nextButton.label;
+ nextButton._origAccessKey = nextButton.accessKey;
+ [nextButton.label, nextButton.accessKey] = Utils.splitLabel(document.documentElement.getAttribute("sendbuttonlabel"));
+ }
+ }
+ else
+ {
+ if ("_origLabel" in nextButton)
+ {
+ nextButton.label = nextButton._origLabel;
+ nextButton.accessKey = nextButton._origAccessKey;
+ delete nextButton._origLabel;
+ delete nextButton._origAccessKey;
+ }
+ }
+}
+
+function initDataCollectorPage()
+{
+ document.documentElement.canAdvance = false;
+
+ let totalSteps = dataCollectors.length;
+ let initNextDataSource = function()
+ {
+ if (!dataCollectors.length)
+ {
+ // We are done, continue to next page
+ document.documentElement.canAdvance = true;
+ document.documentElement.advance();
+ return;
+ }
+
+ let progress = (totalSteps - dataCollectors.length) / totalSteps * 100;
+ if (progress > 0)
+ {
+ let progressMeter = E("dataCollectorProgress");
+ progressMeter.mode = "determined";
+ progressMeter.value = progress;
+ }
+
+ // Continue with the next data source, asynchronously to allow progress meter to update
+ let dataSource = dataCollectors.shift();
+ Utils.runAsync(function()
+ {
+ dataSource.collectData(contentWindow, windowURI, initNextDataSource);
+ });
+ };
+
+ initNextDataSource();
+}
+
+function initTypeSelectorPage()
+{
+ E("progressBar").activeItem = E("typeSelectorHeader");
+ let header = document.getAnonymousElementByAttribute(document.documentElement, "class", "wizard-header");
+ if (header)
+ header.setAttribute("viewIndex", "1");
+
+ document.documentElement.canRewind = false;
+ typeSelectionUpdated();
+}
+
+function typeSelectionUpdated()
+{
+ let selection = E("typeGroup").selectedItem;
+ document.documentElement.canAdvance = (selection != null);
+ if (selection)
+ {
+ if (reportData.documentElement.getAttribute("type") != selection.value)
+ {
+ E("screenshotCheckbox").checked = (selection.value != "other");
+ E("screenshotCheckbox").doCommand();
+ E("extensionsCheckbox").checked = (selection.value == "other");
+ E("extensionsCheckbox").doCommand();
+ }
+ reportData.documentElement.setAttribute("type", selection.value);
+
+ issuesDataSource.updateIssues(selection.value);
+ }
+}
+
+function initIssuesPage()
+{
+ updateIssuesOverride();
+}
+
+function updateIssuesOverride()
+{
+ document.documentElement.canAdvance = E("issuesOverride").checked;
+}
+
+function initTypeWarningPage()
+{
+ updateTypeWarningOverride();
+
+ let textElement = E("typeWarningText");
+ if ("abpInitialized" in textElement)
+ return;
+
+ let template = textElement.textContent.replace(/[\r\n\s]+/g, " ");
+
+ let [, beforeLink, linkText, afterLink] = /(.*)\[link\](.*)\[\/link\](.*)/.exec(template) || [null, "", template, ""];
+ while (textElement.firstChild && textElement.firstChild.nodeType != Node.ELEMENT_NODE)
+ textElement.removeChild(textElement.firstChild);
+ while (textElement.lastChild && textElement.lastChild.nodeType != Node.ELEMENT_NODE)
+ textElement.removeChild(textElement.lastChild);
+
+ if (textElement.firstChild)
+ textElement.firstChild.textContent = linkText;
+ textElement.insertBefore(document.createTextNode(beforeLink), textElement.firstChild);
+ textElement.appendChild(document.createTextNode(afterLink));
+ textElement.abpInitialized = true;
+}
+
+function updateTypeWarningOverride()
+{
+ document.documentElement.canAdvance = E("typeWarningOverride").checked;
+}
+
+function initScreenshotPage()
+{
+ document.documentElement.canAdvance = true;
+
+ E("progressBar").activeItem = E("screenshotHeader");
+}
+
+function initCommentPage()
+{
+ E("progressBar").activeItem = E("commentPageHeader");
+
+ updateEmail();
+
+ screenshotDataSource.exportData();
+ updateDataField();
+}
+
+function showDataField()
+{
+ E('dataDeck').selectedIndex = 1;
+ updateDataField();
+ E('data').focus();
+}
+
+let _dataFieldUpdateTimeout = null;
+
+function _updateDataField()
+{
+ let dataField = E("data");
+ let [selectionStart, selectionEnd] = [dataField.selectionStart, dataField.selectionEnd];
+ dataField.value = serializeReportData();
+ dataField.setSelectionRange(selectionStart, selectionEnd);
+}
+
+function updateDataField()
+{
+ // Don't do anything if data field is hidden
+ if (E('dataDeck').selectedIndex != 1)
+ return;
+
+ if (_dataFieldUpdateTimeout)
+ {
+ window.clearTimeout(_dataFieldUpdateTimeout);
+ _dataFieldUpdateTimeout = null;
+ }
+
+ _dataFieldUpdateTimeout = window.setTimeout(_updateDataField, 200);
+}
+
+function updateComment()
+{
+ removeReportElement("comment");
+
+ let value = E("comment").value;
+ appendElement(reportData.documentElement, "comment", null, value.substr(0, 1000));
+ E("commentLengthWarning").setAttribute("visible", value.length > 1000);
+ updateDataField();
+}
+
+function updateEmail()
+{
+ removeReportElement("email");
+
+ let anonymous = E("anonymousCheckbox").checked;
+
+ let value = E("email").value;
+
+ // required for persist to work on textbox, see: https://bugzilla.mozilla.org/show_bug.cgi?id=111486
+ E("email").setAttribute("value", value);
+
+ E("email").disabled = anonymous;
+ E("emailLabel").disabled = anonymous;
+ E("anonymityWarning").setAttribute("visible", anonymous);
+
+ if (!anonymous)
+ appendElement(reportData.documentElement, "email", null, value);
+
+ updateDataField();
+
+ document.documentElement.canAdvance = anonymous || /\S/.test(value);
+}
+
+function updateExtensions(attach)
+{
+ extensionsDataSource.exportData(attach);
+ updateDataField();
+}
+
+function initSendPage()
+{
+ E("progressBar").activeItem = E("sendPageHeader");
+
+ E("result").hidden = true;
+ E("sendReportErrorBox").hidden = true;
+ E("sendReportMessage").hidden = false;
+ E("sendReportProgress").hidden = false;
+ E("sendReportProgress").mode = "undetermined";
+
+ document.documentElement.canRewind = false;
+ document.documentElement.getButton("finish").disabled = true;
+
+ let guid = Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator).generateUUID().toString().replace(/[\{\}]/g, "");
+ let url = Prefs.report_submiturl.replace(/%GUID%/g, guid).replace(/%LANG%/g, Utils.appLocale);
+ let request = new XMLHttpRequest();
+ request.open("POST", url);
+ request.setRequestHeader("Content-Type", "text/xml");
+ request.setRequestHeader("X-Adblock-Plus", "1");
+ request.addEventListener("load", reportSent, false);
+ request.addEventListener("error", reportSent, false);
+ if ("upload" in request && request.upload)
+ request.upload.addEventListener("progress", updateReportProgress, false);
+ request.send(serializeReportData());
+}
+
+function updateReportProgress(event)
+{
+ if (!event.lengthComputable)
+ return;
+
+ let progress = Math.round(event.loaded / event.total * 100);
+ if (progress > 0)
+ {
+ let progressMeter = E("sendReportProgress");
+ progressMeter.mode = "determined";
+ progressMeter.value = progress;
+ }
+}
+
+function reportSent(event)
+{
+ let request = event.target;
+ let success = false;
+ let errorMessage = E("sendReportError").getAttribute("defaultError");
+ try
+ {
+ let status = request.channel.status;
+ if (Components.isSuccessCode(status))
+ {
+ success = (request.status == 200 || request.status == 0);
+ errorMessage = request.status + " " + request.statusText;
+ }
+ else
+ {
+ errorMessage = "0x" + status.toString(16);
+
+ // Try to find the name for the status code
+ let exception = Cc["@mozilla.org/js/xpc/Exception;1"].createInstance(Ci.nsIXPCException);
+ exception.initialize(null, status, null, null, null, null);
+ if (exception.name)
+ errorMessage = exception.name;
+ }
+ } catch (e) {}
+
+ let result = "";
+ try
+ {
+ result = request.responseText;
+ } catch (e) {}
+
+ result = result.replace(/%CONFIRMATION%/g, encodeHTML(E("result").getAttribute("confirmationMessage")));
+ result = result.replace(/%KNOWNISSUE%/g, encodeHTML(E("result").getAttribute("knownIssueMessage")));
+ result = result.replace(/(<html)\b/, '$1 dir="' + window.getComputedStyle(document.documentElement, "").direction + '"');
+
+ if (!success)
+ {
+ let errorElement = E("sendReportError");
+ let template = errorElement.getAttribute("textTemplate").replace(/[\r\n\s]+/g, " ");
+
+ let [, beforeLink, linkText, afterLink] = /(.*)\[link\](.*)\[\/link\](.*)/.exec(template) || [null, "", template, ""];
+ beforeLink = beforeLink.replace(/\?1\?/g, errorMessage);
+ afterLink = afterLink.replace(/\?1\?/g, errorMessage);
+
+ while (errorElement.firstChild && errorElement.firstChild.nodeType != Node.ELEMENT_NODE)
+ errorElement.removeChild(errorElement.firstChild);
+ while (errorElement.lastChild && errorElement.lastChild.nodeType != Node.ELEMENT_NODE)
+ errorElement.removeChild(errorElement.lastChild);
+
+ if (errorElement.firstChild)
+ errorElement.firstChild.textContent = linkText;
+ errorElement.insertBefore(document.createTextNode(beforeLink), errorElement.firstChild);
+ errorElement.appendChild(document.createTextNode(afterLink));
+
+ E("sendReportErrorBox").hidden = false;
+ }
+
+ E("sendReportProgress").hidden = true;
+
+ let frame = E("result");
+ frame.hidden = false;
+ frame.docShell.allowAuth = false;
+ frame.docShell.allowJavascript = false;
+ frame.docShell.allowMetaRedirects = false;
+ frame.docShell.allowPlugins = false;
+ frame.docShell.allowSubframes = false;
+
+ frame.setAttribute("src", "data:text/html;charset=utf-8," + encodeURIComponent(result));
+
+ E("sendReportMessage").hidden = true;
+
+ if (success)
+ {
+ try
+ {
+ let link = request.responseXML.getElementById("link").getAttribute("href");
+ let button = E("copyLink");
+ button.setAttribute("url", link);
+ button.removeAttribute("disabled");
+
+ if (!PrivateBrowsing.enabledForWindow(contentWindow) && !PrivateBrowsing.enabled)
+ reportsListDataSource.addReport(framesDataSource.site, link);
+ } catch (e) {}
+ E("copyLinkBox").hidden = false;
+
+ document.documentElement.getButton("finish").disabled = false;
+ document.documentElement.getButton("cancel").disabled = true;
+ E("progressBar").activeItemComplete = true;
+ }
+}
+
+function processLinkClick(event)
+{
+ event.preventDefault();
+
+ let link = event.target;
+ while (link && !(link instanceof HTMLAnchorElement))
+ link = link.parentNode;
+
+ if (link && (link.protocol == "http:" || link.protocol == "https:"))
+ UI.loadInBrowser(link.href);
+}
+
+function copyLink(url)
+{
+ Utils.clipboardHelper.copyString(url);
+}
+
+function censorURL(url)
+{
+ return url.replace(/([?;&\/#][^?;&\/#]+?=)[^?;&\/#]+/g, "$1*");
+}
+
+function encodeHTML(str)
+{
+ return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sendReport.xul b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sendReport.xul
new file mode 100644
index 0000000..54e0726
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sendReport.xul
@@ -0,0 +1,259 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://global/skin/wizard.css" type="text/css"?>
+<?xml-stylesheet href="chrome://adblockplus/skin/sendReport.css" type="text/css"?>
+
+<?xul-overlay href="progressBar.xul"?>
+
+<!DOCTYPE dialog [
+<!ENTITY % reporterDTD SYSTEM "chrome://adblockplus/locale/sendReport.dtd">
+%reporterDTD;
+<!ENTITY % filtersDTD SYSTEM "chrome://adblockplus/locale/filters.dtd">
+%filtersDTD;
+]>
+
+<wizard
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ title="&wizard.title;"
+ id="abpSendReportWizard"
+ onload="initWizard();"
+ width="800"
+ height="550"
+ sendbuttonlabel="&sendButton.label;"
+ windowtype="abp:sendReport">
+
+<script type="application/x-javascript;version=1.7" src="utils.js"/>
+<script type="application/x-javascript;version=1.7" src="sendReport.js"/>
+
+<keyset id="wizardKeys">
+ <key id="undoKey" modifiers="accel" key="Z" oncommand="if (document.documentElement.currentPage.id == 'screenshotPage') screenshotDataSource.undo();"/>
+</keyset>
+
+<box hidden="true">
+ <vbox id="wizardHeader" class="wizard-header">
+ <deck id="wizardHeaderDeck">
+ <description id="wizardHeaderLabel" class="wizard-header-label"/>
+ <hbox id="progressBar">
+ <label id="typeSelectorHeader" class="progressLabel" value="&typeSelector.heading;" crop="end"/>
+ <label id="screenshotHeader" class="progressLabel" value="&screenshot.heading;" crop="end"/>
+ <label id="commentPageHeader" class="progressLabel" value="&commentPage.heading;" crop="end"/>
+ <label id="sendPageHeader" class="progressLabel" value="&sendPage.heading;" crop="end"/>
+ </hbox>
+ </deck>
+ </vbox>
+
+ <label id="privacyLink" class="text-link" value="&privacyPolicy.label;" onclick="UI.loadDocLink('reporter_privacy');"/>
+</box>
+
+<wizardpage id="dataCollectorPage" pageid="dataCollector" next="typeSelector" label="&dataCollector.heading;" onpageshow="initDataCollectorPage();">
+ <description>&dataCollector.description;</description>
+
+ <progressmeter id="dataCollectorProgress" mode="undetermined"/>
+</wizardpage>
+
+<wizardpage id="typeSelectorPage" pageid="typeSelector" next="screenshot" label="&typeSelector.heading;" onpageshow="initTypeSelectorPage();">
+ <description>&typeSelector.description;</description>
+
+ <radiogroup id="typeGroup" oncommand="typeSelectionUpdated();">
+ <radio id="typeFalsePositive" value="false positive" label="&typeSelector.falsePositive.label;"/>
+ <description class="radioDescription">&typeSelector.falsePositive.description;</description>
+ <radio id="typeFalseNegative" value="false negative" label="&typeSelector.falseNegative.label;"/>
+ <description class="radioDescription">&typeSelector.falseNegative.description;</description>
+ <radio id="typeOther" value="other" label="&typeSelector.other.label;"/>
+ <description class="radioDescription">&typeSelector.other.description;</description>
+ </radiogroup>
+
+ <deck id="recentReports" currentIndex="0" flex="1">
+ <vbox pack="end">
+ <label class="text-link" value="&showRecentReports.label;" onclick="E('recentReports').selectedIndex = 1;"/>
+ </vbox>
+ <groupbox flex="1">
+ <caption label="&recentReports.label;"/>
+ <grid flex="1" id="recentReportsList">
+ <columns>
+ <column flex="2"/>
+ <column flex="1"/>
+ <column/>
+ </columns>
+ <rows id="recentReportsRows" onclick="reportsListDataSource.handleClick(event);"/>
+ </grid>
+
+ <hbox pack="start">
+ <button label="&recentReports.clear.label;" oncommand="reportsListDataSource.clear();"/>
+ </hbox>
+ </groupbox>
+ </deck>
+</wizardpage>
+
+<wizardpage id="updatePage" pageid="update" next="screenshot" onpageshow="subscriptionUpdateDataSource.showPage();" reloadButtonLabel="&reloadButton.label;">
+ <vbox id="updateInProgress">
+ <description>&update.inProgress.description;</description>
+ <progressmeter mode="undetermined"/>
+ </vbox>
+
+ <description id="updateFixedIssue" hidden="true">&update.fixed.description;</description>
+
+ <vbox id="outdatedSubscriptions">
+ <description>&outdatedSubscriptions.description;</description>
+
+ <description id="outdatedSubscriptionTemplate" class="text-link" onclick="UI.loadInBrowser(this.getAttribute('_url'));"/>
+
+ <vbox id="outdatedSubscriptionsList"/>
+
+ <hbox>
+ <button label="&update.start.label;" oncommand="subscriptionUpdateDataSource.updateOutdated();window.close();"/>
+ <button label="&issues.openPreferences.label;" oncommand="UI.openFiltersDialog();window.close();"/>
+ </hbox>
+ </vbox>
+</wizardpage>
+
+<wizardpage id="issuesPage" pageid="issues" next="screenshot" onpageshow="initIssuesPage();" reloadButtonLabel="&reloadButton.label;">
+ <description>&issues.description;</description>
+
+ <vbox id="issuesBox" flex="1">
+ <groupbox id="issuesWhitelistBox" hidden="true">
+ <description>&issues.whitelist.description;</description>
+ <hbox pack="end">
+ <button label="&issues.whitelist.remove.label;" oncommand="issuesDataSource.removeWhitelist();"/>
+ </hbox>
+ </groupbox>
+ <groupbox id="issuesDisabledBox" hidden="true">
+ <description>&issues.disabled.description;</description>
+ <hbox pack="end">
+ <button label="&issues.disabled.enable.label;" oncommand="issuesDataSource.enable();"/>
+ </hbox>
+ </groupbox>
+ <groupbox id="issuesNoFiltersBox" hidden="true">
+ <description>&issues.nofilters.description;</description>
+ </groupbox>
+ <groupbox id="issuesNoSubscriptionsBox" hidden="true">
+ <description>&issues.nosubscriptions.description;</description>
+ <hbox pack="end">
+ <button label="&issues.nosubscriptions.add.label;" oncommand="issuesDataSource.addSubscription();"/>
+ </hbox>
+ </groupbox>
+ <groupbox id="issuesSubscriptionCountBox" hidden="true">
+ <description>&issues.subscriptionCount.description;</description>
+ <hbox pack="end">
+ <button label="&issues.openPreferences.label;" oncommand="UI.openFiltersDialog();window.close();"/>
+ </hbox>
+ </groupbox>
+ <groupbox id="issuesOwnFiltersBox" hidden="true">
+ <description>&issues.ownfilters.description;</description>
+ <hbox id="issuesOwnFiltersTemplate" align="center" hidden="true">
+ <description flex="1" crop="end"/>
+ <button label="&issues.ownfilters.disable.label;" oncommand="issuesDataSource.disableFilter(this.parentNode);"/>
+ </hbox>
+ <vbox id="issuesOwnFilters"/>
+ </groupbox>
+ <groupbox id="issuesDisabledSubscriptionsBox" hidden="true">
+ <description>&issues.disabledgroups.description;</description>
+ <hbox id="issuesDisabledSubscriptionsTemplate" align="center" hidden="true">
+ <description flex="1" crop="end"/>
+ <button label="&issues.disabledgroups.enable.label;" oncommand="issuesDataSource.enableSubscription(this.parentNode);"/>
+ </hbox>
+ <vbox id="issuesDisabledSubscriptions"/>
+ </groupbox>
+ <groupbox id="issuesDisabledFiltersBox" hidden="true">
+ <description>&issues.disabledfilters.description;</description>
+ <hbox id="issuesDisabledFiltersTemplate" align="center" hidden="true">
+ <description flex="1" crop="end"/>
+ <button label="&issues.disabledfilters.enable.label;" oncommand="issuesDataSource.enableFilter(this.parentNode);"/>
+ </hbox>
+ <vbox id="issuesDisabledFilters"/>
+ </groupbox>
+ </vbox>
+
+ <checkbox id="issuesOverride" label="&issues.override.label;" oncommand="updateIssuesOverride();"/>
+ <description id="issuesChangeMessage" hidden="true">&issues.change.description;</description>
+</wizardpage>
+
+<wizardpage id="typeWarningPage" pageid="typeWarning" next="screenshot" onpageshow="initTypeWarningPage();">
+ <description id="typeWarningText">
+ &typeWarning.description;
+ <label id="typeWarningTextLink" class="text-link" onclick="UI.loadDocLink('reporter_other_link');"/>
+ </description>
+
+ <checkbox id="typeWarningOverride" label="&typeWarning.override.label;" oncommand="updateTypeWarningOverride();"/>
+</wizardpage>
+
+<wizardpage id="screenshotPage" pageid="screenshot" next="comment" label="&screenshot.heading;" onpageshow="initScreenshotPage();">
+ <description>&screenshot.description;</description>
+
+ <checkbox id="screenshotCheckbox" checked="true" label="&screenshot.attach.label;" oncommand="screenshotDataSource.enabled = this.checked;"/>
+ <hbox id="screenshotButtons" pack="end">
+ <button id="screenshotMarkButton" type="radio" group="selectionType" oncommand="screenshotDataSource.selectionType = 'mark';" checked="true" label="&screenshot.mark.label;"/>
+ <button id="screenshotRemoveButton" type="radio" group="selectionType" oncommand="screenshotDataSource.selectionType = 'remove';" label="&screenshot.remove.label;"/>
+ <button id="screenshotUndoButton" oncommand="screenshotDataSource.undo();" disabled="true" label="&screenshot.undo.label;"/>
+ </hbox>
+ <vbox id="screenshotBox" flex="1">
+ <canvas xmlns="http://www.w3.org/1999/xhtml" id="screenshotCanvas" onmousedown="screenshotDataSource.startSelection(event);" onmouseup="screenshotDataSource.stopSelection(event);" onmouseout="screenshotDataSource.stopSelection(event);" onmousemove="screenshotDataSource.updateSelection(event);"/>
+ </vbox>
+</wizardpage>
+
+<wizardpage id="commentPage" pageid="comment" next="send" label="&commentPage.heading;" onpageshow="initCommentPage();">
+ <description>&emailComment.label;</description>
+ <hbox class="topLabel" align="baseline">
+ <label id="emailLabel" control="email" value="&email.label;"/>
+ <textbox id="email" persist="value" flex="1" maxlength="200" oninput="updateEmail();"/>
+ </hbox>
+ <checkbox id="anonymousCheckbox" label="&anonymous.label;" oncommand="updateEmail();"/>
+ <description id="anonymityWarning" visible="false">&anonymity.warning;</description>
+
+ <description class="topLabel">&commentPage.description;</description>
+ <label class="topLabel" control="comment" value="&comment.label;"/>
+ <textbox id="comment" multiline="true" flex="1" oninput="updateComment();"/>
+ <description id="commentLengthWarning" visible="false">&comment.lengthWarning;</description>
+
+ <checkbox id="extensionsCheckbox" label="&attachExtensions.label;" oncommand="updateExtensions(this.checked);"/>
+
+ <deck id="dataDeck" selectedIndex="0" flex="2">
+ <vbox pack="start">
+ <label class="text-link" value="&showData.label;" onclick="showDataField();"/>
+ </vbox>
+ <vbox>
+ <label control="data" value="&data.label;"/>
+ <textbox id="data" readonly="true" multiline="true" wrap="off" flex="1"/>
+ </vbox>
+ </deck>
+</wizardpage>
+
+<wizardpage id="sendPage" pageid="send" label="&sendPage.heading;" onpageshow="initSendPage();">
+ <description id="sendReportMessage">&sendPage.waitMessage;</description>
+
+ <vbox id="sendReportErrorBox" align="end" hidden="true">
+ <description id="sendReportError" textTemplate="&sendPage.errorMessage;" defaultError="&subscription.lastDownload.connectionError;">
+ <label id="sendReportErrorLinks" class="text-link" onclick="UI.loadDocLink('reporter_connect_issue');"/>
+ </description>
+ <button id="sendRetryButton" label="&sendPage.retry.label;" oncommand="initSendPage();"/>
+ </vbox>
+
+ <progressmeter id="sendReportProgress" mode="undetermined"/>
+
+ <iframe id="result" type="content" flex="1" hidden="true" onclick="processLinkClick(event);"
+ confirmationMessage="&sendPage.confirmation;" knownIssueMessage="&sendPage.knownIssue;"/>
+
+ <hbox id="copyLinkBox" pack="end" hidden="true">
+ <button id="copyLink" disabled="true" label="&copyLink.label;" oncommand="copyLink(this.getAttribute('url'));"/>
+ </hbox>
+</wizardpage>
+
+</wizard>
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/settings.xul b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/settings.xul
new file mode 100644
index 0000000..4215a38
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/settings.xul
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<!DOCTYPE vbox SYSTEM "chrome://adblockplus/locale/overlay.dtd">
+
+<window
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ width="1"
+ height="1"
+ onload="window.close();"> <!-- Close window if it gets opened directly for some reason -->
+ <setting type="control">
+ <button id="adblockplus-filters" label="&filters.label;…"/>
+ </setting>
+ <setting pref="extensions.adblockplus.enabled" type="bool" inverted="true" title="&disable.label;"/>
+ <setting pref="extensions.adblockplus.frameobjects" type="bool" title="&objecttabs.label;"/>
+ <setting pref="extensions.adblockplus.fastcollapse" type="bool" inverted="true" title="&hideplaceholders.label;"/>
+ <setting id="adblockplus-savestats" type="bool" title="&counthits.label;"/>
+ <setting id="adblockplus-sync" type="bool" title="&sync.label;"/>
+ <setting id="adblockplus-showintoolbar" type="bool" title="&showintoolbar.label;"/>
+ <setting id="adblockplus-showinstatusbar" pref="extensions.adblockplus.showinstatusbar" type="bool" title="&showinstatusbar.label;"/>
+ <setting id="adblockplus-autoupdate" pref="extensions.adblockplus.subscriptions_autoupdate" type="bool" title="&subscription.update.label;"/>
+</window>
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebar.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebar.js
new file mode 100644
index 0000000..358aebe
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebar.js
@@ -0,0 +1,1246 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+// Main browser window
+var mainWin = parent;
+
+// The window handler currently in use
+var requestNotifier = null;
+
+var cacheSession = null;
+var noFlash = false;
+
+// Matcher for disabled filters
+var disabledMatcher = new CombinedMatcher();
+
+// Cached string values
+var docDomainThirdParty = null;
+var docDomainFirstParty = null;
+
+function init() {
+ docDomainThirdParty = document.documentElement.getAttribute("docDomainThirdParty");
+ docDomainFirstParty = document.documentElement.getAttribute("docDomainFirstParty");
+
+ var list = E("list");
+ list.view = treeView;
+
+ // Restore previous state
+ var params = Utils.getParams();
+ if (params && params.filter)
+ {
+ E("searchField").value = params.filter;
+ treeView.setFilter(params.filter);
+ }
+ if (params && params.focus && E(params.focus))
+ E(params.focus).focus();
+ else
+ E("searchField").focus();
+
+ var selected = null;
+ if (/sidebarDetached\.xul$/.test(parent.location.href))
+ {
+ mainWin = parent.opener;
+ mainWin.addEventListener("unload", mainUnload, false);
+ E("detachButton").hidden = true;
+ E("reattachButton").hidden = false;
+
+ let mustDetach = parent.arguments[0];
+ if (mustDetach)
+ E("reattachButton").setAttribute("disabled", "true");
+ if ("sidebar" in UI.hotkeys)
+ {
+ let {KeySelector} = require("keySelector");
+ parent.addEventListener("keypress", function(event)
+ {
+ if (KeySelector.matchesKey(event, UI.hotkeys.sidebar))
+ doClose();
+ }, false);
+ }
+
+ // Set default size/position unless already persisted
+ let defaults = {screenX: 0, screenY: 0, width: 600, height: 300};
+ if (params && params.position)
+ defaults = params.position;
+
+ let wnd = parent.document.documentElement;
+ for (let attr in defaults)
+ if (!wnd.hasAttribute(attr))
+ wnd.setAttribute(attr, defaults[attr]);
+ }
+
+ let {getBrowser, addBrowserLocationListener} = require("appSupport");
+ window.__defineGetter__("content", function() {return getBrowser(mainWin).contentWindow;});
+
+ // Initialize matcher for disabled filters
+ reloadDisabledFilters();
+ FilterNotifier.addListener(reloadDisabledFilters);
+ Prefs.addListener(onPrefChange);
+
+ // Activate flasher
+ list.addEventListener("select", onSelectionChange, false);
+
+ // Initialize data
+ handleLocationChange();
+
+ // Install a progress listener to catch location changes
+ if (addBrowserLocationListener)
+ addBrowserLocationListener(mainWin, handleLocationChange, true);
+}
+
+// To be called for a detached window when the main window has been closed
+function mainUnload() {
+ parent.close();
+}
+
+// To be called on unload
+function cleanUp() {
+ flasher.stop();
+ requestNotifier.shutdown();
+ FilterNotifier.removeListener(reloadDisabledFilters);
+ Prefs.removeListener(onPrefChange);
+ E("list").view = null;
+
+ let {removeBrowserLocationListener} = require("appSupport");
+ if (removeBrowserLocationListener)
+ removeBrowserLocationListener(mainWin, handleLocationChange);
+ mainWin.removeEventListener("unload", mainUnload, false);
+}
+
+/**
+ * Tracks preference changes, calls reloadDisabledFilters whenever Adblock Plus
+ * is enabled/disabled.
+ */
+function onPrefChange(name)
+{
+ if (name == "enabled")
+ reloadDisabledFilters();
+}
+
+let reloadDisabledScheduled = false;
+
+/**
+ * Updates matcher for disabled filters (global disabledMatcher variable),
+ * called on each filter change. Execute delayed to prevent multiple subsequent
+ * invocations.
+ */
+function reloadDisabledFilters()
+{
+ if (reloadDisabledScheduled)
+ return;
+
+ Utils.runAsync(reloadDisabledFiltersInternal);
+ reloadDisabledScheduled = true;
+}
+
+function reloadDisabledFiltersInternal()
+{
+ reloadDisabledScheduled = false;
+ disabledMatcher.clear();
+
+ if (Prefs.enabled)
+ {
+ for each (let subscription in FilterStorage.subscriptions)
+ {
+ if (subscription.disabled)
+ continue;
+
+ for each (let filter in subscription.filters)
+ if (filter instanceof RegExpFilter && filter.disabled)
+ disabledMatcher.add(filter);
+ }
+ }
+
+ treeView.updateFilters();
+}
+
+// Called whenever list selection changes - triggers flasher
+function onSelectionChange() {
+ var item = treeView.getSelectedItem();
+ if (item)
+ E("copy-command").removeAttribute("disabled");
+ else
+ E("copy-command").setAttribute("disabled", "true");
+
+ if (item && window.content)
+ {
+ let key = item.location + " " + item.type + " " + item.docDomain;
+ RequestNotifier.storeSelection(window.content, key);
+ treeView.itemToSelect = null;
+ }
+
+ if (!noFlash)
+ flasher.flash(item ? item.nodes : null);
+}
+
+function handleLocationChange()
+{
+ if (requestNotifier)
+ requestNotifier.shutdown();
+
+ treeView.clearData();
+ treeView.itemToSelect = RequestNotifier.getSelection(window.content);
+ requestNotifier = new RequestNotifier(window.content, function(wnd, node, item, scanComplete)
+ {
+ if (item)
+ treeView.addItem(node, item, scanComplete);
+ });
+}
+
+// Fills a box with text splitting it up into multiple lines if necessary
+function setMultilineContent(box, text, noRemove)
+{
+ if (!noRemove)
+ while (box.firstChild)
+ box.removeChild(box.firstChild);
+
+ for (var i = 0; i < text.length; i += 80)
+ {
+ var description = document.createElement("description");
+ description.setAttribute("value", text.substr(i, 80));
+ box.appendChild(description);
+ }
+}
+
+// Fill in tooltip data before showing it
+function fillInTooltip(e) {
+ // Prevent tooltip from overlapping menu
+ if (E("context").state == "open")
+ {
+ e.preventDefault();
+ return;
+ }
+
+ var item;
+ if (treeView.data && !treeView.data.length)
+ item = treeView.getDummyTooltip();
+ else
+ item = treeView.getItemAt(e.clientX, e.clientY);
+
+ if (!item)
+ {
+ e.preventDefault();
+ return;
+ }
+
+ let filter = ("filter" in item && item.filter ? item.filter : null);
+ let size = ("tooltip" in item ? null : getItemSize(item));
+ let subscriptions = (filter ? filter.subscriptions.filter(function(subscription) { return !subscription.disabled; }) : []);
+
+ E("tooltipDummy").hidden = !("tooltip" in item);
+ E("tooltipAddressRow").hidden = ("tooltip" in item);
+ E("tooltipTypeRow").hidden = ("tooltip" in item);
+ E("tooltipSizeRow").hidden = !size;
+ E("tooltipDocDomainRow").hidden = ("tooltip" in item || !item.docDomain);
+ E("tooltipFilterRow").hidden = !filter;
+ E("tooltipFilterSourceRow").hidden = !subscriptions.length;
+
+ if ("tooltip" in item)
+ E("tooltipDummy").setAttribute("value", item.tooltip);
+ else
+ {
+ E("tooltipAddress").parentNode.hidden = (item.typeDescr == "ELEMHIDE");
+ setMultilineContent(E("tooltipAddress"), item.location);
+
+ var type = item.localizedDescr;
+ if (filter && filter instanceof WhitelistFilter)
+ type += " " + E("tooltipType").getAttribute("whitelisted");
+ else if (filter && item.typeDescr != "ELEMHIDE")
+ type += " " + E("tooltipType").getAttribute("filtered");
+ E("tooltipType").setAttribute("value", type);
+
+ if (size)
+ E("tooltipSize").setAttribute("value", size.join(" x "));
+
+ E("tooltipDocDomain").setAttribute("value", item.docDomain + " " + (item.thirdParty ? docDomainThirdParty : docDomainFirstParty));
+ }
+
+ if (filter)
+ {
+ let filterField = E("tooltipFilter");
+ setMultilineContent(filterField, filter.text);
+ if (filter.disabled)
+ {
+ let disabledText = document.createElement("description");
+ disabledText.className = "disabledTextLabel";
+ disabledText.textContent = filterField.getAttribute("disabledText");
+ filterField.appendChild(disabledText);
+ }
+
+ if (subscriptions.length)
+ {
+ let sourceElement = E("tooltipFilterSource");
+ while (sourceElement.firstChild)
+ sourceElement.removeChild(sourceElement.firstChild);
+ for (let i = 0; i < subscriptions.length; i++)
+ setMultilineContent(sourceElement, subscriptions[i].title, true);
+ }
+ }
+
+ var showPreview = Prefs.previewimages && !("tooltip" in item);
+ showPreview = showPreview && item.typeDescr == "IMAGE";
+ showPreview = showPreview && (!item.filter || item.filter.disabled || item.filter instanceof WhitelistFilter);
+ if (showPreview)
+ {
+ // Check whether image is in cache (stolen from ImgLikeOpera)
+ if (!cacheSession)
+ {
+ var cacheService = Cc["@mozilla.org/network/cache-service;1"].getService(Ci.nsICacheService);
+ cacheSession = cacheService.createSession("HTTP", Ci.nsICache.STORE_ANYWHERE, true);
+ }
+
+ let cacheListener =
+ {
+ onCacheEntryAvailable: function(descriptor, accessGranted, status)
+ {
+ if (!descriptor)
+ return;
+
+ descriptor.close();
+ // Show preview here since this is asynchronous now
+ // and we have a valid descriptor
+ E("tooltipPreview").setAttribute("src", item.location);
+ E("tooltipPreviewBox").hidden = false;
+ },
+ onCacheEntryDoomed: function(status)
+ {
+ }
+ };
+ try
+ {
+ cacheSession.asyncOpenCacheEntry(item.location, Ci.nsICache.ACCESS_READ, cacheListener);
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ }
+ }
+
+ E("tooltipPreviewBox").hidden = true;
+}
+
+const visual = {
+ OTHER: true,
+ IMAGE: true,
+ SUBDOCUMENT: true
+}
+
+/**
+ * Updates context menu before it is shown.
+ */
+function fillInContext(/**Event*/ e)
+{
+ let item, allItems;
+ if (treeView.data && !treeView.data.length)
+ {
+ item = treeView.getDummyTooltip();
+ allItems = [item];
+ }
+ else
+ {
+ item = treeView.getItemAt(e.clientX, e.clientY);
+ allItems = treeView.getAllSelectedItems();
+ }
+
+ if (!item || ("tooltip" in item && !("filter" in item)))
+ return false;
+
+ E("contextDisableFilter").hidden = true;
+ E("contextEnableFilter").hidden = true;
+ E("contextDisableOnSite").hidden = true;
+ if ("filter" in item && item.filter)
+ {
+ let filter = item.filter;
+ let menuItem = E(filter.disabled ? "contextEnableFilter" : "contextDisableFilter");
+ menuItem.setAttribute("label", menuItem.getAttribute("labeltempl").replace(/\?1\?/, filter.text));
+ menuItem.hidden = false;
+
+ if (filter instanceof ActiveFilter && !filter.disabled && filter.subscriptions.length && !filter.subscriptions.some(function(subscription) !(subscription instanceof SpecialSubscription)))
+ {
+ let domain = null;
+ try {
+ domain = Utils.effectiveTLD.getBaseDomainFromHost(item.docDomain);
+ } catch (e) {}
+
+ if (domain && !filter.isActiveOnlyOnDomain(domain))
+ {
+ menuItem = E("contextDisableOnSite");
+ menuItem.setAttribute("label", menuItem.getAttribute("labeltempl").replace(/\?1\?/, domain));
+ menuItem.hidden = false;
+ }
+ }
+ }
+
+ E("contextWhitelist").hidden = ("tooltip" in item || !item.filter || item.filter.disabled || item.filter instanceof WhitelistFilter || item.typeDescr == "ELEMHIDE");
+ E("contextBlock").hidden = !E("contextWhitelist").hidden;
+ E("contextBlock").setAttribute("disabled", "filter" in item && item.filter && !item.filter.disabled);
+ E("contextEditFilter").setAttribute("disabled", !("filter" in item && item.filter));
+ E("contextOpen").setAttribute("disabled", "tooltip" in item || item.typeDescr == "ELEMHIDE");
+ E("contextFlash").setAttribute("disabled", "tooltip" in item || !(item.typeDescr in visual) || (item.filter && !item.filter.disabled && !(item.filter instanceof WhitelistFilter)));
+ E("contextCopyFilter").setAttribute("disabled", !allItems.some(function(item) {return "filter" in item && item.filter}));
+
+ return true;
+}
+
+/**
+ * Resets context menu data once the context menu is closed.
+ */
+function clearContextMenu(/**Event*/ event)
+{
+ if (event.eventPhase != event.AT_TARGET)
+ return;
+
+ {
+ let menuItem = E("contextDisableOnSite");
+ menuItem.item = item;
+ menuItem.filter = filter;
+ menuItem.domain = domain;
+ }
+}
+
+/**
+ * Processed mouse clicks on the item list.
+ * @param {Event} event
+ */
+function handleClick(event)
+{
+ let item = treeView.getItemAt(event.clientX, event.clientY);
+ if (event.button == 0 && treeView.getColumnAt(event.clientX, event.clientY) == "state")
+ {
+ if (item.filter)
+ enableFilter(item.filter, item.filter.disabled);
+ event.preventDefault();
+ }
+ else if (event.button == 1)
+ {
+ openInTab(item, event);
+ event.preventDefault();
+ }
+}
+
+/**
+ * Processes double-clicks on the item list.
+ * @param {Event} event
+ */
+function handleDblClick(event)
+{
+ if (event.button != 0 || treeView.getColumnAt(event.clientX, event.clientY) == "state")
+ return;
+
+ doBlock();
+}
+
+/**
+ * Opens the item in a new tab.
+ */
+function openInTab(item, /**Event*/ event)
+{
+ let items = (item ? [item] : treeView.getAllSelectedItems());
+ for each (let item in items)
+ {
+ if (item && item.typeDescr != "ELEMHIDE")
+ UI.loadInBrowser(item.location, mainWin, event);
+ }
+}
+
+function doBlock() {
+ var item = treeView.getSelectedItem();
+ if (!item || item.typeDescr == "ELEMHIDE")
+ return;
+
+ var filter = null;
+ if (item.filter && !item.filter.disabled)
+ filter = item.filter;
+
+ if (filter && filter instanceof WhitelistFilter)
+ return;
+
+ openDialog("chrome://adblockplus/content/ui/composer.xul", "_blank", "chrome,centerscreen,resizable,dialog=no,dependent", item.nodes, item.orig);
+}
+
+function editFilter()
+{
+ var item = treeView.getSelectedItem();
+ if (treeView.data && !treeView.data.length)
+ item = treeView.getDummyTooltip();
+
+ if (!("filter" in item) || !item.filter)
+ return;
+
+ if (!("location") in item)
+ item.location = undefined
+
+ UI.openFiltersDialog(item.filter);
+}
+
+function enableFilter(filter, enable) {
+ filter.disabled = !enable;
+
+ treeView.boxObject.invalidate();
+}
+
+/**
+ * Edits the filter to disable it on a particular domain.
+ */
+function disableOnSite()
+{
+ let item = treeView.getSelectedItem();
+ let filter = item.filter;
+ if (!(filter instanceof ActiveFilter) || filter.disabled || !filter.subscriptions.length || filter.subscriptions.some(function(subscription) !(subscription instanceof SpecialSubscription)))
+ return;
+
+ let domain;
+ try {
+ domain = Utils.effectiveTLD.getBaseDomainFromHost(item.docDomain).toUpperCase();
+ }
+ catch (e)
+ {
+ return;
+ }
+
+ // Generate text for new filter that excludes current domain
+ let text = filter.text;
+ if (filter instanceof RegExpFilter)
+ {
+ let match = Filter.optionsRegExp.exec(text);
+ if (match)
+ {
+ let found = false;
+ let options = match[1].toUpperCase().split(",");
+ for (let i = 0; i < options.length; i++)
+ {
+ let match = /^DOMAIN=(.*)/.exec(options[i]);
+ if (match)
+ {
+ let domains = match[1].split("|").filter(function(d) d != domain && d != "~" + domain && (d.length <= domain.length || d.lastIndexOf("." + domain) != d.length - domain.length - 1));
+ domains.push("~" + domain);
+ options[i] = "DOMAIN=" + domains.join("|");
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ options.push("DOMAIN=~" + domain);
+
+ text = text.replace(Filter.optionsRegExp, "$" + options.join(",").toLowerCase());
+ }
+ else
+ text += "$domain=~" + domain.toLowerCase();
+ }
+ else if (filter instanceof ElemHideBase)
+ {
+ let match = /^([^#]+)(#.*)/.exec(text);
+ if (match)
+ {
+ let selector = match[2];
+ let domains = match[1].toUpperCase().split(",").filter(function(d) d != domain && (d.length <= domain.length || d != "~" + domain && d.lastIndexOf("." + domain) != d.length - domain.length - 1));
+ domains.push("~" + domain);
+ text = domains.join(",").toLowerCase() + selector;
+ }
+ else
+ text = "~" + domain.toLowerCase() + text;
+ }
+
+ if (text == filter.text)
+ return; // Just in case, shouldn't happen
+
+ // Insert new filter before the old one and remove the old one then
+ let newFilter = Filter.fromText(text);
+ if (newFilter.disabled && newFilter.subscriptions.length)
+ newFilter.disabled = false;
+ else if (!newFilter.subscriptions.length)
+ {
+ newFilter.disabled = false;
+ let subscription = filter.subscriptions.filter(function(s) s instanceof SpecialSubscription)[0];
+ if (subscription)
+ FilterStorage.addFilter(newFilter, subscription, subscription.filters.indexOf(filter));
+ }
+ FilterStorage.removeFilter(filter);
+
+ // Update display
+ for (let i = 0; i < treeView.allData.length; i++)
+ if (treeView.allData[i].filter == filter)
+ treeView.allData[i].filter = null;
+ treeView.boxObject.invalidate();
+}
+
+function copyToClipboard() {
+ var items = treeView.getAllSelectedItems();
+ if (!items.length)
+ return;
+
+ Utils.clipboardHelper.copyString(items.map(function(item) {return item.location}).join(IO.lineBreak));
+}
+
+function copyFilter() {
+ var items = treeView.getAllSelectedItems().filter(function(item) {return item.filter});
+ if (treeView.data && !treeView.data.length)
+ items = [treeView.getDummyTooltip()];
+
+ if (!items.length)
+ return;
+
+ Utils.clipboardHelper.copyString(items.map(function(item) {return item.filter.text}).join(IO.lineBreak));
+}
+
+function selectAll() {
+ treeView.selectAll();
+}
+
+// Saves sidebar's state before detaching/reattaching
+function saveState() {
+ var focused = document.commandDispatcher.focusedElement;
+ while (focused && (!focused.id || !("focus" in focused)))
+ focused = focused.parentNode;
+
+ // Calculate default position for the detached window
+ var boxObject = document.documentElement.boxObject;
+ var position = {screenX: boxObject.screenX, screenY: boxObject.screenY, width: boxObject.width, height: boxObject.height};
+
+ var params = {
+ filter: treeView.filter,
+ focus: (focused ? focused.id : null),
+ position: position
+ };
+ Utils.setParams(params);
+}
+
+// closes the sidebar
+function doClose()
+{
+ mainWin.document.getElementById("abp-command-sidebar").doCommand();
+}
+
+// detaches/reattaches the sidebar
+function detach(doDetach)
+{
+ saveState();
+
+ // Store variables locally, global variables will go away when we are closed
+ let myPrefs = Prefs;
+ let myMainWin = mainWin;
+
+ // Close sidebar and open detached window
+ myMainWin.document.getElementById("abp-command-sidebar").doCommand();
+ myPrefs.detachsidebar = doDetach;
+ myMainWin.document.getElementById("abp-command-sidebar").doCommand();
+}
+
+// Returns items size in the document if available
+function getItemSize(item)
+{
+ if (item.filter && !item.filter.disabled && item.filter instanceof BlockingFilter)
+ return null;
+
+ for each (let node in item.nodes)
+ {
+ if (node instanceof HTMLImageElement && (node.naturalWidth || node.naturalHeight))
+ return [node.naturalWidth, node.naturalHeight];
+ else if (node instanceof HTMLElement && (node.offsetWidth || node.offsetHeight))
+ return [node.offsetWidth, node.offsetHeight];
+ }
+ return null;
+}
+
+// Sort functions for the item list
+function sortByAddress(item1, item2) {
+ if (item1.location < item2.location)
+ return -1;
+ else if (item1.location > item2.location)
+ return 1;
+ else
+ return 0;
+}
+
+function sortByAddressDesc(item1, item2) {
+ return -sortByAddress(item1, item2);
+}
+
+function compareType(item1, item2) {
+ if (item1.localizedDescr < item2.localizedDescr)
+ return -1;
+ else if (item1.localizedDescr > item2.localizedDescr)
+ return 1;
+ else
+ return 0;
+}
+
+function compareFilter(item1, item2) {
+ var hasFilter1 = (item1.filter ? 1 : 0);
+ var hasFilter2 = (item2.filter ? 1 : 0);
+ if (hasFilter1 != hasFilter2)
+ return hasFilter1 - hasFilter2;
+ else if (hasFilter1 && item1.filter.text < item2.filter.text)
+ return -1;
+ else if (hasFilter1 && item1.filter.text > item2.filter.text)
+ return 1;
+ else
+ return 0;
+}
+
+function compareState(item1, item2) {
+ var state1 = (!item1.filter ? 0 : (item1.filter.disabled ? 1 : (item1.filter instanceof WhitelistFilter ? 2 : 3)));
+ var state2 = (!item2.filter ? 0 : (item2.filter.disabled ? 1 : (item2.filter instanceof WhitelistFilter ? 2 : 3)));
+ return state1 - state2;
+}
+
+function compareSize(item1, item2) {
+ var size1 = getItemSize(item1);
+ size1 = size1 ? size1[0] * size1[1] : 0;
+
+ var size2 = getItemSize(item2);
+ size2 = size2 ? size2[0] * size2[1] : 0;
+ return size1 - size2;
+}
+
+function compareDocDomain(item1, item2)
+{
+ if (item1.docDomain < item2.docDomain)
+ return -1;
+ else if (item1.docDomain > item2.docDomain)
+ return 1;
+ else if (item1.thirdParty && !item2.thirdParty)
+ return -1;
+ else if (!item1.thirdParty && item2.thirdParty)
+ return 1;
+ else
+ return 0;
+}
+
+function compareFilterSource(item1, item2)
+{
+ let subs1 = item1.filter ? item1.filter.subscriptions.map(function(s) s.title).join(", ") : "";
+ let subs2 = item2.filter ? item2.filter.subscriptions.map(function(s) s.title).join(", ") : "";
+ if (subs1 < subs2)
+ return -1;
+ else if (subs1 > subs2)
+ return 1;
+ else
+ return 0;
+}
+
+function createSortWithFallback(cmpFunc, fallbackFunc, desc) {
+ var factor = (desc ? -1 : 1);
+ return function(item1, item2) {
+ var ret = cmpFunc(item1, item2);
+ if (ret == 0)
+ return fallbackFunc(item1, item2);
+ else
+ return factor * ret;
+ }
+}
+
+// Item list's tree view object
+var treeView = {
+ //
+ // nsISupports implementation
+ //
+
+ QueryInterface: function(uuid) {
+ if (!uuid.equals(Ci.nsISupports) &&
+ !uuid.equals(Ci.nsITreeView))
+ {
+ throw Cr.NS_ERROR_NO_INTERFACE;
+ }
+
+ return this;
+ },
+
+ //
+ // nsITreeView implementation
+ //
+
+ selection: null,
+
+ setTree: function(boxObject) {
+ if (!boxObject)
+ return;
+ this.boxObject = boxObject;
+ this.itemsDummy = boxObject.treeBody.getAttribute("noitemslabel");
+ this.whitelistDummy = boxObject.treeBody.getAttribute("whitelistedlabel");
+ var stringAtoms = ["col-address", "col-type", "col-filter", "col-state", "col-size", "col-docDomain", "col-filterSource", "state-regular", "state-filtered", "state-whitelisted", "state-hidden", "state-hiddenexception"];
+ var boolAtoms = ["selected", "dummy", "filter-disabled"];
+ var atomService = Cc["@mozilla.org/atom-service;1"].getService(Ci.nsIAtomService);
+ this.atoms = {};
+ for each (let atom in stringAtoms)
+ this.atoms[atom] = atomService.getAtom(atom);
+ for each (let atom in boolAtoms)
+ {
+ this.atoms[atom + "-true"] = atomService.getAtom(atom + "-true");
+ this.atoms[atom + "-false"] = atomService.getAtom(atom + "-false");
+ }
+
+ this.itemsDummyTooltip = Utils.getString("no_blocking_suggestions");
+ this.whitelistDummyTooltip = Utils.getString("whitelisted_page");
+
+ // Check current sort direction
+ var cols = document.getElementsByTagName("treecol");
+ var sortDir = null;
+ for (let i = 0; i < cols.length; i++) {
+ var col = cols[i];
+ var dir = col.getAttribute("sortDirection");
+ if (dir && dir != "natural") {
+ this.sortColumn = col;
+ sortDir = dir;
+ }
+ }
+ if (!this.sortColumn)
+ {
+ let defaultSort = E("list").getAttribute("defaultSort");
+ let match = /^(\w+)\s+(ascending|descending)$/.exec(defaultSort);
+ if (match)
+ {
+ this.sortColumn = E(match[1]);
+ if (this.sortColumn)
+ {
+ sortDir = match[2];
+ this.sortColumn.setAttribute("sortDirection", sortDir);
+ }
+ }
+ }
+
+ if (sortDir)
+ {
+ this.sortProc = this.sortProcs[this.sortColumn.id + (sortDir == "descending" ? "Desc" : "")];
+ E("list").setAttribute("defaultSort", " ");
+ }
+
+ // Make sure to update the dummy row every two seconds
+ setInterval(function(view) {
+ if (!view.data || !view.data.length)
+ view.boxObject.invalidateRow(0);
+ }, 2000, this);
+
+ // Prevent a reference through closures
+ boxObject = null;
+ },
+ get rowCount() {
+ return (this.data && this.data.length ? this.data.length : 1);
+ },
+ getCellText: function(row, col) {
+ col = col.id;
+ if (col != "type" && col != "address" && col != "filter" && col != "size" && col != "docDomain" && col != "filterSource")
+ return "";
+ if (this.data && this.data.length) {
+ if (row >= this.data.length)
+ return "";
+ if (col == "type")
+ return this.data[row].localizedDescr;
+ else if (col == "filter")
+ return (this.data[row].filter ? this.data[row].filter.text : "");
+ else if (col == "size")
+ {
+ let size = getItemSize(this.data[row]);
+ return (size ? size.join(" x ") : "");
+ }
+ else if (col == "docDomain")
+ return this.data[row].docDomain + " " + (this.data[row].thirdParty ? docDomainThirdParty : docDomainFirstParty);
+ else if (col == "filterSource")
+ {
+ if (!this.data[row].filter)
+ return "";
+
+ return this.data[row].filter.subscriptions.filter(function(s) !s.disabled).map(function(s) s.title).join(", ");
+ }
+ else
+ return this.data[row].location;
+ }
+ else {
+ // Empty list, show dummy
+ if (row > 0 || (col != "address" && col != "filter"))
+ return "";
+ if (col == "filter") {
+ var filter = Policy.isWindowWhitelisted(window.content);
+ return filter ? filter.text : "";
+ }
+
+ return (Policy.isWindowWhitelisted(window.content) ? this.whitelistDummy : this.itemsDummy);
+ }
+ },
+
+ generateProperties: function(list, properties)
+ {
+ if (properties)
+ {
+ // Gecko 21 and below: we have an nsISupportsArray parameter, add atoms
+ // to that.
+ for (let i = 0; i < list.length; i++)
+ if (list[i] in this.atoms)
+ properties.AppendElement(this.atoms[list[i]]);
+ return null;
+ }
+ else
+ {
+ // Gecko 22+: no parameter, just return a string
+ return list.join(" ");
+ }
+ },
+
+ getColumnProperties: function(col, properties)
+ {
+ return this.generateProperties(["col-" + col.id], properties);
+ },
+
+ getRowProperties: function(row, properties)
+ {
+ if (row >= this.rowCount)
+ return "";
+
+ let list = [];
+ list.push("selected-" + this.selection.isSelected(row));
+
+ let state;
+ if (this.data && this.data.length) {
+ list.push("dummy-false");
+
+ let filter = this.data[row].filter;
+ if (filter)
+ list.push("filter-disabled-" + filter.disabled);
+
+ state = "state-regular";
+ if (filter && !filter.disabled)
+ {
+ if (filter instanceof WhitelistFilter)
+ state = "state-whitelisted";
+ else if (filter instanceof BlockingFilter)
+ state = "state-filtered";
+ else if (filter instanceof ElemHideFilter)
+ state = "state-hidden";
+ else if (filter instanceof ElemHideException)
+ state = "state-hiddenexception";
+ }
+ }
+ else {
+ list.push("dummy-true");
+
+ state = "state-filtered";
+ if (this.data && Policy.isWindowWhitelisted(window.content))
+ state = "state-whitelisted";
+ }
+ list.push(state);
+ return this.generateProperties(list, properties);
+ },
+
+ getCellProperties: function(row, col, properties)
+ {
+ return this.getRowProperties(row, properties) + " " + this.getColumnProperties(col, properties);
+ },
+
+ cycleHeader: function(col) {
+ col = col.id;
+
+ col = E(col);
+ if (!col)
+ return;
+
+ var cycle = {
+ natural: 'ascending',
+ ascending: 'descending',
+ descending: 'natural'
+ };
+
+ var curDirection = "natural";
+ if (this.sortColumn == col)
+ curDirection = col.getAttribute("sortDirection");
+ else if (this.sortColumn)
+ this.sortColumn.removeAttribute("sortDirection");
+
+ curDirection = cycle[curDirection];
+
+ if (curDirection == "natural")
+ this.sortProc = null;
+ else
+ this.sortProc = this.sortProcs[col.id + (curDirection == "descending" ? "Desc" : "")];
+
+ if (this.data)
+ this.refilter();
+
+ col.setAttribute("sortDirection", curDirection);
+ this.sortColumn = col;
+
+ this.boxObject.invalidate();
+ },
+
+ isSorted: function() {
+ return this.sortProc;
+ },
+
+ isContainer: function() {return false},
+ isContainerOpen: function() {return false},
+ isContainerEmpty: function() {return false},
+ getLevel: function() {return 0},
+ getParentIndex: function() {return -1},
+ hasNextSibling: function() {return false},
+ toggleOpenState: function() {},
+ canDrop: function() {return false},
+ drop: function() {},
+ getCellValue: function() {return null},
+ getProgressMode: function() {return null},
+ getImageSrc: function() {return null},
+ isSeparator: function() {return false},
+ isEditable: function() {return false},
+ cycleCell: function() {},
+ performAction: function() {},
+ performActionOnRow: function() {},
+ performActionOnCell: function() {},
+ selectionChanged: function() {},
+
+ //
+ // Custom properties and methods
+ //
+
+ boxObject: null,
+ atoms: null,
+ filter: "",
+ data: null,
+ allData: [],
+ dataMap: {__proto__: null},
+ sortColumn: null,
+ sortProc: null,
+ resortTimeout: null,
+ itemsDummy: null,
+ whitelistDummy: null,
+ itemsDummyTooltip: null,
+ whitelistDummyTooltip: null,
+ itemToSelect: null,
+
+ sortProcs: {
+ address: sortByAddress,
+ addressDesc: sortByAddressDesc,
+ type: createSortWithFallback(compareType, sortByAddress, false),
+ typeDesc: createSortWithFallback(compareType, sortByAddress, true),
+ filter: createSortWithFallback(compareFilter, sortByAddress, false),
+ filterDesc: createSortWithFallback(compareFilter, sortByAddress, true),
+ state: createSortWithFallback(compareState, sortByAddress, false),
+ stateDesc: createSortWithFallback(compareState, sortByAddress, true),
+ size: createSortWithFallback(compareSize, sortByAddress, false),
+ sizeDesc: createSortWithFallback(compareSize, sortByAddress, true),
+ docDomain: createSortWithFallback(compareDocDomain, sortByAddress, false),
+ docDomainDesc: createSortWithFallback(compareDocDomain, sortByAddress, true),
+ filterSource: createSortWithFallback(compareFilterSource, sortByAddress, false),
+ filterSourceDesc: createSortWithFallback(compareFilterSource, sortByAddress, true)
+ },
+ clearData: function(data) {
+ var oldRows = this.rowCount;
+ this.allData = [];
+ this.dataMap = {__proto__: null};
+ this.refilter();
+
+ this.boxObject.rowCountChanged(0, -oldRows);
+ this.boxObject.rowCountChanged(0, this.rowCount);
+ },
+
+ addItem: function(/**Node*/ node, /**RequestEntry*/ item, /**Boolean*/ scanComplete)
+ {
+ // Merge duplicate entries
+ let key = item.location + " " + item.type + " " + item.docDomain;
+ if (key in this.dataMap)
+ {
+ // We know this item already - take over the filter if any and be done with it
+ let existing = this.dataMap[key];
+ if (item.filter)
+ existing.filter = item.filter;
+
+ existing.nodes.push(node);
+ this.invalidateItem(existing);
+ return;
+ }
+
+ // Add new item to the list
+ // Store original item in orig property - reading out prototype is messed up in Gecko 1.9.2
+ item = {__proto__: item, orig: item, nodes: [node]};
+ this.allData.push(item);
+ this.dataMap[key] = item;
+
+ // Show disabled filters if no other filter applies
+ if (!item.filter)
+ item.filter = disabledMatcher.matchesAny(item.location, item.typeDescr, item.docDomain, item.thirdParty);
+
+ if (!this.matchesFilter(item))
+ return;
+
+ let index = -1;
+ if (this.sortProc && this.sortColumn && this.sortColumn.id == "size")
+ {
+ // Sorting by size requires accessing content document, and that's
+ // dangerous from a content policy (and we are likely called directly
+ // from a content policy call). Size data will be inaccurate anyway,
+ // delay sorting until later.
+ if (this.resortTimeout)
+ clearTimeout(this.resortTimeout);
+ this.resortTimeout = setTimeout(function(me)
+ {
+ if (me.sortProc)
+ me.data.sort(me.sortProc);
+ me.boxObject.invalidate();
+ }, 500, this);
+ }
+ else if (this.sortProc)
+ for (var i = 0; index < 0 && i < this.data.length; i++)
+ if (this.sortProc(item, this.data[i]) < 0)
+ index = i;
+
+ if (index >= 0)
+ this.data.splice(index, 0, item);
+ else {
+ this.data.push(item);
+ index = this.data.length - 1;
+ }
+
+ if (this.data.length == 1)
+ this.boxObject.invalidateRow(0);
+ else
+ this.boxObject.rowCountChanged(index, 1);
+
+ if (this.itemToSelect == key)
+ {
+ this.selection.select(index);
+ this.boxObject.ensureRowIsVisible(index);
+ this.itemToSelect = null;
+ }
+ else if (!scanComplete && this.selection.currentIndex >= 0) // Keep selected row visible while scanning
+ this.boxObject.ensureRowIsVisible(this.selection.currentIndex);
+ },
+
+ updateFilters: function()
+ {
+ for each (let item in this.allData)
+ {
+ if (item.filter instanceof RegExpFilter && item.filter.disabled)
+ delete item.filter;
+ if (!item.filter)
+ item.filter = disabledMatcher.matchesAny(item.location, item.typeDescr, item.docDomain, item.thirdParty);
+ }
+ this.refilter();
+ },
+
+ /**
+ * Updates the list after a filter or sorting change.
+ */
+ refilter: function()
+ {
+ if (this.resortTimeout)
+ clearTimeout(this.resortTimeout);
+
+ this.data = this.allData.filter(this.matchesFilter, this);
+
+ if (this.sortProc)
+ this.data.sort(this.sortProc);
+ },
+
+ /**
+ * Tests whether an item matches current list filter.
+ * @return {Boolean} true if the item should be shown
+ */
+ matchesFilter: function(item)
+ {
+ if (!this.filter)
+ return true;
+
+ return (item.location.toLowerCase().indexOf(this.filter) >= 0 ||
+ (item.filter && item.filter.text.toLowerCase().indexOf(this.filter) >= 0) ||
+ item.typeDescr.toLowerCase().indexOf(this.filter.replace(/-/g, "_")) >= 0 ||
+ item.localizedDescr.toLowerCase().indexOf(this.filter) >= 0 ||
+ (item.docDomain && item.docDomain.toLowerCase().indexOf(this.filter) >= 0) ||
+ (item.docDomain && item.thirdParty && docDomainThirdParty.toLowerCase().indexOf(this.filter) >= 0) ||
+ (item.docDomain && !item.thirdParty && docDomainFirstParty.toLowerCase().indexOf(this.filter) >= 0));
+ },
+
+ setFilter: function(filter) {
+ var oldRows = this.rowCount;
+
+ this.filter = filter.toLowerCase();
+ this.refilter();
+
+ var newRows = this.rowCount;
+ if (oldRows != newRows)
+ this.boxObject.rowCountChanged(oldRows < newRows ? oldRows : newRows, this.rowCount - oldRows);
+ this.boxObject.invalidate();
+ },
+
+ selectAll: function() {
+ this.selection.selectAll();
+ },
+
+ getSelectedItem: function() {
+ if (!this.data || this.selection.currentIndex < 0 || this.selection.currentIndex >= this.data.length)
+ return null;
+
+ return this.data[this.selection.currentIndex];
+ },
+
+ getAllSelectedItems: function() {
+ let result = [];
+ if (!this.data)
+ return result;
+
+ let numRanges = this.selection.getRangeCount();
+ for (let i = 0; i < numRanges; i++)
+ {
+ let min = {};
+ let max = {};
+ let range = this.selection.getRangeAt(i, min, max);
+ for (let j = min.value; j <= max.value; j++)
+ {
+ if (j >= 0 && j < this.data.length)
+ result.push(this.data[j]);
+ }
+ }
+ return result;
+ },
+
+ getItemAt: function(x, y)
+ {
+ if (!this.data)
+ return null;
+
+ var row = this.boxObject.getRowAt(x, y);
+ if (row < 0 || row >= this.data.length)
+ return null;
+
+ return this.data[row];
+ },
+
+ getColumnAt: function(x, y)
+ {
+ if (!this.data)
+ return null;
+
+ let col = {};
+ this.boxObject.getCellAt(x, y, {}, col, {});
+ return (col.value ? col.value.id : null);
+ },
+
+ getDummyTooltip: function() {
+ if (!this.data || this.data.length)
+ return null;
+
+ var filter = Policy.isWindowWhitelisted(window.content);
+ if (filter)
+ return {tooltip: this.whitelistDummyTooltip, filter: filter};
+ else
+ return {tooltip: this.itemsDummyTooltip};
+ },
+
+ invalidateItem: function(item)
+ {
+ let row = this.data.indexOf(item);
+ if (row >= 0)
+ this.boxObject.invalidateRow(row);
+ }
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebar.xul b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebar.xul
new file mode 100644
index 0000000..180b3ec
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebar.xul
@@ -0,0 +1,139 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://adblockplus/skin/sidebar.css" type="text/css"?>
+
+<!DOCTYPE page SYSTEM "chrome://adblockplus/locale/sidebar.dtd">
+
+<page
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ id="abp-sidebar"
+ onload="init()"
+ onunload="cleanUp()"
+ docDomainThirdParty="&docDomain.thirdParty;"
+ docDomainFirstParty="&docDomain.firstParty;">
+
+ <script type="application/x-javascript;version=1.7" src="utils.js"/>
+ <script type="application/x-javascript;version=1.7" src="sidebar.js"/>
+ <script type="application/x-javascript;version=1.7" src="flasher.js"/>
+
+ <keyset id="sidebarKeys">
+ <key id="block-key" keycode="VK_ENTER"/>
+ <key id="copy-key" modifiers="accel" key="C" command="copy-command"/>
+ <key id="selectAll-key" modifiers="accel" key="A" command="selectAll-command"/>
+ </keyset>
+
+ <commandset id="sidebarCommands">
+ <command id="copy-command" oncommand="copyToClipboard()" disabled="true"/>
+ <command id="selectAll-command" oncommand="selectAll()"/>
+ </commandset>
+
+ <popupset id="sidebarPopups">
+ <tooltip id="tooltip" orient="vertical" onpopupshowing="fillInTooltip(event);">
+ <description id="tooltipDummy"/>
+ <hbox id="tooltipPreviewBox" pack="start">
+ <image id="tooltipPreview" validate="never"/>
+ </hbox>
+ <grid>
+ <columns>
+ <column/>
+ <column flex="1"/>
+ </columns>
+ <rows>
+ <row id="tooltipAddressRow" align="top">
+ <label value="&tooltip.address.label;"/>
+ <vbox id="tooltipAddress"/>
+ </row>
+ <row id="tooltipTypeRow">
+ <label value="&tooltip.type.label;"/>
+ <description id="tooltipType" filtered="&tooltip.type.blocked;" whitelisted="&tooltip.type.whitelisted;"/>
+ </row>
+ <row id="tooltipSizeRow">
+ <label value="&tooltip.size.label;"/>
+ <description id="tooltipSize"/>
+ </row>
+ <row id="tooltipDocDomainRow">
+ <label value="&tooltip.docDomain.label;"/>
+ <description id="tooltipDocDomain"/>
+ </row>
+ <row id="tooltipFilterRow" align="top">
+ <label value="&tooltip.filter.label;"/>
+ <vbox id="tooltipFilter" disabledText="&tooltip.filter.disabled;"/>
+ </row>
+ <row id="tooltipFilterSourceRow" align="top">
+ <label value="&tooltip.filterSource.label;"/>
+ <vbox id="tooltipFilterSource"/>
+ </row>
+ </rows>
+ </grid>
+ </tooltip>
+
+ <menupopup id="context" onpopupshowing="return fillInContext(event)">
+ <menuitem id="contextBlock" label="&context.block.label;…" oncommand="doBlock()" key="block-key"/>
+ <menuitem id="contextWhitelist" label="&context.whitelist.label;…" oncommand="doBlock()" key="block-key"/>
+ <menuitem id="contextEditFilter" label="&context.editfilter.label;…" oncommand="editFilter()"/>
+ <menuitem id="contextDisableFilter" labeltempl="&context.disablefilter.label;" oncommand="enableFilter(treeView.getSelectedItem().filter, false)"/>
+ <menuitem id="contextEnableFilter" labeltempl="&context.enablefilter.label;" oncommand="enableFilter(treeView.getSelectedItem().filter, true)"/>
+ <menuitem id="contextDisableOnSite" labeltempl="&context.disablefilteronsite.label;" oncommand="disableOnSite()"/>
+ <menuseparator id="contextOpenSep"/>
+ <menuitem id="contextOpen" label="&context.open.label;" oncommand="openInTab(null, event)"/>
+ <menuitem id="contextFlash" label="&context.flash.label;" oncommand="onSelectionChange()"/>
+ <menuitem id="contextCopy" label="&context.copy.label;" command="copy-command" key="copy-key"/>
+ <menuitem id="contextCopyFilter" label="&context.copyFilter.label;" oncommand="copyFilter()"/>
+ <menuseparator id="contextSelectSep"/>
+ <menuitem id="contextSelectAll" label="&context.selectAll.label;" command="selectAll-command" key="selectAll-key"/>
+ </menupopup>
+ </popupset>
+
+ <hbox>
+ <hbox align="center" flex="1">
+ <label value="&search.label;" control="searchField"/>
+ <textbox id="searchField" flex="1" type="search" oncommand="treeView.setFilter(this.value)"/>
+ </hbox>
+ <description id="detachButton" value="&detach.label;" onclick="detach(true)"/>
+ <description id="reattachButton" value="&reattach.label;" onclick="if (this.getAttribute('disabled') != 'true') detach(false)" hidden="true"/>
+ </hbox>
+
+ <tree id="list" context="context" flex="1" seltype="multiple" enableColumnDrag="true"
+ defaultSort="state descending" persist="defaultSort"
+ onkeypress="if (event.keyCode == event.DOM_VK_RETURN || event.keyCode == event.DOM_VK_ENTER) doBlock()">
+ <treecols>
+ <treecol id="address" label="&address.label;" flex="2" crop="center" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="filter" label="&filter.label;" flex="1" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="type" label="&type.label;" width="80" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="state" label="&state.label;" width="16" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="size" label="&size.label;" width="60" hidden="true" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="docDomain" label="&docDomain.label;" width="100" hidden="true" persist="width ordinal sortDirection hidden"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="filterSource" label="&filterSource.label;" width="100" hidden="true" persist="width ordinal sortDirection hidden"/>
+ </treecols>
+ <treechildren id="treechildren"
+ tooltip="tooltip"
+ onclick="handleClick(event)"
+ ondblclick="handleDblClick(event)"
+ noitemslabel="&noitems.label;"
+ whitelistedlabel="&whitelisted.label;"/>
+ </tree>
+</page>
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebarDetached.xul b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebarDetached.xul
new file mode 100644
index 0000000..b7e117b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/sidebarDetached.xul
@@ -0,0 +1,50 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+
+<!DOCTYPE page SYSTEM "chrome://adblockplus/locale/sidebar.dtd">
+
+<window
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ id="abpDetachedSidebar"
+ title="&detached.title;"
+ persist="screenX screenY width height sizemode"
+ onclose="document.getElementById('abp-command-sidebar').doCommand(); return false;">
+
+ <script type="application/x-javascript">
+ // Some people actually switch off browser.frames.enabled and are surprised
+ // that things stop working...
+ window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+ .getInterface(Components.interfaces.nsIWebNavigation)
+ .QueryInterface(Components.interfaces.nsIDocShell)
+ .allowSubframes = true;
+ </script>
+
+ <keyset>
+ <key keycode="VK_ESCAPE" command="command-close"/>
+ <key modifiers="accel" key="w" command="command-close"/>
+ </keyset>
+
+ <commandset>
+ <command id="command-close" oncommand="document.getElementById('sidebarFrame').contentWindow.doClose()"/>
+ </commandset>
+
+ <iframe src="sidebar.xul" id="sidebarFrame" flex="1"/>
+</window>
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptionSelection.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptionSelection.js
new file mode 100644
index 0000000..3fdcc18
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptionSelection.js
@@ -0,0 +1,308 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/FileUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+let subscriptionListLoading = false;
+
+function init()
+{
+ if (window.arguments && window.arguments.length && window.arguments[0])
+ {
+ let source = window.arguments[0];
+ setCustomSubscription(source.title, source.url,
+ source.mainSubscriptionTitle, source.mainSubscriptionURL);
+
+ E("all-subscriptions-container").hidden = true;
+ E("fromWebText").hidden = false;
+ }
+ else
+ loadSubscriptionList();
+}
+
+function updateSubscriptionInfo()
+{
+ let selectedSubscription = E("all-subscriptions").selectedItem;
+
+ E("subscriptionInfo").setAttribute("invisible", !selectedSubscription);
+ if (selectedSubscription)
+ {
+ let url = selectedSubscription.getAttribute("_url");
+ let homePage = selectedSubscription.getAttribute("_homepage")
+
+ let viewLink = E("view-list");
+ viewLink.setAttribute("_url", url);
+ viewLink.setAttribute("tooltiptext", url);
+
+ let homePageLink = E("visit-homepage");
+ homePageLink.hidden = !homePage;
+ if (homePage)
+ {
+ homePageLink.setAttribute("_url", homePage);
+ homePageLink.setAttribute("tooltiptext", homePage);
+ }
+ }
+}
+
+function reloadSubscriptionList()
+{
+ subscriptionListLoading = false;
+ loadSubscriptionList();
+}
+
+function loadSubscriptionList()
+{
+ if (subscriptionListLoading)
+ return;
+
+ E("all-subscriptions-container").selectedIndex = 0;
+ E("all-subscriptions-loading").hidden = false;
+
+ let request = new XMLHttpRequest();
+ let errorHandler = function()
+ {
+ E("all-subscriptions-container").selectedIndex = 2;
+ E("all-subscriptions-loading").hidden = true;
+ };
+ let successHandler = function()
+ {
+ if (!request.responseXML || request.responseXML.documentElement.localName != "subscriptions")
+ {
+ errorHandler();
+ return;
+ }
+
+ try
+ {
+ processSubscriptionList(request.responseXML);
+ E("all-subscriptions").selectedIndex = 0;
+ E("all-subscriptions").focus();
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ errorHandler();
+ }
+ };
+
+ request.open("GET", Prefs.subscriptions_listurl);
+ request.addEventListener("error", errorHandler, false);
+ request.addEventListener("load", successHandler, false);
+ request.send(null);
+
+ subscriptionListLoading = true;
+}
+
+function processSubscriptionList(doc)
+{
+ let list = E("all-subscriptions");
+ while (list.firstChild)
+ list.removeChild(list.firstChild);
+
+ addSubscriptions(list, doc.documentElement, 0, null, null);
+ E("all-subscriptions-container").selectedIndex = 1;
+ E("all-subscriptions-loading").hidden = true;
+}
+
+function addSubscriptions(list, parent, level, parentTitle, parentURL)
+{
+ for (let i = 0; i < parent.childNodes.length; i++)
+ {
+ let node = parent.childNodes[i];
+ if (node.nodeType != Node.ELEMENT_NODE || node.localName != "subscription")
+ continue;
+
+ if (node.getAttribute("type") != "ads" || node.getAttribute("deprecated") == "true")
+ continue;
+
+ let variants = node.getElementsByTagName("variants");
+ if (!variants.length || !variants[0].childNodes.length)
+ continue;
+ variants = variants[0].childNodes;
+
+ let isFirst = true;
+ let mainTitle = null;
+ let mainURL = null;
+ for (let j = 0; j < variants.length; j++)
+ {
+ let variant = variants[j];
+ if (variant.nodeType != Node.ELEMENT_NODE || variant.localName != "variant")
+ continue;
+
+ let item = document.createElement("richlistitem");
+ item.setAttribute("_title", variant.getAttribute("title"));
+ item.setAttribute("_url", variant.getAttribute("url"));
+ if (parentTitle && parentURL && variant.getAttribute("complete") != "true")
+ {
+ item.setAttribute("_supplementForTitle", parentTitle);
+ item.setAttribute("_supplementForURL", parentURL);
+ }
+ item.setAttribute("tooltiptext", variant.getAttribute("url"));
+ item.setAttribute("_homepage", node.getAttribute("homepage"));
+
+ let title = document.createElement("description");
+ if (isFirst)
+ {
+ if (Utils.checkLocalePrefixMatch(node.getAttribute("prefixes")))
+ title.setAttribute("class", "subscriptionTitle localeMatch");
+ else
+ title.setAttribute("class", "subscriptionTitle");
+ title.textContent = node.getAttribute("title") + " (" + node.getAttribute("specialization") + ")";
+ mainTitle = variant.getAttribute("title");
+ mainURL = variant.getAttribute("url");
+ isFirst = false;
+ }
+ title.setAttribute("flex", "1");
+ title.style.marginLeft = (20 * level) + "px";
+ item.appendChild(title);
+
+ let variantTitle = document.createElement("description");
+ variantTitle.setAttribute("class", "variant");
+ variantTitle.textContent = variant.getAttribute("title");
+ variantTitle.setAttribute("crop", "end");
+ item.appendChild(variantTitle);
+
+ list.appendChild(item);
+ }
+
+ let supplements = node.getElementsByTagName("supplements");
+ if (supplements.length)
+ addSubscriptions(list, supplements[0], level + 1, mainTitle, mainURL);
+ }
+}
+
+function onSelectionChange()
+{
+ let selectedItem = E("all-subscriptions").selectedItem;
+ if (!selectedItem)
+ return;
+
+ setCustomSubscription(selectedItem.getAttribute("_title"), selectedItem.getAttribute("_url"),
+ selectedItem.getAttribute("_supplementForTitle"), selectedItem.getAttribute("_supplementForURL"));
+
+ updateSubscriptionInfo();
+}
+
+function setCustomSubscription(title, url, mainSubscriptionTitle, mainSubscriptionURL)
+{
+ E("title").value = title;
+ E("location").value = url;
+
+ let messageElement = E("supplementMessage");
+ let addMainCheckbox = E("addMainSubscription");
+ if (mainSubscriptionURL && !hasSubscription(mainSubscriptionURL))
+ {
+ messageElement.removeAttribute("invisible");
+ addMainCheckbox.removeAttribute("invisible");
+
+ let [, beforeLink, afterLink] = /(.*)\?1\?(.*)/.exec(messageElement.getAttribute("_textTemplate")) || [null, messageElement.getAttribute("_textTemplate"), ""];
+ while (messageElement.firstChild)
+ messageElement.removeChild(messageElement.firstChild);
+ messageElement.appendChild(document.createTextNode(beforeLink));
+ let link = document.createElement("label");
+ link.className = "text-link";
+ link.setAttribute("tooltiptext", mainSubscriptionURL);
+ link.addEventListener("click", function() UI.loadInBrowser(mainSubscriptionURL), false);
+ link.textContent = mainSubscriptionTitle;
+ messageElement.appendChild(link);
+ messageElement.appendChild(document.createTextNode(afterLink));
+
+ addMainCheckbox.value = mainSubscriptionURL;
+ addMainCheckbox.setAttribute("_mainSubscriptionTitle", mainSubscriptionTitle)
+ let [label, accesskey] = Utils.splitLabel(addMainCheckbox.getAttribute("_labelTemplate"));
+ addMainCheckbox.label = label.replace(/\?1\?/g, mainSubscriptionTitle);
+ addMainCheckbox.accessKey = accesskey;
+ }
+ else
+ {
+ messageElement.setAttribute("invisible", "true");
+ addMainCheckbox.setAttribute("invisible", "true");
+ }
+}
+
+function validateURL(url)
+{
+ if (!url)
+ return null;
+ url = url.replace(/^\s+/, "").replace(/\s+$/, "");
+
+ // Is this a file path?
+ try {
+ let file = new FileUtils.File(url);
+ return Services.io.newFileURI(file).spec;
+ } catch (e) {}
+
+ // Is this a valid URL?
+ let uri = Utils.makeURI(url);
+ if (uri)
+ return uri.spec;
+
+ return null;
+}
+
+function addSubscription()
+{
+ let url = E("location").value;
+ url = validateURL(url);
+ if (!url)
+ {
+ Utils.alert(window, Utils.getString("subscription_invalid_location"));
+ E("location").focus();
+ return false;
+ }
+
+ let title = E("title").value.replace(/^\s+/, "").replace(/\s+$/, "");
+ if (!title)
+ title = url;
+
+ doAddSubscription(url, title);
+
+ let addMainCheckbox = E("addMainSubscription")
+ if (addMainCheckbox.getAttribute("invisible") != "true" && addMainCheckbox.checked)
+ {
+ let mainSubscriptionTitle = addMainCheckbox.getAttribute("_mainSubscriptionTitle");
+ let mainSubscriptionURL = validateURL(addMainCheckbox.value);
+ if (mainSubscriptionURL)
+ doAddSubscription(mainSubscriptionURL, mainSubscriptionTitle);
+ }
+
+ return true;
+}
+
+/**
+ * Adds a new subscription to the list.
+ */
+function doAddSubscription(/**String*/ url, /**String*/ title)
+{
+ let subscription = Subscription.fromURL(url);
+ if (!subscription)
+ return;
+
+ FilterStorage.addSubscription(subscription);
+
+ subscription.disabled = false;
+ subscription.title = title;
+
+ if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+ Synchronizer.execute(subscription);
+}
+
+function hasSubscription(url)
+{
+ return FilterStorage.subscriptions.some(function(subscription) subscription instanceof DownloadableSubscription && subscription.url == url);
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptionSelection.xul b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptionSelection.xul
new file mode 100644
index 0000000..17f1854
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptionSelection.xul
@@ -0,0 +1,75 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of Adblock Plus <http://adblockplus.org/>,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://adblockplus/skin/subscriptionSelection.css" type="text/css"?>
+
+<!DOCTYPE dialog SYSTEM "chrome://adblockplus/locale/subscriptionSelection.dtd">
+
+<dialog
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ buttons="accept,cancel"
+ buttonlabelaccept="&addSubscription.label;"
+ title="&dialog.title;"
+ id="abpSubscriptionSelection"
+ windowtype="abp:subscriptionSelection"
+ onload="init();"
+ ondialogaccept="return addSubscription();">
+
+ <script type="application/x-javascript;version=1.7" src="utils.js"/>
+ <script type="application/x-javascript;version=1.7" src="subscriptionSelection.js"/>
+
+ <deck id="all-subscriptions-container" selectedIndex="0" flex="1">
+ <vbox pack="center">
+ <progressmeter id="all-subscriptions-loading" mode="undetermined"/>
+ </vbox>
+ <vbox>
+ <richlistbox id="all-subscriptions" onselect="onSelectionChange()" flex="1"/>
+ <hbox id="subscriptionInfo" invisible="true">
+ <label id="view-list" class="text-link" value="&viewList.label;" onclick="UI.loadInBrowser(this.getAttribute('_url'))"/>
+ <spacer flex="1"/>
+ <label id="visit-homepage" class="text-link" value="&visitHomepage.label;" onclick="UI.loadInBrowser(this.getAttribute('_url'))"/>
+ </hbox>
+ </vbox>
+ <vbox pack="center" align="center">
+ <description value="&list.download.failed;"/>
+ <hbox>
+ <button label="&list.download.retry;" oncommand="reloadSubscriptionList()"/>
+ <button label="&list.download.website;" oncommand="UI.loadDocLink('subscriptions')"/>
+ </hbox>
+ </vbox>
+ </deck>
+
+ <description id="fromWebText" hidden="true">&fromWeb.description;</description>
+
+ <groupbox id="differentSubscription">
+ <label value="&title.label;" control="title"/>
+ <textbox id="title"/>
+
+ <label value="&location.label;" control="location"/>
+ <textbox id="location"/>
+ </groupbox>
+
+ <description id="supplementMessage" invisible="true" _textTemplate="&supplementMessage;">
+ &supplementMessage;
+ <label class="text-link" oncommand="">dummy dummy dummy dummy dummy dummy dummy dummy dummy dummy</label>
+ </description>
+ <checkbox id="addMainSubscription" invisible="true" checked="true" _labelTemplate="&addMain.label;" label="&addMain.label;"/>
+
+</dialog>
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptions.xml b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptions.xml
new file mode 100644
index 0000000..6a05d5e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/subscriptions.xml
@@ -0,0 +1,117 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of the Adblock Plus web scripts,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<subscriptions>
+ <subscription title="EasyList"
+ specialization="English"
+ url="https://easylist-downloads.adblockplus.org/easylist.txt"
+ homepage="https://easylist.adblockplus.org/"
+ prefixes="en"
+ author="fanboy, MonztA, Famlam, Khrin"/>
+ <subscription title="ABPindo+EasyList"
+ specialization="Bahasa Indonesia"
+ url="https://easylist-downloads.adblockplus.org/abpindo+easylist.txt"
+ homepage="http://abpindo.blogspot.com/"
+ prefixes="id"
+ author="heradhis"/>
+ <subscription title="Bulgarian list+EasyList"
+ specialization="българÑки"
+ url="https://easylist-downloads.adblockplus.org/bulgarian_list+easylist.txt"
+ homepage="http://stanev.org/abp/"
+ prefixes="bg"
+ author="ÐлекÑандър Станев"/>
+ <subscription title="EasyList China+EasyList"
+ specialization="中文"
+ url="https://easylist-downloads.adblockplus.org/easylistchina+easylist.txt"
+ homepage="http://abpchina.org/forum/"
+ prefixes="zh"
+ author="John, Li, Jiefei"/>
+ <subscription title="EasyList Czech and Slovak+EasyList"
+ specialization="ÄeÅ¡tina, slovenÄina"
+ url="https://easylist-downloads.adblockplus.org/easylistczechslovak+easylist.txt"
+ homepage="http://adblocksk.tk/"
+ prefixes="cs,sk"
+ author="tomasko126"/>
+ <subscription title="EasyList Dutch+EasyList"
+ specialization="Nederlands"
+ url="https://easylist-downloads.adblockplus.org/easylistdutch+easylist.txt"
+ homepage="https://easylist.adblockplus.org/"
+ prefixes="nl"
+ author="Famlam"/>
+ <subscription title="EasyList Germany+EasyList"
+ specialization="Deutsch"
+ url="https://easylist-downloads.adblockplus.org/easylistgermany+easylist.txt"
+ homepage="https://easylist.adblockplus.org/"
+ prefixes="de"
+ author="MonztA, Famlam"/>
+ <subscription title="EasyList Hebrew+EasyList"
+ specialization="עברית"
+ url="https://easylist-downloads.adblockplus.org/israellist+easylist.txt"
+ homepage="https://github.com/AdBlockPlusIsrael/EasyListHebrew"
+ prefixes="he"
+ author="BsT"/>
+ <subscription title="EasyList Italy+EasyList"
+ specialization="italiano"
+ url="https://easylist-downloads.adblockplus.org/easylistitaly+easylist.txt"
+ homepage="https://easylist.adblockplus.org/"
+ prefixes="it"
+ author="Khrin"/>
+ <subscription title="EasyList Lithuania+EasyList"
+ specialization="lietuvių kalba"
+ url="https://easylist-downloads.adblockplus.org/easylistlithuania+easylist.txt"
+ homepage="http://margevicius.lt/"
+ prefixes="lt"
+ author="Algimantas MargeviÄius"/>
+ <subscription title="Latvian List+EasyList"
+ specialization="latviešu valoda"
+ url="https://easylist-downloads.adblockplus.org/latvianlist+easylist.txt"
+ homepage="http://latvian-list.site11.com/"
+ prefixes="lv"
+ author="anonymous74100"/>
+ <subscription title="Liste AR+Liste FR+EasyList"
+ specialization="العربية"
+ url="https://easylist-downloads.adblockplus.org/liste_ar+liste_fr+easylist.txt"
+ homepage="https://code.google.com/p/liste-ar-adblock/"
+ prefixes="ar"
+ author="smed79"/>
+ <subscription title="Liste FR+EasyList"
+ specialization="français"
+ url="https://easylist-downloads.adblockplus.org/liste_fr+easylist.txt"
+ homepage="http://adblock-listefr.com/"
+ prefixes="fr"
+ author="Lian, Crits, smed79"/>
+ <subscription title="ROList+EasyList"
+ specialization="românesc"
+ url="https://easylist-downloads.adblockplus.org/rolist+easylist.txt"
+ homepage="http://www.zoso.ro/rolist"
+ prefixes="ro"
+ author="MenetZ, Zoso"/>
+ <subscription title="RuAdList+EasyList"
+ specialization="руÑÑкий, українÑька"
+ url="https://easylist-downloads.adblockplus.org/ruadlist+easylist.txt"
+ homepage="https://code.google.com/p/ruadlist/"
+ prefixes="ru,uk"
+ author="Lain_13"/>
+ <subscription title="Wiltteri+EasyList"
+ specialization="suomi"
+ url="https://easylist-downloads.adblockplus.org/wiltteri+easylist.txt"
+ homepage="http://wiltteri.net/"
+ prefixes="fi"
+ author="None"/>
+ </subscriptions> \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/utils.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/utils.js
new file mode 100644
index 0000000..49f6e7f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/content/ui/utils.js
@@ -0,0 +1,66 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cr = Components.results;
+const Cu = Components.utils;
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+/**
+ * Imports a module from Adblock Plus core.
+ */
+function require(/**String*/ module)
+{
+ var result = {};
+ result.wrappedJSObject = result;
+ Services.obs.notifyObservers(result, "adblockplus-require", module);
+ return result.exports;
+}
+
+var {Policy} = require("contentPolicy");
+var {Filter, InvalidFilter, CommentFilter, ActiveFilter, RegExpFilter,
+ BlockingFilter, WhitelistFilter, ElemHideBase, ElemHideFilter, ElemHideException} = require("filterClasses");
+var {FilterNotifier} = require("filterNotifier");
+var {FilterStorage, PrivateBrowsing} = require("filterStorage");
+var {IO} = require("io");
+var {defaultMatcher, Matcher, CombinedMatcher} = require("matcher");
+var {Prefs} = require("prefs");
+var {RequestNotifier} = require("requestNotifier");
+var {Subscription, SpecialSubscription, RegularSubscription,
+ ExternalSubscription, DownloadableSubscription} = require("subscriptionClasses");
+var {Synchronizer} = require("synchronizer");
+var {UI} = require("ui");
+var {Utils} = require("utils");
+
+/**
+ * Shortcut for document.getElementById(id)
+ */
+function E(id)
+{
+ return document.getElementById(id);
+}
+
+/**
+ * Split up all labels into the label and access key portions.
+ */
+document.addEventListener("DOMContentLoaded", function splitAllLabelsHandler()
+{
+ document.removeEventListener("DOMContentLoaded", splitAllLabelsHandler, false);
+ Utils.splitAllLabels(document);
+}, false);
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/composer.dtd
new file mode 100644
index 0000000..54ac458
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "ÙÙŠ &amp;نهاية العنوان">
+<!ENTITY domainRestriction.label "ت&amp;قييد النطاق:">
+<!ENTITY collapse.default.no.label "استخدام Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ (لا)">
+<!ENTITY firstParty.label "الطر٠&amp;Ù†ÙØ³Ù‡ Ùقط">
+<!ENTITY preferences.label "&amp;إعرض الÙلاتر Ø§Ù„Ù…ØªÙˆÙØ±Ø©...">
+<!ENTITY pattern.label "إبحث عن نموذج">
+<!ENTITY thirdParty.label "أطرا٠أ&amp;خرى Ùقط">
+<!ENTITY filter.label "&amp;Ùلتر جديد :">
+<!ENTITY collapse.label "طوي المحجوب: (&amp;س)">
+<!ENTITY match.warning "النموذج الذي أدخلته لم يعد مواÙقا للعنوان الذي يجب أن يحجب أو يسمح به ولن يأثر Ùيه">
+<!ENTITY anchor.start.label "ÙÙŠ ب&amp;داية العنوان">
+<!ENTITY matchCase.label "م&amp;طابقة الحالة">
+<!ENTITY custom.pattern.label "مخ&amp;صص:">
+<!ENTITY unselectAllTypes.label "بدون أي اختيار">
+<!ENTITY type.whitelist.label "قاعدة است&amp;ثناء">
+<!ENTITY regexp.warning "النموذج الذي أدخلته سيتم تعبيره على أنه تعبير العادي، الكثير من التعابير العادية قد تؤدي إلى بطء ÙÙŠ Ø§Ù„ØªØµÙØ­. إن لم تكن تنوي استخدام التعابير العادية، قم Ø¨Ø¥Ø¶Ø§ÙØ© الرمز &quot;*&quot; إلى نهاية النموذج">
+<!ENTITY dialog.title "أض٠قاعدة تصÙية لآدبلوك بلس">
+<!ENTITY basic.label "العرض الأساسي">
+<!ENTITY type.filter.label "&amp;Ùلاتر حجب">
+<!ENTITY types.label "التطبيق على الأنواع:">
+<!ENTITY shortpattern.warning "النموذج الذي أدخلته قصير جداً ليتم تحسينه وقد يبطئ ØªØµÙØ­Ùƒ. ينصح باختيار قيمة أطول لهذا الÙلتر لكي يقوم آدبلوك بلس بÙلترته بطريقة Ø¨ÙƒÙØ§Ø¡Ø©.">
+<!ENTITY collapse.yes.label "نعم">
+<!ENTITY anchors.label "قبول النموذج Ùقط:">
+<!ENTITY collapse.default.yes.label "استخدام Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ (نعم)">
+<!ENTITY domainRestriction.help "استعمل هذا الخيار لتحديد نطاق واحد أو أكثر Ù…ÙØµÙˆÙ„ بالرمز &quot;|&quot;ØŒ سيطبق هذا الÙلتر على هذه النطاقات Ùقط. وضع الرمز &quot;~&quot; قبل اسم نطاق يعني أن الÙلتر يجب ألا يطبق على ذلك النطاق">
+<!ENTITY accept.label "Ø¥Ø¶Ø§ÙØ© Ùلتر">
+<!ENTITY options.label "إعدادات">
+<!ENTITY disabled.warning "آدبلوك بلس معطل حالياً. ما زال يمكنك Ø¥Ø¶Ø§ÙØ© الÙلاتر Ùˆ لكن لن يتم تطبيقهم إلا إذا قمت ب[link]Ø¨ØªÙØ¹ÙŠÙ„ آدبلوك بلس[/link].">
+<!ENTITY anchor.start.flexible.label "ÙÙŠ ب&amp;داية اسم النطاق">
+<!ENTITY collapse.no.label "لا">
+<!ENTITY selectAllTypes.label "اختيار الكل">
+<!ENTITY advanced.label "عرض متقدم">
+<!ENTITY pattern.explanation "هذا النمط يمكن أن يكون أي جزء من عنوان، الرمز (*) يستعمل كاختصار. سيتم تطبيق Ø§Ù„Ù…ØµÙØ§Ø© على العناوين المطابقة للنمط المحدد Ùقط.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/filters.dtd
new file mode 100644
index 0000000..e7691f6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "سيتم استبدال ÙƒØ§ÙØ© عوامل التصÙية المخصصة الخاصة بك بمحتويات المل٠المحدد.هل تريد المتابعه؟">
+<!ENTITY slow.column "&amp;عرض الÙلاتر">
+<!ENTITY enabled.column "مش&amp;غل">
+<!ENTITY subscription.lastDownload.checksumMismatch "ÙØ´Ù„ ØŒ عدم تطابق المجموع الاختباري">
+<!ENTITY noFiltersInGroup.text "المجموعة المختارة ÙØ§Ø±ØºØ©">
+<!ENTITY subscription.actions.label "الإجراءات">
+<!ENTITY filter.selectAll.label "اختيار الكل">
+<!ENTITY backupButton.label "ال&amp;نسخ الاحتياطية والاسترجاع">
+<!ENTITY restore.minVersion.warning "تنبيه : المل٠تم إنشاؤه بواسطة نسخة حديثة لأد بلوك بلس . يجب عليك تحديث أد بلوك بلس قبل عمليةالاستعادة من هذا الملÙ. ">
+<!ENTITY restore.error "لا يمكن معالجة بينات المل٠، من المحتمل أن هذاالمل٠ليس النسخة الاحتياطية لآد بلوك بلس ؟">
+<!ENTITY sort.ascending.label "ترتيب أبجدي (A &gt; Z) (&amp;ص)">
+<!ENTITY sort.label "ترتي&amp;ب حسب">
+<!ENTITY subscription.source.label "قائمة الÙلاتر">
+<!ENTITY hitcount.column "ال&amp;ضغطات">
+<!ENTITY noFilters.text "لا توجد لديك Ùلاتر مخصصة بعد">
+<!ENTITY backup.custom.title "الÙلاتر المخصصة Ùقط">
+<!ENTITY subscription.external.label "تم التحديث من Ø§Ø¶Ø§ÙØ© اخرى">
+<!ENTITY subscription.delete.label "ازالة">
+<!ENTITY noGroupSelected.text "ج">
+<!ENTITY filter.cut.label "قص">
+<!ENTITY restore.default.label "الاسترجاع من النسخة الاحتياطية ?1?">
+<!ENTITY subscription.lastDownload.inProgress "جاري التحميل">
+<!ENTITY subscriptions.tab.label "اشتراكات الÙلتر">
+<!ENTITY sort.descending.label "ت&amp;رتيب أبجدي (Z &gt; A)">
+<!ENTITY filters.remove.warning "أحقاً تريد ازالة الÙلاتر المختارة؟">
+<!ENTITY filter.delete.label "حذÙ">
+<!ENTITY addSubscriptionAdd.label "Ø§Ø¶Ø§ÙØ©">
+<!ENTITY viewMenu.label "عرض">
+<!ENTITY subscription.lastDownload.unknown "غير متاح">
+<!ENTITY addSubscriptionCancel.label "الغاء">
+<!ENTITY subscription.enabled.label "Ù…ÙØ¹Ù‘Ù„">
+<!ENTITY noSubscriptions.text "لم تض٠أي Ùلتر اشتراك حتى الان. لن يصد آد بلÙÙƒ بلَس
+أي شيء بدون هذه الÙلاتر, الرجاء اختيار اشتراكات الÙلاتر
+Ù„Ø§Ø¶Ø§ÙØ© أحدها">
+<!ENTITY subscription.update.label "تحدبث الÙلاتر">
+<!ENTITY dialog.title "ØªÙØ¶ÙŠÙ„ات التصÙية لآد بلÙÙƒ بلَس">
+<!ENTITY addFilter.label "Ø¥&amp;Ø¶Ø§ÙØ© Ùلتر">
+<!ENTITY subscription.minVersion.warning "يتطلب هذا الاشتراك للتصÙية أحدث إصدار آد بلÙÙƒ بلَس ØŒ يجب التحديث إلى الإصدار الأحدث">
+<!ENTITY subscription.lastDownload.invalidURL "ÙØ´Ù„ الأمر، ليس عنوان صحيح">
+<!ENTITY backup.error "حصل هناك خطأ ÙÙŠ Ø¥Ø¶Ø§ÙØ© الÙلاتر إلى المل٠. تأكد من أن المل٠قابل للتعديل Ùˆ لا يتم استخدامه ÙÙŠ برنامج آخر.">
+<!ENTITY filter.moveUp.label "الى الاعلى">
+<!ENTITY addGroup.label "Ø£Ø¶Ø§ÙØ© &amp;مجموعة تصÙية">
+<!ENTITY filter.edit.label "تحرير">
+<!ENTITY subscription.showHideFilters.label "اظهار / Ø§Ø®ÙØ§Ø¡ الÙلاتر">
+<!ENTITY acceptableAds2.label "السماح لب&amp;عض الإعلانات الغير متطÙّلة">
+<!ENTITY addSubscriptionOther.label "Ø¥Ø¶Ø§ÙØ© اشتراك آخر">
+<!ENTITY close.label "اغلاق">
+<!ENTITY sort.none.label "غي&amp;ر مرتب">
+<!ENTITY filter.actions.label "Ø£ÙØ¹Ø§Ù„ الÙلاتر">
+<!ENTITY filter.copy.label "نسخ">
+<!ENTITY filter.moveDown.label "الى الاسÙÙ„">
+<!ENTITY filter.resetHitCounts.label "استرجاع احصائيات الاصابات الصحيحة">
+<!ENTITY readMore.label "قراءة المزيد">
+<!ENTITY subscription.moveUp.label "الى الاعلى">
+<!ENTITY addSubscription.label "إضا&amp;ÙØ© اشتراك إلى Ùلتر">
+<!ENTITY subscription.homepage.label "ØµÙØ­Ø© البداية">
+<!ENTITY backup.complete.title "كل الاشتراكات والÙلاتر">
+<!ENTITY restore.own.label "الاسترجاع من النسخة الاحتياطية الذاتية">
+<!ENTITY restore.complete.warning "سيتم استبدال ÙƒØ§ÙØ© Ø§Ù„ØªÙØ¶ÙŠÙ„ات الخاصة بك ÙÙŠ تصÙية محتويات المل٠المحدد. هل تريد المتابعه؟">
+<!ENTITY filters.tab.label "الÙلاتر المخصصة">
+<!ENTITY backup.label "اعمل نسخة احتياطية جديدة">
+<!ENTITY find.label "بحث (&amp;ج)">
+<!ENTITY subscription.moveDown.label "الى الاسÙÙ„">
+<!ENTITY subscription.lastDownload.connectionError "ÙØ´Ù„ الأمر بسبب ÙØ´Ù„ التحميل">
+<!ENTITY subscription.lastDownload.success "نجاح">
+<!ENTITY subscription.lastDownload.invalidData "ÙØ´Ù„ الأمر، ليست قائمة Ùلاتر صحيحة">
+<!ENTITY filter.paste.label "لصق">
+<!ENTITY subscription.disabledFilters.enable "ØªÙØ¹ÙŠÙ„ الÙلاتر المعطّلة">
+<!ENTITY lasthit.column "&amp;آخر ضغطة">
+<!ENTITY subscription.editTitle.label "تحرير العنوان">
+<!ENTITY subscription.disabledFilters.warning "بعض الÙلاتر ÙÙŠ هذا الاشتراك معطّلة">
+<!ENTITY filter.column "قانون ال&amp;Ùلتر">
+<!ENTITY subscription.lastDownload.label "آخر تحميل">
+<!ENTITY viewList.label "اظهار القائمة">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/firstRun.properties
new file mode 100644
index 0000000..647ee0c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Ø­Ø§ÙØ¸ على خصوصيتك عند استخدام Ø§Ù„Ù…ØªØµÙØ­ بتعطيل التجسس Ùˆ أخÙÙŠ Ù†ÙØ³Ùƒ على الشركات الإعلانية اللتي تحاول أن تتبع كل تحركاتك.
+firstRun_toggle_off=إيقاÙ
+firstRun_feature_tracking=تعطيل التعقب
+firstRun_feature_malware=منع البرامج الضارة
+firstRun_title=تم تثبيت آد بلوك بلس
+firstRun_toggle_on=تشغيل
+firstRun_acceptableAdsExplanation=نود تشجيع مواقع ويب باستخدام الإعلانات واضحة وغير مزعجة. ولهذا السبب وضعنا <a>مبادئ توجيهية صارمة</a> لتحديد الإعلانات المقبولة، والتي تظهر ضمن الإعدادات Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ©. إذا كنت تريد أن تمنع كل الإعلانات يمكنك <a>تعطيل</a> هذا ÙÙŠ بضع ثوان.
+firstRun_contributor_credits=شكر للمساهمين
+firstRun_dataCorruptionWarning=هل تواصل هذه Ø§Ù„ØµÙØ­Ø© الظهور ØŸ <a>اضغط هنا !</a>
+firstRun_acceptableAdsHeadline=سيتم الآن حجب الإعلانات المزعجة
+firstRun_share=أخبر أصدقائك
+firstRun_share_headline=<a>يقدم لنا يد المساعدة</a> ÙÙŠ جعل الإنترنت مكاناً Ø£ÙØ¶Ù„
+firstRun_feature_social_description=خلص تلقائياً Ø§Ù„Ù…ØªØµÙØ­ الخاص بك من وسائل الإعلام الاجتماعية الأزرار، مثل مثل ألÙيس بوك، التي تظهر ÙÙŠ ØµÙØ­Ø§Øª الويب، وتتبع السلوك الخاص بك.
+firstRun_filterlistsReinitializedWarning=ويبدو أن خطأ تسبب ÙÙŠ إزالة جميع قوائم الÙلترات حجب الإعلانات، Ùˆ لم نتمكن من استعادة نسخة احتياطية. ولذلك اضطررنا إلى إعادة تعيين الإعدادات الخاصة بك Ùˆ قائمة الÙلاتر للوضع السابق مع "الإعلانات القبول". الرجاء التحقق من قوائم الÙلترات Ùˆ إعدادات "الإعلانات المقبولة" ÙÙŠ <a>خيارات آدبلوك بلس</a>.
+firstRun_feature_malware_description=إجعل Ø§Ù„ØªØµÙØ­ أكثر أماناً بتعطيل مواقع البرامج الضارة Ø§Ù„Ù…Ø¹Ø±ÙˆÙØ©.
+firstRun_features=آد بلوك بلس يمكنه عمل أشياء أخرى غير حجب الإعلانات
+firstRun_donate=تبرع
+firstRun_donate_label=دعم مشروعنا
+firstRun_feature_social=إزالة أزرار المواقع الإجتماعية
+firstRun_legacySafariWarning=أنت تستخدم نسخة ÙØ¯ÙŠÙ…Ø© من Ù…ØªØµÙØ­ Ø³ÙØ§Ø±Ù‰ وهذه النسخة غير مدعومة من أد بلوك بلس. بحيث من الممكن ان لا يعمل بصورة صحيحة على بعض المواقع. نحن نوصي بشدة ان تقوم بالترقية الى النسخة السادسة 6.1.1 Ù„Ù„Ù…ØªØµÙØ­ Ø³ÙØ§Ø±Ù‰ أو النسخة الأحدث (Ù…ØªÙˆÙØ± على Mac OS X 10.8 Mountain Lion) أو النسخة السابعة 7.0.1 أو الأحدث (Ù…ØªÙˆÙØ± على OS X 10.9 Mavericks) أو تستطيع ان تستخدم أحدث Ø¥ØµØ¯Ø§Ø±Ù„Ù„Ù…ØªØµÙØ­ ÙØ§ÙŠØ±Ùوكس، جوجل كروم أو أوبرا.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/global.properties
new file mode 100644
index 0000000..d626eb5
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=لا توجد عناصر للحجب ÙÙŠ هذه Ø§Ù„ØµÙØ­Ø©
+action3_tooltip=اضغط لتشغيل/تعطيل آدبلوك بلس
+notification_antiadblock_title=Ø¥Ø®ÙØ§Ø¡ الرسائل Ø§Ù„Ù…Ø³ØªÙ‡Ø¯ÙØ©ØŸ
+type_label_script=سكريبت
+filter_elemhide_nocriteria=لم يتم تحديد صيغة للتعر٠على العنصر Ù„Ø¥Ø®ÙØ§Ø¤Ù‡
+blockingGroup_title=قواعد حجب الدعاية
+whitelisted_tooltip=آدبلوك بلس ÙØ¹Ø§Ù„ الآن، Ùˆ لكنه معطل بالنسبة لهذه Ø§Ù„ØµÙØ­Ø©
+type_label_stylesheet=جدول الأنماط
+blocked_count_tooltip=?1? خارج عن ?2?
+type_label_font=الخط
+type_label_popup=Ù†Ø§ÙØ°Ø© منبثقة
+filter_regexp_tooltip=هذا الÙلتر إما "تعبير منطقي" أو أقصر من أن يتم تحسينه. الكثير من هذه الÙلاتر قد تؤدي إلى بطء ÙÙŠ Ø§Ù„ØªØµÙØ­
+action0_tooltip=اضغط لتظهر القائمة المراÙقة، اضغط بالزر الأوسط للتشغيل/التعطيل
+whitelisted_page=تم تعطيل آدبلوك بلس ÙÙŠ Ø§Ù„ØµÙØ­Ø© الحالية
+remove_group_warning=هل تريد حقاً إزالة هذه المجموعة؟
+action1_tooltip=اضغط Ù„ÙØªØ­/إغلاق العناصر المحجوبة، اضغط بالزر الأوسط للتشغيل/ التعطيل
+type_label_xmlhttprequest=طلب XML
+active_tooltip=إن آدبلوك بلس Ù…ÙØ¹Ù„. هناك ?1? اشتراك Ùلتر Ùˆ ?2? Ùلاتر مخصصة قيد الاستعمال
+type_label_document=مستند
+type_label_object_subrequest=طلب ÙØ±Ø¹ÙŠ Ù„Ù„Ø¹Ù†ØµØ±
+whitelistGroup_title=قواعد الاستثتاء
+disabled_tooltip=آدبلوك بلس معطل الآن
+filter_elemhide_duplicate_id=تعري٠واحد Ùقط للعنصر الذي سيتم Ø¥Ø®ÙØ§Ø¤Ù‡ يمكن أن يحدد
+type_label_object=عنصر
+action2_tooltip=اضغط Ù„ÙØªØ­ الخيارات، اضغط بالزر الأوسط للتشغيل/التعطيل
+type_label_subdocument=إطار
+clearStats_warning=هذا سيصÙّر كل احصاءات الÙلاتر ويعطّل تعداد اصابات الÙلاتر. هل تريد التقدم؟
+notification_antiadblock_message=لقد عر٠هذا الموقع بإظهاره رسائل موجهة إلى المستخدمين. هل تريد أن يخÙÙŠ Adblock Plus الرسائل Ø§Ù„Ù…Ø³ØªÙ‡Ø¯ÙØ©ØŸ
+blocked_count_addendum=المسموح به ?1? والمخÙÙŠ ?2?
+subscription_invalid_location=موقع قائمة الÙلتر ليس صحيح كعنوان ويب Ùˆ لا كأسم ملÙ
+type_label_image=صورة
+remove_subscription_warning=هل أنت حقاً راغب بإزالة هذا الاشتراك؟
+type_label_other=أخرى
+mobile_menu_enable=آدبلوك بلس: ØªÙØ¹ÙŠÙ„
+type_label_media=صوت/Ùيديو
+mobile_menu_disable_site=آدبلوك بلس: تعطيل على ?1?
+elemhideGroup_title=قواعد Ø§Ø®ÙØ§Ø¡ العناصر
+mobile_menu_enable_site=آدبلوك بلس: ØªÙØ¹ÙŠÙ„ على ?1?
+type_label_elemhide=مخÙÙŠ
+newGroup_title=مجموعة Ùلترة جديدة
+default_dialog_title=آدبلوك بلس
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/overlay.dtd
new file mode 100644
index 0000000..6214cda
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;نعم">
+<!ENTITY notification.button.no "&amp;لا">
+<!ENTITY sync.label "م&amp;زامنة إعدادات آدبلوك بلس">
+<!ENTITY whitelist.site.label "تعطيل ÙÙŠ ?1?">
+<!ENTITY filters.label "ت&amp;ÙØ¶ÙŠÙ„ات الÙلتر">
+<!ENTITY disable.label "تعطيل ÙÙŠ جميع الأماكن">
+<!ENTITY objecttab.title "أحجب">
+<!ENTITY objecttab.tooltip "اضغط هنا لحجب هذا العنصر بـ آدبلوك بلاس">
+<!ENTITY menuitem.label "ØªÙØ¶ÙŠÙ„ات آدبلوك بلس">
+<!ENTITY objecttabs.label "عرض &amp;تبويبات Ù„Ùلاش Ùˆ Ø¬Ø§ÙØ§">
+<!ENTITY sendReport.label "ال&amp;تبليغ عن خطأ ÙÙŠ هذه Ø§Ù„ØµÙØ­Ø©">
+<!ENTITY whitelist.page.label "تعطيل ÙÙŠ هذه Ø§Ù„ØµÙØ­Ø© Ùقط">
+<!ENTITY context.image.label "آدبلوك بلس : حجب صورة">
+<!ENTITY counthits.label "تعداد اصابات الÙلترة (&amp;Ø¥)">
+<!ENTITY opensidebar.label "ÙØªØ­ العناصر المح&amp;جوبة">
+<!ENTITY notification.button.close "&amp;اغلاق">
+<!ENTITY contribute.label "شارك ÙÙŠ آد بلÙÙƒ بلَس">
+<!ENTITY toolbarbutton.label "آدبلوك بلس">
+<!ENTITY context.frame.label "آدبلوك بلس : حجب إطار">
+<!ENTITY blocked.tooltip "العناصر المحجوبة ÙÙŠ هذه Ø§Ù„ØµÙØ­Ø©">
+<!ENTITY hideplaceholders.label "ا&amp;Ø®ÙØ§Ø¡ ماسك المكان للعناصر Ø§Ù„Ù…ÙˆÙ‚ÙˆÙØ©">
+<!ENTITY showinstatusbar.label "عرض ÙÙŠ شريط ال&amp;حالة">
+<!ENTITY sidebar.title "العناصر المحجوبة ÙÙŠ Ø§Ù„ØµÙØ­Ø© الحالية">
+<!ENTITY options.label "&amp;خيارات">
+<!ENTITY context.object.label "آدبلوك بلس : حجب عنصر">
+<!ENTITY context.removeWhitelist.label "آدبلوك بلس : إعادة Ø§Ù„ØªÙØ¹ÙŠÙ„ ÙÙŠ هذه Ø§Ù„ØµÙØ­Ø©">
+<!ENTITY filters.tooltip "المصاÙÙŠ الأكثر نشاط:">
+<!ENTITY closesidebar.label "إغلاق العناصر المح&amp;جوبة">
+<!ENTITY showintoolbar.label "عرض ÙÙŠ &amp;شريط الأدوات">
+<!ENTITY status.tooltip "الحالة">
+<!ENTITY context.media.label "آدبلوك بلس : حجب أوديوÙيديو">
+<!ENTITY subscription.update.label "تحدبث الÙلاتر">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/sendReport.dtd
new file mode 100644
index 0000000..5e7f255
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;تراجع">
+<!ENTITY issues.disabledgroups.description "اشتراكات ومجموعات الÙلاتر التالية معطلة، ولكنها قد تسبب أثرا على هذه Ø§Ù„ØµÙØ­Ø© رغم ذلك">
+<!ENTITY showData.label "إظهار بيانات التقرير">
+<!ENTITY typeSelector.falsePositive.label "آدبلوك بلس يحجب &amp;أكثر من اللازم">
+<!ENTITY issues.change.description "تم تغيير إعداداتك. الرجاء إعادة تحميل Ø§Ù„ØµÙØ­Ø© لتجربة التغييرات وإرسال تقرير بالمشكلة إن لم تكن قد حلت بهذه التغييرات">
+<!ENTITY email.label "الب&amp;ريد الإلكتروني:">
+<!ENTITY issues.openPreferences.label "ÙØªØ­ ØªÙØ¶ÙŠÙ„ات الÙلتر">
+<!ENTITY sendPage.confirmation "تم Ø­ÙØ¸ تقريرك. ستستطيع الوصول إليه عن طريق العنوان التالي:">
+<!ENTITY copyLink.label "&amp;نسخ رابط التقرير">
+<!ENTITY issues.nofilters.description "آدبلوك بلس لا يمنع أي شيء على هذه Ø§Ù„ØµÙØ­Ø©. على الأغلب أن المشكلة التي تواجهها لا تتعلق بآدبلوك بلس Ù†ÙØ³Ù‡.">
+<!ENTITY sendPage.knownIssue "على الأغلب أن المشكلة التي قمت بإرسالها Ù…Ø¹Ø±ÙˆÙØ© مسبقاً. للمزيد من المعلومات:">
+<!ENTITY typeSelector.other.description "اختر هذا الخيار إن كنت تشك أن المشكلة بآدبلوك بلس Ù†ÙØ³Ù‡ وليس بأحد الÙلاتر">
+<!ENTITY issues.disabledgroups.enable.label "ØªÙØ¹ÙŠÙ„ مجموعة اشتراك Ùلتر">
+<!ENTITY typeWarning.override.label "أتÙهم وأرغب بإر&amp;سال التقرير">
+<!ENTITY issues.disabled.enable.label "ØªÙØ¹ÙŠÙ„ آدبلوك بلس">
+<!ENTITY update.fixed.description "التحديثات لاشتراكات الÙلاتر أصلحت المشكلة التي أردت الإبلاغ عنها. رجاء أعد تحديث Ø§Ù„ØµÙØ­Ø© وأعد المحاولة، اضغط تقرير مرة أخرى إذا بقيت المشكلة.">
+<!ENTITY anonymous.label "تقرير بدون هوي&amp;ة">
+<!ENTITY reloadButton.label "إعادة ت&amp;حميل Ø§Ù„ØµÙØ­Ø©">
+<!ENTITY recentReports.clear.label "&amp;حذ٠كل التقارير">
+<!ENTITY typeSelector.description "هذه Ø§Ù„Ù†Ø§ÙØ°Ø© ستقودك خلال الخطوات المطلوبة لإرسال تبليغ بمشكلة ÙÙŠ آدبلوك بلس. ÙÙŠ البداية عليك اختيار نوع المشكلة التي تواجهها من هذه Ø§Ù„ØµÙØ­Ø©">
+<!ENTITY screenshot.remove.label "&amp;حذ٠المعلومات الحساسة">
+<!ENTITY issues.ownfilters.description "بعض الÙلاتر المطبقة على هذه Ø§Ù„ØµÙØ­Ø© من صنع المستخدم. الرجاء إلغاء ØªÙØ¹ÙŠÙ„ هذه الÙلاتر لأنها ربما تكون سبب المشكلة">
+<!ENTITY update.inProgress.description "آدبلوك بلس يحتاج لتحديث اشتراكات الÙلاتر للتأكد من أن المشكلة لم يتم إصلاحها مسبقا. الرجاء الانتظار...">
+<!ENTITY sendPage.retry.label "إرسالة مرة أخرى">
+<!ENTITY data.label "التبل&amp;يغ عن بيانات">
+<!ENTITY recentReports.label "تقاريرك المرسلة مؤخرا">
+<!ENTITY typeWarning.description "لقد أشرت إلى رغبتك بالتبليغ عن مشكلة ÙÙŠ آدبلوك بلس Ù†ÙØ³Ù‡ وليس بالÙلاتر. الرجاء الانتباه إلى أنه من Ø§Ù„Ø£ÙØ¶Ù„ التبليغ عن مثل هذه المشاكل ÙÙŠ [link]منتدى آدبلوك بلس[/link]. يجب استعمال مبلغ المشاكل Ùقط Ù„Ù„Ø¥Ø¶Ø§ÙØ© إلى مناقشة جارية أصلا لأن أحداً لن يلاحظ تقريرك إن لم تقم بوضع رابط إليه. سيتم إظهار رابط مولد لتقريرك بمجرد أن تقوم بإرسال التقرير.">
+<!ENTITY issues.disabled.description "آدبلوك بلس معطل ولن يقوم بحجب أي شيء ÙÙŠ هذه الحالة">
+<!ENTITY attachExtensions.label "إرÙ&amp;اق قائمة Ø¨Ø§Ù„Ø¥Ø¶Ø§ÙØ§Øª Ø§Ù„ÙØ¹Ø§Ù„Ø© مع التقرير">
+<!ENTITY issues.nosubscriptions.add.label "Ø¥Ø¶Ø§ÙØ© اشتراك Ùلتر">
+<!ENTITY issues.disabledfilters.enable.label "ØªÙØ¹ÙŠÙ„ Ùلتر">
+<!ENTITY issues.override.label "ال&amp;إعدادات معطلة، المتابعة بالتقرير">
+<!ENTITY issues.nosubscriptions.description "يبدو أنك لم تشترك بأي قوائم Ùلاتر جاهزة والتي ستقوم بإزالة المحتوى الغير من المواقع تلقائيا">
+<!ENTITY typeSelector.falsePositive.description "اختر هذا الخيار ان كان محتوى مهم ناقص من Ø§Ù„ØµÙØ­Ø© أو كانت Ø§Ù„ØµÙØ­Ø© تظهر بشكل خاطئ أو لا تعمل بشكل جيد. إن لم يكن باستطاعتك تحديد إن كان آدبلوك بلس هو سبب المشكلة جرب تعطيله مؤقتاً">
+<!ENTITY typeSelector.other.label "مشكلة أ&amp;خرى">
+<!ENTITY emailComment.label "نحن نشجعك لإدخال بريد إلكتروني صحيح لكي نتمكن من الاتصال بك إذا كانت هناك أسئلة.">
+<!ENTITY issues.whitelist.remove.label "إعادة ØªÙØ¹ÙŠÙ„ آدبلوك بلس على هذه Ø§Ù„ØµÙØ­Ø©">
+<!ENTITY outdatedSubscriptions.description "اشتراكات الÙلاتر التالية لم يتم تحديثها منذ أسبوعين على الأقل. الرجاء تحديث هذه الاشتراكات قبل إرسال تقرير، ربما تم إصلاح المشكلة مسبقا.">
+<!ENTITY dataCollector.description "من ÙØ¶Ù„Ùƒ انتظر بضعة دقائق ريثما يجمع آدبلوك بلس المعلومات المطلوبة">
+<!ENTITY sendButton.label "إرسا&amp;ل التقرير">
+<!ENTITY comment.label "التعلي&amp;ق (اختياري)ـ">
+<!ENTITY sendPage.errorMessage "ÙØ´Ù„ إرسال التقرير بسبب الخطأ &quot;?1?&quot;. الرجاء التأكد من صحة اتصالك بالإنترنت وإعادة المحاولة. إن استمرت المشكلة الرجاء طلب المساعدة ÙÙŠ [link]منتديات آدبلوك بلس[/link]">
+<!ENTITY showRecentReports.label "إظهار التقارير المرسلة مؤخرا">
+<!ENTITY commentPage.heading "إدخال تعليق">
+<!ENTITY update.start.label "بداية التحديث الان">
+<!ENTITY issues.disabledfilters.description "الÙلاتر التالية معطلة ولكن قد يكون لها أثر على هذه Ø§Ù„ØµÙØ­Ø© رغم ذلك">
+<!ENTITY screenshot.description "Ù†ÙØ³ Ø§Ù„ØµÙØ­Ø© قد تظهر بشكل مختل٠لأشخاص مختلÙين. قد يساعدنا Ùهم المشكلة إن قمت Ø¨Ø¥Ø±ÙØ§Ù‚ صورة لشاشتك مع تقريرك. ستستطيع حذ٠المناطق التي تحتوي معلومات حساسة وكذلك وضع علامة على المناطق التي تظهر بها المشكلة. Ù„ÙØ¹Ù„ ذلك اضغط الزر المناسب ثم اختر منطقة من الصورة باستخدام Ø§Ù„ÙØ£Ø±Ø©">
+<!ENTITY screenshot.attach.label "إر&amp;ÙØ§Ù‚ صورة Ù„Ù„ØµÙØ­Ø© مع التقرير">
+<!ENTITY issues.whitelist.description "آدبلوك بلس معطل حاليا على Ø§Ù„ØµÙØ­Ø© التي تقوم بالتبليغ عنها. الرجاء إعادة ØªÙØ¹ÙŠÙ„Ù‡ وإعادة تحميل Ø§Ù„ØµÙØ­Ø© قبل أن تقوم بإرسال التقرير للمساعدة ÙÙŠ التحقق من المشكلة">
+<!ENTITY typeSelector.falseNegative.label "آدبلوك بلس لا يقوم بحجب أحد الإ&amp;علانات">
+<!ENTITY typeSelector.heading "اختر نوع المشكلة">
+<!ENTITY anonymity.warning "لن نكون قادرين على الرجوع إليك و لن نعطي للتقرير أهمية كبيرة.">
+<!ENTITY wizard.title "مبلغ المشاكل">
+<!ENTITY issues.ownfilters.disable.label "تعطيل Ùلتر">
+<!ENTITY commentPage.description "يسمح لك الحقل التالي بإدخال تعليق ليساعدنا ÙÙŠ Ùهم المشكلة. هذه الخطوة إختيارية ولكننا نصح بها إن لم تكن المشكلة واضحة. ستستطيع أيضا مراجعة بيانات التقرير قبل إرساله">
+<!ENTITY comment.lengthWarning "طول التعليق يتجاوز 1000 حرÙ. سيتم إرسال أول 1000 حر٠Ùقط">
+<!ENTITY typeSelector.falseNegative.description "اختر هذا الخيار إن كان أحد الإعلانات ظاهرا رغم أن آدبلوك بلس Ù…ÙØ¹Ù„">
+<!ENTITY sendPage.waitMessage "الرجاء الانتظار ريثما يقوم آدبلوك بلس بإرسال تقرير">
+<!ENTITY dataCollector.heading "أهلا بك ÙÙŠ مبلغ المشاكل">
+<!ENTITY screenshot.heading "Ø¥Ø±ÙØ§Ù‚ صورة للشاشة">
+<!ENTITY sendPage.heading "إرسال التقرير">
+<!ENTITY issues.subscriptionCount.description "يبدو أنك مشترك ÙÙŠ الكثير جداً من اشتراكات الÙلاتر وهو غير Ù…ÙØ¶Ù„ لأنه قد يكون السبب ÙÙŠ المشاكل التي تعانيها. نعتذر عن قبول تقرير مشكلتك لأننا لن نستطيع تحديد الÙلتر الذي يتسبب بالمشكلة لإبلاغ مطوره. الرجاء إزالة جميع الÙلاتر وإبقاء الهام جداً منها Ùقط ثم تأكد من ذهاب المشكلة أو لا.">
+<!ENTITY screenshot.mark.label "وضع علا&amp;مة على المشكلة">
+<!ENTITY privacyPolicy.label "سياسة الخصوصية">
+<!ENTITY issues.description "قام آدبلوك بلس بتحديد مشاكل بإعداداتك قد تكون هي المسؤولة عن هذه المشكلة وسيجعل التحقق من المشكلة صعباً">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/sidebar.dtd
new file mode 100644
index 0000000..78b50fb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "إضاءة حوا٠العنصر">
+<!ENTITY address.label "العنوان">
+<!ENTITY context.open.label "ÙØªØ­ ÙÙŠ تبويب جديد">
+<!ENTITY type.label "النوع">
+<!ENTITY tooltip.filterSource.label "مصدر الÙلتر:">
+<!ENTITY noitems.label "لا عناصر محجوبة">
+<!ENTITY filter.label "الÙلتر">
+<!ENTITY tooltip.size.label "الحجم:">
+<!ENTITY reattach.label "إعادة Ø¥Ø±ÙØ§Ù‚">
+<!ENTITY search.label "بح&amp;ث">
+<!ENTITY docDomain.thirdParty "(طر٠خارجي)">
+<!ENTITY filterSource.label "Ùلترة المصدر">
+<!ENTITY tooltip.docDomain.label "مصدر الملÙ:">
+<!ENTITY context.copy.label "نسخ عنوان العنصر">
+<!ENTITY tooltip.type.label "النوع">
+<!ENTITY context.disablefilter.label "تعطيل الÙلتر ?1?">
+<!ENTITY context.copyFilter.label "نسخ الÙلتر">
+<!ENTITY context.block.label "حجب هذا العنصر">
+<!ENTITY context.enablefilter.label "إعادة ØªÙØ¹ÙŠÙ„ الÙلتر ?1?">
+<!ENTITY detach.label "ÙØµÙ„">
+<!ENTITY whitelisted.label "ØµÙØ­Ø© موثوقة">
+<!ENTITY context.disablefilteronsite.label "تعطيل هذا الÙلتر على ?1?">
+<!ENTITY detached.title "آدبلوك بلاس : العناصر المحجوبة (Ø§Ù„Ù…Ù†ÙØµÙ„Ø©)">
+<!ENTITY docDomain.firstParty "(طر٠داخلي)">
+<!ENTITY tooltip.type.whitelisted "(موثوق)">
+<!ENTITY tooltip.filter.label "الÙلتر Ø§Ù„ÙØ¹Ø§Ù„">
+<!ENTITY tooltip.filter.disabled "(معطل)">
+<!ENTITY context.editfilter.label "تعديل الÙلتر Ø§Ù„ÙØ¹Ø§Ù„">
+<!ENTITY tooltip.type.blocked "(محجوب)">
+<!ENTITY size.label "الحجم">
+<!ENTITY context.whitelist.label "Ø¥Ø¶Ø§ÙØ© قانون استثنائي إلى هذا العنصر">
+<!ENTITY context.selectAll.label "اختيار الكل">
+<!ENTITY state.label "الحالة">
+<!ENTITY docDomain.label "مصدر الملÙ">
+<!ENTITY tooltip.address.label "العنوان">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/subscriptionSelection.dtd
new file mode 100644
index 0000000..7c4938b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ar/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Ø¥Ø¶Ø§ÙØ© ا&amp;شتراك الÙلتر &quot;?1?&quot; أيضا">
+<!ENTITY list.download.failed "ÙØ´Ù„ آدبلوك بلس ÙÙŠ جلب قائمة الاشتراكات">
+<!ENTITY list.download.retry "إعادة المحاولة">
+<!ENTITY title.label "&amp;عنوان الاشتراك">
+<!ENTITY list.download.website "عرض الموقع">
+<!ENTITY supplementMessage "اشتراك الÙلتر هذا يجب أن يستخدم مع اشتراك الÙلتر &quot;?1?&quot; والذي لم تستعمله بعد">
+<!ENTITY viewList.label "عرض Ùلاتر">
+<!ENTITY visitHomepage.label "زيارة Ø§Ù„ØµÙØ­Ø© الرئيسية">
+<!ENTITY addSubscription.label "Ø¥Ø¶Ø§ÙØ© اشتراك">
+<!ENTITY dialog.title "أهلاً بك ÙÙŠ آدبلوك بلس">
+<!ENTITY location.label "&amp;موقع قائمة الÙلاتر">
+<!ENTITY fromWeb.description "الرجاء التأكد من رغبتك ÙÙŠ Ø¥Ø¶Ø§ÙØ© اشتراك الÙلتر هذا. يمكنك أن تغير عنوان أو موقع الاشتراك قبل Ø§Ø¶Ø§ÙØªÙ‡.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/composer.dtd
new file mode 100644
index 0000000..1d185af
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "в ÐºÑ€Ð°Ñ Ð½Ð° адре&amp;Ñа">
+<!ENTITY domainRestriction.label "Ог&amp;раничаване на домейн:">
+<!ENTITY collapse.default.no.label "Ползвай по подразбиране(не)">
+<!ENTITY firstParty.label "Първа Ñтрана Ñам&amp;о">
+<!ENTITY preferences.label "Покажи ÑÑŠ&amp;щеÑтвуващите филтри..">
+<!ENTITY pattern.label "ТърÑете модел">
+<!ENTITY thirdParty.label "&amp;Трети Ñтрани Ñамо">
+<!ENTITY filter.label "Ðов Филт&amp;ÑŠÑ€:">
+<!ENTITY collapse.label "Свиван&amp;е на блокирани:">
+<!ENTITY match.warning "Моделът, който Ñте въвели, вече не Ð¾Ñ‚Ð³Ð¾Ð²Ð°Ñ€Ñ Ð½Ð° адреÑа за блокиране/Ð±ÐµÐ»Ð¸Ñ ÑпиÑък и нÑма да въздейÑтвa върху него.">
+<!ENTITY anchor.start.label "в на&amp;чалото на адреÑа">
+<!ENTITY matchCase.label "Съвпадение на ре&amp;гиÑтъра">
+<!ENTITY custom.pattern.label "&amp;Избрани:">
+<!ENTITY unselectAllTypes.label "Ðе избирай нищо">
+<!ENTITY type.whitelist.label "Из&amp;ключение от правилото">
+<!ENTITY regexp.warning "Моделът който Ñте въвели ще бъде интерпретиран като регулÑрен израз, които не могат да бъдат ефективно обработени Ñ Adblock ÐŸÐ»ÑŽÑ Ð¸ могат да забавÑÑ‚ твоÑÑ‚ браузър. Ðко не възнамерÑвате да използвате регулÑрен израз, добавете звездичка (*) към ÐºÑ€Ð°Ñ Ð½Ð° модела.">
+<!ENTITY dialog.title "ДобавÑне на Adblock Plus филтър правило">
+<!ENTITY basic.label "ОÑновен изглед">
+<!ENTITY type.filter.label "&amp;Блокиране на филтър">
+<!ENTITY types.label "Прилага за типове:">
+<!ENTITY shortpattern.warning "Моделът които Ñте въвели е твърде кратък, за да бъде оптимизиран и може да забави Ð²Ð°ÑˆÐ¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÑŠÑ€. Препоръчително е да изберете по-дълъг низ за този филтър, за да позволи Adblock ÐŸÐ»ÑŽÑ Ð·Ð° по-ефективна обработка на филтъра.">
+<!ENTITY collapse.yes.label "Да">
+<!ENTITY anchors.label "Приемам Ñамо модел:">
+<!ENTITY collapse.default.yes.label "Ползвай по подразбиране(да)">
+<!ENTITY domainRestriction.help "Използвайте тази опциÑ, за да зададете една или повече облаÑти, разделени Ñ Ð±Ð°Ñ€ Ð»Ð¸Ð½Ð¸Ñ (|). Филтърът ще Ñе прилага Ñамо за избран(и) домейн(и). Ртилда (~) пред името на домейна Ñе поÑочва, че филтърът не Ñе прилага в този домейн.">
+<!ENTITY accept.label "Добави Филтър">
+<!ENTITY options.label "ÐаÑтройки">
+<!ENTITY disabled.warning "Adblock ÐŸÐ»ÑŽÑ Ðµ изключена. Ð’Ñе още можете да добавите филтри, но те нÑма да Ñе прилагат, оÑвен ако не [link]Включите Adblock ПлюÑ[/link].">
+<!ENTITY anchor.start.flexible.label "в на&amp;чалото на домейн името">
+<!ENTITY collapse.no.label "Ðе">
+<!ENTITY selectAllTypes.label "Избери вÑички">
+<!ENTITY advanced.label "Разширен изглед">
+<!ENTITY pattern.explanation "Моделът може да бъде чаÑÑ‚ от адреÑ; звездичка (*) да дейÑтва като замеÑтващи Ñимволи. Филтърът ще Ñе прилага Ñамо за адреÑите, отговарÑщи на Ð¿Ñ€ÐµÐ´Ð²Ð¸Ð´ÐµÐ½Ð¸Ñ Ð¾Ð±Ñ€Ð°Ð·ÐµÑ†.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/filters.dtd
new file mode 100644
index 0000000..28cd5e4
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Ð’Ñички ваши потребителÑки филтри ще бъде заменен от Ñъдържанието на Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð». ИÑкате ли да продължите?">
+<!ENTITY slow.column "Пока&amp;жи филтри">
+<!ENTITY enabled.column "&amp;Включен">
+<!ENTITY subscription.lastDownload.checksumMismatch "Грешка, неÑъвпадение на контролната Ñума">
+<!ENTITY noFiltersInGroup.text "Избраната група е празна">
+<!ENTITY subscription.actions.label "ДейÑтвиÑ">
+<!ENTITY filter.selectAll.label "Избери Ð’Ñички">
+<!ENTITY backupButton.label "Ðрхи&amp;вирай и ВъзÑтанови">
+<!ENTITY restore.minVersion.warning "Внимание: файлът е Ñъздаден Ñ Ð¿Ð¾-нова верÑÐ¸Ñ Ð½Ð° Adblock Plus. ТрÑбва да обновите до поÑледната верÑÐ¸Ñ Ð½Ð° Adblock Plus, преди да възÑтановите от този файл.">
+<!ENTITY restore.error "Файлът не може да Ñе обработи или не е Ñ Ð´Ð°Ð½Ð½Ð¸, може би Това не е Adblock Plus Ð°Ñ€Ñ…Ð¸Ð²Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»?">
+<!ENTITY sort.ascending.label "&amp;Ð &gt; Я Ñортиране">
+<!ENTITY sort.label "&amp;Сортирай по">
+<!ENTITY subscription.source.label "Филтър ЛиÑÑ‚">
+<!ENTITY hitcount.column "ПоÑе&amp;щениÑ">
+<!ENTITY noFilters.text "Ти нÑмаш нито един ÑобÑтвен филтър още.">
+<!ENTITY backup.custom.title "Лични филтри Ñамо">
+<!ENTITY subscription.external.label "Ъпдейтнат от друга добавка">
+<!ENTITY subscription.delete.label "Изтрий">
+<!ENTITY noGroupSelected.text "Вие трÑбва да изберете филтър група, преди тези филтри да бъдат показани.">
+<!ENTITY filter.cut.label "Изрежи">
+<!ENTITY restore.default.label "ВъзÑтанови архив от ?1?">
+<!ENTITY subscription.lastDownload.inProgress "ИзтеглÑне...">
+<!ENTITY subscriptions.tab.label "Ðбонаменти за Филтър">
+<!ENTITY sort.descending.label "&amp;Я &gt; РСортиране">
+<!ENTITY filters.remove.warning "ÐаиÑтина ли иÑкаш да изтриеш вÑички избрани филтри?">
+<!ENTITY filter.delete.label "Изтрий">
+<!ENTITY addSubscriptionAdd.label "Добави">
+<!ENTITY viewMenu.label "Изглед">
+<!ENTITY subscription.lastDownload.unknown "ÐÑма данни">
+<!ENTITY addSubscriptionCancel.label "Откажи">
+<!ENTITY subscription.enabled.label "Включен">
+<!ENTITY noSubscriptions.text "Ти не Ñи добавил никакъв абонамент за филтри. Adblock Plus нÑма да блокира
+ нищо без филтри, Ð¼Ð¾Ð»Ñ Ð¸Ð·Ð±ÐµÑ€Ð¸ &quot;Добави филтър абонаменти&quot; за да
+ добавиш нÑкакви.">
+<!ENTITY subscription.update.label "Обнови филтрите">
+<!ENTITY dialog.title "Adblock Plus ÐаÑтройки за филтър">
+<!ENTITY addFilter.label "Доб&amp;ави Филтър">
+<!ENTITY subscription.minVersion.warning "Този филтър абонамент изиÑква по-нова верÑÐ¸Ñ Ð½Ð° Adblock Plus, трÑбва да обновите до поÑледната верÑÐ¸Ñ Ð½Ð° Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Грешка, невалиден адреÑ">
+<!ENTITY backup.error "Възникна грешка при пиÑане на филтри за файла.Уверете Ñе, че файлът не е защитени или Ñе използва от друго приложение.">
+<!ENTITY filter.moveUp.label "ПремеÑти нагоре">
+<!ENTITY addGroup.label "Добави филтър &amp;група">
+<!ENTITY filter.edit.label "Промени">
+<!ENTITY subscription.showHideFilters.label "Покажи/Ñкрий филтрите">
+<!ENTITY acceptableAds2.label "ОÑтавете нÑко&amp;и не натрапчиви реклами">
+<!ENTITY addSubscriptionOther.label "Добави друг абонамент">
+<!ENTITY close.label "Затвори">
+<!ENTITY sort.none.label "&amp;ÐеÑортирани">
+<!ENTITY filter.actions.label "Филтър дейÑтвиÑ">
+<!ENTITY filter.copy.label "Копирай">
+<!ENTITY filter.moveDown.label "ПремеÑти надоло">
+<!ENTITY filter.resetHitCounts.label "РеÑтарт на Хит СтатиÑтиката">
+<!ENTITY readMore.label "Прочети повече">
+<!ENTITY subscription.moveUp.label "ПремеÑти нагоре">
+<!ENTITY addSubscription.label "Добави абонамент за &amp;филтър">
+<!ENTITY subscription.homepage.label "Лична Страница">
+<!ENTITY backup.complete.title "Ð’Ñички филтри и абонаменти">
+<!ENTITY restore.own.label "ВъзÑтанови Ñвой архив">
+<!ENTITY restore.complete.warning "Ð’Ñички ваши филтър Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð¸Ñ Ñ‰Ðµ бъдат заменени от Ñъдържанието на Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð». ИÑкате ли да продължите?">
+<!ENTITY filters.tab.label "ПотребителÑки филтри">
+<!ENTITY backup.label "Ðаправи нов архив">
+<!ENTITY find.label "&amp;Ðамери">
+<!ENTITY subscription.moveDown.label "ПремеÑти надоло">
+<!ENTITY subscription.lastDownload.connectionError "Грешка, неуÑпешно изтеглÑне">
+<!ENTITY subscription.lastDownload.success "УÑпешно">
+<!ENTITY subscription.lastDownload.invalidData "Грешка, невалиден ÑпиÑък Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸">
+<!ENTITY filter.paste.label "ПоÑтави">
+<!ENTITY subscription.disabledFilters.enable "Разреши забранените филтри">
+<!ENTITY lasthit.column "&amp;ПоÑледни ПоÑещениÑ">
+<!ENTITY subscription.editTitle.label "Промени титла">
+<!ENTITY subscription.disabledFilters.warning "ÐÑкой филтри в този абонамент Ñа забранени.">
+<!ENTITY filter.column "&amp;Филтър правило">
+<!ENTITY subscription.lastDownload.label "ПоÑледно изтеглен:">
+<!ENTITY viewList.label "Виж лиÑÑ‚">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/firstRun.properties
new file mode 100644
index 0000000..bd93321
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Сърфирайте инкогнито като забраните проÑледÑването ви - Ñъщо така прикрива вашите дейÑÑ‚Ð²Ð¸Ñ Ð¾Ñ‚ рекламните компании, които биха проÑледили вÑеки ваш ход.
+firstRun_toggle_off=Стоп
+firstRun_feature_tracking=ЗабранÑване на проÑледÑването
+firstRun_feature_malware=Блокиране на зловреден Ñофтуер
+firstRun_title=Adblock Plus е инÑталиран
+firstRun_toggle_on=Старт
+firstRun_acceptableAdsExplanation=Бихме иÑкали да наÑърчаваме уеб-Ñайтовете да използват обикновена, ненатрапчива реклама. Ето защо ние уÑтановихме <a>Ñтроги наÑоки</a>, където можете да видите кои Ñа приемливите реклами, които Ñе показват по подразбиране. Ðко вÑе още иÑкате да блокирате вÑички реклами, можете да ги <a>забраните</a> в рамките на нÑколко Ñекунди.
+firstRun_contributor_credits=Сътрудници
+firstRun_dataCorruptionWarning=Страницата продължава да Ñе показва? <a>Щракнете тук!</a>
+firstRun_acceptableAdsHeadline=ДоÑадните реклами ще бъдат блокирани
+firstRun_share=Споделете Ñ Ð¿Ñ€Ð¸Ñтелите Ñи
+firstRun_share_headline=<a>Помогнете ни</a> и направете мрежата по-добро мÑÑто
+firstRun_feature_social_description=Ðвтоматично премахва от Ñтраниците в браузъра бутоните на Ñоциалните медии, като например тези на Facebook, които Ñе поÑвÑват на нÑкои уеб Ñтраници и проÑледÑват вашето поведение.
+firstRun_filterlistsReinitializedWarning=Изглежда, че има проблем, който е изтрил вÑички филтри и не Ñме в ÑÑŠÑтоÑние да ги възÑтановим от архив. Поради тази причина Ñе наложи да нулираме Вашите филтри и наÑтройките за Приемливи реклами. МолÑ, проверете Вашите ÑпиÑъци Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸, както и наÑтройките за Приемливи реклами в <a>Adblock ÐŸÐ»ÑŽÑ Ð¾Ð¿Ñ†Ð¸Ð¸</a>.
+firstRun_feature_malware_description=Ðаправете Ñвоето Ñърфиране в Интернет по-безопаÑно чрез блокиране на зловредни домейни.
+firstRun_features=Adblock Plus може и прави повече от блокиране на реклами
+firstRun_donate=дарение
+firstRun_donate_label=Подкрепете Ð½Ð°ÑˆÐ¸Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚
+firstRun_feature_social=Премахвай бутоните на Ñоциалните мрежи
+firstRun_legacySafariWarning=Вие използвате Ñтара верÑÐ¸Ñ Ð½Ð° Safari, коÑто не Ñе поддържа от Adblock Plus. Ð’ ÑÐ»ÑƒÑ‡Ð°Ñ Adblock Plus може да не работи коректно, като е възможно да Ñе наруши работата на потребителите в нÑкои уеб Ñайтове. Ðие Ñилно препоръчваме да актуализирате Safari към верÑÐ¸Ñ 6 или по-виÑока (доÑтъпна за Mac OS X 10.8 Mountain Lion и по-виÑока), или да използвате поÑледната верÑÐ¸Ñ Ð½Ð° Mozilla Firefox, Google Chrome или Opera.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/global.properties
new file mode 100644
index 0000000..ab8ac88
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=ÐÑма блокирани позиции на текущата Ñтраница
+action3_tooltip=Щракнете за включване/изключване Adblock ПлюÑ.
+notification_antiadblock_title=Скриване на умишлените ÑъобщениÑ?
+type_label_script=Ñкрипт
+filter_elemhide_nocriteria=Ðе е зададен критерий за разпознаване на елемент за Ñкриване
+blockingGroup_title=Правила за Блокиране
+whitelisted_tooltip=Adblock ÐŸÐ»ÑŽÑ Ðµ изключен на текущата Ñтраница.
+type_label_stylesheet=интерфейÑ
+blocked_count_tooltip=?1? от ?2?
+type_label_font=шрифт
+type_label_popup=изÑкачащ прозорец
+filter_regexp_tooltip=Този филтър или е регулÑрен израз или е твърде кратък, за да Ñе оптимизира. Твърде много от тези филтри могат да забавÑÑ‚ Ñърфирането.
+action0_tooltip=Щракнете за да извадите контекÑтното меню, Ñредно щракване за включване/изключване.
+whitelisted_page=Adblock ÐŸÐ»ÑŽÑ Ð±ÐµÑˆÐµ изключен за текущата Ñтраница
+remove_group_warning=ÐаиÑтина ли иÑкате да премахнете тази група?
+action1_tooltip=Щракнете за да отворите/затворите блокираните параграфи, Ñредно щракване за включване/изключване.
+type_label_xmlhttprequest=XML заÑвка
+active_tooltip=Adblock ÐŸÐ»ÑŽÑ Ðµ включен, ?1? абонамента за филтриране и ?2? потребителÑки филтър(а) Ñе използват.
+type_label_document=документ
+type_label_object_subrequest=обект под заÑвка
+whitelistGroup_title=Изключение от правилата
+disabled_tooltip=Adblock ÐŸÐ»ÑŽÑ Ðµ изключен.
+filter_elemhide_duplicate_id=Може да бъде задаван Ñамо един ID на елемент за Ñкриване
+type_label_object=обект
+action2_tooltip=Кликнете за да отворите предпочитаниÑта, Ñредно щракване за включване/изключване.
+type_label_subdocument=рамка
+clearStats_warning=Това ще реÑтартира цÑлата ÑтатиÑтика и ще забрани броенето на филтрите. ИÑкате ли да продължите?
+notification_antiadblock_message=Този Ñайт е извеÑтен Ñ Ð¿Ð¾ÐºÐ°Ð·Ð²Ð°Ð½Ðµ на умишлени поÑÐ»Ð°Ð½Ð¸Ñ Ð¾Ñ‚ потребителите на Adblock Plus. ИÑкате ли Adblock Plus, да Ñкрие тези умишлени ÑъобщениÑ?
+blocked_count_addendum=(Ñъщо разрешени:?1?, Ñкрити: ?2?)
+subscription_invalid_location=МеÑтоположението на ÑпиÑъка Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸ или не е валиден URL или не е валидно името на файла.
+type_label_image=картинка
+remove_subscription_warning=ÐаиÑтина ли иÑкате да премахнете този абонамент?
+type_label_other=други
+mobile_menu_enable=ABP: Включване
+type_label_media=аудио/видео
+mobile_menu_disable_site=ABP: Изключване на ?1?
+elemhideGroup_title=Правила за Ñкриване на елементи
+mobile_menu_enable_site=ABP: Включване на ?1?
+type_label_elemhide=Ñкрит
+newGroup_title=Ðова група Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/overlay.dtd
new file mode 100644
index 0000000..b1efd15
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Да">
+<!ENTITY notification.button.no "&amp;Ðе">
+<!ENTITY sync.label "Син&amp;хронизирай ÐаÑтройките за Adblock Plus">
+<!ENTITY whitelist.site.label "Забрани на ?1?">
+<!ENTITY filters.label "&amp;Филтър ÐаÑтройки">
+<!ENTITY disable.label "Забрани навÑÑкъде">
+<!ENTITY objecttab.title "Блокирай">
+<!ENTITY objecttab.tooltip "Щракни тук за да блокираш този обект ÑÑŠÑ Adblock ПлюÑ">
+<!ENTITY menuitem.label "Adblock ÐŸÐ»ÑŽÑ &amp;ÐаÑтройки">
+<!ENTITY objecttabs.label "&amp;Покажи разделите за Флаш и Java">
+<!ENTITY sendReport.label "&amp;Докладване на проблем на тази Ñтраница">
+<!ENTITY whitelist.page.label "Забрани на тази Ñтраница Ñамо">
+<!ENTITY context.image.label "Adblock ПлюÑ: Блокирани Картинки">
+<!ENTITY counthits.label "Бройте &amp;филтър хитове">
+<!ENTITY opensidebar.label "Отвори &amp;блокирани предмети">
+<!ENTITY notification.button.close "&amp;Затвори">
+<!ENTITY contribute.label "Помогнете на Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock ПлюÑ">
+<!ENTITY context.frame.label "Adblock ПлюÑ:Блокирани Фреймове">
+<!ENTITY blocked.tooltip "Блокирани предмети от тази Ñтраница:">
+<!ENTITY hideplaceholders.label "Скрий контейнери на блокираните еле&amp;менти">
+<!ENTITY showinstatusbar.label "Покажи в лен&amp;тата на ÑÑŠÑтоÑнието">
+<!ENTITY sidebar.title "Блокирани предмети на тази Ñтраница">
+<!ENTITY options.label "&amp;ÐаÑтройки">
+<!ENTITY context.object.label "Adblock ПлюÑ:Блокирани Обекти">
+<!ENTITY context.removeWhitelist.label "Adblock ПлюÑ: ПуÑни за тази Ñтраница">
+<!ENTITY filters.tooltip "Ðай активни филтри:">
+<!ENTITY closesidebar.label "Затвори &amp;блокирани предмети">
+<!ENTITY showintoolbar.label "Пок&amp;ажи в лентата Ñ Ð¸Ð½Ñтрументи">
+<!ENTITY status.tooltip "СтатуÑ:">
+<!ENTITY context.media.label "Adblock ПлюÑ: Блокирани аудио/видео">
+<!ENTITY subscription.update.label "Обнови филтрите">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/sendReport.dtd
new file mode 100644
index 0000000..080b8ba
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/sendReport.dtd
@@ -0,0 +1,69 @@
+<!ENTITY screenshot.undo.label "&amp;ОтмÑна">
+<!ENTITY issues.disabledgroups.description "Следните абонаменти за филтри/групи филтри Ñа изключени. Ð’Ñе пак биха могли да имат ефект върху тази Ñтраница:">
+<!ENTITY showData.label "Показване на докладваните данни">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus блокира твърде &amp;много">
+<!ENTITY issues.change.description "Вашата ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ðµ променена. МолÑ, презаредете Ñтраницата, за да теÑтвате промените и да предÑтавите доклад, ако въпроÑÑŠÑ‚ не бъде уреден от промените.">
+<!ENTITY email.label "&amp;Ел.Поща:">
+<!ENTITY issues.openPreferences.label "Отвори наÑтройките за филтър">
+<!ENTITY sendPage.confirmation "Отчетът Ви е запазен. Можете да го намерите на ÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð°Ð´Ñ€ÐµÑ:">
+<!ENTITY copyLink.label "&amp;Копиране линк на доклада">
+<!ENTITY issues.nofilters.description "Adblock ÐŸÐ»ÑŽÑ Ð½Ðµ блокира нищо на текущата Ñтраница. ÐÐ°Ð±Ð»ÑŽÐ´Ð°Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ най-вероÑтно
+ не е Ñвързан Ñ Adblock ПлюÑ.">
+<!ENTITY sendPage.knownIssue "ДокладваниÑÑ‚ от Ð’Ð°Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ вероÑтно вече е извеÑтен. За повече информациÑ:">
+<!ENTITY typeSelector.other.description "Изберете тази наÑтройка, ако подозирате, че проблемът е Ñ Adblock Plus, а не Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸Ñ‚Ðµ му.">
+<!ENTITY issues.disabledgroups.enable.label "Включване на абонамент за филтър / група филтри">
+<!ENTITY typeWarning.override.label "Разбирам и вÑе &amp;пак иÑкам да предÑÑ‚Ð°Ð²Ñ Ð´Ð¾ÐºÐ»Ð°Ð´Ð° въпреки вÑичко">
+<!ENTITY issues.disabled.enable.label "Включи Adblock ПлюÑ">
+<!ENTITY update.fixed.description "Ðктуализациите на вашите абонаменти за филтри вероÑтно Ñа решили въпроÑа който Ñте докладвали. МолÑ, презаредете Ñтраницата и опитайте отново, Докладвайте отново, ако проблемът вÑе още го има.">
+<!ENTITY anonymous.label "&amp;Ðнонимно изпращане на информациÑ">
+<!ENTITY reloadButton.label "Пре&amp;зареждане на Ñтраницата">
+<!ENTITY recentReports.clear.label "Премах&amp;ни вÑички доклади">
+<!ENTITY typeSelector.description "Този прозорец ще ви преведе през Ñтъпките, необходими за подаване на доклад за Adblock
+ ÐŸÐ»ÑŽÑ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼. Първо, Ð¼Ð¾Ð»Ñ Ð¸Ð·Ð±ÐµÑ€ÐµÑ‚Ðµ вида на проблема, който Ñте Ñрещнали на тази Ñтраница:">
+<!ENTITY screenshot.remove.label "П&amp;ремахване на чувÑтвителните данни">
+<!ENTITY issues.ownfilters.description "ÐÑкои от филтрите, приложени на тази Ñтраница Ñа дефинирани от потребителÑ. МолÑ, деактивирайте филтрите, които може да причинÑват проблема:">
+<!ENTITY update.inProgress.description "Adblock Plus трÑбва да актуализира вашите абонаменти за филтри и да Ñе увери, че въпроÑÑŠÑ‚ не е решен вече. МолÑ, изчакайте..">
+<!ENTITY sendPage.retry.label "Изпращане отново">
+<!ENTITY data.label "&amp;Докладвани данни:">
+<!ENTITY recentReports.label "Вашите наÑкоро предÑтавените доклади">
+<!ENTITY typeWarning.description "ПоÑочили Ñте, че иÑкате да Ñъобщите за общ проблем Ñ Adblock Plus, а не проблем Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸Ñ‚Ðµ. МолÑ, обърнете внимание, че тези въпроÑи Ñа най-докладвани във [link]форума на Adblock Plus[/link]. ТрÑбва да използвате докладчика на проблеми за допълване на ÑъщеÑтвуваща диÑкуÑиÑ, тъй като никой нÑма да забележи Ð²Ð°ÑˆÐ¸Ñ Ð´Ð¾ÐºÐ»Ð°Ð´, докато не предоÑтавите връзка към него. Ðвтоматично генерирана връзка ще бъде предоÑтавена Ñлед предоÑтавÑнето на доклада.">
+<!ENTITY issues.disabled.description "Adblock Plus е изключен - нÑма да блокира нищо в неговото текущо ÑÑŠÑтоÑние.">
+<!ENTITY attachExtensions.label "Прилагане на ÑпиÑък Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ñ‚Ðµ раз&amp;ÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ ÐºÑŠÐ¼ доклада в Ñлучай че добавката причинÑва проблема">
+<!ENTITY issues.nosubscriptions.add.label "ДобавÑне на абонамент за филтър">
+<!ENTITY issues.disabledfilters.enable.label "Включи филтъра">
+<!ENTITY issues.override.label "КонфигурациÑта е &amp;правилна, продължаване Ñ Ð´Ð¾ÐºÐ»Ð°Ð´Ð°">
+<!ENTITY issues.nosubscriptions.description "Изглежда не Ñте абонирани за нÑкои от предварително направени ÑпиÑъци Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸, които автоматично премахват нежеланото Ñъдържание от Ñтраниците.">
+<!ENTITY typeSelector.falsePositive.description "Изберете тази наÑтройка, ако на Ñтраницата липÑва важно Ñъдържание, показана е некоректно или не функционира правилно. Може да определите дали Adblock ÐŸÐ»ÑŽÑ Ðµ причина за проблема, като временно го изключите.">
+<!ENTITY typeSelector.other.label "Др&amp;уг проблем">
+<!ENTITY emailComment.label "Ðие ви препоръчваме да въведете валиден емайл адреÑ, така че да можем да Ñе Ñвържем, ако има въпроÑи отноÑно Ð²Ð°ÑˆÐ¸Ñ Ð¾Ñ‚Ñ‡ÐµÑ‚. Това ще ни позволи да Ñподелим Ð²Ð°ÑˆÐ¸Ñ Ð¿Ñ€Ð¸Ð½Ð¾Ñ Ð¸ да е Ñ Ð¿Ð¾ виÑок приоритет.">
+<!ENTITY issues.whitelist.remove.label "Повторно активиране на Adblock Plus на тази Ñтраница">
+<!ENTITY outdatedSubscriptions.description "Този филтър абонамент не е бил актуализиран най-малко две Ñедмици. МолÑ, актуализирайте тези абонаменти, преди да изпратите доклад въпроÑÑŠÑ‚ може да е решен вече и да не Ñе налага да докладвате.">
+<!ENTITY dataCollector.description "МолÑ, изчакайте нÑколко Ñекунди, докато Adblock Plus Ñъбере необходимите данни.">
+<!ENTITY sendButton.label "Из&amp;пращане на доклада">
+<!ENTITY comment.label "&amp;Коментар (по избор)">
+<!ENTITY sendPage.errorMessage "Опитът за изпращане на доклада Ñе провали Ñ ÐºÐ¾Ð´ на грешка &quot;?1?&quot;. МолÑ, уверете Ñе, че Ñте Ñвързани Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð½ÐµÑ‚ и повторете. Ðко проблемът продължи, Ð¼Ð¾Ð»Ñ Ð¿Ð¾Ñ‚ÑŠÑ€Ñете помощ в [link]форума на Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Покажи наÑкоро предÑтавените доклади">
+<!ENTITY commentPage.heading "Въвеждане на коментар">
+<!ENTITY update.start.label "Започни обновÑването Ñега">
+<!ENTITY issues.disabledfilters.description "Следните филтри Ñа изключени, но въпреки това може да окажат влиÑние на тази Ñтраница:">
+<!ENTITY screenshot.description "Същата Ñтраница може да изглежда различно за различни хора. Това може да ни помогне да разберем проблема, ако прикачите Ñнимка на екрана към Ð²Ð°ÑˆÐ¸Ñ Ð´Ð¾ÐºÐ»Ð°Ð´. Можете да премахнете чаÑтите, Ñъдържащи чувÑтвителна информациÑ, както и зони, в които проблемът Ñе забелÑзва. За да направите това натиÑнете ÑÑŠÐ¾Ñ‚Ð²ÐµÑ‚Ð½Ð¸Ñ Ð±ÑƒÑ‚Ð¾Ð½ и изберете чаÑтта от изображението Ñ Ð¼Ð¸ÑˆÐºÐ°Ñ‚Ð°.">
+<!ENTITY screenshot.attach.label "Пр&amp;икачване на изображение на Ñтраницата към доклада">
+<!ENTITY issues.whitelist.description "Ð’ момента Adblock Plus е изключен за Ñтраницата, коÑто докладвате. ÐœÐ¾Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ñ€Ð°Ð¹Ñ‚Ðµ повторно
+ и презаредете Ñтраницата преди да изпратите доклада за да помогнете за откриване на проблема.">
+<!ENTITY typeSelector.falseNegative.label "Adblock ÐŸÐ»ÑŽÑ Ð½Ðµ блоки&amp;ра реклама">
+<!ENTITY typeSelector.heading "Изберете тип на проблема">
+<!ENTITY anonymity.warning "Ðие нÑма да бъдем в ÑÑŠÑтоÑние да Ñе върнем при теб и вероÑтно ще Ñвалим приоритета на на доклада най доло.">
+<!ENTITY wizard.title "Докладчик за проблеми">
+<!ENTITY issues.ownfilters.disable.label "Изключване на филтър">
+<!ENTITY commentPage.description "Полето по-долу ви позволÑва да въведете коментар да ни помогне да разберем проблема. Тази Ñтъпка не е задължителна, но Ñе препоръчва, ако проблемът не е очевиден. Можете Ñъщо да прегледате данните от доклада, преди да е изпратен.">
+<!ENTITY comment.lengthWarning "Дължината на коментара надвишава 1000 знака. Само първите 1000 знака ще бъдат изпратени.">
+<!ENTITY typeSelector.falseNegative.description "Изберете тази наÑтройка, ако Ñе показва реклама въпреки, че Adblock ÐŸÐ»ÑŽÑ Ðµ включен.">
+<!ENTITY sendPage.waitMessage "МолÑ, изчакайте докато Adblock Plus предÑÑ‚Ð°Ð²Ñ Ð’Ð°ÑˆÐ¸Ñ Ð¾Ñ‚Ñ‡ÐµÑ‚.">
+<!ENTITY dataCollector.heading "Добре дошли в докладчика за проблеми">
+<!ENTITY screenshot.heading "Прикачете екранна Ñнимка">
+<!ENTITY sendPage.heading "Изпрати доклада">
+<!ENTITY issues.subscriptionCount.description "Изглежда, че Ñте Ñе абонирали за твърде много филтри. Тази наÑтройка не Ñе препоръчва, защото ще направи вероÑтноÑтта от проблеми много по-виÑоки. Също така не може да приемем отчета за грешки защото не е ÑÑно кой филтър прави проблеми и кой автор трÑбва да предприеме дейÑтвиÑ. МолÑ, премахнете вÑички и оÑтавете Ñамо най важниÑÑ‚ филтър и пробвайте дали проблемът вÑе още ÑъщеÑтвува.">
+<!ENTITY screenshot.mark.label "&amp;Маркиране на проблема">
+<!ENTITY privacyPolicy.label "Защита на личните данни">
+<!ENTITY issues.description "Adblock Plus откри проблеми Ñ Ð²Ð°ÑˆÐ°Ñ‚Ð° конфигурациÑ, които може да причинÑват
+ този проблем или ще затрудни доклада за разÑледването.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/sidebar.dtd
new file mode 100644
index 0000000..12441c0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Рамки на флаш продукти">
+<!ENTITY address.label "ÐдреÑ">
+<!ENTITY context.open.label "Отвори в нов под прозорец">
+<!ENTITY type.label "Тип">
+<!ENTITY tooltip.filterSource.label "Източник на филтъра">
+<!ENTITY noitems.label "ÐÑма блокирани продукти">
+<!ENTITY filter.label "Филтър">
+<!ENTITY tooltip.size.label "Размер:">
+<!ENTITY reattach.label "Прикачи отново">
+<!ENTITY search.label "&amp;ТърÑи:">
+<!ENTITY docDomain.thirdParty "(трета Ñтрана)">
+<!ENTITY filterSource.label "Филтър източник">
+<!ENTITY tooltip.docDomain.label "Източник на документа:">
+<!ENTITY context.copy.label "Копирай адреÑа на продукта">
+<!ENTITY tooltip.type.label "Тип:">
+<!ENTITY context.disablefilter.label "Да изключа ли филтър ?1?">
+<!ENTITY context.copyFilter.label "Копирай филтърът">
+<!ENTITY context.block.label "Блокирай този продукт">
+<!ENTITY context.enablefilter.label "Повторно включване на филтъра ?1?">
+<!ENTITY detach.label "Отдели">
+<!ENTITY whitelisted.label "Разрешена Ñтранница">
+<!ENTITY context.disablefilteronsite.label "Да изключа ли този филтър за ?1?">
+<!ENTITY detached.title "Adblock Plus: Блокирани продукти (отделени)">
+<!ENTITY docDomain.firstParty "ОÑновни">
+<!ENTITY tooltip.type.whitelisted "(разрешен)">
+<!ENTITY tooltip.filter.label "Филтър в Ñила:">
+<!ENTITY tooltip.filter.disabled "(изключен)">
+<!ENTITY context.editfilter.label "Редактиране на филтъра в Ñила:">
+<!ENTITY tooltip.type.blocked "(блокиран)">
+<!ENTITY size.label "Размер">
+<!ENTITY context.whitelist.label "Добави изключващо правило за продукта">
+<!ENTITY context.selectAll.label "Избери вÑички">
+<!ENTITY state.label "СъÑтоÑние">
+<!ENTITY docDomain.label "Източник на документа">
+<!ENTITY tooltip.address.label "ÐдреÑ:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/subscriptionSelection.dtd
new file mode 100644
index 0000000..df9a1b7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/bg/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "До&amp;бави абонамент за филтър &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock ÐŸÐ»ÑŽÑ Ð½Ðµ уÑÐ¿Ñ Ð´Ð° изтегли ÑпиÑък Ñ Ð°Ð±Ð¾Ð½Ð°Ð¼ÐµÐ½Ñ‚Ð¸.">
+<!ENTITY list.download.retry "Опитайте отново">
+<!ENTITY title.label "&amp;Заглавие на абонамента:">
+<!ENTITY list.download.website "Покажи Ñайтът">
+<!ENTITY supplementMessage "Този абонамент за филтърът е предназначен да Ñе използва Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñка за филтри &quot;?1?&quot; Които не използвате вÑе още.">
+<!ENTITY viewList.label "Покажи филтрите">
+<!ENTITY visitHomepage.label "ПоÑетете началната Ñтраница">
+<!ENTITY addSubscription.label "Добави абонамент">
+<!ENTITY dialog.title "ДобавÑне на абонамент за филтъра на Adblock ПлюÑ">
+<!ENTITY location.label "&amp;МеÑтоположение на ÑпиÑъка Ñ Ñ„Ð¸Ð»Ñ‚Ñ€Ð¸Ñ‚Ðµ:">
+<!ENTITY fromWeb.description "МолÑ, потвърдете, че желаете да добавите този абонамент за този филтър. Може да промените заглавието или меÑтоположението преди да го добавите.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/composer.dtd
new file mode 100644
index 0000000..28e8a16
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "al &amp;final de l'adreça">
+<!ENTITY domainRestriction.label "Restringeix al &amp;domini:">
+<!ENTITY collapse.default.no.label "Utilitza per defecte (no)">
+<!ENTITY firstParty.label "N&amp;omés originals">
+<!ENTITY preferences.label "Mo&amp;stra els filtres existents...">
+<!ENTITY pattern.label "Cerca un patró">
+<!ENTITY thirdParty.label "Només de &amp;tercers">
+<!ENTITY filter.label "Filtre &amp;nou:">
+<!ENTITY collapse.label "Co&amp;l·lapsa els bloquejats:">
+<!ENTITY match.warning "El patró inserit no concorda amb l'adreça a blocar/acceptar i quedarà sense efecte.">
+<!ENTITY anchor.start.label "&amp;al començament de l'adreça">
+<!ENTITY matchCase.label "Diferen&amp;cia majúscules i minúscules">
+<!ENTITY custom.pattern.label "&amp;Personalitza:">
+<!ENTITY unselectAllTypes.label "No seleccionis res">
+<!ENTITY type.whitelist.label "E&amp;xcepció">
+<!ENTITY regexp.warning "El patró inserit serà interpretat com una expressió regular, la qual no podrà ser processada per Adblock Plus i podria comportar una ralentització de la vostra experiència de navegació. Si no volíeu emprar una expressió regular, afegiu el símbol (*) al final del patró.">
+<!ENTITY dialog.title "Afegeix una regla de filtre de l'Adblock Plus">
+<!ENTITY basic.label "Visualització bàsica">
+<!ENTITY type.filter.label "Filtre de &amp;bloqueig">
+<!ENTITY types.label "Aplicar als tipus:">
+<!ENTITY shortpattern.warning "El patró inserit és massa curt per optimitzar-lo. L'abús de patrons ralentitzaran la navegació. Es recomana una cadena de text més llarga per aquest filtre.">
+<!ENTITY collapse.yes.label "Sí">
+<!ENTITY anchors.label "Accepta només un patró:">
+<!ENTITY collapse.default.yes.label "Utilitza per defecte (sí)">
+<!ENTITY domainRestriction.help "Indica un o més dominis separats pel símbol «|». El filtre només s'aplicarà a aquests dominis. El símbol «~» abans d'un nom de domini indica que el filtre no s'ha d'aplicar en aquest domini.">
+<!ENTITY accept.label "Afegeix un filtre">
+<!ENTITY options.label "Opcions">
+<!ENTITY disabled.warning "L'Adblock Plus està actualment desactivat. Encara podeu afegir filtres però no s'aplicaran fins que no [link]activeu l'Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "al començament del &amp;nom de domini">
+<!ENTITY collapse.no.label "No">
+<!ENTITY selectAllTypes.label "Selecciona-ho tot">
+<!ENTITY advanced.label "Visualització avançada">
+<!ENTITY pattern.explanation "El patró pot ser qualsevol part de l'adreça. L'asterisc (*) serveix de comodí. El filtre només serà aplicat a adreces que concordin amb el filtre.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/filters.dtd
new file mode 100644
index 0000000..541ba03
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Tots els filtres personalitzats seràn substituits per els continguts del fitxer seleccionat. Vols seguir endavant?">
+<!ENTITY slow.column "Filtres d'aminorament (&amp;w)">
+<!ENTITY enabled.column "Activat (&amp;n)">
+<!ENTITY subscription.lastDownload.checksumMismatch "Error en la suma de verificació">
+<!ENTITY noFiltersInGroup.text "El grup seleccionat està buit.">
+<!ENTITY subscription.actions.label "Accions">
+<!ENTITY filter.selectAll.label "Selecciona-ho tot">
+<!ENTITY backupButton.label "Fe&amp;s una còpia de seguretat i restaura">
+<!ENTITY restore.minVersion.warning "Atenció : El fitxer ha estat creat amb una versió més nova d'AdBlock Plus. Hauries d'actualitzar a l'última versió de l'Adblock Plus abans de restaurar des d'aquest fitxer.">
+<!ENTITY restore.error "Les dades del fitxer no s'han pogut processar, potser aquest no és un fitxer de còpia de Seguretat de l'AdBlock Plus ?">
+<!ENTITY sort.ascending.label "Ordre &amp;A &gt; Z">
+<!ENTITY sort.label "&amp;Ordena per">
+<!ENTITY subscription.source.label "Llista de filtres">
+<!ENTITY hitcount.column "Encerts (&amp;H)">
+<!ENTITY noFilters.text "Encara no teniu cap filtre personalitzat.">
+<!ENTITY backup.custom.title "Només els filtres personalitzats">
+<!ENTITY subscription.external.label "Actualitzat per altre extensió">
+<!ENTITY subscription.delete.label "Suprimeix">
+<!ENTITY noGroupSelected.text "Necessites seleccionar un grup de filtres abans que aquests filtres puguin ser mostrats.">
+<!ENTITY filter.cut.label "Retalla">
+<!ENTITY restore.default.label "Restaura de la còpia de seguretat del ?1?">
+<!ENTITY subscription.lastDownload.inProgress "S'està baixant...">
+<!ENTITY subscriptions.tab.label "Subscripció de filtres">
+<!ENTITY sort.descending.label "Ordre &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Segur que vols eliminar tots els filtres seleccionats ?">
+<!ENTITY filter.delete.label "Suprimeix">
+<!ENTITY addSubscriptionAdd.label "Afegeix">
+<!ENTITY viewMenu.label "Visualitza">
+<!ENTITY subscription.lastDownload.unknown "N/D">
+<!ENTITY addSubscriptionCancel.label "Cancel·la">
+<!ENTITY subscription.enabled.label "Activat">
+<!ENTITY noSubscriptions.text "Encara no heu afegit cap subscripció de filtre; l'AdBlock Plus no blocarà res sense filtres. Utilitzeu l'opció &quot;Afegeix el filtre&quot; per afegir-ne.">
+<!ENTITY subscription.update.label "Actualitza els Filtres">
+<!ENTITY dialog.title "Preferències de filtre de l'AdBlock Plus">
+<!ENTITY addFilter.label "Afegeix un filt&amp;re">
+<!ENTITY subscription.minVersion.warning "Aquesta subscripció de filtre requereix una versió recent. Heu d'actualitzar l'Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Error, no és una adreça vàlida">
+<!ENTITY backup.error "Hi ha hagut un error escribint els filtres al fitxer. Assegura't que el fitxer no s'hagi escrit protegint-lo o que l'estigui fent servir una altra aplicació.">
+<!ENTITY filter.moveUp.label "Mou amunt">
+<!ENTITY addGroup.label "Afe&amp;geix un grup de filtres">
+<!ENTITY filter.edit.label "Edita">
+<!ENTITY subscription.showHideFilters.label "Mostra/amaga els filtres">
+<!ENTITY acceptableAds2.label "Permet la publ&amp;icitat no intrusiva">
+<!ENTITY addSubscriptionOther.label "Afegeix altre subscripció de filtre">
+<!ENTITY close.label "Tanca">
+<!ENTITY sort.none.label "&amp;Desordenat">
+<!ENTITY filter.actions.label "Accions de filtre">
+<!ENTITY filter.copy.label "Copia">
+<!ENTITY filter.moveDown.label "Mou avall">
+<!ENTITY filter.resetHitCounts.label "Reinicia les estadístiques">
+<!ENTITY readMore.label "Més informació">
+<!ENTITY subscription.moveUp.label "Mou amunt">
+<!ENTITY addSubscription.label "A&amp;fegeix el filtre">
+<!ENTITY subscription.homepage.label "Pàgina d'inici">
+<!ENTITY backup.complete.title "Tots els filtres i subscripcions">
+<!ENTITY restore.own.label "Restaura d'una còpia de seguretat propia">
+<!ENTITY restore.complete.warning "Totes les preferències de filtre seràn substituides amb els continguts del fitxer seleccionat. Vols seguir endavant?">
+<!ENTITY filters.tab.label "Filtres personalitzats">
+<!ENTITY backup.label "Crea una nova còpia de seguretat">
+<!ENTITY find.label "&amp;Cerca">
+<!ENTITY subscription.moveDown.label "Mou avall">
+<!ENTITY subscription.lastDownload.connectionError "Error en la baixada">
+<!ENTITY subscription.lastDownload.success "Correcte">
+<!ENTITY subscription.lastDownload.invalidData "Error, no és una llista vàlida de filtres">
+<!ENTITY filter.paste.label "Enganxa">
+<!ENTITY subscription.disabledFilters.enable "Habilita els filtres">
+<!ENTITY lasthit.column "U&amp;ltim encert">
+<!ENTITY subscription.editTitle.label "Edita el títol">
+<!ENTITY subscription.disabledFilters.warning "Alguns filtres d'aquesta subscripció no estan habilitats.">
+<!ENTITY filter.column "Regla de &amp;filtre">
+<!ENTITY subscription.lastDownload.label "Darrera baixada">
+<!ENTITY viewList.label "Mostra la llista">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/firstRun.properties
new file mode 100644
index 0000000..2eac957
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Navegar de forma privada mitjançant la desactivació del seguiment – amagant el vostre rastre a les companyies de publicitat, que us seguirien encara més.
+firstRun_toggle_off=DESACTIVAT
+firstRun_feature_tracking=Desactivar el seguiment
+firstRun_feature_malware=Bloqueig de programari maliciós
+firstRun_title=S'ha instal·lat l'AdBlock Plus
+firstRun_toggle_on=ACTIVAT
+firstRun_acceptableAdsExplanation=Ens agradaria encoratjar els llocs web a utlitzar d'ara en endavant, publicitat no intrusiva. És per això que hem establert uns <a>patrons estrictes</a> per identificar els anuncis acceptables, els quals es mostren a sota de les preferències per defecte. Si encara voleu bloquejar tots els anuncis podeu <a>desactivar</a> això en pocs segons.
+firstRun_contributor_credits=Crèdits de contribució
+firstRun_dataCorruptionWarning=Es segueix mostrant aquesta pàgina? <a>Cliqueu aquí!</a>
+firstRun_acceptableAdsHeadline=Els anuncis molestos ara es bloquejaran
+firstRun_share=Digueu-ho a les vostres amistats
+firstRun_share_headline=<a>Dóneu-nos un cop de mà</a> al fer la xarxa un lloc millor
+firstRun_feature_social_description=Eliminar automàticament de la vostra experència de navegació els botons socials, com el m'agrada de Facebook, que apareixen a les pàgines web i segueixen el vostre comportament.
+firstRun_filterlistsReinitializedWarning=Sembla que un problema ha causat que tots els filtres es suprimeixin, però hem pogut restaurar una còpia de seguretat. Durant aquest procés, també s'ha restaurat els filtres i la configuració d'anuncis acceptable. Verifiqueu que la configuració actual és la desitjada, mitjançant les <a>«Preferències del filtre»</a> de l'Adblock Plus.
+firstRun_feature_malware_description=Fer la vostra navegació més segura bloquejant els dominis de malware coneguts.
+firstRun_features=Adblock Plus pot fer molt més que bloquejar anuncis
+firstRun_donate=Feu un donatiu
+firstRun_donate_label=Recolzeu el nostre projecte
+firstRun_feature_social=Eliminar els botons de xarxes socials
+firstRun_legacySafariWarning=Estàs usant una versió antiga de Safari que no es troba suportada per Adblock Plus.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/global.properties
new file mode 100644
index 0000000..1145e04
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=La pàgina actual no conté elements bloquejables
+action3_tooltip=Clica per activar/desactivar Adblock Plus
+notification_antiadblock_title=Amagar missatges dirigits?
+type_label_script=script
+filter_elemhide_nocriteria=Cap criteri especificat per reconeixes l'element a amagar
+blockingGroup_title=Regles de blocatge d'anuncis
+whitelisted_tooltip=Adblock Plus està actiu però desactivat en la pàgina actual
+type_label_stylesheet=llista d'estils
+blocked_count_tooltip=?1? de ?2?
+type_label_font=Tipus de lletra
+type_label_popup=finestra emergent
+filter_regexp_tooltip=El filtre és una expressió regular o és massa curt per ser optimitzat. Massa d'aquests filtres poden alentir la vostra navegació.
+action0_tooltip=Clica per activar el menu contextual, clica amb el botó del mig per activar/desactivar.
+whitelisted_page=Adblock Plus ha estat desactivat per la pàgina actual
+remove_group_warning=Segur que vols eliminar aquest grup ?
+action1_tooltip=Clica per obrir/tancar els elements bloquejables, clica amb el botó del mig per activar/desactivar.
+type_label_xmlhttprequest=Petició XML
+active_tooltip=Adblock Plus està habilitat, ?1? subscripció (ns) de filtre i ?2? filtre personalitzats(s) en ús.
+type_label_document=document
+type_label_object_subrequest=Subpetició d'objecte
+whitelistGroup_title=Regles d'excepció
+disabled_tooltip=Adblock Plus està desactivat
+filter_elemhide_duplicate_id=Només un identificador de l'element pot ser especificat
+type_label_object=objecte
+action2_tooltip=Clica per obrir les preferències, clica amb el botó del mig per activar/desactivar.
+type_label_subdocument=marc
+clearStats_warning=Això reiniciarà totes les estadístiques d'ús del filtre.Vols procedir?
+notification_antiadblock_message=Aquesta web ha sigut coneguda per mostrar missatges dirigits a usuaris de Adblock Plus. Vols que Adblock Plus amague els missatges dirigits?
+blocked_count_addendum=(també a la llista blanca: ?1?, amagats: ?2?)
+subscription_invalid_location=La llista de filtres no és una URL vàlida ni un nom de fitxer vàlid.
+type_label_image=imatge
+remove_subscription_warning=Realment desitges eliminar aquesta subscripció?
+type_label_other=Un altre
+mobile_menu_enable=ABP : Activa
+type_label_media=àudio/vídeo
+mobile_menu_disable_site=ABP : Desactiva a ?1?
+elemhideGroup_title=Regles d'amagar elements
+mobile_menu_enable_site=ABP : Activa a ?1?
+type_label_elemhide=amagat
+newGroup_title=Nou grup de filtres
+default_dialog_title=AdBlock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/overlay.dtd
new file mode 100644
index 0000000..fc91e9e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Si">
+<!ENTITY notification.button.no "&amp;No">
+<!ENTITY sync.label "&amp;Sincronitza la configuració de l'AdBlock Plus">
+<!ENTITY whitelist.site.label "Inhabilita l'Adblock Plus a ?1?">
+<!ENTITY filters.label "&amp;Preferències del filtre">
+<!ENTITY disable.label "Inhabilita a tots els llocs">
+<!ENTITY objecttab.title "Bloca">
+<!ENTITY objecttab.tooltip "Feu clic aquí per blocar aquest objecte amb l'Adblock Plus">
+<!ENTITY menuitem.label "Preferències de l'Ad&amp;block Plus">
+<!ENTITY objecttabs.label "Mostra les &amp;pestanyes a Flash i Java">
+<!ENTITY sendReport.label "&amp;Informa sobre la pàgina">
+<!ENTITY whitelist.page.label "Inhabilita només en aquesta pàgina">
+<!ENTITY context.image.label "Adblock Plus: bloca la imatge">
+<!ENTITY counthits.label "Compta els cops que &amp;funciona el filtre">
+<!ENTITY opensidebar.label "Obre &amp;elements blocables">
+<!ENTITY notification.button.close "&amp;Tancar">
+<!ENTITY contribute.label "Contribueix a l'Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: bloca el marc">
+<!ENTITY blocked.tooltip "Elements bloquejats en aquesta pàgina:">
+<!ENTITY hideplaceholders.label "Amaga &amp;les localitzacions dels elements blocats">
+<!ENTITY showinstatusbar.label "Mostra a la barra d'&amp;estat">
+<!ENTITY sidebar.title "Elements blocables a la pàgina actual">
+<!ENTITY options.label "&amp;Opcions">
+<!ENTITY context.object.label "Adblock Plus: bloca l'objecte">
+<!ENTITY context.removeWhitelist.label "Adblock Plus:Rehabilita aquesta pàgina">
+<!ENTITY filters.tooltip "Filtres més actius:">
+<!ENTITY closesidebar.label "Tanca els elements &amp;blocables">
+<!ENTITY showintoolbar.label "Mostra a la &amp;barra d'eines">
+<!ENTITY status.tooltip "Estat:">
+<!ENTITY context.media.label "Adblock Plus: Bloqueja àudio/vídeo">
+<!ENTITY subscription.update.label "Actualitza els Filtres">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/sendReport.dtd
new file mode 100644
index 0000000..049bb72
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Des&amp;fés">
+<!ENTITY issues.disabledgroups.description "Els següents filtres/grups de filtres als quals estàs subscrits estan deshabilitats, tot i així podrien tenir algun efecte en aquesta pàgina:">
+<!ENTITY showData.label "Mostra les dades de l'informe">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus està bloquejant &amp;massa">
+<!ENTITY issues.change.description "Si us plau, torna a carregar la pàgina per provar els canvis i envia un informe si el problema no ha estat resolt per les alteracions.">
+<!ENTITY email.label "&amp;Email:">
+<!ENTITY issues.openPreferences.label "Obre les preferències del filtre">
+<!ENTITY sendPage.confirmation "El teu informe ha estat guardat. Pots accedir a la següent adreça:">
+<!ENTITY copyLink.label "&amp;Copia enllaç de l'informe">
+<!ENTITY issues.nofilters.description "L'Adblock Plus no està filtrant res a la pàgina actual. Segurament el problema no està relacionat amb l'Adblock Plus.">
+<!ENTITY sendPage.knownIssue "El problema del que informes probablement ja es coneix. Més informació:">
+<!ENTITY typeSelector.other.description "Selecciona aquesta opció si creieu que hi ha un error amb l'Adblock Plus que no sigui amb els filtres.">
+<!ENTITY issues.disabledgroups.enable.label "Activa filtre de subscripció / filtre de grup">
+<!ENTITY typeWarning.override.label "Ho entenc i vull pre&amp;sentar l'informe de totes maneres">
+<!ENTITY issues.disabled.enable.label "Habilita l'Adblock Plus">
+<!ENTITY update.fixed.description "L'error s'ha solucionat actualitzant els filtres existents. Torneu a carregar la pàgina i verifiqueu novament. Si el problema persisteix, envieu altre avís.">
+<!ENTITY anonymous.label "Envi&amp;ament de forma anònima">
+<!ENTITY reloadButton.label "Ac&amp;tualitza pàgina">
+<!ENTITY recentReports.clear.label "&amp;Suprimeix tots els informes">
+<!ENTITY typeSelector.description "Aquest assistent us mostrarà com enviar un Avís d'error de l'Adblock Plus. Primer seleccioneu el tipus d'error que heu trobat:">
+<!ENTITY screenshot.remove.label "Sup&amp;rimeix dades privades">
+<!ENTITY issues.ownfilters.description "Els filtres aplicats en aquesta pàgina poden ser definits per l'usuari/a. Inhabiliteu els filtres que poden causar el problema:">
+<!ENTITY update.inProgress.description "L'Adblock Plus ha d'actualitzar les subscripcions dels filtres per verificar si es pot resoldre d'aquesta manera. Espereu...">
+<!ENTITY sendPage.retry.label "Envia de nou">
+<!ENTITY data.label "Informe &amp;de dades:">
+<!ENTITY recentReports.label "Informes que heu enviat">
+<!ENTITY typeWarning.description "Has indicat que desitges informar d'algun problema general amb Adblock Plus més que d'un problema amb els filtres. Tingues en compte que aquests informes són els més complets al [link]fòrum d'Adblock Plus[/link]. Només hauries d'usar l'avisador a menys que vulguis completar una discussió existent, ja que ningú es donarà compte del teu informe si no se'ls proporciona l'enllaç al mateix. L'enllaç generat automàticament es concedirà després de la presentació de l'informe.">
+<!ENTITY issues.disabled.description "S'ha inhabilitat l'Adblock Plus i no filtrarà la publicitat no desitjada.">
+<!ENTITY attachExtensions.label "Adjunta una llista d'e&amp;xtensions actives per a l'informe en cas de que el conflicte amb les extensions sigui la causa del problema">
+<!ENTITY issues.nosubscriptions.add.label "Afegeix la subscripció a un filtre">
+<!ENTITY issues.disabledfilters.enable.label "Activa el filtre">
+<!ENTITY issues.override.label "La &amp;configuració és correcta, continua amb l'informe">
+<!ENTITY issues.nosubscriptions.description "No us heu subscrit a cap llista de filtres prefabricats per filtrar automàticament el contingut no desitjat de les pàgines web.">
+<!ENTITY typeSelector.falsePositive.description "Seleccioneu aquesta opció si a la pàgina manca contingut important, es mostra de forma incorrecta funciona deficientment. Podeu determinar si l'Adblock Plus és la causa del problema inhabilitant-lo temporalment.">
+<!ENTITY typeSelector.other.label "Altr&amp;es errors">
+<!ENTITY emailComment.label "Recomanem donar una adreça de correu electrònic vàlida per tal de contactar amb vostè si sorgeixen algunes preguntes sobre el vostre informe. També ens permetrà reconéixer les vostres contribucions i prioritzar-les.">
+<!ENTITY issues.whitelist.remove.label "Torna a habilitar l'Adblock Plus en aquesta pàgina">
+<!ENTITY outdatedSubscriptions.description "Aquestes subscripcions a filtres no s'han actualitzat en un mínim de dues setmanes i estan obsoletes. Actualitzeu-les abans d'informar d'un error, atès que ja podria estar solucionat.">
+<!ENTITY dataCollector.description "L'Adblock Plus està analitzant les dades. Espereu...">
+<!ENTITY sendButton.label "E&amp;nvia informe">
+<!ENTITY comment.label "&amp;Comentari (opcional):">
+<!ENTITY sendPage.errorMessage "Ha fallat un intent d'enviar l'informe d'error amb codi d'error &quot;?1?&quot;. Assegura't que estàs connectat/da a Internet i torna a intentar-ho. Si el problema persisteix, si us plau demana assistència al [link]fòrum d'Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Mostra els informes enviats recentment">
+<!ENTITY commentPage.heading "Escriu un comentari">
+<!ENTITY update.start.label "Actualitza ara">
+<!ENTITY issues.disabledfilters.description "Els següents filtres estan desactivats, però, podrien tenir un efecte en aquesta pàgina:">
+<!ENTITY screenshot.description "La mateixa pàgina pot ser diferent per a diferents persones. Pot ajudar-nos a entendre el problema si s'adjunta una captura de pantalla per a l'informe. Pots treure seccions que contenen informació confidencial, així com remarcar les zones on el problema és evident. Per a això fes clic al botó corresponent i selecciona una secció de la imatge amb el ratolí.">
+<!ENTITY screenshot.attach.label "Adjun&amp;ta una imatge de la pàgina amb l'informe">
+<!ENTITY issues.whitelist.description "L'Adblock Plus està desactivat per aquesta pàgina. Habiliteu-lo i verifiqueu si el problema continua abans d'enviar un informe d'error per aquest motiu.">
+<!ENTITY typeSelector.falseNegative.label "L'&amp;Adblock Plus no bloca un anunci">
+<!ENTITY typeSelector.heading "Seleccioneu el tipus d'incidència">
+<!ENTITY anonymity.warning "No podrem contestar-lo i segurament, no el prioritzarem.">
+<!ENTITY wizard.title "Avisador d'errors">
+<!ENTITY issues.ownfilters.disable.label "inhabilita el filtre">
+<!ENTITY commentPage.description "El camp de text a continuació et permet introduir un comentari que ens ajudi a comprendre el problema.Aquest pas és opcional però es recomana si el problema no és obvi.També pots revisar les dades de l'informe abans d'enviar.">
+<!ENTITY comment.lengthWarning "La longitud del teu comentari supera els 1000 caràcters. Només s'enviaran els primers 1000 caràcters.">
+<!ENTITY typeSelector.falseNegative.description "Seleccioneu aquesta opció si un anunci es mostra tot i que l'Adblock Plus està habilitat.">
+<!ENTITY sendPage.waitMessage "Espera mentre Adblock Plus fa l'enviament del teu informe.">
+<!ENTITY dataCollector.heading "Us donem la benvinguda a l'Avisador d'errors">
+<!ENTITY screenshot.heading "Adjunta Captura de pantalla">
+<!ENTITY sendPage.heading "Envia informe">
+<!ENTITY issues.subscriptionCount.description "Ja us heu subscrit a molts filtres. Aquesta configuració no és recomanable perquè podria augmentar el nombre d'errors. L'informe no serà enviat fins no verifiqueu que l'error és degut a un filtre. Inhabiliteu totes les subscripcions i comproveu afegint una subscripció alhora que l'error realment pertany a un filtre determinat.">
+<!ENTITY screenshot.mark.label "&amp;Marca el problema">
+<!ENTITY privacyPolicy.label "Política de Privadesa">
+<!ENTITY issues.description "L'Adblock Plus ha detectat problemes amb la configuració i podria ser la causa del problema o d'una anàlisi errònia.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/sidebar.dtd
new file mode 100644
index 0000000..e68a983
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Pampallugueja les vores de l'element">
+<!ENTITY address.label "Adreça">
+<!ENTITY context.open.label "Obre en una pestanya nova">
+<!ENTITY type.label "Tipus">
+<!ENTITY tooltip.filterSource.label "Filtre d'origen:">
+<!ENTITY noitems.label "Elements no bloquejables">
+<!ENTITY filter.label "Filtre">
+<!ENTITY tooltip.size.label "Mida:">
+<!ENTITY reattach.label "Reenganxa">
+<!ENTITY search.label "&amp;Cerca:">
+<!ENTITY docDomain.thirdParty "(tercers)">
+<!ENTITY filterSource.label "Filtre d'origen">
+<!ENTITY tooltip.docDomain.label "Font del document:">
+<!ENTITY context.copy.label "Copia l'adreça de l'element">
+<!ENTITY tooltip.type.label "Tipus:">
+<!ENTITY context.disablefilter.label "Inhabilita el filtre ?1?">
+<!ENTITY context.copyFilter.label "Copia el filtre">
+<!ENTITY context.block.label "Bloqueja aquest element">
+<!ENTITY context.enablefilter.label "Reactiva el filtre ?1?">
+<!ENTITY detach.label "Separa">
+<!ENTITY whitelisted.label "Pàgina a la llista de permesos">
+<!ENTITY context.disablefilteronsite.label "Inhabilita aquest filtre a ?1?">
+<!ENTITY detached.title "AdBlock Plus: Elements Blocables (Separat)">
+<!ENTITY docDomain.firstParty "(primers)">
+<!ENTITY tooltip.type.whitelisted "(a la llista de permesos)">
+<!ENTITY tooltip.filter.label "Filtre actiu">
+<!ENTITY tooltip.filter.disabled "(inhabilitat)">
+<!ENTITY context.editfilter.label "Edita el filtre actiu">
+<!ENTITY tooltip.type.blocked "(bloquejat)">
+<!ENTITY size.label "Mida">
+<!ENTITY context.whitelist.label "Afegeix una regla d'excepció per a l'element">
+<!ENTITY context.selectAll.label "Selecciona-ho tot">
+<!ENTITY state.label "Estat">
+<!ENTITY docDomain.label "Font del document">
+<!ENTITY tooltip.address.label "Adreça:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/subscriptionSelection.dtd
new file mode 100644
index 0000000..a3b3ef3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ca/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Afegeix la &amp;subscripció de filtre «?1?»">
+<!ENTITY list.download.failed "L'Adblock Plus ha fallat en trobar la llista de subscripcions.">
+<!ENTITY list.download.retry "Torna-ho a provar">
+<!ENTITY title.label "&amp;Títol de la subscripció:">
+<!ENTITY list.download.website "Vés a la pàgina web">
+<!ENTITY supplementMessage "Aquesta subscripció de filtre s'ha d'utilitzar amb «?1?» que encara no feu servir.">
+<!ENTITY viewList.label "Mostra els filtres">
+<!ENTITY visitHomepage.label "Vés a la pàgina web">
+<!ENTITY addSubscription.label "Afegeix una subscripció">
+<!ENTITY dialog.title "Afegeix la subscripció de filtre per a Adblock Plus">
+<!ENTITY location.label "&amp;Filtra la localització de la llista:">
+<!ENTITY fromWeb.description "Confirmeu que voleu afegir aquesta subscripció de filtre. Podeu canviar el títol de la subscripció o la localització abans d'afegir-la.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/composer.dtd
new file mode 100644
index 0000000..a01b809
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "na &amp;konci adresy">
+<!ENTITY domainRestriction.label "Omezit na &amp;doménu:">
+<!ENTITY collapse.default.no.label "Použít jako výchozí (ne)">
+<!ENTITY firstParty.label "Pouze vl&amp;astní filtry">
+<!ENTITY preferences.label "Zobrazit &amp;existující filtry...">
+<!ENTITY pattern.label "Vyhledat vzor">
+<!ENTITY thirdParty.label "Pouze fil&amp;try třetích stran">
+<!ENTITY filter.label "Nový &amp;filtr:">
+<!ENTITY collapse.label "M&amp;inimalizovat blokované objekty:">
+<!ENTITY match.warning "Vzor, který jste zadali, už neodpovídá adrese, kterou chcete zablokovat/povolit a nebude na ni tedy mít žádný úÄinek.">
+<!ENTITY anchor.start.label "na &amp;zaÄátku adresy">
+<!ENTITY matchCase.label "&amp;Rozlišovat velikost písmen">
+<!ENTITY custom.pattern.label "Vlast&amp;ní:">
+<!ENTITY unselectAllTypes.label "Zrušit výběr">
+<!ENTITY type.whitelist.label "&amp;Výjimka">
+<!ENTITY regexp.warning "Vzor, který jste zadali, bude interpretován jako regulární výraz. Mnoho regulárních výrazů může zpomalit vaše prohlížení stránek. Pokud jste nechěli použít regulární výraz, přidejte znak * na konec vzoru.">
+<!ENTITY dialog.title "Přidat pravidlo filtru Adblock Plus">
+<!ENTITY basic.label "Základní zobrazení">
+<!ENTITY type.filter.label "&amp;Blokující filtr">
+<!ENTITY types.label "Použít na typy:">
+<!ENTITY shortpattern.warning "Vzor, který jste zadali, je příliÅ¡ krátký, aby mohl být optimalizován. Mnoho takových výrazů může zpomalit vaÅ¡e prohlížení stránek. Je doporuÄeno, abyste pro tento filtr zadali delší Å™etÄ›zec.">
+<!ENTITY collapse.yes.label "Ano">
+<!ENTITY anchors.label "Povolit vzor pouze:">
+<!ENTITY collapse.default.yes.label "Použít jako výchozí (ano)">
+<!ENTITY domainRestriction.help "Zadejte jednu nebo více domén oddělených znakem &quot;|&quot;, filtr bude poté použit pouze na těchto doménách. Znak &quot;~&quot; před názvem domény zajistí, že filtr nebude na této doméně použit.">
+<!ENTITY accept.label "Přidat filtr">
+<!ENTITY options.label "Možnosti">
+<!ENTITY disabled.warning "Adblock Plus je momentálně zakázán. I tak můžete přidávat filtry, ale nebudou použity, dokud [link]nepovolíte Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "na &amp;zaÄátku názvu domény">
+<!ENTITY collapse.no.label "Ne">
+<!ENTITY selectAllTypes.label "Vybrat vše">
+<!ENTITY advanced.label "PokroÄilé zobrazení">
+<!ENTITY pattern.explanation "Vzor může být jakákoli Äást adresy, znak * funguje jako jakýkoliv text. Filtr bude aplikován pouze na adresy odpovídající vzoru.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/filters.dtd
new file mode 100644
index 0000000..d91d351
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "VÅ¡echny vaÅ¡e vlastní filtry budou nahrazeny obsahem vybraného souboru. Chcete pokraÄovat?">
+<!ENTITY slow.column "Po&amp;malé filtry">
+<!ENTITY enabled.column "Po&amp;volené">
+<!ENTITY subscription.lastDownload.checksumMismatch "Chyba, neodpovídá kontrolní souÄet">
+<!ENTITY noFiltersInGroup.text "Vybraná skupina je prázdná">
+<!ENTITY subscription.actions.label "Akce">
+<!ENTITY filter.selectAll.label "Vybrat vše">
+<!ENTITY backupButton.label "Zál&amp;ohování a obnova">
+<!ENTITY restore.minVersion.warning "Varování: Soubor byl vytvoÅ™en novÄ›jší verzí Adblocku Plus. MÄ›li byste jej aktualizovat na nÄ›jnovÄ›jší verzi, než budete pokraÄovat.">
+<!ENTITY restore.error "Data ze souboru nelze zpracovat, možná nejde o zálohu filtrů Adblocku Plus?">
+<!ENTITY sort.ascending.label "VzestupnÄ› (&amp;A-Z)">
+<!ENTITY sort.label "&amp;Seřadit podle">
+<!ENTITY subscription.source.label "Seznam filtrů">
+<!ENTITY hitcount.column "Zása&amp;hy">
+<!ENTITY noFilters.text "Nemáte žádné vlastnoruÄnÄ› vytvoÅ™ené filtry.">
+<!ENTITY backup.custom.title "Pouze vlastní filtry">
+<!ENTITY subscription.external.label "Aktualizováno jiným rozšířením">
+<!ENTITY subscription.delete.label "Smazat">
+<!ENTITY noGroupSelected.text "Musíte vybrat skupinu filtrů, aby byly zobrazeny nějaké filtry.">
+<!ENTITY filter.cut.label "Vyjmout">
+<!ENTITY restore.default.label "Obnovit ze zálohy z ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Stahuji...">
+<!ENTITY subscriptions.tab.label "Odebírané sady cizích filtrů">
+<!ENTITY sort.descending.label "SestupnÄ› (&amp;Z-A)">
+<!ENTITY filters.remove.warning "Opravdu chcete odebrat všechny vybrané filtry?">
+<!ENTITY filter.delete.label "Smazat">
+<!ENTITY addSubscriptionAdd.label "Přidat">
+<!ENTITY viewMenu.label "Zobrazit">
+<!ENTITY subscription.lastDownload.unknown "neznámo">
+<!ENTITY addSubscriptionCancel.label "Zrušit">
+<!ENTITY subscription.enabled.label "Povoleno">
+<!ENTITY noSubscriptions.text "Zatím jste nezaÄali odebírat žádnou sadu cizích filtrů. Adblock Plus nebude blokovat nic bez nastavených filtrů, použijte prosím &quot;PÅ™idat cizí filtry&quot;, abyste nÄ›jaké pÅ™idali.">
+<!ENTITY subscription.update.label "Aktualizovat filtry">
+<!ENTITY dialog.title "Předvolby filtrů Adblocku Plus">
+<!ENTITY addFilter.label "&amp;Přidat filtr">
+<!ENTITY subscription.minVersion.warning "Tato cizí sada filtrů vyžaduje novější verzi Adblocku Plus, měli byste jej aktualizovat na nejnovější verzi.">
+<!ENTITY subscription.lastDownload.invalidURL "Chyba, toto je nekorektní adresa.">
+<!ENTITY backup.error "Došlo k chybě při zápisu filtrů do souboru. Ujistěte se prosím, že soubor není chráněn proti zápisu nebo používán jinou aplikací.">
+<!ENTITY filter.moveUp.label "Posunout nahoru">
+<!ENTITY addGroup.label "Přidat &amp;skupinu filtrů">
+<!ENTITY filter.edit.label "Upravit">
+<!ENTITY subscription.showHideFilters.label "Zobrazit/skrýt filtry">
+<!ENTITY acceptableAds2.label "Povolit &amp;některé nerušivé reklamy">
+<!ENTITY addSubscriptionOther.label "Přidat další sadu cizích filtrů">
+<!ENTITY close.label "Zavřít">
+<!ENTITY sort.none.label "&amp;Neřadit">
+<!ENTITY filter.actions.label "Akce filtrů">
+<!ENTITY filter.copy.label "Kopírovat">
+<!ENTITY filter.moveDown.label "Posunout dolů">
+<!ENTITY filter.resetHitCounts.label "Vynulovat statistiku zásahů">
+<!ENTITY readMore.label "Zjistit více">
+<!ENTITY subscription.moveUp.label "Posunout nahoru">
+<!ENTITY addSubscription.label "Přidat cizí &amp;filtry">
+<!ENTITY subscription.homepage.label "Domovská stránka">
+<!ENTITY backup.complete.title "Všechny filtry a sady cizích filtrů">
+<!ENTITY restore.own.label "Obnovit z vlastní zálohy">
+<!ENTITY restore.complete.warning "VÅ¡echny vaÅ¡e pÅ™edvolby budou nahrazeny obsahem vybraného souboru. Chcete pokraÄovat?">
+<!ENTITY filters.tab.label "Vlastní filtry">
+<!ENTITY backup.label "Vytvořit novou zálohu">
+<!ENTITY find.label "Na&amp;jít">
+<!ENTITY subscription.moveDown.label "Posunout dolů">
+<!ENTITY subscription.lastDownload.connectionError "Chyba, nepodařilo se stáhnout soubor">
+<!ENTITY subscription.lastDownload.success "Úspěch">
+<!ENTITY subscription.lastDownload.invalidData "Chyba, stažený soubor není souborem filtrů Adblock Plus">
+<!ENTITY filter.paste.label "Vložit">
+<!ENTITY subscription.disabledFilters.enable "Povolit zakázané filtry">
+<!ENTITY lasthit.column "Pos&amp;lední zásah">
+<!ENTITY subscription.editTitle.label "Upravit název">
+<!ENTITY subscription.disabledFilters.warning "Některé filtry v této sadě jsou zakázány.">
+<!ENTITY filter.column "&amp;Pravidlo filtru">
+<!ENTITY subscription.lastDownload.label "Naposledy staženo:">
+<!ENTITY viewList.label "Zobrazit seznam">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/firstRun.properties
new file mode 100644
index 0000000..d71aea6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Zakázáním sledování si zachovejte soukromí pÅ™i prohlížení - zakryjte své stopy pÅ™ed reklamními spoleÄnostmi, které by jinak sladovali každiÄký Váš pohyb.
+firstRun_toggle_off=VYPNUTO
+firstRun_feature_tracking=Zakázat sledování
+firstRun_feature_malware=Blokování malware
+firstRun_title=Adblock Plus byl nainstalován
+firstRun_toggle_on=ZAPNUTO
+firstRun_acceptableAdsExplanation=Rádi bychom podpoÅ™ili webové stránky v používání jasné neobtěžující reklamy. Proto jsme zavedli <a>přísná pravidla</a> k urÄení pÅ™ijatelných reklam, které se pak ve výchozím nastavení zobrazují . Pokud pÅ™esto chcete blokovat veÅ¡kerou reklamu, můžete toto bÄ›hem chvilky <a>zakázat</a>.
+firstRun_contributor_credits=Zásluhy přispěvatelů
+firstRun_dataCorruptionWarning=Neustále se Vám tato stránka znovu zobrazuje? <a>Klikněte zde!</a>
+firstRun_acceptableAdsHeadline=Otravné reklamy budou nyní blokovány
+firstRun_share=Řekněte svým přátelům
+firstRun_share_headline=<a>Pomožte nám</a> uÄinit web lepším
+firstRun_feature_social_description=Automaticky zbavte své surfování od tlaÄítek sociálních médií, jako například Facebook "To se mi líbí", která se objevují na webových stránkách a sledují VaÅ¡e chování.
+firstRun_filterlistsReinitializedWarning=Zdá se, že nastal problém, který způsobil smazání všech filtrů a nebyli jsme schopni je obnovit ze zálohy. Museli jsme tudíž Vaše filtry a nastavení Přijatelných reklam resetovat. Prosím zkontrolujte si své nastavení seznamů filtrů a Přijatelných reklam v <a>předvolbách Adblocku Plus</a>.
+firstRun_feature_malware_description=Blokováním známých malwarových domén uÄiňte VaÅ¡e prohlížení webu bezpeÄnÄ›jším.
+firstRun_features=Adblock Plus toho umí více než jen blokovat reklamy
+firstRun_donate=přispějte
+firstRun_donate_label=Podpořte náš projekt
+firstRun_feature_social=Odstranit tlaÄítka sociálních médií
+firstRun_legacySafariWarning=Používáte starou verzi Safari, která není podporovaná Adblockem Plus. Nemusí to tak správnÄ› fungovat nebo to může zhorÅ¡it použitelnost na nÄ›kterých webových stránkách. DůraznÄ› doporuÄujeme buÄ aktualizovat na Safari 6.1.1 Äi vyšší (v OS X 10.8 Mountain Lion), nebo Safari 7.0.1 Äi vyšší (v OS X 10.9 Mavericks), nebo používat nejnovÄ›jší verzi Mozilla Firefoxu, Google Chrome Äi Opery.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/global.properties
new file mode 100644
index 0000000..18ffe9f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Na této stránce nebyly nalezeny prvky k zablokování
+action3_tooltip=Klepnutím povolit/zakázat Adblock Plus
+notification_antiadblock_title=Skrýt cílená hlášení?
+type_label_script=Skript
+filter_elemhide_nocriteria=Nebyla uvedena žádná kritérie pro rozpoznání elementu, který má být skryt
+blockingGroup_title=Pravidla blokování reklam
+whitelisted_tooltip=Adblock Plus je aktivní, ale pro aktuální stránku byl zakázán.
+type_label_stylesheet=Šablona kaskádových stylů
+blocked_count_tooltip=?1? z ?2?
+type_label_font=Písmo
+type_label_popup=vyskakovací okno
+filter_regexp_tooltip=Tento filtr je buÄ regulární výraz nebo je příliÅ¡ krátký, aby mohl být optimalizován. PříliÅ¡ mnoho takových filtrů může zpomalit vaÅ¡e prohlížení stránek.
+action0_tooltip=Levé tlaÄítko: Otevřít místní nabídku
+whitelisted_page=Adblock Plus byl pro aktuální stránku zakázán
+remove_group_warning=Chcete opravdu smazat tuhle skupniu?
+action1_tooltip=Levé tlaÄítko: Otevřít blokovatelné prvky
+type_label_xmlhttprequest=XML požadavek
+active_tooltip=Adblock Plus je aktivní, cizí sady filtrů: ?1?, vlastní filtry: ?2?
+type_label_document=Dokument
+type_label_object_subrequest=Subpožadavek objektu
+whitelistGroup_title=Výjimky z pravidel
+disabled_tooltip=Adblock Plus je zakázán
+filter_elemhide_duplicate_id=Může být uvedeno pouze jedno ID elementu, který má být skryt
+type_label_object=Objekt
+action2_tooltip=Levé tlaÄítko: Otevřít pÅ™edvolby
+type_label_subdocument=Rámec
+clearStats_warning=Toto smaže vÅ¡echny statistiky a vypne poÄítání zásahů filtrů. Chcete pokraÄovat?
+notification_antiadblock_message=O této stránce se ví, že zobrazuje hlášení cílená na uživatele Adblocku Plus. Chcete, aby Adblock Plus skryl tyto cílené zprávy?
+blocked_count_addendum=(povoleno výjimkou: ?1?, skryto: ?2?)
+subscription_invalid_location=Zadaná adresa seznamu cizích filtrů je buÄ nesprávná URL nebo obsahuje nesprávné jméno souboru.
+type_label_image=Obrázek
+remove_subscription_warning=SkuteÄnÄ› si pÅ™ejete odstranit tuto sadu cizích filtrů ?
+type_label_other=Ostatní
+mobile_menu_enable=ABP: povolit
+type_label_media=zvuk a video
+mobile_menu_disable_site=ABP: Zakázat na ?1?
+elemhideGroup_title=Pravidla skrývání prvků
+mobile_menu_enable_site=ABP: Povolit na ?1?
+type_label_elemhide=skryto
+newGroup_title=Nová skupina filtrů
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/overlay.dtd
new file mode 100644
index 0000000..9980b76
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Ano">
+<!ENTITY notification.button.no "&amp;Ne">
+<!ENTITY sync.label "Na&amp;stavení synchronizace Adblocku Plus">
+<!ENTITY whitelist.site.label "Vypnout na ?1?">
+<!ENTITY filters.label "&amp;Předvolby filtrů">
+<!ENTITY disable.label "Zakázat všude">
+<!ENTITY objecttab.title "Blokovat">
+<!ENTITY objecttab.tooltip "Klepněte zde pro blokování tohoto objektu pomocí Adblock Plus">
+<!ENTITY menuitem.label "Předvol&amp;by Adblock Plus">
+<!ENTITY objecttabs.label "Z&amp;obrazovat ouška u objektů Java a Flash">
+<!ENTITY sendReport.label "&amp;Nahlásit problém na této stránce">
+<!ENTITY whitelist.page.label "Vypnout pouze na této stránce">
+<!ENTITY context.image.label "Blokovat obrázek">
+<!ENTITY counthits.label "PoÄítat &amp;zásahy filtrů">
+<!ENTITY opensidebar.label "Zo&amp;brazit blokovatelné objekty">
+<!ENTITY notification.button.close "&amp;Zavřít">
+<!ENTITY contribute.label "Přispět Adblocku Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Blokovat rámec">
+<!ENTITY blocked.tooltip "Blokované prvky na této stránce:">
+<!ENTITY hideplaceholders.label "Skrýt zástupné o&amp;bjekty blokovaných prvků">
+<!ENTITY showinstatusbar.label "Zob&amp;razit ve stavovém řádku">
+<!ENTITY sidebar.title "Adblock Plus: Blokovatelné objekty na zobrazené stránce">
+<!ENTITY options.label "&amp;Možnosti">
+<!ENTITY context.object.label "Blokovat objekt">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Znovu povolit na této stránce">
+<!ENTITY filters.tooltip "NejúÄinnÄ›jší filtry:">
+<!ENTITY closesidebar.label "Skrýt seznam &amp;blokovatelných objektů">
+<!ENTITY showintoolbar.label "Zobrazit v &amp;nástrojové liště">
+<!ENTITY status.tooltip "Stav:">
+<!ENTITY context.media.label "Adblock Plus: Blokovat audio/video">
+<!ENTITY subscription.update.label "Aktualizovat filtry">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/sendReport.dtd
new file mode 100644
index 0000000..3fd5628
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Zpět">
+<!ENTITY issues.disabledgroups.description "Následující sady cizích filtrů / skupiny filtrů jsou zakázány, přesto můžou mít vliv na tuto stránku:">
+<!ENTITY showData.label "Zobrazit data hlášení">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blokuje příliš &amp;mnoho">
+<!ENTITY issues.change.description "Vaše nastavení bylo změněno. Obnovte prosím stránku pro otestování změn a odešlete hlášení problému, pokud nebyl vyřešen úpravami nastavení.">
+<!ENTITY email.label "E-&amp;mail:">
+<!ENTITY issues.openPreferences.label "Otevřít předvolby filtrů">
+<!ENTITY sendPage.confirmation "Vaše hlášení bylo odesláno. Můžete si prohlédnou hlášení na následující adrese:">
+<!ENTITY copyLink.label "&amp;Kopírovat adresu hlášení">
+<!ENTITY issues.nofilters.description "Adblock Plus na aktuální stránce nic neblokuje. Problém, který chcete nahlásit, není s největší pravděpodobností způsoben Adblockem Plus.">
+<!ENTITY sendPage.knownIssue "Problém, který jste nahlásili, je pravděpodobně již známý. Více informací:">
+<!ENTITY typeSelector.other.description "Vyberte tuto možnost, pokud máte pocit, že je chyba přímo v Adblocku Plus, ne ve jeho filtrech.">
+<!ENTITY issues.disabledgroups.enable.label "Povolit sadu cizích filtrů / skupinu filtrů">
+<!ENTITY typeWarning.override.label "&amp;Rozumím a přesto chci odeslat hlášení">
+<!ENTITY issues.disabled.enable.label "Aktivovat Adblock Plus">
+<!ENTITY update.fixed.description "Aktualizace vámi odebíraných sad filtrů pravděpodobně vyřešila problém,který jste reportovali.Prosím obnovte stránku a zkuste to znovu,klikněte na Znovu oznámit pokud problém přetrval.">
+<!ENTITY anonymous.label "&amp;Anonymní odeslání">
+<!ENTITY reloadButton.label "&amp;Obnovit stránku">
+<!ENTITY recentReports.clear.label "Odst&amp;ranit všechna hlášení">
+<!ENTITY typeSelector.description "Toto okno vás provede kroky potÅ™ebnými k oznámení problému v Adblocku Plus. ZaÄnÄ›te prosím vybráním druhu problému, se kterým jste se na této stránce setkali:">
+<!ENTITY screenshot.remove.label "&amp;Odstranit důvěrné údaje">
+<!ENTITY issues.ownfilters.description "Některé filtry použité na této stránce jsou vytvořené vámi. Zakažte prosím filtry, které mohly způsobit problém:">
+<!ENTITY update.inProgress.description "Adblock Plus potÅ™ebuje aktualizovat váš filtr odbÄ›rů aby zajistil že otázka nebyla již vyÅ™eÅ¡ena. Prosím Äekejte...">
+<!ENTITY sendPage.retry.label "Odeslat znovu">
+<!ENTITY data.label "&amp;Data hlášení:">
+<!ENTITY recentReports.label "Vaše nedávná hlášení">
+<!ENTITY typeWarning.description "Vybrali jste, že chcete nahlásit problém přímo v Adblocku Plus, nikoli chybu ve filtrech. Nejlepší způsob hlášení takovýchto chyb je na [link]fóru Adblocku Plus[/link]. Měli byste používat nástroj na hlášení chyb pouze jako doplněk existující diskuse na fóru, protože nikdo se nebude zabývat vaším hlášením, dokud neposkytnete odkaz na něj. Automaticky vygenerovaný odkaz bude zobrazet po odeslání hlášení.">
+<!ENTITY issues.disabled.description "Adblock Plus je zakázaný, v souÄasném stavu nebude blokovat nic.">
+<!ENTITY attachExtensions.label "&amp;Připojit seznam aktivních rozšíření k hlášení pro případ, že problém byl způsoben konfliktem mezi doplňky">
+<!ENTITY issues.nosubscriptions.add.label "Přidat sadu cizích filtrů">
+<!ENTITY issues.disabledfilters.enable.label "Povolit filtr">
+<!ENTITY issues.override.label "Nastavení je v &amp;pořádku, pokraÄovat v hlášení problém">
+<!ENTITY issues.nosubscriptions.description "Zdá se, že nejste přihlášeni k odběru žádných cizích sad filtrů, které automaticky odstraňují nežádoucí obsah z webových stránek.">
+<!ENTITY typeSelector.falsePositive.description "Vyberte tuto možnost, pokud na stránce chybí důležitý obsah, není zobrazena správnÄ› nebo nefunguje. Zda je Adblock Plus příÄinou problému můžete zjistit jeho doÄasným vypnutím.">
+<!ENTITY typeSelector.other.label "Jiný &amp;problém">
+<!ENTITY emailComment.label "Nabádáme vás,aby jste zadali platnou emailovou adresu,aby jsme vás mohli kontaktovat pokud budou nějaké nesrovnalosti s vašim nahlášením.Také nám to umožní rozeznat vaše příspěvky a přikládat jim vyšší prioritu.">
+<!ENTITY issues.whitelist.remove.label "Znovu povolit Adblock Plus na této stránce">
+<!ENTITY outdatedSubscriptions.description "Následující odběr filtrů nebyl aktualizován minimálně dva týdny.Prosím aktualizujte tyto odběry než reportujete chybu,problém už mohl být vyřešen.">
+<!ENTITY dataCollector.description "PoÄkejte prosím zatímco Adblock Plus sbírá potÅ™ebná data.">
+<!ENTITY sendButton.label "&amp;Odeslat hlášení">
+<!ENTITY comment.label "&amp;Komentář (nepovinný)">
+<!ENTITY sendPage.errorMessage "Pokus odeslat hlášení problému selhal s chybovým kódem &quot;?1?&quot;. Ověřte prosím, že jste připojeni k internetu a pokus opakujte. Pokud problém přetrvává, zkuste prosím vyhledat pomoc na [link]fóru Adblocku Plus[/link].">
+<!ENTITY showRecentReports.label "Ukázat nedávno odeslaná hlášení">
+<!ENTITY commentPage.heading "Vložit komentář">
+<!ENTITY update.start.label "Spustit aktualizaci">
+<!ENTITY issues.disabledfilters.description "Následující filtry jsou zakázány, přesto můžou mít vliv na tuto stránku:">
+<!ENTITY screenshot.description "Stejná stránka může být zobrazena odliÅ¡nÄ› různým lidem. Pomůže nám pochopit problém, pokud pÅ™ipojíte snímek stránky k vaÅ¡emu hlášení problému. Můžete odstranit Äásti obsahující důvÄ›rné informace i vyznaÄit místa, kde je problém vidÄ›t. Toho docílíte klepnutím na odpovídající tlaÄítko a výbÄ›rem Äásti obrázku myší.">
+<!ENTITY screenshot.attach.label "&amp;Připojit snímek stránky k hlášení">
+<!ENTITY issues.whitelist.description "Adblock Plus je aktuálně neaktivní na stránce, na které hlásíte problém. Prosím aktivujte jej a obnovte stránku předtím, než odešlete hlášení, abyste pomohli vyřešit váš problém.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus &amp;neblokuje reklamu">
+<!ENTITY typeSelector.heading "Vyberte druh problému">
+<!ENTITY anonymity.warning "Nebudeme moci vám odepsat a vašemu reportu bude pravděpodobně přikládána nižší priorita.">
+<!ENTITY wizard.title "Oznamování problémů">
+<!ENTITY issues.ownfilters.disable.label "Zakázat filtr">
+<!ENTITY commentPage.description "Do textového pole níže můžete vložit komentář vysvÄ›tlující problém, který hlásíte. Tento krok není povinný, ale je doporuÄený, pokud problém není jednoznaÄnÄ› viditelný. Můžete také prohlédnout data hlášení pÅ™ed jejich odesláním.">
+<!ENTITY comment.lengthWarning "Váš komentář přesahuje 1000 znaků. Pouze prvních 1000 znaků bude odesláno.">
+<!ENTITY typeSelector.falseNegative.description "Tuto možnost vyberte v případě, že vidíte reklamu i přesto, že je Adblock Plus aktivovaný.">
+<!ENTITY sendPage.waitMessage "Prosím poÄkejte zatímco Adblock Plus odesílá vaÅ¡e hlášení.">
+<!ENTITY dataCollector.heading "Vítejte v nástroji na oznamování problémů">
+<!ENTITY screenshot.heading "Připojit snímek">
+<!ENTITY sendPage.heading "Odeslat hlášení">
+<!ENTITY issues.subscriptionCount.description "Vypadá to, že jste pÅ™ihlášeni k odbÄ›ru příliÅ¡ mnoha sad cizích filtrů. Toto nastavení není doporuÄeno, protože výraznÄ› zvyÅ¡uje pravdÄ›podobnost výskytu problémů. Zároveň nelze pÅ™ijmout vaÅ¡e hlášení, protože není jasné, který z autorů sad cizích filtrů je za zodpovÄ›dný. OdhlaÅ¡te se prosím z odbÄ›ru vÅ¡ech nepotÅ™ebných sad cizích filtrů a vyzkouÅ¡ejte, zda se problém vyskytuje i poté.">
+<!ENTITY screenshot.mark.label "&amp;VyznaÄit problém">
+<!ENTITY privacyPolicy.label "Ochrana soukromí">
+<!ENTITY issues.description "Adblock Plus zjistil problémy s vaším nastavením, které můžou způsobovat tento problém nebo ztížit jeho řešení.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/sidebar.dtd
new file mode 100644
index 0000000..8707ce4
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Blikání obrysu objektu">
+<!ENTITY address.label "Adresa">
+<!ENTITY context.open.label "Otevřít v novém panelu">
+<!ENTITY type.label "Typ">
+<!ENTITY tooltip.filterSource.label "Zdroj filtru:">
+<!ENTITY noitems.label "Nic nebylo zablokováno">
+<!ENTITY filter.label "Filtr">
+<!ENTITY tooltip.size.label "Velikost:">
+<!ENTITY reattach.label "Připojit">
+<!ENTITY search.label "&amp;Hledat:">
+<!ENTITY docDomain.thirdParty "(externí)">
+<!ENTITY filterSource.label "Zdroj filtru">
+<!ENTITY tooltip.docDomain.label "Zdroj dokumentu:">
+<!ENTITY context.copy.label "Kopírovat adresu objektu">
+<!ENTITY tooltip.type.label "Typ:">
+<!ENTITY context.disablefilter.label "Zakázat filtr ?1?">
+<!ENTITY context.copyFilter.label "Kopírovat filtr">
+<!ENTITY context.block.label "Blokovat tento objekt">
+<!ENTITY context.enablefilter.label "Opět povolit filtr ?1?">
+<!ENTITY detach.label "Oddělit">
+<!ENTITY whitelisted.label "Adresa je na bílé listině">
+<!ENTITY context.disablefilteronsite.label "Zakázat tento filtr na ?1?">
+<!ENTITY detached.title "Adblock Plus: Blokovatelné prvky (odděleno)">
+<!ENTITY docDomain.firstParty "(vlastní)">
+<!ENTITY tooltip.type.whitelisted "(na bílé listině)">
+<!ENTITY tooltip.filter.label "Použité filtry:">
+<!ENTITY tooltip.filter.disabled "(zakázaný)">
+<!ENTITY context.editfilter.label "Upravit příslušný filtr">
+<!ENTITY tooltip.type.blocked "(blokováno)">
+<!ENTITY size.label "Velikost">
+<!ENTITY context.whitelist.label "Přidat výjimku pro tento objekt">
+<!ENTITY context.selectAll.label "Vybrat vše">
+<!ENTITY state.label "Stav">
+<!ENTITY docDomain.label "Zdroj dokumentu">
+<!ENTITY tooltip.address.label "Adresa:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/subscriptionSelection.dtd
new file mode 100644
index 0000000..a3fb375
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/cs/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Přidat také cizí &amp;sadu filtrů &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblocku Plus se nepodařilo získat seznam cizích sad filtrů.">
+<!ENTITY list.download.retry "Zkusit znovu">
+<!ENTITY title.label "&amp;OznaÄení cizích filtrů:">
+<!ENTITY list.download.website "Zobrazit webovou stránku">
+<!ENTITY supplementMessage "Tato cizí sada filtrů je urÄena k používání se sadou &quot;?1?&quot;, kterou jeÅ¡tÄ› nepoužíváte.">
+<!ENTITY viewList.label "Zobrazit pravidla">
+<!ENTITY visitHomepage.label "Navštívit domovskou stránku">
+<!ENTITY addSubscription.label "Přidat cizí sadu filtrů">
+<!ENTITY dialog.title "Přidat sadu cizích filtrů Adblock Plus">
+<!ENTITY location.label "&amp;Umístění sady filtrů:">
+<!ENTITY fromWeb.description "Prosím potvrÄte, že chcete pÅ™idat tuto cizí sadu filtrů. Můžete zmÄ›nít její titulek nebo umístÄ›ní pÅ™ed jejím pÅ™idáním.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/composer.dtd
new file mode 100644
index 0000000..124473c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "i s&amp;lutningen af adressen">
+<!ENTITY domainRestriction.label "Begræns til &amp;domæne:">
+<!ENTITY collapse.default.no.label "Brug standard (nej)">
+<!ENTITY firstParty.label "Kun &amp;førsteparts">
+<!ENTITY preferences.label "Vi&amp;s eksisterende filtre...">
+<!ENTITY pattern.label "Kig efter mønster">
+<!ENTITY thirdParty.label "Kun tred&amp;jeparts">
+<!ENTITY filter.label "&amp;Nyt filter:">
+<!ENTITY collapse.label "Sammenf&amp;old blokeret:">
+<!ENTITY match.warning "Det angivne mønster matcher ikke længere den blokerede/hvidlistede adresse og har ingen effekt.">
+<!ENTITY anchor.start.label "i be&amp;gyndelsen af adressen">
+<!ENTITY matchCase.label "&amp;Versalfølsom (a/A)">
+<!ENTITY custom.pattern.label "&amp;Tilpasset:">
+<!ENTITY unselectAllTypes.label "Vælg ingen">
+<!ENTITY type.whitelist.label "&amp;Undtagelsesregel">
+<!ENTITY regexp.warning "Det indtastede mønster vil blive fortolket som et regulært udtryk. Mange regulære udtryk kan gøre din browser langsommere. Hvis det ikke var din mening at bruge et regulært udtryk, så tilføj et * i sidst i mønsteret.">
+<!ENTITY dialog.title "Tilføj Adblock Plus filterregel">
+<!ENTITY basic.label "Enkel visning">
+<!ENTITY type.filter.label "Blok&amp;eringsfilter">
+<!ENTITY types.label "Benyt på typer:">
+<!ENTITY shortpattern.warning "Det indtastede mønster er for kort til optimering, og kan sløve din browser. Det anbefales at du vælger en længere streng for dette filter.">
+<!ENTITY collapse.yes.label "Ja">
+<!ENTITY anchors.label "Accepter kun mønster:">
+<!ENTITY collapse.default.yes.label "Brug standard (ja)">
+<!ENTITY domainRestriction.help "Angiv ét eller flere domæner adskilt af symbolet &quot;|&quot;, så vil filteret kun blive anvendt på disse domæner. Symbolet &quot;~&quot; foran et domæne angiver at filteret ikke skal anvendes på dette domæne.">
+<!ENTITY accept.label "Tilføj filter">
+<!ENTITY options.label "Indstillinger">
+<!ENTITY disabled.warning "Adblock Plus er deaktiveret. Du kan stadig tilføje filtre men disse anvendes ikke før du [link]aktiverer Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "i be&amp;gyndelsen af domænenavnet">
+<!ENTITY collapse.no.label "Nej">
+<!ENTITY selectAllTypes.label "Vælg alle">
+<!ENTITY advanced.label "Avanceret visning">
+<!ENTITY pattern.explanation "Mønsteret kan være enhver del af adressen, tegnet * bruges som jokertegn. Filteret benyttes kun på adresser der matcher mønsteret.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/filters.dtd
new file mode 100644
index 0000000..3d0400b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Alle dine tilpassede filtre erstattes af indholdet i den valgte fil. Vil du fortsætte?">
+<!ENTITY slow.column "Langs&amp;omme filtre">
+<!ENTITY enabled.column "A&amp;ktiveret">
+<!ENTITY subscription.lastDownload.checksumMismatch "Fejlede, checksum matcher ikke">
+<!ENTITY noFiltersInGroup.text "Den valgte gruppe er tom">
+<!ENTITY subscription.actions.label "Handlinger">
+<!ENTITY filter.selectAll.label "Vælg alle">
+<!ENTITY backupButton.label "&amp;Backup og gendan">
+<!ENTITY restore.minVersion.warning "Advarsel: Filen er oprettet med en nyere Adblock Plus. Du bør opdatere Adblock Plus før du gendanner fra denne fil.">
+<!ENTITY restore.error "Filen kunne ikke åbnes, måske er det ikke en Adblock Plus backupfil?">
+<!ENTITY sort.ascending.label "&amp;A &gt; Z">
+<!ENTITY sort.label "&amp;Sorter efter">
+<!ENTITY subscription.source.label "Filterliste">
+<!ENTITY hitcount.column "&amp;Hits">
+<!ENTITY noFilters.text "Du har endnu ingen tilpassede filtre.">
+<!ENTITY backup.custom.title "Kun tilpassede filtre">
+<!ENTITY subscription.external.label "Opdateret af en anden tilføjelse">
+<!ENTITY subscription.delete.label "Slet">
+<!ENTITY noGroupSelected.text "Vælg en filtergruppe for at få vist filtrene.">
+<!ENTITY filter.cut.label "Klip">
+<!ENTITY restore.default.label "Gendan backup fra ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Henter...">
+<!ENTITY subscriptions.tab.label "Filterabonnementer">
+<!ENTITY sort.descending.label "&amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Vil du fjerne de valgte filtre?">
+<!ENTITY filter.delete.label "Slet">
+<!ENTITY addSubscriptionAdd.label "Tilføj">
+<!ENTITY viewMenu.label "Vis">
+<!ENTITY subscription.lastDownload.unknown "Ukendt">
+<!ENTITY addSubscriptionCancel.label "Annuller">
+<!ENTITY subscription.enabled.label "Aktiveret">
+<!ENTITY noSubscriptions.text "Du har endnu ikke tilføjet Filterabonnementer. Adblock Plus blokerer ikke
+ noget uden filtre, så brug &quot;Tilføj Filterabonnementer;
+ for at tilføje nogen.">
+<!ENTITY subscription.update.label "Opdater filtre">
+<!ENTITY dialog.title "Adblock Plus filterpræferencer">
+<!ENTITY addFilter.label "Ti&amp;lføj filter">
+<!ENTITY subscription.minVersion.warning "Dette Filterabonnement kræver en nyere udgave af Adblock Plus. Opdater venligst.">
+<!ENTITY subscription.lastDownload.invalidURL "Fejlede, ikke en gyldig adresse">
+<!ENTITY backup.error "Der opstod en skrivefejl. Kontroller at filen ikke er skrivebeskyttet eller åben i et andet program.">
+<!ENTITY filter.moveUp.label "Flyt op">
+<!ENTITY addGroup.label "Tilføj filter&amp;gruppe">
+<!ENTITY filter.edit.label "Rediger">
+<!ENTITY subscription.showHideFilters.label "Vis/skjul filtre">
+<!ENTITY acceptableAds2.label "T&amp;illad upåtrængende annoncering delvist">
+<!ENTITY addSubscriptionOther.label "Tilføj endnu et abonnement">
+<!ENTITY close.label "Luk">
+<!ENTITY sort.none.label "&amp;Usorteret">
+<!ENTITY filter.actions.label "Filterhandlinger">
+<!ENTITY filter.copy.label "Kopier">
+<!ENTITY filter.moveDown.label "Flyt ned">
+<!ENTITY filter.resetHitCounts.label "Nulstil statistikker">
+<!ENTITY readMore.label "Lær mere">
+<!ENTITY subscription.moveUp.label "Flyt op">
+<!ENTITY addSubscription.label "Til&amp;føj filterabonnement">
+<!ENTITY subscription.homepage.label "Hjemmeside">
+<!ENTITY backup.complete.title "Alle filtre og abonnementer">
+<!ENTITY restore.own.label "Gendan eget backup">
+<!ENTITY restore.complete.warning "Alle dine filterpræferencer erstattes af indholdet i den valgte fil. Vil du fortsætte?">
+<!ENTITY filters.tab.label "Tilpassede filtre">
+<!ENTITY backup.label "Opret nyt backup">
+<!ENTITY find.label "S&amp;øg">
+<!ENTITY subscription.moveDown.label "Flyt op">
+<!ENTITY subscription.lastDownload.connectionError "Fejlede, hentningsfejl">
+<!ENTITY subscription.lastDownload.success "Succes">
+<!ENTITY subscription.lastDownload.invalidData "Fejlede, ikke en gyldig liste over filtre">
+<!ENTITY filter.paste.label "Sæt ind">
+<!ENTITY subscription.disabledFilters.enable "Aktiver deaktiverede filtre">
+<!ENTITY lasthit.column "Seneste h&amp;it">
+<!ENTITY subscription.editTitle.label "Rediger titel">
+<!ENTITY subscription.disabledFilters.warning "Dette abonnement indeholder deaktiverede filtre.">
+<!ENTITY filter.column "&amp;Filterregel">
+<!ENTITY subscription.lastDownload.label "Sidst hentet:">
+<!ENTITY viewList.label "Vis liste">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/firstRun.properties
new file mode 100644
index 0000000..57c941b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Deaktiver sporing - og skjul dine netvaner fra de annoncefirmaer der holder øje med din færden.
+firstRun_toggle_off=FRA
+firstRun_feature_tracking=Deaktiver sporing
+firstRun_feature_malware=Malwareblokering
+firstRun_title=Adblock Plus blev installeret
+firstRun_toggle_on=TIL
+firstRun_acceptableAdsExplanation=Vi vil gerne tilskynde websider til at bruge enkel, diskret annoncering. Derfor har vi indført <a>strenge retningslinjer</a> for at identificere de acceptable annoncer, der vises med standardindstillingerne. Hvis du stadig vil blokere alle annoncer, kan du let <a>deaktivere</a> dette.
+firstRun_contributor_credits=Tak til
+firstRun_dataCorruptionWarning=<a>Klik her!</a> hvis denne side bliver ved med at dukke op.
+firstRun_acceptableAdsHeadline=Generende annoncer bliver nu blokeret
+firstRun_share=Fortæl det til vennerne
+firstRun_share_headline=<a>Giv en hånd</a> med at gøre internettet til et bedre sted
+firstRun_feature_social_description=Fjern automatisk de knapper fra sociale medier, f.eks Facebook Like, som vises på websider og sporer din adfærd.
+firstRun_filterlistsReinitializedWarning=Et problem har tilsyneladende fjernet alle filtre og det var ikke muligt at gendanne en backup. Dine filtre og indstillinger for upåtrængende annoncer er derfor blevet nulstillet. Kontroller dine filtre m.m. i <a>Adblock Plus præferencer</a>.
+firstRun_feature_malware_description=Gør din browsing mere sikker ved at blokere kendte malwaredomæner.
+firstRun_features=Adblock Plus kan mere end blot blokere annoncer
+firstRun_donate=donér
+firstRun_donate_label=Støt projektet
+firstRun_feature_social=Fjern knapper fra sociale medier
+firstRun_legacySafariWarning=Du bruger en gammel udgave af Safari, som ikke understøttes af Adblock Plus. Det kan fungere dårligt eller forringe brugeroplevelsen på nogle websteder. Vi anbefaler kraftigt at opdatere til minimum Safari 6.1.1 (på OS X 10,8 Mountain Lion), Safari 7.0.1 (på OS X 10.9 Mavericks) eller bruge den nyeste Firefox, Google Chrome eller Opera.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/global.properties
new file mode 100644
index 0000000..6f29187
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Ingen blokerbare elementer på aktuel side
+action3_tooltip=Klik for at aktivere/deaktivere Adblock Plus.
+notification_antiadblock_title=Skjul målrettede beskeder ?
+type_label_script=script
+filter_elemhide_nocriteria=Ingen kriterier angivet for at genkende elementet der skal skjules
+blockingGroup_title=Blokeringsregler
+whitelisted_tooltip=Adblock Plus er aktiv men slået fra på nuværende side.
+type_label_stylesheet=stilark
+blocked_count_tooltip=?1? ud af ?2?
+type_label_font=skrifttype
+type_label_popup=popup vindue
+filter_regexp_tooltip=Dette filter er enten et regulært udtryk eller for kort til at blive optimeret. For mange af disse kan gøre din browser langsommere.
+action0_tooltip=Klik for at vise kontekstmenuen, midterklik aktiverer/deaktiverer.
+whitelisted_page=Adblock Plus er slået fra for aktuel side
+remove_group_warning=Vil du virkelig fjerne denne gruppe?
+action1_tooltip=Klik for at åbne/lukke blokérbare elementer, midterklik aktiverer/deaktiverer.
+type_label_xmlhttprequest=XML-forespørgsel
+active_tooltip=Adblock Plus er aktiveret, ?1? filter-abonnementer og ?2? brugerdefinerede filtre i brug.
+type_label_document=dokument
+type_label_object_subrequest=objekt underforespørgsel
+whitelistGroup_title=Undtagelsesregler
+disabled_tooltip=Adblock Plus er deaktiveret.
+filter_elemhide_duplicate_id=Kun ét ID for elementet der skal skjules kan angives
+type_label_object=objekt
+action2_tooltip=Klik for at åbne indstillingerne, midterklik aktiverer/deaktiverer.
+type_label_subdocument=ramme
+clearStats_warning=Nulstiller hit statistikker for alle filtre og deaktiverer tælleren. Vil du fortsætte?
+notification_antiadblock_message=Denne side er kendt for målrettede beskeder til Adblock Plus brugere. Skal Adblock Plus skjule disse beskeder ?
+blocked_count_addendum=(også hvidlistet: ?1?, skjult: ?2?)
+subscription_invalid_location=Filterlistens placering er hverken en gyldig URL eller et gyldigt filnavn.
+type_label_image=billede
+remove_subscription_warning=Vil du virkelig fjerne dette abonnement?
+type_label_other=andet
+mobile_menu_enable=ABP: Aktiver
+type_label_media=audio/video
+mobile_menu_disable_site=ABP: Deaktiver på ?1?
+elemhideGroup_title=Skjul emner regler
+mobile_menu_enable_site=ABP: Aktiver på ?1?
+type_label_elemhide=skjult
+newGroup_title=Ny filtergruppe
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/overlay.dtd
new file mode 100644
index 0000000..89522f2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Ja">
+<!ENTITY notification.button.no "&amp;Nej">
+<!ENTITY sync.label "Syn&amp;k Adblock Plus indstillinger">
+<!ENTITY whitelist.site.label "Slå fra på ?1?">
+<!ENTITY filters.label "&amp;Filterpræferencer">
+<!ENTITY disable.label "Deaktiver overalt">
+<!ENTITY objecttab.title "Bloker">
+<!ENTITY objecttab.tooltip "Klik her for at blokere dette objekt med Adblock Plus">
+<!ENTITY menuitem.label "&amp;Adblock Plus indstillinger">
+<!ENTITY objecttabs.label "Vis faner på Flash og &amp;Java">
+<!ENTITY sendReport.label "Ra&amp;pporter problem">
+<!ENTITY whitelist.page.label "Slå fra på denne side">
+<!ENTITY context.image.label "Adblock billede">
+<!ENTITY counthits.label "Tæl filter&amp;hits">
+<!ENTITY opensidebar.label "Åbn bloké&amp;rbare elementer">
+<!ENTITY notification.button.close "&amp;Luk">
+<!ENTITY contribute.label "Bidrag til Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock ramme">
+<!ENTITY blocked.tooltip "Blokerede emner på denne side:">
+<!ENTITY hideplaceholders.label "Skjul blokerede emners &amp;pladsholder">
+<!ENTITY showinstatusbar.label "&amp;Vis på statuslinje">
+<!ENTITY sidebar.title "Blokérbare elementer på aktuel side">
+<!ENTITY options.label "In&amp;dstillinger">
+<!ENTITY context.object.label "Adblock objekt">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Genaktivér på denne side">
+<!ENTITY filters.tooltip "Mest aktive filtre:">
+<!ENTITY closesidebar.label "Luk bloké&amp;rbare elementer">
+<!ENTITY showintoolbar.label "Vi&amp;s på værktøjslinje">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Bloker audio/video">
+<!ENTITY subscription.update.label "Opdater filtre">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/sendReport.dtd
new file mode 100644
index 0000000..5965eed
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Fortr&amp;yd">
+<!ENTITY issues.disabledgroups.description "Følgende abonnementer/filtre er deaktiveret, men kan stadig påvirke siden:">
+<!ENTITY showData.label "Vis rapportdata">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blokerer for &amp;meget">
+<!ENTITY issues.change.description "Indstillingen blev ændret. Genindlæs siden og se om det har hjulpet. Indsend rapporten hvis problemet stadig findes.">
+<!ENTITY email.label "E&amp;mail:">
+<!ENTITY issues.openPreferences.label "Ã…ben filterindstillinger">
+<!ENTITY sendPage.confirmation "Rapporten er gemt. Den kan ses på følgende adresse:">
+<!ENTITY copyLink.label "&amp;Kopier link">
+<!ENTITY issues.nofilters.description "Adblock Plus blokerer intet på denne side. Problemet skyldes sandsynligvis ikke Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Det rapporterede problem er sandsynligvis kendt. Mere information:">
+<!ENTITY typeSelector.other.description "Vælges hvis du tror problemet skyldes Adblock Plus selv og ikke filtrene.">
+<!ENTITY issues.disabledgroups.enable.label "Aktiver abonnement/filtre">
+<!ENTITY typeWarning.override.label "&amp;Jeg forstår og vil indsende alligevel.">
+<!ENTITY issues.disabled.enable.label "Aktiver Adblock Plus">
+<!ENTITY update.fixed.description "Opdateringen af filterabonnementet har sandsynligvis løst dit problem. Genindlæs siden og prøv igen. Rapporter igen hvis problemet består.">
+<!ENTITY anonymous.label "&amp;Anonym indsendelse">
+<!ENTITY reloadButton.label "&amp;Genindlæs side">
+<!ENTITY recentReports.clear.label "&amp;Fjern alle rapporter">
+<!ENTITY typeSelector.description "Dette vindue vil føre dig gennem de trin der kræves for at rapportere et Adblock Plus problem. Vælg først hvilken problemtype du oplever på denne side:">
+<!ENTITY screenshot.remove.label "&amp;Dæk område">
+<!ENTITY issues.ownfilters.description "Der anvendes brugerdefinerede filtre på denne side. Deaktiver filtret der måske forårsager problemet:">
+<!ENTITY update.inProgress.description "Adblock Plus skal opdatere dit filterabonnement for at sikre at problemet ikke er blevet løst. Vent...">
+<!ENTITY sendPage.retry.label "Send igen">
+<!ENTITY data.label "Ra&amp;pportdata:">
+<!ENTITY recentReports.label "Dine seneste rapporter">
+<!ENTITY typeWarning.description "Du vil indsende en rapport om generelle problemer med Adblock Plus, og ikke med filtrene. Bemærk at den slags problemer behandles bedst i [link]Adblock Plus forum[/link]. Du bør kun bruge denne problemrapport som bilag til en eksisterende diskussion, da ingen bemærker den med mindre du angiver et link. Du vil modtage et link efter afsendelse af rapporten.">
+<!ENTITY issues.disabled.description "Adblock Plus er deaktiveret og blokerer ingenting.">
+<!ENTITY attachExtensions.label "&amp;Vedhæft liste med aktive tilføjelser til konstatering af eventuelle konflikter">
+<!ENTITY issues.nosubscriptions.add.label "Tilføj filterabonnement">
+<!ENTITY issues.disabledfilters.enable.label "Aktiver filter">
+<!ENTITY issues.override.label "&amp;Indstillingen er korrekt, fortsæt rapporten">
+<!ENTITY issues.nosubscriptions.description "Du abonnerer tilsyneladende ikke på nogen af de filtre der automatisk fjerner uønsket indhold fra websider.">
+<!ENTITY typeSelector.falsePositive.description "Vælges hvis siden mangler vigtigt indhold, vises forkert eller ikke fungerer rigtigt. Du kan se om problemet skyldes Adblock Plus ved at deaktivere det midlertidigt.">
+<!ENTITY typeSelector.other.label "&amp;Andet">
+<!ENTITY emailComment.label "Vi opfordrer dig til at angive en gyldig mailadresse, så vi kan kontakte dig, hvis der er spørgsmål til rapporten. Det tillader også genkendelse af dit bidrag for højere prioritet.">
+<!ENTITY issues.whitelist.remove.label "Genaktiver Adblock Plus på denne side">
+<!ENTITY outdatedSubscriptions.description "Følgende filterabonnementer er ikke opdateret i mindst to uger. Opdater før du rapporterer en fejl, problemet er muligvis løst allerede.">
+<!ENTITY dataCollector.description "Vent et øjeblik mens Adblock Plus indsamler data.">
+<!ENTITY sendButton.label "Se&amp;nd rapport">
+<!ENTITY comment.label "&amp;Kommentar (valgfri):">
+<!ENTITY sendPage.errorMessage "Afsendelse af rapporten fejlede med kode &quot;?1?&quot;. Kontroller din internetforbindelse og prøv igen. Hvis problemet fortsætter så søg hjælp i [link]Adblock Plus forum[/link].">
+<!ENTITY showRecentReports.label "Vis nyligt indsendte rapporter">
+<!ENTITY commentPage.heading "Indsæt kommentar">
+<!ENTITY update.start.label "Start opdatering">
+<!ENTITY issues.disabledfilters.description "Følgende filtre er deaktiveret, men kan stadig påvirke siden:">
+<!ENTITY screenshot.description "Samme side kan vises på forskellige måder. Det vil hjælpe os med at forstå problemet, hvis du vedhæfter et screenshot til rapporten. Du kan dække følsomme data og markere områder hvor problemet er tydeligt. Klik på den ønskede knap og vælg et område med musen.">
+<!ENTITY screenshot.attach.label "Vedhæft &amp;billede">
+<!ENTITY issues.whitelist.description "Adblock Plus er deaktiveret på siden du rapporterer. Genaktiver det og genindlæs siden før du indsender rapporten.">
+<!ENTITY typeSelector.falseNegative.label "Adbloc&amp;k Plus blokerer ikke annonce">
+<!ENTITY typeSelector.heading "Vælg problemtype">
+<!ENTITY anonymity.warning "Vi kan ikke kontakte dig, rapporten prioriteres lavere.">
+<!ENTITY wizard.title "Rapporter problem">
+<!ENTITY issues.ownfilters.disable.label "Deaktiver filter">
+<!ENTITY commentPage.description "I tekstfeltet kan du beskrive problemet nærmere. Det er valgfrit, men vil hjælpe med at forstå problemet bedre. Du kan også gennemse rapporten før du sender den.">
+<!ENTITY comment.lengthWarning "Teksten overstiger 1000 tegn. Kun de første 1000 tegn bliver sendt.">
+<!ENTITY typeSelector.falseNegative.description "Vælges hvis en annonce vises selv om Adblock Plus er aktiveret.">
+<!ENTITY sendPage.waitMessage "Vent mens Adblock Plus sender rapporten.">
+<!ENTITY dataCollector.heading "Velkommen til Rapporter problem">
+<!ENTITY screenshot.heading "Vedhæft screenshot">
+<!ENTITY sendPage.heading "Send rapport">
+<!ENTITY issues.subscriptionCount.description "Du abonnerer tilsyneladende på for mange filtre. Det anbefales ikke, da det vil forøge chancen for problemer meget. Vi kan heller ikke acceptere din rapport, da det er uklart hvilken filterudvikler der skal behandle den. Fjern alle unødvendige filtre og se om problemet stadig eksisterer.">
+<!ENTITY screenshot.mark.label "&amp;Marker problem">
+<!ENTITY privacyPolicy.label "Privatlivspolitik">
+<!ENTITY issues.description "Adblock Plus har fundet problemer i dine indstillinger der kan forårsage dette probleme eller vanskeliggøre yderligere undesøgelser.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/sidebar.dtd
new file mode 100644
index 0000000..5e93842
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Fremhæv emnets kanter">
+<!ENTITY address.label "Adresse">
+<!ENTITY context.open.label "Ã…bn i nyt faneblad">
+<!ENTITY type.label "Type">
+<!ENTITY tooltip.filterSource.label "Filterkilde:">
+<!ENTITY noitems.label "Ingen blokérbare emner">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Størrelse:">
+<!ENTITY reattach.label "Gentilkobl">
+<!ENTITY search.label "S&amp;øg:">
+<!ENTITY docDomain.thirdParty "(tredjeparts)">
+<!ENTITY filterSource.label "Filterkilde">
+<!ENTITY tooltip.docDomain.label "Dokumentkilde:">
+<!ENTITY context.copy.label "Kopier emnets adresse">
+<!ENTITY tooltip.type.label "Type:">
+<!ENTITY context.disablefilter.label "Deaktiver filter ?1?">
+<!ENTITY context.copyFilter.label "Kopier filter">
+<!ENTITY context.block.label "Blokér dette emne">
+<!ENTITY context.enablefilter.label "Genaktiver filter ?1?">
+<!ENTITY detach.label "Frakobl">
+<!ENTITY whitelisted.label "Hvidlistet side">
+<!ENTITY context.disablefilteronsite.label "Deaktiver dette filter på ?1?">
+<!ENTITY detached.title "Adblock Plus blokérbare emner (frakoblet)">
+<!ENTITY docDomain.firstParty "(førsteparts)">
+<!ENTITY tooltip.type.whitelisted "(hvidlistet)">
+<!ENTITY tooltip.filter.label "Fungerende filter:">
+<!ENTITY tooltip.filter.disabled "(deaktiveret)">
+<!ENTITY context.editfilter.label "Redigér aktuelt filter">
+<!ENTITY tooltip.type.blocked "(blokeret)">
+<!ENTITY size.label "Størrelse">
+<!ENTITY context.whitelist.label "Tilføj undtagelsesregel for emne">
+<!ENTITY context.selectAll.label "Vælg alle">
+<!ENTITY state.label "Tilstand">
+<!ENTITY docDomain.label "Dokumentkilde">
+<!ENTITY tooltip.address.label "Adresse:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/subscriptionSelection.dtd
new file mode 100644
index 0000000..cf25b98
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/da/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Tilføj og&amp;så filterabonnement &quot;?1?&quot;.">
+<!ENTITY list.download.failed "Adblock Plus kunne ikke hente abonnementslisten.">
+<!ENTITY list.download.retry "Prøv igen">
+<!ENTITY title.label "Abonnemen&amp;tstitel:">
+<!ENTITY list.download.website "Se hjemmeside">
+<!ENTITY supplementMessage "Dette filterabonnement er beregnet til brug sammen med abonnementet &quot;?1?&quot; som du endnu ikke bruger.">
+<!ENTITY viewList.label "Vis filtre">
+<!ENTITY visitHomepage.label "Besøg hjemmeside">
+<!ENTITY addSubscription.label "Tilføj abonnement">
+<!ENTITY dialog.title "Tilføj Adblock Plus filterabonnement">
+<!ENTITY location.label "Fi&amp;lterlistens placering:">
+<!ENTITY fromWeb.description "Bekræft tilføjelsen af dette abonnement. Du kan ændre titel eller placering før det tilføjes.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/composer.dtd
new file mode 100644
index 0000000..7d377e2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "am En&amp;de der Adresse">
+<!ENTITY domainRestriction.label "Auf Do&amp;main beschränken:">
+<!ENTITY collapse.default.no.label "Standardeinstellung (nein)">
+<!ENTITY firstParty.label "Nur für Elemente der Ursprungsseite">
+<!ENTITY preferences.label "Existierende Filter an&amp;zeigen ...">
+<!ENTITY pattern.label "Muster suchen">
+<!ENTITY thirdParty.label "Nur für Elemen&amp;te von Drittseiten">
+<!ENTITY filter.label "Neue &amp;Filter:">
+<!ENTITY collapse.label "Platz frei&amp;geben:">
+<!ENTITY match.warning "Das Muster, das Sie eingegeben haben, passt nicht mehr zu der Adresse, für die der Filter erstellt werden soll. Es wird keinen Einfluss mehr auf diese Adresse haben.">
+<!ENTITY anchor.start.label "am An&amp;fang der Adresse">
+<!ENTITY matchCase.label "Groß-/&amp;Kleinschreibung beachten">
+<!ENTITY custom.pattern.label "Be&amp;nutzerdefiniert:">
+<!ENTITY unselectAllTypes.label "Keine auswählen">
+<!ENTITY type.whitelist.label "&amp;Ausnahmeregel">
+<!ENTITY regexp.warning "Das Muster, das Sie eingegeben haben, wird als regulärer Ausdruck interpretiert. Zu viele reguläre Ausdrücke könnten Ihren Browser verlangsamen. Falls Sie nicht beabsichtigt haben, reguläre Ausdrücke zu verwenden, fügen Sie einfach das Symbol '*' am Ende des Musters an.">
+<!ENTITY dialog.title "Neuen Filter hinzufügen">
+<!ENTITY basic.label "Standardansicht">
+<!ENTITY type.filter.label "&amp;Blockierregel">
+<!ENTITY types.label "Auf Elementtypen anwenden:">
+<!ENTITY shortpattern.warning "Das Muster, das Sie eingegeben haben, ist zu kurz zum Optimieren. Zu viele solche Muster könnten Ihren Browser verlangsamen. Es ist deshalb empfehlenswert, nach Möglichkeit ein längeres Muster für diesen Filter zu verwenden.">
+<!ENTITY collapse.yes.label "Ja">
+<!ENTITY anchors.label "Muster nur akzeptieren:">
+<!ENTITY collapse.default.yes.label "Standardeinstellung (ja)">
+<!ENTITY domainRestriction.help "Geben Sie eine oder mehrere Domains an (Trennzeichen ist &quot;|&quot;), der Filter wird dann nur auf diesen Domains angewandt. Das Zeichen &quot;~&quot; vor einem Domainnamen bedeutet, dass der Filter auf dieser Domain nicht angewandt werden sollte.">
+<!ENTITY accept.label "Filter hinzufügen">
+<!ENTITY options.label "Optionen">
+<!ENTITY disabled.warning "Adblock Plus ist deaktiviert. Sie können trotzdem den Filter hinzufügen, dieser wird jedoch erst angewandt, wenn Sie [link]Adblock Plus aktivieren[/link].">
+<!ENTITY anchor.start.flexible.label "am An&amp;fang des Domain-Namens">
+<!ENTITY collapse.no.label "Nein">
+<!ENTITY selectAllTypes.label "Alle auswählen">
+<!ENTITY advanced.label "Erweiterte Ansicht">
+<!ENTITY pattern.explanation "Das Muster kann ein beliebiger Teil der Adresse sein, das Zeichen '*' kann dabei als Jokerzeichen verwendet werden. Der Filter wird nur auf Adressen angewandt, die auf das Muster passen.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/filters.dtd
new file mode 100644
index 0000000..7c3e0f1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/filters.dtd
@@ -0,0 +1,73 @@
+<!ENTITY restore.custom.warning "Alle Ihre eigenen Filter werden durch den Inhalt dieser Datei ersetzt. Wollen Sie fortfahren?">
+<!ENTITY slow.column "&amp;Langsame Filter">
+<!ENTITY enabled.column "A&amp;ktiviert">
+<!ENTITY subscription.lastDownload.checksumMismatch "Fehler, Prüfsumme ist falsch, möglicherweise ein Übertragungsfehler">
+<!ENTITY noFiltersInGroup.text "Die gewählte Filtergruppe ist leer.">
+<!ENTITY subscription.actions.label "Aktionen">
+<!ENTITY filter.selectAll.label "Alle auswählen">
+<!ENTITY backupButton.label "Sic&amp;hern und Wiederherstellen">
+<!ENTITY restore.minVersion.warning "Warnung: diese Datei wurde mit einer neueren Version von Adblock Plus erstellt. Sie sollten Adblock Plus auf die neueste Version aktualisieren, bevor Sie Daten von dieser Sicherung wiederherstellen.">
+<!ENTITY restore.error "Die Daten dieser Datei sind fehlerhaft, vielleicht ist es keine Sicherungsdatei von Adblock Plus?">
+<!ENTITY sort.ascending.label "&amp;Aufsteigend">
+<!ENTITY sort.label "&amp;Sortieren">
+<!ENTITY subscription.source.label "Filterliste">
+<!ENTITY hitcount.column "T&amp;reffer">
+<!ENTITY noFilters.text "Sie haben noch keine eigenen Filter.">
+<!ENTITY backup.custom.title "Nur eigene Filter">
+<!ENTITY subscription.external.label "Wird von einer anderen Erweiterung aktualisiert">
+<!ENTITY subscription.delete.label "Löschen">
+<!ENTITY noGroupSelected.text "Sie müssen eine Filtergruppe auswählen, um deren Inhalt anzuzeigen.">
+<!ENTITY filter.cut.label "Ausschneiden">
+<!ENTITY restore.default.label "Sicherung von ?1? wiederherstellen">
+<!ENTITY subscription.lastDownload.inProgress "Wird heruntergeladen ...">
+<!ENTITY subscriptions.tab.label "Filterabonnements">
+<!ENTITY sort.descending.label "A&amp;bsteigend">
+<!ENTITY filters.remove.warning "Wollen Sie wirklich alle ausgewählten Filter löschen?">
+<!ENTITY filter.delete.label "Löschen">
+<!ENTITY addSubscriptionAdd.label "Hinzufügen">
+<!ENTITY viewMenu.label "Ansicht">
+<!ENTITY subscription.lastDownload.unknown "Nie">
+<!ENTITY addSubscriptionCancel.label "Abbrechen">
+<!ENTITY subscription.enabled.label "Aktiviert">
+<!ENTITY noSubscriptions.text "Sie haben noch keine Filterabonnements hinzugefügt. Ohne Filter wird Adblock Plus
+ nichts blockieren können, bitte benutzen Sie die Schaltfläche &quot;Filterabonnement hinzufügen&quot;.">
+<!ENTITY subscription.update.label "Filter aktualisieren">
+<!ENTITY dialog.title "Filtereinstellungen von Adblock Plus">
+<!ENTITY addFilter.label "&amp;Filter hinzufügen">
+<!ENTITY subscription.minVersion.warning "Diese Filterliste benötigt eine neuere Version von Adblock Plus, Sie sollten auf die neueste Version von Adblock Plus aktualisieren.">
+<!ENTITY subscription.lastDownload.invalidURL "Fehler, ungültige Adresse">
+<!ENTITY backup.error "Beim Schreiben der Filter in die Datei ist ein Problem aufgetreten. Bitte stellen Sie sicher, dass die Datei nicht schreibgeschützt ist oder von einem anderen Programm verwendet wird.">
+<!ENTITY filter.moveUp.label "Nach oben verschieben">
+<!ENTITY addGroup.label "Filter&amp;gruppe hinzufügen">
+<!ENTITY filter.edit.label "Bearbeiten">
+<!ENTITY subscription.showHideFilters.label "Filter anzeigen/verstecken">
+<!ENTITY acceptableAds2.label "Einige nicht auf&amp;dringliche Werbung zulassen">
+<!ENTITY addSubscriptionOther.label "Anderes Abonnement hinzufügen">
+<!ENTITY close.label "Schließen">
+<!ENTITY sort.none.label "&amp;Unsortiert">
+<!ENTITY filter.actions.label "Filteraktionen">
+<!ENTITY filter.copy.label "Kopieren">
+<!ENTITY filter.moveDown.label "Nach unten verschieben">
+<!ENTITY filter.resetHitCounts.label "Trefferstatistiken zurücksetzen">
+<!ENTITY readMore.label "Mehr Information">
+<!ENTITY subscription.moveUp.label "Nach oben verschieben">
+<!ENTITY addSubscription.label "Filtera&amp;bonnement hinzufügen">
+<!ENTITY subscription.homepage.label "Webseite">
+<!ENTITY backup.complete.title "Alle Filter und alle Filterabonnements">
+<!ENTITY restore.own.label "Eigene Sicherung wiederherstellen">
+<!ENTITY restore.complete.warning "Alle Ihre Filtereinstellungen werden durch den Inhalt dieser Datei ersetzt. Wollen Sie fortfahren?">
+<!ENTITY filters.tab.label "Eigene Filter">
+<!ENTITY backup.label "Neue Sicherung erstellen">
+<!ENTITY find.label "Filter durch&amp;suchen">
+<!ENTITY subscription.moveDown.label "Nach unten verschieben">
+<!ENTITY subscription.lastDownload.connectionError "Fehler, Herunterladen fehlgeschlagen">
+<!ENTITY subscription.lastDownload.success "Erfolgreich">
+<!ENTITY subscription.lastDownload.invalidData "Fehler, keine gültige Filterliste">
+<!ENTITY filter.paste.label "Einfügen">
+<!ENTITY subscription.disabledFilters.enable "Deaktivierte Filter aktivieren">
+<!ENTITY lasthit.column "Let&amp;zter Treffer">
+<!ENTITY subscription.editTitle.label "Umbenennen">
+<!ENTITY subscription.disabledFilters.warning "Einige Filter in dieser Filterliste sind deaktiviert.">
+<!ENTITY filter.column "&amp;Filterregel">
+<!ENTITY subscription.lastDownload.label "Zuletzt aktualisiert:">
+<!ENTITY viewList.label "Liste öffnen">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/firstRun.properties
new file mode 100644
index 0000000..98089de
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Privates Surfen durch Deaktivierung der Tracker - Versteckt Ihr Surfverhalten vor Werbefirmen, die Sie sonst ausspionieren würden.
+firstRun_toggle_off=AUS
+firstRun_feature_tracking=Verfolgung ausschalten
+firstRun_feature_malware=Malware-Blockierung
+firstRun_title=Adblock Plus wurde installiert
+firstRun_toggle_on=AN
+firstRun_acceptableAdsExplanation=Wir möchten Webseiten dazu ermutigen schlichte und unaufdringliche Werbung zu verwenden. Deshalb werden durch <a>strenge Richtlinien</a> akzeptable Werbeanzeigen bestimmt, welche unter Standard-Einstellungen noch angezeigt werden. Wenn Sie jedoch alle Werbungen blockieren möchten, können Sie diese Einstellung in kurzer Zeit <a>deaktivieren</a>.
+firstRun_contributor_credits=Mitwirkende
+firstRun_dataCorruptionWarning=Wird diese Seite immer wieder angezeigt? <a>Bitte hier klicken!</a>
+firstRun_acceptableAdsHeadline=Lästige Werbung wird jetzt blockiert
+firstRun_share=Weiterempfehlen
+firstRun_share_headline=<a>Bitte unterstützen Sie uns</a> dabei, das Internet zu einem besseren Ort zu machen
+firstRun_feature_social_description=Entfernt Social-Media-Buttons (z.B. den Facebook-Like) die auf Webseiten erscheinen und Ihr Surfverhalten aufzeichnen.
+firstRun_filterlistsReinitializedWarning=Es scheint, als ob aufgrund eines Problems alle Filter entfernt wurden und wir keine Sicherung wiederherstellen konnten. Deshalb wurden alle Ihre Filter sowie Ihre Einstellungen für akzeptable Werbung zurückgesetzt werden. Überprüfen Sie bitte Ihre Filterliste und Ihre Einstellungen für akzeptable Werbung in den <a>Adblock Plus Optionen</a>.
+firstRun_feature_malware_description=Sicheres Surfen durch Blockieren von infizierten Webseiten.
+firstRun_features=Adblock Plus kann mehr als nur Werbung blockieren
+firstRun_donate=Spenden
+firstRun_donate_label=Unterstützen Sie unser Projekt
+firstRun_feature_social=Social Media-Buttons entfernen
+firstRun_legacySafariWarning=Sie verwenden eine ältere Version von Safari, die nicht von Adblock Plus unterstützt wird. Es kann sein, dass Adblock Plus damit nicht richtig funktioniert oder dass bestimmte Websites nicht richtig dargestellt werden. Wir empfehlen deshalb dringend, entweder einen Upgrade auf Safari 6.1.1 oder höher (auf OS X 10.8 Mountain Lion) oder auf Safari 7.0.1 oder höher (auf OS X 10.9 Mavericks) durchzuführen oder die neueste Version von Mozilla Firefox, Google Chrome oder Opera zu verwenden.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/global.properties
new file mode 100644
index 0000000..da3cac2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Auf der geöffneten Seite gibt es keine Elemente, die blockiert werden könnten
+action3_tooltip=Adblock Plus ein- bzw. ausschalten
+notification_antiadblock_title=Zielgerichtete Nachrichten ausblenden?
+type_label_script=Skript
+filter_elemhide_nocriteria=Keine Kriterien angegeben, um das zu versteckende Element zu erkennen
+blockingGroup_title=Blockierregeln
+whitelisted_tooltip=Adblock Plus ist auf dieser Seite deaktiviert.
+type_label_stylesheet=Stylesheet
+blocked_count_tooltip=?1? von ?2?
+type_label_font=Schriftart
+type_label_popup=Pop-up-Fenster
+filter_regexp_tooltip=Dieser Filter ist entweder ein regulärer Ausdruck oder zu kurz zum Optimieren. Zu viele solche Filter könnten Ihren Browser verlangsamen.
+action0_tooltip=Kontextmenü anzeigen. Mittlere Maustaste schaltet Adblock Plus ein und aus.
+whitelisted_page=Adblock Plus wurde für die geöffnete Seite deaktiviert
+remove_group_warning=Sind Sie sicher, dass Sie diese Filtergruppe entfernen möchten?
+action1_tooltip=Liste blockierbarer Elemente öffnen bzw. schließen. Mittlere Maustaste schaltet Adblock Plus ein und aus.
+type_label_xmlhttprequest=XML-Anfrage
+active_tooltip=Adblock Plus ist aktiv, ?1? Filterabonnement(s) und ?2? eigene Filter werden verwendet.
+type_label_document=Dokument
+type_label_object_subrequest=Objekt-Anfrage
+whitelistGroup_title=Ausnahmeregeln
+disabled_tooltip=Adblock Plus ist deaktiviert.
+filter_elemhide_duplicate_id=Nur ein ID-Wert des zu versteckenden Elements kann angegeben werden
+type_label_object=Objekt
+action2_tooltip=Adblock Plus Einstellungen öffnen. Mittlere Maustaste schaltet Adblock Plus ein und aus.
+type_label_subdocument=Frame
+clearStats_warning=Alle Trefferstatistiken werden zurückgesetzt und Filtertreffer werden in Zukunft nicht mehr gezählt. Wollen Sie fortfahren?
+notification_antiadblock_message=Diese Seite hat in der Vergangenheit Adblock Plus-Nutzern gezielt Nachrichten angezeigt. Soll Adblock Plus Nachrichten dieser Art verstecken?
+blocked_count_addendum=(außerdem Ausnahmen: ?1?, versteckte Elemente: ?2?)
+subscription_invalid_location=Die eingegebene Adresse ist weder eine gültige Web-Adresse, noch ein gültiger Dateiname.
+type_label_image=Grafik
+remove_subscription_warning=Sind Sie sicher, dass Sie dieses Abonnement entfernen möchten?
+type_label_other=Unbekannt
+mobile_menu_enable=ABP: Aktivieren
+type_label_media=Audio/Video
+mobile_menu_disable_site=ABP: Deaktivieren auf ?1?
+elemhideGroup_title=Regeln zum Verstecken von Elementen
+mobile_menu_enable_site=ABP: Aktivieren auf ?1?
+type_label_elemhide=Versteckt
+newGroup_title=Neue Filtergruppe
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/overlay.dtd
new file mode 100644
index 0000000..7007b24
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Ja">
+<!ENTITY notification.button.no "&amp;Nein">
+<!ENTITY sync.label "Adblock Plus-Einstellungen s&amp;ynchonisieren">
+<!ENTITY whitelist.site.label "Deaktivieren: auf ?1?">
+<!ENTITY filters.label "Filterein&amp;stellungen">
+<!ENTITY disable.label "Überall deaktivieren">
+<!ENTITY objecttab.title "Blockieren">
+<!ENTITY objecttab.tooltip "Klicken Sie hier, um dieses Objekt mit Adblock Plus zu blockieren">
+<!ENTITY menuitem.label "&amp;Adblock Plus - Einstellungen">
+<!ENTITY objecttabs.label "Ta&amp;b zum Blockieren von Flash und Java anzeigen">
+<!ENTITY sendReport.label "&amp;Fehler auf dieser Seite melden">
+<!ENTITY whitelist.page.label "Deaktivieren: nur auf dieser Seite">
+<!ENTITY context.image.label "Adblock Plus: Grafik blockieren">
+<!ENTITY counthits.label "Filtertreffer &amp;zählen">
+<!ENTITY opensidebar.label "&amp;Blockierbare Elemente öffnen">
+<!ENTITY notification.button.close "&amp;Schließen">
+<!ENTITY contribute.label "Zu Adblock Plus beitragen">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Frame blockieren">
+<!ENTITY blocked.tooltip "Blockierte Elemente auf dieser Seite:">
+<!ENTITY hideplaceholders.label "P&amp;latzhalter blockierter Elemente verstecken">
+<!ENTITY showinstatusbar.label "In &amp;Statusleiste anzeigen">
+<!ENTITY sidebar.title "Elemente der geöffneten Seite">
+<!ENTITY options.label "&amp;Optionen">
+<!ENTITY context.object.label "Adblock Plus: Objekt blockieren">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Auf dieser Seite wieder aktivieren">
+<!ENTITY filters.tooltip "Am meisten angewandte Filter:">
+<!ENTITY closesidebar.label "&amp;Blockierbare Elemente schließen">
+<!ENTITY showintoolbar.label "In Symbolleis&amp;te anzeigen">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Audio-/Video-Element blockieren">
+<!ENTITY subscription.update.label "Filter aktualisieren">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/sendReport.dtd
new file mode 100644
index 0000000..5dfc848
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/sendReport.dtd
@@ -0,0 +1,105 @@
+<!ENTITY screenshot.undo.label "&amp;Rückgängig">
+<!ENTITY issues.disabledgroups.description "Die folgenden Filterabonnements / Filtergruppen sind deaktiviert, hätten jedoch
+ einen Einfluss auf diese Webseite:">
+<!ENTITY showData.label "Berichtdaten anzeigen">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blockiert zu &amp;viel">
+<!ENTITY issues.change.description "Ihre Einstellungen wurden geändert. Bitte laden Sie die Seite neu, um die Änderungen
+ jetzt zu testen. Bitte melden Sie den Fehler, falls das Problem durch die
+ Änderungen nicht gelöst wurde.">
+<!ENTITY email.label "E-&amp;Mail:">
+<!ENTITY issues.openPreferences.label "Filtereinstellungen öffnen">
+<!ENTITY sendPage.confirmation "Ihr Bericht wurde gespeichert. Sie können Ihn unter der folgenden Adresse aufrufen:">
+<!ENTITY copyLink.label "Lin&amp;k zum Bericht kopieren">
+<!ENTITY issues.nofilters.description "Adblock Plus blockiert auf dieser Seite nichts. Das Problem, das Sie sehen, wurde
+ wahrscheinlich nicht von Adblock Plus verursacht.">
+<!ENTITY sendPage.knownIssue "Das Problem, das Sie berichtet haben, ist möglicherweise bereits bekannt. Zusätzliche Information:">
+<!ENTITY typeSelector.other.description "Wählen Sie diese Option, falls Sie ein Problem mit Adblock Plus selber und nicht
+ mit dessen Filtern vermuten.">
+<!ENTITY issues.disabledgroups.enable.label "Filterabonnement / Filtergruppe aktivieren">
+<!ENTITY typeWarning.override.label "Ich &amp;verstehe und will trotzdem einen Fehlerbericht einsenden">
+<!ENTITY issues.disabled.enable.label "Adblock Plus aktivieren">
+<!ENTITY update.fixed.description "Die Aktualisierung Ihrer Filterabonnements hat das Problem wahrscheinlich
+ bereits gelöst. Bitte laden Sie die Seite neu und senden Sie den Fehlerbericht
+ noch einmal ab, falls das Problem weiterhin besteht.">
+<!ENTITY anonymous.label "&amp;Anonymer Beitrag">
+<!ENTITY reloadButton.label "Seite &amp;neu laden">
+<!ENTITY recentReports.clear.label "Alle Be&amp;richte löschen">
+<!ENTITY typeSelector.description "Dieser Assistent wird Sie durch die nötigen Schritte zum Melden eines Adblock Plus-Fehlers
+ leiten. Zuerst wählen Sie bitte die Art des Fehlers, den Sie auf dieser Seite
+ beobachten:">
+<!ENTITY screenshot.remove.label "&amp;Private Informationen löschen">
+<!ENTITY issues.ownfilters.description "Einige der Filter, die auf dieser Seite angewandt wurden, sind benutzerdefiniert.
+ Bitte deaktivieren Sie Filter, die das Problem verursacht haben könnten:">
+<!ENTITY update.inProgress.description "Adblock Plus muss Ihre Filterabonnements aktualisieren, um sicherzustellen,
+ dass das Problem nicht bereits gelöst ist. Bitte warten Sie ...">
+<!ENTITY sendPage.retry.label "Noch einmal senden">
+<!ENTITY data.label "Bericht&amp;daten:">
+<!ENTITY recentReports.label "Ihre zuletzt gesendeten Fehlerberichte">
+<!ENTITY typeWarning.description "Sie haben angedeutet, dass Sie ein allgemeines Problem mit Adblock Plus melden wollen
+ und kein Filterproblem. Bitte beachten Sie, dass solche Probleme am besten im
+ [link]Adblock Plus Forum[/link] gemeldet werden sollten. Den Fehlerberichts-Assistenten
+ sollte man nur als Ergänzung zu einer vorhandenen Diskussion verwenden. Sie müssen
+ den Link zu Ihrem Fehlerbericht angeben, weil ihn sonst niemand sehen wird.
+ Diesen automatisch generierten Link bekommen Sie nach dem Senden des Berichts.">
+<!ENTITY issues.disabled.description "Adblock Plus ist deaktiviert, in diesem Zustand wird es nichts blockieren.">
+<!ENTITY attachExtensions.label "Liste aktiver Er&amp;weiterungen anhängen für den Fall, dass das Problem von einer anderen Erweiterung verursacht wird">
+<!ENTITY issues.nosubscriptions.add.label "Filterabonnement hinzufügen">
+<!ENTITY issues.disabledfilters.enable.label "Filter aktivieren">
+<!ENTITY issues.override.label "Die Einstellungen sind so &amp;korrekt, mit dem Fehlerbericht fortfahren">
+<!ENTITY issues.nosubscriptions.description "Es scheint, dass Sie keine der fertigen Filterlisten abonniert haben. Ein solches
+ kostenloses Abonnement ist jedoch erforderlich, um automatisch Werbung zu entfernen.">
+<!ENTITY typeSelector.falsePositive.description "Wählen Sie diese Option, falls auf der Seite wichtige Inhalte fehlen, die Seite
+ falsch angezeigt wird oder nicht korrekt funktioniert. Sie können feststellen,
+ ob Adblock Plus das Problem verursacht, indem Sie es vorübergehend deaktivieren.">
+<!ENTITY typeSelector.other.label "An&amp;derer Fehler">
+<!ENTITY emailComment.label "Wir empfehlen Ihnen, eine gültige e-Mail-Adresse einzugeben, damit wir Sie kontaktieren können, falls es Fragen zu Ihrem Bericht gibt. Es erlaubt uns, Ihre Beiträge zu erkennen und diesen höhere Prioritäten beizumessen.">
+<!ENTITY issues.whitelist.remove.label "Adblock Plus auf dieser Seite wieder aktivieren">
+<!ENTITY outdatedSubscriptions.description "Die folgenden Filterabonnements wurden mindesten zwei Wochen lang nicht
+ aktualisiert. Bitte aktualisieren Sie diese, bevor Sie einen Fehlerbericht
+ senden, das Problem könnte bereits gelöst sein.">
+<!ENTITY dataCollector.description "Bitte warten Sie einige Augenblicke, während Adblock Plus die benötigten Daten sammelt.">
+<!ENTITY sendButton.label "Bericht ab&amp;senden">
+<!ENTITY comment.label "&amp;Kommentar (optional):">
+<!ENTITY sendPage.errorMessage "Beim Senden des Berichts ist ein Fehler aufgetreten (Fehlercode &quot;?1?&quot;).
+ Bitte stellen Sie sicher, dass Sie mit dem Internet verbunden sind, und versuchen
+ Sie, den Bericht noch einmal zu senden. Falls das Problem bestehen bleibt, wenden
+ Sie sich an das [link]Adblock Plus Forum[/link].">
+<!ENTITY showRecentReports.label "Zuletzt gesendeten Fehlerberichte anzeigen">
+<!ENTITY commentPage.heading "Kommentar eingeben">
+<!ENTITY update.start.label "Aktualisierung starten">
+<!ENTITY issues.disabledfilters.description "Die folgenden Filter sind deaktiviert, hätten jedoch einen Einfluss auf diese Webseite:">
+<!ENTITY screenshot.description "Dieselbe Seite kann bei verschiedenen Leuten verschieden aussehen. Deswegen könnte es
+ hilfreich sein, wenn Sie zu Ihrem Bericht ein Bild der Webseite hinzufügen. Sie können
+ Teile der Seite entfernen, falls sie private Informationen enthalten. Ebenso können
+ Sie Stellen markieren, wo das Problem deutlich wird. Klicken Sie dafür die entsprechende
+ Taste und markieren Sie den Bereich auf dem Bild mit der Maus.">
+<!ENTITY screenshot.attach.label "Dieses &amp;Bild meinem Bericht hinzufügen">
+<!ENTITY issues.whitelist.description "Adblock Plus ist derzeit deaktiviert auf der Seite, für die Ihr Bericht gesendet werden
+ soll. Bitte aktivieren Sie Adblock Plus wieder und laden Sie die Seite neu, bevor Sie
+ den Fehler melden. Das wird die Untersuchung des Problems vereinfachen.">
+<!ENTITY typeSelector.falseNegative.label "Eine &amp;Werbeeinblendung wird von Adblock Plus nicht blockiert">
+<!ENTITY typeSelector.heading "Fehlerart wählen">
+<!ENTITY anonymity.warning "Es ist uns nicht möglich sich erneut an Sie zu wenden und wir werden Ihrem Bericht eine niedrigere Priorität beimessen.">
+<!ENTITY wizard.title "Fehler melden">
+<!ENTITY issues.ownfilters.disable.label "Filter deaktivieren">
+<!ENTITY commentPage.description "Unten können Sie einen Kommentar eingeben, um uns zu helfen, das Problem zu verstehen.
+ Das ist zwar optional, ist jedoch empfohlen, falls das Problem nicht offensichtlich ist.
+ Sie können auch die Daten Ihres Berichts überprüfen, bevor sie gesendet werden.">
+<!ENTITY comment.lengthWarning "Ihr Kommentar ist länger als 1000 Zeichen. Nur die ersten 1000 Zeichen werden gesendet.">
+<!ENTITY typeSelector.falseNegative.description "Wählen Sie diese Option, falls Werbung auf der Seite angezeigt wird, obwohl
+ Adblock Plus aktiviert ist.">
+<!ENTITY sendPage.waitMessage "Bitte warten Sie, während Adblock Plus Ihren Bericht sendet.">
+<!ENTITY dataCollector.heading "Willkommen zum Fehlerberichts-Assistenten">
+<!ENTITY screenshot.heading "Bildschirmfoto hinzufügen">
+<!ENTITY sendPage.heading "Bericht absenden">
+<!ENTITY issues.subscriptionCount.description "Es scheint, dass Sie zu viele Filterlisten abonniert haben. Das ist nicht
+ empfohlen, weil die Wahrscheinlichkeit von Problemen dadurch sehr stark
+ ansteigt. Wir können außerdem Ihren Fehlerbericht nicht annehmen, weil unklar
+ ist, welche Filterliste für das Problem verantwortlich ist. Bitte entfernen
+ Sie alle bis auf die wirklich notwendigen Filterabonnements und überprüfen
+ Sie dann, ob das Problem immer noch auftritt.">
+<!ENTITY screenshot.mark.label "Proble&amp;m markieren">
+<!ENTITY privacyPolicy.label "Datenschutzerklärung">
+<!ENTITY issues.description "Adblock Plus hat Probleme in Ihren Einstellungen gefunden, die für das vorliegende
+ Problem verantwortlich sein könnten oder eine Untersuchung des Problems behindern
+ würden.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/sidebar.dtd
new file mode 100644
index 0000000..cac33e3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Position des Elements aufzeigen">
+<!ENTITY address.label "Adresse">
+<!ENTITY context.open.label "Adresse in neuem Tab öffnen">
+<!ENTITY type.label "Typ">
+<!ENTITY tooltip.filterSource.label "Herkunft des Filters:">
+<!ENTITY noitems.label "Keine blockierbaren Elemente">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Größe:">
+<!ENTITY reattach.label "Ankoppeln">
+<!ENTITY search.label "&amp;Suchen:">
+<!ENTITY docDomain.thirdParty "(Anfrage zu einer Drittseite)">
+<!ENTITY filterSource.label "Filterquelle">
+<!ENTITY tooltip.docDomain.label "Ursprungsdomain:">
+<!ENTITY context.copy.label "Adresse des Elements kopieren">
+<!ENTITY tooltip.type.label "Typ:">
+<!ENTITY context.disablefilter.label "Filter ?1? deaktivieren">
+<!ENTITY context.copyFilter.label "Filter kopieren">
+<!ENTITY context.block.label "Dieses Element blockieren">
+<!ENTITY context.enablefilter.label "Filter ?1? wieder aktivieren">
+<!ENTITY detach.label "Abkoppeln">
+<!ENTITY whitelisted.label "Deaktiviert auf dieser Seite">
+<!ENTITY context.disablefilteronsite.label "Diesen Filter auf ?1? deaktivieren">
+<!ENTITY detached.title "Adblock Plus: Elemente der geöffneten Seite (abgekoppelt)">
+<!ENTITY docDomain.firstParty "(Anfrage zu derselben Domain)">
+<!ENTITY tooltip.type.whitelisted "(Ausnahmeregel aktiv)">
+<!ENTITY tooltip.filter.label "Angewandter Filter:">
+<!ENTITY tooltip.filter.disabled "(deaktiviert)">
+<!ENTITY context.editfilter.label "Angewandten Filter bearbeiten">
+<!ENTITY tooltip.type.blocked "(blockiert)">
+<!ENTITY size.label "Größe">
+<!ENTITY context.whitelist.label "Ausnahmeregel für das Element hinzufügen">
+<!ENTITY context.selectAll.label "Alles auswählen">
+<!ENTITY state.label "Status">
+<!ENTITY docDomain.label "Ursprungsdomain">
+<!ENTITY tooltip.address.label "Addresse:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/subscriptionSelection.dtd
new file mode 100644
index 0000000..ee00470
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/de/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Filterabonnement »?1?« auc&amp;h hinzufügen">
+<!ENTITY list.download.failed "Adblock Plus konnte die Liste der Filterabonnements nicht herunterladen.">
+<!ENTITY list.download.retry "Nochmal versuchen">
+<!ENTITY title.label "Be&amp;zeichnung des Abonnements:">
+<!ENTITY list.download.website "Internetseite ansehen">
+<!ENTITY supplementMessage "Dieses Filterabonnement sollte in Verbindung mit dem Filterabonnement »?1?« verwendet werden.">
+<!ENTITY viewList.label "Filter ansehen">
+<!ENTITY visitHomepage.label "Webseite der Filterliste besuchen">
+<!ENTITY addSubscription.label "Filterabonnement hinzufügen">
+<!ENTITY dialog.title "Filterabonnement für Adblock Plus hinzufügen">
+<!ENTITY location.label "Ad&amp;resse der Filterliste:">
+<!ENTITY fromWeb.description "Bitte bestätigen Sie, dass Sie dieses Filterabonnement hinzufügen möchten. Die Bezeichnung und Adresse der Abonnements können vor dem Hinzufügen geändert werden.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/composer.dtd
new file mode 100644
index 0000000..1b3fd03
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "na kóń&amp;cu adrese">
+<!ENTITY domainRestriction.label "WobgranicowaÅ› na &amp;domenu:">
+<!ENTITY collapse.default.no.label "Standard wužywaś (ně)">
+<!ENTITY firstParty.label "&amp;Jano prědny bok">
+<!ENTITY preferences.label "&amp;Eksistěrujuce filtry pokazaś...">
+<!ENTITY pattern.label "Muster pytaÅ›">
+<!ENTITY thirdParty.label "Jano &amp;tśeśi bok">
+<!ENTITY filter.label "Nowy &amp;filter:">
+<!ENTITY collapse.label "B&amp;lokěrowane złožyś:">
+<!ENTITY match.warning "Muster, kótaryž sćo zapódał, wěcej njewótpowědujo adresy, kótaraž ma se blokěrowaś/do běłeje lisćiny pśewześ a njezmějo žedno wustatkowanje na nju.">
+<!ENTITY anchor.start.label "na zac&amp;hopjeńku adrese">
+<!ENTITY matchCase.label "&amp;Na wjelikopisanje źiwaś">
+<!ENTITY custom.pattern.label "&amp;Swójski:">
+<!ENTITY unselectAllTypes.label "Žeden wubraś">
+<!ENTITY type.whitelist.label "&amp;Wuwześowe pšawidło">
+<!ENTITY regexp.warning "Muster, kótaryž sćo zapódał, buźo se ako regularny wuraz interpretěrowaś, kótaryž njedajo se pśez Adblock Plus statkownje pśeźěłaś a mógł waš wobglědowak spomałšyś. Jolic njocośo regularny wuraz wužywaś, pśidajśo gwězdku (*) ke kóńcoju mustra.">
+<!ENTITY dialog.title "Filtrowe pšawidło Adblock Plus pśidaś">
+<!ENTITY basic.label "Zakładny naglěd">
+<!ENTITY type.filter.label "&amp;Blokěrujucy filter">
+<!ENTITY types.label "Na typy nałožyś:">
+<!ENTITY shortpattern.warning "Muster, kótaryž sćo zapódał, jo za optiměrowanje pśekrotko a mógł waš wobglědowak spomałšyś. Pśiraźujo se, až wubjerjośo dlěšy znamuškowy rjeśazk za toś ten filter, aby wy Adblock Plus dowólił, filter statkownjej pśeźěłał.">
+<!ENTITY collapse.yes.label "Jo">
+<!ENTITY anchors.label "Jano muster akceptěrowaś:">
+<!ENTITY collapse.default.yes.label "Standard wužywaś (jo)">
+<!ENTITY domainRestriction.help "Wužyjśo toś tu opciju, aby wy pódał jadnu domenu abo někotare domeny, kótarež wótdźěluju se pśez wertikalnu ceru (|). Filter buźo se jano na wubrane domeny nałožowaś. Tilda (~) pśed domenowym mjenim pódawa, až filter njebuźo se na tu domenu nałožowaś.">
+<!ENTITY accept.label "Filter pśidaś">
+<!ENTITY options.label "Opcije">
+<!ENTITY disabled.warning "Adblock Plus jo tuchylu znjemóžnjony. Móžośo hyšći filtry pśidaś, ale njebudu se nałožowaś, snaźkuli [link]zmóžnijośo Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "na zac&amp;hopjeńku mjenja domeny">
+<!ENTITY collapse.no.label "NÄ›">
+<!ENTITY selectAllTypes.label "Wšykne wubraś">
+<!ENTITY advanced.label "Rozšyrjony naglěd">
+<!ENTITY pattern.explanation "Muster móžo źěl adrese byś; gwězdki (*) funkcioněruju ako zastupujuce symbole. Filter buźo se janž na adrese nałožowaś, kótarež wótpowěduju pódanemu mustroju.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/filters.dtd
new file mode 100644
index 0000000..35ed52d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Wšykne waše swójske filtry budu se pśez wopśimjeśe wubraneje dataje narownowaś. Cośo dalej cyniś?">
+<!ENTITY slow.column "&amp;Pómałe filtry">
+<!ENTITY enabled.column "Z&amp;móžnjony">
+<!ENTITY subscription.lastDownload.checksumMismatch "Njeraźiło, wopacna kontrolna suma">
+<!ENTITY noFiltersInGroup.text "Wubrana kupka jo prozna.">
+<!ENTITY subscription.actions.label "Akcije">
+<!ENTITY filter.selectAll.label "Wšykno wubraś">
+<!ENTITY backupButton.label "&amp;Zawěsćiś a wótnowiś">
+<!ENTITY restore.minVersion.warning "Warnowanje: Dataja jo se pśez nowšu wersiju Adblock Plus napórała. Wy by měł na nejnowšu wersiju Adblock Plus aktualizěrowaś, nježli až wótnowijośo toś tu dataju.">
+<!ENTITY restore.error "Daty dataje njedaju se pśeźěłaś, jo móžno, až wóna njejo zawěsćeńska dataja Adblock Plus?">
+<!ENTITY sort.ascending.label "Sortěrow&amp;ański pórěd A &gt; Z">
+<!ENTITY sort.label "&amp;Sortěrowaś pó">
+<!ENTITY subscription.source.label "Filtrowa lisćina">
+<!ENTITY hitcount.column "&amp;Trjefarje">
+<!ENTITY noFilters.text "Njejsćo žedne swójske filtry.">
+<!ENTITY backup.custom.title "Jano swójske filtry">
+<!ENTITY subscription.external.label "Pśez druge rozšyrjenje aktualizěrowany">
+<!ENTITY subscription.delete.label "Lašowaś">
+<!ENTITY noGroupSelected.text "Musyśo filtrowu kupku wubraś, nježli až jeje filtry daju se pokazaś.">
+<!ENTITY filter.cut.label "Wurězaś">
+<!ENTITY restore.default.label "Zawěsćeńsku kopiju z ?1? wótnowiś">
+<!ENTITY subscription.lastDownload.inProgress "Ześěgujo se...">
+<!ENTITY subscriptions.tab.label "Filtrowe abonementy">
+<!ENTITY sort.descending.label "Sortěrowański pórěd &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Cośo napšawdu wšykne wubrane filtry wótpóraś?">
+<!ENTITY filter.delete.label "Lašowaś">
+<!ENTITY addSubscriptionAdd.label "Pśidaś">
+<!ENTITY viewMenu.label "Naglěd">
+<!ENTITY subscription.lastDownload.unknown "Njejo nic k dispoziciji">
+<!ENTITY addSubscriptionCancel.label "Pśetergnuś">
+<!ENTITY subscription.enabled.label "Zmóžnjony">
+<!ENTITY noSubscriptions.text "Njejsćo hyšći žedne filtrowe abonementy pśidał. Adblock Plus njebuźo bjez filtrow nic blokěrowaś, pšosym wužyjśo &quot;Filtrowy abonement pśidaś&quot;, aby filter přidał.">
+<!ENTITY subscription.update.label "Filtry akutalizěrowaś">
+<!ENTITY dialog.title "Adblock Plus - filtrowe nastajenja">
+<!ENTITY addFilter.label "Filter pśi&amp;daś">
+<!ENTITY subscription.minVersion.warning "Toś ten filtrowy abonement pomina se nowšu wersiju Adblock Plus, wy by měł na nejnowšu wersiju Adblock Plus aktualizěrowaś.">
+<!ENTITY subscription.lastDownload.invalidURL "Njeraźiło, žedna płaśiwa adresa">
+<!ENTITY backup.error "Pśi pisanju filtrow do dataje jo zmólka namakała. Zawěsććo, až dataja njejo pśeśiwo pisanjeju šćitana abo njewužywa se pśez drugi program.">
+<!ENTITY filter.moveUp.label "Górjej">
+<!ENTITY addGroup.label "Filtrowu &amp;kupku pśidaś">
+<!ENTITY filter.edit.label "Wobźěłaś">
+<!ENTITY subscription.showHideFilters.label "Filtry pokazaÅ›/schowaÅ›">
+<!ENTITY acceptableAds2.label "De&amp;centne wabjenje dowóliś">
+<!ENTITY addSubscriptionOther.label "Drugi abonement pśidaś">
+<!ENTITY close.label "ZacyniÅ›">
+<!ENTITY sort.none.label "&amp;Njesortěrowany">
+<!ENTITY filter.actions.label "Filtrowe akcije">
+<!ENTITY filter.copy.label "Kopěrowaś">
+<!ENTITY filter.moveDown.label "Dołoj">
+<!ENTITY filter.resetHitCounts.label "Statistiku slědk stajiś">
+<!ENTITY readMore.label "Dalšne informacije">
+<!ENTITY subscription.moveUp.label "Górjej">
+<!ENTITY addSubscription.label "&amp;Filtrowy abonement pśidaś">
+<!ENTITY subscription.homepage.label "Startowy bok">
+<!ENTITY backup.complete.title "Wšykne filtry a abonementy">
+<!ENTITY restore.own.label "Swójsku zawěsćeńsku kopiju wótnowiś">
+<!ENTITY restore.complete.warning "Wšykne waše filtrowe nastajenja budu se pśez wopśimjeśe wubraneje dataje narownowaś. Cośo dalej cyniś?">
+<!ENTITY filters.tab.label "Swójske filtry">
+<!ENTITY backup.label "Nowu zaěsćeńsku kopiju napóraś">
+<!ENTITY find.label "&amp;PytaÅ›">
+<!ENTITY subscription.moveDown.label "Dołoj">
+<!ENTITY subscription.lastDownload.connectionError "Njeraźiło, ześěgnjeńska zmólka">
+<!ENTITY subscription.lastDownload.success "Wuspěch">
+<!ENTITY subscription.lastDownload.invalidData "Njeporaźiło, žedna płaśiwa filtrowa lisćina">
+<!ENTITY filter.paste.label "ZasunuÅ›">
+<!ENTITY subscription.disabledFilters.enable "Znjemóžnjone filtry zmóžniś">
+<!ENTITY lasthit.column "S&amp;lědny trjefaŕ">
+<!ENTITY subscription.editTitle.label "Titel wobźěłaś">
+<!ENTITY subscription.disabledFilters.warning "Někotare filtry w toś tom abonomenśe su znjemóžnjone.">
+<!ENTITY filter.column "&amp;Filtrowe pšawidło">
+<!ENTITY subscription.lastDownload.label "Slědne ześěgnjenje:">
+<!ENTITY viewList.label "Lisćinu pokazaś">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/firstRun.properties
new file mode 100644
index 0000000..fa8cf6a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Pśeglědujśo priwatnje, z tym až znjemóžnjujośo slědowanje resp. zatajaśo swóje slědy pśed wabjeńskimi pśedewześami, kótarež by rady kuždemu z wašych pógibow slědowali.
+firstRun_toggle_off=WUÅ ALTOWANY
+firstRun_feature_tracking=Slědowanje znjemóžniś
+firstRun_feature_malware=Škódnu software blokěrowaś
+firstRun_title=Adblock Plus jo se instalěrował
+firstRun_acceptableAdsExplanation=My by rady websedła pózbuźili, wuwěrne, decentne wabjenje wužywaś. Togodla smy <a>kšute směrnice</a> póstajili, aby my akceptabelne wabjenje identificěrowali, kótarež pokazujo se w standardnych nastajenjach. Jolic cośo weto wšykne wabjenje blokěrowaś, móžośo jo w běgu mało sekundow <a>znjemóžniś</a>.
+firstRun_toggle_on=ZAÅ ALTOWANY
+firstRun_contributor_credits=Źěkowanje sobustatkujucym
+firstRun_dataCorruptionWarning=Pokazujo se toś ten bok dalej? <a>Klikniśo how!</a>
+firstRun_acceptableAdsHeadline=Gramne wabjenje buźo se něnto blokěrowaś
+firstRun_share=Informěrujśo swóje pśijaśele
+firstRun_share_headline=<a>Pódajśo nam ruku</a>, aby my web k lěpšemu městnoju cynili
+firstRun_features=Adblock Plus móžo wěcej cyniś ako wabjenje blokěrowaś
+firstRun_feature_malware_description=Cyńśo swójo pśeglědowanje wěsćejše, z tym až blokěrujośo znate domeny złosneje softwary.
+firstRun_feature_social_description=Wótpórajśo swóju pśeglědowańsku aktiwitu z tłocaškow socialnych medijow, ako na pś. tłocaška "Spódoba se mě" na Facebooku, kótarež pokazuju se na webbokach a slěduju wašomu zaźaržanjeju.
+firstRun_donate=pósćiś
+firstRun_donate_label=Pódprějśo naš projekt
+firstRun_feature_social=Tłocaški za socialne medije wótpóraś
+firstRun_legacySafariWarning=Wužywaśo staru wersiju Safari, kótaraž njepódpěra se pśez Adblock Plus. Wón njebuźo snaź korektnje funkcioněrowaś abo by mógał wužywarske dožywjenje na wěstych websedłach kazyś. Pśiraźujomy wuraznje, až pak aktualizěrujośo na Safari 6.1.1 abo wušu wersiju (stoj za Mac OS X 10.8 Mountain Lion k dispoziciji) abo Safari 7.0.1 abo wušu wersiju (na OS X 10.9 Mavericks) pak wužywaśo nejnowšu wersiju Mozilla Firefox, Google Chrome abo Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/global.properties
new file mode 100644
index 0000000..3b6e734
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Žedne blokěrujobne zapiski na toś tom boku
+action3_tooltip=Kliknuś, aby se Adblock Plus zmóžnił/znjemóžnił.
+notification_antiadblock_title=Celowe powěźeńki schowaś?
+type_label_script=skript
+filter_elemhide_nocriteria=Njejsu žedne kriterije pódane, aby element spóznał, kótaryž ma se schowaś
+blockingGroup_title=Pšawidła za blokěrowanje wabjenja
+whitelisted_tooltip=Adblock Plus jo znjemóžnjony na aktualnem boku.
+type_label_stylesheet=stilowa pśedłoga
+blocked_count_tooltip=?1? z ?2?
+type_label_font=pismo
+type_label_popup=Wuskokujuce wokno
+filter_regexp_tooltip=Toś ten filter jo pak regularny wuraz pak pśekrotko za optiměrowanje. Pśewjele toś tych filtrow by mógło waš wobglědowak spomałšyś.
+action0_tooltip=Kliknuś, aby kontekstowy meni do prědka pśinjasć, ze srjejźneju tastu kliknuś, aby zmóžnił(znjemóžnił.
+whitelisted_page=Adblock Plus jo se za aktualny bok znjemóžnił
+remove_group_warning=Cośo toś tu kupku napšawdu wótpóraś?
+action1_tooltip=Kliknuś, aby se blokěrujobne zapiski wócynili/zacynili, ze srjejźneju tastu kliknuś, aby zmóžnił/znjemóžnił.
+type_label_xmlhttprequest=XML-napšašowanje
+active_tooltip=Adblock Plus jo zmóžnjony, ?1? filtrowe abonementy a ?2? swójske filtry se wužywaju.
+type_label_document=dokument
+type_label_object_subrequest=objektowe pódnapšašowanje
+whitelistGroup_title=Wuwześowe pšawidła
+disabled_tooltip=Adblock Plus jo znjemóžnjony.
+filter_elemhide_duplicate_id=Jano jaden ID elementa, kótaryž ma se schowaś, dajo se pódaś
+type_label_object=objekt
+action2_tooltip=Kliknuś, aby se nastajenja wócynili, ze srjejźneju tastu kliknuś, aby zmóžnił/znjemóžnił.
+type_label_subdocument=wobłuk
+clearStats_warning=To stajijo wšu filtrowu statistiku slědk a znjemóžnijo licenje filtrowych wótpowědnikow. Cośo pókšacowaś?
+notification_antiadblock_message=Toś to sedło jo za to znate, až pokazujo celowe powěźeńki za wužywarje Adblock Plus. Cośo, až Adblock Plus chowa celowe powěźeńki?
+blocked_count_addendum=(teke w běłej lisćinje: ?1?, schowane: ?2?)
+subscription_invalid_location=Městno filtroweje lisćiny njejo daniž płaśiwy URL daniž płaśiwe datajowe mě.
+type_label_image=wobraz
+remove_subscription_warning=Cośo toś ten abonement napšawdu wótpóraś?
+type_label_other=druge
+mobile_menu_enable=ABP: Zmóžniś
+type_label_media=awdio/wideo
+mobile_menu_disable_site=ABP: Na ?1? znjemóžniś
+elemhideGroup_title=Pšawidła za schowanje elementow
+mobile_menu_enable_site=ABP: Na ?1? zmóžniś
+type_label_elemhide=schowany
+newGroup_title=Nowa filtrowa kupka
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/overlay.dtd
new file mode 100644
index 0000000..b5e7b62
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Jo">
+<!ENTITY notification.button.no "&amp;NÄ›">
+<!ENTITY sync.label "Nastajenja za syn&amp;chronizěrowanje Adblock Plus">
+<!ENTITY whitelist.site.label "Na ?1? znjemóžniś">
+<!ENTITY filters.label "&amp;Filtrowe nastajenja">
+<!ENTITY disable.label "Wšuźi znjemóžniś">
+<!ENTITY objecttab.title "Blokěrowaś">
+<!ENTITY objecttab.tooltip "Klikniśo how, aby toś ten objekt z Adblock Plus blokěrował">
+<!ENTITY menuitem.label "Adblock Plus - &amp;Nastajenja">
+<!ENTITY objecttabs.label "&amp;Rejtarki wó Flash a Java pokazaś">
+<!ENTITY sendReport.label "&amp;Problem na toś tom boku k wěsći daś">
+<!ENTITY whitelist.page.label "Jano na toś tom boku znjemóžniś">
+<!ENTITY context.image.label "Adblock Plus: Wobraz blokěrowaś">
+<!ENTITY counthits.label "Fi&amp;ltrowe trjefarje licyÅ›">
+<!ENTITY opensidebar.label "B&amp;lokěrujobne zapiski wócyniś">
+<!ENTITY notification.button.close "&amp;ZacyniÅ›">
+<!ENTITY contribute.label "K Adblock Plus pśinosowaś">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Wobłuk blokěrowaś">
+<!ENTITY blocked.tooltip "Blokěrowane zapiski na toś tom boku:">
+<!ENTITY hideplaceholders.label "Na&amp;městniki blokěrowanych elementow schowaś">
+<!ENTITY showinstatusbar.label "W &amp;statusowej lejstwje pokazaÅ›">
+<!ENTITY sidebar.title "Blokěrujobne zapiski na aktualnem boku">
+<!ENTITY options.label "&amp;Opcije">
+<!ENTITY context.object.label "Adblock Plus: Objekt blokěrowaś">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Na toś tom boku zasej zmóžniś">
+<!ENTITY filters.tooltip "Nejaktiwnjejše filtry:">
+<!ENTITY closesidebar.label "B&amp;lokěrujobne zapiski zacyniś">
+<!ENTITY showintoolbar.label "W symbolowej rÄ›&amp;dce pokazaÅ›">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Awdio/Wideo blokěrowaś">
+<!ENTITY subscription.update.label "Filtry akutalizěrowaś">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/sendReport.dtd
new file mode 100644
index 0000000..3637b33
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Anulěrowaś">
+<!ENTITY issues.disabledgroups.description "Slědujuce filtrowe abonementy/filtrowe kupki su znjemóžnjone, weto by mógli wustatkowanje na toś ten bok měś:">
+<!ENTITY showData.label "Daty rozpšawy pokazaś">
+<!ENTITY typeSelector.falsePositive.label "Ad&amp;block Plus blokěrujo pśewjele">
+<!ENTITY issues.change.description "Waša konfiguracija jo se změniła. Pšosym zacytajśo bok znowego, aby změny testował a wótpósćelśo rozpšawu, jolic problem njejo se pśez změny rozwězał.">
+<!ENTITY email.label "&amp;E-mail:">
+<!ENTITY issues.openPreferences.label "Filtrowe nastajenja wócyniś">
+<!ENTITY sendPage.confirmation "Waša rozpšawa jo se składowała. Móžośo ju pód slědujuceju adresu namakaś:">
+<!ENTITY copyLink.label "Wót&amp;kaz rozpšawy kopěrowaś">
+<!ENTITY issues.nofilters.description "Adblock Plus njeblokěrujo nic na aktualnem boku. Problem, kótaryž sćo k wěsći dał, nejskerjej njama z Adblock Plus cyniś.">
+<!ENTITY sendPage.knownIssue "Problem, wó kótaryž sćo rozpšawił, jo nejskerjej južo znaty. Dalšne informacije:">
+<!ENTITY typeSelector.other.description "Wubjeŕśo toś tu opciju, jolic gódaśo skerjej problem z Adblock Plus samym ako z jogo filtrami.">
+<!ENTITY issues.disabledgroups.enable.label "Filtrowy abonement/filtrowu kupku zmóžniś">
+<!ENTITY typeWarning.override.label "Roz&amp;měju a cu rozpšawu weto pósłaś">
+<!ENTITY issues.disabled.enable.label "Adblock Plus zmóžniś">
+<!ENTITY update.fixed.description "Aktualizacije za waše filtrowe abonementy su nejskerjej problem rozwězali, kótaryž sćo k wěsći dał. Pšosym zacytajśo bok znowego, wopytajśo hyšći raz a klikniśo zasej na 'Hyšći raz pósłaś', jolic problem hyšći wobstoj.">
+<!ENTITY anonymous.label "&amp;Anonymne słanje">
+<!ENTITY reloadButton.label "&amp;Bok znowego zacytaÅ›">
+<!ENTITY recentReports.clear.label "&amp;Wšykne rozpšawy wótpóraś">
+<!ENTITY typeSelector.description "Toś to wokno buźo wam pśez kšace wjasć, kótarež su trěbne za słanje wopisanja problemow z Adblock Plus. Wubjeŕśo pšosym nejpjerwjej družynu problema, na kótaryž sćo na toś tom boku starcył:">
+<!ENTITY screenshot.remove.label "&amp;Sensibelne daty wótpóraś">
+<!ENTITY issues.ownfilters.description "Někotare filtry, kótarež nałožuju se na toś ten bok, su wót wužywarja definěrowane. Pšosym znjemóžniśo filtry, kótarež by mógli problem zawinowaś:">
+<!ENTITY update.inProgress.description "Adblock Plus musy waše filtrowe abonementy aktualizěrowaś, aby zawěsćił, až problem njejo se hyšći rozwězał. Pšosym cakajśo...">
+<!ENTITY sendPage.retry.label "Hyšći raz pósłaś:">
+<!ENTITY data.label "&amp;Daty rozpšawy:">
+<!ENTITY recentReports.label "Waše njedawno wótpósłane rozpšawy">
+<!ENTITY typeWarning.description "Sćo pódał, až maš skerjej powšykny problem z Adblock Plus ako problem z filtrami. Pšosym źiwajśo na to, až take problemy by měli se nejlěpjej we [link]forumje Adblock Plus[/link] k wěsći daś. Wy by měł jano rozpšawniski asistent za problemy wužywaś, aby eksistěrujucu diskusiju wudopołnił, dokulaž nichten njewopóznajo se wašu rozpšawu, snaźkuli wy by wótkaz na njo dodaś. Awtomatiski napórany wótkaz dodajo se pó słanju rozpšawy.">
+<!ENTITY issues.disabled.description "Adblock Plus jo znjemóžnjony, njebuźo blokěrowaś nic w aktualnem statusu.">
+<!ENTITY attachExtensions.label "&amp;Lisćinu aktiwnych rozšyrjenjow k rozpšawje pśipowjesás, jolic konflikt z rozšyrjenim jo pśicyna problema">
+<!ENTITY issues.nosubscriptions.add.label "Filtrowy abonement pśidaś">
+<!ENTITY issues.disabledfilters.enable.label "Filter zmóžniś">
+<!ENTITY issues.override.label "Kon&amp;figuracija jo korektna, z rozpšawu pókšacowaś">
+<!ENTITY issues.nosubscriptions.description "Zda se, až njejśco žedne gótowe lisćiny filtrow aboněrował, kótarež awtomatiski wótwónoźuju njewitane wopśimjeśe.">
+<!ENTITY typeSelector.falsePositive.description "Wubjeŕśo toś tu opciju, jolic wažne wopśimjeśe felujo bokoju, jolic bok zwobraznja se wopak abo porědnje njefunkcioněrujo. Móžośo zwěsćiś, lěc Adblock Plus jo wina na toś tom problemje, gaž znjemóžnijośo jen nachylu.">
+<!ENTITY typeSelector.other.label "D&amp;rugi problem">
+<!ENTITY emailComment.label "Pśiraźujomy wam, płaśiwu e-mailowu adresu zapódaś, aby mógli z wami do zwiska stajiś, jolic su pšašanja wó wašej rozpšawje. To zmóžnijo nam, waše pśinoski pśipóznaś a jim wušu prioritu daś.">
+<!ENTITY issues.whitelist.remove.label "Adblock Plus na toś tom boku znowego zmóžniś">
+<!ENTITY outdatedSubscriptions.description "Slědujuce filtrowe abonementy njejsu se wót nanejmjenjej dweju tyźenjowu zaktualizěrowali. Pšosym zaktualizěrujśo toś te abonementy, pjerwjej až pósćeloš powěźeńku. Problem by mógał pón južo rozwězany byś.">
+<!ENTITY dataCollector.description "Pšosym pócakajśo chylku, mjaztym až Adblock Plus wótwołujo trěbne daty.">
+<!ENTITY sendButton.label "Ro&amp;zpšawu pósłaś">
+<!ENTITY comment.label "&amp;Komentar (opcionalny)">
+<!ENTITY sendPage.errorMessage "Wopyt, rozpšawu słaś, jo se ze zmólkowym kodom &quot;?1?&quot; njeraźił. Pšosym zawěsććo, až sćo z internetom zwězany a wopytajśo hyšći raz. Jolic problem dalej eksistěrujo, pšosćo pšosym w [link]forumje Adblock Plus[/link] wó pomoc.">
+<!ENTITY showRecentReports.label "Njedawno wótpósłane rozpšawy pokazaś">
+<!ENTITY commentPage.heading "Komentar zapódaś">
+<!ENTITY update.start.label "Aktualizaciju něnto startowaś">
+<!ENTITY issues.disabledfilters.description "Slědujuce filtry su znjemóžnjone, weto by mógli wustatkowanje na toś ten bok měś:">
+<!ENTITY screenshot.description "Ten samy bok móžo rozdźělnje za rozdźělnych luźi wuglědaś. Móžo nam pomagaś, problem rozměś, jolic pśidajo wašej rozpšawje foto wobrazowki . Móžośo wótrězki wótpóraś, kótarež wopśimujo sensibelne informacije a teke wobłuki markěrowaś, źož se problem pokazujo. Aby to cynił, klikniśo na wótpowědny tłócašk a wubjeŕśo wótrězk wobraza ze swójeju myšku.">
+<!ENTITY screenshot.attach.label "W&amp;obraz boka rozpšawje pśidaś">
+<!ENTITY issues.whitelist.description "Adblock Plus jo tuchylu na boku, wó kótaremž rozpšawjaśo, znjemóžnjony. Pšosym zmóžniśo jen znowego a zacytajśo bok, nježli až wótposćelośo rozpšawu, aby analyzěrowanje toś togo problema pódprěł.">
+<!ENTITY typeSelector.falseNegative.label "Adb&amp;lock Plus njeblokěrujo wabjenje">
+<!ENTITY typeSelector.heading "Wubjeŕśo problemowy typ">
+<!ENTITY anonymity.warning "Njamóžomy se zasej a was wobrośiś a dajomy nejskerjej wašej rozpšawje nišu prioritu.">
+<!ENTITY wizard.title "Rozpšawniski asistent za problemy">
+<!ENTITY issues.ownfilters.disable.label "Filter znjemóžniś">
+<!ENTITY commentPage.description "Slědujuce tekstowe pólo zmóžnja wam, komentar zapódaś, aby wy nam pomagał, problem rozměś. Toś ten kšac jo opcionalny, ale pśiraźujo se, jolic problem njejo widobny. Móžośo teke daty rozpšawy pśeglědaś, nježli až se sćelo.">
+<!ENTITY comment.lengthWarning "Dłujkosć wašogo komentara pśekšaca 1000 znamuškow. Jano prědne 1000 znamuškow budu se słaś.">
+<!ENTITY typeSelector.falseNegative.description "Wubjeŕśo toś tu opciju, jolic wabjenje se zwobraznja, lěcrownož Adblock Plus jo zmóžnjony.">
+<!ENTITY sendPage.waitMessage "Pšosym cakajśo, mjaztym až Adblock Plus sćelo wašu rozpšawu.">
+<!ENTITY dataCollector.heading "Witajśo do rozpšawniskego asistenta za problemy">
+<!ENTITY screenshot.heading "Foto wobrazowki pśidaś">
+<!ENTITY sendPage.heading "Rozpšawu słaś">
+<!ENTITY issues.subscriptionCount.description "Zda se, až sćo pśewjele filtrowych abonementow aboněrował. Toś to nastajenje se njepśiraźujo, dokulaž wjelgin pówušujo wěrjepódobnosć problemow. Teke njamóžomy waš problemowe wopisanje akceptěrowaś, dokulaž jo njejasnje, kótary awtor filtrowego abonementa ma jadnaś. Pšosym wótwónoźćo wšykne mimo napšawdu trěbnych filtrowych abonementow a testujśo, lěc problem daleje nastawa.">
+<!ENTITY screenshot.mark.label "&amp;Problem markěrowaś">
+<!ENTITY privacyPolicy.label "Pšawidła priwatnosći">
+<!ENTITY issues.description "Adblock Plus jo problemy z wašeju konfiguraciju namakał, kótarež by mógli na toś ten problem wina byś abo póśěźuju analyzěrowanje problema.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/sidebar.dtd
new file mode 100644
index 0000000..edbbdb6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Kšomy zapiska pokazaś">
+<!ENTITY address.label "Adresa">
+<!ENTITY context.open.label "W nowem rejtarku wócyniś">
+<!ENTITY type.label "Typ">
+<!ENTITY tooltip.filterSource.label "Filtrowe žrědło:">
+<!ENTITY noitems.label "Žedne blokěrujobne zapiski">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Wjelikosć:">
+<!ENTITY reattach.label "Zasej pśipowjesyś">
+<!ENTITY search.label "&amp;PytaÅ›:">
+<!ENTITY docDomain.thirdParty "(tśeśi part)">
+<!ENTITY filterSource.label "Filtrowe žrědło">
+<!ENTITY tooltip.docDomain.label "Dokumentowe žrědło:">
+<!ENTITY context.copy.label "Adresu zapiska kopěrowaś">
+<!ENTITY tooltip.type.label "Typ:">
+<!ENTITY context.disablefilter.label "Filter ?1? znjemóžniś">
+<!ENTITY context.copyFilter.label "Filter kopěrowaś">
+<!ENTITY context.block.label "Toś ten zapisk blokěrowaś">
+<!ENTITY context.enablefilter.label "Filter ?1? zasej zmóžniś">
+<!ENTITY detach.label "Wótpowjesyś">
+<!ENTITY whitelisted.label "Bok w běłej lisćinje">
+<!ENTITY context.disablefilteronsite.label "Toś ten filter na ?1? znjemóžniś">
+<!ENTITY detached.title "Adblock Plus: Blokěrujobne zapiski (wótpowjesone)">
+<!ENTITY docDomain.firstParty "(prědny part)">
+<!ENTITY tooltip.type.whitelisted "(w běłej lisćinje)">
+<!ENTITY tooltip.filter.label "Aktiwny filter:">
+<!ENTITY tooltip.filter.disabled "(znjemóžnjony)">
+<!ENTITY context.editfilter.label "Aktiwny filter wobźěłaś">
+<!ENTITY tooltip.type.blocked "(blokěrowany)">
+<!ENTITY size.label "Wjelikosć">
+<!ENTITY context.whitelist.label "Wuwześowe pšawidło za toś ten zapisk pśidaś">
+<!ENTITY context.selectAll.label "Wšykno wubraś">
+<!ENTITY state.label "Status">
+<!ENTITY docDomain.label "Dokumentowe žrědło">
+<!ENTITY tooltip.address.label "Adresa:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/subscriptionSelection.dtd
new file mode 100644
index 0000000..334b3de
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/dsb/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "&amp;Filtrowy abonement &quot;?1?&quot; teke pśidaś">
+<!ENTITY list.download.failed "Adblock Plus njejo mógał lisćiny abonementow wótwołaś.">
+<!ENTITY list.download.retry "Hyšći raz wopytaś">
+<!ENTITY title.label "&amp;Titel abonementa:">
+<!ENTITY list.download.website "Websedło se woglědaś">
+<!ENTITY supplementMessage "Toś ten filtrowy abonement jo za to myslony, se z filtrowym abonementom &quot;?1?&quot; wužywaś, kótaryž hyšći njewužywaśo.">
+<!ENTITY viewList.label "Filtry se woglědaś">
+<!ENTITY visitHomepage.label "K startowemu bokoju woglědaś">
+<!ENTITY addSubscription.label "Abonement pśidaś">
+<!ENTITY dialog.title "Filtrowy abonement Adblock Plus pśidaś">
+<!ENTITY location.label "&amp;Městno filtroweje lisćiny:">
+<!ENTITY fromWeb.description "Pšosym wobkšuśćo, až cośo toś ten filtrowy abonement pśidaś. Móžośo titel abo městno abonementa změniś, nježli až jen pśidajośo.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/composer.dtd
new file mode 100644
index 0000000..8ea8aee
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "στο τέ&amp;λος της διεÏθυνσης">
+<!ENTITY domainRestriction.label "ΠεÏιοÏισ&amp;μός στον τομέα:">
+<!ENTITY collapse.default.no.label "ΧÏήση Ï€ÏοκαθοÏισμένου (όχι)">
+<!ENTITY firstParty.label "&amp;Εκτός από Ï„Ïίτους">
+<!ENTITY preferences.label "ΠÏοβολή υπαÏχόντων φίλτÏων...">
+<!ENTITY pattern.label "Αναζήτηση μοτίβου">
+<!ENTITY thirdParty.label "Από &amp;Ï„Ïίτους μόνο">
+<!ENTITY filter.label "Îέο φίλτÏο:">
+<!ENTITY collapse.label "ΣÏμπτυξη φÏαγμένων:">
+<!ENTITY match.warning "Το μοτίβο που εισάγατε δεν ταιÏιάζει πλέον στην διεÏθυνση που θέλετε να φÏαγεί και δεν θα έχει κανένα αποτέλεσμα.">
+<!ENTITY anchor.start.label "στην &amp;αÏχή της διεÏθυνσης">
+<!ENTITY matchCase.label "ΤαίÏιασμα μικÏών-κεφαλαίων">
+<!ENTITY custom.pattern.label "ΠÏο&amp;σαÏμογή:">
+<!ENTITY unselectAllTypes.label "Επιλογή κανενός">
+<!ENTITY type.whitelist.label "Κανόνας εξαίÏεσης">
+<!ENTITY regexp.warning "Το μοτίβο που εισάγατε θα εÏμηνευτεί σαν regular expression. Πολλά regular expressions μποÏεί να μειώσουν την ταχÏτητα πλοήγησης. Αν σκοπός σας δεν ήταν να χÏησιμοποιήσετε regular expressions, Ï€Ïοσθέστε το σÏμβολο * στο τέλος του μοτίβου.">
+<!ENTITY dialog.title "ΠÏοσθήκη κανόνα φίλτÏου του Adblock Plus">
+<!ENTITY basic.label "Βασική Ï€Ïοβολή">
+<!ENTITY type.filter.label "Φίλτ&amp;Ïο φÏαγής">
+<!ENTITY types.label "ΕφαÏμογή στους Ï„Ïπους:">
+<!ENTITY shortpattern.warning "Το μοτίβο που εισάγατε είναι Ï€Î¿Î»Ï ÎºÎ¿Î½Ï„ÏŒ για να βελτιστοποιηθεί· πολλά τέτοια μοτίβα μποÏεί να μειώσουν την ταχÏτητα πλοήγησης. ΠÏοτείνεται να επιλέξετε ένα μακÏÏτεÏο μοτίβο για το φίλτÏο.">
+<!ENTITY collapse.yes.label "Îαι">
+<!ENTITY anchors.label "Αποδοχή του μοτίβου μόνο:">
+<!ENTITY collapse.default.yes.label "ΧÏήση Ï€ÏοκαθοÏισμένου (ναι)">
+<!ENTITY domainRestriction.help "Δηλώστε έναν ή πεÏισσότεÏους τομείς (domain) διαχωÏισμένους με το σÏμβολο &quot;|&quot;, και το φίλτÏο θα εφαÏμοστεί μόνο σε αυτοÏÏ‚. Το σÏμβολο &quot;~&quot; Ï€Ïιν από τον τομέα σημαίνει πως το φίλτÏο δεν θα εφαÏμοστεί στο συγκεκÏιμένο τομέα.">
+<!ENTITY accept.label "ΠÏοσθήκη φίλτÏου">
+<!ENTITY options.label "Επιλογές">
+<!ENTITY disabled.warning "Το Adblock Plus είναι απενεÏγοποιημένο. ΜποÏείτε να Ï€Ïοσθέσετε φίλτÏα αλλά αυτά θα εφαÏμοστοÏν μόλις [link]ενεÏγοποιήσετε το Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "στην &amp;αÏχή του ονόματος τομέα">
+<!ENTITY collapse.no.label "Όχι">
+<!ENTITY selectAllTypes.label "Επιλογή όλων">
+<!ENTITY advanced.label "Για Ï€ÏοχωÏημένους">
+<!ENTITY pattern.explanation "Το μοτίβο μποÏεί να είναι οποιοδήποτε μέÏος της διεÏθυνσης, το σÏμβολο * δÏα ως wildcard. Το φίλτÏο θα εφαÏμοστεί μόνο στις διευθÏνσεις που ταιÏιάζουν στο μοτίβο.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/filters.dtd
new file mode 100644
index 0000000..006871b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Όλα τα Ï€ÏοσαÏμοσμένα φίλτÏα σας θα αντικατασταθοÏν από τα πεÏιεχόμενα του επιλεγμένου αÏχείου. θέλετε να συνεχίσετε;">
+<!ENTITY slow.column "&amp;Εμφάνιση φίλτÏων">
+<!ENTITY enabled.column "Ε&amp;νεÏγοποιημένο">
+<!ENTITY subscription.lastDownload.checksumMismatch "Απέτυχε, απόκλιση στον έλεγχο checksum">
+<!ENTITY noFiltersInGroup.text "Η επιλεγμένη ομάδα είναι άδεια">
+<!ENTITY subscription.actions.label "ΕνέÏγειες">
+<!ENTITY filter.selectAll.label "Επιλογή όλων">
+<!ENTITY backupButton.label "&amp;ΑντίγÏαφα ασφαλείας και επαναφοÏά">
+<!ENTITY restore.minVersion.warning "ΠÏοειδοποίηση: το αÏχείο έχει δημιουÏγηθεί με μια νεότεÏη έκδοση του Adblock Plus. Θα Ï€Ïέπει να αναβαθμίσετε το Adblock Plus στην τελευταία του έκδοση Ï€Ïιν ανακτήσετε από αυτό το αÏχείο.">
+<!ENTITY restore.error "Τα δεδομένα του αÏχείου δεν μποÏοÏν να επεξεÏγαστοÏν, μήπως αυτός δεν είναι αντίγÏαφο ασφαλείας του Adblock Plus;">
+<!ENTITY sort.ascending.label "&amp;ΑÏξουσα">
+<!ENTITY sort.label "&amp;Ταξινόμηση κατά">
+<!ENTITY subscription.source.label "Λίστα φίλτÏων">
+<!ENTITY hitcount.column "Επιτυ&amp;χίες">
+<!ENTITY noFilters.text "Δεν έχετε κάποιο Ï€ÏοσαÏμοσμένο φίλτÏο ακόμα.">
+<!ENTITY backup.custom.title "Μόνο τα Ï€ÏοσαÏμοσμένα φίλτÏα">
+<!ENTITY subscription.external.label "ΕνημεÏώθηκε από άλλο Ï€Ïόσθετο">
+<!ENTITY subscription.delete.label "ΔιαγÏαφή">
+<!ENTITY noGroupSelected.text "ΠÏέπει να επιλέξετε μια ομάδα φίλτÏων ώστε να εμφανιστοÏν τα φίλτÏα της.">
+<!ENTITY filter.cut.label "Αποκοπή">
+<!ENTITY restore.default.label "ΕπαναφοÏά αντιγÏάφου ασφαλείας από την ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Σε εξέλιξη...">
+<!ENTITY subscriptions.tab.label "ΣυνδÏομές φίλτÏων">
+<!ENTITY sort.descending.label "Φ&amp;θίνουσα">
+<!ENTITY filters.remove.warning "Θέλετε να απομακÏÏνετε όλα τα επιλεγμένα φίλτÏα;">
+<!ENTITY filter.delete.label "ΔιαγÏαφή">
+<!ENTITY addSubscriptionAdd.label "ΠÏοσθήκη">
+<!ENTITY viewMenu.label "ΠÏοβολή">
+<!ENTITY subscription.lastDownload.unknown "Μ/Δ">
+<!ENTITY addSubscriptionCancel.label "ΑκÏÏωση">
+<!ENTITY subscription.enabled.label "ΕνεÏγοποιημένη">
+<!ENTITY noSubscriptions.text "Δεν έχετε Ï€Ïοσθέσει κάποια συνδÏομή φίλτÏων. Το Adblock Plus δεν μποÏεί να μπλοκάÏει κάτι χωÏίς φίλτÏα· παÏακαλώ χÏησιμοποιήστε την &quot;ΠÏοσθήκη συνδÏομής&quot; για να οÏίσετε μια.">
+<!ENTITY subscription.update.label "ΕνημέÏωση φίλτÏων">
+<!ENTITY dialog.title "ΠÏοτιμήσεις φίλτÏων του Adblock Plus">
+<!ENTITY addFilter.label "ΠÏοσθήκη &amp;φίλτÏου">
+<!ENTITY subscription.minVersion.warning "Αυτή η συνδÏομή φίλτÏων απαιτεί μια νεότεÏη έκδοση του Adblock Plus· θα Ï€Ïέπει να αναβαθμίσετε το Adblock Plus στην τελευταία έκδοση.">
+<!ENTITY subscription.lastDownload.invalidURL "Απέτυχε, μη έγκυÏη διεÏθυνση">
+<!ENTITY backup.error "ΥπήÏξε κάποιο Ï€Ïόβλημα στην εγγÏαφή των φίλτÏων στο αÏχείο. ΣιγουÏευτείτε ότι το αÏχείο δεν Ï€ÏοστατεÏεται από εγγÏαφή ή ότι δεν χÏησιμοποιείται από κάποια άλλη εφαÏμογή.">
+<!ENTITY filter.moveUp.label "Μετακίνηση επάνω">
+<!ENTITY addGroup.label "ΠÏ&amp;οσθήκη ομάδας φίλτÏων">
+<!ENTITY filter.edit.label "ΕπεξεÏγασία">
+<!ENTITY subscription.showHideFilters.label "Εμφάνιση/απόκÏυψη φίλτÏων">
+<!ENTITY acceptableAds2.label "Îα επιτÏέπονται &amp;μεÏικές μη-παÏεμβατικές διαφημίσεις">
+<!ENTITY addSubscriptionOther.label "ΠÏοσθήκη άλλης συνδÏομής">
+<!ENTITY close.label "Κλείσιμο">
+<!ENTITY sort.none.label "Χ&amp;ωÏίς ταξινόμηση">
+<!ENTITY filter.actions.label "ΕνέÏγειες φίλτÏων">
+<!ENTITY filter.copy.label "ΑντιγÏαφή">
+<!ENTITY filter.moveDown.label "Μετακίνηση κάτω">
+<!ENTITY filter.resetHitCounts.label "Μηδενισμός στατιστικών επιτυχιών">
+<!ENTITY readMore.label "Διαβάστε πεÏισσότεÏα">
+<!ENTITY subscription.moveUp.label "Μετακίνηση επάνω">
+<!ENTITY addSubscription.label "ΠÏο&amp;σθήκη συνδÏομής">
+<!ENTITY subscription.homepage.label "Ιστοσελίδα">
+<!ENTITY backup.complete.title "Όλα τα φίλτÏα και οι συνδÏομές">
+<!ENTITY restore.own.label "ΕπαναφοÏά Î´Î¹ÎºÎ¿Ï ÏƒÎ±Ï‚ αντιγÏάφου ασφαλείας">
+<!ENTITY restore.complete.warning "Όλες οι Ï€Ïοτιμήσεις των φίλτÏων σας θα αντικατασταθοÏν από τα πεÏιεχόμενα του επιλεγμένου αÏχείου. θέλετε να συνεχίσετε;">
+<!ENTITY filters.tab.label "ΠÏοσαÏμοσμένα φίλτÏα">
+<!ENTITY backup.label "ΔημιουÏγία νέου αντιγÏάφου ασφαλείας">
+<!ENTITY find.label "ΕÏ&amp;Ïεση">
+<!ENTITY subscription.moveDown.label "Μετακίνηση κάτω">
+<!ENTITY subscription.lastDownload.connectionError "Απέτυχε, σφάλμα κατά τη λήψη">
+<!ENTITY subscription.lastDownload.success "Επιτυχής">
+<!ENTITY subscription.lastDownload.invalidData "Απέτυχε, μη έγκυÏη λίστα φίλτÏων">
+<!ENTITY filter.paste.label "Επικόλληση">
+<!ENTITY subscription.disabledFilters.enable "ΕνεÏγοποίηση απενεÏγοποιημένων φίλτÏων">
+<!ENTITY lasthit.column "Τε&amp;λευταία επιτυχία">
+<!ENTITY subscription.editTitle.label "ΕπεξεÏγασία τίτλου">
+<!ENTITY subscription.disabledFilters.warning "Κάποια φίλτÏα σε αυτή την συνδÏομή είναι απενεÏγοποιημένα.">
+<!ENTITY filter.column "Κανόνας &amp;φίλτÏου">
+<!ENTITY subscription.lastDownload.label "Τελευταία ενημέÏωση:">
+<!ENTITY viewList.label "Δείτε την λίστα">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/firstRun.properties
new file mode 100644
index 0000000..5ca81f3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=ΠεÏιηγηθείτε ιδιωτικά απενεÏγοποιώντας την παÏακολοÏθηση - αποκÏÏπτοντας τα ίχνη σας από εταιÏείες διαφημίσεων που μποÏοÏν να παÏακολουθοÏν κάθε κίνησή σας.
+firstRun_toggle_off=ΑνενεÏγό
+firstRun_feature_tracking=ΑπενεÏγοποίηση της παÏακολοÏθησης
+firstRun_feature_malware=ΦÏαγή κακόβουλου λογισμικοÏ
+firstRun_title=Το Adblock Plus έχει εγκατασταθεί
+firstRun_acceptableAdsExplanation=Θα θέλαμε να ενθαÏÏÏνουμε τις ιστοσελίδες να χÏησιμοποιοÏν ξεκάθαÏες, διακÏιτικές διαφημίσεις. Γι' αυτό το λόγο έχουμε οÏίσει <a>αυστηÏές κατευθυντήÏιες γÏαμμές</a> για τον Ï€ÏοσδιοÏισμό των αποδεκτών διαφημίσεων, οι οποίες εμφανίζονται στις Ï€Ïοεπιλεγμένες Ïυθμίσεις. Εάν εξακολουθείτε να θέλετε να αποκλείσετε όλες τις διαφημίσεις μποÏείτε να <a>απενεÏγοποιήσετε</a> αυτήν την επιλογή σε λίγα δευτεÏόλεπτα.
+firstRun_toggle_on=ΕνεÏγό
+firstRun_contributor_credits=Μνεία συντελεστών
+firstRun_dataCorruptionWarning=Αυτή η σελίδα συνεχίζει να εμφανίζεται; <a>Κάντε κλικ εδώ!</a>
+firstRun_acceptableAdsHeadline=Οι ενοχλητικές διαφημίσεις τώÏα θα αποκλειστοÏν
+firstRun_share=Πείτε το στους φίλους σας
+firstRun_share_headline=<a>Δώστε μας ένα χεÏάκι</a> στο να κάνουμε το διαδίκτυο ένα καλÏτεÏο μέÏος
+firstRun_features=Το Adblock Plus μποÏεί να κάνει πεÏισσότεÏα από το φιλτÏάÏισμα διαφημίσεων
+firstRun_feature_malware_description=Κάνετε την πεÏιήγηση σας πιο ασφαλή φÏάσσοντας γνωστές διευθÏνσεις κακόβουλου λογισμικοÏ.
+firstRun_feature_social_description=Απαλλάξετε αυτομάτως την πεÏιήγησή σας από κουμπιά των μέσων κοινωνικής δικτÏωσης, όπως το Like του Facebook, που εμφανίζονται σε ιστοσελίδες και παÏακολουθοÏν τη συμπεÏιφοÏά σας.
+firstRun_donate=δωÏίστε
+firstRun_donate_label=ΥποστηÏίξτε το έÏγο μας
+firstRun_feature_social=ΑφαίÏεση κουμπιών μέσων κοινωνικής δικτÏωσης
+firstRun_legacySafariWarning=ΧÏησιμοποιείτε μια παλιά έκδοση του Safari, η οποία δεν υποστηÏίζεται από το Adblock Plus. ΜποÏεί να μην λειτουÏγεί σωστά ή να αλλοιώσει την εμπειÏία χÏήστη σε οÏισμένες ιστοσελίδες. Σας συνιστοÏμε είτε να ενημεÏώσετε την έκδοση του φυλλομετÏητή σε Safari 6.1.1 ή νεότεÏη (σε Mac OS X 10.8 Mountain Lion), ή σε Safari 7.0.1 ή νεότεÏη (σε OS X 10.9 Mavericks) ή να χÏησιμοποιήσετε την τελευταία έκδοση του Mozilla Firefox, Google Chrome ή Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/global.properties
new file mode 100644
index 0000000..bdd9d06
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Δεν υπάÏχουν αντικείμενα Ï€Ïος φÏαγή σε αυτή τη σελίδα
+action3_tooltip=Κλικ για ενεÏγοποίηση/απενεÏγοποίηση.
+notification_antiadblock_title=ΑπόκÏυψη στοχευμένων μηνυμάτων;
+type_label_script=σενάÏιο εντολών
+filter_elemhide_nocriteria=Δεν καθοÏίστηκαν κÏιτήÏια ώστε να αναγνωÏιστεί το στοιχείο που θα φιλτÏαÏιστεί
+blockingGroup_title=Κανόνες φÏαγής διαφημίσεων
+whitelisted_tooltip=Το Adblock Plus είναι ενεÏγό αλλά απενεÏγοποιημένο για την Ï„Ïέχουσα σελίδα.
+type_label_stylesheet=stylesheet
+blocked_count_tooltip=?1? από τα ?2?
+type_label_font=γÏαμματοσειÏά
+type_label_popup=αναδυόμενο παÏάθυÏο
+filter_regexp_tooltip=Αυτό το φίλτÏο είναι ένα regular expression ή είναι Ï€Î¿Î»Ï ÎºÎ¿Î½Ï„ÏŒ ώστε να βελτιστοποιηθεί. Πολλά από αυτά τα φίλτÏα μποÏεί να μειώσουν την ταχÏτητα πλοήγησης.
+action0_tooltip=Κλικ για το Î¼ÎµÎ½Î¿Ï Ï€ÎµÏιεχομένου, μεσαίο κλικ για ενεÏγοποίηση/απενεÏγοποίηση.
+whitelisted_page=Το Adblock Plus απενεÏγοποιήθηκε για την Ï„Ïέχουσα σελίδα
+remove_group_warning=Θέλετε σίγουÏα να διαγÏάψετε αυτή την ομάδα;
+action1_tooltip=Κλικ για να ανοίξετε/κλείσετε τα στοιχεία Ï€Ïος φÏαγή, μεσαίο κλικ για ενεÏγοποίηση/απενεÏγοποίηση.
+type_label_xmlhttprequest=αίτημα XML
+active_tooltip=Το Adblock Plus είναι ενεÏγό, ?1? συνδÏομή(ές) φίλτÏων και ?2? Ï€ÏοσαÏμοσμένο(α) φίλτÏο(α) σε χÏήση.
+type_label_document=κείμενο
+type_label_object_subrequest=object subrequest
+whitelistGroup_title=Κανόνες εξαίÏεσης
+disabled_tooltip=Το Adblock Plus είναι ανενεÏγό.
+filter_elemhide_duplicate_id=Μόνο μια ταυτότητα του στοιχείου Ï€Ïος απόκÏυψη Ï€Ïέπει να καθοÏιστεί
+type_label_object=αντικείμενο
+action2_tooltip=Κλικ για τις επιλογές, μεσαίο κλικ για ενεÏγοποίηση/απενεÏγοποίηση.
+type_label_subdocument=πλαίσιο
+clearStats_warning=Αυτό θα μηδενίσει τα στατιστικά και θα απενεÏγοποιήσει τις επιτυχίες των φίλτÏων. Θέλετε να συνεχίσετε;
+notification_antiadblock_message=Αυτή η σελίδα είναι γνωστό ότι Ï€Ïοβάλει στοχευμένα μηνÏματα στους χÏήστες του Adblock Plus. Θέλετε το Adblock Plus να αποκÏÏπτει στοχευμένα μηνÏματα;
+blocked_count_addendum=(λευκή λίστα: ?1?, κÏυφά: ?2?)
+subscription_invalid_location=Η τοποθεσία της λίστας φίλτÏων δεν είναι έγκυÏη URL οÏτε και όνομα αÏχείου.
+type_label_image=εικόνα
+remove_subscription_warning=Θέλετε να απομακÏÏνετε αυτή τη συνδÏομή;
+type_label_other=άλλο
+mobile_menu_enable=ABP: ΕνεÏγοποίηση
+type_label_media=ήχος/βίντεο
+mobile_menu_disable_site=ABP: ΑπενεÏγοποίηση στο ?1?
+elemhideGroup_title=Κανόνες απόκÏυψης στοιχείων
+mobile_menu_enable_site=ABP: ΕνεÏγοποίηση στο ?1?
+type_label_elemhide=κÏυφό
+newGroup_title=Îέα ομάδα φίλτÏων
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/overlay.dtd
new file mode 100644
index 0000000..0d3fe6e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Îαι">
+<!ENTITY notification.button.no "&amp;Όχι">
+<!ENTITY sync.label "Συγ&amp;χÏονισμός των Ïυθμίσεων του Adblock Plus">
+<!ENTITY whitelist.site.label "ΑπενεÏγοποίηση στο ?1?">
+<!ENTITY filters.label "ΠÏοτιμήσεις &amp;φίλτÏων">
+<!ENTITY disable.label "ΑπενεÏγοποίηση παντοÏ">
+<!ENTITY objecttab.title "ΦÏαγή">
+<!ENTITY objecttab.tooltip "Κλικ εδώ για να φιλτÏάÏετε αυτό το αντικείμενο με το Adblock Plus">
+<!ENTITY menuitem.label "Ad&amp;block Plus">
+<!ENTITY objecttabs.label "Εμφάνιση ετικέτ&amp;ας σε αντικείμενα Flash και Java">
+<!ENTITY sendReport.label "Αναφο&amp;Ïά Ï€Ïοβλήματος σε αυτή την σελίδα">
+<!ENTITY whitelist.page.label "ΑπενεÏγοποίηση σε αυτή τη σελίδα μόνο">
+<!ENTITY context.image.label "Adblock Plus: φÏαγή εικόνας">
+<!ENTITY counthits.label "Κα&amp;ταμέτÏηση επιτυχιών φίλτÏων">
+<!ENTITY opensidebar.label "Άνοιγμ&amp;α των φιλτÏαÏισμένων στοιχείων">
+<!ENTITY notification.button.close "&amp;Κλείσιμο">
+<!ENTITY contribute.label "ΣυνεισφέÏετε στο Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: φÏαγή πλαισίου">
+<!ENTITY blocked.tooltip "Στοιχεία που έχουν φÏαχθεί σε αυτή τη σελίδα:">
+<!ENTITY hideplaceholders.label "ΑπόκÏυψη πλα&amp;ισίων των φιλτÏαÏισμένων στοιχείων">
+<!ENTITY showinstatusbar.label "Εμφάνιση στην γÏαμμή &amp;κατάστασης">
+<!ENTITY sidebar.title "Στοιχεία Ï€Ïος φιλτÏάÏισμα στην Ï„Ïέχουσα σελίδα">
+<!ENTITY options.label "Επι&amp;λογές">
+<!ENTITY context.object.label "Adblock Plus: φÏαγή αντικειμένου">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: ΕνεÏγοποίηση σ' αυτή την σελίδα">
+<!ENTITY filters.tooltip "ΦίλτÏα με τις πεÏισσότεÏες επιτυχίες:">
+<!ENTITY closesidebar.label "Κλείσιμο των φιλτÏ&amp;αÏισμένων στοιχείων">
+<!ENTITY showintoolbar.label "Εμφάνιση στην εÏγαλειο&amp;θήκη">
+<!ENTITY status.tooltip "Κατάσταση:">
+<!ENTITY context.media.label "Adblock Plus: φÏαγή ήχου/βίντεο">
+<!ENTITY subscription.update.label "ΕνημέÏωση φίλτÏων">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/sendReport.dtd
new file mode 100644
index 0000000..642b03a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Αναί&amp;Ïεση">
+<!ENTITY issues.disabledgroups.description "Οι ακόλουθες συνδÏομές φίλτÏων / ομάδες φίλτÏων είναι απενεÏγοποιημένες, παÏόλα αυτά μποÏεί να έχουν επίδÏαση σε αυτή την σελίδα:">
+<!ENTITY showData.label "Εμφάνιση δεδομένων αναφοÏάς">
+<!ENTITY typeSelector.falsePositive.label "Το Adblock Plus φÏάζει πάÏα πολλά &amp;στοιχεία">
+<!ENTITY issues.change.description "Οι Ïυθμίσεις σας έχουν αλλάξει. ΠαÏακαλώ ανανεώστε την σελίδα για να δοκιμάσετε τις αλλαγές και υποβάλλετε μια αναφοÏά αν το ζήτημα δεν έχει λυθεί από τις Ï„Ïοποποιήσεις.">
+<!ENTITY email.label "Email: (&amp;μ)">
+<!ENTITY issues.openPreferences.label "ΠÏοτιμήσεις φίλτÏων">
+<!ENTITY sendPage.confirmation "Η αναφοÏά σας έχει αποθηκευτεί. ΠÏόσβαση σε αυτήν έχετε από την ακόλουθη διεÏθυνση:">
+<!ENTITY copyLink.label "&amp;ΑντιγÏαφή διεÏθυνσης αναφοÏάς">
+<!ENTITY issues.nofilters.description "Το Adblock Plus δεν φιλτÏάÏει τίποτα στην Ï„Ïέχουσα σελίδα. Το ζήτημα το οποίο παÏατηÏείτε πιθανώς δεν σχετίζεται με το Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Το ζήτημα που αναφέÏατε είναι πιθανώς ήδη γνωστό. ΠεÏισσότεÏες πληÏοφοÏίες:">
+<!ENTITY typeSelector.other.description "Επιλέξτε αυτό αν υποπτεÏεστε κάποιο ζήτημα με το Adblock Plus το ίδιο, παÏά με τα φίλτÏα που χÏησιμοποιοÏνται.">
+<!ENTITY issues.disabledgroups.enable.label "ΕνεÏγοποίηση της συνδÏομής φίλτÏων / ομάδας φίλτÏων">
+<!ENTITY typeWarning.override.label "&amp;Κατανοώ και επιθυμώ να υποβάλω την αναφοÏά όπως και να έχει">
+<!ENTITY issues.disabled.enable.label "ΕνεÏγοποίηση του Adblock Plus">
+<!ENTITY update.fixed.description "Οι ενημεÏώσεις στις συνδÏομές φίλτÏων πιθανώς επιλÏουν το Ï€Ïόβλημα το οποίο αναφέÏετε. ΠαÏακαλώ ανανεώστε την σελίδα και Ï€Ïοσπαθήστε ξανά. Κάντε μια αναφοÏά αν το Ï€Ïόβλημα παÏαμένει.">
+<!ENTITY anonymous.label "&amp;Ανώνυμη υποβολή">
+<!ENTITY reloadButton.label "Α&amp;νανέωση σελίδας">
+<!ENTITY recentReports.clear.label "&amp;ΑφαίÏεση όλων των αναφοÏών">
+<!ENTITY typeSelector.description "Σε αυτό το παÏάθυÏο θα βÏείτε βοήθεια για τα βήματα που Ï€Ïέπει να ακολουθηθοÏν ώστε να υποβληθεί μια αναφοÏά για κάποιο ζήτημα που αντιμετωπίζετε σχετικά με το Adblock Plus. ΠαÏακαλώ Ï€Ïώτα επιλέξτε τον Ï„Ïπο του ζητήματος που αντιμετωπίζετε σε αυτή την σελίδα:">
+<!ENTITY screenshot.remove.label "ΑφαίÏεση ευαίσθητων &amp;δεδομένων">
+<!ENTITY issues.ownfilters.description "ΜεÏικά από τα φίλτÏα έχουν οÏιστεί από εσάς. ΠαÏακαλώ απενεÏγοποιήστε τα φίλτÏα που πιθανώς έχουν Ï€Ïοκαλέσει το ζήτημα:">
+<!ENTITY update.inProgress.description "Το Adblock Plus θα Ï€Ïέπει να ενημεÏώσει τις συνδÏομές φίλτÏων ώστε να βεβαιωθεί ότι το Ï€Ïόβλημα δεν έχει ήδη επιλυθεί. ΠαÏακαλώ πεÏιμένετε...">
+<!ENTITY sendPage.retry.label "Αποστολή ξανά">
+<!ENTITY data.label "Δεδομένα ανα&amp;φοÏάς">
+<!ENTITY recentReports.label "Οι αναφοÏές που υποβάλλατε Ï€Ïόσφατα">
+<!ENTITY typeWarning.description "Δηλώσατε πως θέλετε να αναφέÏετε ένα γενικό ζήτημα σχετικά με το Adblock Plus παÏά ένα Ï€Ïόβλημα με τα φίλτÏα. ΠαÏακαλώ έχετε στο νου σας ότι τέτοιου είδους ζητήματα ταιÏιάζουν καλÏτεÏα στο [link]forum του Adblock Plus[/link]. Θα Ï€Ïέπει να χÏησιμοποιείτε την αναφοÏά ζητήματος επιπÏόσθετα μιας υπάÏχουσας συζήτησης στο forum, καθώς κανένας δεν θα Ï€Ïοσέξει την αναφοÏά σας εκτός αν πεÏιέχει δεσμό Ï€Ïος την συζήτηση. Ο αυτόματα δημιουÏγημένος δεσμός θα εμφανιστεί μετά την υποβολή της αναφοÏάς.">
+<!ENTITY issues.disabled.description "Το Adblock Plus είναι απενεÏγοποιημένο, δεν θα φιλτÏάÏει τίποτα στην παÏοÏσα κατάσταση.">
+<!ENTITY attachExtensions.label "ΕπισÏναψε την &amp;λίστα με τα ενεÏγά Ï€Ïόσθετα στην αναφοÏά, σε πεÏίπτωση που κάποια ασυμβατότητα Î¼ÎµÏ„Î±Î¾Ï Î±Ï…Ï„ÏŽÎ½ είναι το Ï€Ïόβλημα">
+<!ENTITY issues.nosubscriptions.add.label "ΠÏοσθήκη συνδÏομής φίλτÏων">
+<!ENTITY issues.disabledfilters.enable.label "ΕνεÏγοποίηση φίλτÏου">
+<!ENTITY issues.override.label "Οι Ïυθμί&amp;σεις είναι σωστές, συνεχίστε με την αναφοÏά">
+<!ENTITY issues.nosubscriptions.description "Φαίνεται πως δεν είστε συνδÏομητής σε καμιά από τις Ï€Ïοεγκατεστημένες λίστες φίλτÏων που αυτόματα αφαιÏοÏν ανεπιθÏμητο πεÏιεχόμενο από τις σελίδες.">
+<!ENTITY typeSelector.falsePositive.description "Επιλέξτε αυτό, αν η σελίδα στεÏείται βασικό πεÏιεχόμενο, εμφανίζεται λαθεμένα ή δεν λειτουÏγεί σωστά. Για να διαγνώσετε αν το Adblock Plus είναι η αιτία του Ï€Ïοβλήματός σας, απενεÏγοποιήστε το Ï€ÏοσωÏινά.">
+<!ENTITY typeSelector.other.label "Ά&amp;λλο ζήτημα">
+<!ENTITY emailComment.label "Σας συνιστοÏμε να εισάγετε μια έγκυÏη διεÏθυνση ηλεκτÏÎ¿Î½Î¹ÎºÎ¿Ï Ï„Î±Ï‡Ï…Î´Ïομείου, ώστε να επικοινωνήσουμε μαζί σας εάν υπάÏχουν εÏωτήσεις σχετικά με την αναφοÏά σας. Θα μας επιτÏέψει επίσης, να αναγνωÏίζουμε τις συνεισφοÏές σας και να τις δώσουμε υψηλότεÏη Ï€ÏοτεÏαιότητα.">
+<!ENTITY issues.whitelist.remove.label "ΕνεÏγοποίηση του Adblock Plus σε αυτή την σελίδα">
+<!ENTITY outdatedSubscriptions.description "Οι ακόλουθες συνδÏομές φίλτÏων δεν έχουν ενημεÏωθεί για δÏο τουλάχιστο εβδομάδες. ΠαÏακαλώ ενημεÏώστε αυτές τις συνδÏομές Ï€Ïιν υποβάλετε την αναφοÏά, μιας και το ζήτημα μποÏεί ήδη να έχει επιλυθεί.">
+<!ENTITY dataCollector.description "ΠαÏακαλώ πεÏιμένετε καθώς το Adblock Plus συλλέγει τα απαÏαίτητα δεδομένα.">
+<!ENTITY sendButton.label "Απο&amp;στολή αναφοÏάς">
+<!ENTITY comment.label "Σ&amp;χόλιο (Ï€ÏοαιÏετικό):">
+<!ENTITY sendPage.errorMessage "Η Ï€Ïοσπάθεια αποστολής της αναφοÏάς απέτυχε με κωδικό λάθους &quot;?1?&quot;. ΠαÏακαλώ βεβαιωθείτε ότι έχετε Ï€Ïόσβαση στο ίντεÏνετ και Ï€Ïοσπαθήστε ξανά. Εάν το Ï€Ïόβλημα παÏαμείνει, παÏακαλώ ζητήστε βοήθεια στο [link]forum του Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Εμφάνιση Ï€Ïόσφατα υποβληθέντων αναφοÏών">
+<!ENTITY commentPage.heading "Εισαγωγή σχολίου">
+<!ENTITY update.start.label "Ξεκινήστε την ενημέÏωση">
+<!ENTITY issues.disabledfilters.description "Τα ακόλουθα φίλτÏα είναι απενεÏοποιημένα, παÏόλα αυτά μποÏεί να έχουν επίδÏαση σε αυτή την σελίδα:">
+<!ENTITY screenshot.description "Η ίδια σελίδα μποÏεί να εμφανίζεται διαφοÏετικά για διαφοÏετικοÏÏ‚ χÏήστες. Εάν επισυνάψετε ένα στιγμιότυπο οθόνης στην αναφοÏά σας μποÏεί να μας βοηθήσει να κατανοήσουμε το Ï€Ïόβλημα. ΜποÏείτε να αφαιÏέσετε τμήματα τα οποία πεÏιέχουν ευαίσθητες πληÏοφοÏίες όπως και να επισημάνετε πεÏιοχές στις οποίες εντοπίζεται το Ï€Ïόβλημα. Για να το πετÏχετε, επιλέξτε το αντίστοιχο κουμπί και επιλέξτε ένα τμήμα του στιγμιότυπου με το ποντίκι.">
+<!ENTITY screenshot.attach.label "ΕπισÏναψη στιγμιότυπου ο&amp;θόνης στην αναφοÏά">
+<!ENTITY issues.whitelist.description "Το Adblock Plus είναι απενεÏγοποιημένο στην σελίδα που αναφέÏετε. ΠαÏακαλώ ενεÏγοποιήστε το και ανανεώστε την σελίδα Ï€Ïιν υποβάλλετε την αναφοÏά.">
+<!ENTITY typeSelector.falseNegative.label "Το Adblock Plus δεν &amp;φÏάζει μια διαφήμιση">
+<!ENTITY typeSelector.heading "ΤÏπος ζητήματος">
+<!ENTITY anonymity.warning "Δεν θα μποÏέσουμε να επικοινωνήσουμε μαζί σας και πιθανώς η αναφοÏά σας να θεωÏηθεί χαμηλής Ï€ÏοτεÏαιότητας.">
+<!ENTITY wizard.title "ΑναφοÏά ζητήματος">
+<!ENTITY issues.ownfilters.disable.label "ΑπενεÏγοποίηση φίλτÏου">
+<!ENTITY commentPage.description "Το πεδίο κειμένου παÏακάτω σας επιτÏέπει να εισάγετε κάποιο σχόλιο το οποίο θα μας βοηθήσει να κατανοήσουμε το ζήτημα που αντιμετωπίζετε. Το παÏόν βήμα είναι Ï€ÏοαιÏετικό αλλά Ï€Ïοτείνεται να συμπληÏωθεί αν το Ï€Ïόβλημα δεν είναι Ï€Ïοφανές. ΜποÏείτε να αναθεωÏήσετε την αναφοÏά Ï€Ïιν την αποστείλετε.">
+<!ENTITY comment.lengthWarning "Το μέγεθος του σχολίου υπεÏβαίνει τους 1000 χαÏακτήÏες. Μόνο οι Ï€Ïώτοι 1000 θα αποσταλοÏν.">
+<!ENTITY typeSelector.falseNegative.description "Επιλέξτε αυτό αν μια διαφήμιση εμφανίζεται παÏόλο που το Adblock Plus είναι ενεÏγοποιημένο.">
+<!ENTITY sendPage.waitMessage "ΠαÏακαλώ πεÏιμένετε καθώς το Adblock Plus υποβάλει την αναφοÏά.">
+<!ENTITY dataCollector.heading "Καλώς ήÏθατε στον βοηθό αναφοÏάς ζητήματος">
+<!ENTITY screenshot.heading "Στιγμιότυπο οθόνης">
+<!ENTITY sendPage.heading "Αποστολή αναφοÏάς">
+<!ENTITY issues.subscriptionCount.description "Φαίνεται ότι είστε συνδÏομητής σε πάÏα πολλές λίστες φίλτÏων. Αυτή η επιλογή δεν συνιστάται. Δεν μποÏοÏμε να δεχτοÏμε την αναφοÏά Ï€Ïοβλήματος διότι δεν είναι σαφές ποιος από τους συγγÏαφείς των φίλτÏων Ï€Ïέπει να Ï€Ïοβεί σε κάποια ενέÏγεια ώστε να διοÏθοθεί αυτό. ΠαÏακαλώ αφαιÏέστε όλες εκτός από τις απαÏαίτητες λίστες φίλτÏων, και δοκιμάστε πάλι για να εξακÏιβώσετε αν το Ï€Ïόβλημα συνεχιστεί.">
+<!ENTITY screenshot.mark.label "Επισή&amp;μανση του Ï€Ïοβλήματος">
+<!ENTITY privacyPolicy.label "Πολιτική αποÏÏήτου">
+<!ENTITY issues.description "Εντοπίστηκαν κάποια ζητήματα στις Ïυθμίσεις σας που πιθανώς να είναι υπεÏθυνες για αυτό το ζήτημα, ή που θα δυσκολέψουν την έÏευνα της αναφοÏάς.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/sidebar.dtd
new file mode 100644
index 0000000..76fe125
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Πλαίσιο στοιχείου Flash">
+<!ENTITY address.label "ΔιεÏθυνση">
+<!ENTITY context.open.label "Άνοιγμα σε νέα καÏτέλα">
+<!ENTITY type.label "ΤÏπος">
+<!ENTITY tooltip.filterSource.label "Πηγή φίλτÏου:">
+<!ENTITY noitems.label "Δεν υπάÏχουν στοιχεία Ï€Ïος φιλτÏάÏισμα">
+<!ENTITY filter.label "ΦίλτÏο">
+<!ENTITY tooltip.size.label "Μέγεθος:">
+<!ENTITY reattach.label "ΠÏοσάÏτηση">
+<!ENTITY search.label "Ανα&amp;ζήτηση:">
+<!ENTITY docDomain.thirdParty "(Ï„Ïίτων)">
+<!ENTITY filterSource.label "Πηγή φίλτÏου">
+<!ENTITY tooltip.docDomain.label "Πηγή εγγÏάφου:">
+<!ENTITY context.copy.label "ΑντιγÏαφή τοποθεσίας του στοιχείου">
+<!ENTITY tooltip.type.label "ΤÏπος:">
+<!ENTITY context.disablefilter.label "ΑπενεÏγοποίηση φίλτÏου ?1?">
+<!ENTITY context.copyFilter.label "ΑντιγÏαφή φίλτÏου">
+<!ENTITY context.block.label "ΦÏαγή του στοιχείου">
+<!ENTITY context.enablefilter.label "ΕνεÏγοποίηση φίλτÏου ?1?">
+<!ENTITY detach.label "Αποκόλληση">
+<!ENTITY whitelisted.label "Η σελίδα ανήκει στην άσπÏη λίστα">
+<!ENTITY context.disablefilteronsite.label "ΑπενεÏγοποίηση του φίλτÏου στο ?1?">
+<!ENTITY detached.title "Adblock Plus: Στοιχεία Ï€Ïος φÏαγή">
+<!ENTITY docDomain.firstParty "(Ï€ÏωτεÏον)">
+<!ENTITY tooltip.type.whitelisted "(στην άσπÏη λίστα)">
+<!ENTITY tooltip.filter.label "ΦίλτÏο εν δÏάση:">
+<!ENTITY tooltip.filter.disabled "(απενεÏγοποιημένο)">
+<!ENTITY context.editfilter.label "ΕπεξεÏγασία του φίλτÏου εν δÏάση">
+<!ENTITY tooltip.type.blocked "(φιλτÏαÏισμένο)">
+<!ENTITY size.label "Μέγεθος">
+<!ENTITY context.whitelist.label "ΠÏοσθήκη κανόνα εξαίÏεσης για το στοιχείο">
+<!ENTITY context.selectAll.label "Επιλογή όλων">
+<!ENTITY state.label "Κατάσταση">
+<!ENTITY docDomain.label "Πηγή εγγÏάφου">
+<!ENTITY tooltip.address.label "ΔιεÏθυνση:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/subscriptionSelection.dtd
new file mode 100644
index 0000000..054b6e9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/el/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "ΠÏοσ&amp;θήκη και της συνδÏομής φίλτÏων &quot;?1?&quot;">
+<!ENTITY list.download.failed "Το Adblock Plus απέτυχε να λάβει την λίστα με τις συνδÏομές.">
+<!ENTITY list.download.retry "ΠÏοσπαθήστε ξανά">
+<!ENTITY title.label "Τίτλος &amp;συνδÏομής:">
+<!ENTITY list.download.website "ΠÏοβολή της ιστοσελίδας">
+<!ENTITY supplementMessage "Αυτή η συνδÏομή φίλτÏων μποÏεί να χÏησιμοποιηθεί μαζί με την συνδÏομή &quot;?1?&quot; την οποία δεν χÏησιμοποιείτε.">
+<!ENTITY viewList.label "ΠÏοβολή φίλτÏων">
+<!ENTITY visitHomepage.label "Ιστοσελίδα της συνδÏομής">
+<!ENTITY addSubscription.label "ΠÏοσθήκη συνδÏομής">
+<!ENTITY dialog.title "ΣυνδÏομές φίλτÏων του Adblock Plus">
+<!ENTITY location.label "&amp;Τοποθεσία λίστας φίλτÏων:">
+<!ENTITY fromWeb.description "ΠαÏακαλώ επιβεβαιώστε ότι θέλετε να Ï€Ïοσθέσετε αυτή την λίστα φίλτÏων. ΜποÏείτε να Ï„Ïοποποιήσετε τον τίτλο ή την τοποθεσία Ï€Ïιν την Ï€Ïοσθήκη.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/composer.dtd
new file mode 100644
index 0000000..00d84ba
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "at the end of the address">
+<!ENTITY domainRestriction.label "Restrict to domain:">
+<!ENTITY collapse.default.no.label "Use default (no)">
+<!ENTITY firstParty.label "First-party only">
+<!ENTITY preferences.label "Show existing filters...">
+<!ENTITY pattern.label "Look for pattern">
+<!ENTITY thirdParty.label "Third-party only">
+<!ENTITY filter.label "New filter:">
+<!ENTITY collapse.label "Collapse blocked:">
+<!ENTITY match.warning "The pattern you entered no longer matches the address to be blocked/whitelisted and will have no effect on it.">
+<!ENTITY anchor.start.label "at the beginning of the address">
+<!ENTITY matchCase.label "Match case">
+<!ENTITY custom.pattern.label "Custom:">
+<!ENTITY unselectAllTypes.label "Select none">
+<!ENTITY type.whitelist.label "Exception rule">
+<!ENTITY regexp.warning "The pattern you entered will be interpreted as a regular expression; this cannot be efficiently processed by Adblock Plus and may slow down your browsing experience. If you didn't intend to use a regular expression, add an asterisk (*) to the end of the pattern.">
+<!ENTITY dialog.title "Add Adblock Plus filter rule">
+<!ENTITY basic.label "Basic view">
+<!ENTITY type.filter.label "Blocking filter">
+<!ENTITY types.label "Apply to types:">
+<!ENTITY shortpattern.warning "The pattern you entered is too short to be optimised; this may slow down your browsing experience. It is recommended that you choose a longer string for this filter to allow Adblock Plus to process the filter more efficiently.">
+<!ENTITY collapse.yes.label "Yes">
+<!ENTITY anchors.label "Accept pattern only:">
+<!ENTITY collapse.default.yes.label "Use default (yes)">
+<!ENTITY domainRestriction.help "Use this option to specify one or more domains separated by a bar line (|). The filter will only be applied on the domain(s) selected. A tilde (~) before a domain name indicates that the filter will not be applied on that domain.">
+<!ENTITY accept.label "Add filter">
+<!ENTITY options.label "Options">
+<!ENTITY disabled.warning "Adblock Plus is currently disabled. You can still add filters but they will not be applied unless you [link]enable Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "at the beginning of the domain name">
+<!ENTITY collapse.no.label "No">
+<!ENTITY selectAllTypes.label "Select all">
+<!ENTITY advanced.label "Advanced view">
+<!ENTITY pattern.explanation "The pattern can be any part of the address; asterisks (*) act as wildcards. The filter will only be applied to addresses matching the pattern provided.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/filters.dtd
new file mode 100644
index 0000000..fa14794
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "All your custom filters will be replaced by the contents of the selected file. Do you want to proceeed?">
+<!ENTITY slow.column "Slow filters">
+<!ENTITY enabled.column "Enabled">
+<!ENTITY subscription.lastDownload.checksumMismatch "Failed: checksum mismatch">
+<!ENTITY noFiltersInGroup.text "The selected group is empty">
+<!ENTITY subscription.actions.label "Actions">
+<!ENTITY filter.selectAll.label "Select All">
+<!ENTITY backupButton.label "Backup and Restore">
+<!ENTITY restore.minVersion.warning "Warning: the file has been created with a newer Adblock Plus version. You should update to the latest Adblock Plus version before restoring from this file.">
+<!ENTITY restore.error "The file's data could not be processed, maybe this isn't an Adblock Plus backup file?">
+<!ENTITY sort.ascending.label "A &gt; Z sort order">
+<!ENTITY sort.label "Sort by">
+<!ENTITY subscription.source.label "Filter list">
+<!ENTITY hitcount.column "Hits">
+<!ENTITY noFilters.text "You don't have any custom filters yet.">
+<!ENTITY backup.custom.title "Custom filters only">
+<!ENTITY subscription.external.label "Updated by another extension">
+<!ENTITY subscription.delete.label "Delete">
+<!ENTITY noGroupSelected.text "You need to select a filter group before its filters can be displayed.">
+<!ENTITY filter.cut.label "Cut">
+<!ENTITY restore.default.label "Restore backup from ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Downloading...">
+<!ENTITY subscriptions.tab.label "Filter subscriptions">
+<!ENTITY sort.descending.label "Z &gt; A sort order">
+<!ENTITY filters.remove.warning "Do you really want to remove all selected filters?">
+<!ENTITY filter.delete.label "Delete">
+<!ENTITY addSubscriptionAdd.label "Add">
+<!ENTITY viewMenu.label "View">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY addSubscriptionCancel.label "Cancel">
+<!ENTITY subscription.enabled.label "Enabled">
+<!ENTITY noSubscriptions.text "You haven't added any filter subscriptions yet. Adblock Plus won't block
+ anything without filters, please use &quot;Add filter subscription&quot; to
+ add some.">
+<!ENTITY subscription.update.label "Update filters">
+<!ENTITY dialog.title "Adblock Plus Filter Preferences">
+<!ENTITY addFilter.label "Add filter">
+<!ENTITY subscription.minVersion.warning "This filter subscription requires a newer Adblock Plus version; you should update to the latest Adblock Plus version.">
+<!ENTITY subscription.lastDownload.invalidURL "Failed: not a valid address">
+<!ENTITY backup.error "There was an error writing filters to the file. Make sure that the file isn't write protected or in use by another application.">
+<!ENTITY filter.moveUp.label "Move up">
+<!ENTITY addGroup.label "Add filter group">
+<!ENTITY filter.edit.label "Edit">
+<!ENTITY subscription.showHideFilters.label "Show/hide filters">
+<!ENTITY acceptableAds2.label "Allow some non-intrusive advertising">
+<!ENTITY addSubscriptionOther.label "Add a different subscription">
+<!ENTITY close.label "Close">
+<!ENTITY sort.none.label "Unsorted">
+<!ENTITY filter.actions.label "Filter actions">
+<!ENTITY filter.copy.label "Copy">
+<!ENTITY filter.moveDown.label "Move down">
+<!ENTITY filter.resetHitCounts.label "Reset hit statistics">
+<!ENTITY readMore.label "Read more">
+<!ENTITY subscription.moveUp.label "Move up">
+<!ENTITY addSubscription.label "Add filter subscription">
+<!ENTITY subscription.homepage.label "Homepage">
+<!ENTITY backup.complete.title "All filters and subscriptions">
+<!ENTITY restore.own.label "Restore own backup">
+<!ENTITY restore.complete.warning "All your filter preferences will be replaced by the contents of the selected file. Do you want to proceeed?">
+<!ENTITY filters.tab.label "Custom filters">
+<!ENTITY backup.label "Create new backup">
+<!ENTITY find.label "Find">
+<!ENTITY subscription.moveDown.label "Move down">
+<!ENTITY subscription.lastDownload.connectionError "Failed: download failure">
+<!ENTITY subscription.lastDownload.success "Success">
+<!ENTITY subscription.lastDownload.invalidData "Failed: not a valid filters list">
+<!ENTITY filter.paste.label "Paste">
+<!ENTITY subscription.disabledFilters.enable "Enable disabled filters">
+<!ENTITY lasthit.column "Last hit">
+<!ENTITY subscription.editTitle.label "Edit title">
+<!ENTITY subscription.disabledFilters.warning "Some filters in this subscription are disabled.">
+<!ENTITY filter.column "Filter rule">
+<!ENTITY subscription.lastDownload.label "Last download:">
+<!ENTITY viewList.label "View list">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/firstRun.properties
new file mode 100644
index 0000000..971a702
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Browse privately by disabling tracking - hiding your tracks from ad companies that would track your every move.
+firstRun_toggle_off=OFF
+firstRun_feature_tracking=Disable Tracking
+firstRun_feature_malware=Malware Blocking
+firstRun_title=Adblock Plus has been installed
+firstRun_acceptableAdsExplanation=We'd like to encourage websites to use straightforward, unobtrusive advertising. That's why we've established <a>strict guidelines</a> to identify positive ads, which are shown under default settings. If you still wish to block every ad you can <a>disable</a> this in a few seconds.
+firstRun_toggle_on=ON
+firstRun_contributor_credits=Contributor Credits
+firstRun_dataCorruptionWarning=Does this page keep showing up? <a>Click here!</a>
+firstRun_acceptableAdsHeadline=Annoying ads will now be blocked.
+firstRun_share=Tell your friends
+firstRun_share_headline=<a>Help us</a> in making the web a better place
+firstRun_features=Adblock Plus can do more than block ads
+firstRun_feature_malware_description=Make your browsing more secure by blocking known malware domains.
+firstRun_feature_social_description=Automatically rid your browsing experience of social media buttons (such as the Facebook Like) which appear on web pages and track your behaviour.
+firstRun_donate=Donate
+firstRun_donate_label=Support our project
+firstRun_feature_social=Remove Social Media Buttons
+firstRun_legacySafariWarning=You are using an old version of Safari which is not supported by Adblock Plus. It might not work correctly or impair the user experience on some websites. We strongly recommend to either update to Safari 6.1.1 or higher (on OS X 10.8 Mountain Lion), or Safari 7.0.1 or higher (on OS X 10.9 Mavericks), or to use the latest version of Mozilla Firefox, Google Chrome or Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/global.properties
new file mode 100644
index 0000000..6d3b8c6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=No blockable items on the current page
+action3_tooltip=Click to enable/disable Adblock Plus.
+notification_antiadblock_title=Hide targeted messages?
+type_label_script=script
+filter_elemhide_nocriteria=No criteria specified to recognise the element to be hidden
+blockingGroup_title=Ad Blocking Rules
+whitelisted_tooltip=Adblock Plus is active but disabled on current page.
+type_label_stylesheet=stylesheet
+blocked_count_tooltip=?1? out of ?2?
+type_label_font=font
+type_label_popup=popup window
+filter_regexp_tooltip=This filter is either a regular expression or too short to be optimised. Too many of these filters might slow down your browsing.
+action0_tooltip=Click to bring up context menu; middle-click to enable/disable.
+whitelisted_page=Adblock Plus has been disabled for the current page
+remove_group_warning=Do you really want to remove this group?
+action1_tooltip=Click to open/close blockable items; middle-click to enable/disable.
+type_label_xmlhttprequest=XML request
+active_tooltip=Adblock Plus is enabled, ?1? filter subscription(s) and ?2? custom filter(s) in use.
+type_label_document=document
+type_label_object_subrequest=object sub-request
+whitelistGroup_title=Exception Rules
+disabled_tooltip=Adblock Plus is disabled.
+filter_elemhide_duplicate_id=Only one ID of the element to be hidden can be specified
+type_label_object=object
+action2_tooltip=Click to open preferences; middle-click to enable/disable.
+type_label_subdocument=frame
+clearStats_warning=This will reset all filter hit statistics and disable counting filter hits. Do you want to proceed?
+notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages?
+blocked_count_addendum=(also whitelisted: ?1?, hidden: ?2?)
+subscription_invalid_location=Filter list location is neither a valid URL nor a valid file name.
+type_label_image=image
+remove_subscription_warning=Do you really want to remove this subscription?
+type_label_other=other
+mobile_menu_enable=ABP: Enable
+type_label_media=audio/video
+mobile_menu_disable_site=ABP: Disable on ?1?
+elemhideGroup_title=Element Hiding Rules
+mobile_menu_enable_site=ABP: Enable on ?1?
+type_label_elemhide=hidden
+newGroup_title=New filter group
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/overlay.dtd
new file mode 100644
index 0000000..f916e9a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "Yes">
+<!ENTITY notification.button.no "No">
+<!ENTITY sync.label "Syn&amp;chronise Adblock Plus settings">
+<!ENTITY whitelist.site.label "Disable on ?1?">
+<!ENTITY filters.label "Filter preferences">
+<!ENTITY disable.label "Disable everywhere">
+<!ENTITY objecttab.title "Block">
+<!ENTITY objecttab.tooltip "Block this object with Adblock Plus">
+<!ENTITY menuitem.label "Adblock Plus Preferences">
+<!ENTITY objecttabs.label "Show tabs on Flash and Java">
+<!ENTITY sendReport.label "Report issue on this page">
+<!ENTITY whitelist.page.label "Disable on this page only">
+<!ENTITY context.image.label "Adblock Plus: Block image">
+<!ENTITY counthits.label "Count filter hits">
+<!ENTITY opensidebar.label "Open blockable items">
+<!ENTITY notification.button.close "Close">
+<!ENTITY contribute.label "Contribute to Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Block frame">
+<!ENTITY blocked.tooltip "Blocked items on this page:">
+<!ENTITY hideplaceholders.label "Hide placeholders of blocked elements">
+<!ENTITY showinstatusbar.label "Show in status bar">
+<!ENTITY sidebar.title "Blockable items on current page">
+<!ENTITY options.label "Options">
+<!ENTITY context.object.label "Adblock Plus: Block object">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Re-enable on this page">
+<!ENTITY filters.tooltip "Most active filters:">
+<!ENTITY closesidebar.label "Close blockable items">
+<!ENTITY showintoolbar.label "Show in toolbar">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Block audio/video">
+<!ENTITY subscription.update.label "Update filters">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/sendReport.dtd
new file mode 100644
index 0000000..1dec6f7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/sendReport.dtd
@@ -0,0 +1,71 @@
+<!ENTITY screenshot.undo.label "Undo">
+<!ENTITY issues.disabledgroups.description "The following filter subscriptions / filter groups are disabled, yet they might have an effect on this page:">
+<!ENTITY showData.label "Show report data">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus is blocking too much">
+<!ENTITY issues.change.description "Your configuration has been changed. Please reload the page to test the changes and submit a report if the issue hasn't been resolved by the alterations.">
+<!ENTITY email.label "Email:">
+<!ENTITY issues.openPreferences.label "Open filter preferences">
+<!ENTITY sendPage.confirmation "Your report has been saved. You can access it at the following address:">
+<!ENTITY copyLink.label "Copy report link">
+<!ENTITY issues.nofilters.description "Adblock Plus isn't blocking anything on the current page. The issue you are observing is probably unrelated to Adblock Plus.">
+<!ENTITY sendPage.knownIssue "The issue you reported is probably already known. More information:">
+<!ENTITY typeSelector.other.description "Select this option if you suspect an issue with Adblock Plus itself rather than its filters.">
+<!ENTITY issues.disabledgroups.enable.label "Enable filter subscription / filter group">
+<!ENTITY typeWarning.override.label "I understand and want to submit the report anyway">
+<!ENTITY issues.disabled.enable.label "Enable Adblock Plus">
+<!ENTITY update.fixed.description "The updates to your filter subscriptions likely resolved the issue that you
+ were reporting. Please reload the page and retry, hit Report again if the
+ problem remains.">
+<!ENTITY anonymous.label "Anonymous submission">
+<!ENTITY reloadButton.label "Reload page">
+<!ENTITY recentReports.clear.label "Remove all reports">
+<!ENTITY typeSelector.description "This window will guide you through the steps required for the submission of an Adblock Plus issue report. First, please select the type of issue that you are experiencing on this page:">
+<!ENTITY screenshot.remove.label "Remove sensitive data">
+<!ENTITY issues.ownfilters.description "Some of the filters applied on this page are user-defined. Please disable the filters that might have caused the issue:">
+<!ENTITY update.inProgress.description "Adblock Plus needs to update your filter subscriptions to make sure that the
+ issue hasn't been resolved already. Please wait...">
+<!ENTITY sendPage.retry.label "Send again">
+<!ENTITY data.label "Report data:">
+<!ENTITY recentReports.label "Your recently submitted reports">
+<!ENTITY typeWarning.description "You have indicated that you want to report a general issue with Adblock Plus rather than a problem with the filters. Please note that such issues are best reported in the [link]Adblock Plus forum[/link]. You should only use the issue reporter to supplement an existing discussion, as nobody will notice your report unless you provide them with the link to it. The automatically generated link will be provided after submitting the report.">
+<!ENTITY issues.disabled.description "Adblock Plus is disabled, it will not block anything in its current state.">
+<!ENTITY attachExtensions.label "Attach a list of active extensions to the report in case add-on conflict is the cause of the problem">
+<!ENTITY issues.nosubscriptions.add.label "Add filter subscription">
+<!ENTITY issues.disabledfilters.enable.label "Enable filter">
+<!ENTITY issues.override.label "The configuration is correct, continue with the report">
+<!ENTITY issues.nosubscriptions.description "You do not appear to be subscribed to any of the pre-made filter lists that automatically remove unwanted content from websites.">
+<!ENTITY typeSelector.falsePositive.description "Select this option if the page lacks important content, displays incorrectly or fails to function properly. You can determine whether Adblock Plus is the cause of the problem by disabling it temporarily.">
+<!ENTITY typeSelector.other.label "Other issue">
+<!ENTITY emailComment.label "We encourage you to enter a valid email address so that we can contact you if there are questions
+ about your report. It will also allow us to recognize your contributions and to prioritize them higher.">
+<!ENTITY issues.whitelist.remove.label "Re-enable Adblock Plus on this page">
+<!ENTITY outdatedSubscriptions.description "The following filter subscriptions haven't been updated for at least two
+ weeks. Please update these subscriptions before submitting a report, the
+ issue might be resolved already.">
+<!ENTITY dataCollector.description "Please wait a few moments while Adblock Plus gathers the required data.">
+<!ENTITY sendButton.label "Send report">
+<!ENTITY comment.label "Comment (optional):">
+<!ENTITY sendPage.errorMessage "An attempt to send the report failed with error code &quot;?1?&quot;. Please ensure you are connected to the Internet and retry. If the problem persists please request assistance in the [link]Adblock Plus forum[/link].">
+<!ENTITY showRecentReports.label "Show recently submitted reports">
+<!ENTITY commentPage.heading "Enter comment">
+<!ENTITY update.start.label "Start update now">
+<!ENTITY issues.disabledfilters.description "The following filters are disabled, yet they might have an effect on this page:">
+<!ENTITY screenshot.description "The same page can look different for different people. It may help us to understand the problem if you attach a screenshot to your report. You can remove sections containing sensitive information as well as mark areas where the problem is noticeable. To do that click the corresponding button and select a section of the image with your mouse.">
+<!ENTITY screenshot.attach.label "Attach a page image to the report">
+<!ENTITY issues.whitelist.description "Adblock Plus is currently disabled on the page you are reporting. Please re-enable it and reload the page before submitting the report to assist the investigation of this issue.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus doesn't block an advertisement">
+<!ENTITY typeSelector.heading "Select issue type">
+<!ENTITY anonymity.warning "We won't be able to come back to you and will likely prioritize the report lower.">
+<!ENTITY wizard.title "Issue reporter">
+<!ENTITY issues.ownfilters.disable.label "Disable filter">
+<!ENTITY commentPage.description "The text field below allows you to enter a comment to help us understand the issue. This step is optional but recommended if the problem isn't obvious. You can also review the report data before it is sent.">
+<!ENTITY comment.lengthWarning "The length of your comment exceeds 1000 characters. Only the first 1000 characters will be sent.">
+<!ENTITY typeSelector.falseNegative.description "Select this option if an advertisement is displayed despite Adblock Plus being enabled.">
+<!ENTITY sendPage.waitMessage "Please wait while Adblock Plus is submitting your report.">
+<!ENTITY dataCollector.heading "Welcome to the issue reporter">
+<!ENTITY screenshot.heading "Attach screenshot">
+<!ENTITY sendPage.heading "Send report">
+<!ENTITY issues.subscriptionCount.description "It seems that you are subscribed to too many filter subscriptions. This setup is not recommended because it will make the likeliness of issues much higher. We also cannot accept your issue report because it is unclear which filter subscription author needs to take action. Please remove all but the really necessary filter subscriptions and test whether the issue still occurs then.">
+<!ENTITY screenshot.mark.label "Mark the problem">
+<!ENTITY privacyPolicy.label "Privacy policy">
+<!ENTITY issues.description "Adblock Plus has detected issues with your configuration that might be responsible for this issue or will make investigating the report difficult.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/sidebar.dtd
new file mode 100644
index 0000000..32cb7e1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Flash item's borders">
+<!ENTITY address.label "Address">
+<!ENTITY context.open.label "Open in New Tab">
+<!ENTITY type.label "Type">
+<!ENTITY tooltip.filterSource.label "Filter source:">
+<!ENTITY noitems.label "No blockable items">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Size">
+<!ENTITY reattach.label "Reattach">
+<!ENTITY search.label "Search:">
+<!ENTITY docDomain.thirdParty "(third party)">
+<!ENTITY filterSource.label "Filter source">
+<!ENTITY tooltip.docDomain.label "Document source:">
+<!ENTITY context.copy.label "Copy item's address">
+<!ENTITY tooltip.type.label "Type:">
+<!ENTITY context.disablefilter.label "Disable filter ?1?">
+<!ENTITY context.copyFilter.label "Copy filter">
+<!ENTITY context.block.label "Block this item">
+<!ENTITY context.enablefilter.label "Re-enable filter ?1?">
+<!ENTITY detach.label "Detach">
+<!ENTITY whitelisted.label "Whitelisted page">
+<!ENTITY context.disablefilteronsite.label "Disable this filter on ?1?">
+<!ENTITY detached.title "Adblock Plus: Blockable items (detached)">
+<!ENTITY docDomain.firstParty "(first party)">
+<!ENTITY tooltip.type.whitelisted "(whitelisted)">
+<!ENTITY tooltip.filter.label "Filter in effect:">
+<!ENTITY tooltip.filter.disabled "(disabled)">
+<!ENTITY context.editfilter.label "Edit filter in effect">
+<!ENTITY tooltip.type.blocked "(blocked)">
+<!ENTITY size.label "Size">
+<!ENTITY context.whitelist.label "Add exception rule for item">
+<!ENTITY context.selectAll.label "Select all">
+<!ENTITY state.label "State">
+<!ENTITY docDomain.label "Document source">
+<!ENTITY tooltip.address.label "Address:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/subscriptionSelection.dtd
new file mode 100644
index 0000000..10ba808
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-GB/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Add filter subscription &quot;?1?&quot; as well">
+<!ENTITY list.download.failed "Adblock Plus failed to retrieve the list of subscriptions.">
+<!ENTITY list.download.retry "Try again">
+<!ENTITY title.label "Subscription title:">
+<!ENTITY list.download.website "View website">
+<!ENTITY supplementMessage "This filter subscription is meant to be used with the filter subscription &quot;?1?&quot; which you are not using yet.">
+<!ENTITY viewList.label "View filters">
+<!ENTITY visitHomepage.label "Visit home page">
+<!ENTITY addSubscription.label "Add subscription">
+<!ENTITY dialog.title "Add Adblock Plus filter subscription">
+<!ENTITY location.label "Filter list location:">
+<!ENTITY fromWeb.description "Please confirm that you want to add this filter subscription. You can change the subscription title or location before adding it.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/composer.dtd
new file mode 100644
index 0000000..bba41e3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/composer.dtd
@@ -0,0 +1,38 @@
+<!ENTITY dialog.title "Add Adblock Plus filter rule">
+<!ENTITY accept.label "Add filter">
+<!ENTITY advanced.label "Advanced view">
+<!ENTITY basic.label "Basic view">
+
+<!ENTITY disabled.warning "Adblock Plus is currently disabled. You can still add filters but they will not be applied unless you [link]enable Adblock Plus[/link].">
+
+<!ENTITY filter.label "New &amp;filter:">
+<!ENTITY preferences.label "&amp;Show existing filters...">
+<!ENTITY type.filter.label "&amp;Blocking filter">
+<!ENTITY type.whitelist.label "E&amp;xception rule">
+<!ENTITY pattern.label "Look for pattern">
+<!ENTITY pattern.explanation "The pattern can be any part of the address; asterisks (*) act as wildcards. The filter will only be applied to addresses matching the pattern provided.">
+<!ENTITY regexp.warning "The pattern you entered will be interpreted as a regular expression which cannot be efficiently processed by Adblock Plus and may slow down your browsing experience. If you didn't intend to use a regular expression, add an asterisk (*) to the end of the pattern.">
+<!ENTITY shortpattern.warning "The pattern you entered is too short to be optimized and may slow down your browsing experience. It is recommended that you choose a longer string for this filter to allow Adblock Plus to process the filter more efficiently.">
+<!ENTITY match.warning "The pattern you entered no longer matches the address to be blocked/whitelisted and will have no effect on it.">
+<!ENTITY custom.pattern.label "&amp;Custom:">
+<!ENTITY anchors.label "Accept pattern only:">
+<!ENTITY anchor.start.label "at the be&amp;ginning of the address">
+<!-- Note: This access key should usually be the same as anchor.start.flexible.accesskey. It is the same checkbox with different label depending on suggested filter.-->
+<!ENTITY anchor.start.flexible.label "at the be&amp;ginning of the domain name">
+<!-- Note: This access key should usually be the same as anchor.start.accesskey. It is the same checkbox with different label depending on suggested filter.-->
+<!ENTITY anchor.end.label "at the e&amp;nd of the address">
+<!ENTITY options.label "Options">
+<!ENTITY domainRestriction.label "Restrict to &amp;domain:">
+<!ENTITY domainRestriction.help "Use this option to specify one or more domains separated by a bar line (|). The filter will only be applied on the domain(s) selected. A tilde (~) before a domain name indicates that the filter will not be applied on that domain.">
+<!ENTITY firstParty.label "Fi&amp;rst-party only">
+<!ENTITY thirdParty.label "&amp;Third-party only">
+<!ENTITY matchCase.label "&amp;Match case">
+<!ENTITY types.label "Apply to types:">
+<!ENTITY selectAllTypes.label "Select all">
+<!ENTITY unselectAllTypes.label "Select none">
+
+<!ENTITY collapse.label "Co&amp;llapse blocked:">
+<!ENTITY collapse.default.yes.label "Use default (yes)">
+<!ENTITY collapse.default.no.label "Use default (no)">
+<!ENTITY collapse.yes.label "Yes">
+<!ENTITY collapse.no.label "No">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/filters.dtd
new file mode 100644
index 0000000..1ab4720
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/filters.dtd
@@ -0,0 +1,92 @@
+<!ENTITY dialog.title "Adblock Plus Filter Preferences">
+
+<!ENTITY subscriptions.tab.label "Filter subscriptions">
+<!ENTITY filters.tab.label "Custom filters">
+
+<!ENTITY addSubscription.label "Add &amp;filter subscription">
+<!ENTITY addSubscriptionAdd.label "Add">
+<!ENTITY addSubscriptionCancel.label "Cancel">
+<!ENTITY addSubscriptionOther.label "Add a different subscription">
+
+<!ENTITY noSubscriptions.text "
+ You haven't added any filter subscriptions yet. Adblock Plus won't block
+ anything without filters, please use &quot;Add filter subscription&quot; to
+ add some.
+">
+<!ENTITY subscription.homepage.label "Homepage">
+<!ENTITY subscription.external.label "Updated by another extension">
+<!ENTITY subscription.source.label "Filter list">
+<!ENTITY subscription.enabled.label "Enabled">
+<!ENTITY subscription.lastDownload.label "Last download:">
+<!ENTITY subscription.lastDownload.inProgress "Downloading…">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY subscription.lastDownload.invalidURL "Failed, not a valid address">
+<!ENTITY subscription.lastDownload.connectionError "Failed, download failure">
+<!ENTITY subscription.lastDownload.invalidData "Failed, not a valid filters list">
+<!ENTITY subscription.lastDownload.checksumMismatch "Failed, checksum mismatch">
+<!ENTITY subscription.lastDownload.success "Success">
+<!ENTITY subscription.minVersion.warning "This filter subscription requires a newer Adblock Plus version, you should update to the latest Adblock Plus version.">
+<!ENTITY subscription.disabledFilters.warning "Some filters in this subscription are disabled.">
+<!ENTITY subscription.disabledFilters.enable "Enable disabled filters">
+
+<!ENTITY subscription.actions.label "Actions">
+<!ENTITY subscription.update.label "Update filters">
+<!ENTITY subscription.editTitle.label "Edit title">
+<!ENTITY subscription.delete.label "Delete">
+<!ENTITY subscription.showHideFilters.label "Show/hide filters">
+<!ENTITY subscription.moveUp.label "Move up">
+<!ENTITY subscription.moveDown.label "Move down">
+
+<!ENTITY acceptableAds2.label "Allow some non-&amp;intrusive advertising">
+<!ENTITY viewList.label "View list">
+<!ENTITY readMore.label "Read more">
+
+<!ENTITY addGroup.label "Add filter &amp;group">
+<!ENTITY noFilters.text "
+ You don't have any custom filters yet.
+">
+
+<!ENTITY addFilter.label "A&amp;dd filter">
+<!ENTITY filter.actions.label "Filter actions">
+<!ENTITY filter.edit.label "Edit">
+<!ENTITY filter.cut.label "Cut">
+<!ENTITY filter.copy.label "Copy">
+<!ENTITY filter.paste.label "Paste">
+<!ENTITY filter.delete.label "Delete">
+<!ENTITY filter.selectAll.label "Select All">
+<!ENTITY filter.resetHitCounts.label "Reset hit statistics">
+<!ENTITY filter.moveUp.label "Move up">
+<!ENTITY filter.moveDown.label "Move down">
+<!ENTITY viewMenu.label "View">
+
+<!ENTITY filter.column "&amp;Filter rule">
+<!ENTITY slow.column "Slo&amp;w filters">
+<!ENTITY enabled.column "E&amp;nabled">
+<!ENTITY hitcount.column "&amp;Hits">
+<!ENTITY lasthit.column "&amp;Last hit">
+<!ENTITY sort.label "&amp;Sort by">
+<!ENTITY sort.none.label "&amp;Unsorted">
+<!ENTITY sort.ascending.label "&amp;A > Z sort order">
+<!ENTITY sort.descending.label "&amp;Z > A sort order">
+<!ENTITY noGroupSelected.text "You need to select a filter group before its filters can be displayed.">
+<!ENTITY noFiltersInGroup.text "The selected group is empty.">
+
+<!ENTITY filters.remove.warning "Do you really want to remove all selected filters?">
+
+<!ENTITY backupButton.label "&amp;Backup and Restore">
+<!ENTITY backup.label "Create new backup">
+<!-- Note: the placeholder ?1? will be replaced by date/time of the automatic backup -->
+<!ENTITY restore.default.label "Restore backup from ?1?">
+<!ENTITY restore.own.label "Restore own backup">
+
+<!ENTITY backup.complete.title "All filters and subscriptions">
+<!ENTITY backup.custom.title "Custom filters only">
+
+<!ENTITY backup.error "There was an error writing filters to the file. Make sure that the file isn't write protected or in use by another application.">
+<!ENTITY restore.error "The file's data could not be processed, maybe this isn't an Adblock Plus backup file?">
+<!ENTITY restore.complete.warning "All your filter preferences will be replaced by the contents of the selected file. Do you want to proceeed?">
+<!ENTITY restore.custom.warning "All your custom filters will be replaced by the contents of the selected file. Do you want to proceeed?">
+<!ENTITY restore.minVersion.warning "Warning: the file has been created with a newer Adblock Plus version. You should update to the latest Adblock Plus version before restoring from this file.">
+
+<!ENTITY find.label "Fi&amp;nd">
+<!ENTITY close.label "Close">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/firstRun.properties
new file mode 100644
index 0000000..21438b1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/firstRun.properties
@@ -0,0 +1,24 @@
+firstRun_title=Adblock Plus has been installed
+firstRun_dataCorruptionWarning=Does this page keep showing up? <a>Click here!</a>
+firstRun_acceptableAdsHeadline=Annoying ads will now be blocked
+firstRun_acceptableAdsExplanation=We'd like to encourage websites to use straightforward, unobtrusive advertising. That's why we've established <a>strict guidelines</a> to identify acceptable ads, which are shown under default settings. If you still want to block every ad you can <a>disable</a> this in a few seconds.
+firstRun_legacySafariWarning=You are using an old version of Safari which is not supported by Adblock Plus. It might not work correctly or impair the user experience on some websites. We strongly recommend to either update to Safari 6.1.1 or higher (on OS X 10.8 Mountain Lion), or Safari 7.0.1 or higher (on OS X 10.9 Mavericks), or to use the latest version of Mozilla Firefox, Google Chrome or Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
+
+firstRun_toggle_on=ON
+firstRun_toggle_off=OFF
+
+firstRun_features=Adblock Plus can do more than block ads
+firstRun_feature_malware=Malware Blocking
+firstRun_feature_malware_description=Make your browsing more secure by blocking known malware domains.
+firstRun_feature_social=Remove Social Media Buttons
+firstRun_feature_social_description=Automatically rid your browsing experience of social media buttons, such as the Facebook Like, which appear on web pages and track your behavior.
+firstRun_feature_tracking=Disable Tracking
+firstRun_feature_tracking_description=Browse privately by disabling tracking - hiding your tracks from ad companies that would track your every move.
+
+firstRun_share_headline=<a>Give us a hand</a> in making the web a better place
+firstRun_donate=donate
+firstRun_donate_label=Support our project
+firstRun_share=Tell your friends
+
+firstRun_contributor_credits=Contributor Credits
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/global.properties
new file mode 100644
index 0000000..59de9cb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/global.properties
@@ -0,0 +1,58 @@
+default_dialog_title=Adblock Plus
+
+action0_tooltip=Click to bring up context menu, middle-click to enable/disable.
+action1_tooltip=Click to open/close blockable items, middle-click to enable/disable.
+action2_tooltip=Click to open preferences, middle-click to enable/disable.
+action3_tooltip=Click to enable/disable Adblock Plus.
+
+disabled_tooltip=Adblock Plus is disabled.
+# Note: the placeholder ?1? will be replaced by the number of active filter subscriptions, the placeholder ?2? by the number of custom filters
+active_tooltip=Adblock Plus is enabled, ?1? filter subscription(s) and ?2? custom filter(s) in use.
+whitelisted_tooltip=Adblock Plus is disabled on current page.
+
+# Note: the placeholder ?1? will be replaced by the number of blocked items, the placeholder ?2? by the total number of items on current page
+blocked_count_tooltip=?1? out of ?2?
+# Note: the placeholder ?1? will be replaced by the number of whitelisted items, the placeholder ?2? by the number of hidden items on current page
+blocked_count_addendum=(also whitelisted: ?1?, hidden: ?2?)
+
+no_blocking_suggestions=No blockable items on the current page
+whitelisted_page=Adblock Plus has been disabled for the current page
+
+newGroup_title=New filter group
+whitelistGroup_title=Exception Rules
+blockingGroup_title=Ad Blocking Rules
+elemhideGroup_title=Element Hiding Rules
+
+remove_subscription_warning=Do you really want to remove this subscription?
+remove_group_warning=Do you really want to remove this group?
+clearStats_warning=This will reset all filter hit statistics and disable counting filter hits. Do you want to proceed?
+
+filter_regexp_tooltip=This filter is either a regular expression or too short to be optimized. Too many of these filters might slow down your browsing.
+filter_elemhide_duplicate_id=Only one ID of the element to be hidden can be specified
+filter_elemhide_nocriteria=No criteria specified to recognize the element to be hidden
+
+subscription_invalid_location=Filter list location is neither a valid URL nor a valid file name.
+
+type_label_other=other
+type_label_script=script
+type_label_image=image
+type_label_stylesheet=stylesheet
+type_label_object=object
+type_label_subdocument=frame
+type_label_document=document
+type_label_elemhide=hidden
+type_label_popup=pop-up window
+
+type_label_xmlhttprequest=XML request
+type_label_object_subrequest=object subrequest
+type_label_media=audio/video
+type_label_font=font
+
+mobile_menu_enable=ABP: Enable
+# Note: the placeholder ?1? will be replaced by the site name. Ideally it should be at the end of the string (space is limited and site names can be long).
+mobile_menu_enable_site=ABP: Enable on ?1?
+# Note: the placeholder ?1? will be replaced by the site name. Ideally it should be at the end of the string (space is limited and site names can be long).
+mobile_menu_disable_site=ABP: Disable on ?1?
+
+notification_antiadblock_title=Hide targeted messages?
+notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages?
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/overlay.dtd
new file mode 100644
index 0000000..895ff80
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/overlay.dtd
@@ -0,0 +1,41 @@
+<!ENTITY status.tooltip "Status:">
+<!ENTITY blocked.tooltip "Blocked items on this page:">
+<!ENTITY filters.tooltip "Most active filters:">
+
+<!ENTITY menuitem.label "Ad&amp;block Plus Preferences">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+
+<!ENTITY context.image.label "Adblock Plus: Block image">
+<!ENTITY context.object.label "Adblock Plus: Block object">
+<!ENTITY context.frame.label "Adblock Plus: Block frame">
+<!ENTITY context.media.label "Adblock Plus: Block audio/video">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Re-enable on this page">
+
+<!ENTITY sidebar.title "Blockable items on current page">
+
+<!ENTITY sendReport.label "&amp;Report issue on this page">
+<!ENTITY filters.label "&amp;Filter preferences">
+<!ENTITY opensidebar.label "Open &amp;blockable items">
+<!-- Note: This access key should usually be the same as closesidebar.accesskey. It is the same menu item with different label depending on whether the sidebar is currently open.-->
+<!ENTITY closesidebar.label "Close &amp;blockable items">
+<!-- Note: This access key should usually be the same as opensidebar.accesskey. It is the same menu item with different label depending on whether the sidebar is currently open.-->
+<!-- Note: the placeholder ?1? will be replaced by the domain name of the current page -->
+<!ENTITY whitelist.site.label "Disable on ?1?">
+<!ENTITY whitelist.page.label "Disable on this page only">
+<!ENTITY disable.label "Disable everywhere">
+<!ENTITY options.label "&amp;Options">
+<!ENTITY contribute.label "Contribute to Adblock Plus">
+
+<!ENTITY showintoolbar.label "Show in tool&amp;bar">
+<!ENTITY showinstatusbar.label "&amp;Show in status bar">
+<!ENTITY objecttabs.label "Show &amp;tabs on Flash and Java">
+<!ENTITY hideplaceholders.label "Hide p&amp;laceholders of blocked elements">
+<!ENTITY counthits.label "Count filter &amp;hits">
+<!ENTITY sync.label "Syn&amp;c Adblock Plus settings">
+<!ENTITY objecttab.title "Block">
+<!ENTITY objecttab.tooltip "Click here to block this object with Adblock Plus">
+
+<!ENTITY notification.button.yes "&amp;Yes">
+<!ENTITY notification.button.no "&amp;No">
+<!ENTITY notification.button.close "&amp;Close">
+<!ENTITY subscription.update.label "Update filters">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/sendReport.dtd
new file mode 100644
index 0000000..49621ec
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/sendReport.dtd
@@ -0,0 +1,181 @@
+<!ENTITY wizard.title "Issue reporter">
+<!ENTITY privacyPolicy.label "Privacy policy">
+
+<!ENTITY dataCollector.heading "Welcome to the issue reporter">
+<!ENTITY dataCollector.description "Please wait a few moments while Adblock Plus gathers the required data.">
+
+<!-- Please keep typeSelector.heading short - it is shown in the progress bar, not much space there -->
+<!ENTITY typeSelector.heading "Select issue type">
+
+<!ENTITY typeSelector.description "
+ This window will guide you through the steps required for the submission of an Adblock
+ Plus issue report. First, please select the type of issue that you are experiencing
+ on this page:
+">
+
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus is blocking too &amp;much">
+<!ENTITY typeSelector.falsePositive.description "
+ Select this option if the page lacks important content, displays incorrectly or
+ fails to function properly. You can determine whether Adblock Plus is the cause
+ of the problem by disabling it temporarily.
+">
+
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus doesn't block an ad&amp;vertisement">
+<!ENTITY typeSelector.falseNegative.description "
+ Select this option if an advertisement is displayed despite
+ Adblock Plus being enabled.
+">
+
+<!ENTITY typeSelector.other.label "O&amp;ther issue">
+<!ENTITY typeSelector.other.description "
+ Select this option if you suspect an issue with Adblock Plus itself rather
+ than its filters.
+">
+
+<!ENTITY showRecentReports.label "Show recently submitted reports">
+<!ENTITY recentReports.label "Your recently submitted reports">
+<!ENTITY recentReports.clear.label "&amp;Remove all reports">
+<!ENTITY update.inProgress.description "
+ Adblock Plus needs to update your filter subscriptions to make sure that the
+ issue hasn't been resolved already. Please wait...
+">
+
+<!ENTITY update.fixed.description "
+ The updates to your filter subscriptions likely resolved the issue that you
+ were reporting. Please reload the page and retry, hit Report again if the
+ problem remains.
+">
+
+<!ENTITY outdatedSubscriptions.description "
+ The following filter subscriptions haven't been updated for at least two
+ weeks. Please update these subscriptions before submitting a report, the
+ issue might be resolved already.
+">
+
+<!ENTITY update.start.label "Start update now">
+
+<!ENTITY issues.description "
+ Adblock Plus has detected issues with your configuration that might be responsible
+ for this issue or will make investigating the report difficult.
+">
+
+<!ENTITY issues.whitelist.description "
+ Adblock Plus is currently disabled on the page you are reporting. Please re-enable
+ it and reload the page before submitting the report to assist the investigation of
+ this issue.
+">
+<!ENTITY issues.whitelist.remove.label "Re-enable Adblock Plus on this page">
+
+<!ENTITY issues.disabled.description "
+ Adblock Plus is disabled, it will not block anything in its current state.
+">
+<!ENTITY issues.disabled.enable.label "Enable Adblock Plus">
+
+<!ENTITY issues.nofilters.description "
+ Adblock Plus isn't blocking anything on the current page. The issue you are
+ observing is most likely unrelated to Adblock Plus.
+">
+
+<!ENTITY issues.nosubscriptions.description "
+ You do not appear to be subscribed to any of the pre-made filter lists that
+ automatically remove unwanted content from websites.
+">
+<!ENTITY issues.nosubscriptions.add.label "Add filter subscription">
+
+<!ENTITY issues.subscriptionCount.description "
+ It seems that you are subscribed to too many filter subscriptions. This
+ setup is not recommended because it will make the likeliness
+ of issues much higher. We also cannot accept your issue report because it
+ is unclear which filter subscription author needs to take action. Please
+ remove all but the really necessary filter subscriptions and test whether
+ the issue still occurs then.
+">
+<!ENTITY issues.openPreferences.label "Open filter preferences">
+
+<!ENTITY issues.ownfilters.description "
+ Some of the filters applied on this page are user-defined. Please disable
+ the filters that might have caused the issue:
+">
+<!ENTITY issues.ownfilters.disable.label "Disable filter">
+
+<!ENTITY issues.disabledgroups.description "
+ The following filter subscriptions / filter groups are disabled, yet they might have
+ an effect on this page:
+">
+<!ENTITY issues.disabledgroups.enable.label "Enable filter subscription / filter group">
+
+<!ENTITY issues.disabledfilters.description "
+ The following filters are disabled, yet they might have an effect on this page:
+">
+<!ENTITY issues.disabledfilters.enable.label "Enable filter">
+
+<!ENTITY issues.override.label "The &amp;configuration is correct, continue with the report">
+<!ENTITY issues.change.description "
+ Your configuration has been changed. Please reload the page to test the changes
+ and submit a report if the issue hasn't been resolved by the alterations.
+">
+
+<!ENTITY typeWarning.description "
+ You have indicated that you want to report a general issue with Adblock Plus rather
+ than a problem with the filters. Please note that such issues are best reported
+ in the [link]Adblock Plus forum[/link]. You should only use the issue reporter to
+ supplement an existing discussion, as nobody will notice your report
+ unless you provide them with the link to it. The automatically generated link
+ will be provided after submitting the report.
+">
+
+<!ENTITY typeWarning.override.label "I under&amp;stand and want to submit the report anyway">
+<!ENTITY reloadButton.label "&amp;Reload page">
+<!-- Please keep screenshot.heading short - it is shown in the progress bar, not much space there -->
+<!ENTITY screenshot.heading "Attach screenshot">
+
+<!ENTITY screenshot.description "
+ The same page can look different for different people. It may help us to
+ understand the problem if you attach a screenshot to your report. You can remove
+ sections containing sensitive information as well as mark areas where the
+ problem is noticeable. To do that click the corresponding button and select
+ a section of the image with your mouse.
+">
+
+<!ENTITY screenshot.attach.label "A&amp;ttach a page image to the report">
+<!ENTITY screenshot.mark.label "&amp;Mark the problem">
+<!ENTITY screenshot.remove.label "&amp;Remove sensitive data">
+<!ENTITY screenshot.undo.label "&amp;Undo">
+<!-- Please keep commentPage.heading short - it is shown in the progress bar, not much space there -->
+<!ENTITY commentPage.heading "Enter comment">
+
+<!ENTITY commentPage.description "
+ The text field below allows you to enter a comment to help us understand the issue.
+ This step is optional but recommended if the problem isn't obvious.
+ You can also review the report data before it is sent.
+">
+
+<!ENTITY emailComment.label "
+ We encourage you to enter a valid email address so that we can contact you if there are questions
+ about your report. It will also allow us to recognize your contributions and to prioritize them higher.
+">
+<!ENTITY comment.label "&amp;Comment (optional):">
+<!ENTITY comment.lengthWarning "The length of your comment exceeds 1000 characters. Only the first 1000 characters will be sent.">
+<!ENTITY email.label "E&amp;mail:">
+<!ENTITY anonymous.label "&amp;Anonymous submission">
+<!ENTITY anonymity.warning "We won't be able to come back to you and will likely prioritize the report lower.">
+
+<!ENTITY attachExtensions.label "Attach a list of active e&amp;xtensions to the report in case add-on conflict is the cause of the problem">
+<!ENTITY sendButton.label "Se&amp;nd report">
+<!ENTITY showData.label "Show report data">
+<!ENTITY data.label "Re&amp;port data:">
+<!-- Please keep sendPage.heading short - it is shown in the progress bar, not much space there -->
+<!ENTITY sendPage.heading "Send report">
+<!ENTITY sendPage.waitMessage "Please wait while Adblock Plus is submitting your report.">
+<!ENTITY sendPage.confirmation "Your report has been saved. You can access it at the following address:">
+<!ENTITY sendPage.knownIssue "The issue you reported is probably already known. More information:">
+
+<!-- Note: the placeholder ?1? will be replaced by the error code -->
+<!ENTITY sendPage.errorMessage "
+ An attempt to send the report failed with error code &quot;?1?&quot;. Please ensure you are
+ connected to the Internet and retry. If the problem persists please request
+ assistance in the [link]Adblock Plus forum[/link].
+">
+<!ENTITY sendPage.retry.label "Send again">
+
+<!ENTITY copyLink.label "&amp;Copy report link">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/sidebar.dtd
new file mode 100644
index 0000000..f612047
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/sidebar.dtd
@@ -0,0 +1,41 @@
+<!ENTITY detached.title "Adblock Plus: Blockable items (detached)">
+
+<!ENTITY detach.label "Detach">
+<!ENTITY reattach.label "Reattach">
+
+<!ENTITY search.label "&amp;Search:">
+<!ENTITY type.label "Type">
+<!ENTITY address.label "Address">
+<!ENTITY filter.label "Filter">
+<!ENTITY state.label "State">
+<!ENTITY size.label "Size">
+<!ENTITY filterSource.label "Filter source">
+<!ENTITY docDomain.label "Document source">
+<!ENTITY docDomain.thirdParty "(third party)">
+<!ENTITY docDomain.firstParty "(first party)">
+<!ENTITY noitems.label "No blockable items">
+<!ENTITY whitelisted.label "Whitelisted page">
+<!ENTITY tooltip.address.label "Address:">
+<!ENTITY tooltip.type.label "Type:">
+<!ENTITY tooltip.type.blocked "(blocked)">
+<!ENTITY tooltip.type.whitelisted "(whitelisted)">
+<!ENTITY tooltip.size.label "Size:">
+<!ENTITY tooltip.docDomain.label "Document source:">
+<!ENTITY tooltip.filter.label "Filter in effect:">
+<!ENTITY tooltip.filter.disabled "(disabled)">
+<!ENTITY tooltip.filterSource.label "Filter source:">
+
+<!ENTITY context.block.label "Block this item">
+<!ENTITY context.editfilter.label "Edit filter in effect">
+<!ENTITY context.whitelist.label "Add exception rule for item">
+<!-- Note: the placeholder ?1? will be replaced by the filter text -->
+<!ENTITY context.disablefilter.label "Disable filter ?1?">
+<!-- Note: the placeholder ?1? will be replaced by the filter text -->
+<!ENTITY context.enablefilter.label "Re-enable filter ?1?">
+<!-- Note: the placeholder ?1? will be replaced by the domain name of the current page -->
+<!ENTITY context.disablefilteronsite.label "Disable this filter on ?1?">
+<!ENTITY context.open.label "Open in New Tab">
+<!ENTITY context.flash.label "Flash item's borders">
+<!ENTITY context.copy.label "Copy item's address">
+<!ENTITY context.copyFilter.label "Copy filter">
+<!ENTITY context.selectAll.label "Select all">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/subscriptionSelection.dtd
new file mode 100644
index 0000000..78444d1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/en-US/subscriptionSelection.dtd
@@ -0,0 +1,19 @@
+<!ENTITY dialog.title "Add Adblock Plus filter subscription">
+
+<!ENTITY viewList.label "View filters">
+<!ENTITY visitHomepage.label "Visit home page">
+
+<!ENTITY addSubscription.label "Add subscription">
+
+<!ENTITY list.download.failed "Adblock Plus failed to retrieve the list of subscriptions.">
+<!ENTITY list.download.retry "Try again">
+<!ENTITY list.download.website "View website">
+
+<!ENTITY fromWeb.description "Please confirm that you want to add this filter subscription. You can change the subscription title or location before adding it.">
+
+<!ENTITY title.label "Subscrip&amp;tion title:">
+<!ENTITY location.label "Fi&amp;lter list location:">
+<!-- Note: the placeholder (?1?) will be replaced by the name of the filter subscription required -->
+<!ENTITY supplementMessage "This filter subscription is meant to be used with the filter subscription &quot;?1?&quot; which you are not using yet.">
+<!-- Note: the placeholder (?1?) will be replaced by the name of the filter subscription required -->
+<!ENTITY addMain.label "Add filter &amp;subscription &quot;?1?&quot; as well">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/composer.dtd
new file mode 100644
index 0000000..20fc48a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "en la fi&amp;no de la adreso">
+<!ENTITY domainRestriction.label "&amp;Limigi al retregiono:">
+<!ENTITY collapse.default.no.label "Uzi apriorojn (ne)">
+<!ENTITY firstParty.label "Nu&amp;r de unua liveranto">
+<!ENTITY preferences.label "Montri &amp;ekzistantajn filtrilojn...">
+<!ENTITY pattern.label "Serĉi modelon">
+<!ENTITY thirdParty.label "Nur de &amp;tria liveranto">
+<!ENTITY filter.label "Nova &amp;filtrilo:">
+<!ENTITY collapse.label "Ma&amp;letendi blokitajn:">
+<!ENTITY match.warning "La modelo, kiun vi enigis, ne plu konformas kun la adreso, kiu estu blokata/transprenata en la blankan liston kaj ne havos efikon al Äi.">
+<!ENTITY anchor.start.label "en la &amp;komenco de la adreso">
+<!ENTITY matchCase.label "&amp;Atenti usklecon">
+<!ENTITY custom.pattern.label "&amp;Propraj:">
+<!ENTITY unselectAllTypes.label "Elekti nenion">
+<!ENTITY type.whitelist.label "Es&amp;ceptoregulo">
+<!ENTITY regexp.warning "La modelo, kiun vi enigis, estos interpretata kiel regula esprimo, kiu ne povas esti traktata oer Adblock Plus kaj povas malrapidigi vian retumadon. Se vi ne intencas uzi regulan esprimon, aldonu asteriskon (*) al la fino de la modelo.">
+<!ENTITY dialog.title "Aldoni filtrilregulon al Adblock Plus">
+<!ENTITY basic.label "Baza vido">
+<!ENTITY type.filter.label "&amp;Blokanta filtrilo">
+<!ENTITY types.label "Apliki al specoj:">
+<!ENTITY shortpattern.warning "La modelo, kiun vi enigis, estas tro mallonga por optimigo kaj povas malrapidigi vian retumadon. RekomendiÄas, ke vi elektas pli longan signoĉenon por ĉi tiu filtrilo por permesi Adblock Plus trakti la filtrilon pli efike.">
+<!ENTITY collapse.yes.label "Jes">
+<!ENTITY anchors.label "Akcepti modelon nur:">
+<!ENTITY collapse.default.yes.label "Uzi apriorojn (jes)">
+<!ENTITY domainRestriction.help "Uzu ĉi tiun opcion por specifi unu retregionon aŭ plurajn retregionojn, separitajn per strekosigno (|). La filtrilo estos nur aplikata al elektita(j) retregiono(j). Tildo (~) antaŭ retregiona nomo indikas, ke la filtrilo ne estos aplikata al tiu retregiono.">
+<!ENTITY accept.label "Aldoni filtrilon">
+<!ENTITY options.label "Opcioj">
+<!ENTITY disabled.warning "Addblock Plus estas nun malÅaltita. Vi povas ankoraÅ­ aldoni filtrilojn sed ili ne estos aplikataj, Äis vi [link]enÅaltas Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "en la komenco de la retre&amp;giona nomo">
+<!ENTITY collapse.no.label "Ne">
+<!ENTITY selectAllTypes.label "Elekti ĉion">
+<!ENTITY advanced.label "Detala vido">
+<!ENTITY pattern.explanation "La modelo povas esti parto de la adreso; asteriskoj (*) funkcias kiel ĵokeroj. La filtrilo estos nur aplikata al adresoj, kiuj konformas kun la specifita modelo.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/filters.dtd
new file mode 100644
index 0000000..a7c498c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Ĉiuj viaj propraj filtriloj estos anstataŭigataj per la enhavo de la elektita dosiero. Ĉu vi volas daŭrigi?">
+<!ENTITY slow.column "&amp;Malrapidaj filtriloj">
+<!ENTITY enabled.column "Ebl&amp;igita">
+<!ENTITY subscription.lastDownload.checksumMismatch "Malsukcesis, kontrolsuma miskongruo">
+<!ENTITY noFiltersInGroup.text "La elektita grupo estas malplena.">
+<!ENTITY subscription.actions.label "Agoj">
+<!ENTITY filter.selectAll.label "Elekti ĉion">
+<!ENTITY backupButton.label "Se&amp;kurkopii kaj restaÅ­ri">
+<!ENTITY restore.minVersion.warning "Averto: la dosiero estas kreita per pli nova versio de Adblock Plus. Vi Äisdatigu al la plej nova versio de Adblock Plus antaÅ­ ol vi restaÅ­ri ion el ĉi tiu dosiero.">
+<!ENTITY restore.error "La dosieraj datumoj ne povis traktitaj, ĉu tio eble ne estas sekurkopia dosiero de Adblock Plus?">
+<!ENTITY sort.ascending.label "Ordigo &amp;A &gt; Z">
+<!ENTITY sort.label "&amp;Ordigi laÅ­">
+<!ENTITY subscription.source.label "Filtrila listo">
+<!ENTITY hitcount.column "&amp;Trafoj">
+<!ENTITY noFilters.text "Vi ankoraÅ­ ne havas proprajn filtrilojn.">
+<!ENTITY backup.custom.title "Nur propraj filtriloj">
+<!ENTITY subscription.external.label "Ĝisdatigita per alia etendaĵo">
+<!ENTITY subscription.delete.label "ForviÅi">
+<!ENTITY noGroupSelected.text "Vi devas elekti filtrilgrupon antaÅ­ ol filtriloj povas esti vidigataj.">
+<!ENTITY filter.cut.label "Eltondi">
+<!ENTITY restore.default.label "RestaÅ­ri sekurkopion de ?1?">
+<!ENTITY subscription.lastDownload.inProgress "ElÅutanta...">
+<!ENTITY subscriptions.tab.label "Filtrilabonoj">
+<!ENTITY sort.descending.label "Ordigo &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Ĉu vi vere volas forigi ĉiujn elektitajn filtrilojn?">
+<!ENTITY filter.delete.label "ForviÅi">
+<!ENTITY addSubscriptionAdd.label "Aldoni">
+<!ENTITY viewMenu.label "Vidi">
+<!ENTITY subscription.lastDownload.unknown "Neniu">
+<!ENTITY addSubscriptionCancel.label "Nuligi">
+<!ENTITY subscription.enabled.label "Ebligita">
+<!ENTITY noSubscriptions.text "Vi ankoraÅ­ ne aldonis filtrilabonojn. Adblock Plus blokos enion sen filtriloj, bonvolu uzu &quot;Aldoni filtrilabonon&quot; por aldoni abonon.">
+<!ENTITY subscription.update.label "Äœisdatigi filtrilojn">
+<!ENTITY dialog.title "Filtrilaj agordoj de Adblock Plus">
+<!ENTITY addFilter.label "Al&amp;doni filtrilon">
+<!ENTITY subscription.minVersion.warning "Ĉi tiu filtrilabono bezonas pli novan version de Adblock Plus, vi Äisdatigu al la plej nova versio de Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Malsukcesis, tio ne estas valida adreso">
+<!ENTITY backup.error "Okazis eraro dum skribado de filtriloj en dosieron. Kontrolu, ke la dosiero ne estas kontraŭskribe protektita aŭ uzate per alia aplikaĵo.">
+<!ENTITY filter.moveUp.label "Supren">
+<!ENTITY addGroup.label "Aldoni filtril&amp;grupon">
+<!ENTITY filter.edit.label "Redakti">
+<!ENTITY subscription.showHideFilters.label "Montri/KaÅi filtrilojn">
+<!ENTITY acceptableAds2.label "Permesi neal&amp;trudiÄantan reklamon">
+<!ENTITY addSubscriptionOther.label "Aldoni alian abonon">
+<!ENTITY close.label "Fermi">
+<!ENTITY sort.none.label "&amp;Nenio">
+<!ENTITY filter.actions.label "Filtrilaj agoj">
+<!ENTITY filter.copy.label "Kopii">
+<!ENTITY filter.moveDown.label "Malsupren">
+<!ENTITY filter.resetHitCounts.label "Rekomencigi trafostatistikon">
+<!ENTITY readMore.label "Legu pli">
+<!ENTITY subscription.moveUp.label "Supren">
+<!ENTITY addSubscription.label "Aldoni &amp;filtrilabonon">
+<!ENTITY subscription.homepage.label "HejmpaÄo">
+<!ENTITY backup.complete.title "Ĉiuj filtriloj kaj abonoj">
+<!ENTITY restore.own.label "RestaÅ­ri propran sekurkopion">
+<!ENTITY restore.complete.warning "Ĉiuj viaj filtrilaj agordoj estos anstataŭigataj per la enhavo de la elektita dosiero. Ĉu vi volas daŭrigi?">
+<!ENTITY filters.tab.label "Propraj filtriloj">
+<!ENTITY backup.label "Krei novan sekurkopion">
+<!ENTITY find.label "&amp;Serĉi">
+<!ENTITY subscription.moveDown.label "Malsupren">
+<!ENTITY subscription.lastDownload.connectionError "Malsukcesis, elÅuta eraro">
+<!ENTITY subscription.lastDownload.success "Sukceso">
+<!ENTITY subscription.lastDownload.invalidData "Malsukcesis, tio ne estas listo de validaj filtriloj">
+<!ENTITY filter.paste.label "Alglui">
+<!ENTITY subscription.disabledFilters.enable "Ebligi malebligitajn filtrilojn">
+<!ENTITY lasthit.column "&amp;Lasta trafo">
+<!ENTITY subscription.editTitle.label "Redakti titolon">
+<!ENTITY subscription.disabledFilters.warning "Kelkaj filtriloj en ĉi tiu abono estas malebligitaj.">
+<!ENTITY filter.column "&amp;Filtrilregulo">
+<!ENTITY subscription.lastDownload.label "Lasta elÅuto:">
+<!ENTITY viewList.label "Montri liston">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/firstRun.properties
new file mode 100644
index 0000000..64666ee
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Retumu private malebligante spuradon resp. kaÅante viajn spurojn antaÅ­ reklamfirmaoj, kiuj volonte spurus ĉiun el viaj movoj.
+firstRun_toggle_off=MalÅaltita
+firstRun_feature_tracking=Malebligi spuradon
+firstRun_feature_malware=Bloki fiprogramaron
+firstRun_title=Adblock Plus instaliÄis
+firstRun_acceptableAdsExplanation=Ni volonte kuraÄigus retejojn uzi sinceran, nealtrudiÄeman varbadon. Tial ni fiksis <a>striktajn direktivojn</a> por identigi akcepteblan reklamon, kiujn vi trovas en la defaÅ­ltaj agordoj. Se vi ankoraÅ­ volas bloki ĉian reklamon, vi povas <a>malebligi</a> tion dum malmultaj sekundoj.
+firstRun_toggle_on=Åœaltita
+firstRun_contributor_credits=Danko al kontribuintoj
+firstRun_dataCorruptionWarning=Ĉu la paÄo estas plumontrata? <a>Klaku ĉi tie!</a>
+firstRun_acceptableAdsHeadline=AltrudiÄema reklamo estos nun blokata
+firstRun_share=Informu viajn amikojn
+firstRun_share_headline=<a>Donu al ni manon</a>, por ke ni faru la reton pli bona loko
+firstRun_features=Adblock Plus povas fari pli multe ol bloki reklamon
+firstRun_feature_malware_description=Faru vian retumadon pli sekura blokante konatajn domajnojn de fiprogramaro.
+firstRun_feature_social_description=AÅ­tomate forigi vian retan agadon faritan pere de butonoj de sociaj medioj, kiel la butono "Åœati" en Fejsbuko, kiuj aperas en retpaÄoj kaj spuras vian konduton.
+firstRun_donate=donaci
+firstRun_donate_label=Subtenu nian projekton
+firstRun_feature_social=Forigi butonojn de sociaj aŭdvidaĵoj
+firstRun_legacySafariWarning=Vi uzas malnovan version de Safari, kiun Adblock Plus ne subtenas. Eble Äi ne korekte funkcios aÅ­ Äenas la travivaĵon de uzanto sur kelkaj retejoj. Ni eksplicite rekomendas aÅ­ Äisdatigi al Safari 6.1.1 aÅ­ pli alta versio (estas je dispono por Mac OS X 10.8 Mountain Lion) aÅ­ Safari 7.0.1 aÅ­ pli alta versio (estas je dispono por OS X 10.9 Mavericks) aÅ­ uzi la plej novan version de Mozilla Firefox, Google Chrome aÅ­ Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/global.properties
new file mode 100644
index 0000000..f37a94d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Neniuj blokeblaj elementoj en ĉi tiu paÄo
+action3_tooltip=Klaku por ebligi/malebligi Adblock Plus.
+notification_antiadblock_title=Ĉu kaÅi celmesaÄojn?
+type_label_script=skripto
+filter_elemhide_nocriteria=Neniuj kriterioj specifitaj por ekkoni la kaÅotan elementon
+blockingGroup_title=Reguloj por bloki reklamon
+whitelisted_tooltip=Adblock Plus estas malebligita sur ĉi tiu paÄo.
+type_label_stylesheet=stilfolio
+blocked_count_tooltip=?1? el ?2?
+type_label_font=tiparo
+type_label_popup=Åprucfenestro
+filter_regexp_tooltip=Ĉi tiu filtrilo estas aŭ regula esprimo aŭ tro mallonga por optimigo. Tro multe da ĉi tiuj filtriloj povus malrapidigi vian retumadon.
+action0_tooltip=Klaku por vidigi la kuntekstan menuon, klaku per la meza musklavo por ebligi/malebligi Äin.
+whitelisted_page=Adblock Plus estas malebligita por ĉi tiu paÄo
+remove_group_warning=Ĉu vi vere volas forigi ĉi tiun grupon?
+action1_tooltip=Klaku por malfermi/fermi blokeblajn elementojn, klaku per la meza musklavo por ebligi/malebligi Äin.
+type_label_xmlhttprequest=XML-peto
+active_tooltip=Adblock Plus estas ebligita, ?1? filtrilabonoj kaj ?2? propraj filtriloj estas uzataj.
+type_label_document=dokumento
+type_label_object_subrequest=objekta subpeto
+whitelistGroup_title=Esceptoreguloj
+disabled_tooltip=Adblock Plus estas malebligita.
+filter_elemhide_duplicate_id=Nur unu el la kaÅotaj elementoj povas esti specifata
+type_label_object=objekto
+action2_tooltip=Klaku por malfermi agordojn, klaku per la meza musklavo por ebligi/malebligi Äin.
+type_label_subdocument=kadro
+clearStats_warning=Tio rekomencigos la statistikon de filtrilaj trafoj kaj malebligos la nombradon de filtrilaj trafoj. Ĉu vi volas daŭrigi?
+notification_antiadblock_message=Estas konate, ke ĉi tiu retejo montras celmesaÄojn por uzantoj de Adblock Plus. Ĉu vi volas, ke Adblock Plus kaÅu celmesaÄojn?
+blocked_count_addendum=(ankaÅ­ en blanka listo: ?1?, kaÅita: ?2?)
+subscription_invalid_location=La loko de la listo de filtriloj estas nek valida URL nek valida dosiernomo.
+type_label_image=bildo
+remove_subscription_warning=Ĉu vi efektive volas fini ĉi tiun abonon?
+type_label_other=alia
+mobile_menu_enable=ABP: Ebligi
+type_label_media=aÅ­dio/video
+mobile_menu_disable_site=ABP: Malebligi en ?1?
+elemhideGroup_title=Reguloj por kaÅi elementojn
+mobile_menu_enable_site=ABP: Ebligi en ?1?
+type_label_elemhide=kaÅita
+newGroup_title=Nova grupo de filtriloj
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/overlay.dtd
new file mode 100644
index 0000000..6c1bb4f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Jes">
+<!ENTITY notification.button.no "&amp;Ne">
+<!ENTITY sync.label "&amp;Sinkronigi agordojn de Adblock Plus">
+<!ENTITY whitelist.site.label "Malebligi sur ?1?">
+<!ENTITY filters.label "&amp;Filtrilaj agordoj">
+<!ENTITY disable.label "Ĉie malebligi">
+<!ENTITY objecttab.title "Bloki">
+<!ENTITY objecttab.tooltip "Klaku ĉi tien por bloki ĉi tiun objekton per Adblock Plus">
+<!ENTITY menuitem.label "&amp;Agordoj de Adblock Plus">
+<!ENTITY objecttabs.label "&amp;Montri langetojn de Flash kaj Äœavo">
+<!ENTITY sendReport.label "&amp;Raporti problemon pri ĉi tiu paÄo">
+<!ENTITY whitelist.page.label "Malebligi nur sur ĉi tiu paÄo">
+<!ENTITY context.image.label "Adblock Plus: Bloki bildon">
+<!ENTITY counthits.label "&amp;Nombri filtriltrafojn">
+<!ENTITY opensidebar.label "Malfermi &amp;blokeblajn elementojn">
+<!ENTITY notification.button.close "&amp;Fermi">
+<!ENTITY contribute.label "Kontribuu al Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Bloki kadron">
+<!ENTITY blocked.tooltip "Blokitaj elementoj sur ĉi tiu paÄo:">
+<!ENTITY hideplaceholders.label "KaÅi &amp;lokokupilojn de blokitaj elementoj">
+<!ENTITY showinstatusbar.label "Vidi&amp;gi en statstrio">
+<!ENTITY sidebar.title "Blokeblaj elementoj sur la nuna paÄo">
+<!ENTITY options.label "&amp;Opcioj">
+<!ENTITY context.object.label "Adblock Plus: Bloki objekton">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Reebligi sur ĉi tiu paÄo">
+<!ENTITY filters.tooltip "Plej aktivaj filtriloj:">
+<!ENTITY closesidebar.label "Fermi &amp;blokeblajn elementojn">
+<!ENTITY showintoolbar.label "&amp;Vidigi en ilobreto">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Bloki aÅ­dion/videon">
+<!ENTITY subscription.update.label "Äœisdatigi filtrilojn">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/sendReport.dtd
new file mode 100644
index 0000000..5e145e7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Malfari">
+<!ENTITY issues.disabledgroups.description "La sekvontaj filtrilabonoj/filtrilgrupoj estas malebligitaj, sed ili povus havi efikon al ĉi tiu paÄo:">
+<!ENTITY showData.label "Montri raportodatumojn">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blokas tro &amp;multe">
+<!ENTITY issues.change.description "Via konfiguro estas ÅanÄita. Bonvolu reÅargi la paÄon por testi la ÅanÄojn kaj sendu la raporton, se la problemo ne solviÄos per la ÅanÄoj.">
+<!ENTITY email.label "&amp;RetpoÅto:">
+<!ENTITY issues.openPreferences.label "Malfermi filtrilagordojn">
+<!ENTITY sendPage.confirmation "Via raporto estas konservita. Vi povas atingi Äin ĉe sekvonta adreso:">
+<!ENTITY copyLink.label "&amp;Kopii raportligilon">
+<!ENTITY issues.nofilters.description "Adblock Plus blokas nenion sur ĉi tiu paÄo. La problemo, kiun vi observas, plej verÅajne ne rilatas al Adblock Plus.">
+<!ENTITY sendPage.knownIssue "La problemo, kiun vi raportis, eble estas jam konata. Pliaj informoj:">
+<!ENTITY typeSelector.other.description "Elektu ĉi tiun opcion, se vi kredas problemon kun Adblock Plus mem pli verÅajna ol kun Äiaj filtriloj.">
+<!ENTITY issues.disabledgroups.enable.label "Ebligi filtrilabonon/filtrilgrupon">
+<!ENTITY typeWarning.override.label "Mi komprena&amp;s kaj volas sendi la raporton malgraÅ­ tio">
+<!ENTITY issues.disabled.enable.label "Ebligi Adblock Plus">
+<!ENTITY update.fixed.description "La Äisdatigoj de viaj filtrilabonoj verÅajne solvis la problemon, kiun vi sciigis. Bonvolu reÅargi la paÄon kaj alklaku denoe 'Sendi denove', se la problemo ankoraÅ­ ekzistas.">
+<!ENTITY anonymous.label "&amp;Anonima sendado">
+<!ENTITY reloadButton.label "&amp;ReÅargi paÄon">
+<!ENTITY recentReports.clear.label "&amp;Forigi ĉiujn raportojn">
+<!ENTITY typeSelector.description "Ĉi tiu fenestro gvidos vin tra la paÅoj, kiuj estas bezonataj por sendi la problemraporton de Adblock Plus. Unue bonvolu elekti la problemtipon, kiun vi renkontis sur ĉi tiu paÄo:">
+<!ENTITY screenshot.remove.label "&amp;Forigi gravajn datumojn">
+<!ENTITY issues.ownfilters.description "Kelkaj filtriloj aplikataj al ĉi tiu paÄo estas propre difinitaj. Bonvolu malebligi la filtrilojn, kiuj povus kaÅ­zi la problemon:">
+<!ENTITY update.inProgress.description "Adblock Plus devas Äisdatigi viajn fitrilabonojn por certigi, ke la problemo ne estas jam solvita. Bonvolu atendi...">
+<!ENTITY sendPage.retry.label "Denove sendi">
+<!ENTITY data.label "Ra&amp;portodatumoj:">
+<!ENTITY recentReports.label "Viaj antaÅ­ nelonge senditaj raportoj">
+<!ENTITY typeWarning.description "Vi indikis, ke vi volas raporti Äeneralan problemon kun Adblock Plus opiniante tion pli verÅajna ol problemo kun la filtriloj. Bonvolu atenti, ke tia problemo estu plej bone raportata en [link]forumo de Adblock Plus[/link]. Vi nur uzu la problemraportilon por kompletigi ekzistantan diskuton, ĉar neniu rimarkos via raporton, escepte, se vi donas al ili la ligilon al Äi. La aÅ­tomate generita ligilo estos provizita post sendado de la raporto.">
+<!ENTITY issues.disabled.description "Adblock Plus estas malebligita, Äi blokos nenion en sia aktuala stato.">
+<!ENTITY attachExtensions.label "Kun&amp;sendi liston de aktivaj etendaĵoj kun la raporto, se etendaĵa konflikto estas la kaŭzo de la problemo">
+<!ENTITY issues.nosubscriptions.add.label "Aldoni filtrilabonon">
+<!ENTITY issues.disabledfilters.enable.label "Ebligi filtrilon">
+<!ENTITY issues.override.label "La &amp;konfiguro estas korekta, daÅ­rigi la raporton">
+<!ENTITY issues.nosubscriptions.description "Åœajnas, ke vi ne abonis preparitan liston de filtriloj, kiuj aÅ­tomate forigas nedeziratan enhavon de retejoj.">
+<!ENTITY typeSelector.falsePositive.description "Elektu ĉi tiun opcion, se la paÄo malhavas gravan enhavon, ne estas vidigata korekte abo malsukcesas korekte funkcii. Vi povas determini, ĉu Adblock Plus estas la kaÅ­zo de la problemo malebligante Äin provizore.">
+<!ENTITY typeSelector.other.label "&amp;Alia problemo">
+<!ENTITY emailComment.label "Ni rekomendas al vi enigi validan retpoÅtan adreson, por ke ni povu kontakti vin, se estos demandoj pri via raporto. Tio ankaÅ­ ebligas al ni agnoski viajn kontribuojn kaj doni pli altan prioritaton al ili.">
+<!ENTITY issues.whitelist.remove.label "Denove ebligi Adblock Plus sur ĉi tiu paÄo">
+<!ENTITY outdatedSubscriptions.description "La sekvontaj filtrilabonoj ne ÄisdatiÄis de almenaÅ­ du semajnoj. Bonvolu Äisdatigi ĉi tiujn abonojn, antaÅ­ ol vi sendas raporton, la problemo estas eble jam solvita.">
+<!ENTITY dataCollector.description "Bonvolu atendi kelkajn momentojn dum Adblock Plus akiras la necesajn datumojn.">
+<!ENTITY sendButton.label "Se&amp;ndi raporton">
+<!ENTITY comment.label "&amp;Komento (laÅ­vole):">
+<!ENTITY sendPage.errorMessage "Provo por sendi la raporton malsukcesis kun erarkodo &quot;?1?&quot;. Bonvolu certiÄu, ke vi estas konektita al la interreto kaj provu denove. Se la problemo pluekzistas, bonvolu peti pri helpo en la [link]forumo de Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Montri antaÅ­ nelonge senditajn raportojn">
+<!ENTITY commentPage.heading "Enigi komenton">
+<!ENTITY update.start.label "Startigu nun Äisdatigon">
+<!ENTITY issues.disabledfilters.description "La sekvontaj filtriloj estas malebligitaj, sed ili povus havi efikon al ĉi tiu paÄo:">
+<!ENTITY screenshot.description "La sama paÄo povas aspekti alie por diferencaj homoj. Helpus kompreni la problemon, se vi aldonas ekrankopion al via raporto. Vi povas forigi sekciojn, kiuj enhavas konfidencajn informojn kaj marki lokojn, kie la problemo estas rimarkebla. Por fari tion, alklaku la respektivan butonon kaj elektu la sekcion de la bildo per via muso.">
+<!ENTITY screenshot.attach.label "Kunsendi paÄobi&amp;ldon kun la raporto">
+<!ENTITY issues.whitelist.description "Adblock Plus estas nun malebligita sur la paÄo, pri kiu vi raportas. Bonvolu ebligi Äin denove kaj reÅargu la paÄon antaÅ­ ol vi sendas la raporton por helpi analizi ĉi tiun problemon.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus ne blokas &amp;reklamon">
+<!ENTITY typeSelector.heading "Elekti problemtipon">
+<!ENTITY anonymity.warning "Ni ne povas turni nin al vi denove kaj ni donos verÅajne pli malaltan prioritaton al via raporto.">
+<!ENTITY wizard.title "Problemraportilo">
+<!ENTITY issues.ownfilters.disable.label "Malebligi filtrilon">
+<!ENTITY commentPage.description "La tekstokampo malsupre ebligas al vi enigi komenton por helpi al ni kompreni la problemon. Ĉi tiu paÅo estas laÅ­vola, sed rekomendata, se la problemo ne estas evidenta. Vi povas ankaÅ­ kontroli la raportodatumojn, antaÅ­ ol Äi estas forsendata.">
+<!ENTITY comment.lengthWarning "Via komento havas pli ol 1000 signojn. Nur la unuaj 1000 signoj estos sendataj:">
+<!ENTITY typeSelector.falseNegative.description "Elektu ĉi tiun opcion, se reklamo estas vidigata, kvankam Adblock Plus estas ebligita.">
+<!ENTITY sendPage.waitMessage "Bonvolu atendi, dum Adblock Plus sendas vian raporton.">
+<!ENTITY dataCollector.heading "Bonvenon al la problemraportilo">
+<!ENTITY screenshot.heading "Kunsendi ekrankopion">
+<!ENTITY sendPage.heading "Sendi raporton">
+<!ENTITY issues.subscriptionCount.description "Åœajnas, ke vi abonis tro multajn filtrilabonojn. Ĉi tiu agordo ne rekomendiÄas, ĉar Äi plialtigas la probablecon de problemoj. Ni ankaÅ­ ne povas akcepti vian problemraporton, ĉar estas malklare, kiu filtrilabona aÅ­toro devas agi. Bonvolu forigi ĉion, escepte de la vere necesaj filtrilabonoj kaj testu, ĉu la problemo poste ankoraÅ­ ekzistas.">
+<!ENTITY screenshot.mark.label "Ma&amp;rki la problemon">
+<!ENTITY privacyPolicy.label "Reguloj de privateco">
+<!ENTITY issues.description "Adblock Plus malkovris problemojn kun via konfiguro, kiu eble estas kulpa pri ĉi tiu problemo aŭ malfaciligas la analizadon de la raporto.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/sidebar.dtd
new file mode 100644
index 0000000..949e6ac
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Borderoj de elementoj de Flash">
+<!ENTITY address.label "Adreso">
+<!ENTITY context.open.label "Malfermi en nova langeto">
+<!ENTITY type.label "Tipo">
+<!ENTITY tooltip.filterSource.label "Fonto de la filtrilo:">
+<!ENTITY noitems.label "Neniuj blokeblaj elementoj">
+<!ENTITY filter.label "Filtrilo">
+<!ENTITY tooltip.size.label "Grandeco:">
+<!ENTITY reattach.label "Denove kunligi">
+<!ENTITY search.label "&amp;Serĉi:">
+<!ENTITY docDomain.thirdParty "(de tria liveranto)">
+<!ENTITY filterSource.label "Fonto de la filtrilo">
+<!ENTITY tooltip.docDomain.label "Fonto de la dokumento:">
+<!ENTITY context.copy.label "Kopii la adreson de la elemento">
+<!ENTITY tooltip.type.label "Tipo:">
+<!ENTITY context.disablefilter.label "Malebligi filtrilon ?1?">
+<!ENTITY context.copyFilter.label "Kopii filtrilon">
+<!ENTITY context.block.label "Bloki ĉi tiun elementon">
+<!ENTITY context.enablefilter.label "Denove ebligi filtrilon ?1?">
+<!ENTITY detach.label "Malligi">
+<!ENTITY whitelisted.label "PaÄo en blanka listo">
+<!ENTITY context.disablefilteronsite.label "Malebligi ĉi tiun filtrilon sur ?1?">
+<!ENTITY detached.title "Adblock Plus: Blokeblaj elementoj (malligitaj)">
+<!ENTITY docDomain.firstParty "(de unua liveranto)">
+<!ENTITY tooltip.type.whitelisted "(en blanka listo)">
+<!ENTITY tooltip.filter.label "Efika filtrilo:">
+<!ENTITY tooltip.filter.disabled "(malebligita)">
+<!ENTITY context.editfilter.label "Redakti efikan filtrilon">
+<!ENTITY tooltip.type.blocked "(blokita)">
+<!ENTITY size.label "Grandeco">
+<!ENTITY context.whitelist.label "Aldoni esceptoregulon por elemento">
+<!ENTITY context.selectAll.label "Elekti ĉion">
+<!ENTITY state.label "Stato">
+<!ENTITY docDomain.label "Fonto de la dokumento">
+<!ENTITY tooltip.address.label "Adreso:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/subscriptionSelection.dtd
new file mode 100644
index 0000000..b28ca3b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eo/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "AnkaÅ­ aldoni &amp;filtrilabonon &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plus malsukcesis akiri la liston de abonoj.">
+<!ENTITY list.download.retry "AnkoraÅ­foje provi">
+<!ENTITY title.label "&amp;Titolo de la abono:">
+<!ENTITY list.download.website "Rigardi retejon">
+<!ENTITY supplementMessage "Ĉi tiu filtrilabono estu uzata kun la filtrilabono &quot;?1?&quot;, kiun vi ankoraŭ ne uzas.">
+<!ENTITY viewList.label "Rigardi filtrilojn">
+<!ENTITY visitHomepage.label "Viziti hejmpaÄon">
+<!ENTITY addSubscription.label "Redakti abonon">
+<!ENTITY dialog.title "Aldoni filtrilabonon de Adblock Plus">
+<!ENTITY location.label "&amp;Loko de la listo de filtriloj:">
+<!ENTITY fromWeb.description "Bonvolu konfirmi, ke vi volas aldoni ĉi tiun filtrilabonon. Vi povas ÅanÄi la abonan titolon aÅ­ lokon antaÅ­ ol vi aldonas Äin.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/composer.dtd
new file mode 100644
index 0000000..935f034
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "al &amp;final de la dirección">
+<!ENTITY domainRestriction.label "Restringir al d&amp;ominio:">
+<!ENTITY collapse.default.no.label "Usar predeterminado (no)">
+<!ENTITY firstParty.label "Solamente pe&amp;rsonal">
+<!ENTITY preferences.label "&amp;Mostrar filtros existentes…">
+<!ENTITY pattern.label "Buscar patrón">
+<!ENTITY thirdParty.label "Solamen&amp;te de terceros">
+<!ENTITY filter.label "Nuevo fi&amp;ltro:">
+<!ENTITY collapse.label "&amp;Colapsar los bloqueados:">
+<!ENTITY match.warning "El patrón que ingresaste no coincide más con la dirección bloqueada o segura, y no surtirá ningún efecto.">
+<!ENTITY anchor.start.label "al com&amp;ienzo de la dirección">
+<!ENTITY matchCase.label "Coincidir m&amp;ayúsculas">
+<!ENTITY custom.pattern.label "&amp;Personalizado:">
+<!ENTITY unselectAllTypes.label "No seleccionar nada">
+<!ENTITY type.whitelist.label "Regla de &amp;excepción">
+<!ENTITY regexp.warning "El patrón que ingresés será interpretado como una expresión constante. Demasiadas expresiones constantes podrían ralentizar tu navegación web. Si no preferís usar expresiones constantes, agregá un asterisco (&quot;*&quot;) al final del patrón.">
+<!ENTITY dialog.title "Agregar regla de filtro de Adblock Plus">
+<!ENTITY basic.label "Vista básica">
+<!ENTITY type.filter.label "Filtros de &amp;bloqueo">
+<!ENTITY types.label "Aplicar a tipos:">
+<!ENTITY shortpattern.warning "El patrón que ingresaste es demasiado corto para poder ser optimizado. Varios patrones similares podrían ralentizar tu navegación web. Te recomendamos que elijás una cadena más larga para este filtro.">
+<!ENTITY collapse.yes.label "Sí">
+<!ENTITY anchors.label "Aceptar solamente patrón:">
+<!ENTITY collapse.default.yes.label "Usar predeterminado (sí)">
+<!ENTITY domainRestriction.help "Especificá uno o más dominios, separados por el símbolo tubería &quot;|&quot;, así el filtro se aplica solamente sobre estos dominios. El símbolo ñuflo &quot;~&quot; adelante de un nombre de dominio significa que el filtro no se aplicaría sobre ese dominio.">
+<!ENTITY accept.label "Agregar filtro">
+<!ENTITY options.label "Opciones">
+<!ENTITY disabled.warning "Adblock Plus está deshabilitado. Podés seguir agregando filtros, pero no se aplicarán hasta que no actives los [link]filtros de Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "al comienzo del nombre de &amp;dominio">
+<!ENTITY collapse.no.label "No">
+<!ENTITY selectAllTypes.label "Seleccionar todo">
+<!ENTITY advanced.label "Vista avanzada">
+<!ENTITY pattern.explanation "El patrón puede ser cualquier parte de la dirección. El asterisco (&quot;*&quot;) funciona como un comodín. El filtro sólo será aplicado a aquellas direcciones que coincidan con el patrón.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/filters.dtd
new file mode 100644
index 0000000..4c0cf83
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Todos tus filtros personalizados serán reemplazados por los contenidos del archivo seleccionado. ¿Querés continuar?">
+<!ENTITY slow.column "Filtros &amp;lentos">
+<!ENTITY enabled.column "Ha&amp;bilitado">
+<!ENTITY subscription.lastDownload.checksumMismatch "Falló, el archivo de suma de comprobación no coincide">
+<!ENTITY noFiltersInGroup.text "El grupo seleccionado está vacío.">
+<!ENTITY subscription.actions.label "Acciones">
+<!ENTITY filter.selectAll.label "Seleccionar todo">
+<!ENTITY backupButton.label "Resg&amp;uardar y restaurar">
+<!ENTITY restore.minVersion.warning "ADVERTENCIA: este archivo fue creado por una versión más reciente de Adblock Plus. Deberías actualizarte a la última versión de Adblock Plus antes de restaurar este archivo.">
+<!ENTITY restore.error "No se pudo procesar los datos del archivo. ¿Este es un archivo de resguardo de Adblock Plus?">
+<!ENTITY sort.ascending.label "Ordenar de la &quot;&amp;A&quot; a la &quot;Z&quot;">
+<!ENTITY sort.label "&amp;Ordenar por">
+<!ENTITY subscription.source.label "Lista de filtros">
+<!ENTITY hitcount.column "V&amp;eces usado">
+<!ENTITY noFilters.text "Todavía no tenés ningún filtro personalizado.">
+<!ENTITY backup.custom.title "Solamente filtros personalizados">
+<!ENTITY subscription.external.label "Actualizado por otra extensión">
+<!ENTITY subscription.delete.label "Eliminar">
+<!ENTITY noGroupSelected.text "Necesitás seleccionar un grupo de filtros antes de que sus filtros puedan ser visualizados.">
+<!ENTITY filter.cut.label "Cortar">
+<!ENTITY restore.default.label "¿Restaurar resguardo de ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Descargando…">
+<!ENTITY subscriptions.tab.label "Suscripciones de filtro">
+<!ENTITY sort.descending.label "Ordenar de la &quot;&amp;Z&quot; a la &quot;A&quot;">
+<!ENTITY filters.remove.warning "¿Estás seguro que querés quitar todos los filtros seleccionados?">
+<!ENTITY filter.delete.label "Eliminar">
+<!ENTITY addSubscriptionAdd.label "Agregar">
+<!ENTITY viewMenu.label "Ver">
+<!ENTITY subscription.lastDownload.unknown "No disponible">
+<!ENTITY addSubscriptionCancel.label "Cancelar">
+<!ENTITY subscription.enabled.label "Habilitado">
+<!ENTITY noSubscriptions.text "Todavía no agregaste ninguna suscripción de filtro. Adblock Plus no bloqueará nada sin filtros. Por favor, andá a &quot;Agregar suscripción de filtro&quot; para agregar alguno.">
+<!ENTITY subscription.update.label "Actualizar filtros">
+<!ENTITY dialog.title "Preferencia de filtro de Adblock Plus">
+<!ENTITY addFilter.label "&amp;Agregar filtro">
+<!ENTITY subscription.minVersion.warning "Esta suscripción de filtro necesita de una versión más reciente de Adblock Plus. Deberías actualizar a la última versión de Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Falló, no es una dirección válida">
+<!ENTITY backup.error "Hubo un error al escribir filtros al archivo. Asegurate de que el archivo no esté protegido contra escritura o siendo usado por otro programa.">
+<!ENTITY filter.moveUp.label "Subir">
+<!ENTITY addGroup.label "Agregar &amp;grupo de filtros">
+<!ENTITY filter.edit.label "Editar">
+<!ENTITY subscription.showHideFilters.label "Mostrar/ocultar filtros">
+<!ENTITY acceptableAds2.label "Permitir publicidad no &amp;hostigadora">
+<!ENTITY addSubscriptionOther.label "Agregar un filtro de suscripción">
+<!ENTITY close.label "Cerrar">
+<!ENTITY sort.none.label "Sin or&amp;denar">
+<!ENTITY filter.actions.label "Acciones de filtro">
+<!ENTITY filter.copy.label "Copiar">
+<!ENTITY filter.moveDown.label "Bajar">
+<!ENTITY filter.resetHitCounts.label "Restablecer estadísticas de uso">
+<!ENTITY readMore.label "Leer más">
+<!ENTITY subscription.moveUp.label "Subir">
+<!ENTITY addSubscription.label "Agregar suscri&amp;pción de filtros">
+<!ENTITY subscription.homepage.label "Página principal">
+<!ENTITY backup.complete.title "Todos los filtros y suscripciones">
+<!ENTITY restore.own.label "Restaurar tu propio resguardo">
+<!ENTITY restore.complete.warning "Todas tus preferencias de filtros serán reemplazadas por los contenidos del archivo seleccionado. ¿Querés continuar?">
+<!ENTITY filters.tab.label "Filtros personalizados">
+<!ENTITY backup.label "Crear nuevo resguardo">
+<!ENTITY find.label "Bus&amp;car">
+<!ENTITY subscription.moveDown.label "Bajar">
+<!ENTITY subscription.lastDownload.connectionError "Falló, error en la descarga">
+<!ENTITY subscription.lastDownload.success "Se realizó exitosamente">
+<!ENTITY subscription.lastDownload.invalidData "Falló, no es una lista de filtros válida">
+<!ENTITY filter.paste.label "Pegar">
+<!ENTITY subscription.disabledFilters.enable "Habilitar filtros deshabilitados">
+<!ENTITY lasthit.column "Úl&amp;tima vez usado">
+<!ENTITY subscription.editTitle.label "Editar título">
+<!ENTITY subscription.disabledFilters.warning "Algunos filtros en esta suscripción están deshabilitados.">
+<!ENTITY filter.column "&amp;Regla de filtro">
+<!ENTITY subscription.lastDownload.label "Última descarga:">
+<!ENTITY viewList.label "Ver lista">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/firstRun.properties
new file mode 100644
index 0000000..3973073
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Navegá privadamente deshabilitando el rastreo; esto es: ocultarle a las agencias de publicidad tus visitas, las cuales, de otro modo, registrarían todos tus movimientos.
+firstRun_toggle_off=DESACTIVAR
+firstRun_feature_tracking=Deshabilitá el rastreo
+firstRun_feature_malware=Bloqueá malware
+firstRun_title=Se instaló Adblock Plus
+firstRun_toggle_on=ACTIVAR
+firstRun_acceptableAdsExplanation=Nos gustaría alentar a que los sitios web usen publicidad más directa y menos hostigadora. Es por eso que establecimos unas <a>pautas estrictas</a> para identificar publicidades aceptables, las cuales se muestran en la configuración predeterminada. Si aún así querés seguir bloqueando todas las publicidades, podés <a>deshabilitar</a> esto en segundos.
+firstRun_contributor_credits=Créditos
+firstRun_dataCorruptionWarning=¿Sigue apareciendo esta página? <a>¡Hacé clic acá!</a>
+firstRun_acceptableAdsHeadline=Las molestas publicidades ahora serán bloqueadas
+firstRun_share=Contáselo a tus amigos
+firstRun_share_headline=<a>Danos una mano</a> para hacer de la web un lugar mejor
+firstRun_feature_social_description=Deshacé automáticamente, en tu experiencia al navegar, botones de medios sociales, como el "Me gusta" de Facebook, el cual aparece en miles de páginas web y rastrean tu comportamiento.
+firstRun_filterlistsReinitializedWarning=Parece que hay un problema que causa que todos los filtros se quiten y que no se pueda restaurar desde una copia de seguridad. Por lo tanto tuvimos que restablecer tus filtros y la configuración de publicidades aceptadas. Por favor, revisá tus listas de filtros y la configuración de publicidades aceptadas en las <a>opciones de Adblock Plus</a>.
+firstRun_feature_malware_description=Hacé tu navegación web más segura bloqueando dominios identificados como malware.
+firstRun_features=Adblock Plus puede bloquear más que publicidades
+firstRun_donate=doná
+firstRun_donate_label=Apoyá nuestro proyecto
+firstRun_feature_social=Quitá botones de redes sociales
+firstRun_legacySafariWarning=Estás usando una versión vieja de Safari, la cual no soporta Adblock Plus. Puede que no funcione correctamente o que perjudique la experiencia del usuario en algunos sitios web. Te recomendamos encarecidamente que, o bien actualicés a Safari 6.1. o más reciente (en Mac OS X 10.8 Mountain Lion), o Safari 7.0.1 o más reciente (en Mac OS X 10.9 Mavericks), o bien usés la última versión de Mozilla Firefox, Google Chrome u Opera.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/global.properties
new file mode 100644
index 0000000..fb119dc
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=No hay elementos bloqueables en la página actual
+action3_tooltip=Clic para habilitar/deshabilitar Adblock Plus.
+notification_antiadblock_title=¿Ocultar mensajes de usuario?
+type_label_script=script
+filter_elemhide_nocriteria=No se especificó el criterio para reconocer el elemento a ser ocultado
+blockingGroup_title=Reglas de bloqueo de publicidad
+whitelisted_tooltip=Adblock Plus está deshabilitado en la página actual.
+type_label_stylesheet=hoja de estilo
+blocked_count_tooltip=?1? de un total de ?2?
+type_label_font=tipografía
+type_label_popup=ventana emergente
+filter_regexp_tooltip=Este filtro, o bien es una expresión constante, o bien es demasiado corto para ser optimizado. Demasiados filtros similares podrían ralentizar tu navegación web.
+action0_tooltip=Clic para ver el menú contextual, clic con el botón del medio para habilitarlo/deshabilitarlo.
+whitelisted_page=Adblock Plus fue deshabilitado para la página actual
+remove_group_warning=¿Estás seguro que querés quitar este grupo?
+action1_tooltip=Clic para abrir/cerrar los elementos bloqueables, clic con el botón del medio para habilitarlos/deshabilitarlos.
+type_label_xmlhttprequest=petición XML
+active_tooltip=Adblock Plus está activo. En uso: ?1? suscripción/es de filtros y ?2? filtro/s personalizado/s.
+type_label_document=documento
+type_label_object_subrequest=subpetición de objeto
+whitelistGroup_title=Reglas de excepción
+disabled_tooltip=Adblock Plus está deshabilitado.
+filter_elemhide_duplicate_id=Se puede especificar solamente un identificador del elemento a ser ocultado.
+type_label_object=objeto
+action2_tooltip=Clic para abrir el menú de preferencias, clic con el botón del medio para habilitarlo/deshabilitarlo.
+type_label_subdocument=marco
+clearStats_warning=Esto restablecerá todas las estadísticas de conteo y las deshabilitará. ¿Querés continuar?
+notification_antiadblock_message=Este sitio web es conocido por mostrar mensajes a los usuarios de Adblock Plus. ¿Querés que Adblock Plus los oculte?
+blocked_count_addendum=(también en la lista segura: ?1?, ocultos: ?2?)
+subscription_invalid_location=La ubicación de lista de filtros no es válida, o no es válido el nombre de archivo.
+type_label_image=imagen
+remove_subscription_warning=¿Estás seguro que querés quitar esta suscripción?
+type_label_other=otro
+mobile_menu_enable=ABP: Habilitar
+type_label_media=audio/video
+mobile_menu_disable_site=ABP: Deshabilitar en ?1?
+elemhideGroup_title=Reglas de elementos colapsados
+mobile_menu_enable_site=ABP: Habilitar en ?1?
+type_label_elemhide=oculto
+newGroup_title=Nuevo grupo de filtros
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/overlay.dtd
new file mode 100644
index 0000000..1ba864e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Sí">
+<!ENTITY notification.button.no "&amp;No">
+<!ENTITY sync.label "Si&amp;ncronizar la configuración de Adblock Plus">
+<!ENTITY whitelist.site.label "Deshabilitar en ?1?">
+<!ENTITY filters.label "P&amp;referencias de filtro">
+<!ENTITY disable.label "Deshabilitar en todos lados">
+<!ENTITY objecttab.title "Bloquear">
+<!ENTITY objecttab.tooltip "Hacé clic acá para bloquear este objeto con Adblock Plus">
+<!ENTITY menuitem.label "&amp;Preferencias de Adblock Plus">
+<!ENTITY objecttabs.label "Mostrar pe&amp;stañas en Flash y Java">
+<!ENTITY sendReport.label "&amp;Informar de problemas en esta página">
+<!ENTITY whitelist.page.label "Deshabilitar solamente en esta página">
+<!ENTITY context.image.label "Adblock Plus: bloquear imagen">
+<!ENTITY counthits.label "&amp;Veces usado">
+<!ENTITY opensidebar.label "&amp;Abrir elementos bloqueables">
+<!ENTITY notification.button.close "&amp;Cerrar">
+<!ENTITY contribute.label "Contribuí a Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: bloquear marco">
+<!ENTITY blocked.tooltip "Elementos bloqueados en esta página:">
+<!ENTITY hideplaceholders.label "Co&amp;lapsar elementos bloqueados">
+<!ENTITY showinstatusbar.label "Mostrar en la barra de &amp;estado">
+<!ENTITY sidebar.title "Elementos bloqueables en la página actual">
+<!ENTITY options.label "&amp;Opciones">
+<!ENTITY context.object.label "Adblock Plus: bloquear objeto">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: rehabilitar en esta página">
+<!ENTITY filters.tooltip "Filtros más activos:">
+<!ENTITY closesidebar.label "&amp;Cerrar elementos bloqueables">
+<!ENTITY showintoolbar.label "Mostrar en la barra de &amp;herramientas">
+<!ENTITY status.tooltip "Estado:">
+<!ENTITY context.media.label "Adblock Plus: bloquear audio/video">
+<!ENTITY subscription.update.label "Actualizar filtros">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/sendReport.dtd
new file mode 100644
index 0000000..cda41df
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Deshacer">
+<!ENTITY issues.disabledgroups.description "Las siguientes suscripciones de filtros / grupos de filtros están deshabilitados, aunque aún podrían tener algún efecto sobre esta página web:">
+<!ENTITY showData.label "Mostrar datos del informe">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus bloquea &amp;demasiado">
+<!ENTITY issues.change.description "Tu configuración cambió. Por favor, recargá la página para probar los cambios y enviar el informe si el problema no se resolvió después de estos cambios.">
+<!ENTITY email.label "Dirección de correo e&amp;lectrónico:">
+<!ENTITY issues.openPreferences.label "Abrir preferencias de filtros">
+<!ENTITY sendPage.confirmation "Tu informe se guardó exitosamente. Podés acceder al mismo desde esta dirección:">
+<!ENTITY copyLink.label "Cop&amp;iar enlace del informe">
+<!ENTITY issues.nofilters.description "Adblock Plus no está bloqueando nada de la página actual. Este problema específico probablemente no tenga que ver con Adblock Plus.">
+<!ENTITY sendPage.knownIssue "El problema que enviaste probablemente es un inconveniente ya informado. Más información:">
+<!ENTITY typeSelector.other.description "Seleccioná esta opción si pensás que el problema está relacionado más con Adblock Plus mismo que con sus filtros.">
+<!ENTITY issues.disabledgroups.enable.label "Habilitar suscripción de filtro / grupo de filtro">
+<!ENTITY typeWarning.override.label "Lo &amp;entiendo, y quiero enviar el informe de todas maneras">
+<!ENTITY issues.disabled.enable.label "Habilitar Adblock Plus">
+<!ENTITY update.fixed.description "Las actualizaciones a tus suscripciones de filtros probablemente resolvieron el problema que informaste. Por favor, recargá la página y reintentá. Hacé clic en &quot;Informar&quot; si el problema persiste.">
+<!ENTITY anonymous.label "Envío a&amp;nónimo">
+<!ENTITY reloadButton.label "&amp;Recargar la página">
+<!ENTITY recentReports.clear.label "&amp;Quitar todos los informes">
+<!ENTITY typeSelector.description "Esta ventana te va a guiar a través de los pasos necesarios para el envío de informes de problemas de Adblock Plus. Por favor, primero elegí el tipo de problema que estás experimentando en esta página web:">
+<!ENTITY screenshot.remove.label "Q&amp;uitar datos sensibles">
+<!ENTITY issues.ownfilters.description "Algunos de los filtros aplicados en esta página están definidos por el usuario. Por favor, deshabilitá los filtros que podrían causar el inconveniente:">
+<!ENTITY update.inProgress.description "Adblock Plus necesita actualizar tus suscripciones de filtros para asegurarse de que el problema no ha sido solucionado aún. Por favor, esperá…">
+<!ENTITY sendPage.retry.label "Enviar de nuevo">
+<!ENTITY data.label "Datos del &amp;informe:">
+<!ENTITY recentReports.label "Tus informes enviados recientemente">
+<!ENTITY typeWarning.description "Indicaste que querés informar de un problema general de Adblock Plus mismo más que un problema con los filtros. Por favor, tené en cuenta que tal clase de problemas se informan de mejor modo en el [link]foro de Adblock Plus[/link]. Deberías usar el informe de problemas solamente para complementar un debate existente, ya que nadie sabrá de tu informe, a menos que les ofrezcas el enlace hacia el mismo. El enlace generado automáticamente será otorgado luego de enviar el informe.">
+<!ENTITY issues.disabled.description "Adblock Plus se encuentra deshabilitado, no bloqueará nada en este estado actual.">
+<!ENTITY attachExtensions.label "Adjuntá una lista de las e&amp;xtensiones activas al informe, en caso de que sea alguno de los complementos el causante del problema">
+<!ENTITY issues.nosubscriptions.add.label "Agregar suscripción de filtro">
+<!ENTITY issues.disabledfilters.enable.label "Habilitar filtro">
+<!ENTITY issues.override.label "La &amp;configuración es correcta, podés continuar con el informe">
+<!ENTITY issues.nosubscriptions.description "Parece que no estás suscripto a ninguna de las listas de filtro preestablecidas que automáticamente quita contenido no deseado de sitios web.">
+<!ENTITY typeSelector.falsePositive.description "Seleccioná esta opción si falta contenido importante, si la página se visualiza incorrectamente o si no funciona apropiadamente. Podés determinar si Adblock Plus es el causante del problema, deshabilitándolo temporalmente.">
+<!ENTITY typeSelector.other.label "&amp;Otro problema">
+<!ENTITY emailComment.label "Te alentamos a que ingresés una dirección válida de correo electrónico, así podemos contactarte si tenemos dudas sobre tu informe. También nos permitirá reconocer tus contribuciones y priorizarlas por sobre el resto.">
+<!ENTITY issues.whitelist.remove.label "Rehabilitar Adblock Plus en esta página.">
+<!ENTITY outdatedSubscriptions.description "Las siguientes suscripciones de filtros no fueron actualizadas por, al menos, dos semanas. Por favor, actualizá estas suscripciones antes de enviar un informe; el problema ya podría haberse resuelto.">
+<!ENTITY dataCollector.description "Por favor, esperá unos instantes mientras Adblock Plus recolecta los datos requeridos.">
+<!ENTITY sendButton.label "En&amp;viar informe">
+<!ENTITY comment.label "Com&amp;entarios (opcional):">
+<!ENTITY sendPage.errorMessage "Se intentó enviar el reporte, pero falló y devolvió un error de código &quot;?1?&quot;. Por favor, asegurate que estás conectado a Internet e intentá nuevamente. Si el problema persiste, por favor, pedí ayuda en el [link]foro de Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Mostrar informes enviados recientemente">
+<!ENTITY commentPage.heading "Ingresar comentarios">
+<!ENTITY update.start.label "Comenzar con la actualización ahora">
+<!ENTITY issues.disabledfilters.description "Los siguientes filtros están deshabilitados, aunque aún podrían tener algún efecto sobre esta página web:">
+<!ENTITY screenshot.description "La misma página web puede lucir diferente para distintas personas. Si adjuntás una captura de pantalla a tu informe, nos sería de mucha ayuda para entender el inconveniente. Por supuesto, podés quitar fragmentos conteniendo información sensible, así como marcar áreas en donde el problema es más explícito. Para hacer eso, hacé clic en el botón correspondiente y seleccioná un fragmento de la imagen con el mouse.">
+<!ENTITY screenshot.attach.label "&amp;Adjuntar al informe una captura de la página web">
+<!ENTITY issues.whitelist.description "Adblock Plus se encuentra deshabilitado en la página que estás informando. Por favor, rehabilitalo y recargá la página antes de enviar el informe para colaborar con la investigación de este problema.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus no bloquea una &amp;publicidad">
+<!ENTITY typeSelector.heading "Seleccioná el tipo de problema">
+<!ENTITY anonymity.warning "No podremos contactarte y tu informe seguramente tendrá poca prioridad.">
+<!ENTITY wizard.title "Informe de problemas">
+<!ENTITY issues.ownfilters.disable.label "Deshabilitar filtro">
+<!ENTITY commentPage.description "El campo de texto, debajo, te permite ingresar algún comentario para ayudarnos a entender el problema. Este paso es opcional, pero encarecidamente recomendado si el problema no resulta tan obvio. También podés revisar los datos del informe antes de enviarlo.">
+<!ENTITY comment.lengthWarning "La longitud de tu comentario excede los 1.000 caracteres. Sólo los primeros 1.000 caracteres serán enviados.">
+<!ENTITY typeSelector.falseNegative.description "Seleccioná esta opción si una publicidad es mostrada, estando Adblock Plus habilitado.">
+<!ENTITY sendPage.waitMessage "Por favor, esperá mientras Adblock Plus envía tu informe.">
+<!ENTITY dataCollector.heading "Bienvenido al informe de problemas">
+<!ENTITY screenshot.heading "Adjuntar captura">
+<!ENTITY sendPage.heading "Enviar informe">
+<!ENTITY issues.subscriptionCount.description "Parece que estás suscripto a demasiadas suscripciones de filtros. Esta configuración no es recomendada, ya que potenciará sobre manera la aparición de problemas. Tampoco podemos aceptar tu reporte por inconvenientes, porque no quedaría claro qué autor de todos esos filtros es el que debe corregir algo. Por favor, quitá todas las suscripciones de filtros, dejando sólo las que considerés elementales, y luego fijate si el problema continúa.">
+<!ENTITY screenshot.mark.label "&amp;Marcar el problema">
+<!ENTITY privacyPolicy.label "Política de privacidad">
+<!ENTITY issues.description "Adblock Plus detectó problemas con tu configuración, la cual podría ser la causante de este inconveniente.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/sidebar.dtd
new file mode 100644
index 0000000..4648a04
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Bordes de los elementos Flash">
+<!ENTITY address.label "Dirección">
+<!ENTITY context.open.label "Abrir en nueva pestaña">
+<!ENTITY type.label "Tipo">
+<!ENTITY tooltip.filterSource.label "Fuente del filtro">
+<!ENTITY noitems.label "Sin elementos bloqueables">
+<!ENTITY filter.label "Filtro">
+<!ENTITY tooltip.size.label "Tamaño:">
+<!ENTITY reattach.label "Rejuntar">
+<!ENTITY search.label "&amp;Buscar:">
+<!ENTITY docDomain.thirdParty "(de terceros)">
+<!ENTITY filterSource.label "Fuente de filtro">
+<!ENTITY tooltip.docDomain.label "Fuente del documento:">
+<!ENTITY context.copy.label "Copiar dirección del elemento">
+<!ENTITY tooltip.type.label "Tipo:">
+<!ENTITY context.disablefilter.label "Deshabilitar filtro ?1?">
+<!ENTITY context.copyFilter.label "Copiar filtro">
+<!ENTITY context.block.label "Bloquear este elemento">
+<!ENTITY context.enablefilter.label "Rehabilitar filtro ?1?">
+<!ENTITY detach.label "Separar">
+<!ENTITY whitelisted.label "Página segura">
+<!ENTITY context.disablefilteronsite.label "Deshabilitar este filtro en ?1?">
+<!ENTITY detached.title "Adblock Plus: elementos bloqueables (separados)">
+<!ENTITY docDomain.firstParty "(personal)">
+<!ENTITY tooltip.type.whitelisted "(segura)">
+<!ENTITY tooltip.filter.label "Filtro en efecto:">
+<!ENTITY tooltip.filter.disabled "(deshabilitado)">
+<!ENTITY context.editfilter.label "Editar filtro en efecto">
+<!ENTITY tooltip.type.blocked "(bloqueada)">
+<!ENTITY size.label "Tamaño">
+<!ENTITY context.whitelist.label "Agregar regla de excepción por elemento">
+<!ENTITY context.selectAll.label "Seleccionar todo">
+<!ENTITY state.label "Estado">
+<!ENTITY docDomain.label "Fuente del documento">
+<!ENTITY tooltip.address.label "Dirección:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/subscriptionSelection.dtd
new file mode 100644
index 0000000..099f80a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-AR/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Agregá también la suscripción de filtros &quot;?1?&quot;.">
+<!ENTITY list.download.failed "Hubo un error al recuperar la lista de suscripciones.">
+<!ENTITY list.download.retry "Intentar de nuevo">
+<!ENTITY title.label "&amp;Título de suscripción:">
+<!ENTITY list.download.website "Ver sitio web">
+<!ENTITY supplementMessage "Esta suscripción está diseñada para ser usada conjuntamente con la suscripción de filtros &quot;?1?&quot;, que aún no agregaste.">
+<!ENTITY viewList.label "Ver filtros">
+<!ENTITY visitHomepage.label "Visitar la página oficial">
+<!ENTITY addSubscription.label "Agregar suscripción">
+<!ENTITY dialog.title "Agregar suscripción de filtro de Adblock Plus">
+<!ENTITY location.label "&amp;Ubicación de la lista de filtros:">
+<!ENTITY fromWeb.description "Por favor, confirmá que querés agregar esta suscripción de filtros. Podés cambiar el título de la suscripción o la ubicación antes de agregarla.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/composer.dtd
new file mode 100644
index 0000000..1785209
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "al &amp;final de la dirección">
+<!ENTITY domainRestriction.label "&amp;Restringir al dominio:">
+<!ENTITY collapse.default.no.label "Usar predeterminado (no)">
+<!ENTITY firstParty.label "Sólo para conteni&amp;dos del dominio">
+<!ENTITY preferences.label "&amp;Mostrar filtros existentes…">
+<!ENTITY pattern.label "Buscar patrón">
+<!ENTITY thirdParty.label "Sólo para con&amp;tenidos de terceros">
+<!ENTITY filter.label "&amp;Nuevo filtro:">
+<!ENTITY collapse.label "C&amp;olapsar elementos bloqueados:">
+<!ENTITY match.warning "El patrón introducido no coincide con la dirección a bloquear o incluir en la lista blanca, y no tendrá ningún efecto sobre ella.">
+<!ENTITY anchor.start.label "al &amp;inicio de la dirección">
+<!ENTITY matchCase.label "&amp;Coincidir MAY/minús">
+<!ENTITY custom.pattern.label "&amp;Personalizar:">
+<!ENTITY unselectAllTypes.label "No seleccionar ninguno">
+<!ENTITY type.whitelist.label "Regla de e&amp;xcepción">
+<!ENTITY regexp.warning "El patrón que ha introducido se interpretará como expresión regular. Si usa muchas expresiones regulares su navegación podría volverse más lenta. Si no quería usar una expresión regular, añada un carácter &quot;*&quot; al final del patrón.">
+<!ENTITY dialog.title "Añadir regla de filtrado de Adblock Plus">
+<!ENTITY basic.label "Vista básica">
+<!ENTITY type.filter.label "Filtro de &amp;bloqueo">
+<!ENTITY types.label "Aplicar a estos tipos:">
+<!ENTITY shortpattern.warning "El patrón que ha introducido es demasiado corto para ser optimizado, si usa muchos patrones como este su navegación podría volverse más lenta. Le recomendamos elegir una cadena más larga para este filtro.">
+<!ENTITY collapse.yes.label "Sí">
+<!ENTITY anchors.label "Sólo aceptar patrones:">
+<!ENTITY collapse.default.yes.label "Usar predeterminado (sí)">
+<!ENTITY domainRestriction.help "Si especifica uno o varios dominios separados por el símbolo &quot;|&quot;, el filtro sólo se aplicará a dichos dominios. El símbolo &quot;~&quot; antes del nombre de un dominio indica que el filtro no se aplicará en ese dominio.">
+<!ENTITY accept.label "Añadir filtro">
+<!ENTITY options.label "Opciones">
+<!ENTITY disabled.warning "Adblock Plus está desactivado. Puede añadir filtros, pero no se aplicarán a menos que [link]active Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "al &amp;inicio del nombre de dominio">
+<!ENTITY collapse.no.label "No">
+<!ENTITY selectAllTypes.label "Seleccionar todos">
+<!ENTITY advanced.label "Vista avanzada">
+<!ENTITY pattern.explanation "El patrón puede ser cualquier parte de la dirección, el carácter &quot;*&quot; actúa como comodín. El filtro sólo se aplicará a las direcciones que se correspondan con el patrón.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/filters.dtd
new file mode 100644
index 0000000..27f587b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Todas sus filtros personalizados se sustituirán por los contenidos del archivo seleccionado ¿Desea continuar?">
+<!ENTITY slow.column "Filtros l&amp;entos">
+<!ENTITY enabled.column "Acti&amp;vado">
+<!ENTITY subscription.lastDownload.checksumMismatch "Error, el checksum no coincide">
+<!ENTITY noFiltersInGroup.text "El grupo seleccionado está vacío">
+<!ENTITY subscription.actions.label "Acciones">
+<!ENTITY filter.selectAll.label "Seleccionar todos">
+<!ENTITY backupButton.label "&amp;Copias de seguridad y restauración">
+<!ENTITY restore.minVersion.warning "Atención: el archivo se creó con una versión más reciente de Adblock Plus. Debería actualizar a la última versión de Adblock Plus antes de hacer una restauración desde este archivo.">
+<!ENTITY restore.error "No se pudieron procesar los datos del archivo. ¿Es posible que no sea un archivo de copia de seguridad de Adblock Plus?">
+<!ENTITY sort.ascending.label "Ordenar &amp;A &gt; Z">
+<!ENTITY sort.label "&amp;Listar">
+<!ENTITY subscription.source.label "Lista de filtros">
+<!ENTITY hitcount.column "&amp;Contador">
+<!ENTITY noFilters.text "Aún no tiene filtros personalizados.">
+<!ENTITY backup.custom.title "Sólo los filtros personalizados">
+<!ENTITY subscription.external.label "Actualizado por otra extensión">
+<!ENTITY subscription.delete.label "Eliminar">
+<!ENTITY noGroupSelected.text "Tiene que seleccionar un grupo de filtros para que se muestren sus filtros.">
+<!ENTITY filter.cut.label "Cortar">
+<!ENTITY restore.default.label "Restaurar copia de seguridad de ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Descargando…">
+<!ENTITY subscriptions.tab.label "Suscripciones de filtros">
+<!ENTITY sort.descending.label "Ordenar &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "¿Está seguro de querer eliminar todos los filtros seleccionados?">
+<!ENTITY filter.delete.label "Eliminar">
+<!ENTITY addSubscriptionAdd.label "Añadir">
+<!ENTITY viewMenu.label "Ver">
+<!ENTITY subscription.lastDownload.unknown "N/D">
+<!ENTITY addSubscriptionCancel.label "Cancelar">
+<!ENTITY subscription.enabled.label "Activada">
+<!ENTITY noSubscriptions.text "Aún no ha añadido ninguna suscripción de filtros. Adblock Plus no bloquea nada si no tiene filtros, por favor use &quot;Añadir suscripción de filtros&quot; para añadir alguna.">
+<!ENTITY subscription.update.label "Actualizar filtros">
+<!ENTITY dialog.title "Preferencias de filtros de Adblock Plus">
+<!ENTITY addFilter.label "A&amp;ñadir filtro">
+<!ENTITY subscription.minVersion.warning "Esta suscripción de filtros necesita una versión más reciente de Adblock Plus, debería actualizar a la última versión de Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Error: dirección no válida">
+<!ENTITY backup.error "Se produjo un error al escribir filtros en el archivo. Asegúrese que el archivo no está protegido contra escritura o siendo utilizado por otra aplicación.">
+<!ENTITY filter.moveUp.label "Subir">
+<!ENTITY addGroup.label "Añadir &amp;grupo de filtros">
+<!ENTITY filter.edit.label "Editar">
+<!ENTITY subscription.showHideFilters.label "Mostrar/ocultar filtros">
+<!ENTITY acceptableAds2.label "&amp;Permitir cierta publicidad no intrusiva">
+<!ENTITY addSubscriptionOther.label "Añadir otra suscripción">
+<!ENTITY close.label "Cerrar">
+<!ENTITY sort.none.label "&amp;Sin ordenar">
+<!ENTITY filter.actions.label "Acciones de filtros">
+<!ENTITY filter.copy.label "Copiar">
+<!ENTITY filter.moveDown.label "Bajar">
+<!ENTITY filter.resetHitCounts.label "Reiniciar estadísticas de uso">
+<!ENTITY readMore.label "Leer más">
+<!ENTITY subscription.moveUp.label "Subir">
+<!ENTITY addSubscription.label "Añadir &amp;suscripción de filtros">
+<!ENTITY subscription.homepage.label "Página de inicio">
+<!ENTITY backup.complete.title "Todos los filtros y suscripciones">
+<!ENTITY restore.own.label "Restaurar copia de seguridad propia">
+<!ENTITY restore.complete.warning "Todas sus preferencias de filtros se sustituirán por los contenidos del archivo seleccionado ¿Desea continuar?">
+<!ENTITY filters.tab.label "Filtros personalizados">
+<!ENTITY backup.label "Crear nueva copia de seguridad">
+<!ENTITY find.label "&amp;Buscar">
+<!ENTITY subscription.moveDown.label "Bajar">
+<!ENTITY subscription.lastDownload.connectionError "Error: error de descarga">
+<!ENTITY subscription.lastDownload.success "Correcto">
+<!ENTITY subscription.lastDownload.invalidData "Error: lista de filtros no válida">
+<!ENTITY filter.paste.label "Pegar">
+<!ENTITY subscription.disabledFilters.enable "Activar filtros desactivados">
+<!ENTITY lasthit.column "Último &amp;uso">
+<!ENTITY subscription.editTitle.label "Editar título">
+<!ENTITY subscription.disabledFilters.warning "En esta suscripción hay filtros desactivados.">
+<!ENTITY filter.column "&amp;Regla de filtrado">
+<!ENTITY subscription.lastDownload.label "Última descarga:">
+<!ENTITY viewList.label "Ver lista">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/firstRun.properties
new file mode 100644
index 0000000..83ba3ff
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Navegue con intimidad desactivando el rastreo - ocultando su rastro a las empresas de publicidad que espían cada uno de sus movimientos.
+firstRun_toggle_off=DESACTIVAR
+firstRun_feature_tracking=Desactivar el rastreo
+firstRun_feature_malware=Bloquear malware
+firstRun_title=Se ha instalado Adblock Plus
+firstRun_toggle_on=ACTIVAR
+firstRun_acceptableAdsExplanation=Nos gustaría fomentar el uso de una publicidad más directa y menos agresiva en los sitios web. Por eso hemos establecido unas <a>directrices estrictas</a> para identificar la publicidad aceptable, que se muestra en modo predeterminado. Si sigue queriendo bloquear toda la publicidad puede <a>desactivar</a> este modo en unos pocos segundos.
+firstRun_contributor_credits=Colaboradores
+firstRun_dataCorruptionWarning=¿Sigue apareciendo esta página? <a>Pulse aquí</a>
+firstRun_acceptableAdsHeadline=Ahora se bloqueará la publicidad molesta
+firstRun_share=Dígaselo a sus amigos
+firstRun_share_headline=<a>Ayúdenos</a> a conseguir una web mejor
+firstRun_feature_social_description=Elimine automáticamente de su navegación los botones de redes sociales, como los "Me gusta" de Facebook, incluidos en las paginas web y que rastrean sus hábitos.
+firstRun_filterlistsReinitializedWarning=Parece que un problema provocó que se eliminasen todos los filtros y no se pudo restaurar una copia de seguridad. Por ello ha sido necesario reiniciar los filtros y predisposiciones de publicidad aceptable. Por favor, revise sus listas de filtros y predisposiciones de publicidad aceptable en <a>Opciones de Adblock Plus</a>.
+firstRun_feature_malware_description=Navegue con más seguridad bloqueando dominios identificados como malware.
+firstRun_features=Adblock Plus no sólo bloquea anuncios, puede hacer más cosas
+firstRun_donate=Donar
+firstRun_donate_label=Apoye nuestro proyecto
+firstRun_feature_social=Eliminar botones de redes sociales
+firstRun_legacySafariWarning=Está utilizando una versión antigua de Safari no soportada por Adblock Plus, por lo que podría funcionar incorrectamente o afectar a su experiencia de usuario en algunos sitios web. Le recomendamos actualizar a Safari 6.1.1 o posterior (para Mac OS X 10.8 Mountain Lion), o a Safari 7.0.1 o superior (para Mac OS X 10.9 Mavericks), o usar la última versión de Mozilla Firefox, Google Chrome u Opera.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/global.properties
new file mode 100644
index 0000000..f1f432e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=No hay elementos que se puedan bloquear en la página actual
+action3_tooltip=Pulse para activar/desactivar Adblock Plus.
+notification_antiadblock_title=¿Ocultar mensajes dirigidos a usuarios de Adblock Plus?
+type_label_script=script
+filter_elemhide_nocriteria=No se especificó ningún criterio para identificar el elemento a ocultar
+blockingGroup_title=Reglas de bloqueo de publicidad
+whitelisted_tooltip=Adblock Plus activado pero deshabilitado en la página actual.
+type_label_stylesheet=hoja de estilo
+blocked_count_tooltip=?1? de un total de ?2?
+type_label_font=fuente
+type_label_popup=ventana emergente
+filter_regexp_tooltip=Este filtro es una expresión regular o demasiado corto para ser optimizado. Demasiados filtros de este tipo podrían hacer más lenta su navegación.
+action0_tooltip=Pulse para abrir el menú contextual, botón central para activar/desactivar.
+whitelisted_page=Se ha deshabilitado Adblock Plus para la página actual
+remove_group_warning=¿Está seguro de querer eliminar este grupo?
+action1_tooltip=Pulse para abrir/cerrar elementos para bloquear, botón central para activar/desactivar.
+type_label_xmlhttprequest=solicitud XML
+active_tooltip=Adblock Plus activado, ?1? suscripciones de filtros y ?2? filtros personalizados en uso.
+type_label_document=documento
+type_label_object_subrequest=solicitud de objeto
+whitelistGroup_title=Reglas de excepción
+disabled_tooltip=Adblock Plus está desactivado.
+filter_elemhide_duplicate_id=Sólo puede especificarse una ID del elemento a ocultar
+type_label_object=objeto
+action2_tooltip=Pulse para abrir las preferencias, botón central para activar/desactivar.
+type_label_subdocument=marco
+clearStats_warning=Se reiniciarán todas las estadísticas de uso de filtros y se desactivarán dichas estadísticas de uso de filtros. ¿Desea continuar con la acción?
+notification_antiadblock_message=Se sabe que este sitio ha mostrado en el pasado mensajes dirigidos a los usuarios de Adblock Plus. ¿Quiere que Adblock Plus oculte esos mensajes?
+blocked_count_addendum=(en lista blanca: ?1?, ocultos: ?2?)
+subscription_invalid_location=La dirección de la lista de filtros no es una URL ni una ruta de archivo válida.
+type_label_image=imagen
+remove_subscription_warning=¿Está seguro de querer eliminar esta suscripción?
+type_label_other=otro
+mobile_menu_enable=ABP: Activar
+type_label_media=audio/vídeo
+mobile_menu_disable_site=ABP: Desactivar en ?1?
+elemhideGroup_title=Reglas de ocultación de elementos
+mobile_menu_enable_site=ABP: Activar en ?1?
+type_label_elemhide=oculto
+newGroup_title=Nuevo grupo de filtros
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/overlay.dtd
new file mode 100644
index 0000000..7820c11
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp; Sí">
+<!ENTITY notification.button.no "&amp; No">
+<!ENTITY sync.label "Sincroni&amp;zar predisposiciones de Adblock Plus">
+<!ENTITY whitelist.site.label "Desactivar en ?1?">
+<!ENTITY filters.label "&amp;Preferencias de filtros">
+<!ENTITY disable.label "Desactivar globalmente">
+<!ENTITY objecttab.title "Bloquear">
+<!ENTITY objecttab.tooltip "Pulse aquí para bloquear este objeto con Adblock Plus">
+<!ENTITY menuitem.label "&amp;Adblock Plus">
+<!ENTITY objecttabs.label "&amp;Mostrar pestañas en Flash y Java">
+<!ENTITY sendReport.label "&amp;Informar de un problema en esta página">
+<!ENTITY whitelist.page.label "Desactivar sólo en esta página">
+<!ENTITY context.image.label "ABP - Bloquear imagen">
+<!ENTITY counthits.label "Contar &amp;usos de filtros">
+<!ENTITY opensidebar.label "Abrir &amp;ventana elementos bloqueables">
+<!ENTITY notification.button.close "&amp;Cerrar">
+<!ENTITY contribute.label "Ayudar a Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "ABP - Bloquear marco">
+<!ENTITY blocked.tooltip "Elementos bloqueados en esta página:">
+<!ENTITY hideplaceholders.label "O&amp;cultar posicionadores de elementos bloqueados">
+<!ENTITY showinstatusbar.label "Mostrar en la barra &amp;de estado">
+<!ENTITY sidebar.title "Elementos bloqueables en la página actual">
+<!ENTITY options.label "&amp;Opciones">
+<!ENTITY context.object.label "ABP - Bloquear objeto">
+<!ENTITY context.removeWhitelist.label "ABP - Reactivar en esta página">
+<!ENTITY filters.tooltip "Filtros más activos:">
+<!ENTITY closesidebar.label "Cerrar &amp;ventana elementos bloqueables">
+<!ENTITY showintoolbar.label "Mostrar en la barra de &amp;herramientas">
+<!ENTITY status.tooltip "Estado:">
+<!ENTITY context.media.label "ABP - Bloquear vídeo/audio">
+<!ENTITY subscription.update.label "Actualizar filtros">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/sendReport.dtd
new file mode 100644
index 0000000..63a2bcc
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Deshacer">
+<!ENTITY issues.disabledgroups.description "Están desactivadas las siguientes suscripciones de filtros/grupos de filtros, que podrían tener algún tipo de efecto sobre la página:">
+<!ENTITY showData.label "Mostrar datos del informe">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus está bloqueando de&amp;masiado">
+<!ENTITY issues.change.description "Se ha cambiado su configuración. Por favor, recargue la página para probar los cambios y enviar un informe si el problema no se ha resuelto con las modificaciones.">
+<!ENTITY email.label "Co&amp;rreo electrónico:">
+<!ENTITY issues.openPreferences.label "Abrir preferencias de filtros">
+<!ENTITY sendPage.confirmation "Su informe ha sido guardado. Puede acceder a él en la siguiente dirección:">
+<!ENTITY copyLink.label "&amp;Copiar enlace del informe">
+<!ENTITY issues.nofilters.description "Adblock Plus no está bloqueando nada en esta página. El problema que observa muy probablemente no tenga nada que ver con Adblock Plus.">
+<!ENTITY sendPage.knownIssue "El problema del que informó probablemente ya fuera conocido. Más información:">
+<!ENTITY typeSelector.other.description "Seleccione esta opción si cree que es un problema del mismo Adblock Plus, y no de sus filtros.">
+<!ENTITY issues.disabledgroups.enable.label "Activar suscripción de filtros/grupo de filtros">
+<!ENTITY typeWarning.override.label "Lo &amp;entiendo pero quiero enviar el informe de todas formas">
+<!ENTITY issues.disabled.enable.label "Activar Adblock Plus">
+<!ENTITY update.fixed.description "La actualización de sus suscripciones de filtros probablemente resolvió el problema del que estaba informando. Por favor, recargue la página y vuelva a probar. Pulse de nuevo Informar de un problema si no se ha solucionado.">
+<!ENTITY anonymous.label "Envío &amp;anónimo">
+<!ENTITY reloadButton.label "&amp;Recargar página">
+<!ENTITY recentReports.clear.label "Eliminar &amp;todos los informes">
+<!ENTITY typeSelector.description "Esta ventana le guiará en el proceso necesario para enviar un informe de fallo de Adblock Plus. Primero, seleccione el tipo de problema que ha detectado en esta página:">
+<!ENTITY screenshot.remove.label "&amp;Eliminar datos sensibles">
+<!ENTITY issues.ownfilters.description "Algunos de los filtros aplicados en esta página son filtros personales de usuario. Por favor, desactive los filtros que podrían haber causado el problema:">
+<!ENTITY update.inProgress.description "Adblock Plus necesita actualizar sus suscripciones de filtros para asegurarse de que el problema aún no se ha resuelto. Espere, por favor…">
+<!ENTITY sendPage.retry.label "Enviar de nuevo">
+<!ENTITY data.label "&amp;Datos del informe:">
+<!ENTITY recentReports.label "Sus informes más recientes">
+<!ENTITY typeWarning.description "Usted ha indicado que quiere informar de un problema atribuible a Adblock Plus y no a los filtros utilizados. Tenga en cuenta que suele ser mejor informar de este tipo de problemas en el [link]foro de Adblock Plus[/link], y utilizar el generador de informes de problemas sólo como añadido en una discusión ya existente, puesto que nadie se apercibirá de su informe a menos que aporte un enlace al mismo. Tras enviar el informe se le mostrará el enlace generado automáticamente.">
+<!ENTITY issues.disabled.description "Adblock Plus está desactivado, no bloqueará nada en este estado.">
+<!ENTITY attachExtensions.label "Adjuntar una lista de e&amp;xtensiones activas al informe por si la causa del problema es un conflicto entre extensiones">
+<!ENTITY issues.nosubscriptions.add.label "Añadir suscripción de filtros">
+<!ENTITY issues.disabledfilters.enable.label "Activar filtro">
+<!ENTITY issues.override.label "La &amp;configuración es correcta, puede seguir con el informe">
+<!ENTITY issues.nosubscriptions.description "Aparentemente usted no está suscrito a ninguna de las listas de filtros ya existentes que eliminan automáticamente el contenido no deseado de los sitios web.">
+<!ENTITY typeSelector.falsePositive.description "Seleccione esta opción si en la página falta contenido importante, se muestra incorrectamente o no funciona adecuadamente. Puede confirmar si el problema lo está provocando Adblock Plus desactivándolo temporalmente.">
+<!ENTITY typeSelector.other.label "&amp;Otros problemas">
+<!ENTITY emailComment.label "Le recomendamos que introduzca una dirección válida de correo electrónico para que podamos contactar si surgen dudas sobre tu informe. También nos permitirá reconocer tus contribuciones y darles mayor prioridad.">
+<!ENTITY issues.whitelist.remove.label "Reactivar Adblock Plus en esta página">
+<!ENTITY outdatedSubscriptions.description "Las siguientes suscripciones de filtros no se han actualizado desde hace más de dos semanas. Por favor, actualícelas antes de enviar un informe de error, el problema podría estar ya resuelto.">
+<!ENTITY dataCollector.description "Por favor espere un momento mientras Adblock Plus reúne los datos necesarios.">
+<!ENTITY sendButton.label "E&amp;nviar informe">
+<!ENTITY comment.label "&amp;Comentario (opcional):">
+<!ENTITY sendPage.errorMessage "Un intento de enviar el informe produjo un fallo con código de error &quot;?1?&quot;. Por favor, asegúrese de que está conectado a Internet y vuelva a intentarlo. Si el problema persiste por favor pida ayuda en el [link]foro de Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Mostrar informes más recientes">
+<!ENTITY commentPage.heading "Comentario">
+<!ENTITY update.start.label "Iniciar actualización ahora">
+<!ENTITY issues.disabledfilters.description "Están desactivados los siguientes filtros, que podrían tener algún tipo de efecto sobre la página:">
+<!ENTITY screenshot.description "La misma página puede tener diferente apariencia para diferentes personas. Puede resultar útil para comprender el problema si adjunta una captura de pantalla a su informe. Puede eliminar las partes que contengan información sensible y marcar las zonas en las que se aprecia el problema. Para conseguirlo pulse el botón correspondiente y seleccione con el ratón un área de la imagen.">
+<!ENTITY screenshot.attach.label "A&amp;ñadir al informe una imagen de la página">
+<!ENTITY issues.whitelist.description "Adblock Plus está ahora mismo desactivado en la página a la que se refiere el informe. Por favor, reactívelo y recargue la página antes de enviar el informe para ayudar en la investigación del problema.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Pl&amp;us no bloquea un anuncio">
+<!ENTITY typeSelector.heading "Elegir tipo error">
+<!ENTITY anonymity.warning "No podremos comunicar con usted y es probable que le demos una prioridad inferior a su informe.">
+<!ENTITY wizard.title "Creador de informes de errores">
+<!ENTITY issues.ownfilters.disable.label "Desactivar filtro">
+<!ENTITY commentPage.description "El campo de texto de la parte inferior le permite introducir un comentario para ayudarnos comprender el problema. Es algo opcional, pero recomendable si el problema no resulta evidente. Puede revisar los datos del informe antes de que se envíen.">
+<!ENTITY comment.lengthWarning "La longitud se su comentario supera los 1.000 caracteres. Sólo se enviarán los 1.000 primeros.">
+<!ENTITY typeSelector.falseNegative.description "Seleccione esta opción si se muestra un anuncio a pesar de que Adblock Plus está activado.">
+<!ENTITY sendPage.waitMessage "Por favor, espere mientras Adblock Plus envía su informe.">
+<!ENTITY dataCollector.heading "Bienvenido al creador de informes de errores">
+<!ENTITY screenshot.heading "Adjuntar vista">
+<!ENTITY sendPage.heading "Enviar informe">
+<!ENTITY issues.subscriptionCount.description "Parece que se ha suscrito a demasiadas suscripciones de filtros. Eso no es recomendable porque aumenta mucho la probabilidad de que aparezcan problemas y hace que no se pueda procesar su informe de error porque no puede saberse qué autor de suscripción de filtros tiene que actuar. Por favor, borre todas las suscripciones que no sean realmente necesarias y compruebe si el problema persiste.">
+<!ENTITY screenshot.mark.label "&amp;Marcar el problema">
+<!ENTITY privacyPolicy.label "Política de privacidad">
+<!ENTITY issues.description "Adblock Plus ha detectado problemas con su configuración que podrían ser la causa del fallo o que están dificultando la investigación del mismo.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/sidebar.dtd
new file mode 100644
index 0000000..ef28209
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Resaltar los bordes del elemento">
+<!ENTITY address.label "Dirección">
+<!ENTITY context.open.label "Abrir en nueva pestaña">
+<!ENTITY type.label "Tipo">
+<!ENTITY tooltip.filterSource.label "Procedencia del filtro:">
+<!ENTITY noitems.label "Ningún elemento bloqueable">
+<!ENTITY filter.label "Filtro">
+<!ENTITY tooltip.size.label "Tamaño:">
+<!ENTITY reattach.label "Unir">
+<!ENTITY search.label "&amp;Buscar:">
+<!ENTITY docDomain.thirdParty "(terceros)">
+<!ENTITY filterSource.label "Origen filtro">
+<!ENTITY tooltip.docDomain.label "Origen del documento:">
+<!ENTITY context.copy.label "Copiar la dirección del elemento">
+<!ENTITY tooltip.type.label "Tipo:">
+<!ENTITY context.disablefilter.label "Desactivar filtro ?1?">
+<!ENTITY context.copyFilter.label "Copiar filtro">
+<!ENTITY context.block.label "Bloquear este elemento">
+<!ENTITY context.enablefilter.label "Reactivar filtro ?1?">
+<!ENTITY detach.label "Separar">
+<!ENTITY whitelisted.label "Página de lista blanca">
+<!ENTITY context.disablefilteronsite.label "Desactivar este filtro en ?1?">
+<!ENTITY detached.title "Adblock Plus: Elementos bloqueables (separado)">
+<!ENTITY docDomain.firstParty "(dominio)">
+<!ENTITY tooltip.type.whitelisted "(en lista blanca)">
+<!ENTITY tooltip.filter.label "Filtro en efecto:">
+<!ENTITY tooltip.filter.disabled "(desactivado)">
+<!ENTITY context.editfilter.label "Editar el filtro en uso">
+<!ENTITY tooltip.type.blocked "(bloqueado)">
+<!ENTITY size.label "Tamaño">
+<!ENTITY context.whitelist.label "Añadir regla de excepción para el elemento">
+<!ENTITY context.selectAll.label "Seleccionar todo">
+<!ENTITY state.label "Estado">
+<!ENTITY docDomain.label "Origen documento">
+<!ENTITY tooltip.address.label "Dirección:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/subscriptionSelection.dtd
new file mode 100644
index 0000000..2b0a803
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-ES/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "A&amp;ñadir también la suscripción &quot;?1?&quot;.">
+<!ENTITY list.download.failed "Error al recuperar la lista de suscripciones.">
+<!ENTITY list.download.retry "Intentar de nuevo">
+<!ENTITY title.label "&amp;Título de la suscripción:">
+<!ENTITY list.download.website "Ver página web">
+<!ENTITY supplementMessage "Esta suscripción de filtros está pensada para usarse junto a la suscripción &quot;?1?&quot; que aún no ha instalado.">
+<!ENTITY viewList.label "Ver filtros">
+<!ENTITY visitHomepage.label "Visitar su página web">
+<!ENTITY addSubscription.label "Añadir suscripción">
+<!ENTITY dialog.title "Añadir suscripción de filtros para Adblock Plus">
+<!ENTITY location.label "&amp;Ubicación de la lista de filtros:">
+<!ENTITY fromWeb.description "Por favor, confirme que quiere añadir está suscripción de filtros. Puede cambiar su título o ubicación antes de añadirla.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/composer.dtd
new file mode 100644
index 0000000..00bc242
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "ir al &amp;final de la dirección">
+<!ENTITY domainRestriction.label "&amp;Restringir al dominio:">
+<!ENTITY collapse.default.no.label "Usar por defecto (no)">
+<!ENTITY firstParty.label "So&amp;lo propietarios">
+<!ENTITY preferences.label "&amp;Mostrar filtros existentes...">
+<!ENTITY pattern.label "Buscar un patrón">
+<!ENTITY thirdParty.label "&amp;Solo terceros">
+<!ENTITY filter.label "&amp;Nuevo filtro:">
+<!ENTITY collapse.label "C&amp;olapso bloqueado">
+<!ENTITY match.warning "El patrón que ha ingresado ya no concuerda con la dirección a ser Bloqueada/Permitida y no tendrá efecto en la misma.">
+<!ENTITY anchor.start.label "&amp;ir al principio de la dirección">
+<!ENTITY matchCase.label "&amp;Coincidir Mayus/Minus">
+<!ENTITY custom.pattern.label "&amp;Personalizar:">
+<!ENTITY unselectAllTypes.label "Seleccionar ninguno">
+<!ENTITY type.whitelist.label "Regla de e&amp;xcepción">
+<!ENTITY regexp.warning "El patrón que ha escrito se interpretará como una expresión regular, la cual no puede ser eficientemente procesada por Adblock Plus y podría ralentizar su experiencia al navegar. Si no tenía la intención de usar una expresión regular, agregue un asterisco (*) al final del patrón.">
+<!ENTITY dialog.title "Agregar una regla de filtro de Adblock Plus">
+<!ENTITY basic.label "Vista básica">
+<!ENTITY type.filter.label "Filtro de &amp;bloqueo">
+<!ENTITY types.label "Se aplica a tipos:">
+<!ENTITY shortpattern.warning "El patrón que ha ingresado es muy corto para ser optimizado y podría ralentizar su experiencia al navegar. Es recomendable que elija una cadena más larga para este filtro para permitir a Adblock Plus procesar el filtro con mayor eficacia.">
+<!ENTITY collapse.yes.label "Si">
+<!ENTITY anchors.label "Solo aceptar patrones:">
+<!ENTITY collapse.default.yes.label "Usar por defecto (si)">
+<!ENTITY domainRestriction.help "Use esta opción para especificar uno o más dominios separados por una barra (|). El filtro solo se aplicará en dominio(s) seleccionados. Una tilde (~) antes del nombre del dominio indica que el filtro no se aplicará en ese dominio.">
+<!ENTITY accept.label "Agregar filtro">
+<!ENTITY options.label "Opciones">
+<!ENTITY disabled.warning "Adblock Plus se encuentra desactivado. Puedes continuar agregando filtros pero no serán aplicados hasta que [link]habilites Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "&amp;ir al principio del nombre de dominio">
+<!ENTITY collapse.no.label "No">
+<!ENTITY selectAllTypes.label "Seleccionar todos">
+<!ENTITY advanced.label "Vista Avanzada">
+<!ENTITY pattern.explanation "El patrón puede ser cualquier parte de una dirección; asteriscos(*) actuan como comodines. El filtro solo se aplicara a direcciones que igualen el patrón proporcionado.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/filters.dtd
new file mode 100644
index 0000000..5e9cc80
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Todos tus filtros personalizados serán reemplazados con el contenido del archivo seleccionado. Deseas continuar con el proceso?">
+<!ENTITY slow.column "Filtros lentos">
+<!ENTITY enabled.column "Habilitado">
+<!ENTITY subscription.lastDownload.checksumMismatch "Falló, comprobación(checksum) no concuerda">
+<!ENTITY noFiltersInGroup.text "El grupo seleccionado esta vacio">
+<!ENTITY subscription.actions.label "Comportamiento/Acciones">
+<!ENTITY filter.selectAll.label "Seleccionar Todo">
+<!ENTITY backupButton.label "&amp;Salvar/Copia de Seguridad y Restaurar">
+<!ENTITY restore.minVersion.warning "Advertencia: el archivo ha sido creado con una versión mas actual de Adblock Plus. Deberias actualizar Adblock Plus a la versión mas reciente antes de restaurar desde este archivo.">
+<!ENTITY restore.error "Los datos de archivo no se pudierón procesar, tal vez esta no sea una copia de seguridad de Adblock Plus?">
+<!ENTITY sort.ascending.label "Ordern&amp;ar de la A &gt; Z">
+<!ENTITY sort.label "Ordenar &amp;por">
+<!ENTITY subscription.source.label "Lista de filtros">
+<!ENTITY hitcount.column "&amp;Contador">
+<!ENTITY noFilters.text "Usted no tiene ningún filtro personalizado aún.">
+<!ENTITY backup.custom.title "Solo filtros personalizados">
+<!ENTITY subscription.external.label "Actualizado por otro complemento">
+<!ENTITY subscription.delete.label "Eliminar">
+<!ENTITY noGroupSelected.text "Necesitas seleccionar un grupo de filtros antes para que su contenido de filtros se puedan mostrar.">
+<!ENTITY filter.cut.label "Cortar">
+<!ENTITY restore.default.label "Restaurar copia de seguridad desde ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Descargando...">
+<!ENTITY subscriptions.tab.label "Suscripciones de Filtro">
+<!ENTITY sort.descending.label "Ordernar de la &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Realmente deseas quitar todos los filtros seleccionados?">
+<!ENTITY filter.delete.label "Eliminar">
+<!ENTITY addSubscriptionAdd.label "Agregar">
+<!ENTITY viewMenu.label "Vista">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY addSubscriptionCancel.label "Cancelar">
+<!ENTITY subscription.enabled.label "Activado">
+<!ENTITY noSubscriptions.text "Usted no ha agregado ninguna subscripción de filtros aun. Adblock Plus no bloqueará
+ nada sin filtros, por favor use &quot;Agregar subscripción de filtros&quot; para
+ agregar algunos.">
+<!ENTITY subscription.update.label "Actualizar filtros">
+<!ENTITY dialog.title "Preferencias de Filtro de Adblock Plus">
+<!ENTITY addFilter.label "Agregar &amp;filtro">
+<!ENTITY subscription.minVersion.warning "Esta suscripción de filtro necesita una versión actualizada de Adblock Plus, debes actualizar tu versión de Adblock Plus a la más reciente.">
+<!ENTITY subscription.lastDownload.invalidURL "Falló, no es una dirección valida">
+<!ENTITY backup.error "Hubo un error escribiendo los filtros en el archivo. Asegurese que el archivo no esta protegido o que no se encuentre en uso por otra aplicación.">
+<!ENTITY filter.moveUp.label "Mover arriba">
+<!ENTITY addGroup.label "Agregar grupo de filtros">
+<!ENTITY filter.edit.label "Editar">
+<!ENTITY subscription.showHideFilters.label "Mostrar/Ocultar filtros">
+<!ENTITY acceptableAds2.label "Permitir algo de publicidad no intrusiva">
+<!ENTITY addSubscriptionOther.label "Agregar una suscripción diferente">
+<!ENTITY close.label "Cerrar">
+<!ENTITY sort.none.label "&amp;Sin clasificar">
+<!ENTITY filter.actions.label "Comportamiento/Acción de filtros">
+<!ENTITY filter.copy.label "Copiar">
+<!ENTITY filter.moveDown.label "Mover abajo">
+<!ENTITY filter.resetHitCounts.label "Reiniciar estadísticas">
+<!ENTITY readMore.label "Leer más">
+<!ENTITY subscription.moveUp.label "Mover arriba">
+<!ENTITY addSubscription.label "&amp;Agregar suscripción de filtro">
+<!ENTITY subscription.homepage.label "Página de inicio">
+<!ENTITY backup.complete.title "Todos los filtros y suscripciones">
+<!ENTITY restore.own.label "Restaurar copia de seguridad propia">
+<!ENTITY restore.complete.warning "Todas tus preferencias de filtros se reemplazarán con el contenido del archivo seleccionado. Deseas continuar con el proceso?">
+<!ENTITY filters.tab.label "Filtros personalizados">
+<!ENTITY backup.label "Crear nueva copia de seguridad">
+<!ENTITY find.label "&amp;Buscar">
+<!ENTITY subscription.moveDown.label "Mover abajo">
+<!ENTITY subscription.lastDownload.connectionError "Falló, La descarga ha fracasado">
+<!ENTITY subscription.lastDownload.success "Éxito">
+<!ENTITY subscription.lastDownload.invalidData "Falló, no es una lista de filtros válida">
+<!ENTITY filter.paste.label "Pegar">
+<!ENTITY subscription.disabledFilters.enable "Activar filtros desactivados">
+<!ENTITY lasthit.column "&amp;Ultima visita">
+<!ENTITY subscription.editTitle.label "Editar título">
+<!ENTITY subscription.disabledFilters.warning "Algunos filtros en esta suscripción se encuentran desactivados.">
+<!ENTITY filter.column "Regla de &amp;filtro">
+<!ENTITY subscription.lastDownload.label "Ultima descarga:">
+<!ENTITY viewList.label "Ver lista">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/firstRun.properties
new file mode 100644
index 0000000..bc70db1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Navega de forma privada desactivando el rastreo, ocultando así tu actividad de compañías de publicidad que te rastrearían en cada momento.
+firstRun_toggle_off=NO
+firstRun_feature_tracking=Desactivar el Rastreo
+firstRun_feature_malware=Bloquear Malware
+firstRun_title=Adblock Plus ha sido instalado
+firstRun_toggle_on=SÃ
+firstRun_acceptableAdsExplanation=Nos gustaría fomentar en los sitios web, el uso de publicidad discreta y directa. Es por eso que hemos establecido <a>lineamientos estrictos</a> para identificar anuncios aceptables, que son mostrados bajo las configuraciones predeterminadas. Si aun así deseas bloquear todos los anuncios, puedes <a>desactivar</a> esta opción en pocos segundos.
+firstRun_contributor_credits=Colaboradores
+firstRun_dataCorruptionWarning=¿Se sigue mostrando esta página? <a>¡Haz clic acá!</a>
+firstRun_acceptableAdsHeadline=Anuncios molestos serán bloqueados
+firstRun_share=Cuéntale a tus amigos
+firstRun_share_headline=<a>Ayúdanos</a> haciendo el internet un mejor lugar
+firstRun_feature_social_description=Libérate automáticamente de los botones de redes sociales, como el "Me gusta" de Facebook, el cual aparece en páginas web y rastrea tu actividad en línea.
+firstRun_filterlistsReinitializedWarning=Parece que un problema provocó que todos los filtros fueron removidos y fuimos incapaces de restaurar una copia de seguridad. Por lo tanto tuvimos que restaurar tus filtros y configuraciones de anuncios aceptables. Por favor revisa tu lista de filtros y configuración de anuncios aceptables en las <a>Opciones de Adblock Plus</a>.
+firstRun_feature_malware_description=Haz tu navegación más segura bloqueando dominios maliciosos conocidos.
+firstRun_features=Adblock Plus puede hacer más que bloquear anuncios
+firstRun_donate=donar
+firstRun_donate_label=Apoya nuestro proyecto
+firstRun_feature_social=Quitar Botones de Redes Sociales
+firstRun_legacySafariWarning=Está utilizando una versión antigua de Safari no soportada por Adblock Plus, por lo que podría funcionar incorrectamente o afectar a su experiencia de usuario en algunos sitios web. Le recomendamos actualizar a Safari 6.1.1 o superior (para Mac OS X 10.8 Mountain Lion), o a Safari 7.0.1 o superior (para Mac OS X 10.9 Mavericks), o usar la última versión de Mozilla Firefox, Google Chrome u Opera.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/global.properties
new file mode 100644
index 0000000..fe253c1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=No hay elementos bloqueables en la página actual
+action3_tooltip=Click para activar/desactivar Adblock Plus.
+notification_antiadblock_title=¿Ocultar mensajes dirigidos?
+type_label_script=script
+filter_elemhide_nocriteria=No hay criterios específicos para reconocer el elemento que se oculta
+blockingGroup_title=Reglas de Bloqueo de Anuncios
+whitelisted_tooltip=Adblock Plus esta desactivado en la página actual.
+type_label_stylesheet=estilo de hoja
+blocked_count_tooltip=?1? del total de ?2?
+type_label_font=fuente
+type_label_popup=ventana emergente
+filter_regexp_tooltip=Este filtro o bien es una expresión regular o es demasiado corto para ser optimizado. Demasiados de estos filtros podrian relentizar su experiencia al navegar.
+action0_tooltip=Haga clic para abrir el menú contextual, click medio para activar/desactivar.
+whitelisted_page=Adblock Plus ha sido desactivado para la página actual
+remove_group_warning=¿Realmente desea eliminar este grupo?
+action1_tooltip=Click para abrir/cerrar elementos bloqueables, click medio para activar/desactivar.
+type_label_xmlhttprequest=Solicitud XML
+active_tooltip=Adblock Plus esta activado, ?1? suscripción(es) de filtro(s) y ?2? filtro(s) personalizado(s) en uso.
+type_label_document=documento
+type_label_object_subrequest=Solicitud de objeto
+whitelistGroup_title=Reglas de excepción
+disabled_tooltip=Adblock Plus está desactivado.
+filter_elemhide_duplicate_id=Solo una ID de el elemento oculto puede ser especificado
+type_label_object=objeto
+action2_tooltip=Click para abrir las Preferencias, click medio para activar/desactivar.
+type_label_subdocument=marco
+clearStats_warning=Esto reiniciará todas las estadísticas de filtros afectados y desactivará el conteo de accesos de los filtros. ¿Deseas proceder?
+notification_antiadblock_message=Es sabido que este sitio muestra mensajes dirigidos a los usuarios de Adblock Plus. ¿Quieres que Adblock plus oculte estos mensajes?
+blocked_count_addendum=(tambien permitidos: ?1?, ocultos: ?2?)
+subscription_invalid_location=La ubicación de la lista de filtros no es ni una dirección URL válida, ni un nombre de archivo válido.
+type_label_image=imagen
+remove_subscription_warning=¿Realmente deseas quitar esta subscripción?
+type_label_other=otro
+mobile_menu_enable=ABP: activar
+type_label_media=sonido/video
+mobile_menu_disable_site=¿ABP: Deshabilitar en ?1?
+elemhideGroup_title=Reglas para Ocultar Elementos
+mobile_menu_enable_site=¿ABP: Habilitar en ?1?
+type_label_elemhide=oculto
+newGroup_title=Nuevo grupo de filtros
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/overlay.dtd
new file mode 100644
index 0000000..ffa1dc3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Sí">
+<!ENTITY notification.button.no "&amp;No">
+<!ENTITY sync.label "&amp;Sincronizar configuración de Adblock Plus">
+<!ENTITY whitelist.site.label "Desactivar en ?1?">
+<!ENTITY filters.label "&amp;Preferencias de filtro">
+<!ENTITY disable.label "Desactivado en cualquier lugar">
+<!ENTITY objecttab.title "Bloquear">
+<!ENTITY objecttab.tooltip "Click aquí para bloquear este objeto con Adblock Plus">
+<!ENTITY menuitem.label "Pr&amp;eferencias de Adblock Plus">
+<!ENTITY objecttabs.label "Mostrar pestañas sobre Flash y Java">
+<!ENTITY sendReport.label "Reportar problema en esta página">
+<!ENTITY whitelist.page.label "Deshabilitar solo en esta página">
+<!ENTITY context.image.label "Adblock Plus: Bloquear imagen">
+<!ENTITY counthits.label "Contar accesos de &amp;filtro">
+<!ENTITY opensidebar.label "Abrir elementos bloqueables">
+<!ENTITY notification.button.close "&amp;Cerrar">
+<!ENTITY contribute.label "Desactivar con Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock plus">
+<!ENTITY context.frame.label "Adblock Plus: Bloquear marco">
+<!ENTITY blocked.tooltip "Elementos bloqueados en esta pagina:">
+<!ENTITY hideplaceholders.label "&amp;Ocultar marcadores de posición de elementos bloqueados">
+<!ENTITY showinstatusbar.label "&amp;Mostrar en la barra de estado">
+<!ENTITY sidebar.title "Elementos bloqueables en la página actual">
+<!ENTITY options.label "&amp;Opciones">
+<!ENTITY context.object.label "Adblock Plus: Bloquear objeto">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Re-habilitar en esta página">
+<!ENTITY filters.tooltip "Filtros mas activos:">
+<!ENTITY closesidebar.label "Cerrar elementos bloqueables">
+<!ENTITY showintoolbar.label "Mostrar barra de &amp;complementos">
+<!ENTITY status.tooltip "Estado:">
+<!ENTITY context.media.label "Adblock Plus: Bloquear sonido/video">
+<!ENTITY subscription.update.label "Actualizar filtros">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/sendReport.dtd
new file mode 100644
index 0000000..eb5b334
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Deshacer">
+<!ENTITY issues.disabledgroups.description "La siguiente subscripcion/Grupo de filtros se encuentra desactivada, aun asi pueden tener efectos en esta página:">
+<!ENTITY showData.label "Mostrar datos del reporte">
+<!ENTITY typeSelector.falsePositive.label "&amp;Adblock Plus está bloqueando demasiado">
+<!ENTITY issues.change.description "Su configuración ha sido cambiada. Por favor recargue la página para probar los cambios y presentar un reporte si el problema no ha sido resuelto por las alteraciones.">
+<!ENTITY email.label "Co&amp;rreo electrónico:">
+<!ENTITY issues.openPreferences.label "Abrir preferencias de filtro">
+<!ENTITY sendPage.confirmation "Su reporte ha sido salvado. Puede acceder al mismo en la siguiente direccion:">
+<!ENTITY copyLink.label "&amp;Copiar dirección del reporte">
+<!ENTITY issues.nofilters.description "Adblock Plus no está bloqueando nada en la página actual. El problema que esta observando es probable que no se encuentre relacionado con Adblock Plus.">
+<!ENTITY sendPage.knownIssue "El problema que ha reportado probablemente ya sea conocido. Mas información:">
+<!ENTITY typeSelector.other.description "Seleccione esta opción si usted sospecha un problema con Adblock Plus específicamente en lugar de sus filtros.">
+<!ENTITY issues.disabledgroups.enable.label "Activar subscripción/Grupo de filtros">
+<!ENTITY typeWarning.override.label "&amp;Entiendo y deseo presentar el reporte de todos modos">
+<!ENTITY issues.disabled.enable.label "Activar Adblock Plus">
+<!ENTITY update.fixed.description "Las actualizaciones de sus suscripciones de filtro probablemente resolvieron el problema sobre el que está usted informando. Por favor vuelva a cargar la página y vuelva a intentarlo. Informe nuevamente si el problema persiste.">
+<!ENTITY anonymous.label "Envío &amp;Anónimo">
+<!ENTITY reloadButton.label "&amp;Recargar página">
+<!ENTITY recentReports.clear.label "&amp;Quitar todos los reportes">
+<!ENTITY typeSelector.description "Esta ventana lo guiará por pasos, necesarios para el envio de un reporte de problemas de Adblock Plus. Primero, por favor seleccione el tipo de problema que esta experimentando en esta página:">
+<!ENTITY screenshot.remove.label "Q&amp;uitar datos sensitivos/privados">
+<!ENTITY issues.ownfilters.description "Alguno de los filtros aplicados en esta página se encuentran definidos por el usuarios. Por favor desactive los filtros que pueden causar el problema:">
+<!ENTITY update.inProgress.description "AdBlock Plus necesita actualizar sus suscripciones de filtro para asegurarse de que el problema no ha sido resuelto ya. Por favor, espere...">
+<!ENTITY sendPage.retry.label "Enviar otra vez">
+<!ENTITY data.label "Da&amp;tos de Reporte">
+<!ENTITY recentReports.label "Tus reportes recientemente enviados">
+<!ENTITY typeWarning.description "Ha indicado que desea reportar un problema general con Adblock Plus en lugar de un problema con los filtros. Por favor tenga en cuenta que estos problemas son mejor reportados en el [link]Foro de Adblock Plus[/link]. Solo deberia usar el reportero de problemas para complementar una discución existente, ya que nadie se percatará de su informe a menos que se les proporcione el enlace a la misma. El enlace generado automáticamente sera proporcionado después de presentar el reporte respectivo.">
+<!ENTITY issues.disabled.description "Adblock Plus esta desactivado, no bloqueará nada en su estado actual.">
+<!ENTITY attachExtensions.label "A&amp;djuntar una lista de extensiones activas a el repote en caso de que un conflicto de complementos sea la causa del problema">
+<!ENTITY issues.nosubscriptions.add.label "Agregar filtro de suscripción">
+<!ENTITY issues.disabledfilters.enable.label "Activar filtro">
+<!ENTITY issues.override.label "&amp;La configuración es correcta, continue con el reporte">
+<!ENTITY issues.nosubscriptions.description "Usted no parece estar suscrito a ninguna lista de filtro pre-desarrollado que automáticamente quita contenido no deseado de los sitios web.">
+<!ENTITY typeSelector.falsePositive.description "Seleccione esta opción si la página carece de contenido importante, muestra incorrectamente o falla al funcionar como debe. Puede determinar si Adblock Plus es el causante del problema desactivándolo temporalmente.">
+<!ENTITY typeSelector.other.label "&amp;Otro problema">
+<!ENTITY emailComment.label "Te sugerimos que ingreses una dirección válida de correo electrónico para que podamos contactarte si hay preguntas sobre tu informe. También nos permitirá reconocer tus contribuciones y darles mayor prioridad.">
+<!ENTITY issues.whitelist.remove.label "Re-activar Adblock Plus en esta página">
+<!ENTITY outdatedSubscriptions.description "Las siguientes suscripciones de filtro no han sido actualizadas desde hace al menos dos semanas. Por favor, actualícelas antes de enviar un informe de error, el problema quizá esté ya resuelto.">
+<!ENTITY dataCollector.description "Por favor espere un momento mientras Adblock Plus reúne los datos necesarios.">
+<!ENTITY sendButton.label "En&amp;viar reporte">
+<!ENTITY comment.label "Come&amp;ntario (opcional):">
+<!ENTITY sendPage.errorMessage "Un intento de enviar el reporte ha fallado con el código de error &quot;?1?&quot;. Por favor asegúrese de que se encuentra conectado a internet y vuelva a intentarlo. Si el problema persiste por favor solicite asistencia en el [link]Foro de Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Mostrar reportes enviados recientemente">
+<!ENTITY commentPage.heading "Comentar">
+<!ENTITY update.start.label "Iniciar actualización ahora">
+<!ENTITY issues.disabledfilters.description "Los siguientes filtros están desactivados, aun así pueden tener efectos en esta página:">
+<!ENTITY screenshot.description "La misma página puede parecer diferente para cada persona. Puede ayudarnos a entender el problema si adjunta una captura de pantalla a su reporte. Puede quitar partes que contengan informacion sensitiva/privada asi mismo marcar áreas donde el problema se note. Para hacerlo click en el botón correspondiente y seleccione una parte de la imagen con su cursor/puntero.">
+<!ENTITY screenshot.attach.label "Adjuntar una &amp;imagen de la página al reporte">
+<!ENTITY issues.whitelist.description "Adblock Plus se encuentra desactivado en la página que esta reportando. Por favor vuelva a activarlo y recargue la página antes de presentar el informe para ayudar a la investigación de este problema.">
+<!ENTITY typeSelector.falseNegative.label "Ad&amp;block Plus no bloquea una publicidad">
+<!ENTITY typeSelector.heading "Elija tipo de problema">
+<!ENTITY anonymity.warning "No podremos comunicarnos contigo y es probable que le demos una prioridad inferior a tu informe.">
+<!ENTITY wizard.title "Reportero de problemas">
+<!ENTITY issues.ownfilters.disable.label "Desactivar filtro">
+<!ENTITY commentPage.description "El campo de texto a continuación le permite escribir un comentario para ayudarnos a entender el problema. Este paso es opcional pero recomendado si el problema no es obvio. Puede tambien revisar el reporte de datos antes de que sea enviado.">
+<!ENTITY comment.lengthWarning "El tamaño de su comentario excede los 1000 caracteres. Solo los primeros 1000 caracteres seran enviados.">
+<!ENTITY typeSelector.falseNegative.description "Seleccione esta opción si una publicidad continua mostrándose a pesar que Adblock Plus se encuentra activado.">
+<!ENTITY sendPage.waitMessage "Por favor espere mientras Adblock Plus envía su reporte.">
+<!ENTITY dataCollector.heading "Bienvenido al reportero de problemas">
+<!ENTITY screenshot.heading "Adjuntar captura de pantalla">
+<!ENTITY sendPage.heading "Enviar reporte">
+<!ENTITY issues.subscriptionCount.description "Parece que usted se encuentra inscrito en demasiadas suscripciones de filtro. Esta configuración no se recomienda porque causará una verosimilitud con problemas mucho mas grandes. Tampoco podemos aceptar su reporte de problemas porque en el mismo no se encuentra claro qué autor de suscripción de filtro necesita tomar acciones. Por favor quite todo menos las suscripciones realmente necesarias y compruebe si el problema aun persiste.">
+<!ENTITY screenshot.mark.label "&amp;Marcar el problema">
+<!ENTITY privacyPolicy.label "Política de Privacidad">
+<!ENTITY issues.description "Adblock Plus ha detectado problemas con su configuración que puede ser la causa de este problema o que podria dificultar la investigación del problema.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/sidebar.dtd
new file mode 100644
index 0000000..a7eb86f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Elementos flash en bordes">
+<!ENTITY address.label "Dirección">
+<!ENTITY context.open.label "Abrir en Nueva Pestaña">
+<!ENTITY type.label "Tipo">
+<!ENTITY tooltip.filterSource.label "Fuente del filtro:">
+<!ENTITY noitems.label "No hay elementos bloqueables">
+<!ENTITY filter.label "Filtro">
+<!ENTITY tooltip.size.label "Tamaño:">
+<!ENTITY reattach.label "Unir">
+<!ENTITY search.label "&amp;Buscar:">
+<!ENTITY docDomain.thirdParty "(terceros)">
+<!ENTITY filterSource.label "Fuente de filtro">
+<!ENTITY tooltip.docDomain.label "Fuente del Documento:">
+<!ENTITY context.copy.label "Copiar dirección de elementos">
+<!ENTITY tooltip.type.label "Tipo:">
+<!ENTITY context.disablefilter.label "Desactivar filtro ?1?">
+<!ENTITY context.copyFilter.label "Copiar filtro">
+<!ENTITY context.block.label "Bloquear este elemento">
+<!ENTITY context.enablefilter.label "Re-Habilitar filtro ?1?">
+<!ENTITY detach.label "Separar">
+<!ENTITY whitelisted.label "Página de lista de Permitidos">
+<!ENTITY context.disablefilteronsite.label "Desactivar este filtro en ?1?">
+<!ENTITY detached.title "Adblock Plus: Elementos bloqueables (Separados)">
+<!ENTITY docDomain.firstParty "(propietario)">
+<!ENTITY tooltip.type.whitelisted "(permitido)">
+<!ENTITY tooltip.filter.label "Filtro en uso:">
+<!ENTITY tooltip.filter.disabled "(desactivado)">
+<!ENTITY context.editfilter.label "Editar filtro en uso">
+<!ENTITY tooltip.type.blocked "(bloqueado)">
+<!ENTITY size.label "Tamaño">
+<!ENTITY context.whitelist.label "Agregar una regla de excepción para el elemento">
+<!ENTITY context.selectAll.label "Seleccionar todo">
+<!ENTITY state.label "Estado">
+<!ENTITY docDomain.label "Fuente del documento">
+<!ENTITY tooltip.address.label "Dirección:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/subscriptionSelection.dtd
new file mode 100644
index 0000000..c43540e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/es-MX/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "A&amp;gregar suscripción de filtro &quot;?1?&quot; también">
+<!ENTITY list.download.failed "Adblock Plus ha fallado al recuperar la lista de subscripciones.">
+<!ENTITY list.download.retry "Intente de nuevo">
+<!ENTITY title.label "&amp;Titulo de la Suscripción:">
+<!ENTITY list.download.website "Ver sitio web">
+<!ENTITY supplementMessage "Esta suscripción de filtros está orientada a ser usada con la subscripción de filtro &quot;?1?&quot; la cual aun no está usando.">
+<!ENTITY viewList.label "Ver filtros">
+<!ENTITY visitHomepage.label "Visitar pagina principal">
+<!ENTITY addSubscription.label "Agregar subscripción">
+<!ENTITY dialog.title "Agregar subscripción de filtro de Adblock Plus">
+<!ENTITY location.label "&amp;Ubicación de la lista de filtros:">
+<!ENTITY fromWeb.description "Por favor confirme que desea agregar esta subscripción de filtro. Usted puede cambiar el titulo de la subscripción o la localización antes de agregarla.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/composer.dtd
new file mode 100644
index 0000000..5a0ceac
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "aadressi &amp;lõpus">
+<!ENTITY domainRestriction.label "Kehtib ainult domeenis:">
+<!ENTITY collapse.default.no.label "Kasuta vaikeväärtust (ei)">
+<!ENTITY firstParty.label "Ainult &amp;põhilehel">
+<!ENTITY preferences.label "Näita olemasolevaid filtreid...">
+<!ENTITY pattern.label "Otsitav avaldis">
+<!ENTITY thirdParty.label "Ainult &amp;väljaspoolsed">
+<!ENTITY filter.label "Uus filter:">
+<!ENTITY collapse.label "A&amp;henda blokeeritavad:">
+<!ENTITY match.warning "Sisestatud avaldis ei leia aadressist ühtegi vastet ja seega ei oma sellele mingit mõju.">
+<!ENTITY anchor.start.label "aadressi alguses">
+<!ENTITY matchCase.label "&amp;Tõstutundlik">
+<!ENTITY custom.pattern.label "L&amp;oo ise:">
+<!ENTITY unselectAllTypes.label "Tühista valik">
+<!ENTITY type.whitelist.label "&amp;Erandi reegel">
+<!ENTITY regexp.warning "Sisestatud avaldis loetakse regulaaravaldiseks, mida Adblock Plus ei suuda efektiivselt töödelda ja mis võib muuta interneti lehitsemise aeglasemaks. Kui sa tegelikult ei soovinud luua regulaaravaldist, siis lisa selle lõppu tärn (*).">
+<!ENTITY dialog.title "Lisa Adblock Plusi filtreerimisreegel">
+<!ENTITY basic.label "Tavaline vaade">
+<!ENTITY type.filter.label "Blokeeriv filter">
+<!ENTITY types.label "Rakenda tüüpidele:">
+<!ENTITY shortpattern.warning "Sisestatud avaldis on optimeerimiseks liiga lühike ja võib muuta interneti lehitsemise aeglasemaks. Soovitatav oleks valida selle filtri jaoks pikem string, mida Adblock Plusi töötleb efektiivsemalt.">
+<!ENTITY collapse.yes.label "Jah">
+<!ENTITY anchors.label "Otsitav võib olla ainult:">
+<!ENTITY collapse.default.yes.label "Kasuta vaikeväärtust (jah)">
+<!ENTITY domainRestriction.help "Sisesta üks või enam püstkriipsuga (|) eraldatud domeeninime. See filter kehtib ainult nendele domeenidele. Tilde (~) domeeninime ees näitab, et seda filtrit ei rakendata antud domeenile.">
+<!ENTITY accept.label "Lisa filter">
+<!ENTITY options.label "Valikud">
+<!ENTITY disabled.warning "Adblock Plus on hetkel keelatud olekus. Sa võid lisada filtreid, kuid neid ei rakendu enne, kui [link]lubad Adblock Plusi[/link].">
+<!ENTITY anchor.start.flexible.label "domeeninime alguses">
+<!ENTITY collapse.no.label "Ei">
+<!ENTITY selectAllTypes.label "Vali kõik">
+<!ENTITY advanced.label "Detailne vaade">
+<!ENTITY pattern.explanation "Otsitavaks võib olla aadressi suvaline osa; tärnid (*) toimivad metamärkidena. Filter kehtib ainult aadresside puhul, mis sobivad antud otsingu avaldisega.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/filters.dtd
new file mode 100644
index 0000000..29d8bc5
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Kõik su isetehtud filtrid asendatakse valitud faili sisuga. Kas soovid jätkata?">
+<!ENTITY slow.column "A&amp;eglased filtrid">
+<!ENTITY enabled.column "L&amp;ubatud">
+<!ENTITY subscription.lastDownload.checksumMismatch "Nurjus, kontrollsumma ei klapi">
+<!ENTITY noFiltersInGroup.text "Valitud grupp on tühi">
+<!ENTITY subscription.actions.label "Tegevused">
+<!ENTITY filter.selectAll.label "Vali kõik">
+<!ENTITY backupButton.label "&amp;Varundamine ja taastamine">
+<!ENTITY restore.minVersion.warning "Hoiatus: see fail on loodud uuema Adblock Plus versiooniga. Enne selle taastamist peaksid sa Adblock Plus'i uuendama viimasele versioonile.">
+<!ENTITY restore.error "Faili andmeid ei õnnestu töödelda. Kas see on ikka Adblock Plus varundusfail?">
+<!ENTITY sort.ascending.label "A &gt; Z sortimiskord">
+<!ENTITY sort.label "Sortimine">
+<!ENTITY subscription.source.label "Filtrite loetelu">
+<!ENTITY hitcount.column "&amp;Tabamusi">
+<!ENTITY noFilters.text "Sul ei ole ühtegi isetehtud filtrit.">
+<!ENTITY backup.custom.title "Ainult isetehtud filtrid">
+<!ENTITY subscription.external.label "Uuendatud mingi teise lisa poolt">
+<!ENTITY subscription.delete.label "Kustuta">
+<!ENTITY noGroupSelected.text "Enne kui filtreid saab näidata pead valima filtrite grupi.">
+<!ENTITY filter.cut.label "Lõika">
+<!ENTITY restore.default.label "Taasta andmed varukoopiast ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Laen alla...">
+<!ENTITY subscriptions.tab.label "Filtrite tellimused">
+<!ENTITY sort.descending.label "Z &gt; A sortimiskord">
+<!ENTITY filters.remove.warning "Kas soovid tõesti eemaldada kõik valitud filtrid?">
+<!ENTITY filter.delete.label "Kustuta">
+<!ENTITY addSubscriptionAdd.label "Lisa">
+<!ENTITY viewMenu.label "Vaade">
+<!ENTITY subscription.lastDownload.unknown "Pole teada">
+<!ENTITY addSubscriptionCancel.label "Loobu">
+<!ENTITY subscription.enabled.label "Lubatud">
+<!ENTITY noSubscriptions.text "Sa ei ole veel lisanud ühtegi filtrite tellimust. Adblock Plus ei blokeeri midagi ilma filtriteta. Filtrite tellimiseks klõpsa nupul &quot;Lisa filtrite tellimus&quot;.">
+<!ENTITY subscription.update.label "Uuenda filtreid">
+<!ENTITY dialog.title "Adblock Plus filtrite sätted">
+<!ENTITY addFilter.label "&amp;Lisa filter">
+<!ENTITY subscription.minVersion.warning "See filtrite tellimus nõuab uuemat Adblock Plus versiooni. Sa peaksid uuendama Adblock Plus'i.">
+<!ENTITY subscription.lastDownload.invalidURL "Nurjus, vale aadress">
+<!ENTITY backup.error "Viga filtrite faili kirjutamisel. Kontrolli, et fail ei oleks avatud mingi teise rakenduse poolt ja et fail ei oleks kirjutuskaitstud.">
+<!ENTITY filter.moveUp.label "Liiguta üles">
+<!ENTITY addGroup.label "Lisa filtrite grupp">
+<!ENTITY filter.edit.label "Muuda">
+<!ENTITY subscription.showHideFilters.label "Näita/peida filtreid">
+<!ENTITY acceptableAds2.label "Luba mõned mittepealetükkivad reklaamid">
+<!ENTITY addSubscriptionOther.label "Lisa muu tellimus">
+<!ENTITY close.label "Sulge">
+<!ENTITY sort.none.label "S&amp;ortimata">
+<!ENTITY filter.actions.label "Filtri tegevused">
+<!ENTITY filter.copy.label "Kopeeri">
+<!ENTITY filter.moveDown.label "Liiguta alla">
+<!ENTITY filter.resetHitCounts.label "Nullista tabamuste statistika">
+<!ENTITY readMore.label "Loe lisaks">
+<!ENTITY subscription.moveUp.label "Liiguta üles">
+<!ENTITY addSubscription.label "Lisa filtrite tellimus">
+<!ENTITY subscription.homepage.label "Koduleht">
+<!ENTITY backup.complete.title "Kõik filtrid ja tellimused">
+<!ENTITY restore.own.label "Taasta andmed mujalt">
+<!ENTITY restore.complete.warning "Kõik filtrite sätted asendatakse valitud faili sisuga. Kas soovid jätkata?">
+<!ENTITY filters.tab.label "Isetehtud filtrid">
+<!ENTITY backup.label "Loo uus varukoopia">
+<!ENTITY find.label "&amp;Otsi">
+<!ENTITY subscription.moveDown.label "Liiguta alla">
+<!ENTITY subscription.lastDownload.connectionError "Nurjus, allalaadimise viga">
+<!ENTITY subscription.lastDownload.success "Õnnestus">
+<!ENTITY subscription.lastDownload.invalidData "Nurjus, vale filtrite nimekiri">
+<!ENTITY filter.paste.label "Aseta">
+<!ENTITY subscription.disabledFilters.enable "Luba keelatud filtrid">
+<!ENTITY lasthit.column "&amp;Viimane tabamus">
+<!ENTITY subscription.editTitle.label "Muuda pealkirja">
+<!ENTITY subscription.disabledFilters.warning "Mõned selle tellimuse filtrid on keelatud.">
+<!ENTITY filter.column "Filtri reegel">
+<!ENTITY subscription.lastDownload.label "Viimati alla laaditud:">
+<!ENTITY viewList.label "Vaata loetelu">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/firstRun.properties
new file mode 100644
index 0000000..fdc591a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_toggle_off=VÄLJAS
+firstRun_feature_tracking=Keela Jälgimine
+firstRun_title=Adblock Plus on paigaldatud
+firstRun_toggle_on=SEES
+firstRun_feature_malware=Viiruste blokeerimine
+firstRun_feature_social=Eemalde sotsiaalse meedia nuppe
+firstRun_acceptableAdsHeadline=Tüütud kuulutused on nüüd blokeeritud
+firstRun_share=Räägi oma sõpradele
+firstRun_share_headline=<a>Anna meile käsi</a> veebi muutmises paremaks kohaks
+firstRun_donate=anneta
+firstRun_donate_label=Toeta meie projekti
+firstRun_feature_tracking_description=Browse privately by disabling tracking - hiding your tracks from ad companies that would track your every move.
+firstRun_acceptableAdsExplanation=We'd like to encourage websites to use straightforward, unobtrusive advertising. That's why we've established <a>strict guidelines</a> to identify acceptable ads, which are shown under default settings. If you still want to block every ad you can <a>disable</a> this in a few seconds.
+firstRun_contributor_credits=Contributor Credits
+firstRun_dataCorruptionWarning=Does this page keep showing up? <a>Click here!</a>
+firstRun_feature_social_description=Automatically rid your browsing experience of social media buttons, such as the Facebook Like, which appear on web pages and track your behavior.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
+firstRun_feature_malware_description=Make your browsing more secure by blocking known malware domains.
+firstRun_features=Adblock Plus can do more than block ads
+firstRun_legacySafariWarning=You are using an old version of Safari which is not supported by Adblock Plus. It might not work correctly or impair the user experience on some websites. We strongly recommend to either update to Safari 6.1.1 or higher (on OS X 10.8 Mountain Lion), or Safari 7.0.1 or higher (on OS X 10.9 Mavericks), or to use the latest version of Mozilla Firefox, Google Chrome or Opera.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/global.properties
new file mode 100644
index 0000000..7802c1e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Antud lehel ei leidu blokeeritavaid elemente
+action3_tooltip=Hiireklõps lubab/keelab Adblock Plusi.
+type_label_script=skript
+filter_elemhide_nocriteria=Pole antud ühtegi kriteeriumit peidetava elemendi äratundmiseks
+blockingGroup_title=Blokeerivad reeglid
+whitelisted_tooltip=Antud lehel on Adblock Plus keelatud.
+type_label_stylesheet=laaditabel
+blocked_count_tooltip=?1?, elemente kokku ?2?
+type_label_font=font
+type_label_popup=hüpikaken
+filter_regexp_tooltip=Antud filter on kas regulaaravaldis või optimeerimiseks liiga lühike. Selliste filtrite suur hulk võib muuta interneti lehitsemine aeglaseks.
+action0_tooltip=Hiireklõps avab kontekstimenüü, klõps keskmisel nupul lubab/keelab lisa.
+whitelisted_page=Adblock Plus on antud lehel keelatud
+remove_group_warning=Kas oled kindel, et soovid seda gruppi kustutada?
+action1_tooltip=Hiireklõps avab/sulgeb blokeeritavad elemendid, klõps keskmisel nupul lubab/keelab lisa.
+type_label_xmlhttprequest=XML päring
+active_tooltip=Adblock Plus on lubatud, kasutusel on ?1? filtrite tellimus(t) ja ?2? isetehtud filtrit.
+type_label_document=dokument
+type_label_object_subrequest=objekti alampäring
+whitelistGroup_title=Erandite reeglid
+disabled_tooltip=Adblock Plus on keelatud.
+filter_elemhide_duplicate_id=Määratleda saab ainult ühe peidetava elemendi ID
+type_label_object=objekt
+action2_tooltip=Hiireklõps avab sätted, klõps keskmisel nupul lubab/keelab lisa.
+type_label_subdocument=raam
+clearStats_warning=See nullistab kõigi filtrite tabamuste statistika ja keelab filtrite tabamuste loendamise. Kas soovid jätkata?
+blocked_count_addendum=(valges nimekirjas: ?1?, peidetud: ?2?)
+subscription_invalid_location=Filtrite nimekirja asukoht on kas vigane URL või failinimi.
+type_label_image=pilt
+remove_subscription_warning=Kas oled kindel, et soovid selle tellimuse eemaldata?
+type_label_other=muu
+mobile_menu_enable=ABP: Luba
+type_label_media=heli/video
+mobile_menu_disable_site=ABP: Keela saidil ?1?
+elemhideGroup_title=Elemendi peitmise reeglid
+mobile_menu_enable_site=ABP: Luba saidil ?1?
+type_label_elemhide=peidetud
+newGroup_title=Uus filtrite grupp
+default_dialog_title=Adblock Plus
+notification_antiadblock_title=Hide targeted messages?
+notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages?
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/overlay.dtd
new file mode 100644
index 0000000..4750c46
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY sync.label "Sün&amp;kroniseeri Adblock Plus sätted">
+<!ENTITY whitelist.site.label "Keela domeenis ?1?">
+<!ENTITY filters.label "Filtrite sätted">
+<!ENTITY disable.label "Keela kõikjal">
+<!ENTITY objecttab.title "Blokeeri">
+<!ENTITY objecttab.tooltip "Klõpsa siia selle objekti blokeerimiseks Adblock Plusi abil">
+<!ENTITY menuitem.label "Adblock Plusi sätted">
+<!ENTITY objecttabs.label "Näita Flash ja Java objektidel sakke">
+<!ENTITY sendReport.label "&amp;Teata probleemist antud lehel">
+<!ENTITY whitelist.page.label "Keela ainult antud lehel">
+<!ENTITY context.image.label "Adblock Plus: Blokeeri pilt">
+<!ENTITY counthits.label "Loenda &amp;filtrite tabamusi">
+<!ENTITY opensidebar.label "Ava blokeeritavad elemendid">
+<!ENTITY contribute.label "Toeta Adblock Plus'i">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Blokeeri raam">
+<!ENTITY blocked.tooltip "Blokeeritud elemendid antud lehel:">
+<!ENTITY hideplaceholders.label "Peida blokeeritud elementide kohatäitjad">
+<!ENTITY showinstatusbar.label "Näita &amp;olekuribal">
+<!ENTITY sidebar.title "Blokeeritavad elemendid antud lehel">
+<!ENTITY options.label "V&amp;alikud">
+<!ENTITY context.object.label "Adblock Plus: Blokeeri objekt">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Luba uuesti antud lehel">
+<!ENTITY filters.tooltip "Kõige aktiivsemad filtrid:">
+<!ENTITY closesidebar.label "Sulge blokeeritavad elemendid">
+<!ENTITY showintoolbar.label "Nä&amp;ita tööriistade menüüs">
+<!ENTITY status.tooltip "Olek:">
+<!ENTITY context.media.label "Adblock Plus: Blokeeri audio/video">
+<!ENTITY subscription.update.label "Uuenda filtreid">
+<!ENTITY notification.button.yes "&amp;Yes">
+<!ENTITY notification.button.no "&amp;No">
+<!ENTITY notification.button.close "&amp;Close">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/sendReport.dtd
new file mode 100644
index 0000000..ca6e99a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Tü&amp;hista">
+<!ENTITY issues.disabledgroups.description "Järgnevad filtrite tellimused/filtrigrupid on keelatud, ent nad võivad siiski veel sellel lehel toimida:">
+<!ENTITY showData.label "Näita teate andmeid">
+<!ENTITY typeSelector.falsePositive.label "Adblock &amp;Plus blokeerib liiga palju">
+<!ENTITY issues.change.description "Seadistust on muudetud. Palun laadi leht uuesti muudatuste testimiseks ja teata probleemist, kui see muudatus ei lahendanud probleemi.">
+<!ENTITY email.label "E-&amp;post:">
+<!ENTITY issues.openPreferences.label "Ava filtri sätted">
+<!ENTITY sendPage.confirmation "Su teade on salvestatud. Sa võid sellele ligi pääseda järgneval aadressil:">
+<!ENTITY copyLink.label "&amp;Kopeeri teate link">
+<!ENTITY issues.nofilters.description "Adblock Plus ei blokeeri praegusel lehel midagi. See probleem ei ole tõenäoliselt Adblock Plusiga seotud.">
+<!ENTITY sendPage.knownIssue "Seda probleemi tõenäoliselt juba teatakse. Rohkem infot:">
+<!ENTITY typeSelector.other.description "Vali see variant juhul kui sa kahtlustad, et probleem on pigem Adblock Plusis kui selle filtrites.">
+<!ENTITY issues.disabledgroups.enable.label "Luba filtrite tellimus/filtrigrupp">
+<!ENTITY typeWarning.override.label "&amp;Ma mõistan ja soovin siiski probleemist teada anda">
+<!ENTITY issues.disabled.enable.label "Luba Adblock Plus">
+<!ENTITY update.fixed.description "Filtrite tellimuste uuendused lahendasid tõenäoliselt selle probleemi, millest sa teatasid. Palun lae leht uuesti ja ürita uuesti. Teata uuesti, kui probleemid jäid alles.">
+<!ENTITY anonymous.label "&amp;Anonüümne esitamine">
+<!ENTITY reloadButton.label "&amp;Laadi leht uuesti">
+<!ENTITY recentReports.clear.label "&amp;Kustuta kõik teated">
+<!ENTITY typeSelector.description "Antud aknas saab teatada Adblock Plusi probleemidest, tehes läbi vajalikud sammud. Kõigepealt tuleb valida probleemi liik, millega sa antud lehel kokku puutud:">
+<!ENTITY screenshot.remove.label "Eema&amp;lda tundlikud andmed">
+<!ENTITY issues.ownfilters.description "Mõned sellel lehel kehtivad filtrid on loonud kasutaja. Palun keela need filtrid mis võiksid põhjustada seda probleemi:">
+<!ENTITY update.inProgress.description "Adblock Plus peab uuendama filtrite tellimusi, olemaks kindel, et see probleem ei ole juba lahendatud. Palun oota...">
+<!ENTITY sendPage.retry.label "Saada uuesti">
+<!ENTITY data.label "T&amp;eate andmed:">
+<!ENTITY recentReports.label "Sinu viimati esitatud teated">
+<!ENTITY typeWarning.description "Sa märkisid, et soovid teatada Adblock Plusi üldisest probleemist ja mitte probleemist filtritega. Pane tähele, et selliseid probleeme on kõige parem teatada [link]Adblock Plusi foorumis[/link]. Sa peaksid kasutama probleemist teatamise abivahendit ainult selleks, et täiendada olemasolevat arutelu, sest mitte keegi ei märka su teadet kui sa ei pane selle juurde linki. Automaatselt genereeritud link luuakse peale probleemi edastamist.">
+<!ENTITY issues.disabled.description "Adblock Plus on keelatud, see ei blokeeri hetkel midagi.">
+<!ENTITY attachExtensions.label "Pa&amp;ne teatele kaasa aktiivsete lisade nimekiri juhuks, kui probleemi põhjuseks on lisade konflikt">
+<!ENTITY issues.nosubscriptions.add.label "Lisa filtrite tellimus">
+<!ENTITY issues.disabledfilters.enable.label "Luba filter">
+<!ENTITY issues.override.label "Antud seadistus &amp;on õige. Jätka aruandmist">
+<!ENTITY issues.nosubscriptions.description "Sa ei paista olevat tellinud ühtegi filtrite nimekirja, mis eemaldavad automaatselt veebilehtedelt soovimata sisu.">
+<!ENTITY typeSelector.falsePositive.description "Vali see variant juhul kui lehel on kaduma läinud oluline sisu, lehte kuvatakse valesti või kui see ei tööta korralikult. Et teha kindlaks, kas Adblock Plus on selle probleemi põhjustaja, võid ta ajutiselt ära keelata.">
+<!ENTITY typeSelector.other.label "&amp;Muu probleem">
+<!ENTITY emailComment.label "Me soovitame sul sisestada oma kehtiva meiliaadressi, et saaksime küsimuste tekkimisel antud teate kohta sinuga ühendust võtta. Samuti aitab see suurendada sinu teadete prioriteeti.">
+<!ENTITY issues.whitelist.remove.label "Luba uuesti Adblock Plus sellel lehel">
+<!ENTITY outdatedSubscriptions.description "Järgmisi filtrite tellimusi ei ole uuendatud vähemalt kahe nädala jooksul. Palun uuenda neid tellimusi enne veaaruande esitamist, sest probleem võib olla juba lahendatud.">
+<!ENTITY dataCollector.description "Palun oota mõni hetk kuni Adblock Plus kogub vajalikke andmeid.">
+<!ENTITY sendButton.label "S&amp;aada teade">
+<!ENTITY comment.label "&amp;Kommentaar (valikuline):">
+<!ENTITY sendPage.errorMessage "Teate saatmine ebaõnnestus. Veakood &quot;?1?&quot;. Palun kontrolli, et su internetiühendus töötab ja proovi uuesti. Kui see probleem kordub, siis küsi abi [link]Adblock Plus foorumist[/link].">
+<!ENTITY showRecentReports.label "Näita viimati esitatud teateid">
+<!ENTITY commentPage.heading "Kommenteeri">
+<!ENTITY update.start.label "Alusta kohe uuendamist">
+<!ENTITY issues.disabledfilters.description "Järgnevad filtrid on keelatud, ent nad võivad siiski veel sellel lehel toimida:">
+<!ENTITY screenshot.description "Sama lehekülg võib erinevatel inimestel paista erinevalt. Teatele ekraanipildi lisamine võib aidata meil probleemist aru saada. Sa võid välja lõigata osad, mis sisaldavad tundlikku informatsiooni ja samuti ära märkida piirkonnad, kus probleem on märgatav. Selle tegemiseks klõpsa vastavale nupule ja vali hiirega pildi osa.">
+<!ENTITY screenshot.attach.label "P&amp;ane teatele kaasa pilt leheküljest">
+<!ENTITY issues.whitelist.description "Adblock Plus on praegu keelatud sinu poolt teatataval lehel. Palun luba see uuesti ja laadi leht uuesti enne teate saatmist, et hõlbustada selle probleemi lahendamist.">
+<!ENTITY typeSelector.falseNegative.label "Ad&amp;block Plus ei blokeeri reklaami">
+<!ENTITY typeSelector.heading "Vali probleemi liik">
+<!ENTITY anonymity.warning "Meil ei ole võimalik sinu poole tagasi pöörduda ja tõenäoliselt omistame sellele teatele madamala prioriteedi.">
+<!ENTITY wizard.title "Probleemidest teatamine">
+<!ENTITY issues.ownfilters.disable.label "Keela filter">
+<!ENTITY commentPage.description "Järgnevasse tekstivälja saad lisada oma kommentaari, et aidata meil probleemist aru saada. See ei ole kohustuslik, kuid on soovitatav kui probleem ei ole selgelt arusaadav. Sa võid samuti üle vaadata aruande andmed enne kui need ära saadetakse.">
+<!ENTITY comment.lengthWarning "Kommentaari pikkus ületab 1000 tähemärki. Ära saadetakse ainult esimesed 1000 tähemärki.">
+<!ENTITY typeSelector.falseNegative.description "Vali see variant juhul kui reklaami kuvatakse hoolimata sellest, et Adblock Plus on lubatud.">
+<!ENTITY sendPage.waitMessage "Palun oota kuni Adblock Plus edastab teadet.">
+<!ENTITY dataCollector.heading "Tere tulemast kasutama probleemidest teatamise abivahendit">
+<!ENTITY screenshot.heading "Lisa ekraanipilt">
+<!ENTITY sendPage.heading "Saada teade">
+<!ENTITY issues.subscriptionCount.description "Paistab, et sul on liiga palju filtrite tellimusi. Selline seadistus ei ole soovitatav, sest vigade tekkimise tõenäosus on nüüd palju suurem. Me ei saa ka vastu võta sinu probleemist teatamise aruannet, sest pole selge, millise filtrite tellimuse autor peab selle probleemiga tegelema. Palun kustuta kõik filtrite tellimused ja jäta alles ainult hädavajalikud ning kontrolli, kas probleem on ikka veel alles.">
+<!ENTITY screenshot.mark.label "&amp;Märgista probleem">
+<!ENTITY privacyPolicy.label "Privaatsus">
+<!ENTITY issues.description "Adblock Plus on kindlaks teinud probleemid su praeguses seadistuses, mis võivad seda probleemi põhjustada või teha selle teate uurimise keeruliseks.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/sidebar.dtd
new file mode 100644
index 0000000..3043e96
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Flash elemendi piirid">
+<!ENTITY address.label "Aadress">
+<!ENTITY context.open.label "Ava uuel kaardil">
+<!ENTITY type.label "Tüüp">
+<!ENTITY tooltip.filterSource.label "Filtri asukoht:">
+<!ENTITY noitems.label "Blokeeritavaid elemendid puuduvad">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Suurus:">
+<!ENTITY reattach.label "Haagi tagasi">
+<!ENTITY search.label "Ot&amp;sing:">
+<!ENTITY docDomain.thirdParty "(väljaspoolt)">
+<!ENTITY filterSource.label "Filtri allikas">
+<!ENTITY tooltip.docDomain.label "Dokumendi allikas:">
+<!ENTITY context.copy.label "Kopeeri elemendi aadress">
+<!ENTITY tooltip.type.label "Tüüp:">
+<!ENTITY context.disablefilter.label "Keela filter ?1?">
+<!ENTITY context.copyFilter.label "Kopeeri filter">
+<!ENTITY context.block.label "Blokeeri see element">
+<!ENTITY context.enablefilter.label "Luba taas filter ?1?">
+<!ENTITY detach.label "Haagi lahti">
+<!ENTITY whitelisted.label "Lehekülg on valges nimekirjas">
+<!ENTITY context.disablefilteronsite.label "Keela see filter domeenis ?1?">
+<!ENTITY detached.title "Adblock Plus: Blokeeritavad elemendid (lahti haagitud)">
+<!ENTITY docDomain.firstParty "(põhileht)">
+<!ENTITY tooltip.type.whitelisted "(valges nimekirjas)">
+<!ENTITY tooltip.filter.label "Kehtiv filter:">
+<!ENTITY tooltip.filter.disabled "(keelatud)">
+<!ENTITY context.editfilter.label "Muuda kehtivat filtrit">
+<!ENTITY tooltip.type.blocked "(blokeeritud)">
+<!ENTITY size.label "Suurus">
+<!ENTITY context.whitelist.label "Lisa antud elemendile erandi reegel">
+<!ENTITY context.selectAll.label "Vali kõik">
+<!ENTITY state.label "Olek">
+<!ENTITY docDomain.label "Dokumendi allikas">
+<!ENTITY tooltip.address.label "Aadress:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/subscriptionSelection.dtd
new file mode 100644
index 0000000..082ab98
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/et/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Lisa ka filtrite tellimus &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plusil ei õnnestunud alla laadida tellimuste nimekirja.">
+<!ENTITY list.download.retry "Proovi uuesti">
+<!ENTITY title.label "Tellimuse &amp;pealkiri:">
+<!ENTITY list.download.website "Külasta kodulehte">
+<!ENTITY supplementMessage "See filtrite tellimus on mõeldud kasutamiseks koos filtrite tellimusega &quot;?1?&quot; mida sa veel ei kasuta.">
+<!ENTITY viewList.label "Vaata filtreid">
+<!ENTITY visitHomepage.label "Külasta kodulehte">
+<!ENTITY addSubscription.label "Lisa tellimus">
+<!ENTITY dialog.title "Lisa Adblock Plus filtrite tellimus">
+<!ENTITY location.label "Filtrite nimekirja asukoht:">
+<!ENTITY fromWeb.description "Palun kinnita, et soovid lisada selle filtrite tellimuse. Enne lisamist saad muuta tellimuse pealkirja või asukohta.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/composer.dtd
new file mode 100644
index 0000000..ae82d94
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "helbidearen &amp;bukaeran">
+<!ENTITY domainRestriction.label "Mugatu &amp;domeinu honetara:">
+<!ENTITY collapse.default.no.label "Erabili lehenetsitakoa (ez)">
+<!ENTITY firstParty.label "Lehen es&amp;kukoa soilik">
+<!ENTITY preferences.label "&amp;Erakutsi dauden iragazkiak...">
+<!ENTITY pattern.label "Bilatu eredua">
+<!ENTITY thirdParty.label "Ka&amp;npotik jasoa soilik">
+<!ENTITY filter.label "&amp;Iragazki berria:">
+<!ENTITY collapse.label "Ko&amp;lapso blokeatuta:">
+<!ENTITY match.warning "Sartu duzun ereduak ez du blokeatu/desblokeatu nahi duzun helbidearekin bat egiten eta ez du inolako eraginik izango.">
+<!ENTITY anchor.start.label "helbidearen &amp;hasieran">
+<!ENTITY matchCase.label "Bereizi letra &amp;Larriak/xeheak">
+<!ENTITY custom.pattern.label "&amp;Pertsonalizatua:">
+<!ENTITY unselectAllTypes.label "Ez aukeratu bat ere ez">
+<!ENTITY type.whitelist.label "&amp;Salbuespen-araua">
+<!ENTITY regexp.warning "Sartu duzun eredua adierazpen erregulartzat hartuko da, Adblock Plusek ezin ditu azkar prozesatu eta honek zure nabigazioa moteldu dezake. Zure asmoa ez bazen adierazpen erregular bat erabiltzea, gehitu izarño bat (*) ereduaren bukaeran.">
+<!ENTITY dialog.title "Gehitu Adblock Plus iragazki-araua">
+<!ENTITY basic.label "Oinarrizko ikuspegia">
+<!ENTITY type.filter.label "&amp;Blokeatzeko iragazkia">
+<!ENTITY types.label "Aplikatu mota hauei:">
+<!ENTITY shortpattern.warning "Sartu duzun eredua laburregia da optimizatu ahal izateko eta zure nabigazioa moteldu dezake. Testu kate luzeago bat aukeratzea aholkatzen da Adblock Plusek azkarrago prozesatu dezan.">
+<!ENTITY collapse.yes.label "Bai">
+<!ENTITY anchors.label "Onartu eredua soilik:">
+<!ENTITY collapse.default.yes.label "Erabili lehenetsitakoa (bai)">
+<!ENTITY domainRestriction.help "Erabili aukera hau domeinu bat edo gehiago zehazteko marra bertikal batez banatuta (|). Iragazkia aukeratutako domeinuetan erabiliko da soilik. Gehitu tilet bat (~) domeinuaren aurretik domeinu horretan iragazkia ez erabiltzeko.">
+<!ENTITY accept.label "Gehitu iragazkia">
+<!ENTITY options.label "Aukerak">
+<!ENTITY disabled.warning "Adblock Plus orain desgaituta dago. Iragazkiak gehitu ditzakezu baina ez dira aplikatuko ez baduzu [link]Adblock Plus gaitzen[/link].">
+<!ENTITY anchor.start.flexible.label "domeinu izenaren &amp;hasieran">
+<!ENTITY collapse.no.label "Ez">
+<!ENTITY selectAllTypes.label "Aukeratu denak">
+<!ENTITY advanced.label "Ikuspegi aurreratua">
+<!ENTITY pattern.explanation "Eredua helbidearen edozein atal izan daiteke; izarñoa (*) komodin lanak egiten ditu, zernahitarako balio du. Iragazkia soilik aplikatuko da ereduarekin bat datozen helbideetan.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/filters.dtd
new file mode 100644
index 0000000..71aabc9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/filters.dtd
@@ -0,0 +1,73 @@
+<!ENTITY restore.custom.warning "Zure iragazki pertsonal guztiak aukeratutako fitxategiko edukiarekin ordeztuko dira. Aurrera jarraitu nahi duzu?">
+<!ENTITY slow.column "Iraga&amp;zki motelak">
+<!ENTITY enabled.column "&amp;Gaituta">
+<!ENTITY subscription.lastDownload.checksumMismatch "Errorea; kontrol-baturak ez datoz bat">
+<!ENTITY noFiltersInGroup.text "Aukeratutako taldea hutsik dago">
+<!ENTITY subscription.actions.label "Ekintzak">
+<!ENTITY filter.selectAll.label "Denak aukeratu">
+<!ENTITY backupButton.label "Segu&amp;rtasun kopia eta berrezartzea">
+<!ENTITY restore.minVersion.warning "Oharra: fitxategi hau Adblock Plusen bertsio berriago batekin sortu da. Adblock Plus azken bertsiora eguneratu beharko zenuke fitxategi hau berrezarri aurretik.">
+<!ENTITY restore.error "Fitxategiko datuak ezin dira prozesatu, agian ez da Adblock Plus segurtasun kopia bat?">
+<!ENTITY sort.ascending.label "&amp;A &gt; Z ordena">
+<!ENTITY sort.label "Ordenatu honen ara&amp;bera">
+<!ENTITY subscription.source.label "Iragazki zerrenda">
+<!ENTITY hitcount.column "&amp;Bategiteak">
+<!ENTITY noFilters.text "Ez duzu pertsonalizatutako iragazkirik oraindik.">
+<!ENTITY backup.custom.title "Iragazki pertsonalak soilik">
+<!ENTITY subscription.external.label "Beste gehigarri batek eguneratua">
+<!ENTITY subscription.delete.label "Ezabatu">
+<!ENTITY noGroupSelected.text "Iragazki talde bat aukeratu behar duzu bere iragazkiak ikusi ahal izateko">
+<!ENTITY filter.cut.label "Moztu">
+<!ENTITY restore.default.label "?1? segurtasun kopiatik berrezarri">
+<!ENTITY subscription.lastDownload.inProgress "Deskargatzen...">
+<!ENTITY subscriptions.tab.label "Iragazki harpidetzak">
+<!ENTITY sort.descending.label "&amp;Z &gt; A ordena">
+<!ENTITY filters.remove.warning "Benetan ezabatu nahi dituzu aukeratutako iragazkiak?">
+<!ENTITY filter.delete.label "Ezabatu">
+<!ENTITY addSubscriptionAdd.label "Gehitu">
+<!ENTITY viewMenu.label "Ikusi">
+<!ENTITY subscription.lastDownload.unknown "Ez erabilgarri">
+<!ENTITY addSubscriptionCancel.label "Utzi bertan behera">
+<!ENTITY subscription.enabled.label "Gaituta">
+<!ENTITY noSubscriptions.text "Ez duzu harpidetzarik gehitu oraindik. Adblock Plusek du ezer blokeatuko iragazkirik gabe; mesedez, erabili &quot;Gehitu iragazki harpidetza&quot;
+ iragazkiak gehitzeko.">
+<!ENTITY subscription.update.label "Eguneratu iragazkiak">
+<!ENTITY dialog.title "Adblock Plus iragazki hobespenak">
+<!ENTITY addFilter.label "Gehitu iraga&amp;zkia">
+<!ENTITY subscription.minVersion.warning "Iragazki harpidetzak Adblock Plus bertsio berria behar du, azken bertsiora eguneratu beharko zenuke Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Huts egin du; ez da helbide baliagarria">
+<!ENTITY backup.error "Iragazkiak fitxategira idazteak errore bat gertatu da. Egiaztatu fitxategian idaztea dagoela eta ez duela beste aplikazio batek blokeatu.">
+<!ENTITY filter.moveUp.label "Igo">
+<!ENTITY addGroup.label "Gehitu &amp;talde iragazkia">
+<!ENTITY filter.edit.label "Editatu">
+<!ENTITY subscription.showHideFilters.label "Erakutsi/ezkutatu iragazkiak">
+<!ENTITY acceptableAds2.label "Baimendu publizitate ez &amp;intrusiboa">
+<!ENTITY addSubscriptionOther.label "Gehitu beste harpidetza bat">
+<!ENTITY close.label "Itxi">
+<!ENTITY sort.none.label "Ordenatu &amp;gabe">
+<!ENTITY filter.actions.label "Iragazki ekintzak">
+<!ENTITY filter.copy.label "Kopiatu">
+<!ENTITY filter.moveDown.label "Jaitsi">
+<!ENTITY filter.resetHitCounts.label "Garbitu bategite estatistikak">
+<!ENTITY readMore.label "Gehiago irakurri">
+<!ENTITY subscription.moveUp.label "Igo">
+<!ENTITY addSubscription.label "Geh&amp;itu iragazki harpidetza">
+<!ENTITY subscription.homepage.label "Hasiera orria">
+<!ENTITY backup.complete.title "Iragazki eta harpidetza guztiak">
+<!ENTITY restore.own.label "Segurtasun kopia propioa berrezarri">
+<!ENTITY restore.complete.warning "Zure iragazki hobespen guztiak aukeratutako fitxategiko edukiarekin ordeztuko dira. Aurrera jarraitu nahi duzu?">
+<!ENTITY filters.tab.label "Pertsonalizatutako iragazkiak">
+<!ENTITY backup.label "Sortu segurtasun kopia berria">
+<!ENTITY find.label "&amp;Bilatu">
+<!ENTITY subscription.moveDown.label "Jaitsi">
+<!ENTITY subscription.lastDownload.connectionError "Huts egin du; deskarga errorea">
+<!ENTITY subscription.lastDownload.success "Ongi">
+<!ENTITY subscription.lastDownload.invalidData "Huts egin du; ez da iragazki zerrenda baliagarria">
+<!ENTITY filter.paste.label "Itsatsi">
+<!ENTITY subscription.disabledFilters.enable "Gaitu desgaitutako iragazkiak">
+<!ENTITY lasthit.column "&amp;Azken bategitea">
+<!ENTITY subscription.editTitle.label "Editatu izenburua">
+<!ENTITY subscription.disabledFilters.warning "Harpidetza honetako iragazki batzuk desgaituta daude.">
+<!ENTITY filter.column "&amp;Iragazki araua">
+<!ENTITY subscription.lastDownload.label "Azken deskarga:">
+<!ENTITY viewList.label "Ikusi zerrenda">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/firstRun.properties
new file mode 100644
index 0000000..86b4926
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Jarraitzea blokeatuz pribatuki nabigatu - Zure nondik norakoak dena jakin nahi duten publizitate konpainiei ezkutatuz.
+firstRun_toggle_off=EZGAITUA
+firstRun_feature_tracking=Ezgaitu jarraipena
+firstRun_feature_malware=Programa kaltegarriak geldiarazi
+firstRun_title=Adblock Plus instalatu da
+firstRun_acceptableAdsExplanation=Webguneak publizitate zintzoa eta ez intrusiboa erabiltzera bultzatu nahi ditugu. Horregatik <a>arau zorrotzak</a> ezarri ditugu iragarki onargarriak bereizteko, lehenetsitako hobespenetan daude ikusgai. Iragarki guztiak blokeatu nahi badituzu aukera hau <a>desgaitu</a> dezakezu.
+firstRun_toggle_on=GAITUA
+firstRun_contributor_credits=Parte-hartzaileen kredituak
+firstRun_dataCorruptionWarning=Orri hau behin eta berriro agertzen dela? <a>Egin klik hemen!</a>
+firstRun_acceptableAdsHeadline=Iragarki gogaikarriak blokeatuko dira orain
+firstRun_share=Esan zure lagunei
+firstRun_share_headline=<a>Lagundu gaitzazu</a> web-a hobetzen
+firstRun_features=Adblock Plus iragarkiak blokeatzea baino gehiago egin dezake
+firstRun_feature_malware_description=Malware domeinuak blokeatuz zure nabigazioa ziurragoa egin.
+firstRun_feature_social_description=Automatikoki kendu gizarte sare botoiak webguneetatik, Facebook Like kasu, zure nondik norakoak gordetzen dituzten webguneetan agertu ohi dira.
+firstRun_donate=diruz lagundu
+firstRun_donate_label=Babestu gure proiektua
+firstRun_feature_social=Kendu gizarte-sareetako botoiak
+firstRun_legacySafariWarning=Adblock Plus-ekin bateragarria ez den Safari nabigatzailearen bertsio zahar bat erabiltzen ari zara. Agian ez da behar bezala ibiliko, edo webgune batzuen erabilera oztopatuko du. Mesedez Safari 6.11 edo berriagoa den bertsio batetara eguneratu (Mac OS X 10.8 Mountain Lion bertsiotik aurrera eskuragarri dago) edo Safari 7.0.1 (OS X 10.9 Mavericks bertsioan), edo erabili Mozilla Firefox, Google Chrome edo Opera nabigatzaileen azken bertsioa.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/global.properties
new file mode 100644
index 0000000..1dc9c84
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Ez dago elementu blokeagarririk uneko orrian
+action3_tooltip=Egin klik Adblock Plus gaitzeko/desgaitzeko.
+type_label_script=scripta
+filter_elemhide_nocriteria=Ez da zehaztu ezkutatu beharreko elementua aurkitzeko irizpiderik
+blockingGroup_title=Publizitatea blokeatzeko arauak
+whitelisted_tooltip=Adblock Plus orri honetan desgaituta dago.
+type_label_stylesheet=estilo orria
+blocked_count_tooltip=?1? / ?2?
+type_label_font=letra-tipoa
+type_label_popup=pop-up leihoa
+filter_regexp_tooltip=Iragazki hau adierazpen erregular bat da edo optimizatzeko laburregia da. Honelako iragazki gehiegik nabigazioa motelduko dute.
+action0_tooltip=Egin klik testuinguru menua atera dadin; egin erdiko klika gaitzeko/desgaitzeko.
+whitelisted_page=Adblock Plus ezgaitu egin da uneko orrirako
+remove_group_warning=Ziur talde hau ezabatu nahi duzula?
+action1_tooltip=Egin klik elementu blokeagarriak irekitzeko/ixteko; egin erdiko klika gaitzeko/desgaitzeko.
+type_label_xmlhttprequest=XML eskakizuna
+active_tooltip=Adblock Plus gaituta dago, ?1? iragazki harpidetza eta ?2? iragazki pertsonal erabiliz.
+type_label_document=dokumentua
+type_label_object_subrequest=objektu azpieskakizuna
+whitelistGroup_title=Salbuespen arauak
+disabled_tooltip=Adblock Plus ezgaituta dago.
+filter_elemhide_duplicate_id=Ezkutatu beharreko elementuaren ID bakarra zehaztu daiteke
+type_label_object=objektua
+action2_tooltip=Egin klik hobespenak irekitzeko, egin erdiko klika gaitzeko/desgaitzeko.
+type_label_subdocument=markoa
+clearStats_warning=Honek bategite estatistika guztiak ezabatuko ditu eta iragazkien bategiteak zenbatzeari utziko zaio. Aurrera jarraitu nahi duzu?
+blocked_count_addendum=(baita baimenduta: ?1?, ezkutuan: ?2?)
+subscription_invalid_location=Iragazki zerrendaren kokagunea ez da balio duen URLa, ezta fitxategi baten izena ere.
+type_label_image=irudia
+remove_subscription_warning=Ziur harpidetza hau ezabatu nahi duzula?
+type_label_other=beste bat
+mobile_menu_enable=ABP: Gaitua
+type_label_media=audioa/bideoa
+mobile_menu_disable_site=ABP: Desgaitua ?1? horretan
+elemhideGroup_title=Elementuak ezkutatzeko arauak
+mobile_menu_enable_site=ABP: Gaitua ?1? horretan
+type_label_elemhide=ezkutuan
+newGroup_title=Iragazki talde berria
+default_dialog_title=Adblock Plus
+notification_antiadblock_title=Hide targeted messages?
+notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages?
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/overlay.dtd
new file mode 100644
index 0000000..21efd6c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY sync.label "&amp;Sinkronizatu Adblock Plus ezarpenak">
+<!ENTITY whitelist.site.label "Ezgaitu hemen: ?1?">
+<!ENTITY filters.label "&amp;Iragazki hobespenak">
+<!ENTITY disable.label "Ezgaitu edonon">
+<!ENTITY objecttab.title "Blokeatu">
+<!ENTITY objecttab.tooltip "Egin klik hemen objektu hau Adblock Plusekin blokeatzeko">
+<!ENTITY menuitem.label "Adbloc&amp;k Plus hobespenak">
+<!ENTITY objecttabs.label "Erakutsi &amp;fitxak Flash eta Javan">
+<!ENTITY sendReport.label "Orri hone&amp;tan sortutako arazo bati buruzko txostena egin">
+<!ENTITY whitelist.page.label "Ezgaitu orri honetan soilik">
+<!ENTITY context.image.label "Adblock Plus: Irudia blokeatu">
+<!ENTITY counthits.label "Zenbatu iragazkien &amp;bategiteak">
+<!ENTITY opensidebar.label "Ire&amp;ki elementu blokeagarriak">
+<!ENTITY contribute.label "Adblock Plus-en parte hartu">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Markoa blokeatu">
+<!ENTITY blocked.tooltip "Orri honetan blokeatutako elementuak:">
+<!ENTITY hideplaceholders.label "Ezkutatu blokeatutako elementuen &amp;kokagunea">
+<!ENTITY showinstatusbar.label "Erakutsi &amp;egoera-barran">
+<!ENTITY sidebar.title "Elementu blokeagarriak uneko orrialdean">
+<!ENTITY options.label "&amp;Aukerak">
+<!ENTITY context.object.label "Adblock Plus: Objektua blokeatu">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Bergaitu orri honetan">
+<!ENTITY filters.tooltip "Iragazki aktiboenak:">
+<!ENTITY closesidebar.label "Itxi elementu blo&amp;keagarriak">
+<!ENTITY showintoolbar.label "Erakutsi &amp;tresna-barran">
+<!ENTITY status.tooltip "Egoera:">
+<!ENTITY context.media.label "Adblock Plus: audio/bideoa blokeatu">
+<!ENTITY subscription.update.label "Eguneratu iragazkiak">
+<!ENTITY notification.button.yes "&amp;Yes">
+<!ENTITY notification.button.no "&amp;No">
+<!ENTITY notification.button.close "&amp;Close">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/sendReport.dtd
new file mode 100644
index 0000000..91e07fb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/sendReport.dtd
@@ -0,0 +1,66 @@
+<!ENTITY screenshot.undo.label "&amp;Desegin">
+<!ENTITY issues.disabledgroups.description "Hurrengo iragazki harpidetzak / iragazki taldeak ezgaituta daude, hala ere orri honetan eragina izan dezakete:">
+<!ENTITY showData.label "Erakutsi txostenaren informazioa">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus gehigarria behar baino gehia&amp;go blokeatzen ari da">
+<!ENTITY issues.change.description "Zure konfigurazioa aldatu da. Mesedez birkargatu orria aldaketak egiaztatzeko eta bidali txostena arazoa konpondu ez bada.">
+<!ENTITY email.label "E-&amp;Posta:">
+<!ENTITY issues.openPreferences.label "Ireki iragazki hobespenak">
+<!ENTITY sendPage.confirmation "Zure txostena gorde egin da. Honako helbidean eskuratu dezakezu:">
+<!ENTITY copyLink.label "Ko&amp;piatu txostenaren lotura">
+<!ENTITY issues.nofilters.description "Adblock Plus ez dago ezer blokeatzen oraingo orrian. Ikusten duzun arazoa ziurrenez ez du Adblock Plusekin erlaziorik.">
+<!ENTITY sendPage.knownIssue "Aipatu duzun arazoa ziur aski ezaguna da jada. Informazio gehiago:">
+<!ENTITY typeSelector.other.description "Aukeratu hau arazoa Adblock Plus berak duela uste baduzu, eta ez iragazkiek.">
+<!ENTITY issues.disabledgroups.enable.label "Gaitu iragazki harpidetza / iragazki taldea">
+<!ENTITY typeWarning.override.label "Ulertzen dut eta txostena bidali na&amp;hi dut hala ere">
+<!ENTITY issues.disabled.enable.label "Gaitu Adblock Plus">
+<!ENTITY update.fixed.description "Baliteke zure iragazki harpidetzak eguneratzeak arazoa konpondu izana. Mesedez birkargatu orria eta berriro saiatu, arazoa berean badirau berriro zapaldu Berri eman botoia.">
+<!ENTITY anonymous.label "Bidalketa anonimoa">
+<!ENTITY reloadButton.label "Bi&amp;rkargatu orria">
+<!ENTITY recentReports.clear.label "E&amp;zabatu txosten guztiak">
+<!ENTITY typeSelector.description "Leiho honek Adblock Plus arazo txosten bat bidaltzeko beharrezkoak diren urratsetan zehar gidatuko zaitu. Hasteko, mesedez aukeratu orri honetan pairatzen duzun arazo mota aukeratu:">
+<!ENTITY screenshot.remove.label "Kendu info&amp;rmazio sentsiblea">
+<!ENTITY issues.ownfilters.description "Orri honetan erabilitako iragazki batzuk erabiltzaileak sortutakoak dira. Mesedez ezgaitu arazoa sor lezaketen iragazkiak:">
+<!ENTITY update.inProgress.description "Adblock Plusek zure iragazki harpidetzak eguneratu behar ditu arazoa dagoeneko konponduta dagoen egiaztatzeko. Mesedez itxaron...">
+<!ENTITY sendPage.retry.label "Bidali berriro">
+<!ENTITY data.label "Txostenaren informa&amp;zioa:">
+<!ENTITY recentReports.label "Orain dela gutxi bidalitako txostenak">
+<!ENTITY typeWarning.description "Adblock Plusen arazo orokor, baten txostena egin nahi duzula esan duzu, ez iragazkiena. Jabetu zaitez arazo horien berri emateko hobe dela [link]Adblock Plus forum[/link] foroa erabiltza. Arazoen txosten bidalketa erabili soilik badagoen eztabaida bati eransteko, inork ez duelako zure txostena ikusiko lotura bat ematen ez baduzu. Automatikoki sortutako lotura bat emango zaizu txostena bidali eta gero.">
+<!ENTITY issues.disabled.description "Adblock Plus ezgaituta dago, ez du ezer blokeatuko oraingo egoeran.">
+<!ENTITY attachExtensions.label "Erant&amp;si gehigarri aktiboen zerrenda bat txostenera hauen arteko konfliktoak arazoa sor balezakete">
+<!ENTITY issues.nosubscriptions.add.label "Gehitu iragazki harpidetza">
+<!ENTITY issues.disabledfilters.enable.label "Gaitu iragazkia">
+<!ENTITY issues.override.label "&amp;Konfigurazioa zuzena da, jarraitu txostenarekin">
+<!ENTITY issues.nosubscriptions.description "Antza denez ez zara harpidetu webguneetatik nahi ez dituzun edukiak automatikoki ezabatzen duten aurrez egindako zerrendetara.">
+<!ENTITY typeSelector.falsePositive.description "Aukeratu hau orrian informazio garrantzitsua falta bada, gaizki ikusten bada edo ez badabil behar bezala .
+ Adblock Plus une batez desgaituz erruduna den egiaztatu dezakezu.">
+<!ENTITY typeSelector.other.label "Beste zerba&amp;it">
+<!ENTITY emailComment.label "Eposta helbide zuzen bat idaztea aholkatzen dizugu, zurekin kontaktuan jarri ahal izateko galderarik badugu. Zure parte hartze orokorra antzeman eta lehentasunez tratatzea baimentzen digu ere.">
+<!ENTITY issues.whitelist.remove.label "Birgaitu Adblock Plus orri honetan">
+<!ENTITY outdatedSubscriptions.description "Hurrengo iragazki harpidetzak ez dira eguneratu bi astetan gutxienez. Mesedez eguneratu harpidetza hauek txosten bat bidali aurretik, baliteke arazoa jada konponduta egotea.">
+<!ENTITY dataCollector.description "Mesedez itxaron Adblock Plusek beharrezko informazioa jaso bitartean.">
+<!ENTITY sendButton.label "Txostena &amp;bidali">
+<!ENTITY comment.label "&amp;Iruzkina (aukerazkoa):">
+<!ENTITY sendPage.errorMessage "Txostena bidaltzeko saiakerak huts egin du hurrengo errore kodearekin &quot;?1?&quot;. Mesedez egiaztatu Internetera konektatuta zaudela eta saia zaitez berriro. Arazoa ez bada konpontzen eskatu laguntza [link]Adblock Plus forum[/link] foroan.">
+<!ENTITY showRecentReports.label "Erakutsi orain dela gutxi bidalitako txostenak">
+<!ENTITY commentPage.heading "Sartu iruzkina">
+<!ENTITY update.start.label "Hasi eguneraketa orain">
+<!ENTITY issues.disabledfilters.description "Hurrego iragazkiak ezgaituta daude, hala ere orri honetan eragina izan dezakete:">
+<!ENTITY screenshot.description "Orri bera ez dute berdin ikusiko pertsona guztiek. Pantaila argazki bat eransteak arazoa ulertzen lagundu ahal digu. Ken ditzakezu Informazio sentsiblea duten atalak eta markatu arazoa nabaria duten atalak. Hori egiteko, egin klik dagokion botoian eta aukeratu zonaldea saguarekin.">
+<!ENTITY screenshot.attach.label "Geh&amp;itu irudia txostenera">
+<!ENTITY issues.whitelist.description "Adblock Plus orain desgaituta dago txosnenaren orrian. Mesedez berriz gaitu eta orria birkargatu txostena bidali aurretik arazoaren ikerketa errazteko.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plusek ez du &amp;iragarki bat blokeatzen">
+<!ENTITY typeSelector.heading "Aukeratu arazo mota">
+<!ENTITY anonymity.warning "Ezin izango gara zurekin kontatuan jarri eta ziurrenez lehentasun gutxiago emango diogu txosten honi.">
+<!ENTITY wizard.title "Arazoaren txostena bidali da">
+<!ENTITY issues.ownfilters.disable.label "Iragazkia ezgaitu">
+<!ENTITY commentPage.description "Beheko testu eremuak guk arazoa hobeto ulertzeko iruzkin bat sartzea baimentzen dizu. Hau aukerazkoa da baina gomendagarria arazoa begi-bistakoa ez bada. Gainera, txostenaren informazioa gainbegiratu dezakezu bidali aurretik.">
+<!ENTITY comment.lengthWarning "Iruzkinak 1000 karaktere baino gehiago ditu. Lehen 1000 karaktereak bidaliko dira soilik.">
+<!ENTITY typeSelector.falseNegative.description "Aukeratu hau publizitatea agertzen bada Adblock Plus gaituta egonda ere.">
+<!ENTITY sendPage.waitMessage "Mesedez itxaron Adblock Plus zure txostena bidaltzen duen bitartean.">
+<!ENTITY dataCollector.heading "Ongi etorri arazoen txosten bidalketara">
+<!ENTITY screenshot.heading "Erantsi pantaila argazkia">
+<!ENTITY sendPage.heading "Bidali txostena">
+<!ENTITY issues.subscriptionCount.description "Antza denez iragazki harpidetza gehiegitara harpidetu zara. hau ez da gomendagarria arazoak izateko aukera geihago suposatzen duelako. Gainera ezin dugu zure txostena onartu ez dagoelako argi zein iragazki egilek egin behar duen ezer. Mesedez ezabatu ezinbestekoak ez diren iragazki harpidetzak eta egiaztatu arazoa oraindik gertatzen den.">
+<!ENTITY screenshot.mark.label "Arazoa &amp;markatu">
+<!ENTITY privacyPolicy.label "Pribatutasun politika">
+<!ENTITY issues.description "Adblock Plusek arazo honen errudun izan daitezken edo txosten hau ikerkertzea zaildu dezaketen arazoak aurkitu ditu zure konfigurazioan.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/sidebar.dtd
new file mode 100644
index 0000000..9fd57a8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Flash elementuaren ertzak">
+<!ENTITY address.label "Helbidea">
+<!ENTITY context.open.label "Ireki fitxa berri batean">
+<!ENTITY type.label "Mota">
+<!ENTITY tooltip.filterSource.label "Iragazki iturria:">
+<!ENTITY noitems.label "Ez dago elementu blokeagarririk">
+<!ENTITY filter.label "Iragazkia">
+<!ENTITY tooltip.size.label "Tamaina:">
+<!ENTITY reattach.label "Lotu">
+<!ENTITY search.label "&amp;Bilatu:">
+<!ENTITY docDomain.thirdParty "(kanpo iturria)">
+<!ENTITY filterSource.label "Iragazki iturria">
+<!ENTITY tooltip.docDomain.label "Dokumentuaren iturria:">
+<!ENTITY context.copy.label "Kopiatu elementuaren helbidea">
+<!ENTITY tooltip.type.label "Mota:">
+<!ENTITY context.disablefilter.label "Ezgaitu ?1? iragazkia">
+<!ENTITY context.copyFilter.label "Kopiatu iragazkia">
+<!ENTITY context.block.label "Blokeatu elementu hau">
+<!ENTITY context.enablefilter.label "Gaitu ?1? iragazkia">
+<!ENTITY detach.label "Askatu">
+<!ENTITY whitelisted.label "Onartutako orria">
+<!ENTITY context.disablefilteronsite.label "Ezgaitu iragazki hau ?1? domeinuan">
+<!ENTITY detached.title "Adblock Plus: Elementu blokeagarriak (askatua)">
+<!ENTITY docDomain.firstParty "(lehen eskukoa)">
+<!ENTITY tooltip.type.whitelisted "(onartua)">
+<!ENTITY tooltip.filter.label "Iragazki aktiboa:">
+<!ENTITY tooltip.filter.disabled "(ezgaitua)">
+<!ENTITY context.editfilter.label "Editatu iragazki aktiboa">
+<!ENTITY tooltip.type.blocked "(blokeatuta)">
+<!ENTITY size.label "Tamaina">
+<!ENTITY context.whitelist.label "Gehitu salbuespen-araua elementuarentzat">
+<!ENTITY context.selectAll.label "Aukeratu denak">
+<!ENTITY state.label "Egoera">
+<!ENTITY docDomain.label "Dokumentu iturria">
+<!ENTITY tooltip.address.label "Helbidea:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/subscriptionSelection.dtd
new file mode 100644
index 0000000..0442e3f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/eu/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Ge&amp;hitu &quot;?1?&quot; iragazki harpidetza ere">
+<!ENTITY list.download.failed "Adblock Plusek ezin izan du harpidetza zerrenda eskuratu">
+<!ENTITY list.download.retry "Saiatu berriro">
+<!ENTITY title.label "Harp&amp;idetza izenburua:">
+<!ENTITY list.download.website "Ikusi webgunea">
+<!ENTITY supplementMessage "Iragazki harpidetza hau &quot;?1?&quot; iragazki harpidetzarekin batera erabiltzekoa da eta zuk ez duzu oraindik erabiltzen.">
+<!ENTITY viewList.label "Ikusi iragazkiak">
+<!ENTITY visitHomepage.label "Bisitatu hasiera orria">
+<!ENTITY addSubscription.label "Gehitu harpidetza">
+<!ENTITY dialog.title "Gehitu Adblock Plus iragazki harpidetza">
+<!ENTITY location.label "Iragaz&amp;ki zerrendaren kokagunea:">
+<!ENTITY fromWeb.description "Mesedez berretsi iragazki harpidetza hau gehitu nahi duzula. Harpidetza izenburua eta kokagunea aldatu ditzakezu gehitu aurretik.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/composer.dtd
new file mode 100644
index 0000000..dc68759
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "در پایا&amp;ن نشانی">
+<!ENTITY domainRestriction.label "مح&amp;دود به دامنه :">
+<!ENTITY collapse.default.no.label "Ø§Ø³ØªÙØ§Ø¯Ù‡ Ù¾ÛŒØ´ÙØ±Ø¶ (خیر)">
+<!ENTITY firstParty.label "Ùقط او&amp;لین عضو">
+<!ENTITY preferences.label "نمایش پالایه های موجود...">
+<!ENTITY pattern.label "جستجو برای الگوی">
+<!ENTITY thirdParty.label "Ùقط سو&amp;مین عضو">
+<!ENTITY filter.label "پالایه جدید:">
+<!ENTITY collapse.label "بس&amp;تن مسدود شده ها:">
+<!ENTITY match.warning "الگویی Ú©Ù‡ وارد کرده اید دیگر با نشانی Ú©Ù‡ قصد مسدود کردن/Ø§ÙØ²ÙˆØ¯Ù† به Ùهرست سÙید آن را داشته اید مطابقت ندارد Ùˆ روی آن تاثیر نمی گزارد.">
+<!ENTITY anchor.start.label "در آ&amp;غاز نشانی">
+<!ENTITY matchCase.label "م&amp;طابقت حالت (بزرگی کوچکی)">
+<!ENTITY custom.pattern.label "س&amp;ÙØ§Ø±Ø´ÛŒ:">
+<!ENTITY unselectAllTypes.label "انتخاب هیچکدام">
+<!ENTITY type.whitelist.label "قاعده است&amp;ثنا">
+<!ENTITY regexp.warning "الگویی Ú©Ù‡ شما وارد کرده اید یک نویسه مرتب ØªÙØ³ÛŒØ± Ù…ÛŒ شود Ú©Ù‡ نمی تواند به صورت بهینه توسط Ùوق تبلیغ Ø´Ú©Ù† پردازش شود Ùˆ ممکن است مرور ØµÙØ­Ø§Øª شمار را کند کند. اگر شما قصد Ø§Ø³ØªÙØ§Ø¯Ù‡ کردن از یک نویسه مرتب را نداشته اید، یک ستار (*) به انتهای الگوی خود اضاÙÙ‡ کنید.">
+<!ENTITY dialog.title "اضاÙÙ‡ کردن قاعد Ùیلتر ادبلاک پلاس">
+<!ENTITY basic.label "نمایش پایه">
+<!ENTITY type.filter.label "Ùیلتر Ù…&amp;سدود کننده">
+<!ENTITY types.label "اعمال به انواع:">
+<!ENTITY shortpattern.warning "الگویی Ú©Ù‡ وارد کردید بسیار کوتاه تر از آن است Ú©Ù‡ بهینه باشد Ùˆ ممکن است سرعت مرور ØµÙØ­Ø§Øª شما را کند کند. توصیه Ù…ÛŒ شود Ú©Ù‡ جمله طویل تری را وارد کنید Ú©Ù‡ Ùوق تبلیغ Ø´Ú©Ù† بهتر بتواند آن را پردازش کند.">
+<!ENTITY collapse.yes.label "بله">
+<!ENTITY anchors.label "Ùقط پذیرش الگو:">
+<!ENTITY collapse.default.yes.label "Ø§Ø³ØªÙØ§Ø¯Ù‡ Ù¾ÛŒØ´ÙØ±Ø¶ (بله)">
+<!ENTITY domainRestriction.help "از این گزینه برای مشخص کردن یک یا چند دامنه از هم جدا شده توسط نوار خط (|) Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید. پالایه تنها برای دامنه(ها)ÛŒ انتخاب شده اعمال Ù…ÛŒ شود. علامت مد (~) قبل از نام دامنه نشاندهنده آن است Ú©Ù‡ پالایه در آن دامنه اعمال نشود.">
+<!ENTITY accept.label "Ø§ÙØ²ÙˆØ¯Ù† Ùیلتر">
+<!ENTITY options.label "گزینه ها">
+<!ENTITY disabled.warning "Ùوق تبلیغ Ø´Ú©Ù† هم اکنون غیر ÙØ¹Ø§Ù„ Ù…ÛŒ یاشد. شما هنوز Ù…ÛŒ توانید پالایه اضاÙÙ‡ کنید، اما آنها اعمال نمی شوند مگر [link]Ùوق تبلیغ Ø´Ú©Ù† را ÙØ¹Ø§Ù„ کنید[/link].">
+<!ENTITY anchor.start.flexible.label "در آ&amp;غاز نام دامنه">
+<!ENTITY collapse.no.label "خیر">
+<!ENTITY selectAllTypes.label "انتخاب همه">
+<!ENTITY advanced.label "نمایش Ù¾ÛŒØ´Ø±ÙØªÙ‡">
+<!ENTITY pattern.explanation "الگو Ù…ÛŒ تواند هر قسمتی از نشانی باشد; ستاره (*) بعنوان نویسه عام عمل Ù…ÛŒ کند. پالایه Ùقط به نشانی مطابق الگوی ارائه شده اعمال Ù…ÛŒ شود.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/filters.dtd
new file mode 100644
index 0000000..2f4d957
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "میخواهید تمامی Ùیلترهای Ø³ÙØ§Ø±Ø´ÛŒ خود را با محتویات ÙØ§ÛŒÙ„ انتخاب شده جایگزین Ù…ÛŒ شود؟">
+<!ENTITY slow.column "&amp;نمایش Ùیلترها">
+<!ENTITY enabled.column "Ù&amp;عال‌">
+<!ENTITY subscription.lastDownload.checksumMismatch "ناموÙÙ‚, عدم تطابق کنترلی">
+<!ENTITY noFiltersInGroup.text "گروه انتخاب شده خالی می باشد.">
+<!ENTITY subscription.actions.label "اقدامات">
+<!ENTITY filter.selectAll.label "انتخاب همه">
+<!ENTITY backupButton.label "پشتیبان گیری و بازیابی (&amp;B)">
+<!ENTITY restore.minVersion.warning "هشدار: این ÙØ§ÛŒÙ„ با نسخه جدیدتری از برنامه ایجاد شده است. قبل از بازگرداندن از این ÙØ§ÛŒÙ„ شما باید برنامه را بروز کنید.">
+<!ENTITY restore.error "ÙØ§ÛŒÙ„ اطلاعات قابل پردازش نیست، شاید این ÙØ§ÛŒÙ„ پشتیبان برنامه نمی باشد؟">
+<!ENTITY sort.ascending.label "ترتیب حرو٠&amp;ال٠با از ابتدا">
+<!ENTITY sort.label "مرتب کردن بر ا&amp;ساس">
+<!ENTITY subscription.source.label "لیست Ùیلتر">
+<!ENTITY hitcount.column "بر&amp;خورد ها">
+<!ENTITY noFilters.text "شما هیچ Ùیلتر شخصی ایجاد نکرده اید.">
+<!ENTITY backup.custom.title "Ùقط Ùیلتر های Ø³ÙØ§Ø±Ø´ÛŒ">
+<!ENTITY subscription.external.label "با پسوند دیگری به روز شده">
+<!ENTITY subscription.delete.label "حذÙ">
+<!ENTITY noGroupSelected.text "شما قبل ازاین Ú©Ù‡ Ùیلترها نمایش داده شوند نیاز به انتخاب گروه Ùیلتر دارید.">
+<!ENTITY filter.cut.label "برش">
+<!ENTITY restore.default.label "بازیابی پشتیبان از ?1?">
+<!ENTITY subscription.lastDownload.inProgress "در حال Ø¯Ø±ÛŒØ§ÙØª...">
+<!ENTITY subscriptions.tab.label "Ùیلتر زیرنوشت ها">
+<!ENTITY sort.descending.label "&amp;ترتیب حرو٠ال٠با از انتها">
+<!ENTITY filters.remove.warning "آیا واقعاً Ù…ÛŒ خواهید تمامی Ùیلترهای انتخابی را حذ٠کنید؟">
+<!ENTITY filter.delete.label "حذÙ">
+<!ENTITY addSubscriptionAdd.label "اضاÙÙ‡">
+<!ENTITY viewMenu.label "نما">
+<!ENTITY subscription.lastDownload.unknown "(تعری٠نشده)">
+<!ENTITY addSubscriptionCancel.label "لغو">
+<!ENTITY subscription.enabled.label "ÙØ¹Ø§Ù„ شده">
+<!ENTITY noSubscriptions.text "شما هنوز هیچ اشتراک Ùیلتری را اضاÙÙ‡ نکردید. Adblock Plus هیچ چیزی را بدون Ùیلترها مسدود نمی کند, Ù„Ø·ÙØ§ با Ø§Ø³ØªÙØ§Ø¯Ù‡ از &quot;Ø§ÙØ²ÙˆØ¯Ù† اشتراک Ùیلتر&quot; چند Ùیلتر اضاÙÙ‡ کنید.">
+<!ENTITY subscription.update.label "به روز رسانی Ùیلتر">
+<!ENTITY dialog.title "تنظیمات Ùیلتر Adblock Plus">
+<!ENTITY addFilter.label "Ø§ÙØ²ÙˆØ¯Ù† Ùیلتر (&amp;d)">
+<!ENTITY subscription.minVersion.warning "این Ùیلتر اشتراک نیاز به نسخه جدید برنامه دارد، شما باید برنامه را به آخرین نگارش به روز کنید.">
+<!ENTITY subscription.lastDownload.invalidURL "ناموÙÙ‚ØŒ نشانی معتبر نیست">
+<!ENTITY backup.error "خطایی هنگام نوشتن Ùیلتر به ÙØ§ÛŒÙ„ دیده شد. اطمینان حاصل کنید Ú©Ù‡ ÙØ§ÛŒÙ„ نسبت به نوشتن Ø­ÙØ§Ø¸Øª شده نیست Ùˆ یا توسط برنامه کاربردی دیگری Ø§Ø³ØªÙØ§Ø¯Ù‡ نمی شود.">
+<!ENTITY filter.moveUp.label "حرکت به بالا">
+<!ENTITY addGroup.label "Ø§ÙØ²ÙˆØ¯Ù† گروه Ùیلتر">
+<!ENTITY filter.edit.label "ویرایش">
+<!ENTITY subscription.showHideFilters.label "نمایش/پنهان کردن Ùیلترها">
+<!ENTITY acceptableAds2.label "اجازه دادن به تبلیغات ناخواسته (&amp;i)">
+<!ENTITY addSubscriptionOther.label "یک اشتراک ديگر اضاÙÙ‡ کنید">
+<!ENTITY close.label "بستن">
+<!ENTITY sort.none.label "نا م&amp;رتب">
+<!ENTITY filter.actions.label "اقدامات Ùیلتر">
+<!ENTITY filter.copy.label "رونوشت">
+<!ENTITY filter.moveDown.label "حرکت به پایین">
+<!ENTITY filter.resetHitCounts.label "تنظیم مجدد آمار">
+<!ENTITY readMore.label "بیشتر بخوانید">
+<!ENTITY subscription.moveUp.label "حرکت به بالا">
+<!ENTITY addSubscription.label "اضاÙÙ‡ کردن اشتراک Ùیلتر (&amp;f)">
+<!ENTITY subscription.homepage.label "ØµÙØ­Ù‡ اصلی">
+<!ENTITY backup.complete.title "تمام Ùیلترها Ùˆ اشتراک ها">
+<!ENTITY restore.own.label "بازیابی پشتیبان خود">
+<!ENTITY restore.complete.warning "تمام تنظیمات Ùیلتر با محتویات ÙØ§ÛŒÙ„ انتخاب شده جایگزین Ù…ÛŒ شود. Ù…ÛŒ خواهید انجام دهید؟">
+<!ENTITY filters.tab.label "Ùیلترهای Ø³ÙØ§Ø±Ø´ÛŒ">
+<!ENTITY backup.label "نسخه پشتیبان جدید بسازید">
+<!ENTITY find.label "ÛŒØ§ÙØªÙ† (&amp;n)">
+<!ENTITY subscription.moveDown.label "حرکت به پایین">
+<!ENTITY subscription.lastDownload.connectionError "ناموÙÙ‚ØŒ ÙØ±Ø¢ÛŒÙ†Ø¯ Ø¯Ø±ÛŒØ§ÙØª شکست خورد">
+<!ENTITY subscription.lastDownload.success "موÙÙ‚">
+<!ENTITY subscription.lastDownload.invalidData "ناموÙÙ‚ØŒ Ùهرست پالایه ها نامعتبر است">
+<!ENTITY filter.paste.label "جای گذاری">
+<!ENTITY subscription.disabledFilters.enable "ÙØ¹Ø§Ù„ کردن Ùیلتر های غیر ÙØ¹Ø§Ù„">
+<!ENTITY lasthit.column "آخرین برخ&amp;ورد">
+<!ENTITY subscription.editTitle.label "ویرایش عنوان">
+<!ENTITY subscription.disabledFilters.warning "برخی از Ùیلترها برای این اشتراک غیر ÙØ¹Ø§Ù„ Ù…ÛŒ باشد.">
+<!ENTITY filter.column "&amp;قواعد Ùیلتر">
+<!ENTITY subscription.lastDownload.label "آخرین Ø¯Ø±ÛŒØ§ÙØª:">
+<!ENTITY viewList.label "مشاهده لیست">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/firstRun.properties
new file mode 100644
index 0000000..0ee991a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=با غیر ÙØ¹Ø§Ù„ کردن ردیابی با امنیت کامل به گشت Ùˆ گذار اینترنتی بپردازید وخود را از شرکت هایی Ú©Ù‡ Ù…ÛŒ توانند هر لحظه زیر نظر داشته باشند مخÙÛŒ کنید.
+firstRun_toggle_off=خاموش
+firstRun_feature_tracking=غیر ÙØ¹Ø§Ù„ کردن ردیابی
+firstRun_feature_malware=مسدود کردن نرم Ø§ÙØ²Ø§Ø±Ù‡Ø§ÛŒ مخرب
+firstRun_title=Adblock Plus با موÙقیت نصب شد
+firstRun_toggle_on=روشن
+firstRun_acceptableAdsExplanation=من Ù…ÛŒ خواهم وب سایت ها را تشویق کنم تا از تبلیغات درست Ùˆ حسابی بدون مزاحمت Ø§Ø³ØªÙØ§Ø¯Ù‡ کنند. این دلیل ساختن <a> دستورالعمل های دقیق </a> است تا بتواند تبلیغات قابل قبول را بپذیرد Ùˆ آن ها را به شما نشان دهد ØŒ تبلیغاتی Ú©Ù‡ در شرایط استاندارد صدق کنند. اگر شما Ù…ÛŒ خواهید هر تبلیغی را از هر ØµÙØ­Ù‡ ای مسدود کنید Ù…ÛŒ توانید آن را در عرض چند ثانیه <a>غیر ÙØ¹Ø§Ù„</a> کنید.
+firstRun_contributor_credits=اعتبار نویسندگان
+firstRun_dataCorruptionWarning=آیا این ØµÙØ­Ù‡ در حال رویت Ù†Ú¯Ù‡ داشته شده؟ <a>اینجا کلیک Ú©Ù†!</a>
+firstRun_acceptableAdsHeadline=تبلیغات آزار دهنده در حال حاضر مسدود خواهد شد
+firstRun_share=به دوستان خود بگویید
+firstRun_share_headline=<a>بیایید</a> اینترنت را بهتر کنیم
+firstRun_feature_social_description=به طور خودکار مانند like در Ùیس بوک ØŒ تجربه وبگردی از رسانه های اجتماعی را Ø¨ÙØ±Ø³ØªÛŒØ¯ Ùˆ وضعیت کارهای خود را دنبال کنید.
+firstRun_filterlistsReinitializedWarning=به نظر Ù…ÛŒ رسد Ú©Ù‡ ناشی از موضوع همه Ùیلتر به حذ٠می شود Ùˆ ما قادر به بازگرداندن پشتیبان. بنابراین ما مجبور به تنظیم مجدد Ùیلتر Ùˆ تنظیمات تبلیغات قابل قبول. Ù„Ø·ÙØ§ لیست Ùیلتر Ùˆ تنظیمات تبلیغات قابل قبول در <a>Adblock پلاس گزینه های</a> خود را.
+firstRun_feature_malware_description=مرور خود رابا مسدود کردن دامنه های مخرب شناخته شده امن تر کنید.
+firstRun_features=Adblock Plus می تواند تبلیغات بیشتری را مسدود کند
+firstRun_donate=کمک مالی
+firstRun_donate_label=پروژه ما را حمایت کنید
+firstRun_feature_social=حذ٠دکمه های رسانه های اجتماعی
+firstRun_legacySafariWarning=شما در حال حاضر از يك نسخه قديمي تر مرورگر Safari Ø§Ø³ØªÙØ§Ø¯Ù‡ ميكنيد كه توسط Adblock Plus پشتيباني نميشود. اين موضوع احتمال دارد بر روي تجربه وب گردي كاربر تأثير منÙÙŠ گذاشته Ùˆ يا باعث درست عمل نكردن پلاگين شود. ما قوياً توصيه مي كنيم كه مرورگر خود را به Safari 6.1.1 يا بالاتربه روز رساني كنيد (براي نسخه Mountain Lion ورژن OS X 10.8 در سيستم عامل مكينتاش)ØŒ Ùˆ يا به روز رساني به Safari 7.0.1 (براي نسخه Mavericks ورژن OS X 10.9 در سيستم عامل مكينتاش). Ùˆ يا اينكه ازآخرين ورژن مرورگرهايي مانند: Google Chrome ØŒMozilla Firefox Ùˆ يا Opera Ø§Ø³ØªÙØ§Ø¯Ù‡ كنيد.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/global.properties
new file mode 100644
index 0000000..6ada4e9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=مورد مسدود شده ای در این ØµÙØ­Ù‡ موجود نیست
+action3_tooltip=برای ÙØ¹Ø§Ù„ یا ØºÛŒØ±ÙØ¹Ø§Ù„‌کردن Adblock Plus کلیک کنید.
+notification_antiadblock_title=آیا مایلید پیام های هدÙمند برای کاربران Adblock Plus را مخÙÛŒ نمایید؟
+type_label_script=نویسه
+filter_elemhide_nocriteria=هیچ ضابطه ای برای شناسایی عناصری که می بایست پنهان شوند مشخص نشد.
+blockingGroup_title=قوانین مسدود کردن تبلیغ
+whitelisted_tooltip=Adblock Plus برای این ØµÙØ­Ù‡ ØºÛŒØ±ÙØ¹Ø§Ù„ شده است.
+type_label_stylesheet=شیوه نامه (stylesheet)
+blocked_count_tooltip=?1? از میان ?2?
+type_label_font=قلم
+type_label_popup=پنجره پاپ آپ
+filter_regexp_tooltip=این Ùیلتر یا نوشته مرتب است یا این Ú©Ù‡ خیلی کوچکتر از آن است Ú©Ù‡ یک Ùیلتر مناسب باشد. تعداد زیادی از این نوشته ها Ù…ÛŒ تواند سرعت مرورگر شما را کاهش دهد.
+action0_tooltip=برای نمایش Ùهرست کلیک کنید. کلیک-وسط برای ÙØ¹Ø§Ù„ یا ØºÛŒØ±ÙØ¹Ø§Ù„ کردن است.
+whitelisted_page=Adblock Plus برای ØµÙØ­Ù‡ جاری ØºÛŒØ±ÙØ¹Ø§Ù„ شده است.
+remove_group_warning=واقعا می خواهید این گروه را حذ٠کنید؟
+action1_tooltip=برای گشودن یا بستن موارد مسدود شده کلیک کنید. کلیک-وسط برای ÙØ¹Ø§Ù„ یا ØºÛŒØ±ÙØ¹Ø§Ù„ کردن است.
+type_label_xmlhttprequest=XML خواسته شده
+active_tooltip=Ùوق تبلیغ Ø´Ú©Ù† یا Adblock Plus ÙØ¹Ø§Ù„ است, ?1? اشتراک(های) Ùیلتر Ùˆ ?2? Ùیلتر(ها)ÛŒ Ø³ÙØ§Ø±Ø´ÛŒ در حال Ø§Ø³ØªÙØ§Ø¯Ù‡ هستند.
+type_label_document=سند
+type_label_object_subrequest=اشیاء زیرخواسته
+whitelistGroup_title=قوانین استثنا
+disabled_tooltip=Adblock Plus ØºÛŒØ±ÙØ¹Ø§Ù„ است.
+filter_elemhide_duplicate_id=Ùقط یک شناسه از عنصری Ú©Ù‡ قرار است پنهان شود را Ù…ÛŒ توان مشخص کرد.
+type_label_object=شیء
+action2_tooltip=برای گشودن ترجیحات کلیک کنید. کلیک-وسط برای ÙØ¹Ø§Ù„ یا ØºÛŒØ±ÙØ¹Ø§Ù„ کردن است.
+type_label_subdocument=قابک
+clearStats_warning=این کار تمام آمار ها را پاک کرده و آمارگیری را متوق٠می کند. آیا مایل به توق٠هستید؟
+notification_antiadblock_message=این سایت پیام های هدÙمند برای کاربران Adblock Plus نشان Ù…ÛŒ دهد. آیا مایلید Ú©Ù‡ Adblock Plus پیام های هدÙمند را از دید شما مخÙÛŒ کند؟
+blocked_count_addendum=(همچنین Ùهرست سÙید: ?1?, پنهان: ?2?)
+subscription_invalid_location=مکان وارد شده برای Ùهرست Ùیلترها نامعتبر است.
+type_label_image=تصویر
+remove_subscription_warning=آیا برای حذ٠اشتراک مطمئن هستید؟
+type_label_other=دیگر
+mobile_menu_enable=ABP: ÙØ¹Ø§Ù„
+type_label_media=چند رسانه ای
+mobile_menu_disable_site=ABP: غیر ÙØ¹Ø§Ù„ کردن در ?1?
+elemhideGroup_title=قوانبن Ø§Ø®ØªÙØ§ عناصر
+mobile_menu_enable_site=ABP: ÙØ¹Ø§Ù„ کردن در ?1?
+type_label_elemhide=پنهان
+newGroup_title=گروه Ùیلتر جدید
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/overlay.dtd
new file mode 100644
index 0000000..c2a0e52
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "ب&amp;له">
+<!ENTITY notification.button.no "&amp;نه">
+<!ENTITY sync.label "همگام سازی تن&amp;ظیمات Adblock Plus">
+<!ENTITY whitelist.site.label "ØºÛŒØ±ÙØ¹Ø§Ù„ در ?1?">
+<!ENTITY filters.label "&amp; تنظیمات Ùیلتر">
+<!ENTITY disable.label "غیر ÙØ¹Ø§Ù„ کردن در همه جا">
+<!ENTITY objecttab.title "مسدود کردن">
+<!ENTITY objecttab.tooltip "جهت مسدود کردن با Adblock Plus اینجا کلیک کنید">
+<!ENTITY menuitem.label "ترجیحات Ùوق ت&amp;بلیغ Ø´Ú©Ù† (Adblock Plus)">
+<!ENTITY objecttabs.label "نمایش زبانه در موارد Ùلش Ùˆ &amp;جاوا">
+<!ENTITY sendReport.label "گزارش مشکل در این &amp;ØµÙØ­Ù‡">
+<!ENTITY whitelist.page.label "ØºÛŒØ±ÙØ¹Ø§Ù„ Ùقط در این ØµÙØ­Ù‡">
+<!ENTITY context.image.label "Adblock Plus: سد تصاویر">
+<!ENTITY counthits.label "شمارش &amp;تعداد Ùیلتر شده ها">
+<!ENTITY opensidebar.label "باز کردن موارد &amp;قابل مسدود سازی">
+<!ENTITY notification.button.close "&amp;بستن">
+<!ENTITY contribute.label "کمک کردن به Adblock Plus">
+<!ENTITY toolbarbutton.label "Ùوق تبلیغ Ø´Ú©Ù† یا Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus:سد قابک">
+<!ENTITY blocked.tooltip "موارد رد شده در این ØµÙØ­Ù‡:">
+<!ENTITY hideplaceholders.label "پنهان کردن &amp;متغیرها از عناصر مسدود شده">
+<!ENTITY showinstatusbar.label "نمایش در ن&amp;وار وضعیت">
+<!ENTITY sidebar.title "موارد قابل مسدود شدن در ØµÙØ­Ù‡ جاری">
+<!ENTITY options.label "&amp;گزینه ها">
+<!ENTITY context.object.label "Adblock Plus: سد شیء">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: ÙØ¹Ø§Ù„ شدن مجدد در این ØµÙØ­Ù‡">
+<!ENTITY filters.tooltip "ÙØ¹Ø§Ù„ ترین Ùیلترها:">
+<!ENTITY closesidebar.label "بستن موارد &amp;قابل مسدود سازی">
+<!ENTITY showintoolbar.label "نمایش در نوار ا&amp;بزار">
+<!ENTITY status.tooltip "وضعیت:">
+<!ENTITY context.media.label "Adblock Plus: سد داده های چند رسانه ای">
+<!ENTITY subscription.update.label "به روز رسانی Ùیلتر">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/sendReport.dtd
new file mode 100644
index 0000000..d8c2300
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/sendReport.dtd
@@ -0,0 +1,66 @@
+<!ENTITY screenshot.undo.label "&amp;برگشت">
+<!ENTITY issues.disabledgroups.description "اشتراک های Ùیلتر / دسته های Ùیلتر روبرو غیر ÙØ¹Ø§Ù„ هستند، آنها ممکن است هنوز روی ØµÙØ­Ù‡ تاثیر داشته باشند:">
+<!ENTITY showData.label "نمایش داده های گزارش">
+<!ENTITY typeSelector.falsePositive.label "Ùوق تبلیغ Ø´Ú©Ù† بیش از &amp;حد موارد را مسدود Ù…ÛŒ کند.">
+<!ENTITY issues.change.description "پیکربندی شما تغییر ÛŒØ§ÙØª. Ù„Ø·ÙØ§ ØµÙØ­Ù‡ را برای بررسی تغییرات تازه سازی کنید Ùˆ اگر هنوز با وجود تغییرات انجام شده مشکل پابرجا بود اقدام به ارسال گزارش کنید.">
+<!ENTITY email.label "پ&amp;ست الکترونیکی:">
+<!ENTITY issues.openPreferences.label "باز کردن تنظیمات Ùیلتر">
+<!ENTITY sendPage.confirmation "گزارش شما ذخیره شد. شما می توانید در نشانی زیر به آن دسترسی پیدا کنید:">
+<!ENTITY copyLink.label "رو&amp;نوشت از پیوند گزارش">
+<!ENTITY issues.nofilters.description "Ùوق تبلیغ Ø´Ú©Ù† هیچ موردی را در ØµÙØ­Ù‡ جاری مسدود نکرده. مشکلی Ú©Ù‡ شما مشاهده کرده اید به احتمال زیاد به Ùوق تبلیغ Ø´Ú©Ù† ربطی ندارد.">
+<!ENTITY sendPage.knownIssue "گزارشی که شما ارسال کردید هم اکنون شناخته شده است. اطلاعات بیشتر:">
+<!ENTITY typeSelector.other.description "اگر شما مشکوک هستید Ú©Ù‡ این مشکل از خود Ùوق تبلیغ Ø´Ú©Ù† Ù…ÛŒ باشد نه از Ùیلترها، این گزینه را انتخاب کنید.">
+<!ENTITY issues.disabledgroups.enable.label "ÙØ¹Ø§Ù„ سازی اشتراک های Ùیلتر / دسته های Ùیلتر">
+<!ENTITY typeWarning.override.label "من متو&amp;جه هستم و می خواهم که گزارش را در هر صورت ارسال کنم">
+<!ENTITY issues.disabled.enable.label "ÙØ¹Ø§Ù„ کردن Ùوق تبلیغ Ø´Ú©Ù†">
+<!ENTITY update.fixed.description "به روز رسانی های Ùیلتر احتمالاً مشکلی را Ú©Ù‡ شما گزارش داده اید را حل کرده. Ù„Ø·ÙØ§Ù‹ دوباره ØµÙØ­Ù‡ را باز کنید،اگر مشکل حل نشد دوباره روی دکمه گزارش کلیک کنید.">
+<!ENTITY anonymous.label "ا&amp;رسال ناشناس">
+<!ENTITY reloadButton.label "تا&amp;زه سازی ØµÙØ­Ù‡">
+<!ENTITY recentReports.clear.label "پاک کردن تمامی &amp;گزارشات">
+<!ENTITY typeSelector.description "این پنجره شما را برای ارائه یک گزارش خطا Ùوق تبلیغ Ø´Ú©Ù† راهنمایی Ù…ÛŒ کند. ابتدا نوع مشکلی را Ú©Ù‡ در این ØµÙØ­Ù‡ با آن روبرو هستید را انتخاب کنید:">
+<!ENTITY screenshot.remove.label "&amp;پاک کردن داده های حساس">
+<!ENTITY issues.ownfilters.description "بعضی از پالایه های اعمالی در ØµÙØ­Ù‡ توسط کاربر تعری٠شده اند. Ù„Ø·ÙØ§ پالایه های Ú©Ù‡ ممکن است باعث بروز مشکل شود را ØºÛŒØ±ÙØ¹Ø§Ù„ کنید:">
+<!ENTITY update.inProgress.description "Adblock Plus باید اشتراکات Ùیلتر را بررسی نماید تا مطمئن شود مشکل حل شده است. Ù„Ø·ÙØ§Ù‹ منتظر بمانید...">
+<!ENTITY sendPage.retry.label "ارسال مجدد">
+<!ENTITY data.label "داده های &amp;گزارش:">
+<!ENTITY recentReports.label "گزارشات به تازگی ارسال شده شما">
+<!ENTITY typeWarning.description "شما Ù…ÛŒ خواهید Ú©Ù‡ مشکلی Ú©Ù„ÛŒ در مورد Ùوق تبلیغ Ø´Ú©Ù† را گزارش دهید به جای اینکه مشکلی در رابطه با Ùیلتر گزارش دهید. Ù„Ø·ÙØ§ توجه داشته باشید Ú©Ù‡ این طور مسائل بهتر است در [link]تالار Ú¯ÙØªÙ…ان Ùوق تبلیغ Ø´Ú©Ù†[/link] بحث شوند. شما باید Ùقط در صورتی از گزارش گر مشکلات Ø§Ø³ØªÙØ§Ø¯Ù‡ کنید Ú©Ù‡ مکمل بحث موجود باشد, چونکه (در تالار Ú¯ÙØªÙ…ان) هیچ کس به گزارش شما توجه نمی کند مگر این Ú©Ù‡ برای آن یک پیوند ارائه کنید. وقتی Ú©Ù‡ گزارش را ارسال Ù…ÛŒ کنید پیوند به طور خودکار ساخته Ùˆ مهیا Ù…ÛŒ شود.">
+<!ENTITY issues.disabled.description "Ùوق تبلیغ Ø´Ú©Ù† هم اکنون ØºÛŒØ±ÙØ¹Ø§Ù„ است. در این وضعیت هیچ موردی را مسدود نمی کند.">
+<!ENTITY attachExtensions.label "ضمیمه کردن Ùهرستی ا&amp;ز Ø§ÙØ²ÙˆÙ†Ù‡ ها به گزارش در مواردی Ú©Ù‡ Ø§ÙØ²ÙˆÙ†Ù‡ های دیگر باعث ایجاد مشکل باشند.">
+<!ENTITY issues.nosubscriptions.add.label "Ø§ÙØ²ÙˆØ¯Ù† اشتراک Ùیلتر">
+<!ENTITY issues.disabledfilters.enable.label "ÙØ¹Ø§Ù„ کردن Ùیلتر">
+<!ENTITY issues.override.label "تنظیمات &amp;پیکربندی صحیح است، ادامه گزارش">
+<!ENTITY issues.nosubscriptions.description "شما در هیچ Ùهرست پالایه پیش ساخته ای مشترک نشده اید Ú©Ù‡ به طور خود کار محتوای ناخواسته را پاک Ù…ÛŒ کنند.">
+<!ENTITY typeSelector.falsePositive.description "اگر ØµÙØ­Ù‡ خالی از محتوای مهم Ù…ÛŒ شود یا نادرست نمایش داده Ù…ÛŒ شود یا موÙÙ‚ به عملکرد درست نیست این گزینه را انتخاب کنید.">
+<!ENTITY typeSelector.other.label "سایر مشکلا&amp;ت">
+<!ENTITY emailComment.label "ما شما را تشویق می کنیم که یک آدرس ایمیل معتبر از خود وارد کنید تا اگر سوالی بود ما بتوانیم در آینده با شما ارتباط برقرار کنیم
+در مورد گزارش شما. این به ما اجازه می دهد که میزان همکاری شما را بسنجیم و اولویت کار شما به مراحل بالاتر برسد.">
+<!ENTITY issues.whitelist.remove.label "ÙØ¹Ø§Ù„ کردن مجدد Ùوق تبلیغ Ø´Ú©Ù† در این ØµÙØ­Ù‡">
+<!ENTITY outdatedSubscriptions.description "اشتراک Ùیلتر زیر برای حداقل دو Ù‡ÙØªÙ‡ به روز نشده است. Ù„Ø·ÙØ§Ù‹ این اشتراک را قبل از ارسال گزارش به روز کنید, شاید مشکل حل شود.">
+<!ENTITY dataCollector.description "Ù„Ø·ÙØ§ برای چند لحظه صبر کنید تا Ùوق تبلیغ Ø´Ú©Ù† داده های درخواستی شما را جمع آوری کند.">
+<!ENTITY sendButton.label "ارسا&amp;ل گزارش">
+<!ENTITY comment.label "ن&amp;ظر (اختیاری):">
+<!ENTITY sendPage.errorMessage "تلاش برای ارسال گزارش شکست خورد، شماره خطا &quot;?1?&quot;. Ù„Ø·ÙØ§ مطمئن شوید Ú©Ù‡ به اینترنت متصل هستید Ùˆ مجددا سعی کنید. اگر مشکل همچنان ادامه دارد Ù…ÛŒ توانید در [link]تالار Ú¯ÙØªÙ…ان Ùوق تبلیغ Ø´Ú©Ù†[/link] در خواست Ú©Ù…Ú© کنید.">
+<!ENTITY showRecentReports.label "نمایش گزارشات ارسال شده اخیر">
+<!ENTITY commentPage.heading "وارد کردن نظر">
+<!ENTITY update.start.label "در حال به روز رسانی">
+<!ENTITY issues.disabledfilters.description "Ùیلترهای روبرو غیر ÙØ¹Ø§Ù„ هستند، آنها ممکن است هنوز روی ØµÙØ­Ù‡ تاثیر داشته باشند:">
+<!ENTITY screenshot.description "ØµÙØ­Ø§Øª مشابه امکان دارد برای هر ÙØ±Ø¯ به صورتی نامشابه نمایش داده شوند. ضمیمه کردن یک تصویر Ù…ÛŒ تواند Ú©Ù…Ú© زیادی در Ùهم مشکل به ما بکند. شما Ù…ÛŒ توانید بخش هایی Ú©Ù‡ حاوی اطلاعات حساس Ù…ÛŒ باشد را پاک کنید Ùˆ همچنین بخش هایی Ú©Ù‡ مشکل در آنها نمودار شده را علامت گزاری کنید. برای این کار کلید متناظر را کلیک کنید Ùˆ بخشی از تصویر را با موشواره انتخاب کنید.">
+<!ENTITY screenshot.attach.label "Ø§ÙØ²ÙˆØ¯Ù† ت&amp;صویر ØµÙØ­Ù‡ به گزارش">
+<!ENTITY issues.whitelist.description "Ùوق تبلیغ Ø´Ú©Ù† هم اکنون روی ØµÙØ­Ù‡ ای Ú©Ù‡ شما در مورد آن گزارش Ù…ÛŒ دهید غیر ÙØ¹Ø§Ù„ است. ابتدا آن را دوباره ÙØ¹Ø§Ù„ کنید Ùˆ پس از تازه سازی ØµÙØ­Ù‡ØŒ مشکل را مجددا بررسی کنید.">
+<!ENTITY typeSelector.falseNegative.label "Ùوق تبلیغ Ø´Ú©Ù† &amp;هیچ تبلیغی را مسدود نمی کند.">
+<!ENTITY typeSelector.heading "انتخاب نوع اشکال">
+<!ENTITY anonymity.warning "ما قادر نخواهیم بود که دوباره بیاییم و احتمالاً این گزارش را در اولویت های پایین تر قرار می دهیم.">
+<!ENTITY wizard.title "گزارش گر اشکالات">
+<!ENTITY issues.ownfilters.disable.label "غیر ÙØ¹Ø§Ù„ کردن Ùیلتر">
+<!ENTITY commentPage.description "جعبه متن زیر به شما اجازه می دهد که نظر خود را برای کمک به درک ما در مورد مشکل وارد کنید. این مورد اختیاری می باشد ولی در صورتی که مشکل آشکار نیست توصیه می شود. شما همچنین می توانید قبل از ارسال گزارش داده ها را بررسی کنید.">
+<!ENTITY comment.lengthWarning "حد اکثر طول نظر 1000 حر٠می باشد. Ùقط 1000 حر٠اولی ÙØ±Ø³ØªØ§Ø¯Ù‡ Ù…ÛŒ شود.">
+<!ENTITY typeSelector.falseNegative.description "اگر تبلیغات همچنان مشاهده Ù…ÛŒ شوند با وجود این Ú©Ù‡ Ùوق تبلیغ Ø´Ú©Ù† ÙØ¹Ø§Ù„ است این گزینه را انتخاب کنید">
+<!ENTITY sendPage.waitMessage "Ù„Ø·ÙØ§ صبر کنید تا Ùوق تبلیغ Ø´Ú©Ù† گزارش شما را ارسال کند.">
+<!ENTITY dataCollector.heading "به گزارشگر اشکالات خوش آمدید">
+<!ENTITY screenshot.heading "Ø§ÙØ²ÙˆØ¯Ù† تصویر از ØµÙØ­Ù‡">
+<!ENTITY sendPage.heading "ارسال گزارش">
+<!ENTITY issues.subscriptionCount.description "به نظر Ù…ÛŒ رسد Ú©Ù‡ شما در اشتراک های بسیار زیادی عضو هستید. این عمل توصیه نمی شود زیرا Ú©Ù‡ شانس ایجاد مشکل بیشتر Ù…ÛŒ شود. بنابرین ما نمی توانیم گزارش های شما را قبول کنیم چرا Ú©Ù‡ معلوم نیست Ú©Ù‡ کدام اشتراک Ùیلتر نیاز به بررسی دارد. Ù„Ø·ÙØ§ همه آنها را به جز اشتراک های واقعا لازم حذ٠کنید Ùˆ سپس امتحان کنید Ú©Ù‡ آیا این مسئله هنوز هم پس از آن رخ Ù…ÛŒ دهد.">
+<!ENTITY screenshot.mark.label "&amp;علامت گزاری مشکل">
+<!ENTITY privacyPolicy.label "سیاست Ø­ÙØ¸ اسرار">
+<!ENTITY issues.description "Ùوق تبلیغ Ø´Ú©Ù† مشکلی را در پیکربندی های شما پیدا کرده Ú©Ù‡ ممکن است مشکل شما ناشی از آن باشد Ùˆ یا این Ú©Ù‡ ممکن است در رسیدگی به مشکل شما اشکال ایجاد کند.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/sidebar.dtd
new file mode 100644
index 0000000..757ed0a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "مرز های اقلام Ùلش">
+<!ENTITY address.label "نشانی">
+<!ENTITY context.open.label "گشودن در زبانه نو">
+<!ENTITY type.label "نوع">
+<!ENTITY tooltip.filterSource.label "متن Ùیلتر:">
+<!ENTITY noitems.label "هیچ مورد قابل انسدادی نیست">
+<!ENTITY filter.label "Ùیلتر">
+<!ENTITY tooltip.size.label "اندازه:">
+<!ENTITY reattach.label "وصل کردن دوباره">
+<!ENTITY search.label "جستجو:">
+<!ENTITY docDomain.thirdParty "(شخص ثالث)">
+<!ENTITY filterSource.label "منبع Ùیلتر">
+<!ENTITY tooltip.docDomain.label "منبع نوشتار:">
+<!ENTITY context.copy.label "کپی آدرس مورد">
+<!ENTITY tooltip.type.label "نوع:">
+<!ENTITY context.disablefilter.label "غیر ÙØ¹Ø§Ù„ کردن Ùیلتر ?1?">
+<!ENTITY context.copyFilter.label "رونوشت Ùیلتر">
+<!ENTITY context.block.label "مسدود کردن این مورد">
+<!ENTITY context.enablefilter.label "ÙØ¹Ø§Ù„ کردن Ùیلتر ?1?">
+<!ENTITY detach.label "قطع کردن">
+<!ENTITY whitelisted.label "ØµÙØ­Ù‡ Ùهرست سÙید">
+<!ENTITY context.disablefilteronsite.label "غیر ÙØ¹Ø§Ù„ کردن این Ùیلتر در ?1?">
+<!ENTITY detached.title "Ùوق تبلیغ Ø´Ú©Ù†: موارد قابل انسداد (قطع شده)">
+<!ENTITY docDomain.firstParty "(شخص اول)">
+<!ENTITY tooltip.type.whitelisted "(در Ùهرست سÙید)">
+<!ENTITY tooltip.filter.label "Ùیلترهای مؤثر:">
+<!ENTITY tooltip.filter.disabled "(غیر ÙØ¹Ø§Ù„)">
+<!ENTITY context.editfilter.label "ویرایش Ùیلتر مؤثر">
+<!ENTITY tooltip.type.blocked "(مسدود شده)">
+<!ENTITY size.label "اندازه">
+<!ENTITY context.whitelist.label "Ø§ÙØ²ÙˆØ¯Ù† قانون استثنا برای این مورد">
+<!ENTITY context.selectAll.label "انتخاب همه">
+<!ENTITY state.label "وضعیت">
+<!ENTITY docDomain.label "منبع نوشتار">
+<!ENTITY tooltip.address.label "نشانی:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/subscriptionSelection.dtd
new file mode 100644
index 0000000..18f3a61
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fa/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Ø§ÙØ²ÙˆØ¯Ù† اشتراک Ùیلتر &quot;?1?&quot; هم&amp;چنین">
+<!ENTITY list.download.failed "Ùوق تبلیغ Ø´Ú©Ù† موÙÙ‚ نشد Ú©Ù‡ Ùهرست اشتراکات را بازیابی کند.">
+<!ENTITY list.download.retry "تلاش مجدد">
+<!ENTITY title.label "عنوان ا&amp;شتراک:">
+<!ENTITY list.download.website "دیدن پایگاه تحت شبکه">
+<!ENTITY supplementMessage "این اشتراک Ùیلتر به معنی آن است Ú©Ù‡ با اشتراک Ùیلتر &quot;?1?&quot; Ø§Ø³ØªÙØ§Ø¯Ù‡ Ù…ÛŒ شود Ú©Ù‡ شما هنوز در آن مشترک نشده اید.">
+<!ENTITY viewList.label "دیدن Ùیلترها">
+<!ENTITY visitHomepage.label "بازدید از ØµÙØ­Ù‡ خانگی">
+<!ENTITY addSubscription.label "Ø§ÙØ²ÙˆØ¯Ù† اشتراک">
+<!ENTITY dialog.title "Ø§ÙØ²ÙˆØ¯Ù† اشتراک پالایه Ùوق تبلیغ Ø´Ú©Ù†">
+<!ENTITY location.label "نشانی &amp;Ùهرست Ùیلترها:">
+<!ENTITY fromWeb.description "Ù„Ø·ÙØ§ تایید کنید Ú©Ù‡ قصد Ø§ÙØ²ÙˆØ¯Ù† این اشتراک Ùیلتر را دارید. شما Ù…ÛŒ توانید قبل از Ø§ÙØ²ÙˆØ¯Ù†ØŒ نام Ùˆ مسیر اشتراک را تغییر دهید.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/composer.dtd
new file mode 100644
index 0000000..2713052
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "osoitteen &amp;lopussa">
+<!ENTITY domainRestriction.label "R&amp;ajoita verkkotunnukseen:">
+<!ENTITY collapse.default.no.label "Käytä oletusta (ei)">
+<!ENTITY firstParty.label "Va&amp;in sivun ylläpitäjän">
+<!ENTITY preferences.label "&amp;Näytä nykyiset suodattimet...">
+<!ENTITY pattern.label "Merkkijonon löytäminen">
+<!ENTITY thirdParty.label "Vain &amp;muiden kuin sivun ylläpitäjän">
+<!ENTITY filter.label "Uusi &amp;suodatin:">
+<!ENTITY collapse.label "&amp;Romahduta estetyt:">
+<!ENTITY match.warning "Syöttämäsi merkkijono ei enää täsmää estettävän/sallittavan osoitteen kanssa; se ei vaikuta kyseiseen osoitteeseen.">
+<!ENTITY anchor.start.label "osoi&amp;tteen alussa">
+<!ENTITY matchCase.label "&amp;Huomioi kirjainkoko">
+<!ENTITY custom.pattern.label "&amp;Oma muokkaus:">
+<!ENTITY unselectAllTypes.label "Älä valitse mitään">
+<!ENTITY type.whitelist.label "&amp;Sallimisehto">
+<!ENTITY regexp.warning "Syöttämäsi merkkijono tulkitaan säännölliseksi lausekkeeksi. Monet säännölliset lausekkeet saattavat hidastaa selailua. Jos tarkoituksena ei ollut käyttää säännöllistä lauseketta, lisää tähtimerkki (*) lauseen loppuun.">
+<!ENTITY dialog.title "Lisää Adblock Plus -suodatusehto">
+<!ENTITY basic.label "Perusnäkymä">
+<!ENTITY type.filter.label "&amp;Estävä suodatin">
+<!ENTITY types.label "Käytä tyypeissä:">
+<!ENTITY shortpattern.warning "Syöttämäsi merkkijono on liian lyhyt optimoitavaksi. Useat tällaiset merkkijonot saattavat hidastaa selailua. On suositeltavaa, että valitset tälle suodattimelle pidemmän merkkijonon.">
+<!ENTITY collapse.yes.label "Kyllä">
+<!ENTITY anchors.label "Hyväksy merkkijono vain:">
+<!ENTITY collapse.default.yes.label "Käytä oletusta (kyllä)">
+<!ENTITY domainRestriction.help "Määrittele yksi tai useampia verkkotunnuksia &quot;|&quot;-merkilla eroteltuna. Suodatin on käytössä vain näissä verkkotunnuksissa. Suodatinta ei käytetä verkkotunnuksella, jos sen edessä on &quot;~&quot;-merkki.">
+<!ENTITY accept.label "Lisää suodatin">
+<!ENTITY options.label "Asetukset">
+<!ENTITY disabled.warning "Adblock Plus on tällä hetkellä poistettu käytöstä. Voit silti lisätä suodattimia mutta ne otetaan käyttöön vasta kun, [link]otat Adblockin Plussan käyttöön[/link].">
+<!ENTITY anchor.start.flexible.label "verkko&amp;tunnuksen alussa.">
+<!ENTITY collapse.no.label "Ei">
+<!ENTITY selectAllTypes.label "Valitse kaikki">
+<!ENTITY advanced.label "Edistyneempi näkymä">
+<!ENTITY pattern.explanation "Merkkijono voi olla mikä tahansa osoitteen osa. Tähtimerkki (*) toimii jokerimerkkinä. Suodatin toimii vain osoitteissa, joita merkkijono vastaa.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/filters.dtd
new file mode 100644
index 0000000..5535b40
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Kaikki omat suodattimet korvataan valitun tiedoston sisällöllä. Haluatko varmasti jatkaa?">
+<!ENTITY slow.column "&amp;Hitaat suodattimet">
+<!ENTITY enabled.column "Kä&amp;ytössä">
+<!ENTITY subscription.lastDownload.checksumMismatch "Epäonnistui, tarkistussumma ei täsmää">
+<!ENTITY noFiltersInGroup.text "Valittu ryhmä on tyhjä">
+<!ENTITY subscription.actions.label "Toiminnot">
+<!ENTITY filter.selectAll.label "Valitse kaikki">
+<!ENTITY backupButton.label "&amp;Varmuuskopioi ja palauta">
+<!ENTITY restore.minVersion.warning "Varoitus: tiedosto on luotu uudemmalla Adblock Plussan versiolla. Ennen kuin palautat tästä tiedostosta, on suositeltavaa päivittää uusimpaan Adblock Plussan versioon.">
+<!ENTITY restore.error "Tiedoston tietoja ei voida käsitellä. Ehkä tämä ei ole Adblock Plus -varmuuskopiotiedosto?">
+<!ENTITY sort.ascending.label "&amp;A &gt; Z lajittelu">
+<!ENTITY sort.label "Lajitt&amp;eluperuste">
+<!ENTITY subscription.source.label "Suodatintilaus">
+<!ENTITY hitcount.column "&amp;Osumat">
+<!ENTITY noFilters.text "Omia suodattimia ei ole vielä.">
+<!ENTITY backup.custom.title "Vain omat suodattimet">
+<!ENTITY subscription.external.label "Toisen laajennuksen päivättävä">
+<!ENTITY subscription.delete.label "Poista">
+<!ENTITY noGroupSelected.text "Suodatinryhmä on valittava, ennen kuin sen suodattimia voidaan näyttää.">
+<!ENTITY filter.cut.label "Leikkaa">
+<!ENTITY restore.default.label "Palauta varmuuskopio: ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Lataa...">
+<!ENTITY subscriptions.tab.label "Suodatintilaukset">
+<!ENTITY sort.descending.label "&amp;Z &gt; A lajittelu">
+<!ENTITY filters.remove.warning "Haluatko varmasti poistaa kaikki valitut suodattimet?">
+<!ENTITY filter.delete.label "Poista">
+<!ENTITY addSubscriptionAdd.label "Lisää">
+<!ENTITY viewMenu.label "Näytä">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY addSubscriptionCancel.label "Peruuta">
+<!ENTITY subscription.enabled.label "Käytössä">
+<!ENTITY noSubscriptions.text "Suodatintilauksia ei ole vielä lisätty. Adblock Plus ei estä mitään
+ ilman suodattimia. Käytä &quot;Lisää suodatintilaus&quot; -painiketta lisätäksesi
+ joitakin.">
+<!ENTITY subscription.update.label "Päivitä suodattimet">
+<!ENTITY dialog.title "Adblock Plus -suodatinasetukset">
+<!ENTITY addFilter.label "&amp;Lisää suodatin">
+<!ENTITY subscription.minVersion.warning "Tämä suodatintilaus vaatii uudemman Adblock Plus -version, on suositeltavaa päivittää uusimpaan Adblock Plussan versioon.">
+<!ENTITY subscription.lastDownload.invalidURL "Epäonnistui, kelvoton osoite">
+<!ENTITY backup.error "Tapahtui virhe kirjoitettaessa suodattimia tiedostoon. Varmista että tiedosto ei ole kirjoitussuojattu tai jonkin muun ohjelman käytössä.">
+<!ENTITY filter.moveUp.label "Siirrä ylös">
+<!ENTITY addGroup.label "Li&amp;sää suodatinryhmä">
+<!ENTITY filter.edit.label "Muokkaa">
+<!ENTITY subscription.showHideFilters.label "Näytä/piilota suodattimet">
+<!ENTITY acceptableAds2.label "S&amp;alli osa ei-häiritsevästä mainonnasta">
+<!ENTITY addSubscriptionOther.label "Lisää jokin muu tilaus">
+<!ENTITY close.label "Sulje">
+<!ENTITY sort.none.label "Ei &amp;lajiteltu">
+<!ENTITY filter.actions.label "Suodatintoiminnot">
+<!ENTITY filter.copy.label "Kopioi">
+<!ENTITY filter.moveDown.label "Siirrä alas">
+<!ENTITY filter.resetHitCounts.label "Nollaa osumatilastot">
+<!ENTITY readMore.label "Lue lisää">
+<!ENTITY subscription.moveUp.label "Siirrä ylös">
+<!ENTITY addSubscription.label "L&amp;isää suodatintilaus">
+<!ENTITY subscription.homepage.label "Kotisivu">
+<!ENTITY backup.complete.title "Kaikki suodattimet ja tilaukset">
+<!ENTITY restore.own.label "Palauta oma varmuuskopio">
+<!ENTITY restore.complete.warning "Kaikki suodatinasetukset korvataan valitun tiedoston sisällöllä. Haluatko varmasti jatkaa?">
+<!ENTITY filters.tab.label "Omat suodattimet">
+<!ENTITY backup.label "Luo uusi varmuuskopio">
+<!ENTITY find.label "&amp;Etsi">
+<!ENTITY subscription.moveDown.label "Siirrä alas">
+<!ENTITY subscription.lastDownload.connectionError "Epäonnistui, latausvirhe">
+<!ENTITY subscription.lastDownload.success "Onnistui">
+<!ENTITY subscription.lastDownload.invalidData "Epäonnistui, kelvoton suodatinlista">
+<!ENTITY filter.paste.label "Liitä">
+<!ENTITY subscription.disabledFilters.enable "Ota käytöstä poistetut suodattimet käyttöön">
+<!ENTITY lasthit.column "&amp;Viimeisin osuma">
+<!ENTITY subscription.editTitle.label "Muokkaa otsikkoa">
+<!ENTITY subscription.disabledFilters.warning "Jotkin tämän suodatintilauksen suodattimista on poistettu käytössä.">
+<!ENTITY filter.column "&amp;Suodatusehto">
+<!ENTITY subscription.lastDownload.label "Viimeisin lataus:">
+<!ENTITY viewList.label "Näytä lista">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/firstRun.properties
new file mode 100644
index 0000000..3e6d9bb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Selaa yksityisesti estämällä seuraaminen - piilota jälkesi mainosyhtiöiltä, jotka muuten seuraavat jokaista liikettäsi.
+firstRun_toggle_off=OFF
+firstRun_feature_tracking=Seuraamisen estäminen
+firstRun_feature_malware=Haittaohjelmien estäminen
+firstRun_title=Adblock Plus on asennettu
+firstRun_toggle_on=ON
+firstRun_acceptableAdsExplanation=Kannustamme verkkosivuja käyttämään yksinkertaisia mainoksia, jotka eivät häiritse. Tämän vuoksi olemme luoneet <a>tiukat ohjesäännöt</a> hyväksyttävien mainosten tunnistamiseksi, jotka näytetään oletusasetuksilla. Jos silti haluat estää kaikki mainokset, voit ottaa tämän <a>pois käytöstä</a> käden käänteessä.
+firstRun_contributor_credits=Avustajat:
+firstRun_dataCorruptionWarning=Näetkö tämän sivun koko ajan? <a>Napsauta tätä!</a>
+firstRun_acceptableAdsHeadline=Häiritsevät mainokset estetään
+firstRun_share=Kerro ystävillesi
+firstRun_share_headline=<a>Auta meitä</a> tekemään verkosta parempi paikka
+firstRun_feature_social_description=Poista sivustoilta automaattisesti sosiaalisen median painikkeet, kuten Facebookin tykkää -painikkeet, jotka seuraavat verkkokäyttäytymistäsi.
+firstRun_filterlistsReinitializedWarning=Näyttäisi siltä, että ongelman takia kaikki suodattimet on poistettu ja niiden palauttaminen varmuuskopiosta epäonnistui. Tämän vuoksi kaikki suodattimien ja hyväksyttävien mainoksien asetukset on palautettu alkuarvoihin. Tarkasta suodatinlistat ja hyväksyttävien mainosten asetukset <a>Adblock Plussan asetuksista</a>.
+firstRun_feature_malware_description=Tee selaimestasi turvallisempi estämällä verkko-osoitteita, joiden tiedetään sisältävän haitallisia ohjelmia.
+firstRun_features=Adblock Plus voi tehdä muutakin kuin vain estää mainoksia
+firstRun_donate=lahjoita
+firstRun_donate_label=Tue projektiamme
+firstRun_feature_social=Sosiaalisen median painikkeiden poistaminen
+firstRun_legacySafariWarning=Käytössäsi on Safarin vanha versio, jota Adblock Plus ei tue. Se ei välttämättä toimi oikein tai saattaa heikentää joidenkin sivustojen käyttökokemusta. Suosittelemme vahvasti päivittämään Safari 6.1.1:een tai uudempaan (OSX 10.8 Mountain Lion), tai Safari 7.0.1:een tai uudempaan (OSX 10.9 Mavericks), tai käyttämään Mozilla Firefoxin, Google Chromen tai Operan uusinta versiota.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/global.properties
new file mode 100644
index 0000000..843c5e6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Ei estettäviä elementtejä avoimella sivulla
+action3_tooltip=Napsauttamalla Adblock Plus otetaan käyttöön/poistetaan käytöstä.
+notification_antiadblock_title=Piilotetaanko kohdennetut viestit?
+type_label_script=komento
+filter_elemhide_nocriteria=Piilotettavaa elementtiä määrittelevää tunnistetta ei annettu
+blockingGroup_title=Estoehdot
+whitelisted_tooltip=Adblock Plus on poistettu käytöstä tämänhetkisellä sivustolla.
+type_label_stylesheet=tyyliohje
+blocked_count_tooltip=?1? / ?2?
+type_label_font=kirjaisin
+type_label_popup=ponnahdusikkuna
+filter_regexp_tooltip=Tämä suodatin on joko säännöllinen lauseke tai liian lyhyt optimoitavaksi. Liian monta tällaista suodatinta saattaa hidastaa selailuasi.
+action0_tooltip=Napsautus avaa ponnahdusvalikon. Keskinapsautus ottaa käyttöön/poistaa käytöstä.
+whitelisted_page=Adblock Plus on poistettu käytöstä avoimella sivulla
+remove_group_warning=Haluatko varmasti poistaa tämän ryhmän?
+action1_tooltip=Napsautus avaa/sulkee elementtilistan. Keskinapsautus ottaa käyttöön/poistaa käytöstä.
+type_label_xmlhttprequest=XML-pyyntö
+active_tooltip=Adblock Plus on aktiivinen, ?1? kpl suodatintilauksia ja ?2? kpl omia suodattimia käytössä.
+type_label_document=dokumentti
+type_label_object_subrequest=objektin alipyyntö
+whitelistGroup_title=Poikkeusehdot
+disabled_tooltip=Adblock Plus ei ole käytössä.
+filter_elemhide_duplicate_id=Piilotettavalle elementille voidaan määritellä vain yksi tunniste (ID)
+type_label_object=objekti
+action2_tooltip=Napsautus avaa asetukset. Keskinapsautus ottaa käyttöön/poistaa käytöstä.
+type_label_subdocument=kehys
+clearStats_warning=Tämä nollaa kaikki osumatilastot ja poistaa osumien laskemisen käytöstä. Haluatko jatkaa?
+notification_antiadblock_message=Tämän sivun tiedetään näyttäneen kohdennettuja viestejä Adblock Plussan käyttäjille. Haluatko, että Adblock Plus piilottaa kohdennetut viestit?
+blocked_count_addendum=(sallituja: ?1?, piilotettuja: ?2?)
+subscription_invalid_location=Suodatinlistan sijainti on joko kelvoton osoite tai tiedoston nimi.
+type_label_image=kuva
+remove_subscription_warning=Haluatko varmasti poistaa tämän tilauksen?
+type_label_other=muu
+mobile_menu_enable=ABP: Ota käyttöön
+type_label_media=ääni/video
+mobile_menu_disable_site=ABP: Ei käytössä osoitteessa ?1?
+elemhideGroup_title=Elementtien piilotusehdot
+mobile_menu_enable_site=ABP: Käytä osoitteessa ?1?
+type_label_elemhide=piilotettu
+newGroup_title=Uusi suodatinryhmä
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/overlay.dtd
new file mode 100644
index 0000000..a123135
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Kyllä">
+<!ENTITY notification.button.no "&amp;Ei">
+<!ENTITY sync.label "&amp;Synkronoi Adblock Plussan asetukset">
+<!ENTITY whitelist.site.label "Ei käytössä osoitteessa ?1?">
+<!ENTITY filters.label "&amp;Suodatinasetukset">
+<!ENTITY disable.label "Poista käytöstä kaikkialla">
+<!ENTITY objecttab.title "Estä">
+<!ENTITY objecttab.tooltip "Estä tämä objekti Adblock Plussalla">
+<!ENTITY menuitem.label "A&amp;dblock Plus - Asetukset">
+<!ENTITY objecttabs.label "&amp;Korvake Flashin ja Javan yhteydessä">
+<!ENTITY sendReport.label "Raportoi onge&amp;lma tällä sivulla">
+<!ENTITY whitelist.page.label "Ei käytössä tällä sivulla">
+<!ENTITY context.image.label "Adblock Plus: Estä kuva">
+<!ENTITY counthits.label "&amp;Laske suodattimen osumat">
+<!ENTITY opensidebar.label "Näytä &amp;elementit">
+<!ENTITY notification.button.close "&amp;Sulje">
+<!ENTITY contribute.label "Avusta Adblock Plussaa">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Estä kehys">
+<!ENTITY blocked.tooltip "Tämän sivun estetyt elementit:">
+<!ENTITY hideplaceholders.label "P&amp;iilota elementit, jotka sisältävät estettyjä elementtejä">
+<!ENTITY showinstatusbar.label "&amp;Näytä tilarivillä">
+<!ENTITY sidebar.title "Estettävät elementit avoimella sivulla">
+<!ENTITY options.label "&amp;Valinnat">
+<!ENTITY context.object.label "Adblock Plus: Estä kohde">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Ota tämä sivu uudestaan käyttöön">
+<!ENTITY filters.tooltip "Aktiivisimmat suodattimet:">
+<!ENTITY closesidebar.label "Sulj&amp;e elementit">
+<!ENTITY showintoolbar.label "Nä&amp;ytä työkalupalkilla">
+<!ENTITY status.tooltip "Tila:">
+<!ENTITY context.media.label "Adblock Plus: Estä ääni/kuva">
+<!ENTITY subscription.update.label "Päivitä suodattimet">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/sendReport.dtd
new file mode 100644
index 0000000..8c58fdc
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "K&amp;umoa">
+<!ENTITY issues.disabledgroups.description "Seuraavat suodatintilaukset / suodatinryhmät ovat poistettu käytöstä mutta niillä saatta silti olla vaikutusta tällä sivulla:">
+<!ENTITY showData.label "Näytä raportin tiedot">
+<!ENTITY typeSelector.falsePositive.label "Adb&amp;lock Plus estää liikaa">
+<!ENTITY issues.change.description "Asetuksia on muutettu. Päivitä sivu testataksesi muutokset ja raportoi, jos muutokset eivät ratkaisseet ongelmaa.">
+<!ENTITY email.label "Sä&amp;hköposti:">
+<!ENTITY issues.openPreferences.label "Avaa suodatinasetukset">
+<!ENTITY sendPage.confirmation "Rapotti on tallennettu. Se löytyy tästä osoitteesta:">
+<!ENTITY copyLink.label "&amp;Kopioi raportin linkki">
+<!ENTITY issues.nofilters.description "Adblock Plus ei estä mitään tällä sivulla. Kohdattu ongelma on todennäköisesti riippumaton Adblock Plussasta.">
+<!ENTITY sendPage.knownIssue "Raportoimasi ongelma on todennäköisesti jo tiedossa. Lisätietoa:">
+<!ENTITY typeSelector.other.description "Valitse tämä vaihtoehto, jos epäilet ongelman olevan ennemminkin Adblock Plussassa kuin sen suodattimissa.">
+<!ENTITY issues.disabledgroups.enable.label "Ota suodatintilaus / suodatinlista käyttöön">
+<!ENTITY typeWarning.override.label "&amp;Ymmärrän ja haluan silti raportoida">
+<!ENTITY issues.disabled.enable.label "Ota Adblock Plus käyttöön tällä sivulla">
+<!ENTITY update.fixed.description "Suodatintilausten päivitykset todennäköisesti ratkaisivat raportoitavan ongelman. Päivitä sivusto ja yritä uudelleen. Mikäli ongelma säilyy, raportoi se.">
+<!ENTITY anonymous.label "&amp;Lähetä nimettömänä">
+<!ENTITY reloadButton.label "&amp;Päivitä sivu">
+<!ENTITY recentReports.clear.label "Poista kaikki &amp;raportit">
+<!ENTITY typeSelector.description "Tämä ikkuna ohjeistaa tarvittavat vaiheet Adblockin Plussan ongelmaraportin lähettämiseksi. Aluksi valitse onhelmatyyppi, jollaisen koet tällä sivulla:">
+<!ENTITY screenshot.remove.label "&amp;Poista arkaluontoista tietoa">
+<!ENTITY issues.ownfilters.description "Osa tämän sivun suodattimista on käyttäjän määrittelemiä. Poista käytöstä suodattimet, jotka saattavat aiheuttaa ongelmia:">
+<!ENTITY update.inProgress.description "Adblock Plussan pitää päivittää suodatintilaukset varmistaakseen, että ongelmaa ei ole jo ratkottu. Odota hetki...">
+<!ENTITY sendPage.retry.label "Lähetä uudelleen">
+<!ENTITY data.label "Raportin tie&amp;dot:">
+<!ENTITY recentReports.label "Näytä viimeksi lähetemäsi raportit">
+<!ENTITY typeWarning.description "Olet antanut ymmärtää halukkuutesi raportoida yleisestä virheestä Adblock Plussassa suodattimien sijaan. Huomaa että tällaiset raportit olisi parasta jättää [link]Adblock Plussan foorumeille[/link]. Ongelmaraportteria tulisi käyttää vain täydentämään olevassa olevaa keskutelua, sillä kukaan ei huomioi raporttiasi, jos et anna siihen linkitystä. Rapotoidessa annetaan automaattisesti luotu linkki.">
+<!ENTITY issues.disabled.description "Adblock Plus on poissa käytöstö tällä sivulla, se ei estä mitään.">
+<!ENTITY attachExtensions.label "L&amp;iitä lista aktiivisista laajennuksista rapottiin siltä varalta, että jokin niistä on ongelma syy">
+<!ENTITY issues.nosubscriptions.add.label "Lisää suodatintilaus">
+<!ENTITY issues.disabledfilters.enable.label "Ota suodatin käyttöön">
+<!ENTITY issues.override.label "Asetukset ovat oikein, &amp;jatka raportoimista">
+<!ENTITY issues.nosubscriptions.description "Näyttäisi siltä, että et ole tilannut yhtään valmiiksi tehtyä suodatinlistaa, jotka poistavat automaattisesti sivuilta epämieluisaa sisältöä.">
+<!ENTITY typeSelector.falsePositive.description "Valitse tämä vaihtoehto, jos sivulta puuttu olennaista sisältöä tai se näkyy väärin. Voit päätellä onko Adblock Plus syy ongelmaan ottamalla sen väliaikaisesti pois kaytöstä.">
+<!ENTITY typeSelector.other.label "&amp;Muu ongelma">
+<!ENTITY emailComment.label "On suositeltavaa antaa voimassa oleva sähköpostiosoite, jotta sinuun voidaan ottaa yhteyttä raporttiin liittyvissä kysymyksissä. Tämä mahdollistaa myös avustuksiesi tunnistamisen ja priorisoinnin korkeammalle.">
+<!ENTITY issues.whitelist.remove.label "Ota Adblock Plus uudestaan käyttöön tällä sivulla">
+<!ENTITY outdatedSubscriptions.description "Seuraavia suodatintilauksia ei ole päivitetty ainakaan kahteen viikkoon. Päivitä nämä tilaukset ennen raportin lähettämistä, sillä ongelma on saattaanut jo ratketa.">
+<!ENTITY dataCollector.description "Odota hetki, kun Adblock Plus kerää tarvittavia tietoja.">
+<!ENTITY sendButton.label "&amp;Lähetä raportti">
+<!ENTITY comment.label "Kommentti (&amp;valinnainen):">
+<!ENTITY sendPage.errorMessage "Raportin lähettäminen epäonnistui virhekoodilla &quot;?1?&quot;. Varmista että olet yhteydessä Internettiin ja yritä uudelleen. Mikäli ongelma ei katoa, pyydä apua osoitteesta [link]Adblock Plus forum[/link].">
+<!ENTITY showRecentReports.label "Näytä viimeksi lähetetyt raportit">
+<!ENTITY commentPage.heading "Lisää kommentti">
+<!ENTITY update.start.label "Aloita päivittäminen nyt">
+<!ENTITY issues.disabledfilters.description "Seuraavat suodattimet on poistettu käytöstä mutta niillä saatta silti olla vaikutusta tällä sivulla:">
+<!ENTITY screenshot.description "Sama sivu saattaa näyttää erilaiselta eri ihmisillä. Ongelman ymmärtämistä saattaa helpottaa, jos liität raporttiisi kuvakaappauksen. Voit myös poistaa arkaluontoista tietoa tai merkitä ongelman kannalta huomattavia kohtia. Tehdäksesi tämän napsauta vastaava painiketta ja valitse kuvan kohta hiirellä.">
+<!ENTITY screenshot.attach.label "&amp;Liitä sivun kuva raporttiin">
+<!ENTITY issues.whitelist.description "Adblock Plus on tällä hetkellä poistettu käytöstä sivulla, jota olet raportoimassa. Ota se käyttöön ja ennen raportointia päivitä sivu. Tämä auttaa rapotin tutkimista.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus &amp;ei estä mainosta">
+<!ENTITY typeSelector.heading "Valitse ongelman tyyppi">
+<!ENTITY anonymity.warning "Sinuun ei voida ottaa yhteyttä ja todennäköisesti priorisoimme raportin alemmas.">
+<!ENTITY wizard.title "Ongelman raportointi">
+<!ENTITY issues.ownfilters.disable.label "Poista suodatin käytöstä">
+<!ENTITY commentPage.description "Alla olevaan tekstikenttään voit syöttää kommentin (englanniksi) helpottaaksesi meitä ymmärtämään ongelman. Tämä vaihe on valinnainen mutta suositeltava, jos ongelma ei ole ilmiselvä. Voit myös käydä läpi raportin tiedot ennen sen lähettämistä.">
+<!ENTITY comment.lengthWarning "Kommentin pituus ylittää 1000 merkkiä. Vain ensimmäiset 1000 merkkiä lähetetään.">
+<!ENTITY typeSelector.falseNegative.description "Valitse tämä vaihtoehto, jos mainos näkyy vaikka Adblock Plus on käytössä.">
+<!ENTITY sendPage.waitMessage "Odota, Adblock Plus lähettää raporttia.">
+<!ENTITY dataCollector.heading "Tervetuloa ongelman raportoijaan">
+<!ENTITY screenshot.heading "Liitä kuvakaappaus">
+<!ENTITY sendPage.heading "Raportin lähettäminen">
+<!ENTITY issues.subscriptionCount.description "Näyttäisi siltä, että liian monta suodatintilausta on tilattuna. Tällainen järjestely ei ole suositeltavaa, sillä se nostaa ongelmien todennäköisyyttä. Emme voi hyväksyä ongelmaraporttia, koska jää epäselväksi kenen suodatintilauksen tekijän on ryhdyttävä korjaustoimiin. Poista kaikki paitsi välttämättömät suodatintilaukset ja kokeile esiintyykö ongelma yhä.">
+<!ENTITY screenshot.mark.label "&amp;Merkkaa ongelma">
+<!ENTITY privacyPolicy.label "Yksityisyyskäytäntö">
+<!ENTITY issues.description "Adblock Plus on havainnut ongelmia asetuksissa, jotka saattavat aiheuttaa tämän ongelman tai tehdä raportin tutkimisesta vaikeaa.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/sidebar.dtd
new file mode 100644
index 0000000..5a6c4d0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Välkytä reunoja">
+<!ENTITY address.label "Osoite">
+<!ENTITY context.open.label "Avaa uuteen välilehteen">
+<!ENTITY type.label "Tyyppi">
+<!ENTITY tooltip.filterSource.label "Suodattimen lähde:">
+<!ENTITY noitems.label "Ei estettäviä elementtejä">
+<!ENTITY filter.label "Suodatin">
+<!ENTITY tooltip.size.label "Koko:">
+<!ENTITY reattach.label "Kiinnitä">
+<!ENTITY search.label "&amp;Etsi:">
+<!ENTITY docDomain.thirdParty "(kolmas osapuoli)">
+<!ENTITY filterSource.label "Suodattimen lähde">
+<!ENTITY tooltip.docDomain.label "Dokumentin lähde:">
+<!ENTITY context.copy.label "Kopioi osoite">
+<!ENTITY tooltip.type.label "Tyyppi:">
+<!ENTITY context.disablefilter.label "Poista käytöstä suodatin: ?1?">
+<!ENTITY context.copyFilter.label "Kopioi suodatin">
+<!ENTITY context.block.label "Estä elementti">
+<!ENTITY context.enablefilter.label "Palauta suodatin: ?1?">
+<!ENTITY detach.label "Irrota">
+<!ENTITY whitelisted.label "Sallittu sivu">
+<!ENTITY context.disablefilteronsite.label "Poista tämä suodatin käytöstä osoiteessa ?1?">
+<!ENTITY detached.title "Adblock Plus: Estettävien elementtien lista (irrotettu)">
+<!ENTITY docDomain.firstParty "(ensimmäinen osapuoli)">
+<!ENTITY tooltip.type.whitelisted "(sallittu)">
+<!ENTITY tooltip.filter.label "Vaikuttava suodatin:">
+<!ENTITY tooltip.filter.disabled "(poistettu käytöstä)">
+<!ENTITY context.editfilter.label "Muokkaa suodatinta">
+<!ENTITY tooltip.type.blocked "(estetty)">
+<!ENTITY size.label "Koko">
+<!ENTITY context.whitelist.label "Lisää poikkeusehto">
+<!ENTITY context.selectAll.label "Valitse kaikki">
+<!ENTITY state.label "Tila">
+<!ENTITY docDomain.label "Dokumentin lähde">
+<!ENTITY tooltip.address.label "Osoite:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/subscriptionSelection.dtd
new file mode 100644
index 0000000..694748c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fi/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Lisää myös suodatintilaus &quot;?1?&quot;">
+<!ENTITY list.download.failed "Suodatinlistan noutaminen epäonnistui.">
+<!ENTITY list.download.retry "Yritä uudestaan">
+<!ENTITY title.label "Tilauksen nimi:">
+<!ENTITY list.download.website "Näytä verkkosivu">
+<!ENTITY supplementMessage "Tämä suodatintilaus on tarkoitettu käytettäväksi yhdessä suodatintilauksen &quot;?1?&quot; kanssa, jota et vielä käytä.">
+<!ENTITY viewList.label "Näytä suodattimet">
+<!ENTITY visitHomepage.label "Vieraile kotisivulla">
+<!ENTITY addSubscription.label "Lisää suodatintilaus">
+<!ENTITY dialog.title "Lisää Adblock Plus -suodatintilaus">
+<!ENTITY location.label "Suodatinlistan sijainti:">
+<!ENTITY fromWeb.description "Vahvista tämän suodatintilauksen lisääminen. Voit muuttaa tilauksen nimeä tai sijaintia ennen sen lisäämistä.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/composer.dtd
new file mode 100644
index 0000000..285f961
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "e&amp;n fin d'adresse">
+<!ENTITY domainRestriction.label "Restrein&amp;dre au domaine :">
+<!ENTITY collapse.default.no.label "Utiliser le comportement par défaut (non)">
+<!ENTITY firstParty.label "Provenant unique&amp;ment du même domaine">
+<!ENTITY preferences.label "&amp;Afficher les filtres existants…">
+<!ENTITY pattern.label "Proposition de motifs">
+<!ENTITY thirdParty.label "Provenan&amp;t uniquement d'autres domaines">
+<!ENTITY filter.label "Nouveau &amp;filtre :">
+<!ENTITY collapse.label "&amp;Réutiliser l'espace de l'élément filtré :">
+<!ENTITY match.warning "Le motif que vous avez saisi ne correspondra plus à l'adresse devant être bloquée/autorisée et n'aura plus aucun effet sur elle.">
+<!ENTITY anchor.start.label "en déb&amp;ut d'adresse">
+<!ENTITY matchCase.label "Sensible à la &amp;casse">
+<!ENTITY custom.pattern.label "&amp;Personnalisé :">
+<!ENTITY unselectAllTypes.label "Ne rien sélectionner">
+<!ENTITY type.whitelist.label "Règle d'e&amp;xception">
+<!ENTITY regexp.warning "Le motif que vous avez indiqué sera interprété comme une expression régulière qui ne peut être traitée efficacement par Adblock Plus et ralentira votre navigation. Si vous ne souhaitiez pas utiliser d'expression régulière, veuillez ajouter un * à la fin du motif.">
+<!ENTITY dialog.title "Ajouter une règle de filtrage Adblock Plus">
+<!ENTITY basic.label "Affichage standard">
+<!ENTITY type.filter.label "Filtre &amp;bloquant">
+<!ENTITY types.label "Appliquer aux types suivants :">
+<!ENTITY shortpattern.warning "Le motif que vous avez indiqué est trop court pour être optimisé et ralentira votre navigation. Nous vous recommandons de choisir une chaîne de caractères plus longue pour ce filtre afin de permettre à Adblock Plus de le traiter plus efficacement.">
+<!ENTITY collapse.yes.label "Oui">
+<!ENTITY anchors.label "Accepter le motif uniquement :">
+<!ENTITY collapse.default.yes.label "Utiliser le comportement par défaut (oui)">
+<!ENTITY domainRestriction.help "Spécifiez un ou plusieurs domaines séparés par le symbole « | », le filtre ne s'appliquera alors qu'aux domaines indiqués. Le symbole « ~ » précédant un nom de domaine signifie que le filtre ne devra pas être appliqué à ce domaine.">
+<!ENTITY accept.label "Ajouter le filtre">
+<!ENTITY options.label "Options">
+<!ENTITY disabled.warning "Adblock Plus est actuellement désactivée. Vous pouvez continuer à ajouter des filtres mais ils ne seront pas appliqués tant que vous n'aurez pas [link]activé Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "a&amp;u début du nom de domaine">
+<!ENTITY collapse.no.label "Non">
+<!ENTITY selectAllTypes.label "Tout sélectionner">
+<!ENTITY advanced.label "Affichage avancé">
+<!ENTITY pattern.explanation "Le motif peut être une partie de l'adresse ; le symbole * jouant le rôle de joker. Le filtre ne sera appliqué qu'aux adresses coïncidant avec le motif.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/filters.dtd
new file mode 100644
index 0000000..6583fd9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Tous vos filtres personnalisés seront remplacés par le contenu du fichier sélectionné. Voulez-vous continuer ?">
+<!ENTITY slow.column "Fi&amp;ltres lents">
+<!ENTITY enabled.column "A&amp;ctivé">
+<!ENTITY subscription.lastDownload.checksumMismatch "Échec, le checksum ne correspond pas !">
+<!ENTITY noFiltersInGroup.text "Le groupe sélectionné est vide.">
+<!ENTITY subscription.actions.label "Actions">
+<!ENTITY filter.selectAll.label "Tout sélectionner">
+<!ENTITY backupButton.label "&amp;Sauvegarde et restauration">
+<!ENTITY restore.minVersion.warning "Attention : le fichier a été créé avec une nouvelle version d'Adblock Plus. Vous devriez mettre à jour et passer à la dernière version d'Adblock Plus avant de restaurer vos données avec ce fichier.">
+<!ENTITY restore.error "Les données de ce fichier ne peuvent être traitées, il est possible qu'il ne s'agisse pas d'un fichier de données d'Adblock Plus.">
+<!ENTITY sort.ascending.label "Ordre de &amp;A &gt; Z">
+<!ENTITY sort.label "&amp;Trier par">
+<!ENTITY subscription.source.label "Liste de filtres">
+<!ENTITY hitcount.column "Co&amp;mpteur">
+<!ENTITY noFilters.text "Vous n'avez pas encore de filtres personnalisés.">
+<!ENTITY backup.custom.title "Uniquement les filtres personnalisés">
+<!ENTITY subscription.external.label "Mis à jour par une autre extension">
+<!ENTITY subscription.delete.label "Supprimer">
+<!ENTITY noGroupSelected.text "Vous devez choisir un groupe de filtres avant de pouvoir afficher ses filtres.">
+<!ENTITY filter.cut.label "Couper">
+<!ENTITY restore.default.label "Restaurer la sauvegarde du ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Téléchargement en cours…">
+<!ENTITY subscriptions.tab.label "Abonnements à des filtres">
+<!ENTITY sort.descending.label "Ordre de &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Souhaitez-vous vraiment supprimer tous les filtres sélectionnés ?">
+<!ENTITY filter.delete.label "Supprimer">
+<!ENTITY addSubscriptionAdd.label "Ajouter">
+<!ENTITY viewMenu.label "Affichage">
+<!ENTITY subscription.lastDownload.unknown "Inconnu">
+<!ENTITY addSubscriptionCancel.label "Annuler">
+<!ENTITY subscription.enabled.label "Activé">
+<!ENTITY noSubscriptions.text "Vous n'avez pas encore ajouté d'abonnement. Adblock Plus ne bloquera rien sans filtres, veuillez utiliser « Ajouter un abonnement » pour en ajouter.">
+<!ENTITY subscription.update.label "Mettre à jour les filtres">
+<!ENTITY dialog.title "Préférences Adblock Plus">
+<!ENTITY addFilter.label "Ajouter u&amp;n filtre">
+<!ENTITY subscription.minVersion.warning "Cet abonnement nécessite une version plus récente d'Adblock Plus, vous devriez installer la dernière version d'Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Échec, ceci n'est pas une adresse valide !">
+<!ENTITY backup.error "Une erreur s'est produite lors de l'écriture des filtres dans le fichier. Assurez-vous que ce fichier n'est pas protégé en écriture ou utilisé par une autre application.">
+<!ENTITY filter.moveUp.label "Monter">
+<!ENTITY addGroup.label "Ajouter un &amp;groupe de filtres">
+<!ENTITY filter.edit.label "Modifier">
+<!ENTITY subscription.showHideFilters.label "Afficher/masquer les filtres">
+<!ENTITY acceptableAds2.label "Autor&amp;iser certaines publicités non-intrusives">
+<!ENTITY addSubscriptionOther.label "Ajouter un autre abonnement">
+<!ENTITY close.label "Fermer">
+<!ENTITY sort.none.label "&amp;Non trié">
+<!ENTITY filter.actions.label "Actions sur filtre">
+<!ENTITY filter.copy.label "Copier">
+<!ENTITY filter.moveDown.label "Descendre">
+<!ENTITY filter.resetHitCounts.label "Réinitialiser le compteur">
+<!ENTITY readMore.label "En apprendre davantage">
+<!ENTITY subscription.moveUp.label "Monter">
+<!ENTITY addSubscription.label "S'abonner à la liste de &amp;filtres">
+<!ENTITY subscription.homepage.label "Page d'accueil">
+<!ENTITY backup.complete.title "Tous les filtres et abonnements">
+<!ENTITY restore.own.label "Restaurer une sauvegarde personnelle">
+<!ENTITY restore.complete.warning "Toutes vos préférences pour les filtres seront remplacées par le contenu du fichier sélectionné. Voulez-vous continuer ?">
+<!ENTITY filters.tab.label "Filtres personnalisés">
+<!ENTITY backup.label "Créer une nouvelle sauvegarde">
+<!ENTITY find.label "Re&amp;chercher">
+<!ENTITY subscription.moveDown.label "Descendre">
+<!ENTITY subscription.lastDownload.connectionError "Échec, erreur lors du téléchargement !">
+<!ENTITY subscription.lastDownload.success "Réussie">
+<!ENTITY subscription.lastDownload.invalidData "Échec, ceci n'est pas une liste de filtres valide !">
+<!ENTITY filter.paste.label "Coller">
+<!ENTITY subscription.disabledFilters.enable "Activer les filtres désactivés">
+<!ENTITY lasthit.column "&amp;Dernière utilisation">
+<!ENTITY subscription.editTitle.label "Modifier le nom">
+<!ENTITY subscription.disabledFilters.warning "Certains filtres de cet abonnement sont désactivés.">
+<!ENTITY filter.column "Règle de &amp;filtrage">
+<!ENTITY subscription.lastDownload.label "Dernière mise à jour :">
+<!ENTITY viewList.label "Afficher la liste">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/firstRun.properties
new file mode 100644
index 0000000..ddc8c7b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Naviguer incognito en désactivant le suivi, en masquant vos traces aux publicistes qui traqueraient vos faits et gestes.
+firstRun_toggle_off=INACTIF
+firstRun_feature_tracking=Désactiver l'espionnage
+firstRun_feature_malware=Blocage des logiciels malveillants
+firstRun_title=Adblock Plus a été installée
+firstRun_toggle_on=ACTIF
+firstRun_acceptableAdsExplanation=Nous aimerions encourager les sites Web à utiliser de la publicité honnête et discrète. C'est pourquoi nous avons établi <a>des lignes directrices strictes</a> afin d'identifier les annonces acceptables, par défaut. Si vous souhaitez tout de même bloquer toutes les publicités, vous pouvez <a>désactiver</a> cela dans les paramètres en quelques secondes.
+firstRun_contributor_credits=Crédits des contributeurs
+firstRun_dataCorruptionWarning=Cette page s'affiche-t-elle encore ? <a>Cliquez ici !</a>
+firstRun_acceptableAdsHeadline=Les pubs seront à présent bloquées
+firstRun_share=Parlez-en à vos amis
+firstRun_share_headline=<a>Donnez-nous un coup de main</a> à rendre le Web meilleur
+firstRun_feature_social_description=Se débarrasser automatiquement des boutons de réseaux sociaux tels que les « J'aime » Facebook qui apparaissent sur les pages Web et suivent votre comportement.
+firstRun_filterlistsReinitializedWarning=Il semblerait qu'à cause d'un problème, tous les filtres aient été supprimés et que nous n'ayons été en mesure de rétablir une sauvegarde. C'est pourquoi nous avons été contraints de réinitialiser vos filtres et les paramètres des publicités acceptables. Veuillez vérifier vos listes de filtres et les paramètres de publicités acceptables dans les <a>options d'Adblock Plus</a>.
+firstRun_feature_malware_description=Rendre votre navigation plus sécurisée en bloquant les domaines malveillants connus.
+firstRun_features=Adblock Plus peut faire plus que bloquer les pubs
+firstRun_donate=Faire un don
+firstRun_donate_label=Soutenir notre projet
+firstRun_feature_social=Supprimer les boutons des réseaux sociaux
+firstRun_legacySafariWarning=Vous utilisez une vieille version de Safari incompatible avec Adblock Plus. Elle pourra ne pas bien fonctionner ou nuire à l'expérience utilisateur sur certains sites Web. Nous recommandons fortement de mettre à jour Safari, soit vers la version 6.1.1 ou supérieure (sur OS X 10.8 Mountain Lion), soit vers la version 7.0.1 ou supérieure (sur OS X 10.9 Mavericks) ou d'utiliser la dernière version de Mozilla Firefox, Google Chrome ou Opera.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/global.properties
new file mode 100644
index 0000000..351b82d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Aucun élément filtrable sur cette page
+action3_tooltip=Cliquez pour activer/désactiver Adblock Plus.
+notification_antiadblock_title=Cacher les messages ciblés ?
+type_label_script=script
+filter_elemhide_nocriteria=Aucun critère spécifié pour reconnaître l'élément à masquer
+blockingGroup_title=Règles de blocage de publicités
+whitelisted_tooltip=Adblock Plus est désactivée pour cette page.
+type_label_stylesheet=feuille de styles
+blocked_count_tooltip=?1? bloqués sur ?2?
+type_label_font=police
+type_label_popup=Fenêtre popup
+filter_regexp_tooltip=Ce filtre est soit une expression régulière, soit trop court pour être optimisé. Un excès de ce genre de filtres pourrait ralentir votre navigation.
+action0_tooltip=Cliquez pour afficher le menu contextuel, clic du milieu pour activer/désactiver.
+whitelisted_page=Adblock Plus a été désactivée pour cette page
+remove_group_warning=Souhaitez-vous vraiment supprimer ce groupe ?
+action1_tooltip=Cliquez pour ouvrir/fermer la liste des éléments filtrables, clic du milieu pour activer/désactiver.
+type_label_xmlhttprequest=requête XML
+active_tooltip=Adblock Plus est active, ?1? abonnement(s) et ?2? filtre(s) personnel(s) utilisé(s).
+type_label_document=document
+type_label_object_subrequest=sous-requête objet
+whitelistGroup_title=Règles d'exceptions
+disabled_tooltip=Adblock Plus est désactivée.
+filter_elemhide_duplicate_id=Il n'est possible de spécifier qu'une ID de l'élément à masquer
+type_label_object=objet
+action2_tooltip=Cliquez pour ouvrir les préférences, clic du milieu pour activer/désactiver.
+type_label_subdocument=cadre
+clearStats_warning=Cela va remettre à zéro les statistiques d'utilisation de filtre et désactiver le comptage d'utilisation de filtre. Souhaitez-vous vraiment faire cela ?
+notification_antiadblock_message=Ce site est connu pour afficher des messages destinés aux utilisateurs d'Adblock Plus. Voulez-vous qu'Adblock Plus cache ces messages ?
+blocked_count_addendum=(également en liste blanche : ?1?, masqué(s) : ?2?)
+subscription_invalid_location=L'adresse indiquant l'emplacement de la liste de filtres n'est ni une URL valide, ni un nom de fichier valide.
+type_label_image=image
+remove_subscription_warning=Souhaitez-vous vraiment supprimer cet abonnement ?
+type_label_other=autre
+mobile_menu_enable=ABP : Activer
+type_label_media=audio/vidéo
+mobile_menu_disable_site=ABP : Désactiver pour ?1?
+elemhideGroup_title=Règles de masquage d'éléments
+mobile_menu_enable_site=ABP : Activer pour ?1?
+type_label_elemhide=masqué
+newGroup_title=Nouveau groupe de filtres
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/overlay.dtd
new file mode 100644
index 0000000..c07c593
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Oui">
+<!ENTITY notification.button.no "&amp;Non">
+<!ENTITY sync.label "S&amp;ynchroniser les paramètres d'Adblock Plus">
+<!ENTITY whitelist.site.label "Désactiver pour ?1?">
+<!ENTITY filters.label "Pré&amp;férences de filtre">
+<!ENTITY disable.label "Désactiver partout">
+<!ENTITY objecttab.title "Bloquer">
+<!ENTITY objecttab.tooltip "Cliquer ici afin qu'Adblock Plus bloque cet objet">
+<!ENTITY menuitem.label "Préférences d'Ad&amp;block Plus">
+<!ENTITY objecttabs.label "Afficher une étiquette pour Flash et &amp;Java">
+<!ENTITY sendReport.label "&amp;Signaler un problème sur cette page">
+<!ENTITY whitelist.page.label "Désactiver pour cette page uniquement">
+<!ENTITY context.image.label "Bloquer l'image avec Adblock Plus">
+<!ENTITY counthits.label "Co&amp;mpter la fréquence d'utilisation de filtre">
+<!ENTITY opensidebar.label "Ouvrir la liste des élé&amp;ments filtrables">
+<!ENTITY notification.button.close "&amp;Fermer">
+<!ENTITY contribute.label "Contribuer à Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Bloquer le cadre avec Adblock Plus">
+<!ENTITY blocked.tooltip "Éléments bloqués sur cette page :">
+<!ENTITY hideplaceholders.label "Ré&amp;utiliser l'espace laissé par les éléments bloqués">
+<!ENTITY showinstatusbar.label "Afficher da&amp;ns la barre d'état">
+<!ENTITY sidebar.title "Éléments filtrables dans la page courante">
+<!ENTITY options.label "&amp;Options">
+<!ENTITY context.object.label "Bloquer l'objet avec Adblock Plus">
+<!ENTITY context.removeWhitelist.label "Activer à nouveau Adblock Plus pour cette page">
+<!ENTITY filters.tooltip "Filtres les plus utilisés :">
+<!ENTITY closesidebar.label "Fer&amp;mer la liste des éléments filtrables">
+<!ENTITY showintoolbar.label "Afficher dans la barre d'&amp;outils">
+<!ENTITY status.tooltip "État :">
+<!ENTITY context.media.label "Bloquer les vidéos/audios avec Adblock Plus">
+<!ENTITY subscription.update.label "Mettre à jour les filtres">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/sendReport.dtd
new file mode 100644
index 0000000..ee5069b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "A&amp;nnuler">
+<!ENTITY issues.disabledgroups.description "Les abonnements/groupes de filtres suivants sont désactivés, ils ne peuvent pas encore avoir d'effet sur cette page :">
+<!ENTITY showData.label "Afficher les données du signalement">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus bloque &amp;trop">
+<!ENTITY issues.change.description "Votre configuration a été modifiée. Veuillez actualiser la page pour tester les modifications et soumettez un signalement si le problème n'a pas été résolu en effectuant cette modification.">
+<!ENTITY email.label "&amp;Courriel :">
+<!ENTITY issues.openPreferences.label "Ouvrir les préférences de filtre">
+<!ENTITY sendPage.confirmation "Votre signalement a été envoyé. Vous pouvez y accéder à l'adresse suivante :">
+<!ENTITY copyLink.label "Co&amp;pier le lien du signalement">
+<!ENTITY issues.nofilters.description "Adblock Plus ne bloque rien sur la page courante. Le problème que vous observez n'est probablement pas à mettre en relation avec Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Le problème que vous signalez est probablement déjà connu. Davantage d'informations :">
+<!ENTITY typeSelector.other.description "Choisissez cette option si vous pensez qu'Adblock Plus elle-même est la cause du problème plutôt que ses filtres.">
+<!ENTITY issues.disabledgroups.enable.label "Activer l'abonnement/le groupe de filtres">
+<!ENTITY typeWarning.override.label "Je comprend&amp;s et souhaite soumettre le signalement tout de même">
+<!ENTITY issues.disabled.enable.label "Activer Adblock Plus">
+<!ENTITY update.fixed.description "Les mises à jour de vos abonnements de filtres ont probablement résolu le problème que vous avez signalé. Veuillez recharger la page et réessayer, appuyez à nouveau sur « Signaler » si le problème persiste.">
+<!ENTITY anonymous.label "Soumission &amp;anonyme">
+<!ENTITY reloadButton.label "&amp;Actualiser la page">
+<!ENTITY recentReports.clear.label "&amp;Supprimer tous les signalements">
+<!ENTITY typeSelector.description "Cette fenêtre vous guidera à travers les étapes nécessaires à la soumission d'un problème Adblock Plus. Dans un premier temps, veuillez choisir le type de problème rencontré sur cette page :">
+<!ENTITY screenshot.remove.label "&amp;Supprimer les données sensibles">
+<!ENTITY issues.ownfilters.description "Certains des filtres utilisés sur cette page ont été définis par l'utilisateur. Veuillez désactiver les filtres qui ont pu avoir été à l'origine du problème :">
+<!ENTITY update.inProgress.description "Adblock Plus doit mettre à jour vos abonnements de filtres pour s'assurer que le problème n'a pas déjà été résolu. Veuillez patienter…">
+<!ENTITY sendPage.retry.label "Envoyer à nouveau">
+<!ENTITY data.label "&amp;Données du signalement :">
+<!ENTITY recentReports.label "Vos signalements récemment soumis">
+<!ENTITY typeWarning.description "Vous avez indiqué que vous voulez signaler un problème général concernant Adblock Plus plutôt qu'un problème de filtres. Veuillez prendre note que ce type de problèmes est plutôt signalé dans le [link]forum d'Adblock Plus[/link]. Vous devriez utiliser la soumission de signalement uniquement pour ajouter un point à une discussion existante, puisque personne n'en prendra connaissance à moins que vous leur fournissiez le lien pointant vers la discussion. Le lien automatiquement généré sera fourni après la soumission du signalement.">
+<!ENTITY issues.disabled.description "Adblock Plus est désactivée, elle ne bloquera rien dans cet état.">
+<!ENTITY attachExtensions.label "Joindre une liste d'e&amp;xtensions actives au signalement au cas où il y aurait un problème de conflit d'extension">
+<!ENTITY issues.nosubscriptions.add.label "Ajouter un abonnement">
+<!ENTITY issues.disabledfilters.enable.label "Activer le filtre">
+<!ENTITY issues.override.label "La &amp;configuration est correcte, poursuivre le signalement">
+<!ENTITY issues.nosubscriptions.description "Vous ne semblez pas être abonné à une liste de filtres prédéfinis qui suppriment automatiquement des contenus indésirables de sites Web.">
+<!ENTITY typeSelector.falsePositive.description "Choisissez cette option si le contenu de la page est sévèrement tronqué, est mal affiché ou ne fonctionne pas correctement. Vous pouvez vérifier si Adblock Plus en est la cause en la désactivant temporairement.">
+<!ENTITY typeSelector.other.label "&amp;Autre problème">
+<!ENTITY emailComment.label "Nous vous encourageons à saisir un courriel valide afin que nous puissions vous contacter pour toute question concernant votre signalement. Cela nous permettra également de reconnaître vos contributions et de les traiter prioritairement.">
+<!ENTITY issues.whitelist.remove.label "Activer à nouveau Adblock Plus sur cette page">
+<!ENTITY outdatedSubscriptions.description "Les abonnements de filtres suivants n'ont pas été mis à jour depuis au moins deux semaines. Veuillez mettre à jour ces abonnements avant de signaler un problème, il se pourrait qu'il ait déjà été résolu.">
+<!ENTITY dataCollector.description "Veuillez patienter quelques instants pendant qu'Adblock Plus réunit les données nécessaires.">
+<!ENTITY sendButton.label "Envo&amp;yer le signalement">
+<!ENTITY comment.label "&amp;Commentaire (facultatif) :">
+<!ENTITY sendPage.errorMessage "Une tentative d'envoi du signalement a échoué avec le code erreur « ?1? ». Veuillez vérifier que vous êtes bien connecté à Internet et réessayer. Si le problème persiste, veuillez demander assistance dans le [link]forum d'Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Afficher les signalements soumis récemment">
+<!ENTITY commentPage.heading "Commentaire">
+<!ENTITY update.start.label "Mettre à jour maintenant">
+<!ENTITY issues.disabledfilters.description "Les filtres suivants sont désactivés, ils ne peuvent pas encore avoir d'effet sur cette page :">
+<!ENTITY screenshot.description "La même page peut s'afficher différemment pour différentes personnes. Cela pourrait être utile de joindre une copie d'écran à votre signalement. Vous pouvez enlever les parties contenant des informations sensibles et mettre en évidence les zones où le problème est visible. Pour cela, cliquez sur le bouton correspondant et sélectionnez une zone de l'image avec votre souris.">
+<!ENTITY screenshot.attach.label "&amp;Joindre une image de la page au signalement">
+<!ENTITY issues.whitelist.description "Adblock Plus est actuellement désactivée sur la page que vous signalez. Veuillez l'activer à nouveau et actualiser la page avant de soumettre le signalement pour qu'une recherche de solutions soit entamée.">
+<!ENTITY typeSelector.falseNegative.label "Ad&amp;block Plus ne bloque pas une publicité">
+<!ENTITY typeSelector.heading "Choisir le type de problème">
+<!ENTITY anonymity.warning "Nous ne serons pas en mesure de vous recontacter et votre signalement ne sera probablement pas traité prioritairement.">
+<!ENTITY wizard.title "Signalement de problèmes">
+<!ENTITY issues.ownfilters.disable.label "Désactiver le filtre">
+<!ENTITY commentPage.description "Le champ ci-dessous vous permet de saisir un commentaire pour nous aider à comprendre le problème. Cette étape est facultative mais recommandée si le problème n'est pas évident à détecter. Vous pouvez également revoir les données du signalement avant l'envoi.">
+<!ENTITY comment.lengthWarning "Votre commentaire comporte plus de 1000 caractères. Seuls les 1000 premiers caractères seront envoyés.">
+<!ENTITY typeSelector.falseNegative.description "Choisissez cette option si une publicité est tout de même affichée bien qu'Adblock Plus soit activée.">
+<!ENTITY sendPage.waitMessage "Veuillez patienter pendant qu'Adblock Plus soumet votre signalement.">
+<!ENTITY dataCollector.heading "Bienvenue dans l'assistant de signalement de problèmes">
+<!ENTITY screenshot.heading "Joindre une copie d'écran">
+<!ENTITY sendPage.heading "Envoyer le signalement">
+<!ENTITY issues.subscriptionCount.description "Il semblerait que vous soyez abonné(e) à trop de listes de filtres. Cette configuration n'est pas recommandée car elle augmentera la probabilité de rencontrer des problèmes. Nous ne pouvons également pas accepter votre signalement parce qu'il ne sera pas facile de définir quel auteur d'abonnement devra entreprendre quelque chose. Veuillez supprimer tous les abonnements exceptés ceux qui sont absolument nécessaires et vérifier si le problème se produit encore.">
+<!ENTITY screenshot.mark.label "&amp;Mettre en évidence le problème">
+<!ENTITY privacyPolicy.label "Politique de confidentialité">
+<!ENTITY issues.description "Adblock Plus a détecté que votre configuration est mal paramétrée, cela pourrait être la cause du problème ou rendra la recherche de solution au signalement difficile.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/sidebar.dtd
new file mode 100644
index 0000000..ffdafff
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Faire clignoter les bordures de l'élément">
+<!ENTITY address.label "Adresse">
+<!ENTITY context.open.label "Ouvrir dans un nouvel onglet">
+<!ENTITY type.label "Type">
+<!ENTITY tooltip.filterSource.label "Source du filtre :">
+<!ENTITY noitems.label "Aucun élément filtrable">
+<!ENTITY filter.label "Filtre">
+<!ENTITY tooltip.size.label "Taille :">
+<!ENTITY reattach.label "Rattacher">
+<!ENTITY search.label "&amp;Rechercher :">
+<!ENTITY docDomain.thirdParty "(tierce partie)">
+<!ENTITY filterSource.label "Source du filtre">
+<!ENTITY tooltip.docDomain.label "Source du document :">
+<!ENTITY context.copy.label "Copier l'adresse de l'élément">
+<!ENTITY tooltip.type.label "Type :">
+<!ENTITY context.disablefilter.label "Désactiver le filtre ?1?">
+<!ENTITY context.copyFilter.label "Copier le filtre">
+<!ENTITY context.block.label "Bloquer cet élément">
+<!ENTITY context.enablefilter.label "Réactiver le filtre ?1?">
+<!ENTITY detach.label "Détacher">
+<!ENTITY whitelisted.label "Page dans la liste blanche">
+<!ENTITY context.disablefilteronsite.label "Désactiver ce filtre pour ?1?">
+<!ENTITY detached.title "Adblock Plus : éléments filtrables (détaché)">
+<!ENTITY docDomain.firstParty "(première partie)">
+<!ENTITY tooltip.type.whitelisted "(autorisée)">
+<!ENTITY tooltip.filter.label "Filtre utilisé :">
+<!ENTITY tooltip.filter.disabled "(désactivé)">
+<!ENTITY context.editfilter.label "Modifier le filtre actif">
+<!ENTITY tooltip.type.blocked "(bloquée)">
+<!ENTITY size.label "Taille">
+<!ENTITY context.whitelist.label "Ajouter à la liste blanche">
+<!ENTITY context.selectAll.label "Tout sélectionner">
+<!ENTITY state.label "État">
+<!ENTITY docDomain.label "Source du document">
+<!ENTITY tooltip.address.label "Adresse :">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/subscriptionSelection.dtd
new file mode 100644
index 0000000..56b935b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fr/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "&amp;Ajouter également l'abonnement « ?1? »">
+<!ENTITY list.download.failed "Adblock Plus n'a pu récupérer la liste des abonnements.">
+<!ENTITY list.download.retry "Essayer à nouveau">
+<!ENTITY title.label "&amp;Nom de l'abonnement :">
+<!ENTITY list.download.website "Afficher le site Web">
+<!ENTITY supplementMessage "Cet abonnement est prévu pour être utilisé avec l'abonnement &quot;?1?&quot; que vous n'utilisez pas encore.">
+<!ENTITY viewList.label "Afficher les filtres">
+<!ENTITY visitHomepage.label "Se rendre au site Web">
+<!ENTITY addSubscription.label "Ajouter l'abonnement">
+<!ENTITY dialog.title "Ajouter un abonnement à une liste de filtres Adblock Plus">
+<!ENTITY location.label "&amp;Emplacement de la liste :">
+<!ENTITY fromWeb.description "Veuillez confirmer que vous souhaitez ajouter cet abonnement. Vous pouvez modifier le titre ou l'emplacement de l'abonnement avant de l'ajouter.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/composer.dtd
new file mode 100644
index 0000000..79d4830
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "oan it ein fan it a&amp;dres">
+<!ENTITY domainRestriction.label "Behein ta do&amp;mein">
+<!ENTITY collapse.default.no.label "Brûk standert (nee)">
+<!ENTITY firstParty.label "Allinnich earst diel">
+<!ENTITY preferences.label "&amp;Toan besteande filters...">
+<!ENTITY pattern.label "Sykje nei patroan">
+<!ENTITY thirdParty.label "&amp;Allinnich tredde diel">
+<!ENTITY filter.label "Nije filter:">
+<!ENTITY collapse.label "Blokkearre ynklappe:">
+<!ENTITY match.warning "It patroan dy't jo opjûn hawwe is net lyk oan it adres om te blokkearjen/wytlisten en sil gjin effekt op it hawwe.">
+<!ENTITY anchor.start.label "oan it begjin fan it adres">
+<!ENTITY matchCase.label "&amp;Haadlettergefoelich">
+<!ENTITY custom.pattern.label "&amp;Oanpast:">
+<!ENTITY unselectAllTypes.label "Selektearje neat">
+<!ENTITY type.whitelist.label "&amp;Utsûnderingsrigel">
+<!ENTITY regexp.warning "It patroan dy't jo opjûn hawwe sil ynterpretearre wurde as reguliere ekspresje. In protte reguliere ekspresjes kinne it sneupjen fertrage. As jo net fan plan wienen om reguliere ekspresje te brûken, foegje in symboal * ta oan it ein fan it patroan.">
+<!ENTITY dialog.title "Foegje Adblock Plus filterrigel ta">
+<!ENTITY basic.label "Basisbyld">
+<!ENTITY type.filter.label "Blokkearfilter">
+<!ENTITY types.label "Tapasse op types:">
+<!ENTITY shortpattern.warning "It patroan dy't jo opjûn hawwe is te koart om te optimalisearjen, in protte reguliere ekspresje kinne it sneupjen fertrage. It wurdt oanret dat jo in langere útdrukking kieze foar dit filter.">
+<!ENTITY collapse.yes.label "Ja">
+<!ENTITY anchors.label "Akseptearje allinnich patroan:">
+<!ENTITY collapse.default.yes.label "Brûk standert (ja)">
+<!ENTITY domainRestriction.help "Spesifisearje ien of mear domeinen skieden troch it symboal &quot;|&quot;, it filter sil allinnich op dizze domeinen tapast wurden. It symboal &quot;~&quot; foar in domeinnamme betsjut dat it filter net tapast wurde moat op dat domein.">
+<!ENTITY accept.label "Filter tafoegje">
+<!ENTITY options.label "Opsjes">
+<!ENTITY disabled.warning "Adblock Plus is op dit stuit útskeakele. Jo kinne noch hieltyd filters tafoegje, mar dy sille net earder aktyf wêze as jo [link]Adblock Plus ynskeakelje[/link].">
+<!ENTITY anchor.start.flexible.label "oan it begjin fan de domeinnamme">
+<!ENTITY collapse.no.label "Nee">
+<!ENTITY selectAllTypes.label "Selektearje alles">
+<!ENTITY advanced.label "Avansearre byld">
+<!ENTITY pattern.explanation "It patroan kin elk part fan it adres wêze, symboal * wurket as joker. It filter sil allinnich tapast wurde op adressen neffens it patroan.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/filters.dtd
new file mode 100644
index 0000000..3ef491d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Alle foarkearen fan dyn eigen filters wurde ferfangen troch de data fan it selekteare bestand. Troch gean?">
+<!ENTITY slow.column "Lan&amp;gsame filters">
+<!ENTITY enabled.column "Yns&amp;keakele">
+<!ENTITY subscription.lastDownload.checksumMismatch "Mislearre, checksum komt net oerien">
+<!ENTITY noFiltersInGroup.text "Dizze groep is leech.">
+<!ENTITY subscription.actions.label "Akties">
+<!ENTITY filter.selectAll.label "Selekt alles">
+<!ENTITY backupButton.label "&amp;Feilich sette en werom sette">
+<!ENTITY restore.minVersion.warning "Warskouwing: Dit bestand is makke my in nije fersy fan Adblock Plus. Update dyn eigen Adblock Plus foardast dit bestand brûkst.">
+<!ENTITY restore.error "De data in dit bestand koe net brûkt wurde. Miskien is it gjin Adblock Plus backup bestand?">
+<!ENTITY sort.ascending.label "A &gt; Z sortearoarder">
+<!ENTITY sort.label "Sortearje op">
+<!ENTITY subscription.source.label "Filterlist">
+<!ENTITY hitcount.column "&amp;Hits">
+<!ENTITY noFilters.text "Do hast noch gjin eigen filters.">
+<!ENTITY backup.custom.title "Allinnich oanpasse filters">
+<!ENTITY subscription.external.label "Fernijd troch in oar útwreiding">
+<!ENTITY subscription.delete.label "furt goaie">
+<!ENTITY noGroupSelected.text "Do moast yn filter groep selektere foardast it filter sjen kist.">
+<!ENTITY filter.cut.label "Knippe">
+<!ENTITY restore.default.label "Backup werom sette fan ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Ynlade...">
+<!ENTITY subscriptions.tab.label "Filterabonneminten">
+<!ENTITY sort.descending.label "Z &gt; A sortearoarder">
+<!ENTITY filters.remove.warning "Wolst echt alle filters furt smite?">
+<!ENTITY filter.delete.label "Fuortsmite">
+<!ENTITY addSubscriptionAdd.label "Tafoegje">
+<!ENTITY viewMenu.label "Byld">
+<!ENTITY subscription.lastDownload.unknown "n.f.t.">
+<!ENTITY addSubscriptionCancel.label "Annulearje">
+<!ENTITY subscription.enabled.label "Ynskeakele">
+<!ENTITY noSubscriptions.text "Jo hawwe gjin ien filter tafoege. Adblock Plus sil neat blokkearje
+ sûnder filters, brûk &quot;Filterabonnemint tafoegje&quot; om
+ ta te foegjen.">
+<!ENTITY subscription.update.label "Update filters">
+<!ENTITY dialog.title "Adblock Plus Filterfoarkarren">
+<!ENTITY addFilter.label "Tafoegje">
+<!ENTITY subscription.minVersion.warning "Dit filter abonnemint had in nijere fersy fan Adblok Plus nedich. Update dyn Adblock nar de nijste fersy.">
+<!ENTITY subscription.lastDownload.invalidURL "Mislearre, gjin jildich adres">
+<!ENTITY backup.error "Der wy in probleem my it skriuwen fan de filters. Soarch der foar dast it wol skriuwe meist en dat it net troch in oar programma brûkt wurdt.">
+<!ENTITY filter.moveUp.label "Omheech">
+<!ENTITY addGroup.label "Filter groep tafoege">
+<!ENTITY filter.edit.label "feroarje">
+<!ENTITY subscription.showHideFilters.label "Sjen/Ferstopje filters">
+<!ENTITY acceptableAds2.label "Let sommige net skreauwende advertinsjes ta">
+<!ENTITY addSubscriptionOther.label "In oar abonnemint tafoegje">
+<!ENTITY close.label "sluten">
+<!ENTITY sort.none.label "&amp;Net sortearre">
+<!ENTITY filter.actions.label "Filter aksjes">
+<!ENTITY filter.copy.label "Kopiearje">
+<!ENTITY filter.moveDown.label "Omleech">
+<!ENTITY filter.resetHitCounts.label "Reset statistysken">
+<!ENTITY readMore.label "Lês mear">
+<!ENTITY subscription.moveUp.label "omheech">
+<!ENTITY addSubscription.label "Filterabonnemint tafoegje">
+<!ENTITY subscription.homepage.label "Startside">
+<!ENTITY backup.complete.title "Alle filters en abonneminten">
+<!ENTITY restore.own.label "Eigen backup werom sette">
+<!ENTITY restore.complete.warning "Alle filter foarkearen wurde ferfangen troch de data fan it selekteare bestand. Troch gean?">
+<!ENTITY filters.tab.label "Oanpaste filters">
+<!ENTITY backup.label "Meitsje nije backup">
+<!ENTITY find.label "Sykje">
+<!ENTITY subscription.moveDown.label "omleech">
+<!ENTITY subscription.lastDownload.connectionError "Mislearre, ynlaadprobleem">
+<!ENTITY subscription.lastDownload.success "Slagge">
+<!ENTITY subscription.lastDownload.invalidData "Mislearre, gjin jildige filterlist">
+<!ENTITY filter.paste.label "Plakke">
+<!ENTITY subscription.disabledFilters.enable "Set filters oan">
+<!ENTITY lasthit.column "Lêste hit">
+<!ENTITY subscription.editTitle.label "Namme oanpasse">
+<!ENTITY subscription.disabledFilters.warning "Sommige filters in dit abonnemint stean út.">
+<!ENTITY filter.column "Filterrigel">
+<!ENTITY subscription.lastDownload.label "Lêste ynlaad:">
+<!ENTITY viewList.label "Lyst sjen">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/firstRun.properties
new file mode 100644
index 0000000..98c1128
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Ynternette mear privaat troch it útsetten fan tracking. Ferstopje dyn surf gedrach fan reklame bedriuwen dy't dy graach in de gaten wolle hâlde.
+firstRun_toggle_off=út
+firstRun_feature_tracking=Folgje út
+firstRun_feature_malware=Troep blokkeare
+firstRun_title=Adblock is no ynstalleare
+firstRun_acceptableAdsExplanation=Wy wolle graach dat websiden simpele net skreauwende advertinsjes brûke. Derom hawwe wy <a>stringe regels</a> om akseptabele advertinsjes te werkennen. Dit stiet ûnder standert settings. Ast noch steeds alle advertinsjes blokkeare wolst, dan kist dat <a>Út sette</a> yn in pear sekonden.
+firstRun_toggle_on=Oan
+firstRun_contributor_credits=Meiwurker Nammen
+firstRun_dataCorruptionWarning=Bliuwst dizze side sjen? <a>Klik hjir!</a>
+firstRun_acceptableAdsHeadline=ferfelende advertinsjes wurde no tsjin hâlden
+firstRun_share=sis it tsjin freonen
+firstRun_share_headline=<a>Jou ús in hantsje</a> om it web in moaiere plak te meitsjen
+firstRun_features=Adblock kin mear dwaan dan advertinsjes stopje
+firstRun_feature_malware_description=Meitsje dyn browser mear feiliger troch it blokkearen fan bekende rotsoai domeinen.
+firstRun_feature_social_description=Meitsje dyn ynternetten moaier en helje automatysk de knoppen furt as de Facebook Like, dy't op websiden stean om dyn gedrach by te hâlden.
+firstRun_donate=Donneare
+firstRun_donate_label=Support ús projekt
+firstRun_feature_social=Sociale Media knop fuorthelje
+firstRun_legacySafariWarning=Do brûkst in âlde fersy fan Safari dy net mear troch Adblock Plus understeunt wurdt. Miskien wurket it net goed of liket it soms wat raar. Wij adviseare om Safari 6.1.1 of heger (op OS X 10.8 Mountain Lion), of Safari 7.0.1 of heger (op OS X 10.9 Mavericks) te brûken, of de lêste fersy van Mozilla Firefox, Google Chrome of Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/global.properties
new file mode 100644
index 0000000..6e5bfc1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Gjin blokkearbere ûnderdielen op dizze side
+action3_tooltip=Klik om Adblock Plus yn/út te skeakeljen.
+type_label_script=skript
+filter_elemhide_nocriteria=Gjin kritearia spesifisearre om it te ferstoppen elemint te ûntdekken
+blockingGroup_title=Blokkearregels tafoegje
+whitelisted_tooltip=Adblock Plus is ynskeakele mar stiet út foar dizze side.
+type_label_stylesheet=stylside
+blocked_count_tooltip=?1? fan de ?2?
+type_label_font=lettertype
+type_label_popup=pop-up finster
+filter_regexp_tooltip=Dit filter is of in reguliere ekspresje of te koart om optimalisearre te wurden. Te folle fan dizze filters kinne it sneupjen fertrage.
+action0_tooltip=Klik om it kontekst-menu te iepenjen, midden-klik om yn/út te skeakeljen.
+whitelisted_page=Adblock Plus is útskeakele foar dizze side
+remove_group_warning=Wolst do dizze groep echt furt helje?
+action1_tooltip=Klik om blokkearbere ûnderdielen te iepenjen/sluten, midden-klik om yn/út te skeakeljen.
+type_label_xmlhttprequest=XML fersyk
+active_tooltip=Adblock Plus is ynskeakele, ?1? filter abonnemint(en) en ?2? oanpaste filter(s) yn gebrûk.
+type_label_document=dokumint
+type_label_object_subrequest=objekt subfersyk
+whitelistGroup_title=Utsûnderingsregels
+disabled_tooltip=Adblock Plus is útskeakele.
+filter_elemhide_duplicate_id=Der kin allinnich ien ID fan it te ferstoppen elemint spesifisearre wurde
+type_label_object=objekt
+action2_tooltip=Klik om foarkarren te iepenjen, midden-klik om yn/út te skeakeljen.
+type_label_subdocument=dielfinster
+clearStats_warning=Dit sil alle filterhitstatistiken opnij ynstelle en it tellen fan filterhits útskeakelje. Wolle jo trochgean?
+blocked_count_addendum=(ek wytliste: ?1?, ferstoppe: ?2?)
+subscription_invalid_location=Dizze lokaasje foar in filterlist is gjin jildige URL of gjin jildige bestânsnamme.
+type_label_image=ôfbylding
+remove_subscription_warning=Witte jo seker dat jo dit abonnemint fuortsmite wolle?
+type_label_other=oars
+mobile_menu_enable=ABP: Oan sette
+type_label_media=audio/fideo
+mobile_menu_disable_site=ABP: Út sette op ?1?
+elemhideGroup_title=Elemint ferstopregels
+mobile_menu_enable_site=ABP: Oan sette op ?1?
+type_label_elemhide=ferstoppe
+newGroup_title=Nije filtergroep
+default_dialog_title=Adblock Plus
+notification_antiadblock_title=Hide targeted messages?
+notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages?
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/overlay.dtd
new file mode 100644
index 0000000..57e9f9e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Ja">
+<!ENTITY notification.button.no "&amp;Nee">
+<!ENTITY sync.label "Sync Adblock Plus opsjes">
+<!ENTITY whitelist.site.label "Utskeakelje op ?1?">
+<!ENTITY filters.label "Filterfoarkarren">
+<!ENTITY disable.label "Oeral útskeakelje">
+<!ENTITY objecttab.title "Blokkearje">
+<!ENTITY objecttab.tooltip "Klik hjir om dit objekt te blokkearjen mei Adblock Plus">
+<!ENTITY menuitem.label "&amp;Adblock Plus">
+<!ENTITY objecttabs.label "Ljepblêden sjen li&amp;tte op Flash en Java">
+<!ENTITY sendReport.label "Rapportearje probleem op dizze side">
+<!ENTITY whitelist.page.label "Allinnich op dizze side útskeakelje">
+<!ENTITY context.image.label "Ofbylding blokkearje">
+<!ENTITY counthits.label "Tel filterhits">
+<!ENTITY opensidebar.label "&amp;Blokkearbere ûnderdielen iepenje">
+<!ENTITY notification.button.close "&amp;Slûte">
+<!ENTITY contribute.label "Donearje oan Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Dielfinster blokkearje">
+<!ENTITY blocked.tooltip "Blokkearre ûnderdielen:">
+<!ENTITY hideplaceholders.label "Ferstop placeholders fan blokkearre eleminten">
+<!ENTITY showinstatusbar.label "Toane yn steatbalke">
+<!ENTITY sidebar.title "Blokkearbere ûnderdelen op dizze side">
+<!ENTITY options.label "Opsjes">
+<!ENTITY context.object.label "Objekt blokkearje">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: opnij ynskeakelje op dizze side">
+<!ENTITY filters.tooltip "Meast aktive filters:">
+<!ENTITY closesidebar.label "&amp;Blokkearbere ûnderdielen slute">
+<!ENTITY showintoolbar.label "To&amp;ane yn arkbalke">
+<!ENTITY status.tooltip "Steat:">
+<!ENTITY context.media.label "Adblock Plus: Blokkearje audio/fideo">
+<!ENTITY subscription.update.label "Update filters">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/sendReport.dtd
new file mode 100644
index 0000000..a4cdc9c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Ûngedien meitsje">
+<!ENTITY issues.disabledgroups.description "De folgjende filterabonneminten/filtergroepen binne útskeakele, dochs it kin wêze dat se effekt hawwe op dizze side:">
+<!ENTITY showData.label "Toan rapportgegevens">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blokkearret te &amp;folle">
+<!ENTITY issues.change.description "Jo konfiguraasje is wizige. Laad de side op 'e nij om de wizigings te testen en in rapport te stjoeren as it probleem net oplost is.">
+<!ENTITY email.label "E-mail:">
+<!ENTITY issues.openPreferences.label "Iepenje filteropsjes">
+<!ENTITY sendPage.confirmation "Jo rapport is bewarre. Jo kinne it besjen op it folgjende adres:">
+<!ENTITY copyLink.label "&amp;Kopiearje rapportkeppeling">
+<!ENTITY issues.nofilters.description "Adblock Plus blokkearret no neat op dizze side. It probleem dat jo sjogge hat wierskienlik neat fan dwaan mei Adblock Plus.">
+<!ENTITY sendPage.knownIssue "It probleem dat jo rapportearre hawwe is miskien al bekend. Mear ynformaasje:">
+<!ENTITY typeSelector.other.description "Selektearje dizze opsje as jo tinke dat it in probleem mei Adblock Plus sels is yn stee fan syn filters.">
+<!ENTITY issues.disabledgroups.enable.label "Filterabonnemint / filtergroep ynskeakelje">
+<!ENTITY typeWarning.override.label "Ik &amp;begryp it en wol it rapport wol ynstjoere">
+<!ENTITY issues.disabled.enable.label "Adblock Plus ynskeakelje">
+<!ENTITY update.fixed.description "De updates foar dyn abonneminten losse dyn probleem wierskynlik op. Laad de webside opnij. Hast dan noch steed yn probleem, rapportearje it dan.">
+<!ENTITY anonymous.label "Anonym Bydrage">
+<!ENTITY reloadButton.label "Side opnij &amp;lade">
+<!ENTITY recentReports.clear.label "&amp;Smyt alle rapporten fuort">
+<!ENTITY typeSelector.description "Dit finster sil jo begeliede troch de stappen nedich foar it yntsjinjen fan in Adblock Plus probleemrapport. Earst, selektearje it type probleem wat jo tsjinkommen binne op dizze side:">
+<!ENTITY screenshot.remove.label "Sensitive &amp;gegevens fuortsmite">
+<!ENTITY issues.ownfilters.description "Sommige fan de filters tapast op dizze side binne brûker-definiearre. Skeakel de filters út dy't miskien dit probleem feroarsake hawwe:">
+<!ENTITY update.inProgress.description "Adblock Plus moat dyn filter abonnemint bywurkje om der seker fan te wêzen dat er noch gjin oplossing bekend is. Wacht efkes...">
+<!ENTITY sendPage.retry.label "Ferstjoer op 'e nij">
+<!ENTITY data.label "&amp;Rapportgegevens:">
+<!ENTITY recentReports.label "Jo resint ynstjoerde rapporten">
+<!ENTITY typeWarning.description "Jo hawwe oanjûn dat jo in algemien probleem mei Adblock Plus rapportearej wolle yn stee fan in probleem mei de filters. It is it bêste dat jo soksoartige fan problemen rapportearje yn it [link]Adblock Plus foarum[/link]. Jo soene allinnich dizze rapportearder brûke moatte as tafoeging oan in besteande diskusje, oars sil net ien jo rapport sjen útsein as jo in keppeling opjouwe. De automatysk generearre keppeling sil jûn wurde as it rapport ynstjoerd is.">
+<!ENTITY issues.disabled.description "Adblock Plus is útskeakele, it sil no neat blokkearje.">
+<!ENTITY attachExtensions.label "Foegje in list mei aktive útwreidings ta oan it ra&amp;pport foar it gefal as in tafoeging it probleem feroarsaket">
+<!ENTITY issues.nosubscriptions.add.label "Foegje filterabonnemint ta">
+<!ENTITY issues.disabledfilters.enable.label "Filter ynskeakelje">
+<!ENTITY issues.override.label "De &amp;konfiguraasje is korrekt, fierder mei it rapport">
+<!ENTITY issues.nosubscriptions.description "It liket der op dat jo net abonnearre binne op ien fan de yn-it-foar makke filterlisten dy't automatysk net-winske ynhâld fan websteeën fuortsmyt.">
+<!ENTITY typeSelector.falsePositive.description "Selektearje dizze opsje as de side wichtige ynhâld mist, net goed toant wurd of net goed funksjonearret. Jo kinne útfine oft Adblock Plus de oarsaak is fan it probleem troch it tydlik út te skeakeljen.">
+<!ENTITY typeSelector.other.label "O&amp;ar probleem">
+<!ENTITY emailComment.label "It soe moai wêze ast in goed mail adres kist opjaan sa dat wy kontakt my die kinne opnimme as der fragen binne oer dyn rapport. It jout ús ek de mooglikheid om minsken te werkennen en mear prioriteit te jaan.">
+<!ENTITY issues.whitelist.remove.label "Skeakel Adblock Plus op dizze side wer yn">
+<!ENTITY outdatedSubscriptions.description "De folgjende filters binne al in tiid net bywurke. Wurkje dizze by foardast in rapport ynstjoerst. Miskien is it al oplost.">
+<!ENTITY dataCollector.description "In amerijke wylst Adblock Plus de nedige gegevens sammelt.">
+<!ENTITY sendButton.label "&amp;Ferstjoer rapport">
+<!ENTITY comment.label "&amp;Kommentaar (opsjoneel):">
+<!ENTITY sendPage.errorMessage "It is net slagge om it rapport te ferstjoeren, flaterkoade &quot;?1?&quot;. Wês wis dat jo ferbûn binne mei it ynternet en probearje nochris. As it probleem bliuwt freegje dan assistinsje yn it [link]Adblock Plus foarum[/link].">
+<!ENTITY showRecentReports.label "Toan resint ynstjoerde rapporten">
+<!ENTITY commentPage.heading "Kommentaar">
+<!ENTITY update.start.label "No bywurkje">
+<!ENTITY issues.disabledfilters.description "De folgjende filters binne útskeakele, dochs it kin wêze dat se effekt hawwe op dizze side:">
+<!ENTITY screenshot.description "Deselde side kin der ferskillend útsjen foar ferskillende minsken. It kin ús helpe om it probleem te begripen as jo in skerôfdruk meistjoere. Jo kinne seksjes mei sensitive ynformaasje fuortsmite en ek ûnderdielen markearje dêr't it probleem te sjen is. Om dat te dwaan klik de knop en selektearje in seksje fan de ôfbylding mei jo mûs.">
+<!ENTITY screenshot.attach.label "Foegje in ôfbylding ta oan it rapport">
+<!ENTITY issues.whitelist.description "Adblock Plus is no útskeakele op de side dy't jo rapportearje. Skeakel it yn en laad de side op 'e nij eardat it rapport ynstjoerd wurd om it ûndersyk fan dit probleem te helpen.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus blokkearret in advertinsje net">
+<!ENTITY typeSelector.heading "Selektearje probleemtype">
+<!ENTITY anonymity.warning "We kinnen dy gjin kommentaar jaan en sille wierskynlik in leage prioriteit oan dyn rapport jaan.">
+<!ENTITY wizard.title "Probleemrapportearder">
+<!ENTITY issues.ownfilters.disable.label "Filter útskeakelje">
+<!ENTITY commentPage.description "It tekstfjild hjirûnder jout de mooglikheid om kommentaar te jaan. Dizze stap is opsjoneel, mar oanrikkemandearre as it in frjemd probleem is. Jo kinne ek de gegevens besjen eardat it ferstjoerd wurd.">
+<!ENTITY comment.lengthWarning "De lingte fan jo kommentaar hat mear as 1000 karakters. Allinnich de earste 1000 karakters sille ferstjoerd wurde.">
+<!ENTITY typeSelector.falseNegative.description "Selektearje dizze opsje as in advertinsje toant wurd wylst Adblock Plus ynskeakele is.">
+<!ENTITY sendPage.waitMessage "Wachtsje wylst Adblock Plus jo rapport ynstjoerd.">
+<!ENTITY dataCollector.heading "Wolkom by de probleemrapportearder">
+<!ENTITY screenshot.heading "Skermôfdruk tafoegje">
+<!ENTITY sendPage.heading "Ferstjoer rapport">
+<!ENTITY issues.subscriptionCount.description "It liket as jo abonnearre binne op te folle filters. Dizze opset is net oanrikkemandearre omdat it wierskienlik faker problemen feroarsaakje kin. Wy kinne ek jo probleemrapport net akseptearje omdat it net dúdlik is hokker filterabonnemint auteur aksje ûndernimme moat. Helje alle net needsaaklike filters fuort en test oft de problemen wer barre.">
+<!ENTITY screenshot.mark.label "Markearje it probleem">
+<!ENTITY privacyPolicy.label "Privacybelied">
+<!ENTITY issues.description "Adblock Plus hat problemen ûntdekt mei jo konfiguraasje dy't miskien ferantwurdlik binne foar dit probleem of sil it sier meitsje om it te ûndersykjen.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/sidebar.dtd
new file mode 100644
index 0000000..4280a2d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Lit rannen knipperje">
+<!ENTITY address.label "Adres">
+<!ENTITY context.open.label "Iepen yn in nij ljepblêd">
+<!ENTITY type.label "Type">
+<!ENTITY tooltip.filterSource.label "Filterboarne:">
+<!ENTITY noitems.label "Gjin blokkearbere items">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Grutte:">
+<!ENTITY reattach.label "Fêstmeitsje">
+<!ENTITY search.label "Sykje:">
+<!ENTITY docDomain.thirdParty "(tredde partij)">
+<!ENTITY filterSource.label "Filterboarne">
+<!ENTITY tooltip.docDomain.label "Dokumintboarne:">
+<!ENTITY context.copy.label "Kopiearje">
+<!ENTITY tooltip.type.label "Type:">
+<!ENTITY context.disablefilter.label "Filter útskeakelje ?1?">
+<!ENTITY context.copyFilter.label "Filter kopiearje">
+<!ENTITY context.block.label "Blokkearje dit item">
+<!ENTITY context.enablefilter.label "Filter ynskeakelje ?1?">
+<!ENTITY detach.label "Losmeitsje">
+<!ENTITY whitelisted.label "Tastiene side">
+<!ENTITY context.disablefilteronsite.label "Skeakel dit filter út op ?1?">
+<!ENTITY detached.title "Adblock Plus: Blokkearbere ûnderdielen (los)">
+<!ENTITY docDomain.firstParty "(earste partij)">
+<!ENTITY tooltip.type.whitelisted "(tastien)">
+<!ENTITY tooltip.filter.label "Tapast filter:">
+<!ENTITY tooltip.filter.disabled "(útskeakele)">
+<!ENTITY context.editfilter.label "Bewurkje tapaste filter">
+<!ENTITY tooltip.type.blocked "(blokkearre)">
+<!ENTITY size.label "Grutte">
+<!ENTITY context.whitelist.label "Meitsje in útsûnderingsrigel foar dit ûnderdiel">
+<!ENTITY context.selectAll.label "Selektearje alles">
+<!ENTITY state.label "Steat">
+<!ENTITY docDomain.label "Dokumintboarne">
+<!ENTITY tooltip.address.label "Adres:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/subscriptionSelection.dtd
new file mode 100644
index 0000000..374db56
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/fy-NL/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "&amp;Filterabonnemint &quot;?1?&quot; ek tafoegje">
+<!ENTITY list.download.failed "It is Adblock Plus net slagge om de list mei abonneminten te krijen.">
+<!ENTITY list.download.retry "Op 'e nij besykje">
+<!ENTITY title.label "A&amp;bonnemintnamme:">
+<!ENTITY list.download.website "Toan webstee">
+<!ENTITY supplementMessage "Dit filterabonnemint is bedoeld om brûkt te wurden mei it filterabonnemint &quot;?1?&quot; dy't jo no noch net brûke.">
+<!ENTITY viewList.label "Toan filters">
+<!ENTITY visitHomepage.label "Besykje thússide">
+<!ENTITY addSubscription.label "Abonnemint tafoegje">
+<!ENTITY dialog.title "Foegje Adblock Plus filterabonnemint ta">
+<!ENTITY location.label "Fi&amp;lterlist lokaasje:">
+<!ENTITY fromWeb.description "Befestigje asjobleaft dat jo dit filterabonnemint tafoegje wolle. Jo kinne de abonneminttitel of lokaasje wizigje foardat jo it tafoegje.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/composer.dtd
new file mode 100644
index 0000000..fb550c7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "ao final &amp;do enderezo">
+<!ENTITY domainRestriction.label "&amp;Restrinxir ao dominio:">
+<!ENTITY collapse.default.no.label "Uso por defecto (non)">
+<!ENTITY firstParty.label "Só de or&amp;ixe">
+<!ENTITY preferences.label "Amo&amp;sar os filtros existentes...">
+<!ENTITY pattern.label "Buscar unha pauta">
+<!ENTITY thirdParty.label "Só de &amp;terceiros">
+<!ENTITY filter.label "&amp;Filtro novo:">
+<!ENTITY collapse.label "Pr&amp;egar bloqueados:">
+<!ENTITY match.warning "A pauta que inseriches non coincide co enderezo que queres bloquear ou pór na lista branca, polo que non terá efecto ningún.">
+<!ENTITY anchor.start.label "ao come&amp;zo do enderezo">
+<!ENTITY matchCase.label "&amp;Caso coincidente">
+<!ENTITY custom.pattern.label "&amp;Personalizado:">
+<!ENTITY unselectAllTypes.label "Non marcar ningún">
+<!ENTITY type.whitelist.label "E&amp;xcepción">
+<!ENTITY regexp.warning "A pauta que inseriches interprétase como unha expresión regular, e de usares moitas poderíase facer máis lenta a navegación. Se non tes a intención de utilizar expresións regulares, engade un símbolo * ao final da pauta.">
+<!ENTITY dialog.title "Engadir regra de filtrado do Adblock Plus">
+<!ENTITY basic.label "Vista básica">
+<!ENTITY type.filter.label "Filtro de &amp;bloqueo">
+<!ENTITY types.label "Aplicar aos tipos:">
+<!ENTITY shortpattern.warning "A pauta que inseriches é demasiado curta como para ser optimizada, e de haber moitas así poderíase retardar a navegación. Recomendámosche escoller unha cadea máis longa para este filtro.">
+<!ENTITY collapse.yes.label "Si">
+<!ENTITY anchors.label "Aceptar só a pauta:">
+<!ENTITY collapse.default.yes.label "Uso por defecto (si)">
+<!ENTITY domainRestriction.help "Especifica un ou máis dominios separándoos polo símbolo &quot;|&quot;. O filtro só se aplicará nestes dominios. O símbolo &quot;~&quot; antes dun nome de dominio significa que o filtro non debe aplicarse sobre o devandito dominio.">
+<!ENTITY accept.label "Engadir filtro">
+<!ENTITY options.label "Opcións">
+<!ENTITY disabled.warning "O Adblock Plus agora mesmo está desactivado. Aínda podes engadir os filtros, mais non se aplicarán a menos que [link]actives o Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "ao come&amp;zo do nome do dominio">
+<!ENTITY collapse.no.label "Non">
+<!ENTITY selectAllTypes.label "Marcar todos">
+<!ENTITY advanced.label "Vista avanzada">
+<!ENTITY pattern.explanation "A pauta pode ser calquera parte do enderezo, o símbolo * úsase como comodín. O filtro só se aplicará ós enderezos que coincidan coa pauta.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/filters.dtd
new file mode 100644
index 0000000..23e3259
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Tódalos os teus filtros persoalizados serán cambiados polo contido do arquivo que seleccionaches. Estás seguro?">
+<!ENTITY slow.column "Filtros le&amp;ntos">
+<!ENTITY enabled.column "A&amp;ctivada">
+<!ENTITY subscription.lastDownload.checksumMismatch "Erro: a proba do &quot;checksum&quot; seica non cadrou ben">
+<!ENTITY noFiltersInGroup.text "Seica o grupo que seleccionaches está baleiro.">
+<!ENTITY subscription.actions.label "Accións">
+<!ENTITY filter.selectAll.label "Seleccionalo Todo">
+<!ENTITY backupButton.label "&amp;Copia de Seguridade e Recuperación">
+<!ENTITY restore.minVersion.warning "Ollo: este arquivo foi creado cunha versión máis moderna do Adblock Plus. Debes actualizar a túa versión antes de recuperar o arquivo.">
+<!ENTITY restore.error "Os datos do arquivo non puideron ser procesados, seica este arquivo non é unha copia de seguridade do Adblock Plus?">
+<!ENTITY sort.ascending.label "Orden&amp;ar do &quot;A&quot; ao &quot;Z&quot;">
+<!ENTITY sort.label "&amp;Ordenar por">
+<!ENTITY subscription.source.label "Lista dos filtros">
+<!ENTITY hitcount.column "&amp;Veces usado">
+<!ENTITY noFilters.text "Seica aínda non tes feito ningún filtro persoalizado.">
+<!ENTITY backup.custom.title "Só filtros persoalizados">
+<!ENTITY subscription.external.label "Actualizado por outro complemento">
+<!ENTITY subscription.delete.label "Borrar">
+<!ENTITY noGroupSelected.text "Precisas de seleccionar un grupo antes de que se podan amosar os filtros.">
+<!ENTITY filter.cut.label "Cortar">
+<!ENTITY restore.default.label "Recuperar a copia de seguridade do ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Baixando...">
+<!ENTITY subscriptions.tab.label "Suscricións aos filtros">
+<!ENTITY sort.descending.label "Ordenar do &quot;&amp;Z&quot; ao &quot;A&quot;">
+<!ENTITY filters.remove.warning "De verdade que queres eliminar tódolos filtros que seleccionaches?">
+<!ENTITY filter.delete.label "Borrar">
+<!ENTITY addSubscriptionAdd.label "Engadir">
+<!ENTITY viewMenu.label "Ver">
+<!ENTITY subscription.lastDownload.unknown "Non disponible">
+<!ENTITY addSubscriptionCancel.label "Cancelar">
+<!ENTITY subscription.enabled.label "Activado">
+<!ENTITY noSubscriptions.text "Aínda non engadiches ningunha suscrición. O Adblock Plus non che bloqueará nada se non tes filtros, por favor dalle a &quot;Engadir suscripción ós filtros&quot; para engadir algún.">
+<!ENTITY subscription.update.label "Actualizar os filtros">
+<!ENTITY dialog.title "Preferencias dos filtros do Adblock Plus">
+<!ENTITY addFilter.label "Enga&amp;dir filtro">
+<!ENTITY subscription.minVersion.warning "Esta suscripción ao filtro precisa dunha versión máis moderna do Adblock Plus. Deberías baixarte a última versión.">
+<!ENTITY subscription.lastDownload.invalidURL "Erro: enderezo non válido">
+<!ENTITY backup.error "Seica houbo un erro ao escribir os filtros no arquivo. Mira a ver se o arquivo non está protexido contra a escritura ou está sendo uso por outro programa.">
+<!ENTITY filter.moveUp.label "Subir para arriba">
+<!ENTITY addGroup.label "En&amp;gadir grupo de filtros">
+<!ENTITY filter.edit.label "Editar">
+<!ENTITY subscription.showHideFilters.label "Amosar/agochar os filtros">
+<!ENTITY acceptableAds2.label "Perm&amp;itir publicidade non invasiva">
+<!ENTITY addSubscriptionOther.label "Engadir outra subscrición">
+<!ENTITY close.label "Pechar">
+<!ENTITY sort.none.label "Dei&amp;xalo todo atrapallado">
+<!ENTITY filter.actions.label "Accións dos filtros">
+<!ENTITY filter.copy.label "Copiar">
+<!ENTITY filter.moveDown.label "Baixar para abaixo">
+<!ENTITY filter.resetHitCounts.label "Resetear as estatísticas de uso">
+<!ENTITY readMore.label "Ler máis">
+<!ENTITY subscription.moveUp.label "Subir para arriba">
+<!ENTITY addSubscription.label "Engadir subscrición de &amp;filtros">
+<!ENTITY subscription.homepage.label "Páxina">
+<!ENTITY backup.complete.title "Tódolos filtros e suscricións">
+<!ENTITY restore.own.label "Recuperar a copia de seguridade propia">
+<!ENTITY restore.complete.warning "Tódalas as túas preferencias serán cambiadas polo contido do arquivo que seleccionaches. Estás seguro?">
+<!ENTITY filters.tab.label "Filtros persoalizados">
+<!ENTITY backup.label "Facer unha nova copia de seguridade">
+<!ENTITY find.label "Busca&amp;r">
+<!ENTITY subscription.moveDown.label "Baixar para abaixo">
+<!ENTITY subscription.lastDownload.connectionError "Erro: fallo na descarga">
+<!ENTITY subscription.lastDownload.success "Valeu">
+<!ENTITY subscription.lastDownload.invalidData "Erro: lista de filtros non válida">
+<!ENTITY filter.paste.label "Pegar">
+<!ENTITY subscription.disabledFilters.enable "Activar os filtros inactivos">
+<!ENTITY lasthit.column "Ú&amp;ltimo uso">
+<!ENTITY subscription.editTitle.label "Editar o título">
+<!ENTITY subscription.disabledFilters.warning "Algúns filtros desta suscrición estanche desactivados.">
+<!ENTITY filter.column "Regra de &amp;filtro">
+<!ENTITY subscription.lastDownload.label "Baixado o:">
+<!ENTITY viewList.label "Qué publicidade?">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/firstRun.properties
new file mode 100644
index 0000000..bb33050
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Navega de xeito privado ó desactivar o seguemento - agochando as túas trazas das compañías de publicidade que doutro xeito rexistrarían os teus movementos.
+firstRun_toggle_off=DESACTIVADO
+firstRun_feature_tracking=Desactivar o seguimento
+firstRun_feature_malware=Bloquear malware
+firstRun_title=O Adblock Plus foiche instalado
+firstRun_toggle_on=ACTIVADO
+firstRun_acceptableAdsExplanation=Queremos animar ás páxinas web para que empreguen a publicidade dun xeito mais directo e non invasivo. É polo que fixemos unhas <a>regras moi estrictas</a> co fin de identificar a publicidade aceptable, a cal é mostrada coas opcións por defecto. Se aínda queres bloquear tódala publicidade, podes <a>desactivar</a> isto deseguido.
+firstRun_contributor_credits=Coa colaboración de...
+firstRun_dataCorruptionWarning=Segue a aparecer a páxina esta? <a>Fai click aquí!</a>
+firstRun_acceptableAdsHeadline=A partir de agora os anuncios anoxantes seranche bloqueados
+firstRun_share=Cóntalle ós teus amigos
+firstRun_share_headline=<a>Bótanos unha man</a> para facer da rede un sitio mellor
+firstRun_feature_social_description=Eliminar de xeito automático os botóns de redes sociais como o "gústame" do Facebook, que aparecen nás páxinas web e rexistran o teu comportamento.
+firstRun_filterlistsReinitializedWarning=Semella que un problema facía que tódolos filtros fosen borrados e imposibles de restaurar. Polo tanto, tivemos que resetear os filtros e a configuración da "Publicidade Aceptable". Por favor bótalle un ollo á tua lista de filtros e á configuración de "Publicidade Aceptable" nas <a>opcións do Adblock Plus</a>.
+firstRun_feature_malware_description=Fai mais seguro o teu navegador ó bloquear dominios con "malware".
+firstRun_features=O Adblock Plus faiche mais cousas que bloquear publicidade
+firstRun_donate=fai unha doazón
+firstRun_donate_label=Apoia ó noso proxecto
+firstRun_feature_social=Eliminar os botóns das redes sociais
+firstRun_legacySafariWarning=Estás a empregar unha versión vella do Safari que xa non está mantida polo Adblock Plus. Podería non funcionar correctamente ou alterar a experiencia do usuario nalgunhas webs. Aconsellámosche que ou ben actualices ó Safari 6.1.1 ou superior (no OS X 10.8 Mountain Lion), ou ó Safari 7.0.1 ou superior (no OSX 10.9 Mavericks), ou empregues a última versión do Mozilla Firefox, do Google Chrome ou do Opera.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/global.properties
new file mode 100644
index 0000000..2fbc69c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Non che hai elementos bloqueables nesta páxina
+action3_tooltip=Preme para activar/desactivar o Adblock Plus.
+notification_antiadblock_title=Agochar mensaxes dirixidas?
+type_label_script=script
+filter_elemhide_nocriteria=Non se especificaron criterios para recoñecer o elemento que se quere agochar
+blockingGroup_title=Reglas de bloqueo de publicidade
+whitelisted_tooltip=O Adblock Plus está activo mais está desactivado nesta páxina.
+type_label_stylesheet=folla de estilo
+blocked_count_tooltip=?1? de ?2?
+type_label_font=fonte
+type_label_popup=Xanela emerxente
+filter_regexp_tooltip=Este filtro é ben unha expresión regular ben é demasiado curto para ser optimizado. Se tes moitos filtros así, o navegador pode volverse máis lento.
+action0_tooltip=Preme para abrir o menú contextual, e click no medio para activar/desactivar.
+whitelisted_page=O Adblock Plus foi desactivado nesta páxina
+remove_group_warning=É verdade que queres borrar este grupo?
+action1_tooltip=Preme para abrir/pechar elementos bloqueables, e click no medio para activar/desactivar.
+type_label_xmlhttprequest=solicitude XML
+active_tooltip=O Adblock Plus está activo, ?1? o filtro de suscrición(s) ?2? e o(s) filtro(s) persoalizado(s) están en uso.
+type_label_document=documento
+type_label_object_subrequest=sub-solicitude de obxecto
+whitelistGroup_title=Excepcións
+disabled_tooltip=O Adblock Plus está desactivado.
+filter_elemhide_duplicate_id=Só pode especificarse un ID do elemento que se quere agochar
+type_label_object=obxecto
+action2_tooltip=Preme para abrir as preferencias, e click no medio para activar/desactivar.
+type_label_subdocument=marco
+clearStats_warning=Isto vai resetear as estatísticas dos filtros e a desactivar a contabilidade do uso dos filtros. Estás seguro que o queres facer?
+notification_antiadblock_message=Este sitio é coñecido por amosar mensaxes dirixidas ós usuarios do Adblock Plus. Queres que o Adblock plus agoche estas mensaxes dirixidas?
+blocked_count_addendum=(tamén na Lista Branca: ?1?, agochados: ?2?)
+subscription_invalid_location=Esa localización da lista de filtros non é nin unha URL válida nin un nome de arquivo válido.
+type_label_image=imaxe
+remove_subscription_warning=De seguro de que queres darche de baixa nesta subscrición?
+type_label_other=outro
+mobile_menu_enable=ABP - Activar
+type_label_media=audio/vídeo
+mobile_menu_disable_site=ABP - Desactivar en ?1?
+elemhideGroup_title=Reglas ao agochar elementos
+mobile_menu_enable_site=ABP - Activar en ?1?
+type_label_elemhide=agochado
+newGroup_title=Novo grupo de filtros
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/overlay.dtd
new file mode 100644
index 0000000..7a68f62
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Sí">
+<!ENTITY notification.button.no "&amp;Non">
+<!ENTITY sync.label "Sin&amp;cronizar as opcións do Adblock Plus">
+<!ENTITY whitelist.site.label "Desactivar en ?1?">
+<!ENTITY filters.label "Pre&amp;ferencias dos filtros">
+<!ENTITY disable.label "Desactivar en tódalas páxinas">
+<!ENTITY objecttab.title "Bloquear">
+<!ENTITY objecttab.tooltip "Fai click aquí para bloquear este obxecto co Adblock Plus">
+<!ENTITY menuitem.label "Preferencias do Ad&amp;block Plus">
+<!ENTITY objecttabs.label "Amo&amp;sar os separadores en Flash e Java">
+<!ENTITY sendReport.label "&amp;Informar dun problema nesta páxina">
+<!ENTITY whitelist.page.label "Desactivar só nesta páxina">
+<!ENTITY context.image.label "ABP - Bloquear a imaxe">
+<!ENTITY counthits.label "Co&amp;ntabilizar as veces que se usa cada filtro">
+<!ENTITY opensidebar.label "A&amp;brir temas bloqueables">
+<!ENTITY notification.button.close "&amp;Pechar">
+<!ENTITY contribute.label "Apoquinar ó Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "ABP - Bloquear o marco">
+<!ENTITY blocked.tooltip "Elementos bloqueados nesta páxina:">
+<!ENTITY hideplaceholders.label "Agochar o espacio deixado po&amp;los elementos bloqueados">
+<!ENTITY showinstatusbar.label "Amosar na barra d&amp;e estado">
+<!ENTITY sidebar.title "Temas bloqueables na páxina actual">
+<!ENTITY options.label "&amp;Opcións">
+<!ENTITY context.object.label "ABP - Bloquear o obxecto">
+<!ENTITY context.removeWhitelist.label "ABP - Reactivado nesta páxina">
+<!ENTITY filters.tooltip "Filtros máis activos:">
+<!ENTITY closesidebar.label "Pechar temas &amp;bloqueables">
+<!ENTITY showintoolbar.label "Amosar na barra &amp;Ferramentas">
+<!ENTITY status.tooltip "Estado:">
+<!ENTITY context.media.label "ABP - Bloquear o audio/vídeo">
+<!ENTITY subscription.update.label "Actualizar os filtros">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/sendReport.dtd
new file mode 100644
index 0000000..e2c4b96
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Desfacer">
+<!ENTITY issues.disabledgroups.description "As seguintes suscricións/grupos de filtros están desactivadas, pero poderían aínda ter efecto nesta páxina:">
+<!ENTITY showData.label "Amosar os datos do informe">
+<!ENTITY typeSelector.falsePositive.label "Seica o Adblock Plus está a bloquear de &amp;máis">
+<!ENTITY issues.change.description "A túa configuración cambiou. Tenta recargar a páxina para probar os cambios e envía un informe se o problema aínda así non foi arranxado.">
+<!ENTITY email.label "E-&amp;mail:">
+<!ENTITY issues.openPreferences.label "Abrir as preferencias dos filtros">
+<!ENTITY sendPage.confirmation "O teu informe foi gardado. Podes acceder a él no seguinte enderezo:">
+<!ENTITY copyLink.label "&amp;Copiar ligazón ao informe">
+<!ENTITY issues.nofilters.description "O Adblock Plus non está a bloquear nada na páxina da que informas. Seica o problema que observaches non ten relación co Adblock Plus.">
+<!ENTITY sendPage.knownIssue "O problema do que informas é coñecido. Máis información:">
+<!ENTITY typeSelector.other.description "Escolle esta opción se sospeitas que o que che da problemas é o Adblock Plus e non os seus filtros.">
+<!ENTITY issues.disabledgroups.enable.label "Activar suscrición/grupos de filtros">
+<!ENTITY typeWarning.override.label "Comprendido, pero aínda a&amp;sí quero mandar o informe">
+<!ENTITY issues.disabled.enable.label "Activar o Adblock Plus">
+<!ENTITY update.fixed.description "Se cadra a actualización dos filtros resolveu o problema do que informabas. Tenta recargar a páxina e se o problema mantense, dalle de novo a Informar.">
+<!ENTITY anonymous.label "Informe &amp;anónimo">
+<!ENTITY reloadButton.label "&amp;Recargar a páxina">
+<!ENTITY recentReports.clear.label "Bo&amp;rrar tódolos informes">
+<!ENTITY typeSelector.description "Esta xanela vaiche guiar a través dos pasos necesarios para a presentación dun informe de problema no Adblock Plus. Primeiro, selecciona o tipo de problema que atopaches nesta páxina:">
+<!ENTITY screenshot.remove.label "&amp;Borrar información persoal">
+<!ENTITY issues.ownfilters.description "Algúns dos filtros que se aplican nesta páxina foron definidos polo usuario. Desactiva os filtros que poidan ter causado o problema:">
+<!ENTITY update.inProgress.description "O Adblock Plus precisa de actualizar as túas suscricións para estar seguros de que este tema aínda non fora resolto. Acouga un intre...">
+<!ENTITY sendPage.retry.label "Mandar de novo">
+<!ENTITY data.label "Datos do in&amp;forme:">
+<!ENTITY recentReports.label "Informes que mandaches fai pouco">
+<!ENTITY typeWarning.description "Indicaches que queres informar dun problema co Adblock Plus e non cos filtros. Ten en conta que estos temas é mellor comentalos na [link]conferencia do Adblock Plus[/link]. Só deberías usar o xerador de informes de problemas para aportar a unha discusión xa existente, xa que ninguén verá o teu informe a non ser que inclúas a ligazón ó mesmo. A ligazón xerada automáticamente serache dada tras mandar o reporte.">
+<!ENTITY issues.disabled.description "O Adblock Plus estache desactivado e non vai facer nada mentres o manteñas deste xeito.">
+<!ENTITY attachExtensions.label "Engadir ó informe unha lista das e&amp;xtensións activas, por se unha incompatibilidade con outra extensión é a causa do problema">
+<!ENTITY issues.nosubscriptions.add.label "Engadir suscrición de filtro">
+<!ENTITY issues.disabledfilters.enable.label "Activar filtro">
+<!ENTITY issues.override.label "A &amp;configuración está ben, podes continuar tranquilo co informe">
+<!ENTITY issues.nosubscriptions.description "Non semellas estar suscrito a ningunha lista de filtros, as cales bloquean automáticamente contido non deseado nas páxinas.">
+<!ENTITY typeSelector.falsePositive.description "Selecciona esta opción se a páxina non ten contido importante, se ésta amósase incorrectamente ou non funciona correctamente. Podes determinar se Adblock Plus é a causa do problema desactivándoo temporalmente.">
+<!ENTITY typeSelector.other.label "Ou&amp;tro problema">
+<!ENTITY emailComment.label "Recomenámosche que poñas un e-mail válido, para que deste xeito poidamos contactar contigo se temos algunha pregunta sobre o teu informe. Isto tamén nos permite recoñecer as túas contribucións e darlles unha prioridade mais alta.">
+<!ENTITY issues.whitelist.remove.label "Reactivar o Adblock Plus nesta páxina">
+<!ENTITY outdatedSubscriptions.description "As seguintes suscricións de filtros non foron actualizadas en alomenos dúas semanas. Tenta actualizalas antes de mandarnos un informe, xa que o problema podería estar xa arranxado.">
+<!ENTITY dataCollector.description "Agarda un intre mentres Adblock Plus reúne os datos necesarios.">
+<!ENTITY sendButton.label "Ma&amp;ndar o informe">
+<!ENTITY comment.label "&amp;Comentario (opcional):">
+<!ENTITY sendPage.errorMessage "O intento de envio fallou co código de erro &quot;?1?&quot;. Por favor asegurate que estás conectado a Internet e volta a intentalo. Se segue o problema, pide axuda na [link]conferencia do Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Amosar os informes que mandaches fai pouco">
+<!ENTITY commentPage.heading "Comentar">
+<!ENTITY update.start.label "Comezar coa actualización">
+<!ENTITY issues.disabledfilters.description "Os seguintes filtros están desactivados, aínda que poderían ter efecto nesta páxina:">
+<!ENTITY screenshot.description "A mesma páxina pode parecer diferente según quen a mire. Para axudarnos a comprender o problema, estaría ben se nos mandases un pantallazo no teu informe. Podes borrar as partes da imaxe que teñan información privada e tamén salientar as partes na que o problema é visible. Para facer isto, fai click co botón correspondente e selecciona unha parte da imaxe co rato.">
+<!ENTITY screenshot.attach.label "Engadir un pan&amp;tallazo ó informe">
+<!ENTITY issues.whitelist.description "Tes desactivado o Adblock Plus na páxina da que informas. Por favor reactívao e dalle a recargar a páxina antes de mandar o informe para axudarnos a investigar o problema.">
+<!ENTITY typeSelector.falseNegative.label "O Ad&amp;block Plus non está a bloquear ningún elemento">
+<!ENTITY typeSelector.heading "Selecciona o tipo de problema">
+<!ENTITY anonymity.warning "Non poderemos responderche, polo que lle daremos unha prioridade máis baixa.">
+<!ENTITY wizard.title "Xerador de informes de problemas">
+<!ENTITY issues.ownfilters.disable.label "Desactivar filtro">
+<!ENTITY commentPage.description "O campo de texto xusto debaixo permíteche comentar o problema. Este paso é opcional pero o recomendamos se o problema non che é claro. Poderás revisar os datos do informe antes de envialo.">
+<!ENTITY comment.lengthWarning "O teu comentario ten mais de 1000 caracteres, e só os primeiros 1000 serán enviados.">
+<!ENTITY typeSelector.falseNegative.description "Escolla esta opción se aparece publicidade aínda a pesar de estar activado o Adblock Plus.">
+<!ENTITY sendPage.waitMessage "Agarda namentres o Adblock Plus manda o teu informe.">
+<!ENTITY dataCollector.heading "Benvido ao Xerador de Informes de Problemas">
+<!ENTITY screenshot.heading "Engadir pantallazo">
+<!ENTITY sendPage.heading "Mandar o informe">
+<!ENTITY issues.subscriptionCount.description "Seica tes suscricións de máis. Isto non é nada recomendable, xa que aumenta a posibilidade de erro. Tampouco aceptamos o teu informe xa que non está claro cal é a suscripción que está a causar o problema. Tenta eliminar os filtros que non sexan necesarios e olla se aínda segues a ter o problema.">
+<!ENTITY screenshot.mark.label "&amp;Marcar o problema">
+<!ENTITY privacyPolicy.label "Política de privacidade">
+<!ENTITY issues.description "Adblock Plus detectou uns problemiñas coa túa configuración que poderían ser a causa deste erro ou facer a investigación do problema mais difícil.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/sidebar.dtd
new file mode 100644
index 0000000..f32368a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Salientar os bordos do elemento">
+<!ENTITY address.label "Enderezo">
+<!ENTITY context.open.label "Abrir nunha lapela nova">
+<!ENTITY type.label "Tipo">
+<!ENTITY tooltip.filterSource.label "Fonte do filtro:">
+<!ENTITY noitems.label "Non che hai temas bloqueables">
+<!ENTITY filter.label "Filtro">
+<!ENTITY tooltip.size.label "Tamaño:">
+<!ENTITY reattach.label "Unir de novo">
+<!ENTITY search.label "&amp;Procurar:">
+<!ENTITY docDomain.thirdParty "(terceiros)">
+<!ENTITY filterSource.label "Fonte do filtro">
+<!ENTITY tooltip.docDomain.label "Documento fonte:">
+<!ENTITY context.copy.label "Copiar o enderezo do elemento">
+<!ENTITY tooltip.type.label "Tipo">
+<!ENTITY context.disablefilter.label "Desactivar o filtro ?1?">
+<!ENTITY context.copyFilter.label "Copiar o filtro">
+<!ENTITY context.block.label "Bloquear este elemento">
+<!ENTITY context.enablefilter.label "Activar o filtro ?1?">
+<!ENTITY detach.label "Separar">
+<!ENTITY whitelisted.label "Páxina da Lista Branca">
+<!ENTITY context.disablefilteronsite.label "Desactivar este filtro en ?1?">
+<!ENTITY detached.title "Adblock Plus: Temas bloqueables (separados)">
+<!ENTITY docDomain.firstParty "(orixinal)">
+<!ENTITY tooltip.type.whitelisted "(engadido á lista branca)">
+<!ENTITY tooltip.filter.label "Filtro activo:">
+<!ENTITY tooltip.filter.disabled "(desactivado)">
+<!ENTITY context.editfilter.label "Editar o filtro activo">
+<!ENTITY tooltip.type.blocked "(bloqueado)">
+<!ENTITY size.label "Tamaño">
+<!ENTITY context.whitelist.label "Engadir excepción para este elemento">
+<!ENTITY context.selectAll.label "Seleccionalo todo">
+<!ENTITY state.label "Estado">
+<!ENTITY docDomain.label "Documento fonte">
+<!ENTITY tooltip.address.label "Enderezo:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/subscriptionSelection.dtd
new file mode 100644
index 0000000..5664d19
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/gl/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Engadir tamén a &amp;suscrición de filtro &quot;?1?&quot;">
+<!ENTITY list.download.failed "Fallo na recuperación da lista de suscricións.">
+<!ENTITY list.download.retry "Téntao de novo">
+<!ENTITY title.label "&amp;Título da suscrición:">
+<!ENTITY list.download.website "Ver páxina web">
+<!ENTITY supplementMessage "Esta suscrición de filtro está feita para ser usada en conxunto coa suscrición de filtro &quot;?1?&quot; que aínda non engadiches.">
+<!ENTITY viewList.label "Ver os filtros">
+<!ENTITY visitHomepage.label "Visita a páxina de inicio">
+<!ENTITY addSubscription.label "Engadir suscrición">
+<!ENTITY dialog.title "Engadir a suscrición aos filtros do Adblock Plus">
+<!ENTITY location.label "&amp;Localización da lista dos Filtros:">
+<!ENTITY fromWeb.description "Por favor, confirma que queres engadir esta suscrición de filtro. Podes cambiar o título ou a situación da suscrición antes de engadila.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/composer.dtd
new file mode 100644
index 0000000..bad38a4
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "&amp;בסוף הכתובת">
+<!ENTITY domainRestriction.label "&amp;הגבלה ×œ×©× ×ž×¨×—×‘:">
+<!ENTITY collapse.default.no.label "שימוש בברירת מחדל (ל×)">
+<!ENTITY firstParty.label "צד-ר×שון (יוצר) בלבד">
+<!ENTITY preferences.label "&amp;הצגת ×”×ž×¡× × ×™× ×”×§×™×™×ž×™×...">
+<!ENTITY pattern.label "חיפוש ×חר דפוס">
+<!ENTITY thirdParty.label "&amp;צד-שלישי בלבד">
+<!ENTITY filter.label "&amp;מסנן חדש:">
+<!ENTITY collapse.label "&amp;×¦×ž×¦×•× ×”×—×¡×•×ž×™×:">
+<!ENTITY match.warning "הדפוס שהוזן ×יננו תו×× ×™×•×ª×¨ לכתובת החסימה/הרשימות הלבנות ו×יננו משפיע עוד.">
+<!ENTITY anchor.start.label "&amp;בתחילת הכתובת">
+<!ENTITY matchCase.label "&amp;הת×מת ×ותיות גדולות/קטנות">
+<!ENTITY custom.pattern.label "&amp;מות××:">
+<!ENTITY unselectAllTypes.label "×œ× ×œ×‘×—×•×¨ דבר">
+<!ENTITY type.whitelist.label "&amp;חוק חריג">
+<!ENTITY regexp.warning "הדפוס שהוזן יפורש כביטוי רגיל. ×‘×™×˜×•×™×™× ×¨×’×™×œ×™× ×¨×‘×™× ×¢×©×•×™×™× ×œ×”×ט ×ת הגלישה. ×× ×ין כוונה להשתמש ×‘×‘×™×˜×•×™×™× ×¨×’×™×œ×™×, יש להוסיף ×ת הסמל * בסוף התבנית.">
+<!ENTITY dialog.title "הוספת חוק סינון Adblock Plus">
+<!ENTITY basic.label "תצוגה בסיסית">
+<!ENTITY type.filter.label "&amp;מסנן חסימה">
+<!ENTITY types.label "החלה על הסוגי×:">
+<!ENTITY shortpattern.warning "הדפוס שהוזן קצר מדי בכדי להיות יעיל, ×“×¤×•×¡×™× ×¨×‘×™× ×ž×¡×•×’ ×–×” ×¢×©×•×™×™× ×œ×”×ט ×ת הגלישה. מומלץ לבחור מחרוזת ×רוכה יותר למסנן ×–×”.">
+<!ENTITY collapse.yes.label "כן">
+<!ENTITY anchors.label "הסכמה לדפוס בלבד:">
+<!ENTITY collapse.default.yes.label "שימוש בברירת מחדל (כן)">
+<!ENTITY domainRestriction.help "מרחב ×חד ×ו יותר ×ž×•×¤×¨×“×™× ×¢×œ ידי הסמל &quot;|&quot;, המסנן ×™×פשר ×ž×¨×—×‘×™× ×לו בלבד. הסמל &quot;~&quot; לפני ×©× ×”×ž×¨×—×‘ משמעותו שמסנן ×–×” מנוטרל על מרחב ×–×”.">
+<!ENTITY accept.label "הוספת מסנן">
+<!ENTITY options.label "×פשרויות">
+<!ENTITY disabled.warning "Adblock Plus מנוטרל כרגע. ניתן עדיין להוסיף ×ž×¡× × ×™× ×œ×¨×©×™×ž×”, ×בל ×”× ×œ× ×™×—×•×œ×• ××œ× ×× [link]Adblock Plus מ×פשר [/link].">
+<!ENTITY anchor.start.flexible.label "&amp;בתחילת ×©× ×”×ž×ª×—×">
+<!ENTITY collapse.no.label "ל×">
+<!ENTITY selectAllTypes.label "בחירת הכל">
+<!ENTITY advanced.label "תצוגה מתקדמת">
+<!ENTITY pattern.explanation "הדפוס יכול להיות כל חלק מהכתובת, סמל * משמש כתו חופשי ש×חריו יכול ×œ×‘×•× ×›×œ תו ×חר. המסנן יכול להחיל רק על כתובות המת×ימות לתבנית.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/filters.dtd
new file mode 100644
index 0000000..54dfd2f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "כל ×”×ž×¡× × ×™× ×”××™×©×™×™× ×©×œ×š יוחלפו בתוכן הקובץ הנבחר. ×”×× ×œ×”×ž×©×™×š?">
+<!ENTITY slow.column "&amp;×ž×¡× × ×™× ×טיי×">
+<!ENTITY enabled.column "&amp;מ×פשר">
+<!ENTITY subscription.lastDownload.checksumMismatch "נכשל, ביקורת ×”×¡×™×›×•× ×œ×ª×§×™× ×•×ª ×œ× ×”×ª×ימה בצורה טובה">
+<!ENTITY noFiltersInGroup.text "הקבוצה הנבחרת ריקה">
+<!ENTITY subscription.actions.label "פעולות">
+<!ENTITY filter.selectAll.label "בחירת הכל">
+<!ENTITY backupButton.label "&amp;גיבוי ושחזור">
+<!ENTITY restore.minVersion.warning "×זהרה: הקובץ נוצר על-ידי גרסה חדשה יותר של Adblock Plus. כדי לשדרג לגרסה ×”×חרונה של Adblock Plus לפני שחזור מקובץ ×–×”.">
+<!ENTITY restore.error "×œ× × ×™×ª×Ÿ לעבד המידע בקובץ. ×ולי ×–×” ×œ× ×§×•×‘×¥ גיבוי של Adblock Plus?">
+<!ENTITY sort.ascending.label "&amp;מיון מ- × &gt; עד ת">
+<!ENTITY sort.label "&amp;מיון לפי">
+<!ENTITY subscription.source.label "רשימת מסנני×">
+<!ENTITY hitcount.column "&amp;לחיצות">
+<!ENTITY noFilters.text "עדיין ×œ× ×”×•×¡×¤×• ×ž×¡× × ×™× ×ישיי×.">
+<!ENTITY backup.custom.title "×ž×¡× × ×™× ×ž×•×ª××ž×™× ×‘×œ×‘×“">
+<!ENTITY subscription.external.label "התעדכן על ידי הרחבה ×חרת">
+<!ENTITY subscription.delete.label "מחיקה">
+<!ENTITY noGroupSelected.text "צריך לבחור קבוצת סינון לפני ×©×”×ž×¡× × ×™× ×©×œ×” יוצגו.">
+<!ENTITY filter.cut.label "גזירה">
+<!ENTITY restore.default.label "שחזור הגיבוי מ- ?1?">
+<!ENTITY subscription.lastDownload.inProgress "מוריד...">
+<!ENTITY subscriptions.tab.label "הרשמות מסנני×">
+<!ENTITY sort.descending.label "&amp;מיון מ- ת &gt; עד ×">
+<!ENTITY filters.remove.warning "×”×× ×œ×”×¡×™×¨ ×ת כל ×”×ž×¡× × ×™× ×”× ×‘×—×¨×™×?">
+<!ENTITY filter.delete.label "מחיקה">
+<!ENTITY addSubscriptionAdd.label "הוספה">
+<!ENTITY viewMenu.label "תצוגה">
+<!ENTITY subscription.lastDownload.unknown "×œ× ×–×ž×™×Ÿ">
+<!ENTITY addSubscriptionCancel.label "ביטול">
+<!ENTITY subscription.enabled.label "מ×פשר">
+<!ENTITY noSubscriptions.text "עדיין ×œ× ×”×•×¡×¤×ª הרשמות למסנני×. Adblock Plus ×œ× ×™×—×¡×•× ×“×‘×¨ ×œ×œ× ×ž×¡× × ×™×, ×× × ×”×©×ª×ž×©×• ב-&quot;הוספת הרשמה למסנני×&quot; להוספת מסנני×.">
+<!ENTITY subscription.update.label "עדכון מסנני×">
+<!ENTITY dialog.title "העדפות סינון Adblock Plus">
+<!ENTITY addFilter.label "&amp;הוספת מסנן">
+<!ENTITY subscription.minVersion.warning "הרשמת ×ž×¡× × ×™× ×–×ת דורשת גרסה חדשה יותר של Adblock Plus, צריך לשדרג לגרסה ×”×חרונה של Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "נכשל, הכתובת שגויה">
+<!ENTITY backup.error "×ירעה שגי××” ברשימת ×”×ž×¡× × ×™× ×œ×§×•×‘×¥. יש ×œ×•×•×“× ×›×™ הקובץ ×œ× ×ž×•×’×Ÿ לכתיבה ×ו בשימוש על-ידי ×™×™×©×•× ×חר.">
+<!ENTITY filter.moveUp.label "הזזה מעלה">
+<!ENTITY addGroup.label "הוספת &amp;קבוצת סינון">
+<!ENTITY filter.edit.label "עריכה">
+<!ENTITY subscription.showHideFilters.label "הצגת/הסתרת מסנני×">
+<!ENTITY acceptableAds2.label "&amp;×פשור קצת ×¤×¨×¡×•× ×œ× ×¤×•×œ×©× ×™">
+<!ENTITY addSubscriptionOther.label "הוספת הרשמה ×חרת">
+<!ENTITY close.label "סגירה">
+<!ENTITY sort.none.label "&amp;×œ× ×ž×ž×•×™×Ÿ">
+<!ENTITY filter.actions.label "פעולות מסנן">
+<!ENTITY filter.copy.label "העתקה">
+<!ENTITY filter.moveDown.label "הזזה מטה">
+<!ENTITY filter.resetHitCounts.label "×יפוס סטטיסטיקות לחיצה">
+<!ENTITY readMore.label "×œ×§×¨×•× ×¢×•×“">
+<!ENTITY subscription.moveUp.label "הזזה מעלה">
+<!ENTITY addSubscription.label "&amp;הוספת הרשמת מסנן">
+<!ENTITY subscription.homepage.label "עמוד בית">
+<!ENTITY backup.complete.title "כל ×”×ž×¡× × ×™× ×•×”×”×¨×©×ž×•×ª">
+<!ENTITY restore.own.label "שחזור גיבוי משלי">
+<!ENTITY restore.complete.warning "כל הגדרות ×”×ž×¡× × ×™× ×©×œ×š יוחלפו בתוכן הקובץ הנבחר. ×”×× ×œ×”×ž×©×™×š?">
+<!ENTITY filters.tab.label "×ž×¡× × ×™× ×ž×•×ª×מי×">
+<!ENTITY backup.label "יצירת גיבוי חדש">
+<!ENTITY find.label "&amp;חיפוש">
+<!ENTITY subscription.moveDown.label "הזזה מטה">
+<!ENTITY subscription.lastDownload.connectionError "נכשל, ההורדה נכשלה">
+<!ENTITY subscription.lastDownload.success "הצליח">
+<!ENTITY subscription.lastDownload.invalidData "נכשל, רשימת ×”×ž×¡× × ×™× ×œ× ×—×•×§×™×ª">
+<!ENTITY filter.paste.label "הדבקה">
+<!ENTITY subscription.disabledFilters.enable "×פשר ×ž×¡× × ×™× ×ž× ×•×˜×¨×œ×™×">
+<!ENTITY lasthit.column "&amp;לחיצה ×חרונה">
+<!ENTITY subscription.editTitle.label "עריכת הכותרת">
+<!ENTITY subscription.disabledFilters.warning "כמה ×ž×”×ž×¡× × ×™× ×‘×”×¨×©×ž×” ×–×ת מנוטרלי×.">
+<!ENTITY filter.column "חוק &amp;סינון">
+<!ENTITY subscription.lastDownload.label "הורדה ×חרונה:">
+<!ENTITY viewList.label "הצגת רשימה">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/firstRun.properties
new file mode 100644
index 0000000..b1b4799
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=גלשו ב×נונימיות בעזרת נטרול מעקב - הסתרת ×¢×§×‘×•×ª×™×›× ×ž×—×‘×¨×•×ª המודעות ×שר עוקבות ×חר כל פעולה שלכ×.
+firstRun_toggle_off=מכובה
+firstRun_feature_tracking=נטרול מעקב
+firstRun_feature_malware=חסימת תוכנות זדוניות
+firstRun_title=Adblock Plus הותקן
+firstRun_acceptableAdsExplanation=×נחנו ×¨×•×¦×™× ×œ×¢×•×“×“ ××ª×¨×™× ×œ×”×©×ª×ž×© ×‘×¤×¨×¡×•× ×¤×©×•×˜ ×•×œ× ×‘×•×œ×˜. ×–×ת מדוע ביססנו <a>×§×•×•×™× ×ž× ×—×™× × ×•×§×©×™×</a> כדי לזהות מודעות מתקבלות, ×שר מופיעות בהגדרות ברירת המחדל. ×× ×‘×¨×¦×•× ×›× ×œ×—×¡×•× ×‘×›×œ ×–×ת ×ת כל המודעות ניתן <a>לנטרל</a> ×–×ת במספר שניות.
+firstRun_toggle_on=מופעל
+firstRun_contributor_credits=×§×¨×“×™×˜×™× ×œ×ª×•×¨×ž×™×
+firstRun_dataCorruptionWarning=עמוד ×–×” ממשיך להופיע ? <a>לחצו ×›×ן!</a>
+firstRun_acceptableAdsHeadline=מודעות מציקות ייחסמו מעכשיו
+firstRun_share=ספרו ×œ×—×‘×¨×™×›× ×•×ž×©×¤×—×ª×›×
+firstRun_share_headline=<a>תנו לנו יד</a> בהפיכת הרשת ×œ×ž×§×•× ×˜×•×‘ יותר
+firstRun_features=Adblock Plus יכול לעשות יותר מרק ×œ×—×¡×•× ×¤×¨×¡×•×ž×•×ª
+firstRun_feature_malware_description=הפכו ×ת הגלישה ×©×œ×›× ×œ×ž×ובטחת יותר על ידי חסימת ××ª×¨×™× ×”×ž×›×™×œ×™× ×ª×•×›× ×” זדונית.
+firstRun_feature_social_description=שחררו ×וטומטית ×ת חווית הגלישה ×©×œ×›× ×ž×›×¤×ª×•×¨×™ מדיה חברתית, כגון Facebook Like, ×שר ×ž×•×¤×™×¢×™× ×‘×¢×ž×•×“×™ ×ינטרנט ×•×ž× ×ª×¨×™× ×ת התנהגותכ×.
+firstRun_donate=תרומה
+firstRun_donate_label=תמיכה בפרויקט שלנו
+firstRun_feature_social=הסרת כפתורי מדיה חברתיי×
+firstRun_legacySafariWarning=×”× ×›× ×ž×©×ª×ž×©×™× ×‘×’×™×¨×¡×” ישנה של Safari ×©×œ× × ×ª×ž×›×ª על ידי Adblock Plus. ×–×” עלול ×œ× ×œ×¢×‘×•×“ כר×וי ×ו לשבש ×ת חווית המשתמש בחלק מה×תרי×. ×נו ×ž×ž×œ×™×¦×™× ×œ×›× ×œ×¢×“×›×Ÿ ×ת Safari לגרסה 6.1.1 ומעלה (OS X 10.8 Mountain Lion) ×ו Safari 7.0.1 ומעלה (OS X 10.9 Mavericks) ×ו להשתמש בגרסה ×”×חרונה של Mozilla Firefox, Google Chrome or Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/global.properties
new file mode 100644
index 0000000..eee273a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=×ין ×¤×¨×™×˜×™× ×œ×—×¡×™×ž×” בעמוד הנוכחי
+action3_tooltip=לחיצה כדי ל×פשר/לנטרל ×ת Adblock Plus.
+notification_antiadblock_title=הסתרת הודעות מוכוונות?
+type_label_script=תסריט
+filter_elemhide_nocriteria=×œ× ×¦×•×™×Ÿ קריטריון לזיהוי ×”×למנט שיוסתר
+blockingGroup_title=כללי חסימת מודעות
+whitelisted_tooltip=Adblock Plus עובד ×בל ×”×•× ×ž× ×•×˜×¨×œ בעמוד הנוכחי.
+type_label_stylesheet=סגנון
+blocked_count_tooltip=?1? מתוך ?2?
+type_label_font=גופן
+type_label_popup=חלון קופץ
+filter_regexp_tooltip=מסנן ×–×” ×”×•× ×‘×™×˜×•×™ רגיל ×ו קצר מדי מכדי להיות מיטבי. יותר מדי ×ž×¡× × ×™× ×ž×¡×•×’ ×–×” ×™×›×•×œ×™× ×œ×”×ט ×ת הגלישה.
+action0_tooltip=לחיצה כדי להציג ×ת תפריט הלחצן הימני, לחיצה ×מצעית כדי ל×פשר/לנטרל.
+whitelisted_page=Adblock Plus מנוטרל עבור העמוד הנוכחי
+remove_group_warning=×”×× ×‘×מת ברצונך להסיר קבוצה זו?
+action1_tooltip=לחיצה כדי לפתוח/לסגור ×ת רשימת ×”×¤×¨×™×˜×™× ×œ×—×¡×™×ž×”, לחיצה ×מצעית כדי ל×פשר/לנטרל.
+type_label_xmlhttprequest=בקשת XML
+active_tooltip=Adblock Plus מ×פשר, ?1? הרשמת(ות) ×ž×¡× × ×™× ×• ?2? מסנן(×™×) מות××ž×™× ×‘×©×™×ž×•×©.
+type_label_document=מסמך
+type_label_object_subrequest=תת-דרישת ×ובייקט
+whitelistGroup_title=×›×œ×œ×™× ×—×¨×™×’×™×
+disabled_tooltip=Adblock Plus מנוטרל.
+filter_elemhide_duplicate_id=רק זהות ×חת של ×”×למנט שיוסתר ניתנת לציון
+type_label_object=×ובייקט
+action2_tooltip=לחיצה כדי לפתוח ×ת המ×פייני×, לחיצה ×מצעית כדי ל×פשר/לנטרל.
+type_label_subdocument=מסגרת
+clearStats_warning=×–×” ×™×פס ×ת כל סטטיסטיקות הלחיצה של ×”×ž×¡× × ×™× ×•×™× ×˜×¨×œ ×ת מניית הלחיצה של המסנן. ×”×× ×œ×”×ž×©×™×š?
+notification_antiadblock_message=×תר ×–×” ידוע בהצגת הודעות מכוונות למשתמשי Adblock Plus. ×”×× ×‘×¨×¦×•× ×›× ×©-Adblock Plus יסתיר הודעות מוכוונות?
+blocked_count_addendum=(×’× ×›×Ÿ ברשימת המורשי×: ?1?, מוסתר: ?2?)
+subscription_invalid_location=×ž×™×§×•× ×¨×©×™×ž×ª הסינון ×יננו כתובת ×תר חוקית ×•×œ× ×©× ×§×•×‘×¥ חוקי.
+type_label_image=תמונה
+remove_subscription_warning=×”×× ×œ×”×¡×™×¨ ×ת ההרשמה ×”×–×ת?
+type_label_other=×חר
+mobile_menu_enable=ABP: מ×פשר
+type_label_media=×ודיו/ויד×ו
+mobile_menu_disable_site=ABP: מנטרל ב-?1?
+elemhideGroup_title=כללי הסתרת ×למנטי×
+mobile_menu_enable_site=ABP: מ×פשר ב-?1?
+type_label_elemhide=מוסתר
+newGroup_title=קבוצת ×ž×¡× × ×™× ×—×“×©×”
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/overlay.dtd
new file mode 100644
index 0000000..96b0652
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;כן">
+<!ENTITY notification.button.no "&amp;ל×">
+<!ENTITY sync.label "&amp;סנכרון הגדרות Adblock Plus">
+<!ENTITY whitelist.site.label "נטרול ב-?1?">
+<!ENTITY filters.label "&amp;העדפות סינון">
+<!ENTITY disable.label "נטרול בכל מקו×">
+<!ENTITY objecttab.title "חסימה">
+<!ENTITY objecttab.tooltip "לחיצה ×›×ן לחסימת פריט ×–×” ×¢× Adblock Plus">
+<!ENTITY menuitem.label "&amp;העדפות Adblock Plus">
+<!ENTITY objecttabs.label "הצגת &amp;לשוניות על פל×ש וג'×ווה">
+<!ENTITY sendReport.label "&amp;דיווח על בעיה בעמוד זה">
+<!ENTITY whitelist.page.label "נטרול בעמוד הזה בלבד">
+<!ENTITY context.image.label "Adblock Plus: חסימת תמונה">
+<!ENTITY counthits.label "מנה &amp;לחיצות מסנן">
+<!ENTITY opensidebar.label "&amp;פתיחת רשימת ×”×¤×¨×™×˜×™× ×œ×—×¡×™×ž×”">
+<!ENTITY notification.button.close "&amp;סגירה">
+<!ENTITY contribute.label "×ª×¨×•× ×œ-Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: חסימת מסגרת (פריי×)">
+<!ENTITY blocked.tooltip "×¤×¨×™×˜×™× ×—×¡×•×ž×™× ×‘×¢×ž×•×“ ×–×”:">
+<!ENTITY hideplaceholders.label "הסתרת &amp;מצייני ×ž×§×•× ×©×œ ××œ×ž× ×˜×™× ×—×¡×•×ž×™×">
+<!ENTITY showinstatusbar.label "&amp;הצגה בשורת המצב">
+<!ENTITY sidebar.title "×¤×¨×™×˜×™× ×œ×—×¡×™×ž×” בעמוד הנוכחי">
+<!ENTITY options.label "&amp;×פשרויות">
+<!ENTITY context.object.label "Adblock Plus: חסימת פריט">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: מ×פשר מחדש בעמוד ×–×”">
+<!ENTITY filters.tooltip "×”×ž×¡× × ×™× ×”×¤×¢×™×œ×™× ×‘×™×•×ª×¨:">
+<!ENTITY closesidebar.label "&amp;סגירת הרשימה של ×”×¤×¨×™×˜×™× ×œ×—×¡×™×ž×”">
+<!ENTITY showintoolbar.label "&amp;הצגה בסרגל הכלי×">
+<!ENTITY status.tooltip "מצב:">
+<!ENTITY context.media.label "Adblock Plus: חסימת וויד×ו/×ודיו">
+<!ENTITY subscription.update.label "עדכון מסנני×">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/sendReport.dtd
new file mode 100644
index 0000000..7a042c1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/sendReport.dtd
@@ -0,0 +1,66 @@
+<!ENTITY screenshot.undo.label "&amp;ביטול">
+<!ENTITY issues.disabledgroups.description "קבוצות ההרשמה/×”×ž×¡× × ×™× ×”×‘×ות מנוטרלות, לפי שעה ×ולי יש ×œ×”× ×”×©×¤×¢×” על עמוד ×–×”:">
+<!ENTITY showData.label "הצגת מידע של הדיווח">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus ×—×•×¡× ×™×•×ª×¨ &amp;מדי">
+<!ENTITY issues.change.description "התצורה ×©×œ×›× ×©×•× ×ª×”. יש לרענן ×ת העמוד כדי לבחון ×ת ×”×©×™× ×•×™×™× ×•×œ×”×–×™×Ÿ דיווח ×× ×”×‘×¢×™×” ×œ× × ×¤×ª×¨×” בעקבות השינוי.">
+<!ENTITY email.label "&amp;דו×&quot;ל:">
+<!ENTITY issues.openPreferences.label "פתיחת העדפות סינון">
+<!ENTITY sendPage.confirmation "הדיווח ×©×œ×›× × ×©×ž×¨. ניתן לגשת ×ליו בכתובת הב××”:">
+<!ENTITY copyLink.label "&amp;העתקת הקישור לדיווח">
+<!ENTITY issues.nofilters.description "Adblock Plus ×œ× ×—×•×¡× ×“×‘×¨ בעמוד הנוכחי. הבעיה ×שר ×ž×‘×—×™× ×™× ×§×¨×•×‘ לווד××™ ××™× × ×” קשורה ל-Adblock Plus.">
+<!ENTITY sendPage.knownIssue "הבעיה שדווחה קרוב לווד××™ שידועה כבר. מידע נוסף:">
+<!ENTITY typeSelector.other.description "בחירת ×פשרות זו בחשד לבעיה ×¢× Adblock Plus עצמו ×•×œ× ×‘×ž×¡× × ×™× ×©×œ×•.">
+<!ENTITY issues.disabledgroups.enable.label "×פשור ההרשמה/קבוצת המסנני×">
+<!ENTITY typeWarning.override.label "×× ×™ &amp;מבין ורוצה לשלוח ×ת הדיווח בכל ×–×ת">
+<!ENTITY issues.disabled.enable.label "×פשור Adblock Plus">
+<!ENTITY update.fixed.description "×פשרי שעדכון הרשמות ×”×ž×¡× × ×™× ×©×œ×›× ×™×¤×ª×•×¨ ×ת הבעיה שדווחה. ×× × ×¨×¢× × ×• ×ת העמוד ונסו שוב, לחצו על דיווח שוב ×× ×”×‘×¢×™×” נש×רת.">
+<!ENTITY anonymous.label "הגשה &amp;×נונימית">
+<!ENTITY reloadButton.label "&amp;רענון העמוד">
+<!ENTITY recentReports.clear.label "&amp;הסרת כל הדיווחי×">
+<!ENTITY typeSelector.description "חלון ×–×” ידריך ××ª×›× ×“×¨×š ×”×¦×¢×“×™× ×”×“×¨×•×©×™× ×œ×”×–× ×ª דיווח בעיה עבור Adblock Plus. ר×שית, ×× × ×‘×—×¨×• ×ת סוג הבעיה ×שר ××ª× ×—×•×•×™× ×‘×¢×ž×•×“ ×–×”:">
+<!ENTITY screenshot.remove.label "&amp;הסרת מידע רגיש">
+<!ENTITY issues.ownfilters.description "חלק ×ž×”×ž×¡× × ×™× ×©×—×œ×™× ×¢×œ עמוד ×–×” ×”× ×ž×•×’×“×¨×™-משתמש. יש לנטרל ×ת ×”×ž×¡× × ×™× ×שר ×ולי ×”× ×”×’×•×¨×ž×™× ×œ×‘×¢×™×”:">
+<!ENTITY update.inProgress.description "Adblock Plus צריך לעדכן ×ת הרשמות ×”×ž×¡× × ×™× ×›×“×™ ×œ×•×•×“× ×©×”×‘×¢×™×” ×œ× × ×¤×ª×¨×” כבר. ×× × ×× × ×”×ž×ª×™× ×•...">
+<!ENTITY sendPage.retry.label "שלח שוב">
+<!ENTITY data.label "&amp;מידע הדיווח:">
+<!ENTITY recentReports.label "×“×™×•×•×—×™× ××—×¨×•× ×™× ×©×œ×š שנשלחו">
+<!ENTITY typeWarning.description "×¦×™×™× ×ª× ×©××ª× ×ž×¢×•× ×™×™× ×™× ×œ×“×•×•×— על בעיה כללית ×¢× Adblock Plus מ×שר בעיה ×¢× ×”×ž×¡× × ×™×. שימו לב שבעיות ×›×לו עדיף לדווח ב[link]×¤×•×¨×•× Adblock Plus[/link]. יש להשתמש במדווח הבעיות רק בנוסף לדיון ×§×™×™×, כיוון ש××£ ×חד ×œ× ×™×©×™× ×œ×‘ לדיווח ×©×œ×›× ××œ× ×× ×™×¡×•×¤×§ קישור ×ליו. הקישור שנוצר ×וטומטית יסופק ל×חר הזנת הדיווח.">
+<!ENTITY issues.disabled.description "Adblock Plus מנוטרל, ×–×” ×œ× ×™×—×¡×•× ×“×‘×¨ במצב הנוכחי.">
+<!ENTITY attachExtensions.label "סיפוח רשימת &amp;ההרחבות הפעילות ×ל הדיווח במקרה וניגוד תוספות ×”×•× ×”×’×•×¨× ×œ×‘×¢×™×”">
+<!ENTITY issues.nosubscriptions.add.label "הוספת הרשמת מסנן">
+<!ENTITY issues.disabledfilters.enable.label "×פשור מסנן">
+<!ENTITY issues.override.label "&amp;התצורה נכונה, ×פשר להמשיך ×¢× ×”×“×™×•×•×—">
+<!ENTITY issues.nosubscriptions.description "נר××” ש××™× ×›× ×¨×©×•×ž×™× ×œ×©×•× ×ž×¡× ×Ÿ שהוכן מר×ש ×שר מופיע ברשימה שמסיר ×וטומטית תוכן ×œ× ×¨×¦×•×™ מ×תרי ×ינטרנט.">
+<!ENTITY typeSelector.falsePositive.description "בחר ב×פשרות זו ×× ×—×¡×¨ בעמוד תוכן חשוב ×ו שמוצג בצורה ×œ× × ×›×•× ×” ×ו כושל לתפקד כר×וי. ניתן לקבוע ×”×× Adblock Plus ×”×•× ×”×’×•×¨× ×œ×‘×¢×™×” על ידי נטרולו זמנית.">
+<!ENTITY typeSelector.other.label "בעיה &amp;×חרת">
+<!ENTITY emailComment.label "×נו ×ž×ž×œ×™×¦×™× ×œ×”×–×™×Ÿ כתובת דו×&quot;ל תקפה, כך שנוכל ליצור ×יתך קשר ×× ×§×™×™×ž×•×ª ש×לות לגבי הדוח שלך.
+כמו כן, כתובתך ת×פשר לנו לזהות ×ת תרומותייך ולתעדף ×ותן בצורה גבוהה יותר.">
+<!ENTITY issues.whitelist.remove.label "×פשור מחדש של Adblock Plus בעמוד ×–×”">
+<!ENTITY outdatedSubscriptions.description "הרשמות ×”×ž×¡× × ×™× ×”×‘×ות ×œ× ×¢×•×“×›× ×• לפחות שבועיי×. ×× × ×¢×“×›× ×• הרשמות ×לו לפני שליחת הדיווח, יכול להיות שהבעיה נפתרה כבר.">
+<!ENTITY dataCollector.description "×× × ×”×ž×ª×™× ×• מספר ×¨×’×¢×™× ×¢×“ ×שר Adblock Plus ×™×סוף ×ת המידע הדרוש.">
+<!ENTITY sendButton.label "&amp;שליחת דיווח">
+<!ENTITY comment.label "&amp;הערה (×œ× ×—×•×‘×”):">
+<!ENTITY sendPage.errorMessage "נכשל ניסיון השליחה של הדיווח ×¢× ×§×•×“ השגי××” &quot;?1?&quot;. ×× × ×•×•×“×ו ש××ª× ×ž×—×•×‘×¨×™× ×œ×ינטרנט ונסו שוב. ×× ×”×‘×¢×™×” נמשכת, ×× × ×‘×§×©×• סיוע ב[link]×¤×•×¨×•× Adblock Plus[/link]LL.">
+<!ENTITY showRecentReports.label "הצגת ×”×“×™×•×•×—×™× ×”××—×¨×•× ×™× ×©× ×©×œ×—×•">
+<!ENTITY commentPage.heading "הזנת תגובה">
+<!ENTITY update.start.label "התחל לעדכן כעת">
+<!ENTITY issues.disabledfilters.description "×”×ž×¡× × ×™× ×”×‘××™× ×ž× ×•×˜×¨×œ×™×, לפי שעה ×ולי יש ×œ×”× ×”×©×¤×¢×” על עמוד ×–×”:">
+<!ENTITY screenshot.description "עמוד ×–×”×” יכול להר×ות שונה ל×× ×©×™× ×©×•× ×™×. ×× ×ª×¦×•×¨×£ תמונת מסך לדיווח, ×–×” ×ולי יעזור לנו להבין ×ת הבעיה. ניתן להסיר ×—×œ×§×™× ×”×ž×›×™×œ×™× ×ž×™×“×¢ רגיש וכמו כן לסמן ××–×•×¨×™× ×©×‘×”× ×”×‘×¢×™×” מובחנת. כדי לעשות ×–×ת יש ללחוץ על כפתור ההתכתבות ולבחור ×¢× ×”×¢×›×‘×¨ חלק מהתמונה.">
+<!ENTITY screenshot.attach.label "&amp;צרף תמונת דף לדיווח">
+<!ENTITY issues.whitelist.description "Adblock Plus מנוטרל כעת בעמוד ×שר מדווח. יש ל×פשר ×ותו מחדש ולרענן ×ת העמוד לפני הזנת הדיווח על מנת לסייע בחקירת בעיה זו.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus ×יננו ×—×•×¡× &amp;פרסומות">
+<!ENTITY typeSelector.heading "בחירת סוג הבעיה">
+<!ENTITY anonymity.warning "×œ× × ×•×›×œ לחזור ×ליך, וסביר שנתעדף ×ת הדוח בצורה נמוכה יותר.">
+<!ENTITY wizard.title "מדווח הבעיות">
+<!ENTITY issues.ownfilters.disable.label "נטרול מסנן">
+<!ENTITY commentPage.description "שדה הטקסט שמתחת מ×פשר הזנת תגובה כדי לסייע לנו בהבנת הבעיה. צעד ×–×” ×יננו בגדר חובה ×ך מומלץ ×× ×”×‘×¢×™×” ××™× × ×” מובנת מ×ליה. ניתן ×’× ×œ×¡×§×•×¨ ×ת נתוני הדיווח לפני ×©×”×•× × ×©×œ×—.">
+<!ENTITY comment.lengthWarning "×ורך ההודעה חרג מ-1000 תווי×. רק 1000 ×”×ª×•×•×™× ×”×¨××©×•× ×™× ×™×©×œ×—×•.">
+<!ENTITY typeSelector.falseNegative.description "בחירת ×פשרות זו ×× ×ž×•×¦×’×ª פרסומת למרות ש-Adblock Plus מ×פשר.">
+<!ENTITY sendPage.waitMessage "×× × ×”×ž×ª×™× ×• בזמן ש-Adblock Plus מזין ×ת הדיווח שלכ×.">
+<!ENTITY dataCollector.heading "×‘×¨×•×›×™× ×”×‘××™× ×œ×ž×“×•×•×— הבעיות">
+<!ENTITY screenshot.heading "צירוף ×¦×™×œ×•× ×ž×¡×š">
+<!ENTITY sendPage.heading "שליחת דיווח">
+<!ENTITY issues.subscriptionCount.description "נר××” ש××ª× ×¨×©×•×ž×™× ×œ×™×•×ª×¨ מדי הרשמות מסנני×. מערך ×–×” ×יננו מומלץ מכיוון שזה ×™×’×¨×•× ×œ×¡×™×›×•×™ לבעיות להיות הרבה יותר גבוה. ×נחנו ×’× ×œ× × ×•×›×œ לקבל ×ת דיווחי הבעיות ×©×œ×›× ×ž×›×™×•×•×Ÿ ×©×œ× ×‘×¨×•×¨ ××™×–×” מחבר הרשמות מסנן צריך לנקוט בפעולה. ×× × ×”×¡×™×¨×• ×ת כל הרשמות ×”×ž×¡× × ×™× ×¤×¨×˜ ל×לו שב×מת נחוצות ובדקו ×”×× ××– הבעיה עדיין מתרחשת.">
+<!ENTITY screenshot.mark.label "&amp;סמן ×ת הבעיה">
+<!ENTITY privacyPolicy.label "הצהרת פרטיות">
+<!ENTITY issues.description "Adblock Plus ×–×™×”×” בעיות ×¢× ×”×ª×¦×•×¨×” ×©×œ×›× ×©×ולי ×חר×ית לבעיה זו ×ו ×©×™×’×¨×•× ×œ×—×§×™×¨×ª הדיווח לקשה.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/sidebar.dtd
new file mode 100644
index 0000000..3cac07a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "גבולות פריט הפל×ש">
+<!ENTITY address.label "כתובת">
+<!ENTITY context.open.label "פתיחה בלשונית חדשה">
+<!ENTITY type.label "סוג">
+<!ENTITY tooltip.filterSource.label "מקור מסנן">
+<!ENTITY noitems.label "×ין ×¤×¨×™×˜×™× ×”× ×™×ª× ×™× ×œ×—×¡×™×ž×”">
+<!ENTITY filter.label "מסנן">
+<!ENTITY tooltip.size.label "גודל:">
+<!ENTITY reattach.label "חיבור">
+<!ENTITY search.label "&amp;חיפוש:">
+<!ENTITY docDomain.thirdParty "(צד שלישי)">
+<!ENTITY filterSource.label "מקור המסנן">
+<!ENTITY tooltip.docDomain.label "מקור המסמך:">
+<!ENTITY context.copy.label "העתקת כתובת הפריט">
+<!ENTITY tooltip.type.label "סוג:">
+<!ENTITY context.disablefilter.label "נטרול המסנן ?1?">
+<!ENTITY context.copyFilter.label "העתקת המסנן">
+<!ENTITY context.block.label "חסימת פריט זה">
+<!ENTITY context.enablefilter.label "×פשור המסנן מחדש ?1?">
+<!ENTITY detach.label "הפרדה">
+<!ENTITY whitelisted.label "העמוד × ×ž×¦× ×‘×¨×©×™×ž×” הלבנה">
+<!ENTITY context.disablefilteronsite.label "נטרול מסנן זה ב ?1?">
+<!ENTITY detached.title "(×¤×¨×™×˜×™× ×œ×—×¡×™×ž×” (מופרד :Adblock Plus">
+<!ENTITY docDomain.firstParty "(צד ר×שון)">
+<!ENTITY tooltip.type.whitelisted "(ברשימה הלבנה)">
+<!ENTITY tooltip.filter.label "השפעת המסנן:">
+<!ENTITY tooltip.filter.disabled "(מנוטרל)">
+<!ENTITY context.editfilter.label "עריכת המסנן שמשפיע">
+<!ENTITY tooltip.type.blocked "(חסו×)">
+<!ENTITY size.label "גודל">
+<!ENTITY context.whitelist.label "הוספת כלל חריג עבור פריט">
+<!ENTITY context.selectAll.label "בחירת הכל">
+<!ENTITY state.label "מצב">
+<!ENTITY docDomain.label "מקור המסמך">
+<!ENTITY tooltip.address.label "כתובת:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/subscriptionSelection.dtd
new file mode 100644
index 0000000..eaa7959
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/he/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "הוספת &amp;הרשמת ×”×ž×¡× × ×™× &quot;?1?&quot; ×’× ×›×Ÿ">
+<!ENTITY list.download.failed "Adblock Plus נכשל ב×חזור רשימת ההרשמות.">
+<!ENTITY list.download.retry "נסה שנית">
+<!ENTITY title.label "&amp;כותרת ההרשמה:">
+<!ENTITY list.download.website "הצגת ×”×תר">
+<!ENTITY supplementMessage "מסנן הרשמה ×–×” נועד לשימוש ×¢× ×ž×¡× ×Ÿ ההרשמה &quot;?1?&quot; ×שר ×œ× × ×¢×©×” בו שימוש עדיין.">
+<!ENTITY viewList.label "הצגת מסנני×">
+<!ENTITY visitHomepage.label "ביקור ב×תר הבית">
+<!ENTITY addSubscription.label "הוספת הרשמה">
+<!ENTITY dialog.title "הוספת הרשמת ×ž×¡× × ×™× ×œ-Adblock Plus">
+<!ENTITY location.label "×ž×™×§×•× ×¨×©×™×ž×ª &amp;המסנני×:">
+<!ENTITY fromWeb.description "יש ×œ×•×•×“× ×”×•×¡×¤×ª מסנן הרשמה ×–×”. ניתן לשנות ×ת כותרת ×ו ×ž×™×§×•× ×”×”×¨×©×ž×” לפני הוספתה.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/composer.dtd
new file mode 100644
index 0000000..5f131ff
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "&amp;na kraju adrese">
+<!ENTITY domainRestriction.label "OgraniÄi na &amp;domenu:">
+<!ENTITY collapse.default.no.label "Koriati uobiÄajeno (ne)">
+<!ENTITY firstParty.label "Samo od p&amp;rve strane">
+<!ENTITY preferences.label "Pri&amp;kaži postojeće filtere...">
+<!ENTITY pattern.label "Traži ponavljajući uzorak">
+<!ENTITY thirdParty.label "Samo od &amp;treće strane">
+<!ENTITY filter.label "Novi &amp;filter:">
+<!ENTITY collapse.label "&amp;Sažeti blokirano:">
+<!ENTITY match.warning "Uneseni uzorak više se ne poklapa sa adresom za blokeiranje/odblokiranje i neće imati nikakvog utjecaja na nju.">
+<!ENTITY anchor.start.label "na &amp;poÄetku adrese">
+<!ENTITY matchCase.label "ToÄan i&amp;zraz">
+<!ENTITY custom.pattern.label "Prila&amp;gođeno:">
+<!ENTITY unselectAllTypes.label "Odaberi ništa">
+<!ENTITY type.whitelist.label "Prav&amp;ilo iznimke">
+<!ENTITY regexp.warning "Uzorak koji ste unijeli biti će protumaÄen kao obiÄni izraz kojeg Adblock Plus ne može efikasno obraditi i može usporiti vaÅ¡e surfanje. Ako niste namjeravali koristiti obiÄni izraz, dodajte asterisk (*) na kraju uzorka.">
+<!ENTITY dialog.title "Dodaj Adblock Plus pravilo filtera">
+<!ENTITY basic.label "Osnovni pregled">
+<!ENTITY type.filter.label "&amp;Blokirani filter">
+<!ENTITY types.label "Primjeniti na vrste:">
+<!ENTITY shortpattern.warning "Uneseni uzorak je prekratak za optimizaciju i može usporiti vaÅ¡e surfanje. PreporuÄamo da odaberete duži niz za ovaj filter kako biste omogućili da Adblock Plus efikasnije obradi taj filter.">
+<!ENTITY collapse.yes.label "Da">
+<!ENTITY anchors.label "Prihvati samo uzorak:">
+<!ENTITY collapse.default.yes.label "Koristi uobiÄajeno (da)">
+<!ENTITY domainRestriction.help "Koristite ovu mogućnost za odabir jedne ili više domena odvojenih okomitom linijom (|). Filter će biti primjenjen samo na odabrane domene. Tilda (~) prije naziva domene pokazuje da filter neće biti primjenjen na toj domeni.">
+<!ENTITY accept.label "Dodaj filter">
+<!ENTITY options.label "Mogućnosti">
+<!ENTITY disabled.warning "Adblock Plus je trenutno onemogućen. Možete dodavati filtere ali oni se neće primjenjivati ako ne [link]omogućite Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "na &amp;poÄetku naziva domene">
+<!ENTITY collapse.no.label "Ne">
+<!ENTITY selectAllTypes.label "Odaberi sve">
+<!ENTITY advanced.label "Napredni pregled">
+<!ENTITY pattern.explanation "Uzorak može biti bilo koji dio adrese, asterisk (*) služi kao zamjena. Filter će biti samo primjenjen na adrese koje se podudaraju sa naznaÄenim uzorkom.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/filters.dtd
new file mode 100644
index 0000000..efbb24b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Svi vaši prilagođeni filteri biti će zamijenjene sadržajem odabrane datoteke. Želite li nastaviti?">
+<!ENTITY slow.column "Spori filteri (&amp;w)">
+<!ENTITY enabled.column "O&amp;mogućeno">
+<!ENTITY subscription.lastDownload.checksumMismatch "Neuspješno, neusklađenost checksum-a.">
+<!ENTITY noFiltersInGroup.text "Odabrana grupa je prazna.">
+<!ENTITY subscription.actions.label "Radnje">
+<!ENTITY filter.selectAll.label "Odaberi sve">
+<!ENTITY backupButton.label "&amp;Sigurnosne kopije i vraćanje">
+<!ENTITY restore.minVersion.warning "Upozorenje: datoteka je stvorena novijom inaÄicom Adblock Plus-a. Trebali biste ažurirati na posljednju inaÄicu Adblock Plus-a prije vraćanja ove datoteke.">
+<!ENTITY restore.error "Podaci datoteka ne mogu biti obrađeni, možda to nije Adblock Plus datoteka sigurnosne kopije?">
+<!ENTITY sort.ascending.label "&amp;A &gt; Z red slaganja">
+<!ENTITY sort.label "Po&amp;složiti po">
+<!ENTITY subscription.source.label "Popis filtera">
+<!ENTITY hitcount.column "Pogoci (&amp;H)">
+<!ENTITY noFilters.text "Još nemate prilagođenih filtera.">
+<!ENTITY backup.custom.title "Samo prilagođeni filteri">
+<!ENTITY subscription.external.label "Ažurirano drugim prikljuÄkom">
+<!ENTITY subscription.delete.label "Obriši">
+<!ENTITY noGroupSelected.text "Morate odabrati grupu filtera prije nego filteri mogu biti prikazani.">
+<!ENTITY filter.cut.label "Izreži">
+<!ENTITY restore.default.label "Vrati sigurnosnu kopiju od ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Preuzimanje...">
+<!ENTITY subscriptions.tab.label "Pretplate filtera">
+<!ENTITY sort.descending.label "&amp;Z &gt; A red slaganja">
+<!ENTITY filters.remove.warning "Sigurno želite ukloniti sve odabrane filtere?">
+<!ENTITY filter.delete.label "Obriši">
+<!ENTITY addSubscriptionAdd.label "Dodaj">
+<!ENTITY viewMenu.label "Pogledaj">
+<!ENTITY subscription.lastDownload.unknown "nepoznato">
+<!ENTITY addSubscriptionCancel.label "Poništi">
+<!ENTITY subscription.enabled.label "Omogućen">
+<!ENTITY noSubscriptions.text "Još niste dodali nijednu pretplatu filtera. Adblock Plus neće blokirati
+ ništa bez filtera, molim koristite &quot;Dodaj pretplatu filtera&quot; za
+ dodavanje filtera.">
+<!ENTITY subscription.update.label "Ažuriraj filtere">
+<!ENTITY dialog.title "Adblock Plus postavke filtera">
+<!ENTITY addFilter.label "&amp;Dodaj filter">
+<!ENTITY subscription.minVersion.warning "Ova pretplata filtera zahtijeva noviju inaÄicu Adblock Plus-a, ažurirajte na posljednju Adblock Plus inaÄicu.">
+<!ENTITY subscription.lastDownload.invalidURL "Neuspješno, neispravna adresa">
+<!ENTITY backup.error "Dogodila se greÅ¡ka pri zapisivanja filtera u datoteku. Pobrinite se da datoteka nije postavljena na -samo Äitanje- ili ju koristi druga aplikacija.">
+<!ENTITY filter.moveUp.label "Pomakni gore">
+<!ENTITY addGroup.label "Dodaj &amp;grupu filtera">
+<!ENTITY filter.edit.label "Uredi">
+<!ENTITY subscription.showHideFilters.label "Prikaži/sakrij filtere">
+<!ENTITY acceptableAds2.label "Dopust&amp;i neke nenametljive reklame">
+<!ENTITY addSubscriptionOther.label "Dodaj drugu pretplatu">
+<!ENTITY close.label "Zatvori">
+<!ENTITY sort.none.label "&amp;Neposloženo">
+<!ENTITY filter.actions.label "Radnje filtera">
+<!ENTITY filter.copy.label "Kopiraj">
+<!ENTITY filter.moveDown.label "Pomakni gore">
+<!ENTITY filter.resetHitCounts.label "Vrati na poÄetno statistiku pogodaka">
+<!ENTITY readMore.label "ProÄitaj viÅ¡e">
+<!ENTITY subscription.moveUp.label "Pomakni gore">
+<!ENTITY addSubscription.label "Dodaj pretplatu &amp;filtera">
+<!ENTITY subscription.homepage.label "PoÄetna stranica">
+<!ENTITY backup.complete.title "Svi filteri i pretplate">
+<!ENTITY restore.own.label "Vratite vlastitu sigurnosnu kopiju">
+<!ENTITY restore.complete.warning "Sve vaše postavke filtera biti će zamijenjene sadržajem odabrane datoteke. Želite li nastaviti?">
+<!ENTITY filters.tab.label "Prilagođeni filteri">
+<!ENTITY backup.label "Stvori novu sigurnosnu kopiju">
+<!ENTITY find.label "&amp;Traži">
+<!ENTITY subscription.moveDown.label "Pomakni dolje">
+<!ENTITY subscription.lastDownload.connectionError "Neuspješno, greška preuzimanja">
+<!ENTITY subscription.lastDownload.success "Uspješno">
+<!ENTITY subscription.lastDownload.invalidData "Neuspješno, neispravan popis filtera">
+<!ENTITY filter.paste.label "Zalijepi">
+<!ENTITY subscription.disabledFilters.enable "Omogući onemogućene filtere">
+<!ENTITY lasthit.column "Pos&amp;ljednji pogodak">
+<!ENTITY subscription.editTitle.label "Uredi naziv">
+<!ENTITY subscription.disabledFilters.warning "Neki filteri u ovoj pretplati su onemogućeni.">
+<!ENTITY filter.column "Pravilo &amp;filtera">
+<!ENTITY subscription.lastDownload.label "Zadnje preuzimanje:">
+<!ENTITY viewList.label "Pogledaj popis">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/firstRun.properties
new file mode 100644
index 0000000..dad411a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Surfajte privatno tako što ćete onemogućiti praćenje - skrivanjem od reklamnih kompanija koje prate vaš svaki pokret.
+firstRun_toggle_off=ISKLJUÄŒI
+firstRun_feature_tracking=Onemogućavanje praćenja
+firstRun_feature_malware=Blokiranje malwara
+firstRun_title=Adblock Plus je instaliran
+firstRun_toggle_on=UKLJUÄŒI
+firstRun_acceptableAdsExplanation=Želimo podupirati web stranice da koriste poÅ¡teno, nenametljivo reklamiranje. Zato smo uspostavili <a>toÄne smjernice</a> za prepoznavanje reklama, koje su prikazane prema uobiÄajenim postavkama. Ako joÅ¡ uvijek želite blokirati svaku reklamu to možete <a>onemogućiti</a> za nekoliko sekuondis.
+firstRun_contributor_credits=Zasluge doprinositelja
+firstRun_dataCorruptionWarning=Nastavlja li se ova stranica pojavljivati? <a>Kliknite ovdje!</a>
+firstRun_acceptableAdsHeadline=Naporni oglasi će sada biti blokirani
+firstRun_share=Recite svojim prijateljima
+firstRun_share_headline=<a>Pomognite nam</a> pri stvaranju Interneta boljim mjestom
+firstRun_feature_social_description=Automatski oslobodite svoje surfanje internetom od napornih tipki društvenih mreža poput Facebook 'Sviđa mi se' tipke, koji se pojavljuju na web stranicama i prati vaše ponašanje.
+firstRun_filterlistsReinitializedWarning=Izgleda da je greÅ¡ka uzrokovala uklanjanje svih filtra, a mi smo u nemogućnosti da ih vratimo. Zato smo postavili na poÄetne postavke vaÅ¡ih filtra i prihvatljivih reklama. Provjerite postavke vaÅ¡ih popisa filtra i prihvatljivih reklama u <a>Adblock Plus mogućnostima</a>.
+firstRun_feature_malware_description=UÄinite vaÅ¡e surfanje Internetom sigurnijim blokiranjem poznatih malvare domena.
+firstRun_features=Adblock Plus može uÄiniti mnogo viÅ¡e nego samo blokirati reklame
+firstRun_donate=donirajte
+firstRun_donate_label=Podržite naš projekt
+firstRun_feature_social=Uklanjanje tipki društvenih mreža
+firstRun_legacySafariWarning=Koristite stariju inaÄicu Safarija koja ne podržava Adblock Plus. Možda neće ispravno raditi ili može naruÅ¡iti korisniÄko iskustvo na nekim web stranicama. Stoga vam preporuÄamo nadogradnju na Safari 6.1.1 ili noviju inaÄicu (dostupnu za Mac OS X 10.8 Mountain Lion), ili Safari 7.0.1 ili noviju inaÄicu (za OS X 10.9 Mavericks), ili koristite najnoviju inaÄicu Mozilla Firefoxa, Google Chroma ili Opere.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/global.properties
new file mode 100644
index 0000000..4e368c9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Na trenutnoj stranici nema stavki koje se mogu blokirati
+action3_tooltip=Kliknite za omogućavanje/onemogućavanje Adblock Plus-a.
+notification_antiadblock_title=Sakrij ciljane poruke?
+type_label_script=skripta
+filter_elemhide_nocriteria=Nema kriterija za prepoznavanje elementa koji će biti skriven
+blockingGroup_title=Ad Blocking pravila
+whitelisted_tooltip=Adblock Plus je onemogućen na trenutnoj stranici.
+type_label_stylesheet=stil
+blocked_count_tooltip=?1? od ?2?
+type_label_font=slovo
+type_label_popup=skoÄni prozor
+filter_regexp_tooltip=Ovaj filter je ili regularan izraz ili je prekatak za optimizacju. Previše ovakvih filtera vam može usporiti surfanje.
+action0_tooltip=Kliknite za otvaranje kontekstnog izbornika, srednji klik za omogućavanje/onemogućavanje.
+whitelisted_page=Adblock Plus je onemogućen za trenutnu stranicu
+remove_group_warning=Želite li stvarno ukloniti ovu grupu?
+action1_tooltip=Kliknite za otvaranje/zatvaranje blokiranih stavki, srednji klik za omogućavanje/onemogućavanje.
+type_label_xmlhttprequest=XML zahtjev
+active_tooltip=Adblock Plus je omogućen, ?1? pretplata na filtere i ?2? prilagođenih filtera je u upotrebi.
+type_label_document=dokument
+type_label_object_subrequest=podzahtjev objekta
+whitelistGroup_title=Pravila iznimka
+disabled_tooltip=Adblock Plus je onemogućen.
+filter_elemhide_duplicate_id=Samo jedan ID elementa za skrivanje može biti odabran.
+type_label_object=objekt
+action2_tooltip=Kliknite za otvaranje postavki, srednji klik za omogućavanje/onemogućavanje.
+type_label_subdocument=okvir
+clearStats_warning=Ovo će poništiti svu statistiku pogodaka filtera i onemogućiti brojanje pogodaka filtera. Želite li nastaviti?
+notification_antiadblock_message=Za ovu stranicu je poznato da prikazuje ciljane poruke Adblock Plus korisnicima. Želite li da Adblock Plus sakrije ciljane poruke?
+blocked_count_addendum=(dopušteni: ?1?, skriveni: ?2?)
+subscription_invalid_location=Lokacija popisa filtera nije niti valjana web adresa niti naziv datoteke.
+type_label_image=slika
+remove_subscription_warning=Želite li stvarno ukloniti ovu pretplatu?
+type_label_other=drugi
+mobile_menu_enable=ABP: Omogući
+type_label_media=zvuÄni/video zapisi
+mobile_menu_disable_site=ABP: Onemogući na ?1?
+elemhideGroup_title=Pravila elementa sakrivanja
+mobile_menu_enable_site=ABP: Omogući na ?1?
+type_label_elemhide=skriveno
+newGroup_title=Nova grupa filtera
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/overlay.dtd
new file mode 100644
index 0000000..cf53e9f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Da">
+<!ENTITY notification.button.no "&amp;Ne">
+<!ENTITY sync.label "Sinkroniziraj Adblo&amp;ck Plus postavke">
+<!ENTITY whitelist.site.label "Onemogući na ?1?">
+<!ENTITY filters.label "Postavke &amp;filtera">
+<!ENTITY disable.label "Onemogući posvuda">
+<!ENTITY objecttab.title "Blokiraj">
+<!ENTITY objecttab.tooltip "Kliknite ovdje za blokiranje ovog objekta s Adblock Plus-om">
+<!ENTITY menuitem.label "Ad&amp;block Plus postavke">
+<!ENTITY objecttabs.label "Pri&amp;kaži kartice s Flashom i Javom">
+<!ENTITY sendReport.label "P&amp;rijavite problem na ovoj stranici">
+<!ENTITY whitelist.page.label "Onemogući samo na ovoj stranici">
+<!ENTITY context.image.label "Blokiraj sliku s Adblock Plus-om">
+<!ENTITY counthits.label "Broji pogodke fil&amp;tera">
+<!ENTITY opensidebar.label "Otvori &amp;blokirane stavke">
+<!ENTITY notification.button.close "&amp;Zatvori">
+<!ENTITY contribute.label "Doprinesite Adblock Plus-u">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Blokiraj okvir s Adblock Plus-om">
+<!ENTITY blocked.tooltip "Blokirane stavke na ovoj stranici:">
+<!ENTITY hideplaceholders.label "Sakrij rezervirana mjesta b&amp;lokiranih elemenata">
+<!ENTITY showinstatusbar.label "Prikaži u &amp;statusnoj traci">
+<!ENTITY sidebar.title "Stavke koje se mogu blokirati na trenutnoj stranici">
+<!ENTITY options.label "M&amp;ogućnosti">
+<!ENTITY context.object.label "Blokiraj objekt s Adblock Plus-om">
+<!ENTITY context.removeWhitelist.label "Ponovno omogući na ovoj stranici Adblock Plus">
+<!ENTITY filters.tooltip "Najaktivniji filteri:">
+<!ENTITY closesidebar.label "Zatvori &amp;blokirane stavke">
+<!ENTITY showintoolbar.label "Prik&amp;aži u alatnoj traci">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Blokiraj audio/video s Adblock Plus-om">
+<!ENTITY subscription.update.label "Ažuriraj filtere">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/sendReport.dtd
new file mode 100644
index 0000000..61195b8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/sendReport.dtd
@@ -0,0 +1,102 @@
+<!ENTITY screenshot.undo.label "&amp;Vrati">
+<!ENTITY issues.disabledgroups.description "Sljedeća pretplata filtera / grupe filtera su onemogućene, koje možda
+ utjeÄu na ovu stranicu:">
+<!ENTITY showData.label "Prikaži podatke izvješća">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus prev&amp;iše blokira">
+<!ENTITY issues.change.description "VaÅ¡e postavke su promijenjene. Ponovno uÄitajte stranicu za testiranje promjena
+ i pošaljite izvješće ako problem nije't riješen testiranjem promjene.">
+<!ENTITY email.label "&amp;E-pošta:">
+<!ENTITY issues.openPreferences.label "Otvori postavke filtera">
+<!ENTITY sendPage.confirmation "Vaše izvješće je spremljeno. Možete mu pristupiti na sljedećoj adresi:">
+<!ENTITY copyLink.label "Kopiraj povezni&amp;cu izvješća">
+<!ENTITY issues.nofilters.description "Adblock Plus ništa ne blokira na ovoj trenutnoj stranici. Problem koji ste
+ opazili zacijelo nije povezan s Adblock Plus-om.">
+<!ENTITY sendPage.knownIssue "Problem koji ste prijavili već je poznat. Više informacija:">
+<!ENTITY typeSelector.other.description "Odaberite ovu mogućnost ako mislite da je problem sa Adblock Plus-om,
+ a ne sa filterima.">
+<!ENTITY issues.disabledgroups.enable.label "Omogući pretplatu filtera / grupe filtera">
+<!ENTITY typeWarning.override.label "Razumijem i ipak želim podnije&amp;ti izvješće">
+<!ENTITY issues.disabled.enable.label "Omogući Adblock Plus">
+<!ENTITY update.fixed.description "Ažuriranje vaših pretplata na filtere je vjerovatno riješila problem koji ste
+ prijavljivali. Ponovno uÄitajte stranicu i pokuÅ¡ajte ponovno, pritisnite Prijavi ponovno ako
+ problem nije rješen.">
+<!ENTITY anonymous.label "&amp;Anoniman prijavak">
+<!ENTITY reloadButton.label "Ponovno uÄitaj st&amp;ranicu">
+<!ENTITY recentReports.clear.label "&amp;Ukloni sva izvješća">
+<!ENTITY typeSelector.description "Ovaj prozor će vas voditi kroz korake potrebne za prijavu Adblock
+ Plus izvještaja problema. Prvo odaberite vrstu problema koju ste doživjeli
+ na ovoj stranici:">
+<!ENTITY screenshot.remove.label "&amp;Ukloni osjetljive podatke">
+<!ENTITY issues.ownfilters.description "Neki od filtera primjenjenih na ovoj stranici je definirao korisnik. Onemogućite
+ filtere koji možda uzrokuju problem:">
+<!ENTITY update.inProgress.description "Adblock Plus treba ažurirati vaše pretplate na filtere kako bi bili sigurni da
+ problem već nije rijeÅ¡en. PriÄekajte...">
+<!ENTITY sendPage.retry.label "Pošalji ponovno">
+<!ENTITY data.label "&amp;Podaci izvješća:">
+<!ENTITY recentReports.label "Vaša nedavno podnesena izvješća">
+<!ENTITY typeWarning.description "NaznaÄili ste da želite prijaviti općeniti problem sa Adblock Plus-om a ne
+ problem sa filterima. Takav problem najbolje je prijaviti
+ na [link]Adblock Plus forumu[/link]. Trebali biste koristiti prijavu problema
+ za dopunu postojeće rasprave, jer nitko neće zapaziti vaše izvješće
+ osim ako im ne date poveznicu na to izvješće. Automatski generirana poveznica
+ biti će dostupna nakon prijave izvješća.">
+<!ENTITY issues.disabled.description "Adblock Plus je onemogućen, neće ništa blokirati u ovom trenutnom stanju.">
+<!ENTITY attachExtensions.label "Dodaj popis aktivnih dodataka u izvješće u sluÄaju da je dodatak &amp;razlog problema">
+<!ENTITY issues.nosubscriptions.add.label "Dodaj pretplatu filtera">
+<!ENTITY issues.disabledfilters.enable.label "Omogući filter">
+<!ENTITY issues.override.label "P&amp;ostavke su ispravne, nastavi s podnošenjem izvješća">
+<!ENTITY issues.nosubscriptions.description "Čini se da niste pretplaćeni na nijedan od unaprijed izrađenih popisa filtera koji
+ automatski uklanjaju neželjeni sadržaj sa web stranica.">
+<!ENTITY typeSelector.falsePositive.description "Odaberite ovu mogućnost ako stranica važan sadržaj prikazuje neispravno ili
+ ne radi ispravno. Možete odrediti da li Adblock Plus uzrokuje
+ taj problem, tako da ga privremeno onemogućite.">
+<!ENTITY typeSelector.other.label "Os&amp;tali problemi">
+<!ENTITY emailComment.label "Molimo vas da upišete valjanu adresu e-pošte, da vas možemo kontaktirati ako ćemo imati pitanja o vašem izvješću problema. To će nam isto tako omogućiti da prepoznamo vaš doprinos i damo mu veći prioritet.">
+<!ENTITY issues.whitelist.remove.label "Ponovno omogućite Adblock Plus na ovoj stranici">
+<!ENTITY outdatedSubscriptions.description "Sljedeće pretplate na filtere nisu ažurirane najmanje dva tjedna.
+ Ažurirajte ove pretplate prije slanja prijave, problem je možda
+ već riješen.">
+<!ENTITY dataCollector.description "PriÄekajte nekoliko minuta dok Adblock Plus prikuplja potrebne podatke.">
+<!ENTITY sendButton.label "Poša&amp;lji izvješće">
+<!ENTITY comment.label "&amp;Komentar (neobavezno):">
+<!ENTITY sendPage.errorMessage "Neuspjelo slanje izvješća sa greškom &quot;?1?&quot;. Provjerite jeste li
+ spojeni na internet i pokušajte ponovno. Ako se problem ponovi zatražite
+ pomoć na [link]Adblock Plus forumu[/link].">
+<!ENTITY showRecentReports.label "Prikaži nedavno podnesena izvješća">
+<!ENTITY commentPage.heading "Dodaj komentar">
+<!ENTITY update.start.label "Pokreni ažuriranje sada">
+<!ENTITY issues.disabledfilters.description "Sljedeći filteri su onemogućeni, koji možda utjeÄu na ovu stranicu:">
+<!ENTITY screenshot.description "Ista stranica može izgledati drugaÄije svakoj osobi. To nam može pomoći
+ u razumijevanju problema ako priložite snimku zaslona u izvješće. Možete uklonit
+ dio koji sadrži osjetljive informacije i oznaÄiti podruÄje gdje je
+ problem uoÄen. Da bi to uÄinili kliknite na odgovarajuću tipku i odaberite
+ odabrani dio slike mišem.">
+<!ENTITY screenshot.attach.label "Priloži&amp;te sliku stranice u izvješće">
+<!ENTITY issues.whitelist.description "Adblock Plus je trenutno onemogućen na stranici za koju šaljete izvješće. Ponovno ga omogućite
+ i uÄitajte stranicu prije podnoÅ¡enja izvješća za pomoć u istraživanju of
+ ovog problema.">
+<!ENTITY typeSelector.falseNegative.label "Adblo&amp;ck Plus ne blokira reklame">
+<!ENTITY typeSelector.heading "Odaberite vrstu problema">
+<!ENTITY anonymity.warning "Nećemo vas moći kontaktirati i najvjerojatnije izvješće problema će imati niži prioritet.">
+<!ENTITY wizard.title "Izvještaj problema">
+<!ENTITY issues.ownfilters.disable.label "Onemogući filter">
+<!ENTITY commentPage.description "Polje teksta ispod omogućuje vam dodavanje komentara, što nam olakšava razumijenvanje problema.
+ Ovaj korak je neobevezan ali preporuÄljiv ako problem nije jasan.
+ Provjerite ovo izvješće prije nego što ga pošaljete.">
+<!ENTITY comment.lengthWarning "Duljina vašeg komentara je veća od 1000 znakova. Samo prvih 1000 znakova biti će poslano.">
+<!ENTITY typeSelector.falseNegative.description "Odaberite ovu mogućnost ako su reklame prikazane iako
+ je Adblock Plus omogućen.">
+<!ENTITY sendPage.waitMessage "PriÄekajte dok Adblock Plus prijavljuje vaÅ¡e izvješće.">
+<!ENTITY dataCollector.heading "Dobrodošli u izvještaj problema">
+<!ENTITY screenshot.heading "Priložite snimak zaslona">
+<!ENTITY sendPage.heading "Pošalji izvješće">
+<!ENTITY issues.subscriptionCount.description "Čini se da ste pretplaćeni na previše filter pretplata. Ovakvo
+ podeÅ¡avanje nije preporuÄeno zato jer će povećati vjerojatnost
+ za nastanak problema. Ne možemo prihvatiti vaš izvještaj problema zato it
+ jer nije jasno koji autor filtera pretplate mora pogledat problem. Uklonite
+ sve osim stvarno neophodnih filter pretplata i testirajte je li
+ se problem još pojavljuje.">
+<!ENTITY screenshot.mark.label "OznaÄite proble&amp;m">
+<!ENTITY privacyPolicy.label "Pravila privatnosti">
+<!ENTITY issues.description "Adblock Plus je otkrio problem sa vašim postavkama koje su možda odgovorne
+ za ovaj problem ili će istražiti poteškoću izvještaja.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/sidebar.dtd
new file mode 100644
index 0000000..6d885c7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Osvijetli granice stavke">
+<!ENTITY address.label "Adresa">
+<!ENTITY context.open.label "Otvori u novoj kartici">
+<!ENTITY type.label "Vrsta">
+<!ENTITY tooltip.filterSource.label "Izvor filtera:">
+<!ENTITY noitems.label "Nema stavki za blokiranje">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "VeliÄina:">
+<!ENTITY reattach.label "Ponovno spoji">
+<!ENTITY search.label "&amp;Pretraži:">
+<!ENTITY docDomain.thirdParty "(treća strana)">
+<!ENTITY filterSource.label "Izvor filtera">
+<!ENTITY tooltip.docDomain.label "Izvor dokumenta:">
+<!ENTITY context.copy.label "Kopiraj adresu stavke">
+<!ENTITY tooltip.type.label "Vrsta:">
+<!ENTITY context.disablefilter.label "Onemogućiti filter ?1?">
+<!ENTITY context.copyFilter.label "Kopiraj filter">
+<!ENTITY context.block.label "Blokiraj ovu stavku">
+<!ENTITY context.enablefilter.label "Ponovno omogućiti filter ?1?">
+<!ENTITY detach.label "Odvoji">
+<!ENTITY whitelisted.label "Stranica koja je na dopuštenom popisu">
+<!ENTITY context.disablefilteronsite.label "Onemogućiti ovaj filter na ?1?">
+<!ENTITY detached.title "Adblock Plus: stavke za blokiranje (odvojene)">
+<!ENTITY docDomain.firstParty "(prva strana)">
+<!ENTITY tooltip.type.whitelisted "(na dozvoljenom popisu)">
+<!ENTITY tooltip.filter.label "Filter u upotrebi:">
+<!ENTITY tooltip.filter.disabled "(onemogućen)">
+<!ENTITY context.editfilter.label "Uredi filter u upotrebi">
+<!ENTITY tooltip.type.blocked "(blokiran)">
+<!ENTITY size.label "VeliÄina">
+<!ENTITY context.whitelist.label "Dodaj pravilo izuzimanja za stavku">
+<!ENTITY context.selectAll.label "Odaberi sve">
+<!ENTITY state.label "Status">
+<!ENTITY docDomain.label "Izvor dokumenta">
+<!ENTITY tooltip.address.label "Adresa:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/subscriptionSelection.dtd
new file mode 100644
index 0000000..1ad21bb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hr/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Također &amp;dodajte pretplatu na filter &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plus nije uspio preuzeti popis pretplata.">
+<!ENTITY list.download.retry "Pokušajte ponovno">
+<!ENTITY title.label "Naslov &amp;pretplate:">
+<!ENTITY list.download.website "Pogledaj stranicu">
+<!ENTITY supplementMessage "Ova pretplata na filter je namjenjena korištenju sa pretplatom na filter &quot;?1?&quot; koju još ne koristite.">
+<!ENTITY viewList.label "Pogledaj filtere">
+<!ENTITY visitHomepage.label "Posjetite poÄetnu stranicu">
+<!ENTITY addSubscription.label "Dodaj pretplatu">
+<!ENTITY dialog.title "Dodaj Adblock Plus pretplate filtera">
+<!ENTITY location.label "Lokaci&amp;ja popisa filtera:">
+<!ENTITY fromWeb.description "Potvrdite želite li dodati ovu pretplatu na filter. Možete promijeniti naziv ili lokaciju pretplate prije nego što je dodate.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/composer.dtd
new file mode 100644
index 0000000..c0234a0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "na kón&amp;cu adresy">
+<!ENTITY domainRestriction.label "Wob&amp;mjezować na domenu:">
+<!ENTITY collapse.default.no.label "Standard wužiwać (ně)">
+<!ENTITY firstParty.label "&amp;Jenož prěni bok">
+<!ENTITY preferences.label "&amp;Eksistowace filtry pokazać…">
+<!ENTITY pattern.label "Muster pytać">
+<!ENTITY thirdParty.label "Jenož &amp;třeći bok">
+<!ENTITY filter.label "Nowy &amp;filter:">
+<!ENTITY collapse.label "Zabl&amp;okowane fałdować:">
+<!ENTITY match.warning "Muster, kotryž sće zapodał, wjace adresy njewotpowěduje, kotraž ma so blokować/do běłeje lisćiny přewzać a njezměje žadyn wuskutk na nju.">
+<!ENTITY anchor.start.label "na spoÄatku a&amp;dresy">
+<!ENTITY matchCase.label "&amp;Wulkopisanje wobkedźbować">
+<!ENTITY custom.pattern.label "&amp;Swójski:">
+<!ENTITY unselectAllTypes.label "Žadyn wubrać">
+<!ENTITY type.whitelist.label "W&amp;uwzaćne prawidło">
+<!ENTITY regexp.warning "Muster, kotryž sće zapodał, budźe so jako regularny wuraz interpretować, kotryž njehodźi so přez Adblock Plus skutkownje předźěłać a móhł waš wobhladowak spomałšić. Jeli nochceće regularny wuraz wužiwać, přidajće hwěžku (*) ke kóncej mustra.">
+<!ENTITY dialog.title "Filtrowe prawidło Adblock Plus přidać">
+<!ENTITY basic.label "Zakładny napohlad">
+<!ENTITY type.filter.label "&amp;Blokowanski filter">
+<!ENTITY types.label "Nałožić na typy:">
+<!ENTITY shortpattern.warning "Muster, kotryž sće zapodaÅ‚, je za optimowanje pÅ™ekrótko a móhÅ‚ waÅ¡ wobhladowak spomałšić. PoruÄa so, zo wubjerjeće dlěši znamjeÅ¡kowy rjećazk za tutón filter, zo byšće Adblock Plus dowoliÅ‚, filter bóle skutkownje pÅ™edźěłaÅ‚.">
+<!ENTITY collapse.yes.label "Haj">
+<!ENTITY anchors.label "Jenož muster akceptować:">
+<!ENTITY collapse.default.yes.label "Standard wužiwać (haj)">
+<!ENTITY domainRestriction.help "Wužijće tutu opciju, zo byšće jednu domenu abo wjacore domeny podał, kotrež přez wertikalnu smužku (|) wotdźělić. Filter budźe so jenož na wubrane domeny nałožować. Tilda (~) před domenowym mjenom podawa, zo filter njebudźe so na tu domenu nałožować.">
+<!ENTITY accept.label "Filter přidać">
+<!ENTITY options.label "Opcije">
+<!ENTITY disabled.warning "Adblock Plus je tuchwilu znjemóžnjeny. Móžeće hišće filtry přidać, ale njebudu so nałožować, chibazo [link]zmóžnjeće Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "na spoÄatku &amp;domenoweho mjena">
+<!ENTITY collapse.no.label "NÄ›">
+<!ENTITY selectAllTypes.label "Wšě wubrać">
+<!ENTITY advanced.label "Rozšěrjeny napohlad">
+<!ENTITY pattern.explanation "Muster móže dźěl adresy być; hwěžki (*) funguja jako zastupowace symbole. Filter budźe so jenož na adresy nałožować, kotrež podatemu mustrej wotpowěduja.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/filters.dtd
new file mode 100644
index 0000000..18f33fa
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Wšě waÅ¡e swójske filtry budu so pÅ™ez wobsah wubraneje dataje narunować. Chceće pokroÄować?">
+<!ENTITY slow.column "P&amp;omałe filtry">
+<!ENTITY enabled.column "Z&amp;móžnjeny">
+<!ENTITY subscription.lastDownload.checksumMismatch "NjeporadźiÅ‚o, wopaÄna kontrolna suma">
+<!ENTITY noFiltersInGroup.text "Wubrana skupina je prózdna.">
+<!ENTITY subscription.actions.label "Akcije">
+<!ENTITY filter.selectAll.label "Wšo wubrać">
+<!ENTITY backupButton.label "&amp;Zawěsćić a wobnowić">
+<!ENTITY restore.minVersion.warning "Warnowanje: Dataja je so pÅ™ez nowÅ¡u wersiju Adblock Plus wutworiÅ‚a. Wy měł na najnowÅ¡u wersiju Adblock Plus aktualizować, prjedy haÄ tutu dataju wobnowiće.">
+<!ENTITY restore.error "Daty dataje njedadźa so předźěłać, je móžno, zo wona zawěsćenska dataja Adblock Plus njeje?">
+<!ENTITY sort.ascending.label "Porj&amp;ad A &gt; Z">
+<!ENTITY sort.label "&amp;Sortěrować po">
+<!ENTITY subscription.source.label "Filtrowa lisćina">
+<!ENTITY hitcount.column "&amp;Wotpowědniki">
+<!ENTITY noFilters.text "Nimaće hišće žane swójske filtry.">
+<!ENTITY backup.custom.title "Jenož swójske filtry">
+<!ENTITY subscription.external.label "Přez druhe rozšěrjenje zaktualizowany">
+<!ENTITY subscription.delete.label "Zhašeć">
+<!ENTITY noGroupSelected.text "Dyrbiće filtrowu skupinu wubrać, prjedy haÄ filtry dadźa so zwobraznić.">
+<!ENTITY filter.cut.label "Wutřihać">
+<!ENTITY restore.default.label "Zawěsćensku kopiju wot ?1? wobnowić">
+<!ENTITY subscription.lastDownload.inProgress "Sćahuje so…">
+<!ENTITY subscriptions.tab.label "Filtrowe abonementy">
+<!ENTITY sort.descending.label "Porjad &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Chceće woprawdźe wšě wubrane filtry wotstronić?">
+<!ENTITY filter.delete.label "Zhašeć">
+<!ENTITY addSubscriptionAdd.label "Přidać">
+<!ENTITY viewMenu.label "Napohlad">
+<!ENTITY subscription.lastDownload.unknown "NiÄo k dispoziciji">
+<!ENTITY addSubscriptionCancel.label "Přetorhnyć">
+<!ENTITY subscription.enabled.label "Zmóžnjeny">
+<!ENTITY noSubscriptions.text "Njejsće hišće žane filtrowe abonementy pÅ™idaÅ‚. Adblock Plus njebudźe bjez filtrow niÄo blokować, proÅ¡u wužijće &quot;Filtrowy abonement pÅ™idać&quot;, zo byšće filter pÅ™idaÅ‚.">
+<!ENTITY subscription.update.label "Filtry aktualizować">
+<!ENTITY dialog.title "Adblock Plus - filtrowe nastajenja">
+<!ENTITY addFilter.label "Filter při&amp;dać">
+<!ENTITY subscription.minVersion.warning "Tutón filtrowy abonement wužaduje sej nowšu wersiju Adblock Plus, wy měł na najnowšu wersiju Adblock Plus aktualizować.">
+<!ENTITY subscription.lastDownload.invalidURL "Njeporadźiło, žana płaćiwa adresa">
+<!ENTITY backup.error "Při pisanju filtrow do dataje je zmylk wustupił. Zawěsćće, zo dataja njeje přećiwo pisanju škitana abo so přez druhi program njewužiwa.">
+<!ENTITY filter.moveUp.label "Horje">
+<!ENTITY addGroup.label "Filtrowu &amp;skupinu přidać">
+<!ENTITY filter.edit.label "Wobdźěłać">
+<!ENTITY subscription.showHideFilters.label "Filtry pokazać/schować">
+<!ENTITY acceptableAds2.label "&amp;Njenadběhawe wabjenje dowolić">
+<!ENTITY addSubscriptionOther.label "Druhi abonement přidać">
+<!ENTITY close.label "ZaÄinić">
+<!ENTITY sort.none.label "Njeso&amp;rtěrowany">
+<!ENTITY filter.actions.label "Filtrowe akcije">
+<!ENTITY filter.copy.label "Kopěrować">
+<!ENTITY filter.moveDown.label "Dele">
+<!ENTITY filter.resetHitCounts.label "Statistiku wróćo stajić">
+<!ENTITY readMore.label "Dalše informacije">
+<!ENTITY subscription.moveUp.label "Horje">
+<!ENTITY addSubscription.label "&amp;Filtrowy abonement přidać">
+<!ENTITY subscription.homepage.label "Startowa strona">
+<!ENTITY backup.complete.title "Wšě filtry a abonementy">
+<!ENTITY restore.own.label "Swójsku zawěsćensku kopiju wobnowić">
+<!ENTITY restore.complete.warning "Wšě waÅ¡e filtrowe nastajenja budu so pÅ™ez wobsah wubraneje dataje narunować. Chceće pokroÄować?">
+<!ENTITY filters.tab.label "Swójske filtry">
+<!ENTITY backup.label "Nowu zawěsćensku kopiju wutworić">
+<!ENTITY find.label "&amp;Pytać">
+<!ENTITY subscription.moveDown.label "Dele">
+<!ENTITY subscription.lastDownload.connectionError "Njeporadźiło, sćahowanski zmylk">
+<!ENTITY subscription.lastDownload.success "Wuspěch">
+<!ENTITY subscription.lastDownload.invalidData "Njeporadźiło, žana płaćiwa filtrowa lisćina">
+<!ENTITY filter.paste.label "Zasunyć">
+<!ENTITY subscription.disabledFilters.enable "Znjemóžnjene filtry zmóžnić">
+<!ENTITY lasthit.column "&amp;Posledni wotpowědnik">
+<!ENTITY subscription.editTitle.label "Titul wobdźěłać">
+<!ENTITY subscription.disabledFilters.warning "Někotre filtry w tutym abonemenće su znjemóžnjene.">
+<!ENTITY filter.column "&amp;Filtrowe prawidło">
+<!ENTITY subscription.lastDownload.label "Poslednje sćehnjenje:">
+<!ENTITY viewList.label "Lisćinu pokazać">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/firstRun.properties
new file mode 100644
index 0000000..de870d3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Přehladujće priwatnje znjemóžnjejo slědowanje resp. chowajo swoje slědy před wabjenskimi předewzaćemi, kotrež bychu rady kóždy z wašich pohibow slědowali.
+firstRun_toggle_off=WUPINJENY
+firstRun_feature_tracking=Slědowanje znjemóžnić
+firstRun_feature_malware=Škódnu softwaru blokować
+firstRun_title=Adblock Plus je so instalował
+firstRun_acceptableAdsExplanation=Bychmy rady websydła pozbudźili, sprawne, decentne wabjenje wužiwać. Tohodla smy <a>krute směrnicy</a> postajili, zo bychmy akceptabelne wabjenje identifikowali, kotrež so w standardnych nastajenjach pokazuje. Jeli chceće najebać toho wšo wabjenje blokować, móžeće jo wob mało sekundow <a>znjemóžnić</a>.
+firstRun_toggle_on=ZAPINJENY
+firstRun_contributor_credits=Dźakprajenje sobuskutkowacym
+firstRun_dataCorruptionWarning=Pokazuje so tuta strona dale? <a>Klikńće tu!</a>
+firstRun_acceptableAdsHeadline=Mjerzaca reklama budźe so nětko blokować
+firstRun_share=Informujće swojich přećelow
+firstRun_share_headline=<a>Podajće nam ruku</a>, zo bychmy web k lÄ›pÅ¡emu mÄ›stnu Äinili
+firstRun_features=Adblock Plus móže wjace Äinić haÄ wabjenje blokować
+firstRun_feature_malware_description=Čińće swoje přehladowanje wěsćiše blokujo znate domeny złomyslneje softwary.
+firstRun_feature_social_description=Wotstrońće swoju pÅ™ehladowansku aktiwitu z tłóÄatkow socialnych medijow, kaž na pÅ™. tłóÄatka "Lubi so mi" na Facebooku, kotrež so na webstronach jewja a waÅ¡e zadźerženje slÄ›duja.
+firstRun_donate=darić
+firstRun_donate_label=Podpěrajće naš projekt
+firstRun_feature_social=TłóÄatka za socialne medije wotstronić
+firstRun_legacySafariWarning=Wužiwaće staru wersiju Safari, kotraž se pÅ™ez Adblock Plus njepodpÄ›ruje. Wón njebudźe snano korektnje fungować abo wužiwarske dožiwjenje na wÄ›stach websydÅ‚ach kazyć. PoruÄujemy wuraznje, zo pak aktualizujeće na Safari 6.1.1 abo wyÅ¡i (k dispoziciji za Mac OS X 10.8 Lion) abo na Safari 7.0.1 abo wyÅ¡i (na OS X 10.9 Mavericks) pak wužiwaće najnowÅ¡u wersiju Mozilla Firefox, Google Chrome abo Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/global.properties
new file mode 100644
index 0000000..71491fe
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Žane blokujomne zapiski na tutej stronje
+action3_tooltip=Klikńće, zo byšće Adblock Plus zmóžnił/znjemóžnił.
+notification_antiadblock_title=Cilowe zdźělenki schować?
+type_label_script=skript
+filter_elemhide_nocriteria=Žane kriterije podate, zo by element spóznało, kotryž ma so schować
+blockingGroup_title=Prawidła za blokowanje reklamy
+whitelisted_tooltip=Adblock Plus je na tutej stronje znjemóžnjeny.
+type_label_stylesheet=stilowa předłoha
+blocked_count_tooltip=?1? z ?2?
+type_label_font=pismo
+type_label_popup=wuskakowace wokno
+filter_regexp_tooltip=Tutón filter je pak regularny wuraz pak překrótko za optimizowanje. Přewjele tutych filtrow móhło waš wobhladowak spomałšić.
+action0_tooltip=Klikńće, zo byšće kontekstowy meni zwobraznił, klikńće ze srjedźnej tastu myše, zo by zmóžniło/znjemóžniło.
+whitelisted_page=Adblock Plus je so za tutu stronu znjemóžnił
+remove_group_warning=Chceće tutu skupinu woprawdźe wotstronić?
+action1_tooltip=Klikńće, zo byšće blokujomne zapiski woÄiniÅ‚/zaÄiniÅ‚, klikńće ze srjedźnej tastu myÅ¡e, zo by zmóžniÅ‚o/znjemóžniÅ‚o.
+type_label_xmlhttprequest=XML-naprašowanje
+active_tooltip=Adblock Plus je zmóžnjeny, ?1? filtrowe abonementy a ?2? swójske filtry so wužiwaja.
+type_label_document=dokument
+type_label_object_subrequest=objektowe naprašowanje
+whitelistGroup_title=Wuwzaćne prawidła
+disabled_tooltip=Adblock Plus je znjemóžnjeny.
+filter_elemhide_duplicate_id=Jenož jedyn ID elementa, kotryž ma so schować, hodźi so podać
+type_label_object=objekt
+action2_tooltip=Klikńće, zo byšće nastajenja woÄiniÅ‚, klikńće ze srjedźnej tastu myÅ¡e, zo by zmóžniÅ‚o/znjemóžniÅ‚o.
+type_label_subdocument=wobłuk
+clearStats_warning=To staji wÅ¡u filtrowu statistiku wróćo a znjemóžni liÄenje filtrowych wotpowÄ›dnikow. Chceće pokoroÄować?
+notification_antiadblock_message=Tute sydło je za to znate, zo cilowe zdźělenki za wužiwarjow Adblock Plus pokazuje. Chceće, zo Adblock Plus cilowe zdźělenki chowa?
+blocked_count_addendum=(tež w běłej lisćinje: ?1?, schowane: ?2?)
+subscription_invalid_location=Městno filtroweje lisćiny njeje ani płaćiwy URL ani płaćiwe datajowe mjeno.
+type_label_image=wobraz
+remove_subscription_warning=Chceće woprawdźe tutón abonement wotstronić?
+type_label_other=druhi
+mobile_menu_enable=ABP: Zmóžnić
+type_label_media=awdio/widejo
+mobile_menu_disable_site=ABP: Na ?1? znjemóžnić
+elemhideGroup_title=Prawidła za schowanje elementow
+mobile_menu_enable_site=ABP: Na ?1? zmóžnić
+type_label_elemhide=schowany
+newGroup_title=Nowa filtrowa skupina
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/overlay.dtd
new file mode 100644
index 0000000..1b480b2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Haj">
+<!ENTITY notification.button.no "&amp;NÄ›">
+<!ENTITY sync.label "Nastajenja Adblo&amp;ck Plus synchronizować">
+<!ENTITY whitelist.site.label "Na ?1? znjemóžnić">
+<!ENTITY filters.label "&amp;Filtrowe nastajenja">
+<!ENTITY disable.label "Wšudźe znjemóžnić">
+<!ENTITY objecttab.title "Blokować">
+<!ENTITY objecttab.tooltip "Klikńće sem, zo byšće tutón objekt z pomcu Adblock Plus blokował">
+<!ENTITY menuitem.label "Na&amp;stajenja Adblock Plus">
+<!ENTITY objecttabs.label "Rajtarki wo Flash a Ja&amp;va pokazać">
+<!ENTITY sendReport.label "&amp;Problem na tutej stronje zdźělić">
+<!ENTITY whitelist.page.label "Jenož na tutej stronje znjemóžnić">
+<!ENTITY context.image.label "Adblock Plus: Wobraz blokować">
+<!ENTITY counthits.label "&amp;Filtrowe wotpowÄ›dniki liÄić">
+<!ENTITY opensidebar.label "Blo&amp;kujomne elementy woÄinić">
+<!ENTITY notification.button.close "&amp;ZaÄinić">
+<!ENTITY contribute.label "K Adblock Plus přinošować">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Wobłuk blokować">
+<!ENTITY blocked.tooltip "Zablokowane elementy na tutej stronje:">
+<!ENTITY hideplaceholders.label "&amp;Městodźeržićele zablokowanych elementow schować">
+<!ENTITY showinstatusbar.label "W &amp;statusowej lajsće pokazać">
+<!ENTITY sidebar.title "Blokujomne elementy na aktualnej stronje">
+<!ENTITY options.label "&amp;Opcije">
+<!ENTITY context.object.label "Adblock Plus: Objekt blokować">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Na tutej stronje zaso zmóžnić">
+<!ENTITY filters.tooltip "Najaktiwniše filtry:">
+<!ENTITY closesidebar.label "Blo&amp;kujomne elementy zaÄinić">
+<!ENTITY showintoolbar.label "W gratowej &amp;lajsće pokazać">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Awdio/Widejo blokować">
+<!ENTITY subscription.update.label "Filtry aktualizować">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/sendReport.dtd
new file mode 100644
index 0000000..00a413b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Cofnyć">
+<!ENTITY issues.disabledgroups.description "Slědowace filtrowe abonementy/filtrowe skupiny su znjemóžnjene, najebać toho móhli wuskutk na tutu stronu měć:">
+<!ENTITY showData.label "Daty zdźělenki pokazać">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus pře&amp;wjele blokuje">
+<!ENTITY issues.change.description "WaÅ¡a konfiguracija je so zmÄ›niÅ‚a. ProÅ¡u zaÄitajće stronu znowa, zo byšće zmÄ›ny testowaÅ‚ a wotpósćelće zdźělenje, jeli problem njeje so pÅ™ez zmÄ›ny rozrisaÅ‚.">
+<!ENTITY email.label "E-&amp;mejl:">
+<!ENTITY issues.openPreferences.label "Filtrowe nastajenja woÄinić">
+<!ENTITY sendPage.confirmation "Waša zdźělenka je so składowała. Móžeš pod slědowacej adresu na njo přistup měć:">
+<!ENTITY copyLink.label "&amp;Wotkaz zdźělenki kopěrować">
+<!ENTITY issues.nofilters.description "Adblock Plus na aktualnej stronje niÄo njeblokuje. Problem, kotryž sće zwÄ›sćiÅ‚, najskerje z Adblock Plus Äinić nima.">
+<!ENTITY sendPage.knownIssue "Problem, kotryž sće zdźělił, je hižo znaty. Dalše informacije:">
+<!ENTITY typeSelector.other.description "Wubjerće tutu opciju, jeli skerje na problem z Adblock Plus samym haÄ z jeho filtrami tukaće.">
+<!ENTITY issues.disabledgroups.enable.label "Filtrowy abonement/filtrowu skupinu zmóžnić">
+<!ENTITY typeWarning.override.label "Ro&amp;zumju a chcu zdźělenje najebać toho pósłać">
+<!ENTITY issues.disabled.enable.label "Adblock Plus zmóžnić">
+<!ENTITY update.fixed.description "Aktualizacije za waÅ¡e filtrowe abonementy su najskerje problem rozrisali, kotryž sće zdźěliÅ‚. ProÅ¡u zaÄitajće stronu znowa, spytajće hišće raz a klikńće zaso na 'Hišće raz pósÅ‚ać', jeli problem hišće wobsteji.">
+<!ENTITY anonymous.label "&amp;Anonymne słanje">
+<!ENTITY reloadButton.label "&amp;Stronu znowa zaÄitać">
+<!ENTITY recentReports.clear.label "Wšě &amp;zdźělenki wotstronić">
+<!ENTITY typeSelector.description "Tute wokno budźe wam pÅ™ez kroki wjesć, kotrež su trÄ›bne za sÅ‚anje wopisanja problemow Adblock Plus. Wubjerće proÅ¡u najprjedy družinu problema, na kotryž sće na tutej stronje storÄiÅ‚:">
+<!ENTITY screenshot.remove.label "&amp;Dowěrne daty wotstronić">
+<!ENTITY issues.ownfilters.description "Někotre filtry, kotrež so na tutu stronu nałožuja, su wot wužiwarja definowane. Prošu znjemóžńće filtry, kotrež móhli problem zawinować:">
+<!ENTITY update.inProgress.description "Adblock Plus dyrbi waÅ¡e filtrowe abonementy aktualizować, zo by zawÄ›sćiÅ‚, zo problem njeje so hišće rozrisaÅ‚. ProÅ¡u Äakajće...">
+<!ENTITY sendPage.retry.label "Hišće raz pósłać">
+<!ENTITY data.label "Da&amp;ty zdźělenki:">
+<!ENTITY recentReports.label "Waše njedawno pósłane zdźělenki">
+<!ENTITY typeWarning.description "Sće podaÅ‚, zo maće skerje powÅ¡itkowny problem z Adblock Plus haÄ problem z filtrami. ProÅ¡u dźiwajće na to, zo tajke problemy mÄ›li so najlÄ›pje w [link]forumje Adblock Plus[/link] zdźělić. Wy měł jenož problemowy rozuprawnik wužiwać, zo byšće eksistowacu diskusiju wudospoÅ‚niÅ‚, dokelž nichtó waÅ¡e zdźělenje k wÄ›domje njewozmje, chibazo byšće wotkaz na njo dodaÅ‚. Awtomatisce wutworjeny wotkaz so po sÅ‚anju zdźělenja doda.">
+<!ENTITY issues.disabled.description "Adblock Plus je znjemóžnjeny, w jeho tuchwilnym stawje niÄo njeblokuje.">
+<!ENTITY attachExtensions.label "Lisćinu aktiwnych &amp;rozšěrjenjow k zdźělence pÅ™ipowÄ›snyć, jeli konflikt z rozšěrjenjom je pÅ™iÄina problema">
+<!ENTITY issues.nosubscriptions.add.label "Filtrowy abonement přidać">
+<!ENTITY issues.disabledfilters.enable.label "Filter zmóžnić">
+<!ENTITY issues.override.label "&amp;Konfiguracija je korektna, ze zdźělenjom pokroÄować">
+<!ENTITY issues.nosubscriptions.description "Zda so, zo njejśce žane hotowe lisćiny filtrow abonował, kotrež njewitany wobsah z websydło awtomatisce wotstronjeja.">
+<!ENTITY typeSelector.falsePositive.description "Wubjerće tutu opciju, jeli stronje wažny wobsah faluje, so strona wopak zwobraznja abo porjadnje njefunguje. Móžeće zwÄ›sćić, haÄ Adblock Plus je wina na tutym problemje, hdyž jón nachwilu znjemóžnjeće.">
+<!ENTITY typeSelector.other.label "Dr&amp;uhi problem">
+<!ENTITY emailComment.label "PoruÄamy was, pÅ‚aćiwu e-mejlowu adresu zapodać, zo bychmy móhli z wami do zwiska stajić, jeli su praÅ¡enja wo waÅ¡ej rozprawje. Budźe nam tež zmóžnić, waÅ¡e pÅ™inoÅ¡ki pÅ™ipóznać a jim wyÅ¡u prioritu dać.">
+<!ENTITY issues.whitelist.remove.label "Adblock Plus na tutej stronje zaso zmóžnić">
+<!ENTITY outdatedSubscriptions.description "SlÄ›dowace filtrowe abonementy njejsu so wot znajmjeńša dweju njedźelow zaktualizowali. ProÅ¡u zaktualizujće tute abonementy, prjedy haÄ pósćeleÅ¡ zdźělenku. Problem móhÅ‚ potom hižo rozrisany być.">
+<!ENTITY dataCollector.description "ProÅ¡u poÄakńće, mjeztym zo Adblock Plus trÄ›bne daty hromadźi.">
+<!ENTITY sendButton.label "Zdźě&amp;lenku pósłać">
+<!ENTITY comment.label "&amp;Komentar (opcionalny):">
+<!ENTITY sendPage.errorMessage "Pospyt, zdźělenku pósłać, je so ze zmylkowym kodom &quot;?1?&quot; njeporadźił. Prošu zawěsćće, zo sće z internetom zwjazany a spytajće hišće raz. Jeli problem dale eksistuje, poprošće prošu w [link]forumje Adblock Plus[/link] wo pomoc.">
+<!ENTITY showRecentReports.label "Njedawno pósłane zdźělenki">
+<!ENTITY commentPage.heading "Komentar zapodać">
+<!ENTITY update.start.label "Aktualizaciju nětko startować">
+<!ENTITY issues.disabledfilters.description "Slědowace filtry su znjemóžnjene, najebać toho móhli wuskutk na tutu stronu měć:">
+<!ENTITY screenshot.description "Samsna strona móže rozdźělnje za rozdźělnych ludźi wupadać. Móže nam pomhać, problem rozumić, jeli k waÅ¡ej zdźělence foto wobrazowki pÅ™ipowÄ›snjeće. Móžeće wotrÄ›zki wotstronić, kotrež sensibelne informacije wobsahuje kaž tež wobÅ‚uki markÄ›rować, hdźež so problem pokazuje. Zo byšće to ÄiniÅ‚, klikńće na wotpowÄ›dne tłóÄatko a wubjerće wotrÄ›zk wobraza ze swojej myÅ¡u.">
+<!ENTITY screenshot.attach.label "Wo&amp;braz strony k zdźělence připowěsnyć">
+<!ENTITY issues.whitelist.description "Adblock Plus je tuchwilu na stronje, wo kotrejž rozprawjeće, znjemóžnjeny. ProÅ¡u zmóžńće jón znowa a zaÄitajće stronu, prjedy haÄ zdźělenku wotpósćeleće, zo byšće analyzowanje tutoho problema podpÄ›raÅ‚.">
+<!ENTITY typeSelector.falseNegative.label "Ad&amp;block Plus wabjenje njeblokuje">
+<!ENTITY typeSelector.heading "Problemowy typ wubrać">
+<!ENTITY anonymity.warning "Njemóžemy so zaso na was wobroćić a damy najskerje wašej rozprawje nisku prioritu.">
+<!ENTITY wizard.title "Problemowy rozprawnik">
+<!ENTITY issues.ownfilters.disable.label "Filter znjemóžnić">
+<!ENTITY commentPage.description "Tekstowe polo deleka zmóžnja wam, komentar zapodać, zo byšće nam pomhaÅ‚, problem rozumić. Tutón krok je opcionalny, ale poruÄa so, jeli problem woÄiwidny njeje. Móžeće tež daty zdźělenki pÅ™epruwować, prjedy haÄ so sćele.">
+<!ENTITY comment.lengthWarning "DoÅ‚hosć waÅ¡eho komentar pÅ™ekroÄuje 1000 znamjeÅ¡kow. Jenož prÄ›nje 1000 znamjeÅ¡kow budu so sÅ‚ać.">
+<!ENTITY typeSelector.falseNegative.description "Wubjerće tutu opciju, jeli wabjenje so zwobraznjuje, haÄrunjež Adblock Plus je zmóžnjeny.">
+<!ENTITY sendPage.waitMessage "ProÅ¡u poÄakńće, doniž Adblock Plus waÅ¡u zdźělenku njewotesyÅ‚a.">
+<!ENTITY dataCollector.heading "Witajće do problemoweho rozprawnika">
+<!ENTITY screenshot.heading "Foto wobrazowki připowěsnyć">
+<!ENTITY sendPage.heading "Zdźělenku pósłać">
+<!ENTITY issues.subscriptionCount.description "Zda so, zo sće pÅ™ewjele filtrowych abonementow abonowaÅ‚. Tute nastajenje so njeporuÄa, dokelž prawdźepodobnosć problemow jara zwyÅ¡i. Ani njemóžemy waÅ¡ problemowe wopisanje akceptować, dokelž je njejasnje, kotry awtor filtroweho abonementa ma jednać. ProÅ¡u wotstrońće wšě nimo woprawdźe trÄ›bnych filtrowych abonementow a testujće, haÄ problem dale wustupuje.">
+<!ENTITY screenshot.mark.label "&amp;Problem markěrować">
+<!ENTITY privacyPolicy.label "Prawidła priwatnosće">
+<!ENTITY issues.description "Adblock Plus je problemy z wašej konfiguraciju wotkrył, kotrež móhli na tutón problem wina być abo analyzowanje problema poćežuja.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/sidebar.dtd
new file mode 100644
index 0000000..71d6ef1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Ramiki elementa pokazać">
+<!ENTITY address.label "Adresa">
+<!ENTITY context.open.label "W nowym rajtarku woÄinić">
+<!ENTITY type.label "Typ">
+<!ENTITY tooltip.filterSource.label "Žórło filtra:">
+<!ENTITY noitems.label "Žane blokujomne elementy">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Wulkosć:">
+<!ENTITY reattach.label "Zaso připowěsnyć">
+<!ENTITY search.label "&amp;Pytać:">
+<!ENTITY docDomain.thirdParty "(třeći bok)">
+<!ENTITY filterSource.label "Žórło filtrow">
+<!ENTITY tooltip.docDomain.label "Žórło dokumenta:">
+<!ENTITY context.copy.label "Adresu elementa kopěrować">
+<!ENTITY tooltip.type.label "Typ:">
+<!ENTITY context.disablefilter.label "Filter ?1? znjemóžnić">
+<!ENTITY context.copyFilter.label "Filter kopěrować">
+<!ENTITY context.block.label "Tutón element blokować">
+<!ENTITY context.enablefilter.label "Filter ?1? zaso zmóžnić">
+<!ENTITY detach.label "Wotpowěsnyć">
+<!ENTITY whitelisted.label "Strona w běłej lisćinje">
+<!ENTITY context.disablefilteronsite.label "Tutón filter na ?1? znjemóžnić">
+<!ENTITY detached.title "Adblock Plus: Blokujomne elementy (wotpowěsnjene)">
+<!ENTITY docDomain.firstParty "(prěni bok)">
+<!ENTITY tooltip.type.whitelisted "(w běłej lisćinje)">
+<!ENTITY tooltip.filter.label "Aktiwny filter:">
+<!ENTITY tooltip.filter.disabled "(znjemóžnjeny)">
+<!ENTITY context.editfilter.label "Aktiwny filter wobdźěłać">
+<!ENTITY tooltip.type.blocked "(zablokowany)">
+<!ENTITY size.label "Wulkosć">
+<!ENTITY context.whitelist.label "Wuwzaćne prawidło za element přidać">
+<!ENTITY context.selectAll.label "Wšitko wubrać">
+<!ENTITY state.label "Staw">
+<!ENTITY docDomain.label "Žórło dokumenta">
+<!ENTITY tooltip.address.label "Adresa:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/subscriptionSelection.dtd
new file mode 100644
index 0000000..80511a2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hsb/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Filtrowy a&amp;bonement &quot;?1?&quot; tež přidać">
+<!ENTITY list.download.failed "Adblock Plus njemóžeše lisćiny abonementow wotwołać.">
+<!ENTITY list.download.retry "Hišće raz spytać">
+<!ENTITY title.label "&amp;Titul abonementa:">
+<!ENTITY list.download.website "Websydło sej wobhladać">
+<!ENTITY supplementMessage "Tutón filtrowy abonement je za to mysleny, so z filtrowym abonementom &quot;?1?&quot; wužiwać, kotryž hišće njewužiwaće.">
+<!ENTITY viewList.label "Filtry sej wobhladać">
+<!ENTITY visitHomepage.label "Startowu stronu wopytać">
+<!ENTITY addSubscription.label "Abonement přidać">
+<!ENTITY dialog.title "Filtrowy abonement Adblock Plus přidać">
+<!ENTITY location.label "&amp;Městno filtroweje lisćiny:">
+<!ENTITY fromWeb.description "ProÅ¡u wobkrućće, zo chceće tutón filtrowy abonement pÅ™idać. Móžeće titul abo mÄ›stno abonementa zmÄ›nić, prjedy haÄ jón pÅ™idaće.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/composer.dtd
new file mode 100644
index 0000000..6292ed7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "a cím &amp;végén">
+<!ENTITY domainRestriction.label "Korlá&amp;tozás tartományra:">
+<!ENTITY collapse.default.no.label "Alapértelmezett (nem)">
+<!ENTITY firstParty.label "Csak &amp;belső címhez">
+<!ENTITY preferences.label "&amp;Meglévő szűrők megjelenítése...">
+<!ENTITY pattern.label "Minta">
+<!ENTITY thirdParty.label "Csak külső cím&amp;hez">
+<!ENTITY filter.label "Ú&amp;j szűrő:">
+<!ENTITY collapse.label "Bl&amp;okkolt elem összecsukása:">
+<!ENTITY match.warning "A megadott minta nem egyezik a blokkolt/engedélyezett címek listájával, így annak használata nem jár eredménnyel.">
+<!ENTITY anchor.start.label "a cím &amp;elején">
+<!ENTITY matchCase.label "K&amp;is- és nagy betűk megkülönböztetése">
+<!ENTITY custom.pattern.label "E&amp;gyedi:">
+<!ENTITY unselectAllTypes.label "Kijelölés törlése">
+<!ENTITY type.whitelist.label "&amp;Kivételszabály">
+<!ENTITY regexp.warning "A megadott minta reguláris kifejezésként fog szerepelni. Sok ilyen kifejezés lassíthatja a böngészést. Ha nem akar használni ilyen kifejezéseket, a minta végére írja a * jelet.">
+<!ENTITY dialog.title "Adblock Plus szűrőszabály hozzáadása">
+<!ENTITY basic.label "Alap nézet">
+<!ENTITY type.filter.label "Blokkoló &amp;szűrő">
+<!ENTITY types.label "Alkalmazás típusokra:">
+<!ENTITY shortpattern.warning "A megadott minta nem optimalizálható, mert túl rövid. Sok ilyen minta lassíthatja a böngészést. Ajánlott ehhez a szűrőhöz egy hosszabb karakterlánc használata.">
+<!ENTITY collapse.yes.label "Igen">
+<!ENTITY anchors.label "Minta elfogadása csak:">
+<!ENTITY collapse.default.yes.label "Alapértelmezett (igen)">
+<!ENTITY domainRestriction.help "Adjon meg egy vagy több tartományt a &quot;|&quot; jellel elválasztva, a szűrő csak ezeken a tartományokon lesz alkalmazva. A &quot;~&quot; jellel a tartománynév elején letilthatja a szűrő használatát az adott tartományon.">
+<!ENTITY accept.label "Szűrő hozzáadása">
+<!ENTITY options.label "Beállítások">
+<!ENTITY disabled.warning "Az Adblock Plus jelenleg le van tiltva. Szűrőket hozzáadhat, de azok nem fognak működni, amíg nem [link]engedélyezi az Adblock Plust[/link].">
+<!ENTITY anchor.start.flexible.label "a tartománynév &amp;elején">
+<!ENTITY collapse.no.label "Nem">
+<!ENTITY selectAllTypes.label "Minden kijelölése">
+<!ENTITY advanced.label "Haladó nézet">
+<!ENTITY pattern.explanation "A minta lehet egy webcím bármely része, amelyben a * szimbólum helyettesítő karakterként szerepelhet. A szűrő csak azokra címekre lesz alkalmazva, amelyekre a minta illeszkedik.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/filters.dtd
new file mode 100644
index 0000000..5059863
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Az összes saját szűrője le lesz cserélve a kiválasztott fájlban lévőkre. Biztosan folytatni szeretné?">
+<!ENTITY slow.column "&amp;Lassú szűrők">
+<!ENTITY enabled.column "&amp;Engedélyezve">
+<!ENTITY subscription.lastDownload.checksumMismatch "Sikertelen, érvénytelen ellenőrző összeg">
+<!ENTITY noFiltersInGroup.text "A kiválasztott csoport üres.">
+<!ENTITY subscription.actions.label "Műveletek">
+<!ENTITY filter.selectAll.label "Az összes kijelölése">
+<!ENTITY backupButton.label "&amp;Biztonsági mentés és visszaállítás">
+<!ENTITY restore.minVersion.warning "Figyelmeztetés: a fájlt az Adblock Plus újabb verziójával készült. Frissítsen az Adblock Plus legújabb verziójára, mielőtt visszaállítaná ezt a fájlt.">
+<!ENTITY restore.error "A fájlt nem sikerült feldolgozni, lehetséges, hogy nem egy Adblock Plus biztonsági mentést tartalmaz.">
+<!ENTITY sort.ascending.label "Rendezés &amp;A &gt; Z">
+<!ENTITY sort.label "&amp;Rendezés">
+<!ENTITY subscription.source.label "Szűrő lista">
+<!ENTITY hitcount.column "&amp;Találatok">
+<!ENTITY noFilters.text "Nincsenek saját szűrők.">
+<!ENTITY backup.custom.title "Csak saját szűrők">
+<!ENTITY subscription.external.label "Másik kiterjesztés frissíti">
+<!ENTITY subscription.delete.label "Törlés">
+<!ENTITY noGroupSelected.text "Ki kell választania egy szűrő csoportot a benne lévő szűrők megjelenítéséhez.">
+<!ENTITY filter.cut.label "Kivágás">
+<!ENTITY restore.default.label "Visszaállítás ?1?-i állapotra">
+<!ENTITY subscription.lastDownload.inProgress "Letöltés...">
+<!ENTITY subscriptions.tab.label "Külső szűrők">
+<!ENTITY sort.descending.label "Rendezés &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Biztosan eltávolítja az összes kiválasztott szűrőt?">
+<!ENTITY filter.delete.label "Törlés">
+<!ENTITY addSubscriptionAdd.label "Hozzáadás">
+<!ENTITY viewMenu.label "Nézet">
+<!ENTITY subscription.lastDownload.unknown "ismeretlen">
+<!ENTITY addSubscriptionCancel.label "Mégse">
+<!ENTITY subscription.enabled.label "Engedélyezve">
+<!ENTITY noSubscriptions.text "Nincs felvéve egyetlen külső szűrőt sem. Az Adblock Plus nem fog semmit szűrni szűrők nélkül. Kérem használja a &quot;Külső szűrő felvétele&quot; funkciót új szűrők felvételéhez.">
+<!ENTITY subscription.update.label "Szűrők frissítése">
+<!ENTITY dialog.title "Adblock Plus szűrő beállítások">
+<!ENTITY addFilter.label "Szűrő &amp;hozzáadása">
+<!ENTITY subscription.minVersion.warning "A külső szűrő újabb Adblock Plus verzióhoz készült, frissítenie kell az Adblock Plust a legújabb verzióra.">
+<!ENTITY subscription.lastDownload.invalidURL "Sikertelen, érvénytelen cím">
+<!ENTITY backup.error "Hiba történt a szűrők fájlba mentésekor. Ellenőrizze, hogy a fájl nem írásvédett vagy nem használja-e egy másik alkalmazás.">
+<!ENTITY filter.moveUp.label "Mozgatás fel">
+<!ENTITY addGroup.label "Szűrő &amp;csoport felvétele">
+<!ENTITY filter.edit.label "Szerkesztés">
+<!ENTITY subscription.showHideFilters.label "Szűrők megjelenítése/elrejtése">
+<!ENTITY acceptableAds2.label "Néhány nem &amp;tolakodó hirdetés engedélyezése">
+<!ENTITY addSubscriptionOther.label "Külső szűrő hozzáadása">
+<!ENTITY close.label "Bezárás">
+<!ENTITY sort.none.label "Ren&amp;dezetlen">
+<!ENTITY filter.actions.label "Szűrő műveletek">
+<!ENTITY filter.copy.label "Másolás">
+<!ENTITY filter.moveDown.label "Mozgatás le">
+<!ENTITY filter.resetHitCounts.label "Találati statisztika törlése">
+<!ENTITY readMore.label "Mi ez?">
+<!ENTITY subscription.moveUp.label "Mozgatás fel">
+<!ENTITY addSubscription.label "Kül&amp;ső szűrő hozzáadása">
+<!ENTITY subscription.homepage.label "Honlap">
+<!ENTITY backup.complete.title "Az összes szűrő és feliratkozás">
+<!ENTITY restore.own.label "Saját mentés visszaállítása">
+<!ENTITY restore.complete.warning "Az összes szűrő beállítása le lesz cserélve a kiválasztott fájlban lévőkre. Biztosan folytatni szeretné?">
+<!ENTITY filters.tab.label "Saját szűrők">
+<!ENTITY backup.label "Új biztonsági mentés">
+<!ENTITY find.label "&amp;Keresés">
+<!ENTITY subscription.moveDown.label "Mozgatás le">
+<!ENTITY subscription.lastDownload.connectionError "Sikertelen, letöltési hiba">
+<!ENTITY subscription.lastDownload.success "Sikeres">
+<!ENTITY subscription.lastDownload.invalidData "Sikertelen, érvénytelen szűrőlista">
+<!ENTITY filter.paste.label "Beillesztés">
+<!ENTITY subscription.disabledFilters.enable "Letiltott szűrők engedélyezése">
+<!ENTITY lasthit.column "&amp;Utolsó találat">
+<!ENTITY subscription.editTitle.label "Cím szerkesztése">
+<!ENTITY subscription.disabledFilters.warning "Néhány szűrő ebben a listában le van tiltva.">
+<!ENTITY filter.column "&amp;Szűrő szabály">
+<!ENTITY subscription.lastDownload.label "Legutóbb letöltve:">
+<!ENTITY viewList.label "Lista megtekintése">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/firstRun.properties
new file mode 100644
index 0000000..8a3d609
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Böngésszen privátban azáltal, hogy letiltja a követést - elrejtheti nyomait a reklámcégek elől, amelyek egyébként figyelnék minden lépését.
+firstRun_toggle_off=KIKAPCSOLVA
+firstRun_feature_tracking=Követés letiltása
+firstRun_feature_malware=Rosszindulatú kódok blokkolása
+firstRun_title=Sikeresen telepítette az Adblock Plus-t
+firstRun_toggle_on=BEKAPCSOLVA
+firstRun_acceptableAdsExplanation=Szeretnénk arra biztatni a weboldalakat, hogy egyértelmű, nem tolakodó hirdetéseket használjanak. Ezért hoztunk létre <a>szigorú irányelveket</a>, amelyek segítségével azonosíthatók az elfogadható hirdetések, amelyek az alapbeállítások között találhatók meg. Ha ennek ellenére minden hirdetést <a>blokkolni</a> szeretne, ezt továbbra is megteheti mindössze néhány másodperc alatt.
+firstRun_contributor_credits=Hozzájárulók névsora
+firstRun_dataCorruptionWarning=Ãllandóan megjelenik ez az oldal? <a>Kattintson ide!</a>
+firstRun_acceptableAdsHeadline=A bosszantó hirdetések mostantól blokkolva lesznek
+firstRun_share=Mondja el barátainak
+firstRun_share_headline=<a>Segítsen nekünk</a> jobb hellyé tenni a világhálót
+firstRun_feature_social_description=Automatikusan szabaduljon meg a közösségi médiával kapcsolatos gomboktól, mint például a facebook "Tetszik" gombja, amelyek a weboldalakon jelennek meg és figyelik az Ön szokásait.
+firstRun_filterlistsReinitializedWarning=Egy hiba miatt az összes szűrő eltávolításra került és a biztonsági másolatot sem sikerült visszaállítani. Az összes szűrő és az elfogadható hirdetések beállításai alapállapotba kerültek. Kérem ellenőrizze a szűrő listákat és az elfogadható hirdetések beállításait az <a>Adblock Plus opció</a> közt.
+firstRun_feature_malware_description=Tegye a böngészést biztonságosabbá azáltal, hogy letiltja az ismert malware címeket.
+firstRun_features=Az Adblock Plus a reklámok blokkolásánál többre is képes
+firstRun_donate=adományozás
+firstRun_donate_label=A projekt támogatása
+firstRun_feature_social=Közösségi oldalak gombjainak eltávolítása
+firstRun_legacySafariWarning=A Safari egy régi verzióját használja, amelyet nem támogat az Adblock Plus. Lehetséges, hogy nem fog megfelelően működni vagy lelassítja a működést egyes weboldalakon. Erősen ajánlott frissíteni a Safari 6.1.1-es (Mac OS X 10.8 Mountain Lion operációs rendszeren) , vagy a Safari 7.0.1-es és újabb verzióira (OS X 10.9 Maverics operációs rendszertől) vagy használja a Mozilla Firefox, Google Chrome vagy Opera legújabb verzióját.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/global.properties
new file mode 100644
index 0000000..3b32ac6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Nincsenek blokkolható elemek az aktuális oldalon.
+action3_tooltip=Kattintson ide az Adblock Plus ki/bekapcsolásához.
+notification_antiadblock_title=Célzott üzenetek elrejtése
+type_label_script=szkript
+filter_elemhide_nocriteria=Nincs megadva feltétel az elrejtendő elemre
+blockingGroup_title=Reklám szűrő szabályok
+whitelisted_tooltip=Az Adblock be van kapcsolva, de a szűrés le van tiltva az aktuális oldalon.
+type_label_stylesheet=stíluslap
+blocked_count_tooltip=?1?/?2?
+type_label_font=betűtípus
+type_label_popup=felugró ablak
+filter_regexp_tooltip=Ez a szűrő vagy reguláris kifejezés vagy túl rövid az optimalizációhoz. Túl sok ilyen szűrő lelassíthatja a böngészést.
+action0_tooltip=Kattintson ide a környezeti menühöz, középső gombbal a ki/bekapcsoláshoz.
+whitelisted_page=Az Adblock Plus le van tiltva az aktuális oldalon
+remove_group_warning=Biztosan eltávolítja ezt a csoportot?
+action1_tooltip=Kattintson ide a blokkolható elemek megnyitásához/bezárásához, középső gombbal a ki/bekapcsoláshoz.
+type_label_xmlhttprequest=XML kérés
+active_tooltip=Az Adblock Plus aktív, ?1? szűrő(k) és ?2? saját szűrő(k) van használatban.
+type_label_document=dokumentum
+type_label_object_subrequest=objektum alkérés
+whitelistGroup_title=Kivétel szabályok
+disabled_tooltip=Az Adblock Plus ki van kapcsolva.
+filter_elemhide_duplicate_id=Csak egy ID-ját lehet megadni az elrejtendő elemnek
+type_label_object=objektum
+action2_tooltip=Kattintson ide a beállítások megnyitásához, középső gombbal a ki/bekapcsoláshoz.
+type_label_subdocument=keret
+clearStats_warning=Ezzel letörli az összes találati statisztikát és letiltja a mentésüket. Biztosan folytatja?
+notification_antiadblock_message=Ezen az oldalon célzott üzeneteket jelenítenek meg az Adblock Plus felhasználóinak. Szeretné, ha az Adblock Plus elrejtené ezeket az üzeneteket?
+blocked_count_addendum=(fehér listán: ?1?, rejtett: ?2?)
+subscription_invalid_location=A megadott külső szűrőt tartalmazó cím helytelen, vagy hibás fájlnevet tartalmaz.
+type_label_image=kép
+remove_subscription_warning=Valóban el kívánja távolítani ezt a szűrőt?
+type_label_other=egyéb
+mobile_menu_enable=ABP: Engedélyezés
+type_label_media=hang/videó
+mobile_menu_disable_site=ABP: Letiltja itt: ?1?
+elemhideGroup_title=Elem elrejtési szabályok
+mobile_menu_enable_site=ABP: Engedélyezi itt: ?1?
+type_label_elemhide=rejtett
+newGroup_title=Új szűrő csoport
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/overlay.dtd
new file mode 100644
index 0000000..f60fae1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Igen">
+<!ENTITY notification.button.no "&amp;Nem">
+<!ENTITY sync.label "Adblock Plus beállítások s&amp;zinkronizálása">
+<!ENTITY whitelist.site.label "Szűrés tiltása itt: ?1?">
+<!ENTITY filters.label "Szűrő &amp;beállítások">
+<!ENTITY disable.label "Letiltás mindenhol">
+<!ENTITY objecttab.title "Blokkolás">
+<!ENTITY objecttab.tooltip "Kattintson ide a blokkoláshoz (Adblock Plus)">
+<!ENTITY menuitem.label "Ad&amp;block Plus beállítások">
+<!ENTITY objecttabs.label "&amp;Fülek megjelenítése Java és Flash objektumoknál">
+<!ENTITY sendReport.label "Hibás webhel&amp;y bejelentése">
+<!ENTITY whitelist.page.label "Szűrés tiltása csak ezen az aloldalon">
+<!ENTITY context.image.label "Kép blokkolása">
+<!ENTITY counthits.label "&amp;Szűrő találati statisztika mentése">
+<!ENTITY opensidebar.label "Blokkolható ob&amp;jektumok megjelenítése">
+<!ENTITY notification.button.close "&amp;Bezárás">
+<!ENTITY contribute.label "Közreműködés az Adblock Plus-hoz">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Keret blokkolása">
+<!ENTITY blocked.tooltip "Blokkolt objektumok ezen az oldalon:">
+<!ENTITY hideplaceholders.label "Letiltott elemek &amp;helyőrzőinek elrejtése">
+<!ENTITY showinstatusbar.label "Megje&amp;lenítés az állapotsoron">
+<!ENTITY sidebar.title "Blokkolható objektumok">
+<!ENTITY options.label "&amp;Opciók">
+<!ENTITY context.object.label "Objektum blokkolása">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Újra-engedélyezés ezen az oldalon">
+<!ENTITY filters.tooltip "Legaktívabb szűrők:">
+<!ENTITY closesidebar.label "Blokkolható ob&amp;jektumok elrejtése">
+<!ENTITY showintoolbar.label "M&amp;egjelenítés az eszköztáron">
+<!ENTITY status.tooltip "Ãllapot:">
+<!ENTITY context.media.label "Adblock Plus: videó/audió blokkolása">
+<!ENTITY subscription.update.label "Szűrők frissítése">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/sendReport.dtd
new file mode 100644
index 0000000..e9477ed
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Visszavonás">
+<!ENTITY issues.disabledgroups.description "Az alábbi szűrő listák/csoportok le vannak tiltva, de hatással lehetnének az alábbi oldalra:">
+<!ENTITY showData.label "Jelentés adatainak megtekintése">
+<!ENTITY typeSelector.falsePositive.label "Az Adblock Plus &amp;túl sok mindent letilt">
+<!ENTITY issues.change.description "A konfiguráció megváltozott. Kérem töltse újra az oldalt és próbálja ki a változásokat és csak akkor küldje el a jelentést, ha a módosítások hatására nem szűnt meg a probléma.">
+<!ENTITY email.label "&amp;Email:">
+<!ENTITY issues.openPreferences.label "Szűrő beállítások megnyitása">
+<!ENTITY sendPage.confirmation "Az Ön jelentése el lett mentve. Az alábbi címen érheti el a későbbiekben:">
+<!ENTITY copyLink.label "Jelentés &amp;címének másolása">
+<!ENTITY issues.nofilters.description "Az Adblock Plus jelenleg nem blokkol semmit az aktuális oldalon. A tapasztalt hibajelenség valószínűleg nem köthető az Adblock Plus-hoz.">
+<!ENTITY sendPage.knownIssue "Az Ön által bejelentett hiba már ismert. További információk:">
+<!ENTITY typeSelector.other.description "Válassza ezt a lehetőséget, ha Ön szerint a probléma magával az Adblock Plus-szal van és nem a szűrőkkel.">
+<!ENTITY issues.disabledgroups.enable.label "Szűrő lista/csoport engedélyezése">
+<!ENTITY typeWarning.override.label "Megértettem é&amp;s így is szeretném elküldeni a jelentést">
+<!ENTITY issues.disabled.enable.label "Az Adblock Plus engedélyezése">
+<!ENTITY update.fixed.description "A szűrőlisták frissítése nagy valószínűséggel megoldja a bejelentett hibát. Kérem frissítse az oldalt és próbálja újra, csak akkor küldjön bejelentést, ha a probléma továbbra is fennáll.">
+<!ENTITY anonymous.label "Né&amp;vtelen beküldendő">
+<!ENTITY reloadButton.label "&amp;Oldal újratöltése">
+<!ENTITY recentReports.clear.label "Az összes &amp;jelentés eltávolítása">
+<!ENTITY typeSelector.description "Ez az ablak végigvezeti az Adblock Plus hiba bejelentési lépésein. Először kérem válassza ki a webhelyen jelentkező hiba jellegét:">
+<!ENTITY screenshot.remove.label "&amp;Kényes adatok eltávolítása">
+<!ENTITY issues.ownfilters.description "Ezen az oldalon néhány alkalmazott szűrőt a felhasználó definiált. Kérem tiltsa le az alábbi szűrők közül azokat, amelyeket a problémát okozhatták.">
+<!ENTITY update.inProgress.description "Az Adblock Plusnak frissítenie kell a szűrőlistákat, hogy megbizonyosodjon róla, hogy a probléma még mindig fennáll. Kérem várjon…">
+<!ENTITY sendPage.retry.label "Újraküldés">
+<!ENTITY data.label "Jelentés a&amp;datai:">
+<!ENTITY recentReports.label "Legutóbb beküldött jelentések">
+<!ENTITY typeWarning.description "Ön azt a lehetőséget választotta, hogy a hiba az Adblock Plus-szal van és nem a szűrőkkel. Kérem vegye figyelembe, hogy az ilyen hibákat célszerűbb az [link]Adblock Plus fórumon[/link] bejelenteni. Csak akkor használja így a hibajelentőt, ha egy meglévő szálhoz szeretne hozzátenni, és a jelentésben tüntesse fel a hozzá tartozó hivatkozást is. Az automatikusan generált hivatkozás a jelentés beküldése után áll majd rendelkezésre.">
+<!ENTITY issues.disabled.description "Az Adblock Plus le van tiltva, így nem tud semmit blokkolni.">
+<!ENTITY attachExtensions.label "Engedélyezett k&amp;iterjesztések listájának csatolása, arra az esetre, ha a kiterjesztések közti ütközésekből adódik a probléma">
+<!ENTITY issues.nosubscriptions.add.label "Feliratkozás szűrőre">
+<!ENTITY issues.disabledfilters.enable.label "Szűrő engedélyezése">
+<!ENTITY issues.override.label "A kon&amp;figuráció megfelelő, bejelentés folytatása">
+<!ENTITY issues.nosubscriptions.description "Úgy tűnik, hogy nincs feliratkozva egyetlen előre elkészített szűrőlistára sem, amellyel automatikusan eltávolíthatja a nem kívánt tartalmakat a webhelyekről.">
+<!ENTITY typeSelector.falsePositive.description "Válassza ezt a lehetőséget, ha a webhelyről hiányoznak lényeges tartalmak, rosszul jelenik meg, vagy hibásan működik. Úgy bizonyosodhat meg arról, hogy az Adblock Plus okozza a problémát, ha ideiglenesen letiltja azt.">
+<!ENTITY typeSelector.other.label "E&amp;gyéb">
+<!ENTITY emailComment.label "Javasoljuk, hogy érvényes e-mail címet adjon meg, így fel tudjuk venni Önnel a kapcsolatot, ha kérdés merül fel a jelentésével kapcsolatban. Ezzel azt is lehetővé teszi, hogy felismerjük az Ön hozzájárulásait, és azok magasabb prioritást kapjanak.">
+<!ENTITY issues.whitelist.remove.label "Adblock Plus újraengedélyezése az oldalon">
+<!ENTITY outdatedSubscriptions.description "Az alábbi szűrőlistákat legalább két hete nem frissítette. Kérem frissítse a listákat mielőtt jelentést küld róluk, lehetséges, hogy a probléma időközben megoldódott.">
+<!ENTITY dataCollector.description "Kérem várjon pár pillanatot, amíg az Adblock Plus összegyűjti a szükséges adatokat.">
+<!ENTITY sendButton.label "Jelentés &amp;küldése">
+<!ENTITY comment.label "&amp;Megjegyzés (nem kötelező):">
+<!ENTITY sendPage.errorMessage "A jelentés elküldése közben hiba történt, melynek kódja: &quot;?1?&quot;. Kérem ellenőrizze, hogy megfelelően csatlakozik-e az Internethez és próbálja újra. Ha a probléma nem szűnik meg, kérem kérjen segítséget az [link]Adblock Plus fórumon[/link].">
+<!ENTITY showRecentReports.label "Legutóbb beküldött jelentések">
+<!ENTITY commentPage.heading "Megjegyzés hozzáadása">
+<!ENTITY update.start.label "Frissítés most">
+<!ENTITY issues.disabledfilters.description "Az alábbi szűrők le vannak tiltva, de hatással lehetnének az oldalra:">
+<!ENTITY screenshot.description "Ugyanaz az oldal máshogy is kinézhet mások számítógépén. Segíthet a probléma megoldásában, ha csatol egy képernyőképet a jelentéshez. A képről eltávolíthatja a kényes információt tartalmazó részeket, valamint kiemelheti a problémás területeket. Ehhez nyomja meg a megfelelő gombot és jelölje ki az adott területet az egérrel.">
+<!ENTITY screenshot.attach.label "Oldal képének &amp;csatolása a jelentéshez">
+<!ENTITY issues.whitelist.description "Az Adblock Plus jelenleg le van tiltva az oldalon, amelyet be szeretne jelenteni. Kérem engedélyezze újra a bejelentés előtt, hogy több segédinformáció álljon rendelkezésre a hiba kivizsgálásánál.">
+<!ENTITY typeSelector.falseNegative.label "Az Adblock Plus nem tiltott le egy hi&amp;rdetést">
+<!ENTITY typeSelector.heading "Vállasszon típust">
+<!ENTITY anonymity.warning "Nem fogunk tudni kapcsolatba lépni Önnel, és valószínű, hogy a jelentése alacsonyabb prioritást kap.">
+<!ENTITY wizard.title "Hibajelentő">
+<!ENTITY issues.ownfilters.disable.label "Szűrő letiltása">
+<!ENTITY commentPage.description "Az alábbi szöveges mezőbe beírhat egy megjegyzést, ami segíthet megérteni a problémát. Ez a lépés kihagyható, de ajánlott, ha a probléma nem egyértelmű. A jelentés elküldése előtt még lesz lehetősége átnézni a megadott adatokat.">
+<!ENTITY comment.lengthWarning "A megjegyzés hossza meghaladja az 1000 karaktert. Csak az első 1000 karakter lesz elküldve.">
+<!ENTITY typeSelector.falseNegative.description "Válassza ezt a lehetőséget, ha hirdetések jelennek meg az oldalon annak ellenére, hogy az Adblock Plus engedélyezve van.">
+<!ENTITY sendPage.waitMessage "Kérem várjon, amíg az Adblock Plus elküldi a jelentését.">
+<!ENTITY dataCollector.heading "Üdvözli a hibajelentő">
+<!ENTITY screenshot.heading "Képernyőkép csatolása">
+<!ENTITY sendPage.heading "Jelentés küldése">
+<!ENTITY issues.subscriptionCount.description "Úgy tűnik, hogy túl sok szűrőre van feliratkozva. Ez azért nem ajánlott, mivel ilyenkor gyakrabban fordulnak elő problémák. Emiatt nem fogadhatjuk el a hiba bejelentését, mivel nem tisztázott, hogy melyik szűrő készítőjének kell továbbítani. Kérem távolítsa el azokat a szűrőket, amelyek nem feltétlenül szükségesek és próbálja meg újra előidézni a hibajelenséget.">
+<!ENTITY screenshot.mark.label "&amp;Problémás rész jelölése">
+<!ENTITY privacyPolicy.label "Adatvédelmi elvek">
+<!ENTITY issues.description "Az Adblock Plus konfigurációs problémákat észlelt, amelyek okozhatják a bejelentendő hibát vagy megnehezíthetik a bejelentés elküldését.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/sidebar.dtd
new file mode 100644
index 0000000..4446fff
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Objektum széleinek villogtatása">
+<!ENTITY address.label "Cím">
+<!ENTITY context.open.label "Megnyitás új fülön">
+<!ENTITY type.label "Típus">
+<!ENTITY tooltip.filterSource.label "Szűrő forrása:">
+<!ENTITY noitems.label "Nincs blokkolható objektum">
+<!ENTITY filter.label "Szűrő">
+<!ENTITY tooltip.size.label "Méret:">
+<!ENTITY reattach.label "Oldalsávba">
+<!ENTITY search.label "&amp;Keresés:">
+<!ENTITY docDomain.thirdParty "(3. fél)">
+<!ENTITY filterSource.label "Szűrő forrása">
+<!ENTITY tooltip.docDomain.label "Dokumentum forrás:">
+<!ENTITY context.copy.label "Objektum címének másolása">
+<!ENTITY tooltip.type.label "Típus:">
+<!ENTITY context.disablefilter.label "Szűrő letiltása ?1?">
+<!ENTITY context.copyFilter.label "Szűrő másolása">
+<!ENTITY context.block.label "Objektum blokkolása">
+<!ENTITY context.enablefilter.label "Szűrő engedélyezése ?1?">
+<!ENTITY detach.label "Leválaszt">
+<!ENTITY whitelisted.label "A cím 'fehér listán' van">
+<!ENTITY context.disablefilteronsite.label "Szűrő letiltása itt: ?1?">
+<!ENTITY detached.title "Adblock Plus: Blokkolható objektumok (leválasztva)">
+<!ENTITY docDomain.firstParty "(első fél)">
+<!ENTITY tooltip.type.whitelisted "(fehér listán)">
+<!ENTITY tooltip.filter.label "Alkalmazott szűrők:">
+<!ENTITY tooltip.filter.disabled "(letiltva)">
+<!ENTITY context.editfilter.label "Alkalmazott szűrő szerkesztése">
+<!ENTITY tooltip.type.blocked "(blokkolva)">
+<!ENTITY size.label "Méret">
+<!ENTITY context.whitelist.label "Kivétel megadása objektumhoz">
+<!ENTITY context.selectAll.label "Minden kijelölése">
+<!ENTITY state.label "Ãllapot">
+<!ENTITY docDomain.label "Dokumentum forrás">
+<!ENTITY tooltip.address.label "Cím:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/subscriptionSelection.dtd
new file mode 100644
index 0000000..435a5fd
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hu/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Szűrő &amp;hozzáadása: &quot;?1?&quot;">
+<!ENTITY list.download.failed "Hiba a szűrők betöltésekor.">
+<!ENTITY list.download.retry "Próbálja újra">
+<!ENTITY title.label "Külső szűrő &amp;neve:">
+<!ENTITY list.download.website "Weboldal megtekintése">
+<!ENTITY supplementMessage "Ez a szűrő a(z) &quot;?1?&quot; szűrővel együtt használható csak, amely jelenleg nincs a szűrőkhöz hozzáadva.">
+<!ENTITY viewList.label "Szűrők megtekintése">
+<!ENTITY visitHomepage.label "Honlap meglátogatása">
+<!ENTITY addSubscription.label "Szűrő hozzáadása">
+<!ENTITY dialog.title "Adblock Plus szűrő felvétele">
+<!ENTITY location.label "Szűrőlista &amp;címe:">
+<!ENTITY fromWeb.description "Kérem erősítse meg a szűrő hozzáadását. Módosíthatja a szűrő címét és helyét a hozzáadás előtt.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/composer.dtd
new file mode 100644
index 0000000..8fc62bb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "Õ°Õ¡Õ½ÖÕ¥Õ« &amp;Õ¾Õ¥Ö€Õ»Õ¸Ö‚Õ´">
+<!ENTITY domainRestriction.label "Ô±Ö€Õ£Õ¥Õ¬Õ¥Õ¬ &amp;Õ¤Õ¸Õ´Õ¥ÕµÕ¶Õ¸Ö‚Õ´`">
+<!ENTITY collapse.default.no.label "Ô¼Õ¼Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ (Õ¸Õ¹)">
+<!ENTITY firstParty.label "Õ„Õ«Õ¡ÕµÕ¶ &amp;Õ°Õ«Õ´Õ¶Õ¡Õ¯Õ¡Õ¶">
+<!ENTITY preferences.label "Õ†Õ¡ÕµÕ¥Õ¬ Õ¡&amp;Õ¼Õ¯Õ¡ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨...">
+<!ENTITY pattern.label "ÕˆÖ€Õ¸Õ¶Õ¥Õ¬ Õ·Õ¡Õ¢Õ¬Õ¸Õ¶">
+<!ENTITY thirdParty.label "Õ„Õ«Õ¡ÕµÕ¶ &amp;Õ¥Ö€Ö€Õ¸Ö€Õ¤ Õ¯Õ¸Õ²Õ´Õ«Ö">
+<!ENTITY filter.label "Õ†Õ¸Ö€ &amp;Õ–Õ«Õ¬Õ¿Ö€.">
+<!ENTITY collapse.label "Ô¹Õ¡Ö„ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¾Õ¡&amp;Õ®Õ¶Õ¥Ö€Õ¨`">
+<!ENTITY match.warning "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¾Õ¡Õ® Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ¨ Õ¡ÕµÕ¬Ö‡Õ½ Õ¹Õ« Õ°Õ¡Õ´Õ¡ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶Õ¸Ö‚Õ´ Õ°Õ¡Õ½ÖÕ¥Õ«Õ¶ Ö‡ Õ¸Õ¹ Õ´Õ« Õ¡Õ¦Õ¤Õ¥ÖÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¹Õ« Õ¸Ö‚Õ¶Õ¥Õ¶Õ¡Õ¬Õ¸Ö‚.">
+<!ENTITY anchor.start.label "Õ°Õ¡&amp;Õ½ÖÕ¥Õ« Õ½Õ¯Õ¦Õ¢Õ¸Ö‚Õ´">
+<!ENTITY matchCase.label "Õ€Õ¡Õ·Õ¾Õ« Õ¡Õ¼Õ¶Õ¥Õ¬ &amp;Õ¿Õ¡Õ¼Õ¡Õ¿Õ¥Õ½Õ¡Õ¯Õ¨">
+<!ENTITY custom.pattern.label "ÕÕ¥&amp;ÖƒÕ¡Õ¯Õ¡Õ¶.">
+<!ENTITY unselectAllTypes.label "Õ‰Õ¨Õ¶Õ¿Ö€Õ¥Õ¬ Õ¸Õ¹Õ«Õ¶Õ¹">
+<!ENTITY type.whitelist.label "Ô²Õ¡&amp;ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶">
+<!ENTITY regexp.warning "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¾Õ¡Õ® Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ¨ Õ¨Õ¶Õ¯Õ¡Õ¬Õ¾Õ¥Õ¬Õ¸Ö‚ Õ§ Õ¸Ö€ÕºÕ¥Õ½ Õ¼Õ¥Õ£Õ¸Ö‚Õ¬ÕµÕ¡Ö€ Õ¡Ö€Õ¿Õ¡Õ°Õ¡ÕµÕ¿Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶(regexp): Ռեգուլյար Õ¡Ö€Õ¿Õ¡Õ°Õ¡ÕµÕ¿Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« Õ´Õ¥Õ® Ö„Õ¡Õ¶Õ¡Õ¯Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¤Õ¡Õ¶Õ¤Õ¡Õ²Õ¥ÖÕ¶Õ¥Õ¬ Õ®Ö€Õ¡Õ£Ö€Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨: ÔµÕ©Õ¥ Õ¤Õ¸Ö‚Ö„ Õ¹Õ¥Ö„ ÕºÕ¡Õ¿Ö€Õ¡Õ½Õ¿Õ¾Õ¸Ö‚Õ´ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¼Õ¥Õ£Õ¸Ö‚Õ¬ÕµÕ¡Ö€ Õ¡Ö€Õ¿Õ¡Õ°Õ¡ÕµÕ¿Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶, Õ¡Õ¾Õ¥Õ¬Õ¡ÖÖ€Õ¥Ö„ * Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ« Õ¾Õ¥Ö€Õ»Õ¸Ö‚Õ´:">
+<!ENTITY dialog.title "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ «Adblock Plus» Ö†Õ«Õ¬Õ¿Ö€Õ´Õ¡Õ¶ Õ¯Õ¡Õ¶Õ¸Õ¶">
+<!ENTITY basic.label "ÕŠÕ¡Ö€Õ¦ Õ¿Õ¥Õ½Ö„">
+<!ENTITY type.filter.label "&amp;Ô±Ö€Õ£Õ¥Õ¬Õ¸Õ² Ö†Õ«Õ¬Õ¿Ö€">
+<!ENTITY types.label "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ Õ¿Õ«ÕºÕ¥Ö€Õ«Õ¶`">
+<!ENTITY shortpattern.warning "Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¾Õ¡Õ® Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ¨ Õ·Õ¡Õ¿ Õ¯Õ¡Ö€Õ³ Õ§ Õ¸Ö‚ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Ö…ÕºÕ¿Õ«Õ´Õ«Õ¦Õ¡ÖÕ¾Õ¥Õ¬, Õ¡ÕµÕ½ÕºÕ«Õ½Õ« Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ¶Õ¥Ö€Õ« Õ´Õ¥Õ® Ö„Õ¡Õ¶Õ¡Õ¯Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¤Õ¡Õ¶Õ¤Õ¡Õ²Õ¥ÖÕ¶Õ¥Õ¬ Õ®Ö€Õ¡Õ£Ö€Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨: Ô½Õ¸Ö€Õ°Õ¸Ö‚Ö€Õ¤ Õ§ Õ¿Ö€Õ¾Õ¸Ö‚Õ´ Ö†Õ«Õ¬Õ¿Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¡Õ¾Õ¥Õ¬Õ« Õ¥Ö€Õ¯Õ¡Ö€ Õ¿Õ¸Õ²:">
+<!ENTITY collapse.yes.label "Ô±ÕµÕ¸">
+<!ENTITY anchors.label "Õ‡Õ¡Õ¢Õ¬Õ¸Õ¶Õ¶Õ¥Ö€Õ¶ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ¥Õ¬ Õ´Õ«Õ¡ÕµÕ¶.">
+<!ENTITY collapse.default.yes.label "Ô¼Õ¼Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢ (Õ¡ÕµÕ¸)">
+<!ENTITY domainRestriction.help "ÕÕ¡Õ°Õ´Õ¡Õ¶Õ¥Ö„ Õ´Õ¥Õ¯ Õ¯Õ¡Õ´ Õ¡Õ¾Õ¥Õ¬ Õ¤Õ¸Õ´Õ¥ÕµÕ¶Õ¥Ö€ Õ¢Õ¡ÕªÕ¡Õ¶Õ¾Õ¡Õ® &quot;|&quot; Õ¶Õ·Õ¡Õ¶Õ¸Õ¾, Ö†Õ«Õ¬Õ¿Ö€Õ¨ Õ¯Õ¡Õ·Õ­Õ¡Õ¿Õ« Õ´Õ«Õ¡ÕµÕ¶ Õ¡ÕµÕ¤ Õ¤Õ¸Õ´Õ¥ÕµÕ¶Õ¥Ö€Õ¸Ö‚Õ´: Ô´Õ¸Õ´Õ¥ÕµÕ¶Õ« Õ¡Õ¶Õ¾Õ¡Õ¶ Õ¡Õ¼Õ¡Õ» &quot;~&quot; Õ¶Õ·Õ¡Õ¶Õ¨ Õ¡Ö€Õ£Õ¥Õ¬Õ¸Ö‚Õ´ Õ§ Ö†Õ«Õ¬Õ¿Ö€Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´Õ¨ Õ¡ÕµÕ¤ Õ¤Õ¸Õ´Õ¥ÕµÕ¶Õ¸Ö‚Õ´:">
+<!ENTITY accept.label "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€">
+<!ENTITY options.label "Ô¸Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€">
+<!ENTITY disabled.warning "«Adblock Plus»ը Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§: Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€, Õ¢Õ¡ÕµÖ Õ¤Ö€Õ¡Õ¶Ö Õ£Õ¸Ö€Õ®Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ ÕºÕ¥Õ¿Ö„ Õ§ [link]Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ «Adblock Plus»ը[/link]:">
+<!ENTITY anchor.start.flexible.label "Õ¤Õ¸Õ´Õ¥ÕµÕ¶Õ« Õ¡Õ¶Õ¾Õ¡Õ¶ &amp;Õ½Õ¯Õ¦Õ¢Õ¸Ö‚Õ´">
+<!ENTITY collapse.no.label "ÕˆÕ¹">
+<!ENTITY selectAllTypes.label "Ô¼Ö€Õ«Õ¾ Ô¸Õ¶Õ¿Ö€Õ¥Õ¬">
+<!ENTITY advanced.label "Ô¸Õ¶Õ¤Õ¬Õ¡ÕµÕ¶Õ¾Õ¡Õ® Õ¿Õ¥Õ½Ö„">
+<!ENTITY pattern.explanation "Õ†Õ´Õ¸Ö‚Õ·Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¬Õ«Õ¶Õ¥Õ¬ Õ°Õ¡Õ½ÖÕ¥Õ« ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ´Õ¡Õ½, *-Õ¨ Õ¶Õ·Õ¡Õ¶Õ¡Õ¯Õ¸Ö‚Õ´ Õ§ ÖÕ¡Õ¶Õ¯Õ¡ÖÕ¡Õ® Õ½Õ«Õ´Õ¾Õ¸Õ¬: Ô¿Ö†Õ«Õ¬Õ¿Ö€Õ¾Õ¥Õ¶ Õ´Õ«Õ¡ÕµÕ¶ Õ¶Õ´Õ¸Ö‚Õ·Õ«Õ¶ Õ¢Õ¡Õ¾Õ¡Ö€Õ¡Ö€Õ¸Õ² Õ°Õ¡Õ½ÖÕ¥Õ¶Õ¥Ö€Õ¨:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/filters.dtd
new file mode 100644
index 0000000..f098c8f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Ô²Õ¸Õ¬Õ¸Ö€ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨ Õ¯ÖƒÕ¸Õ­Õ¡Ö€Õ«Õ¶Õ¾Õ¥Õ¶ Õ¶Õ¸Ö€Õ¥Ö€Õ¸Õ¾:Õ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸ÕžÖ‚Õ´ Õ¥Ö„ Õ¯Õ«Ö€Õ¡Õ¼Õ¥Õ¬:">
+<!ENTITY slow.column "Ô´Õ¡Õ¶Õ¤Õ¡Õ² Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€ (&amp;w)">
+<!ENTITY enabled.column "&amp;Õ„Õ«Õ¡ÖÕ¡Õ® Õ§">
+<!ENTITY subscription.lastDownload.checksumMismatch "Ô±Õ¶Õ°Õ¡Õ»Õ¸Õ².">
+<!ENTITY noFiltersInGroup.text "Ô¸Õ¶Õ¿Ö€Õ¾Õ¡Õ® Õ­Õ¸Ö‚Õ´Õ¢Õ¨ Õ¤Õ¡Õ¿Õ¡Ö€Õ¯ Õ§:">
+<!ENTITY subscription.actions.label "Ô³Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€">
+<!ENTITY filter.selectAll.label "Õ†Õ·Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€Õ¨">
+<!ENTITY backupButton.label "ÕŠÕ¡Õ°Õ¸Ö‚Õ½Õ¿ Ö‡ ÕŽÕ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¸Ö‚Õ´ (&amp;B)">
+<!ENTITY restore.minVersion.warning "ÕˆÖ‚Õ·Õ¡Õ¤Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶:Õ–Õ¡ÕµÕ¬Õ¨ Õ½Õ¿Õ¥Õ²Õ·Õ¾Õ¥Õ¬ Õ§ Õ¡Õ¾Õ¥Õ¬Õ« Õ¶Õ¸Ö€ Adblock Plus-Õ« Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¸Õ¾:Ô¹Õ¡Ö€Õ´Õ¡ÖÖ€Õ¥Õ›Ö„ Adblock Plus-Õ¨Õ Õ¡ÕµÕ¤ Ö†Õ¡ÕµÕ¬Õ«Ö Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:">
+<!ENTITY restore.error "Ô±Õ¶Õ°Õ¡Õ¶Õ¡Ö€ Õ§ Õ¾Õ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬:Õ€Õ¶Õ¡Ö€Õ¡Õ¾Õ¸ÕžÖ€ Õ§, Õ¸Ö€ Õ¤Õ¡ Adblock Plus-Õ« Õ¡Ö€Õ­Õ«Õ¾ Õ¹Õ§:">
+<!ENTITY sort.ascending.label "&amp;Ô± &gt; Õ– Õ¯Õ¡Ö€Õ£Õ¸Õ¾">
+<!ENTITY sort.label "&amp;Ô´Õ¡Õ½Õ¡Õ¾Õ¸Ö€Õ¥Õ¬">
+<!ENTITY subscription.source.label "Õ–Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« ÖÕ¸Ö‚ÖÕ¡Õ¯">
+<!ENTITY hitcount.column "Ô±Õ¦Õ¤ (&amp;Õ€)">
+<!ENTITY noFilters.text "Ô´Õ¸Ö‚Ö„ Õ¤Õ¥Õ¼Ö‡Õ½ Õ¹Õ¸Ö‚Õ¶Õ¥Ö„ Õ¸Ö€Ö‡Õ§ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶ Ö†Õ«Õ¬Õ¿Ö€:">
+<!ENTITY backup.custom.title "Õ„Õ«Õ¡ÕµÕ¶ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨">
+<!ENTITY subscription.external.label "Ô¹Õ¡Ö€Õ´Õ¡ÖÕ¾Õ¥Ö Õ¡ÕµÕ¬ Õ°Õ¡Õ¾Õ¥Õ¬Õ¾Õ¡Õ®Õ« Õ¯Õ¸Õ²Õ´Õ«Ö">
+<!ENTITY subscription.delete.label "Õ‹Õ¶Õ»Õ¥Õ¬">
+<!ENTITY noGroupSelected.text "ÕŠÕ«Õ¿Õ« Õ¨Õ¶Õ¿Ö€Õ¥Ö„ Ö†Õ¡Õ«Õ¬Õ¿Ö€Õ« Õ­Õ¸Ö‚Õ´Õ¢Õ Õ¡ÕµÕ¶ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬Õ¸Ö‚Ö Õ¡Õ¼Õ¡Õ»:">
+<!ENTITY filter.cut.label "Ô¿Õ¿Ö€Õ¥Õ¬">
+<!ENTITY restore.default.label "ÕŽÕ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬ ?1?-Õ« ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿Õ¨">
+<!ENTITY subscription.lastDownload.inProgress "Ô²Õ¥Õ¼Õ¶Õ¸Ö‚Õ´...">
+<!ENTITY subscriptions.tab.label "Ô²Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¾Õ¡Õ® Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€">
+<!ENTITY sort.descending.label "&amp;Õ– &gt; Ô± Õ¯Õ¡Ö€Õ£Õ¸Õ¾">
+<!ENTITY filters.remove.warning "Ô±Ö€Õ¤ÕµÕ¸ÕžÖ„ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ»Õ¶Õ»Õ¥Õ¬ Õ¶Õ·Õ¾Õ¡Õ® Õ¾Õ¸Õ¬Õ¸Ö€ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨:">
+<!ENTITY filter.delete.label "Õ‹Õ¶Õ»Õ¥Õ¬">
+<!ENTITY addSubscriptionAdd.label "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬">
+<!ENTITY viewMenu.label "ÕÕ¥Õ½Ö„">
+<!ENTITY subscription.lastDownload.unknown "Õ‰Ô¿Ô±">
+<!ENTITY addSubscriptionCancel.label "Õ‰Õ¥Õ²Õ¡Ö€Õ¯Õ¥Õ¬">
+<!ENTITY subscription.enabled.label "Õ„Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§">
+<!ENTITY noSubscriptions.text "Ô´Õ¸Ö‚Ö„ Õ¤Õ¥Õ¼Ö‡Õ½ Õ¹Õ¥Ö„ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¾Õ¥Õ¬ Õ¸Ö€Ö‡Õ§ Ö†Õ«Õ¬Õ¿Ö€Õ«: Adblock Plus-Õ¨ Õ¸Õ¹Õ«Õ¶Õ¹ Õ¹Õ« Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ« Õ¡Õ¼Õ¡Õ¶Ö Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ«, Õ¡ÕµÕ¤ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¸Õ¾ Õ­Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¯Õ«Ö€Õ¡Õ¼Õ¥Õ¬ «ԱվելաÖÕ¶Õ¥Õ¬ բաժանորդագրություն» Õ¯Õ¸Õ³Õ¡Õ¯Õ¨:">
+<!ENTITY subscription.update.label "Ô¹Õ¡Ö€Õ´Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨">
+<!ENTITY dialog.title "Adblock Plus Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¥Ö‚Õ´">
+<!ENTITY addFilter.label "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ–Õ«Õ¬Õ¿Ö€ (&amp;d)">
+<!ENTITY subscription.minVersion.warning "Ô±ÕµÕ½ Ö†Õ«Õ¬Õ¿Ö€Õ«Õ¶ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¾Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Õ§ Adblock Plus-Õ« Õ¡Õ¾Õ¥Õ¬Õ« Õ¶Õ¸Ö€ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¨, Õ¤Õ¸Ö‚Ö„ ÕºÕ¥Õ¿Ö„ Õ§ Õ©Õ¡Ö€Õ´Õ¡ÖÕ¶Õ¥Ö„ Adblock Plus-Õ¨:">
+<!ENTITY subscription.lastDownload.invalidURL "Ô±Õ¶Õ°Õ¡Õ»Õ¸Õ². ÕÕ­Õ¡Õ¬ Õ°Õ¡Õ½ÖÕ¥">
+<!ENTITY backup.error "Ô±Õ¶Õ°Õ¡Õ¶Õ¡Ö€ Õ§ ÕºÕ¡Õ°Õ¥Õ¬ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨:Õ€Õ¡Õ´Õ¸Õ¦Õ¾Õ¥Õ›Ö„, Õ¸Ö€ Ö†Õ¡ÕµÕ¬Õ¨ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ§ ÖƒÕ¸Õ­Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¹Õ« Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¾Õ¸Ö‚Õ´ Õ¡ÕµÕ¬ Õ®Ö€Õ¡Õ£Ö€Õ« Õ¯Õ¸Õ²Õ´Õ«Ö:">
+<!ENTITY filter.moveUp.label "Ô²Õ¡Ö€Õ±Ö€Õ¡ÖÕ¶Õ¥Õ¬ Õ¾Õ¥Ö€Ö‡">
+<!ENTITY addGroup.label "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ­Õ¸Ö‚Õ´Õ¢">
+<!ENTITY filter.edit.label "Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬">
+<!ENTITY subscription.showHideFilters.label "Õ‘Õ¸Ö‚ÖÕ¡Õ¤Ö€Õ¥Õ¬/Ô¹Õ¡Ö„ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨">
+<!ENTITY acceptableAds2.label "Ô¹Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¥Õ¬ Õ¸Ö€Õ¸Õ· Õ¹Õ¯ÕºÕ¹Õ¸Ö‚Õ¶ Õ£Õ¸Õ¾Õ¡Õ¦Õ¤ (&amp;!)">
+<!ENTITY addSubscriptionOther.label "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¡ÕµÕ¬ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶">
+<!ENTITY close.label "Õ“Õ¡Õ¯Õ¥Õ¬">
+<!ENTITY sort.none.label "Ô±&amp;Õ¶Õ¯Õ¡Õ¶Õ¸Õ¶">
+<!ENTITY filter.actions.label "Ô³Õ¸Ö€Õ®Õ¸Õ²Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ°Õ¥Õ¿">
+<!ENTITY filter.copy.label "Ô¿Ö€Õ¯Õ¶Õ¥Õ¬">
+<!ENTITY filter.moveDown.label "Ô²Õ¡Ö€Õ±Ö€Õ¡ÖÕ¶Õ¥Õ¬ Õ¶Õ¥Ö€Ö„Ö‡">
+<!ENTITY filter.resetHitCounts.label "Õ‹Õ¶Õ»Õ¥Õ¬ Õ½Õ¿Õ¡Õ¿Õ«Õ½Õ¿Õ«Õ¯Õ¡Õ¶">
+<!ENTITY readMore.label "ÕÕ¥Õ²Õ¥Õ¯Õ¡Õ¶Õ¡Õ¬ Õ¡Õ¾Õ¥Õ¬Õ«Õ¶">
+<!ENTITY subscription.moveUp.label "Ô²Õ¡Ö€Õ±Ö€Õ¡ÖÕ¶Õ¥Õ¬ Õ¾Õ¥Ö€Ö‡">
+<!ENTITY addSubscription.label "Ô²Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¾Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« (&amp;f)">
+<!ENTITY subscription.homepage.label "Õ¿Õ¶Õ§Õ»">
+<!ENTITY backup.complete.title "Ô²Õ¸Õ¬Õ¸Ö€ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨ Ö‡ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨">
+<!ENTITY restore.own.label "ÕŽÕ¥Ö€Õ¡Õ¯Õ¡Õ¶Õ£Õ¶Õ¥Õ¬ Õ½Õ¥ÖƒÕ¡Õ¯Õ¡Õ¶ Õ¡Ö€Õ­Õ«Õ¾Õ¨">
+<!ENTITY restore.complete.warning "Ô²Õ¸Õ¬Õ¸Ö€ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨ Õ¯ÖƒÕ¸Õ­Õ¡Ö€Õ«Õ¶Õ¾Õ¥Õ¶ Õ¶Õ¸Ö€Õ¥Ö€Õ¸Õ¾:Õ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸ÕžÖ‚Õ´ Õ¥Ö„ Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬:">
+<!ENTITY filters.tab.label "ÕÕ¥ÖƒÕ¡Õ¯Õ¡Õ¶ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€">
+<!ENTITY backup.label "ÕÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¶Õ¸Ö€ ÕºÕ¡Õ°Õ¸Ö‚Õ½Õ¿">
+<!ENTITY find.label "Õ“Õ¶Õ¿Ö€Õ¥Õ¬ (&amp;n)">
+<!ENTITY subscription.moveDown.label "Ô»Õ»Õ¡ÖÕ¶Õ¥Õ¬ Õ¶Õ¥Ö€Ö‡">
+<!ENTITY subscription.lastDownload.connectionError "Ô±Õ¶Õ°Õ¡Õ»Õ¸Õ². Ô²Õ¥Õ¼Õ¶Õ´Õ¡Õ¶ Õ½Õ­Õ¡Õ¬">
+<!ENTITY subscription.lastDownload.success "Õ€Õ¡Õ»Õ¸Õ²">
+<!ENTITY subscription.lastDownload.invalidData "Ô±Õ¶Õ°Õ¡Õ»Õ¸Õ². ÕÕ­Õ¡Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« ÖÕ¸Ö‚ÖÕ¡Õ¯">
+<!ENTITY filter.paste.label "ÕÕ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬">
+<!ENTITY subscription.disabledFilters.enable "Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨">
+<!ENTITY lasthit.column "ÕŽÕ¥Ö€&amp;Õ»Õ«Õ¶Õ¨">
+<!ENTITY subscription.editTitle.label "Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬ Õ¡Õ¶Õ¾Õ¡Õ¶Õ¸Ö‚Õ´Õ¨">
+<!ENTITY subscription.disabledFilters.warning "Ô±ÕµÕ½ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¸Ö€Õ¸Õ· Ö†Õ«Õ¬Õ¿Õ¶Õ¥Ö€ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ¥Õ¶:">
+<!ENTITY filter.column "Õ–Õ«&amp;Õ¬Õ¿Ö€">
+<!ENTITY subscription.lastDownload.label "ÕŽÕ¥Ö€Õ»Õ«Õ¶ Õ¢Õ¥Õ¼Õ¶Õ¸Ö‚Õ´.">
+<!ENTITY viewList.label "Ô´Õ«Õ¿Õ¥Õ¬ ÖÕ¡Õ¶Õ¯Õ¨">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/firstRun.properties
new file mode 100644
index 0000000..6206ba5
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Ô±ÕµÖÕ¥Õ¬Õ¥Ö„ Õ«Õ¶Õ¿Õ¥Ö€Õ¶Õ¥Õ¿ Õ¡Õ¶Õ¡Õ¶Õ¸Ö‚Õ¶Õ Õ©Õ¡Ö„ÖÕ¶Õ¥Õ¬Õ¸Õ¾ ÕÕ¥Ö€ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨, Õ¸Ö€Õ¸Õ¶ÖÕ«Ö Ö…Õ£Õ¿Õ¾Õ¸Ö‚Õ´ Õ¥Õ¶ Õ¸Ö€Õ¸Õ· Õ¯Õ¡Õ¦Õ´Õ¡Õ¯Õ¥Ö€ÕºÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Ö‰
+firstRun_toggle_off=Ô±Õ†Õ‹
+firstRun_feature_tracking=Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ©Ö€Õ¥Ö„Õ«Õ¶Õ£Õ¨
+firstRun_feature_malware=ÕŽÕ«Ö€Õ¸Ö‚Õ½Õ« Õ¡Ö€Õ£Õ¥Õ¬Õ¸Ö‚Õ´
+firstRun_title=ÕŽÕ¥Ö€Õ»! Õ¯Õ¡Ö€Õ¸Õ² Õ§Ö„ Ö…Õ£Õ¿Õ¾Õ¥Õ¬ Adblock-Õ«Ö
+firstRun_acceptableAdsExplanation=Õ„Õ¥Õ¶Ö„ Õ©Õ¸Ö‚ÕµÕ¬Õ¡Õ¿Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ <a>Õ¸Ö€Õ¸Õ· Õ¯Õ¡ÕµÖ„Õ¥Ö€Õ«</a> Õ£Õ¸Õ¾Õ¡Õ¦Õ¤Õ¨, Õ¸Ö€Õ¸Õ¾Õ°Õ¥Õ¿Ö‡ Õ£Õ«Õ¿Õ¥Õ¶Ö„, Õ¸Ö€ Õ¶Ö€Õ¡Õ¶Ö„ Õ°Õ¡Õ³Õ¥Õ¬Õ« Õ£Õ¸Õ¾Õ¡Õ¦Õ¤ Õ¥Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´Ö‰ ÔµÕ©Õ¥ Ô´Õ¸Ö‚Ö„ Õ¹Õ¥Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¤Ö€Õ¡Õ¶Ö„ Õ¿Õ¥Õ½Õ¶Õ¥Õ¬, Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ <a>Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬</a> Õ¤Ö€Õ¡Õ¶Ö„ Õ·Õ¡Õ¿ Õ°Õ¥Õ·Õ¿Ö‰
+firstRun_toggle_on=Õ„Ô»Ô±Õ‘
+firstRun_contributor_credits=Ô¾Ö€Õ¡Õ£Ö€Õ« Õ°Õ¥Õ²Õ«Õ¶Õ¡Õ¯Õ¶Õ¥Ö€Õ¨
+firstRun_dataCorruptionWarning=Ô±Ö€Õ¤ÕµÕ¸Ö„ Õ¡ÕµÕ½ Õ§Õ»Õ¨ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¾Õ¸Ö‚Õ´ Õ§? <a>ÕÕ¥Õ²Õ´Õ¥Ö„ Õ¡ÕµÕ½Õ¿Õ¥Õ²!</a>
+firstRun_acceptableAdsHeadline=ÕŽÕ¡Õ¿ Õ£Õ¸Õ¾Õ¡Õ¦Õ¤Õ¶Õ¥Ö€Õ¶ Õ¡ÕµÕªÕ´ Õ¡Ö€Õ£Õ¥Õ¬Õ¾Õ¡Õ® Õ¥Õ¶
+firstRun_share=ÕŠÕ¡Õ¿Õ´Õ¥Ö„ Õ¨Õ¶Õ¯Õ¥Ö€Õ¶Õ¥Ö€Õ«Õ¶
+firstRun_share_headline=<a>Õ„Õ¥Õ¦ Ö…Õ£Õ¶Õ¥Ö„</a> Õ¤Õ¡Ö€Õ±Õ¶Õ¥Õ¬Õ¸Ö‚ Õ«Õ¶Õ¿Õ¥Ö€Õ¶Õ¥Õ¿Õ¶ Õ¡Õ¾Õ¥Õ¬Õ« Õ¬Õ¡Õ¾ Õ¾Õ¡ÕµÖ€
+firstRun_features=Adblock Plus Õ¡Õ¾Õ¥Õ¬Õ«Õ¶ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¡Õ¶Õ¥Õ¬
+firstRun_feature_malware_description=Ô±Õ¶Õ¾Õ¿Õ¡Õ¶Õ£ Õ¤Õ¡Ö€Õ±Õ¶Õ¥Õ¬ ÕÕ¥Ö€ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£Õ«Õ¹Õ¶ Õ¡Ö€Õ£Õ¥Õ¬Õ¥Õ¬Õ¸Õ¾ Õ¾Õ«Ö€Õ¸Ö‚Õ½-Õ¤Õ¸Õ´Õ¥Õ¶Õ¶Õ¥Ö€Õ¨Ö‰
+firstRun_feature_social_description=Ô±Õ¾Õ¿Õ¸Õ´Õ¡Õ¿ Õ¡Ö€Õ¡Õ£Õ¡ÖÕ¶Õ¥Õ¬ Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨ Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¥Õ¬Õ¸Õ¾ Õ½Õ¸Ö․ ÖÕ¡Õ¶ÖÕ¥Ö€Õ« Õ¯Õ¸Õ³Õ¡Õ¯Õ¶Õ¥Ö€Õ¨, Ö…Ö€Õ«Õ¶Õ¡Õ¯Õ Facebook Like, Õ¸Ö€Õ¨ Õ£Õ¡Õ¬Õ«Õ½ Õ§ Õ¯Õ¡ÕµÖ„Õ¥Ö€Õ¸Ö‚Õ´ Ö‡ Õ°Õ¥Õ¿Ö‡Õ¸Ö‚Õ´ ÕÕ¥Õ¦Ö‰
+firstRun_donate=Õ¶Õ¾Õ«Ö€Õ¡Õ¢Õ¥Ö€Õ¥Õ¬
+firstRun_donate_label=Õ•Õ£Õ¶Õ¥Ö„ Õ´Õ¥Ö€ Õ®Ö€Õ¡Õ£Ö€Õ«Õ¶
+firstRun_feature_social=Õ€Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ½Õ¸Ö․ ÖÕ¡Õ¶ÖÕ¥Ö€Õ« Õ¯Õ¸Õ³Õ¡Õ¯Õ¶Õ¥Ö€Õ¨
+firstRun_legacySafariWarning=Ô´Õ¸Ö‚Ö„ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´ Õ¥Ö„ Safari Õ°Õ«Õ¶ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯, Õ¸Ö€Õ¿Õ¥Õ² Adblock Plus Õ¹Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¸Ö‚Õ´ Õ¯Õ¡Õ´ Õ¾Õ¡Õ¿ Õ§ Õ¡Õ·Õ­Õ¡Õ¿Õ¸Ö‚Õ´Ö‰ Õ„Õ¥Õ¶Ö„ Õ­Õ¸Ö€Õ°Õ¸Ö‚Ö€Õ¤ Õ¥Õ¶Ö„ Õ¿Õ¥Õ²Õ¡Õ¤Ö€Õ¥Õ¬ Safari 6.1.1 Õ¯Õ¡Õ´ Õ¡Õ¾Õ¥Õ¬Õ« Õ¢Õ¡Ö€Õ±Ö€ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯ (OS X 10.8 Mountain Lion-Õ¸Ö‚Õ´) Õ¯Õ¡Õ´ Safari 7.0.1 Ö‡ Õ¢Õ¡Ö€Õ±Ö€ (OS X 10.9 Mavericks-Õ¸Ö‚Õ´), Õ«Õ½Õ¯ Õ¥Õ©Õ¥ Õ¸Õ¹ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¥Ö„ Mozilla Firefox, Google Chrome Õ¯Õ¡Õ´ OperaÖ‰
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/global.properties
new file mode 100644
index 0000000..69bb1c4
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Ô±ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´ Ö†Õ«Õ¬Õ¿Ö€Õ¾Õ¾Õ¸Õ² Õ¿Õ¡Ö€Ö€Õ¥Ö€ Õ¹Õ¯Õ¡Õ¶
+action3_tooltip=Ô¿Õ¬Õ«Õ¯Õ¸Õ¾` Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬/Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬ «Adblock Plus»ը:
+notification_antiadblock_title=Ô¹Õ¡Ö„ÖÕ¶Õ¥ÕžÕ¬ Õ¶Õ¡Õ´Õ¡Õ¯Õ¶Õ¥Ö€Õ¨
+type_label_script=Õ½Õ¯Ö€Õ«ÕºÕ¿
+filter_elemhide_nocriteria=ÕÕ¡Ö€Ö€Õ¨ Õ©Õ¡Ö„ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ¸Õ¹ Õ´Õ« Õ¹Õ¡ÖƒÕ¡Õ¶Õ«Õ· Õ¿Ö€Õ¾Õ¡Õ® Õ¹Õ§
+blockingGroup_title=Ô³Õ¸Õ¾Õ¡Õ¦Õ¤Õ« Õ¡Ö€Õ£Õ¥Õ¬Õ´Õ¡Õ¶ Õ¯Õ¡Õ¶Õ¸Õ¶Õ¶Õ¥Ö€
+whitelisted_tooltip=«Adblock Plus»ը Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§, Õ¢Õ¡ÕµÖ Õ¡Ö€Õ£Õ¥Õ¬Õ¾Õ¡Õ® Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´
+type_label_stylesheet=Õ¸Õ³Õ¥Ö€
+blocked_count_tooltip=?1? Õ°Õ¡Õ¿ ` ?2? Õ°Õ¡Õ¿Õ«Ö
+type_label_font=Ö†Õ¸Õ¶Õ¿
+type_label_popup=pop-up ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶
+filter_regexp_tooltip=Õ†Õ¥Ö€Õ´Õ¸Ö‚Õ®Õ¾Õ¡Õ® Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ¨ Õ¯Õ¡Õ´ Õ¼Õ¥Õ£Õ¸Ö‚Õ¬ÕµÕ¡Ö€ Õ¡Ö€Õ¿Õ¡Õ°Õ¡ÕµÕ¿Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ , Õ¯Õ¡Õ´ Õ·Õ¡Õ¿ Õ¯Õ¡Ö€Õ³ Õ§ Õ¸Ö‚ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Ö…ÕºÕ¿Õ«Õ´Õ«Õ¦Õ¡ÖÕ¾Õ¥Õ¬, Õ¡ÕµÕ½ÕºÕ«Õ½Õ« Õ·Õ¡Õ¢Õ¬Õ¸Õ¶Õ¶Õ¥Ö€Õ« Õ´Õ¥Õ® Ö„Õ¡Õ¶Õ¡Õ¯Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¤Õ¡Õ¶Õ¤Õ¡Õ²Õ¥ÖÕ¶Õ¥Õ¬ Õ®Ö€Õ¡Õ£Ö€Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ¨:
+action0_tooltip=ÕÕ¥Õ²Õ´Õ¥Ö„ Õ´Õ¥Õ¶ÕµÕ¸Ö‚Õ« Õ°Õ¡Õ´Õ¡Ö€, Õ¯Õ¥Õ¿Õ¶Õ¿Ö€Õ¸Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¯Õ¸Õ³Õ¡Õ¯Õ¸Õ¾` Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬/Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬
+whitelisted_page=«Adblock Plus»ը անջատված է այս էջի համար
+remove_group_warning=Ô´Õ¸Ö‚Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸ÕžÖ‚Õ´ Õ¥Ö„ Õ»Õ¶Õ»Õ¥Õ¬ Õ¡ÕµÕ½ Õ­Õ¸Ö‚Õ´Õ¢Õ¨:
+action1_tooltip=Ô¿Õ¬Õ«Õ¯Õ¸Õ¾` Õ¢Õ¡ÖÕ¥Õ¬/ÖƒÕ¡Õ¯Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¾Õ¾Õ¸Õ² Õ¿Õ¡Ö€Ö€Õ¥Ö€Õ¨; Õ¯Õ¥Õ¿Õ¶Õ¿Ö€Õ¸Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¯Õ¸Õ³Õ¡Õ¯Õ¸Õ¾` Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬/Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬
+type_label_xmlhttprequest=XML Õ¯Õ¡Õ¶Õ¹
+active_tooltip=«Adblock Plus»ը Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§, Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¾Õ¸Ö‚Õ´ Õ§ ?1? Ö†Õ«Õ¬Õ¿Ö€Õ« Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¥Ö‚ ?2? Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¾Õ¡Õ® Ö†Õ«Õ¬Õ¿Ö€
+type_label_document=ÖƒÕ¡Õ½Õ©Õ¡Õ©Õ¸Ö‚Õ²Õ©
+type_label_object_subrequest=Ö…Õ¢ÕµÕ¥Õ¯Õ¿Õ« Õ¯Õ¡Õ¶Õ¹
+whitelistGroup_title=Ô²Õ¡ÖÕ¡Õ¼Õ¡Õ¯Õ¡Õ¶ Õ¯Õ¡Õ¶Õ¸Õ¶Õ¶Õ¥Ö€
+disabled_tooltip=«Adblock Plus»ը անջատված է
+filter_elemhide_duplicate_id=ÕÕ¡Ö€Ö€Õ¨ Õ©Õ¡Ö„ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ¯Õ¡Ö€Õ¥Õ¬Õ« Õ§ Õ¿Õ¡Õ¬ Õ´Õ«Õ¡ÕµÕ¶ Õ´Õ¥Õ¯ ID
+type_label_object=Ö…Õ¢ÕµÕ¥Õ¯Õ¿
+action2_tooltip=Ô¿Õ¬Õ«Õ¯Õ¸Õ¾` Õ†Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€; Õ¯Õ¥Õ¿Õ¶Õ¿Ö€Õ¸Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¯Õ¸Õ³Õ¡Õ¯Õ¸Õ¾` Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬/Õ´Õ«Õ¡ÖÕ¶Õ¥Õ¬
+type_label_subdocument=Ö†Ö€Õ¥ÕµÕ´
+clearStats_warning=Ô±ÕµÕ½ Õ¯Õ»Õ¶Õ»Õ« Õ½Õ¿Õ¡Õ¿Õ«Õ½Õ¿Õ«Õ¯Õ¡Õ¶ Ö‡ Õ¯Õ¡Õ¶Õ»Õ¡Õ¿Õ« Õ¡ÕµÕ¶:Õ‘Õ¡Õ¶Õ¯Õ¡Õ¶Õ¸ÕžÖ‚Õ´ Õ¥Ö„ Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬:
+notification_antiadblock_message=Ô±ÕµÕ½ Õ¯Õ¡ÕµÖ„Õ¨ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¸Ö‚Õ´ Õ§ Õ¶Õ¡Õ´Õ¡Õ¯Õ¶Õ¥Ö€ Adblock Plus-Õ« Ö…Õ£Õ¿Õ¾Õ¸Õ²Õ¶Õ¥Ö€Õ«Õ¶Ö‰ ÕˆÖ‚Õ¦Õ¸ÕžÖ‚Õ´ Õ¥Ö„ Õ©Õ¡Ö„ÖÕ¶Õ¥Õ¬ Õ¤Ö€Õ¡Õ¶Ö„Ö‰
+blocked_count_addendum=?1?-Õ¨ ?2?-Õ«Ö
+subscription_invalid_location=Õ–Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« ÖÕ¡Õ¶Õ¯Õ« Õ°Õ¡Õ½ÖÕ¥Õ¶ Õ¯Õ¡Õ´ Õ½Õ­Õ¡Õ¬ URL Õ§, Õ¯Õ¡Õ´ Õ½Õ­Õ¡Õ¬ Ö†Õ¡ÕµÕ¬Õ« Õ¡Õ¶Õ¸Ö‚Õ¶:
+type_label_image=Õ¶Õ¯Õ¡Ö€
+remove_subscription_warning=Ô»Ö€Õ¸ÕžÖ„ Õ¸Ö‚Õ¦Õ¸Ö‚Õ´ Õ¥Ö„ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ¡ÕµÕ½ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨:
+type_label_other=Õ¡Õ¶Õ°Õ¡ÕµÕ¿
+mobile_menu_enable=ABP: Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬
+type_label_media=Õ¡Õ¸Ö‚Õ¤Õ«Õ¸/Õ¾Õ«Õ¤Õ¥Õ¸
+mobile_menu_disable_site=ABP: Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ ?1?-Õ¸Ö‚Õ´
+elemhideGroup_title=Ô·Õ¬Õ¥Õ´Õ¥Õ¶Õ¿Õ¨ Õ©Õ¡Ö„ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ¯Õ¡Õ¶Õ¸Õ¶Õ¶Õ¥Ö€
+mobile_menu_enable_site=ABP: Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ ?1?-Õ¸Ö‚Õ´
+type_label_elemhide=Õ©Õ¡Ö„Õ¶Õ¾Õ¡Õ®
+newGroup_title=Õ†Õ¸Ö€ Ö†Õ«Õ¬Õ¿Ö€Õ« Õ­Õ¸Ö‚Õ´Õ¢
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/overlay.dtd
new file mode 100644
index 0000000..23482ce
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Ô±ÕµÕ¸">
+<!ENTITY notification.button.no "&amp;ÕˆÕ¹">
+<!ENTITY sync.label "&amp;ÕÕ«Õ¶Ö„Ö€Õ¸Õ¶Õ¡ÖÕ¶Õ¥Õ¬ Adblock Plus-Õ« Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€Õ¨">
+<!ENTITY whitelist.site.label "Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ ?1?-Õ¸Ö‚Õ´">
+<!ENTITY filters.label "Õ–Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¸Ö‚Õ´ (&amp;F)">
+<!ENTITY disable.label "Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ¡Õ´Õ¥Õ¶Õ¸Ö‚Ö€">
+<!ENTITY objecttab.title "Õ–Õ«Õ¬Õ¿Ö€Õ¥Õ¬">
+<!ENTITY objecttab.tooltip "ÕÕ¥Õ²Õ´Õ¥Õ¬ «Adblock Plus»ով Õ¡ÕµÕ½ Ö…Õ¢ÕµÕ¥Õ¯Õ¿Õ¨ Ö†Õ«Õ¬Õ¿Ö€Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€">
+<!ENTITY menuitem.label "Ad&amp;block Plus">
+<!ENTITY objecttabs.label "Õ–Õ«Õ¬Õ¿Ö€Õ¥Õ¬Õ¸Ö‚ &amp;Õ¯Õ¸Õ³Õ¡Õ¯Õ¶Õ¥Ö€ Flash-Õ« Ö‡ Java-Õ« Õ°Õ¡Õ´Õ¡Ö€">
+<!ENTITY sendReport.label "ÕÕ¥Õ²Õ¥Õ¯Õ¡ÖÕ¶Õ¥Õ¬ Õ¡ÕµÕ½ Õ§Õ»Õ« ÕºÖ€Õ¸Õ¢Õ¬Õ¥Õ´Õ« Õ´Õ¡Õ½Õ«Õ¶ (&amp;R)">
+<!ENTITY whitelist.page.label "Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Õ´Õ«Õ¡ÕµÕ¶ Õ¡ÕµÕ½ Õ§Õ»Õ« Õ°Õ¡Õ´Õ¡Ö€">
+<!ENTITY context.image.label "Adblock` Õ–Õ«Õ¬Õ¿Ö€Õ¥Õ¬ Õ†Õ¯Õ¡Ö€Õ¨">
+<!ENTITY counthits.label "Õ€Õ¡Õ·Õ¾Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ« Õ½Õ¿Õ¡Õ¿Õ«Õ½Õ¿Õ«Õ¯Õ¡Õ¶ (&amp;h)">
+<!ENTITY opensidebar.label "Ô²Õ¡ÖÕ¥Õ¬ Ö†Õ«Õ¬&amp;Õ¿Ö€Õ¾Õ¸Õ² Õ¿Õ¡Ö€Ö€Õ¥Ö€Õ¨">
+<!ENTITY notification.button.close "&amp;Õ“Õ¡Õ¯Õ¥Õ¬">
+<!ENTITY contribute.label "Ô±Õ»Õ¡Õ¯ÖÕ¥Õ¬ Adblock Plus-Õ«Õ¶">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock` Õ–Õ«Õ¬Õ¿Ö€Õ¥Õ¬ Õ–Ö€Õ¥ÕµÕ´Õ¨">
+<!ENTITY blocked.tooltip "Ô±ÕµÕ½ Õ§Õ»Õ« Ö†Õ«Õ¬Õ¿Ö€Õ¾Õ¡Õ® Õ¿Õ¡Ö€Ö€Õ¥Ö€Õ¨`">
+<!ENTITY hideplaceholders.label "Õ‘Õ¸Ö‚ÕµÖ Õ¹Õ¿Õ¡Õ¬ Õ¡Ö€Õ£Õ¥Õ¬Õ¾Õ¡Õ® Õ§Õ¬Õ¥Õ´Õ¥Õ¶Õ¿Õ¶Õ¥Ö€Õ« Õ¿Õ¥Õ²Õ¨">
+<!ENTITY showinstatusbar.label "Õ‘Õ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ &amp;Õ¾Õ«Õ³Õ¡Õ¯Õ« Õ¿Õ¸Õ²Õ¸Ö‚Õ´">
+<!ENTITY sidebar.title "Ô±ÕµÕ½ Õ§Õ»Õ« Ö†Õ«Õ¬Õ¿Ö€Õ¾Õ¸Õ² Õ¿Õ¡Ö€Ö€Õ¥Ö€Õ¨">
+<!ENTITY options.label "&amp;Ô¸Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€">
+<!ENTITY context.object.label "Adblock` Õ–Õ«Õ¬Õ¿Ö€Õ¥Õ¬ Õ•Õ¢ÕµÕ¥Õ¯Õ¿Õ¨">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: ÕŽÕ¥Ö€Õ¡Õ¯Õ¿Õ«Õ¾Õ¡ÖÕ¶Õ¥Õ¬ Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´">
+<!ENTITY filters.tooltip "Ô±Õ´Õ¥Õ¶Õ¡Õ¡Õ¯Õ¿Õ«Õ¾ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨`">
+<!ENTITY closesidebar.label "Õ“Õ¡Õ¯Õ¥Õ¬ Ö†Õ«Õ¬&amp;Õ¿Ö€Õ¾Õ¸Õ² Õ¿Õ¡Ö€Ö€Õ¥Ö€Õ¨">
+<!ENTITY showintoolbar.label "Õ‘Õ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ &amp;Õ£Õ¸Ö€Õ®Õ«Ö„Õ¡Õ·Õ¡Ö€Õ¸Ö‚Õ´">
+<!ENTITY status.tooltip "ÕŽÕ«Õ³Õ¡Õ¯Õ¨.">
+<!ENTITY context.media.label "Adblock` Õ–Õ«Õ¬Õ¿Ö€Õ¥Õ¬ Ô±Õ¸Ö‚Õ¤Õ«Õ¸/ÕŽÕ«Õ¤Õ¥Õ¸">
+<!ENTITY subscription.update.label "Ô¹Õ¡Ö€Õ´Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/sendReport.dtd
new file mode 100644
index 0000000..28dfde3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Õ€Õ¥Õ¿Ö„Õ¡ÕµÕ¬ (&amp;U)">
+<!ENTITY issues.disabledgroups.description "Õ€Õ¥Õ¿Õ¥Ö‚ÕµÕ¡Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨/Õ­Õ´Õ¢Õ¥Ö€Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ¥Õ¶, Õ½Õ¡Õ¯Õ¡ÕµÕ¶ Õ¶Ö€Õ¡Õ¶Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¡Õ¦Õ¤Õ¥ÖÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¸Ö‚Õ¶Õ¥Õ¶Õ¡Õ¬ Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´:">
+<!ENTITY showData.label "Õ‘Õ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus-Õ¨ Õ·Õ¡Õ¿ Õ§ Õ¡Ö€Õ£Õ¥Õ¬Õ¸Ö‚Õ´">
+<!ENTITY issues.change.description "ÕÕ¥Ö€ Õ¯Õ¸Õ¶Ö†Õ«Õ£Õ¸Ö‚Ö€Õ¡ÖÕ«Õ¡Õ¶ ÖƒÕ¸Õ­Õ¾Õ¥Õ¬ Õ§: Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¾Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ Õ§Õ»Õ¨ Ö‡ Õ©Õ¥Õ½Õ¿Õ¡Õ¾Õ¸Ö€Õ¥Õ¬ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ Õ¥Ö‚ Õ°Õ¡ÕµÕ¿Õ¶Õ¥Õ¬, Õ¥Õ©Õ¥ ÖƒÕ¸ÖƒÕ¸Õ­Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ«Ö ÕºÖ€Õ¸Õ¢Õ¬Õ¥Õ´Õ¨ Õ¹Õ« Õ¬Õ¸Ö‚Õ®Õ¾Õ¸Ö‚Õ´:">
+<!ENTITY email.label "E&amp;mailÕ">
+<!ENTITY issues.openPreferences.label "Ô²Õ¡ÖÕ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ¨Õ¶Õ¿Ö€Õ¡Õ¶Ö„Õ¶Õ¥Ö€Õ¨">
+<!ENTITY sendPage.confirmation "ÕÕ¥Ö€ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨ ÕºÕ¡Õ°ÕºÕ¡Õ¶Õ¾Õ¥Õ¬ Õ§: Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ´Õ¸Ö‚Õ¿Ö„ Õ£Õ¸Ö€Õ®Õ¥Õ¬ Õ¡ÕµÕ¶ Õ°Õ¥Õ¿Õ¥Ö‚ÕµÕ¡Õ¬ Õ°Õ¡Õ½ÖÕ¥Õ¸Õ¾Õ">
+<!ENTITY copyLink.label "Ô¿Ö€Õ¯Õ¶Õ¡Õ¯Õ¥Õ¬ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ« Õ°Õ²Õ¸Ö‚Õ´Õ¨">
+<!ENTITY issues.nofilters.description "Adblock Plus-Õ¨ Õ¹Õ« Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¸Ö‚Õ´ Õ¸Õ¹Õ«Õ¶Õ¹ Õ¨Õ¶Õ©Õ¡ÖÕ«Õ¯ Õ§Õ»Õ¸Ö‚Õ´: ÕŠÖ€Õ¸Õ¢Õ¬Õ¥Õ´Õ¨ Õ¸Ö€Õ¨ Õ¥Ö„ Õ¡Õ´Õ¥Õ¶Õ¡ÕµÕ¶ Õ°Õ¡Õ¾Õ¡Õ¶Õ¡Õ¯Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¡Õ´Õ¢, Õ¯Õ¡ÕºÕ¾Õ¡Õ® Õ¹Õ§ Adblock Plus.">
+<!ENTITY sendPage.knownIssue "ÕÕ¥Ö€ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ® Õ°Õ¡Ö€ÖÕ¨ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ§ Õ¡Ö€Õ¤Õ¥Õ¶ Õ°Õ¡ÕµÕ¿Õ¶Õ« Õ§: Ô¼Ö€Õ¡ÖÕ¸Ö‚ÖÕ«Õ¹ Õ¿Õ¥Õ²Õ¥Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ">
+<!ENTITY typeSelector.other.description "Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ¡ÕµÕ½ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¨, Õ¥Õ©Õ¥ Õ¯Õ¡Õ½Õ¯Õ¡Õ®Õ¸Ö‚Õ´ Õ¥Ö„, Õ´Õ« ÕºÖ€Õ¸Õ¢Õ¬Õ¥Õ´Õ¨ Adblock Plus-Õ« Õ°Õ¥Õ¿ Õ§ Õ¸Õ¹ Õ©Õ¥ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ«:">
+<!ENTITY issues.disabledgroups.enable.label "Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ / Õ­Õ¸Ö‚Õ´Õ¢Õ¨">
+<!ENTITY typeWarning.override.label "ÔµÕ½ Õ°Õ¡Õ½Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¥Õ´ Õ¥Ö‚ Õ¸Ö‚Õ¦Õ¸Ö‚Õ´ Õ¥Õ´ Õ¡ÕµÕ¶Õ¸Ö‚Õ¡Õ´Õ¥Õ¶Õ¡ÕµÕ¶Õ«Õ¾ Õ¶Õ¥Ö€Õ¯Õ¡ÕµÕ¡ÖÕ¶Õ¥Õ¬ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨ (&amp;s)">
+<!ENTITY issues.disabled.enable.label "Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Adblock Plus-Õ¨">
+<!ENTITY update.fixed.description "Õ–Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ©Õ¡Ö€Õ´Õ¡ÖÕ¸Ö‚Õ´Õ¨ Õ¬Õ¸Ö‚Õ®Õ¥Ö ÕÕ¥Ö€ Õ­Õ¶Õ¤Õ«Ö€Õ¨:Ô¹Õ¡Ö€Õ´Õ¡ÖÖ€Õ¥Õ›Ö„ Õ§Õ»Õ¨Õ Õ°Õ¡Õ´Õ¸Õ¦Õ¾Õ¥Õ¬Õ¸Ö‚ Õ¤Ö€Õ¡Õ¶Õ¸Ö‚Õ´:Ô½Õ¶Õ¤Ö€Õ« Õ¯Ö€Õ¯Õ¶Õ¾Õ¥Õ¬Õ¸Ö‚ Õ¤Õ¥ÕºÖ„Õ¸Ö‚Õ´ Õ¤Õ«Õ´Õ¥Õ›Ö„ Õ¯Ö€Õ¯Õ«Õ¶:">
+<!ENTITY anonymous.label "Ô±Õ¶Õ°Õ¡ÕµÕ¿ Ö†Õ«Õ¬Õ¿Õ¥Ö€">
+<!ENTITY reloadButton.label "ÕŽÕ¥Ö€Õ¡Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ Õ§Õ»Õ¨">
+<!ENTITY recentReports.clear.label "Õ€Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€ Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨ (&amp;R)">
+<!ENTITY typeSelector.description "Ô±ÕµÕ½ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶Õ¨ Ö…Õ£Õ¶Õ¸Ö‚Õ´ Õ§ Õ¯Õ¡Õ¿Õ¡Ö€Õ¥Õ¬ Adblock Plus-Õ« Õ­Õ¶Õ¤Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ¿Õ¥Õ²Õ¡Õ¯Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ Ö„Õ¡ÕµÕ¬Õ¥Ö€Õ¶. Õ†Õ¡Õ­ Õ¨Õ¶Õ¿Ö€Õ¥Ö„ Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´ Õ±Õ¥Ö€ Õ¸Ö‚Õ¶Õ¥ÖÕ¡Õ® Õ­Õ¶Õ¤Ö€Õ« Õ¿Õ¥Õ½Õ¡Õ¯Õ¨">
+<!ENTITY screenshot.remove.label "Õ€Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ¡Õ¶ÖÕ¡Õ¶Õ¯Õ¡Õ¬Õ« Õ¢Õ¡ÕªÕ«Õ¶Õ¶Õ¥Ö€ (&amp;R)">
+<!ENTITY issues.ownfilters.description "Ô±ÕµÕ½ Õ§Õ»Õ«Õ¶ Õ¯Õ«Ö€Õ¡Õ¼Õ¾Õ¡Õ® Õ¸Ö€Õ¸Õ· Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€ Õ½Õ¡Õ°Õ´Õ¡Õ¶Õ¾Õ¡Õ® Õ¥Õ¶ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Õ²Õ« Õ¯Õ¸Õ²Õ´Õ«Ö: Ô±Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Ö„ Õ¤Ö€Õ¡Õ¶Ö„ Õ¡ÕµÕ¤ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨, Õ¸Ö€Õ¸Õ¶Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¡Õ¼Õ¡Õ»Õ¡ÖÖ€Õ¥Õ¬ ÕºÖ€Õ¸Õ¢Õ¬Õ¥Õ´Õ¨:">
+<!ENTITY update.inProgress.description "Adblock Plus-Õ¨ ÕºÕ«Õ¿Õ« Õ©Õ¡Ö€Õ´Õ¡ÖÕ¶Õ« ÕÕ¥Ö€ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨Õ Õ°Õ¡Õ´Õ¸Õ¦Õ¾Õ¥Õ¬Õ¸Ö‚, Õ¸Ö€ Õ­Õ¶Õ¤Õ«Ö€Õ¨ Õ¹Õ« Õ¬Õ¸Ö‚Õ®Õ¾Õ¸Ö‚Õ´:Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ½ÕºÕ¡Õ½Õ¥Ö„...">
+<!ENTITY sendPage.retry.label "Õ†Õ¸Ö€Õ«Ö Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬">
+<!ENTITY data.label "ÕÕ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ (&amp;p)">
+<!ENTITY recentReports.label "ÕÕ¥Ö€ Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ¶Õ¥Ö€Õ¯Õ¡ÕµÕ¡ÖÕ¾Õ¡Õ® Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨">
+<!ENTITY typeWarning.description "Ô´Õ¸Ö‚Ö„ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ°Õ¡ÕµÕ¿Õ¶Õ¥Õ¬ Adblock Plus-Õ« ÕºÖ€Õ¸Õ¢Õ¬Õ¥Õ«Õ´Õ« Õ´Õ¡Õ½Õ«Õ¶, Õ¸Õ¹ Õ©Õ¥ Õ¯Õ¡ÕºÕ¾Õ¡Õ® Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ°Õ¥Õ¿: Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¶Õ¯Õ¡Õ¿Õ« Õ¸Ö‚Õ¶Õ¥Õ¶Õ¡Õ¬, Õ¸Ö€ Õ¶Õ´Õ¡Õ¶ Õ°Õ¡Ö€ÖÕ¥Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶ Õ¿Õ¥Õ²Õ¥Õ¯Õ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚ Õ¬Õ¡Õ¾Õ¡Õ£Õ¸Ö‚ÕµÕ¶ Õ¿Õ¥Õ²Õ¨ [link]Adblock Plus Ö†Õ¸Ö€Õ¸Ö‚Õ´[/link]-Õ¶ Õ§: Ô´Õ¸Ö‚Ö„ ÕºÕ¥Õ¿Ö„ Õ§ Ö…Õ£Õ¿Õ¾Õ¥Ö„ Õ¡ÕµÕ½ Õ´Õ«Õ»Õ¸ÖÕ«Ö Õ´Õ«Õ¡ÕµÕ¶ Ö„Õ¶Õ¶Õ¡Ö€Õ¯Õ¸Ö‚Õ´Õ¨ Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€, Ö„Õ¡Õ¶Õ« Õ¸Ö€ Õ¸Õ¹ Õ¸Ö„ Õ¹Õ« Õ¶Õ¯Õ¡Õ¿Õ« ÕÕ¥Ö€ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨ Õ¥Õ©Õ¥ Ô´Õ¸Ö‚Ö„ Õ¹Õ¿Ö€Õ¡Õ´Õ¡Õ¤Ö€Õ¥Ö„ Õ°Õ²Õ¸Ö‚Õ´ Õ¥Õ¶ Õ¤Õ¥ÕºÕ« Õ¡ÕµÕ¶: Ô±Õ¾Õ¿Õ¸Õ´Õ¡Õ¿ Õ¯Õ¥Ö€ÕºÕ¸Õ¾ Õ£Õ¥Õ¶Õ¥Ö€Õ¡ÖÕ¾Õ¡Õ® Õ°Õ²Õ¸Ö‚Õ´ Õ¯Õ¿Ö€Õ¡Õ´Õ¡Õ¤Ö€Õ¾Õ« Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨ Õ¶Õ¥Ö€Õ¯Õ¡ÕµÕ¡ÖÕ¶Õ¥Õ¬Õ¸Ö‚Ö Õ°Õ¥Õ¿Õ¸:">
+<!ENTITY issues.disabled.description "Adblock Plus-Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§, Õ¡ÕµÕ¶ Õ¹Õ« Õ¡Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¸Ö‚Õ´ Õ¸Ö€Õ¥Ö‚Õ§ Õ¢Õ¡Õ¶ Õ¡ÕµÕ½ Õ¾Õ«Õ³Õ¡Õ¯Õ¸Ö‚Õ´:">
+<!ENTITY attachExtensions.label "Ô±Õ´Ö€Õ¡ÖÕ¶Õ¥Õ¬ Õ¡Õ¯Õ¿Õ«Õ¾ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¸Ö‚Õ´Õ¶Õ¥Ö€Õ« ÖÕ¸Ö‚ÖÕ¡Õ¯Õ¨ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ«Õ¶, Õ¡ÕµÕ¶ Õ¤Õ¥ÕºÖ„Õ« Õ°Õ¡Õ´Õ¡Ö€ Õ¥Õ©Õ¥ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¸Ö‚Õ´Õ¶Õ¥Ö€Õ¨ Õ­Õ¶Õ¤Ö€Õ« ÕºÕ¡Õ¿Õ³Õ¡Õ¼ Õ¥Õ¶:">
+<!ENTITY issues.nosubscriptions.add.label "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ« Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶">
+<!ENTITY issues.disabledfilters.enable.label "Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¨">
+<!ENTITY issues.override.label "Ô¿Õ¸Õ¶Ö†Õ«Õ£Õ¸Ö‚Ö€Õ¡ÖÕ«Õ¡Õ¶ Õ³Õ«Õ·Õ¿ Õ§, Õ·Õ¡Ö€Õ¸Ö‚Õ¶Õ¡Õ¯Õ¥Õ¬ Õ°Õ¡ÕµÕ¿Õ¶Õ¥Õ¬ Õ­Õ¶Õ¤Ö€Õ« Õ´Õ¡Õ½Õ«Õ¶">
+<!ENTITY issues.nosubscriptions.description "Ô´Õ¸Ö‚Ö„, Õ¨Õ½Õ¿ Õ¥Ö€Õ¥Ö‚Õ¸Ö‚ÕµÕ©Õ«, Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¾Õ¡Õ® Õ¹Õ¥Ö„ Õ¸Ö€Õ¥Ö‚Õ§ ÕºÕ¡Õ¿Ö€Õ¡Õ½Õ¿Õ« Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« ÖÕ¸Ö‚ÖÕ¡Õ¯Õ«, Õ¸Ö€Õ¨ Õ¡Õ¾Õ¿Õ¸Õ´Õ¡Õ¿ Õ¯Õ¥Ö€ÕºÕ¸Õ¾ Õ¯Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ« Õ¡Õ¶ÖÕ¡Õ¶Õ¯Õ¡Õ¬Õ« Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ¯Õ¡ÕµÖ„Õ¥Ö€Õ¸Ö‚Õ´:">
+<!ENTITY typeSelector.falsePositive.description "Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ¡ÕµÕ½ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¨, Õ¥Õ©Õ¥ Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´ Õ¯Õ¸Ö€Õ¥Õ¬ Õ§ Õ¯Õ¡Ö€Õ¥Ö‚Õ¸Ö€ Õ¢Õ¸Õ¾Õ¡Õ¶Õ¤Õ¡Õ¯Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶, Õ¡ÕµÕ¶ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¾Õ¸Ö‚Õ´ Õ§ Õ½Õ­Õ¡Õ¬ Õ¯Õ¡Õ´ Õ¹Õ« Õ¡Õ·Õ­Õ¡Õ¿Õ¸Ö‚Õ´: Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¸Ö€Õ¸Õ·Õ¥Õ¬, Õ©Õ¥ Õ¡Ö€Õ¤ÕµÕ¸Ö„ Adblock Plus-Õ¶ Õ§ ÕºÕ¡Õ¿Õ³Õ¡Õ¼Õ¨ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¡Õ¾Õ¸Ö€Õ¡ÕºÕ¥Õ½ Õ¡Õ¶Õ»Õ¡Õ¿Õ¥Õ¬Õ¸Õ¾ Õ¡ÕµÕ¶:">
+<!ENTITY typeSelector.other.label "Ô±ÕµÕ¬ Õ­Õ¶Õ¤Õ«Ö€">
+<!ENTITY emailComment.label "Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ£Ö€Õ¥Õ›Ö„ Õ³Õ«Õ·Õ¿ email Õ°Õ¡Õ½ÖÕ¥Õ ÕÕ¥Õ¦ Õ°Õ¥Õ¿ Õ¯Õ¡ÕºÕ¶Õ¾Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Ö‡ Õ­Õ¶Õ¤Õ«Ö€Õ¨ Õ¬Õ¸Ö‚Õ®Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:">
+<!ENTITY issues.whitelist.remove.label "Õ„Õ«Õ¡ÖÕ¶Õ¥Õ¬ Adblock Plus-Õ¨ Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´">
+<!ENTITY outdatedSubscriptions.description "Ô±ÕµÕ½ Ö†Õ«Õ¬Õ¿Ö€Õ¨ Õ¹Õ« Õ©Õ¡Ö€Õ´Õ¡ÖÕ¾Õ¥Õ¬ Õ´Õ¸Õ¿ 2 Õ·Õ¡Õ¢Õ¡Õ©:Ô¹Õ¡Ö€Õ´Õ¡ÖÖ€Õ¥Õ›Ö„, Ö„Õ¡Õ¶Õ« Õ¸Ö€ Õ¤Õ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¬Õ¸Ö‚Õ®Õ¥Õ¬ Õ­Õ¶Õ¤Õ«Ö€Õ¨:Ô½Õ¶Õ¤Ö€Õ« Õ¹Õ¬Õ¸Ö‚Õ®Õ´Õ¡Õ¶ Õ¤Õ¥ÕºÖ„Õ¸Ö‚Õ´ Õ¤Õ«Õ´Õ¥Õ›Ö„ Õ¯Ö€Õ¯Õ«Õ¶:">
+<!ENTITY dataCollector.description "ÕÕºÕ¡Õ½Õ¥Ö„ Õ´Õ«Õ¶Õ¹Ö‡ Adblock Plus-Õ¨ Õ°Õ¡Õ¾Õ¡Ö„Õ« Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿ տվյալներ…">
+<!ENTITY sendButton.label "ÕˆÖ‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨">
+<!ENTITY comment.label "Õ„Õ¥Õ¯Õ¶Õ¡Õ¢Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ (ÕºÕ¡Ö€Õ¿Õ¡Õ¤Õ«Ö€ Õ¹Õ§)Õ">
+<!ENTITY sendPage.errorMessage "Ô¶Õ¥Õ¯Õ¸Ö‚ÕµÖÕ« Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ´Õ¡Õ¶ ÖƒÕ¸Ö€Õ±Õ¨ Õ±Õ¡Õ­Õ¸Õ²Õ¾Õ¥Õ¬ Õ§ Õ°Õ¥Õ¿Ö‡ÕµÕ¡Õ¬ Õ½Õ­Õ¡Õ¬Õ« Õ¯Õ¸Õ¤Õ¸Õ¾Õ &quot;?1?&quot;: ÕÕ¿Õ¸Ö‚Õ£Õ¥Ö„ Õ´Õ«Õ¡ÖÕ¸Ö‚Õ´Õ¨ Õ«Õ¶Õ¿Õ¥Ö€Õ¶Õ¥Õ¿Õ«Õ¶ Õ¥Ö‚ Õ¯Ö€Õ¯Õ¶Õ¥Ö„: ÔµÕ©Õ¥ Õ­Õ¶Õ¤Õ«Ö€Õ¨ Õ¹Õ¯Õ¡Ö€Õ£Õ¡Õ¾Õ¸Ö€Õ¾Õ«, Õ­Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ¤Õ«Õ´Õ¥Õ¬ [link]Adblock Plus Õ–Õ¸Ö€Õ¸Ö‚Õ´[/link] Õ¡Õ»Õ¡Õ¯ÖÕ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ°Õ¡Õ´Õ¡Ö€:">
+<!ENTITY showRecentReports.label "Õ‘Õ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ Õ¾Õ¥Ö€Õ»Õ«Õ¶ Õ¶Õ¥Ö€Õ¯Õ¡ÕµÕ¡ÖÕ¾Õ¡Õ® Õ°Õ¡Õ²Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨">
+<!ENTITY commentPage.heading "Õ„Õ¥Õ¯Õ¶Õ¡Õ¢Õ¡Õ¶Õ¥Õ¬">
+<!ENTITY update.start.label "ÕÕ¯Õ½Õ¥Õ¬ Õ©Õ¡Ö€Õ´Õ¡ÖÕ¸Ö‚Õ´Õ¨ Õ°Õ«Õ´Õ¡">
+<!ENTITY issues.disabledfilters.description "Õ€Õ¥Õ¿Õ¥Ö‚ÕµÕ¡Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ¥Õ¶, Õ½Õ¡Õ¯Õ¡ÕµÕ¶ Õ¶Ö€Õ¡Õ¶Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ¡Õ¦Õ¤Õ¥ÖÕ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¸Ö‚Õ¶Õ¥Õ¶Õ¡Õ¬ Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´:">
+<!ENTITY screenshot.description "Õ†Õ¸Ö‚ÕµÕ¶ Õ§Õ»Õ¨ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ¿Õ¡Ö€Õ¢Õ¥Ö€ Õ¶Õ¡ÕµÕ¾Õ¥Õ¬ Õ¿Õ¡Ö€Õ¢Õ¥Ö€ Õ´Õ¡Ö€Õ¤Õ¯Õ¡Õ¶Ö: ÔµÕ©Õ¥ Õ¤Õ¸Ö‚Ö„ ÕÕ¥Ö€ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ«Õ¶ Õ¯ÖÕ¥Ö„ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ¶Õ¯Õ¡Ö€Õ¨ Õ¤Õ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Ö…Õ£Õ¶Õ¥Õ¬ Õ´Õ¥Õ¦ Õ°Õ¡Õ½Õ¯Õ¡Õ¶Õ¡Õ¬ Õ­Õ¶Õ¤Õ«Ö€Õ¨: Ô´Õ¸Ö‚Ö„ Õ¶Õ¸Ö‚ÕµÕ¶ÕºÕ¥Õ½ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ¡Õ¶ÖÕ¡Õ¶Õ¯Õ¡Õ¬Õ« Õ¢Õ¡ÕªÕ«Õ¶Õ¶Õ¥Ö€, Õ«Õ¶Õ¹ÕºÕ¥Õ½ Õ¶Õ¡Õ¥Ö‚ Õ¶Õ·Õ¥Õ¬ Õ¡ÕµÕ¶ Õ¿Õ¡Ö€Õ¡Õ®Ö„Õ¶Õ¥Ö€Õ¨, Õ¸Ö€Õ¿Õ¥Õ² Õ¥Ö€Õ¥Ö‚Õ¸Ö‚Õ´ Õ§ Õ­Õ¶Õ¤Õ«Ö€Õ¨: Ô´Õ¡ Õ¡Õ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€ Õ½Õ¥Õ²Õ´Õ¥Ö„ Õ°Õ¡Õ´Õ¡ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶ Õ¯Õ¸Õ³Õ¡Õ¯Õ¨ Õ¥Ö‚ Õ´Õ¯Õ¶Õ«Õ¯Õ¸Õ¾ Õ¨Õ¶Õ¿Ö€Õ¥Ö„ ÕºÕ¡Õ¿Õ¯Õ¥Ö€Õ« Õ°Õ¡Õ¿Õ¾Õ¡Õ®Õ¨:">
+<!ENTITY screenshot.attach.label "Ô¿ÖÕ¥Õ¬ Õ§Õ»Õ« Õ¶Õ¯Õ¡Ö€Õ¨">
+<!ENTITY issues.whitelist.description "Adblock Plus-Õ¨ Õ¡ÕµÕªÕ´ Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ® Õ§ Õ¡ÕµÕ½ Õ§Õ»Õ¸Ö‚Õ´: Õ„Õ«Õ¡ÖÖ€Õ¥Ö„ Õ¡ÕµÕ¶ Õ¥Ö‚ Õ¾Õ¥Ö€Õ¢Õ¥Õ¼Õ¶Õ¥Ö„ Õ¡ÕµÕ½ Õ§Õ»Õ¨ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬Õ¸Ö‚Ö Õ¡Õ¼Õ¡Õ» Õ­Õ¶Õ¤Ö€Õ« Õ¬Õ¸Ö‚Õ®Õ¸Ö‚Õ´Õ¡Õ¶Õ¨ Õ¡Õ»Õ¡Õ¯ÖÕ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€:">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus-Õ¨ Õ¹Õ« ÖƒÕ¡Õ¯Õ¸Ö‚Õ´ Õ£Õ¸Õ¾Õ¡Õ¦Õ¤Õ¨ (&amp;v)">
+<!ENTITY typeSelector.heading "Ô½Õ¶Õ¤Ö€Õ« Õ¨Õ¶Õ¿Ö€Õ¸Ö‚Õ´">
+<!ENTITY anonymity.warning "Õ„Õ¥Õ¶Ö„ Õ¹Õ¥Õ¶Ö„ Õ¯Õ¡Ö€Õ¸Õ²Õ¡Õ¶Õ¡Õ¬Õ¸Ö‚ Õ¥Õ¿ Õ£Õ¡Õ¬ ÕÕ¥Õ¦ Õ´Õ¸Õ¿ Ö‡ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨ ÖÕ¡Õ®Ö€ Õ¯Õ°Õ¡Õ´Õ¡Ö€Õ¥Õ¶Ö„:">
+<!ENTITY wizard.title "ÕÕ¥Õ²Õ¥Õ¯Õ¡ÖÕ¶Õ¥Õ¬">
+<!ENTITY issues.ownfilters.disable.label "Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€(Õ¥Ö€)Õ¨">
+<!ENTITY commentPage.description "ÕÕ¥Ö„Õ½Õ¿Õ¡ÕµÕ«Õ¶ Õ¤Õ¡Õ·Õ¿Õ« Õ½Õ¿Õ¸Ö€Õ¥Ö‚ Õ©Õ¸Ö‚ÕµÕ¬ Õ§ Õ¿Õ¡Õ¬Õ«Õ½ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬ Õ´Õ¥Õ¯Õ¶Õ¡Õ¢Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ´Õ¥Õ¦ Ö…Õ£Õ¶Õ¥Õ¬Õ¸Ö‚ Õ°Õ¡Õ´Õ¡Ö€Õ Õ°Õ¡Õ½Õ¯Õ¡Õ¶Õ¡Õ¬ Õ­Õ¶Õ¤Õ«Ö€Õ¨&quot; Ô±ÕµÕ½ Ö„Õ¡ÕµÕ¬Õ¨ ÕºÕ¡Ö€Õ¿Õ¡Õ¤Õ«Ö€ Õ¹Õ§, Õ½Õ¡Õ¯Õ¡ÕµÕ¶ Õ­Õ¸Ö€Õ°Õ¸Ö‚Ö€Õ¤ Õ§ Õ¿Ö€Õ¾Õ¸Ö‚Õ´, Õ¥Õ©Õ¥ Ô½Õ¶Õ¤Õ«Ö€Õ¨ Õ¡Õ¯Õ¶Õ°Õ¡ÕµÕ¿ Õ¹Õ§: Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¶Õ¡Õ¥Ö‚ Õ¾Õ¥Ö€Õ¡Õ¶Õ¡ÕµÕ¥Õ¬ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ« Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ¨ Õ´Õ«Õ¶Õ¹ Õ¤Ö€Õ¡ Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¸Ö‚Õ´Õ¨:">
+<!ENTITY comment.lengthWarning "Õ„Õ¥Õ¯Õ¶Õ¡Õ¢Õ¡Õ¶Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¥Ö€Õ¯Õ¡Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ£Õ¥Ö€Õ¡Õ¦Õ¡Õ¶ÖÕ¸Ö‚Õ´ Õ§ 1000 Õ½Õ«Õ´Õ¾Õ¸Õ¬: Õ„Õ«Õ¡ÕµÕ¶ Õ¡Õ¼Õ¡Õ»Õ«Õ¶ 1000 Õ½Õ«Õ´Õ¾Õ¸Õ¬Õ¨ Õ¯Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ¾Õ«:">
+<!ENTITY typeSelector.falseNegative.description "Ô¸Õ¶Õ¿Ö€Õ¥Ö„ Õ¡ÕµÕ½ Õ¿Õ¡Ö€Õ¢Õ¥Ö€Õ¡Õ¯Õ¨, Õ¥Õ©Õ¥ Õ£Õ¸Õ¾Õ¡Õ¦Õ¤Õ¨ ÖÕ¸Ö‚ÖÕ¡Õ¤Ö€Õ¾Õ¸Ö‚Õ´ Õ§, Õ¹Õ¶Õ¡ÕµÕ¡Õ® Adblock Plus Õ´Õ«Õ¡ÖÕ¾Õ¡Õ® Õ§:">
+<!ENTITY sendPage.waitMessage "Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ½ÕºÕ¡Õ½Õ¥Õ¬, Õ´Õ«Õ¶Õ¹ Adblock Plus-Õ¨, Õ¸Ö‚Õ²Õ¡Ö€Õ¯Õ« ÕÕ¥Ö€ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨:">
+<!ENTITY dataCollector.heading "Ô²Õ¡Ö€Õ« Õ£Õ¡Õ¬Õ¸Ö‚Õ½Õ¿ ÕºÖ€Õ¸Õ¢Õ¬Õ¥Õ´Õ¶Õ¥Ö€Õ« Õ°Õ¥Õ¿Ö‡Õ´Õ¡Õ¶ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö€Õ£">
+<!ENTITY screenshot.heading "Ô¿ÖÕ¥Õ¬ Õ§Õ¯Ö€Õ¡Õ¶Õ« Õ¶Õ¯Õ¡Ö€Õ¨">
+<!ENTITY sendPage.heading "ÕˆÖ‚Õ²Õ¡Ö€Õ¯Õ¥Õ¬ Õ¦Õ¥Õ¯Õ¸Ö‚ÕµÖÕ¨">
+<!ENTITY issues.subscriptionCount.description "Ô´Õ¸Ö‚Ö„ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¾Õ¡Õ® Õ¥Ö„ Õ¹Õ¡ÖƒÕ«Ö Õ·Õ¡Õ¿ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ«: ÕÕ¡ Õ¯Õ¡Ö€Õ¸Õ² Õ§ Õ­Õ¶Õ¤Ö€Õ« ÕºÕ¡Õ¿Õ³Õ¡Õ¼ Õ¤Õ¡Õ¼Õ¶Õ¡Õ¬: Õ„Õ¥Õ¶Ö„ Õ¹Õ¥Õ¶Ö„ Õ¨Õ¶Õ¤Õ¸Ö‚Õ¶Õ« Õ±Õ¥Ö€ Õ¢Õ¡Õ²Õ¸Ö„Õ¨ Õ­Õ¶Õ¤Ö€Õ« Õ°Õ¥Õ¿ Õ¯Õ¡ÕºÕ¾Õ¡Õ®, Ö„Õ¡Õ¶Õ« Õ¸Ö€ Õ¡Õ¶Õ°Õ¶Õ¡Ö€ Õ§ Õ¬Õ«Õ¶Õ¥Õ¬Õ¸Ö‚ ÕºÕ¡Ö€Õ¦Õ¥Õ¬ Õ¤Ö€Õ¡ Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¨: Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ¨, Õ©Õ¸Õ²Õ¶Õ¥Õ¬Õ¸Õ¾ Õ´Õ«Õ¡ÕµÕ¶ Õ¡Õ´Õ¥Õ¶Õ¡Õ¡Õ¶Õ°Ö€Õ¡ÕªÕ¥Õ·Õ¿Õ¶Õ¥Ö€Õ¨ Ö‡ Õ½Õ¿Õ¸Ö‚Õ£Õ¥Õ¬ Õ¡Ö€Õ¤ÕµÕ¸Ö„ Õ­Õ¶Õ¤Õ«Ö€Õ¨ Õ¤Õ¥Õ¼ Õ¯Õ¡:">
+<!ENTITY screenshot.mark.label "Õ†Õ·Õ¥Õ¬ Õ­Õ¶Õ¤Ö€Õ« Õ¿Õ¥Õ²Õ¨">
+<!ENTITY privacyPolicy.label "Ô±Õ¶Õ±Õ¶Õ¡Õ¯Õ¡Õ¶ Õ¿Õ¾ÕµÕ¡Õ¬Õ¶Õ¥Ö€Õ« ÕºÕ¡Õ°ÕºÕ¡Õ¶Õ¸Ö‚Õ´">
+<!ENTITY issues.description "Adblock Plus-Õ¨ Õ°Õ¡ÕµÕ¿Õ¶Õ¡Õ¢Õ¥Ö€Õ¥Õ¬ Õ§ ÕºÖ€Õ¸Õ¢Õ¬Õ¥Õ´Õ¶Õ¥Ö€ Õ±Õ¥Ö€ Õ¯Õ¸Õ¶Ö†Õ«Õ£Õ¸Ö‚Ö€Õ¡ÖÕ«Õ¡ÕµÕ« Õ°Õ¥Õ¿, Õ¸Ö€Õ¸Õ¶Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Õ¶ Õ­Õ¶Õ¤Ö€Õ« ÕºÕ¡Õ¿Õ³Õ¡Õ¼ Õ¬Õ«Õ¶Õ¥Õ¬ Õ¯Õ¡Õ´ Õ¢Õ¡Ö€Õ¤Õ¡ÖÕ¶Õ« Õ¬Õ¸Ö‚Õ®Õ¸Ö‚Õ´Õ¨:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/sidebar.dtd
new file mode 100644
index 0000000..d185321
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Õ‘Õ¸Ö‚ÕµÖ Õ¿Õ¡Õ¬ Ö…Õ¢ÕµÕ¥Õ¯Õ¿Õ¨ Õ§Õ»Õ¸Ö‚Õ´">
+<!ENTITY address.label "Õ€Õ¡Õ½ÖÕ¥Õ¶">
+<!ENTITY context.open.label "Ô²Õ¡ÖÕ¥Õ¬ Õ¶Õ¸Ö€ Ô¹Õ¡Õ¢Õ¸Ö‚Õ´">
+<!ENTITY type.label "ÕÕ¥Õ½Õ¡Õ¯Õ¨">
+<!ENTITY tooltip.filterSource.label "Õ–Õ«Õ¬Õ¿Ö€Õ« Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¨`">
+<!ENTITY noitems.label "Õ–Õ«Õ¬Õ¿Ö€Õ¾Õ¾Õ¸Õ² Õ¿Õ¡Ö€Ö€Õ¥Ö€ Õ¹Õ¯Õ¡Õ¶">
+<!ENTITY filter.label "Ô±Õ¦Õ¤Õ¸Õ² Ö†Õ«Õ¬Õ¿Ö€Õ¨">
+<!ENTITY tooltip.size.label "Õ‰Õ¡ÖƒÕ¨`">
+<!ENTITY reattach.label "Ô±Õ´Ö€Õ¡ÖÕ¶Õ¥Õ¬">
+<!ENTITY search.label "&amp;Õ“Õ¶Õ¿Ö€Õ¥Õ¬">
+<!ENTITY docDomain.thirdParty "(Õ¥Ö€Ö€Õ¸Ö€Õ¤ Õ¯Õ¸Õ²Õ´Õ«)">
+<!ENTITY filterSource.label "Õ–Õ«Õ¬Õ¿Ö€Õ« Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¨`">
+<!ENTITY tooltip.docDomain.label "Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ« Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¨`">
+<!ENTITY context.copy.label "Ô¿Ö€Õ¯Õ¶Õ¥Õ¬ Õ¿Õ¡Ö€Ö€Õ« Õ°Õ¡Õ½ÖÕ¥Õ¶">
+<!ENTITY tooltip.type.label "ÕÕ¥Õ½Õ¡Õ¯Õ¨`">
+<!ENTITY context.disablefilter.label "Ô±Õ¶Õ»Õ¡Õ¿Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¨ ?1?">
+<!ENTITY context.copyFilter.label "Ô¿Ö€Õ¯Õ¶Õ¡Õ¯Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¨">
+<!ENTITY context.block.label "Õ–Õ«Õ¬Õ¿Ö€Õ¥Õ¬ Õ¡ÕµÕ½ Õ¿Õ¡Ö€Ö€Õ¨">
+<!ENTITY context.enablefilter.label "ÕŽÕ¥Ö€Õ¡Õ¯Õ¿Õ«Õ¾Õ¡ÖÕ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¨ ?1?">
+<!ENTITY detach.label "Ô±Õ¶Õ»Õ¡Õ¿ ÕºÕ¡Õ¿Õ¸Ö‚Õ°Õ¡Õ¶">
+<!ENTITY whitelisted.label "Ô²Õ¡ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶">
+<!ENTITY context.disablefilteronsite.label "Ô±Ö€Õ£Õ¥Õ¬Õ¥Õ¬ Õ¡ÕµÕ½ Ö†Õ«Õ¬Õ¿Ö€Õ¨ ?1? -Õ¸Ö‚Õ´">
+<!ENTITY detached.title "Adblock Plus - Õ–Õ«Õ¬Õ¿Ö€Õ¾Õ¾Õ¸Õ² Õ¿Õ¡Ö€Ö€Õ¥Ö€ (Ô±Õ¶Õ»Õ¡Õ¿)">
+<!ENTITY docDomain.firstParty "(Õ¸Ö‚Õ²Õ«Õ² Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€)">
+<!ENTITY tooltip.type.whitelisted "(Õ¢Õ¡ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶)">
+<!ENTITY tooltip.filter.label "Ô±Õ¦Õ¤Õ¸Õ² Ö†Õ«Õ¬Õ¿Ö€Õ¨`">
+<!ENTITY tooltip.filter.disabled "(Õ¡Õ¶Õ»Õ¡Õ¿Õ¾Õ¡Õ®)">
+<!ENTITY context.editfilter.label "Ô½Õ´Õ¢Õ¡Õ£Ö€Õ¥Õ¬ Ô±Õ¦Õ¤Õ¸Õ² Ö†Õ«Õ¬Õ¿Ö€Õ¨">
+<!ENTITY tooltip.type.blocked "(Ö†Õ«Õ¬Õ¿Ö€Õ¾Õ¡Õ®)">
+<!ENTITY size.label "Õ‰Õ¡ÖƒÕ¨">
+<!ENTITY context.whitelist.label "Ô±ÕµÕ½ Õ¿Õ¡Ö€Ö€Õ« Õ°Õ¡Õ´Õ¡Ö€ Ô²Õ¡ÖÕ¡Õ¼Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬">
+<!ENTITY context.selectAll.label "Ô¼Ö€Õ«Õ¾ Ô¸Õ¶Õ¿Ö€Õ¥Õ¬">
+<!ENTITY state.label "ÕŽÕ«Õ³Õ¡Õ¯Õ¨">
+<!ENTITY docDomain.label "Ô±Õ·Õ­Õ¡Õ¿Õ¡Õ¶Ö„Õ« Õ¡Õ²Õ¢ÕµÕ¸Ö‚Ö€Õ¨">
+<!ENTITY tooltip.address.label "Õ€Õ¡Õ½ÖÕ¥Õ¶`">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/subscriptionSelection.dtd
new file mode 100644
index 0000000..77ecf84
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/hy-AM/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Ô±Õ¾Õ¥Õ¬Õ¡Ö&amp;Õ¶Õ¥Õ¬ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶ Õ¶Õ¡Ö‡ &quot;?1?&quot; Ö†Õ«Õ¬Õ¿Ö€Õ«Õ¶">
+<!ENTITY list.download.failed "«Adblock Plus»-Õ¨ Õ¹Õ¯Õ¡Ö€Õ¸Õ²Õ¡ÖÕ¡Õ¾ Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« Õ¢Õ¡ÕªÕ¡Õ¶Õ¡Ö€Õ¤Õ¸Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¶Õ¥Ö€Õ« ÖÕ¸Ö‚ÖÕ¡Õ¯Õ¨">
+<!ENTITY list.download.retry "Ô¿Ö€Õ¯Õ«Õ¶ Õ“Õ¸Ö€Õ±Õ¥Õ¬">
+<!ENTITY title.label "Ô²&amp;Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¡Õ¾Õ¡Õ¶Õ¸Ö‚Õ´Õ¨`">
+<!ENTITY list.download.website "Ô±ÕµÖÕ¥Õ¬Õ¥Õ¬ Õ¯Õ¡ÕµÖ„">
+<!ENTITY supplementMessage "Ô±ÕµÕ½ Ö†Õ«Õ¬Õ¿Ö€Õ« Õ¢Õ¡ÕªÕ¡Õ¶Õ¡Ö€Õ¤Õ¸Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶Õ¨ Õ°Õ¡Õ³Õ¡Õ­ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¾Õ¸Ö‚Õ´ Õ§ &quot;?1?&quot;-Õ« Õ°Õ¥Õ¿, Õ¸Ö€Õ¨ Õ¤Õ¸Ö‚Ö„ Õ¹Õ¥Ö„ Ö…Õ£Õ¿Õ¡Õ£Õ¸Ö€Õ®Õ¸Ö‚Õ´:">
+<!ENTITY viewList.label "Õ†Õ¡ÕµÕ¥Õ¬ Ö†Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ¨">
+<!ENTITY visitHomepage.label "Ô±ÕµÖÕ¥Õ¬Õ¥Õ¬ Õ¯Õ¡ÕµÖ„">
+<!ENTITY addSubscription.label "Ô±Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶">
+<!ENTITY dialog.title "Ô²Õ¡Ö€Õ« Õ£Õ¡Õ¬Õ¸Ö‚Õ½Õ¿ Adblock Plus">
+<!ENTITY location.label "Õ–Õ«Õ¬Õ¿Ö€Õ¥Ö€Õ« &amp;Õ°Õ¡Õ½ÖÕ¥Õ¶`">
+<!ENTITY fromWeb.description "Õ€Õ¡Õ½Õ¿Õ¡Õ¿Õ¥Ö„ Õ¸Ö€ ÖÕ¡Õ¶Õ¯Õ¡Õ¶Õ¸Ö‚Õ´ Õ¥Ö„ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¸Ö‚Õ¶: Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ ÖƒÕ¸Õ²Õ¥Õ¬ Õ¢Õ¡ÕªÕ¡Õ¶Õ¸Ö€Õ¤Õ¡Õ£Ö€Õ¸Ö‚Õ©ÕµÕ¡Õ¶ Õ¾Õ¥Ö€Õ¶Õ¡Õ£Õ«Ö€Õ¨ Õ¯Õ¡Õ´ Õ°Õ¡Õ½ÖÕ¥Õ¶ Õ´Õ«Õ¹Ö‡ Õ¡Õ¾Õ¥Õ¬Õ¡ÖÕ¶Õ¥Õ¬Õ¨:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/composer.dtd
new file mode 100644
index 0000000..867e6ca
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "&amp;pada akhir dari alamat">
+<!ENTITY domainRestriction.label "Membatasi pada &amp; domain:">
+<!ENTITY collapse.default.no.label "Gunakan default (tidak)">
+<!ENTITY firstParty.label "&amp;Hanya untuk pihak pertama">
+<!ENTITY preferences.label "&amp;Tampilkan filter yang ada...">
+<!ENTITY pattern.label "Mencari pola">
+<!ENTITY thirdParty.label "Hanya pihak ke&amp;tiga">
+<!ENTITY filter.label "&amp;Tapis baru:">
+<!ENTITY collapse.label "&amp;tutup yang diblokir:">
+<!ENTITY match.warning "Pola yang Anda masukkan tidak lagi cocok dengan masuk daftar alamat yang akan diblokir/daftar putih dan tidak akan berpengaruh sama sekali.">
+<!ENTITY anchor.start.label "&amp;pada awal alamat">
+<!ENTITY matchCase.label "&amp;Sama persis">
+<!ENTITY custom.pattern.label "&amp;Kustom:">
+<!ENTITY unselectAllTypes.label "Tidak memilih apapun">
+<!ENTITY type.whitelist.label "Aturan p&amp;engabaian">
+<!ENTITY regexp.warning "Pola yang Anda masukkan akan dianggap sebagai regular expression yang tidak akan efisien untuk dapat diproses oleh Adblock Plus dan mungkin akan memperlambat pengalaman browsing Anda. Jika Anda tidak berniat untuk menggunakan regular expression, tambahkan tanda bintang (*) diakhir pola.">
+<!ENTITY dialog.title "Tambah aturan filter Adblock Plus">
+<!ENTITY basic.label "Tampilan dasar">
+<!ENTITY type.filter.label "&amp;Filter yang diblokir">
+<!ENTITY types.label "Terapkan untuk jenis:">
+<!ENTITY shortpattern.warning "Pola yang Anda masukkan terlalu pendek untuk dapat disempurnakan dan mungkin memperlambat pengalaman berselancar Anda. Anda disarankan untuk memilih lagi karakter yang lebih panjang untuk saringan ini untuk memungkinkan Adblock Plus mengolah saringan agar lebih efisien.">
+<!ENTITY collapse.yes.label "Ya">
+<!ENTITY anchors.label "Hanya menerima pola:">
+<!ENTITY collapse.default.yes.label "Gunakan default (Ya)">
+<!ENTITY domainRestriction.help "Gunakan pilihan ini untuk menentukan satu atau lebih domain yang dipisahkan oleh sebuah garis bar(|). Filter hanya akan diterapkan pada domain yang dipilih. Sebuah tilde (~) sebelum nama domain menunjukkan bahwa filter tidak akan diterapkan pada domain tersebut.">
+<!ENTITY accept.label "Tambahkan filter">
+<!ENTITY options.label "Pilihan">
+<!ENTITY disabled.warning "Adblock Plus sedang dimatikan. Anda masih dapat menambahkan filter tetapi mereka tidak akan diterapkan kecuali Anda [link] mengaktifkan Adblock Plus [/link].">
+<!ENTITY anchor.start.flexible.label "&amp;pada awal nama domain">
+<!ENTITY collapse.no.label "Tidak">
+<!ENTITY selectAllTypes.label "Pilih Semua">
+<!ENTITY advanced.label "Tampilan lanjutan">
+<!ENTITY pattern.explanation "Pola dapat menjadi bagian dari alamat; tanda bintang (*) bertindak sebagai wildcard. Filter hanya akan diterapkan ke alamat yang cocok dengan pola yang diberikan.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/filters.dtd
new file mode 100644
index 0000000..6136b99
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Semua penyesuaian penyaring Anda akan digantikan oleh isi berkas yang dipilih. Apakah Anda ingin memproses?">
+<!ENTITY slow.column "Penyaring Slo&amp;w">
+<!ENTITY enabled.column "Hidupka&amp;n">
+<!ENTITY subscription.lastDownload.checksumMismatch "Gagal, checksum berbeda">
+<!ENTITY noFiltersInGroup.text "Kelompok yang dipilih kosong.">
+<!ENTITY subscription.actions.label "Tindakan">
+<!ENTITY filter.selectAll.label "Pilih semua">
+<!ENTITY backupButton.label "&amp;Cadangan dan Pengembalian">
+<!ENTITY restore.minVersion.warning "Peringatan: berkas telah dibuat dengan versi Adblock Plus yang lebih baru. Anda harus memperbarui ke versi Adblock Plus terbaru sebelum mengembalikan dari berkas ini.">
+<!ENTITY restore.error "Data berkas tidak bisa diproses, mungkin ini bukan berkas cadangan Adblock Plus?">
+<!ENTITY sort.ascending.label "Urutkan dari A &gt; Z">
+<!ENTITY sort.label "&amp;Urutkan dari">
+<!ENTITY subscription.source.label "Daftar penyaring">
+<!ENTITY hitcount.column "Sasaran">
+<!ENTITY noFilters.text "Anda belum memiliki penyesuaian penyaring apapun.">
+<!ENTITY backup.custom.title "Hanya penyesuaian penyaring">
+<!ENTITY subscription.external.label "Diperbarui oleh ekstensi lain">
+<!ENTITY subscription.delete.label "Hapus">
+<!ENTITY noGroupSelected.text "Anda perlu memilih kelompok penyaring sebelum penyaring dapat ditampilkan.">
+<!ENTITY filter.cut.label "Potong">
+<!ENTITY restore.default.label "Mengembalikan cadangan dari ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Mengunduh…">
+<!ENTITY subscriptions.tab.label "Penyaring langganan">
+<!ENTITY sort.descending.label "Urutkan dari Z &gt; A">
+<!ENTITY filters.remove.warning "Apakah Anda sungguh ingin menghapus semua penyaring yang dipilih?">
+<!ENTITY filter.delete.label "Hapus">
+<!ENTITY addSubscriptionAdd.label "Tambahkan">
+<!ENTITY viewMenu.label "Lihat">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY addSubscriptionCancel.label "Batal">
+<!ENTITY subscription.enabled.label "Diaktifkan">
+<!ENTITY noSubscriptions.text "Anda belum menambahkan penyaring langganan apapun. Adblock Plus tidak akan memblok apapun tanpa penyaring, silahkan gunakan &quot;Tambahkan penyaring langganan&quot; untuk menambahkan.">
+<!ENTITY subscription.update.label "Perbarui penyaring">
+<!ENTITY dialog.title "Preferensi Penyaring Adblock Plus">
+<!ENTITY addFilter.label "Tambahkan penyaring">
+<!ENTITY subscription.minVersion.warning "Penyaring langganan memerlukan versi Adblock Plus yang lebih baru, Anda harus memperbarui ke versi Adblock Plus terbaru.">
+<!ENTITY subscription.lastDownload.invalidURL "Gagal, bukan alamat yang benar">
+<!ENTITY backup.error "Ada kesalahan penulisan penyaring ke berkas. Pastikan berkas tidak diproteksi atau sedang digunakan aplikasi lain.">
+<!ENTITY filter.moveUp.label "Ke atas">
+<!ENTITY addGroup.label "Tambahkan penyaring dan kelompok">
+<!ENTITY filter.edit.label "Sunting">
+<!ENTITY subscription.showHideFilters.label "Tampilkan/sembunyikan penyaring">
+<!ENTITY acceptableAds2.label "Ijinkan beberapa iklan yang bukan dan mengganggu">
+<!ENTITY addSubscriptionOther.label "Tambahkan skrip yang berbeda">
+<!ENTITY close.label "Tutup">
+<!ENTITY sort.none.label "&amp;Belum diurutkan">
+<!ENTITY filter.actions.label "Tindakan penyaring">
+<!ENTITY filter.copy.label "Salin">
+<!ENTITY filter.moveDown.label "Ke bawah">
+<!ENTITY filter.resetHitCounts.label "Reset kembali statistik kunjungan">
+<!ENTITY readMore.label "Baca lebih lanjut">
+<!ENTITY subscription.moveUp.label "Ke atas">
+<!ENTITY addSubscription.label "Tambahkan penyaring">
+<!ENTITY subscription.homepage.label "Beranda">
+<!ENTITY backup.complete.title "Semua penyaring dan langganan">
+<!ENTITY restore.own.label "Mengembalikan cadangan sendiri">
+<!ENTITY restore.complete.warning "Semua preferensi penyaring Anda akan digantikan oleh isi berkas yang dipilih. Apakah Anda ingin memproses?">
+<!ENTITY filters.tab.label "Penyesuaian penyaring">
+<!ENTITY backup.label "Membuat cadangan baru">
+<!ENTITY find.label "Cari">
+<!ENTITY subscription.moveDown.label "Ke bawah">
+<!ENTITY subscription.lastDownload.connectionError "Gagal, gagal mengunduh">
+<!ENTITY subscription.lastDownload.success "Sukses">
+<!ENTITY subscription.lastDownload.invalidData "Gagal, bukan daftar penyaring yang benar">
+<!ENTITY filter.paste.label "Tempel">
+<!ENTITY subscription.disabledFilters.enable "Aktifkan penyaring yang dinonaktifkan">
+<!ENTITY lasthit.column "Sasaran terakhir">
+<!ENTITY subscription.editTitle.label "Sunting judul">
+<!ENTITY subscription.disabledFilters.warning "Beberapa penyaring di layanan langganan ini dinonaktifkan.">
+<!ENTITY filter.column "Aturan penyaring">
+<!ENTITY subscription.lastDownload.label "Unduhan terakhir:">
+<!ENTITY viewList.label "Lihat daftar">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/firstRun.properties
new file mode 100644
index 0000000..573f16c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Menjelajah secara rahasia dengan menonaktifkan pelacakan - menyembunyikan jejak Anda dari perusahaan iklan yang akan melacak setiap langkah Anda.
+firstRun_toggle_off=OFF
+firstRun_feature_tracking=Nonaktifkan Pelacakan
+firstRun_feature_malware=Memblokir malware
+firstRun_title=Adblock Plus telah diinstal
+firstRun_acceptableAdsExplanation=Kami ingin mendorong situs web untuk menggunakan iklan langsung yang tidak mengganggu. Itu sebabnya kami telah menetapkan <a>Peraturan ketat</a> untuk mengenali iklan yang bisa diterima, yang akan ditampilkan di dalam pengaturan default. Jika Anda masih ingin memblokir setiap iklan, Anda dapat <a>menonaktifkan</a> ini dalam beberapa detik.
+firstRun_toggle_on=ON
+firstRun_contributor_credits=Kredit Kontributor
+firstRun_dataCorruptionWarning=Apakah halaman ini tetap muncul? <a>Klik disini!</a>
+firstRun_acceptableAdsHeadline=Sekarang iklan yang mengganggu akan diblokir
+firstRun_share=Beritahu teman Anda
+firstRun_share_headline=<a>Bantulah kami</a> dalam membuat web menjadi tempat yang lebih baik
+firstRun_features=Adblock Plus dapat melakukan lebih dari sekedar pemblokiran iklan
+firstRun_feature_malware_description=Membuat penjelajahan Anda lebih aman dengan cara memblokir domain yang dikenal sebagai malware.
+firstRun_feature_social_description=Secara otomatis membersihkan tombol media sosial, seperti Facebook Like, yang muncul pada halaman web dan melacak perilaku Anda.
+firstRun_donate=donasi
+firstRun_donate_label=Dukung proyek ini
+firstRun_feature_social=Hapus Tombol Media Sosial
+firstRun_legacySafariWarning=Anda menggunakan versi lama Safari yang tidak didukung oleh Adblock Plus. Mungkin tidak akan bekerja dengan baik atau bahkan mengganggu pengalaman pengguna di beberapa website. Kami sangat menyarankan sebaiknya memperbarui ke Safari 6.1.1 atau lebih tinggi (pada OS X 10.8 Mountain Lion), atau Safari 7.0.1 atau lebih tinggi (pada OS X 10.9 Mavericks), atau gunakan versi terbaru dari Mozilla Firefox, Google Chrome atau Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/global.properties
new file mode 100644
index 0000000..42fbf15
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Tidak ada item yang dapat diblok di halaman ini
+action3_tooltip=Klik untuk mengaktifkan/menonaktifkan Adblock Plus.
+notification_antiadblock_title=Sembunyikan pesan yang dipilih?
+type_label_script=script
+filter_elemhide_nocriteria=Tidak ada kriteria yang ditentukan untuk mengenali unsur yang disembunyikan
+blockingGroup_title=Aturan pemblokiran iklan
+whitelisted_tooltip=Adblock Plus dinonaktifkan pada halaman ini.
+type_label_stylesheet=stylesheet
+blocked_count_tooltip=?1? dari ?2?
+type_label_font=font
+type_label_popup=Jendela pop-up
+filter_regexp_tooltip=Filter ini adalah regular expression atau terlalu pendek untuk dioptimalkan. Penggunaan filter yang terlalu banyak akan memperlambat browsing Anda.
+action0_tooltip=Klik untuk memunculkan menu, klik tengah untuk mengaktifkan/menonaktifkan.
+whitelisted_page=Adblock Plus telah dinonaktifkan untuk halaman ini
+remove_group_warning=Anda benar-benar ingin menghapus kelompok ini?
+action1_tooltip=Klik untuk membuka/menutup item yang dapat diblok, klik tengah untuk mengaktifkan/menonaktifkan.
+type_label_xmlhttprequest=permintaan XML
+active_tooltip=Adblock Plus diaktifkan, ?1? filter subscription(s) dan ?2? custom filter(s) digunakan.
+type_label_document=dokumen
+type_label_object_subrequest=objek subrequest
+whitelistGroup_title=Aturan pengecualian
+disabled_tooltip=Adblock Plus dinonaktifkan.
+filter_elemhide_duplicate_id=Hanya satu ID dari unsur yang akan disembunyikan dapat ditentukan
+type_label_object=Obyek
+action2_tooltip=Klik untuk membuka preferensi, klik tengah untuk mengaktifkan/menonaktifkan.
+type_label_subdocument=bingkai
+clearStats_warning=Ini akan menyetel ulang semua filter statistik kunjungan dan menonaktifkan filter penghitung kunjungan. Apakah Anda ingin melanjutkan?
+notification_antiadblock_message=Situs ini dikenal sebagai penunjuk pesan yang dipilih terhadap pengguna Adblock Plus. Apakah anda ingin Adblock Plus menyembunyikan pesan yang dipilih?
+blocked_count_addendum=(Dalam daftar putih:?1?, tersembunyi:?2?)
+subscription_invalid_location=Filter daftar lokasi bukanlah URL valid maupun nama file yang valid.
+type_label_image=gambar
+remove_subscription_warning=Apakah anda yakin ingin menghapus langganan ini?
+type_label_other=Lainnya
+mobile_menu_enable=ABP: Aktifkan
+type_label_media=audio/video
+mobile_menu_disable_site=ABP: Menonaktifkan pada ?1?
+elemhideGroup_title=Aturan penyembunyian elemen
+mobile_menu_enable_site=ABP: Aktifkan pada ?1?
+type_label_elemhide=tersembunyi
+newGroup_title=Kelompok penyaring baru
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/overlay.dtd
new file mode 100644
index 0000000..0cb31d3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Iya">
+<!ENTITY notification.button.no "&amp;Tidak">
+<!ENTITY sync.label "Syn&amp;c pengaturan Adblock Plus">
+<!ENTITY whitelist.site.label "Non aktifkan pada ?1?">
+<!ENTITY filters.label "&amp;Preferensi penyaring">
+<!ENTITY disable.label "Non aktifkan disemua tempat">
+<!ENTITY objecttab.title "Blokir">
+<!ENTITY objecttab.tooltip "Klik disini untuk memblokir objek ini dengan Adblock Plus">
+<!ENTITY menuitem.label "Preferensi Ad&amp;block Plus">
+<!ENTITY objecttabs.label "&amp;Tunjukkan tab pada Flash dan Java">
+<!ENTITY sendReport.label "&amp;Laporkan masalah pada halaman ini">
+<!ENTITY whitelist.page.label "Non aktifkan pada halaman ini saja">
+<!ENTITY context.image.label "Adblock Plus: Blokir gambar">
+<!ENTITY counthits.label "Menghitung filter &amp;kunjungan">
+<!ENTITY opensidebar.label "Buka &amp;item yang dapat diblok">
+<!ENTITY notification.button.close "&amp;Tutup">
+<!ENTITY contribute.label "Kontribusi untuk Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Blokir bingkai">
+<!ENTITY blocked.tooltip "Blokir item pada halaman ini:">
+<!ENTITY hideplaceholders.label "Sembunyikan p&amp;laceholders dari unsur pemblokiran">
+<!ENTITY showinstatusbar.label "Tunjukkan di &amp;status bar">
+<!ENTITY sidebar.title "Item yang dapat diblok di halaman ini">
+<!ENTITY options.label "&amp;Pilihan">
+<!ENTITY context.object.label "Adblock Plus: Blokir objek">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Mengaktifkan ulang pada halaman ini">
+<!ENTITY filters.tooltip "Filter paling aktif:">
+<!ENTITY closesidebar.label "Tutup &amp;item yang dapat diblok">
+<!ENTITY showintoolbar.label "Tunjukkan di tool&amp;bar">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Blokir audio/video">
+<!ENTITY subscription.update.label "Perbarui penyaring">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/sendReport.dtd
new file mode 100644
index 0000000..98a4903
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Batalkan">
+<!ENTITY issues.disabledgroups.description "Filter langganan / kelompok filter ini dinonaktifkan, namun mungkin tetap akan memliki efek pada halaman ini:">
+<!ENTITY showData.label "Tunjukkan data laporan">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus memblokir terlalu &amp;banyak">
+<!ENTITY issues.change.description "Konfigurasi Anda telah diubah. Silahkan muat ulang halaman untuk menguji perubahan dan kirimkan laporan jika masalah belum terselesaikan oleh perubahan tersebut.">
+<!ENTITY email.label "Email:">
+<!ENTITY issues.openPreferences.label "Buka preferensi filter">
+<!ENTITY sendPage.confirmation "Laporan Anda telah disimpan. Anda dapat mengaksesnya pada alamat berikut:">
+<!ENTITY copyLink.label "&amp;Copy link laporan">
+<!ENTITY issues.nofilters.description "Adblock Plus tidak memblokir apapun pada halaman ini. Masalah yang Anda alami tidak ada kaitannya dengan Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Masalah yang Anda laporkan mungkin sudah dikenal. Informasi selanjutnya:">
+<!ENTITY typeSelector.other.description "Pilih opsi ini jika Anda mencurigai masalah dengan Adblock Plus sendiri daripada filter nya.">
+<!ENTITY issues.disabledgroups.enable.label "Aktifkan filter langganan / kelompok filter">
+<!ENTITY typeWarning.override.label "Saya mengerti dan ingin mengirim laporan">
+<!ENTITY issues.disabled.enable.label "Aktifkan Adblock Plus">
+<!ENTITY update.fixed.description "Pembaharuan filter langganan Anda sepertinya menyelesaikan masalah yang Anda laporkan. Silahkan buka kembali halaman dan coba kembali, klik Laporkan lagi jika masih terdapat masalah.">
+<!ENTITY anonymous.label "&amp;Penyerahan anonim">
+<!ENTITY reloadButton.label "&amp;Muat ulang halaman">
+<!ENTITY recentReports.clear.label "&amp;Hapus semua laporan">
+<!ENTITY typeSelector.description "Jendela ini akan memandu Anda melalui langkah-langkah yang diperlukan untuk penyerahan laporan masalah Adblock plus. Pertama, silakan pilih jenis masalah yang Anda alami di halaman ini:">
+<!ENTITY screenshot.remove.label "&amp;Hapus semua data sensitif">
+<!ENTITY issues.ownfilters.description "Beberapa dari filter yang diterapkan pada halaman ini ditetapkan oleh pengguna. Silahkan nonaktifkan filter yang mungkin menyebabkan masalah:">
+<!ENTITY update.inProgress.description "Adblock Plus perlu memperbaharui langganan filter Anda untuk memastikan bahwa masalah belum bisa diselesaikan. Harap tunggu...">
+<!ENTITY sendPage.retry.label "Kirim kembali">
+<!ENTITY data.label "Data laporan:">
+<!ENTITY recentReports.label "Anda baru saja mengirimkan laporan">
+<!ENTITY typeWarning.description "Anda menyatakan bahwa Anda ingin melaporkan masalah umum dengan Adblock Plus daripada masalah filter. Silahkan catat bahwa masalah seperti ini lebih baik dilaporkan pada [link]Forum Adblock Plus[/link]. Anda hanya perlu menggunakan pelaporan masalah untuk melengkapi diskusi yang ada, karena tidak ada seorangpun yang melihat laporan Anda kecuali Anda memberi mereka link untuk masalah tersebut. Link otomatis akan diberikan setelah mengirimkan laporan.">
+<!ENTITY issues.disabled.description "Adblock Plus dinonaktifkan, ini tidak akan memblokir apapun dalam keadaan ini.">
+<!ENTITY attachExtensions.label "Lampirkan daftar ekstensi aktif pada laporan jika konflik pengaya adalah penyebab dari masalah tersebut">
+<!ENTITY issues.nosubscriptions.add.label "Tambahkan filter langganan">
+<!ENTITY issues.disabledfilters.enable.label "Aktifkan filter">
+<!ENTITY issues.override.label "&amp;Konfigurasi benar, lanjutkan dengan laporkan">
+<!ENTITY issues.nosubscriptions.description "Anda tidak berlangganan satupun dari filter bawaan yang secara otomatis menghapus konten yang tidak diinginkan pada situs web.">
+<!ENTITY typeSelector.falsePositive.description "Pilih opsi ini jika halaman kurang memiliki konten penting, salah menampilkan atau tidak berfungsi dengan benar. Anda dapat menentukan apakah Adblock Plus adalah penyebab masalah dengan menonaktifkannya untuk sementara.">
+<!ENTITY typeSelector.other.label "Masalah lainnya">
+<!ENTITY emailComment.label "Kami menganjurkan Anda untuk memasukkan alamat email yang valid sehingga kami dapat menghubungi Anda jika terdapat pertanyaan tentang laporan Anda. Ini juga akan memungkinkan kami untuk mengetahui kontribusi Anda dan meninggikan prioritas.">
+<!ENTITY issues.whitelist.remove.label "Aktifkan kembali Adblock Plus pada halaman ini">
+<!ENTITY outdatedSubscriptions.description "Filter langganan ini belum diperbaharui setidaknya dua minggu. Silahkan perbaharui langganan ini sebelum mengirimkan laporan masalah yang mungkin sudah terselesaikan sebelumnya.">
+<!ENTITY dataCollector.description "Silahkan tunggu beberapa saat sementara Adblock Plus mengumpulkan data yang dibutuhkan.">
+<!ENTITY sendButton.label "Kirim laporan">
+<!ENTITY comment.label "&amp;Komentar (pilihan):">
+<!ENTITY sendPage.errorMessage "Upaya mengirimkan laporan gagal dengan kode kesalahan &quot;?1?&quot;. Silahkan pastikan Anda terhubung ke Internet dan coba kembali. Jika masalah berlanjut, silahkan meminta bantuan pada [link]Forum Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Tampilkan laporan yang baru disampaikan">
+<!ENTITY commentPage.heading "Masukkan Komentar">
+<!ENTITY update.start.label "Mulai pembaharuan sekarang">
+<!ENTITY issues.disabledfilters.description "Filter ini dinonaktifkan, namun mungkin masih mempunyai efek pada halaman ini:">
+<!ENTITY screenshot.description "Halaman yang sama dapat terlihat berbeda untuk berbagai orang. Ini dapat membantu kami untuk memahami masalah jika Anda melampirkan sebuah screenshot pada laporan Anda. Anda dapat menghapus bagian yang mengandung informasi sensitif serta tandai daerah dimana masalah tersebut terjadi. Untuk melakukannya klik sesuai tombol dan pilih bagian dari gambar dengan mouse Anda.">
+<!ENTITY screenshot.attach.label "Lampirkan gambar halaman untuk melaporkan">
+<!ENTITY issues.whitelist.description "Adblock Plus sedang dinonaktifkan pada halaman yang Anda laporkan. Silahkan aktifkan dan muat ulang halaman sebelum mengirimkan laporan untuk membantu peyelidikan masalah ini.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus tidak memblokir sebuah &amp;iklan">
+<!ENTITY typeSelector.heading "Pilih tipe laporan">
+<!ENTITY anonymity.warning "Kami tidak dapat menghubungi Anda kembali dan akan menurunkan prioritas laporan ini.">
+<!ENTITY wizard.title "Pelaporan">
+<!ENTITY issues.ownfilters.disable.label "Nonaktifkan filter">
+<!ENTITY commentPage.description "Kotak teks di bawah ini memungkinkan Anda untuk memasukkan komentar untuk membantu kami memahami masalah. Langkah ini bersifat pilihan tetapi dianjurkan jika masalahnya tidak jelas. Anda juga dapat memeriksa data laporan sebelum dikirim.">
+<!ENTITY comment.lengthWarning "Panjang komentar Anda melebihi 1000 karakter. Hanya 1000 karakter pertama yang akan dikirim.">
+<!ENTITY typeSelector.falseNegative.description "Pilih opsi ini jika iklan ditampilkan meskipun Adblock Plus telah diaktifkan.">
+<!ENTITY sendPage.waitMessage "Silahkan tunggu sementara Adblock Plus mengirimkan laporan Anda.">
+<!ENTITY dataCollector.heading "Selama datang di pelaporan masalah">
+<!ENTITY screenshot.heading "Lampirkan screenshot">
+<!ENTITY sendPage.heading "Kirim laporan">
+<!ENTITY issues.subscriptionCount.description "Tampaknya Anda berlangganan filter langganan terlalu banyak. Pengaturan ini tidak dianjurkan karena akan membuat masalah semakin tinggi. Kami juga tidak dapat menerima laporan masalah karena tidak jelas filter langganan mana yang pembuat butuhkan untuk menindak lanjuti. Silahkan hapus semua selain yang benar-benar dibutuhkan dan uji apakah masalah masih terjadi.">
+<!ENTITY screenshot.mark.label "&amp;Tandai masalah">
+<!ENTITY privacyPolicy.label "Kebijakan privasi">
+<!ENTITY issues.description "Adblock Plus mendeteksi masalah pada pengaturan Anda yang mungkin adalah penyebab dari masalah atau akan membuat laporan penyelidikan menjadi sulit.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/sidebar.dtd
new file mode 100644
index 0000000..a6f02e1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Border item yang ber-flash">
+<!ENTITY address.label "Alamat">
+<!ENTITY context.open.label "Buka di tab baru">
+<!ENTITY type.label "Ketik">
+<!ENTITY tooltip.filterSource.label "Sumber filter:">
+<!ENTITY noitems.label "Tidak ada item yang bisa diblok">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Ukuran:">
+<!ENTITY reattach.label "Sertakan kembali">
+<!ENTITY search.label "&amp;Cari:">
+<!ENTITY docDomain.thirdParty "(pihak ketiga)">
+<!ENTITY filterSource.label "Sumber filter">
+<!ENTITY tooltip.docDomain.label "Sumber dokumen:">
+<!ENTITY context.copy.label "Salin alamat item">
+<!ENTITY tooltip.type.label "Tipe:">
+<!ENTITY context.disablefilter.label "Nonaktifkan filter ?1?">
+<!ENTITY context.copyFilter.label "Salin filter">
+<!ENTITY context.block.label "Blokir item ini">
+<!ENTITY context.enablefilter.label "Hidupkan ulang filter ?1?">
+<!ENTITY detach.label "Lepas">
+<!ENTITY whitelisted.label "Halaman yang dibebaskan">
+<!ENTITY context.disablefilteronsite.label "Nonaktifkan filter ini pada ?1?">
+<!ENTITY detached.title "Adblock Plus: Item yang bisa diblok (dilepaskan)">
+<!ENTITY docDomain.firstParty "(pihak pertama)">
+<!ENTITY tooltip.type.whitelisted "(dibebaskan)">
+<!ENTITY tooltip.filter.label "Efek filter:">
+<!ENTITY tooltip.filter.disabled "(dinonaktifkan)">
+<!ENTITY context.editfilter.label "Edit efek filter">
+<!ENTITY tooltip.type.blocked "(diblokir)">
+<!ENTITY size.label "Ukuran">
+<!ENTITY context.whitelist.label "Tambahkan Aturan pengecualian untuk item">
+<!ENTITY context.selectAll.label "Pilih semua">
+<!ENTITY state.label "Bagian">
+<!ENTITY docDomain.label "Sumber dokumen">
+<!ENTITY tooltip.address.label "Alamat:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/subscriptionSelection.dtd
new file mode 100644
index 0000000..4092dd2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/id/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Tambahkan filter &amp;langganan &quot;?1?&quot; juga">
+<!ENTITY list.download.failed "Adblock Plus gagal untuk mengambil daftar langganan.">
+<!ENTITY list.download.retry "Coba lagi">
+<!ENTITY title.label "&amp;Judul langganan:">
+<!ENTITY list.download.website "Lihat situs">
+<!ENTITY supplementMessage "Filter langganan ini dimaksudkan untuk digunakan dengan filter langganan &quot;?1?&quot; yang Anda tidak menggunakannya lagi.">
+<!ENTITY viewList.label "Lihat filter">
+<!ENTITY visitHomepage.label "Kunjungi situs web">
+<!ENTITY addSubscription.label "Tambahkan langganan">
+<!ENTITY dialog.title "Tambahkan filter langganan Adblock Plus">
+<!ENTITY location.label "&amp;Lokasi daftar filter:">
+<!ENTITY fromWeb.description "Silahkan konfirmasi bahwa Anda ingin menambahkan filter langganan. Anda dapat merubah judul langganan atau lokasi sebelum menambahkannya.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/composer.dtd
new file mode 100644
index 0000000..1e7a125
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "í en&amp;da netfangs">
+<!ENTITY domainRestriction.label "&amp;Takmarka við lén:">
+<!ENTITY collapse.default.no.label "Nota sjálfgefið (nei)">
+<!ENTITY firstParty.label "Aðeins fy&amp;rsta aðila">
+<!ENTITY preferences.label "Sýna nú&amp;verandi síur...">
+<!ENTITY pattern.label "Leita að mynstri">
+<!ENTITY thirdParty.label "&amp;Aðeins þriðja aðila">
+<!ENTITY filter.label "Ný &amp;sía:">
+<!ENTITY collapse.label "Fella sa&amp;man lokaða hluti:">
+<!ENTITY match.warning "Mynstrið sem þú slóst inn passar ekki ekki við veffangið sem á að loka á/hvítlista og mun ekki hafa nein áhrif á það.">
+<!ENTITY anchor.start.label "í &amp;byrjun netfangs">
+<!ENTITY matchCase.label "&amp;Passa við stafstöðu">
+<!ENTITY custom.pattern.label "Sérs&amp;nið:">
+<!ENTITY unselectAllTypes.label "Velja ekkert">
+<!ENTITY type.whitelist.label "&amp;Frávikregla">
+<!ENTITY regexp.warning "Mynstrið sem þú slóst inn verður túlkað sem regluleg segð. Margar reglulegar segðir gætu haft þau áhrif að hægja á vöfrun. Ef þú ætlar ekki að nota reglulega segðir, bættu þá * tákni við enda mynstursins.">
+<!ENTITY dialog.title "Bæta við Adblock Plus síureglu">
+<!ENTITY basic.label "Einföld sýn">
+<!ENTITY type.filter.label "&amp;Lokunarsía">
+<!ENTITY types.label "Virkja fyrir tegundir:">
+<!ENTITY shortpattern.warning "Mynstrið sem þú slóst inn er of stutt til að hægt sé að nota það, of mörg svona mynstur geta hægt á vöfrun. Mælt er með að þú notir lengri streng fyrir þessa síu.">
+<!ENTITY collapse.yes.label "Já">
+<!ENTITY anchors.label "Aðeins samþykkja mynstur:">
+<!ENTITY collapse.default.yes.label "Nota sjálfgefið (já)">
+<!ENTITY domainRestriction.help "Sláðu inn eitt eða fleiri lén aðskilið með tákninu (|). Sían verður aðeins beitt á þessi lén. Táknið (~) fyrir framan lén þýðir að ekki ætti að beita síunni á það lén.">
+<!ENTITY accept.label "Bæta við síu">
+<!ENTITY options.label "Valkostir">
+<!ENTITY disabled.warning "Adblock Plus er óvirkt eins og er. Þú getur samt bætt við síum en síurnar munu ekki vera virkar nema þú [link]virkjir Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "í &amp;byrjun lénsins">
+<!ENTITY collapse.no.label "Nei">
+<!ENTITY selectAllTypes.label "Velja allt">
+<!ENTITY advanced.label "Ãtarleg sýn">
+<!ENTITY pattern.explanation "Mynstrið getur verið hvaða hluti sem er í netfanginu; táknið (*) virkar sem algildisstafur. Síunni verður aðeins beitt á þau netföng sem passa við mynstrið.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/filters.dtd
new file mode 100644
index 0000000..d22adad
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Allar sérsniðnar síur verða yfirskrifaðar af skrá. Viltu halda áfram?">
+<!ENTITY slow.column "H&amp;ægar síur">
+<!ENTITY enabled.column "&amp;Virkt">
+<!ENTITY subscription.lastDownload.checksumMismatch "Mistókst, prófsumma stemmir ekki">
+<!ENTITY noFiltersInGroup.text "Valinn hópur er tómur.">
+<!ENTITY subscription.actions.label "Aðgerðir">
+<!ENTITY filter.selectAll.label "Velja allt">
+<!ENTITY backupButton.label "&amp;Afrita og endurheimta">
+<!ENTITY restore.minVersion.warning "Aðvörun: skráin var búin til að nýrri útgáfu af Adblock Plus. Þú ættir að uppfæra í nýjustu útgáfu af Adblock Plus áður en þú endurheimtir þessa skrá.">
+<!ENTITY restore.error "Ekki tókst að lesa skráargögn, kannski er skráin ekki Adblock Plus afritunarskrá?">
+<!ENTITY sort.ascending.label "&amp;A &gt; Ö röðun">
+<!ENTITY sort.label "Raða e&amp;ftir">
+<!ENTITY subscription.source.label "Sía lista">
+<!ENTITY hitcount.column "&amp;Notkun">
+<!ENTITY noFilters.text "Þú ert ekki ennþá með neina sérsniðna síu.">
+<!ENTITY backup.custom.title "Aðeins sérsniðnar síur">
+<!ENTITY subscription.external.label "Uppfært af annarri viðbót">
+<!ENTITY subscription.delete.label "Eyða">
+<!ENTITY noGroupSelected.text "Þú verður að velja síuhóp áður en hægt er að birta síur.">
+<!ENTITY filter.cut.label "Klippa">
+<!ENTITY restore.default.label "Endurheimta afrit frá ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Hleður…">
+<!ENTITY subscriptions.tab.label "Síu áskriftir">
+<!ENTITY sort.descending.label "&amp;Ö &gt; A röðun">
+<!ENTITY filters.remove.warning "Viltu örugglega fjarlægja alla valdar síur?">
+<!ENTITY filter.delete.label "Eyða">
+<!ENTITY addSubscriptionAdd.label "Bæta við">
+<!ENTITY viewMenu.label "Skoða">
+<!ENTITY subscription.lastDownload.unknown "Óþekkt">
+<!ENTITY addSubscriptionCancel.label "Hætta við">
+<!ENTITY subscription.enabled.label "Virkt">
+<!ENTITY noSubscriptions.text "Þú hefur ekki ennþá bætt við áskrift að síu. Adblock Plus virkar ekki
+ án þess að vera með síur, notaðu &quot;Bæta við síuáskrift&quot; til
+ að bæta við síuáskrift.">
+<!ENTITY subscription.update.label "Uppfæra síur">
+<!ENTITY dialog.title "Adblock Plus síu stillingar">
+<!ENTITY addFilter.label "Bæta við sí&amp;u">
+<!ENTITY subscription.minVersion.warning "Þessi síuáskrift þarfnast nýrri útáfu af Adblock Plus, þú ættir að uppfæra í nýjustu útgáfu.">
+<!ENTITY subscription.lastDownload.invalidURL "Mistókst, ekki gilt netfang">
+<!ENTITY backup.error "Upp kom villa við að skrifa síur í skránna. Gakktu úr skugga um að skráin sé ekki ritvarin eða í notkun af öðru forriti.">
+<!ENTITY filter.moveUp.label "Færa upp">
+<!ENTITY addGroup.label "Bæta við síu&amp;hóp">
+<!ENTITY filter.edit.label "Breyta">
+<!ENTITY subscription.showHideFilters.label "Sýna/fela síur">
+<!ENTITY acceptableAds2.label "Leyfa auglýs&amp;ingar sem eru ekki uppáþrengjandi">
+<!ENTITY addSubscriptionOther.label "Bæta við öðruvísi áskrift">
+<!ENTITY close.label "Loka">
+<!ENTITY sort.none.label "Ó&amp;raðað">
+<!ENTITY filter.actions.label "Síu aðgerðir">
+<!ENTITY filter.copy.label "Afrita">
+<!ENTITY filter.moveDown.label "Færa niður">
+<!ENTITY filter.resetHitCounts.label "Endurstilla síu teljara">
+<!ENTITY readMore.label "Lesa meira">
+<!ENTITY subscription.moveUp.label "Færa upp">
+<!ENTITY addSubscription.label "&amp;Bæta við síuáskrift">
+<!ENTITY subscription.homepage.label "Heimasíða">
+<!ENTITY backup.complete.title "Allar síur og áskriftir">
+<!ENTITY restore.own.label "Endurheimta eigið afrit">
+<!ENTITY restore.complete.warning "Allar síustillingar verða yfirskrifaðar af skrá. Viltu halda áfram?">
+<!ENTITY filters.tab.label "Sérsniðnar síur">
+<!ENTITY backup.label "Búa til nýtt afrit">
+<!ENTITY find.label "&amp;Leita">
+<!ENTITY subscription.moveDown.label "Færa niður">
+<!ENTITY subscription.lastDownload.connectionError "Mistókst, gat ekki niðurhalað">
+<!ENTITY subscription.lastDownload.success "Tókst">
+<!ENTITY subscription.lastDownload.invalidData "Mistókst, ekki gildur síulisti">
+<!ENTITY filter.paste.label "Líma">
+<!ENTITY subscription.disabledFilters.enable "Virkja óvirkar síur">
+<!ENTITY lasthit.column "Seinast &amp;heimsótt">
+<!ENTITY subscription.editTitle.label "Breyta titli">
+<!ENTITY subscription.disabledFilters.warning "Sumar síur í þessari áskrift eru óvirkar.">
+<!ENTITY filter.column "Síu re&amp;gla">
+<!ENTITY subscription.lastDownload.label "Seinasta niðurhal:">
+<!ENTITY viewList.label "Skoða lista">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/firstRun.properties
new file mode 100644
index 0000000..a337e72
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Vafraðu örugglega með því að loka á að fylgst sé með þér - feldu þig frá auglýsinga fyrirtækjum sem geta fylgst með þér í hverju skrefi.
+firstRun_toggle_off=ÓVIRKT
+firstRun_feature_tracking=Slökkva á rakningu
+firstRun_feature_malware=Loka á spilliforrit
+firstRun_title=Adblock Plus var sett inn
+firstRun_toggle_on=VIRKT
+firstRun_acceptableAdsExplanation=Við viljum hvetja vefsvæði til að nota einfaldar auglýsingar, sem eru ekki uppáþrengjandi. Þess vegna höfum við sett fram <a>ákveðnar reglur</a> til að skilgreina ásættanlegar auglýsingar, sem eru birtar með venjulegum stillingum. Ef þú vilt loka á allar auglýsingar geturðu gert þetta <a>óvirkt</a> á einfaldan hátt.
+firstRun_contributor_credits=Stuðningsaðilar
+firstRun_dataCorruptionWarning=Er þessi síða alltaf að birtast? <a>Smelltu hér!</a>
+firstRun_acceptableAdsHeadline=Lokað verður á uppáþrengjandi auglýsingar
+firstRun_share=Láttu vini þína vita
+firstRun_share_headline=<a>Hjálpaðu okkur</a> í því að gera vefinn betri
+firstRun_feature_social_description=Taktu sjálfkrafa út samfélags hnappa, eins og Facebook hnappa, sem birtast á vefsíðum og fylgjast með þér.
+firstRun_filterlistsReinitializedWarning=Svo virðist sem að upp hafi komið vandamál sem gerði það að verkum að öllum síum var eytt og ekki var hægt að endurheimta. Þar af leiðandi þurfti að endurstilla allar síur og stillingar fyrir ásættanlegar auglýsingar. Athugaðu síu listana og stillingar fyrir ásættanlegar auglýsingar í <a>Adblock Plus stillingum</a>.
+firstRun_feature_malware_description=Gerðu netvafur öruggara með því að loka á þekkt hættuleg vefsvæði.
+firstRun_features=Adblock Plus getur gert meira heldur en að loka á auglýsingar
+firstRun_donate=gefa
+firstRun_donate_label=Styðja verkefnið
+firstRun_feature_social=Fjarlægja hnappa fyrir netsamfélög
+firstRun_legacySafariWarning=Þú ert að nota gamla útgáfu af Safari sem er ekki með stuðning frá Adblock Plus. Hugsanlega virkar hún ekki eða virkar illa á sumum vefsvæðum. Við mælum með að þú annað hvort uppfærir í Safari 6.1.1 eða hærri útgáfu (á Mac OS X 10.8 Mountain Lion), eða Safari 7.0.1 eða hærri (á OS X 10.9 Mavericks), eða notir nýjustu útgáfu af Mozilla Firefox, Google Chrome eða Opera.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/global.properties
new file mode 100644
index 0000000..775228d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Engir lokaðir hlutir á núverandi síðu
+action3_tooltip=Smelltu til að virkja/gera óvirkt Adblock Plus.
+notification_antiadblock_title=Fela áhugamiðuð skilaboð?
+type_label_script=skrifta
+filter_elemhide_nocriteria=Engin viðmiðun skilgreind til þess að bera kennsl á hlut til að fela
+blockingGroup_title=Lokunarreglur
+whitelisted_tooltip=Adblock Plus er í gangi en er óvirkur á núverandi síðu.
+type_label_stylesheet=stílblað
+blocked_count_tooltip=?1? af ?2?
+type_label_font=leturgerð
+type_label_popup=sprettigluggi
+filter_regexp_tooltip=Sían er annaðhvort regluleg segð eða of stutt til að hægt sé að nota. Of margar af svona síum gætu hægt á vöfrun.
+action0_tooltip=Smelltu til að birta valmynd, miðju smelltu á músinni til að virkja/gera óvirkt.
+whitelisted_page=Búið er að gera Adblock Plus óvirkt fyrir núverandi síðu
+remove_group_warning=Viltu fjarlægja þennan hóp?
+action1_tooltip=Smelltu til að opna/loka hlutum, miðju smella til að virkja/gera óvirkt.
+type_label_xmlhttprequest=XML beiðni
+active_tooltip=Adblock Plus er virkur, ?1? síu áskriftir og ?2? sérsniðnar síur í notkun.
+type_label_document=skjal
+type_label_object_subrequest=undiraðgerð hlutar
+whitelistGroup_title=Undantekningarreglur
+disabled_tooltip=Adblock Plus er óvirkur.
+filter_elemhide_duplicate_id=Aðeins er hægt að skilgreina eitt auðkenni fyrir hlut sem á að fela
+type_label_object=hlutur
+action2_tooltip=Smelltu til að opna stillingar, miðju smelltu til að virkja/gera óvirkt.
+type_label_subdocument=rammi
+clearStats_warning=Þetta mun endurstilla alla teljara á síunotkun og hætta að telja síunotkun. Viltu halda áfram?
+notification_antiadblock_message=Þetta vefsvæði er þekkt fyrir að sýna áhugamiðuð skilaboð til Adblock Plus notenda. Viltu að Adblock Plus feli þessi áhugamiðuð skilaboð?
+blocked_count_addendum=(einnig á hvítlista: ?1?, falið: ?2?)
+subscription_invalid_location=Staðsetning síu er ekki gilt URL eða gilt skráarnafn.
+type_label_image=mynd
+remove_subscription_warning=Viltu fjarlægja þessa áskrift?
+type_label_other=annað
+mobile_menu_enable=ABP: Virkja
+type_label_media=hljóð/mynd
+mobile_menu_disable_site=ABP: Óvirkt fyrir ?1?
+elemhideGroup_title=Felureglur
+mobile_menu_enable_site=ABP: Virkja fyrir ?1?
+type_label_elemhide=falið
+newGroup_title=Ný síu regla
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/overlay.dtd
new file mode 100644
index 0000000..6f94a02
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Já">
+<!ENTITY notification.button.no "&amp;Nei">
+<!ENTITY sync.label "Sa&amp;mstilla Adblock Plus stillingar">
+<!ENTITY whitelist.site.label "Gera óvirkt á ?1?">
+<!ENTITY filters.label "&amp;Síu stillingar">
+<!ENTITY disable.label "Slökkva á allstaðar">
+<!ENTITY objecttab.title "Loka á">
+<!ENTITY objecttab.tooltip "Smelltu hér til að loka á þennan hlut með Adblock Plus">
+<!ENTITY menuitem.label "Ad&amp;block Plus stillingar">
+<!ENTITY objecttabs.label "Sýna &amp;flipa fyrir Flass og Java">
+<!ENTITY sendReport.label "Tilkynna vandamál á þessa&amp;ri síðu">
+<!ENTITY whitelist.page.label "Gera óvirkt aðeins á þessari síðu">
+<!ENTITY context.image.label "Adblock Plus: Loka auglýsingamynd">
+<!ENTITY counthits.label "Telja síu &amp;notkun">
+<!ENTITY opensidebar.label "Skoða h&amp;luti">
+<!ENTITY notification.button.close "&amp;Loka">
+<!ENTITY contribute.label "Taka þátt í Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Loka auglýsingaramma">
+<!ENTITY blocked.tooltip "Lokaðir hlutir á þessari síðu:">
+<!ENTITY hideplaceholders.label "Fela staðgeng&amp;itákn á lokuðum einindum">
+<!ENTITY showinstatusbar.label "&amp;Sýna í stöðuslá">
+<!ENTITY sidebar.title "Hlutir á núverandi síðu sem hægt er að loka á">
+<!ENTITY options.label "&amp;Valkostir">
+<!ENTITY context.object.label "Adblock Plus: Loka auglýsingahlut">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Endurvirkja á þessari síðu">
+<!ENTITY filters.tooltip "Mest notaðar síur:">
+<!ENTITY closesidebar.label "&amp;Loka hlutum">
+<!ENTITY showintoolbar.label "Sýna í &amp;tækjaslá">
+<!ENTITY status.tooltip "Staða:">
+<!ENTITY context.media.label "Adblock Plus: Loka á myndefni/hljóð">
+<!ENTITY subscription.update.label "Uppfæra síur">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/sendReport.dtd
new file mode 100644
index 0000000..6c28bec
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/sendReport.dtd
@@ -0,0 +1,97 @@
+<!ENTITY screenshot.undo.label "Aft&amp;urkalla">
+<!ENTITY issues.disabledgroups.description "Eftirfarandi síuáskriftir / síuhópar eru óvirkar, samt sem áður gætu þær haft haft
+ áhrif á þessari síðu:">
+<!ENTITY showData.label "Sýna skýrslugögn">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus lokar á of &amp;mikið">
+<!ENTITY issues.change.description "Búið er að breyta stillingum. Vinsamlega endurnýjaðu síðuna til að prófa breytingarnar
+ og sendu skýrslu ef vandamálið leystist ekki vegna breytinganna.">
+<!ENTITY email.label "&amp;Tölvupóstfang:">
+<!ENTITY issues.openPreferences.label "Opna síuvalkosti">
+<!ENTITY sendPage.confirmation "Búið er að vista skýrsluna. Þú getur séð hana á eftirfarandi veffangi:">
+<!ENTITY copyLink.label "&amp;Afrita skýrslutengil">
+<!ENTITY issues.nofilters.description "Adblock Plus er ekki að loka á neitt á núverandi síðu. Vandamálið sem þú ert að
+ sjá er líklega ótengt Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Vandamálið sem þú tilkynntir er öllum líkindum þegar þekkt. Meiri upplýsingar:">
+<!ENTITY typeSelector.other.description "Veldu þennan möguleika ef þú heldur að vandamálið sé hjá Adblock Plus sjálfu frekar
+ en í síu.">
+<!ENTITY issues.disabledgroups.enable.label "Virkja síuáskrift / síuhópur">
+<!ENTITY typeWarning.override.label "Ég &amp;skil og vill samt senda skýrslu">
+<!ENTITY issues.disabled.enable.label "Virkja Adblock Plus">
+<!ENTITY update.fixed.description "Uppfærslur á síuáskriftum lagfærðu að öllum líkindum vandamálið. Endurnýjaðu síðun og reyndu aftur, smelltu á tilkynna aftur ef vandamálið er enn til staðar.">
+<!ENTITY anonymous.label "N&amp;afnlaus sending">
+<!ENTITY reloadButton.label "Endu&amp;rnýja síðu">
+<!ENTITY recentReports.clear.label "Fja&amp;rlægja allar skýrslur">
+<!ENTITY typeSelector.description "Þessi gluggi hjálpar þér í gegnum þau skref sem þarf til að tilkynna Adblock
+ Plus vandamála. Veldu fyrst, hverskonar tegund af vandamáli þú ert að lenda í
+ á þessari síðu:">
+<!ENTITY screenshot.remove.label "Fja&amp;rlægja viðkvæm gögn">
+<!ENTITY issues.ownfilters.description "Sumar af síunum sem eru virkar á þessari síðu eru stilltar af notanda. Vinsamlega gerðu þær síur óvirkar
+ sem hugsanlega gætu hafa valdið vandræðunum:">
+<!ENTITY update.inProgress.description "Adblock Plus þarf að uppfæra síuáskriftir til að ganga úr skugga um að vandamálið hafi ekki þegar verið lagað. Bíddu aðeins…">
+<!ENTITY sendPage.retry.label "Senda aftur">
+<!ENTITY data.label "&amp;Skýrslugögn:">
+<!ENTITY recentReports.label "Nýlegar sendar skýrslur">
+<!ENTITY typeWarning.description "Þú hefur gefið til kynna að þú viljir tilkynna almennt vandamál á Adblock Plus frekar
+ en vandamál með síurnar. Vinsamlega athugaðu að svoleiðis vandamál er best að tilkynna
+ á [link]Adblock Plus umræðusvæðinu[/link]. Þú ættir aðeins að tilkynna vandamál sem
+ viðauka við umræðu sem er til fyrir, þar sem enginn tekur eftir tilkynningunni
+ nema þú setjir tengil með. Sjálfvirki tengillinn
+ verður aðgengilegur eftir að skýrslan hefur verið send.">
+<!ENTITY issues.disabled.description "Adblock Plus er óvirkt, það mun ekki loka á neitt í núverandi ástandi.">
+<!ENTITY attachExtensions.label "Láta fylgja með lista af &amp;virkum viðbótum í skýrslunni ef svo vildi til að vandamálið væri vegna þeirra">
+<!ENTITY issues.nosubscriptions.add.label "Bæta við síuáskrift">
+<!ENTITY issues.disabledfilters.enable.label "Virkja síu">
+<!ENTITY issues.override.label "&amp;Stillingarnar eru réttar, halda áfram með skýrsluna">
+<!ENTITY issues.nosubscriptions.description "Þú ert ekki áskrifandi að neinum af forskilgreindum síulistum sem fjarlægja
+ sjálfvirkt óæskilegt efni frá vefsvæðum.">
+<!ENTITY typeSelector.falsePositive.description "Veldu þennan möguleika ef á síðuna vantar mikilvæg gögn, birtist rangt eða
+ virkar ekki eðlilega. Þú getur gengið úr skugga um hvort Adblock Plus sé vandamálið
+ með því að gera það óvirkt tímabundið.">
+<!ENTITY typeSelector.other.label "A&amp;nnað vandamál">
+<!ENTITY emailComment.label "Við mælum með að þú sláir inn gilt tölvupóstfang svo hægt að hafa samband við þig ef það eru spurningar um skýrsluna þína. Einnig gerir það okkur kleyft að bera kennsl á það sem þú sendir inn og hægt er að forgangsraða því hærra.">
+<!ENTITY issues.whitelist.remove.label "Virkja Adblock Plus á þessari síðu">
+<!ENTITY outdatedSubscriptions.description "Eftirfarandi síuáskriftir hafa ekki verið uppfærðar í að minnsta kosti tvær vikur. Uppfærðu síuáskriftirnar áður en þú tilkynnir vandamál, hugsanlega er þegar búið að leysa vandamálið.">
+<!ENTITY dataCollector.description "Bíddu aðeins á meðan Adblock Plus tekur saman nauðsynleg gögn.">
+<!ENTITY sendButton.label "Se&amp;nda skýrslu">
+<!ENTITY comment.label "&amp;Athugasemd (valfrjálst):">
+<!ENTITY sendPage.errorMessage "Tilraun til að senda skýrsluna mistókst með villukóða &quot;?1?&quot;. Gakktu úr skugga um þú sért
+ tengdur við netið og reyndu aftur. Ef vandamálið er viðvarandi fáðu þá
+ hjálp í [link]Adblock Plus umræðusvæðinu[/link].">
+<!ENTITY showRecentReports.label "Sýna nýlegar sendar skýrslur">
+<!ENTITY commentPage.heading "Sláðu inn athugasemd">
+<!ENTITY update.start.label "Byrja uppfærslu">
+<!ENTITY issues.disabledfilters.description "Eftirfarandi síur eru óvirkar, en gætu samt sem áður haft áhrif á þessari síðu:">
+<!ENTITY screenshot.description "Sama síðan getur birst á mismunandi hátt fyrir mismunandi fólk. Það gæti hjálpað okkur
+ að skilja vandamálið ef þú setur skjáskot með skýrslunni. Þú getur fjarlægt
+ svæði sem innihalda persónulegar upplýsingar og merkt einnig þau svæði þar sem
+ vandamálið sést. Til að merkja svæði smelltu á viðkomandi hnapp og veldu
+ svæði á myndinni með músinni.">
+<!ENTITY screenshot.attach.label "&amp;Hengja mynd af síðu við skýrsluna">
+<!ENTITY issues.whitelist.description "Adblock Plus er óvirkt á síðunni sem þú ert að senda skýrslu um. Vinsamlega virkjaðu
+ það og endurnýjaðu síðuna áður en þú sendir skýrsluna til að hjálpa til með að rannsaka
+ þetta vandamál.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus lokar &amp;ekki á auglýsingu">
+<!ENTITY typeSelector.heading "Veldu tegund skýrslu">
+<!ENTITY anonymity.warning "Við munum ekki geta haft samband við þig og munum að öllum líkindum þess vegna setja þína skýrslu í lægri forgang.">
+<!ENTITY wizard.title "Höfundur tilkynningar">
+<!ENTITY issues.ownfilters.disable.label "Slökkva á síu">
+<!ENTITY commentPage.description "Þú getur slegið inn athugasemd í textasvæðið hér fyrir neðan til að hjálpa okkur að skilja vandamálið.
+ Þetta skref er valkvæmt en mælt er með því ef vandamálið er ekki augljóst.
+ Þú getur einnig forskoðað skýrsluna áður en þú hún er send.">
+<!ENTITY comment.lengthWarning "Lengdin á athugasemd er yfir 1000 stafir. Aðeins verða sendir fyrstu 1000 stafirnir.">
+<!ENTITY typeSelector.falseNegative.description "Veldu þennan möguleika ef auglýsing birtist jafnvel
+ þótt Adblock Plus sé virkt.">
+<!ENTITY sendPage.waitMessage "Bíddu aðeins meðan Adblock Plus sendir skýrsluna.">
+<!ENTITY dataCollector.heading "Velkominn í tilkynna vandamál">
+<!ENTITY screenshot.heading "Hengja skjámynd við">
+<!ENTITY sendPage.heading "Senda skýrslu">
+<!ENTITY issues.subscriptionCount.description "Svo virðist sem þú sért áskrifandi að of mörgum síuáskriftum. Ekki
+ er mælt með þessu þar sem líklegt er að
+ vandamál verði of mörg. Ekki er heldur hægt að taka á móti tilkynningu um villu
+ vegna þess að ekki er augljóst hvaða síu þarf að laga. Vinsamlega
+ fjarlægðu allar síur nema þær allra nauðsynlegustu og prófaðu aftur hvort
+ vandamálið sé enn til staðar.">
+<!ENTITY screenshot.mark.label "&amp;Merkja vandamálið">
+<!ENTITY privacyPolicy.label "Persónuverndarstefna">
+<!ENTITY issues.description "Adblock Plus uppgötvaði vandamál með stillingar sem gætu verið ástæða
+ fyrir þessu vandamáli eða gæti haft áhrif á rannsókn vandamálsins.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/sidebar.dtd
new file mode 100644
index 0000000..68608a7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Rammi Flash hlutar">
+<!ENTITY address.label "Netfang">
+<!ENTITY context.open.label "Opna í nýjum flipa">
+<!ENTITY type.label "Tegund">
+<!ENTITY tooltip.filterSource.label "Sía frumkóða:">
+<!ENTITY noitems.label "Engir hlutir til að loka á">
+<!ENTITY filter.label "Sía">
+<!ENTITY tooltip.size.label "Stærð:">
+<!ENTITY reattach.label "Festa aftur">
+<!ENTITY search.label "&amp;Leita:">
+<!ENTITY docDomain.thirdParty "(þriðja aðila)">
+<!ENTITY filterSource.label "Síu uppruni">
+<!ENTITY tooltip.docDomain.label "Netfang síðu:">
+<!ENTITY context.copy.label "Afrita vefslóð hlutar">
+<!ENTITY tooltip.type.label "Tegund:">
+<!ENTITY context.disablefilter.label "Aftengja síu ?1?">
+<!ENTITY context.copyFilter.label "Afrita síu">
+<!ENTITY context.block.label "Loka á þennan hlut">
+<!ENTITY context.enablefilter.label "Virkja aftur síu ?1?">
+<!ENTITY detach.label "Aftengja">
+<!ENTITY whitelisted.label "Síða fyrir hvítlista">
+<!ENTITY context.disablefilteronsite.label "Aftengja síu fyrir ?1?">
+<!ENTITY detached.title "Adblock Plus: Lokaðir hlutir (aðskildir)">
+<!ENTITY docDomain.firstParty "(frumaðili)">
+<!ENTITY tooltip.type.whitelisted "(hvítlisti)">
+<!ENTITY tooltip.filter.label "Sía í notkun:">
+<!ENTITY tooltip.filter.disabled "(óvirkt)">
+<!ENTITY context.editfilter.label "Breyta núverandi síu">
+<!ENTITY tooltip.type.blocked "(stöðvað)">
+<!ENTITY size.label "Stærð">
+<!ENTITY context.whitelist.label "Bæta við undantekningu fyrir hlut">
+<!ENTITY context.selectAll.label "Velja allt">
+<!ENTITY state.label "Ríki">
+<!ENTITY docDomain.label "Netfang síðu">
+<!ENTITY tooltip.address.label "Netfang:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/subscriptionSelection.dtd
new file mode 100644
index 0000000..8d2a550
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/is/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Bæta einnig við &amp;síu áskrift &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plus gat ekki náð í lista af áskriftum.">
+<!ENTITY list.download.retry "Reyndu aftur">
+<!ENTITY title.label "Ãskrif&amp;tartitill:">
+<!ENTITY list.download.website "Skoða vefsvæði">
+<!ENTITY supplementMessage "Þessi síu áskrift er ætluð til þess að vera notuð með síu áskrift &quot;?1?&quot; sem þú hefur ekki ennþá bætt við.">
+<!ENTITY viewList.label "Skoða síur">
+<!ENTITY visitHomepage.label "Heimsækja heimasíðu">
+<!ENTITY addSubscription.label "Bæta við áskrift">
+<!ENTITY dialog.title "Bæta við Adblock Plus síu áskrift">
+<!ENTITY location.label "Staðsetning síu&amp;lista:">
+<!ENTITY fromWeb.description "Staðfestu að þú viljir bæta við þessari síu áskrift. Þú getur breytt titlinum eða staðsetningu áður en þú bætir við.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/composer.dtd
new file mode 100644
index 0000000..ad05b55
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "alla f&amp;ine dell'indirizzo web">
+<!ENTITY domainRestriction.label "Limita al &amp;dominio:">
+<!ENTITY collapse.default.no.label "Utilizza predefiniti (no)">
+<!ENTITY firstParty.label "Solo dominii di p&amp;rimo livello">
+<!ENTITY preferences.label "&amp;Mostra i filtri esistenti…">
+<!ENTITY pattern.label "Modelli">
+<!ENTITY thirdParty.label "&amp;Solo domini di terza parte">
+<!ENTITY filter.label "&amp;Nuovo filtro:">
+<!ENTITY collapse.label "&amp;Contrai bloccati:">
+<!ENTITY match.warning "Il modello inserito non corrisponde più all'indirizzo web da bloccare/permettere e non avrà quindi alcun effetto">
+<!ENTITY anchor.start.label "all'i&amp;nizio dell'indirizzo web">
+<!ENTITY matchCase.label "Mai&amp;uscole/minuscole">
+<!ENTITY custom.pattern.label "&amp;Personalizza:">
+<!ENTITY unselectAllTypes.label "Deseleziona">
+<!ENTITY type.whitelist.label "Eccezione">
+<!ENTITY regexp.warning "Il modello inserito verrà interpretato come espressione regolare. Un numero eccessivo di tali modelli potrebbe rallentare la navigazione. Se non si intende utilizzare le espressioni regolari aggiungere il carattere * alla fine del modello">
+<!ENTITY dialog.title "Nuovo filtro di Adblock Plus">
+<!ENTITY basic.label "&lt;&lt; Generali">
+<!ENTITY type.filter.label "Filtro &amp;per bloccare">
+<!ENTITY types.label "Applica ai tipi:">
+<!ENTITY shortpattern.warning "Il modello inserito è troppo breve per essere ottimizzato. Un numero eccessivo di tali modelli potrebbe rallentare la navigazione. Sarebbe preferibile utilizzare una stringa più lunga">
+<!ENTITY collapse.yes.label "Sì">
+<!ENTITY anchors.label "Accetta modelli solo:">
+<!ENTITY collapse.default.yes.label "Utilizza predefiniti (sì)">
+<!ENTITY domainRestriction.help "È possibile specificare uno o più dominii separandoli con il carattere &quot;|&quot;: il filtro verrà applicato solamente a tali dominii (si noti che il carattere &quot;~&quot; prima del nome di un dominio significa che il filtro non verrà applicato per tale dominio)">
+<!ENTITY accept.label "Aggiungi filtro">
+<!ENTITY options.label "Opzioni">
+<!ENTITY disabled.warning "Adblock Plus è attualmente disattivata. È comunque possibile aggiungere filtri, ma questi verranno applicati solo dopo la [link]riattivazione di Adblock Plus[/link]">
+<!ENTITY anchor.start.flexible.label "all'i&amp;nizio del nome del dominio">
+<!ENTITY collapse.no.label "No">
+<!ENTITY selectAllTypes.label "Seleziona tutti">
+<!ENTITY advanced.label "Avanzate &gt;&gt;">
+<!ENTITY pattern.explanation "Il modello può corrispondere a qualsiasi parte dell'indirizzo web, il carattere * corrisponde ad un carattere jolly. Il filtro verrà applicato ai soli indirizzi web corrispondenti al modello">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/filters.dtd
new file mode 100644
index 0000000..77200a0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Tutti i filtri personalizzati verranno sostituiti dal contenuto del file selezionato. Procedere comunque?">
+<!ENTITY slow.column "Fi&amp;ltri lenti">
+<!ENTITY enabled.column "A&amp;ttivato">
+<!ENTITY subscription.lastDownload.checksumMismatch "Sincronizzazione non riuscita, checksum non corrispondente">
+<!ENTITY noFiltersInGroup.text "Il gruppo di filtri selezionato è vuoto">
+<!ENTITY subscription.actions.label "Azioni">
+<!ENTITY filter.selectAll.label "Seleziona tutto">
+<!ENTITY backupButton.label "&amp;Backup e ripristino">
+<!ENTITY restore.minVersion.warning "Attenzione: il file di backup è stato creato con una versione più recente di Adblock Plus. Installare l'ultima versione di Adblock Plus per poter effettuare il ripristino da tale file">
+<!ENTITY restore.error "Impossibile effettuare il ripristino del backup poiché il file selezionato probabilmente non è un file di backup di Adblock Plus">
+<!ENTITY sort.ascending.label "Ordin&amp;a A &gt; Z">
+<!ENTITY sort.label "&amp;Ordina">
+<!ENTITY subscription.source.label "Lista di filtri">
+<!ENTITY hitcount.column "Acce&amp;ssi">
+<!ENTITY noFilters.text "Non è stato ancora aggiunto alcun filtro personalizzato">
+<!ENTITY backup.custom.title "Solo filtri personalizzati">
+<!ENTITY subscription.external.label "Sottoscrizione aggiornata da un'altra estensione">
+<!ENTITY subscription.delete.label "Elimina">
+<!ENTITY noGroupSelected.text "Selezionare un gruppo di filtri per visualizzarne i filtri">
+<!ENTITY filter.cut.label "Taglia">
+<!ENTITY restore.default.label "Ripristina il backup datato ?1?">
+<!ENTITY subscription.lastDownload.inProgress "download in corso…">
+<!ENTITY subscriptions.tab.label "Sottoscrizioni di filtri">
+<!ENTITY sort.descending.label "Ordina &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Eliminare tutti i filtri selezionati?">
+<!ENTITY filter.delete.label "Elimina">
+<!ENTITY addSubscriptionAdd.label "Aggiungi">
+<!ENTITY viewMenu.label "Visualizza">
+<!ENTITY subscription.lastDownload.unknown "sconosciuto">
+<!ENTITY addSubscriptionCancel.label "Annulla">
+<!ENTITY subscription.enabled.label "Attiva">
+<!ENTITY noSubscriptions.text "Non è stata ancora aggiunta alcuna sottoscrizione di filtri, senza cui Adblock Plus non
+ bloccherà alcun elemento; fare clic sul pulsante &quot;Aggiungi sottoscrizione…&quot;
+ per aggiungerne una">
+<!ENTITY subscription.update.label "Aggiorna i filtri">
+<!ENTITY dialog.title "Gestione dei filtri di Adblock Plus">
+<!ENTITY addFilter.label "Aggiungi &amp;filtro">
+<!ENTITY subscription.minVersion.warning "Per questa sottoscrizione di filtri è necessaria una versione di Adblock Plus aggiornata. È necessario installare l'ultima versione di Adblock Plus">
+<!ENTITY subscription.lastDownload.invalidURL "Sincronizzazione non riuscita, indirizzo web non valido">
+<!ENTITY backup.error "Si è verificato un errore durante la creazione del file di backup. Verificare i permessi di scrittura per il file e/o che non sia già utilizzato da un'altra applicazione">
+<!ENTITY filter.moveUp.label "Sposta su">
+<!ENTITY addGroup.label "A&amp;ggiungi gruppo di filtri">
+<!ENTITY filter.edit.label "Modifica">
+<!ENTITY subscription.showHideFilters.label "Mostra/nascondi i filtri">
+<!ENTITY acceptableAds2.label "&amp;Permetti alcune pubblicità non inopportune">
+<!ENTITY addSubscriptionOther.label "Altre sottoscrizioni">
+<!ENTITY close.label "Chiudi">
+<!ENTITY sort.none.label "Non or&amp;dinare">
+<!ENTITY filter.actions.label "Opzioni del filtro">
+<!ENTITY filter.copy.label "Copia">
+<!ENTITY filter.moveDown.label "Sposta giù">
+<!ENTITY filter.resetHitCounts.label "Ripristina le statistiche di accesso">
+<!ENTITY readMore.label "Ulteriori informazioni…">
+<!ENTITY subscription.moveUp.label "Sposta su">
+<!ENTITY addSubscription.label "&amp;Aggiungi sottoscrizione">
+<!ENTITY subscription.homepage.label "Sito web">
+<!ENTITY backup.complete.title "Tutti i filtri e le sottoscrizioni">
+<!ENTITY restore.own.label "Backup personale da ripristinare">
+<!ENTITY restore.complete.warning "Tutte le impostazioni dei filtri verranno sostituite dal contenuto del file selezionato. Procedere comunque?">
+<!ENTITY filters.tab.label "Filtri personalizzati">
+<!ENTITY backup.label "Nuovo backup">
+<!ENTITY find.label "Tro&amp;va">
+<!ENTITY subscription.moveDown.label "Sposta giù">
+<!ENTITY subscription.lastDownload.connectionError "Sincronizzazione non riuscita, errore durante il download">
+<!ENTITY subscription.lastDownload.success "Sincronizzazione effettuata con successo">
+<!ENTITY subscription.lastDownload.invalidData "Sincronizzazione non riuscita, lista dei filtri non valida">
+<!ENTITY filter.paste.label "Incolla">
+<!ENTITY subscription.disabledFilters.enable "Attiva i filtri disattivati">
+<!ENTITY lasthit.column "&amp;Ultimo accesso">
+<!ENTITY subscription.editTitle.label "Modifica il titolo">
+<!ENTITY subscription.disabledFilters.warning "Alcuni filtri di questa sottoscrizione sono disattivati.">
+<!ENTITY filter.column "&amp;Ruolo del filtro">
+<!ENTITY subscription.lastDownload.label "Ultimo aggiornamento:">
+<!ENTITY viewList.label "Visualizza la lista…">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/firstRun.properties
new file mode 100644
index 0000000..bd96e56
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Naviga privatamente disattivando il tracciamento, nascondendo alle compagnie pubblicitarie quali siti web vengono visitati
+firstRun_toggle_off=Disattivato
+firstRun_feature_tracking=Disattiva il tracciamento
+firstRun_feature_malware=Blocco del malware
+firstRun_title=Adblock Plus è stata installata
+firstRun_toggle_on=Attivo
+firstRun_acceptableAdsExplanation=Vorremmo incoraggiare i siti web ad utilizzare pubblicità semplici e discrete. Ecco perché sono state stabilite <a>severe linee guida</a> per identificare pubblicità accettabili, che saranno visualizzate con le impostazioni predefinite. Per bloccare comunque tutte le pubblicità è possibile <a>disattivare</a> l'opzione rapidamente
+firstRun_contributor_credits=Lista dei collaboratori
+firstRun_dataCorruptionWarning=Questa pagina continua ad essere visualizzata? <a>Fai clic qui</a>
+firstRun_acceptableAdsHeadline=Le pubblicità fastidiose verranno bloccate
+firstRun_share=Dillo ai tuoi amici
+firstRun_share_headline=<a>Aiuta</a> a rendere il web un luogo migliore
+firstRun_feature_social_description=Elimina automaticamente i pulsanti social media, come Facebook Like, che compaiono sulle pagine web e tracciano poi quali siti vengono visitati
+firstRun_filterlistsReinitializedWarning=Sembra che un problema abbia causato la rimozione di tutti i filtri e non siamo stati in grado di ripristinare un backup. Quindi abbiamo dovuto azzerare i filtri e le impostazioni per la pubblicità accettabile. Si prega di controllare le impostazioni per la pubblicità accettabile e gli elenchi dei filtri nelle <a>opzioni di Adblock Plus</a>.
+firstRun_feature_malware_description=Rendi la tua navigazione più sicura bloccando domini pericolosi conosciuti
+firstRun_features=Adblock Plus può fare di più, oltre a bloccare pubblicità
+firstRun_donate=dona
+firstRun_donate_label=Sostieni il nostro progetto
+firstRun_feature_social=Elimina i pulsanti Social Media
+firstRun_legacySafariWarning=Si sta utilizzando una vecchia versione di Safari che non è supportato da Adblock Plus. Potrebbe non funzionare correttamente o compromettere l'esperienza dell'utente su alcuni siti Web. Si consiglia vivamente di aggiornare a Safari 6.1.1 o superiore (disponibile per Mac OS X 10.8 Mountain Lion), or Safari 7.0.1 (per OS X 10.9 Maveriscks), o di utilizzare l'ultima versione di Mozilla Firefox, Google Chrome o Opera.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/global.properties
new file mode 100644
index 0000000..7c4f1fb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Nessun elemento bloccabile nella pagina attuale
+action3_tooltip=Fare clic per attivare/disattivare Adblock Plus
+notification_antiadblock_title=Nascondere messaggi mirati?
+type_label_script=script
+filter_elemhide_nocriteria=Non è stato specificato alcun criterio per rilevare l'elemento da nascondere
+blockingGroup_title=Gruppo di filtri per bloccare elementi
+whitelisted_tooltip=Adblock Plus è attiva ma è stata disattivata per la pagina attuale
+type_label_stylesheet=foglio di stile
+blocked_count_tooltip=?1? di ?2?
+type_label_font=carattere
+type_label_popup=finestra a pop-up
+filter_regexp_tooltip=Il filtro inserito verrà interpretato come un'espressione regolare. Un numero eccessivo di tali filtri potrebbe rallentare la navigazione
+action0_tooltip=Fare clic per visualizzare il menu contestuale, clic centrale per attivare/disattivare
+whitelisted_page=Adblock Plus è stata disattivata per la pagina attuale
+remove_group_warning=Eliminare il gruppo di filtri?
+action1_tooltip=Fare clic per aprire/chiudere la finestra degli elementi bloccabili, clic centrale per attivare/disattivare
+type_label_xmlhttprequest=richiesta XML
+active_tooltip=Adblock Plus è attiva (sottoscrizioni di filtri in uso: ?1?, filtri in uso: ?2?)
+type_label_document=documento
+type_label_object_subrequest=oggetto sottorichiesto
+whitelistGroup_title=Gruppo di filtri per permettere elementi
+disabled_tooltip=Adblock Plus è disattivata
+filter_elemhide_duplicate_id=È possibile specificare solo un ID dell'elemento da nascondere
+type_label_object=oggetto
+action2_tooltip=Fare clic per aprire la finestra di gestione dei filtri, clic centrale per attivare/disattivare
+type_label_subdocument=riquadro
+clearStats_warning=Azzerare le statistiche per tutti i filtri e disattivarne il futuro conteggio?
+notification_antiadblock_message=Questo sito è noto per mostrare messaggi mirati agli utenti di Adblock Plus. Vuoi che Adblock Plus nasconda i messaggi mirati (pubblicità)?
+blocked_count_addendum=(elementi permessi: ?1?, elementi nascosti: ?2?)
+subscription_invalid_location=Attenzione: per poter aggiungere una sottoscrizione è necessario che i campi 'Titolo della sottoscrizione:' ed 'Indirizzo della lista dei filtri:' non siano lasciati vuoti e corrispondano a nomi di file validi. Inserire tali dati e ripetere la procedura
+type_label_image=immagine
+remove_subscription_warning=Eliminare la sottoscrizione di filtri?
+type_label_other=altro
+mobile_menu_enable=Attiva ABP
+type_label_media=audio/video
+mobile_menu_disable_site=ABP è disattivata per ?1?
+elemhideGroup_title=Gruppo di filtri per nascondere elementi
+mobile_menu_enable_site=ABP è attivata per ?1?
+type_label_elemhide=nascosto
+newGroup_title=Nuovo gruppo di filtri
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/overlay.dtd
new file mode 100644
index 0000000..3bd3482
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "Sì">
+<!ENTITY notification.button.no "No">
+<!ENTITY sync.label "Sincronizza le impostazioni di Adbloc&amp;k Plus">
+<!ENTITY whitelist.site.label "Disattiva per ?1?">
+<!ENTITY filters.label "Gestione dei &amp;filtri">
+<!ENTITY disable.label "Disattiva per tutte le pagine">
+<!ENTITY objecttab.title "Blocca">
+<!ENTITY objecttab.tooltip "Fare clic qui per bloccare l'oggetto con Adblock Plus">
+<!ENTITY menuitem.label "Gestione dei filtri di &amp;Adblock Plus">
+<!ENTITY objecttabs.label "Mos&amp;tra linguetta 'Blocca…' per elementi Flash e Java">
+<!ENTITY sendReport.label "&amp;Segnala problemi nella pagina attuale">
+<!ENTITY whitelist.page.label "Disattiva solo per la pagina attuale">
+<!ENTITY context.image.label "Blocca immagine con Adblock Plus">
+<!ENTITY counthits.label "&amp;Effettua le statistiche di accesso">
+<!ENTITY opensidebar.label "Apri l'elenco degli elementi &amp;bloccabili">
+<!ENTITY notification.button.close "Chiudi">
+<!ENTITY contribute.label "Contribuisci ad Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Blocca riquadro con Adblock Plus">
+<!ENTITY blocked.tooltip "Elementi attualmente bloccati">
+<!ENTITY hideplaceholders.label "&amp;Nascondi gli elementi bloccati">
+<!ENTITY showinstatusbar.label "Vi&amp;sualizza nella barra di stato">
+<!ENTITY sidebar.title "Elenco degli elementi bloccabili con Adblock Plus">
+<!ENTITY options.label "&amp;Opzioni di Adblock Plus">
+<!ENTITY context.object.label "Blocca oggetto con Adblock Plus">
+<!ENTITY context.removeWhitelist.label "Riattiva Adblock Plus nella pagina attuale">
+<!ENTITY filters.tooltip "Filtri di Adblock Plus maggiormente attivi">
+<!ENTITY closesidebar.label "Chiudi l'elenco degli elementi &amp;bloccabili">
+<!ENTITY showintoolbar.label "Visualizza nella &amp;barra degli strumenti">
+<!ENTITY status.tooltip "Stato di Adblock Plus">
+<!ENTITY context.media.label "Blocca video/audio con Adblock Plus">
+<!ENTITY subscription.update.label "Aggiorna i filtri">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/sendReport.dtd
new file mode 100644
index 0000000..5d83af1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/sendReport.dtd
@@ -0,0 +1,97 @@
+<!ENTITY screenshot.undo.label "&amp;Annulla">
+<!ENTITY issues.disabledgroups.description "Gruppi/sottoscrizioni di filtri sono stati disattivati, ma potrebbero avere effetto
+ nella seguente pagina web:">
+<!ENTITY showData.label "Mostra i dati della segnalazione">
+<!ENTITY typeSelector.falsePositive.label "Adblock &amp;Plus sta bloccando troppi elementi">
+<!ENTITY issues.change.description "Le impostazioni di Adblock Plus sono state modificate. Ricaricare la pagina web per testare le
+ modifiche e se il problema dovesse persistere inviare la segnalazione">
+<!ENTITY email.label "Indirizzo e-&amp;mail:">
+<!ENTITY issues.openPreferences.label "Apri la finestra di 'Gestione dei filtri di Adblock Plus'…">
+<!ENTITY sendPage.confirmation "Segnalazione inviata correttamente, per visualizzarne i dati fare clic sul seguente link:">
+<!ENTITY copyLink.label "Copia il lin&amp;k della segnalazione">
+<!ENTITY issues.nofilters.description "Adblock Plus attualmente non sta bloccando alcun elemento. Il problema che si è
+ verificato è più probabile che non sia relativo ad Adblock Plus">
+<!ENTITY sendPage.knownIssue "Problema segnalato precedentemente noto. Ulteriori informazioni:">
+<!ENTITY typeSelector.other.description "Selezionare questa opzione se nella pagina web si sta verificando un problema di altro tipo
+ che si sospetta relativo all'estensione stessa piuttosto che ai suoi filtri">
+<!ENTITY issues.disabledgroups.enable.label "Attiva gruppi/sottoscrizioni di filtri">
+<!ENTITY typeWarning.override.label "Comprendo e &amp;voglio inviare la segnalazione comunque">
+<!ENTITY issues.disabled.enable.label "Attiva Adblock Plus">
+<!ENTITY update.fixed.description "L'aggiornamento della sottoscrizione di filtri potrebbe aver risolto il problema che si stava segnalando. Ricaricare la pagina e riprovare; se il problema persiste inviare nuovamente la segnalazione">
+<!ENTITY anonymous.label "Seg&amp;nalazione anonima">
+<!ENTITY reloadButton.label "Ricarica la &amp;pagina web">
+<!ENTITY recentReports.clear.label "Elimina &amp;tutte le segnalazioni">
+<!ENTITY typeSelector.description "La configurazione guidata permette passo a passo di raccogliere ed inviare i dati necessari per effettuare la
+ segnalazione di Adblock Plus di problemi in una pagina web. Come primo passo, selezionare il tipo di problema
+ che si è verificato">
+<!ENTITY screenshot.remove.label "&amp;Elimina i dati sensibili">
+<!ENTITY issues.ownfilters.description "Alcuni dei filtri che vengono applicati nella pagina web attuale sono personalizzati;
+ disattivare tali filtri che potrebbero essere la causa del seguente problema:">
+<!ENTITY update.inProgress.description "È necessario aggiornare la sottoscrizione di filtri per verificare che il problema non sia già stato risolto. Attendere…">
+<!ENTITY sendPage.retry.label "Riprova ad inviare">
+<!ENTITY data.label "&amp;Dati della segnalazione:">
+<!ENTITY recentReports.label "Segnalazioni recentemente inviate">
+<!ENTITY typeWarning.description "È stato indicato che si vuole segnalare un problema generico relativo all'estensione
+ stessa piuttosto che ai suoi filtri. Poiché tali problemi sono riportati meglio sul
+ [link]forum di Adblock Plus[/link], si suggerisce di utilizzare la segnalazione di
+ problemi solo come integrazione di una discussione già esistente, visto che nessuno noterà
+ una segnalazione priva di relativo link alla pagina web dove si verifica appunto il problema.
+ Il link generato automaticamente verrà fornito dopo l'invio della segnalazione">
+<!ENTITY issues.disabled.description "Adblock Plus è attualmente disattivata e quindi non bloccherà alcun elemento">
+<!ENTITY attachExtensions.label "A&amp;llega la lista di estensioni e plugin attivi">
+<!ENTITY issues.nosubscriptions.add.label "Aggiungi una sottoscrizione di filtri…">
+<!ENTITY issues.disabledfilters.enable.label "Attiva i filtri">
+<!ENTITY issues.override.label "&amp;Le impostazioni di Adblock Plus sono corrette, proseguire con la raccolta dei dati per la segnalazione">
+<!ENTITY issues.nosubscriptions.description "Non sembra essere attiva alcuna sottoscrizione di filtri che permette l'eliminazione
+ automatica di banner e/o pubblicità presenti nei siti web">
+<!ENTITY typeSelector.falsePositive.description "Selezionare questa opzione se nella pagina web manca parte del contenuto importante, se la pagina web viene
+ visualizzata non correttamente oppure se non funziona come dovrebbe. È possibile determinare se sia Adblock Plus
+ la causa del problema disattivando temporaneamente l'estensione">
+<!ENTITY typeSelector.other.label "&amp;Si è verificato un problema di altro tipo">
+<!ENTITY emailComment.label "Inserire un indirizzo e-mail valido per poter essere ricontattati in caso di domande su questa segnalazione, per riconoscerne i contributi e per aumentare l'ordine di priorità">
+<!ENTITY issues.whitelist.remove.label "Riattiva Adblock Plus nella pagina attuale">
+<!ENTITY outdatedSubscriptions.description "Le seguenti sottoscrizioni di filtri non sono state aggiornate per almeno due settimane. È necessario aggiornarle prima di inviare una segnalazione, poiché il problema potrebbe esser già stato risolto">
+<!ENTITY dataCollector.description "Attendere mentre vengono raccolti i dati necessari per la segnalazione di Adblock Plus di problemi in una pagina web">
+<!ENTITY sendButton.label "Invia la segnala&amp;zione">
+<!ENTITY comment.label "C&amp;ommento (opzionale):">
+<!ENTITY sendPage.errorMessage "Il tentativo di inviare la segnalazione non è riuscito a causa del seguente errore: &quot;?1?&quot;.
+ Accertarsi di essere collegati ad internet e riprovare. Se il problema persiste inviare una richiesta
+ di assistenza nel [link]forum di Adblock Plus[/link]">
+<!ENTITY showRecentReports.label "Mostra le segnalazioni recentemente inviate">
+<!ENTITY commentPage.heading "Invio di un commento">
+<!ENTITY update.start.label "Avvia l'aggiornamento ora">
+<!ENTITY issues.disabledfilters.description "I filtri sono stati disattivati, ma potrebbero avere effetto nella seguente pagina web:">
+<!ENTITY screenshot.description "Una stessa pagina web può apparire in modo differente a più persone. Potrebbe essere di aiuto per
+ meglio comprendere il problema allegare un'immagine della pagina web alla segnalazione. È
+ possibile eliminare le sezioni contenenti dati sensibili nonché contrassegnare le aree dove il
+ problema è evidente facendo prima clic sui relativi pulsanti ed in seguito selezionando le parti
+ interessate dell'immagine della pagina web con il mouse">
+<!ENTITY screenshot.attach.label "Allega &amp;un'immagine della pagina web alla segnalazione">
+<!ENTITY issues.whitelist.description "Adblock Plus è attualmente disattivata per la pagina web che si sta segnalando. Riattivare
+ l'estensione e ricaricare la pagina prima di inviare la segnalazione del problema per
+ rinvenirne le cause">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus &amp;non sta bloccando alcun elemento">
+<!ENTITY typeSelector.heading "Selezione del problema">
+<!ENTITY anonymity.warning "Nota: è impossibile rispondere a segnalazioni anonime alle quali viene probabilmente dato un ordine di priorità inferiore">
+<!ENTITY wizard.title "Configurazione guidata per segnalare problemi in una pagina web">
+<!ENTITY issues.ownfilters.disable.label "Disattiva i filtri">
+<!ENTITY commentPage.description "È possibile digitare nel relativo campo di testo qui sotto un commento per comprendere meglio
+ il problema segnalato. Questo passo è opzionale ma raccomandato se il problema non è ovvio.
+ È inoltre possibile visualizzare i dati della segnalazione prima di inviarla">
+<!ENTITY comment.lengthWarning "La lunghezza massima del testo del commento è di 1000 caratteri; quelli eccedenti non verranno inviati">
+<!ENTITY typeSelector.falseNegative.description "Selezionare questa opzione se nella pagina web vengono visualizzati banner e/o pubblicità nonostante
+ Adblock Plus sia attiva">
+<!ENTITY sendPage.waitMessage "Attendere mentre la segnalazione di Adblock Plus viene inviata">
+<!ENTITY dataCollector.heading "Benvenuti alla configurazione guidata per segnalare problemi in una pagina web">
+<!ENTITY screenshot.heading "Immagine da allegare">
+<!ENTITY sendPage.heading "Invio della segnalazione">
+<!ENTITY issues.subscriptionCount.description "Sembra che siano state aggiunte troppe sottoscrizioni di filtri. Ciò non è
+ raccomandato poiché aumenta considerevolmente la possibilità che si verifichino
+ dei problemi. È inoltre impossibile accettare tale segnalazione in quanto non
+ è chiaro quale autore di sottoscrizioni di filtri debba controllare; eliminare
+ tutte le sottoscrizioni superflue lasciando solo quella necessaria e verificare
+ se il problema persiste ancora">
+<!ENTITY screenshot.mark.label "&amp;Contrassegna l'area del problema">
+<!ENTITY privacyPolicy.label "Informativa sulla privacy">
+<!ENTITY issues.description "Sono stati rilevati dei problemi con le impostazioni di Adblock Plus che potrebbero essere responsabili
+ del problema da segnalare oppure potrebbero rendere difficile rinvenirne le cause">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/sidebar.dtd
new file mode 100644
index 0000000..2ae120b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Fai lampeggiare il contorno dell'elemento selezionato">
+<!ENTITY address.label "Indirizzo web">
+<!ENTITY context.open.label "Apri in una nuova scheda">
+<!ENTITY type.label "Tipo">
+<!ENTITY tooltip.filterSource.label "Sorgente del filtro:">
+<!ENTITY noitems.label "Nessun elemento bloccabile">
+<!ENTITY filter.label "Filtro">
+<!ENTITY tooltip.size.label "Dimensione:">
+<!ENTITY reattach.label "Riunisci">
+<!ENTITY search.label "&amp;Cerca:">
+<!ENTITY docDomain.thirdParty "(terza parte)">
+<!ENTITY filterSource.label "Sorgente del filtro">
+<!ENTITY tooltip.docDomain.label "Sorgente del documento:">
+<!ENTITY context.copy.label "Copia l'indirizzo web dell'elemento">
+<!ENTITY tooltip.type.label "Tipo:">
+<!ENTITY context.disablefilter.label "Disattiva il filtro ?1?">
+<!ENTITY context.copyFilter.label "Copia il filtro">
+<!ENTITY context.block.label "Blocca questo elemento">
+<!ENTITY context.enablefilter.label "Riattiva il filtro ?1?">
+<!ENTITY detach.label "Separa">
+<!ENTITY whitelisted.label "Pagina in lista di siti permessi">
+<!ENTITY context.disablefilteronsite.label "Disattiva il filtro per ?1?">
+<!ENTITY detached.title "Elementi bloccabili con Adblock Plus (separati)">
+<!ENTITY docDomain.firstParty "(prima parte)">
+<!ENTITY tooltip.type.whitelisted "(in lista di elementi permessi)">
+<!ENTITY tooltip.filter.label "Filtro effettivo:">
+<!ENTITY tooltip.filter.disabled "(disattivato)">
+<!ENTITY context.editfilter.label "Modifica il filtro in effetto">
+<!ENTITY tooltip.type.blocked "(in lista di elementi bloccati)">
+<!ENTITY size.label "Dimensione">
+<!ENTITY context.whitelist.label "Aggiungi un'eccezione per l'elemento">
+<!ENTITY context.selectAll.label "Seleziona tutto">
+<!ENTITY state.label "Stato">
+<!ENTITY docDomain.label "Sorgente">
+<!ENTITY tooltip.address.label "Indirizzo web:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/subscriptionSelection.dtd
new file mode 100644
index 0000000..36af5cd
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/it/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Aggiungere la &amp;sottoscrizione di filtri &quot;?1?&quot;">
+<!ENTITY list.download.failed "Recupero della lista di sottoscrizioni non riuscito">
+<!ENTITY list.download.retry "Riprova">
+<!ENTITY title.label "&amp;Titolo della sottoscrizione:">
+<!ENTITY list.download.website "Visita il sito web delle sottoscrizioni">
+<!ENTITY supplementMessage "Questa sottoscrizione di filtri verrà utilizzata insieme a quella chiamata &quot;?1?&quot; (ancora non aggiunta).">
+<!ENTITY viewList.label "Visualizza i filtri della sottoscrizione">
+<!ENTITY visitHomepage.label "Visita il sito web">
+<!ENTITY addSubscription.label "Aggiungi sottoscrizione">
+<!ENTITY dialog.title "Sottoscrizione di filtri di Adblock Plus">
+<!ENTITY location.label "Indiri&amp;zzo web della lista dei filtri:">
+<!ENTITY fromWeb.description "Confermare l'aggiunta della sottoscrizione di filtri. È possibile modificare il titolo della sottoscrizione oppure l'URL/percorso della lista dei filtri prima di aggiungerla">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/composer.dtd
new file mode 100644
index 0000000..0c162d5
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "アドレス末尾(&amp;N)">
+<!ENTITY domainRestriction.label "ドメイン制é™:(&amp;D)">
+<!ENTITY collapse.default.no.label "デフォルト (ã„ã„ãˆ)">
+<!ENTITY firstParty.label "ファーストパーティ制é™(&amp;R)">
+<!ENTITY preferences.label "既存ã®ãƒ•ィルタを表示...(&amp;S)">
+<!ENTITY pattern.label "ãƒ‘ã‚¿ãƒ¼ãƒ³ã‚’é¸æŠž">
+<!ENTITY thirdParty.label "サードパーティ制é™(&amp;T)">
+<!ENTITY filter.label "新フィルタ:(&amp;F)">
+<!ENTITY collapse.label "ブロック後ã®ç©ºãスペースを詰ã‚ã‚‹:(&amp;L)">
+<!ENTITY match.warning "入力ã—ãŸãƒ‘ターンã¯ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ä¸€è‡´ã—ãªã„ã®ã§åŠ¹æžœãŒã‚りã¾ã›ã‚“。">
+<!ENTITY anchor.start.label "アドレス先頭(&amp;G)">
+<!ENTITY matchCase.label "å¤§æ–‡å­—å°æ–‡å­—を区別(&amp;M)">
+<!ENTITY custom.pattern.label "自作:(&amp;C)">
+<!ENTITY unselectAllTypes.label "é¸æŠžè§£é™¤">
+<!ENTITY type.whitelist.label "ホワイトリスト(&amp;X)">
+<!ENTITY regexp.warning "入力ã•れãŸãƒ‘ã‚¿ãƒ¼ãƒ³ã¯æ­£è¦è¡¨ç¾ã¨ã—ã¦è§£é‡ˆã•れるãŸã‚ Adblock Plus ãŒåŠ¹çŽ‡ã‚ˆã処ç†ã§ããšã€ãƒ–ラウジング速度低下ã®åŽŸå› ã«ãªã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ã‚‚ã—æ­£è¦è¡¨ç¾ã®ä½¿ç”¨ã‚’æ„図ã—ã¦ã„ãªã‹ã£ãŸå ´åˆã¯ã€ãƒ‘ターン末尾ã«åŠè§’アスタリスク (*) を追加ã—ã¦ãã ã•ã„。">
+<!ENTITY dialog.title "Adblock Plus フィルタを追加">
+<!ENTITY basic.label "基本表示">
+<!ENTITY type.filter.label "ブロックフィルタ(&amp;B)">
+<!ENTITY types.label "é©ç”¨ç¨®åˆ¥:">
+<!ENTITY shortpattern.warning "入力ã—ãŸãƒ‘ã‚¿ãƒ¼ãƒ³ã¯æœ€é©åŒ–ã™ã‚‹ã«ã¯çŸ­ã™ãŽã‚‹ãŸã‚ブラウジング速度ãŒä½Žä¸‹ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚Adblock Plus ã®å‡¦ç†ã‚’効率化ã™ã‚‹ãŸã‚ã«ã€ã‚ˆã‚Šé•·ã„文字列をé¸ã¶ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚">
+<!ENTITY collapse.yes.label "ã¯ã„">
+<!ENTITY anchors.label "パターンé©ç”¨ã®èµ·ç‚¹:">
+<!ENTITY collapse.default.yes.label "デフォルト (ã¯ã„)">
+<!ENTITY domainRestriction.help "フィルタé©ç”¨å¯¾è±¡ã«ã™ã‚‹ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚複数指定ã—ãŸã„å ´åˆã¯ç¸¦ç·š(|)ã§åˆ†ã‘ã¦ãã ã•ã„。ドメインåã®å‰ã«ãƒãƒ«ãƒ€(~)を付ã‘ã‚‹ã“ã¨ã§ã€é©ç”¨å¤–ドメインã¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™">
+<!ENTITY accept.label "フィルタを追加">
+<!ENTITY options.label "オプション">
+<!ENTITY disabled.warning "ç¾åœ¨ Adblock Plus ã¯ç„¡åйã«ãªã£ã¦ã„ã¾ã™ã€‚フィルタを追加ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã™ãŒã€ãれら㯠[link]Adblock Plus を有効ã«ã™ã‚‹[/link] ã¾ã§é©ç”¨ã•れã¾ã›ã‚“。">
+<!ENTITY anchor.start.flexible.label "ドメインå先頭(&amp;G)">
+<!ENTITY collapse.no.label "ã„ã„ãˆ">
+<!ENTITY selectAllTypes.label "ã™ã¹ã¦é¸æŠž">
+<!ENTITY advanced.label "詳細表示">
+<!ENTITY pattern.explanation "パターンã¨ã¯ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ä»»æ„ã®ä¸€éƒ¨ã®ã“ã¨ã§ã™ã€‚åŠè§’アスタリスク (*) をワイルドカードã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚指定ã—ãŸãƒ‘ターンã«ä¸€è‡´ã—ãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã®ã¿ãƒ•ィルタãŒé©ç”¨ã•れã¾ã™ã€‚">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/filters.dtd
new file mode 100644
index 0000000..b5d5270
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "å…¨ã¦ã®è‡ªä½œãƒ•ã‚£ãƒ«ã‚¿ã¯æŒ‡å®šã—ãŸãƒ•ァイルã®å†…容ã«ç½®æ›ã•れã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ">
+<!ENTITY slow.column "低速フィルタ(&amp;W)">
+<!ENTITY enabled.column "有効(&amp;N)">
+<!ENTITY subscription.lastDownload.checksumMismatch "更新失敗: ãƒã‚§ãƒƒã‚¯ã‚µãƒ ä¸ä¸€è‡´">
+<!ENTITY noFiltersInGroup.text "é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã«ãƒ•ィルタã¯ã‚りã¾ã›ã‚“">
+<!ENTITY subscription.actions.label "アクション">
+<!ENTITY filter.selectAll.label "ã™ã¹ã¦é¸æŠž">
+<!ENTITY backupButton.label "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¨å¾©å…ƒ(&amp;B)">
+<!ENTITY restore.minVersion.warning "警告: ã“ã®ãƒ•ァイルã¯ã‚ˆã‚Šæ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® Adblock Plus ã§ä½œæˆã•れã¦ã„ã¾ã™ã€‚ã“ã®ãƒ•ァイルã‹ã‚‰å¾©å…ƒã™ã‚‹å‰ã« Adblock Plus ã‚’æœ€æ–°ç‰ˆã«æ›´æ–°ã—ã¦ãã ã•ã„。">
+<!ENTITY restore.error "ファイルデータãŒå‡¦ç†ã§ãã¾ã›ã‚“。ã“ã®ãƒ•ァイル㯠Adblock Plus ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã§ãªã„ã®ã§ã¯ï¼Ÿ">
+<!ENTITY sort.ascending.label "&amp;A &gt; Z é †ã«ã‚½ãƒ¼ãƒˆ">
+<!ENTITY sort.label "ソート(&amp;S)">
+<!ENTITY subscription.source.label "フィルタリスト">
+<!ENTITY hitcount.column "ヒット数(&amp;H)">
+<!ENTITY noFilters.text "ã¾ã è‡ªä½œãƒ•ィルタã¯ã‚りã¾ã›ã‚“。">
+<!ENTITY backup.custom.title "自作フィルタã®ã¿">
+<!ENTITY subscription.external.label "ä»–ã®æ‹¡å¼µã«ã‚ˆã‚Šæ›´æ–°">
+<!ENTITY subscription.delete.label "削除">
+<!ENTITY noGroupSelected.text "フィルタを表示ã™ã‚‹ã«ã¯ã€ã¾ãšãƒ•ã‚£ãƒ«ã‚¿ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„">
+<!ENTITY filter.cut.label "切りå–り">
+<!ENTITY restore.default.label "?1? ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‹ã‚‰å¾©å…ƒ">
+<!ENTITY subscription.lastDownload.inProgress "ダウンロード中...">
+<!ENTITY subscriptions.tab.label "購読ã—ã¦ã„るフィルタ">
+<!ENTITY sort.descending.label "&amp;Z &gt; A é †ã«ã‚½ãƒ¼ãƒˆ">
+<!ENTITY filters.remove.warning "é¸æŠžã—ãŸãƒ•ィルタを本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ">
+<!ENTITY filter.delete.label "削除">
+<!ENTITY addSubscriptionAdd.label "追加">
+<!ENTITY viewMenu.label "表示">
+<!ENTITY subscription.lastDownload.unknown "䏿˜Ž">
+<!ENTITY addSubscriptionCancel.label "キャンセル">
+<!ENTITY subscription.enabled.label "有効">
+<!ENTITY noSubscriptions.text "フィルタをã¾ã è³¼èª­ã—ã¦ã„ã¾ã›ã‚“。Adblock Plus ã¯ãƒ•ィルタãªã—ã§ä½•もブロックã§ããªã„ã®ã§ã€Œè³¼èª­ã™ã‚‹ãƒ•ィルタを追加ã€ã—ã¦ãã ã•ã„。">
+<!ENTITY subscription.update.label "フィルタを更新">
+<!ENTITY dialog.title "Adblock Plus フィルタ設定">
+<!ENTITY addFilter.label "フィルタを追加(&amp;D)">
+<!ENTITY subscription.minVersion.warning "購読ã—ã¦ã„るフィルタã¯ã‚ˆã‚Šæ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® Adblock Plus ã‚’è¦æ±‚ã—ã¦ã„ã‚‹ã®ã§ã€æœ€æ–°ã® Adblock Plus ã«æ›´æ–°ã—ã¦ãã ã•ã„。">
+<!ENTITY subscription.lastDownload.invalidURL "更新失敗: アドレス無効">
+<!ENTITY backup.error "ファイル出力エラー。ファイル書ãè¾¼ã¿ç¦æ­¢ï¼ä»–ã®ã‚¢ãƒ—リケーションã§ä½¿ç”¨ä¸­ ã¨ãªã£ã¦ã„ãªã„ã‹ç¢ºèªã—ã¦ãã ã•ã„。">
+<!ENTITY filter.moveUp.label "上ã«ç§»å‹•">
+<!ENTITY addGroup.label "フィルタグループを追加(&amp;G)">
+<!ENTITY filter.edit.label "編集">
+<!ENTITY subscription.showHideFilters.label "フィルタを表示ï¼éžè¡¨ç¤º">
+<!ENTITY acceptableAds2.label "控ãˆã‚ãªåºƒå‘Šã‚’許å¯(&amp;I)">
+<!ENTITY addSubscriptionOther.label "別ã®è³¼èª­ã™ã‚‹ãƒ•ィルタを追加">
+<!ENTITY close.label "é–‰ã˜ã‚‹">
+<!ENTITY sort.none.label "ソートã—ãªã„(&amp;U)">
+<!ENTITY filter.actions.label "フィルタアクション">
+<!ENTITY filter.copy.label "コピー">
+<!ENTITY filter.moveDown.label "下ã«ç§»å‹•">
+<!ENTITY filter.resetHitCounts.label "ヒット数をリセット">
+<!ENTITY readMore.label "詳細説明ページを開ã">
+<!ENTITY subscription.moveUp.label "上ã«ç§»å‹•">
+<!ENTITY addSubscription.label "購読ã™ã‚‹ãƒ•ィルタを追加(&amp;F)">
+<!ENTITY subscription.homepage.label "ホームページ">
+<!ENTITY backup.complete.title "自作åŠã³è³¼èª­ã—ã¦ã„るフィルタ">
+<!ENTITY restore.own.label "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ファイルを指定ã—ã¦å¾©å…ƒ">
+<!ENTITY restore.complete.warning "å…¨ã¦ã®ãƒ•ã‚£ãƒ«ã‚¿è¨­å®šã¯æŒ‡å®šã—ãŸãƒ•ァイルã®å†…容ã«ç½®æ›ã•れã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ">
+<!ENTITY filters.tab.label "自作フィルタ">
+<!ENTITY backup.label "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’æ–°è¦ä½œæˆ">
+<!ENTITY find.label "検索(&amp;N)">
+<!ENTITY subscription.moveDown.label "下ã«ç§»å‹•">
+<!ENTITY subscription.lastDownload.connectionError "更新失敗: 接続エラー">
+<!ENTITY subscription.lastDownload.success "æ›´æ–°æˆåŠŸ">
+<!ENTITY subscription.lastDownload.invalidData "更新失敗: フィルタリスト無効">
+<!ENTITY filter.paste.label "貼り付ã‘">
+<!ENTITY subscription.disabledFilters.enable "無効ã«ãªã£ã¦ã„るフィルタを有効化">
+<!ENTITY lasthit.column "最終ヒット日時(&amp;L)">
+<!ENTITY subscription.editTitle.label "タイトルを編集">
+<!ENTITY subscription.disabledFilters.warning "購読ã—ã¦ã„るフィルタã®ä¸€éƒ¨ãŒç„¡åŠ¹åŒ–ã•れã¦ã„ã¾ã™">
+<!ENTITY filter.column "フィルタ(&amp;F)">
+<!ENTITY subscription.lastDownload.label "更新日時:">
+<!ENTITY viewList.label "フィルタファイルを開ã„ã¦ç¢ºèª">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/firstRun.properties
new file mode 100644
index 0000000..776b9e7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=追跡を無効化ã—ã¦ãƒ—ライãƒã‚·ãƒ¼ã‚’確ä¿ã—ã¤ã¤ãƒ–ラウジング - ã‚ãªãŸã®ã‚らゆる動é™ã‚’追跡ã™ã‚‹åºƒå‘Šä¼šç¤¾ã‹ã‚‰è¶³è·¡ã‚’éš ã—ã¾ã™ã€‚
+firstRun_toggle_off=OFF
+firstRun_feature_tracking=トラッキングを無効化
+firstRun_feature_malware=マルウェアをブロック
+firstRun_title=Adblock Plus ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¾ã—ãŸ
+firstRun_toggle_on=ON
+firstRun_acceptableAdsExplanation=我々ã¯ã‚¦ã‚§ãƒ–サイトãŒç°¡ç´ ã§æŽ§ãˆã‚ãªåºƒå‘Šã‚’使用ã™ã‚‹ã‚ˆã†å¾ŒæŠ¼ã—ã—ãŸã„ã¨è€ƒãˆã¦ã„ã¾ã™ã€‚ãã®ãŸã‚控ãˆã‚ãªåºƒå‘Šã‚’区別ã™ã‚‹ãŸã‚ã®<a>厳格ãªã‚¬ã‚¤ãƒ‰ãƒ©ã‚¤ãƒ³</a>を策定ã—ã€ãƒ‡ãƒ•ォルトã§è¨±å¯ã™ã‚‹ã‚ˆã†ã«ã—ã¾ã—ãŸã€‚ã™ã¹ã¦ã®åºƒå‘Šã‚’ブロックã—ãŸã„å ´åˆã¯æ•°ç§’ã§æŽ§ãˆã‚ãªåºƒå‘Šã®è¨±å¯ã‚’<a>無効ã«ã™ã‚‹</a>ã“ã¨ãŒã§ãã¾ã™ 。
+firstRun_contributor_credits=貢献ã—ãŸäºº
+firstRun_dataCorruptionWarning=ã“ã®ãƒšãƒ¼ã‚¸ãŒä½•度もå†è¡¨ç¤ºã•れる場åˆã¯ <a>ã“ã“ã‚’å‚ç…§ï¼</a>
+firstRun_acceptableAdsHeadline=迷惑ãªåºƒå‘Šã¯ãƒ–ロックã•れã¾ã™
+firstRun_share=å‹é”ã«æ•™ãˆã‚‹
+firstRun_share_headline=Web をより良ã„場所ã«ã™ã‚‹ãŸã‚ã«<a>å”力ã™ã‚‹</a>
+firstRun_feature_social_description=Web ページã«è¨­ç½®ã•れã¦ã„ã¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®è¡Œå‹•を追跡ã™ã‚‹ã‚½ãƒ¼ã‚·ãƒ£ãƒ«ãƒ¡ãƒ‡ã‚£ã‚¢ãƒœã‚¿ãƒ³ï¼ˆä¾‹ãˆã° Facebook ã®ã€Œã„ã„ã­ï¼ã€ï¼‰ã‚’自動的ã«å–り除ãã¾ã™ã€‚
+firstRun_filterlistsReinitializedWarning=ã™ã¹ã¦ã®ãƒ•ィルタãŒå‰Šé™¤ã•れã¦ã—ã¾ã†å•題ãŒç™ºç”Ÿã—ãŸã‚ˆã†ã§ã™ã€‚ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‹ã‚‰å¾©å…ƒã™ã‚‹ã“ã¨ãŒã§ããšã€ãŠä½¿ã„ã®ãƒ•ã‚£ãƒ«ã‚¿ã¨æŽ§ãˆã‚ãªåºƒå‘Šã®è¨­å®šã‚’リセットã™ã‚‹å¿…è¦ãŒã‚りã¾ã—ãŸã€‚ <a>Adblock Plus ã®ã‚ªãƒ—ション</a>ã‹ã‚‰ã€ãŠä½¿ã„ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒªã‚¹ãƒˆã¨æŽ§ãˆã‚ãªåºƒå‘Šã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„。
+firstRun_feature_malware_description=既知ã®ãƒžãƒ«ã‚¦ã‚§ã‚¢é…布ドメインをブロックã™ã‚‹ã“ã¨ã§ã€ã‚ˆã‚Šå®‰å…¨ãªãƒ–ラウジングをå¯èƒ½ã«ã—ã¾ã™ã€‚
+firstRun_features=Adblock Plus ã¯å˜ã«åºƒå‘Šã‚’ブロックã™ã‚‹ã ã‘ã§ã¯ã‚りã¾ã›ã‚“
+firstRun_donate=寄付
+firstRun_donate_label=プロジェクトを支æ´
+firstRun_feature_social=ソーシャルメディアã®ãƒœã‚¿ãƒ³ã‚’消ã™
+firstRun_legacySafariWarning=Adblock Plus ãŒã‚µãƒãƒ¼ãƒˆã—ã¦ã„ãªã„å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® Safari を利用ã—ã¦ã„ã‚‹ãŸã‚ã€æ­£å¸¸ã«å‹•作ã—ãªã‹ã£ãŸã‚Šãƒ¦ãƒ¼ã‚¶ãƒ¼ä½“験をæãªã† Web サイトãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。Mac OS X 10.8 Mountain Lion ãªã‚‰ Safari 6.1.1 以é™ã€Mac OS X 10.9 Mavericks ãªã‚‰ Safari 7.0.1 以é™ã«æ›´æ–°ã™ã‚‹ã‹ã€Mozilla Firefoxï¼Google Chromeï¼Opera ã„ãšã‚Œã‹æœ€æ–°ç‰ˆã®åˆ©ç”¨ã‚’å¼·ãæŽ¨å¥¨ã—ã¾ã™ã€‚
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/global.properties
new file mode 100644
index 0000000..842af8e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=ç¾åœ¨ã®ãƒšãƒ¼ã‚¸ã«ãƒ–ロックå¯èƒ½é …ç›®ã¯ã‚りã¾ã›ã‚“
+action3_tooltip=クリック㧠Adblock Plus 有効ï¼ç„¡åŠ¹ã‚’åˆ‡ã‚Šæ›¿ãˆ
+notification_antiadblock_title=Adblock Plus ユーザーå‘ã‘ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’éžè¡¨ç¤ºã«ã—ã¾ã™ã‹ï¼Ÿ
+type_label_script=スクリプト
+filter_elemhide_nocriteria=è¦ç´ ã‚’éžè¡¨ç¤ºã«ã™ã‚‹æ¡ä»¶ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“
+blockingGroup_title=広告ブロックルール
+whitelisted_tooltip=Adblock Plus ã¯ç¾åœ¨ã®ãƒšãƒ¼ã‚¸ã§ç„¡åй
+type_label_stylesheet=スタイルシート
+blocked_count_tooltip=ブロック済: ?1?ï¼ãƒ–ロックå¯èƒ½ :?2?
+type_label_font=フォント
+type_label_popup=ãƒãƒƒãƒ—アップ
+filter_regexp_tooltip=ã“ã®ãƒ•ã‚£ãƒ«ã‚¿ã¯æ­£è¦è¡¨ç¾ã‚’使用ã—ã¦ã„ã‚‹ã€ã‚‚ã—ãã¯æœ€é©åŒ–ã™ã‚‹ã®ã«çŸ­éŽãŽã¾ã™ã€‚ã“ã®ã‚ˆã†ãªãƒ•ィルタãŒå¤šã„ã¨ãƒ–ラウザãŒé…ããªã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚
+action0_tooltip=クリックã§ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’表示ã€ä¸­ã‚¯ãƒªãƒƒã‚¯ã§æœ‰åйï¼ç„¡åŠ¹ã‚’åˆ‡ã‚Šæ›¿ãˆ
+whitelisted_page=Adblock Plus ã¯ç¾åœ¨ã®ãƒšãƒ¼ã‚¸ã§ç„¡åйã«è¨­å®šã•れã¦ã„ã¾ã™
+remove_group_warning=本当ã«ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を削除ã—ã¾ã™ã‹ï¼Ÿ
+action1_tooltip=クリックã§ãƒ–ロックå¯èƒ½é …目一覧を開ï¼é–‰ã€ä¸­ã‚¯ãƒªãƒƒã‚¯ã§æœ‰åйï¼ç„¡åŠ¹ã‚’åˆ‡ã‚Šæ›¿ãˆ
+type_label_xmlhttprequest=XML リクエスト
+active_tooltip=Adblock Plus 有効 (フィルタ購読数: ?1?ï¼è‡ªä½œãƒ•ィルタ数: ?2?)
+type_label_document=ドキュメント
+type_label_object_subrequest=オブジェクトã®ã‚µãƒ–リクエスト
+whitelistGroup_title=ホワイトリスト
+disabled_tooltip=Adblock Plus 無効
+filter_elemhide_duplicate_id=è¦ç´ ã‚’éžè¡¨ç¤ºã«ã™ã‚‹ ID ã¯ï¼‘ã¤ã ã‘指定ã§ãã¾ã™
+type_label_object=オブジェクト
+action2_tooltip=クリックã§è¨­å®šã‚’オープンã€ä¸­ã‚¯ãƒªãƒƒã‚¯ã§æœ‰åйï¼ç„¡åŠ¹ã‚’åˆ‡ã‚Šæ›¿ãˆ
+type_label_subdocument=フレーム
+clearStats_warning=全フィルタã®ãƒ’ット数をリセットã—ã€ãƒ’ット数記録機能を無効化ã—ã¾ã™ã‹ï¼Ÿ
+notification_antiadblock_message=ã“ã®ã‚µã‚¤ãƒˆã¯ Adblock Plus ユーザーを対象ã¨ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã“ã¨ã§çŸ¥ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚Adblock Plus ã§ã“れらã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’éžè¡¨ç¤ºã«ã—ã¾ã™ã‹ï¼Ÿ
+blocked_count_addendum=(ホワイトリスト: ?1?ï¼è¦ç´ éžè¡¨ç¤º: ?2?)
+subscription_invalid_location=購読ã™ã‚‹ãƒ•ィルタ㮠URL ãŒç„¡åйã€ã‚‚ã—ãã¯ä¸æ­£ãªãƒ•ァイルåã§ã™ã€‚
+type_label_image=ç”»åƒ
+remove_subscription_warning=本当ã«ã“ã®ãƒ•ィルタã®è³¼èª­ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ
+type_label_other=ãã®ä»–
+mobile_menu_enable=ABP: 有効
+type_label_media=オーディオï¼ãƒ“デオ
+mobile_menu_disable_site=ABP: ?1? ã§ç„¡åй
+elemhideGroup_title=è¦ç´ éžè¡¨ç¤ºãƒ«ãƒ¼ãƒ«
+mobile_menu_enable_site=ABP: ?1? ã§æœ‰åй
+type_label_elemhide=è¦ç´ éžè¡¨ç¤º
+newGroup_title=æ–°ã—ã„フィルタグループ
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/overlay.dtd
new file mode 100644
index 0000000..660a2df
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "ã¯ã„(&amp;Y)">
+<!ENTITY notification.button.no "ã„ã„ãˆ(&amp;N)">
+<!ENTITY sync.label "Adblock Plus 設定を Sync ã§åŒæœŸ(&amp;C)">
+<!ENTITY whitelist.site.label "?1? ã§ç„¡åй">
+<!ENTITY filters.label "フィルタ設定(&amp;F)">
+<!ENTITY disable.label "全ページã§ç„¡åй">
+<!ENTITY objecttab.title "ブロックã™ã‚‹">
+<!ENTITY objecttab.tooltip "クリックã—ã¦ã‚ªãƒ–ジェクトをブロック (Adblock Plus)">
+<!ENTITY menuitem.label "Adblock Plus 設定(&amp;B)">
+<!ENTITY objecttabs.label "Flash 㨠Java ã§ã‚¿ãƒ–を表示(&amp;T)">
+<!ENTITY sendReport.label "ã“ã®ãƒšãƒ¼ã‚¸ã§ã®ä¸å…·åˆã‚’報告(&amp;R)">
+<!ENTITY whitelist.page.label "ã“ã®ãƒšãƒ¼ã‚¸ã ã‘無効">
+<!ENTITY context.image.label "Adblock Plus: ç”»åƒã‚’ブロック">
+<!ENTITY counthits.label "フィルタã®ãƒ’ット数を数ãˆã‚‹(&amp;H)">
+<!ENTITY opensidebar.label "ブロックå¯èƒ½é …目一覧を開ã(&amp;B)">
+<!ENTITY notification.button.close "é–‰ã˜ã‚‹(&amp;C)">
+<!ENTITY contribute.label "Adblock Plus ã«è²¢çŒ®ã™ã‚‹">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: フレームをブロック">
+<!ENTITY blocked.tooltip "ã“ã®ãƒšãƒ¼ã‚¸ã§ãƒ–ロック中ã®é …ç›®:">
+<!ENTITY hideplaceholders.label "ブロックã—ãŸå ´æ‰€ã«æ®‹ã‚‹ç©ºãスペースを詰ã‚ã‚‹(&amp;L)">
+<!ENTITY showinstatusbar.label "ステータスãƒãƒ¼ã«è¡¨ç¤º(&amp;S)">
+<!ENTITY sidebar.title "ã“ã®ãƒšãƒ¼ã‚¸ã®ãƒ–ロックå¯èƒ½é …目一覧">
+<!ENTITY options.label "オプション(&amp;O)">
+<!ENTITY context.object.label "Adblock Plus: オブジェクトをブロック">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: ã“ã®ãƒšãƒ¼ã‚¸ã§æœ‰åŠ¹ã«æˆ»ã™">
+<!ENTITY filters.tooltip "有効ãªãƒ•ィルタ:">
+<!ENTITY closesidebar.label "ブロックå¯èƒ½é …目一覧を閉ã˜ã‚‹(&amp;B)">
+<!ENTITY showintoolbar.label "ツールãƒãƒ¼ã«è¡¨ç¤º(&amp;B)">
+<!ENTITY status.tooltip "ステータス:">
+<!ENTITY context.media.label "Adblock Plus: オーディオï¼ãƒ“デオをブロック">
+<!ENTITY subscription.update.label "フィルタを更新">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/sendReport.dtd
new file mode 100644
index 0000000..d8a54eb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "å…ƒã«æˆ»ã™(&amp;U)">
+<!ENTITY issues.disabledgroups.description "購読ã—ã¦ã„る次ã®ãƒ•ィルタï¼ãƒ•ィルタグループã¯ç„¡åйã«ãªã£ã¦ã„ã¾ã™ãŒã€ã“ã®ãƒšãƒ¼ã‚¸ã«å½±éŸ¿ãŒã‚ã£ãŸã‹ã‚‚ã—れã¾ã›ã‚“:">
+<!ENTITY showData.label "ä¸å…·åˆå ±å‘Šãƒ‡ãƒ¼ã‚¿ã‚’表示">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus ã®ãƒ–ロックãŒéŽå‰° (&amp;M)">
+<!ENTITY issues.change.description "設定ãŒå¤‰æ›´ã•れã¾ã—ãŸã€‚確èªã®ãŸã‚ã«ãƒšãƒ¼ã‚¸ã‚’å†èª­ã¿è¾¼ã¿ã—ã€ã‚‚ã—ä¸å…·åˆãŒè§£æ±ºã—ãªã‘れã°ä¸å…·åˆå ±å‘Šã‚’æå‡ºã—ã¦ãã ã•ã„">
+<!ENTITY email.label "Email:(&amp;M)">
+<!ENTITY issues.openPreferences.label "フィルタ設定を開ã">
+<!ENTITY sendPage.confirmation "ã‚ãªãŸã®ä¸å…·åˆå ±å‘Šã¯ä¿å­˜ã•れã¾ã—ãŸã€‚次ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™:">
+<!ENTITY copyLink.label "ä¸å…·åˆå ±å‘Šã®ãƒªãƒ³ã‚¯ã‚’コピー(&amp;C)">
+<!ENTITY issues.nofilters.description "Adblock Plus ã¯ã“ã®ãƒšãƒ¼ã‚¸ã§ä½•もブロックã—ã¦ã„ãªã„ã®ã§ã€ãŠæ°—付ãã®ä¸å…·åˆã¯æã‚‰ã Adblock Plus ã¨ã¯é–¢ä¿‚ã‚りã¾ã›ã‚“。">
+<!ENTITY sendPage.knownIssue "æã‚‰ãã€ã‚ãªãŸã®å ±å‘Šã—ãŸä¸å…·åˆã¯æ—¢çŸ¥ã®å•題ã§ã™ã€‚詳細:">
+<!ENTITY typeSelector.other.description "フィルタã§ã¯ãªã Adblock Plus 自体ã®ä¸å…·åˆãŒç–‘ã‚れる場åˆã¯ã“ã®é¸æŠžè‚¢ã€‚">
+<!ENTITY issues.disabledgroups.enable.label "購読ã—ã¦ã„るフィルタï¼ãƒ•ィルタグループを有効化">
+<!ENTITY typeWarning.override.label "ç†è§£ã—ãŸä¸Šã§ã€ãれã§ã‚‚ä¸å…·åˆå ±å‘Šã‚’æå‡ºã—ãŸã„(&amp;S)">
+<!ENTITY issues.disabled.enable.label "Adblock Plus を有効化">
+<!ENTITY update.fixed.description "報告ã—よã†ã¨ã—ã¦ã„ãŸä¸å…·åˆã¯ã€è³¼èª­ã—ã¦ã„ã‚‹ãƒ•ã‚£ãƒ«ã‚¿ã®æ›´æ–°ã§è§£æ±ºã—ãã†ã§ã™ã€‚ページをå†èª­ã¿è¾¼ã¿ã—ã¦å†ç¢ºèªã—ã¦ã¿ã¦ãã ã•ã„。ãれã§ã‚‚解決ã—ãªã„å ´åˆã¯å†åº¦ä¸å…·åˆã‚’報告願ã„ã¾ã™ã€‚">
+<!ENTITY anonymous.label "匿åã§å ±å‘Š(&amp;A)">
+<!ENTITY reloadButton.label "ページをå†èª­ã¿è¾¼ã¿(&amp;R)">
+<!ENTITY recentReports.clear.label "ã™ã¹ã¦ã®ä¸å…·åˆå ±å‘Šã‚’削除(&amp;R)">
+<!ENTITY typeSelector.description "ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã§ä¸å…·åˆã®å ±å‘Šã«å¿…è¦ãªã‚¹ãƒ†ãƒƒãƒ—ã‚’ã”æ¡ˆå†…ã—ã¾ã™ã€‚ã¾ãšæœ€åˆã«ã€é­é‡ã—ãŸä¸å…·åˆã®ç¨®åˆ¥ã‚’é¸æŠžã—ã¦ãã ã•ã„:">
+<!ENTITY screenshot.remove.label "機密情報等を黒塗りã—ã¦éš ã™(&amp;R)">
+<!ENTITY issues.ownfilters.description "ã“ã®ãƒšãƒ¼ã‚¸ã«ã¯è‡ªä½œãƒ•ィルタãŒé©ç”¨ã•れã¦ã„ã¾ã™ã€‚ãれãŒä¸å…·åˆã®åŽŸå› ã¨ãªã£ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ã®ã§ã€ã¾ãšãれらを無効ã«ã—ã¦ãã ã•ã„:">
+<!ENTITY update.inProgress.description "ä¸å…·åˆãŒè§£æ±ºã—ãŸã‹ç¢ºã‹ã‚ã‚‹ãŸã‚ã€Adblock Plus ã§è³¼èª­ã—ã¦ã„るフィルタを更新ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„...">
+<!ENTITY sendPage.retry.label "å†é€ä¿¡">
+<!ENTITY data.label "ä¸å…·åˆå ±å‘Šãƒ‡ãƒ¼ã‚¿:(&amp;P)">
+<!ENTITY recentReports.label "最近é€ä¿¡ã—ãŸä¸å…·åˆå ±å‘Š">
+<!ENTITY typeWarning.description "フィルタã«ã¤ã„ã¦ã§ã¯ãªã Adblock Plus 全般ã®ä¸å…·åˆã‚’報告ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ã“ã®ã‚ˆã†ãªä¸å…·åˆã¯é€šå¸¸ [link]Adblock Plus フォーラム[/link] ã§å ±å‘Šã•れã¦ã„ã¾ã™ã€‚ã¾ãŸã€ä¸å…·åˆå ±å‘Šã¸ã®ãƒªãƒ³ã‚¯ã‚’自らæä¾›ã—ãªã„é™ã‚Šãƒ•ォーラムã®èª°ã‚‚ã‚ãªãŸã®ä¸å…·åˆå ±å‘Šã®å­˜åœ¨ã«æ°—付ã‘ãªã„ã®ã§ã€æ—¢å­˜ã®è­°è«–を補完ã™ã‚‹ãŸã‚ã ã‘ã«ä½¿ç”¨ã—ã¦ãã ã•ã„。ä¸å…·åˆå ±å‘Šã¸ã®ãƒªãƒ³ã‚¯ã¯ãƒ¬ãƒãƒ¼ãƒˆé€ä¿¡å¾Œã«æä¾›ã•れã¾ã™ã€‚">
+<!ENTITY issues.disabled.description "Adblock Plus ãŒç„¡åйãªã®ã§ã€ä½•もブロックã•れã¦ã„ã¾ã›ã‚“">
+<!ENTITY attachExtensions.label "アドオンã®ç«¶åˆãŒä¸å…·åˆã®åŽŸå› ã§ã‚ã‚‹å ´åˆãŒã‚ã‚‹ã®ã§ã€å‹•作ã—ã¦ã„るアドオンã®ãƒªã‚¹ãƒˆã‚’ä¸å…·åˆå ±å‘Šã«æ·»ä»˜ã™ã‚‹(&amp;X)">
+<!ENTITY issues.nosubscriptions.add.label "購読ã™ã‚‹ãƒ•ィルタを追加">
+<!ENTITY issues.disabledfilters.enable.label "フィルタを有効化">
+<!ENTITY issues.override.label "設定ã«é–“é•ã„ã¯ãªã‹ã£ãŸã®ã§å ±å‘Šã‚’ç¶šã‘ã¾ã™(&amp;C)">
+<!ENTITY issues.nosubscriptions.description "ウェブサイトã®ä¸è¦ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„を自動削除ã™ã‚‹ã€æ—¢å­˜ã®ãƒ•ィルタをã¾ã è³¼èª­ã—ã¦ã„ãªã„よã†ã§ã™ã€‚">
+<!ENTITY typeSelector.falsePositive.description "ã‚ã‚‹ã¹ãコンテンツãŒãªã„ã€è¡¨ç¤ºãŒãŠã‹ã—ã„ã€ãƒ•ィルタãŒé©åˆ‡ã«æ©Ÿèƒ½ã—ã¦ãªã„å ´åˆã¯ã“ã®é¸æŠžè‚¢ã€‚ (ヒント: Adblock Plus を一時的ã«ç„¡åйã«ã™ã‚Œã°ã€åŽŸå› ã« Adblock Plus ãŒé–¢ã‚ã£ã¦ã„ã‚‹ã‹ç¢ºèªã§ãã¾ã™)">
+<!ENTITY typeSelector.other.label "ãã®ä»–ã®ä¸å…·åˆ(&amp;T)">
+<!ENTITY emailComment.label "報告ã«ä¸æ˜Žãªç‚¹ãŒã‚ã£ãŸéš›ã«é€£çµ¡ãŒå–れるよã†ã€ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å…¥åŠ›ã‚’ãŠå‹§ã‚ã—ã¦ã„ã¾ã™ã€‚ã“ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã‚ˆã‚Šã€å ±å‘Šã®å—信者ãŒå ±å‘Šè€…別ã«ã“れã¾ã§ã®è²¢çŒ®ã‚’考慮ã—ã€å„ªå…ˆåº¦ã‚’調整ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚">
+<!ENTITY issues.whitelist.remove.label "ã“ã®ãƒšãƒ¼ã‚¸ã§ Adblock Plus ã‚’å†åº¦æœ‰åйã«ã™ã‚‹">
+<!ENTITY outdatedSubscriptions.description "購読ã—ã¦ã„る次ã®ãƒ•ィルタã¯ï¼’週間以上更新ã•れã¦ã„ã¾ã›ã‚“。既ã«ä¸å…·åˆã¯è§£æ±ºæ¸ˆã¿ã‹ã‚‚ã—れãªã„ã®ã§ã€å…ˆã«æ‰‹å‹•æ›´æ–°ã—ã¦ã‹ã‚‰ä¸å…·åˆã‚’報告ã—ã¦ãã ã•ã„。">
+<!ENTITY dataCollector.description "Adblock Plus ãŒå¿…è¦ãªãƒ‡ãƒ¼ã‚¿ã‚’集ã‚ã¦ã„ã¾ã™ã€‚ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„。">
+<!ENTITY sendButton.label "ä¸å…·åˆå ±å‘Šã‚’é€ä¿¡(&amp;N)">
+<!ENTITY comment.label "コメント(ä»»æ„入力):(&amp;C)">
+<!ENTITY sendPage.errorMessage "ä¸å…·åˆå ±å‘Šã®é€ä¿¡ãŒã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ &quot;?1?&quot; ã§å¤±æ•—ã—ã¾ã—ãŸã€‚インターãƒãƒƒãƒˆã«æŽ¥ç¶šã•れã¦ã„ã‚‹ã‹ç¢ºèªã—å†è©¦è¡Œã—ã¦ãã ã•ã„。å•題ãŒè§£æ±ºã—ãªã„å ´åˆã¯ [link]Adblock Plus フォーラム[/link] ã§åŠ©ã‘を求ã‚ã¦ãã ã•ã„。">
+<!ENTITY showRecentReports.label "最近é€ä¿¡ã—ãŸä¸å…·åˆå ±å‘Šã‚’表示">
+<!ENTITY commentPage.heading "コメントを入力">
+<!ENTITY update.start.label "今ã™ãæ›´æ–°">
+<!ENTITY issues.disabledfilters.description "次ã®ãƒ•ィルタã¯ç„¡åйã«ãªã£ã¦ã„ã¾ã™ãŒã€ã“ã®ãƒšãƒ¼ã‚¸ã«å½±éŸ¿ãŒã‚ã£ãŸã‹ã‚‚ã—れã¾ã›ã‚“:">
+<!ENTITY screenshot.description "åŒã˜ãƒšãƒ¼ã‚¸ã§ã‚‚別ã®äººã«ã¯ç•°ãªã£ã¦è¡¨ç¤ºã•れるã“ã¨ãŒã‚ã‚‹ã®ã§ã€ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆæ·»ä»˜ã¯ä¸å…·åˆã‚’ç†è§£ã™ã‚‹åŠ©ã‘ã¨ãªã‚Šã¾ã™ã€‚ボタンをクリックã—ã¦ã‹ã‚‰ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆä¸Šã§ãƒ‰ãƒ©ãƒƒã‚°ã™ã‚‹ã“ã¨ã§ã€ä¸å…·åˆç®‡æ‰€ã«å°ã‚’ã¤ã‘ãŸã‚Šå€‹äººæƒ…報を隠ã™ã“ã¨ãŒã§ãã¾ã™ã€‚">
+<!ENTITY screenshot.attach.label "ä¸å…·åˆå ±å‘Šã«ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚’添付(&amp;T)">
+<!ENTITY issues.whitelist.description "報告ã—よã†ã¨ã—ã¦ã„るページ㧠Adblock Plus ãŒç„¡åйã«ãªã£ã¦ã„ã¾ã™ã€‚調査ã®å¦¨ã’ã«ãªã‚‹ã®ã§ Adblock Plus ã‚’æœ‰åŠ¹ã«æˆ»ã—ã€å†èª­ã¿è¾¼ã¿ã—ã¦ã‹ã‚‰ä¸å…·åˆå ±å‘Šã‚’作æˆã—ã¦ãã ã•ã„。">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus ãŒåºƒå‘Šã‚’ブロックã—ã¦ã„ãªã„(&amp;V)">
+<!ENTITY typeSelector.heading "ä¸å…·åˆç¨®åˆ¥ã‚’é¸æŠž">
+<!ENTITY anonymity.warning "匿åã§å ±å‘Šã®éš›ã¯å ±å‘Šè€…を個別ã«è­˜åˆ¥ã§ããªã„ã®ã§å„ªå…ˆåº¦ãŒä¸‹ãŒã‚Šã¾ã™ã€‚">
+<!ENTITY wizard.title "ä¸å…·åˆå ±å‘Š">
+<!ENTITY issues.ownfilters.disable.label "フィルタを無効化">
+<!ENTITY commentPage.description "コメントãŒã‚ã‚‹ã¨ä¸å…·åˆã‚’ç†è§£ã™ã‚‹ã®ã«åŠ©ã‹ã‚Šã¾ã™ï¼ˆç—‡çжã€å†ç¾æ‰‹é †ã€åŽŸå› ã‚’ç‰¹å®šã—ãŸæ ¹æ‹ ã€ä¸å…·åˆç™ºç”Ÿé–‹å§‹æ™‚æœŸã€æ­£å¸¸å‹•作ã¨ã®é•ã„ã€ä¸å…·åˆç™ºç”Ÿå ´æ‰€ï¼‰ã€‚報告ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã¯é€ä¿¡å‰ã«å†æ¤œè¨Žã§ãã¾ã™ã€‚">
+<!ENTITY comment.lengthWarning "コメント㌠1000 文字を超ãˆã¦ã„ã‚‹ã®ã§ã€å…ˆé ­ã‹ã‚‰ 1000 文字ã ã‘é€ä¿¡ã—ã¾ã™">
+<!ENTITY typeSelector.falseNegative.description "Adblock Plus ãŒæœ‰åйã§ã‚‚広告ãŒè¡¨ç¤ºã•れる場åˆã¯ã“ã®é¸æŠžè‚¢ã€‚">
+<!ENTITY sendPage.waitMessage "Adblock Plus ãŒä¸å…·åˆå ±å‘Šã‚’é€ä¿¡ã™ã‚‹é–“ã€ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„">
+<!ENTITY dataCollector.heading "ä¸å…·åˆå ±å‘Šã¸ã‚ˆã†ã“ã">
+<!ENTITY screenshot.heading "スクリーンショットを添付">
+<!ENTITY sendPage.heading "ä¸å…·åˆå ±å‘Šã‚’é€ä¿¡">
+<!ENTITY issues.subscriptionCount.description "購読ã—ã¦ã„るフィルタãŒå¤šéŽãŽã§ã™ã€‚ã“ã®ã‚ˆã†ãªè¨­å®šã¯å•題解決を難ã—ãã™ã‚‹ã®ã§æŽ¨å¥¨ã•れã¾ã›ã‚“。ã¾ãŸã€ã©ã®ãƒ•ィルタ作者ãŒã“ã®ä¸å…·åˆã«å¯¾å‡¦ã™ã¹ãã‹ä¸æ˜Žãªã®ã§ãƒ¬ãƒãƒ¼ãƒˆã‚’å—ç†ã§ãã¾ã›ã‚“。本当ã«å¿…è¦ãªãƒ•ィルタ以外を削除ã—ã€ä¸å…·åˆãŒå†ç¾ã™ã‚‹ã‹ç¢ºèªé¡˜ã„ã¾ã™ã€‚">
+<!ENTITY screenshot.mark.label "ä¸å…·åˆç®‡æ‰€ã«å°ã‚’ã¤ã‘ã‚‹(&amp;M)">
+<!ENTITY privacyPolicy.label "プライãƒã‚·ãƒ¼ãƒ»ãƒãƒªã‚·ãƒ¼">
+<!ENTITY issues.description "Adblock Plus ã¯ã“ã®ä¸å…·åˆã«é–¢ä¿‚ã€ã‚‚ã—ãã¯èª¿æŸ»ã‚’困難ã«ã—ã¦ã„る設定を発見ã—ã¾ã—ãŸã€‚">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/sidebar.dtd
new file mode 100644
index 0000000..2d4fd84
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "ボーダーを点滅">
+<!ENTITY address.label "アドレス">
+<!ENTITY context.open.label "æ–°è¦ã‚¿ãƒ–ã§é–‹ã">
+<!ENTITY type.label "種別">
+<!ENTITY tooltip.filterSource.label "フィルタ帰属:">
+<!ENTITY noitems.label "ブロックå¯èƒ½é …ç›®ã¯ã‚りã¾ã›ã‚“">
+<!ENTITY filter.label "フィルタ">
+<!ENTITY tooltip.size.label "サイズ:">
+<!ENTITY reattach.label "ウィンドウ内表示">
+<!ENTITY search.label "検索:(&amp;S)">
+<!ENTITY docDomain.thirdParty "(サードパーティ)">
+<!ENTITY filterSource.label "フィルタ帰属">
+<!ENTITY tooltip.docDomain.label "ドキュメント帰属:">
+<!ENTITY context.copy.label "アドレスをコピー">
+<!ENTITY tooltip.type.label "種別:">
+<!ENTITY context.disablefilter.label "フィルタ ?1? を無効化">
+<!ENTITY context.copyFilter.label "フィルタをコピー">
+<!ENTITY context.block.label "ã“ã®é …目をブロック">
+<!ENTITY context.enablefilter.label "å†åº¦ãƒ•ィルタ ?1? を有効化">
+<!ENTITY detach.label "別ウィンドウ表示">
+<!ENTITY whitelisted.label "ホワイトリストã•れãŸãƒšãƒ¼ã‚¸">
+<!ENTITY context.disablefilteronsite.label "フィルタを ?1? ã§ç„¡åŠ¹åŒ–">
+<!ENTITY detached.title "Adblock Plus: ブロックå¯èƒ½é …目一覧 (別ウィンドウ表示中)">
+<!ENTITY docDomain.firstParty "(ファーストパーティ)">
+<!ENTITY tooltip.type.whitelisted "(ホワイトリスト中)">
+<!ENTITY tooltip.filter.label "é©ç”¨ä¸­ã®ãƒ•ィルタ:">
+<!ENTITY tooltip.filter.disabled "(無効中)">
+<!ENTITY context.editfilter.label "フィルタを編集">
+<!ENTITY tooltip.type.blocked "(ブロック中)">
+<!ENTITY size.label "サイズ">
+<!ENTITY context.whitelist.label "ã“ã®é …目用ã®ãƒ›ãƒ¯ã‚¤ãƒˆãƒªã‚¹ãƒˆã‚’追加">
+<!ENTITY context.selectAll.label "ã™ã¹ã¦é¸æŠž">
+<!ENTITY state.label "状態">
+<!ENTITY docDomain.label "ドキュメント帰属">
+<!ENTITY tooltip.address.label "アドレス:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/subscriptionSelection.dtd
new file mode 100644
index 0000000..0595ef8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ja/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "&quot;?1?&quot; も追加ã™ã‚‹(&amp;S)">
+<!ENTITY list.download.failed "Adblock Plus ã¯è³¼èª­ç”¨ãƒ•ィルタ一覧ã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸã€‚">
+<!ENTITY list.download.retry "å†è©¦è¡Œ">
+<!ENTITY title.label "購読ã™ã‚‹ãƒ•ィルタã®åç§°:(&amp;T)">
+<!ENTITY list.download.website "ウェブサイトをå‚ç…§">
+<!ENTITY supplementMessage "ã“ã®ãƒ•ィルタ㯠&quot;?1?&quot; ã¨ä½µç”¨ã™ã‚‹ã“ã¨ãŒå‰æã«ãªã£ã¦ã„ã¾ã™ã€‚">
+<!ENTITY viewList.label "フィルタファイルを開ã„ã¦ç¢ºèª">
+<!ENTITY visitHomepage.label "作者ã®ãƒšãƒ¼ã‚¸ã‚’é–‹ã">
+<!ENTITY addSubscription.label "購読ã™ã‚‹ãƒ•ィルタを追加">
+<!ENTITY dialog.title "購読ã™ã‚‹ Adblock Plus 用フィルタを追加">
+<!ENTITY location.label "購読ã™ã‚‹ãƒ•ィルタã®å ´æ‰€:(&amp;L)">
+<!ENTITY fromWeb.description "購読ã™ã‚‹ãƒ•ィルタを確èªã—ã¦ãã ã•ã„。追加å‰ã«åç§°ã¨å ´æ‰€ã‚’変更ã§ãã¾ã™ã€‚">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/composer.dtd
new file mode 100644
index 0000000..f22d365
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "Ð°Ð´Ñ€ÐµÑ Ñоң&amp;ында">
+<!ENTITY domainRestriction.label "Доменмен шек&amp;теу:">
+<!ENTITY collapse.default.no.label "БаÑтапқыÑын қолдану (жоқ)">
+<!ENTITY firstParty.label "Тек Ñол Ñайт өз құрамаÑÑ‹ Ò¯&amp;шін">
+<!ENTITY preferences.label "Бар фильтрлерді &amp;көрÑету...">
+<!ENTITY pattern.label "Шаблон">
+<!ENTITY thirdParty.label "Тек б&amp;аÑқа Ñайт құрамаÑÑ‹ үшін">
+<!ENTITY filter.label "Жаңа &amp;фильтр:">
+<!ENTITY collapse.label "Блокталған құраманы &amp;жинау:">
+<!ENTITY match.warning "Сіз енгізген шаблон енді блокталатын не блокталмайтын адреÑке ÑÓ™Ð¹ÐºÐµÑ ÐºÐµÐ»Ð¼ÐµÐ¹Ð´Ñ–, Ñол үшін оның Ó™Ñері жоқ.">
+<!ENTITY anchor.start.label "а&amp;Ð´Ñ€ÐµÑ Ð±Ð°Ñында">
+<!ENTITY matchCase.label "&amp;РегиÑтрді еÑкеру">
+<!ENTITY custom.pattern.label "Ө&amp;зіңіздің:">
+<!ENTITY unselectAllTypes.label "Ерекшелеуді таÑтау">
+<!ENTITY type.whitelist.label "&amp;Ерекше ереже">
+<!ENTITY regexp.warning "Сіз енгізген шаблон, регулÑрлы өрнек ретінде өңделеді. ОÑындай шаблондардың көп Ñаны браузеріңіздің жұмыÑын тежей алады. РегулÑрлы өрнекті қолданғыңыз келмеÑе, шаблон Ñоңына жұлдызшаны қоÑыңыз.">
+<!ENTITY dialog.title "Adblock Plus фильтр ережеÑін қоÑу">
+<!ENTITY basic.label "Ðегізгі көрініÑÑ–">
+<!ENTITY type.filter.label "&amp;Блоктаушы фильтр">
+<!ENTITY types.label "Қолдану үшін құрама түрі:">
+<!ENTITY shortpattern.warning "Сіз енгізген Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ò¯ÑˆÑ–Ð½ тым қыÑқа, оÑындай шаблондардың көп Ñаны браузеріңіздің жұмыÑын тежей алады. ОÑÑ‹ фильтр үшін ұзынырақ шаблонды қолдану Ò±Ñынылады.">
+<!ENTITY collapse.yes.label "Иә">
+<!ENTITY anchors.label "Шаблонды тек келеÑіде қолдану:">
+<!ENTITY collapse.default.yes.label "БаÑтапқыÑын қолдану (иә)">
+<!ENTITY domainRestriction.help "Бір немеÑе &quot;|&quot; таңбаÑымен ажыратылған бірнеше доменді көрÑетіңіз, фильтр тек оÑÑ‹ домендер үшін орындалады. Домен атының алдыңдағы &quot;~&quot; таңбаÑÑ‹ оÑÑ‹ доменде фильтр орындалмайтынын көрÑетеді.">
+<!ENTITY accept.label "Фильтрді қоÑу">
+<!ENTITY options.label "Баптаулар">
+<!ENTITY disabled.warning "Adblock Plus қазір Ñөндірулі. Фильтрлерді қазір де қоÑа алаÑыз, бірақ олар Ð¶Ò±Ð¼Ñ‹Ñ Ñ–Ñтемейді, Ñіз [link]Adblock Plus қоÑқанға дейін[/link].">
+<!ENTITY anchor.start.flexible.label "&amp;домен атынын баÑында">
+<!ENTITY collapse.no.label "Жоқ">
+<!ENTITY selectAllTypes.label "Барлығын ерекшелеу">
+<!ENTITY advanced.label "Кеңейтілген көрініÑÑ–">
+<!ENTITY pattern.explanation "Шаблон адреÑтің кез-келген бөлігі бола алады, мұндағы жұлдызша (*) таңбалардың кез-келген Ñанын белгілейді. Фильтр тек оған ÑÓ™Ð¹ÐºÐµÑ ÐºÐµÐ»ÐµÑ‚Ñ–Ð½ адреÑтер үшін қолданылады.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/filters.dtd
new file mode 100644
index 0000000..cf794ce
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Сіздің барлық пайдаланушы фильтрлер баптаулары таңдалған файлдың құрамаÑымен алмаÑтырылады. ЖалғаÑтыруды қалайÑыз ба?">
+<!ENTITY slow.column "БаÑу фил&amp;ьтрлер">
+<!ENTITY enabled.column "ҚоÑу&amp;лы">
+<!ENTITY subscription.lastDownload.checksumMismatch "Қате, текÑеру ÑомаÑÑ‹ ÑÓ™Ð¹ÐºÐµÑ ÐµÐ¼ÐµÑ">
+<!ENTITY noFiltersInGroup.text "Таңдалған топ боÑ.">
+<!ENTITY subscription.actions.label "Әрекеттер">
+<!ENTITY filter.selectAll.label "Барлығын таңдау">
+<!ENTITY backupButton.label "Сақтау мен қал&amp;пына келтіру">
+<!ENTITY restore.minVersion.warning "ЕÑкерту: Файл жаңалау Adblock Plus нұÑқаÑымен жаÑалған. Бұл файлдан қалпына келтіру үшін Ñізге Adblock Plus-тың Ñоңғы нұÑқаÑын орнату керек.">
+<!ENTITY restore.error "Файл мәліметін өңдеу мүмкін емеÑ, мүмкін ол Adblock Plus-тің көшірме файлы ÐµÐ¼ÐµÑ ÑˆÑ‹Ò“Ð°Ñ€?">
+<!ENTITY sort.ascending.label "&amp;Ð &gt; Я Ñұрыптау">
+<!ENTITY sort.label "&amp;Сұрыптау">
+<!ENTITY subscription.source.label "Фильтлер тізімі">
+<!ENTITY hitcount.column "Х&amp;иттер">
+<!ENTITY noFilters.text "Сізде әлі пайдаланушы фильтрлері жоқ.">
+<!ENTITY backup.custom.title "Тек пайланушы фильтрлері">
+<!ENTITY subscription.external.label "БаÑқа кеңейтумен жаңартылған">
+<!ENTITY subscription.delete.label "Өшіру">
+<!ENTITY noGroupSelected.text "Ðлдымен фильтрлер тобын таңдаңыз, кейін ғана оның фильтрлері көрÑетіледі.">
+<!ENTITY filter.cut.label "Қиып алу">
+<!ENTITY restore.default.label "Көшірмені қалпына келтіру ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Жүктелуде...">
+<!ENTITY subscriptions.tab.label "Фильтрлерге жазылулар">
+<!ENTITY sort.descending.label "&amp;Я &gt; Ð Ñұрыптау">
+<!ENTITY filters.remove.warning "Таңдалған фильтрлердің барлығын өшіру керек пе?">
+<!ENTITY filter.delete.label "Жою">
+<!ENTITY addSubscriptionAdd.label "ҚоÑу">
+<!ENTITY viewMenu.label "Түрі">
+<!ENTITY subscription.lastDownload.unknown "Ешқашан">
+<!ENTITY addSubscriptionCancel.label "Ð‘Ð°Ñ Ñ‚Ð°Ñ€Ñ‚Ñƒ">
+<!ENTITY subscription.enabled.label "ІÑке қоÑулы">
+<!ENTITY noSubscriptions.text "Сіз әлі фильтрге жазылуларды қоÑқан жоқÑыз. ФильтрлерÑіз
+ Adblock Plus ешнәрÑені блоктамайды, оларды қоÑу үшін
+ &quot;Фильтрге жазылуды қоÑу&quot; қолданыңыз.">
+<!ENTITY subscription.update.label "Фильтрлерді жаңарту">
+<!ENTITY dialog.title "Adblock Plus фильтр баптаулары">
+<!ENTITY addFilter.label "Фильтрді қо&amp;Ñу">
+<!ENTITY subscription.minVersion.warning "Бұл фильтрге жазылу Adblock Plus-тің жаңа нұÑқаÑын талап етеді, оңы жаңартыңыз.">
+<!ENTITY subscription.lastDownload.invalidURL "Қате, Ð´Ò±Ñ€Ñ‹Ñ Ð°Ð´Ñ€ÐµÑ ÐµÐ¼ÐµÑ">
+<!ENTITY backup.error "Фильтрлерді файлға жазу кезінде қате орын алды. Файл жазу үшін қолжетерлік және баÑқа қолданбаның қолданыÑында болмағанына көз жеткізіңіз.">
+<!ENTITY filter.moveUp.label "Жоғары жылжыту">
+<!ENTITY addGroup.label "Фильтрлер тоб&amp;ын қоÑу">
+<!ENTITY filter.edit.label "Түзету">
+<!ENTITY subscription.showHideFilters.label "Фильтрлерді көрÑету/жаÑыру">
+<!ENTITY acceptableAds2.label "ЗиÑнке&amp;Ñ ÐµÐ¼ÐµÑ ÐºÐµÐ¹Ð±Ñ–Ñ€ жарнаманы Ñ–Ñке қоÑу">
+<!ENTITY addSubscriptionOther.label "БаÑқа жазылуды қоÑу">
+<!ENTITY close.label "Жабу">
+<!ENTITY sort.none.label "СұрыптауÑÑ‹&amp;з">
+<!ENTITY filter.actions.label "Фильтр әрекеттері">
+<!ENTITY filter.copy.label "Көшіру">
+<!ENTITY filter.moveDown.label "Төмен жылжыту">
+<!ENTITY filter.resetHitCounts.label "Хит ÑтатиÑтикаÑын таÑтау">
+<!ENTITY readMore.label "Көбірек оқу">
+<!ENTITY subscription.moveUp.label "Жоғары жылжыту">
+<!ENTITY addSubscription.label "Фильтрге жазыл&amp;уды қоÑу">
+<!ENTITY subscription.homepage.label "Үй парағы">
+<!ENTITY backup.complete.title "Фильтрлер мен жазылуларды қоÑу">
+<!ENTITY restore.own.label "Өз көшірмені қалпына келтіру">
+<!ENTITY restore.complete.warning "Сіздің барлық фильтрлер баптаулары таңдалған файлдың құрамаÑымен алмаÑтырылады. ЖалғаÑтыруды қалайÑыз ба?">
+<!ENTITY filters.tab.label "Пайдаланушы фильтрлері">
+<!ENTITY backup.label "Жаңа көшірмені жаÑау">
+<!ENTITY find.label "І&amp;здеу">
+<!ENTITY subscription.moveDown.label "Төмен жылжыту">
+<!ENTITY subscription.lastDownload.connectionError "Қате, жүктеу мүмкін емеÑ">
+<!ENTITY subscription.lastDownload.success "Сәтті аÑқталды">
+<!ENTITY subscription.lastDownload.invalidData "Қате, Ð´Ò±Ñ€Ñ‹Ñ Ñүзгілер файлы емеÑ">
+<!ENTITY filter.paste.label "КіріÑтіру">
+<!ENTITY subscription.disabledFilters.enable "Сөндірулі фильтрлерді Ñ–Ñке қоÑу">
+<!ENTITY lasthit.column "Соңғ&amp;ы хит">
+<!ENTITY subscription.editTitle.label "Ðтауын түзету">
+<!ENTITY subscription.disabledFilters.warning "Бұл жазылудағы кейбір фильтрлер Ñөндірулі.">
+<!ENTITY filter.column "Фильтр &amp;ережеÑÑ–:">
+<!ENTITY subscription.lastDownload.label "Соңғы жаңарту:">
+<!ENTITY viewList.label "Тізімді көру">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/firstRun.properties
new file mode 100644
index 0000000..fac03ce
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Бақылауды Ñөндіру арқылы шолуды жеке қылыңыз - Ñіздің әр қимылыңызды бақылайтын жарнамалық компаниÑлардан ізіңізді жаÑыру арқылы.
+firstRun_toggle_off=OFF
+firstRun_feature_tracking=Бақылауды Ñөндіру
+firstRun_feature_malware=ЗиÑÐ½ÐºÐµÑ Ð±Ð°Ò“Ð´Ð°Ñ€Ð»Ð°Ð¼Ð°Ð»Ð°Ñ€Ð´Ñ‹ блоктау
+firstRun_title=Adblock Plus орнатылды
+firstRun_toggle_on=ON
+firstRun_acceptableAdsExplanation=Біз вебÑайттарды тура, мазаңызды алмайтын жарнаманы қолдануын қалаймыз. Сондықтан біз жарамды жарнаманы анықтаудың <a>қатаң нұÑқаулығын</a> орнаттық, ол жарнамма баÑтапқы баптаулармен көрÑетілетін болады. Егер Ñіз Ñонда да барлық жарнаманы <a>блоктағыңыз</a> келÑе, оÑыны тез арада Ñөндіре алаÑыз.
+firstRun_contributor_credits=Ò®Ð»ÐµÑ Ò›Ð¾Ñқандар
+firstRun_dataCorruptionWarning=Бұл парақ көрÑетіле бере ме? <a>ОÑында шертіңіз!</a>
+firstRun_acceptableAdsHeadline=Мазаңызды алатын жарнама блокталатын болады
+firstRun_share=ДоÑтарыңызға айтыңыз
+firstRun_share_headline=Интернетті жақÑырақ қылу үшін <a>бізге көмек қолын Ñозыңыз</a>
+firstRun_feature_social_description=Интернетті шолуды әлеуметтік желілер батырмаларынан құтылу арқылы жақÑартыңыз, ол батырмалар, Facebook Like ÑиÑқты, веб парақтарда көрÑетіледі және Ñіздің жұмыÑыңызды бақылайды.
+firstRun_filterlistsReinitializedWarning=Қандай да бір мәÑеле Ñалдарынан барлық Ñүзгілер өшіріліп, біз оларды қор көшірмеден қалпына келтіре алмайтын ÑиÑқтымыз. Сондықтан, барлық Ñүзгілер өшіріледі және жарамды жарнама баптаулары Ñ–Ñке аÑырылады. Өзіңіздің Ñүзгілер тізімін және жарамды жарнама баптауларын <a>Adblock Plus баптауларында</a> текÑеріңіз.
+firstRun_feature_malware_description=Интернетті шолуды кейбір белгілі зиÑÐ½ÐºÐµÑ Ð´Ð¾Ð¼ÐµÐ½Ð´ÐµÑ€Ð´Ñ– блоктау арқылы қауіпÑіздеу қылыңыз.
+firstRun_features=Adblock Plus тек жарнаманы блоктаудан баÑқа көбірек нәрÑені Ñ–Ñтей алады
+firstRun_donate=ақшалай көмектеÑу
+firstRun_donate_label=Жобамызды қолдаңыз
+firstRun_feature_social=Әлеуметтік Ñайттар батырмаларын алып таÑтау
+firstRun_legacySafariWarning=Сіз қолданып отырған Safari нұÑқаÑÑ‹ еÑкі, және оны Adblock Plus қолдамайды. Ол Ð´Ò±Ñ€Ñ‹Ñ Ð¶Ò±Ð¼Ñ‹Ñ Ð¶Ð°Ñамауы мүмкін, немеÑе кейбір вебÑайттарда пайдаланушы жұмыÑын нашарлау қылуы мүмкін. Біз қатаң түрде Safari нұÑқаÑÑ‹ 6.1.1 не одан жаңалау (OS X 10.8 Mountain Lion жүйеÑінде), немеÑе Safari нұÑқаÑÑ‹ 7.0.1 не одан жаңалау (OS X 10.9 Mavericks жүйеÑінде) дейін жаңартуды Ò±Ñынамыз, немеÑе Mozilla Firefox, Google Chrome не Opera браузерлерінің Ñоңғы нұÑқаларын қолдануды Ò±Ñынамыз.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/global.properties
new file mode 100644
index 0000000..dae6af2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Ðғымдағы парақта блоктауға болатын құрама жоқ
+action3_tooltip=Adblock Plus қоÑу/Ñөндіру үшін шертіңіз.
+notification_antiadblock_title=МақÑатталған хабарламаларды жаÑыру керек пе?
+type_label_script=Скрипт
+filter_elemhide_nocriteria=Элементті жаÑыру үшін бірде-бір шарт анықталмады
+blockingGroup_title=Жарнаманы блоктау ережелері
+whitelisted_tooltip=Adblock Plus қоÑулы, бірақ оÑÑ‹ парақ үшін Ñөндірулі.
+type_label_stylesheet=Стильдер кеÑтеÑÑ–
+blocked_count_tooltip=?1? келеÑіден ?2?
+type_label_font=қаріп
+type_label_popup=атып шығатын терезе
+filter_regexp_tooltip=Бұл Ñүзгі не регулÑрлы өрнек, не Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ò¯ÑˆÑ–Ð½ тым қыÑқа. ОÑындай Ñүзгілер көп болÑа, браузеріңіздің жұмыÑын тежеу мүмкін.
+action0_tooltip=КонтекÑті мәзірін ашу үшін шертіңіз, тышқанның орта батырмаÑÑ‹ - қоÑу/Ñөндіру үшін.
+whitelisted_page=Adblock Plus ағымдағы парақ үшін Ñөндірулі тұр
+remove_group_warning=Бұл топты өшіруді шынымен қалайÑыз ба?
+action1_tooltip=Блокталған құраманы ашу/жабу үшін шертіңіз, тышқанның орта батырмаÑÑ‹ - қоÑу/Ñөндіру үшін.
+type_label_xmlhttprequest=XML-Ñұранымы
+active_tooltip=Adblock Plus қоÑулы тұр, ?1? Ñүзгілерге жазылу мен ?2? пайдаланушы Ñүзгілері қолданылуда.
+type_label_document=Құжат
+type_label_object_subrequest=объект Ñұранымы
+whitelistGroup_title=Ережеден тыÑ
+disabled_tooltip=Adblock Plus Ñөндірулі тұр.
+filter_elemhide_duplicate_id=ЖаÑыралатын Ñлементтің идентификаторы тек біреу болу керек.
+type_label_object=Объект
+action2_tooltip=Баптауларды ашу үшін шертіңіз, тышқанның орта батырмаÑÑ‹ - қоÑу/Ñөндіру үшін.
+type_label_subdocument=Фрейм
+clearStats_warning=Бұл әрекет барлық фильтрлерді хит ÑтатиÑтикаÑын таÑтап, фильтр хиттерін Ñанауды Ñөндіреді. ЖалғаÑтыруды қалайÑыз ба?
+notification_antiadblock_message=Бұл Ñайт Adblock Plus пайдаланушыларына мақÑатталған хабарламаларды көрÑететіні белгілі. Adblock Plus мақÑатталған хабарламаларды жаÑыруы керек пе?
+blocked_count_addendum=(Ñүзгіден тыÑ: ?1?, жаÑырын: ?2?)
+subscription_invalid_location=Енгізілген Ð°Ð´Ñ€ÐµÑ Ð½Ðµ интернет адреÑÑ–, не файл мекен-жайы ретінде анықталмады.
+type_label_image=Сурет
+remove_subscription_warning=ОÑÑ‹ жазылуды өшіруды шынымен қалайÑыз ба?
+type_label_other=БаÑқа
+mobile_menu_enable=ABP: ІÑке қоÑу
+type_label_media=Ðудио/видео
+mobile_menu_disable_site=ABP: КелеÑÑ– үшін Ñөндіру: ?1?
+elemhideGroup_title=Элементтерді жаÑыру ережелері
+mobile_menu_enable_site=ABP: КелеÑÑ– үшін Ñ–Ñке қоÑу: ?1?
+type_label_elemhide=ЖаÑырын
+newGroup_title=Жаңа фильтрлер тобы
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/overlay.dtd
new file mode 100644
index 0000000..85523ea
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Иә">
+<!ENTITY notification.button.no "&amp;Жоқ">
+<!ENTITY sync.label "Adblock Plus баптауларын Sync Ñ–&amp;шіне қоÑу">
+<!ENTITY whitelist.site.label "КелеÑÑ– үшін Ñөндіру: ?1?">
+<!ENTITY filters.label "Фильт&amp;р баптаулары">
+<!ENTITY disable.label "Әр жерде Ñөндіру">
+<!ENTITY objecttab.title "Блоктау">
+<!ENTITY objecttab.tooltip "Adblock Plus көмегімен оÑÑ‹ объектті блоктау үшін шертіңіз">
+<!ENTITY menuitem.label "Adblock Plus ба&amp;птаулары">
+<!ENTITY objecttabs.label "Flash пен Java-ға Ñілтеме қал&amp;дыру">
+<!ENTITY sendReport.label "Бұл парақтағы мәÑеле туралы &amp;хабарлау">
+<!ENTITY whitelist.page.label "Тек оÑÑ‹ парақ үшін Ñөндіру">
+<!ENTITY context.image.label "Adblock Plus: Суретті блоктау">
+<!ENTITY counthits.label "Ф&amp;ильтрлер хиттерін Ñанау">
+<!ENTITY opensidebar.label "Блокталған құраманы аш&amp;у">
+<!ENTITY notification.button.close "Ж&amp;абу">
+<!ENTITY contribute.label "Adblock Plus-қа Ò¯Ð»ÐµÑ Ò›Ð¾Ñу">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Фреймді блоктау">
+<!ENTITY blocked.tooltip "Бұл парақтағы блокталған құрама:">
+<!ENTITY hideplaceholders.label "Блокталған &amp;Ñлементтер шектерін жаÑыру">
+<!ENTITY showinstatusbar.label "Қалып-&amp;күй жолағында көрÑету">
+<!ENTITY sidebar.title "Ðғымдағы парақ құрамаÑÑ‹">
+<!ENTITY options.label "&amp;Баптаулар">
+<!ENTITY context.object.label "Adblock Plus: Объектті блоктау">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: ОÑÑ‹ парақта қайта қоÑу">
+<!ENTITY filters.tooltip "Көп қолданылатын фильтрлер:">
+<!ENTITY closesidebar.label "Блокталған құраманы жаб&amp;у">
+<!ENTITY showintoolbar.label "&amp;Панельде көрÑету">
+<!ENTITY status.tooltip "Күйі:">
+<!ENTITY context.media.label "Adblock Plus: Ðудио/Видеоны блоктау">
+<!ENTITY subscription.update.label "Фильтрлерді жаңарту">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/sendReport.dtd
new file mode 100644
index 0000000..1e14564
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/sendReport.dtd
@@ -0,0 +1,66 @@
+<!ENTITY screenshot.undo.label "Б&amp;олдырмау">
+<!ENTITY issues.disabledgroups.description "КелеÑÑ– фильтрлер/тізімдер Ñөндірілген, бірақ олар ағымдағы параққа өз Ó™Ñерлерін тигізуі мүмкін:">
+<!ENTITY showData.label "Хабарлама мәліметін көрÑету">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus &amp;тым көп блоктайды">
+<!ENTITY issues.change.description "Баптауларыңыз өзгертілді. Парақты қайта жүктеп, өзгеріÑтерді Ñынап көріңіз, егер олар қайталанатын болÑа, хабарламаны жіберіңіз.">
+<!ENTITY email.label "&amp;Эл. пошта:">
+<!ENTITY issues.openPreferences.label "Фильтр баптауларын ашу">
+<!ENTITY sendPage.confirmation "Хабарламаңыз Ñақталды. Оны келеÑÑ– адреÑтен көре алаÑыз:">
+<!ENTITY copyLink.label "Хабарлама ÑілтемеÑін &amp;көшіру">
+<!ENTITY issues.nofilters.description "Adblock Plus бұл парақта ешнәрÑені блоктап тұрған жоқ. Бұл мәÑеле Adblock Plus-ке байланыÑты ÐµÐ¼ÐµÑ ÑиÑқты.">
+<!ENTITY sendPage.knownIssue "Сіз хабарлаған мәÑеле белгілі ÑиÑқты. Көбірек біліңіз:">
+<!ENTITY typeSelector.other.description "Егер мәÑеле Adblock Plus өзімен, оның фильтлерімен ÐµÐ¼ÐµÑ Ð±Ð¾Ð»Ñ‹Ð¿ тұр деп ойлаÑаңыз, бұл опциÑны таңдаңыз.">
+<!ENTITY issues.disabledgroups.enable.label "Фильтрге жазылу/фильтрлер тобын Ñ–Ñке қоÑу">
+<!ENTITY typeWarning.override.label "Мен түÑініп тұрмын, және хабарламаны жібергім &amp;келеді">
+<!ENTITY issues.disabled.enable.label "Adblock Plus Ñ–Ñке қоÑу">
+<!ENTITY update.fixed.description "Cіз хабарлаған мәÑеле фильтрлерге жаңартылумен шешілген ÑиÑқты. Парақты қайта жүктеп, қайталап көріңіз, мәÑеле жоғалмаÑа, Хабарлау батырмаÑын баÑыңыз.">
+<!ENTITY anonymous.label "&amp;Ðнонимды жіберу">
+<!ENTITY reloadButton.label "Па&amp;рақты қайта жүктеу">
+<!ENTITY recentReports.clear.label "Барлық хабарламаларды ө&amp;шіру">
+<!ENTITY typeSelector.description "Бұл терезе Ñізге Adblock Plus мәÑелеÑÑ– туралы хабарламаны дайындауға көмектеÑеді. Біріншіден, бұл парақта кездеÑкен мәÑеле түрін таңдаңыз:">
+<!ENTITY screenshot.remove.label "Жеке ақ&amp;паратты өшіру">
+<!ENTITY issues.ownfilters.description "Бұл параққа Ñ–Ñке аÑырылған кейбір фильтрлерді Ñіз қолмен көрÑеткенÑіз. МәÑелені туғызуы мүмкін фильтрлерді Ñөндіріңіз:">
+<!ENTITY update.inProgress.description "Adblock Plus мәÑеле шешілген бе, Ñоны текÑеру үшін фильтрлерге жазылуларыңызды жаңартуы тиіÑ. Күте тұрыңыз...">
+<!ENTITY sendPage.retry.label "Қайта жіберу">
+<!ENTITY data.label "Хабарла&amp;ма мәліметі:">
+<!ENTITY recentReports.label "Сіздің Ñоңғы жіберген хабарламаларыңыз">
+<!ENTITY typeWarning.description "Сіз хабарламаны Adblock Plus-пен болған мәÑеле, фильтрлермен ÐµÐ¼ÐµÑ Ð´ÐµÐ¿ белгіледіңіз. Ондай мәÑелелер жөнінде [link]Adblock Plus форумына[/link] хабарлау жөн. ОÑÑ‹ хабарлаушыны тек форумдағы темаға толықтыру ретінде қолданыңыз, Ñғни, хабарламаңыздың ÑілтемеÑін бермеÑеңіз, оны ешкім де байқамайды. ÐвтожаÑалған Ñілтеме хабарламаны жіберуден кейін қолжетерлік болады.">
+<!ENTITY issues.disabled.description "Adblock Plus қазір Ñөндірулі тұр, Ñондықтан ол ешнәрÑені блоктамайды.">
+<!ENTITY attachExtensions.label "Бел&amp;Ñенді кеңейтулер тізімін жіберу, мүмкін, өзара мәÑелелер пайда болған шығар">
+<!ENTITY issues.nosubscriptions.add.label "Фильтрлерге жазылуды қоÑу">
+<!ENTITY issues.disabledfilters.enable.label "Фильтрді Ñ–Ñке қоÑу">
+<!ENTITY issues.override.label "Баптаулар дұр&amp;Ñ‹Ñ, хабарламаны жалғаÑтыру">
+<!ENTITY issues.nosubscriptions.description "Веб Ñайттардан керек ÐµÐ¼ÐµÑ Ò›Ò±Ñ€Ð°Ð¼Ð°Ð½Ñ‹ өшіретін алдын-ала әзірленген фильтрлердің біреуіне де жазылмаған ÑиÑқтыÑыз.">
+<!ENTITY typeSelector.falsePositive.description "Парақта маңызды құрама жоқ болÑа, қате көрÑетілÑе не Ð´Ò±Ñ€Ñ‹Ñ Ñ–ÑтемеÑе, бұл опциÑны таңдаңыз. Ол мәÑеле Adblock Plus Ñалдарынан пайда болатынын текÑеру үшін, оны уақытша Ñөндіріңіз.">
+<!ENTITY typeSelector.other.label "Ба&amp;Ñқа мәÑеле">
+<!ENTITY emailComment.label "Біз Ñізден шын Ñл. пошта адреÑін енгізуді Ñұраймыз, өйткені еÑептемеңіз жөнінде Ñұрақтар бар болÑа, біз Ñізге
+ хабарлаÑа алатын боламыз. Сонымен бірге қоÑқан үлеÑіңізді танып, оның маңыздылығын көтере алуға жол ашады.">
+<!ENTITY issues.whitelist.remove.label "Adblock Plus оÑÑ‹ парақта қайта қоÑу">
+<!ENTITY outdatedSubscriptions.description "КелеÑÑ– фильтрге жазылу кем дегенде екі апта бойы жаңартылмады. Хабарламаны жіберу алдында фильтрге жазылуды жаңартыңыз, мәÑеле шешілген болуы мүмкін.">
+<!ENTITY dataCollector.description "Adblock Plus керек ақпаратты жинағанша, күте тұрыңыз.">
+<!ENTITY sendButton.label "Хабарлама&amp;ны жіберу">
+<!ENTITY comment.label "ТүÑіндірме (Ñ‚&amp;иіÑті емеÑ):">
+<!ENTITY sendPage.errorMessage "Хабарламаны жіберу талабы &quot;?1?&quot; қате кодымен аÑқталды. Интернетпен байланыÑыңызды текÑеріп, қайталаңыз. Егер ол көмектеÑпеÑе, [link]Adblock Plus форумынан[/link] көмек Ñұраңыз.">
+<!ENTITY showRecentReports.label "Соңғы жіберілген хабарламаларды қарау">
+<!ENTITY commentPage.heading "ТүÑіндірмені енгізу">
+<!ENTITY update.start.label "Жаңартуды қазір баÑтау">
+<!ENTITY issues.disabledfilters.description "КелеÑÑ– фильтрлер Ñөндірілген, бірақ олар ағымдағы параққа өз Ó™Ñерлерін тигізуі мүмкін:">
+<!ENTITY screenshot.description "Бірдей парақ әр түрлі адамдар үшін әр түрлі көрінуі мүмкін. Скриншотты қоÑып жіберÑеңіз, ол бізге көмектеÑуі мүмкін. Жеке ақпаратыңыз бар бөлігін өшіріп, мәÑеле пайда болған аймақтарды белгілей алаÑыз. Ол үшін төмендегі батырманы баÑып, тышқанмен керек аймақты таңдаңыз.">
+<!ENTITY screenshot.attach.label "Парақ Ñкриншо&amp;тын хабарламаға қоÑып жіберу">
+<!ENTITY issues.whitelist.description "Хабарлап тұрған парағыңыз үшін Adblock Plus қазір Ñөндірілген. МәÑелені анықтауға көмектеÑу үшін, хабарламаны жіберу алдында оны Ñ–Ñке қоÑып, парақты қайта жүктеңіз.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus жарна&amp;маны блоктамайды">
+<!ENTITY typeSelector.heading "МәÑеле түрін таңдаңыз">
+<!ENTITY anonymity.warning "Біз Ñізге кері хабарлаÑа алмаймыз, және еÑептемеңізді маңыздылығы төмендеу деп Ñанауымыз мүмкін.">
+<!ENTITY wizard.title "Хабарлаушы">
+<!ENTITY issues.ownfilters.disable.label "Фильтрді Ñөндіру">
+<!ENTITY commentPage.description "Төмендегі мәтін өріÑіне мәÑелені түÑіндіретін түÑіндірмені жаза алаÑыз. Бұл қадам тиіÑті емеÑ, бірақ мәÑеле күрделі болÑа, көмегі тиеді. Жіберу алдында мәліметті текÑере алаÑыз.">
+<!ENTITY comment.lengthWarning "ТүÑіндірмеңіздің ұзындығы 1000 таңбадан аÑты. Тек алғашқы 1000 таңба жіберіледі.">
+<!ENTITY typeSelector.falseNegative.description "Егер Adblock Plus қоÑулы тұрÑа, ал жарнама Ñонда да көрÑетілÑе, бұл опциÑны таңдаңыз.">
+<!ENTITY sendPage.waitMessage "Adblock Plus хабарламаңызды жібергенше күте тұрыңыз.">
+<!ENTITY dataCollector.heading "МәÑелелер туралы хабарлауға қош келдіңіз">
+<!ENTITY screenshot.heading "Скриншотты қоÑып жіберу">
+<!ENTITY sendPage.heading "Хабарламаны жіберу">
+<!ENTITY issues.subscriptionCount.description "Сізде фильтрлерге жазылулар Ñаны тым көп ÑиÑқты. Ондай жағдай қолдануға Ò±Ñынылмайды. Сонымен қатар біз Ñіздің хабарлауыңызды қабылдай алмаймыз, өйткені мәÑеле қай жазылудың Ñалдарынан пайда болғаны түÑінікÑіз. Тек маңызды жазылуларды қалдырып, баÑқаларды өшіріңіз, және мәÑеле қайталана ма, Ñоны көріңіз.">
+<!ENTITY screenshot.mark.label "Хабарламаны бел&amp;гілеу">
+<!ENTITY privacyPolicy.label "Жекелік ÑаÑÑаиы">
+<!ENTITY issues.description "Adblock Plus бұл мәÑеле үшін жауапты бола алатын, немеÑе тергеуді қиындататын Ñіздің баптауларыңызды анықтады.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/sidebar.dtd
new file mode 100644
index 0000000..7374b17
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Flash құрамаÑының шектері">
+<!ENTITY address.label "ÐдреÑÑ–">
+<!ENTITY context.open.label "Жаңа бетте ашу">
+<!ENTITY type.label "Түрі">
+<!ENTITY tooltip.filterSource.label "Фильтр көзі:">
+<!ENTITY noitems.label "Блокталатын құрама жоқ">
+<!ENTITY filter.label "Фильтр">
+<!ENTITY tooltip.size.label "Көлемі:">
+<!ENTITY reattach.label "ҚоÑып қою">
+<!ENTITY search.label "І&amp;здеу:">
+<!ENTITY docDomain.thirdParty "(үшінші жақты)">
+<!ENTITY filterSource.label "Фильтр көзі">
+<!ENTITY tooltip.docDomain.label "Құжат көзі:">
+<!ENTITY context.copy.label "Элемент адреÑін көшіру">
+<!ENTITY tooltip.type.label "Түрі:">
+<!ENTITY context.disablefilter.label "Фильтрді Ñөндіру ?1?">
+<!ENTITY context.copyFilter.label "Фильтрді көшіру">
+<!ENTITY context.block.label "Бұл Ñлементті блоктау">
+<!ENTITY context.enablefilter.label "Фильтрді қайта қоÑу ?1?">
+<!ENTITY detach.label "Бөліп жіберу">
+<!ENTITY whitelisted.label "Ережеден Ñ‚Ñ‹Ñ Ð¿Ð°Ñ€Ð°Ò›">
+<!ENTITY context.disablefilteronsite.label "КелеÑÑ– үшін фильтрді өшіру ?1?">
+<!ENTITY detached.title "Adblock Plus: ағымдағы парақ құрамаÑÑ‹ (бөлінген)">
+<!ENTITY docDomain.firstParty "(бірінші жақты)">
+<!ENTITY tooltip.type.whitelisted "(ережеден тыÑ)">
+<!ENTITY tooltip.filter.label "Қолданудағы фильтр:">
+<!ENTITY tooltip.filter.disabled "(Ñөндірулі)">
+<!ENTITY context.editfilter.label "Қолданудағы фильтрді түзету">
+<!ENTITY tooltip.type.blocked "(блокталған)">
+<!ENTITY size.label "Көлемі">
+<!ENTITY context.whitelist.label "Элемент үшін ерекше ереже жаÑау">
+<!ENTITY context.selectAll.label "Барлығын ерекшелеу">
+<!ENTITY state.label "Күйі">
+<!ENTITY docDomain.label "Құжат көзі">
+<!ENTITY tooltip.address.label "ÐдреÑÑ–:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/subscriptionSelection.dtd
new file mode 100644
index 0000000..131c081
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/kk/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "&quot;?1?&quot; Ñүзгі жазыл&amp;уын да қоÑу">
+<!ENTITY list.download.failed "Adblock Plus жазылулар тізімін жүктеп ала алмаған.">
+<!ENTITY list.download.retry "Қайтадан көру">
+<!ENTITY title.label "Жа&amp;зылудың аты:">
+<!ENTITY list.download.website "Веб Ñайтты шолу">
+<!ENTITY supplementMessage "Бұл фильтрге жазылу Ñізде әлі қоÑылмаған &quot;?1?&quot; Ñүзгімен бірге қолданылуы тиіÑ.">
+<!ENTITY viewList.label "Сүзгілерді қарап шығу">
+<!ENTITY visitHomepage.label "Үй парағын шолу">
+<!ENTITY addSubscription.label "Жазылуды қоÑу">
+<!ENTITY dialog.title "Adblock Plus фильтрлерге жазылуды қоÑу">
+<!ENTITY location.label "Фильтр тізім а&amp;дреÑÑ–:">
+<!ENTITY fromWeb.description "Сүзгі жазылуын қоÑуды раÑтаңыз. ҚоÑу алдында оның атауын не орналаÑуын өзгерте алаÑыз.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/composer.dtd
new file mode 100644
index 0000000..4cf4c74
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "주소 ë ë¶€ë¶„ì— ì¼ì¹˜ (&amp;n)">
+<!ENTITY domainRestriction.label "ì§€ì •ëœ ë„ë©”ì¸ì—ë§Œ ì ìš©(&amp;D) :">
+<!ENTITY collapse.default.no.label "기본값 (아니요)">
+<!ENTITY firstParty.label "ë‚´ë¶€ 요청ì—ë§Œ ì ìš© (&amp;r)">
+<!ENTITY preferences.label "í•„í„° ëª©ë¡ (&amp;S)">
+<!ENTITY pattern.label "유형 찾기">
+<!ENTITY thirdParty.label "외부 요청ì—ë§Œ ì ìš© (&amp;T)">
+<!ENTITY filter.label "새 필터 (&amp;f)">
+<!ENTITY collapse.label "ì°¨ë‹¨ëœ ìš”ì†Œì˜ ì˜ì—­ 숨기기 (&amp;l)">
+<!ENTITY match.warning "입력한 유형과 ì¼ì¹˜í•˜ëŠ” 주소가 없으며, 차단/허용할 ì£¼ì†Œì— ì˜í–¥ì„ 미치지 않ìŒ.">
+<!ENTITY anchor.start.label "주소 시작 ë¶€ë¶„ì— ì¼ì¹˜ (&amp;g)">
+<!ENTITY matchCase.label "대/ì†Œë¬¸ìž êµ¬ë¶„ (&amp;M)">
+<!ENTITY custom.pattern.label "ì‚¬ìš©ìž ì§€ì • (&amp;C)">
+<!ENTITY unselectAllTypes.label "ì„ íƒ í•´ì œ">
+<!ENTITY type.whitelist.label "예외 규칙 (&amp;x)">
+<!ENTITY regexp.warning "[ëŠë¦° í•„í„°] 유형 ëì— ìž„ì˜ ë¬¸ìž(*)ê°€ 없으면 ì •ê·œ 표현ì‹ìœ¼ë¡œ í•´ì„ë˜ë©°, 웹 페ì´ì§€ë¥¼ 불러오는 ì†ë„ê°€ ëŠë ¤ì§.">
+<!ENTITY dialog.title "필터 추가">
+<!ENTITY basic.label "기본 보기">
+<!ENTITY type.filter.label "차단 필터 (&amp;B)">
+<!ENTITY types.label "ì ìš© 형ì‹">
+<!ENTITY shortpattern.warning "[ëŠë¦° í•„í„°] ìœ í˜•ì˜ ê¸¸ì´ê°€ 너무 짧으면 í•„í„°ê°€ 비효율ì ìœ¼ë¡œ 처리ë˜ë©°, 웹 페ì´ì§€ë¥¼ 불러오는 ì†ë„ê°€ ëŠë ¤ì§.">
+<!ENTITY collapse.yes.label "예">
+<!ENTITY anchors.label "유형 ì¼ì¹˜ ì¡°ê±´ :">
+<!ENTITY collapse.default.yes.label "기본값 (예)">
+<!ENTITY domainRestriction.help "1. 파ì´í”„ 기호(|)를 ì´ìš©í•´ 여러 ë„ë©”ì¸ì— ì ìš© (예시 : site1.com|site2.net). 2. 물결 기호(~)를 ì´ìš©í•´ 필터를 ì ìš©í•˜ì§€ ì•Šì„ ë„ë©”ì¸ ì§€ì • (예시 : ~site.com)">
+<!ENTITY accept.label "추가">
+<!ENTITY options.label "옵션">
+<!ENTITY disabled.warning "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ëŠ” 현재 ë¹„í™œì„±í™”ëœ ìƒíƒœìž…니다. 필터는 여전히 추가할 수 있지만 [link]애드블ë¡í”ŒëŸ¬ìŠ¤ë¥¼ 활성화[/link]하지 않으면 추가한 필터는 ì ìš©ë˜ì§€ 않습니다.">
+<!ENTITY anchor.start.flexible.label "ë„ë©”ì¸ ì‹œìž‘ ë¶€ë¶„ì— ì¼ì¹˜ (&amp;g)">
+<!ENTITY collapse.no.label "아니요">
+<!ENTITY selectAllTypes.label "ëª¨ë‘ ì„ íƒ">
+<!ENTITY advanced.label "고급 보기">
+<!ENTITY pattern.explanation "ìœ í˜•ì€ ì¼ì¹˜í•˜ëŠ” 주소를 검색하는 í…스트 문ìžì—´ì´ë©°, ìž„ì˜ ë¬¸ìž(*)로 ì ìš© 범위를 조절할 수 있습니다.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/filters.dtd
new file mode 100644
index 0000000..b099db4
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "ì„ íƒëœ ë³µì› íŒŒì¼ì— ì˜í•´ 모든 ì‚¬ìš©ìž í•„í„°ê°€ êµì²´ë©ë‹ˆë‹¤. 진행하시겠습니까?">
+<!ENTITY slow.column "ëŠë¦° í•„í„°(!) (&amp;w)">
+<!ENTITY enabled.column "사용 (&amp;n)">
+<!ENTITY subscription.lastDownload.checksumMismatch "실패함 : 검사합 불ì¼ì¹˜">
+<!ENTITY noFiltersInGroup.text "í•„í„° ì—†ìŒ">
+<!ENTITY subscription.actions.label "ë™ìž‘">
+<!ENTITY filter.selectAll.label "ëª¨ë‘ ì„ íƒ">
+<!ENTITY backupButton.label "백업/ë³µì› (&amp;B)">
+<!ENTITY restore.minVersion.warning "경고 : ì´ íŒŒì¼ì€ 보다 ë†’ì€ ë²„ì „ì˜ ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì— ì˜í•´ ìƒì„±ë˜ì—ˆìŠµë‹ˆë‹¤. ì´ íŒŒì¼ë¡œ ë³µì›í•˜ê¸° ì „ì— ìµœì‹  ë²„ì „ì˜ ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ë¡œ ì—…ë°ì´íŠ¸í•˜ì‹­ì‹œì˜¤.">
+<!ENTITY restore.error "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì˜ ë°±ì—… 파ì¼ì´ 아니므로 ë³µì›ì„ í•  수 없습니다.">
+<!ENTITY sort.ascending.label "오름차순 (&amp;A ⇒ Z)">
+<!ENTITY sort.label "ì •ë ¬ (&amp;S)">
+<!ENTITY subscription.source.label "í•„í„° 목ë¡">
+<!ENTITY hitcount.column "ì ìš© 횟수 (&amp;H)">
+<!ENTITY noFilters.text "ì‚¬ìš©ìž í•„í„°ê°€ 없습니다.">
+<!ENTITY backup.custom.title "ì‚¬ìš©ìž í•„í„°ë§Œ 백업">
+<!ENTITY subscription.external.label "다른 확장 í”„ë¡œê·¸ëž¨ì— ì˜í•´ ì—…ë°ì´íЏë¨">
+<!ENTITY subscription.delete.label "삭제">
+<!ENTITY noGroupSelected.text "í•„í„° 목ë¡ì„ 보려면 í•„í„° ê·¸ë£¹ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤.">
+<!ENTITY filter.cut.label "잘ë¼ë‚´ê¸°">
+<!ENTITY restore.default.label "ë³µì› ë‚ ì§œ - ?1?">
+<!ENTITY subscription.lastDownload.inProgress "다운로드 중...">
+<!ENTITY subscriptions.tab.label "êµ¬ë… í•„í„°">
+<!ENTITY sort.descending.label "내림차순 (&amp;Z ⇒ A)">
+<!ENTITY filters.remove.warning "ì„ íƒí•œ 모든 필터를 제거하시겠습니까?">
+<!ENTITY filter.delete.label "삭제">
+<!ENTITY addSubscriptionAdd.label "추가">
+<!ENTITY viewMenu.label "보기">
+<!ENTITY subscription.lastDownload.unknown "알 수 ì—†ìŒ">
+<!ENTITY addSubscriptionCancel.label "취소">
+<!ENTITY subscription.enabled.label "사용">
+<!ENTITY noSubscriptions.text "êµ¬ë… í•„í„°ë¥¼ ì•„ì§ ì¶”ê°€í•˜ì§€ 않았습니다. ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ëŠ” í•„í„° ì—†ì´ëŠ” ì•„ë¬´ê²ƒë„ ì°¨ë‹¨í•  수 없으므로 &quot;êµ¬ë… í•„í„° 추가&quot; ë²„íŠ¼ì„ ëˆŒëŸ¬ êµ¬ë… í•„í„°ë¥¼ 추가하십시오.">
+<!ENTITY subscription.update.label "ì—…ë°ì´íЏ">
+<!ENTITY dialog.title "필터 설정">
+<!ENTITY addFilter.label "필터 추가 (&amp;d)">
+<!ENTITY subscription.minVersion.warning "ì´ êµ¬ë… í•„í„°ëŠ” 보다 ë†’ì€ ë²„ì „ì˜ ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ê°€ 필요합니다. 최신 ë²„ì „ì˜ ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ë¥¼ 설치하십시오.">
+<!ENTITY subscription.lastDownload.invalidURL "실패함 : 올바르지 ì•Šì€ ì£¼ì†Œ">
+<!ENTITY backup.error "백업 파ì¼ì— í•„í„° 작성 오류가 있습니다. ì´ íŒŒì¼ì€ 쓰기 ë°©ì§€ ìƒíƒœì´ê±°ë‚˜ 다른 ì‘ìš© 프로그램ì—서 사용 중ì¸ì§€ 확ì¸í•˜ì‹­ì‹œì˜¤.">
+<!ENTITY filter.moveUp.label "위로 ì´ë™">
+<!ENTITY addGroup.label "필터 그룹 추가 (&amp;g)">
+<!ENTITY filter.edit.label "편집">
+<!ENTITY subscription.showHideFilters.label "í•„í„° ëª©ë¡ ë³´ê¸°/숨기기">
+<!ENTITY acceptableAds2.label "비침입형 광고 허용 (&amp;i)">
+<!ENTITY addSubscriptionOther.label "다른 êµ¬ë… í•„í„° 추가 (F)">
+<!ENTITY close.label "닫기">
+<!ENTITY sort.none.label "정렬 안 함 (&amp;U)">
+<!ENTITY filter.actions.label "í•„í„° ë™ìž‘">
+<!ENTITY filter.copy.label "복사">
+<!ENTITY filter.moveDown.label "아래로 ì´ë™">
+<!ENTITY filter.resetHitCounts.label "í•„í„° ì ìš© 횟수 초기화">
+<!ENTITY readMore.label "ìžì„¸ížˆ 보기">
+<!ENTITY subscription.moveUp.label "위로 ì´ë™">
+<!ENTITY addSubscription.label "êµ¬ë… í•„í„° 추가 (&amp;f)">
+<!ENTITY subscription.homepage.label "홈페ì´ì§€">
+<!ENTITY backup.complete.title "사용ìž/êµ¬ë… í•„í„° 백업">
+<!ENTITY restore.own.label "백업 파ì¼ë¡œ ë³µì›">
+<!ENTITY restore.complete.warning "ì„ íƒëœ ë³µì› íŒŒì¼ì— ì˜í•´ 모든 í•„í„° ì„¤ì •ì´ êµì²´ë©ë‹ˆë‹¤. 진행하시겠습니까?">
+<!ENTITY filters.tab.label "ì‚¬ìš©ìž í•„í„°">
+<!ENTITY backup.label "백업 íŒŒì¼ ì €ìž¥">
+<!ENTITY find.label "찾기 (&amp;n)">
+<!ENTITY subscription.moveDown.label "아래로 ì´ë™">
+<!ENTITY subscription.lastDownload.connectionError "실패함 : 다운로드 실패">
+<!ENTITY subscription.lastDownload.success "ë™ê¸°í™” 성공">
+<!ENTITY subscription.lastDownload.invalidData "실패함 : 올바르지 ì•Šì€ í•„í„°">
+<!ENTITY filter.paste.label "붙여넣기">
+<!ENTITY subscription.disabledFilters.enable "필터 다시 사용">
+<!ENTITY lasthit.column "마지막 ì ìš© ë‚ ì§œ (&amp;L)">
+<!ENTITY subscription.editTitle.label "필터 그룹명 편집">
+<!ENTITY subscription.disabledFilters.warning "ì´ êµ¬ë… í•„í„°ì˜ ì¼ë¶€ 필터는 사용 중지ë˜ì—ˆìŠµë‹ˆë‹¤.">
+<!ENTITY filter.column "í•„í„° (&amp;F)">
+<!ENTITY subscription.lastDownload.label "마지막 다운로드 :">
+<!ENTITY viewList.label "í•„í„° ëª©ë¡ ë³´ê¸°">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/firstRun.properties
new file mode 100644
index 0000000..10a0ba9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=ê´‘ê³  회사가 수집하는 ì‚¬ìš©ìž ì¶”ì  ì •ë³´ë¥¼ 유출ë˜ì§€ 않게 하여 ê°œì¸ ì •ë³´ë¥¼ 보호합니다.
+firstRun_toggle_off=ë„기
+firstRun_feature_tracking=ì¶”ì  ì°¨ë‹¨
+firstRun_feature_malware=맬웨어 차단
+firstRun_title=ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ê°€ 설치ë˜ì—ˆìŠµë‹ˆë‹¤.
+firstRun_toggle_on=켜기
+firstRun_acceptableAdsExplanation=우리는 비침입ì ì´ë©° ì´ìš©ìž 친화ì ì¸ ê´‘ê³  ë°©ì‹ì„ 채íƒí•œ 웹사ì´íŠ¸ë¥¼ ê²©ë ¤í•˜ê³ ìž í•©ë‹ˆë‹¤. 특정 광고를 허용하기 위한 <a>ê´‘ê³  허용 지침</a>ì„ ìˆ˜ë¦½í•˜ì˜€ìœ¼ë©°, 기본 설정으로 그러한 광고는 í™”ë©´ì— í‘œì‹œë©ë‹ˆë‹¤. 모든 광고를 차단하려면 ì´ ê¸°ëŠ¥ì˜ <a>ì‚¬ìš©ì„ ì¤‘ì§€</a>í•  수 있습니다.
+firstRun_contributor_credits=ê³µí—Œìž ëª…ë‹¨
+firstRun_dataCorruptionWarning=ì´ íŽ˜ì´ì§€ë¥¼ 계ì†í•´ì„œ 보시겠습니까? <a>여기 í´ë¦­!</a>
+firstRun_acceptableAdsHeadline=ì¸í„°ë„· ì´ìš©ì„ 방해하거나 불법·유해한 광고는 ì´ì œ ì°¨ë‹¨ë  ê²ƒìž…ë‹ˆë‹¤
+firstRun_share=í™ë³´
+firstRun_share_headline=ë” ë‚˜ì€ ì›¹ì„ ë§Œë“¤ê¸° 위해 <a>공헌하기</a>
+firstRun_feature_social_description=웹페ì´ì§€ìƒì— ì¸í„°ë„· 사용 행태를 ì¶”ì í•˜ëŠ” ì‚¬íšŒê´€ê³„ë§ ì„œë¹„ìŠ¤ ë²„íŠ¼ì„ ìžë™ìœ¼ë¡œ 제거해ì¤ë‹ˆë‹¤.
+firstRun_filterlistsReinitializedWarning=문제가 ë°œìƒí•˜ì—¬ 모든 í•„í„°ê°€ 제거ë˜ê³ , ë°±ì—…ì„ ë³µì›í•  수 없습니다. 그러므로 ì‚¬ìš©ìž í•„í„°ì™€ 허용 ê´‘ê³  ì„¤ì •ì„ ì´ˆê¸°í™”í–ˆì–´ì•¼ 합니다. <a>ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 옵션</a>ì—서 구ë…필터와 허용 ê´‘ê³  ì„¤ì •ì„ í™•ì¸í•˜ì‹­ì‹œì˜¤.
+firstRun_feature_malware_description=ë„리 알려진 맬웨어 ë„ë©”ì¸ì„ ì°¨ë‹¨í•¨ìœ¼ë¡œì¨ ì›¹ì„ ë” ì•ˆì „í•˜ê²Œ ì´ìš©í•©ë‹ˆë‹¤.
+firstRun_features=ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ëŠ” ê´‘ê³  차단 ì´ì™¸ 다양한 ê¸°ëŠ¥ì´ ìžˆìŠµë‹ˆë‹¤
+firstRun_donate=기부
+firstRun_donate_label=프로ì íЏ ì§€ì›
+firstRun_feature_social=ì‚¬íšŒê´€ê³„ë§ ì„œë¹„ìŠ¤ 버튼 제거
+firstRun_legacySafariWarning=ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì—서 ì§€ì›í•˜ì§€ 않는 구버전 사파리를 사용하고 있습니다. 그래서 ì¼ë¶€ 사ì´íЏì—서 ì •ìƒì ì¸ ìž‘ë™ì„ 하지 않거나 ì‚¬ìš©ìž ê²½í—˜ì— ì†ìƒì„ 줄 수 있습니다. 사파리 6.6.1 ì´ìƒ(OS X 10.8 Mountain Lion), ë˜ëŠ” 사파리 7.0.1 ì´ìƒ(OS X 10.9 Mavericks) ë˜ëŠ” ëª¨ì§ˆë¼ íŒŒì´ì–´í­, 구글 í¬ë¡¬, 오페ë¼ì˜ 최신 ë²„ì „ì„ ì‚¬ìš©í•  ê²ƒì„ ê¶Œìž¥í•©ë‹ˆë‹¤.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/global.properties
new file mode 100644
index 0000000..bbd9425
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=현재 페ì´ì§€ì— 차단 가능한 í•­ëª©ì´ ì—†ìŠµë‹ˆë‹¤.
+action3_tooltip=ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용/중지
+notification_antiadblock_title=í‘œì  ë©”ì‹œì§€ë¥¼ 숨기겠습니까?
+type_label_script=스í¬ë¦½íЏ
+filter_elemhide_nocriteria=숨기려는 요소를 ì¸ì‹í•˜ê¸° 위한 ê¸°ì¤€ì´ ì§€ì •ë˜ì§€ 않았습니다.
+blockingGroup_title=요청 차단 필터
+whitelisted_tooltip=ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용 (í—ˆìš©ëœ íŽ˜ì´ì§€)
+type_label_stylesheet=스타ì¼ì‹œíЏ
+blocked_count_tooltip=차단 : ?1?개, 전체 항목 : ?2?개
+type_label_font=글꼴
+type_label_popup=íŒì—…ì°½
+filter_regexp_tooltip=ì´ í•„í„°ëŠ” ì •ê·œ 표현ì‹ì´ê±°ë‚˜ 최ì í™”í•˜ê¸°ì— ê¸¸ì´ê°€ 너무 짧으므로 웹 페ì´ì§€ë¥¼ 불러오는 ì†ë„ê°€ 저하ë©ë‹ˆë‹¤.
+action0_tooltip=마우스 ê°€ìš´ë° ë²„íŠ¼ - ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용/중지
+whitelisted_page=í—ˆìš©ëœ íŽ˜ì´ì§€
+remove_group_warning=ì´ ê·¸ë£¹ì„ ì •ë§ ì œê±°í•˜ì‹œê² ìŠµë‹ˆê¹Œ?
+action1_tooltip=마우스 ê°€ìš´ë° ë²„íŠ¼ - ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용/중지
+type_label_xmlhttprequest=XML 요청
+active_tooltip=ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용 [êµ¬ë… í•„í„° : ?1?ê°œ, ì‚¬ìš©ìž í•„í„° : ?2?ê°œ ]
+type_label_document=문서
+type_label_object_subrequest=하위 ê°ì²´ 요청
+whitelistGroup_title=허용 필터
+disabled_tooltip=ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용 중지
+filter_elemhide_duplicate_id=숨기려는 ìš”ì†Œì˜ ID는 한 개만 지정할 수 있습니다.
+type_label_object=ê°ì²´
+action2_tooltip=마우스 ê°€ìš´ë° ë²„íŠ¼ - ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용/중지
+type_label_subdocument=프레임
+clearStats_warning=모든 í•„í„° ì ìš© 횟수가 초기화ë˜ê³ , ì´ í†µê³„ ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ì§€ 않습니다. 진행하시겠습니까?
+notification_antiadblock_message=ì´ ì‚¬ì´íŠ¸ëŠ” ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용ìžì—게 í‘œì  ë©”ì‹œì§€ë¥¼ 보여주는 것으로 알려져 있습니다. ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ë¡œ í‘œì  ë©”ì‹œì§€ë¥¼ 숨기겠습니까?
+blocked_count_addendum=(허용 : ?1?개, 요소 숨김 : ?2?개)
+subscription_invalid_location=êµ¬ë… í•„í„°ì˜ ìœ„ì¹˜ì— ìž…ë ¥í•˜ëŠ” URL ë˜ëŠ” 파ì¼ëª…ì´ ì˜¬ë°”ë¥´ì§€ 않습니다.
+type_label_image=ì´ë¯¸ì§€
+remove_subscription_warning=ì´ êµ¬ë… í•„í„°ë¥¼ 제거하시겠습니까?
+type_label_other=기타
+mobile_menu_enable=ABP:사용
+type_label_media=오디오/비디오
+mobile_menu_disable_site=ABP:해제 - ?1?
+elemhideGroup_title=요소 숨김 필터
+mobile_menu_enable_site=ABP:사용 - ?1?
+type_label_elemhide=숨겨진 요소
+newGroup_title=새 필터 그룹
+default_dialog_title=ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/overlay.dtd
new file mode 100644
index 0000000..2b84e5e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;예">
+<!ENTITY notification.button.no "&amp;아니요">
+<!ENTITY sync.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 설정 ë™ê¸°í™” (&amp;c)">
+<!ENTITY whitelist.site.label "사ì´íЏ 허용 : ?1?">
+<!ENTITY filters.label "필터 설정 (&amp;F)">
+<!ENTITY disable.label "사용 중지">
+<!ENTITY objecttab.title "차단">
+<!ENTITY objecttab.tooltip "ì´ ê°ì²´ë¥¼ 차단하려면 차단 íƒ­ì„ í´ë¦­í•˜ì‹­ì‹œì˜¤.">
+<!ENTITY menuitem.label "필터 설정 (&amp;B)">
+<!ENTITY objecttabs.label "플래시/ìžë°”ì— ì°¨ë‹¨ 탭 표시 (&amp;T)">
+<!ENTITY sendReport.label "현재 페ì´ì§€ì˜ 문제 ë³´ê³  (&amp;R)">
+<!ENTITY whitelist.page.label "현재 페ì´ì§€ 허용">
+<!ENTITY context.image.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ : ì´ë¯¸ì§€ 차단">
+<!ENTITY counthits.label "í•„í„° ì ìš© 횟수 ê¸°ë¡ (&amp;h)">
+<!ENTITY opensidebar.label "차단 가능 ëª©ë¡ (&amp;B)">
+<!ENTITY notification.button.close "&amp;닫기">
+<!ENTITY contribute.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì— ê³µí—Œí•˜ê¸°">
+<!ENTITY toolbarbutton.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤">
+<!ENTITY context.frame.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ : 프레임 차단">
+<!ENTITY blocked.tooltip "ì ìš©ëœ í•„í„° 개수">
+<!ENTITY hideplaceholders.label "ì°¨ë‹¨ëœ ìš”ì†Œì˜ ì˜ì—­ 숨기기 (&amp;l)">
+<!ENTITY showinstatusbar.label "ìƒíƒœ í‘œì‹œì¤„ì— ì•„ì´ì½˜ ë³´ì´ê¸° (&amp;S)">
+<!ENTITY sidebar.title "현재 페ì´ì§€ì˜ 차단 가능한 항목">
+<!ENTITY options.label "옵션 (&amp;O)">
+<!ENTITY context.object.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ : ê°ì²´ 차단">
+<!ENTITY context.removeWhitelist.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ : 사ì´íЏ/페ì´ì§€ 허용 í•´ì œ">
+<!ENTITY filters.tooltip "ì ìš©ëœ 주요 í•„í„°">
+<!ENTITY closesidebar.label "차단 가능 ëª©ë¡ ë‹«ê¸° (&amp;B)">
+<!ENTITY showintoolbar.label "íˆ´ë°”ì— ì•„ì´ì½˜ ë³´ì´ê¸° (&amp;B)">
+<!ENTITY status.tooltip "ìƒíƒœ">
+<!ENTITY context.media.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ : 비디오/오디오 차단">
+<!ENTITY subscription.update.label "ì—…ë°ì´íЏ">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/sendReport.dtd
new file mode 100644
index 0000000..2e06d78
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "ë˜ëŒë¦¬ê¸° (&amp;U)">
+<!ENTITY issues.disabledgroups.description "ë‹¤ìŒ êµ¬ë… í•„í„°/í•„í„° ê·¸ë£¹ì„ ì‚¬ìš©í•˜ì§€ 않지만 ì´ íŽ˜ì´ì§€ì— ì˜í–¥ì„ 줄 수 있습니다.">
+<!ENTITY showData.label "ë³´ê³ í•  ìžë£Œ 보기">
+<!ENTITY typeSelector.falsePositive.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ê°€ 콘í…츠를 ê³¼ë„하게 차단함 (&amp;m)">
+<!ENTITY issues.change.description "ì„¤ì •ì´ ë³€ê²½ë˜ì—ˆìŠµë‹ˆë‹¤. 웹 페ì´ì§€ë¥¼ 다시 불러온 후 문제가 í•´ê²°ë˜ì§€ 않는다면 보고서를 제출하십시오.">
+<!ENTITY email.label "ë©”ì¼ ì£¼ì†Œ: (&amp;m)">
+<!ENTITY issues.openPreferences.label "필터 설정 열기">
+<!ENTITY sendPage.confirmation "보고서가 ì„œë²„ì— ì €ìž¥ë˜ì—ˆê³ , ë‹¤ìŒ ì£¼ì†Œë¡œ 보고서를 확ì¸í•  수 있습니다. í•„í„° 유지ìžê°€ 보고를 접수하면 ë³´ê³ ì„œì˜ Status 항목ì—는 unknown ëŒ€ì‹ ì— ì²˜ë¦¬ 결과가 표시ë©ë‹ˆë‹¤.">
+<!ENTITY copyLink.label "ë³´ê³  ë§í¬ 복사 (&amp;C)">
+<!ENTITY issues.nofilters.description "ì´ ë¬¸ì œëŠ” ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ê°€ ì•„ë¬´ê²ƒë„ ì°¨ë‹¨í•˜ì§€ ì•Šì€ ìƒíƒœì—서 ë°œìƒí•´ì„œ ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì™€ ê´€ë ¨ì´ ì—†ìŠµë‹ˆë‹¤.">
+<!ENTITY sendPage.knownIssue "보고한 문제는 다른 사용ìžë“¤ì— ì˜í•´ ì´ë¯¸ ë§Žì´ ë³´ê³ ë˜ì—ˆìŠµë‹ˆë‹¤. ë” ë§Žì€ ì •ë³´ :">
+<!ENTITY typeSelector.other.description "í•„í„° 문제가 아닌 ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ ìžì²´ì˜ 문제로 ì˜ì‹¬í•œë‹¤ë©´ ì´ ì˜µì…˜ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤.">
+<!ENTITY issues.disabledgroups.enable.label "êµ¬ë… í•„í„°/í•„í„° 그룹 사용">
+<!ENTITY typeWarning.override.label "ìœ„ì˜ ë‚´ìš©ì„ ì´í•´í–ˆìœ¼ë©°, 보고서 ìž‘ì„±ì„ ê³„ì† ì§„í–‰í•¨ (&amp;s)">
+<!ENTITY issues.disabled.enable.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ 사용">
+<!ENTITY update.fixed.description "ì—…ë°ì´íŠ¸ì— ì˜í•´ ë³´ê³ ëœ ì´ìŠˆê°€ í•´ê²°ëœ ê²ƒ 같습니다. 페ì´ì§€ 새로 ê³ ì¹¨ì„ í•˜ì‹  후 ìž¬ì‹œë„ í•˜ì‹­ì‹œì˜¤. ì•„ì§ ë¬¸ì œê°€ ë” ìžˆìœ¼ë©´ 다시 ë³´ê³ í•´ 주십시오.">
+<!ENTITY anonymous.label "ìµëª… 전송 (&amp;a)">
+<!ENTITY reloadButton.label "페ì´ì§€ 새로고침 (&amp;R)">
+<!ENTITY recentReports.clear.label "모든 보고서 제거 (&amp;R)">
+<!ENTITY typeSelector.description "문제 ë³´ê³  마법사는 ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì˜ ë¬¸ì œë¥¼ í•„í„° 유지ìžì—게 보고하기 위해 필요한 단계를 안내합니다. 먼저 현재 페ì´ì§€ì˜ 문제 ìœ í˜•ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤.">
+<!ENTITY screenshot.remove.label "민ê°í•œ ì˜ì—­ 숨김 (&amp;R)">
+<!ENTITY issues.ownfilters.description "현재 페ì´ì§€ì— ì ìš©ëœ í•„í„°ì˜ ì¼ë¶€ëŠ” 사용ìžê°€ 지정했습니다. ì´ ë¬¸ì œì— ì˜í–¥ì„ 줄 수 있는 ì‚¬ìš©ìž í•„í„°ëŠ” 사용하지 마십시오.">
+<!ENTITY update.inProgress.description "ì•„ì§ í•´ê²°ë˜ì§€ ì•Šì€ ì´ìŠˆë¡œ ì¸í•´ ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì˜ í•„í„°ë¥¼ ì—…ë°ì´íЏ 해야 합니다. 잠시만 기다려 주십시오...">
+<!ENTITY sendPage.retry.label "다시 전송">
+<!ENTITY data.label "ë³´ê³ í•  ìžë£Œ (&amp;p)">
+<!ENTITY recentReports.label "ìµœê·¼ì— ì œì¶œí•œ 보고서">
+<!ENTITY typeWarning.description "í•„í„° 문제가 아닌 ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì˜ ì¼ë°˜ì ì¸ 문제는 [link]ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ í¬ëŸ¼[/link]ì— ë³´ê³ í•˜ëŠ” ê²ƒì´ ìµœì„ ì±…ìž…ë‹ˆë‹¤. í¬ëŸ¼ì—서 ì´ë¯¸ ë…¼ì˜ëœ 문제를 보충하기 위해 문제 ë³´ê³  마법사를 ì´ìš©í•´ì•¼ 합니다. 보고서를 확ì¸í•  수 있는 ë§í¬ë¥¼ 제공하지 않으면 ì•„ë¬´ë„ ë³´ê³ ë¥¼ 확ì¸í•  수 없기 때문입니다. 보고서를 제출하면 ìžë™ìœ¼ë¡œ ìƒì„±ëœ ë§í¬ê°€ 제공ë©ë‹ˆë‹¤.">
+<!ENTITY issues.disabled.description "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ë¥¼ 사용하지 않는 ìƒíƒœì´ë¯€ë¡œ ì•„ë¬´ê²ƒë„ ì°¨ë‹¨í•˜ì§€ 않습니다.">
+<!ENTITY attachExtensions.label "사용하고 있는 부가 í”„ë¡œê·¸ëž¨ì˜ ëª©ë¡ì„ ë³´ê³ ì„œì— ì¶”ê°€ (다른 부가 프로그램과 ì¶©ëŒì´ ì›ì¸ì¸ 경우) (&amp;x)">
+<!ENTITY issues.nosubscriptions.add.label "êµ¬ë… í•„í„° 추가">
+<!ENTITY issues.disabledfilters.enable.label "필터 사용">
+<!ENTITY issues.override.label "설정ì—는 ì´ìƒì´ 없으며, 보고서 ìž‘ì„±ì„ ê³„ì† ì§„í–‰í•¨ (&amp;c)">
+<!ENTITY issues.nosubscriptions.description "웹 사ì´íŠ¸ì˜ ì›í•˜ì§€ 않는 광고를 ìžë™ 차단하는 êµ¬ë… í•„í„°ë¥¼ 추가하지 않았습니다.">
+<!ENTITY typeSelector.falsePositive.description "중요한 콘í…츠 누ë½, 웹 페ì´ì§€ê°€ 잘못 표시ë¨, ì˜¤ìž‘ë™ ë“± 차단 오류가 있으면 ì´ ì˜µì…˜ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤. ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ì˜ ì‚¬ìš©ì„ ìž„ì‹œë¡œ 중지하여 ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ê°€ ë¬¸ì œì˜ ì›ì¸ì¸ì§€ 먼저 확ì¸í•˜ì‹­ì‹œì˜¤.">
+<!ENTITY typeSelector.other.label "다른 문제 (&amp;t)">
+<!ENTITY emailComment.label "ì „ìžìš°íޏ 주소를 입력할 ê²ƒì„ ê¶Œìž¥í•©ë‹ˆë‹¤. 만약 ë³´ê³ ëœ ë¬¸ì œì— ëŒ€í•´ 문ì˜í•´ì•¼ í•  때 ì—°ë½ì„ í•  수 있기 때문입니다.">
+<!ENTITY issues.whitelist.remove.label "사ì´íЏ/페ì´ì§€ 허용 필터를 사용 중지">
+<!ENTITY outdatedSubscriptions.description "아래 í•„í„°ê°€ ì ì–´ë„ 2주 ì´ìƒ ì—…ë°ì´íЏë˜ì§€ 않았습니다. 보고하기 ì´ì „ì— ë¨¼ì € 필터를 ì—…ë°ì´íŠ¸í•˜ì—¬ 주십시오. ì—…ë°ì´íŠ¸ë¥¼ 하면 문제가 í•´ê²°ë  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.">
+<!ENTITY dataCollector.description "필요한 ìžë£Œë¥¼ 수집하는 ë™ì•ˆ 잠시만 기다려주십시오.">
+<!ENTITY sendButton.label "보고서 전송 (&amp;n)">
+<!ENTITY comment.label "보고 내용 (필수 항목) : (&amp;C)">
+<!ENTITY sendPage.errorMessage "오류 코드 &quot;?1?&quot;ì— ì˜í•´ ë³´ê³  ì „ì†¡ì„ ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤. ì¸í„°ë„·ì´ ì ‘ì†ë˜ì—ˆëŠ”ì§€ 확ì¸í•œ 후 다시 시ë„하십시오. 만약 문제가 계ì†í•´ì„œ ë°œìƒí•œë‹¤ë©´ [link]ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ í¬ëŸ¼[/link]ì— ë„ì›€ì„ ìš”ì²­í•˜ì‹­ì‹œì˜¤.">
+<!ENTITY showRecentReports.label "ìµœê·¼ì— ì œì¶œí•œ 보고서 보기">
+<!ENTITY commentPage.heading "ë³´ê³  ë‚´ìš© ìž…ë ¥">
+<!ENTITY update.start.label "지금 ì—…ë°ì´íЏ 시작하기">
+<!ENTITY issues.disabledfilters.description "ë‹¤ìŒ í•„í„°ëŠ” 사용하지 않지만 현재 페ì´ì§€ì— ì˜í–¥ì„ 줄 수 있습니다.">
+<!ENTITY screenshot.description "ê°™ì€ íŽ˜ì´ì§€ë„ 다른 사람들ì—게는 다르게 ë³´ì¼ ìˆ˜ 있습니다. 그래서 ë³´ê³ ì„œì— í™”ë©´ ê°ˆë¬´ë¦¬ì„ ì²¨ë¶€í•˜ë©´ 문제를 ì´í•´í•˜ëŠ”ë° ë„ì›€ì´ ë©ë‹ˆë‹¤. 문제 ì˜ì—­ì„ ë¶€ê°í•˜ê¸° 위해 페ì´ì§€ ì´ë¯¸ì§€ì— 표시를 하고, 민ê°í•œ ì •ë³´ ì˜ì—­ì€ 숨길 수 있습니다. ì›í•˜ëŠ” ë²„íŠ¼ì„ ëˆ„ë¥´ê³ , ì´ë¯¸ì§€ì— 마우스로 ì˜ì—­ì„ 표시하십시오.">
+<!ENTITY screenshot.attach.label "ë³´ê³ ì„œì— íŽ˜ì´ì§€ ì´ë¯¸ì§€ 첨부 (&amp;t)">
+<!ENTITY issues.whitelist.description "현재 페ì´ì§€ì— 허용 필터를 ì ìš©í•˜ì—¬ 콘í…츠가 차단ë˜ì§€ 않았습니다. 현재 페ì´ì§€ì— ì ìš©ëœ 허용 í•„í„°ì˜ ì‚¬ìš©ì„ ì¤‘ì§€í•œ ìƒíƒœì—서 웹 페ì´ì§€ë¥¼ 다시 불러오십시오.">
+<!ENTITY typeSelector.falseNegative.label "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ê°€ 광고를 차단 안 함 (&amp;v)">
+<!ENTITY typeSelector.heading "문제 유형 ì„ íƒ">
+<!ENTITY anonymity.warning "우리가 ë‹¹ì‹ ì— ê²Œ ëŒì•„올 수 ì—†ì„ ê³  ê°€ëŠ¥ì„±ì´ ë³´ê³ ì„œ ë‚®ì€ ìš°ì„  순위를 지정 합니다.">
+<!ENTITY wizard.title "문제 보고 마법사">
+<!ENTITY issues.ownfilters.disable.label "필터 사용 중지">
+<!ENTITY commentPage.description "모든 언어로 ìž…ë ¥ 가능 + 페ì´ì§€ ì „ì²´ URL : í‰ì†Œ 사용하거나 설명하기 쉬운 언어로 ë³´ê³ í•  ë‚´ìš©ì„ ìž…ë ¥í•˜ì‹­ì‹œì˜¤. 그런 후 주소 í‘œì‹œì¤„ì˜ íŽ˜ì´ì§€ ì „ì²´ URLì„ ë³µì‚¬í•´ 입력한 ë‚´ìš© ì•„ëž˜ì— ë°˜ë“œì‹œ 붙여넣으십시오.">
+<!ENTITY comment.lengthWarning "ì„¤ëª…ì˜ ê¸¸ì´ê°€ 1000ìžë¥¼ 초과하여 1000ìžê¹Œì§€ë§Œ 전송ë©ë‹ˆë‹¤.">
+<!ENTITY typeSelector.falseNegative.description "ì• ë“œë¸”ë¡ í”ŒëŸ¬ìŠ¤ë¥¼ 사용함ì—ë„ ë¶ˆêµ¬í•˜ê³  ê´‘ê³ ê°€ ë³´ì´ë©´ ì´ ì˜µì…˜ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤.">
+<!ENTITY sendPage.waitMessage "보고서를 제출하는 ë™ì•ˆ 잠시만 기다려주십시오.">
+<!ENTITY dataCollector.heading "문제 ë³´ê³  마법사를 ì´ìš©í•´ì£¼ì…”서 고맙습니다!">
+<!ENTITY screenshot.heading "화면 갈무리 첨부">
+<!ENTITY sendPage.heading "보고서 전송">
+<!ENTITY issues.subscriptionCount.description "너무 ë§Žì€ êµ¬ë… í•„í„°ë¥¼ 구ë…하고 있습니다. ì´ ì„¤ì •ì€ ë” ë§Žì€ ë¬¸ì œë¥¼ ë°œìƒì‹œí‚¬ 수 있기 ë•Œë¬¸ì— ê¶Œìž¥í•˜ì§€ 않습니다. ë˜í•œ 필요한 조치를 취할 êµ¬ë… í•„í„° 유지ìžê°€ 명확하지 않기 ë•Œë¬¸ì— ì´ ë¬¸ì œ 보고를 ë°›ì•„ë“¤ì¼ ìˆ˜ 없습니다. 실제로 필요한 êµ¬ë… í•„í„°ë¥¼ 제외한 모든 êµ¬ë… í•„í„°ë¥¼ 제거하고, 그런 후ì—ë„ ë¬¸ì œê°€ ë°œìƒí•˜ëŠ”ì§€ë¥¼ 테스트하십시오.">
+<!ENTITY screenshot.mark.label "문제 ì˜ì—­ 표시 (&amp;M)">
+<!ENTITY privacyPolicy.label "ê°œì¸ ì •ë³´ 보호 ì •ì±…">
+<!ENTITY issues.description "ì´ ë¬¸ì œì— ì˜í–¥ì„ 줄 수 있는 설정 ë˜ëŠ” ìžë£Œ 조사를 어렵게 하는 ìš”ì¸ì„ íƒì§€í–ˆìŠµë‹ˆë‹¤.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/sidebar.dtd
new file mode 100644
index 0000000..48d280d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "항목 위치 확ì¸">
+<!ENTITY address.label "주소">
+<!ENTITY context.open.label "새 탭으로 열기">
+<!ENTITY type.label "형ì‹">
+<!ENTITY tooltip.filterSource.label "필터 그룹 :">
+<!ENTITY noitems.label "차단 가능한 항목 ì—†ìŒ">
+<!ENTITY filter.label "í•„í„°">
+<!ENTITY tooltip.size.label "í¬ê¸° :">
+<!ENTITY reattach.label "통합">
+<!ENTITY search.label "검색 (&amp;S)">
+<!ENTITY docDomain.thirdParty "(외부 요청)">
+<!ENTITY filterSource.label "필터 위치">
+<!ENTITY tooltip.docDomain.label "문서 위치 :">
+<!ENTITY context.copy.label "주소 복사">
+<!ENTITY tooltip.type.label "í˜•ì‹ :">
+<!ENTITY context.disablefilter.label "필터 사용 중지 : ?1?">
+<!ENTITY context.copyFilter.label "필터 복사">
+<!ENTITY context.block.label "차단 필터 추가">
+<!ENTITY context.enablefilter.label "필터 다시 사용 : ?1?">
+<!ENTITY detach.label "분리">
+<!ENTITY whitelisted.label "í—ˆìš©ëœ íŽ˜ì´ì§€">
+<!ENTITY context.disablefilteronsite.label "ì§€ì •ëœ ë„ë©”ì¸ì—ë§Œ ì ìš© 중지 : ?1?">
+<!ENTITY detached.title "차단 가능 ëª©ë¡ (분리ë¨)">
+<!ENTITY docDomain.firstParty "(내부 요청)">
+<!ENTITY tooltip.type.whitelisted "(허용ë¨)">
+<!ENTITY tooltip.filter.label "í•„í„° :">
+<!ENTITY tooltip.filter.disabled "(사용 중지)">
+<!ENTITY context.editfilter.label "필터 편집">
+<!ENTITY tooltip.type.blocked "(차단ë¨)">
+<!ENTITY size.label "í¬ê¸°">
+<!ENTITY context.whitelist.label "허용 필터 추가">
+<!ENTITY context.selectAll.label "ëª¨ë‘ ì„ íƒ">
+<!ENTITY state.label "ìƒíƒœ">
+<!ENTITY docDomain.label "문서 위치">
+<!ENTITY tooltip.address.label "주소 :">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/subscriptionSelection.dtd
new file mode 100644
index 0000000..2374e0d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ko/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "&quot;?1?&quot; êµ¬ë… í•„í„°ë„ í•¨ê»˜ 추가 (&amp;s)">
+<!ENTITY list.download.failed "êµ¬ë… í•„í„° 목ë¡ì˜ 검색 실패">
+<!ENTITY list.download.retry "다시 시ë„">
+<!ENTITY title.label "ì´ë¦„ (&amp;T)">
+<!ENTITY list.download.website "웹 사ì´íЏ">
+<!ENTITY supplementMessage "ì„ íƒí•œ êµ¬ë… í•„í„°ëŠ” &quot;?1?&quot;와(ê³¼) 함께 추가할 ê²ƒì„ ê¶Œìž¥í•©ë‹ˆë‹¤.">
+<!ENTITY viewList.label "í•„í„° ëª©ë¡ ë³´ê¸°">
+<!ENTITY visitHomepage.label "홈페ì´ì§€">
+<!ENTITY addSubscription.label "추가">
+<!ENTITY dialog.title "êµ¬ë… í•„í„° 추가">
+<!ENTITY location.label "위치 (&amp;L)">
+<!ENTITY fromWeb.description "추가하려는 êµ¬ë… í•„í„°ì¸ì§€ 확ì¸í•˜ì‹­ì‹œì˜¤. 추가하기 ì „ì— ì´ë¦„ ë˜ëŠ” 위치를 변경할 수 있습니다.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/composer.dtd
new file mode 100644
index 0000000..13efa60
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "adreso &amp;pabaigoje">
+<!ENTITY domainRestriction.label "Apribojimai &amp;domenui:">
+<!ENTITY collapse.default.no.label "Naudoti numatytÄ… (ne)">
+<!ENTITY firstParty.label "Tik &amp;pagrindinių">
+<!ENTITY preferences.label "&amp;Rodyti esamus filtrus...">
+<!ENTITY pattern.label "Ieškoti atitikmens">
+<!ENTITY thirdParty.label "&amp;Tik treÄiųjų Å¡alių">
+<!ENTITY filter.label "Naujas &amp;filtras:">
+<!ENTITY collapse.label "&amp;Suskleisti užblokuotus:">
+<!ENTITY match.warning "Atitikmuo kurį įvedėte nebeatitinka adreso kurį reikia įdėti į baltąjį/juodąjį sąrašą todėl jis nebeturės jokio efekto.">
+<!ENTITY anchor.start.label "a&amp;dreso pradžioje">
+<!ENTITY matchCase.label "&amp;Skirti didžiąsias ir mažąsias raides">
+<!ENTITY custom.pattern.label "&amp;Pasirinktas:">
+<!ENTITY unselectAllTypes.label "Nieko nepasirinkti">
+<!ENTITY type.whitelist.label "I&amp;šimties taisyklė">
+<!ENTITY regexp.warning "Atitikmuo kurį įvedėte bus interpretuojamas kaip reguliarioji išraiška, Adblock Plus negali jo efektyviai pritaikyti, todėl gali sulėtėti naršymas. Jei nenorėjote naudoti reguliariųjų išraiškų, atitikmens pabaigoje pridėkite žvaigždutę (*).">
+<!ENTITY dialog.title "PridÄ—ti Adblock Plus filtravimo taisyklÄ™">
+<!ENTITY basic.label "Paprastas konfigūravimas">
+<!ENTITY type.filter.label "&amp;Blokavimo filtrai">
+<!ENTITY types.label "Pritaikyti tipams:">
+<!ENTITY shortpattern.warning "Atitikmuo kurį įvedėte yra per trumpas, kad būtų galima optimizuoti ir gali sulėtinti naršymą. Rekomenduojama šiam filtrui pasirinkti ilgesnę eilutę, kad Adblock Plus galėtų efektyviau išnaudoti šį filtrą.">
+<!ENTITY collapse.yes.label "Taip">
+<!ENTITY anchors.label "Priimti tik atitikmenį:">
+<!ENTITY collapse.default.yes.label "Naudoti numatytÄ… (taip)">
+<!ENTITY domainRestriction.help "Naudokite šią pasirinkty nurodyti vieną ar kelis domenus atskirtus |. Filtras bus pritaikytas tik pasirinktiems domenams. ~ prieš domeną parodo jog filtras nebus pritaikytas tam domenui.">
+<!ENTITY accept.label "PridÄ—ti filtrÄ…">
+<!ENTITY options.label "Parinktys">
+<!ENTITY disabled.warning "Adblock Plus šiuo metu yra išjungtas. Vistiek galite pridėti filtrus, bet jie neveiks kol [link]neįjungsite Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "&amp;domeno pradžioje">
+<!ENTITY collapse.no.label "Ne">
+<!ENTITY selectAllTypes.label "Pasirinkti visus">
+<!ENTITY advanced.label "Sudėtingesnis konfigūravimas">
+<!ENTITY pattern.explanation "Atitikmuo gali būti betkuri adreso dalis; žvaigždutė (*) veiks kaip „wildcards“. Filtras bus pritaikytas tik tuo atveju jei adrese bus rastas atitikmuo.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/filters.dtd
new file mode 100644
index 0000000..630e8cc
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Visi jūsų pasirinktiniai filtrai bus pakeisti pasirinkto failo turiniu. Ar norite tęsti?">
+<!ENTITY slow.column "&amp;LÄ—ti filtrai">
+<!ENTITY enabled.column "Įju&amp;ngta">
+<!ENTITY subscription.lastDownload.checksumMismatch "Nepavyko, bloga kontrolinÄ— suma">
+<!ENTITY noFiltersInGroup.text "Pasirinkta grupÄ— yra tuÅ¡Äia">
+<!ENTITY subscription.actions.label "Veiksmai">
+<!ENTITY filter.selectAll.label "Pasirinkti visas">
+<!ENTITY backupButton.label "&amp;Atsarginių kopijų kūrimas ir atkūrimas">
+<!ENTITY restore.minVersion.warning "Įspėjimas: failas sukurtas naudojant naujesnę Adblock Plus versiją. Prieš atstatant iš šio failo, turėtumėte atnaujinti savo Adblock Plus iki naujausios versijos.">
+<!ENTITY restore.error "Neįmanoma panaudoti failo duomenų, gal tai ne Adblock PLus atsarginės kopijos failas?">
+<!ENTITY sort.ascending.label "Riki&amp;avimo tvarka „A &gt; Z“">
+<!ENTITY sort.label "&amp;Rikiuoti pagal">
+<!ENTITY subscription.source.label "Filtrų sąrašas">
+<!ENTITY hitcount.column "&amp;Blokavimai">
+<!ENTITY noFilters.text "Kol kas jūs neturite jokių pasirinktinių filtrų.">
+<!ENTITY backup.custom.title "Tik pasirinktiniai filtrai">
+<!ENTITY subscription.external.label "Atnaujino kitas plÄ—tinys">
+<!ENTITY subscription.delete.label "Ištrinti">
+<!ENTITY noGroupSelected.text "Jūs turite pasirinkti filtrų grupę, tik tada bus galima parodyti tos grupės filtrus.">
+<!ENTITY filter.cut.label "Iškirpti">
+<!ENTITY restore.default.label "Atstatyti atsarginę kopiją iš ?1?">
+<!ENTITY subscription.lastDownload.inProgress "AtsiunÄiama...">
+<!ENTITY subscriptions.tab.label "Filtrų prenumeratos">
+<!ENTITY sort.descending.label "Rikiavimo tvarka „&amp;Z &gt; A“">
+<!ENTITY filters.remove.warning "Ar tikrai norite pašalinti visus pasirinktus filtrus?">
+<!ENTITY filter.delete.label "Pašalinti">
+<!ENTITY addSubscriptionAdd.label "PridÄ—ti">
+<!ENTITY viewMenu.label "Rodymas">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY addSubscriptionCancel.label "Atšaukti">
+<!ENTITY subscription.enabled.label "Įjungta">
+<!ENTITY noSubscriptions.text "Kol kas jūs nepridėjote jokių filtrų prenumeratų. Be filtrų Adblock Plus nieko neblokuos,
+norÄ—dami pridÄ—ti kelis naudokite
+&quot;Pridėti filtrų prenumeratą&quot;.">
+<!ENTITY subscription.update.label "Atnaujinti filtrus">
+<!ENTITY dialog.title "Adblock Plus filtrų nustatymai">
+<!ENTITY addFilter.label "Pri&amp;dÄ—ti filtrÄ…">
+<!ENTITY subscription.minVersion.warning "Ši filtrų prenumerata reikalauja naujesnės Adblock Plus versijos, turėtume atsinaujinti savo Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Nepavyko, netinkamas adresas">
+<!ENTITY backup.error "Įvyko klaida rašant filtrus į failą. Įsitikinkite jog tas failas neapsaugotas nuo rašymo ir jo nenaudoja kita programa.">
+<!ENTITY filter.moveUp.label "Pakelti aukštyn">
+<!ENTITY addGroup.label "Pridėti filtrų &amp;grupę">
+<!ENTITY filter.edit.label "Keisti">
+<!ENTITY subscription.showHideFilters.label "Rodyti/slėpti filtrų taisykles">
+<!ENTITY acceptableAds2.label "Leisti &amp;neįkyrias reklamas">
+<!ENTITY addSubscriptionOther.label "PridÄ—ti kitÄ… prenumeratÄ…">
+<!ENTITY close.label "Užverti">
+<!ENTITY sort.none.label "&amp;Nerikiuojama">
+<!ENTITY filter.actions.label "Filtro veiksmai">
+<!ENTITY filter.copy.label "Kopijuoti">
+<!ENTITY filter.moveDown.label "Perkelti žemyn">
+<!ENTITY filter.resetHitCounts.label "Atstatyti blokavimų statistiką">
+<!ENTITY readMore.label "PlaÄiau">
+<!ENTITY subscription.moveUp.label "Pakelti aukštyn">
+<!ENTITY addSubscription.label "&amp;PridÄ—ti filtro prenumeratÄ…">
+<!ENTITY subscription.homepage.label "Namų puslapis">
+<!ENTITY backup.complete.title "Visi filtrai ir prenumeratos">
+<!ENTITY restore.own.label "Atstatyti savo atsarginÄ™ kopijÄ…">
+<!ENTITY restore.complete.warning "Visi jūsų filtrų nustatymai bus pakeisti pasirinkto failo turiniu. Ar norite tęsti?">
+<!ENTITY filters.tab.label "Pasirinktiniai filtrai">
+<!ENTITY backup.label "Sukurti naujÄ… atsarginÄ™ kopijÄ…">
+<!ENTITY find.label "Ra&amp;sti">
+<!ENTITY subscription.moveDown.label "Perkelti žemyn">
+<!ENTITY subscription.lastDownload.connectionError "Nepavyko, atsiuntimo klaida">
+<!ENTITY subscription.lastDownload.success "SÄ—kmingai">
+<!ENTITY subscription.lastDownload.invalidData "Nepavyko, netinkamas filtrų sąrašas">
+<!ENTITY filter.paste.label "Įdėti">
+<!ENTITY subscription.disabledFilters.enable "Įjungti išjungtus filtrus">
+<!ENTITY lasthit.column "Paskutinis b&amp;lokavimas">
+<!ENTITY subscription.editTitle.label "Pervadinti">
+<!ENTITY subscription.disabledFilters.warning "Kai kurie filtrai, šioje prenumeratoje, išjungti.">
+<!ENTITY filter.column "Filtro &amp;taisyklÄ—">
+<!ENTITY subscription.lastDownload.label "Paskutinis atsiuntimas:">
+<!ENTITY viewList.label "Peržiūrėti sąrašą">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/firstRun.properties
new file mode 100644
index 0000000..18f17b1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=IÅ¡junkite sekimÄ… ir paverskite savo narÅ¡ymÄ… privaÄiu - paslÄ—pkite savo pÄ—dsakus nuo reklamos įmonių kurios galbÅ«t seka kiekvienÄ… jÅ«sų žingsnį.
+firstRun_toggle_off=IÅ J.
+firstRun_feature_tracking=Išjungti sekimą
+firstRun_feature_malware=Kenkėjiškų programų blokavimas
+firstRun_title=AdBlock Plus sėkmingai įdiegta
+firstRun_acceptableAdsExplanation=Mes norÄ—tume paskatinti svetaines naudoti paprastas, nekrentanÄias į akis reklamas. TodÄ—l nustatÄ—me <a>griežtas gaires</a> priimtinų reklamų nustatymui, jos bus rodomos pagal nutylÄ—jimÄ…. Jei vis tiek norite visas reklamas galite <a>iÅ¡jungti</a> Å¡iÄ… galimybÄ™ per kelias sekundes.
+firstRun_toggle_on=Įj.
+firstRun_contributor_credits=PadÄ—kos prisidÄ—jusiems
+firstRun_dataCorruptionWarning=Ar Å¡is puslapis pastoviai rodomas? <a>Paspauskite Äia</a>
+firstRun_acceptableAdsHeadline=Nuo Å¡iol erzinanÄios reklamos bus užblokuotos
+firstRun_share=Papasakokite savo draugams
+firstRun_share_headline=<a>PadÄ—kite mums</a> paversti internetÄ… geresne vieta
+firstRun_features=Adblock Plus gali daugiau nei tik blokuoti reklamas
+firstRun_feature_malware_description=Padarykite savo naršymą saugesniu užblokuodami žinomas kenkėjiškas svetaines.
+firstRun_feature_social_description=Automatiškai pašalinkite socialinių tinklų mygtukus, tokius kaip „Facebook Like“, kurie seka jūsų elgesį.
+firstRun_donate=paaukoti
+firstRun_donate_label=Paremkite mūsų projektą
+firstRun_feature_social=Pašalinti socialinių puslapių mygtukus
+firstRun_legacySafariWarning=Jūs naudojate seną Safari versiją, kurios Adblock Plus nepalaiko. Adblock plus gali veikti netinkamai ar sukelti problemų. Rekomenduojame naudoti Safari 6.1.1 ar naujesnę versiją (prieinama Mac OS X 10.9 Mavericks) arba naudokite naujausią Mozilla Firefox, Google Chrome ar Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/global.properties
new file mode 100644
index 0000000..8480dda
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Šiame puslapyje nėra jokių blokuojamų elementų
+action3_tooltip=Spragtelėkite, norėdami įjungti/išjungti „Adblock Plus“.
+notification_antiadblock_title=Paslėpti tikslinius pranešimus?
+type_label_script=scenarijus
+filter_elemhide_nocriteria=Nėra kriterijaus pagal kurį galima būtų nuspręsti kurį elementą paslėpti
+blockingGroup_title=Reklamų blokavimo taisyklės
+whitelisted_tooltip=„Adblock Plus“ aktyvus, bet išjungtas dabartiniam tinklalapiui.
+type_label_stylesheet=stilius
+blocked_count_tooltip=?1? iš ?2?
+type_label_font=šriftas
+type_label_popup=iššokantis langas
+filter_regexp_tooltip=Šis filtras yra reguliarioji išraiška arba per trumpas, kad būtų galima optimizuoti. Jei yra daug tokių filtrų jie gali sulėtinti naršymą.
+action0_tooltip=Spragtelėkite, norėdami iškviesti kontekstinį meniu; spragtelėkite viduriniuoju klavišu norėdami įjungti/išjungti.
+whitelisted_page=„Adblock Plus“ yra išjungtas dabartiniam tinklalapiui
+remove_group_warning=Ar tikrai norite pašalinti šią grupę?
+action1_tooltip=Spragtelėkite, norėdami atverti/užverti blokuojamus elementus; spragtelėkite viduriniuoju klavišu norėdami įjungti/išjungti.
+type_label_xmlhttprequest=XML užklausa
+active_tooltip=Adblock Plus įjungtas, naudojamos ?1? filtrų prenumeratos ir ?2? pasirinktiniai filtrai.
+type_label_document=dokumentas
+type_label_object_subrequest=papildoma objekto užklausa
+whitelistGroup_title=IÅ¡imÄių taisyklÄ—s
+disabled_tooltip=„Adblock Plus“ išjungtas.
+filter_elemhide_duplicate_id=Gali būti nurodytas tik vienas elemento ID kurį reikia paslėpti
+type_label_object=objektas
+action2_tooltip=Spragtelėkite, norėdami atverti nustatymus; spragtelėkite viduriniuoju klavišu norėdami įjungti/išjungti.
+type_label_subdocument=kadras
+clearStats_warning=Bus atstatyta visų filtrų blokavimų statistika ir iÅ¡jungtas blokavimų skaiÄiavimas. Ar norite tÄ™sti?
+notification_antiadblock_message=Šioje svetainėje rodomi tiksliniai pranešimai Adblock Plus naudotojams. Ar norite jog Adblock Plus paslėptų tikslinius pranešimus?
+blocked_count_addendum=(baltajame sąraše: ?1?, paslėpta: ?2?)
+subscription_invalid_location=Filtrų sąrašo adresas nėra taisyklingas URL ar failo vardas.
+type_label_image=paveikslÄ—lis
+remove_subscription_warning=Ar tikrai norite atsisakyti šios prenumeratos?
+type_label_other=kita
+mobile_menu_enable=ABP: Įjungti
+type_label_media=audio/video
+mobile_menu_disable_site=ABP: Išjungti ?1?
+elemhideGroup_title=Elementų slėpimo taisyklės
+mobile_menu_enable_site=ABP: Įjungti ?1?
+type_label_elemhide=paslÄ—pta
+newGroup_title=Nauja filtrų grupė
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/overlay.dtd
new file mode 100644
index 0000000..8e2f332
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Taip">
+<!ENTITY notification.button.no "&amp;Ne">
+<!ENTITY sync.label "Adblo&amp;ck Plus Sync nustatymai">
+<!ENTITY whitelist.site.label "Išjungti ?1?">
+<!ENTITY filters.label "&amp;Filtrų nustatymai">
+<!ENTITY disable.label "Išjungti visur">
+<!ENTITY objecttab.title "Blokuoti">
+<!ENTITY objecttab.tooltip "SpragtelÄ—kite Äia norÄ—dami užblokuoti šį objektÄ… su „Adblock Plus“">
+<!ENTITY menuitem.label "„&amp;Adblock Plus“ nustatymai">
+<!ENTITY objecttabs.label "Rodyti korteles &amp;Flash ir Java elementams">
+<!ENTITY sendReport.label "P&amp;ranešti apie problemą šiame puslapyje">
+<!ENTITY whitelist.page.label "Išjungti šiam tinklalapiui">
+<!ENTITY context.image.label "„Adblock Plus“: Blokuoti paveikslėlį">
+<!ENTITY counthits.label "Sus&amp;kaiÄiuoti filtro blokavimus">
+<!ENTITY opensidebar.label "Atverti &amp;blokuojamus elementus">
+<!ENTITY notification.button.close "&amp;Uždaryti">
+<!ENTITY contribute.label "PrisidÄ—ti prie Adblock Plus">
+<!ENTITY toolbarbutton.label "„Adblock Plus“">
+<!ENTITY context.frame.label "„Adblock Plus“: Blokuoti kadrą">
+<!ENTITY blocked.tooltip "Šiame tinklalapyje užblokuoti elementai:">
+<!ENTITY hideplaceholders.label "S&amp;lėpti užblokuotų elementų vietos laikiklius">
+<!ENTITY showinstatusbar.label "Rodyti &amp;būsenos juostoje">
+<!ENTITY sidebar.title "Blokuojami elementai dabartiniame tinklalapyje">
+<!ENTITY options.label "&amp;Pasirinktys">
+<!ENTITY context.object.label "„Adblock Plus“: Blokuoti objektą">
+<!ENTITY context.removeWhitelist.label "„Adblock Plus“: iš naujo įjungti šiame puslapyje">
+<!ENTITY filters.tooltip "Aktyviausi filtrai:">
+<!ENTITY closesidebar.label "Užverti &amp;blokuojamus elementus">
+<!ENTITY showintoolbar.label "&amp;Rodyti priemonių juostoje">
+<!ENTITY status.tooltip "Būsena:">
+<!ENTITY context.media.label "„Adblock Plus“: Blokuoti audio/video">
+<!ENTITY subscription.update.label "Atnaujinti filtrus">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/sendReport.dtd
new file mode 100644
index 0000000..9a832cd
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/sendReport.dtd
@@ -0,0 +1,96 @@
+<!ENTITY screenshot.undo.label "&amp;Atšaukti">
+<!ENTITY issues.disabledgroups.description "Šios filtrų prenumeratos / filtrų grupės yra išjungtos, nors jos gali
+turėti įtakos šiam puslapiui:">
+<!ENTITY showData.label "Rodyti pranešimo duomenis">
+<!ENTITY typeSelector.falsePositive.label "A&amp;dblock Plus blokuoja per daug">
+<!ENTITY issues.change.description "Jūsų konfigūracija pakeista. Perkraukite puslapį ir išbandykite keitimus
+ir jei problema neišsisprendė praneškite apie ją.">
+<!ENTITY email.label "El. paš&amp;tas:">
+<!ENTITY issues.openPreferences.label "Atverti filtro nustatymus">
+<!ENTITY sendPage.confirmation "Jūsų pranešimas išsaugotas. Jį pasiekti galite šiuo adresu:">
+<!ENTITY copyLink.label "&amp;Kopijuoti pranešimo nuorodą">
+<!ENTITY issues.nofilters.description "Adblock Plus dabartiniame puslapyje nieko neblokuoja. Problema kuriÄ… matote
+tikriausiai nÄ—ra susijusi su Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Pranešta klaida turbūt žinoma. Daugiau informacijos:">
+<!ENTITY typeSelector.other.description "Pasirinkite Å¡iÄ… pasirinkty jei manote jog tai paÄio Adblock Plus bÄ—da, o ne filtrų.">
+<!ENTITY issues.disabledgroups.enable.label "Įjungti filtro prenumeratą / filtrų grupę">
+<!ENTITY typeWarning.override.label "&amp;Aš suprantu ir vistiek noriu pranešti">
+<!ENTITY issues.disabled.enable.label "Įjungti Adblock Plus">
+<!ENTITY update.fixed.description "Atnaujinimai greiÄiausiai iÅ¡sprendÄ— bÄ—dÄ… apie kuriÄ… jÅ«s norÄ—jote praneÅ¡ti. Ä®kraukite puslapį iÅ¡ naujo, jei problema vis dar yra paspauskite „PraneÅ¡ti“.">
+<!ENTITY anonymous.label "&amp;Anoniminis pranešimas">
+<!ENTITY reloadButton.label "&amp;Įkelti iš naujo">
+<!ENTITY recentReports.clear.label "&amp;Pašalinti visus pranešimus">
+<!ENTITY typeSelector.description "Šis langas padės įvykdyti kelis žingsnius kurie reikalingi pranešti apie Adblock Plus
+problemą. Pirmiausia, šiame puslapyje, pasirinkite problemos su kuria susidūrėte
+tipÄ…:">
+<!ENTITY screenshot.remove.label "&amp;Pašalinti neviešus duomenis">
+<!ENTITY issues.ownfilters.description "Kai kurie filtrai pritaikyti šiam puslapiui yra sukurti naudotojo. Išjunkite
+filtrus kurie galÄ—jo sukelti problemÄ…:">
+<!ENTITY update.inProgress.description "Adblock Plus turi atnaujinti jūsų filtrų prenumeratas ir įsitikinti jog problema dar neišspręsta. Palaukite...">
+<!ENTITY sendPage.retry.label "Siųsti dar kartą">
+<!ENTITY data.label "Praneš&amp;imo duomenys:">
+<!ENTITY recentReports.label "Jūsų nesenai praneštos problemos">
+<!ENTITY typeWarning.description "Jūs pareiškėte jog problemą sukėlė Adblock Plus, o ne filtrai.
+Turėkite omeny jog tokias problemas geriausia pranešti
+[link]Adblock Plus forume[/link]. Šį problemų pranešėją turėtumėte naudoti
+tik papildyti esamas diskusijas, niekas nepastebės jūsų pranešimo
+nebent duosite nuorodą į jį. Automatiškai sukurta nuoroda
+bus parodyta kai išsiųsite pranešimą.">
+<!ENTITY issues.disabled.description "Adblock Plus yra išjungtas, tokioje būsenoje jis nieko neužblokuos.">
+<!ENTITY attachExtensions.label "Prie pranešimo pri&amp;segti aktyvių plėtinių sąrašą, jei kartais problema kilo dėl plėtinių nesuderinamumo">
+<!ENTITY issues.nosubscriptions.add.label "PridÄ—ti filtro prenumeratÄ…">
+<!ENTITY issues.disabledfilters.enable.label "Įjungti filtrą">
+<!ENTITY issues.override.label "Konfi&amp;gūracija teisinga, tęskite su pranešimu">
+<!ENTITY issues.nosubscriptions.description "Atrodo jūs neprenumeruojate jokių sukurtų filtrų sąrašų kurie automatiškai
+šalintų nepageidaujamą turinį iš puslapių.">
+<!ENTITY typeSelector.falsePositive.description "Pasirinkite šią pasirinkty jei puslapyje trūksta svarbaus turinio, jei atvaizduojama netinkamai ar
+puslapis nefunkcionuoja taip kaip turėtų. Norėdami įsitikinti jog problemą sukėlė Adblock Plus galite
+trumpam išjungti Adblock Plus.">
+<!ENTITY typeSelector.other.label "Ki&amp;ta bÄ—da">
+<!ENTITY emailComment.label "Mes raginame įvesti veikiantį el. pašto adresą, tada jei turėsime klausimų galėsime jums juos užduoti. Taipogi tai padės atpažinti jūsų pranešimus ir suteikti jiems aukštesnį prioritetą.">
+<!ENTITY issues.whitelist.remove.label "Šiame puslapyje pakartotinai įjungti Adblock Plus">
+<!ENTITY outdatedSubscriptions.description "Šios filtrų prenumeratos nebuvo atnaujintos bent dvi savaites. Prieš siųsdami pranešimą atnaujinkite šias prenumeratas, gali būti jog problema jau išspręsta.">
+<!ENTITY dataCollector.description "Palaukite kelias akimirkas, kol Adblock Plus surinks reikalingus duomenis.">
+<!ENTITY sendButton.label "Siųsti p&amp;ranešimą">
+<!ENTITY comment.label "&amp;Komentaras (nebūtinas):">
+<!ENTITY sendPage.errorMessage "Bandymas išsiųsti pranešimą nepavyko, buvo gauta klaida &quot;?1?&quot;. Įsitikinkite jog
+esate prisijungę prie interneto ir bandykite dar kartą. Jei problema vis dar yra paprašykite
+pagalbos forume [link]Adblock Plus forumas[/link].">
+<!ENTITY showRecentReports.label "Rodyti nesenai praneštas problemas">
+<!ENTITY commentPage.heading "Parašykite komentarą">
+<!ENTITY update.start.label "PradÄ—ti atnaujinimÄ…">
+<!ENTITY issues.disabledfilters.description "Šie filtrai yra išjungti, nors jie gali turėti įtakos šiam puslapiui:">
+<!ENTITY screenshot.description "Tas pats puslapis skirtingiems žmonėms, atrodo skirtingai. Mums gali padėti
+prisegtas ekrano vaizdas. Jūs galite pašalinti sritis kuriose
+gali būti neviešos informacijos, taip pat ir tas kuriose
+nesimato problemos. Norint tai padaryti paspauskite atitinkamÄ… mygtukÄ… ir pasirinkite
+reikalingą paveiksliuko dalį su pele.">
+<!ENTITY screenshot.attach.label "P&amp;rie pranešimo pridėti puslapio vaizdą">
+<!ENTITY issues.whitelist.description "Šiuo metu, šiame puslapyje Adblock Plus yra išjungtas. Prašau įjungti jį
+ir perkrauti puslapį prieš pranešant apie problemą kuriai
+spręsti norite pagalbos.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus neblokuoja &amp;reklamų">
+<!ENTITY typeSelector.heading "Pasirinkite tipÄ…">
+<!ENTITY anonymity.warning "Mes negalÄ—sime grįžti prie jÅ«sų ir greiÄiausiai jÅ«sų ataskaitai bus priskirtas žemas prioritetas.">
+<!ENTITY wizard.title "Klaidos pranešimas">
+<!ENTITY issues.ownfilters.disable.label "Išjungti filtrą">
+<!ENTITY commentPage.description "Teksto įvedimo laukelis leidžia jums įvesti komentarą kuris mums padės suprasti jūsų problemą.
+Šis žingsnis nebūtinas, bet rekomenduojamas jei problema neaiški.
+Taipogi galite peržiÅ«rÄ—ti praneÅ¡imÄ… prieÅ¡ jį siunÄiant.">
+<!ENTITY comment.lengthWarning "Jūsų komentaras ilgesnis nei 1000 simbolių. Bus išsiųsti tik pirmi 1000 simbolių.">
+<!ENTITY typeSelector.falseNegative.description "Pasirinkite šią pasirinkty jei reklama rodoma, net ir
+įjungus Adblock Plus.">
+<!ENTITY sendPage.waitMessage "Palaukite kol Adblock Plus siunÄia jÅ«sų praneÅ¡imÄ….">
+<!ENTITY dataCollector.heading "Sveiki atvykę į klaidų pranešėją">
+<!ENTITY screenshot.heading "Pridėti ekranvaizdį">
+<!ENTITY sendPage.heading "Siųsti pranešimą">
+<!ENTITY issues.subscriptionCount.description "Atrodo jūs prenumeruojate perdaug filtrų prenumeratų. Tokie nustatymai
+rekomenduojami, nes tai sumažins problemų tikimybes.
+Taipogi mes negalime priimti jūsų pranešimo, nes
+neaišku kurio filtro autorius turėtų imtis veiksmų. Prašome
+pašalinti visus tikrai reikalingas filtrų prenumeratas ir
+patikrinti ar problema vis dar yra.">
+<!ENTITY screenshot.mark.label "Paž&amp;ymėti problemą">
+<!ENTITY privacyPolicy.label "Privatumo politika">
+<!ENTITY issues.description "Adblock Plus nustatė klaidų jūsų konfigūracijoje kurios gali būti atsakingos
+dėl šios problemos arba gali apsunkinti problemų sprendimą.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/sidebar.dtd
new file mode 100644
index 0000000..4649d2e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Paryškinti elemento rėmelį">
+<!ENTITY address.label "Adresas">
+<!ENTITY context.open.label "Atverti naujoje kortelÄ—je">
+<!ENTITY type.label "Tipas">
+<!ENTITY tooltip.filterSource.label "Filtro šaltinis:">
+<!ENTITY noitems.label "Nėra blokuojamų elementų">
+<!ENTITY filter.label "Filtras">
+<!ENTITY tooltip.size.label "Dydis:">
+<!ENTITY reattach.label "Iš naujo įkelti">
+<!ENTITY search.label "&amp;Ieškoti:">
+<!ENTITY docDomain.thirdParty "(treÄioji Å¡alis)">
+<!ENTITY filterSource.label "Filtruoti pirminį kodą">
+<!ENTITY tooltip.docDomain.label "Dokumento šaltinis:">
+<!ENTITY context.copy.label "Kopijuoti elemento adresÄ…">
+<!ENTITY tooltip.type.label "Tipas:">
+<!ENTITY context.disablefilter.label "Išjungti filtrą ?1?">
+<!ENTITY context.copyFilter.label "Kopijuoti filtrÄ…">
+<!ENTITY context.block.label "Blokuoti šį elementą">
+<!ENTITY context.enablefilter.label "Iš naujo įjungti filtrą ?1?">
+<!ENTITY detach.label "Iškelti">
+<!ENTITY whitelisted.label "Tinklalapis įtrauktas į išimtis">
+<!ENTITY context.disablefilteronsite.label "Išjungti šį filtrą tinklalapiui ?1?">
+<!ENTITY detached.title "„Adblock Plus“ blokuojami elementai (iškelta)">
+<!ENTITY docDomain.firstParty "(pagrindinis)">
+<!ENTITY tooltip.type.whitelisted "(įtraukta į išimtis)">
+<!ENTITY tooltip.filter.label "Galiojantys filtrai:">
+<!ENTITY tooltip.filter.disabled "(išjungta)">
+<!ENTITY context.editfilter.label "Redaguoti aktyvų filtrą">
+<!ENTITY tooltip.type.blocked "(užblokuota)">
+<!ENTITY size.label "Dydis">
+<!ENTITY context.whitelist.label "Pridėti išimties taisyklę šiam elementui">
+<!ENTITY context.selectAll.label "Pažymėti viską">
+<!ENTITY state.label "Būsena">
+<!ENTITY docDomain.label "Dokumento šaltinis">
+<!ENTITY tooltip.address.label "Adresas:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/subscriptionSelection.dtd
new file mode 100644
index 0000000..dfcc0f7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lt/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "T&amp;aip pat pridÄ—ti filtro prenumeratÄ… &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plus nepavyko gauti prenumeratų sąrašo.">
+<!ENTITY list.download.retry "Bandykite dar kartÄ…">
+<!ENTITY title.label "&amp;Prenumeratos pavadinimas:">
+<!ENTITY list.download.website "Rodyti tinklalapį">
+<!ENTITY supplementMessage "Ši filtrų prenumerata skirta naudoti kartu su &quot;?1?&quot; filtrų prenumerata, kurios jūs kol kas nenaudojate.">
+<!ENTITY viewList.label "Rodyti filtrus">
+<!ENTITY visitHomepage.label "Aplankyti tinklalapį">
+<!ENTITY addSubscription.label "PridÄ—ti prenumeratÄ…">
+<!ENTITY dialog.title "Pridėti „Adblock Plus“ filtro prenumeratą">
+<!ENTITY location.label "Filtrų sąrašo &amp;vieta:">
+<!ENTITY fromWeb.description "Patvirtinkite jog norite pridėti šią prenumeratą. Prieš įdedant prenumeratą jūs galite pakeisti jos pavadinimą ar vietą.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/composer.dtd
new file mode 100644
index 0000000..08bd7d8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "adreses beigÄs">
+<!ENTITY domainRestriction.label "Ierobežot līdz domēnam:">
+<!ENTITY collapse.default.no.label "Lietot noklusēto vērtību (nē)">
+<!ENTITY firstParty.label "Tikai pirmÄs puses">
+<!ENTITY preferences.label "RÄdÄ«t esoÅ¡os filtrus...">
+<!ENTITY pattern.label "Meklēt paraugu">
+<!ENTITY thirdParty.label "Tikai treÅ¡Äs puses">
+<!ENTITY filter.label "Jauns filtrs:">
+<!ENTITY collapse.label "Bloķēts sabrukums:">
+<!ENTITY match.warning "Modeli ko jus ievadijat vairs neatbilst adresei bloketiem/baltulistetiem un neizveidos nekad effektu uz ta.">
+<!ENTITY anchor.start.label "adreses sÄkumÄ">
+<!ENTITY matchCase.label "Saderīgs gadījums">
+<!ENTITY custom.pattern.label "PielÄgots:">
+<!ENTITY unselectAllTypes.label "Izvēlēties nevienu">
+<!ENTITY type.whitelist.label "Izņēmuma nosacījums">
+<!ENTITY regexp.warning "Modelis kuru jÅ«s ievadÄ«jÄt tika interpretÄ“ts kÄ regulÄra izteiksme, ko Adblock Plus nevar efektÄ«vi apstrÄdÄt un tas var palÄ“ninÄt jÅ«su pÄrlÅ«koÅ¡anas Ätrumu. Ja jÅ«s neplÄnojat izmantot regulÄru izteiksmi, pievienojiet zvaigznÄ«ti (*) parauga beigÄs.">
+<!ENTITY dialog.title "Pievienot Adblock Plus filtra nosacījumu">
+<!ENTITY basic.label "Pamata skatījums">
+<!ENTITY type.filter.label "Bloķēšanas filtrs">
+<!ENTITY types.label "Pielietot tipiem:">
+<!ENTITY shortpattern.warning "Paraugs, kuru jÅ«s ievadÄ«jÄt, ir pÄrÄk Ä«ss, lai bÅ«tu optimizÄ“ts un tas var palÄ“ninÄt jÅ«su pÄrlÅ«koÅ¡anu. Ieteicams izvÄ“lÄ“ties garÄku virkni Å¡im filtram, lai Adblock Plus varÄ“tu apstrÄdÄt filtru efektÄ«vÄk.">
+<!ENTITY collapse.yes.label "JÄ">
+<!ENTITY anchors.label "ApstiprinÄt tiaki paraugus:">
+<!ENTITY collapse.default.yes.label "Lietot noklusÄ“to vÄ“rtÄ«bu (jÄ)">
+<!ENTITY domainRestriction.help "Izmantojiet Å¡o opciju, lai precizÄ“tu vienu vai vairÄkus domÄ“nus, atdalÄ«tus ar joslu lÄ«niju (|). Filtrs tiks attiecinÄts tikai uz izvÄ“lÄ“to domÄ“nu(-iem). Tilde (~) pirms domÄ“na vÄrda norÄda, ka filtrs netiek piemÄ“rots attiecÄ«bÄ uz Å¡o domÄ“nu.">
+<!ENTITY accept.label "Pievienot filtru">
+<!ENTITY options.label "Opcijas">
+<!ENTITY disabled.warning "Adblock Plus Å¡obrÄ«d ir atspÄ“jots. JÅ«s joprojÄm varat pievienot filtrus, bet tie netiks piemÄ“roti tik ilgi, kamÄ“r jÅ«s [link]neiespÄ“josiet Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "domÄ“na vÄrda sÄkumÄ">
+<!ENTITY collapse.no.label "NÄ“">
+<!ENTITY selectAllTypes.label "Izvēlēties visu">
+<!ENTITY advanced.label "PaplaÅ¡inÄts skatÄ«jums">
+<!ENTITY pattern.explanation "Paraugs var bÅ«t jebkura daļa no adreses, zvaigznÄ«te (*) darbojas kÄ aizstÄjÄ“jzÄ«me. Filtrs var tikt piemÄ“rots tikai adresei, kas atbilst paredzÄ“tajam modelim.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/filters.dtd
new file mode 100644
index 0000000..f7c466f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Visi JÅ«su pielÄgotie filtri tiks aizvietori ar izvÄ“lÄ“tÄ faila saturu. Vai vÄ“laties turpinÄt?">
+<!ENTITY slow.column "Lēni filtri">
+<!ENTITY enabled.column "Iespējots">
+<!ENTITY subscription.lastDownload.checksumMismatch "NeizdevÄs, kontrolsummas neatbilstÄ«ba">
+<!ENTITY noFiltersInGroup.text "IzvÄ“lÄ“tÄ grupa ir tukÅ¡sa.">
+<!ENTITY subscription.actions.label "Darbības">
+<!ENTITY filter.selectAll.label "Izvēlēties visu">
+<!ENTITY backupButton.label "Dublējumkopiju izveide un atjaunošana">
+<!ENTITY restore.minVersion.warning "BrÄ«dinÄjums: fails ir izveidots, izmantojot jaunÄku Adblock Plus versiju. Jums nepiecieÅ¡ams atjauninÄt Adblock Plus, pirms turpinÄt atjaunoÅ¡anu no šī faila.">
+<!ENTITY restore.error "Faila dati nevar tikt apstrÄdÄti, varbÅ«t tas nav Adblock Plus rezerves kopijas fails?">
+<!ENTITY sort.ascending.label "A &gt; Z kÄrtoÅ¡anas secÄ«ba">
+<!ENTITY sort.label "KÄrtot pÄ“c">
+<!ENTITY subscription.source.label "Filtru saraksts">
+<!ENTITY hitcount.column "Klikšķi">
+<!ENTITY noFilters.text "Jums vēl nav pielagotus filtrus.">
+<!ENTITY backup.custom.title "Tikai pielÄgotie filtri">
+<!ENTITY subscription.external.label "AtjauninÄts ar citu paplaÅ¡inÄjumu">
+<!ENTITY subscription.delete.label "Dzēst">
+<!ENTITY noGroupSelected.text "Jums ir nepiecieÅ¡ams izvÄ“lÄ“ties filtra grupu pirms tÄs filtrus var parÄdÄ«t.">
+<!ENTITY filter.cut.label "Izgriezt">
+<!ENTITY restore.default.label "Atjaunot rezerves kopiju no ?1?">
+<!ENTITY subscription.lastDownload.inProgress "LejupielÄdÄ“...">
+<!ENTITY subscriptions.tab.label "Filtra abonementi">
+<!ENTITY sort.descending.label "Z &gt; A kÄrtoÅ¡anas secÄ«ba">
+<!ENTITY filters.remove.warning "Vai tieÅ¡Äm vÄ“laties noņemt visus atlasÄ«tos filtrus?">
+<!ENTITY filter.delete.label "Dzēst">
+<!ENTITY addSubscriptionAdd.label "Pievienot">
+<!ENTITY viewMenu.label "Skatīt">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY addSubscriptionCancel.label "Atcelt">
+<!ENTITY subscription.enabled.label "Iespējota">
+<!ENTITY noSubscriptions.text "Jūs līdz šim neesat pievienojis nevienu filra abonementu. Adblock Plus neko nebloķēs bez filtriem, lūdzam lietot &quot;Pievienot filtra abonementu&quot;, lai tos pievienotu.">
+<!ENTITY subscription.update.label "AtjauninÄt filtrus">
+<!ENTITY dialog.title "Adblock Plus filtra prioritÄtes">
+<!ENTITY addFilter.label "Pievienot Filtru">
+<!ENTITY subscription.minVersion.warning "Å o filtru abonēšanai nepiecieÅ¡ama jaunÄka versija Adblock Plus, tadel jums vajadzÄ“tu atjauninÄt ar jaunÄko Adblock Plus versiju.">
+<!ENTITY subscription.lastDownload.invalidURL "NeizdevÄs, nav derÄ«ga adrese">
+<!ENTITY backup.error "RadÄs kļūda, ierakstot filtrus failÄ. PÄrliecinieties, ka fails nav aizsargÄts pret ierakstu vai netiek izmantots citÄ lietojumprogrammÄ.">
+<!ENTITY filter.moveUp.label "PÄrvietot uz augÅ¡u">
+<!ENTITY addGroup.label "Pievienot filtra grupu">
+<!ENTITY filter.edit.label "Rediģēt">
+<!ENTITY subscription.showHideFilters.label "RÄdÄ«t/paslÄ“pt filtrus">
+<!ENTITY acceptableAds2.label "Atļaut dažas neuzbÄzÄ«gas reklÄmas">
+<!ENTITY addSubscriptionOther.label "Pievienot citu abonementu">
+<!ENTITY close.label "Aizvērt">
+<!ENTITY sort.none.label "NesakÄrtots">
+<!ENTITY filter.actions.label "Filtra darbību">
+<!ENTITY filter.copy.label "Kopēt">
+<!ENTITY filter.moveDown.label "PÄrvietot uz leju">
+<!ENTITY filter.resetHitCounts.label "Atiestatīt izmantojumu statistiku">
+<!ENTITY readMore.label "LasÄ«t vairÄk">
+<!ENTITY subscription.moveUp.label "PÄrvietot uz augÅ¡u">
+<!ENTITY addSubscription.label "Pievienot filtra abonēšanu">
+<!ENTITY subscription.homepage.label "MÄjas lapa">
+<!ENTITY backup.complete.title "Visi filtri un abonementi">
+<!ENTITY restore.own.label "Atjaunot paša rezerves kopiju">
+<!ENTITY restore.complete.warning "Visas JÅ«su filtru prioritÄtes tiks aizvietotas ar izvÄ“lÄ“tÄ faila saturu. Vai vÄ“laties turpinÄt?">
+<!ENTITY filters.tab.label "PielÄgoti filtrus">
+<!ENTITY backup.label "Izveidot jaunu rezerves kopiju">
+<!ENTITY find.label "Meklēt">
+<!ENTITY subscription.moveDown.label "PÄrvietot uz leju">
+<!ENTITY subscription.lastDownload.connectionError "NeizdevÄs, lejupielÄde neizdevÄs">
+<!ENTITY subscription.lastDownload.success "IzdevÄs">
+<!ENTITY subscription.lastDownload.invalidData "NeizdevÄs, nav derÄ«gs filtru saraksts">
+<!ENTITY filter.paste.label "Ielīmēt">
+<!ENTITY subscription.disabledFilters.enable "Iespējot atspējotie filtri">
+<!ENTITY lasthit.column "Pēdējai klikšķis">
+<!ENTITY subscription.editTitle.label "Rediģēt nosaukumu">
+<!ENTITY subscription.disabledFilters.warning "Daži filtri šo abonementu ir atspējotas.">
+<!ENTITY filter.column "Filtra noteikumi">
+<!ENTITY subscription.lastDownload.label "PÄ“dÄ“jÄ lejupielÄde:">
+<!ENTITY viewList.label "Skatīt sarakstu">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/firstRun.properties
new file mode 100644
index 0000000..efbd94e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=PÄrlÅ«kot privÄti, atspÄ“jojot izsekoÅ¡anu - slÄ“pjot JÅ«su pÄ“das no reklÄmas kompÄnijÄm, kuras varÄ“tu izsekot katru JÅ«su kustÄ«bu.
+firstRun_toggle_off=IZSLÄ’GTS
+firstRun_feature_tracking=Atspējot izsekošanu
+firstRun_feature_malware=Bloķēt ļaundabīgas programmas
+firstRun_title=AdblockPlus ir uzstÄdÄ«ts
+firstRun_acceptableAdsExplanation=MÄ“s vÄ“lÄ“tos veicinÄt vienkÄrÅ¡u, neuzbÄzÄ«gu reklÄmu lietoÅ¡anu vietnÄ“s. TÄpÄ“c esam izveidojuÅ¡i <a>stingras vadlÄ«nijas</a> pieņemamo reklÄmu noteikÅ¡anai, kuras parÄdÄ«tas noklusÄ“juma iestatÄ«jumos. Ja JÅ«s joprojÄm vÄ“laties bloÄ·Ä“t pilnÄ«gi visas reklÄmas, JÅ«s varat <a>atspÄ“jot</a> Å¡o pÄ“c dažÄm sekundÄ“m.
+firstRun_toggle_on=IESLÄ’GTS
+firstRun_contributor_credits=ZiedotÄju saraksts
+firstRun_dataCorruptionWarning=Vai šī lapa turpina attēloties? <a>Spied šeit!</a>
+firstRun_acceptableAdsHeadline=UzmÄcÄ«gas reklÄmas turpmÄk tiks bloÄ·Ä“tas
+firstRun_share=PastÄsti saviem draugiem
+firstRun_share_headline=<a>PalÄ«dzi mums</a> padarÄ«t tÄ«klu par labÄku vietu
+firstRun_features=AdblockPlus var izdarÄ«t vairÄk, ne tikai bloÄ·Ä“t reklÄmas
+firstRun_feature_malware_description=PadarÄ«t JÅ«su pÄrlÅ«koÅ¡anu droÅ¡Äku, bloÄ·Ä“jot zinÄmos ļaundabÄ«go programmu avotus.
+firstRun_feature_social_description=AutomÄtiski atbrÄ«vot JÅ«su pÄrlÅ«koÅ¡anas procesu no tÄdÄm sociÄlo mediju pogÄm kÄ Facebook Live, kas parÄdÄs interneta lapÄs un izseko JÅ«su darbÄ«bu.
+firstRun_donate=ziedot
+firstRun_donate_label=Atbalstīt mūsu projektu
+firstRun_feature_social=Noņemt sociÄlo mediju pogas
+firstRun_legacySafariWarning=JÅ«s izmantojat novecojuÅ¡u Safari versiju, kuru Adblock Plus neatbalsta. Tas var nedarboties pareizi vai pasliktinÄt lietotÄja pieredzi dažÄs vietnÄ“s. MÄ“s uzstÄjÄ«gi iesakÄm Jums atjauninÄt Safari lÄ«dz 6. vai vÄ“l jaunÄkai versijai (pieejama Mac OS X 10.8 Mountain Lion un augstÄk) jeb lietot Mozilla Firefox, Google Chrome vai Opera jaunÄkÄs versijas.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/global.properties
new file mode 100644
index 0000000..4eb9bdf
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=PaÅ¡reizÄ“jÄ lapÄ nav bloÄ·Ä“jamu vienÄ«bu
+action3_tooltip=Noklikšķiniet, lai aktivizētu/deaktivizētu Adblock Plus.
+notification_antiadblock_title=slēpt mērķtiecīgas ziņas?
+type_label_script=skripts
+filter_elemhide_nocriteria=Elementa paslÄ“pÅ¡anai nav norÄdÄ«ts neviens kritÄ“rijs
+blockingGroup_title=ReklÄmu bloķēšanas noteikumi
+whitelisted_tooltip=PaÅ¡reizÄ“jÄ lapÄ Adblock Plus ir deaktivizÄ“ts.
+type_label_stylesheet=stila lapa
+blocked_count_tooltip=?1? no ?2?
+type_label_font=fonts
+type_label_popup=uzlecošais logs
+filter_regexp_tooltip=Å is filtrs ir vai nu regulÄrÄ izteiksme vai arÄ« pÄrÄk Ä«ss, lai tiktu optimizÄ“ts. PÄrÄk daudz Å¡Ädu filtru var palÄ“ninÄt JÅ«su parlÅ«koÅ¡anu.
+action0_tooltip=Noklikšķiniet, lai parÄdÄ«tu konteksta izvÄ“lni, vidÄ“jais klikšķis, lai aktivizÄ“tu/deaktivizÄ“tu.
+whitelisted_page=PaÅ¡reizÄ“jÄ lapÄ Adblock Plus ir ticis deaktivizÄ“ts.
+remove_group_warning=Vai tieÅ¡Äm vÄ“laties noņemt Å¡o grupu?
+action1_tooltip=Noklikšķiniet, lai atvÄ“rtu aizvÄ“rtu bloÄ·Ä“jamÄs vienÄ«bas, vidÄ“jais klikšķis, lai aktivizÄ“tu/deaktivizÄ“tu.
+type_label_xmlhttprequest=XML pieprasījums
+active_tooltip=Adblock Plus ir aktivizÄ“ts, ?1? filtru abonementi un ?2? pielÄgotie filtri tiek izmantoti.
+type_label_document=dokuments
+type_label_object_subrequest=objekta apakš-pieprasījums
+whitelistGroup_title=Izņēmuma noteikumi
+disabled_tooltip=Adblock Plus ir deaktivizēts.
+filter_elemhide_duplicate_id=Tikai viens paslÄ“pjamÄ elementa ID drÄ«kst tikt norÄdÄ«ts.
+type_label_object=objekts
+action2_tooltip=Noklikšķiniet, lai atvērtu iestatījumus, vidējais klikšķis, lai aktivizētu/deaktivizētu.
+type_label_subdocument=rÄmis
+clearStats_warning=Å Ä« darbÄ«ba atiestatÄ«s visu filtra izmantojumu statistiku un atspÄ“jos tÄs uzskaiti. Vai vÄ“laties turpinÄt?
+notification_antiadblock_message=Å Ä« vietne ir zinÄma, lai parÄdÄ«tu mÄ“rÄ·tiecÄ«gas ziņas Adblock Plus lietotÄjiem. Vai jÅ«s vÄ“laties, Adblock Plus slÄ“pt mÄ“rÄ·tiecÄ«gas ziņas?
+blocked_count_addendum=(arÄ«, baltajÄ sarakstÄ: ?1?, slÄ“pti: ?2?)
+subscription_invalid_location=Filtru saraksta atraÅ¡anÄs vieta nav ne derÄ«gs URL ne arÄ« derÄ«gs faila nosaukums.
+type_label_image=attēls
+remove_subscription_warning=Vai JÅ«s tieÅ¡Äm vÄ“laties noņemt Å¡o abonementu?
+type_label_other=cits
+mobile_menu_enable=ABP: Ieslēgts
+type_label_media=audio/video
+mobile_menu_disable_site=ABP: Atspējotu uz ?1?
+elemhideGroup_title=Elementu paslēpšanas noteikumi
+mobile_menu_enable_site=ABP: Iespējot uz ?1?
+type_label_elemhide=paslēpts
+newGroup_title=Jaunu filtru grupas
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/overlay.dtd
new file mode 100644
index 0000000..030d111
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp; JÄ">
+<!ENTITY notification.button.no "&amp; NÄ“">
+<!ENTITY sync.label "Sinhronizet Adblock Plus uzstÄdÄ«jumus">
+<!ENTITY whitelist.site.label "Atspējot uz ?1?">
+<!ENTITY filters.label "Filtra preferences">
+<!ENTITY disable.label "Atspējot visur">
+<!ENTITY objecttab.title "Bloķēt">
+<!ENTITY objecttab.tooltip "Noklikšķiniet šeit, lai bloķētu šo objektu ar Adblock Plus">
+<!ENTITY menuitem.label "Adblock Plus Iestatījumi">
+<!ENTITY objecttabs.label "RÄdÄ«&amp;t cilnes Flash un Java">
+<!ENTITY sendReport.label "&amp;Ziņot par problÄ“mÄm Å¡ajÄ lapÄ">
+<!ENTITY whitelist.page.label "AtspÄ“jot tikai Å¡ajÄ lapÄ">
+<!ENTITY context.image.label "Adblock Plus: Bloķēt attēlu">
+<!ENTITY counthits.label "Skaitīt filtra izmantojumus">
+<!ENTITY opensidebar.label "AtvÄ“rt bloÄ·Ä“jamÄs vienÄ«bas">
+<!ENTITY notification.button.close "&amp; Aizvērt">
+<!ENTITY contribute.label "Palīdziet Adblock Plus veidošanai, tulkošanai...">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: BloÄ·Ä“t rÄmi">
+<!ENTITY blocked.tooltip "BloÄ·Ä“tÄs vienÄ«bas Å¡ajÄ lapÄ:">
+<!ENTITY hideplaceholders.label "Noslēpt bloķēto elementu vietturus">
+<!ENTITY showinstatusbar.label "RÄdÄ«t stÄvokļa joslÄ">
+<!ENTITY sidebar.title "BloÄ·Ä“jamÄs vienÄ«bas Å¡ajÄ lapÄ">
+<!ENTITY options.label "Iespējas">
+<!ENTITY context.object.label "Adblock Plus: Bloķēt objektu">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: IespÄ“jot Å¡ajÄ lapÄ">
+<!ENTITY filters.tooltip "VisaktÄ«vÄkie filtri:">
+<!ENTITY closesidebar.label "AizvÄ“rt bloÄ·Ä“jamÄs vienÄ«bas">
+<!ENTITY showintoolbar.label "RÄdÄ«t rÄ«kjoslÄ">
+<!ENTITY status.tooltip "Statuss:">
+<!ENTITY context.media.label "Adblock Plus: Bloķēt audio/video">
+<!ENTITY subscription.update.label "AtjauninÄt filtrus">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/sendReport.dtd
new file mode 100644
index 0000000..5881de0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Atsa&amp;ukt">
+<!ENTITY issues.disabledgroups.description "Sekojošie filtru abonementi / filtru grupas ir atslēgti, tomēr tiem ir ietekme uz šo lapu:">
+<!ENTITY showData.label "RÄdÄ«t ziņojuma datus">
+<!ENTITY typeSelector.falsePositive.label "A&amp;dblock Plus bloÄ·Ä“ pÄrÄk daudz">
+<!ENTITY issues.change.description "JÅ«su konfigurÄcija ir izmanÄ«ta. LÅ«dzu pÄrlÄdÄ“jiet lapu, lai pÄrbaudÄ«tu izmaiņas un nosÅ«tÄ«tu ziņojumu, ja izmaiņas nav novÄ“rsuÅ¡as problÄ“mu.">
+<!ENTITY email.label "E-&amp;pasts:">
+<!ENTITY issues.openPreferences.label "Atvērt filtru iestatījumus">
+<!ENTITY sendPage.confirmation "JÅ«su ziņojums ir saglabÄts. JÅ«s tam varat piekļūt sekojoÅ¡ajÄ adresÄ“:">
+<!ENTITY copyLink.label "&amp;Kopēt ziņojuma saiti">
+<!ENTITY issues.nofilters.description "PaÅ¡reizÄ“jÄ lapÄ Adblock Plus neko nebloÄ·Ä“. ProblÄ“ma, ko JÅ«s pieredzat visticamÄk ir nesaistÄ«ta ar Adblock Plus.">
+<!ENTITY sendPage.knownIssue "JÅ«su nosÅ«tÄ«tais problÄ“ma iespÄ“jams jau ir zinÄma. VairÄk informÄcija:">
+<!ENTITY typeSelector.other.description "IzvÄ“laties Å¡o opciju ja JÅ«s nojauÅ¡at problÄ“mu ar paÅ¡u Adblock Plus nevis tÄ filtriem.">
+<!ENTITY issues.disabledgroups.enable.label "Ievadīt filtru abonementu / filtru grupu">
+<!ENTITY typeWarning.override.label "Es saprotu un vienalga vēlos nosūtīt ziņojumu">
+<!ENTITY issues.disabled.enable.label "Iespējot Adblock Plus">
+<!ENTITY update.fixed.description "JÅ«su filtru abonementu atjauninÄjums acÄ«mredzot atrisinÄja problÄ“mu, par kuru ziņojÄt. LÅ«dzu, pÄrlÄdÄ“jiet lapu un mēģiniet vÄ“lreiz. Ziņojiet atkÄrtoti, ja problÄ“ma saglabÄjas.">
+<!ENTITY anonymous.label "Anonīms iesniegums">
+<!ENTITY reloadButton.label "PÄr&amp;lÄdÄ“t lapu">
+<!ENTITY recentReports.clear.label "&amp;Noņemt visus ziņojumus">
+<!ENTITY typeSelector.description "Å is log JÅ«s vedÄ«s cauri nepiecieÅ¡amajiem soļiem, lai nosÅ«tÄ«tu Adblock Plus problÄ“mu ziņojumu. Vispirms, lÅ«dzu izvÄ“lieties tipu problÄ“mai, ko JÅ«s pieredzat Å¡ajÄ lapÄ:">
+<!ENTITY screenshot.remove.label "&amp;Noņemt jÅ«tÄ«gu informÄciju">
+<!ENTITY issues.ownfilters.description "Daži no Å¡ajÄ lapÄ pielietotajiem filtriem ir lietotÄja izveidoti. LÅ«dzu atslÄ“dziet filtrus, kas varÄ“ja izraisÄ«t Å¡o problÄ“mu:">
+<!ENTITY update.inProgress.description "Adblock Plus ir nepiecieÅ¡ams atjauninÄt filtru abonementus, lai pÄrliecinÄtos, vai jau nav atrisinÄts jautÄjums. LÅ«dzu, uzgaidiet...">
+<!ENTITY sendPage.retry.label "Sūtīt vēlreiz">
+<!ENTITY data.label "&amp;Ziņojuma dati:">
+<!ENTITY recentReports.label "Jūsu nesen nosūtītie ziņojumi">
+<!ENTITY typeWarning.description "JÅ«s norÄdÄ«jÄt, ka vÄ“laties ziņot par vispÄrÄ“ju Adblock Plus problÄ“mu nevis problÄ“mu ar filtriem. Par Å¡ÄdÄm problÄ“mÄm vislabÄk ir paziņot [link]Adblock Plus forumÄ[/link]. Å o problÄ“mu ziņotÄju vajadzÄ“tu izmantot tikai lai papildinÄtu esoÅ¡u diskusiju, jo neviens neredzÄ“s JÅ«su ziņojumu, ja JÅ«s nenodroÅ¡inÄs viņus ar saiti uz to. AutomÄtiski Ä£enerÄ“tÄ saite tiks nodroÅ¡inÄta pÄ“c ziņojuma nosÅ«tīšanas.">
+<!ENTITY issues.disabled.description "Adblock Plus ir atspÄ“jots, paÅ¡reizÄ“jÄ stÄvoklÄ« tas nebloÄ·Ä“s neko.">
+<!ENTITY attachExtensions.label "Pievienot ziņojumam sarakstu ar aktÄ«viem papil&amp;dinÄjumiem, gadÄ«jumÄ, ja kÄds papildinÄjums izraisa problÄ“mu">
+<!ENTITY issues.nosubscriptions.add.label "Pievienot filtru abonementu">
+<!ENTITY issues.disabledfilters.enable.label "Iespējot filtru">
+<!ENTITY issues.override.label "&amp;KonfigurÄcija ir pareiza, varat turpinÄt ziņojumu">
+<!ENTITY issues.nosubscriptions.description "IzskatÄs, ka JÅ«s neabonÄ“jat nevienu no gatavajiem sarakstiem, kuri automÄtiski noņem nevajadzÄ«go saturu no mÄjas lapÄm.">
+<!ENTITY typeSelector.falsePositive.description "IzvÄ“laties Å¡o opciju, ja lai trÅ«kst svarÄ«ga saturam tÄ tiek nepareizi attÄ“lota vai nefunkcionÄ“ pareizi. JÅ«s varat noteikt vai to izraisa Adblock Plus, to Ä«slaicÄ«gi atslÄ“dzot.">
+<!ENTITY typeSelector.other.label "&amp;Cita problēma">
+<!ENTITY emailComment.label "MÄ“s aicinÄm JÅ«s ievadÄ«t derÄ«gu e-pasta adresi, lai mÄ“s varÄ“tu ar Jums kontaktÄ“ties, ja radÄ«sies papildus jautÄjumi par JÅ«su ziņojumu. TÄ palÄ«dzÄ“s mums arÄ« atpazÄ«t JÅ«su ieguldÄ«jumu un piešķirt tam augstÄku prioritÄti.">
+<!ENTITY issues.whitelist.remove.label "IespÄ“jot Adblock Plus Å¡ajÄ lapÄ">
+<!ENTITY outdatedSubscriptions.description "SekojoÅ¡ie filtru abonementi nav atjauninÄti vismaz divas nedēļas. LÅ«dzu, atjauniniet Å¡os abonementus pirms ziņojuma apstiprinÄÅ¡anas, jo problÄ“ma jau var bÅ«t atrisinÄta.">
+<!ENTITY dataCollector.description "Uzgaidiet pÄris mirkļus, kamÄ“r Adblock Plus apkopo nepiecieÅ¡amos datus.">
+<!ENTITY sendButton.label "&amp;Sūtīt ziņojumu">
+<!ENTITY comment.label "&amp;KomentÄrs (nav obligÄti):">
+<!ENTITY sendPage.errorMessage "MēģinÄjums sÅ«tÄ«t ziņojumu neizdevÄs. Kļūdas kods &quot;?1?&quot;. LÅ«dzu pÄrliecinieties, ka Jums ir savienojums ar internetu un mēģiniet vÄ“lreiz. Ja problÄ“ma atkÄrtojas, lÅ«dzu prasiet palÄ«dzÄ«bu [link]Adblock Plus forumÄ[/link].">
+<!ENTITY showRecentReports.label "ParÄdÄ«t nesen nosÅ«tÄ«tos ziņojumus">
+<!ENTITY commentPage.heading "Pievienojiet komentÄru">
+<!ENTITY update.start.label "Tagad sÄktu atjauninÄÅ¡anu">
+<!ENTITY issues.disabledfilters.description "Sekojošie filtri ir atslēgt, tomēr tiem var būt ietekme uz šo lapu:">
+<!ENTITY screenshot.description "TÄ pati lapa var izskatÄ«ties atšķirÄ«gi dažÄdiem cilvÄ“kiem. Ja JÅ«s pievienosiet ekrÄn-Å¡Äviņu, tas mums palÄ«dzÄ“s izprast problÄ“mu. JÅ«s varat noņemt apgabalus, kas satur jÅ«tÄ«gu informÄciju kÄ arÄ« iezÄ«mÄ“t vietas, kur ir redzama problÄ“ma. Lai to izdarÄ«tu, noklikšķiniet uz atbilstoÅ¡Äs pogas un izvÄ“lieties apgabalu ar peli.">
+<!ENTITY screenshot.attach.label "&amp;Pievienot ziņojumam lapas attēlu">
+<!ENTITY issues.whitelist.description "Adblock Plus paÅ¡reiz ir atslÄ“gt lapÄ par kuru JÅ«s ziņojat. Lai palÄ«dzÄ“tu problÄ“mas izmeklēšanÄ, pirms ziņojuma sÅ«tīšanas lÅ«dzu ieslÄ“dziet to un atsvaidziniet lapu.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus nebloÄ·Ä“ &amp;reklÄmu">
+<!ENTITY typeSelector.heading "Izvēlieties problēmas tipu">
+<!ENTITY anonymity.warning "MÄ“s nevarÄ“sim ar Jums sazinÄties un visdrÄ«zÄk piešķirsim JÅ«su ziņojumam zemÄku prioritÄti.">
+<!ENTITY wizard.title "ProblÄ“mu ziņotÄjs">
+<!ENTITY issues.ownfilters.disable.label "Atspējot filtru">
+<!ENTITY commentPage.description "Teksta laukums ļauj Jums ierakstÄ«t komentÄru, lai palÄ«dzÄ“tu mums saprast problÄ“mu. Å is solis nav obligÄts, bet ir rekomendÄ“ts, ja problÄ“ma nav acÄ«mredzama. JÅ«s arÄ« varat pÄrskatÄ«t ziņojuma datus, pirms nosÅ«tīšanas.">
+<!ENTITY comment.lengthWarning "JÅ«su komentÄra garums pÄrsniedz 1000 simbolus. Tikai pirmie 1000 simboli tiks nosÅ«tÄ«ti.">
+<!ENTITY typeSelector.falseNegative.description "IzvÄ“laties Å¡o opciju ja reklÄma tiek attÄ“lota neskatoties uz to ka Adblock Plus ir ieslÄ“gts.">
+<!ENTITY sendPage.waitMessage "Lūdzu uzgaidiet kamēr Adblock Plus sūta Jūsu ziņojumu.">
+<!ENTITY dataCollector.heading "Laipni lÅ«dzu problÄ“mu ziņotÄjÄ">
+<!ENTITY screenshot.heading "Pievienojiet ekrÄn-Å¡Äviņu">
+<!ENTITY sendPage.heading "Sūtīt ziņojumu">
+<!ENTITY issues.subscriptionCount.description "IzskatÄs, ka JÅ«s abonÄ“jat pÄrÄk daudz abonementu. Å Äda konfigurÄcija netiek rekomendÄ“ta, jo tas palielina problÄ“mu iespÄ“jamÄ«bu. MÄ“s nespÄ“jam pieņemt ziņojumu, jo nav skaidrs kuram filtru abonementam ir jÄrÄ«kojas. LÅ«dzu noņemiet visu izņemot tieÅ¡Äm nepiecieÅ¡amos abonementus un pÄrbaudiet vai problÄ“ma joprojÄm pastÄv.">
+<!ENTITY screenshot.mark.label "Ie&amp;zīmēt problēmu">
+<!ENTITY privacyPolicy.label "PrivÄtuma politika">
+<!ENTITY issues.description "Adblock Plus ir atradis problÄ“mu JÅ«su konfigurÄcijÄ, kas varÄ“tu bÅ«t atbildÄ«ga par Å¡o problÄ“mu vai arÄ« apgrÅ«tinÄs ziņojuma izmeklēšanu.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/sidebar.dtd
new file mode 100644
index 0000000..97a127a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Flash vienības malas">
+<!ENTITY address.label "Adrese">
+<!ENTITY context.open.label "AtvÄ“rt jaunÄ cilnÄ“">
+<!ENTITY type.label "Tips">
+<!ENTITY tooltip.filterSource.label "Filtra avots:">
+<!ENTITY noitems.label "Nav bloķējamu vienību">
+<!ENTITY filter.label "Filtrs">
+<!ENTITY tooltip.size.label "Izmērs:">
+<!ENTITY reattach.label "Pievienot atpakaļ">
+<!ENTITY search.label "&amp;Meklēt:">
+<!ENTITY docDomain.thirdParty "(treÅ¡Ä puse)">
+<!ENTITY filterSource.label "Filtra avots">
+<!ENTITY tooltip.docDomain.label "Dokumenta avots:">
+<!ENTITY context.copy.label "Kopēt vienības adresi">
+<!ENTITY tooltip.type.label "Tips:">
+<!ENTITY context.disablefilter.label "Atspējot filtru ?1?">
+<!ENTITY context.copyFilter.label "Kopēt filtru">
+<!ENTITY context.block.label "Bloķēt šo vienību">
+<!ENTITY context.enablefilter.label "Iespējot filtru ?1?">
+<!ENTITY detach.label "Atdalīt">
+<!ENTITY whitelisted.label "Lapa ir baltajÄ sarakstÄ">
+<!ENTITY context.disablefilteronsite.label "Atspējot šo filtru ?1?">
+<!ENTITY detached.title "Adblock Plus: BloÄ·Ä“jamÄs vienÄ«bas (atdalÄ«ts)">
+<!ENTITY docDomain.firstParty "(pirmÄ puse)">
+<!ENTITY tooltip.type.whitelisted "(baltajÄ sarakstÄ)">
+<!ENTITY tooltip.filter.label "Aktīvais filtrs:">
+<!ENTITY tooltip.filter.disabled "(atspējots)">
+<!ENTITY context.editfilter.label "Rediģēt aktīvo filtru">
+<!ENTITY tooltip.type.blocked "(bloķēts)">
+<!ENTITY size.label "Izmērs">
+<!ENTITY context.whitelist.label "Pievienot izņēmuma noteikumu šai vienībai">
+<!ENTITY context.selectAll.label "Iezīmēt visu">
+<!ENTITY state.label "StÄvoklis">
+<!ENTITY docDomain.label "Dokumenta avots">
+<!ENTITY tooltip.address.label "Adrese:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/subscriptionSelection.dtd
new file mode 100644
index 0000000..dca19de
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/lv/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Pievienot arī filtra abonementu &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plus neizdevÄs ielÄdÄ“t abonentu sarakstu.">
+<!ENTITY list.download.retry "Mēģiniet vēlreiz">
+<!ENTITY title.label "Abonemen&amp;ta nosaukums:">
+<!ENTITY list.download.website "Skatīt tīmekļa vietni">
+<!ENTITY supplementMessage "Å Ä« filtra abonements ir paredzÄ“ts lietoÅ¡anai kopÄ ar filtra abonementu &quot;?1?&quot; kuru jÅ«s vÄ“l neizmantojat.">
+<!ENTITY viewList.label "Skatīt filtrus">
+<!ENTITY visitHomepage.label "ApmeklÄ“t mÄjaslapu">
+<!ENTITY addSubscription.label "Pievienot abonementu">
+<!ENTITY dialog.title "Pievienot Adblock Plus filtra abonementu">
+<!ENTITY location.label "Fi&amp;ltru saraksta atraÅ¡anÄs vieta:">
+<!ENTITY fromWeb.description "LÅ«dzu, apstipriniet, ka vÄ“laties pievienot šī filtra abonementu. JÅ«s varat mainÄ«t abonementa nosaukumu vai atraÅ¡anÄs vietu pirms pievienoÅ¡anas.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/composer.dtd
new file mode 100644
index 0000000..5b2264c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "p&amp;ada akhir alamat">
+<!ENTITY domainRestriction.label "Terhad pada domain: (&amp;s)">
+<!ENTITY collapse.default.no.label "Gunakan default (tidak)">
+<!ENTITY firstParty.label "Pihak per&amp;tama sahaja">
+<!ENTITY preferences.label "Papar penapi&amp;s sedia ada...">
+<!ENTITY pattern.label "Lihat pola">
+<!ENTITY thirdParty.label "Pihak keti&amp;ga sahaja">
+<!ENTITY filter.label "Penapis &amp;baru:">
+<!ENTITY collapse.label "&amp;Jatuhkan yang disekat:">
+<!ENTITY match.warning "Pola yang anda masukkan tidak lagi memadani alamat yang akan disekat/dikecualikan dan tidak akan berkesan kepadanya.">
+<!ENTITY anchor.start.label "pada per&amp;mulaan alamat">
+<!ENTITY matchCase.label "&amp;Kes sepadan">
+<!ENTITY custom.pattern.label "&amp;Ubah suai:">
+<!ENTITY unselectAllTypes.label "Tidak pilih">
+<!ENTITY type.whitelist.label "Peraturan penge&amp;cualian">
+<!ENTITY regexp.warning "Pola yang anda masukkan akan diinterpretasi sebagai ungkapan biasa di mana ia boleh melambatkan penjelajahan web. Jika anda tidak berniat untuk menggunakan ungkapan biasa, tambah simbol (*) diakhir pola.">
+<!ENTITY dialog.title "Tambah peraturan penapis Adblock Plus">
+<!ENTITY basic.label "Paparan biasa">
+<!ENTITY type.filter.label "&amp;Penapis penyekat">
+<!ENTITY types.label "Gunakan pada jenis:">
+<!ENTITY shortpattern.warning "Pola yang anda masukkan terlalu pendek untuk dioptimumkan dan kemungkinan boleh melambatkan penjelajahan web. Anda digalakkan memilih masukan yang lebih panjang untuk penapis ini supaya Adbolck Plus dapat memproses penapis ini dengan lebih berkesan.">
+<!ENTITY collapse.yes.label "Ya">
+<!ENTITY anchors.label "Terima pola sahaja:">
+<!ENTITY collapse.default.yes.label "Gunakan default (ya)">
+<!ENTITY domainRestriction.help "Gunakan pilihan ini untuk tentukan satu atau lebih domain secara berasingan dengan simbol &quot;|&quot;. Penapis hanya akan digunakan pada domain terpilih sahaja. Simbol &quot;~&quot; sebelum domain bermaksud penapis tidak akan digunakan pada domain tersebut.">
+<!ENTITY accept.label "Tambah penapis">
+<!ENTITY options.label "Pilihan">
+<!ENTITY disabled.warning "Adblock Plus telah dinyahaktifkan. Anda masih boleh menambah penapis tetapi ia tidak akan aktif sehingga anda [link]aktifkan Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "pada per&amp;mulaan nama domain">
+<!ENTITY collapse.no.label "Tidak">
+<!ENTITY selectAllTypes.label "Pilih semua">
+<!ENTITY advanced.label "Paparan mahir">
+<!ENTITY pattern.explanation "Pola boleh jadi mana-mana bahagian alamat; simbol (*) bertujuan sebagai wildcards. Penapis hanya digunakan pada alamat yang sepadan dengan pola.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/filters.dtd
new file mode 100644
index 0000000..9d3541d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/filters.dtd
@@ -0,0 +1,73 @@
+<!ENTITY restore.custom.warning "Semua penapis khas anda akan digantikan dengan kandungan fail yang dipilih. Adakah anda pasti?">
+<!ENTITY slow.column "&amp;Lambatkan penapis">
+<!ENTITY enabled.column "&amp;Diaktifkan">
+<!ENTITY subscription.lastDownload.checksumMismatch "Gagal, checksum tidak sepadan">
+<!ENTITY noFiltersInGroup.text "Kumpulan yang dipilih adalah kosong.">
+<!ENTITY subscription.actions.label "Aksi-aksi">
+<!ENTITY filter.selectAll.label "Pilih Semua">
+<!ENTITY backupButton.label "Backup dan Re&amp;store">
+<!ENTITY restore.minVersion.warning "Amaran: fail ini dibuat menggunakan versi Adblock Plus terbaru. Anda harus mendapatkan versi Adblock Plus terbaru sebelum anda restore dari fail ini.">
+<!ENTITY restore.error "Data fail tidak dapat diprosese, mungkin ini bukan fail backup Adblock Plus?">
+<!ENTITY sort.ascending.label "Susun&amp;an A &gt; Z">
+<!ENTITY sort.label "Susun &amp;dengan">
+<!ENTITY subscription.source.label "Senarai penapis">
+<!ENTITY hitcount.column "&amp;Hit">
+<!ENTITY noFilters.text "Anda tiada penapis khas.">
+<!ENTITY backup.custom.title "Penapis khas sahaja">
+<!ENTITY subscription.external.label "Dikemaskini oleh extension lain">
+<!ENTITY subscription.delete.label "Buang">
+<!ENTITY noGroupSelected.text "Anda perlu memilih satu kumpulan penapis sebelum penapisnya dapat dipaparkan.">
+<!ENTITY filter.cut.label "Potong">
+<!ENTITY restore.default.label "Restore backup dari ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Memuat-turun...">
+<!ENTITY subscriptions.tab.label "Langganan penapis">
+<!ENTITY sort.descending.label "Susunan &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Adakah anda pasti mahu membuang semua penapis yang dipilih?">
+<!ENTITY filter.delete.label "Padam">
+<!ENTITY addSubscriptionAdd.label "Tambah">
+<!ENTITY viewMenu.label "Papar">
+<!ENTITY subscription.lastDownload.unknown "tiada maklumat">
+<!ENTITY addSubscriptionCancel.label "Batal">
+<!ENTITY subscription.enabled.label "Diaktifkan">
+<!ENTITY noSubscriptions.text "Anda belum menambah langganan penapis. Adblock Plus tidak akan menapis
+ apa-apa tanpa penapis, sila guna &quot;Tambah langganan penapis&quot; untuk menambah.">
+<!ENTITY subscription.update.label "Kemaskini penapis">
+<!ENTITY dialog.title "Pilihan Penapis Adblock Plus">
+<!ENTITY addFilter.label "&amp;Tambah penapis">
+<!ENTITY subscription.minVersion.warning "Langganan penapis ini memerlukan versi Adblock Plus terbaru, anda perlu mendapatkan versi Adblock Plus terbaru.">
+<!ENTITY subscription.lastDownload.invalidURL "Gagal, bukan alamat yang sah">
+<!ENTITY backup.error "Terdapat ralat semasa menulis penapis pada fail. Sila pastikan fail tidak write protected atau digunakan oleh aplikasi lain.">
+<!ENTITY filter.moveUp.label "Pindah atas">
+<!ENTITY addGroup.label "Tambah &amp;kumpulan penapis">
+<!ENTITY filter.edit.label "Ubahsuai">
+<!ENTITY subscription.showHideFilters.label "Tunjuk/sembunyi penapis">
+<!ENTITY acceptableAds2.label "Benarkan iklan yan&amp;g tidak mengganggu">
+<!ENTITY addSubscriptionOther.label "Tambah langganan lain">
+<!ENTITY close.label "Tutup">
+<!ENTITY sort.none.label "&amp;Tidak disusun">
+<!ENTITY filter.actions.label "Aksi penapis">
+<!ENTITY filter.copy.label "Salin">
+<!ENTITY filter.moveDown.label "Pindah bawah">
+<!ENTITY filter.resetHitCounts.label "Reset statistik">
+<!ENTITY readMore.label "Baca lebih">
+<!ENTITY subscription.moveUp.label "Pindah ke atas">
+<!ENTITY addSubscription.label "Tambah &amp;langganan penapis">
+<!ENTITY subscription.homepage.label "Laman rumah">
+<!ENTITY backup.complete.title "Semua penapis dan langganan">
+<!ENTITY restore.own.label "Restore backup sendiri">
+<!ENTITY restore.complete.warning "Semua pilihan penapis anda akan digantikan dengan kandungan fail yang dipilih. Adakah anda pasti?">
+<!ENTITY filters.tab.label "Penapis khas">
+<!ENTITY backup.label "Buat backup baru">
+<!ENTITY find.label "&amp;Cari">
+<!ENTITY subscription.moveDown.label "Pindah ke bawah">
+<!ENTITY subscription.lastDownload.connectionError "Gagal, kegagalan memuat-turun">
+<!ENTITY subscription.lastDownload.success "Berjaya">
+<!ENTITY subscription.lastDownload.invalidData "Gagal, bukan senarai penapis yang sah">
+<!ENTITY filter.paste.label "Tampal">
+<!ENTITY subscription.disabledFilters.enable "Aktifkan penapis yang telah dinyaktifkan.">
+<!ENTITY lasthit.column "Hit t&amp;erakhir">
+<!ENTITY subscription.editTitle.label "Ubahsuai tajuk">
+<!ENTITY subscription.disabledFilters.warning "Sesetengah penapis dalam langganan ini telah dinyahaktifkan.">
+<!ENTITY filter.column "Pe&amp;raturan penapis">
+<!ENTITY subscription.lastDownload.label "Muat-turun terakhir:">
+<!ENTITY viewList.label "Lihat senarai">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/firstRun.properties
new file mode 100644
index 0000000..d119e0b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Lihat secara peribadi dengan menyahdayakan pengesanan - menyembunyikan trek anda dari syarikat-syarikat iklan yang akan menjejaki setiap langkah anda.
+firstRun_toggle_off=TUTUP
+firstRun_feature_tracking=Menyahdayakan pengesanan
+firstRun_feature_malware=Menyekat perisian berniat jahat
+firstRun_title=Adblock Plus telah dipasang
+firstRun_acceptableAdsExplanation=Kami ingin menggalakkan Laman web untuk menggunakan pengiklanan terus-terang, tidak mengganggu. Itulah sebabnya mengapa kita telah menetapkan <a>garis panduan yang ketat</a> untuk mengenalpasti iklan yang boleh diterima, yang ditunjukkan di bawah seting lalai. Jika anda masih mahu menyekat iklan setiap anda boleh <a>menyahdayakan</a> ini dalam beberapa saat.
+firstRun_toggle_on=Pada
+firstRun_contributor_credits=Kredit sebagai penyumbang
+firstRun_dataCorruptionWarning=Adakah laman ini muncul tidak terhenti-henti? <a>Klik di sini!</a>
+firstRun_acceptableAdsHeadline=Annoying iklan akan kini menjadi disekat
+firstRun_share=Beritahu rakan-rakan anda
+firstRun_share_headline=<a>Berikan tangan</a> dalam membuat laman web yang lebih baik
+firstRun_features=Adblock Plus boleh melakukan lebih daripada iklan yang menghalang
+firstRun_feature_malware_description=Membuat pelayaran anda lebih selamat dengan menyekat domain dikenali perisian berniat jahat.
+firstRun_feature_social_description=Secara automatik membuang pengalaman menyemak lalu anda daripada butang media sosial, seperti Facebook Like, yang muncul di laman web dan mengesan tingkah laku anda.
+firstRun_donate=mendermakan
+firstRun_donate_label=Menyokong projek kami
+firstRun_feature_social=Mengalih keluar butang Media sosial
+firstRun_legacySafariWarning=Anda menggunakan versi lama Safari yang tidak disokong oleh Adblock Plus. Ia mungkin tidak berfungsi dengan betul atau menjejaskan pengalaman pengguna di sesetengah tapak web. Kami amat mengesyorkan sama ada mengemaskini Safari 6 atau lebih tinggi (yang tersedia untuk Mac OS X 10.8 Mountain Lion) dan lebih tinggi(OS X 10.9 Mavericks), atau untuk menggunakan versi terkini pelayar Mozilla Firefox, Google Chrome atau Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/global.properties
new file mode 100644
index 0000000..54428fe
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Tiada item yang boleh disekat pada laman semasa
+action3_tooltip=Klik untuk aktifkan/nyahaktifkan Adblock Plus.
+notification_antiadblock_title=Sembunyi Mesej-mesej yang disasarkan?
+type_label_script=skrip
+filter_elemhide_nocriteria=Tiada kriteria yang dinyatakan untuk mengenal pasti elemen untuk disembunyikan
+blockingGroup_title=Peraturan Penapisan Iklan
+whitelisted_tooltip=Adblock Plus dinyahaktifkan pada laman semasa.
+type_label_stylesheet=lembaran stail
+blocked_count_tooltip=?1? daripada ?2?
+type_label_font=font
+type_label_popup=tetingkap pop-up
+filter_regexp_tooltip=Penapis ini hanya ungkapan biasa atau terlalu pendek untuk dioptimumkan. Terlalu banyak penapis mungkin akan melambatkan penjelajahan web.
+action0_tooltip=Klik untuk mengeluarkan menu konteks, klik tengah untuk aktifkan/nyahaktifkan.
+whitelisted_page=Adblock Plus telah dinyahaktifkan untuk laman semasa
+remove_group_warning=Adakah anda pasti mahu membuang kumpulan ini?
+action1_tooltip=Klik untuk membuka/menutup item yang boleh disekat, klik tengah untuk aktifkan/nyahaktifkan.
+type_label_xmlhttprequest=permintaan XML
+active_tooltip=Adblock Plus telah diaktifkan, ?1? langganan penapis dan ?2? penapis sendiri digunakan.
+type_label_document=dokumen
+type_label_object_subrequest=subpermintaan objek
+whitelistGroup_title=Peraturan Pengecualian
+disabled_tooltip=Adblock Plus telah dinyahaktifkan.
+filter_elemhide_duplicate_id=Hanya satu ID elemen untuk disembunyikan boleh dinyatakan
+type_label_object=objek
+action2_tooltip=Klik untuk buka tatarajah, klik tengah untuk aktifkan/nyahaktifkan.
+type_label_subdocument=bingkai
+clearStats_warning=Ini akan mengreset semua statistik dan menyahaktifkan kiraan penapis. Teruskan?
+notification_antiadblock_message=Laman web ini telah dikenali untuk menunjukkan mesej yang disasarkan kepada pengguna Adblock Plus. Adakah anda mahu Adblock Plus untuk menyembunyikan mesej yang disasarkan?
+blocked_count_addendum=(juga dikecualikan: ?1?, disembunyikan: ?2?
+subscription_invalid_location=Lokasi senarai penapis sama ada URL atau nama fail adalah tidak sah.
+type_label_image=imej
+remove_subscription_warning=Adakah anda mahu membuang langganan ini?
+type_label_other=lain
+mobile_menu_enable=ABP:Aktifkan
+type_label_media=audio/video
+mobile_menu_disable_site=ABP:Nyahaktifkan untuk ?1?
+elemhideGroup_title=Peraturan Penyembunyian Elemen
+mobile_menu_enable_site=ABP:Nyahaktifkan untuk ?1?
+type_label_elemhide=disembunyikan
+newGroup_title=Kumpulan penapis baru
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/overlay.dtd
new file mode 100644
index 0000000..5fc0085
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Ya">
+<!ENTITY notification.button.no "&amp;Tiada">
+<!ENTITY sync.label "Syn&amp;c tatacara Adblock Plus">
+<!ENTITY whitelist.site.label "Nyahaktifkan pada ?1?">
+<!ENTITY filters.label "&amp;Tatarajah penapis">
+<!ENTITY disable.label "Nyahaktif di semua tempat">
+<!ENTITY objecttab.title "Sekat">
+<!ENTITY objecttab.tooltip "Klik di sini untuk menyekat objek ini dengan Adblock Plus">
+<!ENTITY menuitem.label "&amp;Pilihan Adblock Plus">
+<!ENTITY objecttabs.label "Paparkan &amp;tab pada Flash dan Java">
+<!ENTITY sendReport.label "&amp;Lapor isu pada laman ini">
+<!ENTITY whitelist.page.label "Nyahaktifkan pada laman ini sahaja">
+<!ENTITY context.image.label "Adblock Plus: Sekat imej">
+<!ENTITY counthits.label "&amp;Kira kiraan penapis">
+<!ENTITY opensidebar.label "Buka &amp;item yang boleh disekat">
+<!ENTITY notification.button.close "&amp;Tutup">
+<!ENTITY contribute.label "Sumbang kepada Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Sekat bingkai">
+<!ENTITY blocked.tooltip "Item yang disekat pada laman ini:">
+<!ENTITY hideplaceholders.label "Sembun&amp;yikan placeholders elemen tersembunyi">
+<!ENTITY showinstatusbar.label "Papar&amp;kan di bar status">
+<!ENTITY sidebar.title "Item yang boleh disekat pada laman semasa">
+<!ENTITY options.label "Piliha&amp;n">
+<!ENTITY context.object.label "Adblock Plus: Sekat objek">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Aktifkan semula pada laman ini">
+<!ENTITY filters.tooltip "Penapis yang paling aktif:">
+<!ENTITY closesidebar.label "Tutup &amp;item yang boleh disekat">
+<!ENTITY showintoolbar.label "Papa&amp;rkan di bar alatan">
+<!ENTITY status.tooltip "Keadaan:">
+<!ENTITY context.media.label "Adblock Plus: Sekat audio/video">
+<!ENTITY subscription.update.label "Kemaskini penapis">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/sendReport.dtd
new file mode 100644
index 0000000..ae861c6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Undur (&amp;K)">
+<!ENTITY issues.disabledgroups.description "Langganan penapis/kumpulan penapis berikut telah dinyahaktifkan, tetapi ia mungkin masih membawa kesan pada laman ini:">
+<!ENTITY showData.label "Tunjuk data laporan">
+<!ENTITY typeSelector.falsePositive.label "Terlalu &amp;banyak disekat Adblock Plus">
+<!ENTITY issues.change.description "Konfigurasi anda telah diubah. Sila reload laman tersebut untuk menguji perubahan yang dilakukan dan hantar laporan jika isu tersebut masih tidak diselesaikan oleh perubahan yang dilakukan.">
+<!ENTITY email.label "&amp;E-mel:">
+<!ENTITY issues.openPreferences.label "Buka tatarajah penapis">
+<!ENTITY sendPage.confirmation "Laporan anda telah disimpan. Anda boleh mengaksesnya di alamat berikut:">
+<!ENTITY copyLink.label "&amp;Salin pautan laporan">
+<!ENTITY issues.nofilters.description "Adblock Plus tidak menyekat apa-apa pada laman semasa. Isu yang diperhatikan ini kemungkinan besar tidak berkaitan dengan Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Isu yang dilaporkan kemungkinan telah dikenalpasti. Maklumat lanjut:">
+<!ENTITY typeSelector.other.description "Pilih pilihan ini jika anda mencurigai isu pada Adblock Plus sendiri dan bukan disebabkan langganan.">
+<!ENTITY issues.disabledgroups.enable.label "Aktifkan langganan penapis/kumpula penapis">
+<!ENTITY typeWarning.override.label "Saya &amp;faham dan ingin menghantar laporan juga">
+<!ENTITY issues.disabled.enable.label "Aktifkan Adblock Plus">
+<!ENTITY update.fixed.description "Langganan anda yang dikemaskini kemungkinan besar telahpun menyelesaikan masalah yang anda laporkan. Sila reload halaman tersebut dan cuba sekali lagi. Laporkan sekali lagi jika masalah tetap ada.">
+<!ENTITY anonymous.label "Penyerahan &amp;tanpa nama">
+<!ENTITY reloadButton.label "Reload laman (&amp;t)">
+<!ENTITY recentReports.clear.label "&amp;Padam semua laporan">
+<!ENTITY typeSelector.description "Tingkap ini akan membimbing anda dengan langkah-langkah yang diperlukan untuk mengemukakan laporan isu Adblock Plus. Pertama sekali, sila pilih jenis isu yang dialami pada laman ini:">
+<!ENTITY screenshot.remove.label "Pa&amp;dam data sensitif">
+<!ENTITY issues.ownfilters.description "Sebahagian penapis yang digunakan pada laman ini ditentukan pengguna. Sila nyahaktifkan penapis tersebut yang mungkin menyebabkan isu itu.">
+<!ENTITY update.inProgress.description "Adblock Plus perlu mengemaskini langganan penapis anda untuk memastikan isu tersebut belum diselesaikan. Sila tunggu&quot;...&quot;">
+<!ENTITY sendPage.retry.label "Hantar sekali lagi">
+<!ENTITY data.label "&amp;Lapor data">
+<!ENTITY recentReports.label "Laporan yang dihantar baru-baru ini oleh saya">
+<!ENTITY typeWarning.description "Anda didapati ingin melaporkan isu berkaitan Adblock Plus dan bukan masalah dengan penapis. Sila ambil perhatian bahawa isu sebegini paling bagus dilaporkan di [link]Adblock Plus[/link]. Anda patut hanya menggunakan pelapor isu untuk menambah info pada perbincangan yang sedia ada, kerana tiada siapa akan perasan laporan itu kecuali anda membekalkan mereka dengan pautannya. Pautan yang dihasilkan secara automatik akan dibekalkan selepas laporan dihantar.">
+<!ENTITY issues.disabled.description "Adblock Plus telah dinyahaktifkan, ia tidak akan menyekat apa-apa.">
+<!ENTITY attachExtensions.label "Lampirkan senarai e&amp;xtension aktif pada laporan untuk menentukan samada masalah disebabkan konflik add-on">
+<!ENTITY issues.nosubscriptions.add.label "Tambah langganan penapis">
+<!ENTITY issues.disabledfilters.enable.label "Aktifkan penapis">
+<!ENTITY issues.override.label "&amp;Konfigurasi adalah betul, sila teruskan dengan laporan">
+<!ENTITY issues.nosubscriptions.description "Anda didapati tidak melanggan mana-mana penapis yang direka khas untuk membuang isi yang tidak diperlukan pada laman web secara automatik.">
+<!ENTITY typeSelector.falsePositive.description "Pilih pilihan ini jika laman tersebut kekurangan isi penting, salah paparannya atau gagal berfungsi dengan betul. Anda boleh menentukan sama ada Adblock Plus ialah penyebab masalah tersebut dengan menyahaktifkannya buat sementara waktu.">
+<!ENTITY typeSelector.other.label "&amp;Isu lain">
+<!ENTITY emailComment.label "Kami menggalakkan anda memasukkan alamat email yang sah supaya kami boleh menghubungi anda jika ada pertanyaan tentang laporan anda. Ia juga akan membolehkan kita untuk mengiktiraf sumbangan anda dan memberi keutamaan kepada mereka dengan lebih tinggi.">
+<!ENTITY issues.whitelist.remove.label "Aktifkan kembali Adblock Plus pada laman ini">
+<!ENTITY outdatedSubscriptions.description "Langganan penapis yang disenaraikan belum dikemaskini sekurang-kurangnya 2 minggu. Sila kemaskini langganan tersebut sebelum menghantar laporan, isu tersebut mungkin telahpun diselesaikan.">
+<!ENTITY dataCollector.description "Sila tunggu sebentar sementara Adblock Plus mengumpul data yang diperlukan.">
+<!ENTITY sendButton.label "&amp;Hantar laporan">
+<!ENTITY comment.label "K&amp;omen(optional)">
+<!ENTITY sendPage.errorMessage "Cubaan untuk menghantar laporan gagal dengan kod error &quot;?1?&quot;. Sila pastikan internet anda berfungsi dan cuba lagi. Jika masalah berterusan sila minta bantuan di [link]Adblock Plus forum[/link].">
+<!ENTITY showRecentReports.label "Paparkan laporan yang dihantar baru-baru ini">
+<!ENTITY commentPage.heading "Masukkan komen">
+<!ENTITY update.start.label "Mulakan kemaskini sekarang">
+<!ENTITY issues.disabledfilters.description "Penapis berikut telah dinyahaktifkan, tetapi ia mungkin masih membawa kesan pada laman ini:">
+<!ENTITY screenshot.description "Laman yang sama mungkin kelihatan berbeza untuk individu yang berbeza. Ia mungkin membantu kami memahami masalahnya jika screenshot dilampirkan bersama laporan anda. Anda boleh memadam bahagian-bahagian yang mengandungi info sensitif di samping menanda bahagian-bahagian di mana masalah itu jelas kelihatan. Untuk berbuat demikian klik butang berkaitan dan pilih sebahagian imej dengan tetikus anda.">
+<!ENTITY screenshot.attach.label "La&amp;mpir imej laman pada laporan">
+<!ENTITY issues.whitelist.description "Adblock Plus telah dinyahaktifkan pada laman yang anda ingin laporkan. Sila aktifkannya kembali dan reload laman tersebut sebelum menghantar laporan.">
+<!ENTITY typeSelector.falseNegative.label "Adbloc&amp;k Plus tidak menyekat iklan">
+<!ENTITY typeSelector.heading "Pilih jenis isu">
+<!ENTITY anonymity.warning "Kita tidak akan dapat kembali kepada anda dan mungkin akan mengutamakan laporan yang lebih rendah.">
+<!ENTITY wizard.title "Pelapor isu">
+<!ENTITY issues.ownfilters.disable.label "Nyahaktifkan penapis">
+<!ENTITY commentPage.description "Bahagian di bawah membenarkan anda memasukkan komen untuk membantu kami memahami isu tersebut. Langkah ini adalah optional tetapi disyorkan jika masalah tersebut tidak jelas. Anda juga boleh memeriksa data laporan sebelum menghantarnya.">
+<!ENTITY comment.lengthWarning "Panjang komen anda melebihi 1000 huruf. Hanya 1000 huruf pertama sahaja akan dihantar.">
+<!ENTITY typeSelector.falseNegative.description "Pilih pilihan ini jika iklan dipaparkan walaupun Adblock Plus telah diaktifkan.">
+<!ENTITY sendPage.waitMessage "Sila tunggu sementara Adblock Plus menghantar laporan anda.">
+<!ENTITY dataCollector.heading "Selamat datang ke pelapor isu">
+<!ENTITY screenshot.heading "Lampir screenshot">
+<!ENTITY sendPage.heading "Hantar laporan">
+<!ENTITY issues.subscriptionCount.description "Didapati anda melanggan terlalu banyak langganan penapis. Ini tidak disyorkan kerana ia mungkin akan mewujudkan masalah. Kami juga tidak dapat menerima laporan anda kerana ia kurang jelas penulis langganan penapis mana yang perlu mengambil tindakan. Sila buang semua langganan penapis kecuali yang diperlukan dan uji samada masalah masih berterusan.">
+<!ENTITY screenshot.mark.label "&amp;Tanda masalah tersebut">
+<!ENTITY privacyPolicy.label "Polisi privasi">
+<!ENTITY issues.description "Adblock Plus telah mengesan isu pada konfigurasi anda yang mungkin penyebab isu ini atau akan menyukarkan penyiasatan laporan.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/sidebar.dtd
new file mode 100644
index 0000000..c2f2cd8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Jelaskan sempadan item">
+<!ENTITY address.label "Alamat">
+<!ENTITY context.open.label "Buka dalam Tab Baru">
+<!ENTITY type.label "Jenis">
+<!ENTITY tooltip.filterSource.label "Sumber penapis:">
+<!ENTITY noitems.label "Tiada item yang boleh disekat">
+<!ENTITY filter.label "Penapis">
+<!ENTITY tooltip.size.label "Saiz:">
+<!ENTITY reattach.label "Lampir semula">
+<!ENTITY search.label "&amp;Cari:">
+<!ENTITY docDomain.thirdParty "(pihak ketiga)">
+<!ENTITY filterSource.label "Sumber penapis">
+<!ENTITY tooltip.docDomain.label "Sumber dokumen:">
+<!ENTITY context.copy.label "Salin alamat item">
+<!ENTITY tooltip.type.label "Jenis:">
+<!ENTITY context.disablefilter.label "Nyahaktif penapis ?1?">
+<!ENTITY context.copyFilter.label "Salin penapis">
+<!ENTITY context.block.label "Sekat item ini">
+<!ENTITY context.enablefilter.label "Aktifkan kembali penapis ?1?">
+<!ENTITY detach.label "Asingkan">
+<!ENTITY whitelisted.label "Laman yang disenarai putih">
+<!ENTITY context.disablefilteronsite.label "Nyahaktif penapis ini pada ?1?">
+<!ENTITY detached.title "Adblock Plus: Item yang boleh disekat (diasingkan)">
+<!ENTITY docDomain.firstParty "(pihak pertama)">
+<!ENTITY tooltip.type.whitelisted "(senarai putih)">
+<!ENTITY tooltip.filter.label "Penapis yang digunakan:">
+<!ENTITY tooltip.filter.disabled "(dinyahaktifkan)">
+<!ENTITY context.editfilter.label "Ubah penapis yang digunakan">
+<!ENTITY tooltip.type.blocked "(disekat)">
+<!ENTITY size.label "Saiz">
+<!ENTITY context.whitelist.label "Tambah peraturan pengecualian untuk item">
+<!ENTITY context.selectAll.label "Pilih semua">
+<!ENTITY state.label "Keadaan">
+<!ENTITY docDomain.label "Sumber dokumen">
+<!ENTITY tooltip.address.label "Alamat:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/subscriptionSelection.dtd
new file mode 100644
index 0000000..cdf6791
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ms/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Tam&amp;bah langganan penapis &quot;?1?&quot; juga">
+<!ENTITY list.download.failed "Adblock Plus gagal memuat-turun senarai langganan.">
+<!ENTITY list.download.retry "Cuba lagi">
+<!ENTITY title.label "Ta&amp;juk langganan">
+<!ENTITY list.download.website "Papar laman web">
+<!ENTITY supplementMessage "Langganan penapis ini bertujuan untuk digunakan bersama langganan penapis &quot;?1?&quot; yang tidak digunakan oleh anda lagi.">
+<!ENTITY viewList.label "Papar penapis">
+<!ENTITY visitHomepage.label "Lawat laman web Adblock Plus">
+<!ENTITY addSubscription.label "Tambah langganan">
+<!ENTITY dialog.title "Tambah langganan penapis Adblock Plus">
+<!ENTITY location.label "L&amp;okasi senarai penapis:">
+<!ENTITY fromWeb.description "Sila pastikan anda mahu menambah langganan penapis ini. Anda boleh mengubah tajuk langganan atau lokasi sebelum menambahnya.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/composer.dtd
new file mode 100644
index 0000000..3292cd0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "på slutte&amp;n av adressen">
+<!ENTITY domainRestriction.label "Begrens til &amp;domene:">
+<!ENTITY collapse.default.no.label "Bruk standard (nei)">
+<!ENTITY firstParty.label "Kun elementer fra hovedsiden">
+<!ENTITY preferences.label "Vi&amp;s eksisterende filtre...">
+<!ENTITY pattern.label "Se etter mønster">
+<!ENTITY thirdParty.label "Kun &amp;tredjeparts">
+<!ENTITY filter.label "Nytt &amp;filter:">
+<!ENTITY collapse.label "Minimer b&amp;lokkerte:">
+<!ENTITY match.warning "Mønsteret du laget stemmer ikke lenger overens med adressen som skal blokkeres/hvitelistes, og vil ikke ha noen effekt.">
+<!ENTITY anchor.start.label "på starten av adressen (&amp;g)">
+<!ENTITY matchCase.label "&amp;Ta hensyn til stor og liten forbokstav (A/a)">
+<!ENTITY custom.pattern.label "Egendefinert: (&amp;C)">
+<!ENTITY unselectAllTypes.label "Velg ingen">
+<!ENTITY type.whitelist.label "Unntaksregel (&amp;x)">
+<!ENTITY regexp.warning "Mønsteret du har laget vil bli tolket som et standarduttrykk, og kan ikke behandles effektivt av Adblock Plus, som igjen vil gjøre nettleseren din tregere. Hvis du ikke hadde tenkt til å lage et standarduttrykk, kan du legge til en stjerne (*) på slutten av mønsteret.">
+<!ENTITY dialog.title "Legg til filtreringsregel for Adblock Plus">
+<!ENTITY basic.label "Grunnleggende visning">
+<!ENTITY type.filter.label "&amp;Blokkeringsfilter">
+<!ENTITY types.label "Bruk på:">
+<!ENTITY shortpattern.warning "Mønsteret du skrev inn er for kort til å bli optimert, og kan gjøre nettleseren din tregere. Vi anbefaler at du lager en lengre tekstsekvens for dette filteret, slik at Adblock Plus kan behandle filteret mer effektivt.">
+<!ENTITY collapse.yes.label "Ja">
+<!ENTITY anchors.label "Aksepter kun mønster:">
+<!ENTITY collapse.default.yes.label "Bruk standard (ja)">
+<!ENTITY domainRestriction.help "Bruk dette valget til å spesifisere ett domene eller flere domener, separert med vertikalstreker (|). Filteret vil kun brukes på domenet eller domenene som er valgt. En tilde (~) foran et domenenavn indikerer at filteret ikke skal brukes på det domenet.">
+<!ENTITY accept.label "Legg til filter">
+<!ENTITY options.label "Alternativer">
+<!ENTITY disabled.warning "Adblock Plus er deaktivert. Du kan fremdeles legge til filtre, men de blir ikke aktivert med mindre du [link]aktiverer Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "på starten av domenenavnet (&amp;g)">
+<!ENTITY collapse.no.label "Nei">
+<!ENTITY selectAllTypes.label "Velg alle">
+<!ENTITY advanced.label "Avansert visning">
+<!ENTITY pattern.explanation "Mønsteret kan være hvilken som helst del av adressen; stjerner (*) fungerer som frie symboler. Filteret vil kun bli aktivert for adresser som stemmer overens med sekvensen du har definert.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/filters.dtd
new file mode 100644
index 0000000..ac2bc21
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Alle dine egenkomponerte filtre vil bli erstattet av innholdet i filen du har valgt. Vil du fortsette?">
+<!ENTITY slow.column "Trege filtre (&amp;w)">
+<!ENTITY enabled.column "Aktivert (&amp;n)">
+<!ENTITY subscription.lastDownload.checksumMismatch "Mislyktes - kontrollsummen stemmer ikke">
+<!ENTITY noFiltersInGroup.text "Den valgte gruppen er tom.">
+<!ENTITY subscription.actions.label "Handlinger">
+<!ENTITY filter.selectAll.label "Velg alle">
+<!ENTITY backupButton.label "Sikkerhetskopier og gjenopprett (&amp;B)">
+<!ENTITY restore.minVersion.warning "Advarsel: Filen har blitt laget med en nyere versjon av Adblock Plus. Du bør oppdatere til nyeste versjon av Adblock Plus før du bruker denne filen.">
+<!ENTITY restore.error "Informasjonen i filen kunne ikke bli behandlet. Kanskje dette ikke er en backup-fil for Adblock Plus?">
+<!ENTITY sort.ascending.label "&amp;Sortér fra A til Å">
+<!ENTITY sort.label "&amp;Sorter etter">
+<!ENTITY subscription.source.label "Filterliste">
+<!ENTITY hitcount.column "Treff (&amp;H)">
+<!ENTITY noFilters.text "Du har ingen egendefinerte filtre ennå.">
+<!ENTITY backup.custom.title "Kun egendefinerte filtre">
+<!ENTITY subscription.external.label "Oppdatert av et annet tillegg">
+<!ENTITY subscription.delete.label "Slett">
+<!ENTITY noGroupSelected.text "Du må velge en filtergruppe før tilhørende filtre kan vises.">
+<!ENTITY filter.cut.label "Klipp ut">
+<!ENTITY restore.default.label "Gjenopprett sikkerhetskopi fra ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Laster ned...">
+<!ENTITY subscriptions.tab.label "Filterabonnementer">
+<!ENTITY sort.descending.label "&amp;Sortér fra Å til A">
+<!ENTITY filters.remove.warning "Ønsker du virkelig å fjerne alle valgte filtre?">
+<!ENTITY filter.delete.label "Slett">
+<!ENTITY addSubscriptionAdd.label "Legg til">
+<!ENTITY viewMenu.label "Vis">
+<!ENTITY subscription.lastDownload.unknown "Ikke tilgjengelig">
+<!ENTITY addSubscriptionCancel.label "Avbryt">
+<!ENTITY subscription.enabled.label "Aktivert">
+<!ENTITY noSubscriptions.text "Du har ikke lagt til noen filterabonnementer ennå. Adblock Plus blokkerer ikke noe uten filtre. Vennligst bruk &quot;Legg til filterabonnement&quot; for å legge til filtre.">
+<!ENTITY subscription.update.label "Oppdater filtre">
+<!ENTITY dialog.title "Filtervalg for Adblock Plus">
+<!ENTITY addFilter.label "Legg til filter (&amp;d)">
+<!ENTITY subscription.minVersion.warning "Dette filterabonnementet krever en nyere versjon av Adblock Plus. Du bør oppdatere til nyeste versjon av Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Feilet, ikke en gyldig adresse">
+<!ENTITY backup.error "Det oppstod en feil under lagring av filtrene til filen. Sjekk at ikke filen er skrivebeskyttet, eller at den brukes av et annet program.">
+<!ENTITY filter.moveUp.label "Flytt opp">
+<!ENTITY addGroup.label "Le&amp;gg til filtergruppe">
+<!ENTITY filter.edit.label "Rediger">
+<!ENTITY subscription.showHideFilters.label "Vis/skjul filtre">
+<!ENTITY acceptableAds2.label "Tillat noen ikke-påtrengende annonser">
+<!ENTITY addSubscriptionOther.label "Legg til et annet abonnement">
+<!ENTITY close.label "Lukk">
+<!ENTITY sort.none.label "&amp;Usortert">
+<!ENTITY filter.actions.label "Filterhandlinger">
+<!ENTITY filter.copy.label "Kopier">
+<!ENTITY filter.moveDown.label "Flytt ned">
+<!ENTITY filter.resetHitCounts.label "Nullstill treffstatistikker">
+<!ENTITY readMore.label "Les mer">
+<!ENTITY subscription.moveUp.label "Flytt opp">
+<!ENTITY addSubscription.label "Legg til &amp;filterabonnement">
+<!ENTITY subscription.homepage.label "Hjemmeside">
+<!ENTITY backup.complete.title "Alle filtre og abonnenter">
+<!ENTITY restore.own.label "Gjenopprett egen sikkerhetskopi">
+<!ENTITY restore.complete.warning "Alle filtervalgene dine vil bli erstattet av innholdet i filen du har valgt. Vil du fortsette?">
+<!ENTITY filters.tab.label "Egendefinerte filtre">
+<!ENTITY backup.label "Opprett ny sikkerhetskopi">
+<!ENTITY find.label "Fi&amp;nn">
+<!ENTITY subscription.moveDown.label "Flytt ned">
+<!ENTITY subscription.lastDownload.connectionError "Feilet, nedlastingsfeil">
+<!ENTITY subscription.lastDownload.success "Vellykket">
+<!ENTITY subscription.lastDownload.invalidData "Feilet, ikke en gyldig filterliste">
+<!ENTITY filter.paste.label "Lim inn">
+<!ENTITY subscription.disabledFilters.enable "Aktiver deaktiverte filtre">
+<!ENTITY lasthit.column "Siste treff (&amp;L)">
+<!ENTITY subscription.editTitle.label "Rediger tittel">
+<!ENTITY subscription.disabledFilters.warning "Noen filtre i dette abonnementet er deaktivert.">
+<!ENTITY filter.column "&amp;Filterregel">
+<!ENTITY subscription.lastDownload.label "Siste nedlasting:">
+<!ENTITY viewList.label "Vis liste">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/firstRun.properties
new file mode 100644
index 0000000..dc51602
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Vær privat på nettet ved å hindre sporing - gjem sporene dine fra reklameselskaper som ellers registrerer alt du gjør.
+firstRun_toggle_off=AV
+firstRun_feature_tracking=Slå av sporing
+firstRun_feature_malware=Blokkering av skadeprogram
+firstRun_title=Adblock Plus har blitt installert
+firstRun_toggle_on=PÃ…
+firstRun_acceptableAdsExplanation=Vi vil oppfordre nettsider til å bruke standard, ikke-påtrengende annonser. Derfor har vi laget <a>strenge retningslinjer</a> for å identifisere akseptable annonser, som vises når man har aktivert standardinnstillingene. Hvis du ønsker å blokkere alle annonser, kan du <a>velge bort</a> dette straks.
+firstRun_contributor_credits=Takk til
+firstRun_dataCorruptionWarning=Dukker denne siden stadig opp? <a>Klikk her!</a>
+firstRun_acceptableAdsHeadline=Irriterende annonser blir fra nå av blokkert
+firstRun_share=Fortell dette til vennene dine
+firstRun_share_headline=<a>Hjelp oss</a> med å gjøre Internett til et bedre sted
+firstRun_feature_social_description=Bli kvitt knapper for sosiale medier, slik som "Liker" fra Facebook, som dukker opp på nettsider og sporer handlingene dine.
+firstRun_filterlistsReinitializedWarning=Det kan se ut som at en feil i systemet gjorde at alle filtrene ble fjernet, og vi var ute av stand til å gjenopprette sikkerhetskopien. Vi har derfor måttet nullstille alle filtrene og innstillingene for Akseptable annonser. Vennligst kontroller filterlistene dine og innstillingene for Akseptable annonser i valgalternativene til <a>Adblock Plus options</a>.
+firstRun_feature_malware_description=Gjør nettlesingen din tryggere ved å blokkere domener som er kjent for å være skadelige.
+firstRun_features=Adblock Plus kan gjøre mer enn å bare blokkere annonser
+firstRun_donate=donér
+firstRun_donate_label=Støtt prosjektet vårt
+firstRun_feature_social=Fjern sosiale media-knapper
+firstRun_legacySafariWarning=Du bruker en gammel versjon av Safari som ikke støttes av Adblock Plus, og det kan hende Adblock Plus ikke fungerer, eller forverrer brukeropplevelsen på enkelte nettsteder. Vi anbefaler sterkt at du enten oppdaterer til Safari 6.1.1 eller nyere (tilgjengelig for Mac OS X 10.8 Mountain Lion), Safari 7.0.1 (tilgjengelig for OS X 10.9 Mavericks) eller nyere, eller bruker den nyeste versjonen av Mozilla Firefox, Google Chrome eller Opera.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/global.properties
new file mode 100644
index 0000000..45be984
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Ingen blokkerbare elementer på nåværende side
+action3_tooltip=Klikk for å aktivere/deaktivere Adblock Plus.
+notification_antiadblock_title=Skjul meldinger til Adblock Plus brukere?
+type_label_script=script
+filter_elemhide_nocriteria=Du har ikke spesifisert kriterier for å gjenkjenne elementet som skal skjules
+blockingGroup_title=Regler for annonseblokkering
+whitelisted_tooltip=Adblock Plus er deaktivert på nåværende side.
+type_label_stylesheet=stilark
+blocked_count_tooltip=?1? av ?2?
+type_label_font=font
+type_label_popup=sprettoppvindu
+filter_regexp_tooltip=Dette filteret er enten et standarduttrykk eller er for kort til å bli optimalisert. For mange slike filtre kan gjøre nettleseren din tregere.
+action0_tooltip=Trykk her for å vise kontekstmenyen. Midtklikk for å aktivere/deaktivere.
+whitelisted_page=Adblock Plus har blitt deaktivert for nåværende side
+remove_group_warning=Ønsker du virkelig å fjerne denne gruppen?
+action1_tooltip=Klikk her for å åpne/lukke elementer som kan blokkeres. Midtklikk for å aktivere/deaktivere.
+type_label_xmlhttprequest=XML-forespørsel
+active_tooltip=Adblock Plus er aktivert. ?1? filterabonnementer og ?2? egendefinerte filtre i bruk.
+type_label_document=dokument
+type_label_object_subrequest=underforespørsel fra objektet
+whitelistGroup_title=Unntaksregler
+disabled_tooltip=Adblock Plus er deaktivert.
+filter_elemhide_duplicate_id=Du kan kun angi ett ID for elementet som skal skjules
+type_label_object=objekt
+action2_tooltip=Klikk her for å åpne innstillingsvalgene. Midtklikk for å aktivere/deaktivere.
+type_label_subdocument=ramme
+clearStats_warning=Dette vil nullstille alle treffstatistikker for filtre og deaktivere telleren. Vil du fortsette?
+notification_antiadblock_message=Dette området er kjent for å vise meldinger som henvender seg til AdBlock Plus brukere. Vil du at Adblock Plus skal skjule disse meldingene?
+blocked_count_addendum=(også hvitelistet: ?1?, skjult: ?2?)
+subscription_invalid_location=Filterlistens plassering er verken en gyldig URL eller et gyldig filnavn.
+type_label_image=bilde
+remove_subscription_warning=Ønsker du virkelig å fjerne dette abonnementet?
+type_label_other=annet
+mobile_menu_enable=ABP: Aktiver
+type_label_media=lyd/video
+mobile_menu_disable_site=ABP: Deaktiver på ?1?
+elemhideGroup_title=Regler for å skjule elementer
+mobile_menu_enable_site=ABP: Aktiver på ?1?
+type_label_elemhide=skjult
+newGroup_title=Ny filtergruppe
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/overlay.dtd
new file mode 100644
index 0000000..9d89b41
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Ja">
+<!ENTITY notification.button.no "&amp;Nei">
+<!ENTITY sync.label "Synkroniser innstillinger for Adblo&amp;ck Plus">
+<!ENTITY whitelist.site.label "Deaktiver på ?1?">
+<!ENTITY filters.label "&amp;Filterinnstillinger">
+<!ENTITY disable.label "Deaktiver overalt">
+<!ENTITY objecttab.title "Blokker">
+<!ENTITY objecttab.tooltip "Klikk her for å blokkere dette elementet med Adblock Plus">
+<!ENTITY menuitem.label "Adblock Plus innstillinger">
+<!ENTITY objecttabs.label "Vis faner på Flash og Java">
+<!ENTITY sendReport.label "&amp;Rapporter problem på denne siden">
+<!ENTITY whitelist.page.label "Deaktiv kun på denne siden">
+<!ENTITY context.image.label "Adblock Plus: Blokker bilde">
+<!ENTITY counthits.label "Tell filtertreff (&amp;h)">
+<!ENTITY opensidebar.label "Ã…pne &amp;blokkerbare elementer">
+<!ENTITY notification.button.close "&amp;Lukk">
+<!ENTITY contribute.label "Bidra til Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Blokker ramme">
+<!ENTITY blocked.tooltip "Blokkerte elementer på denne siden:">
+<!ENTITY hideplaceholders.label "Skjul plassbeholder for blokkerte elementer">
+<!ENTITY showinstatusbar.label "Vis i statuslinjen">
+<!ENTITY sidebar.title "Blokkerbare elementer på nåværende side">
+<!ENTITY options.label "Alternativer (&amp;O)">
+<!ENTITY context.object.label "Adblock Plus: Blokker objekt">
+<!ENTITY context.removeWhitelist.label "Reaktiver på denne siden">
+<!ENTITY filters.tooltip "Mest aktive filtre:">
+<!ENTITY closesidebar.label "Lukk &amp;blokkérbare elementer">
+<!ENTITY showintoolbar.label "Vis på verktøylinje (&amp;b)">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Blokker lyd/video">
+<!ENTITY subscription.update.label "Oppdater filtre">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/sendReport.dtd
new file mode 100644
index 0000000..1cc95f1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Angre (&amp;U)">
+<!ENTITY issues.disabledgroups.description "Disse filterabonnementene/filtergruppene er deaktivert, men de kan ha en effekt på denne siden likevel:">
+<!ENTITY showData.label "Vis rapportdata">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blokkerer for &amp;mye">
+<!ENTITY issues.change.description "Konfigurasjonene dine er endret. Last inn siden på nytt for å teste forandringene, og send inn en ny rapport hvis problemene er vedvarende.">
+<!ENTITY email.label "E-post: (&amp;m)">
+<!ENTITY issues.openPreferences.label "Ã…pne filterinnstillinger">
+<!ENTITY sendPage.confirmation "Rapporten er lagret. Du kan få tilgang til den ved følgende internettadresse:">
+<!ENTITY copyLink.label "Kopier rapportlink (&amp;C)">
+<!ENTITY issues.nofilters.description "Adblock Plus blokkerer ingenting på denne siden. Problemer du opplever er trolig urelatert til Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Problemet du rapporterte inn er allerede kjent for oss. Mer informasjon:">
+<!ENTITY typeSelector.other.description "Velg dette alternativet hvis du mistenker at det er et problem med Adblock Plus som program, i motsetning til filterene.">
+<!ENTITY issues.disabledgroups.enable.label "Aktiver filterabonnement / filtergruppe">
+<!ENTITY typeWarning.override.label "Jeg for&amp;står og ønsker likevel å sende rapporten">
+<!ENTITY issues.disabled.enable.label "Aktiver Adblock Plus">
+<!ENTITY update.fixed.description "Oppdateringen av filterabonnemenetene dine løste trolig problemet du rapporterte inn. Vennligst last inn siden på nytt. Rapporter inn problemet på nytt hvis problemet fremdeles eksisterer.">
+<!ENTITY anonymous.label "&amp;Anonym innsending">
+<!ENTITY reloadButton.label "Last side på nytt (&amp;R)">
+<!ENTITY recentReports.clear.label "Fje&amp;rn alle rapporter">
+<!ENTITY typeSelector.description "Dette vinduet vil veilede deg gjennom de nødvendige stegene som trengs for å sende inn en problemrapport til Adblock Plus. Velg først hvilket type problem du har på denne siden:">
+<!ENTITY screenshot.remove.label "Fje&amp;rn sensitive data">
+<!ENTITY issues.ownfilters.description "Noen av filterene som er aktivert på denne siden er brukerdefinerte. Vennligst deaktiver filterene som kan ha forårsaket problemet:">
+<!ENTITY update.inProgress.description "Adblock Plus behøver å oppdatere filterabonnementene for å forsikre seg at problemet ikke har blitt løst allerede. Vennligst vent...">
+<!ENTITY sendPage.retry.label "Send på nytt">
+<!ENTITY data.label "Ra&amp;pportdata:">
+<!ENTITY recentReports.label "Dine nylig innsendte rapporter">
+<!ENTITY typeWarning.description "Du har angitt at du vil rapportere inn et generelt problem vedrørende Adblock Plus, istedenfor et problem vedrørende filtrene. Vennligst legg merke til at slike problemer helst bør rapporteres inn på [link]Adblock Plus forum[/link]. Du burde kun bruke rapportingsfunksjonen til å supplementere til en eksisterende diskusjon, siden ingen vil legge merke til din rapport såfremt du ikke legger ved en link. En automatisk generert link vil bli gitt deg etter at du har sendt inn en rapport.">
+<!ENTITY issues.disabled.description "Adblock Plus er deaktivert, og vil ikke blokkere noenting i denne tilstanden.">
+<!ENTITY attachExtensions.label "Legg ved en liste over aktive tillegg til rapporten, i tilfelle det er en &quot;add-on&quot; som er grunnen til problemet">
+<!ENTITY issues.nosubscriptions.add.label "Legg til filterabonnement">
+<!ENTITY issues.disabledfilters.enable.label "Aktiver filter">
+<!ENTITY issues.override.label "Følgende konfigurasjon er korrekt; fortsetter med rapporteringen">
+<!ENTITY issues.nosubscriptions.description "Det virker som om du ikke har abonnert på noen av de forhåndsdefinerte listene som fjerner uønsket innhold fra internettsider.">
+<!ENTITY typeSelector.falsePositive.description "Velg dette alternativet hvis siden mangler viktig innhold, vises feil eller ikke fungerer sånn det skal. Du kan finne ut om Adblock Plus er roten til problemet ved å deaktivere Adblock Plus midlertidig.">
+<!ENTITY typeSelector.other.label "Anne&amp;t problem">
+<!ENTITY emailComment.label "Vi oppfordrer deg til å oppgi en gyldig e-postadresse, slik at vi kan kontakte deg hvis vi har spørsmål angående denne rapporten. Det vil også gjøre at vi kan gjenkjenne dine bidrag, og prioritere dem høyere.">
+<!ENTITY issues.whitelist.remove.label "Reaktiver Adblock Plus for denne siden">
+<!ENTITY outdatedSubscriptions.description "Disse filterabonnementene har ikke blitt oppdatert på minst to uker. Vennligst oppdater disse filterabonnementene før du sender inn en problemrapport; problemet kan ha blitt løst allerede.">
+<!ENTITY dataCollector.description "Vennligst vent på at Adblock Plus samler inn de nødvendige data.">
+<!ENTITY sendButton.label "Se&amp;nd rapport">
+<!ENTITY comment.label "Kommentar (valgfritt): (&amp;C)">
+<!ENTITY sendPage.errorMessage "Et forsøk på å sende inn rapporten feilet, med feilkoden &quot;?1?&quot;. Vennligst kontrollér at du har internettilgang, og prøv på nytt. Hvis problemet vedvarer kan du be om hjelp i [link]Adblock Plus forum[/link].">
+<!ENTITY showRecentReports.label "Vis nylig innsendte rapporter">
+<!ENTITY commentPage.heading "Skriv inn kommentar">
+<!ENTITY update.start.label "Start oppdatering nå">
+<!ENTITY issues.disabledfilters.description "Følgende filter er deaktiver, men det kan alikevell ha en effekt på denne siden:">
+<!ENTITY screenshot.description "En internettside kan se annerledes ut for forskjellige personer. Det vil muligens hjelpe oss til å forstå problemet hvis du du sender med en skjermdump, sammen med rapporten. Du kan fjerne sensitiv informasjon, såvell som markere området hvor problemet er merkbart. For å gjøre dette må du klikke tilsvarende knapp, og velge området du vil markere med datamusen.">
+<!ENTITY screenshot.attach.label "Legg ved et bilde til rapporten">
+<!ENTITY issues.whitelist.description "Adblock Plus er for tiden deaktivert for siden du ønkser å rapportere inn. Vennligst reaktiver Adblock Plus for denne siden, og last inn siden på nytt før sender inn rapporten.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus blokkerer ikke et reklameelement">
+<!ENTITY typeSelector.heading "Velg type problem">
+<!ENTITY anonymity.warning "Vi vil ikke kunne svare deg, og det vil sannsynligvis gjøre at rapporten får lavere prioritet.">
+<!ENTITY wizard.title "Problemrapporterer">
+<!ENTITY issues.ownfilters.disable.label "Deaktiver filter">
+<!ENTITY commentPage.description "I tekstfeltet nedenfor kan du skrive en kommentar som kan hjelpe oss til å forstå problemet. Dette er valgfritt, men anbefalt hvis problemet ikke åpenbart. Du kan også se på rapportdataene før de sendes.">
+<!ENTITY comment.lengthWarning "Lengden på din kommentar er lenger enn 1000 bokstav. Bare de første 1000 bokstavene vil bli inkludert i rapporten.">
+<!ENTITY typeSelector.falseNegative.description "Velg dette alternativet hvis et reklameelement vises, selv om Adblock Plus er aktivert.">
+<!ENTITY sendPage.waitMessage "Vennligst vent mens Adblock Plus sender inn din rapport.">
+<!ENTITY dataCollector.heading "Velkommen til problemrapportereren">
+<!ENTITY screenshot.heading "Legg ved skjermdump">
+<!ENTITY sendPage.heading "Send rapport">
+<!ENTITY issues.subscriptionCount.description "Det virker som om du har abonnert på for mange filterabonnementer. Dette oppsettet er ikke oppsettet er ikke anbefalt, da det ofte vil resultere i at du opplever flere problemer med Adblock plus. Vi kan heller ikke ta imot din rapport, siden det er usikkert hvilken filterforfatter det er som eventuelt må fikse filteret sitt. Vennligst fjern alle ikke-nødvendige filtere, og se om samme problem oppstår da.">
+<!ENTITY screenshot.mark.label "Markèr problemet">
+<!ENTITY privacyPolicy.label "Personvern">
+<!ENTITY issues.description "Adblock Plus oppdaget problemer med konfigurasjonene som kan være grunnen til problemet, eller som kan gjøre det vanskelig å undersøke problemet.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/sidebar.dtd
new file mode 100644
index 0000000..1e4e45b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Fremhév elementets kanter">
+<!ENTITY address.label "Adresse">
+<!ENTITY context.open.label "Ã…pne i ny fane">
+<!ENTITY type.label "Type">
+<!ENTITY tooltip.filterSource.label "Filterkilde:">
+<!ENTITY noitems.label "Ingen blokkerbare elementer">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Størrelse:">
+<!ENTITY reattach.label "Gjentilkoble">
+<!ENTITY search.label "&amp;Søk:">
+<!ENTITY docDomain.thirdParty "(tredjeparts)">
+<!ENTITY filterSource.label "Filterkilde">
+<!ENTITY tooltip.docDomain.label "Dokumentkilde:">
+<!ENTITY context.copy.label "Kopier elementets adresse">
+<!ENTITY tooltip.type.label "Type:">
+<!ENTITY context.disablefilter.label "Deaktiver filter ?1?">
+<!ENTITY context.copyFilter.label "Kopier filter">
+<!ENTITY context.block.label "Blokker dette elementet">
+<!ENTITY context.enablefilter.label "Reaktiver filter ?1?">
+<!ENTITY detach.label "Frakoble">
+<!ENTITY whitelisted.label "Hvitelistet side">
+<!ENTITY context.disablefilteronsite.label "Deaktiver dette filteret på ?1?">
+<!ENTITY detached.title "Adblock Plus: Blokkérbare elementer(frittstående)">
+<!ENTITY docDomain.firstParty "(førsteparts)">
+<!ENTITY tooltip.type.whitelisted "(hvitelistet)">
+<!ENTITY tooltip.filter.label "Gjeldende filter:">
+<!ENTITY tooltip.filter.disabled "(deaktivert)">
+<!ENTITY context.editfilter.label "Redigér gjeldende filter">
+<!ENTITY tooltip.type.blocked "(blokkert)">
+<!ENTITY size.label "Størrelse">
+<!ENTITY context.whitelist.label "Legg til unntaksregel for elementet">
+<!ENTITY context.selectAll.label "Velg alle">
+<!ENTITY state.label "Tilstand">
+<!ENTITY docDomain.label "Dokumentkilde">
+<!ENTITY tooltip.address.label "Adresse:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/subscriptionSelection.dtd
new file mode 100644
index 0000000..14ae574
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nb-NO/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Legg til filterabonnement &quot;?1?&quot; også">
+<!ENTITY list.download.failed "Adblock Plus mislyktes i å hente listen med abonnementene.">
+<!ENTITY list.download.retry "Prøv igjen">
+<!ENTITY title.label "Abonnemen&amp;tstittel:">
+<!ENTITY list.download.website "Vis nettside">
+<!ENTITY supplementMessage "Dette filter abonnementet er ment å brukes sammen med filter abonnementet &quot;?1?&quot; som du ikke bruker ennå.">
+<!ENTITY viewList.label "Vis filtre">
+<!ENTITY visitHomepage.label "Besøk hjemmeside">
+<!ENTITY addSubscription.label "Legg til abonnement">
+<!ENTITY dialog.title "Legg til filterabonnement for Adblock Plus">
+<!ENTITY location.label "Filterabonnementets plassering:">
+<!ENTITY fromWeb.description "Vennligst bekreft at du vil legge til dette filterabonnementet. Du kan forandre tittelen på abonnementet, eller plasseringen til abonnementet, før det legges til.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/composer.dtd
new file mode 100644
index 0000000..1ae748e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "aan het e&amp;ind van het adres">
+<!ENTITY domainRestriction.label "Tot domein be&amp;perken:">
+<!ENTITY collapse.default.no.label "Standaard gebruiken (nee)">
+<!ENTITY firstParty.label "A&amp;lleen van eigen website">
+<!ENTITY preferences.label "Bestaande filters &amp;weergeven…">
+<!ENTITY pattern.label "Naar patroon zoeken">
+<!ENTITY thirdParty.label "Alleen van &amp;derden">
+<!ENTITY filter.label "&amp;Nieuwe filter:">
+<!ENTITY collapse.label "&amp;Geblokkeerd onderdeel inklappen:">
+<!ENTITY match.warning "Het door u ingegeven patroon komt niet meer overeen met het te blokkeren/op de witte lijst te plaatsen adres en zal er geen effect op hebben.">
+<!ENTITY anchor.start.label "aan &amp;het begin van het adres">
+<!ENTITY matchCase.label "H&amp;oofdlettergevoelig">
+<!ENTITY custom.pattern.label "&amp;Aangepast:">
+<!ENTITY unselectAllTypes.label "Niets selecteren">
+<!ENTITY type.whitelist.label "&amp;Uitzonderingsregel">
+<!ENTITY regexp.warning "Het patroon dat u heeft gegeven zal worden behandeld als een reguliere expressie. Deze kunnen niet efficiënt worden verwerkt door Adblock Plus en kunnen uw browser traag maken. Als het niet uw bedoeling was een reguliere expressie te schrijven, voeg dan een asterisk (*) aan het eind van het patroon toe.">
+<!ENTITY dialog.title "Adblock Plus-filterregel toevoegen">
+<!ENTITY basic.label "Eenvoudige weergave">
+<!ENTITY type.filter.label "&amp;Blokkeringsfilter">
+<!ENTITY types.label "Toepassen op types:">
+<!ENTITY shortpattern.warning "Het patroon dat u heeft gegeven is te kort om te worden geoptimaliseerd en kan uw browser traag maken. U kunt beter een langere regel voor dit filter kiezen, zodat Adblock Plus het filter efficiënter kan toepassen.">
+<!ENTITY collapse.yes.label "Ja">
+<!ENTITY anchors.label "Alleen patronen accepteren:">
+<!ENTITY collapse.default.yes.label "Standaard gebruiken (ja)">
+<!ENTITY domainRestriction.help "Gebruik deze optie om één of meer domeinen te specificeren, gescheiden door een lijn (|). Het filter zal alleen op deze domeinen worden toegepast. Een tilde (~) voor een domein betekent dat het filter niet moet worden toegepast op dat domein.">
+<!ENTITY accept.label "Filter toevoegen">
+<!ENTITY options.label "Opties">
+<!ENTITY disabled.warning "Adblock Plus is momenteel uitgeschakeld. U kunt nog wel filters toevoegen, maar ze worden niet toegepast tenzij u [link]Adblock Plus weer inschakelt[/link].">
+<!ENTITY anchor.start.flexible.label "aan &amp;het begin van de domeinnaam">
+<!ENTITY collapse.no.label "Nee">
+<!ENTITY selectAllTypes.label "Alles selecteren">
+<!ENTITY advanced.label "Geavanceerde weergave">
+<!ENTITY pattern.explanation "Het patroon kan ieder gedeelte zijn van het adres, waarbij een asterisk (*) als wildcard geldt. Het filter wordt alleen toegepast op adressen die met het patroon overeenkomen.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/filters.dtd
new file mode 100644
index 0000000..f04172e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Al uw aangepaste filters worden vervangen door de inhoud van het geselecteerde bestand. Wilt u doorgaan?">
+<!ENTITY slow.column "T&amp;rage filters">
+<!ENTITY enabled.column "&amp;Ingeschakeld">
+<!ENTITY subscription.lastDownload.checksumMismatch "Mislukt, afwijkend controlecijfer">
+<!ENTITY noFiltersInGroup.text "De geselecteerde groep is leeg.">
+<!ENTITY subscription.actions.label "Acties">
+<!ENTITY filter.selectAll.label "Alles selecteren">
+<!ENTITY backupButton.label "&amp;Back-up en herstel">
+<!ENTITY restore.minVersion.warning "Waarschuwing: het bestand is gemaakt met een nieuwere versie van Adblock Plus. U dient bij te werken naar de laatste versie voordat u kunt herstellen vanuit dit bestand.">
+<!ENTITY restore.error "De gegevens in het bestand kunnen niet worden verwerkt, wellicht is het geen back-up-bestand van Adblock Plus?">
+<!ENTITY sort.ascending.label "&amp;A &gt; Z sortering">
+<!ENTITY sort.label "&amp;Sorteren op">
+<!ENTITY subscription.source.label "Filterlijst">
+<!ENTITY hitcount.column "&amp;Treffers">
+<!ENTITY noFilters.text "U heeft nog geen aangepaste filters.">
+<!ENTITY backup.custom.title "Alleen aangepaste filters">
+<!ENTITY subscription.external.label "Bijgewerkt door een andere extensie">
+<!ENTITY subscription.delete.label "Verwijderen">
+<!ENTITY noGroupSelected.text "U dient een filtergroep te selecteren voordat de filters kunnen worden weergegeven.">
+<!ENTITY filter.cut.label "Knippen">
+<!ENTITY restore.default.label "Back-up van ?1? terugzetten">
+<!ENTITY subscription.lastDownload.inProgress "Downloaden…">
+<!ENTITY subscriptions.tab.label "Filterabonnementen">
+<!ENTITY sort.descending.label "&amp;Z &gt; A sortering">
+<!ENTITY filters.remove.warning "Wilt u echt alle geselecteerde filters verwijderen?">
+<!ENTITY filter.delete.label "Verwijderen">
+<!ENTITY addSubscriptionAdd.label "Toevoegen">
+<!ENTITY viewMenu.label "Beeld">
+<!ENTITY subscription.lastDownload.unknown "Onbekend">
+<!ENTITY addSubscriptionCancel.label "Annuleren">
+<!ENTITY subscription.enabled.label "Ingeschakeld">
+<!ENTITY noSubscriptions.text "U heeft nog geen filterabonnementen toegevoegd. Adblock Plus blokkeert niets zonder filters, gebruik ‘Filterabonnement toevoegen’ om er één toe te voegen.">
+<!ENTITY subscription.update.label "Filters bijwerken">
+<!ENTITY dialog.title "Adblock Plus-filtervoorkeuren">
+<!ENTITY addFilter.label "Fil&amp;ter toevoegen">
+<!ENTITY subscription.minVersion.warning "Dit filterabonnement vereist een nieuwere versie van Adblock Plus, u dient bij te werken naar de nieuwste versie.">
+<!ENTITY subscription.lastDownload.invalidURL "Mislukt, geen geldig adres">
+<!ENTITY backup.error "Er is een fout opgetreden bij het wegschrijven van de filters. Zorg ervoor dat het bestand niet tegen schrijven beveiligd is of wordt gebruikt door een andere toepassing.">
+<!ENTITY filter.moveUp.label "Omhoog">
+<!ENTITY addGroup.label "&amp;Filtergroep toevoegen">
+<!ENTITY filter.edit.label "Bewerken">
+<!ENTITY subscription.showHideFilters.label "Filters weergeven/verbergen">
+<!ENTITY acceptableAds2.label "&amp;Enkele niet-opdringerige advertenties toestaan">
+<!ENTITY addSubscriptionOther.label "Een ander abonnement toevoegen">
+<!ENTITY close.label "Sluiten">
+<!ENTITY sort.none.label "&amp;Ongesorteerd">
+<!ENTITY filter.actions.label "Filteracties">
+<!ENTITY filter.copy.label "Kopiëren">
+<!ENTITY filter.moveDown.label "Omlaag">
+<!ENTITY filter.resetHitCounts.label "Trefferstatistieken opnieuw instellen">
+<!ENTITY readMore.label "Lees meer">
+<!ENTITY subscription.moveUp.label "Omhoog">
+<!ENTITY addSubscription.label "&amp;Filterabonnement toevoegen">
+<!ENTITY subscription.homepage.label "Startpagina">
+<!ENTITY backup.complete.title "Alle filters en abonnementen">
+<!ENTITY restore.own.label "Eigen back-up terugzetten">
+<!ENTITY restore.complete.warning "Al uw filtervoorkeuren worden vervangen door de inhoud van het geselecteerde bestand. Wilt u doorgaan?">
+<!ENTITY filters.tab.label "Aangepaste filters">
+<!ENTITY backup.label "Nieuwe back-up maken">
+<!ENTITY find.label "Z&amp;oeken">
+<!ENTITY subscription.moveDown.label "Omlaag">
+<!ENTITY subscription.lastDownload.connectionError "Mislukt, downloadprobleem">
+<!ENTITY subscription.lastDownload.success "Gelukt">
+<!ENTITY subscription.lastDownload.invalidData "Mislukt, geen geldige filterlijst">
+<!ENTITY filter.paste.label "Plakken">
+<!ENTITY subscription.disabledFilters.enable "Uitgeschakelde filters inschakelen">
+<!ENTITY lasthit.column "&amp;Laatste treffer">
+<!ENTITY subscription.editTitle.label "Titel bewerken">
+<!ENTITY subscription.disabledFilters.warning "Enkele filters in dit abonnement zijn uitgeschakeld.">
+<!ENTITY filter.column "&amp;Filterregel">
+<!ENTITY subscription.lastDownload.label "Laatste download:">
+<!ENTITY viewList.label "Lijst bekijken">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/firstRun.properties
new file mode 100644
index 0000000..309fdcd
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Browse privé door 'tracking' uit te schakelen - verberg uw gegevens voor advertentiebedrijven die al uw surfgedrag zouden volgen.
+firstRun_toggle_off=UIT
+firstRun_feature_tracking=Tracking uitschakelen
+firstRun_feature_malware=Malware Blokkering
+firstRun_title=Adblock plus is geïnstalleerd
+firstRun_acceptableAdsExplanation=Wij zouden websites willen aanmoedigen eenvoudige, niet-opdringerige advertenties te gebruiken. Daarom hebben we <a>strikte richtlijnen</a> opgesteld om acceptabele advertenties te identificeren, die worden getoond onder Standaardinstellingen. Als u alsnog alle advertenties wilt blokkeren, kunt u dit in een paar seconden <a>uitschakelen</a>.
+firstRun_toggle_on=AAN
+firstRun_contributor_credits=Bijdrager Credits
+firstRun_dataCorruptionWarning=Blijft deze pagina verschijnen? <a>Klik hier!</a>
+firstRun_acceptableAdsHeadline=Vervelende advertenties zullen nu worden geblokkeerd
+firstRun_share=Vertel uw vrienden
+firstRun_share_headline=<a>Help ons</a> om van het web een betere plek te maken
+firstRun_features=Adblock Plus kan meer doen dan advertenties blokkeren
+firstRun_feature_malware_description=Maak het browsen veiliger door het blokkeren van bekende malware domeinen.
+firstRun_feature_social_description=Verwijder social media-knoppen (zoals de Facebook "Like" knop) automatisch, omdat die op webpagina's verschijnen en uw surfgedrag volgen.
+firstRun_donate=doneren
+firstRun_donate_label=Steun ons project
+firstRun_feature_social=Verwijder Social Media knoppen
+firstRun_legacySafariWarning=U gebruikt een oude versie van Safari die niet wordt ondersteund door Adblock Plus. Sommige websites kunnen daardoor onjuist worden weergegeven. Wij raden u aan een update uit te voeren naar Safari versie 6.1.1 of hoger (voor Mac OS X 10.8 Mountain Lion), Safari versie 7.0.1 of hoger (voor Mac OS X 10.9 Mavericks) of de laatste versie van Mozilla Firefox, Google Chrome of Opera te gebruiken.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/global.properties
new file mode 100644
index 0000000..15b65fd
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Geen blokkeerbare onderdelen op deze pagina
+action3_tooltip=Klik om Adblock Plus in/uit te schakelen.
+notification_antiadblock_title=Gerichte berichten verbergen?
+type_label_script=script
+filter_elemhide_nocriteria=Geen criteria opgegeven om het te verbergen element te herkennen
+blockingGroup_title=Advertentieblokkaderegels
+whitelisted_tooltip=Adblock Plus is ingeschakeld maar staat uit voor deze pagina.
+type_label_stylesheet=stylesheet
+blocked_count_tooltip=?1? van de ?2?
+type_label_font=lettertype
+type_label_popup=pop-upvenster
+filter_regexp_tooltip=Dit filter is een reguliere expressie of te kort om te kunnen worden geoptimaliseerd. Te veel van dit soort filters kan uw browser traag maken.
+action0_tooltip=Klik om het contextmenu te openen, middelklik om in/uit te schakelen.
+whitelisted_page=Adblock Plus is uitgeschakeld voor deze pagina
+remove_group_warning=Wilt u echt deze groep verwijderen?
+action1_tooltip=Klik om blokkeerbare onderdelen te openen/sluiten, middelklik om in/uit te schakelen.
+type_label_xmlhttprequest=XML-verzoek
+active_tooltip=Adblock Plus is actief, ?1? filterabonnement(en) en ?2? aangepast(e) filter(s) in gebruik.
+type_label_document=document
+type_label_object_subrequest=object-subverzoek
+whitelistGroup_title=Uitzonderingsregels
+disabled_tooltip=Adblock Plus is uitgeschakeld.
+filter_elemhide_duplicate_id=Er kan slechts één ID van het te verbergen element worden opgegeven
+type_label_object=object
+action2_tooltip=Klik om voorkeuren te openen, middelklik om in/uit te schakelen.
+type_label_subdocument=frame
+clearStats_warning=Dit stelt alle filtertrefferstatistieken opnieuw in en schakelt het tellen van filtertreffers uit. Wilt u doorgaan?
+notification_antiadblock_message=Deze website staat er om bekend dat ze berichten laat zien die op Adblock plus gebruikers gericht zijn. Wilt u dat Adblock Plus deze verbergt?
+blocked_count_addendum=(ook op witte lijst: ?1?, verborgen: ?2?)
+subscription_invalid_location=Deze filterlijstlocatie is geen geldige URL en ook geen geldige bestandsnaam.
+type_label_image=afbeelding
+remove_subscription_warning=Weet u zeker dat u dit abonnement wilt verwijderen?
+type_label_other=anders
+mobile_menu_enable=ABP: Inschakelen
+type_label_media=audio/video
+mobile_menu_disable_site=ABP: Uitschakelen op ?1?
+elemhideGroup_title=Elementverbergingsregels
+mobile_menu_enable_site=ABP: Inschakelen op ?1?
+type_label_elemhide=verborgen
+newGroup_title=Nieuwe filtergroep
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/overlay.dtd
new file mode 100644
index 0000000..9537253
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Ja">
+<!ENTITY notification.button.no "&amp;Nee">
+<!ENTITY sync.label "Syn&amp;chroniseer Adblock Plus instellingen">
+<!ENTITY whitelist.site.label "Uitschakelen op ?1?">
+<!ENTITY filters.label "&amp;Filtervoorkeuren">
+<!ENTITY disable.label "Overal uitschakelen">
+<!ENTITY objecttab.title "Blokkeren">
+<!ENTITY objecttab.tooltip "Klik hier om dit object te blokkeren met Adblock Plus">
+<!ENTITY menuitem.label "&amp;Adblock Plus-voorkeuren">
+<!ENTITY objecttabs.label "&amp;Tabs weergeven op Flash en Java">
+<!ENTITY sendReport.label "&amp;Probleem op deze pagina rapporteren">
+<!ENTITY whitelist.page.label "Alleen op deze pagina uitschakelen">
+<!ENTITY context.image.label "Adblock Plus: Afbeelding blokkeren">
+<!ENTITY counthits.label "&amp;Filtertreffers tellen">
+<!ENTITY opensidebar.label "&amp;Blokkeerbare onderdelen openen">
+<!ENTITY notification.button.close "&amp;Sluit">
+<!ENTITY contribute.label "Draag bij aan Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Deelvenster blokkeren">
+<!ENTITY blocked.tooltip "Geblokkeerde onderdelen op deze pagina:">
+<!ENTITY hideplaceholders.label "P&amp;laatshouders van geblokkeerde elementen verbergen">
+<!ENTITY showinstatusbar.label "In &amp;statusbalk weergeven">
+<!ENTITY sidebar.title "Blokkeerbare onderdelen op deze pagina">
+<!ENTITY options.label "&amp;Opties">
+<!ENTITY context.object.label "Adblock Plus: Object blokkeren">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Opnieuw inschakelen op deze pagina">
+<!ENTITY filters.tooltip "Meest actieve filters:">
+<!ENTITY closesidebar.label "&amp;Blokkeerbare onderdelen sluiten">
+<!ENTITY showintoolbar.label "In werk&amp;balk weergeven">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Audio/video blokkeren">
+<!ENTITY subscription.update.label "Filters bijwerken">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/sendReport.dtd
new file mode 100644
index 0000000..90265fb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "Onge&amp;daan maken">
+<!ENTITY issues.disabledgroups.description "De volgende filterabonnementen / filtergroepen zijn uitgeschakeld, maar ze hebben mogelijk wel een effect op deze pagina:">
+<!ENTITY showData.label "Rapportgegevens weergeven">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blokkeert te &amp;veel">
+<!ENTITY issues.change.description "Uw configuratie is gewijzigd. Laad de pagina opnieuw om de wijzigingen te testen en een rapport in te dienen als het probleem niet is opgelost door de wijzigingen.">
+<!ENTITY email.label "E-&amp;mailadres:">
+<!ENTITY issues.openPreferences.label "Filtervoorkeuren openen">
+<!ENTITY sendPage.confirmation "Uw rapport is opgeslagen. U kunt het bekijken op het volgende adres:">
+<!ENTITY copyLink.label "Rapport&amp;koppeling kopiëren">
+<!ENTITY issues.nofilters.description "Adblock Plus blokkeert niets op de huidige pagina. Het door u ervaren probleem hangt hoogstwaarschijnlijk niet samen met Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Het door u gemelde probleem is waarschijnlijk al bekend. Meer informatie:">
+<!ENTITY typeSelector.other.description "Selecteer deze optie als u een probleem met Adblock Plus zelf vermoedt in plaats van met de filters.">
+<!ENTITY issues.disabledgroups.enable.label "Filterabonnement / filtergroep inschakelen">
+<!ENTITY typeWarning.override.label "Ik be&amp;grijp het en wil het rapport toch indienen">
+<!ENTITY issues.disabled.enable.label "Adblock Plus inschakelen">
+<!ENTITY update.fixed.description "De updates voor uw filterabonnementen hebben waarschijnlijk het door u gerapporteerde probleem verholpen. Laad de pagina opnieuw en probeer het nog eens, en druk opnieuw op Rapporteren als het probleem aanhoudt.">
+<!ENTITY anonymous.label "&amp;Anonieme bijdrage">
+<!ENTITY reloadButton.label "Pagina opnie&amp;uw laden">
+<!ENTITY recentReports.clear.label "Alle rappor&amp;ten verwijderen">
+<!ENTITY typeSelector.description "Dit venster leidt u door de stappen die nodig zijn voor het indienen van een Adblock Plus-probleemrapport. Selecteer eerst het probleemtype dat u ervaart op deze pagina:">
+<!ENTITY screenshot.remove.label "Gevoelige gegevens ver&amp;wijderen">
+<!ENTITY issues.ownfilters.description "Enkele van de op deze pagina toegepaste filters zijn door een gebruiker gedefinieerd. Schakel de filters uit die mogelijk het probleem hebben veroorzaakt:">
+<!ENTITY update.inProgress.description "Adblock Plus dient uw filterabonnementen bij te werken om te controleren of het probleem niet al is opgelost. Een ogenblik…">
+<!ENTITY sendPage.retry.label "Opnieuw verzenden">
+<!ENTITY data.label "Ra&amp;pportgegevens:">
+<!ENTITY recentReports.label "Uw onlangs ingediende rapporten">
+<!ENTITY typeWarning.description "U hebt aangegeven dat u een algemeen probleem met Adblock Plus wilt rapporteren in plaats van een probleem met de filters. Merk op dat dergelijke problemen het beste kunnen worden gerapporteerd in het [link]Adblock Plus-forum[/link]. U dient de probleemrapportage alleen te gebruiken om een bestaande discussie aan te vullen, aangezien niemand uw rapport zal opmerken tenzij u een koppeling ernaartoe geeft. De automatisch aangemaakte koppeling wordt weergegeven na indienenvan het rapport.">
+<!ENTITY issues.disabled.description "Adblock Plus is uitgeschakeld, in de huidige staat zal het niets blokkeren.">
+<!ENTITY attachExtensions.label "Voeg een lijst met actieve e&amp;xtensies toe aan het rapport voor het geval conflicterende add-ons de oorzaak van het probleem zijn">
+<!ENTITY issues.nosubscriptions.add.label "Filterabonnement toevoegen">
+<!ENTITY issues.disabledfilters.enable.label "Filter inschakelen">
+<!ENTITY issues.override.label "De &amp;configuratie is juist, doorgaan met rapportage">
+<!ENTITY issues.nosubscriptions.description "Het lijkt er op dat u geen abonnement heeft op een filterlijst die automatisch ongewenste inhoud van websites verwijdert.">
+<!ENTITY typeSelector.falsePositive.description "Selecteer deze optie als de pagina belangrijke inhoudt niet weergeeft, onjuist wordt weergegeven of niet goed werkt. U kunt bepalen of Adblock Plus de oorzaak hiervan is door het tijdelijk uit te schakelen.">
+<!ENTITY typeSelector.other.label "&amp;Overige problemen">
+<!ENTITY emailComment.label "We raden u aan een geldig e-mailadres in te voeren, zodat we contact met u op kunnen nemen als er vragen zijn over uw verslag. Hierdoor kunnen wij uw bijdragen ook herkennen en ze hoger prioriteren.">
+<!ENTITY issues.whitelist.remove.label "Adblock Plus weer inschakelen op deze pagina">
+<!ENTITY outdatedSubscriptions.description "De volgende filterabonnementen zijn ten minste twee weken niet meer bijgewerkt. Werk ze eerst bij voordat u een rapport indient, het probleem is mogelijk al verholpen.">
+<!ENTITY dataCollector.description "Wacht enkele momenten terwijl Adblock Plus de benodigde gegevens verzamelt.">
+<!ENTITY sendButton.label "Rapport ver&amp;zenden">
+<!ENTITY comment.label "Opme&amp;rking (optioneel):">
+<!ENTITY sendPage.errorMessage "De poging om het rapport te verzenden is mislukt met foutcode ‘?1?’. Controleer uw internetverbinding en probeer het opnieuw. Als het probleem aanhoudt, vraag dan om hulp op het [link]Adblock Plus-forum[/link].">
+<!ENTITY showRecentReports.label "Onlangs ingediende rapporten weergeven">
+<!ENTITY commentPage.heading "Opmerking toevoegen">
+<!ENTITY update.start.label "Nu bijwerken">
+<!ENTITY issues.disabledfilters.description "De volgende filters zijn uitgeschakeld, maar ze hebben mogelijk wel een effect op deze pagina:">
+<!ENTITY screenshot.description "Dezelfde pagina kan er verschillend uitzien voor verschillende personen. We begrijpen het probleem misschien beter als u een schermafbeelding toevoegt aan uw rapport. U kunt secties met gevoelige informatie verwijderen en gebieden waar het probleem zich voordoet markeren. Klik op de bijbehorende knop om dit te doen en selecteer een sectie van de afbeelding met uw muis.">
+<!ENTITY screenshot.attach.label "Een pagina-afbeelding bi&amp;j het rapport bijvoegen">
+<!ENTITY issues.whitelist.description "Adblock Plus is momenteel uitgeschakeld op de door u gerapporteerde pagina. Schakel het weer in en herlaad de pagina voordat u het rapport indient om te helpen bij het onderzoeken van dit probleem.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus blokk&amp;eert een advertentie niet">
+<!ENTITY typeSelector.heading "Selecteer probleemtype">
+<!ENTITY anonymity.warning "We kunnen niet met u in contact komen en zullen uw verslag daarom waarschijnlijk lager prioriteren.">
+<!ENTITY wizard.title "Probleemrapportage">
+<!ENTITY issues.ownfilters.disable.label "Filter uitschakelen">
+<!ENTITY commentPage.description "In het onderstaande tekstveld kunt u een opmerking toevoegen om ons te helpen het probleem te begrijpen. Deze stap is optioneel maar wordt aanbevolen als het probleem niet evident is. U kunt de rapportgegevens ook nakijken voordat u het rapport verstuurt.">
+<!ENTITY comment.lengthWarning "De lengte van uw opmerking overschrijdt 1000 tekens. Alleen de eerste 1000 tekens worden verzonden.">
+<!ENTITY typeSelector.falseNegative.description "Selecteer deze optie als een advertentie wordt weergegeven ondanks het feit dat Adblock Plus is ingeschakeld.">
+<!ENTITY sendPage.waitMessage "Een ogenblik terwijl Adblock Plus uw rapport indient.">
+<!ENTITY dataCollector.heading "Welkom bij de probleemrapportage">
+<!ENTITY screenshot.heading "Schermafbeelding toevoegen">
+<!ENTITY sendPage.heading "Rapport verzenden">
+<!ENTITY issues.subscriptionCount.description "Het lijkt er op dat u op te veel filterabonnementen geabonneerd bent. Dit is niet aanbevolen, want het verhoogt de kans op problemen. Wij kunnen ook geen probleemmeldingen accepteren, omdat het niet duidelijk is van welk filterabonnement de auteur actie dient te ondernemen. Verwijder alstublieft alle filterabonnementen op de hoogst nodige na en controleer of het probleem dan nog steeds optreedt.">
+<!ENTITY screenshot.mark.label "Het problee&amp;m markeren">
+<!ENTITY privacyPolicy.label "Privacybeleid">
+<!ENTITY issues.description "Adblock plus heeft problemen met uw configuratie gedetecteerd die mogelijk verantwoordelijk zijn voor dit probleem of het onderzoeken van het rapport bemoeilijken.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/sidebar.dtd
new file mode 100644
index 0000000..d715dff
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Randen laten knipperen">
+<!ENTITY address.label "Adres">
+<!ENTITY context.open.label "Openen in een nieuw tabblad">
+<!ENTITY type.label "Type">
+<!ENTITY tooltip.filterSource.label "Filterbron:">
+<!ENTITY noitems.label "Geen blokkeerbare onderdelen">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Grootte:">
+<!ENTITY reattach.label "Vastkoppelen">
+<!ENTITY search.label "&amp;Zoeken:">
+<!ENTITY docDomain.thirdParty "(derden)">
+<!ENTITY filterSource.label "Filterbron">
+<!ENTITY tooltip.docDomain.label "Documentbron:">
+<!ENTITY context.copy.label "Adres kopiëren">
+<!ENTITY tooltip.type.label "Type:">
+<!ENTITY context.disablefilter.label "Filter ?1? uitschakelen">
+<!ENTITY context.copyFilter.label "Filter kopiëren">
+<!ENTITY context.block.label "Dit onderdeel blokkeren">
+<!ENTITY context.enablefilter.label "Filter ?1? inschakelen">
+<!ENTITY detach.label "Loskoppelen">
+<!ENTITY whitelisted.label "Toegestane pagina">
+<!ENTITY context.disablefilteronsite.label "Filter uitschakelen op ?1?">
+<!ENTITY detached.title "Adblock Plus: Blokkeerbare onderdelen (losgekoppeld)">
+<!ENTITY docDomain.firstParty "(rechtstreeks)">
+<!ENTITY tooltip.type.whitelisted "(toegestaan)">
+<!ENTITY tooltip.filter.label "Toegepast filter:">
+<!ENTITY tooltip.filter.disabled "(uitgeschakeld)">
+<!ENTITY context.editfilter.label "Toegepast filter bewerken">
+<!ENTITY tooltip.type.blocked "(geblokkeerd)">
+<!ENTITY size.label "Grootte">
+<!ENTITY context.whitelist.label "Uitzonderingsregel voor dit onderdeel toevoegen">
+<!ENTITY context.selectAll.label "Alles selecteren">
+<!ENTITY state.label "Status">
+<!ENTITY docDomain.label "Documentbron">
+<!ENTITY tooltip.address.label "Adres:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/subscriptionSelection.dtd
new file mode 100644
index 0000000..cfc0f76
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/nl/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Filterabonnement “?1?†oo&amp;k toevoegen">
+<!ENTITY list.download.failed "Adblock Plus kan de lijst met abonnementen niet ophalen.">
+<!ENTITY list.download.retry "Opnieuw proberen">
+<!ENTITY title.label "A&amp;bonnementstitel:">
+<!ENTITY list.download.website "Website bekijken">
+<!ENTITY supplementMessage "Dit filterabonnement is bedoeld om samen gebruikt te worden met het filterabonnement “?1?â€, dat u nog niet gebruikt.">
+<!ENTITY viewList.label "Filters bekijken">
+<!ENTITY visitHomepage.label "Startpagina bezoeken">
+<!ENTITY addSubscription.label "Abonneren">
+<!ENTITY dialog.title "Adblock Plus filterabonnement toevoegen">
+<!ENTITY location.label "Fi&amp;lterlijstlocatie:">
+<!ENTITY fromWeb.description "Bevestig a.u.b. dat u dit filterabonnement wilt toevoegen. U kunt de abonnementstitel of -locatie wijzigen voor toevoegen.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/composer.dtd
new file mode 100644
index 0000000..37e1edc
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "na &amp;końcu adresu">
+<!ENTITY domainRestriction.label "Ogranicz do dom&amp;eny:">
+<!ENTITY collapse.default.no.label "Użyj domyślnej (nie)">
+<!ENTITY firstParty.label "Tylko pie&amp;rwszy człon">
+<!ENTITY preferences.label "Wyświetl istniejące &amp;filtry…">
+<!ENTITY pattern.label "Poszukaj wzorca">
+<!ENTITY thirdParty.label "Tylko trze&amp;ci człon">
+<!ENTITY filter.label "&amp;Nowy filtr:">
+<!ENTITY collapse.label "&amp;Zwiń zablokowane:">
+<!ENTITY match.warning "Podany wzorzec nie pasuje do żadnego blokowanego/dozwolonego adresu i nie będzie miał zastosowania.">
+<!ENTITY anchor.start.label "na &amp;poczÄ…tku adresu">
+<!ENTITY matchCase.label "&amp;Uwzględniaj wielkość liter">
+<!ENTITY custom.pattern.label "Wła&amp;sny:">
+<!ENTITY unselectAllTypes.label "Odznacz wszystko">
+<!ENTITY type.whitelist.label "Reguła &amp;wyjątku">
+<!ENTITY regexp.warning "Podany wzorzec będzie interpretowany jako wyrażenie regularne, które nie może być skutecznie przetwarzane przez Adblock Plusa i może powodować spowolnienie działania przeglądarki. Jeśli nie zamierzasz używać wyrażenia regularnego, dodaj gwiazdkę (*) na końcu wzorca.">
+<!ENTITY dialog.title "Dodawanie reguły filtra">
+<!ENTITY basic.label "WyglÄ…d podstawowy">
+<!ENTITY type.filter.label "Filtr &amp;blokujÄ…cy">
+<!ENTITY types.label "Zastosuj do typów:">
+<!ENTITY shortpattern.warning "Podany wzorzec jest zbyt krótki, by go zoptymalizować i może spowolnić działanie przeglądarki. Zaleca się dla tego filtra wybrać dłuższy ciąg znaków, by umożliwić Adblock Plusowi bardziej efektywne zastosowanie tego filtra.">
+<!ENTITY collapse.yes.label "Tak">
+<!ENTITY anchors.label "Akceptuj tylko wzorzec:">
+<!ENTITY collapse.default.yes.label "Użyj domyślnej (tak)">
+<!ENTITY domainRestriction.help "Użyj tej opcji do określania jednej lub kilku domen, oddzielając ich nazwy znakiem (|). Filtr będzie stosowany jedynie dla wybranych domen. Znak tyldy (~) umieszczony przed nazwą domeny wskazuje, że filtr nie zostanie zastosowany w tej domenie.">
+<!ENTITY accept.label "Dodaj filtr">
+<!ENTITY options.label "Opcje">
+<!ENTITY disabled.warning "Adblock Plus jest aktualnie wyłączony. Możesz nadal dodawać filtry, ale nie będą one działały do czasu [link]włączenia Adblock Plusa[/link].">
+<!ENTITY anchor.start.flexible.label "na p&amp;oczÄ…tku nazwy domeny">
+<!ENTITY collapse.no.label "Nie">
+<!ENTITY selectAllTypes.label "Zaznacz wszystko">
+<!ENTITY advanced.label "WyglÄ…d zaawansowany">
+<!ENTITY pattern.explanation "Wzorzec może być częścią adresu – gwiazdka (*) działa jako wieloznacznik. Filtr będzie stosowany tylko w adresach pasujących do tego wzorca.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/filters.dtd
new file mode 100644
index 0000000..3d08e0f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Wszystkie własne filtry zostaną zastąpione zawartością wybranego pliku. Czy chcesz kontynuować?">
+<!ENTITY slow.column "&amp;Wolne filtry">
+<!ENTITY enabled.column "A&amp;ktywny">
+<!ENTITY subscription.lastDownload.checksumMismatch "Nie powiodło się – niepoprawna suma kontrolna">
+<!ENTITY noFiltersInGroup.text "Wybrana grupa jest pusta">
+<!ENTITY subscription.actions.label "Czynności">
+<!ENTITY filter.selectAll.label "Zaznacz wszystko">
+<!ENTITY backupButton.label "&amp;Tworzenie i odtwarzanie kopii">
+<!ENTITY restore.minVersion.warning "Ostrzeżenie! Plik został utworzony za pomocą najnowszej wersji Adblock Plusa. Przed odtworzeniem zawartości tego pliku, należy zainstalować najnowszą wersję Adblock Plusa.">
+<!ENTITY restore.error "Nie można przetworzyć danych filtra. Może to nie jest plik kopii zapasowej Adblock Plusa?">
+<!ENTITY sort.ascending.label "Kierunek sortow&amp;ania A &gt; Z">
+<!ENTITY sort.label "&amp;Sortuj wg">
+<!ENTITY subscription.source.label "Zawartość zestawu">
+<!ENTITY hitcount.column "&amp;Użycie">
+<!ENTITY noFilters.text "Nie masz jeszcze żadnych własnych filtrów.">
+<!ENTITY backup.custom.title "Tylko własne filtry">
+<!ENTITY subscription.external.label "Zaktualizowany przez inne rozszerzenie">
+<!ENTITY subscription.delete.label "Usuń">
+<!ENTITY noGroupSelected.text "Aby filtry mogły być wyświetlane, należy najpierw wybrać grupę.">
+<!ENTITY filter.cut.label "Wytnij">
+<!ENTITY restore.default.label "Odtwórz kopię z dnia ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Pobieranie…">
+<!ENTITY subscriptions.tab.label "Zestawy filtrów">
+<!ENTITY sort.descending.label "Kierunek sortowania &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Czy na pewno chcesz usunąć wszystkie wybrane filtry?">
+<!ENTITY filter.delete.label "Usuń">
+<!ENTITY addSubscriptionAdd.label "Dodaj">
+<!ENTITY viewMenu.label "Widok">
+<!ENTITY subscription.lastDownload.unknown "nieznane">
+<!ENTITY addSubscriptionCancel.label "Anuluj">
+<!ENTITY subscription.enabled.label "Aktywny">
+<!ENTITY noSubscriptions.text "Jeszcze nie dodano żadnego zestawu filtrów. Adblock Plus nie może nic blokować bez filtrów. NaciÅ›nij przycisk „Dodaj zestaw filtrów…â€, by dodać jakiÅ› filtr.">
+<!ENTITY subscription.update.label "Aktualizuj filtry">
+<!ENTITY dialog.title "Add Adblock Plus – ustawienia filtrów">
+<!ENTITY addFilter.label "Dodaj fi&amp;ltr">
+<!ENTITY subscription.minVersion.warning "Ten zestaw filtrów działa z najnowszą wersją Adblock Plusa. Zaktualizuj Adblock Plusa.">
+<!ENTITY subscription.lastDownload.invalidURL "Nie powiodło się – nieprawidłowy adres">
+<!ENTITY backup.error "W trakcie zapisu filtrów wystąpił błąd. Sprawdź, czy czasami plik nie ma zabezpieczenia przed zapisem lub nie jest używany przez inną aplikację.">
+<!ENTITY filter.moveUp.label "Przenieś w górę">
+<!ENTITY addGroup.label "Dodaj &amp;grupę filtrów">
+<!ENTITY filter.edit.label "Edytuj">
+<!ENTITY subscription.showHideFilters.label "Wyświetl/ukryj filtry">
+<!ENTITY acceptableAds2.label "Zezwalaj na nie natrętne rekla&amp;my">
+<!ENTITY addSubscriptionOther.label "Wybierz inny zestaw">
+<!ENTITY close.label "Zamknij">
+<!ENTITY sort.none.label "Ni&amp;eposortowane">
+<!ENTITY filter.actions.label "Czynności filtrów">
+<!ENTITY filter.copy.label "Kopiuj">
+<!ENTITY filter.moveDown.label "Przenieś w dół">
+<!ENTITY filter.resetHitCounts.label "Resetuj statystyki użycia">
+<!ENTITY readMore.label "Dowiedz się więcej">
+<!ENTITY subscription.moveUp.label "Przenieś w górę">
+<!ENTITY addSubscription.label "&amp;Dodaj zestaw filtrów">
+<!ENTITY subscription.homepage.label "Strona domowa">
+<!ENTITY backup.complete.title "Wszystkie filtry i zestawy">
+<!ENTITY restore.own.label "Odtwórz własną kopię">
+<!ENTITY restore.complete.warning "Wszystkie ustawienia filtrów zostaną zastąpione zawartością wybranego pliku. Czy chcesz kontynuować?">
+<!ENTITY filters.tab.label "Własne filtry">
+<!ENTITY backup.label "Utwórz nową kopię">
+<!ENTITY find.label "Z&amp;najdź">
+<!ENTITY subscription.moveDown.label "Przenieś w dół">
+<!ENTITY subscription.lastDownload.connectionError "Nie powiodło się – błąd pobierania">
+<!ENTITY subscription.lastDownload.success "Zakończono pomyślnie">
+<!ENTITY subscription.lastDownload.invalidData "Nie powiodło się – nieprawidłowy zestaw filtrów">
+<!ENTITY filter.paste.label "Wklej">
+<!ENTITY subscription.disabledFilters.enable "Włącz wyłączone filtry">
+<!ENTITY lasthit.column "&amp;Ostatnie użycie">
+<!ENTITY subscription.editTitle.label "Edytuj nazwÄ™ zestawu">
+<!ENTITY subscription.disabledFilters.warning "Niektóre filtry w tym zestawie są wyłączone.">
+<!ENTITY filter.column "&amp;Reguła filtru">
+<!ENTITY subscription.lastDownload.label "Ostatnie pobieranie:">
+<!ENTITY viewList.label "Zobacz listÄ™">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/firstRun.properties
new file mode 100644
index 0000000..dee4d0f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Przeglądaj, zachowując prywatność poprzez wyłączenie śledzenia, ukrywając swoje ślady przed firmami reklamowymi, które chciałyby śledzić każdy twój ruch.
+firstRun_toggle_off=WYÅ.
+firstRun_feature_tracking=Wyłączenie śledzenia
+firstRun_feature_malware=Blokowanie złośliwego oprogramowania
+firstRun_title=Adblock Plus został zainstalowany
+firstRun_toggle_on=WÅ.
+firstRun_acceptableAdsExplanation=Chcielibyśmy zachęcić witryny do używania prostych, dyskretnych reklam. Dlatego mamy zdefiniowane<a> ścisłe wytyczne </ a>określające akceptowalne reklamy wyświetlane na podstawie tych ustawień. Jeśli chcesz blokować każdą reklamę, możesz tę funkcję <a> wyłączyć </ a> w ciągu kilku sekund.
+firstRun_contributor_credits=Podziękowania dla współtwórców
+firstRun_dataCorruptionWarning=Czy ta strona ma być wyświetlana? <a>Kliknij tutaj!</a>
+firstRun_acceptableAdsHeadline=Irytujące reklamy będą teraz blokowane
+firstRun_share=Powiedz znajomym
+firstRun_share_headline=<a>Pomóż nam</a> uczynić internet lepszym miejscem
+firstRun_feature_social_description=Automatycznie pozbÄ…dź siÄ™ przycisków dodawanych przez media spoÅ‚ecznoÅ›ciowe, takich jak facebookowy „LubiÄ™ to!â€, które Å›ledzÄ… twoje zachowanie.
+firstRun_filterlistsReinitializedWarning=Wygląda na to, że w wyniku błędu wszystkie filtry zostały usunięte i nie udało się ich przywrócić z kopii zapasowej, dlatego twoje filtry i ustawienia akceptowalnych reklam zostały zresetowane. Sprawdź swoje listy filtrów i ustawienia akceptowalnych reklam w <a>opcjach Adblock Plusa</a>.
+firstRun_feature_malware_description=Spraw, by twoje przeglądanie było bardziej bezpieczne, blokując znane domeny ze złośliwym oprogramowaniem.
+firstRun_features=Adblock Plus umożliwia więcej niż blokowanie reklam
+firstRun_donate=Wspomóż nas
+firstRun_donate_label=Wesprzyj nasz projekt
+firstRun_feature_social=Usuwanie przycisków serwisów społecznościowych
+firstRun_legacySafariWarning=Używasz starej, nie obsługiwanej już przez Adblock Plusa wersji Safari. Może to powodować nieprawidłowe działanie lub zakłócać przeglądanie niektórych witryn. Zalecamy uaktualnienie Safari w systemie OS X Mountain Lion do wersji 6.1.1 lub nowszej, lub do wersji 7.0.1 lub nowszej w systemie OS X 10.9 Maverick. Możesz także użyć najnowszych wersji przeglądarek Firefox, Chrome lub Opera.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/global.properties
new file mode 100644
index 0000000..36c805e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Nieblokowalne elementy na aktywnej stronie
+action3_tooltip=Kliknij l.p.m., aby włączyć/wyłączyć Adblock Plus
+notification_antiadblock_title=Ukrywanie ukierunkowanych informacji
+type_label_script=skrypt
+filter_elemhide_nocriteria=Nie określono kryteriów rozpoznania elementu do ukrycia
+blockingGroup_title=Reguły blokowania reklam
+whitelisted_tooltip=Adblock Plus jest aktywny, ale wyłączony na oglądanej stronie.
+type_label_stylesheet=arkusz stylów
+blocked_count_tooltip=?1? z ?2?
+type_label_font=czcionka
+type_label_popup=wyskakujÄ…ce okno
+filter_regexp_tooltip=Ten filtr jest wyrażeniem regularnym albo jest za krótki, aby go zoptymalizować. Zbyt dużo filtrów tego rodzaju może powodować spowolnienie przeglądania internetu.
+action0_tooltip=Kliknij l.p.m., aby otworzyć menu kontekstowe, ś.p.m., aby włączyć/wyłączyć
+whitelisted_page=Adblock Plus został wyłączony dla tej strony
+remove_group_warning=Czy na pewno chcesz usunąć tę grupę?
+action1_tooltip=Kliknij l.p.m., aby otworzyć/zamknąć listę blokowalnych elementów, ś.p.m., aby włączyć/wyłączyć
+type_label_xmlhttprequest=żądanie XML
+active_tooltip=Adblock Plus jest aktywny. Subskrybowane zestawy: ?1? i własne filtry: ?2?.
+type_label_document=dokument
+type_label_object_subrequest=subżądanie obiektu
+whitelistGroup_title=Reguły wyjątków
+disabled_tooltip=Adblock Plus jest wyłączony
+filter_elemhide_duplicate_id=Może być określony tylko jeden ID elementu do ukrycia
+type_label_object=obiekt
+action2_tooltip=Kliknij l.p.m., aby otworzyć opcje, ś.p.m., aby włączyć/wyłączyć
+type_label_subdocument=ramka
+clearStats_warning=Spowoduje to zresetowanie wszystkich statystyk użycia filtra i wyłączenie zliczania kolejnych użyć. Czy chcesz kontynuować?
+notification_antiadblock_message=Ta witryna wyświetla użytkownikom Adblock Plusa ukierunkowane dla nich informacje. Czy chcesz, by Adblock Plus ukrywał tego typu informacje?
+blocked_count_addendum=(dozwolone:?1?, ukryte:?2?)
+subscription_invalid_location=Lokalizacja zestawu filtrów ma niewłaściwą nazwę pliku, albo adres URL
+type_label_image=obrazek
+remove_subscription_warning=Czy chcesz usunąć ten zestaw?
+type_label_other=inne
+mobile_menu_enable=ABP:Włącz
+type_label_media=audio/wideo
+mobile_menu_disable_site=ABP:Wyłącz na ?1?
+elemhideGroup_title=Reguły ukrywania elementów
+mobile_menu_enable_site=ABP:Włącz na ?1?
+type_label_elemhide=ukryty
+newGroup_title=Nowa grupa filtrów
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/overlay.dtd
new file mode 100644
index 0000000..115752e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Tak">
+<!ENTITY notification.button.no "&amp;Nie">
+<!ENTITY sync.label "&amp;Synchronizuj ustawienia Adblock Plusa">
+<!ENTITY whitelist.site.label "Wyłącz blokowanie na ?1?">
+<!ENTITY filters.label "&amp;Ustawienia filtra">
+<!ENTITY disable.label "Wyłącz wszędzie">
+<!ENTITY objecttab.title "Zablokuj">
+<!ENTITY objecttab.tooltip "Kliknij tutaj, aby zablokować ten obiekt">
+<!ENTITY menuitem.label "&amp;Adblock Plus - ustawienia">
+<!ENTITY objecttabs.label "Wyświetlaj przycis&amp;ki blokowania na elementach Flasha i Javy">
+<!ENTITY sendReport.label "&amp;Zgłoś problem na tej stronie">
+<!ENTITY whitelist.page.label "Wyłącz blokowanie tylko na tej stronie">
+<!ENTITY context.image.label "Zablokuj obrazek">
+<!ENTITY counthits.label "Zli&amp;czaj użycie filtra">
+<!ENTITY opensidebar.label "Otwórz listę &amp;blokowalnych elementów">
+<!ENTITY notification.button.close "&amp;Zamknij">
+<!ENTITY contribute.label "Wspomóż Adblock Plusa">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Zablokuj ramkÄ™">
+<!ENTITY blocked.tooltip "Zablokowane elementy na tej stronie:">
+<!ENTITY hideplaceholders.label "Ukrywaj za&amp;mienniki blokowanych elementów">
+<!ENTITY showinstatusbar.label "&amp;Wyświetlaj ikonę Adblock Plusa na pasku stanu">
+<!ENTITY sidebar.title "Blokowalne elementy na aktywnej stronie">
+<!ENTITY options.label "&amp;Opcje">
+<!ENTITY context.object.label "Zablokuj obiekt">
+<!ENTITY context.removeWhitelist.label "Włącz ponownie na tej stronie">
+<!ENTITY filters.tooltip "Najczęściej stosowane filtry:">
+<!ENTITY closesidebar.label "Zamknij listę blokowal&amp;nych elementów">
+<!ENTITY showintoolbar.label "Wyświetlaj ikonę Adblock Plusa na pasku na&amp;rzędzi">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Zablokuj wideo/audio">
+<!ENTITY subscription.update.label "Aktualizuj filtry">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/sendReport.dtd
new file mode 100644
index 0000000..7ab04d9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Cofnij">
+<!ENTITY issues.disabledgroups.description "Następujące zestawy filtrów/grupy filtrów są wyłączone, ale mogą oddziaływać na tę stronę:">
+<!ENTITY showData.label "Wyświetl dane zgłoszenia">
+<!ENTITY typeSelector.falsePositive.label "&amp;Adblock Plus zbyt dużo blokuje">
+<!ENTITY issues.change.description "Twoja konfiguracja została zmieniona. By wykonać test zmian, odśwież stronę i wyślij zgłoszenie, jeśli dokonane zmiany nie rozwiązały problemu.">
+<!ENTITY email.label "Em&amp;ail:">
+<!ENTITY issues.openPreferences.label "Otwórz ustawienia filtra">
+<!ENTITY sendPage.confirmation "Zgłoszenie zostało zapisane. Możesz zobaczyć je pod następującym adresem:">
+<!ENTITY copyLink.label "&amp;Kopiuj odnośnik zgłoszenia">
+<!ENTITY issues.nofilters.description "Na aktualnej stronie Adblock Plus nic nie blokuje. Obserwowany problem najprawdopodobniej nie jest zwiÄ…zany z Adblock Plusem.">
+<!ENTITY sendPage.knownIssue "Prawdopodobnie zgłaszany problem jest już znany. Więcej informacji:">
+<!ENTITY typeSelector.other.description "Wybierz tę opcję, jeśli podejrzewasz, że problem związany jest z samym Adblock Plusem, a nie z filtrami.">
+<!ENTITY issues.disabledgroups.enable.label "Włącz zestawy filtrów/grupy filtrów">
+<!ENTITY typeWarning.override.label "Rozu&amp;miem i mimo wszystko chcę wysłać zgłoszenie">
+<!ENTITY issues.disabled.enable.label "Włącz Adblock Plusa">
+<!ENTITY update.fixed.description "Aktualizacja zestawu filtrów prawdopodobnie rozwiązała zgłaszany problem. Odśwież stronę i spróbuj ponownie, naciśnij przycisk Zgłoś, jeśli problem nadal występuje.">
+<!ENTITY anonymous.label "&amp;Wyślij anonimowo">
+<!ENTITY reloadButton.label "&amp;Odśwież stronę">
+<!ENTITY recentReports.clear.label "&amp;Usuń wszystkie zgłoszenia">
+<!ENTITY typeSelector.description "Tutaj możesz wykonać czynności niezbędne do wysłania zgłoszenia problemu związanego z Adblock Plusem. Najpierw wybierz typ problemu, jaki występuje na tej stronie:">
+<!ENTITY screenshot.remove.label "&amp;Ukryj poufne dane">
+<!ENTITY issues.ownfilters.description "Część filtrów stosowanych na tej stronie jest zdefiniowanych przez ciebie. Wyłącz filtry, które mogły spowodować problem:">
+<!ENTITY update.inProgress.description "Aby upewnić się, że problem został już rozwiązany, Adblock Plus musi zaktualizować twój zestaw filtrów. Proszę czekać…">
+<!ENTITY sendPage.retry.label "Wyślij ponownie">
+<!ENTITY data.label "Dan&amp;e zgłoszenia">
+<!ENTITY recentReports.label "Twoje ostatnio wysłane zgłoszenia">
+<!ENTITY typeWarning.description "Chcesz zgłosić ogólny problem dotyczący Adblock Plusa, a nie problem z filtrami. Tego rodzaju problemy najlepiej jest zgłaszać na [link]forum Adblock Plusa[/link]. Reportera błędów powinno się używać do uzupełnienia dyskusji na forum, ponieważ nikt nie zauważy zgłoszenia, chyba że dołączysz do niego odnośnik. Automatycznie generowany odnośnik zostanie dołączony po wysłaniu zgłoszenia.">
+<!ENTITY issues.disabled.description "Adblock Plus jest wyłączony. Obecnie nic nie będzie blokował.">
+<!ENTITY attachExtensions.label "Dołącz do zgłoszenia listę aktywnych &amp;rozszerzeń, gdy przyczyną problemu jest konflikt z innym rozszerzeniem.">
+<!ENTITY issues.nosubscriptions.add.label "Subskrybuj filtry">
+<!ENTITY issues.disabledfilters.enable.label "Włącz filtr">
+<!ENTITY issues.override.label "&amp;Konfiguracja jest prawidłowa – kontynuuj zgłoszenie">
+<!ENTITY issues.nosubscriptions.description "Wygląda na to, że nie subskrybujesz żadnej gotowej listy filtrów, które automatycznie usuwają niepożądaną zawartość ze stron internetowych.">
+<!ENTITY typeSelector.falsePositive.description "Wybierz tę opcję, jeśli strona nie zawiera ważnych treści, jest wyświetlana nieprawidłowo lub działa niepoprawnie. Możesz określić, czy Adblock Plus jest przyczyną problemu, wyłączając go chwilowo.">
+<!ENTITY typeSelector.other.label "&amp;Inny problem">
+<!ENTITY emailComment.label "Zachęcamy do podania prawidłowego adresu e-mail, abyśmy mogli skontaktować się z tobą w przypadku, gdy może to ułatwić rozwiązanie problemu. Pozwoli to również rozpoznać naszych współpracowników i nadać ich raportom wyższy priorytet.">
+<!ENTITY issues.whitelist.remove.label "Włącz ponownie Adblock Plusa na tej stronie">
+<!ENTITY outdatedSubscriptions.description "Od dwóch tygodni następujące zestawy filtrów nie były aktualizowane. Przed wysłaniem zgłoszenia zaktualizuj te zestawy. Być może rozwiąże to twój problem.">
+<!ENTITY dataCollector.description "Proszę poczekać kilka chwil, aż Adblock Plus zbierze wymagane dane.">
+<!ENTITY sendButton.label "&amp;Wyślij zgłoszenie">
+<!ENTITY comment.label "O&amp;bjaśnienia (opcjonalne):">
+<!ENTITY sendPage.errorMessage "Próba wysłania zgłoszenia nie powiodła się z powodu „?1?†Sprawdź połączenie z Internetem i ponów próbę. Jeśli problem będzie nadal występował, poproś o pomoc na [link]forum Adblock Plusa[/link].">
+<!ENTITY showRecentReports.label "Wyświetl ostatnio wysłane zgłoszenia">
+<!ENTITY commentPage.heading "Dodaj objaśnienie">
+<!ENTITY update.start.label "Aktualizuj teraz">
+<!ENTITY issues.disabledfilters.description "Następujące filtry są wyłączone, ale mogą oddziaływać na tę stronę:">
+<!ENTITY screenshot.description "Ta sama strona może wyglądać różnie dla różnych osób. Dołączenie zrzutu ekranu do zgłoszenia może pomóc nam w zrozumieniu problemu. Możesz usunąć miejsca, gdzie występują informacje poufne, jak również zaznaczyć obszary, gdzie problem jest zauważalny. W tym celu naciśnij odpowiedni przycisk i wybierz fragment obrazka za pomocą myszy.">
+<!ENTITY screenshot.attach.label "Dołącz obrazek &amp;strony do zgłoszenia">
+<!ENTITY issues.whitelist.description "Adblock Plus jest obecne wyłączony na zgłaszanej stronie. By ułatwić zbadanie tego problemu, przed jego zgłoszeniem włącz ponownie Adblock Plusa i odśwież stronę.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus nie blokuje &amp;reklam">
+<!ENTITY typeSelector.heading "Wybierz typ problemu">
+<!ENTITY anonymity.warning "Nie będziemy w stanie się z tobą skontaktować, co może spowodować nadanie raportowi niższego priorytetu.">
+<!ENTITY wizard.title "Reporter problemów">
+<!ENTITY issues.ownfilters.disable.label "Wyłącz filtr">
+<!ENTITY commentPage.description "W poniższym polu tekstowym możesz podać objaśnienie, które pomoże nam zrozumieć problem. Jest to opcjonalne, ale zalecane, jeśli problem nie jest oczywisty. Możesz również sprawdzić dane zawarte w zgłoszeniu przed jego wysłaniem.">
+<!ENTITY comment.lengthWarning "Treść objaśnienia przekroczyła dopuszczalny limit 1000 znaków. Zostanie wysłane tylko pierwsze 1000 znaków.">
+<!ENTITY typeSelector.falseNegative.description "Wybierz tę opcję, jeśli reklama jest wyświetlana pomimo tego, że Adblock Plus jest włączony.">
+<!ENTITY sendPage.waitMessage "Wysyłanie zgłoszenia… Proszę czekać.">
+<!ENTITY dataCollector.heading "Witamy w reporterze problemów">
+<!ENTITY screenshot.heading "Dołącz zrzut ekranu">
+<!ENTITY sendPage.heading "Wyślij zgłoszenie">
+<!ENTITY issues.subscriptionCount.description "Wydaje się, że wybrano subskrypcje zbyt dużej liczby filtrów. Nie jest to zalecane, ponieważ zwiększy prawdopodobieństwo wystąpienia problemów. Jeśli w związku z tym wystąpią problemy, nie będziemy przyjmowali zgłoszeń tych problemów, ponieważ nie będziemy w stanie rozpoznać autora filtrów i powiadomić go, by podjął odpowiednie działania. Usuń wszystkie subskrybowane filtry i sprawdź czy problem nadal występuje.">
+<!ENTITY screenshot.mark.label "O&amp;znacz problem">
+<!ENTITY privacyPolicy.label "Zasady ochrony prywatności">
+<!ENTITY issues.description "Adblock Plus wykrył problemy z twoją konfiguracją, które mogą być odpowiedzialne za powstanie tego problemu lub mogą utrudniać jego zbadanie.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/sidebar.dtd
new file mode 100644
index 0000000..bbb27b6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Pokaż element w mrugającej ramce">
+<!ENTITY address.label "Adres">
+<!ENTITY context.open.label "Otwórz w nowej karcie">
+<!ENTITY type.label "Typ">
+<!ENTITY tooltip.filterSource.label "Źródło filtra:">
+<!ENTITY noitems.label "Elementy nieblokowalne">
+<!ENTITY filter.label "Filtr">
+<!ENTITY tooltip.size.label "Rozmiar:">
+<!ENTITY reattach.label "Przyłącz">
+<!ENTITY search.label "&amp;Szukaj:">
+<!ENTITY docDomain.thirdParty "(trzeci człon adresu)">
+<!ENTITY filterSource.label "Źródło filtra">
+<!ENTITY tooltip.docDomain.label "Źródło dokumentu:">
+<!ENTITY context.copy.label "Kopiuj adres elementu">
+<!ENTITY tooltip.type.label "Typ:">
+<!ENTITY context.disablefilter.label "Wyłącz filtr ?1?">
+<!ENTITY context.copyFilter.label "Kopiuj filtr">
+<!ENTITY context.block.label "Zablokuj ten element">
+<!ENTITY context.enablefilter.label "Włącz filtr ?1?">
+<!ENTITY detach.label "Odłącz">
+<!ENTITY whitelisted.label "Nieblokowana strona">
+<!ENTITY context.disablefilteronsite.label "Wyłącz ten filtr na ?1?">
+<!ENTITY detached.title "Adblock Plus – elementy blokowalne (odłączony)">
+<!ENTITY docDomain.firstParty "(pierwszy człon adresu)">
+<!ENTITY tooltip.type.whitelisted "(nieblokowane)">
+<!ENTITY tooltip.filter.label "Działające filtry:">
+<!ENTITY tooltip.filter.disabled "(wyłączony)">
+<!ENTITY context.editfilter.label "Edytuj filtr w rzeczywistości">
+<!ENTITY tooltip.type.blocked "(zablokowany)">
+<!ENTITY size.label "Rozmiar">
+<!ENTITY context.whitelist.label "Dodaj regułę wyjątku dla elementu">
+<!ENTITY context.selectAll.label "Zaznacz filtr">
+<!ENTITY state.label "Stan">
+<!ENTITY docDomain.label "Źródło elementu">
+<!ENTITY tooltip.address.label "Adres:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/subscriptionSelection.dtd
new file mode 100644
index 0000000..18c1b41
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pl/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Dodaj także ze&amp;staw „?1?â€">
+<!ENTITY list.download.failed "Nie udało się pobrać listy zestawów.">
+<!ENTITY list.download.retry "Spróbuj jeszcze raz">
+<!ENTITY title.label "&amp;Nazwa zestawu:">
+<!ENTITY list.download.website "Zobacz witrynÄ™">
+<!ENTITY supplementMessage "Ten zestaw filtrów musi być używany z zestawem „?1?â€, który nie jest jeszcze subskrybowany.">
+<!ENTITY viewList.label "Zobacz filtry">
+<!ENTITY visitHomepage.label "Przejdź na stronę zestawu">
+<!ENTITY addSubscription.label "Subskrybuj zestaw">
+<!ENTITY dialog.title "Add Adblock Plus – zestawy filtrów">
+<!ENTITY location.label "&amp;Lokalizacja zestawu:">
+<!ENTITY fromWeb.description "Potwierdź zamiar dodania tego zestawu filtrów. Przed dodaniem zestawu możesz zmienić jego nazwę lub lokalizację.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/composer.dtd
new file mode 100644
index 0000000..d8b038d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "no f&amp;inal do endereço">
+<!ENTITY domainRestriction.label "Restringir domínio:">
+<!ENTITY collapse.default.no.label "Usar padrão (não)">
+<!ENTITY firstParty.label "So&amp;mente mesmo domínio">
+<!ENTITY preferences.label "Mostrar filtros existentes...">
+<!ENTITY pattern.label "Procurar padrão">
+<!ENTITY thirdParty.label "So&amp;mente de terceiros">
+<!ENTITY filter.label "Novo &amp;filtro:">
+<!ENTITY collapse.label "Es&amp;tado de crise bloqueado:">
+<!ENTITY match.warning "O padrão que você digitou não corresponde mais ao endereço a ser bloqueado/liberado e não terá efeito sobre ele.">
+<!ENTITY anchor.start.label "no &amp;começo do endereço">
+<!ENTITY matchCase.label "&amp;Diferenciar maiúsculas/minúsculas">
+<!ENTITY custom.pattern.label "&amp;Personalizado:">
+<!ENTITY unselectAllTypes.label "Desmarcar todos">
+<!ENTITY type.whitelist.label "E&amp;xceção">
+<!ENTITY regexp.warning "O padrão que você digitou será interpretado como uma expressão regular que pode não ser eficientemente processada pelo Adblock Plus e pode retardar sua experiência de navegação. Se você não pretende usar uma expressão regular, adicione um asterisco (*) até o fim do padrão.">
+<!ENTITY dialog.title "Adicionar regra de filtro do Adblock Plus">
+<!ENTITY basic.label "Visualização básica">
+<!ENTITY type.filter.label "&amp;Filtro de Bloqueio">
+<!ENTITY types.label "Aplicar a tipos:">
+<!ENTITY shortpattern.warning "O padrão digitado é curto demais para ser otimizado e poderá causar lentidão na sua experiência de navegação. É recomendável que você escolha uma &quot;string&quot;(sequência de caracteres) mais longa para esse filtro para permitir que o Adblock Plus processe o filtro mais eficientemente.">
+<!ENTITY collapse.yes.label "Sim">
+<!ENTITY anchors.label "Aceitar somente padrão:">
+<!ENTITY collapse.default.yes.label "Usar padrão (sim)">
+<!ENTITY domainRestriction.help "Use esta opção para especificar um ou mais domínios separados pelo símbolo &quot;|&quot;. O filtro será aplicado somente nos domínios selecionados. O símbolo &quot;~&quot; antes de um domínio significa que o filtro não deve ser aplicado naquele domínio.">
+<!ENTITY accept.label "Adicionar filtro">
+<!ENTITY options.label "Opções">
+<!ENTITY disabled.warning "O Adblock Plus está desativado atualmente. Você pode adicionar filtros mesmo assim, mas eles não serão aplicados até que você [link]ative o Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "no &amp;começo do nome do domínio">
+<!ENTITY collapse.no.label "Não">
+<!ENTITY selectAllTypes.label "Selecionar todos">
+<!ENTITY advanced.label "Visualização avançada">
+<!ENTITY pattern.explanation "O padrão pode ser qualquer parte do endereço; o símbolo * funciona como curinga. O filtro somente será aplicado se o endereço corresponder ao padrão.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/filters.dtd
new file mode 100644
index 0000000..9db67d1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Todos os seus filtros personalizados serão substituídos pelo conteúdo do arquivo selecionado. Você deseja continuar?">
+<!ENTITY slow.column "Filtros l&amp;entos">
+<!ENTITY enabled.column "&amp;Ativado">
+<!ENTITY subscription.lastDownload.checksumMismatch "Falhou, checksum deu errado">
+<!ENTITY noFiltersInGroup.text "O grupo selecionado está vazio.">
+<!ENTITY subscription.actions.label "Ações">
+<!ENTITY filter.selectAll.label "Selecionar tudo">
+<!ENTITY backupButton.label "&amp;Backup e restauração">
+<!ENTITY restore.minVersion.warning "Atenção! O arquivo foi criado com um versão mais nova do Adblock Plus. Por favor, atualize o Adblock Plus para a versão mais recente antes de restaurar esse arquivo.">
+<!ENTITY restore.error "Não foi possível processar os dados desse arquivo. Talvez ele não seja um arquivo de backup do Adblock Plus.">
+<!ENTITY sort.ascending.label "Ordenar &amp;A &gt; Z">
+<!ENTITY sort.label "&amp;Organizar por">
+<!ENTITY subscription.source.label "lista de filtros">
+<!ENTITY hitcount.column "A&amp;certos">
+<!ENTITY noFilters.text "Você ainda não tem nenhum filtro personalizado.">
+<!ENTITY backup.custom.title "Somente filtros personalizados">
+<!ENTITY subscription.external.label "Atualizado por outra extensão">
+<!ENTITY subscription.delete.label "Excluir">
+<!ENTITY noGroupSelected.text "Você precisa selecionar um grupo de filtros antes para que os filtros sejam mostrados.">
+<!ENTITY filter.cut.label "Recortar">
+<!ENTITY restore.default.label "Restaurar backup de ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Fazendo download...">
+<!ENTITY subscriptions.tab.label "Inscrições de filtros">
+<!ENTITY sort.descending.label "Ordenar &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Você realmente deseja remover todos os filtros selecionados?">
+<!ENTITY filter.delete.label "Excluir">
+<!ENTITY addSubscriptionAdd.label "Adicionar">
+<!ENTITY viewMenu.label "Visualizar">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY addSubscriptionCancel.label "Cancelar">
+<!ENTITY subscription.enabled.label "Ativado">
+<!ENTITY noSubscriptions.text "Você ainda não adicionou nenhuma inscrição de filtros. O Adblock Plus não vai bloquear nada sem filtros. Por favor, clique em &quot;Adicionar inscrição de filtros&quot;.">
+<!ENTITY subscription.update.label "Atualizar filtros">
+<!ENTITY dialog.title "Opções de Filtros do Adblock Plus">
+<!ENTITY addFilter.label "A&amp;dicionar filtro">
+<!ENTITY subscription.minVersion.warning "Esta inscrição de filtros exige uma versão mais nova do Adblock Plus. Por favor, atualize o Adblock Plus para a versão mais recente.">
+<!ENTITY subscription.lastDownload.invalidURL "Falhou, não é um endereço válido">
+<!ENTITY backup.error "Ocorreu um erro ao gravar os filtros no arquivo. Verifique se o arquivo está protegido contra gravação ou se está em uso por outro programa.">
+<!ENTITY filter.moveUp.label "Para cima">
+<!ENTITY addGroup.label "Adicionar &amp;grupo de filtros">
+<!ENTITY filter.edit.label "Editar">
+<!ENTITY subscription.showHideFilters.label "Exibir/ocultar filtros">
+<!ENTITY acceptableAds2.label "Permitir algumas propagandas não-&amp;invasivas">
+<!ENTITY addSubscriptionOther.label "Adicionar outra inscrição">
+<!ENTITY close.label "Fechar">
+<!ENTITY sort.none.label "&amp;Não Organizado">
+<!ENTITY filter.actions.label "Ações de filtros">
+<!ENTITY filter.copy.label "Copiar">
+<!ENTITY filter.moveDown.label "Mover para baixo">
+<!ENTITY filter.resetHitCounts.label "Limpar estatística de acertos">
+<!ENTITY readMore.label "Saiba mais">
+<!ENTITY subscription.moveUp.label "Para cima">
+<!ENTITY addSubscription.label "Adicionar inscrição de &amp;filtros">
+<!ENTITY subscription.homepage.label "página da inscrição">
+<!ENTITY backup.complete.title "Todos os filtros e inscrições">
+<!ENTITY restore.own.label "Restaurar backup próprio">
+<!ENTITY restore.complete.warning "Todas as suas opções de filtros serão substituídas pelo conteúdo do arquivo selecionado. Você deseja continuar?">
+<!ENTITY filters.tab.label "Filtros personalizados">
+<!ENTITY backup.label "Criar novo backup">
+<!ENTITY find.label "&amp;Localizar">
+<!ENTITY subscription.moveDown.label "Para baixo">
+<!ENTITY subscription.lastDownload.connectionError "Falhou, falha no download">
+<!ENTITY subscription.lastDownload.success "Êxito">
+<!ENTITY subscription.lastDownload.invalidData "Falhou, não é uma lista de filtros válida">
+<!ENTITY filter.paste.label "Colar">
+<!ENTITY subscription.disabledFilters.enable "Ativar filtros desativados">
+<!ENTITY lasthit.column "Ú&amp;ltimo acerto">
+<!ENTITY subscription.editTitle.label "Editar título">
+<!ENTITY subscription.disabledFilters.warning "Alguns filtros nesta inscrição estão desativados.">
+<!ENTITY filter.column "Regra de &amp;Filtro">
+<!ENTITY subscription.lastDownload.label "Último download:">
+<!ENTITY viewList.label "Ver lista">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/firstRun.properties
new file mode 100644
index 0000000..19fb73f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Navegar em modo privado desabilitando o acompanhamento - esconde seus rastros de empresas de anúncio que iria acompanhar cada movimento seu.
+firstRun_toggle_off=DESLIGADO
+firstRun_feature_tracking=Desativa o Rastreamento
+firstRun_feature_malware=Bloqueio de Malware
+firstRun_title=O Adblock Plus foi instalado
+firstRun_toggle_on=LIGADO
+firstRun_acceptableAdsExplanation=Gostaríamos de incentivar sites com publicidade discreta, é simples de usar. É por isso que estabelecemos <a>diretrizes rígidas</a> para identificarmos anúncios aceitáveis, que são mostrados em configurações padrão. Se você ainda deseja bloquear todos os anúncios você pode <a>desativar</a> isso em poucos segundos.
+firstRun_contributor_credits=Créditos dos contribuidores
+firstRun_dataCorruptionWarning=Esta página continua aparecendo? <a>Clique aqui!</a>
+firstRun_acceptableAdsHeadline=Anúncios chatos serão bloqueados
+firstRun_share=Indique a seus amigos
+firstRun_share_headline=<a>Ajude-nos</a> a tornar a web um lugar melhor
+firstRun_feature_social_description=Automaticamente melhore sua experiência de navegação livrando-se de botões de redes sociais, como o Like do Facebook, que aparecem em páginas da web e que controlam seu comportamento.
+firstRun_filterlistsReinitializedWarning=Parece que algum um problema causou a remoção de todos os filtros e fomos incapazes de restaurá-los por backup. Portanto tivemos que resetar seus filtros e as configurações de anúncios toleráveis. Por favor verifique a lista de filtros a as configurações de anúncios aceitáveis em <a>Opções do Adblock Plus</a>.
+firstRun_feature_malware_description=Tornar sua navegação mais segura através do bloqueio de sites conhecidos com malwares.
+firstRun_features=O Adblock Plus pode fazer mais do que bloquear anúncios
+firstRun_donate=Doar
+firstRun_donate_label=Apoiar o projeto
+firstRun_feature_social=Remove Botões de Redes Sociais
+firstRun_legacySafariWarning=Você está usando uma versão antiga do Safari não suportada pelo Adblock Plus. Ele pode não funcionar corretamente ou prejudicar a experiência do usuário em alguns sites. Recomendamos fortemente atualizar para o Safari 6.1.1 ou superior (no OS X 10.8 Mountain Lion) ou Safari 7.0.1 ou superior (no OS X 10.9 Mavericks), ou usar a última versão do Mozilla Firefox, Google Chrome ou Opera.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/global.properties
new file mode 100644
index 0000000..1a882de
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Nenhum item bloqueável na página atual
+action3_tooltip=Clique para ativar/desativar o Adblock Plus.
+notification_antiadblock_title=Ocultar mensagens direcionadas?
+type_label_script=script
+filter_elemhide_nocriteria=Nenhum critério especificado para reconhecer o elemento a ser ocultado
+blockingGroup_title=Regras de bloqueio de propaganda
+whitelisted_tooltip=O Adblock Plus está ativo, mas desativado na página atual.
+type_label_stylesheet=folha de estilos
+blocked_count_tooltip=?1? de ?2?
+type_label_font=fonte
+type_label_popup=janela popup
+filter_regexp_tooltip=Este filtro é também uma expressão regular ou curta demais para ser otimizada. Muitos desses filtros podem causar lentidão na navegação.
+action0_tooltip=Clique para mostrar o menu de contexto, e com o botão do meio para ativar/desativar.
+whitelisted_page=O Adblock Plus foi desativado para a página atual
+remove_group_warning=Você realmente deseja remover este grupo?
+action1_tooltip=Clique para abrir/fechar itens bloqueáveis, e com o botão do meio para ativar/desativar.
+type_label_xmlhttprequest=requisição XML
+active_tooltip=O Adblock Plus está ativado, com ?1? inscrições de filtros e ?2? filtros personalizados.
+type_label_document=documento
+type_label_object_subrequest=sub-requisição do objeto
+whitelistGroup_title=Regras de exceção
+disabled_tooltip=O Adblock Plus está desativado.
+filter_elemhide_duplicate_id=Somente uma ID do elemento a ser ocultado pode ser especificada
+type_label_object=objeto
+action2_tooltip=Clique para abrir as preferências, e com o botão do meio para ativar/desativar.
+type_label_subdocument=frame
+clearStats_warning=Isso vai reiniciar todas as estatísticas de acertos dos filtros e desativar o contador de acertos dos filtros. Você deseja continuar?
+notification_antiadblock_message=Este site é conhecido por mostrar mensagens direcionadas a usuários do Adblock Plus. Você quer que o Adblock Plus esconda mensagens direcionadas?
+blocked_count_addendum=(e também liberados: ?1?, ocultos: ?2?)
+subscription_invalid_location=O local da lista de filtros não é nem uma URL válida nem um nome válido de arquivo.
+type_label_image=imagem
+remove_subscription_warning=Você realmente deseja remover esta inscrição?
+type_label_other=outro
+mobile_menu_enable=ABP: Ativado
+type_label_media=áudio/vídeo
+mobile_menu_disable_site=ABP: Desativado em ?1?
+elemhideGroup_title=Regras de ocultamento de elementos
+mobile_menu_enable_site=ABP: Ativado em ?1?
+type_label_elemhide=oculto
+newGroup_title=Novo grupo de filtros
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/overlay.dtd
new file mode 100644
index 0000000..58def63
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Sim">
+<!ENTITY notification.button.no "&amp;Não">
+<!ENTITY sync.label "S&amp;incronizar configurações do Adblock Plus">
+<!ENTITY whitelist.site.label "Desativar em ?1?">
+<!ENTITY filters.label "Opções de &amp;filtros">
+<!ENTITY disable.label "Desativar em todas as páginas">
+<!ENTITY objecttab.title "Bloquear">
+<!ENTITY objecttab.tooltip "Clique aqui para bloquear este objeto com o Adblock Plus">
+<!ENTITY menuitem.label "Preferências do Ad&amp;block Plus">
+<!ENTITY objecttabs.label "Mostrar abas em Flash e &amp;Java">
+<!ENTITY sendReport.label "&amp;Reportar problema nesta página">
+<!ENTITY whitelist.page.label "Desativar somente nesta página">
+<!ENTITY context.image.label "Adblock Plus: Bloquear imagem">
+<!ENTITY counthits.label "Cont&amp;ar acertos de filtros">
+<!ENTITY opensidebar.label "A&amp;brir itens bloqueáveis">
+<!ENTITY notification.button.close "&amp;Fechar">
+<!ENTITY contribute.label "Contribuir com o Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Bloquear quadro">
+<!ENTITY blocked.tooltip "Itens bloqueados nesta página:">
+<!ENTITY hideplaceholders.label "Ocultar &amp;marcadores de elementos bloqueados">
+<!ENTITY showinstatusbar.label "&amp;Mostrar na barra de status">
+<!ENTITY sidebar.title "Itens bloqueáveis na página atual">
+<!ENTITY options.label "&amp;Opções">
+<!ENTITY context.object.label "Adblock Plus: Bloquear objeto">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Reativar nessa página">
+<!ENTITY filters.tooltip "Filtros mais ativos:">
+<!ENTITY closesidebar.label "Fechar itens &amp;bloqueáveis">
+<!ENTITY showintoolbar.label "Mostrar na barra de &amp;ferramentas">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Bloquear áudio/vídeo">
+<!ENTITY subscription.update.label "Atualizar filtros">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/sendReport.dtd
new file mode 100644
index 0000000..4f2bfd5
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Desfazer">
+<!ENTITY issues.disabledgroups.description "Os seguintes grupos e inscrições de filtros está desativados, mas eles podem estar afetando essa página:">
+<!ENTITY showData.label "Exibir os dados do relatório">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus está bloqueando de&amp;mais">
+<!ENTITY issues.change.description "Sua configuração foi alterada. Por favor, atualize a página para testar as alterações e enviar um relatório caso o erro continue a ocorrer.">
+<!ENTITY email.label "E&amp;mail:">
+<!ENTITY issues.openPreferences.label "Abrir configuração de filtros">
+<!ENTITY sendPage.confirmation "Seu relatório foi salvo. Você pode acessá-lo no seguinte endereço:">
+<!ENTITY copyLink.label "&amp;Copiar endereço do relatório">
+<!ENTITY issues.nofilters.description "O Adblock Plus não está bloqueando nada nessa página. É improvável que o erro observado esteja relacionado com o Adblock Plus.">
+<!ENTITY sendPage.knownIssue "O problema que você informou provavelmente já é conhecido. Mais informações:">
+<!ENTITY typeSelector.other.description "Escolha esta opção se você suspeita que há um erro no próprio Adblock Plus e não nos filtros.">
+<!ENTITY issues.disabledgroups.enable.label "Ativar grupo ou inscrição de filtros">
+<!ENTITY typeWarning.override.label "&amp;Eu entendo e quero enviar o relatório mesmo assim">
+<!ENTITY issues.disabled.enable.label "Ativar o Adblock Plus">
+<!ENTITY update.fixed.description "A atualização de suas inscrições de filtros provavelmente resolveu o problema que você estava reportando. Por favor, atualize a página e verifique. Se o problema persistir, clique novamente em &quot;Reportar problema com esta página&quot;.">
+<!ENTITY anonymous.label "Envio &amp;anônimo">
+<!ENTITY reloadButton.label "&amp;Recarregar a página">
+<!ENTITY recentReports.clear.label "&amp;Remover todos os relatórios">
+<!ENTITY typeSelector.description "Este assistente conduzirá você pelos passos necessários para enviar um relatório de erro do Adblock Plus. Primeiro, selecione o tipo de erro que você está tendo nessa página:">
+<!ENTITY screenshot.remove.label "&amp;Remove dados confidenciais">
+<!ENTITY issues.ownfilters.description "Alguns dos filtros aplicados nesta página foram definidos pelo usuário. Por favor, desative os filtros que podem ter causado o problema:">
+<!ENTITY update.inProgress.description "O Adblock Plus precisa atualizar suas inscrições de filtros para ter certeza que o problema não foi resolvido ainda. Por favor, aguarde...">
+<!ENTITY sendPage.retry.label "Enviar novamente">
+<!ENTITY data.label "&amp;Dados do relatório:">
+<!ENTITY recentReports.label "Seus relatórios enviados recentemente">
+<!ENTITY typeWarning.description "Você indicou que deseja comunicar um erro geral no Adblock Plus em vez de um problema com os filtros. Por favor, note que problemas desse tipo devem ser tratados no [link]fórum do Adblock Plus[/link]. Envie um relatório apenas para complementar uma discussão existente no fórum, pois ninguém vai notá-lo a menos que você informe o endereço do relatório. O endereço gerado automaticamente será apresentado após o envio do relatório.">
+<!ENTITY issues.disabled.description "O Adblock Plus está desativado; ele não vai bloquear nada no seu estado atual.">
+<!ENTITY attachExtensions.label "Ane&amp;xar ao relatório uma lista de extensões ativas caso haja um conflito entre elas">
+<!ENTITY issues.nosubscriptions.add.label "Adicionar inscrição de filtros">
+<!ENTITY issues.disabledfilters.enable.label "Ativar filtro">
+<!ENTITY issues.override.label "A &amp;configuração está correta, continue com o relatório">
+<!ENTITY issues.nosubscriptions.description "Parece que você não adicionou nenhuma das inscrições de filtros que removem automaticamente os conteúdos indesejados dos sites.">
+<!ENTITY typeSelector.falsePositive.description "Escolha esta opção se a página carece de algum conteúdo importante, se aparece de forma incorreta ou se não funciona corretamente. Você pode verificar se o Adblock Plus é a causa do problema desativando-o temporariamente.">
+<!ENTITY typeSelector.other.label "Ou&amp;tro problema">
+<!ENTITY emailComment.label "Nós encorajamos você a digitar um endereço de e-mail válido para que possamos entrar em contato se houverem quaisquer dúvidas sobre o seu relatório. A inserção de um e-mail válido também irá permitir-nos reconhecer suas contribuições e dar-lhes uma prioridade maior.">
+<!ENTITY issues.whitelist.remove.label "Reativar o Adblock Plus nessa página">
+<!ENTITY outdatedSubscriptions.description "As seguintes inscrições de filtros não foram atualizadas há pelo menos duas semanas. Por favor, atualize essas inscrições antes de enviar um relatório de erro, pois o problema pode já ter sido resolvido.">
+<!ENTITY dataCollector.description "Por favor, aguarde um momento enquanto Adblock Plus coleta os dados necessários.">
+<!ENTITY sendButton.label "E&amp;nviar relatório">
+<!ENTITY comment.label "&amp;Comentário (opcional):">
+<!ENTITY sendPage.errorMessage "Uma tentativa de enviar o relatório falhou com código de erro &quot;?1?&quot;. Por favor, assegure que você está conectado à Internet e tente novamente. Se o problema persistir, por favor, solicite ajuda no [link]fórum do Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Exibir relatórios enviados recentemente">
+<!ENTITY commentPage.heading "Digitar comentário">
+<!ENTITY update.start.label "Atualizar agora">
+<!ENTITY issues.disabledfilters.description "Os seguintes filtros estão desativados, mas eles podem estar afetando essa página:">
+<!ENTITY screenshot.description "Uma mesma página pode parecer diferente para diferentes pessoas. Pode nos ajudar a compreender o problema, você pode anexar uma imagem ao seu relatório. Você pode remover partes da imagem contendo informações confidenciais, bem como marcar áreas onde se encontra o problema. Para isso, clique no botão correspondente e selecione com o mouse uma área da imagem.">
+<!ENTITY screenshot.attach.label "Ane&amp;xar uma imagem da página ao relatório">
+<!ENTITY issues.whitelist.description "O Adblock Plus está desativado atualmente nessa página. Para ajudar na investigação do problema, por favor, reative o Adblock Plus e atualize a página antes de enviar o relatório.">
+<!ENTITY typeSelector.falseNegative.label "O Adblock Plus &amp;não está bloqueando uma propaganda">
+<!ENTITY typeSelector.heading "Selecionar tipo de erro">
+<!ENTITY anonymity.warning "Nós não vamos ser capazes de entrar em contato com você e, portanto, seus relatórios terão baixa prioridade.">
+<!ENTITY wizard.title "Relatório de erro">
+<!ENTITY issues.ownfilters.disable.label "Desativar filtro">
+<!ENTITY commentPage.description "O campo abaixo permite você digitar um comentário para nos ajudar a entender o problema. Este passo é opcional mas é recomendado se o problema não for óbvio. Você também pode verificar os dados do relatório antes de enviar.">
+<!ENTITY comment.lengthWarning "O tamanho do seu comentário excedeu 1000 caracteres. Apenas os primeiros 1000 caracteres serão enviadas.">
+<!ENTITY typeSelector.falseNegative.description "Escolha esta opção se uma propaganda é exibida mesmo com o Adblock Plus ativado.">
+<!ENTITY sendPage.waitMessage "Por favor aguarde enquanto o Adblock Plus está enviando seu relatório.">
+<!ENTITY dataCollector.heading "Bem-vindo ao relatório de erro">
+<!ENTITY screenshot.heading "Anexar imagem">
+<!ENTITY sendPage.heading "Enviar relatório">
+<!ENTITY issues.subscriptionCount.description "Parece que você adicionou inscrições de filtros em excesso. Essa configuração não é recomendada porque aumenta a possibilidade de ocorrência de erros. Não podemos aceitar o seu relatório porque não é possível determinar qual autor de inscrição de filtros deve tratar o problema. Por favor, remova todos as inscrições exceto as realmente necessárias e verifique se o problema ainda ocorre.">
+<!ENTITY screenshot.mark.label "&amp;Marcar o problema">
+<!ENTITY privacyPolicy.label "Política de privacidade">
+<!ENTITY issues.description "O Adblock Plus detectou problemas com a configuração atual que podem ser a causa do erro ou que podem dificultar a análise do relatório.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/sidebar.dtd
new file mode 100644
index 0000000..dd8262b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Realçar bordas do item">
+<!ENTITY address.label "Endereço">
+<!ENTITY context.open.label "Abrir em nova aba">
+<!ENTITY type.label "Tipo">
+<!ENTITY tooltip.filterSource.label "Fonte do filtro:">
+<!ENTITY noitems.label "Nenhum item bloqueável">
+<!ENTITY filter.label "Filtro">
+<!ENTITY tooltip.size.label "Tamanho:">
+<!ENTITY reattach.label "Ancorar">
+<!ENTITY search.label "&amp;Localizar:">
+<!ENTITY docDomain.thirdParty "(domínio diferente)">
+<!ENTITY filterSource.label "Fonte do filtro">
+<!ENTITY tooltip.docDomain.label "Origem do documento:">
+<!ENTITY context.copy.label "Copiar endereço do item">
+<!ENTITY tooltip.type.label "Tipo:">
+<!ENTITY context.disablefilter.label "Desativar filtro ?1?">
+<!ENTITY context.copyFilter.label "Copiar filtro">
+<!ENTITY context.block.label "Bloquear este item">
+<!ENTITY context.enablefilter.label "Reativar filtro ?1?">
+<!ENTITY detach.label "Destacar">
+<!ENTITY whitelisted.label "Página na lista branca">
+<!ENTITY context.disablefilteronsite.label "Desativar esse filtro em ?1?">
+<!ENTITY detached.title "Adblock Plus: Itens bloqueáveis (destacada)">
+<!ENTITY docDomain.firstParty "(mesmo domínio)">
+<!ENTITY tooltip.type.whitelisted "(na lista branca)">
+<!ENTITY tooltip.filter.label "Filtro em ação:">
+<!ENTITY tooltip.filter.disabled "(desativado)">
+<!ENTITY context.editfilter.label "Editar filtro em efeito">
+<!ENTITY tooltip.type.blocked "(bloqueado)">
+<!ENTITY size.label "Tamanho">
+<!ENTITY context.whitelist.label "Adicionar exceção para o item">
+<!ENTITY context.selectAll.label "Selecionar todos">
+<!ENTITY state.label "Estado">
+<!ENTITY docDomain.label "Origem do documento">
+<!ENTITY tooltip.address.label "Endereço:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/subscriptionSelection.dtd
new file mode 100644
index 0000000..7982acb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-BR/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Adicionar também a inscrição de &amp;filtros &quot;?1?&quot;">
+<!ENTITY list.download.failed "O Adblock Plus não conseguiu obter a lista de inscrições.">
+<!ENTITY list.download.retry "Tentar novamente">
+<!ENTITY title.label "&amp;Título da inscrição:">
+<!ENTITY list.download.website "Abrir página da lista de inscrições">
+<!ENTITY supplementMessage "Essa inscrição de filtros foi feita para ser usada com inscrição de filtros &quot;?1?&quot;, que você ainda não está usando.">
+<!ENTITY viewList.label "Visualizar filtros">
+<!ENTITY visitHomepage.label "Abrir página da inscrição">
+<!ENTITY addSubscription.label "Adicionar inscrição">
+<!ENTITY dialog.title "Adicionar inscrição de filtros do Adblock Plus">
+<!ENTITY location.label "&amp;Endereço da lista de filtros:">
+<!ENTITY fromWeb.description "Por favor, confirme que você deseja adicionar essa inscrição de filtros. Você pode alterar o título ou o endereço da inscrição antes de adicionar.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/composer.dtd
new file mode 100644
index 0000000..c864644
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "&amp;no final do endereço">
+<!ENTITY domainRestriction.label "Restringir ao domínio:">
+<!ENTITY collapse.default.no.label "Usar por defeito (não)">
+<!ENTITY firstParty.label "Apenas primários">
+<!ENTITY preferences.label "Mostrar filtros existentes">
+<!ENTITY pattern.label "Procurar um padrão">
+<!ENTITY thirdParty.label "De &amp;terceiros">
+<!ENTITY filter.label "Novo &amp;filtro:">
+<!ENTITY collapse.label "Colapsar bloqueados:">
+<!ENTITY match.warning "O padrão que inseriu já não corresponde ao endereço a ser bloqueado/desbloqueado e não surtirá efeito.">
+<!ENTITY anchor.start.label "no &amp;início do endereço">
+<!ENTITY matchCase.label "Maiúsculas/ minúsculas">
+<!ENTITY custom.pattern.label "&amp;Personalização:">
+<!ENTITY unselectAllTypes.label "Desseleccionar">
+<!ENTITY type.whitelist.label "Regra de e&amp;xceção">
+<!ENTITY regexp.warning "O padrão inserido será interpretado como expressão regular e não será processado corretamente pelo Adblock Plus e pode tornar o navegador mais lento. Se não pretendia utilizar expressões regulares adicione um asterisco (*) no final do padrão.">
+<!ENTITY dialog.title "Adicionar regra de filtro ao Adblock Plus">
+<!ENTITY basic.label "Vista básica">
+<!ENTITY type.filter.label "Filtro bloqueador">
+<!ENTITY types.label "Aplicar aos tipos:">
+<!ENTITY shortpattern.warning "O padrão inserido é demasiado curto para ser otimizado e pode tornar o navegador mais lento. Deve utilizar um padrão mais extenso para este filtro de modo a que o Adblock Plus processe o filtro de forma correta.">
+<!ENTITY collapse.yes.label "Sim">
+<!ENTITY anchors.label "Aceitar o padrão apenas:">
+<!ENTITY collapse.default.yes.label "Usar por defeito (sim)">
+<!ENTITY domainRestriction.help "Especificar um ou mais domínios separados pelo símbolo &quot;|&quot;, o filtro será aplicado apenas a estes domínios. O símbolo &quot;~&quot; antes de um domínio implica que o filtro não seja aplicado nesse domínio.">
+<!ENTITY accept.label "Adicionar filtro">
+<!ENTITY options.label "Opções">
+<!ENTITY disabled.warning "O Adblock Plus está inativo. Pode adicionar filtros mas estes não serão aplicados até que [link]ative o Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "no &amp;início do nome de domínio">
+<!ENTITY collapse.no.label "Não">
+<!ENTITY selectAllTypes.label "Seleccionar todos">
+<!ENTITY advanced.label "Vista avançada">
+<!ENTITY pattern.explanation "O padrão pode ser qualquer parte do endereço; o asterisco (*) funciona como wildcard. O filtro só será aplicado ao(s) endereço(s) que correspondam ao padrão indicado.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/filters.dtd
new file mode 100644
index 0000000..3466a3d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Todas os seus filtros personalizados serão substituídos pelo conteúdo do ficheiro selecionado. Continuar?">
+<!ENTITY slow.column "Fi&amp;ltros lentos">
+<!ENTITY enabled.column "A&amp;tivo">
+<!ENTITY subscription.lastDownload.checksumMismatch "Erro de verificação (checksum)">
+<!ENTITY noFiltersInGroup.text "O grupo selecionado está vazio.">
+<!ENTITY subscription.actions.label "Ações">
+<!ENTITY filter.selectAll.label "Selecionar tudo">
+<!ENTITY backupButton.label "&amp;Backup e restauro">
+<!ENTITY restore.minVersion.warning "Atenção: o ficheiro foi criado com uma versão mais recente do Adblock Plus. Deve atualizar para a versão mais recente do Adblock Plus antes de restaurar este ficheiro.">
+<!ENTITY restore.error "A informação do ficheiro não foi processada com sucesso. Tem a certeza que é um ficheiro válido?">
+<!ENTITY sort.ascending.label "Ordenar &amp;A &gt; Z">
+<!ENTITY sort.label "&amp;Ordenar por">
+<!ENTITY subscription.source.label "Lista de filtros">
+<!ENTITY hitcount.column "&amp;Contagem">
+<!ENTITY noFilters.text "Ainda não tem qualquer filtro personalizado.">
+<!ENTITY backup.custom.title "Apenas filtros personalizados">
+<!ENTITY subscription.external.label "Atualizado por outra extensão">
+<!ENTITY subscription.delete.label "Eliminar">
+<!ENTITY noGroupSelected.text "Tem que selecionar um grupo de filtros para que os mesmos sejam exibidos.">
+<!ENTITY filter.cut.label "Cortar">
+<!ENTITY restore.default.label "Restaurar backup de ?1?">
+<!ENTITY subscription.lastDownload.inProgress "A transferir...">
+<!ENTITY subscriptions.tab.label "Subscrições de filtros">
+<!ENTITY sort.descending.label "Ordenar &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Quer mesmo remover todos os filtros selecionados?">
+<!ENTITY filter.delete.label "Eliminar">
+<!ENTITY addSubscriptionAdd.label "Adicionar">
+<!ENTITY viewMenu.label "Ver">
+<!ENTITY subscription.lastDownload.unknown "N/D">
+<!ENTITY addSubscriptionCancel.label "Cancelar">
+<!ENTITY subscription.enabled.label "Ativo">
+<!ENTITY noSubscriptions.text "Ainda não adicionou uma subscrição de filtros. O Adblock Plus não bloqueará
+elementos sem filtros. Por favor utilize &quot;Adicionar subscrição de filtros&quot; para
+um filtro.">
+<!ENTITY subscription.update.label "Atualizar filtros">
+<!ENTITY dialog.title "Preferências de filtros do Adblock Plus">
+<!ENTITY addFilter.label "A&amp;dicionar filtro">
+<!ENTITY subscription.minVersion.warning "Esta subscrição de filtros requer uma versão mais recente do Adblock Plus. Deve atualizar para a versão mais recente do Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Endereço inválido">
+<!ENTITY backup.error "Ocorreu um erro ao guardar os filtros no ficheiro. Certifique-se que o ficheiro não está protegido contra escrita ou a ser utilizado por outra aplicação.">
+<!ENTITY filter.moveUp.label "Mover para cima">
+<!ENTITY addGroup.label "Adicionar &amp;grupo de filtros">
+<!ENTITY filter.edit.label "Editar">
+<!ENTITY subscription.showHideFilters.label "Mostrar/ocultar filtros">
+<!ENTITY acceptableAds2.label "Perm&amp;itir alguma publicidade não intrusiva">
+<!ENTITY addSubscriptionOther.label "Adicionar outra subscrição">
+<!ENTITY close.label "Fechar">
+<!ENTITY sort.none.label "&amp;Não ordenar">
+<!ENTITY filter.actions.label "Ações de filtros">
+<!ENTITY filter.copy.label "Copiar">
+<!ENTITY filter.moveDown.label "Mover para baixo">
+<!ENTITY filter.resetHitCounts.label "Reiniciar estatísticas">
+<!ENTITY readMore.label "Saber mais">
+<!ENTITY subscription.moveUp.label "Mover para cima">
+<!ENTITY addSubscription.label "Adicionar subscrição de &amp;filtros">
+<!ENTITY subscription.homepage.label "Página web">
+<!ENTITY backup.complete.title "Todos os filtros e subscrições">
+<!ENTITY restore.own.label "Restaurar outro backup">
+<!ENTITY restore.complete.warning "Todas as preferências de filtros serão substituídas pelo conteúdo do ficheiro selecionado. Continuar?">
+<!ENTITY filters.tab.label "Filtros personalizados">
+<!ENTITY backup.label "Criar novo backup">
+<!ENTITY find.label "&amp;Localizar">
+<!ENTITY subscription.moveDown.label "Mover para baixo">
+<!ENTITY subscription.lastDownload.connectionError "Transferência falhada">
+<!ENTITY subscription.lastDownload.success "Bem sucedido">
+<!ENTITY subscription.lastDownload.invalidData "Não é uma lista válida">
+<!ENTITY filter.paste.label "Colar">
+<!ENTITY subscription.disabledFilters.enable "Ativar filtros inativos">
+<!ENTITY lasthit.column "Última &amp;utilização">
+<!ENTITY subscription.editTitle.label "Editar título">
+<!ENTITY subscription.disabledFilters.warning "Alguns filtros desta subscrição estão inativos.">
+<!ENTITY filter.column "Regra de &amp;filtro">
+<!ENTITY subscription.lastDownload.label "Última atualização:">
+<!ENTITY viewList.label "Ver lista">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/firstRun.properties
new file mode 100644
index 0000000..29d3e16
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Navegue na web desativando a monitorização. Oculte o seu registo de navegação das companhias que monitorizam os seus movimentos.
+firstRun_toggle_off=Desligado
+firstRun_feature_tracking=Desativar monitorização
+firstRun_feature_malware=Bloqueio de malware
+firstRun_title=O Adblock Plus foi instalado
+firstRun_toggle_on=Ligado
+firstRun_acceptableAdsExplanation=Gostamos de incentivar os sítios web de publicidade a utilizar anúncios não intrusivos. Foi por essa razão que estabelecemos <a>políticas restritas</a> para identificar os anúncios aceitáveis e que são mostrados em definições padrão. No entanto, se você quiser bloquear todos os anúncios, pode <a>desativar</a> essa opção facilmente.
+firstRun_contributor_credits=Créditos
+firstRun_dataCorruptionWarning=Esta página continua a aparecer? <a>Clique aqui!</a>
+firstRun_acceptableAdsHeadline=A publicidade será bloqueada
+firstRun_share=Publicite o programa
+firstRun_share_headline=<a>Ajude-nos</a> a melhorar a web
+firstRun_feature_social_description=Remova os botões das redes sociais, tais como o Facebook Like, que aparecem nas páginas web e que monitorizam o seu comportamento.
+firstRun_filterlistsReinitializedWarning=Parece que ocorreu um erro que causou a remoção de todos os filtros e nós não conseguimos restaurar a cópia de segurança. Neste sentido, os filtros e as definições de anúncios aceitáveis foram reiniciados, Analise os seus filtros e os anúncios aceitáveis nas definições do <a>Adblock Plus.</a>.
+firstRun_feature_malware_description=Melhore a navegação web bloqueando os domínios duvidosos.
+firstRun_features=O Adblock Plus pode fazer mais do que bloquear publicidade
+firstRun_donate=donativos
+firstRun_donate_label=Ajude o nosso projeto
+firstRun_feature_social=Remover botões sociais
+firstRun_legacySafariWarning=Você está a utilizar uma versão do Safari que não é suportada pelo Adblock Plus. A aplicação pode não funcionar corretamente e prejudicar a navegação em alguns sítios web. Deve atualizar para o Safari 6.1.1 ou mais recente (disponível para o Mac OS X 10.8 Mountain Lion), para a versão 7.0.1 ou mais recente (disponível no OS x 10.9 Mavericks) ou utilizar uma versão recente dos navegadores Mozilla Firefox, Google Chrome ou Opera.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/global.properties
new file mode 100644
index 0000000..a8730e8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Não há itens bloqueáveis nesta página
+action3_tooltip=Clique para ativar/desativar o Adblock Plus.
+notification_antiadblock_title=Ocultar mensagens?
+type_label_script=script
+filter_elemhide_nocriteria=Nenhum critério especificado para reconhecimento de elementos a bloquear
+blockingGroup_title=Regras de bloqueio de anúncios
+whitelisted_tooltip=O Adblock Plus está está inativo nesta página.
+type_label_stylesheet=folha de estilo
+blocked_count_tooltip=?1? de ?2?
+type_label_font=tipo de letra
+type_label_popup=janela pop-up
+filter_regexp_tooltip=Este filtro é uma expressão regular ou demasiado curto para ser otimizado. Demasiados filtros com estas características podem tornar o navegador mais lento.
+action0_tooltip=Clique para mostrar o menu de contexto, clique na roda do rato para ativar/desativar.
+whitelisted_page=O Adblock Plus foi desativado nesta página
+remove_group_warning=Quer mesmo remover este grupo?
+action1_tooltip=Clique para abrir/fechar itens bloqueáveis, clique na roda do rato para ativar/desativar.
+type_label_xmlhttprequest=pedido XML
+active_tooltip=O Adblock Plus está ativo. ?1? subscrições de filtros e ?2? filtros personalizados.
+type_label_document=documento
+type_label_object_subrequest=subpedido de objeto
+whitelistGroup_title=Regras de exceção
+disabled_tooltip=O Adblock Plus está inativo.
+filter_elemhide_duplicate_id=Apenas pode especificar uma ID do elemento a ocultar
+type_label_object=objeto
+action2_tooltip=Clique para abrir as preferências, clique na roda do rato para ativar/desativar.
+type_label_subdocument=moldura
+clearStats_warning=Irá reiniciar as estatísticas de todos os filtros e desativar a contagem de bloqueios. Continuar?
+notification_antiadblock_message=Este sítio é conhecido por enviar mensagens dirigidas aos utilizadores do Adblock Plus. Gostaria de ocultar essas mensagens?
+blocked_count_addendum=(na lista de permissões: ?1?, ocultos: ?2?)
+subscription_invalid_location=A localização da lista de filtros não é um endereço ou nome de ficheiro válido.
+type_label_image=imagem
+remove_subscription_warning=Quer mesmo remover esta subscrição?
+type_label_other=outro
+mobile_menu_enable=ABP: Ativar
+type_label_media=áudio/vídeo
+mobile_menu_disable_site=ABP: Desativar em ?1?
+elemhideGroup_title=Regras de bloqueio de elementos
+mobile_menu_enable_site=ABP: Ativar em ?1?
+type_label_elemhide=oculto
+newGroup_title=Novo grupo de filtros
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/overlay.dtd
new file mode 100644
index 0000000..fbcb8c8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Sim">
+<!ENTITY notification.button.no "&amp;Não">
+<!ENTITY sync.label "Sin&amp;cronizar definições do Adblock Plus">
+<!ENTITY whitelist.site.label "Desativar em ?1?">
+<!ENTITY filters.label "Pre&amp;ferências de filtros">
+<!ENTITY disable.label "Desativar em todas as páginas">
+<!ENTITY objecttab.title "Bloquear">
+<!ENTITY objecttab.tooltip "Clique aqui para bloquear este objecto com o Adblock Plus">
+<!ENTITY menuitem.label "Preferências do Ad&amp;block Plus">
+<!ENTITY objecttabs.label "Mos&amp;trar separadores em flash e java">
+<!ENTITY sendReport.label "&amp;Reportar erros nesta página">
+<!ENTITY whitelist.page.label "Desativar apenas nesta página">
+<!ENTITY context.image.label "Bloquear imagem">
+<!ENTITY counthits.label "&amp;Contar bloqueios do filtro">
+<!ENTITY opensidebar.label "A&amp;brir itens bloqueáveis">
+<!ENTITY notification.button.close "Fe&amp;char">
+<!ENTITY contribute.label "Colaborar no Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Bloquear moldura">
+<!ENTITY blocked.tooltip "Itens bloqueados nesta página:">
+<!ENTITY hideplaceholders.label "Ocultar &amp;locais de elementos bloqueados">
+<!ENTITY showinstatusbar.label "Mo&amp;strar na barra de estado">
+<!ENTITY sidebar.title "Elementos bloqueáveis nesta página">
+<!ENTITY options.label "&amp;Opções">
+<!ENTITY context.object.label "Bloquear objeto">
+<!ENTITY context.removeWhitelist.label "Reativar nesta página">
+<!ENTITY filters.tooltip "Filtros mais ativos:">
+<!ENTITY closesidebar.label "Fechar itens &amp;bloqueáveis">
+<!ENTITY showintoolbar.label "Mostrar na &amp;barra de ferramentas">
+<!ENTITY status.tooltip "Estado:">
+<!ENTITY context.media.label "Bloquear áudio/vídeo">
+<!ENTITY subscription.update.label "Atualizar filtros">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/sendReport.dtd
new file mode 100644
index 0000000..d4ac781
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "An&amp;ular">
+<!ENTITY issues.disabledgroups.description "As seguintes subscrições/grupos de filtros estão inativos mas podem estar a interferir nesta página:">
+<!ENTITY showData.label "Mostrar dados do relatório">
+<!ENTITY typeSelector.falsePositive.label "O Adblock Plus está a bloquear de&amp;masiado">
+<!ENTITY issues.change.description "A configuração foi alterada. Por favor recarregue a página para testar as alterações e submeter o relatório, caso o problema ainda persista.">
+<!ENTITY email.label "E&amp;mail:">
+<!ENTITY issues.openPreferences.label "Abrir preferências de filtros">
+<!ENTITY sendPage.confirmation "O seu relatório foi guardado. Pode aceder ao relatório através do seguinte endereço:">
+<!ENTITY copyLink.label "&amp;Copiar ligação do relatório">
+<!ENTITY issues.nofilters.description "O Adblock Plus não está a bloquear elementos da página atual. Provavelmente o problema que está a ocorrer não está relacionado com o Adblock Plus.">
+<!ENTITY sendPage.knownIssue "O problema que reportou já é, provavelmente, conhecido. Mais informação:">
+<!ENTITY typeSelector.other.description "Selecione esta opção se suspeita de um problema no Adblock Plus ao invés de um problema nos filtros.">
+<!ENTITY issues.disabledgroups.enable.label "Ativar subscrição/grupo de filtros">
+<!ENTITY typeWarning.override.label "&amp;Eu compreendo e pretendo enviar o relatório">
+<!ENTITY issues.disabled.enable.label "Ativar Adblock Plus">
+<!ENTITY update.fixed.description "A atualização dos seus filtros parece ter resolvido o problema que estava a reportar. Por favor recarregue a página e tente novamente. Envie um relatório se o problema persistir.">
+<!ENTITY anonymous.label "Submissão &amp;anónima">
+<!ENTITY reloadButton.label "&amp;Recarregar página">
+<!ENTITY recentReports.clear.label "&amp;Remover todos os relatórios">
+<!ENTITY typeSelector.description "Esta janela guiá-lo-à através dos passos necessários para submeter o relatório de erros. Por favor selecione o tipo de erro que está a ocorrer nesta página:">
+<!ENTITY screenshot.remove.label "&amp;Remover informação sensível">
+<!ENTITY issues.ownfilters.description "Alguns dos filtros aplicados nesta página são definidos pelo utilizador. Por favor desative os filtros que poderão estar a causar o problema:">
+<!ENTITY update.inProgress.description "O Adblock Plus necessita de atualizar as subscrições de filtros para se certificar que o problema não foi resolvido. Por favor aguarde...">
+<!ENTITY sendPage.retry.label "Enviar novamente">
+<!ENTITY data.label "&amp;Dados do relatório:">
+<!ENTITY recentReports.label "Os seus relatórios recentes">
+<!ENTITY typeWarning.description "Indicou que pretende reportar um problema genérico do Adblock Plus em vez de um problema com os filtros. Esse tipo de problemas devem ser reportados no [link]fórum Adblock Plus[/link]. Só deve utilizar esta funcionalidade para complementar uma discussão existente, uma vez que ninguém terá conhecimento do seu relatório se não lhes disponibilizar a ligação. A ligação será disponibilizada depois de submeter o relatório.">
+<!ENTITY issues.disabled.description "O Adblock Plus está inativo e não bloqueará anúncios.">
+<!ENTITY attachExtensions.label "Ane&amp;xe a lista das extensões ativas ao relatório para verificarmos se alguma das extensões está a interferir com a aplicação">
+<!ENTITY issues.nosubscriptions.add.label "Adicionar subscrição de filtros">
+<!ENTITY issues.disabledfilters.enable.label "Ativar filtro">
+<!ENTITY issues.override.label "A &amp;configuração está correta. Continuar com o relatório">
+<!ENTITY issues.nosubscriptions.description "Parece que você ainda não subscreveu qualquer lista de filtros que bloqueiam os anúncios dos sítios web.">
+<!ENTITY typeSelector.falsePositive.description "Selecione esta opção se a página não mostra ou mostra incorretamente o conteúdo importante ou se não funciona corretamente. Pode verificar se o Adblock Plus é o causador do problema destivando-o temporariamente.">
+<!ENTITY typeSelector.other.label "Ou&amp;tro erro">
+<!ENTITY emailComment.label "Deve indicar um endereço eletrónico válido para que o possamos contactar, caso precisemos de ajuda para resolver o erro reportado no relatório. O endereço permite-nos também verificar os contributos e criar uma hierarquia.">
+<!ENTITY issues.whitelist.remove.label "Reativar Adblock Plus nesta página">
+<!ENTITY outdatedSubscriptions.description "As seguintes subscrições não são atualizadas há mais de duas semanas. Por favor atualize as subscrições antes de submeter o relatório. O problema pode já ter sido resolvido.">
+<!ENTITY dataCollector.description "Por favor aguarde um momento enquanto o Adblock Plus reúne os dados necessários.">
+<!ENTITY sendButton.label "E&amp;nviar relatório">
+<!ENTITY comment.label "&amp;Comentário (opcional):">
+<!ENTITY sendPage.errorMessage "O envio do relatório falhou com o código de erro &quot;?1?&quot;. Por favor certifique-se que está ligado à Internet e tente novamente. Se o problema persistir, aceda ao [link]fórum do Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Mostrar relatórios recentes">
+<!ENTITY commentPage.heading "Adicionar comentário">
+<!ENTITY update.start.label "Atualizar agora">
+<!ENTITY issues.disabledfilters.description "Os filtros seguintes estão inativos mas podem estar a interferir nesta página:">
+<!ENTITY screenshot.description "A página pode ter um aspeto diferente, consoante a configuração definida. Pode ajudar-nos a perceber o problema se anexar uma imagem ao seu relatório. Pode remover secções que contenham informação sensível e marcar áreas onde o problema seja evidente. Para efetuar estas alterações, clique no botão respetivo e selecione a secção da imagem com o rato.">
+<!ENTITY screenshot.attach.label "Anexar uma imagem ao rela&amp;tório">
+<!ENTITY issues.whitelist.description "O Adblock Plus está inativo na página sobre a qual está a reportar. Por favor reative-o e recarregue a página antes de submeter um relatório para ajudar a analisar este problema.">
+<!ENTITY typeSelector.falseNegative.label "O Adblock Plus não bloqueia um anú&amp;ncio">
+<!ENTITY typeSelector.heading "Selecione o tipo de erro">
+<!ENTITY anonymity.warning "Desta forma, não o poderemos contactar e o mais provável é que lhe iremos dar uma prioridade baixa.">
+<!ENTITY wizard.title "Comunicação de erros">
+<!ENTITY issues.ownfilters.disable.label "Desativar filtro">
+<!ENTITY commentPage.description "O campo de texto seguinte permite-lhe adicionar um comentário para nos ajudar a perceber o problema. Este passo é opcional mas recomendável se o problema não for óbvio. Pode rever o conteúdo do relatório antes de o enviar.">
+<!ENTITY comment.lengthWarning "O comentário excede os 1000 caracteres. Apenas os primeiros 1000 caracteres serão enviados.">
+<!ENTITY typeSelector.falseNegative.description "Selecione esta opção se o anúncio é exibido e o Adblock Plus está ativo.">
+<!ENTITY sendPage.waitMessage "Por favor aguarde enquanto o Adblock Plus submete o seu relatório.">
+<!ENTITY dataCollector.heading "Bem-vindo à comunicação de erros">
+<!ENTITY screenshot.heading "Anexar imagem">
+<!ENTITY sendPage.heading "Enviar relatório">
+<!ENTITY issues.subscriptionCount.description "Parece ter subscrito demasiados filtros. Esta opção não é aconselhável e pode gerar problemas. Não podemos aceitar o seu relatório porque não é claro que filtros devem ser tidos em consideração. Por favor remova todos os filtros exceto os realmente necessários e verifique se o problema ainda ocorre.">
+<!ENTITY screenshot.mark.label "&amp;Marcar o problema">
+<!ENTITY privacyPolicy.label "Política de privacidade">
+<!ENTITY issues.description "O Adblock Plus detetou problemas na sua configuração que poderão ser os responsáveis pelo problema ou que poderão dificultar a análise do relatório.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/sidebar.dtd
new file mode 100644
index 0000000..cdb4186
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Contorno do item flash">
+<!ENTITY address.label "Endereço">
+<!ENTITY context.open.label "Abrir em novo separador">
+<!ENTITY type.label "Tipo">
+<!ENTITY tooltip.filterSource.label "Origem do filtro:">
+<!ENTITY noitems.label "Sem itens bloqueáveis">
+<!ENTITY filter.label "Filtro">
+<!ENTITY tooltip.size.label "Tamanho:">
+<!ENTITY reattach.label "Reancorar">
+<!ENTITY search.label "&amp;Procurar:">
+<!ENTITY docDomain.thirdParty "(terceiros)">
+<!ENTITY filterSource.label "Código fonte do filtro">
+<!ENTITY tooltip.docDomain.label "Origem do documento:">
+<!ENTITY context.copy.label "Copiar endereço do item">
+<!ENTITY tooltip.type.label "Tipo:">
+<!ENTITY context.disablefilter.label "Desativar filtro ?1?">
+<!ENTITY context.copyFilter.label "Copiar filtro">
+<!ENTITY context.block.label "Bloquear este item">
+<!ENTITY context.enablefilter.label "Reativar filtro ?1?">
+<!ENTITY detach.label "Desancorar">
+<!ENTITY whitelisted.label "Página permitida">
+<!ENTITY context.disablefilteronsite.label "Desativar este filtro em ?1?">
+<!ENTITY detached.title "Itens bloqueáveis (desancorada)">
+<!ENTITY docDomain.firstParty "(primeira parte)">
+<!ENTITY tooltip.type.whitelisted "(permitido)">
+<!ENTITY tooltip.filter.label "Filtro ativo:">
+<!ENTITY tooltip.filter.disabled "(inativo)">
+<!ENTITY context.editfilter.label "Editar filtro ativo">
+<!ENTITY tooltip.type.blocked "(bloqueado)">
+<!ENTITY size.label "Tamanho">
+<!ENTITY context.whitelist.label "Adicionar exceção para o item">
+<!ENTITY context.selectAll.label "Selecionar tudo">
+<!ENTITY state.label "Estado">
+<!ENTITY docDomain.label "Origem do documento">
+<!ENTITY tooltip.address.label "Endereço:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/subscriptionSelection.dtd
new file mode 100644
index 0000000..77179e8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/pt-PT/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Adicionar &amp;subscrição de filtros &quot;?1?&quot;">
+<!ENTITY list.download.failed "O Adblock Plus não conseguiu obter a lista de subscrições.">
+<!ENTITY list.download.retry "Tentar novamente">
+<!ENTITY title.label "&amp;Título da subscrição:">
+<!ENTITY list.download.website "Visitar sítio web">
+<!ENTITY supplementMessage "Esta subscrição deve ser utilizada em conjunto com a subscrição &quot;?1?&quot;, que ainda não está a ser utilizada.">
+<!ENTITY viewList.label "Ver filtros">
+<!ENTITY visitHomepage.label "Visitar página">
+<!ENTITY addSubscription.label "Adicionar subscrição">
+<!ENTITY dialog.title "Adicionar subscrição de filtro">
+<!ENTITY location.label "&amp;Localização de lista de filtros:">
+<!ENTITY fromWeb.description "Por favor confirme a adição dessta subscrição de filtros. Pode alterar o título ou a localização da subscrição antes de a adicionar.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/composer.dtd
new file mode 100644
index 0000000..2bc9f86
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "la s&amp;fârşitul adresei">
+<!ENTITY domainRestriction.label "Aplică &amp;doar domeniului">
+<!ENTITY collapse.default.no.label "Foloseşte opţiunea implicită (nu)">
+<!ENTITY firstParty.label "Doar la pagina &amp;vizitată">
+<!ENTITY preferences.label "&amp;Arată filtrele existente...">
+<!ENTITY pattern.label "Model de căutare pentru potrivire adrese">
+<!ENTITY thirdParty.label "La &amp;pagini partener (3rd party)">
+<!ENTITY filter.label "Fil&amp;tru nou:">
+<!ENTITY collapse.label "Eliberează &amp;spaţiul blocat:">
+<!ENTITY match.warning "Modelul introdus nu mai corespunde adresei care trebuie blocată/deblocată şi de aceea nu va avea nici un efect asupra paginii curente.">
+<!ENTITY anchor.start.label "la î&amp;nceputul adresei">
+<!ENTITY matchCase.label "Potrivire &amp;majusculă">
+<!ENTITY custom.pattern.label "model &amp;individual:">
+<!ENTITY unselectAllTypes.label "Nici unul">
+<!ENTITY type.whitelist.label "Regulă e&amp;xcepţii">
+<!ENTITY regexp.warning "Modelul introdus va fi interpretată ca o expresie regulată, ceea ce poate cauza încetinirea navigării. Dacă nu doriţi să folosiţi expresii regulate, introduceţi * la sfârşitul modelului.">
+<!ENTITY dialog.title "Adăugare regulă de filtrare Adblock Plus">
+<!ENTITY basic.label "Vizualizare simplă">
+<!ENTITY type.filter.label "Filtru de &amp;blocare">
+<!ENTITY types.label "Valabil pentru:">
+<!ENTITY shortpattern.warning "Modelul introdus este prea scurt pentru a fi optimizat, ceea ce poate cauza încetinirea navigării. Este recomandabil să introduceţi modele mai mai lungi.">
+<!ENTITY collapse.yes.label "Da">
+<!ENTITY anchors.label "FoloseÅŸte modelul introdus doar:">
+<!ENTITY collapse.default.yes.label "Foloseşte opţiunea implicită (da)">
+<!ENTITY domainRestriction.help "Specificaţi unul sau mai multe domenii internet, separate de către simbolul |, pentru care filtrul este valid. Simbolul ~ înaintea numelui domeniului va face ca regula să NU se aplice pe domeniul specificat.">
+<!ENTITY accept.label "Adaugă filtru">
+<!ENTITY options.label "Opţiuni">
+<!ENTITY disabled.warning "Adblock Plus este inactiv. Puteţi să adăugaţi filtre, însă ele vor fi utilizate doar după ce [link]activaţi Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "la î&amp;nceputul numelui de domeniu">
+<!ENTITY collapse.no.label "Nu">
+<!ENTITY selectAllTypes.label "Toate tipurile">
+<!ENTITY advanced.label "Vizualizare avansată">
+<!ENTITY pattern.explanation "Filtrul va fi aplicat doar adreselor care corespund modelului definit mai jos, în care simbolul * acţionează ca joker.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/filters.dtd
new file mode 100644
index 0000000..a74e04b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Toate filtrele proprii vor fi înlocuite de către conţinutul fişierului ales. Doriţi să continuaţi?">
+<!ENTITY slow.column "Fi&amp;ltre lente">
+<!ENTITY enabled.column "Activat (&amp;S)">
+<!ENTITY subscription.lastDownload.checksumMismatch "EÅŸuat, suma de control nu se potriveÅŸte.">
+<!ENTITY noFiltersInGroup.text "Grupul selectat este gol.">
+<!ENTITY subscription.actions.label "Acțiuni">
+<!ENTITY filter.selectAll.label "Selectează toate">
+<!ENTITY backupButton.label "&amp;Salvare și Restaurare">
+<!ENTITY restore.minVersion.warning "Avertisment: acest fişier a fost creat de către o versiune mai nouă de Adblock Plus. Se recomandă utilizarea celei mai noi versiuni.">
+<!ENTITY restore.error "Datele din fişier nu pot fi folosite. Verificaţi dacă fişierul a fost într-adevăr create de către Adblock Plus.">
+<!ENTITY sort.ascending.label "Crescător (&amp;A&gt;Z)">
+<!ENTITY sort.label "&amp;Ordonare">
+<!ENTITY subscription.source.label "Listă de filtre">
+<!ENTITY hitcount.column "&amp;Contor">
+<!ENTITY noFilters.text "Nu aveţi nici un filtru propriu.">
+<!ENTITY backup.custom.title "Doar filtre proprii">
+<!ENTITY subscription.external.label "Actualizat de altă extensie">
+<!ENTITY subscription.delete.label "Șterge">
+<!ENTITY noGroupSelected.text "Pentru a vizualiza filtre, trebuie să alegeţi mai întâi un grup.">
+<!ENTITY filter.cut.label "Taie">
+<!ENTITY restore.default.label "Restaurează salvarea din ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Descărcare...">
+<!ENTITY subscriptions.tab.label "Abonamente filtre">
+<!ENTITY sort.descending.label "Descrescător (&amp;Z&gt;A)">
+<!ENTITY filters.remove.warning "Sunteţi sigur că doriţi să ştergeţi filtrele selectate?">
+<!ENTITY filter.delete.label "Åžterge">
+<!ENTITY addSubscriptionAdd.label "Adaugă">
+<!ENTITY viewMenu.label "Vizualizare">
+<!ENTITY subscription.lastDownload.unknown "Necunoscut">
+<!ENTITY addSubscriptionCancel.label "Anulează">
+<!ENTITY subscription.enabled.label "Activat">
+<!ENTITY noSubscriptions.text "Nu aţi adăugat nici un abonament de filtre. Adblock Plus nu blochează nimic dacă nu are filtre. Puteţi folosi butonul Adaugă abonament filtre pentru a vă abona la câteva liste de filtre.">
+<!ENTITY subscription.update.label "Actualizează filtre">
+<!ENTITY dialog.title "Preferințe filtre Adblock Plus">
+<!ENTITY addFilter.label "A&amp;daugă filtru">
+<!ENTITY subscription.minVersion.warning "Acest abonament necesită o versiune mai nouă de Adblock Plus. Se recomandă utilizarea celei mai noi versiuni.">
+<!ENTITY subscription.lastDownload.invalidURL "Eşuat, adresa nu este validă">
+<!ENTITY backup.error "O eroare a apărut la scrierea fişierului. Asiguraţi-vă că fişierul nu este protejat la scriere sau folosit de către altă aplicaţie.">
+<!ENTITY filter.moveUp.label "Mută sus">
+<!ENTITY addGroup.label "Adau&amp;gă grup filtre">
+<!ENTITY filter.edit.label "Editează">
+<!ENTITY subscription.showHideFilters.label "Arată/ascunde filtre">
+<!ENTITY acceptableAds2.label "&amp;Permite publicitatea discretă">
+<!ENTITY addSubscriptionOther.label "Adaugă alt abonament">
+<!ENTITY close.label "ÃŽnchide">
+<!ENTITY sort.none.label "&amp;Neordonat">
+<!ENTITY filter.actions.label "Acțiuni filtre">
+<!ENTITY filter.copy.label "Copiază">
+<!ENTITY filter.moveDown.label "Mută jos">
+<!ENTITY filter.resetHitCounts.label "Iniţializează statisticile filtrelor">
+<!ENTITY readMore.label "Citește mai mult">
+<!ENTITY subscription.moveUp.label "Mută sus">
+<!ENTITY addSubscription.label "Adaugă a&amp;bonament filtru">
+<!ENTITY subscription.homepage.label "Pagina de start">
+<!ENTITY backup.complete.title "Toate filtrele și abonamentele">
+<!ENTITY restore.own.label "Restaurează propria salvare">
+<!ENTITY restore.complete.warning "Toate opţiunile filtrelor vor fi înlocuite de către conţinutul fişierului ales. Doriţi să continuaţi?">
+<!ENTITY filters.tab.label "Filtre proprii">
+<!ENTITY backup.label "Crează salvare nouă">
+<!ENTITY find.label "&amp;Caută">
+<!ENTITY subscription.moveDown.label "Mută jos">
+<!ENTITY subscription.lastDownload.connectionError "Eşuat, descărcare nereuşită">
+<!ENTITY subscription.lastDownload.success "Succes">
+<!ENTITY subscription.lastDownload.invalidData "Eşuat, lista nu este validă">
+<!ENTITY filter.paste.label "LipeÅŸte">
+<!ENTITY subscription.disabledFilters.enable "Activează filtrele inactive">
+<!ENTITY lasthit.column "&amp;Ultima aplicare">
+<!ENTITY subscription.editTitle.label "Editează titlu">
+<!ENTITY subscription.disabledFilters.warning "Unele filtre din acest abonament sunt dezactivate.">
+<!ENTITY filter.column "&amp;Regulă de filtrare">
+<!ENTITY subscription.lastDownload.label "Ultima descărcare:">
+<!ENTITY viewList.label "Afişare listă">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/firstRun.properties
new file mode 100644
index 0000000..f097877
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Navigare fără urme prin eliminarea indiciilor plantate de către companiile publicitare care urmăresc și înregistrează comportamentul dumneavoastră.
+firstRun_toggle_off=OFF
+firstRun_feature_tracking=Dezactivare urmărire
+firstRun_feature_malware=Blocare software rău intenţionat
+firstRun_title=Adblock Plus a fost instalat
+firstRun_toggle_on=ON
+firstRun_acceptableAdsExplanation=Dorim să încurajăm site-urile web în a utiliza publicitate simplă, discretă. De aceea ne-am stabilit <a>reguli de orientare stricte</a> pentru a identifica anunțurile acceptabile, care sunt permise de către setările implicite. Dacă totuși doriți să bloca toată publicitatea, puteți <a>dezactiva</a> aceste permisiuni în câteva secunde.
+firstRun_contributor_credits=Contributori
+firstRun_dataCorruptionWarning=Această pagină continuă să apară și după terminarea instalării? <a>Faceți clic aici!</a>
+firstRun_acceptableAdsHeadline=Reclamele enervante vor fi blocate acum
+firstRun_share=Spuneți prietenilor dumneavoastră
+firstRun_share_headline=<a>Ajutați-ne</a> în a îmbunătăți web-ul
+firstRun_feature_social_description=Eliminare automată a butoanelor mass-media socială, cum ar fi Facebook, care apar pe paginile de web pentru a urmări și înregistra comportamentul dumneavoastră.
+firstRun_filterlistsReinitializedWarning=Se pare că din cauza unor probleme toate filtrele au fost eliminate şi a fost imposibil să le recuperăm. Prin urmare, am resetat filtrele şi setările pentru publicitate acceptabilă. Vă rugăm să verificaţi listele de filtre şi setările pentru publicitate acceptabilă în <a>Opţiuni pentru Adblock Plus</a>.
+firstRun_feature_malware_description=Securizarea navigării prin blocarea domeniilor rău-intenționate cunoscute.
+firstRun_features=Adblock Plus poate face mai mult decât să blocheze publicitatea
+firstRun_donate=Donaţii
+firstRun_donate_label=Ajutați proiectul
+firstRun_feature_social=Ascundere butoane Social Media
+firstRun_legacySafariWarning=Folosiți o versiune veche de Safari care nu este suportată de Adblock Plus. Aceasta putea funcționa incorect sau ar putea afecta navigarea pe unele site-uri. Vă recomandăm insistent să instalați cel puțin Safari 6.1.1 (pe sistemul de operare Mac OS X 10.8 Mountain Lion), sau Safari 7.0.1 (pe OS X 10.9 Mavericks), sau să utilizați cea mai recentă versiune de Mozilla Firefox, Google Chrome, sau Opera.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/global.properties
new file mode 100644
index 0000000..e8ed998
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=În pagină nu se găsește nici un element blocabil
+action3_tooltip=Clic pentru a activa/dezactiva Adblock Plus.
+notification_antiadblock_title=Ascunde mesajele direcționate?
+type_label_script=script
+filter_elemhide_nocriteria=Nu s-a specificat nici un criteriu pentru a identifica elementul pentru ascundere.
+blockingGroup_title=Reguli de blocare
+whitelisted_tooltip=Adblock Plus este activ, dar inactiv în pagina curentă.
+type_label_stylesheet=foaie de stiluri
+blocked_count_tooltip=?1? din ?2?
+type_label_font=corp caracter
+type_label_popup=fereastră pop-up
+filter_regexp_tooltip=Acest filtru este bazat pe expresii regulate sau este prea scurt pentru a fi optimizat. Prea multe astfel de filtre pot duce la încetinirea navigării.
+action0_tooltip=Clic pentru a afiÅŸa meniul contextual, clic-mijloc pentru a activa/dezactiva.
+whitelisted_page=Adblock Plus este inactiv pentru pagina curentă
+remove_group_warning=Sigur doriţi să înlăturaţi acest grup?
+action1_tooltip=Clic pentru a deschide lista elementelor blocabile, clic-mijloc pentru a activa/dezactiva.
+type_label_xmlhttprequest=cerere XML
+active_tooltip=Adblock Plus este activ, sunt folosite ?1? abonamente ÅŸi ?2? filtre proprii.
+type_label_document=document
+type_label_object_subrequest=subcerere obiect
+whitelistGroup_title=Reguli excepţii
+disabled_tooltip=Adblock Plus este inactiv.
+filter_elemhide_duplicate_id=Se poate specifica doar un singur identificator de element pentru ascundere.
+type_label_object=obiect
+action2_tooltip=Clic pentru a modifica opţiuni, clic-mijloc pentru a activa/dezactiva.
+type_label_subdocument=cadru (frame)
+clearStats_warning=Toate statisticile filtrelor vor fi iniţializate şi înregistrarea lor va fi dezactivată. Sunteţi sigur că doriţi să continuaţi?
+notification_antiadblock_message=Acest site trimite mesaje direcționate utilizatorilor Adblock Plus. Vrei ca Adblock Plus să ascundă aceste mesaje direcționate?
+blocked_count_addendum=(permisiuni explicite: ?1?, elemente ascunse: ?2?)
+subscription_invalid_location=Locaţia pentru filtre nu este validă
+type_label_image=imagine
+remove_subscription_warning=Sigur doriţi să îndepărtaţi această subscriere?
+type_label_other=alt element
+mobile_menu_enable=ABP: Activează
+type_label_media=audio-video
+mobile_menu_disable_site=ABP: Dezactivează pe ?1?
+elemhideGroup_title=Reguli de ascuns elemente
+mobile_menu_enable_site=ABP: Activează pe ?1?
+type_label_elemhide=ascuns
+newGroup_title=Grup de filtre nou
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/overlay.dtd
new file mode 100644
index 0000000..4da883a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Da">
+<!ENTITY notification.button.no "&amp;Nu">
+<!ENTITY sync.label "Si&amp;ncronizează setările Adblock Plus">
+<!ENTITY whitelist.site.label "Dezactivează Adblock Plus pe ?1?">
+<!ENTITY filters.label "Pre&amp;ferințe filtre">
+<!ENTITY disable.label "Dezactivează peste tot">
+<!ENTITY objecttab.title "Blochează">
+<!ENTITY objecttab.tooltip "Click aici pentru a bloca obiectul utilizând Adblock Plus">
+<!ENTITY menuitem.label "&amp;Adblock Plus">
+<!ENTITY objecttabs.label "Arată &amp;panouri lângă Flash şi Java">
+<!ENTITY sendReport.label "Rapor&amp;tează probleme pe această pagină">
+<!ENTITY whitelist.page.label "Dezactivează Adblock Plus doar pe pagina curentă">
+<!ENTITY context.image.label "Adblock Plus: blochează imagine">
+<!ENTITY counthits.label "Înre&amp;gistrează statisticile filtrelor">
+<!ENTITY opensidebar.label "Deschide &amp;lista elementelor blocabile">
+<!ENTITY notification.button.close "ÃŽn&amp;chide">
+<!ENTITY contribute.label "Contribuie la Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: blochează cadru">
+<!ENTITY blocked.tooltip "Elemente blocate în pagină:">
+<!ENTITY hideplaceholders.label "Ascunde &amp;indicatoarele elementelor blocate">
+<!ENTITY showinstatusbar.label "Arată în bara de &amp;stare">
+<!ENTITY sidebar.title "Adblock Plus: elemente blocabile în pagină">
+<!ENTITY options.label "&amp;Opţiuni">
+<!ENTITY context.object.label "Adblock Plus: blochează obiect">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: reactivează în pagina curentă">
+<!ENTITY filters.tooltip "Cele mai active filtre:">
+<!ENTITY closesidebar.label "ÃŽnchide &amp;lista elementelor blocabile">
+<!ENTITY showintoolbar.label "Arată în bara de &amp;unelte">
+<!ENTITY status.tooltip "Stare:">
+<!ENTITY context.media.label "Adblock Plus: blochează audio/video">
+<!ENTITY subscription.update.label "Actualizează filtre">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/sendReport.dtd
new file mode 100644
index 0000000..2787f00
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "An&amp;ulează ultima operație">
+<!ENTITY issues.disabledgroups.description "Grupurile de filtre sau abonamentele următoare sunt inactive, deși ar putea să aibă efect pe pagina curentă:">
+<!ENTITY showData.label "AfiÅŸare raportare">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blochează prea &amp;mult">
+<!ENTITY issues.change.description "Configurația a fost schimbată. Reîncărcați pagina pentru a verifica dacă problema persistă. În acest caz, creați o raportare de problemă.">
+<!ENTITY email.label "&amp;Email:">
+<!ENTITY issues.openPreferences.label "Deschide preferințe filtre">
+<!ENTITY sendPage.confirmation "Raportarea a fost salvată și poate fi accesată la adresa următoare:">
+<!ENTITY copyLink.label "&amp;Copiază legătura raportării">
+<!ENTITY issues.nofilters.description "Adblock Plus nu blochează nimic în pagina curentă. Problema pe care o aveți nu are probabil nici o legătură cu Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Problema pe care o aveți este probabil cunoscută. Detalii:">
+<!ENTITY typeSelector.other.description "Alegeți această opțiune dacă aveți impresia că Adblock Plus are o problemă internă.">
+<!ENTITY issues.disabledgroups.enable.label "Activează grupul de filtre / abonamentul">
+<!ENTITY typeWarning.override.label "Trimite rap&amp;ortarea în orice caz">
+<!ENTITY issues.disabled.enable.label "Activează Adblock Plus">
+<!ENTITY update.fixed.description "Actualizarea abonamentelor de filtre va rezolva probabil problema pe care doriți să o raportați. Reîncărcați pagina și utilizați butonul de raportare dacă problema persistă.">
+<!ENTITY anonymous.label "Prezentare an&amp;onima">
+<!ENTITY reloadButton.label "&amp;Reîncărcare pagină">
+<!ENTITY recentReports.clear.label "Șter&amp;ge toate rapoartele">
+<!ENTITY typeSelector.description "Această fereastră vă ghidează prin pașii necesari raportării unei probleme Adblock Plus. Pentru început, alegeți tipul problemei întâlnite pe pagina curentă:">
+<!ENTITY screenshot.remove.label "Masc&amp;hează datele personale">
+<!ENTITY issues.ownfilters.description "Câteva din filtrele aplicate pe această pagină sunt definite de către utilizator. Dezactivați filtrele următoare, care sunt probabil cauza problemei:">
+<!ENTITY update.inProgress.description "Adblock Plus trebui să actualizeze abonamentele de filtre pentru a verifica dacă problema a fost rezolvată între timp. Așteptați un moment.">
+<!ENTITY sendPage.retry.label "Retrimite">
+<!ENTITY data.label "&amp;Datele reportării">
+<!ENTITY recentReports.label "Rapoartele trimise recent">
+<!ENTITY typeWarning.description "Aţi indicat că problema este generală și nu are legătură cu filtrele. Cel mai bine ar fi să raportați problema în [link]forumul Adblock Plus[/link]. Raportarea automată trebuie folosită numai ca unealtă suplimentară pentru o discuție pe forum deja existentă. Pentru aceasta, folosiți legătura generată la sfârșitul operațiunii curente. Dacă nu postați legătura pe forum, este posibil ca nimeni să nu citească raportarea.">
+<!ENTITY issues.disabled.description "Adblock Plus este inactiv și nu va bloca nimic în starea curentă.">
+<!ENTITY attachExtensions.label "Atașea&amp;ză lista suplimentelor active pentru a verifica conflictele potențiale">
+<!ENTITY issues.nosubscriptions.add.label "Adaugă abonament filtre">
+<!ENTITY issues.disabledfilters.enable.label "Activează filtrele">
+<!ENTITY issues.override.label "Configurația es&amp;te corectă, continuă raportarea">
+<!ENTITY issues.nosubscriptions.description "Se pare că nu sunteți abonat la nici o listă de filtre predefinită.">
+<!ENTITY typeSelector.falsePositive.description "Alegeți această opțiune dacă pagina este afișată incorect sau nu funcționează cum trebuie atunci când Adblock Plus este activ. Verificați dacă Adblock Plus este sursa problemei prin dezactivarea temporară a suplimentului.">
+<!ENTITY typeSelector.other.label "Al&amp;tă problemă">
+<!ENTITY emailComment.label "Vă recomandăm să introduceți o adresă validă de email pentru a vă putea contacta cu posibile întrebări despre acest raport. De asemenea, acest lucru ne ajută la recunoașterea contribuțiilor dumneavoastră și la prioritizarea mai bună a acestora.">
+<!ENTITY issues.whitelist.remove.label "Reactivează Adblock Plus pe pagina curentă">
+<!ENTITY outdatedSubscriptions.description "Abonamentele de filtre de mai jos nu au fost actualizate în ultimele două săptămâni. Actualizați-le înainte de a trimite raportul, este posibil ca problema să fi fost deja rezolvată.">
+<!ENTITY dataCollector.description "Așteptați un moment până ce Adblock Plus adună datele necesare.">
+<!ENTITY sendButton.label "Tr&amp;imite raportare">
+<!ENTITY comment.label "&amp;Comentariu (opțional):">
+<!ENTITY sendPage.errorMessage "Eroare la trimitere, cod &quot;?1?&quot;. Verificați dacă sunteți conectat la internet. Dacă problema persistă, cereți ajutor în [link]forumul Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Arată rapoartele trimise recent">
+<!ENTITY commentPage.heading "Introducere comentariu">
+<!ENTITY update.start.label "Actualizează acum">
+<!ENTITY issues.disabledfilters.description "Filtrele următoare sunt inactive, deși ar putea să aibă efect pe pagina curentă:">
+<!ENTITY screenshot.description "Aceeași pagină poate fi afișată diferit pe calculatoare diferite. S-ar putea să ne fie de ajutor la înțelegerea problemei dacă ne trimiteți un instantaneu al paginii curente. Aveți posibilitatea de a înlătura datele confidențiale, precum și de a marca zonele cu probleme, folosind butoanele corespunzătoare și apoi selectând cu mausul.">
+<!ENTITY screenshot.attach.label "Atașează &amp;instantaneu ecran">
+<!ENTITY issues.whitelist.description "Adblock Plus este inactiv pe pagina curentă. Pentru a ajuta la investigarea problemei, activați Adblock Plus și reîncărcați pagina înainte de a trimite un raport.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus &amp;nu blochează o reclamă">
+<!ENTITY typeSelector.heading "Alegeți tipul problemei">
+<!ENTITY anonymity.warning "Nu vom fi capabili sa venim inapoi la tine si sa acordam probabil raportul inferior.">
+<!ENTITY wizard.title "Raportare problemă">
+<!ENTITY issues.ownfilters.disable.label "Dezactivează filtre">
+<!ENTITY commentPage.description "Puteți introduce aici e explicație detaliată care ne poate ajuta să înțelegem mai bine problema (opțional, însă recomandat).">
+<!ENTITY comment.lengthWarning "Comentariul are mai mult de 1000 de litere. Doar primele 1000 vor fi trimise.">
+<!ENTITY typeSelector.falseNegative.description "Alegeți această opțiune în caz că o reclamă este afișată în ciuda faptului că Adblock Plus este activ.">
+<!ENTITY sendPage.waitMessage "Așteptați până când Adblock Plus trimite datele.">
+<!ENTITY dataCollector.heading "Bine ați venit la programul de raportat probleme">
+<!ENTITY screenshot.heading "Atașare instantaneu ecran">
+<!ENTITY sendPage.heading "Trimite raportarea">
+<!ENTITY issues.subscriptionCount.description "Se pare că sunteți abonat la prea multe abonamente de filtru, ceea ce nu este recomandat, deoarece va cauza probabil probleme în viitor. De asemenea, nu poate accepta raportul problemă, deoarece nu este clar care dintre autorii abonamentelor trebuie să ia măsuri. Vă rugăm să păstrați doar abonamentele absolut necesare și să încercați dacă problema persistă.">
+<!ENTITY screenshot.mark.label "&amp;Marcare problemă">
+<!ENTITY privacyPolicy.label "Politica de confidențialitate">
+<!ENTITY issues.description "Adblock Plus a detectat inconsistențe în configurație care pot fi cauza problemei, sau care pot îngreuna trimiterea raportului.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/sidebar.dtd
new file mode 100644
index 0000000..f6400b4
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Evidenţiază marginile elementelor">
+<!ENTITY address.label "Adresă">
+<!ENTITY context.open.label "Deschide în filă nouă">
+<!ENTITY type.label "Tip">
+<!ENTITY tooltip.filterSource.label "Sursă filtru:">
+<!ENTITY noitems.label "Nici un element blocabil">
+<!ENTITY filter.label "Filtru">
+<!ENTITY tooltip.size.label "Mărime:">
+<!ENTITY reattach.label "Prinde la loc">
+<!ENTITY search.label "&amp;Caută:">
+<!ENTITY docDomain.thirdParty "(parte terţă)">
+<!ENTITY filterSource.label "Sursă filtru">
+<!ENTITY tooltip.docDomain.label "Sursă document:">
+<!ENTITY context.copy.label "Copiază adresa elementului">
+<!ENTITY tooltip.type.label "Tip:">
+<!ENTITY context.disablefilter.label "Dezactivează filtru ?1?">
+<!ENTITY context.copyFilter.label "Copiază filtru">
+<!ENTITY context.block.label "Blochează element">
+<!ENTITY context.enablefilter.label "Reactivează filtru ?1?">
+<!ENTITY detach.label "Desprinde">
+<!ENTITY whitelisted.label "Pagini sigure">
+<!ENTITY context.disablefilteronsite.label "Dezactivează acest filtru pe ?1?">
+<!ENTITY detached.title "Adblock Plus: Lista elementelor blocabile în pagină (desprinsă)">
+<!ENTITY docDomain.firstParty "(parte implicată)">
+<!ENTITY tooltip.type.whitelisted "(permis)">
+<!ENTITY tooltip.filter.label "Filtru în acţiune:">
+<!ENTITY tooltip.filter.disabled "(dezactivat)">
+<!ENTITY context.editfilter.label "Modifică filtrul activ">
+<!ENTITY tooltip.type.blocked "(blocat)">
+<!ENTITY size.label "Mărime">
+<!ENTITY context.whitelist.label "Adaugă regulă excepţie pentru element">
+<!ENTITY context.selectAll.label "Selectează tot">
+<!ENTITY state.label "Stare">
+<!ENTITY docDomain.label "Sursă document">
+<!ENTITY tooltip.address.label "Adresă:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/subscriptionSelection.dtd
new file mode 100644
index 0000000..ec7cdbf
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ro/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "A&amp;daugă și abonamentul ?1?">
+<!ENTITY list.download.failed "Eroare la descărcarea listei de abonamente.">
+<!ENTITY list.download.retry "Încearcă din nou">
+<!ENTITY title.label "&amp;Titlul abonamentului:">
+<!ENTITY list.download.website "Arată pagina web">
+<!ENTITY supplementMessage "Acest abonament trebuie folosit împreună cu abonamentul ?1?,pe care nu îl folosiți încă.">
+<!ENTITY viewList.label "Vizualizare filtre">
+<!ENTITY visitHomepage.label "Vizualizare pagina de start">
+<!ENTITY addSubscription.label "Adaugă abonament">
+<!ENTITY dialog.title "Adăugare abonamente pentru filtre Adblock Plus">
+<!ENTITY location.label "&amp;Locaţia listei de filtre:">
+<!ENTITY fromWeb.description "Confirmați adăugarea acestui abonament filtre. Puteți schimba titlul sau localizarea înainte de a-l adăuga.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/composer.dtd
new file mode 100644
index 0000000..a7fc2c5
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "в кон&amp;це адреÑа">
+<!ENTITY domainRestriction.label "Ограничить &amp;доменом:">
+<!ENTITY collapse.default.no.label "ИÑпользовать Ñтандартное значение (нет)">
+<!ENTITY firstParty.label "Только Ñлементы Ñ Ñ‚Ð¾&amp;го же Ñайта">
+<!ENTITY preferences.label "Показать Ñу&amp;щеÑтвующие фильтры...">
+<!ENTITY pattern.label "иÑкать шаблон">
+<!ENTITY thirdParty.label "Только Ñторонние Ñлементы">
+<!ENTITY filter.label "Ðовый &amp;фильтр:">
+<!ENTITY collapse.label "Элементы заблокированны:">
+<!ENTITY match.warning "Введенный шаблон не ÑоответÑтвует адреÑу, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ вы Ñоздаете правило, и никак не повлиÑет на него.">
+<!ENTITY anchor.start.label "в на&amp;чале адреÑа">
+<!ENTITY matchCase.label "&amp;Учитывать региÑтр букв">
+<!ENTITY custom.pattern.label "&amp;Другой:">
+<!ENTITY unselectAllTypes.label "Убрать вÑе">
+<!ENTITY type.whitelist.label "ИÑ&amp;ключение">
+<!ENTITY regexp.warning "Введенный шаблон будет понÑÑ‚ как регулÑрное выражение. Большое количеÑтво регулÑрных выражений может отрицательно ÑказатьÑÑ Ð½Ð° быÑтродейÑтвии вашего браузера. ЕÑли вы не ÑобиралиÑÑŒ иÑпользовать регулÑрные выражениÑ, то проÑто добавьте звездочку в конце шаблона.">
+<!ENTITY dialog.title "СоÑтавление фильтра Ð´Ð»Ñ Adblock Plus">
+<!ENTITY basic.label "Стандартный вид">
+<!ENTITY type.filter.label "Правило &amp;блокированиÑ">
+<!ENTITY types.label "ПрименÑть к типам:">
+<!ENTITY shortpattern.warning "Введенный шаблон Ñлишком короткий и потому не будет оптимизирован. Большое количеÑтво таких шаблонов может отрицательно ÑказатьÑÑ Ð½Ð° быÑтродейÑтвии вашего браузера. РекомендуетÑÑ Ð¿Ð¾ возможноÑти иÑпользовать более длинный шаблон.">
+<!ENTITY collapse.yes.label "Да">
+<!ENTITY anchors.label "Принимать шаблон только:">
+<!ENTITY collapse.default.yes.label "ИÑпользовать Ñтандартное значение (да)">
+<!ENTITY domainRestriction.help "Укажите один или неÑколько доменов, разделенные Ñимволом «|», фильтр будет применен только на Ñтих доменах. Символ «~» перед именем домена означает, что фильтр не должен применÑтьÑÑ Ð½Ð° Ñтом домене.">
+<!ENTITY accept.label "Добавить фильтр">
+<!ENTITY options.label "ÐаÑтройки...">
+<!ENTITY disabled.warning "Adblock Plus ÑÐµÐ¹Ñ‡Ð°Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½. Ð’Ñ‹ можете добавить фильтры, но чтобы они работали нужно [link]включить Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "в на&amp;чале имени домена">
+<!ENTITY collapse.no.label "Ðет">
+<!ENTITY selectAllTypes.label "Пометить вÑе">
+<!ENTITY advanced.label "РаÑширенный вид">
+<!ENTITY pattern.explanation "Шаблоном может быть Ð»ÑŽÐ±Ð°Ñ Ñ‡Ð°Ñть адреÑа, причем звездочка (*) заменÑет любое количеÑтво Ñимволов. Фильтр будет применен только к тем адреÑам, которые ÑоответÑтвуют шаблону.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/filters.dtd
new file mode 100644
index 0000000..d1a858b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/filters.dtd
@@ -0,0 +1,73 @@
+<!ENTITY restore.custom.warning "Ð’Ñе ÑобÑтвенные фильтры будут заменены данными Ñтого файла. Продолжать?">
+<!ENTITY slow.column "&amp;Медленное">
+<!ENTITY enabled.column "В&amp;ключено">
+<!ENTITY subscription.lastDownload.checksumMismatch "Ошибка: Ð¿Ñ€Ð¾Ð²ÐµÑ€Ð¾Ñ‡Ð½Ð°Ñ Ñумма не Ñовпадает, возможно произошла ошибка загрузки">
+<!ENTITY noFiltersInGroup.text "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð° фильтров пуÑта.">
+<!ENTITY subscription.actions.label "ДейÑтвиÑ">
+<!ENTITY filter.selectAll.label "Выбрать вÑе">
+<!ENTITY backupButton.label "Резервные &amp;копии и воÑÑтановление">
+<!ENTITY restore.minVersion.warning "Предупреждение: Ñтот файл был запиÑан более новой верÑией Adblock Plus. РекомендуетÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ‚ÑŒ Adblock Plus до поÑледней верÑии, прежде чем воÑÑтанавливать данные из Ñтого файла.">
+<!ENTITY restore.error "Ошибка при обработке данных файла, может Ñто не Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ, ÑÐ¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ Adblock Plus?">
+<!ENTITY sort.ascending.label "Сортировка по ал&amp;фавиту">
+<!ENTITY sort.label "Со&amp;ртировка">
+<!ENTITY subscription.source.label "СпиÑок фильтров">
+<!ENTITY hitcount.column "Сра&amp;батываниÑ">
+<!ENTITY noFilters.text "У Ð²Ð°Ñ Ð¿Ð¾ÐºÐ° что нет ÑобÑтвенных фильтров.">
+<!ENTITY backup.custom.title "Только ÑобÑтвенные фильтры">
+<!ENTITY subscription.external.label "ОбновлÑетÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ раÑширением">
+<!ENTITY subscription.delete.label "Удалить">
+<!ENTITY noGroupSelected.text "Ðужно выбрать группу, чтобы показать ее фильтры.">
+<!ENTITY filter.cut.label "Вырезать">
+<!ENTITY restore.default.label "ВоÑÑтановить копию от ?1?">
+<!ENTITY subscription.lastDownload.inProgress "ÑейчаÑ...">
+<!ENTITY subscriptions.tab.label "ПодпиÑки">
+<!ENTITY sort.descending.label "Ð’ об&amp;ратном порÑдке">
+<!ENTITY filters.remove.warning "Ð’Ñ‹ дейÑтвительно хотите удалить вÑе отмеченные фильтры?">
+<!ENTITY filter.delete.label "Удалить">
+<!ENTITY addSubscriptionAdd.label "Добавить">
+<!ENTITY viewMenu.label "Вид">
+<!ENTITY subscription.lastDownload.unknown "никогда">
+<!ENTITY addSubscriptionCancel.label "Отмена">
+<!ENTITY subscription.enabled.label "Включена">
+<!ENTITY noSubscriptions.text "У Ð²Ð°Ñ Ð¿Ð¾ÐºÐ° нет подпиÑок на фильтры. Без фильтров Adblock Plus ничего не будет
+ блокировать, пожалуйÑта воÑпользуйтеÑÑŒ кнопкой &quot;Добавить подпиÑку&quot;.">
+<!ENTITY subscription.update.label "Обновить фильтры">
+<!ENTITY dialog.title "ÐаÑтройки фильтров Adblock Plus">
+<!ENTITY addFilter.label "Добавить &amp;фильтр">
+<!ENTITY subscription.minVersion.warning "Этот ÑпиÑок фильтров требует более новой верÑии Adblock Plus, желательно обновить Adblock Plus до поÑледней верÑии.">
+<!ENTITY subscription.lastDownload.invalidURL "Ошибка: неверный адреÑ">
+<!ENTITY backup.error "При запиÑи фильтров в файл произошла ошибка. Проверьте, может Ñтот файл защищен от запиÑи или иÑпользуетÑÑ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ программой.">
+<!ENTITY filter.moveUp.label "ПомеÑтить выше">
+<!ENTITY addGroup.label "Добавить &amp;группу фильтров">
+<!ENTITY filter.edit.label "Редактировать">
+<!ENTITY subscription.showHideFilters.label "СпрÑтать/показать фильтры">
+<!ENTITY acceptableAds2.label "Разре&amp;шить некоторую ненавÑзчивую рекламу">
+<!ENTITY addSubscriptionOther.label "Добавить другую подпиÑку">
+<!ENTITY close.label "Закрыть">
+<!ENTITY sort.none.label "Бе&amp;з Ñортировки">
+<!ENTITY filter.actions.label "ДейÑÑ‚Ð²Ð¸Ñ Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ð¼Ð¸">
+<!ENTITY filter.copy.label "Копировать">
+<!ENTITY filter.moveDown.label "ПомеÑтить ниже">
+<!ENTITY filter.resetHitCounts.label "Обнулить ÑтатиÑтику попаданий">
+<!ENTITY readMore.label "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ">
+<!ENTITY subscription.moveUp.label "ПомеÑтить выше">
+<!ENTITY addSubscription.label "До&amp;бавить подпиÑку">
+<!ENTITY subscription.homepage.label "ДомашнÑÑ Ñтраница">
+<!ENTITY backup.complete.title "Ð’Ñе фильтры и подпиÑки">
+<!ENTITY restore.own.label "ВоÑÑтановить ÑобÑтвенную копию">
+<!ENTITY restore.complete.warning "Ð’Ñе ваши фильтры и подпиÑки будут заменены данными Ñтого файла. Продолжать?">
+<!ENTITY filters.tab.label "СобÑтвенные фильтры">
+<!ENTITY backup.label "Создать новую резервную копию">
+<!ENTITY find.label "&amp;Ðайти фильтр">
+<!ENTITY subscription.moveDown.label "ПомеÑтить ниже">
+<!ENTITY subscription.lastDownload.connectionError "Ошибка: невозможно загрузить">
+<!ENTITY subscription.lastDownload.success "OK">
+<!ENTITY subscription.lastDownload.invalidData "Ошибка: неверный формат ÑпиÑка фильтров">
+<!ENTITY filter.paste.label "Ð’Ñтавить">
+<!ENTITY subscription.disabledFilters.enable "Включить отключенные фильтры">
+<!ENTITY lasthit.column "ПоÑ&amp;леднее Ñрабатывание">
+<!ENTITY subscription.editTitle.label "Переименовать">
+<!ENTITY subscription.disabledFilters.warning "Ðекоторые фильтры в Ñтой подпиÑке отключены.">
+<!ENTITY filter.column "&amp;Правило">
+<!ENTITY subscription.lastDownload.label "ПоÑледнее обновление:">
+<!ENTITY viewList.label "Открыть ÑпиÑок">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/firstRun.properties
new file mode 100644
index 0000000..9de16d0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=ПроÑматривайте конфиденциально путем Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ - Ñкрыв ваши дейÑÑ‚Ð²Ð¸Ñ Ð¾Ñ‚ объÑÐ²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ð¹, которые будут отÑлеживать каждый ваш шаг.
+firstRun_toggle_off=ВЫКЛ
+firstRun_feature_tracking=Отключить Ñлежение
+firstRun_feature_malware=Блокирование вредоноÑных программ
+firstRun_title=Adblock Plus уÑтановлен
+firstRun_toggle_on=ВКЛ
+firstRun_acceptableAdsExplanation=Мы хотели бы призвать веб-Ñайты иÑпользовать проÑтую, ненавÑзчивую рекламу. Вот почему мы уÑтановили <a>Ñтрогие принципы</a> Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ÐµÐ¼Ð»ÐµÐ¼Ñ‹Ñ… объÑвлений, которые разрешены в наÑтройках по умолчанию. ЕÑли вы вÑе еще хотите блокировать каждое объÑвление вы можете <a>Отключить</a> Ñто в течение неÑкольких Ñекунд.
+firstRun_contributor_credits=ПожертвованиÑ
+firstRun_dataCorruptionWarning=Эта Ñтраница вÑÑ‘ ещё отображаетÑÑ? <a>Щёлкните здеÑÑŒ!</a>
+firstRun_acceptableAdsHeadline=ÐÐ°Ð´Ð¾ÐµÐ²ÑˆÐ°Ñ Ñ€ÐµÐºÐ»Ð°Ð¼Ð° теперь будет заблокирована
+firstRun_share=РаÑÑказать друзьÑм
+firstRun_share_headline=<a>протÑните нам руку помощи</a> в Ñтремлении Ñделать Интернет лучше
+firstRun_feature_social_description=ÐвтоматичеÑки избавлÑет Ð²Ð°Ñ Ð¾Ñ‚ проÑмотра кнопок Ñоциальных Ñетей, подобных Facebook, которые поÑвлÑÑŽÑ‚ÑÑ Ð½Ð° веб-Ñтраницах и отÑлеживают ваше поведение.
+firstRun_filterlistsReinitializedWarning=Похоже ошибка привела к тому, что вÑе фильтры удалены, и мы не можем их воÑÑтановить из резервной копии. ПоÑтому мы ÑброÑили ваши фильтры и параметры "ненавÑзчивой" рекламы. ПожалуйÑта проверьте ÑпиÑок ваших фильтров и параметры "ненавÑзчивой "рекламы в <a>параметры Adblock Plus</a>.
+firstRun_feature_malware_description=Делает ваш браузер более безопаÑным путем Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð·Ð²ÐµÑтных вредоноÑных доменов.
+firstRun_features=AdBlock Plus ÑпоÑобен на большее, чем проÑто блокировать рекламу
+firstRun_donate=пожертвовать
+firstRun_donate_label=Поддержать наш проект
+firstRun_feature_social=УдалÑть кнопки Ñоциальных Ñетей
+firstRun_legacySafariWarning=Ð’Ñ‹ иÑпользуете Ñтарую верÑию Safari, который не поддерживаетÑÑ Adblock Plus. Она может работать не правильно или ухудшать качеÑтво работы Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ð° некоторых веб-Ñайтах. Мы наÑтоÑтельно рекомендуем обновитьÑÑ Ð´Ð¾ Safari 6.1.1 или выше (в OS X 10.8 Mountain Lion), или Safari 7.0.1 или выше (в OS X 10.9 Mavericks), или иÑпользовать поÑледнюю верÑию Mozilla Firefox, Google Chrome или Opera.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/global.properties
new file mode 100644
index 0000000..c279c00
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Ðа открытой Ñтранице нет Ñлементов, которые можно было бы заблокировать
+action3_tooltip=Щелкните здеÑÑŒ, чтобы включить или отключить Adblock Plus.
+notification_antiadblock_title=Ñкрыть целевых Ñообщений?
+type_label_script=Скрипт
+filter_elemhide_nocriteria=Ðе указано никаких признаков, чтобы опознать Ñлемент, который нужно Ñкрыть
+blockingGroup_title=Правила блокированиÑ
+whitelisted_tooltip=Adblock Plus отключен на Ñтой Ñтранице.
+type_label_stylesheet=Стили
+blocked_count_tooltip=?1? из ?2?
+type_label_font=Шрифт
+type_label_popup=Ð’Ñплывающее окно
+filter_regexp_tooltip=Этот фильтр либо ÑвлÑетÑÑ Ñ€ÐµÐ³ÑƒÐ»Ñрным выражением, либо Ñлишком короткий Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ð¸. Большое количеÑтво таких фильтров может отрицательно ÑказатьÑÑ Ð½Ð° быÑтродейÑтвии вашего браузера.
+action0_tooltip=Щелкните здеÑÑŒ, чтобы открыть контекÑтное меню. Ðажмите Ñреднюю клавишу мышки, чтобы включить или отключить Adblock Plus.
+whitelisted_page=Adblock Plus отключен на Ñтой Ñтранице
+remove_group_warning=Ð’Ñ‹ уверены, что хотите удалить Ñту группу?
+action1_tooltip=Щелкните здеÑÑŒ, чтобы открыть/закрыть ÑпиÑок Ñлементов. Ðажмите Ñреднюю клавишу мышки, чтобы включить или отключить Adblock Plus.
+type_label_xmlhttprequest=XML-запроÑ
+active_tooltip=Adblock Plus включен, иÑпользуетÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñок: ?1?, ÑобÑтвенных фильтров: ?2?.
+type_label_document=Документ
+type_label_object_subrequest=Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°
+whitelistGroup_title=ИÑключениÑ
+disabled_tooltip=Adblock Plus отключен.
+filter_elemhide_duplicate_id=У Ñлемента, который нужно Ñкрыть, может быть только один идентификатор
+type_label_object=Объект
+action2_tooltip=Щелкните здеÑÑŒ, чтобы открыть окно уÑтановок. Ðажмите Ñреднюю клавишу мышки, чтобы включить или отключить Adblock Plus.
+type_label_subdocument=Фрейм
+clearStats_warning=СтатиÑтика попаданий будет обнулена Ð´Ð»Ñ Ð²Ñех фильтров и в дальнейшем больше не будет запиÑыватьÑÑ. Продолжать?
+notification_antiadblock_message=Этот Ñайт, как извеÑтно, показывают целевые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñм Adblock Plus. Хотите Adblock Plus, чтобы Ñкрыть целевых Ñообщений?
+blocked_count_addendum=(также иÑключений: ?1?, ÑпрÑтано: ?2?)
+subscription_invalid_location=Ðе удалоÑÑŒ раÑпознать введенный Ð°Ð´Ñ€ÐµÑ Ð½Ð¸ как Ð°Ð´Ñ€ÐµÑ Ð² интернете, ни как путь файлу.
+type_label_image=Изображение
+remove_subscription_warning=Ð’Ñ‹ уверены, что хотите удалить Ñту подпиÑку?
+type_label_other=ÐеизвеÑтен
+mobile_menu_enable=ABP: Включить
+type_label_media=Ðудио/видео
+mobile_menu_disable_site=ABP: Отключить на ?1?
+elemhideGroup_title=Правила ÑкрытиÑ
+mobile_menu_enable_site=ABP: Включить на ?1?
+type_label_elemhide=Скрыто
+newGroup_title=ÐÐ¾Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð° фильтров
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/overlay.dtd
new file mode 100644
index 0000000..dd49760
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;да">
+<!ENTITY notification.button.no "&amp;нет">
+<!ENTITY sync.label "Син&amp;хронизировать наÑтройки Adblock Plus">
+<!ENTITY whitelist.site.label "Отключить на ?1?">
+<!ENTITY filters.label "ÐаÑтройки &amp;фильтров">
+<!ENTITY disable.label "Отключить везде">
+<!ENTITY objecttab.title "Блокировать">
+<!ENTITY objecttab.tooltip "Ðажмите здеÑÑŒ, чтобы Adblock Plus заблокировал Ñтот объект">
+<!ENTITY menuitem.label "УÑтановки &amp;Adblock Plus">
+<!ENTITY objecttabs.label "Показывать &amp;Ñрлык на Flash и Java">
+<!ENTITY sendReport.label "&amp;Сообщить о проблеме на Ñтой Ñтранице">
+<!ENTITY whitelist.page.label "Отключить только на Ñтой Ñтранице">
+<!ENTITY context.image.label "Adblock Plus: заблокировать изображение">
+<!ENTITY counthits.label "С&amp;читать ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð¾Ð²">
+<!ENTITY opensidebar.label "Открыть Ñ&amp;пиÑок Ñлементов">
+<!ENTITY notification.button.close "&amp;близко">
+<!ENTITY contribute.label "Помочь проекту Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: заблокировать фрейм">
+<!ENTITY blocked.tooltip "Заблокированные Ñлементы на Ñтой Ñтранице:">
+<!ENTITY hideplaceholders.label "ПрÑтать &amp;метки на меÑте заблокированных Ñлементов">
+<!ENTITY showinstatusbar.label "Показывать в &amp;Ñтроке ÑоÑтоÑниÑ">
+<!ENTITY sidebar.title "Элементы открытой Ñтраницы">
+<!ENTITY options.label "&amp;ÐаÑтройки">
+<!ENTITY context.object.label "Adblock Plus: заблокировать объект">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: включить обратно на Ñтой Ñтранице">
+<!ENTITY filters.tooltip "Ðаиболее чаÑто примененные фильтры:">
+<!ENTITY closesidebar.label "Закрыть Ñ&amp;пиÑок Ñлементов">
+<!ENTITY showintoolbar.label "&amp;Показывать в панели инÑтрументов">
+<!ENTITY status.tooltip "СтатуÑ:">
+<!ENTITY context.media.label "Adblock Plus: заблокировать аудио/видео">
+<!ENTITY subscription.update.label "Обновить фильтры">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/sendReport.dtd
new file mode 100644
index 0000000..39b1b77
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/sendReport.dtd
@@ -0,0 +1,100 @@
+<!ENTITY screenshot.undo.label "&amp;Отменить">
+<!ENTITY issues.disabledgroups.description "Следующие подпиÑки / группы фильтров отключены, но могли бы повлиÑть на Ñту Ñтраницу:">
+<!ENTITY showData.label "Показать данные ÑообщениÑ">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus блокирует Ñлишко&amp;м многое">
+<!ENTITY issues.change.description "Ваши наÑтройки изменилиÑÑŒ. ПожалуйÑта, обновите Ñтраницу Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸
+ внеÑенных изменений и отправьте Ñообщение, еÑли проблема не разрешилаÑÑŒ.">
+<!ENTITY email.label "E-&amp;mail:">
+<!ENTITY issues.openPreferences.label "Открыть наÑтройки фильтров">
+<!ENTITY sendPage.confirmation "Сообщение отправлено и Ñохранено. Ð’Ñ‹ можете проÑмотреть его по Ñледующей ÑÑылке:">
+<!ENTITY copyLink.label "С&amp;копировать ÑÑылку на Ñообщение">
+<!ENTITY issues.nofilters.description "Adblock Plus ничего не блокирует на Ñтой Ñтранице. Скорее вÑего, проблема,
+ которую вы наблюдаете, не ÑвÑзана Ñ Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Возможно, что проблема, о которой вы Ñообщили, уже извеÑтна. Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ:">
+<!ENTITY typeSelector.other.description "ЕÑли вы подозреваете, что проблема в Ñамом раÑширении Adblock Plus,
+ а не в его фильтрах, то выберите Ñтот вариант.">
+<!ENTITY issues.disabledgroups.enable.label "Включить подпиÑку / группу фильтров">
+<!ENTITY typeWarning.override.label "Я &amp;понÑл и, тем не менее, хочу отправить Ñообщение">
+<!ENTITY issues.disabled.enable.label "Включить Adblock Plus">
+<!ENTITY update.fixed.description "Обновление ваших подпиÑок на фильтры Ñкорее вÑего решило проблему, о которой
+ вы хотели Ñообщить. ПожалуйÑта загрузите заново Ñтраницу и попробуйте еще раз.
+ ЕÑли проблема оÑталоÑÑŒ, то пошлите Ñообщение еще раз.">
+<!ENTITY anonymous.label "Отпр&amp;авить анонимно">
+<!ENTITY reloadButton.label "Об&amp;новить Ñтраницу">
+<!ENTITY recentReports.clear.label "Уда&amp;лить вÑе ÑообщениÑ">
+<!ENTITY typeSelector.description "МаÑтер поможет вам отправить Ñообщение о проблеме Ñ Adblock Plus.
+ ПожалуйÑта, укажите на Ñтой Ñтранице тип проблемы, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ вы ÑтолкнулиÑÑŒ:">
+<!ENTITY screenshot.remove.label "У&amp;далить конфиденциальные данные">
+<!ENTITY issues.ownfilters.description "Ðекоторые фильтры, которые применÑÑŽÑ‚ÑÑ Ð½Ð° Ñтой Ñтранице, вы добавили Ñами.
+ ПожалуйÑта, отключите фильтры, которые могли вызвать Ñту проблему:">
+<!ENTITY update.inProgress.description "Adblock Plus должен обновить ваши подпиÑки на фильтры, чтобы удоÑтоверитьÑÑ,
+ что проблема еще не была решена. Подождите, пожалуйÑта...">
+<!ENTITY sendPage.retry.label "Отправить еще раз">
+<!ENTITY data.label "Да&amp;нные ÑообщениÑ:">
+<!ENTITY recentReports.label "Ваши недавно отправленные ÑообщениÑ">
+<!ENTITY typeWarning.description "Ð’Ñ‹ указали, что хотите Ñообщить о проблеме в Adblock Plus, а не в его фильтрах.
+ ПожалуйÑта, учтите, что о таких проблемах лучше Ñообщать на
+ [link]форуме Adblock Plus[/link]. МаÑтер отправки ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñледует
+ иÑпользовать лишь Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ к обÑуждению на форуме, поÑкольку
+ никто не увидит ваше Ñообщение, еÑли не оÑтавить на него ÑÑылку. Ð’Ñ‹
+ получите автоматичеÑки Ñозданную ÑÑылку поÑле отправки ÑообщениÑ.">
+<!ENTITY issues.disabled.description "Adblock Plus отключен и ничего не блокирует в Ñтом ÑоÑтоÑнии.">
+<!ENTITY attachExtensions.label "П&amp;рикрепить ÑпиÑок включенных раÑширений к Ñообщению на Ñлучай, еÑли проблема вызвана конфликтом раÑширений">
+<!ENTITY issues.nosubscriptions.add.label "Добавить подпиÑку">
+<!ENTITY issues.disabledfilters.enable.label "Включить фильтр">
+<!ENTITY issues.override.label "ÐаÑтройки в &amp;порÑдке, продолжить отправление ÑообщениÑ">
+<!ENTITY issues.nosubscriptions.description "Ð’Ñ‹ не подпиÑаны ни на один из готовых ÑпиÑков фильтров, которые автоматичеÑки
+ блокируют нежелательные Ñлементы Ñтраниц.">
+<!ENTITY typeSelector.falsePositive.description "ЕÑли на Ñтранице отÑутÑтвуют важные чаÑти Ñодержимого, а также еÑли она
+ отображаетÑÑ Ð¸Ð»Ð¸ функционирует неправильно, то Ñледует выбрать Ñтот вариант.
+ Ð’Ñ‹ можете проверить, ÑвлÑетÑÑ Ð»Ð¸ Adblock Plus иÑточником проблемы, временно
+ отключив его.">
+<!ENTITY typeSelector.other.label "&amp;Ð”Ñ€ÑƒÐ³Ð°Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð°">
+<!ENTITY emailComment.label "Мы рекомендуем ввеÑти e-mail адреÑ, по которому мы могли бы ÑвÑзатьÑÑ Ð² Ñлучает вопроÑов по вашему Ñообщению. Это также позволит нам узнавать Ваши взноÑÑ‹ и обрабатывать их в предпочтительном порÑдке.">
+<!ENTITY issues.whitelist.remove.label "Включить Adblock Plus на Ñтой Ñтранице">
+<!ENTITY outdatedSubscriptions.description "Следующие подпиÑки на фильтры не обновлÑлиÑÑŒ более двух недель. ПожалуйÑта,
+ обновите Ñти подпиÑки перед отправлением ÑообщениÑ, поÑкольку проблема уже
+ может быть решена.">
+<!ENTITY dataCollector.description "ПожалуйÑта, подождите неÑколько Ñекунд, пока Adblock Plus Ñобирает нужные данные.">
+<!ENTITY sendButton.label "От&amp;править Ñообщение">
+<!ENTITY comment.label "&amp;Комментарий (необÑзательно):">
+<!ENTITY sendPage.errorMessage "Ошибка отправки ÑообщениÑ: «?1?». ПожалуйÑта,
+ удоÑтоверьтеÑÑŒ, что ваше Ñоединение Ñ Ñетью Интернет работает, и попробуйте еще раз.
+ ЕÑли проблема оÑтаетÑÑ, обратитеÑÑŒ в [link]форум Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Показать недавно отправленные ÑообщениÑ">
+<!ENTITY commentPage.heading "Комментарий">
+<!ENTITY update.start.label "Обновить подпиÑки">
+<!ENTITY issues.disabledfilters.description "Следующие фильтры отключены, но могли бы повлиÑть на Ñту Ñтраницу:">
+<!ENTITY screenshot.description "Одна и та же Ñтраница может выглÑдеть по-разному Ð´Ð»Ñ Ñ€Ð°Ð·Ð½Ñ‹Ñ… людей. Снимок Ñкрана
+ может помочь нам понÑть проблему. Ð’Ñ‹ можете удалить конфиденциальные чаÑти Ñнимка
+ или пометить облаÑть Ñнимка, в которой проÑвлÑетÑÑ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð°. Ð”Ð»Ñ Ñтого
+ нажмите на ÑоответÑтвующую кнопку и выберите мышкой чаÑть Ñнимка.">
+<!ENTITY screenshot.attach.label "При&amp;крепить Ñнимок Ñкрана к Ñообщению">
+<!ENTITY issues.whitelist.description "Adblock Plus отключен на Ñтранице, о которой вы ÑобираетеÑÑŒ Ñообщить. ПожалуйÑта,
+ включите Adblock Plus и обновите Ñтраницу, прежде чем поÑылать Ñообщение.
+ Это поможет раÑÑмотрению вашего ÑообщениÑ.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus не блоки&amp;рует рекламу">
+<!ENTITY typeSelector.heading "Выбор типа проблемы">
+<!ENTITY anonymity.warning "Мы не Ñможем ÑвÑзатьÑÑ Ñ Ð²Ð°Ð¼Ð¸ и, вероÑтно, уделим меньше Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð’Ð°ÑˆÐµÐ¼Ñƒ Ñообщению.">
+<!ENTITY wizard.title "Сообщить о проблеме">
+<!ENTITY issues.ownfilters.disable.label "Отключить фильтр">
+<!ENTITY commentPage.description "Внизу вы можете добавить комментарий, чтобы помочь нам понÑть проблему.
+ Это не обÑзательно, но рекомендуетÑÑ Ð´Ð»Ñ Ð½ÐµÐ¾Ñ‡ÐµÐ²Ð¸Ð´Ð½Ñ‹Ñ… проблем.
+ Также вы можете проверить данные ÑообщениÑ, прежде чем оно будет
+ отправлено.">
+<!ENTITY comment.lengthWarning "Длина ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸Ñ Ð¿Ñ€ÐµÐ²Ñ‹ÑˆÐ°ÐµÑ‚ 1000 Ñимволов. Только первые 1000 Ñимволов будут отправлены.">
+<!ENTITY typeSelector.falseNegative.description "ЕÑли неÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° то, что Adblock Plus включен, на Ñтранице отображаетÑÑ Ñ€ÐµÐºÐ»Ð°Ð¼Ð°,
+ то Ñледует выбрать Ñтот вариант.">
+<!ENTITY sendPage.waitMessage "ПожалуйÑта, подождите, пока Adblock Plus отправлÑет ваше Ñообщение.">
+<!ENTITY dataCollector.heading "Добро пожаловать в маÑтер отправки ÑообщениÑ">
+<!ENTITY screenshot.heading "Снимок Ñкрана">
+<!ENTITY sendPage.heading "Отправка ÑообщениÑ">
+<!ENTITY issues.subscriptionCount.description "Похоже, что вы подпиÑаны на Ñлишком большое количеÑтво ÑпиÑков фильтров. Это
+ не рекомендуетÑÑ, поÑкольку Ñильно возраÑтает вероÑтноÑть проблем. Помимо
+ Ñтого, мы не можем принÑть ваше Ñообщение, поÑкольку неÑÑно, какой из ÑпиÑков
+ фильтров нужно иÑправлÑть. ПожалуйÑта, удалите вÑе ÑпиÑки фильтров кроме
+ дейÑтвительно нужных. ПоÑле Ñтого проверьте, проÑвлÑетÑÑ Ð»Ð¸ еще проблема.">
+<!ENTITY screenshot.mark.label "&amp;Пометить проблему">
+<!ENTITY privacyPolicy.label "Правила конфиденциальноÑти">
+<!ENTITY issues.description "Adblock Plus обнаружил проблемы в ваших наÑтройках, которые, возможно, вызвали
+ данную проблему или уÑложнÑÑ‚ раÑÑмотрение вашего ÑообщениÑ.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/sidebar.dtd
new file mode 100644
index 0000000..7786487
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Показать раÑположение Ñлемента">
+<!ENTITY address.label "ÐдреÑ">
+<!ENTITY context.open.label "Открыть в новой вкладке">
+<!ENTITY type.label "Тип">
+<!ENTITY tooltip.filterSource.label "ИÑточник фильтра:">
+<!ENTITY noitems.label "Блокировать нечего">
+<!ENTITY filter.label "Фильтр">
+<!ENTITY tooltip.size.label "Размер:">
+<!ENTITY reattach.label "ПриÑоединить">
+<!ENTITY search.label "П&amp;оиÑк:">
+<!ENTITY docDomain.thirdParty "(Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð³Ð¾ Ñайта)">
+<!ENTITY filterSource.label "СпиÑок фильтров">
+<!ENTITY tooltip.docDomain.label "Домен Ñтраницы:">
+<!ENTITY context.copy.label "Копировать адреÑ">
+<!ENTITY tooltip.type.label "Тип:">
+<!ENTITY context.disablefilter.label "Отключить фильтр ?1?">
+<!ENTITY context.copyFilter.label "Копировать фильтр">
+<!ENTITY context.block.label "Заблокировать Ñлемент">
+<!ENTITY context.enablefilter.label "Включить обратно фильтр ?1?">
+<!ENTITY detach.label "ОтÑоединить">
+<!ENTITY whitelisted.label "Отключен на Ñтой Ñтранице">
+<!ENTITY context.disablefilteronsite.label "Отключить фильтр на ?1?">
+<!ENTITY detached.title "Adblock Plus: Ñлементы открытой Ñтраницы (отÑоединены)">
+<!ENTITY docDomain.firstParty "(Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñ Ñ‚Ð¾Ð³Ð¾ же Ñайта)">
+<!ENTITY tooltip.type.whitelisted "(иÑключение)">
+<!ENTITY tooltip.filter.label "Применен фильтр:">
+<!ENTITY tooltip.filter.disabled "(отключен)">
+<!ENTITY context.editfilter.label "Отредактировать примененный фильтр">
+<!ENTITY tooltip.type.blocked "(заблокирован)">
+<!ENTITY size.label "Размер">
+<!ENTITY context.whitelist.label "Добавить иÑключение Ð´Ð»Ñ Ñлемента">
+<!ENTITY context.selectAll.label "Выделить вÑÑ‘">
+<!ENTITY state.label "СтатуÑ">
+<!ENTITY docDomain.label "Домен Ñтраницы">
+<!ENTITY tooltip.address.label "ÐдреÑ:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/subscriptionSelection.dtd
new file mode 100644
index 0000000..080da8b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/ru/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Доба&amp;вить подпиÑку на ÑпиÑок фильтров «?1?»">
+<!ENTITY list.download.failed "При Ñкачивании ÑпиÑка подпиÑок произошла ошибка.">
+<!ENTITY list.download.retry "Попробовать еще раз">
+<!ENTITY title.label "Ðа&amp;звание подпиÑки:">
+<!ENTITY list.download.website "Открыть Ñтраницу Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñками">
+<!ENTITY supplementMessage "Этот ÑпиÑок фильтров должен иÑпользоватьÑÑ Ð² комбинации Ñо ÑпиÑком фильтров «?1?», который вы не иÑпользуете.">
+<!ENTITY viewList.label "ПроÑмотреть фильтры">
+<!ENTITY visitHomepage.label "ПоÑетить домашнюю Ñтраницу ÑпиÑка">
+<!ENTITY addSubscription.label "Добавить подпиÑку">
+<!ENTITY dialog.title "Добавить подпиÑку Ð´Ð»Ñ Adblock Plus">
+<!ENTITY location.label "Ð&amp;Ð´Ñ€ÐµÑ ÑпиÑка фильтров:">
+<!ENTITY fromWeb.description "ПожалуйÑта, подтвердите, что вы дейÑтвительно хотите добавить подпиÑку на Ñтот ÑпиÑок фильтров. Ð’Ñ‹ можете изменить название и Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñки перед добавлением.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/composer.dtd
new file mode 100644
index 0000000..23604b6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "na konci a&amp;dresy">
+<!ENTITY domainRestriction.label "Obm&amp;edziť na doménu:">
+<!ENTITY collapse.default.no.label "Použiť predvolené (nie)">
+<!ENTITY firstParty.label "&amp;Len prvá strana">
+<!ENTITY preferences.label "&amp;Zobraziť existujúce filtre...">
+<!ENTITY pattern.label "Vyhľadať vzor">
+<!ENTITY thirdParty.label "Len &amp;tretie strany">
+<!ENTITY filter.label "Nový &amp;filter:">
+<!ENTITY collapse.label "Pád zabl&amp;okovaný::">
+<!ENTITY match.warning "Vzor, ktorý ste vložili nezodpovedá blokovanej/povolenej adrese a nebude mať žiadny efekt.">
+<!ENTITY anchor.start.label "&amp;na zaÄiatku adresy">
+<!ENTITY matchCase.label "&amp;Modelový prípad">
+<!ENTITY custom.pattern.label "&amp;Vlastné:">
+<!ENTITY unselectAllTypes.label "NezvoliÅ¥ niÄ">
+<!ENTITY type.whitelist.label "Základné pravidlo">
+<!ENTITY regexp.warning "Vzor, ktorý ste vložili bude interpretovaný ako regulárny výraz. Mnoho regulárnych výrazov môže spomaliť prehliadanie. Ak ste nemali v úmysle používať regulárne výrazy, pridajte symbol * na koniec vzoru.">
+<!ENTITY dialog.title "Pridať pravidlo filtra">
+<!ENTITY basic.label "Jednoduchý náhľad">
+<!ENTITY type.filter.label "Blokovanie filtra">
+<!ENTITY types.label "Aplikovať na typy:">
+<!ENTITY shortpattern.warning "Vzor, ktorý ste vložili je príliÅ¡ krátky, aby mohol byÅ¥ optimalizovaný, mnoho takýchto schém môže spomaliÅ¥ prehliadanie. OdporúÄame, aby ste vybrali dlhší reÅ¥azec pre tento filter.">
+<!ENTITY collapse.yes.label "Ãno">
+<!ENTITY anchors.label "Prijať vzor len:">
+<!ENTITY collapse.default.yes.label "Použiť predvolené (áno)">
+<!ENTITY domainRestriction.help "Å pecifikujte jednu alebo viac domén oddelených znaÄkou &quot;|&quot;, filter bude obmedzený len pre tieto domény. Symbol &quot;~&quot; pred názvom domény znamená, že filter by nemal byÅ¥ aplikovaný na tejto doméne.">
+<!ENTITY accept.label "Pridať filter">
+<!ENTITY options.label "Možnosti">
+<!ENTITY disabled.warning "Adblock Plus je aktuálne vypnutý. Môžete pridávať filtre, ale tie nebudú aplikované pokiaľ [link]nezapnete Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "&amp;na zaÄiatku názvu domény">
+<!ENTITY collapse.no.label "Nie">
+<!ENTITY selectAllTypes.label "Vybrať všetko">
+<!ENTITY advanced.label "PokroÄilý náhľad">
+<!ENTITY pattern.explanation "Vzor môže byÅ¥ nejaká ÄasÅ¥ adresy, symbol * ako divoká karta. Filter eÅ¡te len bude aplikovaný na adresy zodpovedajúce vzoru.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/filters.dtd
new file mode 100644
index 0000000..ed28642
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "VÅ¡etky vaÅ¡e vlastné filtre budú nahradené obsahom zo zvoleného súboru. Prajete si pokraÄovaÅ¥?">
+<!ENTITY slow.column "&amp;Voľné filtre">
+<!ENTITY enabled.column "&amp;Zapnuté">
+<!ENTITY subscription.lastDownload.checksumMismatch "Zlyhalo, chybné prispôsobenie kontrolného súÄtu">
+<!ENTITY noFiltersInGroup.text "Zvolená skupiny je prázdna">
+<!ENTITY subscription.actions.label "Úlohy">
+<!ENTITY filter.selectAll.label "Vybrať všetko">
+<!ENTITY backupButton.label "&amp;Záloha a Obnova">
+<!ENTITY restore.minVersion.warning "Upozornenie: súbor bol vytvorený novšou verziuo Adblock Plus. Mali by ste aktualizovať na novšiu verziu predtým, než obnovíte z tohto súboru.">
+<!ENTITY restore.error "Údaje súborov nemôžu byť spacované, možno to nie zálohovací súbor Adblock Plus?">
+<!ENTITY sort.ascending.label "Triediť od &amp;A &gt; Z">
+<!ENTITY sort.label "&amp;Triediť podľa">
+<!ENTITY subscription.source.label "Zoznam filtrov">
+<!ENTITY hitcount.column "&amp;PoÄítadlá">
+<!ENTITY noFilters.text "Zatiaľ nemáte žiadne vlastné filtre.">
+<!ENTITY backup.custom.title "Len vlastné filtre">
+<!ENTITY subscription.external.label "Aktualizované iným rozšírením">
+<!ENTITY subscription.delete.label "Zmazať">
+<!ENTITY noGroupSelected.text "Musíte vybrať skupinu filtrov predtým, než sa tieto filtre zobrazia.">
+<!ENTITY filter.cut.label "Vystrihnúť">
+<!ENTITY restore.default.label "Obnoviť zálohu z ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Preberanie...">
+<!ENTITY subscriptions.tab.label "Odbery filtrov">
+<!ENTITY sort.descending.label "Trie&amp;diť od Z &gt; A">
+<!ENTITY filters.remove.warning "Naozaj chcete odstrániť všetky vybraté filtre?">
+<!ENTITY filter.delete.label "Odstrániť">
+<!ENTITY addSubscriptionAdd.label "Pridať">
+<!ENTITY viewMenu.label "Zobraziť">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY addSubscriptionCancel.label "Zrušiť">
+<!ENTITY subscription.enabled.label "Zapnuté">
+<!ENTITY noSubscriptions.text "Ziataľ nie sú pridané žiadne odbery filtrov. Adblock Plus nebude blokovať
+ niÄ bez filtrov, použite, prosím &quot;PridaÅ¥ odber filtra&quot; pre
+ pridanie.">
+<!ENTITY subscription.update.label "Aktualizovať filtre">
+<!ENTITY dialog.title "Nastavenia filtra">
+<!ENTITY addFilter.label "Pridať filt&amp;er">
+<!ENTITY subscription.minVersion.warning "Odoberanie tohto filtra vyžaduje novšiu verziu Adblock Olus, môžete aktualizovať na ostatnú verziu Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Zlyhanie, neplatná adresa">
+<!ENTITY backup.error "Pri zápise filtra do súboru sa vyskytla chyba. Uistite sa, že súbor nie je chránený proti zapisovaniu alebo nie je používaný inou aplikáciou.">
+<!ENTITY filter.moveUp.label "Posunúť hore">
+<!ENTITY addGroup.label "Pridať skupinu &amp;filtrov">
+<!ENTITY filter.edit.label "Upraviť">
+<!ENTITY subscription.showHideFilters.label "Zobraziť/skryť filter">
+<!ENTITY acceptableAds2.label "Povol&amp;iť niektoré nevtieravé reklamy">
+<!ENTITY addSubscriptionOther.label "Pridať iné odoberania">
+<!ENTITY close.label "Zatvoriť">
+<!ENTITY sort.none.label "&amp;Netriedené">
+<!ENTITY filter.actions.label "Úlohy filtrov">
+<!ENTITY filter.copy.label "Kopírovať">
+<!ENTITY filter.moveDown.label "Posunúť dole">
+<!ENTITY filter.resetHitCounts.label "ResetovaÅ¥ Å¡tatistiku poÄítadla">
+<!ENTITY readMore.label "Zobraziť viac">
+<!ENTITY subscription.moveUp.label "Posunúť hore">
+<!ENTITY addSubscription.label "P&amp;ridať povolenie filtra">
+<!ENTITY subscription.homepage.label "Domovská stránka">
+<!ENTITY backup.complete.title "Všetky filtre a odbery">
+<!ENTITY restore.own.label "Obnoviť vlastnú zálohu">
+<!ENTITY restore.complete.warning "VÅ¡etky nastavenia filtrov budú nahradené obsahom zo zvoleného súboru. Prajete si pokraÄovaÅ¥?">
+<!ENTITY filters.tab.label "Vlastné filtre">
+<!ENTITY backup.label "Vytvoriť novú zálohu">
+<!ENTITY find.label "Náj&amp;sť">
+<!ENTITY subscription.moveDown.label "Posunúť dole">
+<!ENTITY subscription.lastDownload.connectionError "Zlyhanie, sťahovanie neúspešné">
+<!ENTITY subscription.lastDownload.success "Úspešné">
+<!ENTITY subscription.lastDownload.invalidData "Zlyhanie, neplatný zoznam filtrov">
+<!ENTITY filter.paste.label "Prilepiť">
+<!ENTITY subscription.disabledFilters.enable "Zapnúť vypnuté filtre">
+<!ENTITY lasthit.column "Po&amp;sledný zápis">
+<!ENTITY subscription.editTitle.label "Upraviť názov">
+<!ENTITY subscription.disabledFilters.warning "Niektoré filtre tohto odberu sú vypnuté.">
+<!ENTITY filter.column "Pravidlo &amp;filtra">
+<!ENTITY subscription.lastDownload.label "Posledné prevzatie:">
+<!ENTITY viewList.label "Zobraziť zoznam">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/firstRun.properties
new file mode 100644
index 0000000..6a3ce81
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=PrechádzaÅ¥ súkromne vypnutím sledovania - skryÅ¥ vaÅ¡e skladby z reklamné spoloÄnosti, ktoré by sledovali každý váš pohyb.
+firstRun_toggle_off=OFF
+firstRun_feature_tracking=Zakázať sledovanie
+firstRun_feature_malware=Blokovanie malvéru
+firstRun_title=Adblock Plus bol nainštalovaný
+firstRun_toggle_on=ON
+firstRun_acceptableAdsExplanation=Radi by sme povzbudili webové stránky aby používali jednoduché a nevtieravé inzercie. To je dôvod, preÄo sme zaviedli <a>prísne pravidlá</a> na identifikáciu prijateľné reklamy, ktoré sú uvedené v Äasti predvolené nastavenie. Ak si napriek tomu chcete blokovaÅ¥ každú reklamu môžete <a>vypnúť</a> toto za pár sekúnd.
+firstRun_contributor_credits=Zásluhy autorov
+firstRun_dataCorruptionWarning=Chcete stále vidieť túto stránku? <a>Klikni tu!</a>
+firstRun_acceptableAdsHeadline=Otravné reklamy budú teraz blokované
+firstRun_share=Povedzte svojim priateľom
+firstRun_share_headline=<a>Pomuožte nám</a> urobiť web lepším miestom
+firstRun_feature_social_description=Automaticky zbaviÅ¥ prehliadanie webu tlaÄidiel sociálnych médií, ako napríklad Facebook podobne, ktoré sú uvedené na webových stránkach a sledují vaÅ¡e správanie.
+firstRun_filterlistsReinitializedWarning=Zdá sa, že problém spôsobil, že všetky filtre boli odstránené a nie sme schopní obnoviť zálohu. Preto sme museli resetovať vaše filtre a prijateľné nastavenia reklám. Prosím, skontrolujte filter zoznamov a prijateľné nastavenia reklamy v <a>Nastavenia Adblock Plus</a>.
+firstRun_feature_malware_description=ZabezpeÄenie prezeranie pomocou blokovanie známych domén s malware.
+firstRun_features=Adblock Plus môže urobiť viac, ako blokovať reklamy
+firstRun_donate=prispejte
+firstRun_donate_label=Podporťe náš projekt
+firstRun_feature_social=Odstránenie tlaÄidiel sociálnych médií
+firstRun_legacySafariWarning=Používate starú verziu Safari, ktorá nepodporuje Adblock Plus. Nemusel by pracovaÅ¥ správne alebo by mohol naruÅ¡iÅ¥ používateľské skúsenosti na niektorých webových stránkach. Dôrazne odporúÄame aktualizovaÅ¥ na Safari 6.1.1 alebo vyšší (k dispozícii pre Mac OS X 10,8 Mountain Lion), alebo Safari 7.0.1 a vyššie (pre OS X 10.9 Mavericks), alebo použiÅ¥ najnovÅ¡iu verziu Mozilla Firefox, Google Chrome alebo Opera.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/global.properties
new file mode 100644
index 0000000..2294515
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Na aktuálnej stránke nie sú blokovateľné položky
+action3_tooltip=Kliknúť pre Otvoriť/Zavrieť Adblock Plus.
+notification_antiadblock_title=Skryť cielené správy?
+type_label_script=skript
+filter_elemhide_nocriteria=Žiadne kritéria neboli špecifikované pre rozpoznanie prvku na skrytie
+blockingGroup_title=Pravidlá blokovania
+whitelisted_tooltip=Adblock Plus je aktívny, ale vypnutý na aktuálnej stránke.
+type_label_stylesheet=Štýly
+blocked_count_tooltip=?1? mimo ?2?
+type_label_font=písmo
+type_label_popup=vyskakovacie okno
+filter_regexp_tooltip=Tento filter je buÄ regulárny výraz alebo je príliÅ¡ krátky, aby mohol byÅ¥ optimalizovaný. PríliÅ¡ mnoho z týchto filtrov môžu spomaliÅ¥ prehliadanie.
+action0_tooltip=Kliknúť na vyvolanie kontextovej ponuky, kliknutie prostredným pre Zapnúť/Vypnúť.
+whitelisted_page=Adblock Plus bol zakázaný pre aktuálnu stránku
+remove_group_warning=Naozaj chcete odstrániť túto skupinu?
+action1_tooltip=Kliknúť pre Otvoriť/Zavrieť blokovateľné položky, kliknutie prostredným pre Zapnúť/Vypnúť.
+type_label_xmlhttprequest=XML požiadavka
+active_tooltip=Adblock Plus je aktívny,?1? popis filtra(ov) a ?2? vlastný filtr(e) sa používa .
+type_label_document=dokument
+type_label_object_subrequest=podžiadosť predmetu
+whitelistGroup_title=Výnimky pravidiel
+disabled_tooltip=Adblock Plus je vypnutý.
+filter_elemhide_duplicate_id=Len jedno ID prvku na skrytie môže byť špecifikované
+type_label_object=predmet
+action2_tooltip=Kliknúť pre otvorenie nastavení, kliknutie prostredným pre Zapnúť/Vypnúť.
+type_label_subdocument=rámec
+clearStats_warning=Toto resetuje vÅ¡etky Å¡tatistiky filtrov a vypne poÄítadlo. Chcete pokraÄovaÅ¥?
+notification_antiadblock_message=Táto stránka bola známa zobrazením cielených správ pre používateľa Adblock Plus. Chcete, aby Adblock Plus skryl cielené správy?
+blocked_count_addendum=(tiež biely zoznam: ?1?, skrytý: ?2?)
+subscription_invalid_location=Umiestnenie zoznamu filtrov nemá platnú URL alebo platný názov súboru.
+type_label_image=obrázok
+remove_subscription_warning=Naozaj si želáte odstrániť toto povolenie?
+type_label_other=iný
+mobile_menu_enable=ABP: Zapnúť
+type_label_media=zvuk/video
+mobile_menu_disable_site=ABP: Vypnúť na ?1?
+elemhideGroup_title=Pravidlá skrytia prvkov
+mobile_menu_enable_site=ABP: Zapnúť na ?1?
+type_label_elemhide=skrytý
+newGroup_title=Nová skupina filtrov
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/overlay.dtd
new file mode 100644
index 0000000..fb1b256
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Ãno">
+<!ENTITY notification.button.no "&amp;Nie">
+<!ENTITY sync.label "Syn&amp;chronizovať nastavenia Adblock Plus">
+<!ENTITY whitelist.site.label "Vypnúť na ?1?">
+<!ENTITY filters.label "&amp;Nastavenia filtrov">
+<!ENTITY disable.label "Vypnúť všade">
+<!ENTITY objecttab.title "Blokovať">
+<!ENTITY objecttab.tooltip "Kliknúť sem pre blokovanie tohto objektu s Adblock Plus">
+<!ENTITY menuitem.label "&amp;Adblock Plus">
+<!ENTITY objecttabs.label "Zobraziť karty pre &amp;Flash a Java">
+<!ENTITY sendReport.label "&amp;Ohlásiť problém na tejto stránke">
+<!ENTITY whitelist.page.label "Vypnúť len na tejto stránke">
+<!ENTITY context.image.label "Adblock obrázok">
+<!ENTITY counthits.label "P&amp;oÄítadlo">
+<!ENTITY opensidebar.label "Otvoriť &amp;blokovateľné položky">
+<!ENTITY notification.button.close "&amp;Zatvoriť">
+<!ENTITY contribute.label "Prispieť na Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock rámec">
+<!ENTITY blocked.tooltip "Blokovať položky na tejto stránke:">
+<!ENTITY hideplaceholders.label "Sk&amp;ryť symboly blokovaných prvkov">
+<!ENTITY showinstatusbar.label "Zobraziť v &amp;stavovom riadku">
+<!ENTITY sidebar.title "Blokovateľné položky na aktuálnej stránke">
+<!ENTITY options.label "&amp;Možnosti">
+<!ENTITY context.object.label "Adblock objekt">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Znovu zapnúť túto stránku">
+<!ENTITY filters.tooltip "Najaktívnejšie filtre:">
+<!ENTITY closesidebar.label "Zatvoriť &amp;blokovateľné položky">
+<!ENTITY showintoolbar.label "Zobraziť v pane&amp;li nástrojov">
+<!ENTITY status.tooltip "Stav:">
+<!ENTITY context.media.label "Adblock Plus: Blokovať audio/video">
+<!ENTITY subscription.update.label "Aktualizovať filtre">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/sendReport.dtd
new file mode 100644
index 0000000..0bd2884
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Späť">
+<!ENTITY issues.disabledgroups.description "Nasledujúce odbery filtrov / skupiny filtrov sú vypnuté, eÅ¡te je možné, že by mali mali úÄinok na tejto stránke:">
+<!ENTITY showData.label "Zobraziť údaje správy">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blokuje pri&amp;veľa">
+<!ENTITY issues.change.description "Nastavenie bolo zmenené. Opäť naÄítajte stránku na otestovanie zmien a potvrÄte správu ak problém nebol odstránený.">
+<!ENTITY email.label "Email:">
+<!ENTITY issues.openPreferences.label "Otvoriť nastavenia filtra">
+<!ENTITY sendPage.confirmation "Vaša správa bola uložená. Môžete ju sprístupniť na tejto adrese:">
+<!ENTITY copyLink.label "&amp;Kopírovať odkaz správy">
+<!ENTITY issues.nofilters.description "Adblock Plus neblokuje niÄ na aktuálnej stránke. Problém, ktorý pozorujete pravdepodobne nesúvisí s Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Problém, ktorý ste ohlásili je pravdepodobne známy. Viac informácií:">
+<!ENTITY typeSelector.other.description "Vyberte túto možnosť ak máte podozrenie na problém s Adblock Plus skôr než na jeho filtre.">
+<!ENTITY issues.disabledgroups.enable.label "Zapnúť odber filtra / skupinu filtrov">
+<!ENTITY typeWarning.override.label "Rozu&amp;miem a chcem potvrdiť správu">
+<!ENTITY issues.disabled.enable.label "Zapnúť Adblock Plus">
+<!ENTITY update.fixed.description "Aktualizácie filtra odberov môžu vyrieÅ¡iÅ¥ problém, ktorý ste nahlásili. Prosím, skúste stránku naÄítaÅ¥ znova a skúste zadaÅ¥ správu znovu, ak problém pretrváva.">
+<!ENTITY anonymous.label "&amp;Anonymný návrh">
+<!ENTITY reloadButton.label "&amp;Opäť naÄítaÅ¥ stránku">
+<!ENTITY recentReports.clear.label "Ods&amp;trániť všetky správy">
+<!ENTITY typeSelector.description "Toto okno Vás prevedie krokmi potrebnými pre podanie hlásenia o chybe Adblock Plus. Najprv zvoľte typ problému, ktorý ste zistili na tejto stránke:">
+<!ENTITY screenshot.remove.label "Odst&amp;rániť citlivé údaje">
+<!ENTITY issues.ownfilters.description "Niektoré filtre aplikované na tejto stránke sú definované používateľom. Vypnite filtre, ktoré by mohli spôsobovať problém:">
+<!ENTITY update.inProgress.description "Adblock Plus potrebuje aktualizovaÅ¥ váš filter odberov, aby sa ubezpeÄil, Äi problém už nie je vyrieÅ¡ený. ÄŒakajte prosím">
+<!ENTITY sendPage.retry.label "Poslať znova">
+<!ENTITY data.label "Ú&amp;daje správy:">
+<!ENTITY recentReports.label "Vaše nedávno potvrdené správy">
+<!ENTITY typeWarning.description "NaznaÄili ste, že chcete ohlásiÅ¥ vÅ¡eobecný problém s Adblock Plus radÅ¡ej ako problém s filtrami. VÅ¡imnite si, že tieto otázky sa lepÅ¡ie rieÅ¡ia na [link]fórume Adblock Plus[/link]. Mali by ste použiÅ¥ reportér problémov pre doplnenie existujúcej diskusie, inak si nikto nevÅ¡imne vaÅ¡u správu skôr, než ju poskytnete na danom odkaze. Automaticky vygenerovaný odkaz bude poskytnutý po potvrdení správy.">
+<!ENTITY issues.disabled.description "Adblock Plus je vypnutý, v danom stave nebude niÄ blokovaÅ¥.">
+<!ENTITY attachExtensions.label "Priložiť &amp;zoznam aktívnych rozšírení k tejto správe pre prípad, že rozšírenie spôsobuje tento problém">
+<!ENTITY issues.nosubscriptions.add.label "Pridať odber filtra">
+<!ENTITY issues.disabledfilters.enable.label "Zapnúť filter">
+<!ENTITY issues.override.label "Nasta&amp;venie je správne, pokraÄovaÅ¥ so správou">
+<!ENTITY issues.nosubscriptions.description "Neodvolávajte sa na odoberaný predpripravený zoznam filtrov, ktorý automaticky odstraňuje neznámy obsah z webovej stránky.">
+<!ENTITY typeSelector.falsePositive.description "Túto možnosÅ¥ vyberte, ak stránka postráda dôležitý obsah, nesprávne sa zobrazuje alebo zlyháva funkÄnosÅ¥. Môžete urÄiÅ¥, Äi je Adblock Plus príÄinou problému jeho doÄasným vypnutím.">
+<!ENTITY typeSelector.other.label "I&amp;né problémy">
+<!ENTITY emailComment.label "OdporúÄame vám zadaÅ¥ platnú e-mailovú adresu, aby sme vás mohli kontaktovaÅ¥, ak sa vyskytnú otázky o vaÅ¡ej správe. Taktiež nám to umožní rozpoznaÅ¥ vaÅ¡e príspevky a pripísaÅ¥ im vyššiu prioritu.">
+<!ENTITY issues.whitelist.remove.label "Zapnúť opäť Adblock Plus na tejto stránke">
+<!ENTITY outdatedSubscriptions.description "Nasledujúci filter odberov nebol aktualizovaný najmenej po dobu dvoch týždňov. Prosím, aktualizujte tieto odbery pred predložením správy, problém už môže byť vyriešený.">
+<!ENTITY dataCollector.description "PoÄkajte, prosím, kým Adblock Plus získa požadované údaje.">
+<!ENTITY sendButton.label "Pos&amp;lať správu">
+<!ENTITY comment.label "Komentá&amp;r (nepovinné):">
+<!ENTITY sendPage.errorMessage "Pokus o zaslanie správy zlyhal s kódom chyby &quot;?1?&quot;. PresvedÄte sa, Äi ste pripojený na internet a skúste to znova. Ak problém pretrváva, požiadajte o pomoc na [link]fórume Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Zobraziť nedávno potvrdené správy">
+<!ENTITY commentPage.heading "Vložiť komentár">
+<!ENTITY update.start.label "Spustiť aktualizáciu teraz">
+<!ENTITY issues.disabledfilters.description "Nasledujúce filtre sú vypnuté, eÅ¡te je možné, že by mali mali úÄinok na tejto stránke:">
+<!ENTITY screenshot.description "Rovnaká stránka vyzerá rozdielne pre rôznych ľudí. Môže nám pomôcÅ¥ pochopiÅ¥ problém, ak priložíte k správe screenshot. Môžete odstrániÅ¥ ÄasÅ¥ s citlivými údajmi, ak oznaÄíte len ÄasÅ¥, kde je problém zrejmý. Kliknite na tlaÄidlo a vyberte ÄasÅ¥ obrázka.">
+<!ENTITY screenshot.attach.label "Pripo&amp;jiť obrázok stránky ku správu">
+<!ENTITY issues.whitelist.description "Adblock Plus je na stránke, ktorú chcete ohlásiÅ¥, vypnutý. Zapnite ho, prosím, znova a opäť naÄítajte stránku skôr, než potvrdíte hlásenie.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus neblokuje &amp;reklamy">
+<!ENTITY typeSelector.heading "Zvoľte typ problému">
+<!ENTITY anonymity.warning "Nebudeme schopný sa k Vás kontaktovať a vašej správe pravdepodobne priradíme nižšiu prioritu.">
+<!ENTITY wizard.title "Hlásenie problémov">
+<!ENTITY issues.ownfilters.disable.label "Vypnúť filter">
+<!ENTITY commentPage.description "Textové pole nižšie vám umožňuje vložiÅ¥ komentár pre vysvetlenie daného problému. Tento krok je nepovinný, ale odporúÄame ho ak problém nie je jasný. Môžete tiež posúdiÅ¥ správu skôr, než ju odoÅ¡lete.">
+<!ENTITY comment.lengthWarning "Dĺžka váško komentára prevyšuje 1000 znakov. Bude odoslaných len prvých 1000 znakov.">
+<!ENTITY typeSelector.falseNegative.description "Vyberte túto možnosť ak sa reklamy zobrazujú napriek zapnutému Adblock Plus.">
+<!ENTITY sendPage.waitMessage "PoÄkajte, prosím, kým Adblock Plus potvrdí vaÅ¡u správu.">
+<!ENTITY dataCollector.heading "Vitajte v hlásení problémov">
+<!ENTITY screenshot.heading "Pripojiť screenshot">
+<!ENTITY sendPage.heading "Poslať správu">
+<!ENTITY issues.subscriptionCount.description "Zdá sa, že máte príliÅ¡ veľa odberov filtrov. Toto nastavenie nie je odporúÄané, pretože pravdepodobnosÅ¥ výskytu problému je vyššia. Taktiež nemôžeme prijaÅ¥ vaÅ¡u správu o probléme, pretože nie je jasné, ktorý autor odberu filtra potrebuje prijaÅ¥ opatrenie. Prosím, odstráňte vÅ¡etky odbery, okrem naozaj nevyhnutných, a otestujte, Äi problém pretrváva.">
+<!ENTITY screenshot.mark.label "O&amp;znaÄiÅ¥ problém">
+<!ENTITY privacyPolicy.label "Zásady ochrany súkromia">
+<!ENTITY issues.description "Adblock Plus zistil problém s vašou konfiguráciou, ktorý by mohol byť zodpovedný za daný problém alebo robí zistenie problému ťažším.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/sidebar.dtd
new file mode 100644
index 0000000..f9e241c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "OhraniÄenie flashových položiek">
+<!ENTITY address.label "Adresa">
+<!ENTITY context.open.label "Otvoriť na novej karte">
+<!ENTITY type.label "Typ">
+<!ENTITY tooltip.filterSource.label "Zdroj filtra:">
+<!ENTITY noitems.label "Neblokovateľné položky">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Veľkosť:">
+<!ENTITY reattach.label "Znovu pripojiť">
+<!ENTITY search.label "&amp;Hľadať:">
+<!ENTITY docDomain.thirdParty "(tretia strana)">
+<!ENTITY filterSource.label "Zdroj filtra">
+<!ENTITY tooltip.docDomain.label "Zdroj dokumentu:">
+<!ENTITY context.copy.label "Kopírovať adresu položiek">
+<!ENTITY tooltip.type.label "Typ:">
+<!ENTITY context.disablefilter.label "Vypnúť filter ?1?">
+<!ENTITY context.copyFilter.label "Kopírovať filter">
+<!ENTITY context.block.label "Blokovať túto položku">
+<!ENTITY context.enablefilter.label "Znovu zapnúť filter ?1?">
+<!ENTITY detach.label "Oddeliť">
+<!ENTITY whitelisted.label "Povolené stránky">
+<!ENTITY context.disablefilteronsite.label "Vypnúť tento filter na ?1?">
+<!ENTITY detached.title "Adblock Plus: Blokovateľné položky (oddelený)">
+<!ENTITY docDomain.firstParty "(prvá strana)">
+<!ENTITY tooltip.type.whitelisted "(povolený)">
+<!ENTITY tooltip.filter.label "Platný filter:">
+<!ENTITY tooltip.filter.disabled "(vypnutý)">
+<!ENTITY context.editfilter.label "UpraviÅ¥ filter v skutoÄnosti">
+<!ENTITY tooltip.type.blocked "(blokovaný)">
+<!ENTITY size.label "Veľkosť">
+<!ENTITY context.whitelist.label "Pridať výnimku pre položku">
+<!ENTITY context.selectAll.label "Vybrať všetko">
+<!ENTITY state.label "Stav">
+<!ENTITY docDomain.label "Zdroj dokumentu">
+<!ENTITY tooltip.address.label "Adresa:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/subscriptionSelection.dtd
new file mode 100644
index 0000000..de251ca
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sk/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Pridať tiež filter &amp;odberu &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plus zlyhal pri získavaní zoznamu odberov.">
+<!ENTITY list.download.retry "Skúsiť znova">
+<!ENTITY title.label "Ná&amp;zov povolenia:">
+<!ENTITY list.download.website "Zobraziť webovú stránku">
+<!ENTITY supplementMessage "Tento filter odberu je urÄený pre použitie s filtrom odberu &quot;?1?&quot;ktorý eÅ¡te nepoužívate.">
+<!ENTITY viewList.label "Zobraziť filtre">
+<!ENTITY visitHomepage.label "Navštíviť domovskú stránku">
+<!ENTITY addSubscription.label "Pridať odber">
+<!ENTITY dialog.title "Odoberanie Add Adblock Plus filtrov">
+<!ENTITY location.label "U&amp;miestnenie zoznamu filtrov:">
+<!ENTITY fromWeb.description "Prosím, potvrÄte, že chcete pridaÅ¥ tento filter odberu.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/composer.dtd
new file mode 100644
index 0000000..4290a58
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "na &amp;koncu naslova">
+<!ENTITY domainRestriction.label "Omeji na &amp;domeno:">
+<!ENTITY collapse.default.no.label "Uporabi privzeto (ne)">
+<!ENTITY firstParty.label "Samo &amp;prve stranke">
+<!ENTITY preferences.label "Poka&amp;ži obstojeÄe filtre ...">
+<!ENTITY pattern.label "IÅ¡Äi vzorec">
+<!ENTITY thirdParty.label "Samo zu&amp;nanje stranke">
+<!ENTITY filter.label "Nov &amp;filter:">
+<!ENTITY collapse.label "St&amp;rni blokirane:">
+<!ENTITY match.warning "Vzorec, ki ste ga vnesli, se ne ujema z naslovom, ki ga želite blokirati in zato ne bo vplival nanj.">
+<!ENTITY anchor.start.label "na &amp;zaÄetku naslova">
+<!ENTITY matchCase.label "Razlikuj velike/male &amp;Ärke">
+<!ENTITY custom.pattern.label "Po &amp;meri:">
+<!ENTITY unselectAllTypes.label "NiÄ ne izberi">
+<!ENTITY type.whitelist.label "Pravi&amp;lo izjem">
+<!ENTITY regexp.warning "Vneseni vzorec bo obravnavan kot regularni izraz. Å tevilni regularni izrazi lahko upoÄasnijo vaÅ¡e brskanje. ÄŒe ne nameravate uporabljati regularnih izrazov, dodajte simbol * na konec vzorca.">
+<!ENTITY dialog.title "Dodaj pravilo filtra Adblock Plus">
+<!ENTITY basic.label "Osnovni pogled">
+<!ENTITY type.filter.label "Filter &amp;blokade">
+<!ENTITY types.label "Uporabi za vrste:">
+<!ENTITY shortpattern.warning "Vzorec, ki ste ga vnesli, je prekratek za optimizacijo, Å¡tevilni tovrstni vzorci lahko upoÄasnijo vaÅ¡e brskanje. PriporoÄamo, da izberete daljÅ¡i niz za ta filter.">
+<!ENTITY collapse.yes.label "Da">
+<!ENTITY anchors.label "Sprejmi le vzorec:">
+<!ENTITY collapse.default.yes.label "Uporabi privzeto (da)">
+<!ENTITY domainRestriction.help "Navedite eno ali veÄ domen, loÄenih s simbolom &quot;|&quot;, filter bo veljal le za te domene. Simbol &quot;~&quot; pred imenom domene pomeni, da filter za to domeno ne sme veljati.">
+<!ENTITY accept.label "Dodaj filter">
+<!ENTITY options.label "Možnosti">
+<!ENTITY disabled.warning "Adblock Plus je trenutno onemogoÄen. Å e vedno lahko dodajate filtre, vendar ne bodo veljali, Äe ne [link]omogoÄite Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "na &amp;zaÄetku imena domene">
+<!ENTITY collapse.no.label "Ne">
+<!ENTITY selectAllTypes.label "Izberi vse">
+<!ENTITY advanced.label "Napredni pogled">
+<!ENTITY pattern.explanation "Vzorec je lahko kateri koli del naslova, simbol * velja kot poljuben znak. Filter bo le za naslove, ki ustrezajo vzorcu.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/filters.dtd
new file mode 100644
index 0000000..68220ee
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Vsi tvoji filtri po meri bodo zamenjani z vsebino izbrane datoteke. Želite zagnati proces?">
+<!ENTITY slow.column "Po&amp;Äasni filtri">
+<!ENTITY enabled.column "O&amp;mogoÄeno">
+<!ENTITY subscription.lastDownload.checksumMismatch "Neuspešno, kontrolna vsota se ne ujema">
+<!ENTITY noFiltersInGroup.text "Izbrana skupina je prazna.">
+<!ENTITY subscription.actions.label "Dejanja">
+<!ENTITY filter.selectAll.label "Izberi vse">
+<!ENTITY backupButton.label "&amp;Varnostno kopiraj in obnovi">
+<!ENTITY restore.minVersion.warning "Opozorilo: datoteka je bila ustvarjena z novejÅ¡o razliÄico Adblock Plus. Pred obnovitvijo iz te datoteke, najprej posodobi na najnovejÅ¡o razliÄico Adblock Plus.">
+<!ENTITY restore.error "Podatkov datoteke ni bilo mogoÄe obdelat. Je datoteka res varnostna kopija programa Adblock Plus?">
+<!ENTITY sort.ascending.label "od &amp;A &gt; Z">
+<!ENTITY sort.label "Raz&amp;vrsti">
+<!ENTITY subscription.source.label "Seznam filtrov">
+<!ENTITY hitcount.column "Za&amp;detki">
+<!ENTITY noFilters.text "Svojega lastnega filtra še nimaš.">
+<!ENTITY backup.custom.title "Samo filtri po meri">
+<!ENTITY subscription.external.label "Posodobljepreko druge razširitve">
+<!ENTITY subscription.delete.label "Izbriši">
+<!ENTITY noGroupSelected.text "Preden se filtre lahko prikaže moraš izbrati filter skupino.">
+<!ENTITY filter.cut.label "Izreži">
+<!ENTITY restore.default.label "Obnovite varnostno kopijo z dne ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Prenos s strežnika ...">
+<!ENTITY subscriptions.tab.label "NaroÄnine na filtre">
+<!ENTITY sort.descending.label "od &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Želite res odstraniti vse izbrane filtre?">
+<!ENTITY filter.delete.label "Izbriši">
+<!ENTITY addSubscriptionAdd.label "Dodaj">
+<!ENTITY viewMenu.label "Pogled">
+<!ENTITY subscription.lastDownload.unknown "Ni na voljo">
+<!ENTITY addSubscriptionCancel.label "PrekliÄi">
+<!ENTITY subscription.enabled.label "OmogoÄeno">
+<!ENTITY noSubscriptions.text "Zaenkrat nimaÅ¡ naroÄenega Å¡e nobenega filtra. Adblock Plus ne more
+blokirati niÄesar brez filtrov, zato uporabi opcijo &quot;Dodaj naroÄnino za filter&quot;
+in dodaj vsaj en filter.">
+<!ENTITY subscription.update.label "Posodobi filtre">
+<!ENTITY dialog.title "Nastavitve filtrov za Adblock Plus">
+<!ENTITY addFilter.label "&amp;Dodaj filter">
+<!ENTITY subscription.minVersion.warning "Ta filter potrebuje novejÅ¡o verzijo Adblock Plusa. Nadgradi Adblock plus z najnoveÅ¡o razliÄico.">
+<!ENTITY subscription.lastDownload.invalidURL "Neuspešno, ni veljaven naslov">
+<!ENTITY backup.error "Napaka pri zapisu filtrov v datoteko. Poskrbite, da datoteka ni zaÅ¡Äitena pred pisanjem ali v uporabi nekega drugega programa.">
+<!ENTITY filter.moveUp.label "Premakni navzgor">
+<!ENTITY addGroup.label "Dodaj &amp;skupino filtrov">
+<!ENTITY filter.edit.label "Uredi">
+<!ENTITY subscription.showHideFilters.label "Pokaži/skrij filtre">
+<!ENTITY acceptableAds2.label "Dovol&amp;i nekatere nevsiljive oglase">
+<!ENTITY addSubscriptionOther.label "Dodaj novo naroÄnino">
+<!ENTITY close.label "Zapri">
+<!ENTITY sort.none.label "Nerazvr&amp;Å¡Äeno">
+<!ENTITY filter.actions.label "Dejanja filtra">
+<!ENTITY filter.copy.label "Kopiraj">
+<!ENTITY filter.moveDown.label "Premakni navzdol">
+<!ENTITY filter.resetHitCounts.label "Ponastavi statistiko zadetkov">
+<!ENTITY readMore.label "Preberi veÄ">
+<!ENTITY subscription.moveUp.label "Premakni navzgor">
+<!ENTITY addSubscription.label "Dodaj &amp;naroÄnino filtra">
+<!ENTITY subscription.homepage.label "DomaÄa stran">
+<!ENTITY backup.complete.title "Vsi filtri in naroÄnine">
+<!ENTITY restore.own.label "Obnovi lastno varnostno kopijo">
+<!ENTITY restore.complete.warning "Vsi nastavitve tvojih filtrov bodo zamenjane z vsebino izbrane datoteke. Želite zagnati proces?">
+<!ENTITY filters.tab.label "Filtri po meri">
+<!ENTITY backup.label "Ustvari novo varnostno kopijo">
+<!ENTITY find.label "Najdi">
+<!ENTITY subscription.moveDown.label "Premakni navzdol">
+<!ENTITY subscription.lastDownload.connectionError "Neuspešno, napaka prenosa">
+<!ENTITY subscription.lastDownload.success "Uspešno">
+<!ENTITY subscription.lastDownload.invalidData "Neuspešno, ni veljaven seznam filtrov">
+<!ENTITY filter.paste.label "Prilepi">
+<!ENTITY subscription.disabledFilters.enable "OmogoÄi onemogoÄene filtre">
+<!ENTITY lasthit.column "Zad&amp;nji zadetek">
+<!ENTITY subscription.editTitle.label "Uredi naslov">
+<!ENTITY subscription.disabledFilters.warning "V tej naroÄnini so nekateri filtri onemogoÄeni.">
+<!ENTITY filter.column "Pravilo &amp;filtra">
+<!ENTITY subscription.lastDownload.label "Zadnji prenos:">
+<!ENTITY viewList.label "Pokaži seznam">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/firstRun.properties
new file mode 100644
index 0000000..d749c77
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Brskajte zasebno z onemogoÄanjem sledenja - zabriÅ¡ite svoje sledi oglaÅ¡evalskim agencijam, ki vam sledijo na vsakem koraku.
+firstRun_toggle_off=IZKLOP
+firstRun_feature_tracking=OnemogoÄite sledenje
+firstRun_feature_malware=Blokiranje zlonamernih spletnih mest
+firstRun_title=Adblock Plus je bil nameÅ¡Äen
+firstRun_toggle_on=VKLOP
+firstRun_acceptableAdsExplanation=Želimo spodbujati uporabo preprostih, nevsiljivih oglasov na spletnih straneh. Zato smo vpeljali <a>stroge kriterije</a> prepoznavanja sprejemljivih oglasov, ki so privzeto prikazani. ÄŒe vseeno želite blokirati vse oglase, jih lahko <a>onemogoÄite</a> v nekaj sekundah.
+firstRun_contributor_credits=Krediti sodelavcev
+firstRun_dataCorruptionWarning=Se vam ta stran še vedno prikazuje? <a>Kliknite tukaj!</a>
+firstRun_acceptableAdsHeadline=Nadležni oglasi bodo zdaj blokirani
+firstRun_share=Povejte svojim prijateljem
+firstRun_share_headline=<a>Podajte nam roko</a> v ustvarjanju boljšega spleta
+firstRun_feature_social_description=Med brskanjem se samodejno izognite gumbom socialnih medijev, kot je Facebookov VÅ¡eÄ mi je, ki se pojavljajo na spletnih straneh in sledijo vaÅ¡im navadam brskanja.
+firstRun_filterlistsReinitializedWarning=OÄitno so bili zaradi težave vsi filtri odstranjeni in varnostne kopije ni bilo mogoÄe obnoviti. Zato smo ponastavili vaÅ¡e nastavitve filtrov in dovoljenih oglasov. Prosimo, preverite svoj seznam filtrov in nastavitve dovoljenih oglasov v <a>nastavitvah za Adblock Plus</a>.
+firstRun_feature_malware_description=Brskajte po spletu varneje, tako da blokirate znane domene z zlonamerno programsko opremo.
+firstRun_features=Adblock Plus zmore veÄ kot le blokirati oglase
+firstRun_donate=prispevajte
+firstRun_donate_label=Podprite naš projekt
+firstRun_feature_social=Odstranite gumbe socialnih medijev
+firstRun_legacySafariWarning=Uporabljate staro razliÄico Safarija, ki je Adblock Plus ne podpira. Morda ne bo pravilno deloval ali bo poslabÅ¡al uporabniÅ¡ko izkuÅ¡njo na nekaterih spletnih straneh. MoÄno priporoÄamo, da nadgradite na Safari 6.1.1 ali novejÅ¡ega (na OS X 10.8 Mountain Lion), Safari 7.0.1 ali novejÅ¡ega (na OS X 10.9 Mavericks), ali da uporabljate najnovejÅ¡o razliÄico Mozille Firefox, Google Chroma ali Opere.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/global.properties
new file mode 100644
index 0000000..e612a82
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Na trenutni strani ni elementov blokad
+action3_tooltip=Kliknite za vkljuÄitev/izkljuÄitev Adblock Plus.
+notification_antiadblock_title=Skrijem ciljana sporoÄila?
+type_label_script=skript
+filter_elemhide_nocriteria=Za razpoznavo elementa, ki naj bo skrit, ni navedenih pogojev
+blockingGroup_title=Pravila blokiranja oglasov
+whitelisted_tooltip=Adblock Plus je aktiven, vendar je za trenutno stran izkljuÄen.
+type_label_stylesheet=predlogo strani
+blocked_count_tooltip=?1? od ?2?
+type_label_font=pisava
+type_label_popup=pojavno okno
+filter_regexp_tooltip=Ta filter je regularni izraz ali pa je prekratek za optimizacijo. PreveÄ filtrov lahko upoÄasni brskanje.
+action0_tooltip=Kliknite za pojavni meni, s srednjim klikom vkljuÄite/izkljuÄite.
+whitelisted_page=Za trenutno stran je bil Adblock Plus izkljuÄen
+remove_group_warning=ResniÄno želite odstraniti to skupino?
+action1_tooltip=Kliknite za odprtje/zaprtje blokiranih elementov, s srednjim klikom vkljuÄite/izkljuÄite.
+type_label_xmlhttprequest=Zahteva XML
+active_tooltip=Adblock Plus je aktiven, ?1? naroÄnine na filtre in ?2? filtri po meri so v rabi.
+type_label_document=dokument
+type_label_object_subrequest=podzahteva predmeta
+whitelistGroup_title=Pravila izjem
+disabled_tooltip=Adblock Plus je izkljuÄen.
+filter_elemhide_duplicate_id=Navedete lahko le eno identiteto elementa, ki naj bo skrit
+type_label_object=predmet
+action2_tooltip=Kliknite za nastavitve, s srednjim klikom vkljuÄite/izkljuÄite.
+type_label_subdocument=okvir
+clearStats_warning=S tem boste ponastavili vso statistiko zadetkov filtra in onemogoÄili Å¡tetje zadetkov filtra. Želite nadaljevati?
+notification_antiadblock_message=Ta stran uporabnikom prikazuje ciljana sporoÄila. Želite, da Adblock Plus skrije ta sporoÄila?
+blocked_count_addendum=(prav tako prikriti: ?1?, skriti: ?2?)
+subscription_invalid_location=Mesto seznama filtrov ni niti veljaven URL niti veljavno ime datoteke.
+type_label_image=sliko
+remove_subscription_warning=Želite res odpovedati naroÄnino?
+type_label_other=drugo
+mobile_menu_enable=ABP: omogoÄi
+type_label_media=zvok/video
+mobile_menu_disable_site=ABP: onemogoÄi za ?1?
+elemhideGroup_title=Pravila skrivanja elementov
+mobile_menu_enable_site=ABP: omogoÄi za ?1?
+type_label_elemhide=skrito
+newGroup_title=Nova skupina filtrov
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/overlay.dtd
new file mode 100644
index 0000000..fabef17
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Da">
+<!ENTITY notification.button.no "&amp;Ne">
+<!ENTITY sync.label "Sin&amp;hroniziraj nastavitve Adblock Plus">
+<!ENTITY whitelist.site.label "OnemogoÄi na ?1?">
+<!ENTITY filters.label "Nastavitve &amp;filtra">
+<!ENTITY disable.label "OnemogoÄi povsod">
+<!ENTITY objecttab.title "Blokiraj">
+<!ENTITY objecttab.tooltip "Kliknite sem za blokiranje tega predmeta z Adblock Plus">
+<!ENTITY menuitem.label "Ad&amp;block Plus">
+<!ENTITY objecttabs.label "Pokaži &amp;zavihke za Flash in Javo">
+<!ENTITY sendReport.label "&amp;Javite težavo na tej strani">
+<!ENTITY whitelist.page.label "OnemogoÄi samo na tej strani">
+<!ENTITY context.image.label "Adblock - slike">
+<!ENTITY counthits.label "Å tej za&amp;detke filtra">
+<!ENTITY opensidebar.label "Odpri &amp;elemente blokad">
+<!ENTITY notification.button.close "&amp;Zapri">
+<!ENTITY contribute.label "Sodelujte v Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock - okviri">
+<!ENTITY blocked.tooltip "Blokirani elementi na tej strani:">
+<!ENTITY hideplaceholders.label "Skrij ograde &amp;blokoranih elementov">
+<!ENTITY showinstatusbar.label "Pokaži &amp;v vrstici stanja">
+<!ENTITY sidebar.title "Elementi blokad na trenutni strani">
+<!ENTITY options.label "Mo&amp;žnosti">
+<!ENTITY context.object.label "Adblock - predmeti">
+<!ENTITY context.removeWhitelist.label "Adblock Plus - ponovno omogoÄi na tej strani">
+<!ENTITY filters.tooltip "Najbolj aktivni filtri:">
+<!ENTITY closesidebar.label "Zapri &amp;elemente blokad">
+<!ENTITY showintoolbar.label "Po&amp;kaži v orodni vrstici">
+<!ENTITY status.tooltip "Stanje:">
+<!ENTITY context.media.label "Adblock Plus: Blokiraj zvok/video">
+<!ENTITY subscription.update.label "Posodobi filtre">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/sendReport.dtd
new file mode 100644
index 0000000..47ebf1b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/sendReport.dtd
@@ -0,0 +1,70 @@
+<!ENTITY screenshot.undo.label "Ra&amp;zveljavi">
+<!ENTITY issues.disabledgroups.description "Naslednje naroÄnine na filtre/skupine filtrov so onemogoÄene, Äeprav lahko vplivajo na prikaz te strani:">
+<!ENTITY showData.label "Pokaži podatke poroÄila">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus bloki&amp;ra preveÄ stvari">
+<!ENTITY issues.change.description "VaÅ¡a konfiguracija je bila spremenjena. Ponovno naložite stran in preizkusite težave ter poÅ¡ljite poroÄilo, Äe se s spremembami težava ni odpravila.">
+<!ENTITY email.label "E-&amp;pošta:">
+<!ENTITY issues.openPreferences.label "Odpri nastavitve filtra">
+<!ENTITY sendPage.confirmation "VaÅ¡e poroÄilo je shranjeno. Do njega lahko dostopate na naslednjem naslovu:">
+<!ENTITY copyLink.label "Kopiraj po&amp;vezavo poroÄila">
+<!ENTITY issues.nofilters.description "Adblock Plus ne blokira niÄesar na trenutni strani. Težava, ki jo zaznavate, morda ni povezana z Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Težava, ki ste jo javili, je najbrž že znana. VeÄ podatkov:">
+<!ENTITY typeSelector.other.description "Izberite to možnost, Äe sumite na težavo v Adblock Plus in ne v njegovih filtrih.">
+<!ENTITY issues.disabledgroups.enable.label "OmogoÄi naroÄnino na filter / skupino filtrov">
+<!ENTITY typeWarning.override.label "Razumem in &amp;želim vseeno oddati poroÄilo">
+<!ENTITY issues.disabled.enable.label "OmogoÄi Adblock Plus">
+<!ENTITY update.fixed.description "Posodobitev filtra je najverjetneje rešila problem,
+o katerem ste poroÄali. Osvežite stran in poskusite znova. ÄŒe
+se bo težava ponovila, znova kliknite PoroÄaj.">
+<!ENTITY anonymous.label "&amp;Anonimna oddaja">
+<!ENTITY reloadButton.label "Po&amp;novno naloži stran">
+<!ENTITY recentReports.clear.label "O&amp;dstrani vsa poroÄila">
+<!ENTITY typeSelector.description "To okno vas vodi po korakih do oddaje poroÄila o težavi z Adblock Plus. Najprej izberite vrsto težave, s katero ste se sreÄali na tej strani:">
+<!ENTITY screenshot.remove.label "Odstrani o&amp;bÄutljive podatke">
+<!ENTITY issues.ownfilters.description "Nekateri filtri, uporabljeni na tej strani, so uporabniÅ¡ko doloÄeni. OnemogoÄite filtre, ki so lahko krivi za to težavo:">
+<!ENTITY update.inProgress.description "Adblock mora posodobiti naroÄene filtre, da zagotovi,
+da problem ni bil že reÅ¡en. Prosim poÄakajte ...">
+<!ENTITY sendPage.retry.label "Pošlji znova">
+<!ENTITY data.label "Podatki poroÄila:">
+<!ENTITY recentReports.label "VaÅ¡a nedavno poslana poroÄila">
+<!ENTITY typeWarning.description "Nakazali ste, da želite poroÄati o sploÅ¡ni težavi z Adblock Plus, ne pa o težavi s filtri. UpoÅ¡tevajte, da je o takÅ¡nih težavah najbolje poroÄati na [link]forumu Adblock Plus[/link]. PoroÄanje o težavah uporabite le za podporo obstojeÄe razprave, saj sicer nihÄe ne bo opazil vaÅ¡ega poroÄila, razen Äe ne podate povezavo nanj. Samodejno ustvarjena povezava bo na voljo po poÅ¡iljanju poroÄila.">
+<!ENTITY issues.disabled.description "Adblock Plus je onemogoÄe, v trenutnem stanju ne more blokirati niÄesar.">
+<!ENTITY attachExtensions.label "PoroÄi&amp;lu priložite seznam aktivnih razÅ¡iritev, Äe je vzrok težave spor z dodatkom">
+<!ENTITY issues.nosubscriptions.add.label "Dodaj naroÄnino na filter">
+<!ENTITY issues.disabledfilters.enable.label "OmogoÄi filter">
+<!ENTITY issues.override.label "Kon&amp;figuracija je pravilna, nadaljuj s poroÄilom">
+<!ENTITY issues.nosubscriptions.description "Kot kaže, niste naroÄeni na noben seznam filtrov, ki samodejno odstranijo neželene vsebine s spletnih strani.">
+<!ENTITY typeSelector.falsePositive.description "Izberite to možnost, Äe strani manjka pomembna vsebina, Äe se prikaže nepravilno ali ne deluje pravilno. DoloÄite lahko, ali je Adblock Plus kriv težav, tako da ga zaÄasno izkljuÄite.">
+<!ENTITY typeSelector.other.label "Druga težava">
+<!ENTITY emailComment.label "Bilo bi dobro, da vneseÅ¡ veljaven email, tako da se na vas lahko obrnemo, Äe bodo obstajala vpraÅ¡anja glede poroÄila. Pravtako nam omogoÄa prepoznati vaÅ¡e prispevke in tako lažje doloÄiti prioriteto viÅ¡je.">
+<!ENTITY issues.whitelist.remove.label "Ponovno omogoÄi Adblock Plus na tej strani">
+<!ENTITY outdatedSubscriptions.description "Ta filter ni bil posodobljen vsaj dva tedna.
+Preden poÅ¡ljete poroÄilo, posodobite vse naroÄene fitre,
+saj je morda problem že rešen.">
+<!ENTITY dataCollector.description "PoÄakajte nekaj trenutkov, da Adblock Plus zbere potrebne podatke.">
+<!ENTITY sendButton.label "Po&amp;Å¡lji poroÄilo">
+<!ENTITY comment.label "&amp;Komentar (neobvezno):">
+<!ENTITY sendPage.errorMessage "Poskus poÅ¡iljanja poroÄila je bil neuspeÅ¡en s kodo napake &quot;?1?&quot;. Zagotovite, da ste povezani v splet in poskusite znova. ÄŒe težave ni konec, poiÅ¡Äite pomoÄ na [link]forumu Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Prikaži nedavno poslana poroÄila">
+<!ENTITY commentPage.heading "Vnesite komentar">
+<!ENTITY update.start.label "ZaÄni s posodobitvijo zdaj">
+<!ENTITY issues.disabledfilters.description "Naslednji filtri so onemogoÄeni, Äeprav lahko vplivajo na prikaz te strani:">
+<!ENTITY screenshot.description "Isto stran lahko razliÄni uporabniki vidijo drugaÄe. VÄasih pomaga, Äe poroÄilu pripnete slikovni posnetek strani. Odstranite lahko dele strani z zasebnimi podatki, pa tudi oznaÄite obmoÄja, kjer se težava opazi. Kliknite ustrezni gumb in izberite del slike z miÅ¡ko.">
+<!ENTITY screenshot.attach.label "PoroÄilu priloži &amp;sliko strani">
+<!ENTITY issues.whitelist.description "Adblock Plus je trenutno na strani, o kateri poroÄate, onemogoÄen. OmogoÄite ga in ponovno naložite stran, preden poÅ¡ljete poroÄilo o težavi.">
+<!ENTITY typeSelector.falseNegative.label "Adbloc&amp;k Plus ne blokira oglasa">
+<!ENTITY typeSelector.heading "Kakšno težavo imate?">
+<!ENTITY anonymity.warning "Kontakta z vami ne bomo mogli vzpostaviti. Prioriteto poroÄilu pa bomo verjetno znižali.">
+<!ENTITY wizard.title "PoroÄilo o težavah">
+<!ENTITY issues.ownfilters.disable.label "OnemogoÄi filter">
+<!ENTITY commentPage.description "Spodnje polje z besedilom omogoÄa vnos komentarja, ki nam pomaga razumeti težavo. To je neobvezno, vendar priporoÄamo, Äe težava ni oÄitna. Pred poÅ¡iljanjem si lahko Å¡e enkrat ogledate podatke poroÄila.">
+<!ENTITY comment.lengthWarning "Dolžina vašega komentarja presega 1000 znakov. Poslanih bo le prvih 1000 znakov.">
+<!ENTITY typeSelector.falseNegative.description "Izberite to možnost, Äe je oglas prikazan kljub temu, da je Adblock Plus omogoÄen.">
+<!ENTITY sendPage.waitMessage "PoÄakajte, dokler Adblock Plus poÅ¡ilja vaÅ¡e poroÄilo.">
+<!ENTITY dataCollector.heading "DobrodoÅ¡li v poroÄanje o težavah">
+<!ENTITY screenshot.heading "Priložite sliko strani">
+<!ENTITY sendPage.heading "PoÅ¡lji poroÄilo">
+<!ENTITY issues.subscriptionCount.description "Zdi se, da ste naroÄeni na preveÄ filtrov. TakÅ¡na nastavitev ni priporoÄena, saj je možnost težav veliko veÄja. Prav tako ne moremo obdelati vaÅ¡ega poroÄila o napaki, saj ni jasno, kateri avtor naroÄnine na filtre mora narediti popravke. Prosimo, da odstranite vse nepotrebne naroÄnine na filtre in preizkusite, Äe Å¡e vedno prihaja do napake.">
+<!ENTITY screenshot.mark.label "OznaÄi &amp;težavo">
+<!ENTITY privacyPolicy.label "Izjava o zasebnosti">
+<!ENTITY issues.description "Adblock Plus je zaznal težave z vaÅ¡o konfiguracijo, ki so lahko krive za to težavo ali pa bodo raziskovanje poroÄila otežile.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/sidebar.dtd
new file mode 100644
index 0000000..42347da
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Obrobe elementa naj utripajo">
+<!ENTITY address.label "Naslov">
+<!ENTITY context.open.label "Odpri v novem zavihku">
+<!ENTITY type.label "Vrsta">
+<!ENTITY tooltip.filterSource.label "Vir filtra:">
+<!ENTITY noitems.label "Ni elementov blokiranja">
+<!ENTITY filter.label "Filter">
+<!ENTITY tooltip.size.label "Velikost:">
+<!ENTITY reattach.label "Pripni">
+<!ENTITY search.label "&amp;Najdi:">
+<!ENTITY docDomain.thirdParty "(tretja stran)">
+<!ENTITY filterSource.label "Vir filtra">
+<!ENTITY tooltip.docDomain.label "Vir dokumenta:">
+<!ENTITY context.copy.label "Kopiraj naslov elementa">
+<!ENTITY tooltip.type.label "Vrsta:">
+<!ENTITY context.disablefilter.label "OnemogoÄi filter ?1?">
+<!ENTITY context.copyFilter.label "Kopiraj filter">
+<!ENTITY context.block.label "Blokiraj ta element">
+<!ENTITY context.enablefilter.label "Ponovno omogoÄi filter ?1?">
+<!ENTITY detach.label "Odpni">
+<!ENTITY whitelisted.label "Dovoljena stran">
+<!ENTITY context.disablefilteronsite.label "OnemogoÄi ta filter na ?1?">
+<!ENTITY detached.title "Adblock Plus: elementi blokad (odpeti)">
+<!ENTITY docDomain.firstParty "(prva stran)">
+<!ENTITY tooltip.type.whitelisted "(dovoljeno)">
+<!ENTITY tooltip.filter.label "Trenutni filter:">
+<!ENTITY tooltip.filter.disabled "(onemogoÄeno)">
+<!ENTITY context.editfilter.label "Uredi trenutni filter">
+<!ENTITY tooltip.type.blocked "(blokirano)">
+<!ENTITY size.label "Velikost">
+<!ENTITY context.whitelist.label "Dodaj pravilo izjem za element">
+<!ENTITY context.selectAll.label "Izberi vse">
+<!ENTITY state.label "Stanje">
+<!ENTITY docDomain.label "Vir dokumenta">
+<!ENTITY tooltip.address.label "Naslov:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/subscriptionSelection.dtd
new file mode 100644
index 0000000..d8c15f3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sl/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Dodaj tudi naroÄnino na &amp;filter ?1?">
+<!ENTITY list.download.failed "Pridobivanje seznama naroÄnin ni uspelo.">
+<!ENTITY list.download.retry "Poskusi znova">
+<!ENTITY title.label "&amp;Naslov naroÄnine:">
+<!ENTITY list.download.website "Pokaži spletno mesto">
+<!ENTITY supplementMessage "NaroÄnina na filter je miÅ¡ljena za rabo z naroÄnino na filter ?1?, ki je Å¡e ne uporabljate.">
+<!ENTITY viewList.label "Pokaži filtre">
+<!ENTITY visitHomepage.label "ObiÅ¡Äi domaÄo stran">
+<!ENTITY addSubscription.label "Dodaj naroÄnino">
+<!ENTITY dialog.title "Dodaj naroÄnino na filtre Adblock Plus">
+<!ENTITY location.label "&amp;Mesto seznama filtriranja:">
+<!ENTITY fromWeb.description "Potrdite, da želite dodati to naroÄnino na filter. Naslov ali kraj naroÄnine lahko spremenite Å¡e pred dodajanjem.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/composer.dtd
new file mode 100644
index 0000000..144de9e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "në fund të adresës">
+<!ENTITY domainRestriction.label "Kufizo në domain:">
+<!ENTITY collapse.default.no.label "Përdor të parazgjedhurën (jo):">
+<!ENTITY firstParty.label "Vetëm të parët">
+<!ENTITY preferences.label "Trego filtrin ekzistues...">
+<!ENTITY pattern.label "Kërko për motivin">
+<!ENTITY thirdParty.label "Vetëm të tretët">
+<!ENTITY filter.label "Filtër i ri:">
+<!ENTITY collapse.label "Shkatërro te bllokuarat:">
+<!ENTITY match.warning "Motivi që dhatë nuk përputhet më me adresat e bllokuara/lejuara dhe nuk ka më efekt mbi to.">
+<!ENTITY anchor.start.label "në fillim të adresës">
+<!ENTITY matchCase.label "Përputh shembullin">
+<!ENTITY custom.pattern.label "Përshtatja:">
+<!ENTITY unselectAllTypes.label "Mos selekto asnjë">
+<!ENTITY type.whitelist.label "Rregull përjashtimi">
+<!ENTITY regexp.warning "Motivi që dhatë do të interpretohet si shprehje e rregullt që nuk mund të përdoret nga Adblock Plus dhe mund të ngadalsojë hapjen e faqeve te internetit. Nëse nuk kishit ndërmend të përdorni një shprehje të rregullt, shtoni një (*) në fund të motivit.">
+<!ENTITY dialog.title "Shto një rregullore filtri në Adblock Plus">
+<!ENTITY basic.label "Pamje kryesore">
+<!ENTITY type.filter.label "Blloko filtrin">
+<!ENTITY types.label "Apliko në llojet:">
+<!ENTITY shortpattern.warning "Motivi që dhatë është shumë i shkurtër që të optimizohet dhe mund të ngadalsojë internetin. Rekomandohet që të zgjidhni një varg më të gjatë për këtë filtër në menyrë që të lejoj Adblock Plus ta përpunoj filtrin më mirë.">
+<!ENTITY collapse.yes.label "Po">
+<!ENTITY anchors.label "Prano vetëm motivin:">
+<!ENTITY collapse.default.yes.label "Përdor të parazgjedhurën (po):">
+<!ENTITY domainRestriction.help "Përdore këtë opsion që të specifikosh një ose më shumë adresa të ndara nga një (|). Filtri do të zbatohet vetëm në adresat(s) e zgjedhura. Një (~) përpara emrit të adresës tregon që filtri nuk do të zbatohet në atë adresë.">
+<!ENTITY accept.label "Shto filtër">
+<!ENTITY options.label "Mundësitë">
+<!ENTITY disabled.warning "Adblock Plus nuk punon për momentin. Mund të shtoni filtra por nuk do të funksionojnë nëse ju nuk [link]mundësoni Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "në fillim të domain name">
+<!ENTITY collapse.no.label "Jo">
+<!ENTITY selectAllTypes.label "Selekto të gjitha">
+<!ENTITY advanced.label "Pamje e avancuar">
+<!ENTITY pattern.explanation "Motivi mund të jetë çdo pjesë e adresës; simboli (*) vepron si xhoker. Filtri do të zbatohet vetëm në adresat që i përshtaten motivit të dhënë.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/filters.dtd
new file mode 100644
index 0000000..ac96eab
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Krejt filtrat tuaj të personalizuar do të zëvendësohen nga lënda e kartelës së përzgjedhur. Dëshironi të vazhdohet?">
+<!ENTITY slow.column "Filtruesit e ngadalshëm">
+<!ENTITY enabled.column "Aktivizo">
+<!ENTITY subscription.lastDownload.checksumMismatch "Deshtoi,mosperputhje checksumi">
+<!ENTITY noFiltersInGroup.text "Grupi i përzgjedhur është i zbrazët.">
+<!ENTITY subscription.actions.label "Veprime">
+<!ENTITY filter.selectAll.label "Përzgjidhi Krejt">
+<!ENTITY backupButton.label "&amp;Kopjeruaje dhe Riktheje">
+<!ENTITY restore.minVersion.warning "Kujdes: kartela është krijuar me një version Adblock Plus më të ri. Do të duhej ta përditësonit Adblock Plus-in me versionin më të ri, përpara se të riktheni të dhëna prej kësaj kartele.">
+<!ENTITY restore.error "Të dhënat e kartelës nuk përpunohen dot, ndoshta kjo nuk është kartelë kopjeruajtjesh për Adblock Plus?">
+<!ENTITY sort.ascending.label "A &gt; Z radhitje">
+<!ENTITY sort.label "Radhit sipas">
+<!ENTITY subscription.source.label "Lista e filtrave">
+<!ENTITY hitcount.column "Shtypje">
+<!ENTITY noFilters.text "Nuk keni ende ndonjë filtër të personalizuar.">
+<!ENTITY backup.custom.title "Vetëm filtrat e personalizuar">
+<!ENTITY subscription.external.label "E rifreksuar nga nje shtese tjeter">
+<!ENTITY subscription.delete.label "Fshije">
+<!ENTITY noGroupSelected.text "Përpara se të shfaqen filtrat e tij, lypset të përzgjidhni një grup filtrash.">
+<!ENTITY filter.cut.label "Kopjo-largo">
+<!ENTITY restore.default.label "Të rikthehet kopjeruajtja prej ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Duke u shkarkuar...">
+<!ENTITY subscriptions.tab.label "Filtroni abonimet">
+<!ENTITY sort.descending.label "Z &gt; A radhitje">
+<!ENTITY filters.remove.warning "Doni vërtet të hiqen krejt filtrat e përzgjedhur?">
+<!ENTITY filter.delete.label "Fshijë">
+<!ENTITY addSubscriptionAdd.label "Shto">
+<!ENTITY viewMenu.label "Shih">
+<!ENTITY subscription.lastDownload.unknown "N/D">
+<!ENTITY addSubscriptionCancel.label "Anulo">
+<!ENTITY subscription.enabled.label "E aktivizuar">
+<!ENTITY noSubscriptions.text "Ju nuk keni shtuar ndonje abonim per filter ende.Adblock Plus nuk do te bllokoje asgje pa filtra,ju lutem perdorin &quot;Shto nje abonim filtri&quot; per te shtuar disa.">
+<!ENTITY subscription.update.label "Përditësoni filtra">
+<!ENTITY dialog.title "Filtroni preferencat e Adblock Plus">
+<!ENTITY addFilter.label "Vendos filtrues">
+<!ENTITY subscription.minVersion.warning "Ky abonim filtri kerkon nje version me te ri te Adblock Plus,ti duhet te besh update ne versionin e fundit te Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Deshtoi,nje adrese e pavlefshme">
+<!ENTITY backup.error "Pati një gabim gjatë shkrimit te kartela. Sigurohuni që kartela nuk është e mbrojtur ndaj shkrimit ose që nuk po përdoret nga një zbatim tjetër.">
+<!ENTITY filter.moveUp.label "Ngjite sipër">
+<!ENTITY addGroup.label "Shtoni &amp;grup filtrash">
+<!ENTITY filter.edit.label "Përpunojeni">
+<!ENTITY subscription.showHideFilters.label "Shfaqni/fshihni filtra">
+<!ENTITY acceptableAds2.label "Lejo ndoca reklamë jo të &amp;bezdisshme">
+<!ENTITY addSubscriptionOther.label "Shto nje abonim tjeter">
+<!ENTITY close.label "Mbylle">
+<!ENTITY sort.none.label "Pa radhitur">
+<!ENTITY filter.actions.label "Veprime filtrash">
+<!ENTITY filter.copy.label "Kopjo">
+<!ENTITY filter.moveDown.label "Zbrite poshtë">
+<!ENTITY filter.resetHitCounts.label "Rinisi nga e para statistikat e vizitave">
+<!ENTITY readMore.label "Lexoni më tepër">
+<!ENTITY subscription.moveUp.label "Ngjite sipër">
+<!ENTITY addSubscription.label "Shto abonim per filter">
+<!ENTITY subscription.homepage.label "Kryefaqja">
+<!ENTITY backup.complete.title "Krejt filtrat dhe pajtimet">
+<!ENTITY restore.own.label "Rimerr vlera prej kopjeruajtjes së vet">
+<!ENTITY restore.complete.warning "Krejt parapëlqimet tuaja për filtrat do të zëvendësohen nga lënda e kartelës së përzgjedhur. Dëshironi të vazhdohet?">
+<!ENTITY filters.tab.label "Filtra te kostumizuar">
+<!ENTITY backup.label "Krijoni një kopjeruajtje të re">
+<!ENTITY find.label "Kërko">
+<!ENTITY subscription.moveDown.label "Zbrite poshtë">
+<!ENTITY subscription.lastDownload.connectionError "Deshtoi,gabim shkarkimi">
+<!ENTITY subscription.lastDownload.success "Sukses">
+<!ENTITY subscription.lastDownload.invalidData "Deshtoi,nje liste jo e vlefshme filtrash">
+<!ENTITY filter.paste.label "Hedh">
+<!ENTITY subscription.disabledFilters.enable "Aktivizoni filtrat e aktivizuar">
+<!ENTITY lasthit.column "Shtypja e fundit">
+<!ENTITY subscription.editTitle.label "Përpunoni titullin">
+<!ENTITY subscription.disabledFilters.warning "Për këtë pajtim, disa nga filtrat janë çaktivizuar.">
+<!ENTITY filter.column "Rregulla e filtrimit">
+<!ENTITY subscription.lastDownload.label "Shkarkimi i fundit:">
+<!ENTITY viewList.label "Shihni listën">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/firstRun.properties
new file mode 100644
index 0000000..21438b1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/firstRun.properties
@@ -0,0 +1,24 @@
+firstRun_title=Adblock Plus has been installed
+firstRun_dataCorruptionWarning=Does this page keep showing up? <a>Click here!</a>
+firstRun_acceptableAdsHeadline=Annoying ads will now be blocked
+firstRun_acceptableAdsExplanation=We'd like to encourage websites to use straightforward, unobtrusive advertising. That's why we've established <a>strict guidelines</a> to identify acceptable ads, which are shown under default settings. If you still want to block every ad you can <a>disable</a> this in a few seconds.
+firstRun_legacySafariWarning=You are using an old version of Safari which is not supported by Adblock Plus. It might not work correctly or impair the user experience on some websites. We strongly recommend to either update to Safari 6.1.1 or higher (on OS X 10.8 Mountain Lion), or Safari 7.0.1 or higher (on OS X 10.9 Mavericks), or to use the latest version of Mozilla Firefox, Google Chrome or Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
+
+firstRun_toggle_on=ON
+firstRun_toggle_off=OFF
+
+firstRun_features=Adblock Plus can do more than block ads
+firstRun_feature_malware=Malware Blocking
+firstRun_feature_malware_description=Make your browsing more secure by blocking known malware domains.
+firstRun_feature_social=Remove Social Media Buttons
+firstRun_feature_social_description=Automatically rid your browsing experience of social media buttons, such as the Facebook Like, which appear on web pages and track your behavior.
+firstRun_feature_tracking=Disable Tracking
+firstRun_feature_tracking_description=Browse privately by disabling tracking - hiding your tracks from ad companies that would track your every move.
+
+firstRun_share_headline=<a>Give us a hand</a> in making the web a better place
+firstRun_donate=donate
+firstRun_donate_label=Support our project
+firstRun_share=Tell your friends
+
+firstRun_contributor_credits=Contributor Credits
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/global.properties
new file mode 100644
index 0000000..37f6dc5
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/global.properties
@@ -0,0 +1,41 @@
+disabled_tooltip=Adblock Plus është ç'aktiv.
+blocked_count_tooltip=?1?jasht nga ?2?
+action3_tooltip=Aktivizim/çaktivizo Adblock Plus.
+no_blocking_suggestions=S'ka elemente bllokuese në këtë faqe
+type_label_object=objekti
+type_label_popup=dritarja pop-up
+type_label_image=figura
+type_label_other=tjera
+type_label_font=shkronjat
+mobile_menu_enable=ABP: Mbroj
+type_label_subdocument=ndarja
+type_label_media=zë/video
+type_label_xmlhttprequest=kerkimi për XML
+type_label_script=skripta
+type_label_elemhide=fshehur
+type_label_document=dokumenti
+whitelisted_tooltip=Adblock Plus është aktiv por i pasivizuar në këtë faqe.
+default_dialog_title=Adblock Plus
+type_label_stylesheet=stilet
+notification_antiadblock_title=Hide targeted messages?
+filter_elemhide_nocriteria=No criteria specified to recognize the element to be hidden
+blockingGroup_title=Ad Blocking Rules
+filter_regexp_tooltip=This filter is either a regular expression or too short to be optimized. Too many of these filters might slow down your browsing.
+action0_tooltip=Click to bring up context menu, middle-click to enable/disable.
+whitelisted_page=Adblock Plus has been disabled for the current page
+remove_group_warning=Do you really want to remove this group?
+action1_tooltip=Click to open/close blockable items, middle-click to enable/disable.
+active_tooltip=Adblock Plus is enabled, ?1? filter subscription(s) and ?2? custom filter(s) in use.
+type_label_object_subrequest=object subrequest
+whitelistGroup_title=Exception Rules
+filter_elemhide_duplicate_id=Only one ID of the element to be hidden can be specified
+action2_tooltip=Click to open preferences, middle-click to enable/disable.
+clearStats_warning=This will reset all filter hit statistics and disable counting filter hits. Do you want to proceed?
+notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages?
+blocked_count_addendum=(also whitelisted: ?1?, hidden: ?2?)
+subscription_invalid_location=Filter list location is neither a valid URL nor a valid file name.
+remove_subscription_warning=Do you really want to remove this subscription?
+mobile_menu_disable_site=ABP: Disable on ?1?
+elemhideGroup_title=Element Hiding Rules
+mobile_menu_enable_site=ABP: Enable on ?1?
+newGroup_title=New filter group
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/overlay.dtd
new file mode 100644
index 0000000..256509f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY opensidebar.label "Hap elementet &amp;bllokuese">
+<!ENTITY options.label "Mundësitë (&amp;O)">
+<!ENTITY context.object.label "Adblock Plus: Objektet e bllokuara">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Rilejo në këtë faqe">
+<!ENTITY context.frame.label "Adblock Plus: Pjesët e bllokuara">
+<!ENTITY filters.tooltip "Filtruesit më aktivë:">
+<!ENTITY menuitem.label "Parapëlqimet e Ad&amp;block Plus">
+<!ENTITY closesidebar.label "M&amp;byll elementet bllokuese">
+<!ENTITY whitelist.page.label "Çaktivizo vetëm në këtë faqe">
+<!ENTITY whitelist.site.label "Çaktivizo në ?1?">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.image.label "Adblock Plus: Figurat e bllokuara">
+<!ENTITY status.tooltip "Gjendja:">
+<!ENTITY objecttab.title "Blloko">
+<!ENTITY subscription.update.label "Përditësoni filtra">
+<!ENTITY notification.button.yes "&amp;Yes">
+<!ENTITY notification.button.no "&amp;No">
+<!ENTITY sync.label "Syn&amp;c Adblock Plus settings">
+<!ENTITY filters.label "&amp;Filter preferences">
+<!ENTITY disable.label "Disable everywhere">
+<!ENTITY objecttab.tooltip "Click here to block this object with Adblock Plus">
+<!ENTITY objecttabs.label "Show &amp;tabs on Flash and Java">
+<!ENTITY sendReport.label "&amp;Report issue on this page">
+<!ENTITY counthits.label "Count filter &amp;hits">
+<!ENTITY notification.button.close "&amp;Close">
+<!ENTITY contribute.label "Contribute to Adblock Plus">
+<!ENTITY blocked.tooltip "Blocked items on this page:">
+<!ENTITY hideplaceholders.label "Hide p&amp;laceholders of blocked elements">
+<!ENTITY showinstatusbar.label "&amp;Show in status bar">
+<!ENTITY sidebar.title "Blockable items on current page">
+<!ENTITY showintoolbar.label "Show in tool&amp;bar">
+<!ENTITY context.media.label "Adblock Plus: Block audio/video">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/sendReport.dtd
new file mode 100644
index 0000000..a4139d6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/sendReport.dtd
@@ -0,0 +1,71 @@
+<!ENTITY screenshot.undo.label "Zhbeje (&amp;U)">
+<!ENTITY issues.disabledgroups.description "Abonimet e meposhtme ne filtra/grupe filtrash jane te bllokuar, gjithashtu ata mund te kene efikasitet ne kete faqe:">
+<!ENTITY showData.label "Afisho permbajtjen e raportit">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus po bllokon shu&amp;me">
+<!ENTITY issues.change.description "Konfigurimi juaj ka ndryshuar. Ju lutem ri-ngarkoni faqen per te provuar ndryshimet dhe per te derguar nje raportim nese problemi nuk eshte zgjidhur nga ndryshimet ne konfigurim.">
+<!ENTITY email.label "Posta: (&amp;m)">
+<!ENTITY issues.openPreferences.label "Hap parametrat e filtrave">
+<!ENTITY sendPage.confirmation "Raporti juaj eshte ruajtur. Ju mund ta shikoni ate ne kete adrese:">
+<!ENTITY copyLink.label "KOpjo adresen e raportit (&amp;C)">
+<!ENTITY issues.nofilters.description "Adblock Plus nuk eshte duke bllokuar asgje ne faqen aktuale. Ky problem qe ju po vereni ka shume mundesi qe nuk ka fare lidhje me Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Problemi qe ju keni raportuar ka shume mundesi te jete i njohur. Per me shume informacion:">
+<!ENTITY typeSelector.other.description "Zgjidhni kete mundesi nese ju dyshoni se eshte nje problem me vete Adblock Plus ne vend te filtrave te tij.">
+<!ENTITY issues.disabledgroups.enable.label "Aktivizo abonim filtri/grup filtrash">
+<!ENTITY typeWarning.override.label "Une kuptoj dhe de&amp;shiroj te dergoj raportin gjithsesi">
+<!ENTITY issues.disabled.enable.label "Aktivizo Adblock Plus">
+<!ENTITY reloadButton.label "&amp;Ringarko faqen">
+<!ENTITY recentReports.clear.label "Hiq gjithe &amp;raportimet">
+<!ENTITY typeSelector.description "Kjo dritare do ju udhezoje neper gjithe hapat e nevojshem per dergimin e raportit te problemeve me Adblock Plus. Si fillim, ju lutem zgjidhni tipin e problemit qe ju vereni me kete faqe:">
+<!ENTITY screenshot.remove.label "Hiqni te dhenat pe&amp;rsonale">
+<!ENTITY issues.ownfilters.description "Disa nga filtrat e aplikuar ne kete faqe jane te percaktuar nga perdoruesi. Ju lutem bllokoni filtrat te cilet mund te kene shkaktuar kete problem:">
+<!ENTITY sendPage.retry.label "Dergo perseri">
+<!ENTITY data.label "&amp;Permbajtja e raportit:">
+<!ENTITY recentReports.label "Raportimet tuaja me te fundit">
+<!ENTITY typeWarning.description "Ju keni treguar se deshironi te raportoni nje problem te pergjithshem me Adblock Plus ne vend te nje problemi me filtrat. Ju lutem kini parasysh se keto probleme raportohen me mire ne [link]forumin Adblock Plus[/link]. Ju duhet te perdorni raportimin e problemeve vetem si shtese te nje diskutimi ekzistues, sepse askush nuk do ta vere re raportimin tuaj, vetem nese ju jepni nje adrese te problemit. Adrese e krijuar automatikisht do ju jepet pasi ju te keni derguar raportin.">
+<!ENTITY issues.disabled.description "Adblock Plus eshte jo-aktiv, ai nuk do te bllokoje asnje gje ne gjendjen aktuale.">
+<!ENTITY attachExtensions.label "Bashkangjisni nje liste te prapashtesave aktive ne raportim, ne rast se shkaku i problemit eshte nje konflikt ndermjet moduleve. (&amp;x)">
+<!ENTITY issues.nosubscriptions.add.label "Shto abonim ne filtra">
+<!ENTITY issues.disabledfilters.enable.label "Aktivizo filtrin">
+<!ENTITY issues.override.label "Konfigurimi eshte i sakte, vazhdoni me raportimin (&amp;c)">
+<!ENTITY issues.nosubscriptions.description "Duket sikur ju nuk keni asnje abonim ne filtrat e gatshem te cilet heqin automatikisht permbajtjen e padeshiruar nga faqet web.">
+<!ENTITY typeSelector.other.label "Problem &amp;tjeter">
+<!ENTITY issues.whitelist.remove.label "Ri-aktivizo Adblock Plus ne kete faqe">
+<!ENTITY typeSelector.falsePositive.description "Zgjidhni kete mundesi nese faqes i mungon permbajtja e rendesishme, shfaqet gabim ose nuk funksionon ne rregull. Ju mund te percaktoni nese problemi eshte Adblock Plus duke e fikur ate perkohesisht.">
+<!ENTITY dataCollector.description "Ju lutem prisni disa momente deri sa Adblock Plus te mbledhe te gjitha te dhenat e nevojshme.">
+<!ENTITY sendButton.label "Dergo raporti&amp;n">
+<!ENTITY comment.label "Koment (fakultative): (&amp;C)">
+<!ENTITY sendPage.errorMessage "Tentativa per te derguar raportin ngeci me kodin e gabimit &quot;?1?&quot;. Ju lutem sigurohuni qe jeni te lidhur ne internet dhe provoni perseri. Nese ky problem perseritet kerkoni ndihme ne [link]forumin e Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Afisho raportimet e derguara se fundmi">
+<!ENTITY commentPage.heading "Koment">
+<!ENTITY update.start.label "Filloni përditëso tani">
+<!ENTITY issues.disabledfilters.description "Filtrat e meposhtem jane te bllokuar, gjithashtu ata mund te kene efikasitet ne kete faqe:">
+<!ENTITY screenshot.description "E njejta faqe mund te duket ndryshe per njerez te ndryshem. Mund te na ndihmoje ne kuptimin e problemit nese ju bashkangjisni nje foto raportimit tuaj. Ju mund te hiqni ose mbuloni fusha te cilat permbajne informacion te rendesishem dhe personal dhe gjithashtu mund te shenoni zonat ku eshte i dukshem problemi. Per te bere kete klikoni butonin e duhur dhe zgjidhni nje zone te fotos me mausin tuaj.">
+<!ENTITY screenshot.attach.label "Bashkangji&amp;t nje faqe me imazh ketij raportimi">
+<!ENTITY issues.whitelist.description "Adblock Plus eshte aktualisht jo-aktiv ne faqen ne te cilen ju po raportoni. Ju lutem ri-aktivizojeni ate dhe ringarkoni faqen perpara se te dergoni raportin i cili do te ndihmoje ne hetimin e metejshem te ketij problemi.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus nuk po bllokon nje reklame (&amp;v)">
+<!ENTITY typeSelector.heading "Lloji i problemit">
+<!ENTITY wizard.title "Raportuesi i problemeve">
+<!ENTITY issues.ownfilters.disable.label "Blloko filtrin">
+<!ENTITY commentPage.description "Fusha e meposhtme ju lejon qe te jepni nje koment qe te na ndihmoje ne ta kuptojme me mire problemin. Ky hap eshte fakultativ por i rekomanduar nese problemi nuk eshte lehtesisht i dallueshem. Ju mund te rishikoni gjithashtu te dhenat e raportimit perpara se te dergohet.">
+<!ENTITY comment.lengthWarning "Gjatesia e komentit tuaj i kapercent 1000 karaktere. Vetem 1000 karakteret e para do te dergohen se bashku me raportin.">
+<!ENTITY typeSelector.falseNegative.description "Zgjidhni kete mundesi nese nje reklame shfaqet edhe pse Adblock Plus eshte aktiv.">
+<!ENTITY sendPage.waitMessage "Ju lutem prisni sa Adblock Plus te dergoje raportin tuaj.">
+<!ENTITY dataCollector.heading "Mire se vini ne raportuesin e problemeve">
+<!ENTITY screenshot.heading "Bashkangjit foto">
+<!ENTITY sendPage.heading "Dergo raportin">
+<!ENTITY issues.subscriptionCount.description "Duket sikur ju jeni abonuar ne shume filtra. Ky konfigurim nuk rekomandohet sepse to te shtoje rastet e problemeve te njejta. Gjithashtu ne nuk mund te pranojme raportimin tuaj te problemeve sepse eshet i paqarte se me ke abonim filtri autori duhet te veproje. Ju lutem hiqni te gjithe abonimet ne filtra perveç atyre te nevojshem dhe provoni nese problemi do te jete perseri.">
+<!ENTITY screenshot.mark.label "Shenoni proble&amp;min">
+<!ENTITY privacyPolicy.label "Rregulla Privatësie">
+<!ENTITY issues.description "Adblock Plus ka dalluar probleme me konfigurimin tuaj i cili mund te jete pergjegjes per kete problem ose do te veshtiresoje hetimin e raportit.">
+<!ENTITY update.fixed.description "The updates to your filter subscriptions likely resolved the issue that you
+ were reporting. Please reload the page and retry, hit Report again if the
+ problem remains.">
+<!ENTITY anonymous.label "&amp;Anonymous submission">
+<!ENTITY update.inProgress.description "Adblock Plus needs to update your filter subscriptions to make sure that the
+ issue hasn't been resolved already. Please wait...">
+<!ENTITY emailComment.label "We encourage you to enter a valid email address so that we can contact you if there are questions
+ about your report. It will also allow us to recognize your contributions and to prioritize them higher.">
+<!ENTITY outdatedSubscriptions.description "The following filter subscriptions haven't been updated for at least two
+ weeks. Please update these subscriptions before submitting a report, the
+ issue might be resolved already.">
+<!ENTITY anonymity.warning "We won't be able to come back to you and will likely prioritize the report lower.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/sidebar.dtd
new file mode 100644
index 0000000..b953b23
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Blic kufijte e artikull">
+<!ENTITY address.label "Adresa">
+<!ENTITY context.open.label "Hape një një lidhje të re">
+<!ENTITY type.label "Lloji">
+<!ENTITY tooltip.filterSource.label "Burimi i filtruesit:">
+<!ENTITY noitems.label "S'ka elemente bllokuese">
+<!ENTITY filter.label "Filtruesi">
+<!ENTITY tooltip.size.label "Madhësia:">
+<!ENTITY reattach.label "Bashkëngjit">
+<!ENTITY search.label "Kërko: (&amp;S)">
+<!ENTITY docDomain.thirdParty "(të tretët)">
+<!ENTITY filterSource.label "Burimi i filtrit">
+<!ENTITY tooltip.docDomain.label "Burimi i dokumentit:">
+<!ENTITY context.copy.label "Kopjo adresën e elementit">
+<!ENTITY tooltip.type.label "Lloji:">
+<!ENTITY context.disablefilter.label "Çaktivizo filtruesin ?1?">
+<!ENTITY context.copyFilter.label "Kopjo filtruesin">
+<!ENTITY context.block.label "Blloko këtë send">
+<!ENTITY context.enablefilter.label "Ri mundëso filtruesin ?1?">
+<!ENTITY detach.label "Shkëput">
+<!ENTITY whitelisted.label "Lista e faqeve të lejueshme">
+<!ENTITY context.disablefilteronsite.label "Pamundëso filtruesin në ?1?">
+<!ENTITY detached.title "Adblock Plus: Artikuj per te bllokuar (i shkëputur)">
+<!ENTITY docDomain.firstParty "(të parët)">
+<!ENTITY tooltip.type.whitelisted "(lejuar)">
+<!ENTITY tooltip.filter.label "Filtri në përdorim:">
+<!ENTITY tooltip.filter.disabled "(qkyqur)">
+<!ENTITY context.editfilter.label "Vendos filtruesin në veprim">
+<!ENTITY tooltip.type.blocked "(bllokuar)">
+<!ENTITY size.label "Madhësia">
+<!ENTITY context.whitelist.label "shtoni përjashtim për sundimin artikull">
+<!ENTITY context.selectAll.label "Selekto të gjitha">
+<!ENTITY state.label "Gjendja">
+<!ENTITY docDomain.label "Burimi i dokumentit">
+<!ENTITY tooltip.address.label "Adresa:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/subscriptionSelection.dtd
new file mode 100644
index 0000000..e336024
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sq/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY list.download.failed "Adblock Plus dështoj të lidhet me listën e abonimeve.">
+<!ENTITY list.download.retry "Provo prap">
+<!ENTITY title.label "&amp;Titulli i abonimit:">
+<!ENTITY list.download.website "Shiko faqen">
+<!ENTITY viewList.label "Shiko filtrat">
+<!ENTITY visitHomepage.label "Vizito faqen kryesore">
+<!ENTITY addSubscription.label "Shto abonim">
+<!ENTITY dialog.title "Shtoi Adblock Plus filtër abonimi">
+<!ENTITY location.label "Vendi i &amp;listës së filtrit:">
+<!ENTITY fromWeb.description "Ju lutem konfirmoni që doni të shtoni këtë filtër abonimi. Ju mund ta ndryshoni emrin e abonimit ose vendëndodhjen para se ta konfirmoni.">
+<!ENTITY addMain.label "Add filter &amp;subscription &quot;?1?&quot; as well">
+<!ENTITY supplementMessage "This filter subscription is meant to be used with the filter subscription &quot;?1?&quot; which you are not using yet.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/composer.dtd
new file mode 100644
index 0000000..3a398e3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "на &amp;крају адреÑе">
+<!ENTITY domainRestriction.label "Ограничи на &amp;домен:">
+<!ENTITY collapse.default.no.label "Подразумевано (не)">
+<!ENTITY firstParty.label "Само Ñа о&amp;ве адреÑе">
+<!ENTITY preferences.label "&amp;Прикажи поÑтојеће филтере…">
+<!ENTITY pattern.label "Потражи образац">
+<!ENTITY thirdParty.label "Само Ñа други&amp;Ñ… адреÑа">
+<!ENTITY filter.label "Ðови &amp;филтер:">
+<!ENTITY collapse.label "&amp;Скупи блокирано:">
+<!ENTITY match.warning "Образац који Ñте унели више Ñе не поклапа Ñа адреÑом која треба да буде блокирана/одобрена и на њу неће утицати.">
+<!ENTITY anchor.start.label "на &amp;почетку адреÑе">
+<!ENTITY matchCase.label "&amp;Разликуј мала и велика Ñлова">
+<!ENTITY custom.pattern.label "&amp;Прилагођено:">
+<!ENTITY unselectAllTypes.label "Поништи избор">
+<!ENTITY type.whitelist.label "И&amp;зузетак">
+<!ENTITY regexp.warning "Образац који Ñте унели ће бити коришћен као регуларни израз. Превише регуларних израза може уÑпорити прегледач интернет Ñтрана. Уколико не намеравате да кориÑтите регуларне изразе, додајте Ñимбол * на крају обраÑца.">
+<!ENTITY dialog.title "Додавање правила за филтер Adblock Plus-а">
+<!ENTITY basic.label "ОÑновни приказ">
+<!ENTITY type.filter.label "Фи&amp;лтер за блокирање">
+<!ENTITY types.label "Примени на типове:">
+<!ENTITY shortpattern.warning "Образац који Ñте унели је прекратак за оптимизацију, превише таквих образаца може уÑпорити прегледач интернет Ñтрана. Препоручљиво је да кориÑтите дуже изразе као филтере.">
+<!ENTITY collapse.yes.label "Да">
+<!ENTITY anchors.label "Прихвати Ñамо образац:">
+<!ENTITY collapse.default.yes.label "Подразумевано (да)">
+<!ENTITY domainRestriction.help "Ðаведите један или више домена раздвојених знаком &quot;|&quot;. Филтер ће бити употребљен једино за ове домене. Знак &quot;~&quot; иÑпред домена значи да ће домен бити изузет од филтрирања.">
+<!ENTITY accept.label "Додај филтер">
+<!ENTITY options.label "Опције">
+<!ENTITY disabled.warning "Adblock Plus је тренутно иÑкључен. И даље можете додавати филтере, али ће они бити примењени тек kada [link]укључиte Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "на почетку &amp;домена">
+<!ENTITY collapse.no.label "Ðе">
+<!ENTITY selectAllTypes.label "Изабери Ñве">
+<!ENTITY advanced.label "Ðапредни приказ">
+<!ENTITY pattern.explanation "Образац може бити било који део адреÑе, Ñимбол * Ñе кориÑти као џокер. Филтер ће бити коришћен једино ако Ñе адреÑа Ñлаже Ñа обраÑцем.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/filters.dtd
new file mode 100644
index 0000000..0aae653
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Сви ваши прилагођени филтери ће бити замењени Ñа онима из изабрање датотеке. Желите ли да наÑтавите?">
+<!ENTITY slow.column "Спор&amp;и филтери">
+<!ENTITY enabled.column "Омогуће&amp;н">
+<!ENTITY subscription.lastDownload.checksumMismatch "ÐеуÑпело, неÑлагање извештаја">
+<!ENTITY noFiltersInGroup.text "Изабрана група је празна.">
+<!ENTITY subscription.actions.label "Радње">
+<!ENTITY filter.selectAll.label "Изабери Ñве">
+<!ENTITY backupButton.label "Ðап&amp;рави резервну копију и врати у претходно Ñтање">
+<!ENTITY restore.minVersion.warning "Ðапомена: датотека је направљена у новијој верзији додатка Adblock Plus. Требало би да доградите Adblock Plus на најновију верзију пре враћања претходног Ñтања из ове датотеке.">
+<!ENTITY restore.error "Подаци из датотеке ниÑу могли да буду обрађени. Да ли је то заиÑта датотека резерве копије Adblock Plus?">
+<!ENTITY sort.ascending.label "Од &amp;Рдо Ш">
+<!ENTITY sort.label "&amp;Сортирај по">
+<!ENTITY subscription.source.label "СпиÑак филтера">
+<!ENTITY hitcount.column "Бро&amp;ј погодака">
+<!ENTITY noFilters.text "Ðемате прилагођених филтера.">
+<!ENTITY backup.custom.title "Само прилагођени филтери">
+<!ENTITY subscription.external.label "Ðжурира други додатак">
+<!ENTITY subscription.delete.label "Избриши">
+<!ENTITY noGroupSelected.text "Морате да изаберете групу филтера да би њени филтери били приказани.">
+<!ENTITY filter.cut.label "ИÑеци">
+<!ENTITY restore.default.label "Врати претходно Ñтање од ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Преузимање...">
+<!ENTITY subscriptions.tab.label "Претплате на филтере">
+<!ENTITY sort.descending.label "Од &amp;Ш до Ð">
+<!ENTITY filters.remove.warning "Желите ли да уклоните Ñве изабране филтере?">
+<!ENTITY filter.delete.label "Избриши">
+<!ENTITY addSubscriptionAdd.label "Додај">
+<!ENTITY viewMenu.label "Приказ">
+<!ENTITY subscription.lastDownload.unknown "Ðепознато">
+<!ENTITY addSubscriptionCancel.label "Откажи">
+<!ENTITY subscription.enabled.label "Омогућено">
+<!ENTITY noSubscriptions.text "ÐиÑте додали ниједну претплату на филтер. Adblock Plus неће блокирати ништа без њих, па притиÑните „Додај претплату на филтерâ€.">
+<!ENTITY subscription.update.label "Ðжурирај филтере">
+<!ENTITY dialog.title "Подешавања Adblock Plus филтера">
+<!ENTITY addFilter.label "&amp;Додај филтер">
+<!ENTITY subscription.minVersion.warning "Ова претплата на филтер захтева новију верзију додатка Adblock Plus. Молимо Ð²Ð°Ñ Ð´Ð° унапредите додатак.">
+<!ENTITY subscription.lastDownload.invalidURL "ÐеуÑпело, неиÑправна адреÑа">
+<!ENTITY backup.error "Дошло је до грешке приликом чувања филтера у датотеку. Проверите да датотека није Ñамо за читање или је не корити нека друга апликација.">
+<!ENTITY filter.moveUp.label "Помери нагоре">
+<!ENTITY addGroup.label "Додај &amp;групу филтера">
+<!ENTITY filter.edit.label "Уреди">
+<!ENTITY subscription.showHideFilters.label "Прикажи/Ñакриј филтере">
+<!ENTITY acceptableAds2.label "Дозволи &amp;ненаметљиве рекламе">
+<!ENTITY addSubscriptionOther.label "Додај другу претплату">
+<!ENTITY close.label "Затвори">
+<!ENTITY sort.none.label "Ð&amp;епоређано">
+<!ENTITY filter.actions.label "Радње филтера">
+<!ENTITY filter.copy.label "Копирај">
+<!ENTITY filter.moveDown.label "Помери надоле">
+<!ENTITY filter.resetHitCounts.label "Поништи ÑтатиÑтике">
+<!ENTITY readMore.label "Сазнај више">
+<!ENTITY subscription.moveUp.label "Помери нагоре">
+<!ENTITY addSubscription.label "Додај &amp;претплату на филтер">
+<!ENTITY subscription.homepage.label "Матична Ñтраница">
+<!ENTITY backup.complete.title "Додај филтере и претплате">
+<!ENTITY restore.own.label "Врати ÑопÑтвено претходно Ñтање">
+<!ENTITY restore.complete.warning "Све ваша подешавања филтера ће бити замењена Ñа онима из изабране датотеке. Желите ли да наÑтавите?">
+<!ENTITY filters.tab.label "Прилагођени филтери">
+<!ENTITY backup.label "Ðаправи нову резервну копију">
+<!ENTITY find.label "Прона&amp;ђи">
+<!ENTITY subscription.moveDown.label "Помери надоле">
+<!ENTITY subscription.lastDownload.connectionError "ÐеуÑпело, грешка у преузимању">
+<!ENTITY subscription.lastDownload.success "УÑпешно">
+<!ENTITY subscription.lastDownload.invalidData "ÐеуÑпело, није лиÑта филтера">
+<!ENTITY filter.paste.label "Ðалепи">
+<!ENTITY subscription.disabledFilters.enable "Омогући онемогућене филтере">
+<!ENTITY lasthit.column "ПоÑ&amp;ледњи погодак">
+<!ENTITY subscription.editTitle.label "Уреди наÑлов">
+<!ENTITY subscription.disabledFilters.warning "Ðеки филтери Ñа ÑпиÑка Ñу онемогућени.">
+<!ENTITY filter.column "Правило &amp;филтера">
+<!ENTITY subscription.lastDownload.label "ПоÑледње преузимање:">
+<!ENTITY viewList.label "Погледај ÑпиÑак">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/firstRun.properties
new file mode 100644
index 0000000..cac5818
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Сурфујте приватно Ñа онемогућеним праћењем - Ñкривајући Ñе од рекламних компанија које прате Ñваки ваш потез.
+firstRun_toggle_off=ИÑкључен
+firstRun_feature_tracking=Онемогући праћење
+firstRun_feature_malware=Блокирање малвера
+firstRun_title=Adblock Plus је инÑталиран
+firstRun_toggle_on=Укључен
+firstRun_acceptableAdsExplanation=Желели биÑмо да охрабримо Ñајтове да кориÑте фер и ненападно оглашавање, и зато Ñмо покренули <a>Ñтриктан правилник</a> у циљу препознавања прихватљивих оглаÑа који је могуће видети под подразумеваним поÑтавкама. Ðко и даље желите да блокирате Ñве оглаÑе, можете <a>онемогућити</a> ову опцију.
+firstRun_contributor_credits=Кредитовани Ñарадници
+firstRun_dataCorruptionWarning=Да ли Ñе ова Ñтраница наÑтавља појављивати? <a>Кликните овде!</a>
+firstRun_acceptableAdsHeadline=ДоÑадне рекламе ће Ñада бити блокиране
+firstRun_share=Препоручите Ð½Ð°Ñ Ñвојим пријатељима
+firstRun_share_headline=<a>Помози нам</a> да интернет поÑтане боље меÑто
+firstRun_feature_social_description=ÐутоматÑки учините Ñурфовање оÑлобођеним од дугмића друштвених мрежа, као што Ñу "Facebook Like" дугме, који Ñе појављују на Ñтраницама и прате ваше понашање.
+firstRun_filterlistsReinitializedWarning=Изгледа да је проблем узроковао да Ñви филтери буду уклоњени, а резервне примерке није могуће повратити. Због тога Ñмо морали да вратимо поÑтавке филтера и дозвољених оглаÑа на подразумеване вредноÑти. Проверите лиÑте филтера и дозвољене оглаÑе у <a>опцијама Adblock Plus-а</a>.
+firstRun_feature_malware_description=Учините ваше Ñурфовање Ñигурнијим, блокирајући домене познате по злонамерним малвер програмима.
+firstRun_features=Adblock Plus може више од блокирања реклама
+firstRun_donate=Донирајте
+firstRun_donate_label=Подржите наш пројекат
+firstRun_feature_social=Уклоните дугмиће друштвених мрежа
+firstRun_legacySafariWarning=КориÑтите верзију Сафарија коју Adblock Plus не подржава, зато је могуће да неке веб Ñтранице неће бити оптимално приказане, или ABP уопште неће функциониÑати. Препоручујемо да унапредите Safari у задњу верзију, или да кориÑтите Мозила ФајерфокÑ, Гугл Кром или Опера браузер.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/global.properties
new file mode 100644
index 0000000..b7fe0ce
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Ðа овој Ñтрани нема Ñтавки које могу да Ñе блокирају
+action3_tooltip=Кликните да биÑте укључили/иÑкључили Adblock Plus.
+notification_antiadblock_title=Сакријте изабране поруке?
+type_label_script=Ñкрипт
+filter_elemhide_nocriteria=Ðије пронађен критеријум за препознавање елемента који ће бити Ñакривен.
+blockingGroup_title=Правила за блокирање реклама
+whitelisted_tooltip=Adblock Plus је онемогућен на тренутној Ñтрани.
+type_label_stylesheet=Ñтил
+blocked_count_tooltip=?1? од ?2?
+type_label_font=фонт
+type_label_popup=иÑкачући прозор
+filter_regexp_tooltip=Филтер је или регуларан израз или је прекратак за оптимизацију. Превише таквих филтера може уÑпорити ваш прегледач.
+action0_tooltip=Кликните да биÑте отворили приручни мени, а Ñредњи клик за укључивање/иÑкључивање.
+whitelisted_page=Adblock Plus је иÑкључен за ову Ñтрану
+remove_group_warning=Желите ли да уклоните ову групу?
+action1_tooltip=Кликните да биÑте отворили Ñтавке које Ñе могу блокирати, а Ñредњи клик за укључивање/иÑкључивање.
+type_label_xmlhttprequest=XML захтев
+active_tooltip=Adblock Plus је омогућен, ?1? претплата на филтере, ?2? прилагођених филтера у употреби.
+type_label_document=документ
+type_label_object_subrequest=подзахтев за објектом
+whitelistGroup_title=Правила за изузетке
+disabled_tooltip=Adblock Plus је онемогућен.
+filter_elemhide_duplicate_id=Да би Ñте Ñакрили елеменат, морате дати Ñамо један идентитет елемента.
+type_label_object=објекат
+action2_tooltip=Кликните да биÑте отворили подешавања, а Ñредњи клик за омогућавање/онемогућавање.
+type_label_subdocument=оквир
+clearStats_warning=Ово ће поништити ÑтатиÑтике Ñвих филтера и онемогућити даље бројање. Желите ли да наÑтавите?
+notification_antiadblock_message=Познато је да овај Ñајт приказује циљане поруке кориÑницима Adblock Plus-а. Желите ли да Ñакријете те поруке?
+blocked_count_addendum=(такође допуштено: ?1?, Ñакривено: ?2?)
+subscription_invalid_location=ÐеиÑправна адреÑа и име датотеке Ñа ÑпиÑком филтера.
+type_label_image=Ñлика
+remove_subscription_warning=Желите ли да уклоните ову претплату?
+type_label_other=друго
+mobile_menu_enable=ABP: омогући
+type_label_media=аудио/видео
+mobile_menu_disable_site=ABP: онемогући на ?1?
+elemhideGroup_title=Правила за блокирање елемената
+mobile_menu_enable_site=ABP: омогући на ?1?
+type_label_elemhide=Ñакривен
+newGroup_title=Ðова група филтера
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/overlay.dtd
new file mode 100644
index 0000000..52b43c7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Да">
+<!ENTITY notification.button.no "&amp;Ðе">
+<!ENTITY sync.label "ПоÑтавке &amp;уÑклађивања Adblock Plus-а">
+<!ENTITY whitelist.site.label "Онемогући на ?1?">
+<!ENTITY filters.label "Подешавања &amp;филтера">
+<!ENTITY disable.label "Онемогући Ñвуда">
+<!ENTITY objecttab.title "Блокирај">
+<!ENTITY objecttab.tooltip "Кликните овде да биÑте блокирали објекат помоћу Adblock Plus-а">
+<!ENTITY menuitem.label "Adblock Plus - подеша&amp;вања">
+<!ENTITY objecttabs.label "Прикажи &amp;језичак на Flash и Java објектима">
+<!ENTITY sendReport.label "&amp;Пријави проблеме на овој Ñтраници">
+<!ENTITY whitelist.page.label "Онемогући Ñамо на овој Ñтраници">
+<!ENTITY context.image.label "Блокирај Ñлику">
+<!ENTITY counthits.label "Бр&amp;ој поготке филтера">
+<!ENTITY opensidebar.label "О&amp;твори Ñтавке које Ñе могу блокирати">
+<!ENTITY notification.button.close "&amp;Затвори">
+<!ENTITY contribute.label "ДопринеÑите Adblock Plus-у">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Блокирај оквир">
+<!ENTITY blocked.tooltip "Блокиране Ñтавке на овој Ñтрани:">
+<!ENTITY hideplaceholders.label "Сакриј &amp;држаче елемената блокираних Ñтавки">
+<!ENTITY showinstatusbar.label "Прикажи у &amp;ÑтатуÑној траци">
+<!ENTITY sidebar.title "Ставке које Ñе могу блокирати на овој Ñтраници">
+<!ENTITY options.label "Оп&amp;ције">
+<!ENTITY context.object.label "Блокирај објекат">
+<!ENTITY context.removeWhitelist.label "Поново укључи на овој Ñтраници">
+<!ENTITY filters.tooltip "Ðајактивнији филтери:">
+<!ENTITY closesidebar.label "За&amp;твори Ñтавке које Ñе могу блокирати">
+<!ENTITY showintoolbar.label "Прикажи у &amp;траци Ñа алаткама">
+<!ENTITY status.tooltip "Стање:">
+<!ENTITY context.media.label "Блокирај аудио/видео">
+<!ENTITY subscription.update.label "Ðжурирај филтере">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/sendReport.dtd
new file mode 100644
index 0000000..de0adef
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Опозови">
+<!ENTITY issues.disabledgroups.description "Следећа претплата на филтер претплату, или групу филтера је иÑкључена, и можда има утицаја на Ñтраницу:">
+<!ENTITY showData.label "Прикажи податке у извештају">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus блокира превише (&amp;м)">
+<!ENTITY issues.change.description "Ваша подешавања Ñу измењена. Поново учитајте Ñтраницу да биÑте видели промене, па пошаљите извештај ако проблем и даље није решен.">
+<!ENTITY email.label "Е-мејл: (&amp;а)">
+<!ENTITY issues.openPreferences.label "Отвори подешавања филтера">
+<!ENTITY sendPage.confirmation "Ваш извештај је Ñачуван. Можете да му приÑтупите на Ñледећој адреÑи:">
+<!ENTITY copyLink.label "Копирај &amp;везу до извештаја">
+<!ENTITY issues.nofilters.description "Adblock Plus не блокира ништа на тренутној Ñтраници. Овај проблем највероватније није повезан Ñа Ñа Adblock Plus-ом.">
+<!ENTITY sendPage.knownIssue "Проблем који Ñте пријавили је вероватно већ познат. Више информација:">
+<!ENTITY typeSelector.other.description "Изаберите ову опцију ако миÑлите да Ñâм Adblock Plus узрокује проблем, а не филтери.">
+<!ENTITY issues.disabledgroups.enable.label "Омогући претплату на филтер/групу филтера">
+<!ENTITY typeWarning.override.label "&amp;Разумем и ипак желим да пошаљем извештај">
+<!ENTITY issues.disabled.enable.label "Омогући Adblock Plus">
+<!ENTITY update.fixed.description "Претплате на ваш филтер Ñу вероватно већ отклониле проблем који Ñте пријавили. Поново учитајте Ñтраницу, па покушајте поново. Ðко проблем и даље поÑтоји, поново га пријавите.">
+<!ENTITY anonymous.label "&amp;Ðнонимна пријава">
+<!ENTITY reloadButton.label "&amp;Поново учитај Ñтраницу">
+<!ENTITY recentReports.clear.label "Уклони Ñве п&amp;ријаве">
+<!ENTITY typeSelector.description "Овај прозор ће Ð’Ð°Ñ Ð²Ð¾Ð´Ð¸Ñ‚Ð¸ кроз кораке за решавање проблема у Adblock Plus-у и њихово пријављивање. За почетак, изаберите врÑту проблема на који Ñте наишли на овој Ñтраници:">
+<!ENTITY screenshot.remove.label "&amp;Уклони приватне податке">
+<!ENTITY issues.ownfilters.description "Ðеке филтере примењене на овој Ñтраници Ñу Ñтворили кориÑници. Онемогућите оне за које миÑлите да би могли бити узрок проблема.">
+<!ENTITY update.inProgress.description "Adblock Plus мора ажурирати ваше претплате на филтере ради како би проверио да ли је проблем већ отклоњен. Сачекајте...">
+<!ENTITY sendPage.retry.label "Поново пошаљи">
+<!ENTITY data.label "П&amp;одаци у извештају:">
+<!ENTITY recentReports.label "Ваши недавно поÑлати извештаји">
+<!ENTITY typeWarning.description "Ðавели Ñте да желите пријавити општи проблем Ñа Adblock Plus-ом, а не Ñа филтером. Имајте на уму да је такве проблеме најбоље пријавити на [link]форуму Adblock Plus-а[/link]. Овај ÑиÑтем за пријављивање биÑте требали да кориÑтите Ñамо као допуну раÑправи, јер нико неће видети Ваш извештај док му не даднете везу до њега. ÐутоматÑки направљену везу ћете добити одмах након Ñлања извештаја.">
+<!ENTITY issues.disabled.description "Adblock Plus је онемогућен и ништа неће блокирати.">
+<!ENTITY attachExtensions.label "Приложите ÑпиÑак омогућених &amp;додатака у извештај, у Ñлучају да њихов Ñукоб доводи до проблема.">
+<!ENTITY issues.nosubscriptions.add.label "Додај претплату на филтер">
+<!ENTITY issues.disabledfilters.enable.label "Омогућите филтер">
+<!ENTITY issues.override.label "Подешавања Ñу &amp;иÑправна. ÐаÑтави Ñа пријављивањем.">
+<!ENTITY issues.nosubscriptions.description "Изгледа да ниÑте претплаћени ни на један ÑпиÑак филтера који аутоматÑки уклањају нежељени Ñадржај Ñа Ñтраница.">
+<!ENTITY typeSelector.falsePositive.description "Изаберите ову опцију ако Ñтраници недоÑтају неки битни Ñадржаји, погрешно изгледа или не ради како треба. Пробајте да привремено онемогућите Adblock Plus, па проверите да ли је онда Ñве у реду.">
+<!ENTITY typeSelector.other.label "Други проблем (&amp;т)">
+<!ENTITY emailComment.label "Молимо Ð²Ð°Ñ Ð´Ð° унеÑете важећу и-мејл адреÑу да биÑмо могли да Ð²Ð°Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð¸Ñ€Ð°Ð¼Ð¾ уколико има питања у вези Ñа вашом пријавом. Такође, то ће нам допуÑтити да препознамо ваше доприноÑе и да им дамо већу важноÑÑ‚.">
+<!ENTITY issues.whitelist.remove.label "Омогући Adblock Plus на овој Ñтраници">
+<!ENTITY outdatedSubscriptions.description "Следеће претплате на филтере ноÑу ажуриране више од две Ñедмице. Ðжурирајте их пре него што пријавите проблем, јер би га то могло отклонити.">
+<!ENTITY dataCollector.description "Сачекајте неколико тренутака док Adblock Plus прибави потребне податке.">
+<!ENTITY sendButton.label "&amp;Пошаљите извештај">
+<!ENTITY comment.label "&amp;Коментар (произвољно):">
+<!ENTITY sendPage.errorMessage "Покушај Ñлања извештаја није уÑпео - грешка „?1?â€. Уверите Ñе да Ñте повезани Ñа Интернетом, па покушајте поново. Ðко проблем и даље поÑтоји, помоћ потражите на [link]форуму Adblock Plus-а[/link].">
+<!ENTITY showRecentReports.label "Прикажи недавно поÑлате пријаве">
+<!ENTITY commentPage.heading "УнеÑи коментар">
+<!ENTITY update.start.label "Ðжурирај">
+<!ENTITY issues.disabledfilters.description "Следећи филтери, иако онемогућени, можда имају утицаја на Ñтраницу:">
+<!ENTITY screenshot.description "ИÑта Ñтраница може да изгледа различито код различитих оÑоба, и помогло би нам ако приложите Ñнимак проблема који пријављујете. Можете да уклоните или замаÑкирате приватне информације, а да биÑте то учинили кликните одговарајуће дугме, и мишем изаберите жељени део Ñлике.">
+<!ENTITY screenshot.attach.label "Приложите Ñнимак Ñ&amp;транице уз извештај">
+<!ENTITY issues.whitelist.description "Adblock Plus је тренутно онемогућен на Ñтраници коју пријављујете. Омогућите га и поново учитајте Ñтраницу пре него што пошаљете молбу за иÑпитивање проблема.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus не блокира рекламу/е (&amp;в)">
+<!ENTITY typeSelector.heading "Изаберите врÑту проблема">
+<!ENTITY anonymity.warning "Ðећемо бити у могућноÑти да поново допремо до Ð²Ð°Ñ Ð¸ то ће вероватно Ñнизити приоритет пријаве.">
+<!ENTITY wizard.title "Пријављивање грешака">
+<!ENTITY issues.ownfilters.disable.label "Онемогући филтер">
+<!ENTITY commentPage.description "Доње поље за текÑÑ‚ омогућава вам да додате коментар, како биÑте нам помогли да лакше Ñхватимо проблем. Овај корак је произвољан али је пожељан, ако проблем није лако уочљив. Можете и да још једном прегледате извештај пре него што га пошаљете.">
+<!ENTITY comment.lengthWarning "Дужина вашег коментара прелази 1000 знакова. Само првих 1000 знакова ће бити поÑлато.">
+<!ENTITY typeSelector.falseNegative.description "Изаберите ову опцију ако је реклама приказана иако је Adblock Plus омогућен.">
+<!ENTITY sendPage.waitMessage "Сачекајте док Adblock Plus не пошаље Ваш извештај.">
+<!ENTITY dataCollector.heading "Добро дошли у део за пријаву грешака">
+<!ENTITY screenshot.heading "Приложи Ñнимак">
+<!ENTITY sendPage.heading "Пошаљи извештај">
+<!ENTITY issues.subscriptionCount.description "Изгледа да Ñте Ñе претплатили на превише филтера. То није препоручљиво, јер повећава вероватноћу да наÑтану проблеми. Поред тога, не можемо да прихватимо ваш извештај о грешкама јер је нејаÑно која претплата на филтер Ñадржи грешку. Молимо Ð²Ð°Ñ Ð´Ð° уклоните Ñве непотребне претплате на филтере и проверите да ли још увек има проблема.">
+<!ENTITY screenshot.mark.label "О&amp;значи проблем">
+<!ENTITY privacyPolicy.label "Политика приватноÑти">
+<!ENTITY issues.description "Adblock Plus је уочио проблем Ñа Вашим подешавањима, што може бити узрок овог проблема или отежати његово иÑпитивање.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/sidebar.dtd
new file mode 100644
index 0000000..98f3a7e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "ОÑветли границе Ñтавке">
+<!ENTITY address.label "ÐдреÑа">
+<!ENTITY context.open.label "Отвори на новом лиÑту">
+<!ENTITY type.label "Ð’Ñ€Ñта">
+<!ENTITY tooltip.filterSource.label "Извор филтера:">
+<!ENTITY noitems.label "Ðема Ñтавки за блокирање">
+<!ENTITY filter.label "Филтер">
+<!ENTITY tooltip.size.label "Величина:">
+<!ENTITY reattach.label "Поново Ñпоји">
+<!ENTITY search.label "&amp;Тражи:">
+<!ENTITY docDomain.thirdParty "(трећа Ñтрана)">
+<!ENTITY filterSource.label "Извор филтера">
+<!ENTITY tooltip.docDomain.label "Извор документа:">
+<!ENTITY context.copy.label "Умножи адреÑу Ñтавке">
+<!ENTITY tooltip.type.label "Ð’Ñ€Ñта:">
+<!ENTITY context.disablefilter.label "Онемогући филтер ?1?">
+<!ENTITY context.copyFilter.label "Умножи филтер">
+<!ENTITY context.block.label "Блокирај ову Ñтавку">
+<!ENTITY context.enablefilter.label "Омогући филтер ?1?">
+<!ENTITY detach.label "Одвоји">
+<!ENTITY whitelisted.label "Бела лиÑта">
+<!ENTITY context.disablefilteronsite.label "Онемогући овај филтер на ?1?">
+<!ENTITY detached.title "Adblock Plus: Ñтавке које Ñе могу блокирати (одвојено)">
+<!ENTITY docDomain.firstParty "(прва Ñтрана)">
+<!ENTITY tooltip.type.whitelisted "(на белој лиÑти)">
+<!ENTITY tooltip.filter.label "Коришћени филтер:">
+<!ENTITY tooltip.filter.disabled "(онемогућено)">
+<!ENTITY context.editfilter.label "Уреди коришћени филтер">
+<!ENTITY tooltip.type.blocked "(блокирано)">
+<!ENTITY size.label "Величина">
+<!ENTITY context.whitelist.label "Додај изузетак за Ñтавку">
+<!ENTITY context.selectAll.label "Изабери Ñве">
+<!ENTITY state.label "СтатуÑ">
+<!ENTITY docDomain.label "Извор документа">
+<!ENTITY tooltip.address.label "ÐдреÑа:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/subscriptionSelection.dtd
new file mode 100644
index 0000000..dd6291f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sr/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Д&amp;одај и претплату на филтер „?1?â€">
+<!ENTITY list.download.failed "Adblock Plus није уÑпео да набави нови ÑпиÑак претплата.">
+<!ENTITY list.download.retry "Покушај поново">
+<!ENTITY title.label "&amp;Ðазив претплате:">
+<!ENTITY list.download.website "Отвори веб Ñтраницу">
+<!ENTITY supplementMessage "Ова претплата на филтер је предвиђена за коришћење Ñа филтером „?1?†који још увек не кориÑтите.">
+<!ENTITY viewList.label "Погледај филтере">
+<!ENTITY visitHomepage.label "ПоÑети матичну Ñтраницу">
+<!ENTITY addSubscription.label "Додај претплату">
+<!ENTITY dialog.title "Претплата на филтере Adblock Plus-а">
+<!ENTITY location.label "&amp;Локација ÑпиÑка Ñа филтерима:">
+<!ENTITY fromWeb.description "Потврдите да желите додати претплату на овај филтер (можете променити назив или локацију претплате пре додавања).">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/composer.dtd
new file mode 100644
index 0000000..b16c505
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "I slutet av adressen">
+<!ENTITY domainRestriction.label "Begränsa till domän:">
+<!ENTITY collapse.default.no.label "Standard (nej)">
+<!ENTITY firstParty.label "Endast första part">
+<!ENTITY preferences.label "Visa existerande filter…">
+<!ENTITY pattern.label "Sök efter mönster">
+<!ENTITY thirdParty.label "Endast tredje part">
+<!ENTITY filter.label "Nytt filter:">
+<!ENTITY collapse.label "Dölj blockerade:">
+<!ENTITY match.warning "Mönstret du har angivit matchar inte längre adressen som skall blockeras/undantas och kommer därför inte att påverka den.">
+<!ENTITY anchor.start.label "I början av adressen">
+<!ENTITY matchCase.label "S&amp;kiftlägeskänslig">
+<!ENTITY custom.pattern.label "Eget:">
+<!ENTITY unselectAllTypes.label "Välj ingen">
+<!ENTITY type.whitelist.label "Regel för &amp;undantag">
+<!ENTITY regexp.warning "Mönstret du angivit hanteras som ett reguljärt uttryck. Många reguljära uttryck kan göra din surfning långsam. Om du inte avsåg att använda reguljära uttryck, lägg till en asterisk (*) i slutet av mönstret.">
+<!ENTITY dialog.title "Lägg till filterregel för Adblock Plus">
+<!ENTITY basic.label "Standard">
+<!ENTITY type.filter.label "Blockerande filter">
+<!ENTITY types.label "Verkställ för:">
+<!ENTITY shortpattern.warning "Detta mönster är för kort för optimal prestanda och för många sådana mönster kan göra din surfning långsam. Det rekommenderas att använda längre strängar för detta filter.">
+<!ENTITY collapse.yes.label "Ja">
+<!ENTITY anchors.label "Acceptera endast mönster:">
+<!ENTITY collapse.default.yes.label "Standard (ja)">
+<!ENTITY domainRestriction.help "Ange en eller flera domäner avgränsade med lodrätt streck (|). Filtret kommer endast att tillämpas på dessa valda domäner(na). Tilde-tecknet (~) framför en domän anger att filtret inte kommer att användas för den domänen.">
+<!ENTITY accept.label "Lägg till filter">
+<!ENTITY options.label "Inställningar">
+<!ENTITY disabled.warning "Adblock Plus är inaktiverat. Du kan lägga till filter, men de kan inte användas förrän du [link]aktiverar Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "I början av domännamnet">
+<!ENTITY collapse.no.label "Nej">
+<!ENTITY selectAllTypes.label "Markera alla">
+<!ENTITY advanced.label "Avancerat">
+<!ENTITY pattern.explanation "Mönster är en del av en adress, symbolen * är jokertecken. Filtret används endast på adresser som matchar mönstret.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/filters.dtd
new file mode 100644
index 0000000..822ef32
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Alla dina egna filter kommer att ersättas av innehållet i den valda filen. Vill du fortsätta?">
+<!ENTITY slow.column "&amp;LÃ¥ngsamma filter">
+<!ENTITY enabled.column "P&amp;Ã¥">
+<!ENTITY subscription.lastDownload.checksumMismatch "Fel kontrollsumma">
+<!ENTITY noFiltersInGroup.text "Den markerade gruppen är tom">
+<!ENTITY subscription.actions.label "Åtgärder">
+<!ENTITY filter.selectAll.label "Markera alla">
+<!ENTITY backupButton.label "Säkerhetskopiera och &amp;Återställ">
+<!ENTITY restore.minVersion.warning "Varning: Filen har skapats med en nyare version av Adblock Plus. Du bör uppdatera till den senaste Adblock Plus-versionen innan du återställer från denna fil.">
+<!ENTITY restore.error "Filens data kunde inte bearbetas. Kanske är det här inte en Adblock Plus-säkerhetskopiefil?">
+<!ENTITY sort.ascending.label "Sortera A &gt; Ö">
+<!ENTITY sort.label "Sor&amp;tering">
+<!ENTITY subscription.source.label "Filterlista">
+<!ENTITY hitcount.column "Tr&amp;äffar">
+<!ENTITY noFilters.text "Du har inga egna filter än.">
+<!ENTITY backup.custom.title "Endast egna filter">
+<!ENTITY subscription.external.label "Uppdateras av ett annat tillägg">
+<!ENTITY subscription.delete.label "Ta bort">
+<!ENTITY noGroupSelected.text "Du måste markera en filtergrupp innan dess filter kan visas.">
+<!ENTITY filter.cut.label "Klipp ut">
+<!ENTITY restore.default.label "Återställ säkerhetskopia från ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Hämtar…">
+<!ENTITY subscriptions.tab.label "Filterprenumerationer">
+<!ENTITY sort.descending.label "Sortera &amp;Ö &gt; A">
+<!ENTITY filters.remove.warning "Vill du verkligen ta bort alla markerade filter?">
+<!ENTITY filter.delete.label "Ta bort">
+<!ENTITY addSubscriptionAdd.label "Lägg till">
+<!ENTITY viewMenu.label "Visa">
+<!ENTITY subscription.lastDownload.unknown "Okänt">
+<!ENTITY addSubscriptionCancel.label "Avbryt">
+<!ENTITY subscription.enabled.label "Aktiverat">
+<!ENTITY noSubscriptions.text "Du har inte lagt till några filterprenumerationer än. Adblock Plus kommer inte blockera någonting utan filter. Använd &quot;Lägg till filterprenumeration&quot; för att lägga till några.">
+<!ENTITY subscription.update.label "Uppdatera filter">
+<!ENTITY dialog.title "Filterinställningar för Adblock Plus">
+<!ENTITY addFilter.label "Lägg till &amp;filter">
+<!ENTITY subscription.minVersion.warning "Denna filterprenumeration kräver en nyare version av Adblock Plus, du bör uppdatera till den senaste Adblock Plus-versionen.">
+<!ENTITY subscription.lastDownload.invalidURL "Ogiltig adress">
+<!ENTITY backup.error "Det uppstod ett fel vid skrivning av filter till filen. Säkerställ att filen inte är skrivskyddad eller används av ett annat program.">
+<!ENTITY filter.moveUp.label "Flytta uppåt">
+<!ENTITY addGroup.label "Lägg till filtergrupp">
+<!ENTITY filter.edit.label "Redigera">
+<!ENTITY subscription.showHideFilters.label "Visa/dölj filter">
+<!ENTITY acceptableAds2.label "Tillåt viss icke-störande reklam">
+<!ENTITY addSubscriptionOther.label "Lägg till en ny prenumeration">
+<!ENTITY close.label "Stäng">
+<!ENTITY sort.none.label "&amp;Osorterad">
+<!ENTITY filter.actions.label "Filteråtgärder">
+<!ENTITY filter.copy.label "Kopiera">
+<!ENTITY filter.moveDown.label "Flytta nedåt">
+<!ENTITY filter.resetHitCounts.label "Återställ träffstatistik">
+<!ENTITY readMore.label "Läs mer">
+<!ENTITY subscription.moveUp.label "Flytta uppåt">
+<!ENTITY addSubscription.label "Lägg till filter&amp;prenumeration">
+<!ENTITY subscription.homepage.label "Webbplats">
+<!ENTITY backup.complete.title "Alla filter och prenumerationer">
+<!ENTITY restore.own.label "Återställ egen säkerhetskopia">
+<!ENTITY restore.complete.warning "Alla dina filterinställningar kommer att ersättas av innehållet i den valda filen. Vill du fortsätta?">
+<!ENTITY filters.tab.label "Egna filter">
+<!ENTITY backup.label "Skapa ny säkerhetskopia">
+<!ENTITY find.label "Sö&amp;k">
+<!ENTITY subscription.moveDown.label "Flytta nedåt">
+<!ENTITY subscription.lastDownload.connectionError "Fel vid hämtning">
+<!ENTITY subscription.lastDownload.success "Klart">
+<!ENTITY subscription.lastDownload.invalidData "Fel vid validering av filter">
+<!ENTITY filter.paste.label "Klistra in">
+<!ENTITY subscription.disabledFilters.enable "Aktivera inaktiverade filter">
+<!ENTITY lasthit.column "Senaste t&amp;räff">
+<!ENTITY subscription.editTitle.label "Redigera rubrik">
+<!ENTITY subscription.disabledFilters.warning "Vissa filter i denna prenumeration är inaktiverade.">
+<!ENTITY filter.column "Filterregler">
+<!ENTITY subscription.lastDownload.label "Senast hämtat:">
+<!ENTITY viewList.label "Visa lista">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/firstRun.properties
new file mode 100644
index 0000000..5381477
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Surfa privat genom att inaktivera spårning - dölj dina spår från reklamföretag som vill spåra dina rörelser.
+firstRun_toggle_off=AV
+firstRun_feature_tracking=Inaktivera Spårning
+firstRun_feature_malware=Malwareblockering
+firstRun_title=Adblock Plus har installerats
+firstRun_acceptableAdsExplanation=Vi vill uppmuntra webbplatser att använda enkel, diskret reklam. Det är därför vi har fastställt <a>strikta riktlinjer</a> för att identifiera acceptabla annonser, som visas under standardinställningar. Om du fortfarande vill blockera alla annonser kan du <a>inaktivera</a> detta inom ett par sekunder.
+firstRun_toggle_on=PÃ…
+firstRun_contributor_credits=Tack till
+firstRun_dataCorruptionWarning=Fortsätter denna sida att visas? <a>Klicka här!</a>
+firstRun_acceptableAdsHeadline=Irriterande annonser blockeras nu
+firstRun_share=Berätta för dina vänner
+firstRun_share_headline=<a>Hjälp oss</a> att göra webben till en bättre plats
+firstRun_features=Adblock Plus kan göra mer än att blockera reklam
+firstRun_feature_malware_description=Göra din surfning säkrare genom att blockera kända skadliga domäner.
+firstRun_feature_social_description=Förbättrar automatiskt din webbupplevelse genom borttagning av sociala medier knappar, såsom Facebook Gilla, som visas på webbsidor och spåra ditt beteende.
+firstRun_donate=donera
+firstRun_donate_label=Stöd vårt projekt
+firstRun_feature_social=Ta bort knappar för Sociala Medier
+firstRun_legacySafariWarning=Du använder en äldre version av Safari som inte stödjs av Adblock Plus. Adblock Plus kanske inte fungerar korrekt eller försämrar användarupplevelsen på vissa hemsidor. Vi rekommenderar starkt att antingen uppdatera till Safari 6.1.1 eller högre (tillgänglig på OS X 10.8 Mountain Lion), Safari 7.0.1 eller högre (tillgänglig på OS X 10.9 Mavericks), eller att använda den senaste versionen av Mozilla Firefox, Google Chrome eller Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/global.properties
new file mode 100644
index 0000000..0bf2eab
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Det finns inget att blockera på denna sida
+action3_tooltip=Klicka för att slå på/av Adblock Plus.
+notification_antiadblock_title=Göm riktade budskap?
+type_label_script=skript
+filter_elemhide_nocriteria=Inga villkor för att gömma element har uppfyllts
+blockingGroup_title=Reklamblockeringsregler
+whitelisted_tooltip=Adblock Plus är på, men inaktiverat för denna sida.
+type_label_stylesheet=formatmall
+blocked_count_tooltip=?1? av ?2?
+type_label_font=teckensnitt
+type_label_popup=popupfönster
+filter_regexp_tooltip=Detta filter är ett reguljärt uttryck eller för kort för optimal funktion. För många av dessa filter kan göra din surfning långsam.
+action0_tooltip=Klicka för meny, mittenklicka för att slå på/av Adblock Plus.
+whitelisted_page=Adblock Plus är inaktiverat på denna sida
+remove_group_warning=Vill du verkligen radera denna grupp?
+action1_tooltip=Klicka för att öppna/stänga listan med blockerbara objekt, mittenklicka för att slå på/av Adblock Plus.
+type_label_xmlhttprequest=XML-förfrågan
+active_tooltip=Adblock Plus är aktiverat, ?1? filterprenumeration(er) och ?2? egna filter används.
+type_label_document=dokument
+type_label_object_subrequest=objektunderförfrågan
+whitelistGroup_title=Undantagsregler
+disabled_tooltip=Adblock Plus är av.
+filter_elemhide_duplicate_id=Endast ett ID får anges för elementet som skall döljas
+type_label_object=objekt
+action2_tooltip=Klicka för att öppna inställningarna, mittenklicka för att slå på/av Adblock Plus.
+type_label_subdocument=ram
+clearStats_warning=Detta kommer att återställa all filterträffstatistik och inaktivera räkning av filterträffar. Vill du fortsätta?
+notification_antiadblock_message=Denna webbplats har varit känt för att visa riktade budskap till Adblock Plus användare. Vill du Adblock Plus att dölja riktade budskap?
+blocked_count_addendum=(undantagna: ?1?, dolda: ?2?)
+subscription_invalid_location=Platsen du angivit är antingen ogiltig eller så har du angivit ett felaktigt filnamn.
+type_label_image=bild
+remove_subscription_warning=Vill du verkligen ta bort denna prenumeration?
+type_label_other=annan
+mobile_menu_enable=ABP: Aktivera
+type_label_media=ljud/video
+mobile_menu_disable_site=ABP: Inaktivera för ?1?
+elemhideGroup_title=Elementdöljningsregler
+mobile_menu_enable_site=ABP: Aktivera för ?1?
+type_label_elemhide=dold
+newGroup_title=Ny filtergrupp
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/overlay.dtd
new file mode 100644
index 0000000..9e5694a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "Jag">
+<!ENTITY notification.button.no "Nej">
+<!ENTITY sync.label "Syn&amp;kronisera Adblock Plus inställningar">
+<!ENTITY whitelist.site.label "Använd inte på ?1?">
+<!ENTITY filters.label "Filterinställningar">
+<!ENTITY disable.label "Inaktivera för alla domäner">
+<!ENTITY objecttab.title "Blockera">
+<!ENTITY objecttab.tooltip "Klicka här för att blockera detta objekt med Adblock Plus">
+<!ENTITY menuitem.label "Inställning&amp;ar för Adblock Plus">
+<!ENTITY objecttabs.label "&amp;Visa flik vid Flash- och Java-reklam">
+<!ENTITY sendReport.label "Rapportera problem på denna sida">
+<!ENTITY whitelist.page.label "Använd inte på denna sida">
+<!ENTITY context.image.label "Adblock Plus: Blockera bild">
+<!ENTITY counthits.label "Räkna an&amp;talet filterträffar">
+<!ENTITY opensidebar.label "Visa lista över blockerbara objekt">
+<!ENTITY notification.button.close "Sluta">
+<!ENTITY contribute.label "Bidra till Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Blockera ram">
+<!ENTITY blocked.tooltip "Blockerade objekt på denna sida:">
+<!ENTITY hideplaceholders.label "Dölj platshållare för blockerade element">
+<!ENTITY showinstatusbar.label "Visa i statusfältet">
+<!ENTITY sidebar.title "Blockerbara objekt på denna sida">
+<!ENTITY options.label "Alter&amp;nativ">
+<!ENTITY context.object.label "Adblock Plus: Blockera objekt">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Återaktivera på denna sida">
+<!ENTITY filters.tooltip "Mest aktiva filter:">
+<!ENTITY closesidebar.label "Stäng listan över blockerbara objekt">
+<!ENTITY showintoolbar.label "Visa i verktygs&amp;fältet">
+<!ENTITY status.tooltip "Status:">
+<!ENTITY context.media.label "Adblock Plus: Blockera ljud/video">
+<!ENTITY subscription.update.label "Uppdatera filter">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/sendReport.dtd
new file mode 100644
index 0000000..36e35d5
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Ã…ngra">
+<!ENTITY issues.disabledgroups.description "Följande filterprenumerationer/filtergrupper är inaktiverade, men kan trots det påverka denna sida:">
+<!ENTITY showData.label "Visa rapportdata">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus blockerar alltför &amp;mycket">
+<!ENTITY issues.change.description "Your configuration has been changed. Var vänlig uppdatera sidan för att testa ändringarna och skicka in en rapport om problemet inte har blivit löst trots förändringarna.">
+<!ENTITY email.label "&amp;E-Post:">
+<!ENTITY issues.openPreferences.label "Öppna filterinställningarna">
+<!ENTITY sendPage.confirmation "Din rapport har sparats. Du kan nå den på följande adress:">
+<!ENTITY copyLink.label "&amp;Kopiera rapportlänk">
+<!ENTITY issues.nofilters.description "Adblock Plus blockerar ingenting på den aktuella sidan. Problemet du har observerat har sannolikt ingenting att göra med Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Problemet du rapporterade är antagligen redan känt. Mer information:">
+<!ENTITY typeSelector.other.description "Välj detta alternativ om du misstänker ett problem med själva tillägget Adblock Plus, snarare än med dess filter.">
+<!ENTITY issues.disabledgroups.enable.label "Aktivera filterprenumeration/filtergrupp">
+<!ENTITY typeWarning.override.label "&amp;Jag förstår och vill skicka in rapporten i alla fall">
+<!ENTITY issues.disabled.enable.label "Aktivera Adblock Plus">
+<!ENTITY update.fixed.description "Uppdateringarna till dina filterprenumerationer löste troligtvis problemet du rapporterade. Var vänlig och uppdatera den berörda sidan och försök igen, tryck Skicka på nytt om ditt problem kvarstår.">
+<!ENTITY anonymous.label "Skick&amp;a in anonymt">
+<!ENTITY reloadButton.label "&amp;Uppdatera sidan">
+<!ENTITY recentReports.clear.label "&amp;Ta bort alla rapporter">
+<!ENTITY typeSelector.description "Denna dialog kommer att guida dig igenom alla steg som krävs för att skicka in en problemrapport för Adblock Plus. Först och främst måste du välja den typ av problem som du upplever på denna sida:">
+<!ENTITY screenshot.remove.label "Ta b&amp;ort känslig data">
+<!ENTITY issues.ownfilters.description "Några av de filter som tillämpas på denna sida är användardefinierade. Var vänlig inaktivera de filter som kan ha orsakat problemet:">
+<!ENTITY update.inProgress.description "Adblock Plus behöver uppdatera dina filterprenumerationer för att kontrollera att ditt problem inte redan är löst.">
+<!ENTITY sendPage.retry.label "Skicka igen">
+<!ENTITY data.label "Ra&amp;pportdata:">
+<!ENTITY recentReports.label "Dina senaste inskickade rapporter">
+<!ENTITY typeWarning.description "Du har angivit att du vill rapportera ett allmänt problem med Adblock Plus snarare än ett problem med filtren. Var vänlig observera att sådana problem helst skall rapporteras i [link]Adblock Plus webbforum[/link]. Du bör endast använda problemrapportören för att göra ett tillägg till en befintlig diskussion, eftersom ingen kommer att märka din rapport om du inte ger dem en länk till den. Den automatiskt genererade länken kommer att bli tillgänglig efter att rapporten har skickats in.">
+<!ENTITY issues.disabled.description "Adblock Plus är inaktiverat, det kommer inte att blockera någonting i sitt nuvarande tillstånd.">
+<!ENTITY attachExtensions.label "Bifoga en lista över aktiverade till&amp;ägg till rapporten ifall en tilläggskonflikt är orsaken till problemet">
+<!ENTITY issues.nosubscriptions.add.label "Lägg till filterprenumeration">
+<!ENTITY issues.disabledfilters.enable.label "Aktivera filter">
+<!ENTITY issues.override.label "&amp;Konfigurationen är korrekt, fortsätt med rapporten">
+<!ENTITY issues.nosubscriptions.description "Du verkar inte prenumerara på något av de fördefinierade filterlistor som automatiskt tar bort icke önskvärt innehåll från webbplatser.">
+<!ENTITY typeSelector.falsePositive.description "Välj detta alternativ om sidan saknar viktigt innehåll, visas på ett felaktigt sätt eller inte fungerar som den skall. Du kan ta reda på huruvida Adblock Plus är orsaken till problemet genom att tillfälligtvis inaktivera det.">
+<!ENTITY typeSelector.other.label "&amp;Annat problem">
+<!ENTITY emailComment.label "Vi uppmanar dig att ange en giltig e-postadress så att vi kan kontakta dig om det finns frågor om er rapport. Det tillåter oss att erkänna era bidrag och prioritera dem högre.">
+<!ENTITY issues.whitelist.remove.label "Återaktivera Adblock Plus för denna sida">
+<!ENTITY outdatedSubscriptions.description "De följande filterprenumerationerna har inte uppdaterats på åtminstone två veckor. Var vänlig och uppdatera dessa filterprenumerationer innan en rapport skickas, problemet kan redan vara löst.">
+<!ENTITY dataCollector.description "Var vänlig vänta några ögonblick medan Adblock Plus samlar in nödvändig data.">
+<!ENTITY sendButton.label "Ski&amp;cka rapport">
+<!ENTITY comment.label "&amp;Kommentar (valfritt):">
+<!ENTITY sendPage.errorMessage "Det gick inte att skicka rapporten. Felkod: &quot;?1?&quot;. Var vänlig säkerställ att du är ansluten till Internet och försök sedan igen. Om problemet kvarstår, vänligen begär hjälp i [link]Adblock Plus webbforum[/link].">
+<!ENTITY showRecentReports.label "Visa senaste inskickade rapporter">
+<!ENTITY commentPage.heading "Ange kommentar">
+<!ENTITY update.start.label "Starta uppdatering nu">
+<!ENTITY issues.disabledfilters.description "Följande filter är inaktiverade, men kan trots det påverka denna sida:">
+<!ENTITY screenshot.description "Samma sida kan uppfattas olika av olika personer. Att bifoga en skärmdump till din rapport kan hjälpa oss att förstå problemet. Du kan ta bort delar som innehåller känslig information så väl som märka ut områden där problemet är tydligt. För att göra det, klicka på motsvarande knapp och markera en sektion av bilden med din mus.">
+<!ENTITY screenshot.attach.label "&amp;Bifoga en bild av sidan till rapporten">
+<!ENTITY issues.whitelist.description "Adblock Plus är för närvarande inaktiverat för sidan som du rapporterar. Var vänlig återaktivera det och uppdatera sidan innan rapporten skickas in, för att underlätta utredningen av detta problem.">
+<!ENTITY typeSelector.falseNegative.label "Ad&amp;block Plus blockerar inte en annons">
+<!ENTITY typeSelector.heading "Välj problemtyp">
+<!ENTITY anonymity.warning "Vi kommer inte att kunna kontakta er och er rapport kan få en lägre prioritering.">
+<!ENTITY wizard.title "Rapportera problem">
+<!ENTITY issues.ownfilters.disable.label "Inaktivera filter">
+<!ENTITY commentPage.description "Textfältet nedan låter dig ange en kommentar för att hjälpa oss förstå problemet. Detta steg är valfritt, men rekommenderas om problemet inte är tydligt. Du kan även granska rapportdatan innan den skickas.">
+<!ENTITY comment.lengthWarning "Längden på din kommentar överskrider 1 000 tecken. Endast de första 1 000 tecknen kommer att skickas.">
+<!ENTITY typeSelector.falseNegative.description "Välj detta alternativ om en annons visas trots att Adblock Plus är aktiverat.">
+<!ENTITY sendPage.waitMessage "Var vänlig vänta medan Adblock Plus skickar ing din rapport.">
+<!ENTITY dataCollector.heading "Välkommen till problemrapportören">
+<!ENTITY screenshot.heading "Bifoga skärmdump">
+<!ENTITY sendPage.heading "Skicka rapport">
+<!ENTITY issues.subscriptionCount.description "Det verkar som att du prenumererar på alldeles för många filterprenumerationer. Den konfigurationen rekommenderas inte eftersom sannolikheten att drabbas av problem ökar. Vi kan heller inte acceptera din problemrapport eftersom det inte står klart vilken filterprenumerationsskapare som måste vidta åtgärder. Var vänlig ta bort alla utom de absolut nödvändiga filterprenumerationerna och testa om problemet kvarstår.">
+<!ENTITY screenshot.mark.label "&amp;Märk ut problemet">
+<!ENTITY privacyPolicy.label "Sekretesspolicy">
+<!ENTITY issues.description "Adblock Plus har upptäckt problem med din konfiguration som kan vara orsaken till detta problem eller som kommer att försvåra utredningen av rapporten.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/sidebar.dtd
new file mode 100644
index 0000000..e159fbe
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Markera objektets ram">
+<!ENTITY address.label "Adress">
+<!ENTITY context.open.label "Öppna i ny flik">
+<!ENTITY type.label "Typ">
+<!ENTITY tooltip.filterSource.label "Filterkälla:">
+<!ENTITY noitems.label "Inget att blockera">
+<!ENTITY filter.label "Filtrera">
+<!ENTITY tooltip.size.label "Storlek:">
+<!ENTITY reattach.label "Koppla ihop">
+<!ENTITY search.label "S&amp;ök:">
+<!ENTITY docDomain.thirdParty "(tredje part)">
+<!ENTITY filterSource.label "Filterkälla">
+<!ENTITY tooltip.docDomain.label "Dokumentkälla:">
+<!ENTITY context.copy.label "Kopiera objektets adress">
+<!ENTITY tooltip.type.label "Typ:">
+<!ENTITY context.disablefilter.label "Inaktivera filtret ?1?">
+<!ENTITY context.copyFilter.label "Kopiera filter">
+<!ENTITY context.block.label "Blockera detta objekt">
+<!ENTITY context.enablefilter.label "Ã…teraktivera filtret ?1?">
+<!ENTITY detach.label "Koppla från">
+<!ENTITY whitelisted.label "Undantagen sida">
+<!ENTITY context.disablefilteronsite.label "Inaktivera detta filter på ?1?">
+<!ENTITY detached.title "Adblock Plus: Blockeringsbara objekt (frånkopplad)">
+<!ENTITY docDomain.firstParty "(första part)">
+<!ENTITY tooltip.type.whitelisted "(undantagen)">
+<!ENTITY tooltip.filter.label "Filter som används:">
+<!ENTITY tooltip.filter.disabled "(inaktiverat)">
+<!ENTITY context.editfilter.label "Blockeringsfilter är på">
+<!ENTITY tooltip.type.blocked "(blockerad)">
+<!ENTITY size.label "Storlek">
+<!ENTITY context.whitelist.label "Lägg till undantag för objekt">
+<!ENTITY context.selectAll.label "Markera alla">
+<!ENTITY state.label "Tillstånd">
+<!ENTITY docDomain.label "Dokumentkälla">
+<!ENTITY tooltip.address.label "Adress:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/subscriptionSelection.dtd
new file mode 100644
index 0000000..d096848
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/sv-SE/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "L&amp;ägg även till filterprenumerationen &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plus kunde inte hämta listan med filterprenumerationer.">
+<!ENTITY list.download.retry "Försök igen">
+<!ENTITY title.label "&amp;Rubrik för prenumeration:">
+<!ENTITY list.download.website "Visa webbsidan">
+<!ENTITY supplementMessage "Denna filterprenumeration bör användas med filterprenumerationen &quot;?1?&quot;, som för närvarande inte används.">
+<!ENTITY viewList.label "Visa filter">
+<!ENTITY visitHomepage.label "Besök webbsidan">
+<!ENTITY addSubscription.label "Lägg till filterprenumeration">
+<!ENTITY dialog.title "Lägg till filterprenumeration för Adblock Plus">
+<!ENTITY location.label "Plats &amp;för filter:">
+<!ENTITY fromWeb.description "Var vänlig bekräfta att du vill lägga till denna filterprenumeration. Du kan ändra rubrik eller plats innan du lägger till den.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/composer.dtd
new file mode 100644
index 0000000..8116b1f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "&amp;ที่ท้ายๆของที่อยู่">
+<!ENTITY domainRestriction.label "จำà¸à¸±&amp;ดโดเมน:">
+<!ENTITY collapse.default.no.label "ใช้ค่าเริ่มต้น(ไม่ใช่)">
+<!ENTITY firstParty.label "First-party เท่านั้น">
+<!ENTITY preferences.label "à¹à¸ªà¸”งตัวà¸à¸£à¸­à¸‡à¸—ี่มี...">
+<!ENTITY pattern.label "ดูรูปà¹à¸šà¸š">
+<!ENTITY thirdParty.label "Third-party เท่านั้น">
+<!ENTITY filter.label "ตัวà¸à¸£à¸­à¸‡à¹ƒà¸«à¸¡à¹ˆ:">
+<!ENTITY collapse.label "à¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¸—ี่ล้&amp;มเหลว:">
+<!ENTITY match.warning "à¹à¸šà¸šà¸£à¸¹à¸›à¸—ี่คุณเพิ่มเข้ามาไม่สัมพันธ์à¸à¸±à¸šà¸—ี่อยู่ที่จะบล็อà¸à¸«à¸£à¸·à¸­à¹„ม่บล็อภมันจะไม่มีผลใด ๆ">
+<!ENTITY anchor.start.label "ที่ห&amp;น้าๆของที่อยู่">
+<!ENTITY matchCase.label "&amp;จับคู่">
+<!ENTITY custom.pattern.label "&amp;ปรับเอง:">
+<!ENTITY unselectAllTypes.label "ไม่เลือà¸">
+<!ENTITY type.whitelist.label "ข้อยà¸à¹€à¸§à¹‰à¸™">
+<!ENTITY regexp.warning "รูปà¹à¸šà¸šà¸—ี่คุณป้อนเข้าจะถูà¸à¹à¸›à¸¥à¹€à¸›à¹‡à¸™à¸à¸²à¸£à¹à¸ªà¸”งออà¸à¸—ั่วไป à¸à¸²à¸£à¹à¸ªà¸”งออà¸à¸—ั่วไปมาà¸à¹†à¸ˆà¸°à¸—ำให้à¸à¸²à¸£à¹€à¸‚้าเว็บช้าลง ถ้าคุณไม่ตั้งใจจะใช้à¸à¸²à¸£à¹à¸ªà¸”งออà¸à¸—ั่วไปให้ใส่สัà¸à¸¥à¸±à¸à¸©à¸“์ * ที่ท้ายรูปà¹à¸šà¸š">
+<!ENTITY dialog.title "เพิ่มà¸à¸Žà¸•ัวà¸à¸£à¸­à¸‡ Adblock Plus">
+<!ENTITY basic.label "มุมมองพื้นà¸à¸²à¸™">
+<!ENTITY type.filter.label "à¸à¸²à¸£à¸›à¸´à¸”à¸à¸±à¹‰à¸™à¸•ัวà¸à¸£à¸­à¸‡">
+<!ENTITY types.label "ใช้งานà¸à¸±à¸šà¸Šà¸™à¸´à¸”:">
+<!ENTITY shortpattern.warning "รูปà¹à¸šà¸šà¸—ี่คุณป้อนเข้าสั้นเà¸à¸´à¸™à¸à¸§à¹ˆà¸²à¸ˆà¸°à¹ƒà¸Šà¹‰à¹ƒà¸«à¹‰à¹€à¸«à¸¡à¸²à¸°à¸ªà¸¡ รูปà¹à¸šà¸šà¸¡à¸²à¸à¹†à¸ˆà¸°à¸—ำให้เข้าเว็บช้า à¹à¸™à¸°à¸™à¸³à¹ƒà¸«à¹‰à¹ƒà¸Šà¹‰à¸£à¸¹à¸›à¹à¸šà¸šà¸¢à¸²à¸§à¹†à¸ªà¸³à¸«à¸£à¸±à¸šà¸•ัวà¸à¸£à¸­à¸‡à¸™à¸µà¹‰">
+<!ENTITY collapse.yes.label "ใช่">
+<!ENTITY anchors.label "รับเฉพาะรูปà¹à¸šà¸š:">
+<!ENTITY collapse.default.yes.label "ใช้ค่าเริ่มต้น(ใช่)">
+<!ENTITY domainRestriction.help "ระบุโดเมนหนึ่งหรือหลายà¹à¸«à¹ˆà¸‡à¹ƒà¸«à¹‰à¸„ั่นด้วยสัà¸à¸¥à¸±à¸à¸©à¸“์ &quot;|&quot; ตัวà¸à¸£à¸­à¸‡à¸ˆà¸°à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸šà¸™à¹‚ดเมนเหล่านี้เท่านั้น ถ้าไม่ต้องà¸à¸²à¸£à¹ƒà¸Šà¹‰à¹‚ดเมนใดให้ใส่สัà¸à¸¥à¸±à¸à¸©à¸“์ &quot;~&quot; หน้าชื่อโดเมน">
+<!ENTITY accept.label "เพิ่มตัวà¸à¸£à¸­à¸‡">
+<!ENTITY options.label "ตัวเลือà¸">
+<!ENTITY disabled.warning "Adblock Plus ถูà¸à¸›à¸´à¸”ใช้งานอยู่ à¹à¸•่คุณยังสามารถเพิ่มตัวà¸à¸£à¸­à¸‡à¹„ด้ à¹à¸•่ว่าจะยังไม่ถูà¸à¸™à¸³à¹„ปใช้งานจนà¸à¸§à¹ˆà¸²à¸„ุณจะ[link]เปิดใช้งาน Adblock Plus[/link] à¸à¹ˆà¸­à¸™">
+<!ENTITY anchor.start.flexible.label "ส่ว&amp;นต้นของชื่อโดเมน">
+<!ENTITY collapse.no.label "ไม่ใช่">
+<!ENTITY selectAllTypes.label "เลือà¸à¸—ั้งหมด">
+<!ENTITY advanced.label "มุมมองละเอียด">
+<!ENTITY pattern.explanation "รูปà¹à¸šà¸š (pattern) สามารถเป็นส่วนใดส่วนหนึ่งของที่อยู่ สัà¸à¸¥à¸±à¸à¸©à¸“์ * เป็นอัà¸à¸‚ระใดๆ ตัวà¸à¸£à¸­à¸‡à¸ˆà¸°à¸–ูà¸à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸à¸±à¸šà¸—ี่อยู่ที่เหมาะสมà¸à¸±à¸šà¸•ัวà¸à¸£à¸­à¸‡à¹€à¸—่านั้น">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/filters.dtd
new file mode 100644
index 0000000..9e27ded
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/filters.dtd
@@ -0,0 +1,73 @@
+<!ENTITY restore.custom.warning "ตัวà¸à¸£à¸­à¸‡à¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เองของคุณทั้งหมดจะถูà¸à¹à¸—นที่ โดยเนื้อหาของไฟล์ที่เลือà¸à¹„ว้ คุณต้องดำเนินà¸à¸²à¸£à¸•่อหรือไม่">
+<!ENTITY slow.column "ทำให้ตัวà¸à¸£à¸­&amp;งช้าลง">
+<!ENTITY enabled.column "เ&amp;ปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™">
+<!ENTITY subscription.lastDownload.checksumMismatch "ล้มเหลว checksum จับผิดคู่">
+<!ENTITY noFiltersInGroup.text "à¸à¸¥à¸¸à¹ˆà¸¡à¸—ี่เลือà¸à¸§à¹ˆà¸²à¸‡à¹€à¸›à¸¥à¹ˆà¸²">
+<!ENTITY subscription.actions.label "à¸à¸²à¸£à¸à¸£à¸°à¸—ำ">
+<!ENTITY filter.selectAll.label "เลือà¸à¸—ั้งหมด">
+<!ENTITY backupButton.label "à¸à¸²à¸£à¸ªà¸³à¸£à¸­à¸‡à¸‚้อมูลà¹à¸¥&amp;ะคืนค่า">
+<!ENTITY restore.minVersion.warning "คำเตือน: ไฟล์ที่ถูà¸à¸ªà¸£à¹‰à¸²à¸‡à¸‚ึ้นด้วย Adblock Plus เป็นรุ่นใหม่à¸à¸§à¹ˆà¸² คุณควรปรับปรุง Adblock Plus ให้เป็นรุ่นล่าสุดà¸à¹ˆà¸­à¸™à¸—ี่จะà¸à¸¹à¹‰à¸„ืนข้อมูลจาà¸à¹„ฟล์นี้">
+<!ENTITY restore.error "ไม่สามารถประมวลผลà¹à¸Ÿà¹‰à¸¡à¸‚้อมูล บางทีอาจไม่ใช่à¹à¸Ÿà¹‰à¸¡à¸ªà¸³à¸£à¸­à¸‡à¸‚อง Adblock Plus">
+<!ENTITY sort.ascending.label "&amp;จัดลำดับ A &gt; Z">
+<!ENTITY sort.label "&amp;จัดลำดับ">
+<!ENTITY subscription.source.label "รายà¸à¸²à¸£à¸•ัวà¸à¸£à¸­à¸‡">
+<!ENTITY hitcount.column "&amp;นับ">
+<!ENTITY noFilters.text "คุณยังไม่มีตัวà¸à¸£à¸­à¸‡à¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เอง">
+<!ENTITY backup.custom.title "ตัวà¸à¸£à¸­à¸‡à¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เองเท่านั้น">
+<!ENTITY subscription.external.label "ปรับปรุงโดยนามสà¸à¸¸à¸¥à¸­à¸·à¹ˆà¸™">
+<!ENTITY subscription.delete.label "ลบ">
+<!ENTITY noGroupSelected.text "คุณต้องเลือà¸à¸à¸¥à¸¸à¹ˆà¸¡à¸•ัวà¸à¸£à¸­à¸‡à¸à¹ˆà¸­à¸™à¸—ี่ตัวà¸à¸£à¸­à¸‡à¸™à¸±à¹‰à¸™à¸ªà¸²à¸¡à¸²à¸£à¸–à¹à¸ªà¸”งผลได้">
+<!ENTITY filter.cut.label "ตัด">
+<!ENTITY restore.default.label "คืนค่าà¸à¸²à¸£à¸ªà¸³à¸£à¸­à¸‡à¸‚้อมูลจาภ?1?">
+<!ENTITY subscription.lastDownload.inProgress "à¸à¸³à¸¥à¸±à¸‡à¸”าวน์โหลด...">
+<!ENTITY subscriptions.tab.label "นามข้างท้ายตัวà¸à¸£à¸­à¸‡">
+<!ENTITY sort.descending.label "จ&amp;ัดลำดับ Z &gt; A">
+<!ENTITY filters.remove.warning "คุณต้องà¸à¸²à¸£à¹€à¸­à¸²à¸•ัวà¸à¸£à¸­à¸‡à¸—ี่เลือà¸à¹„ว้ทั้งหมดหรือไม่">
+<!ENTITY filter.delete.label "ลบ">
+<!ENTITY addSubscriptionAdd.label "เพิ่ม">
+<!ENTITY viewMenu.label "มุมมอง">
+<!ENTITY subscription.lastDownload.unknown "ไม่มี">
+<!ENTITY addSubscriptionCancel.label "ยà¸à¹€à¸¥à¸´à¸">
+<!ENTITY subscription.enabled.label "เปิดใช้งาน">
+<!ENTITY noSubscriptions.text "คุณยังไม่ได้เพิ่มนามข้างท้ายตัวà¸à¸£à¸­à¸‡à¹ƒà¸”ๆ Adblock Plus จะไม่บล๊อà¸à¹€à¸«à¸•ุà¸à¸²à¸£à¸“์ใดๆ โดยที่ไม่มีตัวà¸à¸£à¸­à¸‡ à¸à¸£à¸¸à¸“าใช้ &quot;เพิ่มนามข้างท้าย&quot; เพื่อ
+ เพิ่มà¸à¸²à¸£à¸”ำเนินà¸à¸²à¸£">
+<!ENTITY subscription.update.label "ปรับปรุงตัวà¸à¸£à¸­à¸‡">
+<!ENTITY dialog.title "ตั้งค่าตัวà¸à¸£à¸­à¸‡ Adblock Plus">
+<!ENTITY addFilter.label "เพิ่มตัวà¸à¸£à¸­&amp;ง">
+<!ENTITY subscription.minVersion.warning "à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸™à¸²à¸¡à¸‚้างท้ายตัวà¸à¸£à¸­à¸‡à¸™à¸µà¹‰à¸•้องมี Adblock Plus รุ่นใหม่ที่à¸à¸§à¹ˆà¸² คุณควรปรับปรุงเป็น Adblock Plus รุ่นล่าสุด">
+<!ENTITY subscription.lastDownload.invalidURL "ล้มเหลว ไม่มีที่อยู่ที่ถูà¸à¸•้อง">
+<!ENTITY backup.error "มีข้อผิดพลาดในà¸à¸²à¸£à¹€à¸‚ียนตัวà¸à¸£à¸­à¸‡à¹„ปยังไฟล์ ตรวจสอบให้à¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸² ไฟล์ที่เà¸à¸µà¹ˆà¸¢à¸§à¸‚้องนี้ไม่ได้ป้องà¸à¸±à¸™à¸à¸²à¸£à¹€à¸‚ียน หรืออยู่ในระหว่างใช้งานโดยโปรà¹à¸à¸£à¸¡à¸›à¸£à¸°à¸¢à¸¸à¸à¸•์อื่นๆ">
+<!ENTITY filter.moveUp.label "ย้ายขึ้น">
+<!ENTITY addGroup.label "เพิ่มà¸à¸¥à¸¸à¹ˆà¸¡à¸•ั&amp;วà¸à¸£à¸­à¸‡">
+<!ENTITY filter.edit.label "à¹à¸à¹‰à¹„ข">
+<!ENTITY subscription.showHideFilters.label "à¹à¸ªà¸”ง/ซ่อนตัวà¸à¸£à¸­à¸‡">
+<!ENTITY acceptableAds2.label "อนุà¸&amp;าตให้มีโฆษณาบางอย่างที่ไม่ต้องà¸à¸²à¸£à¸£à¸šà¸à¸§à¸™">
+<!ENTITY addSubscriptionOther.label "เพิ่มนามข้างท้าย">
+<!ENTITY close.label "ปิด">
+<!ENTITY sort.none.label "&amp;ไม่จัดลำดับ">
+<!ENTITY filter.actions.label "ดำเนินà¸à¸²à¸£à¸•ัวà¸à¸£à¸­à¸‡">
+<!ENTITY filter.copy.label "คัดลอà¸">
+<!ENTITY filter.moveDown.label "ย้ายลง">
+<!ENTITY filter.resetHitCounts.label "ตั้งค่าสถิติà¸à¸²à¸£à¹€à¸‚้าชมใหม่">
+<!ENTITY readMore.label "อ่านเพิ่มเติม">
+<!ENTITY subscription.moveUp.label "ย้ายขึ้น">
+<!ENTITY addSubscription.label "เพิ่&amp;มนามข้างท้ายตัวà¸à¸£à¸­à¸‡">
+<!ENTITY subscription.homepage.label "โฮมเพจ">
+<!ENTITY backup.complete.title "ตัวà¸à¸£à¸­à¸‡à¹à¸¥à¸°à¸™à¸²à¸¡à¸‚้างท้ายทั้งหมด">
+<!ENTITY restore.own.label "คืนค่าà¸à¸²à¸£à¸ªà¸³à¸£à¸­à¸‡à¸‚้อมูลของตนเอง">
+<!ENTITY restore.complete.warning "à¸à¸³à¸«à¸™à¸”ลัà¸à¸©à¸“ะà¸à¸²à¸£à¸à¸£à¸­à¸‡à¸‚องคุณทั้งหมดจะถูà¸à¹à¸—นที่ โดยเนื้อหาของไฟล์ที่เลือà¸à¹„ว้ คุณต้องดำเนินà¸à¸²à¸£à¸•่อหรือไม่">
+<!ENTITY filters.tab.label "ตัวà¸à¸£à¸­à¸‡à¹à¸šà¸šà¸à¸³à¸«à¸™à¸”เอง">
+<!ENTITY backup.label "สร้างà¸à¸²à¸£à¸ªà¸³à¸£à¸­à¸‡à¸‚้อมูลใหม่">
+<!ENTITY find.label "ค้นห&amp;า">
+<!ENTITY subscription.moveDown.label "ย้ายลง">
+<!ENTITY subscription.lastDownload.connectionError "ล้มเหลว à¸à¸²à¸£à¸”าวน์โหลดล้มเหลว">
+<!ENTITY subscription.lastDownload.success "สำเร็จ">
+<!ENTITY subscription.lastDownload.invalidData "ล้มเหลว ไม่มีรายชื่อตัวà¸à¸£à¸­à¸‡à¸—ี่ถูà¸à¸•้อง">
+<!ENTITY filter.paste.label "วาง">
+<!ENTITY subscription.disabledFilters.enable "เปิดใช้งาน à¸à¸²à¸£à¸›à¸´à¸”ใช้งานตัวà¸à¸£à¸­à¸‡">
+<!ENTITY lasthit.column "à¸à¸”&amp;ล่าสุด">
+<!ENTITY subscription.editTitle.label "à¹à¸à¹‰à¹„ขชื่อเรื่อง">
+<!ENTITY subscription.disabledFilters.warning "บางตัวà¸à¸£à¸­à¸‡à¹ƒà¸™à¸à¸²à¸£à¸šà¸­à¸à¸£à¸±à¸šà¸ªà¸¡à¸²à¸Šà¸´à¸à¸™à¸µà¹‰à¸–ูà¸à¸›à¸´à¸”ใช้งาน">
+<!ENTITY filter.column "à¸à¸Ž&amp;ตัวà¸à¸£à¸­à¸‡">
+<!ENTITY subscription.lastDownload.label "ดาวน์โหลดล่าสุด:">
+<!ENTITY viewList.label "มุมมองรายà¸à¸²à¸£">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/firstRun.properties
new file mode 100644
index 0000000..f9d617a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_toggle_off=ไม่ทำงาน
+firstRun_feature_tracking=ปิดระบบติดตามà¸à¸²à¸£à¹ƒà¸‚้งาน
+firstRun_feature_social=ลบปุ่มสื่อสังคมออà¸
+firstRun_title=à¸à¸²à¸•ิดตั้ง Adblock Plus เสร็จสมบูรณ์
+firstRun_feature_malware=บล็อà¸à¸¡à¸±à¸¥à¹à¸§à¸£à¹Œ
+firstRun_toggle_on=ทำงาน
+firstRun_dataCorruptionWarning=ไม่ให้หน้านี้à¹à¸ªà¸”งอีà¸à¸„รั้ง <a>คลิà¸à¸—ี่นี้</a>
+firstRun_acceptableAdsHeadline=โฆษณาที่น่ารำคาà¸à¸ˆà¸°à¸–ูà¸à¸›à¸´à¸”à¸à¸±à¹‰à¸™
+firstRun_share=บอà¸à¹€à¸žà¸·à¹ˆà¸­à¸™à¸‚องคุณ
+firstRun_filterlistsReinitializedWarning=ดูเหมือนว่าปัà¸à¸«à¸²à¸ˆà¸°à¹€à¸à¸´à¸”จาà¸à¸•ัวà¸à¸£à¸­à¸‡à¸—ั้งหมดถูà¸à¸¥à¸šà¸­à¸­à¸à¹„ปà¹à¸¥à¹‰à¸§à¹„ม่สามารถคืนค่าจาà¸à¸•ัวสำรองข้อมูลได้ ดังนั้นเรามีตัวรีเซ็ตตัวà¸à¸£à¸­à¸‡à¸—ี่ได้รับà¸à¸²à¸£à¸¢à¸­à¸¡à¸£à¸±à¸š à¸à¸£à¸¸à¸“าตรวจสอบรายà¸à¸²à¸£à¸•ัวà¸à¸£à¸­à¸‡à¹‚ฆษณาของคุณืั้ <a>ตัวเลือภAdblock Plus</a>
+firstRun_feature_malware_description=ทำให้ท่องเว็บได้ปลอดภัยยิ่งขึ้น โดยà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¹€à¸§à¹‡à¸šà¸—ี่มีมัลà¹à¸§à¸£à¹Œà¸—ี่รู้จัà¸
+firstRun_features=Adblock Plus สามารถทำได้มาà¸à¸à¸à¸§à¹ˆà¸²à¸šà¸¥à¹‡à¸­à¸à¹‚ฆษณา
+firstRun_donate=บริจาค
+firstRun_donate_label=สนับสนุนโปรเจ็คของเรา
+firstRun_legacySafariWarning=คุณà¸à¸³à¸¥à¸±à¸‡à¹ƒà¸Šà¹‰à¹€à¸§à¸­à¸£à¹Œà¸Šà¸±à¹ˆà¸™à¹€à¸à¹ˆà¸²à¸šà¸™ Safari ที่ไม่ได้รับà¸à¸²à¸£à¸ªà¸™à¸±à¸šà¸ªà¸™à¸¸à¸™à¸ˆà¸²à¸ Adblock Plus จะทำให้ทำงานผิดพลาดได้ เราขอà¹à¸™à¸°à¸™à¸³à¹ƒà¸«à¹‰à¸„ุณอัพเดต Safari เป็นเวอร์ชั่น 6.1.1 หรือรุ่นที่สูงà¸à¸§à¹ˆà¸² (บน OS X 10.8 Mountain Lion) หรือ Safari 7.0.1 หรือสูงà¸à¸§à¹ˆà¸² (บน OS X 10.9 Mavericks) หรือใช้เวอร์ชั่นล่าสุดบน Mozilla Firefox, Google Chrome à¹à¸¥à¸° Opera
+firstRun_feature_tracking_description=Browse privately by disabling tracking - hiding your tracks from ad companies that would track your every move.
+firstRun_acceptableAdsExplanation=We'd like to encourage websites to use straightforward, unobtrusive advertising. That's why we've established <a>strict guidelines</a> to identify acceptable ads, which are shown under default settings. If you still want to block every ad you can <a>disable</a> this in a few seconds.
+firstRun_contributor_credits=Contributor Credits
+firstRun_share_headline=<a>Give us a hand</a> in making the web a better place
+firstRun_feature_social_description=Automatically rid your browsing experience of social media buttons, such as the Facebook Like, which appear on web pages and track your behavior.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/global.properties
new file mode 100644
index 0000000..c878f50
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=ไม่มีรายà¸à¸²à¸£à¸—ี่บล็อà¸à¹„ด้ในหน้าล่าสุด
+action3_tooltip=คลิà¸à¹€à¸žà¸·à¹ˆà¸­à¹€à¸›à¸´à¸”หรือปิดใช้งาน Adblock Plus
+type_label_script=สคริปต์
+filter_elemhide_nocriteria=ไม่มีเà¸à¸“ฑ์ที่ระบุที่จำวัตถุที่จะซ่อน
+blockingGroup_title=à¸à¸Žà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¹‚ฆษณา
+whitelisted_tooltip=Adblock Plus เปิดอยู่à¹à¸•่ไม่ใช้à¸à¸±à¸šà¸«à¸™à¹‰à¸²à¸™à¸µà¹‰
+type_label_stylesheet=รูปà¹à¸šà¸šà¹€à¸­à¸à¸ªà¸²à¸£
+blocked_count_tooltip=?1? จาภ?2?
+type_label_font=à¹à¸šà¸šà¸­à¸±à¸à¸©à¸£
+type_label_popup=หน้าต่างà¹à¸šà¸šà¸œà¸¸à¸”ขึ้น(pop-up)
+filter_regexp_tooltip=ตัวà¸à¸£à¸­à¸‡à¸™à¸µà¹‰à¸à¹‡à¹€à¸›à¹‡à¸™à¸à¸²à¸£à¹à¸ªà¸”งออà¸à¸—ั่วไปหรือสั้นเà¸à¸´à¸™à¸à¸§à¹ˆà¸²à¸ˆà¸°à¹ƒà¸Šà¹‰à¹ƒà¸«à¹‰à¹€à¸«à¸¡à¸²à¸°à¸ªà¸¡ ถ้ามีตัวà¸à¸£à¸­à¸‡à¸›à¸£à¸°à¹€à¸ à¸—นี้มาà¸à¹€à¸à¸´à¸™à¹„ปจะทำให้à¸à¸²à¸£à¹€à¸‚้าเว็บช้าได้
+action0_tooltip=คลิà¸à¹€à¸žà¸·à¹ˆà¸­à¸™à¸³à¹„ปที่รายà¸à¸²à¸£à¹€à¸¡à¸™à¸¹ คลิà¸à¹€à¸¡à¸²à¸ªà¹Œà¸à¸¥à¸²à¸‡à¹€à¸žà¸·à¹ˆà¸­à¹€à¸›à¸´à¸”หรือปิดใช้งาน
+whitelisted_page=Adblock Plus ถูà¸à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹ƒà¸™à¸«à¸™à¹‰à¸²à¸¥à¹ˆà¸²à¸ªà¸¸à¸”
+remove_group_warning=คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸²à¸•้องà¸à¸²à¸£à¸ˆà¸°à¸¥à¸šà¸à¸¥à¸¸à¹ˆà¸¡à¸™à¸µà¹‰?
+action1_tooltip=คลิà¸à¹€à¸žà¸·à¹ˆà¸­à¹€à¸›à¸´à¸”หรือปิดสิ่งของ คลิà¸à¹€à¸¡à¸²à¸ªà¹Œà¸à¸¥à¸²à¸‡à¹€à¸žà¸·à¹ˆà¸­à¹€à¸›à¸´à¸”หรือปิดใช้งาน
+type_label_xmlhttprequest=คำร้องขอ XML
+active_tooltip=Adblock Plus เปิดใช้งานอยู่ นามข้างท้ายตัวà¸à¸£à¸­à¸‡ ?1? อย่าง à¹à¸¥à¸°à¸•ัวà¸à¸£à¸­à¸‡à¸à¸³à¸«à¸™à¸”เอง ?2? ตัวเปิดใช้งานอยู่
+type_label_document=เอà¸à¸ªà¸²à¸£
+type_label_object_subrequest=subrequest วัตถุ
+whitelistGroup_title=ข้อยà¸à¹€à¸§à¹‰à¸™à¸‚องà¸à¸Ž
+disabled_tooltip=Adblock Plus ถูà¸à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™
+filter_elemhide_duplicate_id=มีเฉพาะรหัสประจำตัววัตถุเดียวเท่านั้นที่ซ่อนที่สามารถระบุได้
+type_label_object=วัตถุ
+action2_tooltip=คลิà¸à¹€à¸žà¸·à¹ˆà¸­à¹€à¸›à¸´à¸”à¸à¸²à¸£à¸›à¸£à¸±à¸šà¹à¸•่ง คลิà¸à¹€à¸¡à¸²à¸ªà¹Œà¸à¸¥à¸²à¸‡à¹€à¸žà¸·à¹ˆà¸­à¹€à¸›à¸´à¸”หรือปิดใช้งาน
+type_label_subdocument=เฟรม
+clearStats_warning=สิ่งนี้จะตั้งค่าใหม่ทั้งหมดของตัวà¸à¸£à¸­à¸‡à¸à¸²à¸£à¹€à¸‚้าชมสถิติà¹à¸¥à¸°à¸›à¸´à¸”ใช้งานà¸à¸²à¸£à¸•รวจนับปริมาณตัวà¸à¸£à¸­à¸‡ คุณต้องดำเนินà¸à¸²à¸£à¸•่อหรือไม่
+blocked_count_addendum=(à¹à¸¥à¸°à¸¢à¸±à¸‡à¸¡à¸µà¸šà¸±à¸à¸Šà¸µà¸‚าว ?1? อย่าง ซ่อนอยู่ ?2? อย่าง)
+subscription_invalid_location=ตำà¹à¸«à¸™à¹ˆà¸‡à¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸­à¸•ัวà¸à¸£à¸­à¸‡à¹„ม่ใช่ทั้งยูอาร์à¹à¸­à¸¥à¸—ี่ถูà¸à¸•้องà¹à¸¥à¸°à¸Šà¸·à¹ˆà¸­à¹„ฟล์ที่ถูà¸à¸•้อง
+type_label_image=รูปภาพ
+remove_subscription_warning=คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸­à¸§à¹ˆà¸²à¸•้องà¸à¸²à¸£à¸¥à¸šà¸™à¸²à¸¡à¸‚้างท้ายนี้
+type_label_other=อื่นๆ
+mobile_menu_enable=ABP: เปิดใช้งาน
+type_label_media=เสียง/ภาพ
+mobile_menu_disable_site=ABP: ปิดใช้งาน ?1?
+elemhideGroup_title=à¸à¸Žà¸à¸²à¸£à¸‹à¹ˆà¸­à¸™à¸­à¸‡à¸„์ประà¸à¸­à¸š
+mobile_menu_enable_site=ABP: เปิดใช้งาน ?1?
+type_label_elemhide=ซ่อน
+newGroup_title=à¸à¸¥à¸¸à¹ˆà¸¡à¸•ัวà¸à¸£à¸­à¸‡à¹ƒà¸«à¸¡à¹ˆ
+default_dialog_title=Adblock Plus
+notification_antiadblock_title=Hide targeted messages?
+notification_antiadblock_message=This site has been known to show targeted messages to Adblock Plus users. Do you want Adblock Plus to hide targeted messages?
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/overlay.dtd
new file mode 100644
index 0000000..57feaca
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY sync.label "เชื่อ&amp;มข้อมูลà¸à¸²à¸£à¸•ั้งค่า Adblock Plus">
+<!ENTITY whitelist.site.label "ปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™ ?1?">
+<!ENTITY filters.label "ตั้งค่าตัวà¸à¸£&amp;อง">
+<!ENTITY disable.label "ปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸—ุà¸à¸—ี่">
+<!ENTITY objecttab.title "บล็อà¸">
+<!ENTITY objecttab.tooltip "คลิà¸à¸—ี่นี่เพื่อบล็อà¸à¸§à¸±à¸•ถุนี้ด้วย Adblock Plus">
+<!ENTITY menuitem.label "&amp;ปรับà¹à¸•่ง Adblock Plus">
+<!ENTITY objecttabs.label "à¹à¸ªà¸”งà¹à¸—็&amp;บบนà¹à¸Ÿà¸¥à¸Šà¹à¸¥à¸°à¸ˆà¸²à¸§à¸²">
+<!ENTITY sendReport.label "&amp;รายงานปัà¸à¸«à¸²à¸—ี่พบในหน้านี้">
+<!ENTITY whitelist.page.label "ปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹€à¸‰à¸žà¸²à¸°à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰">
+<!ENTITY context.image.label "Adblock รูปภาพ">
+<!ENTITY counthits.label "นับจำนวนตัว&amp;à¸à¸£à¸­à¸‡à¸®à¸´à¸•">
+<!ENTITY opensidebar.label "เปิดราย&amp;à¸à¸²à¸£à¸—ี่บล็อà¸à¹„ด้">
+<!ENTITY contribute.label "เข้ามีส่วนร่วมà¸à¸±à¸š Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock เฟรม">
+<!ENTITY blocked.tooltip "สิ่งที่บล็อà¸à¹ƒà¸™à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰:">
+<!ENTITY hideplaceholders.label "ซ่อน&amp;ตำà¹à¸«à¸™à¹ˆà¸‡à¸•ัวยึดตำà¹à¸«à¸™à¹ˆà¸‡à¸‚ององค์ประà¸à¸­à¸šà¸—ี่ถูà¸à¸šà¸¥à¹‡à¸­à¸„ไว้">
+<!ENTITY showinstatusbar.label "à¹&amp;สดงในà¹à¸–บสถานะ">
+<!ENTITY sidebar.title "รายà¸à¸²à¸£à¸—ี่บล็อà¸à¹„ด้ในหน้าล่าสุด">
+<!ENTITY options.label "ตั&amp;วเลือà¸">
+<!ENTITY context.object.label "Adblock วัตถุ">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: เปิดใช้งานอีà¸à¸„รั้งในหน้านี้">
+<!ENTITY filters.tooltip "ตัวà¸à¸£à¸­à¸‡à¸—ี่ใช้งานมาà¸à¸—ี่สุด:">
+<!ENTITY closesidebar.label "ปิดราย&amp;à¸à¸²à¸£à¸—ี่บล็อà¸à¹„ด้">
+<!ENTITY showintoolbar.label "à¹à¸ªà¸”งในà¹à¸–บเ&amp;ครื่องมือ">
+<!ENTITY status.tooltip "สถานะ:">
+<!ENTITY context.media.label "Adblock Plus: บล็อà¸à¹€à¸ªà¸µà¸¢à¸‡/วีดิทัศน์">
+<!ENTITY subscription.update.label "ปรับปรุงตัวà¸à¸£à¸­à¸‡">
+<!ENTITY notification.button.yes "&amp;Yes">
+<!ENTITY notification.button.no "&amp;No">
+<!ENTITY notification.button.close "&amp;Close">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/sendReport.dtd
new file mode 100644
index 0000000..abddb2a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/sendReport.dtd
@@ -0,0 +1,66 @@
+<!ENTITY screenshot.undo.label "เรี&amp;ยà¸à¸„ืน">
+<!ENTITY issues.disabledgroups.description "คำอธิบายตัวà¸à¸£à¸­à¸‡à¸«à¸£à¸·à¸­à¸à¸¥à¸¸à¹ˆà¸¡à¸‚องตัวà¸à¸£à¸­à¸‡à¸•่อไปนี้ปิดใช้งานà¹à¸¥à¹‰à¸§ อาจจะส่งผลà¸à¸£à¸°à¸—บต่อหน้านี้:">
+<!ENTITY showData.label "à¹à¸ªà¸”งข้อมูลรายงาน">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus &amp;มีà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¸¡à¸²à¸à¹€à¸à¸´à¸™à¹„ป">
+<!ENTITY issues.change.description "à¸à¸²à¸£à¸•ั้งค่าเปลี่ยนà¹à¸›à¸¥à¸‡à¹à¸¥à¹‰à¸§ à¸à¸£à¸¸à¸“าเรียà¸à¸«à¸™à¹‰à¸²à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™à¹ƒà¸«à¸¡à¹ˆà¹€à¸žà¸·à¹ˆà¸­à¸—ดสอบความเปลี่ยนà¹à¸›à¸¥à¸‡à¹à¸¥à¸°à¸ªà¹ˆà¸‡à¸£à¸²à¸¢à¸‡à¸²à¸™à¸–้าปัà¸à¸«à¸²à¸¢à¸±à¸‡à¹„ม่ได้รับà¸à¸²à¸£à¹à¸à¹‰à¹„ข">
+<!ENTITY issues.openPreferences.label "เปิดà¸à¸²à¸£à¸›à¸£à¸±à¸šà¹à¸•่งตัวà¸à¸£à¸­à¸‡">
+<!ENTITY sendPage.confirmation "รายงานได้รับà¸à¸²à¸£à¸šà¸±à¸™à¸—ึà¸à¹à¸¥à¹‰à¸§ คุณเข้าดูได้ตามที่อยู่ต่อไปนี้:">
+<!ENTITY copyLink.label "&amp;คัดลอà¸à¸¥à¸´à¸‡à¸à¹Œà¸£à¸²à¸¢à¸‡à¸²à¸™">
+<!ENTITY issues.nofilters.description "Adblock Plus ไม่ได้บล็อà¸à¸ªà¸´à¹ˆà¸‡à¹ƒà¸”เลยในหน้านี้ ปัà¸à¸«à¸²à¸—ี่คุณรายงานไม่น่าจะเà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸š Adblock Plus">
+<!ENTITY sendPage.knownIssue "ปัà¸à¸«à¸²à¸—ี่คุณรายงานมีวิธีà¹à¸à¹‰à¹„ขอยู่à¹à¸¥à¹‰à¸§ ข้อมูลเพิ่มเติม:">
+<!ENTITY typeSelector.other.description "เลือà¸à¸•ัวเลือà¸à¸™à¸µà¹‰à¸–้าคุณคิดว่าปัà¸à¸«à¸²à¹€à¸à¸´à¸”จาà¸à¸•ัว Adblock Plus เอง ไม่ใช่ตัวà¸à¸£à¸­à¸‡">
+<!ENTITY issues.disabledgroups.enable.label "เปิดใช้งานคำอธิบายตัวà¸à¸£à¸­à¸‡à¸«à¸£à¸·à¸­à¸à¸¥à¸¸à¹ˆà¸¡à¸‚องตัวà¸à¸£à¸­à¸‡">
+<!ENTITY typeWarning.override.label "ฉันเข้าใจà¹à¸¥à¸°à¸žà¸£à¹‰à¸­à¸¡à¸ˆà¸°&amp;ส่งรายงาน">
+<!ENTITY issues.disabled.enable.label "เปิด Adblock Plus">
+<!ENTITY update.fixed.description "ตัวà¸à¸£à¸­à¸‡à¸‚องคุณน่าจะมีà¸à¸²à¸£à¸­à¸±à¸žà¹€à¸”ทà¸à¸²à¸£à¹à¸à¹‰à¹„ขปัà¸à¸«à¸²à¸—ี่คุณได้รายงานไว้à¸à¹ˆà¸­à¸™à¸«à¸™à¹‰à¸²à¸™à¸µà¹‰ à¸à¸£à¸¸à¸“าโหลดเว็บเพจà¹à¸¥à¸°à¸¥à¸­à¸‡à¹ƒà¸«à¸¡à¹ˆà¸­à¸µà¸à¸„รั้ง คุณสามารถดูรายงานของคุณได้อีà¸à¸„รั้ง หาà¸à¸žà¸šà¸›à¸±à¸à¸«à¸²à¸”ังà¸à¸¥à¹ˆà¸²à¸§à¸­à¸¢à¸¹à¹ˆ">
+<!ENTITY reloadButton.label "&amp;เรียà¸à¸«à¸™à¹‰à¸²à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™à¹ƒà¸«à¸¡à¹ˆ">
+<!ENTITY recentReports.clear.label "&amp;ลบรายงานทั้งหมด">
+<!ENTITY typeSelector.description "หน้าต่างนี้จะนำทางไปยังขั้นตอนที่ต้องà¸à¸²à¸£à¹ƒà¸™à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸£à¸²à¸¢à¸‡à¸²à¸™à¸›à¸±à¸à¸«à¸²à¸‚อง Adblock Plus à¸à¸£à¸¸à¸“าเลือà¸à¸Šà¸™à¸´à¸”ของปัà¸à¸«à¸²à¸—ี่คุณพบในหน้านี้:">
+<!ENTITY screenshot.remove.label "&amp;ลบข้อมูลที่ไม่อยาà¸à¹ƒà¸«à¹‰à¹ƒà¸„รเห็น">
+<!ENTITY issues.ownfilters.description "ตัวà¸à¸£à¸­à¸‡à¸šà¸²à¸‡à¸•ัวที่ใช้ในหน้านี้เป็นของผู้ใช้ à¸à¸£à¸¸à¸“าปิดตัวà¸à¸£à¸­à¸‡à¸—ี่อาจà¸à¹ˆà¸­à¹ƒà¸«à¹‰à¹€à¸›à¸´à¸”ปัà¸à¸«à¸²:">
+<!ENTITY update.inProgress.description "Adblock Plus ต้องà¸à¸²à¸£à¸—ี่จะอัพเดทตัวà¸à¸£à¸­à¸‡à¸‚องคุณ เพื่อให้à¹à¸™à¹ˆà¹ƒà¸ˆà¸§à¹ˆà¸²à¸›à¸±à¸à¸«à¸²à¹„ด้รับà¸à¸²à¸£à¹à¸à¹‰à¹„ขà¹à¸¥à¹‰à¸§ à¸à¸£à¸¸à¸“ารอสัà¸à¸„รู่...">
+<!ENTITY sendPage.retry.label "ส่งอีà¸à¸„รั้ง">
+<!ENTITY data.label "ข้อ&amp;มูลรายงาน:">
+<!ENTITY recentReports.label "รายงานที่เพิ่งส่งของคุณ">
+<!ENTITY typeWarning.description "คุณระบุไว้ว่า คุณต้องà¸à¸²à¸£à¸£à¸²à¸¢à¸‡à¸²à¸™à¸›à¸±à¸à¸«à¸²à¸à¸±à¸š Adblock Plus มาà¸à¸à¸§à¹ˆà¸²à¸›à¸±à¸à¸«à¸²à¸à¸±à¸šà¸•ัวà¸à¸£à¸­à¸‡ ปัà¸à¸«à¸²à¸”ังà¸à¸¥à¹ˆà¸²à¸§à¸£à¸²à¸¢à¸‡à¸²à¸™à¹„ด้ดีที่สุดที่ [link]Adblock Plus forum[/link] คุณควรใช้ตัวรายงานปัà¸à¸«à¸²à¹€à¸žà¸·à¹ˆà¸­à¸ªà¸™à¸±à¸šà¸ªà¸™à¸¸à¸™à¸šà¸—สนทนาที่มีอยู่ เพราะไม่มีใครจะเห็นรายงานของคุณจนà¸à¸§à¹ˆà¸²à¸„นส่งลิงà¸à¹Œà¹ƒà¸«à¹‰ จะมีลิงà¸à¹Œà¹ƒà¸«à¹‰à¸­à¸±à¸•โนมัติหลังจาà¸à¸ªà¹ˆà¸‡à¸£à¸²à¸¢à¸‡à¸²à¸™">
+<!ENTITY issues.disabled.description "Adblock Plus ถูà¸à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™ ซึ่งจะไม่มีà¸à¸²à¸£à¸šà¸¥à¹‡à¸­à¸à¹ƒà¸”ๆ ทั้งสิ้น">
+<!ENTITY attachExtensions.label "à¹à¸™à¸šà¸£à¸²à¸¢à¸Šà¸·à¹ˆà¸­à¸ªà¹ˆà¸§à¸™à¹€à¸ªà¸£à¸´à¸¡à¸—ี่ใช้อยู่ไปà¸à¸±à¸šà¸£à¸²à¸¢à¸‡à¸²à¸™à¹ƒà¸™à¸à¸£&amp;ณีที่เà¸à¸´à¸”ปัà¸à¸«à¸²à¸ªà¹ˆà¸§à¸™à¹€à¸ªà¸£à¸´à¸¡à¸Šà¸™à¸à¸±à¸™">
+<!ENTITY issues.nosubscriptions.add.label "เพิ่มคำอธิบายตัวà¸à¸£à¸­à¸‡">
+<!ENTITY issues.disabledfilters.enable.label "เปิดใช้งานตัวà¸à¸£à¸­à¸‡">
+<!ENTITY issues.override.label "à¸à¸²à¸£à¸•ั้งค่าถูà¸à¸•้อง &amp;ดำเนินà¸à¸²à¸£à¸£à¸²à¸¢à¸‡à¸²à¸™à¸•่อไป">
+<!ENTITY issues.nosubscriptions.description "คุณไม่ได้เขียนคำอธิบายรายชื่อตัวà¸à¸£à¸­à¸‡à¹„ว้ ซึ่งจะลบเนื้อหาที่ไม่ต้องà¸à¸²à¸£à¸­à¸­à¸à¸ˆà¸²à¸à¹€à¸§à¹‡à¸šà¹„ซต์อัตโนมัติ">
+<!ENTITY typeSelector.falsePositive.description "เลือà¸à¸•ัวเลือà¸à¸™à¸µà¹‰ ถ้าหน้าเพจไม่มีเนื้อหาที่สำคัภà¹à¸ªà¸”งผลผิดหรือทำงานผิด คุณสามารถทดสอบว่า Adblock Plus เป็นต้นเหตุของปัà¸à¸«à¸²à¸«à¸£à¸·à¸­à¹„ม่ โดยà¸à¸²à¸£à¸—ดลองปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¹„ว้ชั่วคราว">
+<!ENTITY typeSelector.other.label "ปั&amp;à¸à¸«à¸²à¸­à¸·à¹ˆà¸™">
+<!ENTITY issues.whitelist.remove.label "เปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™ Adblock Plus อีà¸à¸„รั้งในหน้านี้">
+<!ENTITY outdatedSubscriptions.description "รายà¸à¸²à¸£à¸•ัวà¸à¸£à¸­à¸‡à¸•่อไปนี้ยังไม่ได้รับà¸à¸²à¸£à¸­à¸±à¸žà¹€à¸”ทเป็นเวลาสองสัปดาห์à¹à¸¥à¹‰à¸§ à¸à¸£à¸¸à¸“าอัพเดทรายà¸à¸²à¸£à¸”ังà¸à¸¥à¹ˆà¸²à¸§à¸à¹ˆà¸­à¸™à¸—ี่จะส่งรายงานไป เพราะปัà¸à¸«à¸²à¸­à¸²à¸ˆà¹„ด้รับà¸à¸²à¸£à¹à¸à¹‰à¹„ขเรียบร้อยà¹à¸¥à¹‰à¸§à¸à¹‡à¹€à¸›à¹‡à¸™à¹„ด้">
+<!ENTITY dataCollector.description "à¸à¸£à¸¸à¸“ารอสัà¸à¸„รู่ระหว่างที่ Adblock Plus à¸à¸³à¸¥à¸±à¸‡à¸£à¸§à¸šà¸£à¸§à¸¡à¸‚้อมูล">
+<!ENTITY sendButton.label "ส่&amp;งรายงาน">
+<!ENTITY comment.label "&amp;ความคิดเห็น (ไม่ใส่à¸à¹‡à¹„ด้):">
+<!ENTITY sendPage.errorMessage "à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸£à¸²à¸¢à¸‡à¸²à¸™à¸œà¸´à¸”พลาด รหัส &quot;?1?&quot; à¸à¸£à¸¸à¸“าเชื่อมต่อà¸à¸±à¸šà¸­à¸´à¸™à¹€à¸—อร์เน็ตà¹à¸¥à¸°à¸¥à¸­à¸‡à¸­à¸µà¸à¸„รั้ง หาà¸à¸›à¸±à¸à¸«à¸²à¸¢à¸±à¸‡à¸¡à¸µà¸­à¸¢à¸¹à¹ˆà¸à¸£à¸¸à¸“าขอความช่วยเหลือที่ [link]Adblock Plus forum[/link]">
+<!ENTITY showRecentReports.label "à¹à¸ªà¸”งรายงานที่เพิ่งส่ง">
+<!ENTITY commentPage.heading "ใส่ความคิดเห็น">
+<!ENTITY update.start.label "เริ่มอัพเดทตอนนี้">
+<!ENTITY issues.disabledfilters.description "ตัวà¸à¸£à¸­à¸‡à¸•่อไปนี้ปิดใช้งานà¹à¸¥à¹‰à¸§ อาจจะส่งผลà¸à¸£à¸°à¸—บต่อหน้านี้:">
+<!ENTITY screenshot.description "หน้าเดียวà¸à¸±à¸™à¸„นต่างà¸à¸±à¸™à¸­à¸²à¸ˆà¸ˆà¸°à¹€à¸«à¹‡à¸™à¸•่างà¸à¸±à¸™à¹„ด้ à¸à¸£à¸¸à¸“าà¹à¸™à¸šà¸ à¸²à¸žà¸«à¸™à¹‰à¸²à¸ˆà¸­à¸¡à¸²à¸à¸±à¸šà¸£à¸²à¸¢à¸‡à¸²à¸™à¸”้วย คุณสามารถลบส่วนที่ไม่ต้องà¸à¸²à¸£à¹ƒà¸«à¹‰à¹ƒà¸„รเห็นà¹à¸¥à¸°à¹€à¸™à¹‰à¸™à¸ªà¹ˆà¸§à¸™à¸—ี่เป็นปัà¸à¸«à¸²à¸¡à¸²à¸”้วย คลิà¸à¸›à¸¸à¹ˆà¸¡à¸—ี่เà¸à¸µà¹ˆà¸¢à¸§à¸‚้องà¹à¸¥à¸°à¹€à¸¥à¸·à¸­à¸à¸ªà¹ˆà¸§à¸™à¸‚องรูปภาพด้วยเมาส์">
+<!ENTITY screenshot.attach.label "à¹à¸™&amp;บรูปภาพหน้าไปà¸à¸±à¸šà¸£à¸²à¸¢à¸‡à¸²à¸™">
+<!ENTITY issues.whitelist.description "Adblock Plus ไม่ได้เปิดใช้งานในหน้าเพจที่คุณรายงาน à¸à¸£à¸¸à¸“าเปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸­à¸µà¸à¸„รั้งà¹à¸¥à¸°à¹€à¸£à¸µà¸¢à¸à¸«à¸™à¹‰à¸²à¸›à¸±à¸ˆà¸ˆà¸¸à¸šà¸±à¸™à¹ƒà¸«à¸¡à¹ˆà¸à¹ˆà¸­à¸™à¸ªà¹ˆà¸‡à¸£à¸²à¸¢à¸‡à¸²à¸™à¹€à¸žà¸·à¹ˆà¸­à¸Šà¹ˆà¸§à¸¢à¸ªà¸·à¸šà¸ªà¸§à¸™à¸›à¸±à¸à¸«à¸²à¸™à¸µà¹‰">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus ไม่บล็อà¸à¹‚ฆ&amp;ษณา">
+<!ENTITY typeSelector.heading "เลือà¸à¸Šà¸™à¸´à¸”ของปัà¸à¸«à¸²">
+<!ENTITY wizard.title "รายงานปัà¸à¸«à¸²">
+<!ENTITY issues.ownfilters.disable.label "ปิดใช้งานตัวà¸à¸£à¸­à¸‡">
+<!ENTITY commentPage.description "ช่องว่างนี้ให้คุณใส่ความคิดเห็นเพื่อช่วยให้เราเข้าใจปัà¸à¸«à¸² ใส่หรือไม่ใส่à¸à¹‡à¹„ด้ คุณสามารถทบทวนรายงานอีà¸à¸„รั้งà¸à¹ˆà¸­à¸™à¸ªà¹ˆà¸‡à¹„ด้">
+<!ENTITY comment.lengthWarning "ความคิดเห็นยาวเà¸à¸´à¸™ 1000 อัà¸à¸‚ระ ส่งได้à¹à¸„่ 1000 อัà¸à¸‚ระà¹à¸£à¸à¹€à¸—่านั้น">
+<!ENTITY typeSelector.falseNegative.description "เลือà¸à¸•ัวเลือà¸à¸™à¸µà¹‰à¸–้ายังมีโฆษณาอยู่à¹à¸¡à¹‰à¸§à¹ˆà¸²à¹ƒà¸Šà¹‰à¸‡à¸²à¸™ Adblock Plus à¹à¸¥à¹‰à¸§">
+<!ENTITY sendPage.waitMessage "Adblock Plus à¸à¸³à¸¥à¸±à¸‡à¸ªà¹ˆà¸‡à¸£à¸²à¸¢à¸‡à¸²à¸™ à¸à¸£à¸¸à¸“ารอ">
+<!ENTITY dataCollector.heading "ยินดีต้อนรับสู่à¸à¸²à¸£à¸£à¸²à¸¢à¸‡à¸²à¸™à¸›à¸±à¸à¸«à¸²">
+<!ENTITY screenshot.heading "à¹à¸™à¸šà¸ à¸²à¸žà¸«à¸™à¹‰à¸²à¸ˆà¸­">
+<!ENTITY sendPage.heading "ส่งรายงาน">
+<!ENTITY issues.subscriptionCount.description "ดูเหมือนว่าคุณจะรับข้อมูลจาà¸à¸•ัวà¸à¸£à¸­à¸‡à¸¡à¸²à¸à¹€à¸à¸´à¸™à¹„ป à¸à¸²à¸£à¸•ิดตั้งนี้จึงไม่à¹à¸™à¸°à¸™à¸³à¹€à¸žà¸£à¸²à¸°à¸­à¸²à¸ˆà¸—ำให้มีปัà¸à¸«à¸²à¸¡à¸²à¸ เราจะไม่รับรายงานปัà¸à¸«à¸²à¸ˆà¸²à¸à¸„ุณเพราะไม่ทราบว่าปัà¸à¸«à¸²à¸¡à¸²à¸ˆà¸²à¸à¸•ัวà¸à¸£à¸­à¸‡à¸•ัวใด à¸à¸£à¸¸à¸“าลบออà¸à¹€à¸«à¸¥à¸·à¸­à¹à¸•่ตัวที่จำเป็นà¹à¸¥à¸°à¸—ดสอบดูว่าปัà¸à¸«à¸²à¹€à¸à¸´à¸”จาà¸à¸•ัวใด">
+<!ENTITY screenshot.mark.label "เ&amp;น้นส่วนที่เป็นปัà¸à¸«à¸²">
+<!ENTITY privacyPolicy.label "ความเป็นส่วนตัว">
+<!ENTITY issues.description "Adblock Plus ตรวจพบปัà¸à¸«à¸²à¸à¸²à¸£à¸•ั้งค่าของคุณที่อาจจะเà¸à¸µà¹ˆà¸¢à¸§à¸à¸±à¸šà¸›à¸±à¸à¸«à¸²à¸™à¸µà¹‰à¸«à¸£à¸·à¸­à¸—ี่ทำให้à¸à¸²à¸£à¸ªà¸·à¸šà¸ªà¸§à¸™à¸£à¸²à¸¢à¸‡à¸²à¸™à¸¢à¸²à¸à¸‚ึ้น">
+<!ENTITY email.label "E&amp;mail:">
+<!ENTITY anonymous.label "&amp;Anonymous submission">
+<!ENTITY emailComment.label "We encourage you to enter a valid email address so that we can contact you if there are questions
+ about your report. It will also allow us to recognize your contributions and to prioritize them higher.">
+<!ENTITY anonymity.warning "We won't be able to come back to you and will likely prioritize the report lower.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/sidebar.dtd
new file mode 100644
index 0000000..9dc7457
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "ขอบของรายà¸à¸²à¸£à¹à¸Ÿà¸¥à¸Š">
+<!ENTITY address.label "ที่อยู่">
+<!ENTITY context.open.label "เปิดในà¹à¸—็บใหม่">
+<!ENTITY type.label "ชนิด">
+<!ENTITY tooltip.filterSource.label "ตัวà¸à¸£à¸­à¸‡à¹à¸«à¸¥à¹ˆà¸‡à¸—ี่มา:">
+<!ENTITY noitems.label "ไม่มีรายà¸à¸²à¸£à¸—ี่บล็อคได้">
+<!ENTITY filter.label "ตัวà¸à¸£à¸­à¸‡">
+<!ENTITY tooltip.size.label "ขนาด:">
+<!ENTITY reattach.label "à¹à¸™à¸šà¸à¸¥à¸±à¸š">
+<!ENTITY search.label "&amp;ค้นหา:">
+<!ENTITY docDomain.thirdParty "(เทิร์ดปาร์ตี้)">
+<!ENTITY filterSource.label "ตัวà¸à¸£à¸­à¸‡à¸•้นฉบับ">
+<!ENTITY tooltip.docDomain.label "à¹à¸«à¸¥à¹ˆà¸‡à¸—ี่มาเอà¸à¸ªà¸²à¸£:">
+<!ENTITY context.copy.label "คัดลอà¸à¸—ี่อยู่รายà¸à¸²à¸£">
+<!ENTITY tooltip.type.label "ชนิด:">
+<!ENTITY context.disablefilter.label "ปิดตัวà¸à¸£à¸­à¸‡ ?1?">
+<!ENTITY context.copyFilter.label "คัดลอà¸à¸•ัวà¸à¸£à¸­à¸‡">
+<!ENTITY context.block.label "บล็อครายà¸à¸²à¸£à¸™à¸µà¹‰">
+<!ENTITY context.enablefilter.label "เปิดตัวà¸à¸£à¸­à¸‡ ?1? อีà¸à¸„รั้ง">
+<!ENTITY detach.label "à¹à¸¢à¸à¸­à¸­à¸">
+<!ENTITY whitelisted.label "หน้าที่ถูà¸à¸‚ึ้นบัà¸à¸Šà¸µà¸‚าว">
+<!ENTITY context.disablefilteronsite.label "ปิดตัวà¸à¸£à¸­à¸‡à¸™à¸µà¹‰à¸šà¸™ ?1?">
+<!ENTITY detached.title "Adblock Plus: รายà¸à¸²à¸£à¸—ี่บล็อà¸à¹„ด้ (ถูà¸à¹à¸¢à¸à¸­à¸­à¸)">
+<!ENTITY docDomain.firstParty "(เฟิร์สปาร์ตี้)">
+<!ENTITY tooltip.type.whitelisted "(ขึ้นบัà¸à¸Šà¸µà¸‚าว)">
+<!ENTITY tooltip.filter.label "เป็นผลมาจาà¸à¸•ัวà¸à¸£à¸­à¸‡:">
+<!ENTITY tooltip.filter.disabled "(ปิดà¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™)">
+<!ENTITY context.editfilter.label "à¹à¸à¹‰à¹„ขตัวà¸à¸£à¸­à¸‡à¸—ี่มีผล">
+<!ENTITY tooltip.type.blocked "(ถูà¸à¸šà¸¥à¹‡à¸­à¸„)">
+<!ENTITY size.label "ขนาด">
+<!ENTITY context.whitelist.label "เพิ่มข้อยà¸à¹€à¸§à¹‰à¸™à¸ªà¸³à¸«à¸£à¸±à¸šà¸£à¸²à¸¢à¸à¸²à¸£">
+<!ENTITY context.selectAll.label "เลือà¸à¸—ั้งหมด">
+<!ENTITY state.label "สถานะ">
+<!ENTITY docDomain.label "à¹à¸«à¸¥à¹ˆà¸‡à¸—ี่มาเอà¸à¸ªà¸²à¸£">
+<!ENTITY tooltip.address.label "ที่อยู่:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/subscriptionSelection.dtd
new file mode 100644
index 0000000..802aa7e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/th/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "เพิ่มนามข้างท้ายตั&amp;วà¸à¸£à¸­à¸‡ &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plus ไม่สามารถà¸à¸¹à¹‰à¸„ืนรายà¸à¸²à¸£à¸™à¸²à¸¡à¸‚้างท้ายได้">
+<!ENTITY list.download.retry "ลองอีà¸à¸„รั้ง">
+<!ENTITY title.label "&amp;ชื่อ:">
+<!ENTITY list.download.website "ดูเว็บไซต์">
+<!ENTITY supplementMessage "นามข้างท้ายตัวà¸à¸£à¸­à¸‡à¸™à¸µà¹‰à¸•ั้งใจไว้ใช้à¸à¸±à¸šà¸™à¸²à¸¡à¸‚้างท้ายตัวà¸à¸£à¸­à¸‡ &quot;?1?&quot; ซึ่งคุณยังไม่ได้ใช้">
+<!ENTITY viewList.label "ดูตัวà¸à¸£à¸­à¸‡">
+<!ENTITY visitHomepage.label "เยี่ยมชมโฮมเพจ">
+<!ENTITY addSubscription.label "เพิ่มนามข้างท้ายตัวà¸à¸£à¸­à¸‡">
+<!ENTITY dialog.title "เพิ่มนามข้างท้ายตัวà¸à¸£à¸­à¸‡ Adblock Plus">
+<!ENTITY location.label "ที่อยู่&amp;รายชื่อตัวà¸à¸£à¸­à¸‡:">
+<!ENTITY fromWeb.description "à¸à¸£à¸¸à¸“ายืนยันว่าคุณต้องà¸à¸²à¸£à¹€à¸žà¸´à¹ˆà¸¡à¸™à¸²à¸¡à¸‚้างท้ายตัวà¸à¸£à¸­à¸‡à¸™à¸µà¹‰ คุณสามารถเปลี่ยนหัวเรื่องนามข้างท้ายหรือตำà¹à¸«à¸™à¹ˆà¸‡à¸à¹ˆà¸­à¸™à¹€à¸žà¸´à¹ˆà¸¡à¹€à¸‚้ามาได้">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/composer.dtd
new file mode 100644
index 0000000..67be4e6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "adresin s&amp;onunda">
+<!ENTITY domainRestriction.label "Alan a&amp;dına kısıtlama:">
+<!ENTITY collapse.default.no.label "Öntanımlı kullan (hayır)">
+<!ENTITY firstParty.label "Yalnız b&amp;irinci kişilerden">
+<!ENTITY preferences.label "Mevcut süzgeçleri &amp;göster...">
+<!ENTITY pattern.label "Aranacak örnek">
+<!ENTITY thirdParty.label "Yalnız üçün&amp;cü kişilerden">
+<!ENTITY filter.label "&amp;Yeni süzgeç:">
+<!ENTITY collapse.label "Engellenenleri ka&amp;pat:">
+<!ENTITY match.warning "Girdiğiniz örnek, engellenecek veya kara listeden çıkarılacak adresle eşleşmiyor ve üzerinde hiçbir etkisi olmayacak.">
+<!ENTITY anchor.start.label "adresin &amp;başında">
+<!ENTITY matchCase.label "&amp;Büyük küçük harf duyarlı">
+<!ENTITY custom.pattern.label "&amp;Özel:">
+<!ENTITY unselectAllTypes.label "Hiçbirini seçme">
+<!ENTITY type.whitelist.label "&amp;Hariç tutma kuralı">
+<!ENTITY regexp.warning "Girdiğiniz örnek düzenli ifade olarak yorumlanacak. Adblock Plus tarafından doğru işlenemeyebilir ve taramayı yavaşlatabilir. Düzenli ifade olarak kullanmak istediğinizden emin değilseniz örneğin sonuna yıldız (*) işareti koyun.">
+<!ENTITY dialog.title "Adblock Plus süzgeç kuralı ekle">
+<!ENTITY basic.label "Temel görünüm">
+<!ENTITY type.filter.label "Engelleme süzgeci">
+<!ENTITY types.label "Bu türlere uygula:">
+<!ENTITY shortpattern.warning "Girdiğiniz örnek en iyilemek için çok kısa ve bu tür örnekler taramayı yavaşlatabilir. Adblock Plus'ın bu süzgeci daha etkin işleyebilmesi için daha uzun bir satır seçmeniz tavsiye edilir.">
+<!ENTITY collapse.yes.label "Evet">
+<!ENTITY anchors.label "Örneği sadece burada kabul et:">
+<!ENTITY collapse.default.yes.label "Öntanımlı kullan (evet)">
+<!ENTITY domainRestriction.help "Aralarına &quot;|&quot; simgesi koyarak bir ya da daha fazla alan adı belirtin. Böylece süzgeç sadece bu sitelerde uygulanacaktır. Alan adından önce &quot;~&quot; simgesi kullanılması, süzgecin o alan adında kullanılmaması gerektiği anlamına gelir.">
+<!ENTITY accept.label "Süzgeç ekle">
+<!ENTITY options.label "Seçenekler">
+<!ENTITY disabled.warning "Adblock Plus şu an devre dışı. Yine de süzgeç ekleyebilirsiniz, ancak bunlar [link]Adblock Plus etkinleştirilene kadar[/link] uygulanmayacaktır.">
+<!ENTITY anchor.start.flexible.label "alan adının &amp;başında">
+<!ENTITY collapse.no.label "Hayır">
+<!ENTITY selectAllTypes.label "Tümünü seç">
+<!ENTITY advanced.label "Gelişmiş görünüm">
+<!ENTITY pattern.explanation "Bu örnek adresin herhangi bir bölümü olabilir ve * işareti joker görevi yapar. Süzgeç sadece örneğe uyan adreslere uygulanacak.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/filters.dtd
new file mode 100644
index 0000000..8c7ac35
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/filters.dtd
@@ -0,0 +1,74 @@
+<!ENTITY restore.custom.warning "Tüm isteğe bağlı süzgeçleriniz seçilen dosyanın içeriğiyle değiştirilecek. Devam etmek istiyor musunuz?">
+<!ENTITY slow.column "Ya&amp;vaş süzgeçler">
+<!ENTITY enabled.column "Etkin">
+<!ENTITY subscription.lastDownload.checksumMismatch "Olmadı. Sağlama yapılamadı">
+<!ENTITY noFiltersInGroup.text "Seçili öbek boş">
+<!ENTITY subscription.actions.label "Eylemler">
+<!ENTITY filter.selectAll.label "Tümünü seç">
+<!ENTITY backupButton.label "&amp;Yedekle ve geri getir">
+<!ENTITY restore.minVersion.warning "Uyarı: Dosya Adblock Plus'ın daha yeni bir sürümüyle oluşturulmuş. Bu dosyayı geri getirmeden önce Adblock Plus'ı en güncel sürümüne yükseltmelisiniz.">
+<!ENTITY restore.error "Dosya verisi iÅŸlenemiyor. Adblock Plus yedeÄŸi olmayabilir mi?">
+<!ENTITY sort.ascending.label "&amp;A'da Z'ye sıralama">
+<!ENTITY sort.label "&amp;Sırala">
+<!ENTITY subscription.source.label "Süzgeç listesi">
+<!ENTITY hitcount.column "İsab&amp;et">
+<!ENTITY noFilters.text "İsteğe göre ayarlanmış hiçbir süzgeciniz yok.">
+<!ENTITY backup.custom.title "Sadece isteğe bağlı süzgeçler">
+<!ENTITY subscription.external.label "Başka bir eklenti tarafından güncellendi">
+<!ENTITY subscription.delete.label "Sil">
+<!ENTITY noGroupSelected.text "Süzgeçlerini görmek için bir süzgeç öbeği seçmeniz gerekiyor.">
+<!ENTITY filter.cut.label "Kes">
+<!ENTITY restore.default.label "?1? tarihli yedek geri getirilsin mi?">
+<!ENTITY subscription.lastDownload.inProgress "İndiriliyor...">
+<!ENTITY subscriptions.tab.label "Süzgeç abonelikleri">
+<!ENTITY sort.descending.label "&amp;Z'den A'ya sıralama">
+<!ENTITY filters.remove.warning "Tüm seçili süzgeçleri gerçekten silmek istiyor musunuz?">
+<!ENTITY filter.delete.label "Sil">
+<!ENTITY addSubscriptionAdd.label "Ekle">
+<!ENTITY viewMenu.label "Görünüm">
+<!ENTITY subscription.lastDownload.unknown "Yok">
+<!ENTITY addSubscriptionCancel.label "Vazgeç">
+<!ENTITY subscription.enabled.label "Etkin">
+<!ENTITY noSubscriptions.text "Henüz hiçbir süzgeç aboneliği eklemediniz. Adblock Plus süzgeç olmadan hiçbir şey
+ engellemeyecektir. Abonelik eklemek için
+ lütfen &quot;Süzgeç aboneliği ekle&quot; düğmesini kullanın.">
+<!ENTITY subscription.update.label "Süzgeçleri güncelle">
+<!ENTITY dialog.title "Adblock Plus Süzme Tercihleri">
+<!ENTITY addFilter.label "Süzgeç e&amp;kle">
+<!ENTITY subscription.minVersion.warning "Bu süzgeç aboneliği daha yeni bir Adblock Plus sürümü gerektiriyor. En güncel Adblock Plus sürümüne yükseltmelisiniz.">
+<!ENTITY subscription.lastDownload.invalidURL "Olmadı. Bu geçerli bir adres değil.">
+<!ENTITY backup.error "Süzgeçler dosyaya yazılırken bir sorun meydana geldi. Dosyanın yazma korumalı veya başka bir uygulama tarafından kullanılmıyor olduğundan emin olun.">
+<!ENTITY filter.moveUp.label "Yukarıya taşı">
+<!ENTITY addGroup.label "Sü&amp;zgeç öbeği ekle">
+<!ENTITY filter.edit.label "Düzenle">
+<!ENTITY subscription.showHideFilters.label "Süzgeçleri göster/gizle">
+<!ENTITY acceptableAds2.label "Rahatsız etmeyen bazı reklamlara &amp;izin ver">
+<!ENTITY addSubscriptionOther.label "BaÅŸka abonelik ekle">
+<!ENTITY close.label "Kapat">
+<!ENTITY sort.none.label "Sıralan&amp;mamış">
+<!ENTITY filter.actions.label "Süzgeç eylemleri">
+<!ENTITY filter.copy.label "Kopyala">
+<!ENTITY filter.moveDown.label "Aşağıya taşı">
+<!ENTITY filter.resetHitCounts.label "İsabet istatistiklerini sıfırla">
+<!ENTITY readMore.label "Daha fazla bilgi al">
+<!ENTITY subscription.moveUp.label "Yukarıya taşı">
+<!ENTITY addSubscription.label "Süzgeç aboneliği ekle">
+<!ENTITY subscription.homepage.label "Ana sayfa">
+<!ENTITY backup.complete.title "Tüm süzgeç ve abonelikler">
+<!ENTITY restore.own.label "Kendi yedeÄŸini geri getir">
+<!ENTITY restore.complete.warning "Tüm süzme tercihleriniz seçilen dosyanın içeriğiyle değiştirilecek. Devam etmek istiyor musunuz?">
+<!ENTITY filters.tab.label "İsteğe bağlı süzgeçler">
+<!ENTITY backup.label "Yeni yedek oluÅŸtur">
+<!ENTITY find.label "&amp;Bul">
+<!ENTITY subscription.moveDown.label "Aşağıya taşı">
+<!ENTITY subscription.lastDownload.connectionError "Olmadı. İndirmede sorun var.">
+<!ENTITY subscription.lastDownload.success "Eşleme başarılı oldu.">
+<!ENTITY subscription.lastDownload.invalidData "Olmadı. Bu düzgün bir süzgeç listesi değil.">
+<!ENTITY filter.paste.label "Yapıştır">
+<!ENTITY subscription.disabledFilters.enable "Devre dışı süzgeçleri devreye sok">
+<!ENTITY lasthit.column "Son isabet">
+<!ENTITY subscription.editTitle.label "Başlığı değiştir">
+<!ENTITY subscription.disabledFilters.warning "Bu abonelikteki bazı süzgeçler devre dışı.">
+<!ENTITY filter.column "Süzgeç &amp;kuralı">
+<!ENTITY subscription.lastDownload.label "Son indirme zamanı:">
+<!ENTITY viewList.label "Listeye bak">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/firstRun.properties
new file mode 100644
index 0000000..e7c76d5
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Her hareketinizi izleyen reklam şirketlerin adımlarınızı gizleyin. İnternette izlenmeyi devre dışı bırakarak gezin.
+firstRun_toggle_off=KAPALI
+firstRun_feature_tracking=İzlenmeyi Devre Dışı Bırak
+firstRun_feature_malware=Zararlı Yazılım Engelleme
+firstRun_title=Adblock Plus yüklendi
+firstRun_toggle_on=AÇIK
+firstRun_acceptableAdsExplanation=Siteleri basit ve rahatsız etmeyen reklamlar yayınlamaya teşvik ediyoruz. Bu yüzden varsayılan ayarlar altında gösterilen, makul reklamları tanımlayan <a>sıkı kuralları</a> kabul ettik. Yine de tüm reklamları engellemek istiyorsanız <a>devre dışı bırakma</a> işini birkaç saniye içinde yapabilirsiniz.
+firstRun_contributor_credits=Emeği Geçenler
+firstRun_dataCorruptionWarning=Bu sayfa sürekli gösteriliyor mu? <a>Buraya tıklayın!</a>
+firstRun_acceptableAdsHeadline=Rahatsız edici reklamlar artık engellenecek
+firstRun_share=Arkadaşlarınıza bahsedin
+firstRun_share_headline=İnterneti daha iyi bir yer yapabilmek için <a>bize elinizi uzatın</a>
+firstRun_feature_social_description=Sayfalarda çıkan ve davranışlarınızı takip eden Facebook'un "Beğen" düğmesi gibi sosyal medya düğmelerinden kurtulun.
+firstRun_filterlistsReinitializedWarning=Görünüşe göre bir sorun tüm filtrelerinizin kaldırılmasına neden olmuş ve bir yedeği geri yükleyemiyoruz. Bu yüzden filtrelerinizi ve Kabul Edilebilir Reklamlar ayarlarınızı sıfırlamamız gerekiyordu. Lütfen <a>Adblock Plus seçenekleri</a> bölümünde filtre listelerinizi ve Kabul Edilebilir Reklamlar ayarlarınızı denetleyin.
+firstRun_feature_malware_description=Bilinen kötü amaçlı yazılıma sahip alan adlarını engelleyerek gezintinizi daha güvenli hale getirin.
+firstRun_features=Adblock Plus reklamları engellemekten daha fazlasını yapabilir
+firstRun_donate=bağış yapın
+firstRun_donate_label=Projemize destek verin
+firstRun_feature_social=Sosyal Medya Düğmelerini Kaldır
+firstRun_legacySafariWarning=Safari'nin Adblock Plus tarafından desteklenmeyen eski bir sürümünü kullanıyorsunuz. Uygulama doğru şekilde çalışmayabilir veya bazı internet sitelerinde kullanıcı deneyimini olumsuz etkileyebilir. Sürümünüzü Safari 6.1.1 veya daha yüksek (OS X 10.8 Mountain Lion için), ya da Safari 7.0.1 veya daha yüksek (OS X 10.9 Mavericks için) bir sürüme yükseltmenizi, veya Mozilla Firefox, Google Chrome ya da Opera'nın en son sürümünü kullanmanızı önemle tavsiye ederiz.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/global.properties
new file mode 100644
index 0000000..bf4bc48
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Bakılan sayfada engellenebilecek bir öğe bulunmuyor
+action3_tooltip=Adblock Plus'ı etkinleştirmek ya da etkisizleştirmek için orta düğmeye tıklayın.
+notification_antiadblock_title=Hedeflenen iletileri gizlemek istiyor musunuz?
+type_label_script=betik
+filter_elemhide_nocriteria=Gizlenecek bileşeni anlamak için hiçbir ölçüt belirtilmedi
+blockingGroup_title=Reklam Engelleme Kuralları
+whitelisted_tooltip=Adblock Plus etkin, ancak bu sayfada devre dışı.
+type_label_stylesheet=biçem yaprağı
+blocked_count_tooltip=toplamda ?1?, sayfada ?2?
+type_label_font=yazı tipi
+type_label_popup=açılır pencere
+filter_regexp_tooltip=Süzgeç ya düzenli ifade ya da en iyileştirilmek için çok kısa. Bu süzgeçlerden çok fazlası, taramanızı yavaşlatabilir.
+action0_tooltip=İçerik menüsünü açmak için tıklayın; etkinleştirmek ya da etkisizleştirmek için orta düğmeye tıklayın.
+whitelisted_page=Adblock Plus bakılan sayfa için devre dışı bırakıldı
+remove_group_warning=Bu grubu kaldırmayı gerçekten istiyor musunuz?
+action1_tooltip=Engellenebilir öğeleri açmak ya da kapatmak için tıklayın; etkinleştirmek ya da etkisizleştirmek için orta düğmeye tıklayın.
+type_label_xmlhttprequest=XML isteÄŸi
+active_tooltip=Adblock Plus devrede ve ?1? süzgeç aboneliği ile ?2? özel süzgeç kullanıyor.
+type_label_document=belge
+type_label_object_subrequest=nesne alt isteÄŸi
+whitelistGroup_title=Hariç Tutma Kuralları
+disabled_tooltip=Adblock Plus etkin deÄŸil.
+filter_elemhide_duplicate_id=Gizlenecek sadece bir bileÅŸen kimliÄŸi belirtilebilir
+type_label_object=nesne
+action2_tooltip=Tercihler penceresini açmak için tıklayın; etkinleştirmek ya da etkisizleştirmek için orta düğmeye tıklayın.
+type_label_subdocument=çerçeve
+clearStats_warning=Bu hareket isabet istatistiklerinin sıfırlanması ve artık istatistik tutulmamasıyla sonuçlanacak. Devam etmek istiyor musunuz?
+notification_antiadblock_message=Bu site Adblock Plus kullanıcılarına hedeflenen iletiler göstermesiyle bilinir. Adblock Plus'ın hedeflenen iletileri gizlemesini istiyor musunuz?
+blocked_count_addendum=(ayrıca ?1? tane ak listede, ?2? tane gizli)
+subscription_invalid_location=Dosya listesi konumu ne düzgün bir URL ne de düzgün bir ada sahip.
+type_label_image=resim
+remove_subscription_warning=Gerçekten abonelikten çıkmak istiyor musunuz?
+type_label_other=diÄŸer
+mobile_menu_enable=ABP: EtkinleÅŸtir
+type_label_media=ses/görüntü
+mobile_menu_disable_site=ABP: ?1? sitesinde etkisizleÅŸtirilsin mi?
+elemhideGroup_title=Öğe Gizleme Kuralları
+mobile_menu_enable_site=ABP: ?1? sitesinde etkinleÅŸtirilsin mi?
+type_label_elemhide=gizli
+newGroup_title=Yeni süzgeç öbeği
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/overlay.dtd
new file mode 100644
index 0000000..4cbbc1c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Evet">
+<!ENTITY notification.button.no "&amp;Hayır">
+<!ENTITY sync.label "Adblock Plus ayarlarını &amp;eşitle">
+<!ENTITY whitelist.site.label "?1? sitesinde devre dışı kal">
+<!ENTITY filters.label "&amp;Süzgeç tercihleri">
+<!ENTITY disable.label "Her yerde devre dışı kal">
+<!ENTITY objecttab.title "Engelle">
+<!ENTITY objecttab.tooltip "Bu nesneyi Adblock Plus ile engellemek için buraya tıklayın.">
+<!ENTITY menuitem.label "Adblock Plus Tercihleri">
+<!ENTITY objecttabs.label "Flash ve &amp;Java'yı kulakçıklarla belirt">
+<!ENTITY sendReport.label "&amp;Bu sayfadaki sorunu bildir">
+<!ENTITY whitelist.page.label "Sadece bu sayfada devre dışı kal">
+<!ENTITY context.image.label "Adblock Plus: Resmi engelle">
+<!ENTITY counthits.label "Süzgeç isa&amp;betini say">
+<!ENTITY opensidebar.label "E&amp;ngellenebilecek öğeleri göster">
+<!ENTITY notification.button.close "&amp;Kapat">
+<!ENTITY contribute.label "Adblock Plus'a katkıda bulun">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Çerçeveyi engelle">
+<!ENTITY blocked.tooltip "Bu sayfada engellenen öğeler:">
+<!ENTITY hideplaceholders.label "Enge&amp;llenen öğelerin yer işaretlerini gizle">
+<!ENTITY showinstatusbar.label "&amp;Durum çubuğunda göster">
+<!ENTITY sidebar.title "Bu sayfadaki engellenebilecek öğeler">
+<!ENTITY options.label "S&amp;eçenekler">
+<!ENTITY context.object.label "Adblock Plus: Nesneyi engelle">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Bu sayfada devreye sok">
+<!ENTITY filters.tooltip "En etkin süzgeçler:">
+<!ENTITY closesidebar.label "E&amp;ngellenebilecek öğeleri gizle">
+<!ENTITY showintoolbar.label "A&amp;raç çubuğunda göster">
+<!ENTITY status.tooltip "Durum:">
+<!ENTITY context.media.label "Adblock Plus: Ses/video engelle">
+<!ENTITY subscription.update.label "Süzgeçleri güncelle">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/sendReport.dtd
new file mode 100644
index 0000000..c187ec1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Geri al">
+<!ENTITY issues.disabledgroups.description "Bu sayfada etkisi olabilecek aşağıdaki abonelikler ve süzgeç grupları devre dışı bırakıldı:">
+<!ENTITY showData.label "Bildirim verisini göster">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus çok &amp;fazla engelleme yapıyor">
+<!ENTITY issues.change.description "Yapılandırmanız değişti. Lütfen değişiklikleri sınamak için sayfayı yeniden yükleyin ve yapılan değişiklikler sorunu gidermediyse hatayı bildirin.">
+<!ENTITY email.label "E-&amp;posta:">
+<!ENTITY issues.openPreferences.label "Süzgeç tercihlerini aç">
+<!ENTITY sendPage.confirmation "Bildiriminiz kaydedildi ve ona aşağıdaki adresten ulaşabilirsiniz:">
+<!ENTITY copyLink.label "Bildirimi bağlantısını &amp;kopyala">
+<!ENTITY issues.nofilters.description "Adblock Plus bu sayfada hiçbir şeyi engellemiyor. Gözlemlediğiniz sorun büyük olasılıkla Adblock Plus ile ilgisiz.">
+<!ENTITY sendPage.knownIssue "Bildirdiğiniz sorun büyük olasılıkla biliniyor. Daha fazla bilgi:">
+<!ENTITY typeSelector.other.description "Sorunun süzgeçlerinden çok Adblock Plus'ın kendisinden kaynaklandığından şüpheleniyorsanız bu seçeneği seçin.">
+<!ENTITY issues.disabledgroups.enable.label "Süzgeç aboneliğini veya grubunu devreye sok">
+<!ENTITY typeWarning.override.label "Anlıyorum ve ne olur&amp;sa olsun bildirimi göndermek istiyorum">
+<!ENTITY issues.disabled.enable.label "Adblock Plus'ı etkinleştir">
+<!ENTITY update.fixed.description "Süzgeç aboneliklerinize yapılan güncellemeler muhtemelen bildirmek istediğiniz sorunu giderdi. Sayfayı tekrar yükleyip bir daha deneyin, hâlâ sorun varsa bildirin.">
+<!ENTITY anonymous.label "&amp;Anonim gönder">
+<!ENTITY reloadButton.label "Sayfayı &amp;tazele">
+<!ENTITY recentReports.clear.label "Tüm bildirimleri sil">
+<!ENTITY typeSelector.description "Bu pencere Adblock Plus sorun bildirimi göndermek için gerekli adımların atılmasında size rehberlik edecek. Önce bu sayfada ne tür sorun yaşadığınızı seçin:">
+<!ENTITY screenshot.remove.label "Hassas &amp;veriyi sil">
+<!ENTITY issues.ownfilters.description "Bu sayfada uygulanan süzgeçlerin bazıları kullanıcı tarafından tanımlanmış. Lütfen soruna neden olmuş olabilecek süzgeçleri devre dışı bırakın:">
+<!ENTITY update.inProgress.description "Bu sorunun süzgeç güncellemesiyle giderilmesinin mümkün olup olmadığını tespit etmek için abonelikleriniz şimdi güncellenecektir. Lütfen bekleyin...">
+<!ENTITY sendPage.retry.label "Yeniden gönder">
+<!ENTITY data.label "Bildirim &amp;verisi:">
+<!ENTITY recentReports.label "Yakında gönderdiğiniz bildirimler">
+<!ENTITY typeWarning.description "Süzgeçlerle ilgili bir sorun değil de Adblock Plus ile ilgili genel bir sorun bildiriminde bulunmak istediğinizi belirttiniz. Lütfen böyle sorunların en iyi bildirim yerinin [link]Adblock Plus forumu[/link] olduğu aklınızda olsun. Siz bağlantı vermediğiniz sürece kimse bildiriminizi görmeyeceği için sorun bildiriciyi sadece mevcut bir tartışmaya katkı sağlamak için kullanmalısınız.">
+<!ENTITY issues.disabled.description "Adblock Plus devre dışı ve şu anki durumunda hiçbir şeyi engellemeyecek.">
+<!ENTITY attachExtensions.label "Sor&amp;un kaynağının eklenti uyumsuzluğu olup olmadığının belirlenmesi için etkin eklentilerin listesini bildirime ekle">
+<!ENTITY issues.nosubscriptions.add.label "Süzgeç aboneliği ekle">
+<!ENTITY issues.disabledfilters.enable.label "Süzgeci devreye sok">
+<!ENTITY issues.override.label "Yapılan&amp;dırma doğru, bildirime devam et">
+<!ENTITY issues.nosubscriptions.description "Sitelerdeki istenmeyen içeriği yok eden önceden hazırlanmış süzgeç listelerinden herhangi birine abone olmuş değilsiniz.">
+<!ENTITY typeSelector.falsePositive.description "Sayfanın önemli içeriği hiç görünmüyorsa, yanlış görünüyorsa veya sayfa düzgün işlemiyorsa bu seçeneği seçin. Sorun kaynağının Adblock Plus olup olmadığını eklentiyi geçici olarak devre dışı bırakıp belirleyebilirsiniz.">
+<!ENTITY typeSelector.other.label "BaÅŸka bir sorun">
+<!ENTITY emailComment.label "Sizi, raporunuz hakkında sorularımız olursa sizinle iletişime geçebilmemiz için geçerli bir e-posta adresi girmeye teşvik ediyoruz. Bu aynı zamanda katılımlarınızı hatırlamamızı ve önceliklerini yüksek olarak ayarlamamızı sağlar.">
+<!ENTITY issues.whitelist.remove.label "Adblock Plus'u bu sayfada devreye sok">
+<!ENTITY outdatedSubscriptions.description "Aşağıdaki süzgeç abonelikleri en az 2 haftadır güncellenmedi. Bildirmeden önce lütfen bu abonelikleri güncelleyin, sorun çoktan giderilmiş olabilir.">
+<!ENTITY dataCollector.description "Adblock Plus eklentisinin gerekli bilgileri toplaması için lütfen biraz bekleyin.">
+<!ENTITY sendButton.label "&amp;Bildirimi gönder">
+<!ENTITY comment.label "Y&amp;orum (isteğe bağlı):">
+<!ENTITY sendPage.errorMessage "Hata bildirimi gönderme girişiminiz &quot;?1?&quot; hata koduyla başarısız oldu. Lütfen internete bağlı olduğunuzdan emin olun ve yeniden deneyin. Sorun devam ederse lütfen [link]Adblock Plus forumunda[/link] yardım isteyin.">
+<!ENTITY showRecentReports.label "Yakında gönderilen bildirimleri göster">
+<!ENTITY commentPage.heading "Yorum ekle">
+<!ENTITY update.start.label "Güncellemeyi şimdi başlat">
+<!ENTITY issues.disabledfilters.description "Bu sayfada etkisi olabilecek aşağıdaki süzgeçler devre dışı bırakıldı:">
+<!ENTITY screenshot.description "Aynı sayfa farklı kişilerce farklı biçimde görülebilir. Bildirime ekran görüntüsü eklemeniz sorunu anlamamıza yardımcı olabilir. Hassas bilgilerin olduğu bölümleri silebilirsiniz ve sorunun görünür olduğu yerleri işaretleyebilirsiniz. Bunu yapmak için ilgili düğmeye basın ve resimde bir bölümü farenizle seçin.">
+<!ENTITY screenshot.attach.label "Bildirime say&amp;fa resmi ekle">
+<!ENTITY issues.whitelist.description "Adblock Plus bildirimde bulunduğunuz sayfada devre dışı. Bu sorunun incelenmesine yardım etmek için bildirim göndermeden önce eklentiyi devreye sokun ve sayfayı yeniden yükleyin.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus reklamın birini engellemiyor">
+<!ENTITY typeSelector.heading "Sorun türünü seçin">
+<!ENTITY anonymity.warning "Size geri dönemeyiz ve muhtemelen rapor önceliği düşük olarak ayarlanır.">
+<!ENTITY wizard.title "Sorun bildirici">
+<!ENTITY issues.ownfilters.disable.label "Süzgeci devre dışı bırak">
+<!ENTITY commentPage.description "Aşağıdaki metin alanı sorunu anlamamız için yorum yazmanıza olanak tanır. Bu adım isteğe bağlıdır ancak sorun açık değilse tavsiye edilir. Ayrıca bildirimi göndermeden önce gözden geçirebilirsiniz.">
+<!ENTITY comment.lengthWarning "Yorumunuzun uzunluğu 1000 karakteri aşıyor. Sadece ilk 1000 karakter gönderilecek.">
+<!ENTITY typeSelector.falseNegative.description "Adblock Plus devrede olmasına rağmen reklamın biri görünüyorsa bu seçeneği seçin.">
+<!ENTITY sendPage.waitMessage "Lüftfen Adblock Plus bildirimi gönderirken bekleyin.">
+<!ENTITY dataCollector.heading "Sorun bildiriciye hoÅŸ geldiniz">
+<!ENTITY screenshot.heading "Ekran görüntüsü ekle">
+<!ENTITY sendPage.heading "Bildirimi gönder">
+<!ENTITY issues.subscriptionCount.description "Çok fazla süzgeç listesine abone olduğunuz görülüyor. Böyle yapmanız tavsiye edilmez çünkü bu, sorun çıkma olasılığını daha da arttırır. Ayrıca hangi süzgeç aboneliği yazarının hatayı düzeltmesi gerektiği belirsiz olduğundan hata bildiriminizi kabul edemeyiz. Sadece gerçekten gerekli olan süzgeç abonelikleri dışında kalanlardan çıkın ve sorunun hâlâ yaşanıp yaşanmadığına bakın.">
+<!ENTITY screenshot.mark.label "Sorunu iÅŸ&amp;aretle">
+<!ENTITY privacyPolicy.label "Gizlilik politikası">
+<!ENTITY issues.description "Adblock Plus yapılandırmanızda bu sorunun nedeni olabilecek veya bildirimi incelemeyi güçleştirecek sorunlar keşfetti.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/sidebar.dtd
new file mode 100644
index 0000000..667d01f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Flash öğesinin sınırları">
+<!ENTITY address.label "Konum">
+<!ENTITY context.open.label "Yeni sekmede aç">
+<!ENTITY type.label "Tür">
+<!ENTITY tooltip.filterSource.label "Süzgeç kaynağı:">
+<!ENTITY noitems.label "Engellenebilecek öğe yok">
+<!ENTITY filter.label "Süzgeç">
+<!ENTITY tooltip.size.label "Boyut">
+<!ENTITY reattach.label "BirleÅŸtir">
+<!ENTITY search.label "&amp;Ara">
+<!ENTITY docDomain.thirdParty "(üçüncü taraf)">
+<!ENTITY filterSource.label "Süzgeç kaynağı">
+<!ENTITY tooltip.docDomain.label "Belge kaynağı:">
+<!ENTITY context.copy.label "Öğenin konumunu kopyala">
+<!ENTITY tooltip.type.label "Tür:">
+<!ENTITY context.disablefilter.label "?1? süzgecini devre dışı bırak">
+<!ENTITY context.copyFilter.label "Süzgeci kopyala">
+<!ENTITY context.block.label "Bu öğeyi engelle">
+<!ENTITY context.enablefilter.label "?1? süzgecini devreye sok">
+<!ENTITY detach.label "Ayır">
+<!ENTITY whitelisted.label "Ak listeye dahil bir sayfa">
+<!ENTITY context.disablefilteronsite.label "Bu süzgeci ?1? alan adında kullanma">
+<!ENTITY detached.title "Adblock Plus: Engellenebilecek öğeler (ayrıldı)">
+<!ENTITY docDomain.firstParty "(birinci taraf)">
+<!ENTITY tooltip.type.whitelisted "(ak listede)">
+<!ENTITY tooltip.filter.label "Yürürlükteki süzgeç:">
+<!ENTITY tooltip.filter.disabled "(devre dışı)">
+<!ENTITY context.editfilter.label "Yürürlükteki süzgeci düzelt">
+<!ENTITY tooltip.type.blocked "(engellendi)">
+<!ENTITY size.label "Boyut">
+<!ENTITY context.whitelist.label "Öğeye ayrıcalık tanı">
+<!ENTITY context.selectAll.label "Tümünü seç">
+<!ENTITY state.label "Durum">
+<!ENTITY docDomain.label "Belge kaynağı">
+<!ENTITY tooltip.address.label "Konum:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/subscriptionSelection.dtd
new file mode 100644
index 0000000..b60a9e2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/tr/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "&quot;?1?&quot; süzgecine de abone ol">
+<!ENTITY list.download.failed "Adblock Plus abonelik listesini alamadı">
+<!ENTITY list.download.retry "Yeniden dene">
+<!ENTITY title.label "&amp;Aboneliğin adı:">
+<!ENTITY list.download.website "Siteye git">
+<!ENTITY supplementMessage "Bu süzgeç aboneliği henüz kullanmadığınız &quot;?1?&quot; süzgeç aboneliğiyle kullanılmak üzere hazırlanmış.">
+<!ENTITY viewList.label "Süzgeçlere bak">
+<!ENTITY visitHomepage.label "Ana sayfaya git">
+<!ENTITY addSubscription.label "Abone ol">
+<!ENTITY dialog.title "Adblock Plus süzgeç aboneliği ekle">
+<!ENTITY location.label "Süzgeç &amp;listesi konumu:">
+<!ENTITY fromWeb.description "Lütfen bu süzgeç aboneliğini eklemek istediğinizi teyit edin. Eklemeden önce abonelik adını ve konumunu değiştirebilirsiniz.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/composer.dtd
new file mode 100644
index 0000000..68f86cb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "при &amp;кінці адреÑи">
+<!ENTITY domainRestriction.label "Об&amp;межити доменом">
+<!ENTITY collapse.default.no.label "Як завжди (ні)">
+<!ENTITY firstParty.label "То&amp;й же Ñайт">
+<!ENTITY preferences.label "Показати &amp;Ñ–Ñнуючі фільтри…">
+<!ENTITY pattern.label "Шукати шаблон">
+<!ENTITY thirdParty.label "С&amp;торонній Ñайт">
+<!ENTITY filter.label "Ðовий &amp;фільтр:">
+<!ENTITY collapse.label "З&amp;гортати заблоковане:">
+<!ENTITY match.warning "Вказаний шаблон не відповідає адреÑÑ–, Ð´Ð»Ñ Ñкої ви Ñтворюєте правило, Ñ– ніÑк на неї не вплине.">
+<!ENTITY anchor.start.label "на &amp;початку адреÑи">
+<!ENTITY matchCase.label "Ð’&amp;раховувати регіÑтр">
+<!ENTITY custom.pattern.label "І&amp;нше">
+<!ENTITY unselectAllTypes.label "Скинути вÑе">
+<!ENTITY type.whitelist.label "Пра&amp;вило винÑтку">
+<!ENTITY regexp.warning "Шаблон що ви ввели буде інтерпретовано Ñк регулÑрний вираз. Багато регулÑрних виразів можуть уповільнити переглÑд Ñторінок. Додайте * на кінець шаблону Ñкщо ви не збиралиÑÑŒ викориÑтовувати регулÑрний вираз.">
+<!ENTITY dialog.title "Додати правило Ñ„Ñ–Ð»ÑŒÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Adblock Plus">
+<!ENTITY basic.label "ПроÑтий виглÑд">
+<!ENTITY type.filter.label "Правило &amp;блокуваннÑ">
+<!ENTITY types.label "ЗаÑтоÑовувати до об’єктів:">
+<!ENTITY shortpattern.warning "Шаблон що ви ввели закороткий Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ñ–Ð·ÑƒÐ²Ð°Ð½Ð½Ñ, багато таких шаблонів можуть уповільнити переглÑд Ñторінок. Рекомендовано обрати довшу Ñтроку Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ фільтра">
+<!ENTITY collapse.yes.label "Так">
+<!ENTITY anchors.label "ЗаÑтоÑувати шаблон лише:">
+<!ENTITY collapse.default.yes.label "Як завжди (так)">
+<!ENTITY domainRestriction.help "Вкажіть один чи більше доменів, розділених Ñимволом „|“, фільтр буде заÑтоÑовано лише на них. Символ „~“ перед іменем домена вказує що фільтр на цей домен не розповÑюджуєтьÑÑ.">
+<!ENTITY accept.label "Додати фільтр">
+<!ENTITY options.label "ÐалаштуваннÑ">
+<!ENTITY disabled.warning "Adblock Plus наразі вимкнений. Ви можете додавати фільтри, але вони не будуть заÑтоÑовуватиÑÑ, доки Ви не [link]увімкнете Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "на &amp;початку імені домена">
+<!ENTITY collapse.no.label "ÐÑ–">
+<!ENTITY selectAllTypes.label "Вибрати вÑе">
+<!ENTITY advanced.label "Розширений виглÑд">
+<!ENTITY pattern.explanation "Шаблон може бути будь-Ñкою чаÑтиною адреÑи, Ñимвол * працює Ñк джокер. Фільтр буде заÑтоÑовано лише до Ð°Ð´Ñ€ÐµÑ Ñ‰Ð¾ відповідають шаблону.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/filters.dtd
new file mode 100644
index 0000000..2d0b05b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Ð’ÑÑ– ваші влаÑні фільтри будуть замінені вміÑтом вибраного файла. Продовжити?">
+<!ENTITY slow.column "Пов&amp;ільні фільтри">
+<!ENTITY enabled.column "У&amp;вімкнено">
+<!ENTITY subscription.lastDownload.checksumMismatch "Помилка, не збіглаÑÑŒ контрольна Ñума">
+<!ENTITY noFiltersInGroup.text "Вибрана група пуÑта.">
+<!ENTITY subscription.actions.label "Дії">
+<!ENTITY filter.selectAll.label "Вибрати вÑÑ–">
+<!ENTITY backupButton.label "&amp;Резервні копії та відновленнÑ">
+<!ENTITY restore.minVersion.warning "Увага: файл було Ñтворено новішою верÑією Adblock Plus.Вам Ñлід оновити Adblock Plus до оÑтанньої верÑÑ–Ñ— перш ніж відновлюватиÑÑŒ з цього файла.">
+<!ENTITY restore.error "Дані з файла неможливо обробити — може, це не Ñ” ÐдблоківÑька резервна копіÑ?">
+<!ENTITY sort.ascending.label "Від &amp;Рдо Я">
+<!ENTITY sort.label "&amp;Сортувати за">
+<!ENTITY subscription.source.label "Перелік фільтрів">
+<!ENTITY hitcount.column "&amp;Попадань">
+<!ENTITY noFilters.text "У Ð²Ð°Ñ Ð¿Ð¾ÐºÐ¸ нема влаÑних фільтрів.">
+<!ENTITY backup.custom.title "Лише влаÑні фільтри">
+<!ENTITY subscription.external.label "Оновлено іншим розширеннÑм">
+<!ENTITY subscription.delete.label "Видалити">
+<!ENTITY noGroupSelected.text "Ви маєте вибрати групу фільтрів до того Ñк Ñ—Ñ— фільтри можна буде показати.">
+<!ENTITY filter.cut.label "Вирізати">
+<!ENTITY restore.default.label "ВідновитиÑÑŒ з резервної копії ?1?">
+<!ENTITY subscription.lastDownload.inProgress "ЗавантажуєтьÑÑ…">
+<!ENTITY subscriptions.tab.label "ПідпиÑки на фільтри">
+<!ENTITY sort.descending.label "Від &amp;Я до Ð">
+<!ENTITY filters.remove.warning "Ви дійÑно хочете вилучити вÑÑ– вибрані фільтри?">
+<!ENTITY filter.delete.label "Вилучити">
+<!ENTITY addSubscriptionAdd.label "Додати">
+<!ENTITY viewMenu.label "ВиглÑд">
+<!ENTITY subscription.lastDownload.unknown "ніколи">
+<!ENTITY addSubscriptionCancel.label "СкаÑувати">
+<!ENTITY subscription.enabled.label "Увімкнено">
+<!ENTITY noSubscriptions.text "Ви поки не додали жодних підпиÑок. Ðдблок не буде блокувати нічого без фільтрів, будь лаÑка ÑкориÑтайтеÑÑŒ пунктом «Додати підпиÑку».">
+<!ENTITY subscription.update.label "Оновити фільтри">
+<!ENTITY dialog.title "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ñ–Ð² Ðдблоку">
+<!ENTITY addFilter.label "&amp;Додати фільтр">
+<!ENTITY subscription.minVersion.warning "Ð¦Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñка фільтрів потребує новішої верÑÑ–Ñ— Adblock Plus. Вам Ñлід оновитиÑÑŒ до оÑтанньої верÑÑ–Ñ— Adblock Plus.">
+<!ENTITY subscription.lastDownload.invalidURL "Помилка, невірна адреÑа">
+<!ENTITY backup.error "Під Ñ‡Ð°Ñ Ð·Ð°Ð¿Ð¸Ñу фільтрів у файл ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°. УпевнітьÑÑ, що файл не захищений від запиÑу Ñ– не викориÑтовуєтьÑÑ Ñ–Ð½ÑˆÐ¾ÑŽ програмою.">
+<!ENTITY filter.moveUp.label "ЗÑунути вверх">
+<!ENTITY addGroup.label "Додати &amp;групу фільтрів">
+<!ENTITY filter.edit.label "Редагувати">
+<!ENTITY subscription.showHideFilters.label "Сховати/показати фільтри">
+<!ENTITY acceptableAds2.label "Дозволити деÑку ненав'Ñзливу &amp;рекламу">
+<!ENTITY addSubscriptionOther.label "Додати іншу підпиÑку">
+<!ENTITY close.label "Закрити">
+<!ENTITY sort.none.label "&amp;ÐеÑортовано">
+<!ENTITY filter.actions.label "Дії з фільтрами">
+<!ENTITY filter.copy.label "Копіювати">
+<!ENTITY filter.moveDown.label "ЗÑунути вниз">
+<!ENTITY filter.resetHitCounts.label "Скинути ÑтатиÑтику">
+<!ENTITY readMore.label "Детальніше">
+<!ENTITY subscription.moveUp.label "ЗÑунути вверх">
+<!ENTITY addSubscription.label "Додати &amp;підпиÑку">
+<!ENTITY subscription.homepage.label "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка">
+<!ENTITY backup.complete.title "Ð’ÑÑ– фільтри та підпиÑки">
+<!ENTITY restore.own.label "ВідновитиÑÑŒ з влаÑної резервної копії">
+<!ENTITY restore.complete.warning "Ð’ÑÑ– ваші Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ñ–Ð² будуть замінені вміÑтом вибраного файла. Продовжити?">
+<!ENTITY filters.tab.label "ВлаÑні фільтри">
+<!ENTITY backup.label "Створити нову резервну копію">
+<!ENTITY find.label "З&amp;найти фільтр">
+<!ENTITY subscription.moveDown.label "ЗÑунути вниз">
+<!ENTITY subscription.lastDownload.connectionError "Помилка, неможливо викачати">
+<!ENTITY subscription.lastDownload.success "УÑпіх">
+<!ENTITY subscription.lastDownload.invalidData "Помилка, не правильний ÑпиÑок фільтрів">
+<!ENTITY filter.paste.label "Ð’Ñтавити">
+<!ENTITY subscription.disabledFilters.enable "Увімкнути вимкнені фільтри">
+<!ENTITY lasthit.column "&amp;ОÑтаннє попаданнÑ">
+<!ENTITY subscription.editTitle.label "Редагувати назву">
+<!ENTITY subscription.disabledFilters.warning "ДеÑкі фільтри у цій підпиÑці вимкнено.">
+<!ENTITY filter.column "Правило &amp;фільтруваннÑ">
+<!ENTITY subscription.lastDownload.label "ОÑтаннє оновленнÑ:">
+<!ENTITY viewList.label "ПереглÑд ÑпиÑку">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/firstRun.properties
new file mode 100644
index 0000000..f001239
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=ПереглÑдайте Ñайти анонімно шлÑхом Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ÑÑ‚ÐµÐ¶ÐµÐ½Ð½Ñ - Ð¿Ñ€Ð¸Ñ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ шлÑху від рекламних компаній, Ñкі хочуть відÑлідковувати кожний ваш крок.
+firstRun_toggle_off=ВИМКÐ
+firstRun_feature_tracking=Ð’Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ÑтеженнÑ
+firstRun_feature_malware=Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÑˆÐºÑ–Ð´Ð»Ð¸Ð²Ð¸Ñ… програм
+firstRun_title=Adblock Plus вже вÑтановлено
+firstRun_toggle_on=УВІМК
+firstRun_acceptableAdsExplanation=Ми хотіли б заохотити веб-Ñайти викориÑтовувати проÑту, ненав'Ñзливу рекламу. ОÑÑŒ чому ми вже Ñтворені <a>Ñуворі керівні принципи</a> Ð´Ð»Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— прийнÑтної реклами, Ñкі відображаютьÑÑ Ñƒ групі типових налаштувань. Якщо потрібно заблокувати кожну рекламу, то ви можете <a>вимкнути</a> це за декілька Ñекунд.
+firstRun_contributor_credits=ВнеÑки учаÑників
+firstRun_dataCorruptionWarning=Ð¦Ñ Ñторінка вÑе ще відображаєтьÑÑ? <a>ÐатиÑніть тут!</a>
+firstRun_acceptableAdsHeadline=Дратівлива реклама буде надалі блокуватиÑÑ
+firstRun_share=Розказати друзÑм
+firstRun_share_headline=<a>Подайте нам руку</a> Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÑ€Ð°Ñ‰Ð¾Ð³Ð¾ Ñередовища у мережі
+firstRun_feature_social_description=Ðвтоматично прибирає кнопки Ñоціальних мереж на кшталт Facebook, Ñкі з'ÑвлÑютьÑÑ Ð½Ð° веб-Ñторінках Ñ– відÑтежують вашу поведінку.
+firstRun_filterlistsReinitializedWarning=ЗдаєтьÑÑ, що помилка призвела до того, що вÑÑ– фільтри були знищені, Ñ– ми не можемо відновити резервну копію. Тому ми Ñкинули фільтри Ñ– Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½ÐµÐ½Ð°Ð²â€™Ñзливої реклами. Будь лаÑка, перевірте ÑпиÑок ваших фільтрів та Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½ÐµÐ½Ð°Ð²â€™Ñзливої реклами <a>Adblock Plus параметри</a>.
+firstRun_feature_malware_description=Убезпечте ваші переглÑд через Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð¼ÐµÐ½Ñ–Ð² відомих зловмиÑних програм.
+firstRun_features=Adblock Plus може зробити більше, ніж Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐºÐ»Ð°Ð¼Ð¸
+firstRun_donate=пожертва
+firstRun_donate_label=Підтримайте наш проект
+firstRun_feature_social=ВидалÑÑ” кнопки Ñоціальних мереж
+firstRun_legacySafariWarning=Ви викориÑтовуєте Ñтару верÑÑ–ÑŽ Safari, Ñка не підтримуєтьÑÑ Adblock Plus. Вона може не працювати належним чином або погіршувати ÑкіÑть роботи кориÑтувача на деÑких веб-Ñайтах. Ми наÑтійно рекомендуємо онвити до Safari 6.1.1 або вище (в OS X 10.8 Mounain Lion), або Safari 7.0.1 або вище (в OS X 10.9 Mavericks), або викориÑтовувати оÑтанню верÑÑ–ÑŽ Mozilla Firefox, Google Chrome або Mozilla.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/global.properties
new file mode 100644
index 0000000..8faed6d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Ðа відкритій Ñторінці немає елементів, Ñкі можна було б заблокувати
+action3_tooltip=Клацніть, щоб увімкнути чи вимкнути Adblock Plus.
+notification_antiadblock_title=Приховати цільові повідомленнÑ?
+type_label_script=Скрипт
+filter_elemhide_nocriteria=Ðе вказаний критерій за Ñким упізнати елемент, що буде приховано.
+blockingGroup_title=Правила блокуваннÑ
+whitelisted_tooltip=Adblock Plus увімкнено, проте не Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ñторінки.
+type_label_stylesheet=Стилі
+blocked_count_tooltip=?1? з ?2?
+type_label_font=шрифт
+type_label_popup=виринаюче вікно
+filter_regexp_tooltip=Цей фільтр або Ñ” регулÑрним виразом, або занадто короткий Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ñ–Ð·Ð°Ñ†Ñ–Ñ—. Забагато фільтрів можуть вповільнити переглÑд Ñторінок
+action0_tooltip=Клацніть, щоб відкрити контекÑтне меню. Ð¡ÐµÑ€ÐµÐ´Ð½Ñ ÐºÐ»Ð°Ð²Ñ–ÑˆÐ° миші — вкл/викл.
+whitelisted_page=Adblock Plus вимкнено Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ñторінки
+remove_group_warning=Ви дійÑно бажаєте видалити цю групу?
+action1_tooltip=Клацніть, щоб відкрити/закрити ÑпиÑок елементів. Ð¡ÐµÑ€ÐµÐ´Ð½Ñ ÐºÐ»Ð°Ð²Ñ–ÑˆÐ° миші — вкл/викл.
+type_label_xmlhttprequest=XML-запит
+active_tooltip=Adblock Plus увімкнено, задіÑно ?1? підпиÑок та ?2? влаÑних фільтрів.
+type_label_document=Документ
+type_label_object_subrequest=Запит об’єкта
+whitelistGroup_title=Правила винÑтків
+disabled_tooltip=Adblock Plus вимкнено.
+filter_elemhide_duplicate_id=Можна вказати лише один ID елемента, що буде приховано.
+type_label_object=Об’єкт
+action2_tooltip=Клацніть, щоб відкрити вікно налаштувань. Ð¡ÐµÑ€ÐµÐ´Ð½Ñ ÐºÐ»Ð°Ð²Ñ–ÑˆÐ° миші — вкл/викл.
+type_label_subdocument=Фрейм
+clearStats_warning=Це Ñкине вÑÑŽ ÑтатиÑтику по фільтрам та вимкне Ñ€Ð°Ñ…ÑƒÐ²Ð°Ð½Ð½Ñ Ñ…Ñ–Ñ‚Ñ–Ð². Продовжити?
+notification_antiadblock_message=Цей Ñайт відомий тим, що показує цільові Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачам Adblock Plus. Ви хочете, щоб Adblock Plus приховав цільові повідомленнÑ?
+blocked_count_addendum=(також відкрито: ?1?, приховано: ?2?)
+subscription_invalid_location=Ðе вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ñ–Ð·Ð½Ð°Ñ‚Ð¸ введену адреÑу ні Ñк інтернет адреÑу, ні Ñк шлÑÑ… до файлу.
+type_label_image=ЗображеннÑ
+remove_subscription_warning=Ви впевнені, що хочете вилучити цю підпиÑку?
+type_label_other=Інший
+mobile_menu_enable=ABP: Увімкнути
+type_label_media=аудіо/відео
+mobile_menu_disable_site=ABP: Вимкнути на ?1?
+elemhideGroup_title=Правила приховуваннÑ
+mobile_menu_enable_site=ABP: Увімкнути на ?1?
+type_label_elemhide=Приховане
+newGroup_title=Ðова група фільтрів
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/overlay.dtd
new file mode 100644
index 0000000..3928786
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Так">
+<!ENTITY notification.button.no "&amp;ÐÑ–">
+<!ENTITY sync.label "Синхроні&amp;зувати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ðдблоку">
+<!ENTITY whitelist.site.label "Вимкнути: на ?1?">
+<!ENTITY filters.label "&amp;ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ñ–Ð²">
+<!ENTITY disable.label "Вимкнути вÑюди">
+<!ENTITY objecttab.title "Заблокувати">
+<!ENTITY objecttab.tooltip "ÐатиÑніть тут, щоб заблокувати цей об’єкт">
+<!ENTITY menuitem.label "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ &amp;Adblock Plus">
+<!ENTITY objecttabs.label "Показувати &amp;Ñрлик на Flash Ñ– Java">
+<!ENTITY sendReport.label "Повідомити про проблеми на &amp;Ñторінці">
+<!ENTITY whitelist.page.label "Вимкнути: тільки на цій Ñторінці">
+<!ENTITY context.image.label "Adblock Plus: заблокувати зображеннÑ">
+<!ENTITY counthits.label "&amp;Рахувати хіти фільтрів">
+<!ENTITY opensidebar.label "Відкрити Ñ&amp;пиÑок елементів">
+<!ENTITY notification.button.close "&amp;Закрити">
+<!ENTITY contribute.label "Допомогти Ðдблоку">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: заблокувати фрейм">
+<!ENTITY blocked.tooltip "Заблоковані елементи на цій Ñторінці:">
+<!ENTITY hideplaceholders.label "При&amp;ховувати замінники заблокованих елементів">
+<!ENTITY showinstatusbar.label "Показувати в Ñ€Ñдку &amp;Ñтану">
+<!ENTITY sidebar.title "Елементи відкритої Ñторінки">
+<!ENTITY options.label "Ð&amp;алаштуваннÑ">
+<!ENTITY context.object.label "Adblock Plus: заблокувати об’єкт">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Знов увімкнути Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ñторінки">
+<!ENTITY filters.tooltip "Ðайбільш чаÑто заÑтоÑовані фільтри:">
+<!ENTITY closesidebar.label "Закрити Ñ&amp;пиÑок елементів">
+<!ENTITY showintoolbar.label "По&amp;казувати в панелі інÑтрументів">
+<!ENTITY status.tooltip "СтатуÑ:">
+<!ENTITY context.media.label "Adblock Plus: Блокувати аудіо/відео">
+<!ENTITY subscription.update.label "Оновити фільтри">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/sendReport.dtd
new file mode 100644
index 0000000..2f025d7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/sendReport.dtd
@@ -0,0 +1,70 @@
+<!ENTITY screenshot.undo.label "&amp;Повернути">
+<!ENTITY issues.disabledgroups.description "ÐаÑтупні фільтрові підпиÑки/групи вимкнені, але могли вплинути на цю Ñторінку:">
+<!ENTITY showData.label "Показати дані звіту">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus &amp;блокує забагато">
+<!ENTITY issues.change.description "Ваші Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÑƒÐ»Ð¾ змінено. Перегрузіть Ñторінку Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ внеÑених змін та зашліть звіт Ñкщо проблему не вирішено.">
+<!ENTITY email.label "&amp;Електронна пошта:">
+<!ENTITY issues.openPreferences.label "Відкрити фільтрові підпиÑки">
+<!ENTITY sendPage.confirmation "Звіт було запиÑано. Ви можете переглÑнути його за поÑиланнÑм:">
+<!ENTITY copyLink.label "С&amp;копіювати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð²Ñ–Ñ‚Ñƒ">
+<!ENTITY issues.nofilters.description "Adblock Plus не блокує нічого на поточній Ñторінці. Швидше за вÑе проблема, Ñку ви бачите, не пов’Ñзана з Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Проблема про Ñку ви повідомили вже відома. Детальніше:">
+<!ENTITY typeSelector.other.description "Виберіть цей варіант Ñкщо ви підозрюєте проблему Ñаме з Adblock Plus а не з його фільтрами.">
+<!ENTITY issues.disabledgroups.enable.label "Увімкнути фільтрову підпиÑку/групу">
+<!ENTITY typeWarning.override.label "Я &amp;розумію, та вÑе ж хочу надіÑлати звіт">
+<!ENTITY issues.disabled.enable.label "Увімкнути Adblock Plus">
+<!ENTITY update.fixed.description "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð°ÑˆÐ¸Ñ… підпиÑок на фільтри швидше за вÑе вирішило проблему, про Ñку ви хотіли повідомити. Будь лаÑка завантажте заново Ñторінку Ñ– Ñпробуйте ще раз. Якщо проблема залишилаÑÑ, то надішліть Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‰Ðµ раз.">
+<!ENTITY anonymous.label "&amp;Ðнонімне поданнÑ">
+<!ENTITY reloadButton.label "&amp;Перезавантажити Ñторінку">
+<!ENTITY recentReports.clear.label "&amp;Вилучити вÑÑ– звіти">
+<!ENTITY typeSelector.description "Це вікно проведе Ð²Ð°Ñ Ð¿Ð¾ кроках надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð²Ñ–Ñ‚Ñƒ про проблему з Adblock Plus. Спершу, виберіть тип проблеми з Ñкою ви зіткнулиÑÑŒ на цій Ñторінці:">
+<!ENTITY screenshot.remove.label "&amp;Вилучити конфіденційні дані">
+<!ENTITY issues.ownfilters.description "ДеÑкі з заÑтоÑованих фільтрів були задані кориÑтувачем. Вимкніть фільтри що могли Ñпричинити проблему.">
+<!ENTITY update.inProgress.description "Adblock Plus необхідно оновити ваші підпиÑки на фільтри, щоб переконатиÑÑ, що це Ð¿Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð½Ðµ було вирішено вже. Будь лаÑка, зачекайте...">
+<!ENTITY sendPage.retry.label "ÐадіÑлати ще раз">
+<!ENTITY data.label "&amp;Дані звіту:">
+<!ENTITY recentReports.label "Ваші недавно надіÑлані звіти">
+<!ENTITY typeWarning.description "Ви вказали що хочете повідомити про загальну проблему в Adblock Plus, а не в фільтрах. Зауважте, що про такі проблеми найкраще повідомлÑти до [link]форуму Adblock Plus[/link]. МайÑтер звітів Ñлід викориÑтовувати лише додатково до Ñ–Ñнуючої диÑкуÑÑ–Ñ—, оÑкільки ніхто не побачить вашого звіту, Ñкщо не поÑтавити на нього поÑиланнÑ. Ви отримаєте автоматично Ñтворене поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð²Ñ–Ñ‚Ñƒ.">
+<!ENTITY issues.disabled.description "Adblock Plus вимкнено, він не блокуватиме нічого у поточному Ñтані.">
+<!ENTITY attachExtensions.label "Долучити до звіту ÑпиÑок активних &amp;розширень — на випадок Ñкщо причиною проблеми Ñ” конфлікт розширень">
+<!ENTITY issues.nosubscriptions.add.label "Додати підпиÑку на фільтри">
+<!ENTITY issues.disabledfilters.enable.label "Увімкнути фільтр">
+<!ENTITY issues.override.label "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ &amp;правильні, продовжити звіт">
+<!ENTITY issues.nosubscriptions.description "Ви не підпиÑані на жоден з готових ÑпиÑків Ñ„Ñ–Ð»ÑŒÑ‚Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ‚Ñ€Ñ– автоматично вилучають небажаний вміÑÑ‚ з Ñайтів.">
+<!ENTITY typeSelector.falsePositive.description "Виберіть цей варіант Ñкщо на Ñторінці відÑÑƒÑ‚Ð½Ñ Ñ‡Ð°Ñтина вміÑту, або Ñкщо вона показуєтьÑÑ Ñ‡Ð¸ функціонує неправильно. Ви можете перевірити, чи був Adblock Plus причиною - тимчаÑово його вимкнувши.">
+<!ENTITY typeSelector.other.label "&amp;Інша проблема">
+<!ENTITY emailComment.label "Ми рекомендуємо Вам ввеÑти адреÑу електронної пошти, щоб ми могли зв'ÑзатиÑÑ Ð· вами, Ñкщо виникнуть Ð¿Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· приводу звіту. Це також дозволить нам розпізнати ваші внеÑки та зробити Ñ—Ñ… більш пріоритетними.">
+<!ENTITY issues.whitelist.remove.label "Переувімкнути Adblock Plus на цій Ñторінці">
+<!ENTITY outdatedSubscriptions.description "ÐаÑтупні підпиÑки на фільтри не оновлювалиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ двох тижнів. Будь лаÑка, поновіть ці підпиÑки перед відправленнÑм повідомленнÑ, оÑкільки проблема вже може бути вирішена.">
+<!ENTITY dataCollector.description "Заждіть, Adblock Plus збирає потрібні дані">
+<!ENTITY sendButton.label "&amp;ÐадіÑлати звіт">
+<!ENTITY comment.label "&amp;Коментар (необов’Ñзково):">
+<!ENTITY sendPage.errorMessage "Помилка відправки звіту: «?1?». УпевнітьÑÑ Ñ‰Ð¾ ви під’єднані до інтернету та Ñпробуйте ще раз. Якщо проблема не зникає, будь лаÑка пошукайте допомоги на [link]форумі Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Показати недавно надіÑлані звіти">
+<!ENTITY commentPage.heading "ВвеÑти коментар">
+<!ENTITY update.start.label "Розпочати Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ñ€Ð°Ð·">
+<!ENTITY issues.disabledfilters.description "ÐаÑтупні фільтри вимкнені, але могли вплинути на цю Ñторінку:">
+<!ENTITY screenshot.description "Та Ñама Ñторінка може виглÑдати по різному Ð´Ð»Ñ Ñ€Ñ–Ð·Ð½Ð¸Ñ… людей. Знімок екрана (Ñкріншот) може допомогти нам зрозуміти проблему. Ви можете вилучити конфіденційні чаÑтини, а також позначити облаÑті де приÑÑƒÑ‚Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð°. Щоб це зробити, клацніть по відповідній клавіші та виберіть облаÑть Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ð¸ÑˆÐºÐ¾ÑŽ.">
+<!ENTITY screenshot.attach.label "&amp;Додати Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñторінки до звіту">
+<!ENTITY issues.whitelist.description "Adblock Plus наразі вимкнений на тій Ñторінці про Ñку ви звітуєте. Увімкніть його та перегрузіть Ñторінку перед надÑиланнÑм звіту. Це допоможе в його розглÑді.">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus не блокує &amp;рекламу">
+<!ENTITY typeSelector.heading "Виберіть тип проблеми">
+<!ENTITY anonymity.warning "Ми не будемо мати можливіÑть повернутиÑÑ Ð´Ð¾ Ð²Ð°Ñ Ñ–, швидше за вÑе, пріоритети звіту нижчий.">
+<!ENTITY wizard.title "Повідомити про проблему">
+<!ENTITY issues.ownfilters.disable.label "Вимкнути фільтр">
+<!ENTITY commentPage.description "Ðижче ви можете ввеÑти коментар щоб допомогти нам зрозуміти проблему. Цей крок необов’Ñзковий, проте рекомендований коли проблема не очевидна. Ви можете також переглÑнути Ñвій коментар перед надÑиланнÑм.">
+<!ENTITY comment.lengthWarning "Довжина ÐºÐ¾Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ñ Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÑƒÑ” 1000 Ñимволів. Будуть поÑлані лише перші 1000 Ñимволів.">
+<!ENTITY typeSelector.falseNegative.description "Виберіть цей варіант Ñкщо реклама показуєтьÑÑ Ð¿Ð¾Ð¿Ñ€Ð¸ те що Adblock Plus увімкнено.">
+<!ENTITY sendPage.waitMessage "Заждіть доки Adblock Plus надÑилає ваш звіт.">
+<!ENTITY dataCollector.heading "ЛаÑкаво проÑимо до звітувача про проблеми">
+<!ENTITY screenshot.heading "Додати Ñкріншот">
+<!ENTITY sendPage.heading "ÐадіÑлати звіт">
+<!ENTITY issues.subscriptionCount.description "ЗдаєтьÑÑ, ви підпиÑалиÑÑŒ на забагато фільтрових підпиÑок.
+ Ми не радимо таке робити, оÑкільки можливіÑть отримати проблеми дуже виÑока.
+ Також ми не можемо прийнÑти ваш звіт, оÑкільки незрозуміло,
+ котрому з авторів підпиÑок Ñлід щоÑÑŒ зробити.
+ Вилучте вÑÑ– підпиÑки крім дійÑно необхідних, Ñ– перевірте,
+ чи проблема вÑе ще буде приÑутнÑ.">
+<!ENTITY screenshot.mark.label "По&amp;значити проблему">
+<!ENTITY privacyPolicy.label "Політика приватноÑті">
+<!ENTITY issues.description "Adblock Plus знайшов проблеми у ваших налаштуваннÑÑ… котрі, можливо, Ñпричинили цю проблему, або уÑладнÑть розглÑд звіту.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/sidebar.dtd
new file mode 100644
index 0000000..23725a0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Рамка Ð´Ð»Ñ Flash об'єктів">
+<!ENTITY address.label "ÐдреÑа">
+<!ENTITY context.open.label "Відкрити в новій вкладці">
+<!ENTITY type.label "Тип">
+<!ENTITY tooltip.filterSource.label "Джерело фільтра:">
+<!ENTITY noitems.label "Блокувати нічого">
+<!ENTITY filter.label "Фільтр">
+<!ENTITY tooltip.size.label "Розмір:">
+<!ENTITY reattach.label "Приєднати">
+<!ENTITY search.label "П&amp;ошук:">
+<!ENTITY docDomain.thirdParty "(запит з іншого Ñайта)">
+<!ENTITY filterSource.label "Джерело фільтра">
+<!ENTITY tooltip.docDomain.label "Джерело документа:">
+<!ENTITY context.copy.label "Копіювати адреÑу">
+<!ENTITY tooltip.type.label "Тип:">
+<!ENTITY context.disablefilter.label "Вимкнути фільтр ?1?">
+<!ENTITY context.copyFilter.label "Копіювати фільтр">
+<!ENTITY context.block.label "Заблокувати елемент">
+<!ENTITY context.enablefilter.label "Знов увімкнути фільтр ?1?">
+<!ENTITY detach.label "Від’єднати">
+<!ENTITY whitelisted.label "Дозволений на цій Ñторінці">
+<!ENTITY context.disablefilteronsite.label "Вимкнути цей фільтр на ?1?">
+<!ENTITY detached.title "Adblock Plus: елементи відкритої Ñторінки (від’єднані)">
+<!ENTITY docDomain.firstParty "(запит з того ж Ñайта)">
+<!ENTITY tooltip.type.whitelisted "(дозволений)">
+<!ENTITY tooltip.filter.label "ЗаÑтоÑований фільтр:">
+<!ENTITY tooltip.filter.disabled "(вимкнено)">
+<!ENTITY context.editfilter.label "Відредагувати заÑтоÑований фільтр">
+<!ENTITY tooltip.type.blocked "(заблокований)">
+<!ENTITY size.label "Розмір">
+<!ENTITY context.whitelist.label "Вказати елемент Ñк винÑток">
+<!ENTITY context.selectAll.label "Вибрати вÑе">
+<!ENTITY state.label "СтатуÑ">
+<!ENTITY docDomain.label "Джерело документа">
+<!ENTITY tooltip.address.label "ÐдреÑа:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/subscriptionSelection.dtd
new file mode 100644
index 0000000..2b0d2c5
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/uk/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "&amp;Додати також підпиÑку на фільтер «?1?»">
+<!ENTITY list.download.failed "Adblock Plus не зміг отримати перелік підпиÑок">
+<!ENTITY list.download.retry "Спробувати ще раз">
+<!ENTITY title.label "&amp;Ðазва підпиÑки:">
+<!ENTITY list.download.website "ПереглÑнути Ñайт">
+<!ENTITY supplementMessage "Ð¦Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð¾Ð²Ð° підпиÑка призначена Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð² парі з фільтровою підпиÑкою «?1?», котру ви наразі не викориÑтовуєте.">
+<!ENTITY viewList.label "ПереглÑнути фільтри">
+<!ENTITY visitHomepage.label "Відвідати домашню Ñторінку">
+<!ENTITY addSubscription.label "Додати підпиÑку">
+<!ENTITY dialog.title "Додати підпиÑку на фільтр Adblock Plus">
+<!ENTITY location.label "Розташ&amp;ÑƒÐ²Ð°Ð½Ð½Ñ ÑпиÑку з фільтром:">
+<!ENTITY fromWeb.description "Будь лаÑка підтвердіть що ви бажаєте додати цю фільтрову підпиÑку. Ви можете змінити назву чи Ð·Ð½Ð°Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ додаваннÑм.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/composer.dtd
new file mode 100644
index 0000000..71d2903
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "ở cuố&amp;i địa chỉ">
+<!ENTITY domainRestriction.label "Giá»›i hạn t&amp;rên miá»n:">
+<!ENTITY collapse.default.no.label "Dùng mặc định (không)">
+<!ENTITY firstParty.label "Chỉ của bê&amp;n thứ nhất">
+<!ENTITY preferences.label "&amp;Hiện các bá»™ lá»c Ä‘ang có...">
+<!ENTITY pattern.label "Tìm mẫu">
+<!ENTITY thirdParty.label "Chỉ củ&amp;a bên thứ ba">
+<!ENTITY filter.label "Bá»™ &amp;lá»c má»›i:">
+<!ENTITY collapse.label "&amp;Thu gá»n những mục bị chặn:">
+<!ENTITY match.warning "Mẫu mà bạn Ä‘iá»n vào không còn khá»›p vá»›i địa chỉ cần được chặn/đưa vào danh sách trắng và sẽ không có ảnh hưởng đến nó.">
+<!ENTITY anchor.start.label "ở đầ&amp;u địa chỉ">
+<!ENTITY matchCase.label "&amp;Phân biệt HOA thưá»ng">
+<!ENTITY custom.pattern.label "Tù&amp;y biến:">
+<!ENTITY unselectAllTypes.label "Không chá»n">
+<!ENTITY type.whitelist.label "&amp;Quy luật ngoại lệ">
+<!ENTITY regexp.warning "Mẫu bạn gõ vào sẽ được xem là biểu thức quy tắc. Nhiá»u biểu thức quy tắc có thể làm chậm việc duyệt web cá»§a bạn. Nếu bạn không định dùng biểu thức quy tắc, hãy thêm má»™t biểu tượng * ở cuối mẫu.">
+<!ENTITY dialog.title "Thêm quy tắc lá»c cho Adblock Plus">
+<!ENTITY basic.label "Hiển thị cơ bản">
+<!ENTITY type.filter.label "Bá»™ lá»c chặn">
+<!ENTITY types.label "Ãp dụng cho các kiểu:">
+<!ENTITY shortpattern.warning "Mẫu bạn gõ vào quá ngắn để tối ưu hóa, nhiá»u mẫu như vậy có thể làm chậm việc duyệt web cá»§a bạn. Lá»i khuyên là bạn hãy chá»n má»™t chuá»—i dài hÆ¡n cho bá»™ lá»c này.">
+<!ENTITY collapse.yes.label "Có">
+<!ENTITY anchors.label "Chỉ chấp nhận mẫu:">
+<!ENTITY collapse.default.yes.label "Dùng mặc định (có)">
+<!ENTITY domainRestriction.help "Chá»n má»™t hay nhiá»u tên miá»n ngăn cách bằng dấu &quot;|&quot;, bá»™ lá»c sẽ chỉ được áp dụng trên những tên miá»n này. Dấu &quot;~&quot; trước má»™t tên miá»n có nghÄ©a là bá»™ lá»c sẽ không được áp dụng cho tên miá»n đó.">
+<!ENTITY accept.label "Thêm bá»™ lá»c">
+<!ENTITY options.label "Tùy chá»n">
+<!ENTITY disabled.warning "Adblock Plus hiện Ä‘ang bị vô hiệu hóa. Bạn vẫn có thể thêm các bá»™ lá»c nhưng chúng sẽ không được áp dụng trừ khi bạn [link]kích hoạt Adblock Plus[/link].">
+<!ENTITY anchor.start.flexible.label "ở đầ&amp;u tên miá»n">
+<!ENTITY collapse.no.label "Không">
+<!ENTITY selectAllTypes.label "Chá»n tất cả">
+<!ENTITY advanced.label "Hiển thị nâng cao">
+<!ENTITY pattern.explanation "Mẫu có thể là bất kì phần nào cá»§a địa chỉ, biểu tượng * được dùng như má»™t mặt nạ. Bá»™ lá»c sẽ chỉ được áp dụng cho những địa chỉ phù hợp vá»›i mẫu.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/filters.dtd
new file mode 100644
index 0000000..409f4a2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "Tất cả bá»™ lá»c tùy biến cá»§a bạn sẽ được thay thế bởi ná»™i dung cá»§a tập tin được chá»n. Bạn có muốn thá»±c hiện?">
+<!ENTITY slow.column "&amp;Bá»™ lá»c chậm">
+<!ENTITY enabled.column "&amp;Bật">
+<!ENTITY subscription.lastDownload.checksumMismatch "Thất bại, mã băm không phù hợp">
+<!ENTITY noFiltersInGroup.text "Nhóm được chá»n trống.">
+<!ENTITY subscription.actions.label "Hành động">
+<!ENTITY filter.selectAll.label "Chá»n tất cả">
+<!ENTITY backupButton.label "&amp;Sao lưu và phục hồi">
+<!ENTITY restore.minVersion.warning "Cảnh báo: tập tin đã được tạo bởi phiên bản Adblock Plus mới hơn. Bạn cần cập nhập lên phiên bản mới nhất của Adblock Plus trước khi có thể khôi phục từ tập tin này.">
+<!ENTITY restore.error "Dữ liệu của tập tin có thể không được xử lý, có lẽ đây không phải là một tập tin sao lưu của Adblock Plus?">
+<!ENTITY sort.ascending.label "Sắp xếp theo thứ tự &amp;A &gt; Z">
+<!ENTITY sort.label "Sắp &amp;xếp theo">
+<!ENTITY subscription.source.label "Danh sách bá»™ lá»c">
+<!ENTITY hitcount.column "&amp;Số lần bấm">
+<!ENTITY noFilters.text "Bạn chưa có bá»™ lá»c tùy biến nào.">
+<!ENTITY backup.custom.title "Chỉ bá»™ lá»c tùy biến">
+<!ENTITY subscription.external.label "ÄÆ°á»£c cập nhập bởi ứng dụng khác">
+<!ENTITY subscription.delete.label "Xóa">
+<!ENTITY noGroupSelected.text "Bạn cần chá»n nhóm cho bá»™ lá»c trước khi nó được hiển thị">
+<!ENTITY filter.cut.label "Cắt">
+<!ENTITY restore.default.label "Khôi phục từ ?1?">
+<!ENTITY subscription.lastDownload.inProgress "Äang tải...">
+<!ENTITY subscriptions.tab.label "Äăng ký bá»™ lá»c">
+<!ENTITY sort.descending.label "Sắp xếp theo thứ tự &amp;Z &gt; A">
+<!ENTITY filters.remove.warning "Bạn có thá»±c sá»± muốn loại bá» tất cả những bá»™ lá»c được chá»n?">
+<!ENTITY filter.delete.label "Xóa">
+<!ENTITY addSubscriptionAdd.label "Thêm">
+<!ENTITY viewMenu.label "Hiển thị">
+<!ENTITY subscription.lastDownload.unknown "N/A">
+<!ENTITY addSubscriptionCancel.label "Há»§y">
+<!ENTITY subscription.enabled.label "Äã được bật">
+<!ENTITY noSubscriptions.text "Bạn chưa chá»n bất kì bá»™ lá»c nào ! AdBlock Plus không thể hoạt động nếu không có má»™t bá»™ lá»c, xin hãy sá»­ dụng &quot;Äăng ký bá»™ lá»c&quot; để thêm bá»™ lá»c cho mình .">
+<!ENTITY subscription.update.label "Cập nhập bá»™ lá»c">
+<!ENTITY dialog.title "Tùy chá»n bá»™ lá»c AdBlock Plus">
+<!ENTITY addFilter.label "&amp;Thêm bá»™ lá»c">
+<!ENTITY subscription.minVersion.warning "Bá»™ lá»c này cần có phiên bản Adblock Plus má»›i hÆ¡n, bạn cần phải cập nhập lên phiên bản má»›i nhất cá»§a AdBlock Plus .">
+<!ENTITY subscription.lastDownload.invalidURL "Thất bại, không phải là địa chỉ hợp lệ">
+<!ENTITY backup.error "Có vấn đỠkhi ghi bá»™ lá»c vào tập tin. Hãy chắc chắn rằng tập tin không bị bảo vệ ghi hoặc bị sá»­ dụng bởi má»™t ứng dụng khác.">
+<!ENTITY filter.moveUp.label "Di chuyển lên">
+<!ENTITY addGroup.label "Thêm &amp;nhóm bá»™ lá»c">
+<!ENTITY filter.edit.label "Chỉnh sửa">
+<!ENTITY subscription.showHideFilters.label "Hiện/ẩn bá»™ lá»c">
+<!ENTITY acceptableAds2.label "Cho phép một số quảng cáo không gây hại">
+<!ENTITY addSubscriptionOther.label "Thêm bá»™ lá»c khác">
+<!ENTITY close.label "Äóng">
+<!ENTITY sort.none.label "&amp;Chưa sắp xếp">
+<!ENTITY filter.actions.label "Hành động cho bá»™ lá»c">
+<!ENTITY filter.copy.label "Chép">
+<!ENTITY filter.moveDown.label "Di chuyển xuống">
+<!ENTITY filter.resetHitCounts.label "Cài lại thống kê lượt bấm">
+<!ENTITY readMore.label "Äá»c thêm">
+<!ENTITY subscription.moveUp.label "Chuyển lên trên">
+<!ENTITY addSubscription.label "Thêm bá»™ lá»c">
+<!ENTITY subscription.homepage.label "Trang chá»§">
+<!ENTITY backup.complete.title "Tất cả các bá»™ lá»c và mục đăng ký">
+<!ENTITY restore.own.label "Khôi phục riêng">
+<!ENTITY restore.complete.warning "Tất cả tùy chỉnh bá»™ lá»c cá»§a bạn sẽ được thay thế bởi ná»™i dung cá»§a tập tin được chá»n. Bạn có muốn thá»±c hiện?">
+<!ENTITY filters.tab.label "Bá»™ lá»c tùy biến">
+<!ENTITY backup.label "Tạo sao lưu mới">
+<!ENTITY find.label "&amp;Tìm">
+<!ENTITY subscription.moveDown.label "Chuyển xuống dưới">
+<!ENTITY subscription.lastDownload.connectionError "Thất bại, tải xuống thất bại">
+<!ENTITY subscription.lastDownload.success "Hoàn thành">
+<!ENTITY subscription.lastDownload.invalidData "Thất bại, đây không phải là danh sách bá»™ lá»c hợp lệ">
+<!ENTITY filter.paste.label "Dán">
+<!ENTITY subscription.disabledFilters.enable "Bật bá»™ lá»c đã bị vô hiệu hóa">
+<!ENTITY lasthit.column "Lần bấm cuối">
+<!ENTITY subscription.editTitle.label "Sá»­a tiêu Ä‘á»">
+<!ENTITY subscription.disabledFilters.warning "Má»™t vài phần tá»­ trong bá»™ lá»c này đã bị vô hiệu hóa .">
+<!ENTITY filter.column "&amp;Quy luật lá»c">
+<!ENTITY subscription.lastDownload.label "Lần tải cuối:">
+<!ENTITY viewList.label "Xem danh sách">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/firstRun.properties
new file mode 100644
index 0000000..74e60dc
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=Duyệt riêng tư bằng cách vô hiệu theo dõi - ẩn theo dõi của bạn từ các công ty quảng cáo theo dõi từng bước của bạn.
+firstRun_toggle_off=TẮT
+firstRun_feature_tracking=Vô hiệu hóa theo dõi
+firstRun_feature_malware=Chặn phần má»m độc hại
+firstRun_title=Adblock Plus đã được cài đặt
+firstRun_acceptableAdsExplanation=Chúng tôi khuyến khích các trang mạng dùng những quảng cáo minh bạch, không phiá»n nhiá»…u. Äó là lí do tại sao chúng tôi gây dá»±ng <a>hướng dẫn chặt chẽ</a> để xác định các quảng cáo được chấp nhận, hiện dưới mức thiết lập mặc định. Nếu bạn vẫn muốn chặn má»i quảng cáo, bạn có thể <a>vô hiệu</a> Ä‘iá»u này trong má»™t vài giây.
+firstRun_toggle_on=BẬT
+firstRun_contributor_credits=Äóng góp các khoản tín dụng
+firstRun_dataCorruptionWarning=Có phải trang này luôn hiển thị? <a>Bấm vào đây</a>
+firstRun_acceptableAdsHeadline=Những quảng cáo phiá»n phức sẽ bị chặn
+firstRun_share=Nói với bạn bè của bạn
+firstRun_share_headline=<a>Giúp chúng tôi một tay</a> trong việc làm trang mạng trở nên tốt hơn
+firstRun_features=Adblock Plus có thể làm nhiá»u hÆ¡n là chặn quảng cáo
+firstRun_feature_malware_description=Làm cho trình duyệt an toàn hÆ¡n bằng cách chặn các tên miá»n chứa phần má»m độc hại.
+firstRun_feature_social_description=Tá»± động loại bá» lịch duyệt cá»§a các nút truyá»n thông mạng xã há»™i, như là nút Thích Facebook, xuất hiện trên trang mạng và theo dõi hành vi cá»§a bạn.
+firstRun_donate=á»§ng há»™
+firstRun_donate_label=Hỗ trợ dự án của chúng tôi
+firstRun_feature_social=Loại bỠcác nút bấm Phương tiện Mạng xã hội
+firstRun_legacySafariWarning=Bạn Ä‘ang dùng má»™t phiên bản cÅ© cá»§a Safari không được há»— trợ bởi Adblock Plus. Nó có thể không hoạt động chính xác hoặc làm giảm trải nghiệm cá»§a ngưá»i dùng trên má»™t số trang mạng. Chúng tôi rất khuyến khích cập nhật lên Safari 6.1.1 hoặc cao hÆ¡n (trên OS X 10.8 Mountain Lion), hoặc Safari 7.0.1 hoặc cao hÆ¡n (trên OS X 10.9 Mavericks), hoặc dùng phiên bản má»›i nhất cá»§a Mozilla Firefox, Google Chrome hoặc Opera.
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/global.properties
new file mode 100644
index 0000000..39cabf8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=Không có mục nào trong trang hiện tại có thể chặn được
+action3_tooltip=Nhấn để bật/tắt Adblock Plus.
+notification_antiadblock_title=Ẩn tin nhắn mục tiêu?
+type_label_script=văn lệnh
+filter_elemhide_nocriteria=Không có chuẩn để nhận diện các phần tử bị ẩn
+blockingGroup_title=Quy tắc chặn quảng cáo
+whitelisted_tooltip=Adblock Plus bị vô hiệu ở trang hiện tại.
+type_label_stylesheet=stylesheet
+blocked_count_tooltip=?1? trong ?2?
+type_label_font=phông
+type_label_popup=cửa sổ bật lên
+filter_regexp_tooltip=Bá»™ lá»c này là má»™t biểu thức chính quy hoặc là do quá ngắn nên không tối ưu hóa được. Quá nhiá»u bá»™ lá»c như thế này có thể làm chậm việc duyệt cá»§a bạn.
+action0_tooltip=Nhấn chuột trái để hiển thị trình đơn ngữ cảnh, nhấn chuột giữa để bật/tắt.
+whitelisted_page=Adblock Plus đã bị vô hiệu hóa cho trang hiện tại
+remove_group_warning=Bạn có thật sự muốn loại bỠnhóm này?
+action1_tooltip=Nhấn chuột trái để mở/đóng các mục có thể chặn được, nhấn chuột giữa để bật/tắt.
+type_label_xmlhttprequest=yêu cầu XML
+active_tooltip=Adblock Plus đã kích hoạt, ?1? bá»™ lá»c trá»n gói và ?2? bá»™ lá»c tùy biến Ä‘ang được dùng.
+type_label_document=tài liệu
+type_label_object_subrequest=yêu cầu con đối tượng
+whitelistGroup_title=Quy tắc ngoại lệ
+disabled_tooltip=Adblock Plus đã bị vô hiệu.
+filter_elemhide_duplicate_id=Chỉ có thể xác định một ID của phần tử bị ẩn
+type_label_object=đối tượng
+action2_tooltip=Nhấn chuá»™t trái để mở tùy chá»n, nhấn chuá»™t giữa để bật/tắt.
+type_label_subdocument=khung
+clearStats_warning=Äiá»u này sẽ thiết lập lại toàn bá»™ thông số lượt bấm và vô hiệu đếm lượt bấm. Bạn có muốn thá»±c hiện?
+notification_antiadblock_message=Trang này đã được biết là hiện tin nhắn mục tiêu cho ngưá»i dùng Adblock Plus. Bạn có muốn Adblock Plus ẩn tin nhắn mục tiêu?
+blocked_count_addendum=(trong danh sách trắng: ?1?, bị ẩn: ?2?)
+subscription_invalid_location=Äịa chỉ để tải bá»™ lá»c không phải là má»™t URL hay tên tập tin hợp lệ.
+type_label_image=ảnh
+remove_subscription_warning=Bạn có thật sá»± muốn xóa bá»™ trá»n gói này không?
+type_label_other=khác
+mobile_menu_enable=ABP: Bật
+type_label_media=tiếng/phim
+mobile_menu_disable_site=ABP: Vô hiệu trên ?1?
+elemhideGroup_title=Quy tắc ẩn phần tử
+mobile_menu_enable_site=ABP: Kích hoạt trên ?1?
+type_label_elemhide=ẩn
+newGroup_title=Nhóm lá»c má»›i
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/overlay.dtd
new file mode 100644
index 0000000..71de231
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;Có">
+<!ENTITY notification.button.no "&amp;Không">
+<!ENTITY sync.label "Äồng bá»™ thiết lập Adbl&amp;ock Plus">
+<!ENTITY whitelist.site.label "Vô hiệu hóa trên ?1?">
+<!ENTITY filters.label "&amp;Tùy chỉnh bá»™ lá»c">
+<!ENTITY disable.label "Vô hiệu hóa ở má»i nÆ¡i">
+<!ENTITY objecttab.title "Chặn">
+<!ENTITY objecttab.tooltip "Nhấn vào đây để chặn đối tượng này với Adblock Plus">
+<!ENTITY menuitem.label "Tùy chá»n Adblock &amp;Plus">
+<!ENTITY objecttabs.label "Hiện thẻ trên Flash và Java">
+<!ENTITY sendReport.label "&amp;Báo cáo vấn đỠtrên trang này">
+<!ENTITY whitelist.page.label "Chỉ vô hiệu hóa trên trang này">
+<!ENTITY context.image.label "Adblock Plus: Chặn Ảnh">
+<!ENTITY counthits.label "Äếm lượt &amp;bấm bá»™ lá»c">
+<!ENTITY opensidebar.label "&amp;Mở các mục có thể chặn được">
+<!ENTITY notification.button.close "Äó&amp;ng">
+<!ENTITY contribute.label "Äóng góp cho Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plus: Chặn Khung">
+<!ENTITY blocked.tooltip "Các mục bị chặn trong trang này:">
+<!ENTITY hideplaceholders.label "Ẩn &amp;chỗ giữ các yếu tố bị chặn">
+<!ENTITY showinstatusbar.label "Hiện t&amp;rong thanh trạng thái">
+<!ENTITY sidebar.title "Các mục bị chặn trên trang hiện tại">
+<!ENTITY options.label "Tù&amp;y chá»n">
+<!ENTITY context.object.label "Adblock Plus: Chặn Äối Tượng">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: Kích Hoạt Lại trên Trang Này">
+<!ENTITY filters.tooltip "Các bá»™ lá»c có hiệu lá»±c nhất:">
+<!ENTITY closesidebar.label "Äóng các &amp;mục có thể chặn được">
+<!ENTITY showintoolbar.label "Hiện trong thanh &amp;công cụ">
+<!ENTITY status.tooltip "Trạng thái:">
+<!ENTITY context.media.label "Adblock Plus: Chặn nhạc/phim">
+<!ENTITY subscription.update.label "Cập nhập bá»™ lá»c">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/sendReport.dtd
new file mode 100644
index 0000000..d6b50b7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/sendReport.dtd
@@ -0,0 +1,65 @@
+<!ENTITY screenshot.undo.label "&amp;Hoàn tác">
+<!ENTITY issues.disabledgroups.description "Bá»™ lá»c trá»n gói/nhóm bá»™ lá»c sau đã bị vô hiệu hóa, song chúng có thể vẫn gây ảnh hưởng tá»›i trang này:">
+<!ENTITY showData.label "Hiện dữ liệu báo cáo">
+<!ENTITY typeSelector.falsePositive.label "&amp;Adblock Plus chặn quá nhiá»u">
+<!ENTITY issues.change.description "Cấu hình cá»§a bạn đã được thay đổi. Vui lòng tải lại trang để kiểm tra thay đổi và gá»­i lên má»™t báo cáo nếu vấn đỠvẫn chưa được giải quyết sau sá»± Ä‘iá»u chỉnh.">
+<!ENTITY email.label "Äịa chỉ&amp;mail:">
+<!ENTITY issues.openPreferences.label "Mở tùy chỉnh bá»™ lá»c">
+<!ENTITY sendPage.confirmation "Báo cáo của bạn đã được lưu. Bạn có thể truy cập nó tại địa chỉ sau:">
+<!ENTITY copyLink.label "Chép liên kết báo cáo">
+<!ENTITY issues.nofilters.description "Adblock Plus đang không chặn bất kì thứ gì trên trang hiện tại. Vấn đỠmà bạn theo dõi có vẻ như không liên quan tới Adblock Plus.">
+<!ENTITY sendPage.knownIssue "Vấn đỠmà bạn báo cáo có thể đã được biết. Thông tin thêm:">
+<!ENTITY typeSelector.other.description "Chá»n tùy chá»n này nếu bạn nghi ngá» má»™t vấn đỠvá»›i bản thân Adblock Plus hÆ¡n là do bá»™ lá»c cá»§a nó.">
+<!ENTITY issues.disabledgroups.enable.label "Kích hoạt bá»™ lá»c trá»n gói/nhóm bá»™ lá»c">
+<!ENTITY typeWarning.override.label "Tôi hiể&amp;u và vẫn muốn gửi báo cáo">
+<!ENTITY issues.disabled.enable.label "Kích hoạt Adblock Plus">
+<!ENTITY update.fixed.description "Bản cập nhập đến bá»™ lá»c cá»§a bạn có vẻ như đã sá»­a được lá»—i mà bạn Ä‘ang thông báo. Vui lòng tải lại trang và thá»­ lại, nhấn Báo cáo lá»—i lần nữa nếu vấn đỠvẫn còn tiếp diá»…n.">
+<!ENTITY anonymous.label "&amp;Gửi thông tin ẩn danh">
+<!ENTITY reloadButton.label "Tải lại tr&amp;ang">
+<!ENTITY recentReports.clear.label "&amp;Xóa tất cả báo cáo">
+<!ENTITY typeSelector.description "Cá»­a sổ này sẽ hướng dẫn bạn qua các bước cần thiết cho việc gá»­i lên má»™t báo cáo vấn đỠcá»§a Adblock Plus. Trước tiên, hãy chá»n kiểu vấn đỠmà bạn Ä‘ang gặp trên trang này:">
+<!ENTITY screenshot.remove.label "Xóa dữ liệu nhạ&amp;y cảm">
+<!ENTITY issues.ownfilters.description "Má»™t số bá»™ lá»c áp dụng trên trang này do ngưá»i dùng tá»± tạo ra. Vui lòng vô hiệu hóa các bá»™ lá»c có thể đã gây ra vấn đỠnày:">
+<!ENTITY update.inProgress.description "Adblock Plus cần phải cập nhập bá»™ lá»c quảng cáo để chắc chắn rằng vấn đỠchưa được giải quyết. Xin chá»...">
+<!ENTITY sendPage.retry.label "Gửi lại">
+<!ENTITY data.label "&amp;Dữ liệu báo cáo:">
+<!ENTITY recentReports.label "Các báo cáo được gửi lên gần đây của bạn">
+<!ENTITY typeWarning.description "Bạn cho biết rằng bạn muốn báo cáo má»™t vấn đỠthông thưá»ng cá»§a Adblock Plus chứ không phải là bá»™ lá»c. Vui lòng lưu ý rằng các vấn đỠđó tốt hÆ¡n nên được báo cáo trong [link]diá»…n đàn Adblock Plus[/link]. Bạn chỉ nên dùng trình báo cáo vấn đỠđể bổ sung các thảo luận Ä‘ang mở, vì không ai chú ý tá»›i báo cáo cá»§a bạn trừ khi bạn cung cấp cho há» má»™t liên kết tá»›i nó. Liên kết được tá»± động tạo ra sẽ được cung cấp sau khi gá»­i lên báo cáo.">
+<!ENTITY issues.disabled.description "Adblock Plus đang bị tắt, nó sẽ không chặn bất kì thứ gì trong tình trạng hiện tại.">
+<!ENTITY attachExtensions.label "Äính kèm danh sách các phần mở rá»™ng Ä‘ang dùng vào báo cáo trong trưá»ng hợp xung đột tiện ích là nguyên nhân cá»§a vấn Ä‘á»">
+<!ENTITY issues.nosubscriptions.add.label "Thêm bá»™ lá»c trá»n gói">
+<!ENTITY issues.disabledfilters.enable.label "Kích hoạt bá»™ lá»c">
+<!ENTITY issues.override.label "&amp;Cấu hình này đúng rồi, hãy tiếp tục báo cáo">
+<!ENTITY issues.nosubscriptions.description "Có vẻ như bạn không đăng kí dùng bất kì danh sách bá»™ lá»c tạo sẵn nào.">
+<!ENTITY typeSelector.falsePositive.description "Chá»n tùy chá»n này nếu trang thiếu ná»™i dung quan trá»ng, hiển thị không chính xác hoặc không vận hành đúng. Bạn có thể xác định xem Adblock Plus có phải là nguyên nhân không bằng cách tạm thá»i vô hiệu hóa nó.">
+<!ENTITY typeSelector.other.label "&amp;Vấn đỠkhác">
+<!ENTITY emailComment.label "Chúng tôi khuyến khích bạn nhập địa chỉ email hợp lệ để chúng tôi tiện liên lạc nếu chúng tôi cần gì từ thông báo cá»§a bạn. Äồng thá»i, nó cÅ©ng giúp chúng tôi có thể ghi nhận công lao đóng góp cá»§a bạn .">
+<!ENTITY issues.whitelist.remove.label "Bật lại Adblock Plus trên trang này">
+<!ENTITY outdatedSubscriptions.description "Bá»™ lá»c sau đã không được cập nhập từ hai tuần trước. Vui lòng cập nhập bá»™ lá»c trước khi gá»­i thông báo lá»—i, có thể vấn đỠđã được giải quyết từ trước.">
+<!ENTITY dataCollector.description "Vui lòng đợi một lát trong khi Adblock Plus thu thập dữ liệu cần thiết.">
+<!ENTITY sendButton.label "&amp;Gửi báo cáo">
+<!ENTITY comment.label "&amp;Bình luận (phụ):">
+<!ENTITY sendPage.errorMessage "Một nỗ lực gửi báo cáo bị thất bại với mã lỗi &quot;?1?&quot;. Vui lòng chắc chắn rằng bạn đã được kết nối Internet rồi thử lại. Nếu vấn đỠvẫn còn, vui lòng yêu cầu trợ giúp trên [link]diễn đàn Adblock Plus[/link].">
+<!ENTITY showRecentReports.label "Hiện các báo cáo được gửi lên gần đây">
+<!ENTITY commentPage.heading "Äiá»n bình luận">
+<!ENTITY update.start.label "Bắt đầu cập nhập ngay">
+<!ENTITY issues.disabledfilters.description "Các bá»™ lá»c sau đã bị vô hiệu hóa, song chúng có thể vẫn gây ảnh hưởng tá»›i trang này:">
+<!ENTITY screenshot.description "Cùng má»™t trang có thể trông khác đối vá»›i nhiá»u ngưá»i khác nhau. Chúng tôi có thể hiểu vấn đỠhÆ¡n nếu bạn đính kèm má»™t ảnh chụp màn hình vào báo cáo. Bạn có thể xóa các phần chứa thông tin nhạy cảm cÅ©ng như đánh dấu các vùng dá»… nhận thấy vấn Ä‘á». Äể làm việc đó, nhấn chuá»™t vào nút liên quan và chá»n vùng hình ảnh bằng chuá»™t cá»§a bạn.">
+<!ENTITY screenshot.attach.label "Äính &amp;kèm ảnh chụp trang vào báo cáo">
+<!ENTITY issues.whitelist.description "Adblock Plus hiện đang bị tắt trên trang mà bạn báo cáo. Vui lòng bật nó lại và tải lại trang trước khi gửi báo cáo.">
+<!ENTITY typeSelector.falseNegative.label "Adbloc&amp;k Plus không chặn một quảng cáo">
+<!ENTITY typeSelector.heading "Chá»n kiểu vấn Ä‘á»">
+<!ENTITY anonymity.warning "Chúng tôi không thể trở lại với bạn và sẽ hạ mức ưu tiên của báo cáo của bạn.">
+<!ENTITY wizard.title "Trình báo cáo lỗi">
+<!ENTITY issues.ownfilters.disable.label "Vô hiệu hóa bá»™ lá»c">
+<!ENTITY commentPage.description "Trưá»ng văn bản bên dưới cho phép bạn Ä‘iá»n bình luận để giúp chúng tôi hiểu vấn Ä‘á». Bước này chỉ là phụ nhưng được khuyến khích nếu vấn đỠkhông rõ ràng. Bạn cÅ©ng có thể xem lại dữ liệu báo cáo trước khi gá»­i.">
+<!ENTITY comment.lengthWarning "Äá»™ dài bình luận cá»§a bạn vượt qua 1000 kí tá»±. Chỉ 1000 kí tá»± đầu tiên sẽ được gá»­i Ä‘i.">
+<!ENTITY typeSelector.falseNegative.description "Chá»n tùy chá»n này nếu má»™t quảng cáo vẫn hiển thị cho dù Adblock Plus Ä‘ang được bật.">
+<!ENTITY sendPage.waitMessage "Vui lòng đợi trong khi Adblock Plus đang gửi lên báo cáo của bạn.">
+<!ENTITY dataCollector.heading "Chào mừng đến vá»›i trình báo cáo vấn Ä‘á»">
+<!ENTITY screenshot.heading "Äính kèm ảnh chụp">
+<!ENTITY sendPage.heading "Gửi báo cáo">
+<!ENTITY issues.subscriptionCount.description "Có vẻ như bạn đăng kí dùng quá nhiá»u bá»™ lá»c trá»n gói. Thiết lập này không được khuyến khích vì nó làm khả năng xảy ra vấn đỠcao hÆ¡n. Chúng tôi cÅ©ng không thể chấp nhận báo cáo vấn đỠcá»§a bạn vì không cho thấy rõ tác giả bá»™ lá»c trá»n gói nào cần hành động. Vui lòng xóa tất cả và để lại các bá»™ lá»c trá»n gói cần thiết rồi kiểm tra thá»­ xem vấn đỠcòn không.">
+<!ENTITY screenshot.mark.label "Äánh dấ&amp;u vấn Ä‘á»">
+<!ENTITY privacyPolicy.label "Chính sách riêng tư">
+<!ENTITY issues.description "Adblock Plus nhận thấy vấn đỠvá»›i cấu hình cá»§a bạn, Ä‘iá»u có thể chịu trách nhiệm cho vấn đỠhoặc làm cho việc kiểm tra báo cáo khó khăn hÆ¡n.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/sidebar.dtd
new file mode 100644
index 0000000..02208a2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "Nhấp nháy quanh viá»n cá»§a mục này">
+<!ENTITY address.label "Äịa chỉ">
+<!ENTITY context.open.label "Mở trong Thẻ Mới">
+<!ENTITY type.label "Kiểu">
+<!ENTITY tooltip.filterSource.label "Nguồn bá»™ lá»c:">
+<!ENTITY noitems.label "Không có mục nào có thể chặn được">
+<!ENTITY filter.label "Bá»™ lá»c">
+<!ENTITY tooltip.size.label "Kích thước:">
+<!ENTITY reattach.label "Äính lại">
+<!ENTITY search.label "Tì&amp;m:">
+<!ENTITY docDomain.thirdParty "(bên thứ ba)">
+<!ENTITY filterSource.label "Nguồn bá»™ lá»c">
+<!ENTITY tooltip.docDomain.label "Nguồn tài liệu:">
+<!ENTITY context.copy.label "Chép địa chỉ của mục này">
+<!ENTITY tooltip.type.label "Kiểu:">
+<!ENTITY context.disablefilter.label "Vô hiệu hóa bá»™ lá»c ?1?">
+<!ENTITY context.copyFilter.label "Chép bá»™ lá»c">
+<!ENTITY context.block.label "Chặn mục này">
+<!ENTITY context.enablefilter.label "Kích hoạt lại bá»™ lá»c ?1?">
+<!ENTITY detach.label "Tách rá»i">
+<!ENTITY whitelisted.label "Trang nằm trong sổ trắng">
+<!ENTITY context.disablefilteronsite.label "Vô hiệu hóa bá»™ lá»c này trên ?1?">
+<!ENTITY detached.title "Adblock Plus: các mục có thể chặn (tách rá»i)">
+<!ENTITY docDomain.firstParty "(bên thứ nhất)">
+<!ENTITY tooltip.type.whitelisted "(sổ trắng)">
+<!ENTITY tooltip.filter.label "Bá»™ lá»c Ä‘ang có hiệu lá»±c:">
+<!ENTITY tooltip.filter.disabled "(bị vô hiệu hóa)">
+<!ENTITY context.editfilter.label "Chỉnh sá»­a bá»™ lá»c Ä‘ang có hiệu lá»±c">
+<!ENTITY tooltip.type.blocked "(đã chặn)">
+<!ENTITY size.label "Kích thước">
+<!ENTITY context.whitelist.label "Thêm quy luật ngoại lệ cho mục">
+<!ENTITY context.selectAll.label "Chá»n tất cả">
+<!ENTITY state.label "Tình trạng">
+<!ENTITY docDomain.label "Nguồn tài liệu">
+<!ENTITY tooltip.address.label "Äịa chỉ:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/subscriptionSelection.dtd
new file mode 100644
index 0000000..804c14b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/vi/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "Kèm thêm bá»™ lá»c trá»n &amp;gói &quot;?1?&quot;">
+<!ENTITY list.download.failed "Adblock Plus không thể lấy danh sách bá»™ lá»c trá»n gói.">
+<!ENTITY list.download.retry "Thử lại">
+<!ENTITY title.label "&amp;Tiêu đỠcá»§a bá»™ trá»n gói:">
+<!ENTITY list.download.website "Xem trang mạng">
+<!ENTITY supplementMessage "Bá»™ lá»c trá»n gói này chỉ nên dùng kèm vá»›i bá»™ lá»c trá»n gói &quot;?1?&quot; - cái mà bạn chưa sá»­ dụng.">
+<!ENTITY viewList.label "Xem bá»™ lá»c">
+<!ENTITY visitHomepage.label "Vào trang chủ">
+<!ENTITY addSubscription.label "Thêm bá»™ trá»n gói">
+<!ENTITY dialog.title "Thêm bá»™ lá»c trá»n gói cho Adblock Plus">
+<!ENTITY location.label "Äị&amp;a chỉ cá»§a danh sách bá»™ lá»c:">
+<!ENTITY fromWeb.description "Vui lòng xác nhận rằng bạn muốn thêm bá»™ lá»c trá»n gói này. Bạn có thể thay đổi tiêu đỠhoặc địa chỉ trước khi thêm nó.">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/composer.dtd
new file mode 100644
index 0000000..2ed029e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "åœ¨åœ°å€æœ«å°¾ (&amp;n)">
+<!ENTITY domainRestriction.label "é™åˆ¶åŸŸï¼š (&amp;d)">
+<!ENTITY collapse.default.no.label "使用默认值 (å¦)">
+<!ENTITY firstParty.label "仅第一方 (&amp;r)">
+<!ENTITY preferences.label "显示所有å±è”½è§„则…… (&amp;S)">
+<!ENTITY pattern.label "查找模å¼">
+<!ENTITY thirdParty.label "仅第三方 (&amp;T)">
+<!ENTITY filter.label "新建å±è”½è§„则: (&amp;f)">
+<!ENTITY collapse.label "折å å·²å±è”½: (&amp;l)">
+<!ENTITY match.warning "您输入的模å¼ä¸æ˜¯è¯¥åœ°å€çš„过滤/例外规则,将ä¸ä¼šå¯¹è¯¥åœ°å€äº§ç”Ÿä»»ä½•效果。">
+<!ENTITY anchor.start.label "在地å€å¼€å§‹å¤„ (&amp;g)">
+<!ENTITY matchCase.label "匹é…大å°å†™ (&amp;M)">
+<!ENTITY custom.pattern.label "自定义: (&amp;C)">
+<!ENTITY unselectAllTypes.label "å…¨ä¸é€‰">
+<!ENTITY type.whitelist.label "例外规则 (&amp;x)">
+<!ENTITY regexp.warning "您输入的模å¼å°†ä»¥æ­£åˆ™è¡¨è¾¾å¼è§£é‡Šã€‚此正则表达å¼ä¸èƒ½é«˜æ•ˆåœ°åœ¨Adblock Plus上è¿è¡Œï¼Œå¹¶ä¸”å¯èƒ½ä¼šé™ä½Žæ‚¨æµè§ˆçš„速度。如果您ä¸å¸Œæœ›ä½¿ç”¨æ­£åˆ™è¡¨è¾¾å¼ï¼Œè¯·åœ¨æ¨¡å¼æœ«å°¾æ·»åŠ ä¸€ä¸ªæ˜Ÿå·(*)。">
+<!ENTITY dialog.title "添加 Adblock Plus 过滤规则">
+<!ENTITY basic.label "基本视图">
+<!ENTITY type.filter.label "å±è”½è§„则 (&amp;B)">
+<!ENTITY types.label "适用于类型:">
+<!ENTITY shortpattern.warning "您输入的模å¼å¤ªçŸ­è€Œä¸èƒ½è¢«ä¼˜åŒ–,过多这样的模å¼ä¼šé™ä½Žæ‚¨æµè§ˆçš„é€Ÿåº¦ã€‚æŽ¨èæ‚¨ä¸ºè¯¥è¿‡æ»¤è§„则选择一个长些的字符串,这样 Adblock Plus æ‰èƒ½æ›´æœ‰æ•ˆåœ°å¤„ç†ã€‚">
+<!ENTITY collapse.yes.label "是">
+<!ENTITY anchors.label "ä»…æŽ¥å—æ¨¡å¼:">
+<!ENTITY collapse.default.yes.label "使用默认值 (是)">
+<!ENTITY domainRestriction.help "由竖线(|)分隔的一个或多个域,过滤规则仅应用于这些域上。域å剿œ‰ä»£å­—符(~),表示过滤规则ä¸åº”该应用于该域上。">
+<!ENTITY accept.label "添加过滤规则">
+<!ENTITY options.label "选项">
+<!ENTITY disabled.warning "Adblock Plus ç›®å‰å¤„于ç¦ç”¨çжæ€ã€‚您å¯ä»¥ç»§ç»­æ·»åŠ è¿‡æ»¤è§„åˆ™ï¼Œä½†æ˜¯è¿™äº›è§„åˆ™åœ¨æ‚¨[link]å¯ç”¨ Adblock Plus[/link] ä¹‹åŽæ‰èƒ½ç”Ÿæ•ˆã€‚">
+<!ENTITY anchor.start.flexible.label "在域å开始处 (&amp;g)">
+<!ENTITY collapse.no.label "å¦">
+<!ENTITY selectAllTypes.label "全选">
+<!ENTITY advanced.label "高级视图">
+<!ENTITY pattern.explanation "模å¼å¯ä»¥æ˜¯åœ°å€çš„ä»»æ„部分,星å·(*)是通é…符。过滤规则åªä¼šåº”用到与模å¼åŒ¹é…的地å€ä¸Šã€‚">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/filters.dtd
new file mode 100644
index 0000000..23ccf7c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/filters.dtd
@@ -0,0 +1,73 @@
+<!ENTITY restore.custom.warning "您所有的自定义规则将被选择的文件中的内容所替代。您是å¦ç»§ç»­ï¼Ÿ">
+<!ENTITY slow.column "慢速过滤规则 (&amp;w)">
+<!ENTITY enabled.column "å¯ç”¨ (&amp;n)">
+<!ENTITY subscription.lastDownload.checksumMismatch "失败,检验和ä¸åŒ¹é…">
+<!ENTITY noFiltersInGroup.text "选择的分组是空的。">
+<!ENTITY subscription.actions.label "æ“作">
+<!ENTITY filter.selectAll.label "全选">
+<!ENTITY backupButton.label "备份与还原 (&amp;B)">
+<!ENTITY restore.minVersion.warning "警告:该文件由新版本的 Adblock Plus 创建。您应该先更新至最新版本的 Adblock Plus ç„¶åŽå†è¿˜åŽŸè¯¥æ–‡ä»¶ã€‚">
+<!ENTITY restore.error "无法处ç†è¯¥æ–‡ä»¶ï¼Œå¯èƒ½è¯¥æ–‡ä»¶ä¸æ˜¯ Adblock Plus 备份文件?">
+<!ENTITY sort.ascending.label "&amp;A &gt; Z 顺åº">
+<!ENTITY sort.label "æŽ’åº (&amp;S)">
+<!ENTITY subscription.source.label "过滤规则列表">
+<!ENTITY hitcount.column "计数 (&amp;H)">
+<!ENTITY noFilters.text "您还没有自定义过滤规则。">
+<!ENTITY backup.custom.title "仅自定义过滤规则">
+<!ENTITY subscription.external.label "由其他扩展更新">
+<!ENTITY subscription.delete.label "删除">
+<!ENTITY noGroupSelected.text "è¦æƒ³æ˜¾ç¤ºè¿‡æ»¤è§„则分组中的过滤规则,您必须先选择一个过滤规则分组。">
+<!ENTITY filter.cut.label "剪切">
+<!ENTITY restore.default.label "还原到 ?1? 的备份">
+<!ENTITY subscription.lastDownload.inProgress "正在下载……">
+<!ENTITY subscriptions.tab.label "过滤规则订阅组">
+<!ENTITY sort.descending.label "&amp;Z &gt; A 顺åº">
+<!ENTITY filters.remove.warning "您确定è¦ç§»é™¤æ‰€æœ‰é€‰å®šçš„过滤规则å—?">
+<!ENTITY filter.delete.label "删除">
+<!ENTITY addSubscriptionAdd.label "添加">
+<!ENTITY viewMenu.label "查看">
+<!ENTITY subscription.lastDownload.unknown "未知">
+<!ENTITY addSubscriptionCancel.label "å–æ¶ˆ">
+<!ENTITY subscription.enabled.label "å¯ç”¨">
+<!ENTITY noSubscriptions.text "您还没有添加过滤规则订阅组。Adblock Plus 没有过滤规则将无法
+进行å±è”½ï¼Œè¯·ä½¿ç”¨ “添加过滤规则订阅组†添加过滤规则。">
+<!ENTITY subscription.update.label "更新过滤规则">
+<!ENTITY dialog.title "Adblock Plus 过滤规则首选项">
+<!ENTITY addFilter.label "添加过滤规则 (&amp;d)">
+<!ENTITY subscription.minVersion.warning "è¯¥è¿‡æ»¤è§„åˆ™è®¢é˜…ç»„éœ€è¦æ–°ç‰ˆæœ¬çš„ Adblock Plus,您应该更新至最新的 Adblock Plus。">
+<!ENTITY subscription.lastDownload.invalidURL "å¤±è´¥ï¼Œä¸æ˜¯æœ‰æ•ˆåœ°å€">
+<!ENTITY backup.error "将过滤规则写入文件时å‘ç”Ÿé”™è¯¯ã€‚è¯·ç¡®è®¤è¯¥æ–‡ä»¶æ²¡æœ‰å†™ä¿æŠ¤æˆ–è€…æ­£åœ¨è¢«å…¶ä»–ç¨‹åºä½¿ç”¨ã€‚">
+<!ENTITY filter.moveUp.label "上移">
+<!ENTITY addGroup.label "添加过滤规则分组 (&amp;g)">
+<!ENTITY filter.edit.label "编辑">
+<!ENTITY subscription.showHideFilters.label "显示/éšè—过滤规则">
+<!ENTITY acceptableAds2.label "å…许一些éžä¾µå…¥å¼å¹¿å‘Š (&amp;i)">
+<!ENTITY addSubscriptionOther.label "添加其他过滤规则订阅组">
+<!ENTITY close.label "关闭">
+<!ENTITY sort.none.label "ä¸æŽ’åº (&amp;U)">
+<!ENTITY filter.actions.label "过滤规则æ“作">
+<!ENTITY filter.copy.label "å¤åˆ¶">
+<!ENTITY filter.moveDown.label "下移">
+<!ENTITY filter.resetHitCounts.label "é‡ç½®ç”Ÿæ•ˆæ¬¡æ•°ç»Ÿè®¡">
+<!ENTITY readMore.label "深入了解">
+<!ENTITY subscription.moveUp.label "上移">
+<!ENTITY addSubscription.label "添加过滤规则订阅组 (&amp;f)">
+<!ENTITY subscription.homepage.label "主页">
+<!ENTITY backup.complete.title "所有订阅组和自定义规则">
+<!ENTITY restore.own.label "还原自己的备份">
+<!ENTITY restore.complete.warning "æ‚¨æ‰€æœ‰çš„è¿‡æ»¤è§„åˆ™å‚æ•°å°†è¢«é€‰æ‹©çš„æ–‡ä»¶ä¸­çš„内容所替代。您是å¦ç»§ç»­ï¼Ÿ">
+<!ENTITY filters.tab.label "自定义过滤规则">
+<!ENTITY backup.label "创建新备份">
+<!ENTITY find.label "查找 (&amp;n)">
+<!ENTITY subscription.moveDown.label "下移">
+<!ENTITY subscription.lastDownload.connectionError "失败,下载失败">
+<!ENTITY subscription.lastDownload.success "æˆåŠŸ">
+<!ENTITY subscription.lastDownload.invalidData "å¤±è´¥ï¼Œä¸æ˜¯æœ‰æ•ˆçš„过滤规则列表">
+<!ENTITY filter.paste.label "粘贴">
+<!ENTITY subscription.disabledFilters.enable "å¯ç”¨å·²ç¦ç”¨çš„过滤规则">
+<!ENTITY lasthit.column "最åŽç”Ÿæ•ˆæ—¶é—´ (&amp;L)">
+<!ENTITY subscription.editTitle.label "编辑标题">
+<!ENTITY subscription.disabledFilters.warning "该过滤规则订阅组中的æŸäº›è¿‡æ»¤è§„则被ç¦ç”¨ã€‚">
+<!ENTITY filter.column "过滤规则 (&amp;F)">
+<!ENTITY subscription.lastDownload.label "最åŽä¸‹è½½äºŽ:">
+<!ENTITY viewList.label "查看列表">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/firstRun.properties
new file mode 100644
index 0000000..e318330
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=éšç§˜æµè§ˆé¿å¼€è·Ÿè¸ª - 摆脱广告公å¸è·Ÿè¸ªä½ çš„一举一动。
+firstRun_toggle_off=关闭
+firstRun_feature_tracking=ç¦æ­¢è·Ÿè¸ª
+firstRun_feature_malware=æ‹¦æˆªæ¶æ„软件
+firstRun_title=Adblock Plus 已安装
+firstRun_toggle_on=å¼€å¯
+firstRun_acceptableAdsExplanation=我们想鼓励网站使用简å•ã€ä¸ä½¿äººå感的广告。这也是为什么我们建立了一个<a>严格的指导方针</a>æ¥ç¡®å®šå¯æŽ¥å—çš„å¹¿å‘Šï¼Œå¹¶åœ¨é»˜è®¤è®¾ç½®ä¸‹å±•ç¤ºå®ƒä»¬ã€‚å¦‚æžœæ‚¨ä»æƒ³å±è”½æ‰€æœ‰å¹¿å‘Šï¼Œæ‚¨å¯ä»¥è½»æ¾åœ°<a>ç¦ç”¨</a>这项功能。
+firstRun_contributor_credits=贡献者记录
+firstRun_dataCorruptionWarning=总是显示此页?<a>点击这里ï¼</a>
+firstRun_acceptableAdsHeadline=æ¼äººçš„广告将被å±è”½
+firstRun_share=告诉你的朋å‹
+firstRun_share_headline=<a>给我们一点支æŒ</a>,让网络å˜å¾—更加美好
+firstRun_feature_social_description=自动å±è”½ç½‘页中出现的社交媒体按钮,例如 Facebook çš„ Like,摆脱行为跟踪。
+firstRun_filterlistsReinitializedWarning=似乎因一个问题导致所有过滤规则已被删除,并且我们无法从备份中æ¢å¤ã€‚因此,我们ä¸å¾—ä¸é‡ç½®æ‚¨çš„è¿‡æ»¤è§„åˆ™å’Œå¯æŽ¥å—广告设置。请在 <a>Adblock Plus 选项</a> ä¸­æ£€æŸ¥æ‚¨çš„è¿‡æ»¤è§„åˆ™åˆ—è¡¨å’Œå¯æŽ¥å—广告设置。
+firstRun_feature_malware_description=使您的æµè§ˆæ›´å®‰å…¨ï¼Œé˜»æ­¢å·²çŸ¥çš„æ¶æ„软件域。
+firstRun_features=Adblock Plus ä¸ä»…仅能拦截广告
+firstRun_donate=æèµ 
+firstRun_donate_label=æ”¯æŒæˆ‘们的项目
+firstRun_feature_social=移除社交媒体按钮
+firstRun_legacySafariWarning=Adblock Plus 䏿”¯æŒæ‚¨æ­£åœ¨ä½¿ç”¨çš„ Safari 旧版本。这å¯èƒ½å¯¼è‡´æ— æ³•正常工作,或者æŸå®³ä¸€äº›ç½‘站上的用户体验。我们强烈建议您更新到 Safari 6.1.1 或更高版本(基于 OS X 10.8 Mountain Lion),或 Safari 7.0.1 或更高版本(基于 OS X 10.9 Mavericks),或者使用 Mozilla Firefoxã€Google Chrome 或 Opera æµè§ˆå™¨çš„æœ€æ–°ç‰ˆæœ¬ã€‚
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/global.properties
new file mode 100644
index 0000000..48387e9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=当å‰é¡µé¢æ— å¯è¿‡æ»¤é¡¹ç›®
+action3_tooltip=点击切æ¢å¯ç”¨/ç¦ç”¨ Adblock Plus。
+notification_antiadblock_title=éšè—针对性的信æ¯ï¼Ÿ
+type_label_script=脚本
+filter_elemhide_nocriteria=没有指定è¦éšè—元素的识别标准
+blockingGroup_title=广告å±è”½è§„则
+whitelisted_tooltip=Adblock Plus 在当å‰é¡µç¦ç”¨ã€‚
+type_label_stylesheet=æ ·å¼è¡¨
+blocked_count_tooltip=第 ?1? 项,共 ?2? 项
+type_label_font=字体
+type_label_popup=弹出窗å£
+filter_regexp_tooltip=è¯¥è¿‡æ»¤è§„åˆ™æ˜¯æ­£åˆ™è¡¨è¾¾å¼æˆ–者太短而无法优化。如果这ç§ç±»åž‹çš„过滤规则太多会é™ä½Žæ‚¨æµè§ˆçš„速度。
+action0_tooltip=点击弹出快æ·èœå•,中键点击切æ¢å¯ç”¨/ç¦ç”¨ã€‚
+whitelisted_page=Adblock Plus 在当å‰é¡µé¢å·²ç¦ç”¨
+remove_group_warning=您希望移除该组å—?
+action1_tooltip=点击打开/关闭å¯è¿‡æ»¤é¡¹ç›®ï¼Œä¸­é”®ç‚¹å‡»åˆ‡æ¢å¯ç”¨/ç¦ç”¨ã€‚
+type_label_xmlhttprequest=XML 请求
+active_tooltip=Adblock Plus 处于å¯ç”¨çжæ€ï¼Œæ­£åœ¨ä½¿ç”¨ ?1? 过滤规则订阅组和 ?2? 自定义过滤规则。
+type_label_document=文档
+type_label_object_subrequest=对象å­è¯·æ±‚
+whitelistGroup_title=例外规则
+disabled_tooltip=Adblock Plus å·²ç¦ç”¨ã€‚
+filter_elemhide_duplicate_id=ä»…å¯ä»¥æŒ‡å®šä¸€ä¸ªè¦éšè—的元素 ID
+type_label_object=对象
+action2_tooltip=点击打开首选项,中键点击切æ¢å¯ç”¨/ç¦ç”¨ã€‚
+type_label_subdocument=帧
+clearStats_warning=æ­¤æ“作将ç¦ç”¨å¹¶é‡ç½®æ‰€æœ‰è¿‡æ»¤è§„则生效次数统计。您确定è¦è¿™æ ·åšå—?
+notification_antiadblock_message=此网站已知会对 Adblock Plus 用户显示针对性的信æ¯ã€‚您想让 Adblock Plus éšè—针对性的信æ¯å—?
+blocked_count_addendum=(白åå•: ?1?, éšè—: ?2?)
+subscription_invalid_location=过滤规则列表的ä½ç½®ä¸æ˜¯æœ‰æ•ˆçš„ URL 或有效的文件å。
+type_label_image=图片
+remove_subscription_warning=您确定è¦ç§»é™¤è¯¥è¿‡æ»¤è§„则订阅组å—?
+type_label_other=å…¶ä»–
+mobile_menu_enable=ABP:å¯ç”¨
+type_label_media=音频/视频
+mobile_menu_disable_site=ABP:在 ?1? ç¦ç”¨
+elemhideGroup_title=元素éšè—规则
+mobile_menu_enable_site=ABP:在 ?1? å¯ç”¨
+type_label_elemhide=éšè—
+newGroup_title=新建过滤规则组
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/overlay.dtd
new file mode 100644
index 0000000..cf9ea7f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "是(&amp;Y)">
+<!ENTITY notification.button.no "å¦(&amp;N)">
+<!ENTITY sync.label "åŒæ­¥ Adblo&amp;ck Plus 设置">
+<!ENTITY whitelist.site.label "在 ?1? ç¦ç”¨ Adblock Plus">
+<!ENTITY filters.label "过滤规则首选项 (&amp;F)">
+<!ENTITY disable.label "完全ç¦ç”¨">
+<!ENTITY objecttab.title "å±è”½">
+<!ENTITY objecttab.tooltip "点击这里用 Adblock Plus å±è”½è¯¥å¯¹è±¡">
+<!ENTITY menuitem.label "Ad&amp;block Plus 首选项">
+<!ENTITY objecttabs.label "在 Flash 和 Java 上显示标签 (&amp;t)">
+<!ENTITY sendReport.label "报告该页é¢ä¸Šçš„问题 (&amp;R)">
+<!ENTITY whitelist.page.label "仅在本页ç¦ç”¨ Adblock Plus">
+<!ENTITY context.image.label "过滤图片(Adblock Plus)">
+<!ENTITY counthits.label "统计过滤规则生效次数 (&amp;h)">
+<!ENTITY opensidebar.label "打开å¯è¿‡æ»¤é¡¹ç›® (&amp;b)">
+<!ENTITY notification.button.close "关闭(&amp;C)">
+<!ENTITY contribute.label "助力 Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "过滤帧(Adblock Plus)">
+<!ENTITY blocked.tooltip "该页上已过滤的项目:">
+<!ENTITY hideplaceholders.label "éšè—å·²å±è”½å…ƒç´ çš„å ä½ç¬¦ (&amp;l)">
+<!ENTITY showinstatusbar.label "åœ¨çŠ¶æ€æ æ˜¾ç¤º (&amp;s)">
+<!ENTITY sidebar.title "本页å¯è¿‡æ»¤çš„项目">
+<!ENTITY options.label "选项 (&amp;O)">
+<!ENTITY context.object.label "过滤对象(Adblock Plus)">
+<!ENTITY context.removeWhitelist.label "Adblock Plus: 在此页é¢ä¸Šé‡æ–°å¯ç”¨">
+<!ENTITY filters.tooltip "最活跃过滤规则:">
+<!ENTITY closesidebar.label "关闭å¯è¿‡æ»¤é¡¹ç›® (&amp;b)">
+<!ENTITY showintoolbar.label "åœ¨å·¥å…·æ æ˜¾ç¤º (&amp;b)">
+<!ENTITY status.tooltip "状æ€:">
+<!ENTITY context.media.label "过滤视频/音频(Adblock Plus)">
+<!ENTITY subscription.update.label "更新过滤规则">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/sendReport.dtd
new file mode 100644
index 0000000..2b2152e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/sendReport.dtd
@@ -0,0 +1,78 @@
+<!ENTITY screenshot.undo.label "撤销 (&amp;U)">
+<!ENTITY issues.disabledgroups.description "如下过滤规则订阅组或过滤规则组处于ç¦ç”¨çжæ€ï¼Œä½†æ˜¯å®ƒä»¬å¯èƒ½å¯¹è¯¥é¡µé¢æœ‰æ•ˆï¼š">
+<!ENTITY showData.label "显示报告数æ®">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus å±è”½äº†å¤ªå¤šå…ƒç´  (&amp;m)">
+<!ENTITY issues.change.description "æ‚¨çš„è®¾ç½®å·²æ›´æ”¹ã€‚è¯·é‡æ–°è½½å…¥é¡µé¢æ¥æµ‹è¯•æ›´æ”¹ï¼Œå¦‚æžœé—®é¢˜ä¾æ—§å­˜åœ¨è§£å†³å†æäº¤æŠ¥å‘Šã€‚">
+<!ENTITY email.label "电å­é‚®ç®± (&amp;m)">
+<!ENTITY issues.openPreferences.label "打开过滤规则首选项">
+<!ENTITY sendPage.confirmation "您的报告已被ä¿å­˜ã€‚您å¯ä»¥é€šè¿‡å¦‚下地å€è®¿é—®ï¼š">
+<!ENTITY copyLink.label "å¤åˆ¶æŠ¥å‘Šé“¾æŽ¥ (&amp;C)">
+<!ENTITY issues.nofilters.description "Adblock Plus 在当å‰é¡µé¢ä¸Šæœªå±è”½ä»»ä½•元素。您é‡åˆ°çš„问题很å¯èƒ½ä¸Ž Adblock Plus 无关。">
+<!ENTITY sendPage.knownIssue "您æäº¤çš„问题å¯èƒ½æ˜¯ä¸ªå·²çŸ¥é—®é¢˜ã€‚详情è§ï¼š">
+<!ENTITY typeSelector.other.description "如果您怀疑问题出在 Adblock Plus è‡ªèº«è€Œä¸æ˜¯è¿‡æ»¤è§„则,请选择此选项。">
+<!ENTITY issues.disabledgroups.enable.label "å¯ç”¨è¿‡æ»¤è§„则订阅组/过滤规则分组">
+<!ENTITY typeWarning.override.label "我了解并ä»ç„¶å¸Œæœ›æäº¤æŠ¥å‘Š (&amp;s)">
+<!ENTITY issues.disabled.enable.label "å¯ç”¨ Adblock Plus">
+<!ENTITY update.fixed.description "更新的过滤规则订阅组å¯èƒ½å·²è§£å†³äº†æ‚¨æŠ¥å‘Šçš„é—®é¢˜ã€‚è¯·é‡æ–°è½½å…¥é¡µé¢å¹¶é‡è¯•,如果问题ä»ç„¶å­˜åœ¨ï¼Œæ‚¨å†ç»§ç»­æŠ¥å‘Šé—®é¢˜ã€‚">
+<!ENTITY anonymous.label "匿åæäº¤ (&amp;A)">
+<!ENTITY reloadButton.label "釿–°è½½å…¥é¡µé¢ (&amp;R)">
+<!ENTITY recentReports.clear.label "移除所有报告 (&amp;R)">
+<!ENTITY typeSelector.description "本窗å£å°†é€šè¿‡ä¸€ç³»åˆ—步骤引导您æäº¤ Adblock Plus 问题报告。
+首先,请在本页选择您é‡åˆ°çš„问题类型:">
+<!ENTITY screenshot.remove.label "ç§»é™¤æ•æ„Ÿæ•°æ® (&amp;R)">
+<!ENTITY issues.ownfilters.description "一些应用到该页é¢çš„过滤规则是由用户自定义的。
+请ç¦ç”¨è¿™äº›å¯èƒ½å¯¼è‡´è¯¥é—®é¢˜çš„过滤规则:">
+<!ENTITY update.inProgress.description "Adblock Plus éœ€è¦æ›´æ–°æ‚¨çš„过滤规则订阅组以确ä¿é—®é¢˜è¿˜æœªè¢«è§£å†³ã€‚请ç¨ç­‰â€¦â€¦">
+<!ENTITY sendPage.retry.label "冿¬¡å‘é€">
+<!ENTITY data.label "报告数æ®ï¼š(&amp;p)">
+<!ENTITY recentReports.label "您最近æäº¤çš„æŠ¥å‘Š">
+<!ENTITY typeWarning.description "æ‚¨å·²ç»æ˜Žç¡®æ‚¨æƒ³è¦æŠ¥å‘Š Adblock Plus çš„é€šç”¨é—®é¢˜è€Œä¸æ˜¯è¿‡æ»¤è§„则的问题。
+请注æ„这类问题最好报告至 [link]Adblock Plus 论å›[/link]。您应该仅仅使用
+问题报告系统æ¥è¡¥å……ä¸€ä¸ªå­˜åœ¨çš„è®¨è®ºï¼Œå¦‚æžœæ‚¨ä¸æä¾›é“¾æŽ¥ï¼Œå¾ˆå¯èƒ½æ²¡äººä¼š
+注æ„到您的报告。æäº¤æŠ¥å‘Šä¹‹åŽä¼šæä¾›ç»™æ‚¨è‡ªåŠ¨åˆ›å»ºçš„é“¾æŽ¥ã€‚">
+<!ENTITY issues.disabled.description "Adblock Plus å·²ç¦ç”¨ï¼Œå½“å‰çжæ€ä¸‹ Adblock Plus ä¸ä¼šå±è”½ä»»ä½•元素。">
+<!ENTITY attachExtensions.label "在报告中附加激活的扩展列表,用于确定附加组件冲çªå¯¼è‡´çš„问题 (&amp;x)">
+<!ENTITY issues.nosubscriptions.add.label "添加过滤规则订阅组">
+<!ENTITY issues.disabledfilters.enable.label "å¯ç”¨è¿‡æ»¤è§„则">
+<!ENTITY issues.override.label "设置正确,继续报告 (&amp;c)">
+<!ENTITY issues.nosubscriptions.description "您似乎没有订阅任何制作好的过滤规则列表。">
+<!ENTITY typeSelector.falsePositive.description "如果页é¢ç¼ºå¤±äº†é‡è¦å†…å®¹ã€æ˜¾ç¤ºä¸æ­£å¸¸æˆ–è€…åŠŸèƒ½ä¸æ­£å¸¸ï¼Œè¯·é€‰æ‹©æ­¤é€‰é¡¹ã€‚
+您å¯ä»¥é€šè¿‡ä¸´æ—¶ç¦ç”¨ Adblock Plus æ¥æ£€æµ‹é—®é¢˜æ˜¯å¦ä¸º Adblock Plus 所致。">
+<!ENTITY typeSelector.other.label "其他问题 (&amp;t)">
+<!ENTITY emailComment.label "我们鼓励您输入一个有效的电å­é‚®ä»¶åœ°å€ï¼Œä»¥ä¾¿åœ¨æˆ‘们对你的报告有疑问时å¯ä»¥ä¸Žæ‚¨è”系。它还能使我们能认出你的贡献,并帮助确定它们的优先次åºã€‚">
+<!ENTITY issues.whitelist.remove.label "åœ¨æ­¤é¡µä¸Šé‡æ–°å¯ç”¨ Adblock Plus">
+<!ENTITY outdatedSubscriptions.description "如下过滤规则订阅组已ç»è‡³å°‘两周没有更新了。请在æäº¤æŠ¥å‘Šä¹‹å‰å…ˆæ›´æ–°è¿™äº›è¿‡æ»¤è§„则订阅组,也许问题已ç»è§£å†³ã€‚">
+<!ENTITY dataCollector.description "Adblock Plus 正在收集所需数æ®ï¼Œè¯·ç¨ç­‰ç‰‡åˆ»ã€‚">
+<!ENTITY sendButton.label "å‘é€æŠ¥å‘Š (&amp;n)">
+<!ENTITY comment.label "注释(å¯é€‰ï¼‰ï¼š(&amp;C)">
+<!ENTITY sendPage.errorMessage "å‘é€æŠ¥å‘Šå¤±è´¥ï¼Œé”™è¯¯ç  &quot;?1?&quot;ã€‚è¯·ç¡®ä¿æ‚¨å·²è¿žæŽ¥äº’è”网并é‡è¯•。
+å¦‚æžœé—®é¢˜ä¾æ—§ï¼Œè¯·åˆ° [link]Adblock Plus 论å›[/link]寻求帮助。">
+<!ENTITY showRecentReports.label "显示最近æäº¤çš„æŠ¥å‘Š">
+<!ENTITY commentPage.heading "输入注释">
+<!ENTITY update.start.label "现在开始更新">
+<!ENTITY issues.disabledfilters.description "如下过滤规则处于ç¦ç”¨çжæ€ï¼Œä½†æ˜¯å®ƒä»¬å¯èƒ½å¯¹è¯¥é¡µé¢ä¸Šæœ‰æ•ˆï¼š">
+<!ENTITY screenshot.description "åŒæ ·çš„页é¢ï¼Œä¸åŒçš„人å¯èƒ½è§åˆ°çš„å¹¶ä¸ç›¸åŒã€‚如果您在报告中
+附加了截图,它å¯èƒ½ä¼šå¸®åŠ©æˆ‘ä»¬äº†è§£é—®é¢˜ã€‚æ‚¨å¯ä»¥ç§»é™¤æ•感信
+æ¯åŒºåŸŸä¹Ÿå¯ä»¥æ ‡è®°å‡ºé—®é¢˜åŒºåŸŸã€‚点击相应的按钮并用鼠标在
+图片上选择区域å³å¯ã€‚">
+<!ENTITY screenshot.attach.label "为报告附加页é¢å›¾ç‰‡ (&amp;t)">
+<!ENTITY issues.whitelist.description "Adblock Plus åœ¨æ‚¨è¦æŠ¥å‘Šçš„é¡µé¢ä¸Šæ˜¯ç¦ç”¨çš„。请在æäº¤æŠ¥å‘Šå助调研该问题之å‰ï¼Œé‡æ–°å¯ç”¨ Adblock Plus 并釿–°è½½å…¥è¯¥é¡µé¢ã€‚">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus 没有å±è”½å¹¿å‘Š (&amp;v)">
+<!ENTITY typeSelector.heading "选择问题类型">
+<!ENTITY anonymity.warning "我们将无法回å¤ä½ ï¼Œå¹¶ä¸”报告å¯èƒ½è¢«æ”¾åœ¨è¾ƒä½Žçš„优先级次åºã€‚">
+<!ENTITY wizard.title "问题报告">
+<!ENTITY issues.ownfilters.disable.label "ç¦ç”¨è¿‡æ»¤è§„则">
+<!ENTITY commentPage.description "以下文本区å…许您输入一些注释æ¥å¸®åŠ©æˆ‘ä»¬æ›´å¥½åœ°ç†è§£è¯¥é—®é¢˜ã€‚
+该步骤虽然是å¯é€‰çš„ï¼Œä½†æ˜¯å¦‚æžœé—®é¢˜ä¸æ˜¯é‚£ä¹ˆæ˜¾è€Œæ˜“è§çš„è¯ï¼Œæˆ‘们
+æŽ¨èæ‚¨è¾“入一些注释。您å¯ä»¥åœ¨å‘é€ä¹‹å‰å†æ£€æŸ¥ä¸€ä¸‹æŠ¥å‘Šçš„æ•°æ®ã€‚">
+<!ENTITY comment.lengthWarning "您输入的注释长度超过 1000 ä¸ªå­—ç¬¦ã€‚åªæœ‰å‰ 1000 个字符会被å‘é€å‡ºåŽ»ã€‚">
+<!ENTITY typeSelector.falseNegative.description "如果 Adblock Plus 处于å¯ç”¨çжæ€ä½†ä»ç„¶æœ‰å¹¿å‘Šå‡ºçŽ°ï¼Œè¯·é€‰æ‹©æ­¤é€‰é¡¹ã€‚">
+<!ENTITY sendPage.waitMessage "Adblock Plus 正在æäº¤æ‚¨çš„æŠ¥å‘Šï¼Œè¯·ç¨ç­‰ã€‚">
+<!ENTITY dataCollector.heading "欢迎使用问题报告系统">
+<!ENTITY screenshot.heading "附加截图">
+<!ENTITY sendPage.heading "å‘é€æŠ¥å‘Š">
+<!ENTITY issues.subscriptionCount.description "æ‚¨ä¼¼ä¹Žè®¢é˜…äº†å¤ªå¤šçš„è¿‡æ»¤è§„åˆ™ã€‚æˆ‘ä»¬ä¸æŽ¨è采用过多的过滤规则订阅组,因为这å¯èƒ½ä¼šå¸¦æ¥è®¸å¤šé—®é¢˜ã€‚
+并且很抱歉我们ä¸èƒ½æŽ¥å—您的问题报告,因为我们很难弄清是哪些过滤规则订阅组的作者需è¦é‡‡å–行动。请移除所有éžå¿…è¦çš„过滤规则订阅组,然åŽå†æµ‹è¯•一下问题是å¦è¿˜å­˜åœ¨ã€‚">
+<!ENTITY screenshot.mark.label "标记问题 (&amp;M)">
+<!ENTITY privacyPolicy.label "éšç§ç­–ç•¥">
+<!ENTITY issues.description "Adblock Plus å·²ç»æ£€æµ‹å‡ºæ‚¨çš„设置å¯èƒ½å¯¼è‡´äº†è¯¥é—®é¢˜æˆ–者致使报告难以调研。">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/sidebar.dtd
new file mode 100644
index 0000000..3bda933
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "闪动显示该项目的边框">
+<!ENTITY address.label "地å€">
+<!ENTITY context.open.label "在新标签页打开">
+<!ENTITY type.label "类型">
+<!ENTITY tooltip.filterSource.label "过滤规则æº:">
+<!ENTITY noitems.label "æ— å¯è¿‡æ»¤é¡¹ç›®">
+<!ENTITY filter.label "过滤规则">
+<!ENTITY tooltip.size.label "大å°:">
+<!ENTITY reattach.label "åˆä½“">
+<!ENTITY search.label "æœç´¢ï¼š (&amp;S)">
+<!ENTITY docDomain.thirdParty "(第三方)">
+<!ENTITY filterSource.label "过滤规则æº">
+<!ENTITY tooltip.docDomain.label "文档æºï¼š">
+<!ENTITY context.copy.label "å¤åˆ¶é¡¹ç›®åœ°å€">
+<!ENTITY tooltip.type.label "类型:">
+<!ENTITY context.disablefilter.label "ç¦ç”¨è¿‡æ»¤è§„则 ?1?">
+<!ENTITY context.copyFilter.label "å¤åˆ¶è¿‡æ»¤è§„则">
+<!ENTITY context.block.label "过滤该项">
+<!ENTITY context.enablefilter.label "釿–°å¯ç”¨è¿‡æ»¤è§„则 ?1?">
+<!ENTITY detach.label "分体">
+<!ENTITY whitelisted.label "列入白åå•的页é¢">
+<!ENTITY context.disablefilteronsite.label "在 ?1? ç¦ç”¨è¯¥è¿‡æ»¤è§„则">
+<!ENTITY detached.title "Adblock Plus: å¯è¿‡æ»¤é¡¹ç›® (分体å¼)">
+<!ENTITY docDomain.firstParty "(第一方)">
+<!ENTITY tooltip.type.whitelisted "(白åå•)">
+<!ENTITY tooltip.filter.label "已生效的过滤规则:">
+<!ENTITY tooltip.filter.disabled "(å·²ç¦ç”¨)">
+<!ENTITY context.editfilter.label "编辑过滤规则有效">
+<!ENTITY tooltip.type.blocked "(已过滤)">
+<!ENTITY size.label "大å°">
+<!ENTITY context.whitelist.label "将该项加入白åå•">
+<!ENTITY context.selectAll.label "全选">
+<!ENTITY state.label "状æ€">
+<!ENTITY docDomain.label "文档æº">
+<!ENTITY tooltip.address.label "地å€:">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/subscriptionSelection.dtd
new file mode 100644
index 0000000..47596ee
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-CN/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "åŒæ—¶æ·»åŠ è¿‡æ»¤è§„åˆ™è®¢é˜…ç»„ “?1?†(&amp;s)">
+<!ENTITY list.download.failed "获å–订阅组的过滤规则列表失败。">
+<!ENTITY list.download.retry "é‡è¯•">
+<!ENTITY title.label "订阅组的标题: (&amp;t)">
+<!ENTITY list.download.website "查看站点">
+<!ENTITY supplementMessage "该过滤规则订阅组æ„味ç€è¯¥è®¢é˜…组将与您未添加的订阅组 “?1?†一起使用。">
+<!ENTITY viewList.label "查看过滤规则">
+<!ENTITY visitHomepage.label "查看主页">
+<!ENTITY addSubscription.label "添加订阅组">
+<!ENTITY dialog.title "添加 Adblock Plus 过滤规则订阅组">
+<!ENTITY location.label "过滤规则列表ä½ç½®: (&amp;l)">
+<!ENTITY fromWeb.description "请确认您希望添加该过滤规则订阅组。在添加之å‰ï¼Œæ‚¨å¯ä»¥æ›´æ”¹è®¢é˜…标题或ä½ç½®ã€‚">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/composer.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/composer.dtd
new file mode 100644
index 0000000..6b49cb9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/composer.dtd
@@ -0,0 +1,33 @@
+<!ENTITY anchor.end.label "ç¶²å€çµå°¾ (&amp;n)">
+<!ENTITY domainRestriction.label "網域é™åˆ¶: (&amp;d)">
+<!ENTITY collapse.default.no.label "使用é è¨­å€¼ (å¦)">
+<!ENTITY firstParty.label "åªé™ç¬¬ä¸€æ–¹ (&amp;r)">
+<!ENTITY preferences.label "顯示已有的æ¢ä»¶... (&amp;S)">
+<!ENTITY pattern.label "尋找æ¢ä»¶">
+<!ENTITY thirdParty.label "åªé™ç¬¬ä¸‰æ–¹ (&amp;T)">
+<!ENTITY filter.label "æ–°éŽæ¿¾æ¢ä»¶: (&amp;f)">
+<!ENTITY collapse.label "摺疊已阻擋項目: (&amp;l)">
+<!ENTITY match.warning "您輸入的æ¢ä»¶èˆ‡è©²ç¶²å€ä¸ç¬¦ï¼Œæ­¤æ¢ä»¶ä¸æœƒç”Ÿæ•ˆã€‚">
+<!ENTITY anchor.start.label "ç¶²å€é–‹é ­ (&amp;g)">
+<!ENTITY matchCase.label "符åˆå¤§å°å¯« (&amp;M)">
+<!ENTITY custom.pattern.label "自訂: (&amp;C)">
+<!ENTITY unselectAllTypes.label "å–æ¶ˆå…¨é¸">
+<!ENTITY type.whitelist.label "例外æ¢ä»¶ (&amp;x)">
+<!ENTITY regexp.warning "您輸入的æ¢ä»¶å°‡è¢«è§£è®€ç‚ºæ­£è¦è¡¨ç¤ºæ³•,使用正è¦è¡¨ç¤ºæ³•å¯èƒ½æœƒä½¿ Adblock Plus æ‹–æ…¢ç€è¦½é€Ÿåº¦ã€‚è‹¥æ‚¨ä¸æ‰“算使用正è¦è¡¨ç¤ºå¼ï¼Œè«‹åœ¨æ¢ä»¶çµå°¾åŠ ä¸Šæ˜Ÿè™Ÿ (*)。">
+<!ENTITY dialog.title "新增 Adblock Plus éŽæ¿¾æ¢ä»¶">
+<!ENTITY basic.label "基本檢視">
+<!ENTITY type.filter.label "éŽæ¿¾æ¢ä»¶ (&amp;B)">
+<!ENTITY types.label "套用類型:">
+<!ENTITY shortpattern.warning "您輸入的æ¢ä»¶å¤ªçŸ­ç„¡æ³•最佳化,å¯èƒ½æœƒæ‹–æ…¢ç€è¦½é€Ÿåº¦ã€‚å»ºè­°æ‚¨é¸æ“‡è¼ƒé•·çš„字串好讓 Adblock Plus 更有效率。">
+<!ENTITY collapse.yes.label "是">
+<!ENTITY anchors.label "åªæŽ¥å—特定格å¼ï¼š">
+<!ENTITY collapse.default.yes.label "使用é è¨­å€¼ (是)">
+<!ENTITY domainRestriction.help "æ­¤é¸é …坿Œ‡å®šä¸€å€‹æˆ–多個網域,請用管線符號 (|) 分隔。若在網域å稱å‰åŠ ä¸Šæ³¢æµªç¬¦è™Ÿ (~) 則表示æ¢ä»¶ä¸æœƒå¥—用於該網域。">
+<!ENTITY accept.label "æ–°å¢žéŽæ¿¾æ¢ä»¶">
+<!ENTITY options.label "é¸é …">
+<!ENTITY disabled.warning "Adblock Plus ç›®å‰å·²åœç”¨ã€‚您還是å¯ä»¥æ–°å¢žéŽæ¿¾æ¢ä»¶ï¼Œä½†é™¤éžæ‚¨ [link]啟用 Adblock Plus[/link],å¦å‰‡ä¸æœƒç”Ÿæ•ˆã€‚">
+<!ENTITY anchor.start.flexible.label "網域å稱開頭 (&amp;g)">
+<!ENTITY collapse.no.label "å¦">
+<!ENTITY selectAllTypes.label "å…¨é¸">
+<!ENTITY advanced.label "進階檢視">
+<!ENTITY pattern.explanation "æ¢ä»¶æ ¼å¼å¯ä»¥æ˜¯ç¶²å€çš„任一部分,星號 (*) 代表è¬ç”¨å­—å…ƒã€‚éŽæ¿¾æ¢ä»¶åªæœƒå¥—ç”¨åœ¨ç¬¦åˆæ ¼å¼çš„ç¶²å€ä¸Šã€‚">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/filters.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/filters.dtd
new file mode 100644
index 0000000..c953bc9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/filters.dtd
@@ -0,0 +1,72 @@
+<!ENTITY restore.custom.warning "所有自訂æ¢ä»¶éƒ½æœƒè¢«é¸ä¸­çš„æª”案替æ›ã€‚您確定è¦é€™éº¼åšå—Žï¼Ÿ">
+<!ENTITY slow.column "æ…¢é€ŸéŽæ¿¾æ¢ä»¶ (&amp;w)">
+<!ENTITY enabled.column "已啟用 (&amp;n)">
+<!ENTITY subscription.lastDownload.checksumMismatch "失敗,驗證碼ä¸ç¬¦">
+<!ENTITY noFiltersInGroup.text "é¸ä¸­çš„群組是空的">
+<!ENTITY subscription.actions.label "æ“作">
+<!ENTITY filter.selectAll.label "全部é¸å–">
+<!ENTITY backupButton.label "備份åŠé‚„原 (&amp;B)">
+<!ENTITY restore.minVersion.warning "警告:這個檔案由較新版的 Adblock Plus å»ºç«‹ã€‚å¾žé€™å€‹æª”æ¡ˆé‚„åŽŸå‰æ‚¨æ‡‰è©²å…ˆæ›´æ–°è‡³æœ€æ–°ç‰ˆçš„ Adblock Plus。">
+<!ENTITY restore.error "無法處ç†è©²æª”æ¡ˆçš„è³‡æ–™ï¼Œä¹Ÿè¨±é€™ä¸æ˜¯ Adblock Plus 的備份檔?">
+<!ENTITY sort.ascending.label "&amp;A &gt; Z 排åº">
+<!ENTITY sort.label "æŽ’åº (&amp;S)">
+<!ENTITY subscription.source.label "æ¢ä»¶åˆ—表">
+<!ENTITY hitcount.column "命中次數 (&amp;H)">
+<!ENTITY noFilters.text "您還沒有任何自訂æ¢ä»¶ã€‚">
+<!ENTITY backup.custom.title "åªæœ‰è‡ªè¨‚æ¢ä»¶">
+<!ENTITY subscription.external.label "由其他擴充套件更新">
+<!ENTITY subscription.delete.label "刪除">
+<!ENTITY noGroupSelected.text "您需è¦é¸æ“‡ä¸€å€‹æ¢ä»¶ç¾¤çµ„æ‰èƒ½é¡¯ç¤ºå…¶ä¸­çš„éŽæ¿¾æ¢ä»¶ã€‚">
+<!ENTITY filter.cut.label "剪下">
+<!ENTITY restore.default.label "還原至 ?1?">
+<!ENTITY subscription.lastDownload.inProgress "下載中...">
+<!ENTITY subscriptions.tab.label "éŽæ¿¾æ¢ä»¶é›†">
+<!ENTITY sort.descending.label "&amp;Z &gt; A 排åº">
+<!ENTITY filters.remove.warning "您確定è¦ç§»é™¤æ‰€æœ‰é¸ä¸­çš„éŽæ¿¾æ¢ä»¶ï¼Ÿ">
+<!ENTITY filter.delete.label "刪除">
+<!ENTITY addSubscriptionAdd.label "加入">
+<!ENTITY viewMenu.label "檢視">
+<!ENTITY subscription.lastDownload.unknown "無法å–å¾—">
+<!ENTITY addSubscriptionCancel.label "å–æ¶ˆ">
+<!ENTITY subscription.enabled.label "啟用">
+<!ENTITY noSubscriptions.text "æ‚¨æœªè¨‚é–±ä»»ä½•éŽæ¿¾æ¢ä»¶é›†ã€‚æ²’æœ‰éŽæ¿¾æ¢ä»¶çš„話 Adblock Plus 䏿›‰å¾—該阻擋什麼,請使用&quot;æ–°å¢žéŽæ¿¾æ¢ä»¶é›†&quot;加入。">
+<!ENTITY subscription.update.label "æ›´æ–°éŽæ¿¾æ¢ä»¶">
+<!ENTITY dialog.title "Adblock Plus æ¢ä»¶å好設定">
+<!ENTITY addFilter.label "æ–°å¢žéŽæ¿¾æ¢ä»¶ (&amp;d)">
+<!ENTITY subscription.minVersion.warning "æ­¤æ¢ä»¶é›†éœ€è¦æ–°ç‰ˆçš„ Adblock Plus,您應該更新至最新版本。">
+<!ENTITY subscription.lastDownload.invalidURL "失敗,無效的ä½å€">
+<!ENTITY backup.error "æ¢ä»¶å¯«å…¥æª”案時發生錯誤。請確定該檔案沒有寫入ä¿è­·æˆ–正被其他的程å¼ä½¿ç”¨ã€‚">
+<!ENTITY filter.moveUp.label "往上移">
+<!ENTITY addGroup.label "新增æ¢ä»¶ç¾¤çµ„ (&amp;g)">
+<!ENTITY filter.edit.label "編輯">
+<!ENTITY subscription.showHideFilters.label "顯示/éš±è—éŽæ¿¾æ¢ä»¶">
+<!ENTITY acceptableAds2.label "å…許部分éžä¾µå…¥å¼å»£å‘Š (&amp;i)">
+<!ENTITY addSubscriptionOther.label "新增其他æ¢ä»¶é›†">
+<!ENTITY close.label "關閉">
+<!ENTITY sort.none.label "ä¸æŽ’åº (&amp;U)">
+<!ENTITY filter.actions.label "æ¢ä»¶æ“作">
+<!ENTITY filter.copy.label "複製">
+<!ENTITY filter.moveDown.label "往下移">
+<!ENTITY filter.resetHitCounts.label "é‡è¨­å‘½ä¸­çµ±è¨ˆ">
+<!ENTITY readMore.label "詳細內容">
+<!ENTITY subscription.moveUp.label "往上移">
+<!ENTITY addSubscription.label "æ–°å¢žéŽæ¿¾æ¢ä»¶é›† (&amp;f)">
+<!ENTITY subscription.homepage.label "首é ">
+<!ENTITY backup.complete.title "所有æ¢ä»¶å’ŒéŽæ¿¾æ¢ä»¶é›†">
+<!ENTITY restore.own.label "從自己的備份還原">
+<!ENTITY restore.complete.warning "所有æ¢ä»¶å好設定都將被é¸ä¸­çš„æª”案替æ›ã€‚您確定è¦é€™éº¼åšå—Žï¼Ÿ">
+<!ENTITY filters.tab.label "自訂æ¢ä»¶">
+<!ENTITY backup.label "建立新的備份">
+<!ENTITY find.label "尋找 (&amp;n)">
+<!ENTITY subscription.moveDown.label "往下移">
+<!ENTITY subscription.lastDownload.connectionError "失敗,檔案下載失敗">
+<!ENTITY subscription.lastDownload.success "æˆåŠŸ">
+<!ENTITY subscription.lastDownload.invalidData "å¤±æ•—ï¼Œç„¡æ•ˆçš„éŽæ¿¾æ¢ä»¶åˆ—表">
+<!ENTITY filter.paste.label "貼上">
+<!ENTITY subscription.disabledFilters.enable "啟用所有æ¢ä»¶">
+<!ENTITY lasthit.column "最後命中 (&amp;L)">
+<!ENTITY subscription.editTitle.label "編輯標題">
+<!ENTITY subscription.disabledFilters.warning "æ­¤æ¢ä»¶é›†å…§æœ‰éƒ¨ä»½æ¢ä»¶è¢«åœç”¨ã€‚">
+<!ENTITY filter.column "éŽæ¿¾æ¢ä»¶ (&amp;F)">
+<!ENTITY subscription.lastDownload.label "最後下載:">
+<!ENTITY viewList.label "檢視æ¢ä»¶åˆ—表">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/firstRun.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/firstRun.properties
new file mode 100644
index 0000000..e0eda73
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/firstRun.properties
@@ -0,0 +1,20 @@
+firstRun_feature_tracking_description=阻止追蹤功能æ‰èƒ½é”到真正的隱密ç€è¦½ - 此功能å¯ä»¥æ“ºè„«æƒ³ç›£è¦–您一舉一動的廣告商。
+firstRun_toggle_off=關閉
+firstRun_feature_tracking=åœç”¨è¿½è¹¤
+firstRun_feature_malware=惡æ„è»Ÿé«”éŽæ¿¾
+firstRun_title=Adblock Plus 已安è£å®Œæˆ
+firstRun_acceptableAdsExplanation=我們想鼓勵網站改採簡樸且ä¸éŽæ–¼æ¶çœ¼çš„廣告。這也是我們之所以建立<a>嚴格的è¦ç¯„</a>來辨識éžä¾µå…¥å¼å»£å‘Šçš„原因,這種類型的廣告é è¨­æœƒé¡¯ç¤ºå‡ºä¾†ã€‚è‹¥æ‚¨ä»æƒ³é˜»æ“‹æ‰€æœ‰çš„廣告,å¯ä»¥è¼•鬆地<a>åœç”¨æ­¤åŠŸèƒ½</a> 。
+firstRun_toggle_on=開啟
+firstRun_contributor_credits=è²¢ç»åå–®
+firstRun_dataCorruptionWarning=這個é é¢ä¸€ç›´è·³å‡ºä¾†å—Žï¼Ÿ <a>請看這裡ï¼</a>
+firstRun_acceptableAdsHeadline=從ç¾åœ¨èµ·ï¼Œç…©äººçš„廣告都將煙消雲散
+firstRun_share=告訴您的朋å‹
+firstRun_share_headline=<a>請助我們一臂之力</a>,讓網路變得更美好
+firstRun_features=Adblock Plus ä¸åªå¯ä»¥éŽæ¿¾å»£å‘Š
+firstRun_feature_malware_description=éŽæ¿¾æƒ¡æ„網域å¯ä½¿æ‚¨çš„ç€è¦½éŽç¨‹æ›´åŠ å®‰å…¨ã€‚
+firstRun_feature_social_description=自動擺脫如 Facebook Like 這類出ç¾åœ¨ç¶²é ä¸Šè¿½è¹¤æ‚¨ç€è¦½ç¿’慣的社交按鈕。
+firstRun_donate=贊助
+firstRun_donate_label=æ”¯æ´æˆ‘們的專案
+firstRun_feature_social=移除社交媒體按鈕
+firstRun_legacySafariWarning=您正在使用 Adblock Plus æ‰€ä¸æ”¯æ´çš„舊版 Safari。這å¯èƒ½å½±éŸ¿ä½¿ç”¨è€…體驗或導致功能失常。我們強烈建議將 Safari 更新至 6.1.1 以上版本 (OS X 10.8 Mountain Lion 系統),或更新至 Safari 7.0.1 (OS X 10.9 Mavericks 系統) 以上版本,或å¯è€ƒæ…®æ”¹ç”¨æœ€æ–°ç‰ˆçš„ Mozilla Firefox, Google Chrome 或 Opera。
+firstRun_filterlistsReinitializedWarning=It seems that an issue caused all filters to be removed and we were unable to restore a backup. Therefore we had to reset your filters and Acceptable Ads settings. Please check your filter lists and Acceptable Ads settings in the <a>Adblock Plus options</a>.
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/global.properties b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/global.properties
new file mode 100644
index 0000000..aa2de1d
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/global.properties
@@ -0,0 +1,41 @@
+no_blocking_suggestions=æ­¤é é¢æ²’有å¯é˜»æ“‹çš„é …ç›®
+action3_tooltip=點擊啟用或åœç”¨ Adblock Plus。
+notification_antiadblock_title=éš±è—é‡å°æ€§çš„訊æ¯ï¼Ÿ
+type_label_script=程å¼ç¢¼
+filter_elemhide_nocriteria=沒有指定欲隱è—元素的辨識å稱
+blockingGroup_title=廣告阻擋è¦å‰‡
+whitelisted_tooltip=Adblock Plus 在目å‰é é¢åœç”¨ã€‚
+type_label_stylesheet=樣å¼è¡¨
+blocked_count_tooltip=?1? 項,共 ?2? 項
+type_label_font=å­—é«”
+type_label_popup=彈出å¼è¦–窗
+filter_regexp_tooltip=æ­¤æ¢ä»¶å¯èƒ½æ˜¯æ­£è¦è¡¨ç¤ºæ³•æˆ–è€…å¤ªçŸ­éœ€è¦æœ€ä½³åŒ–ï¼Œå¤ªå¤šé€™é¡žéŽæ¿¾æ¢ä»¶æœƒæ‹–æ…¢ç€è¦½é€Ÿåº¦ã€‚
+action0_tooltip=點擊展開功能表,按中éµå‰‡å¯å•Ÿç”¨/åœç”¨ Adblock Plus。
+whitelisted_page=Adblock Plus 已在目å‰é é¢åœç”¨
+remove_group_warning=您確定è¦ç§»é™¤æ­¤æ¢ä»¶ç¾¤çµ„嗎?
+action1_tooltip=點擊開啟或關閉å¯é˜»æ“‹é …目清單,按中éµå‰‡å¯å•Ÿç”¨/åœç”¨ Adblock Plus。
+type_label_xmlhttprequest=XML 請求
+active_tooltip=Adblock Plus 已啟用,?1? 份æ¢ä»¶é›†å·²è¨‚閱,?2? æ¢è‡ªè¨‚æ¢ä»¶å·²ä½¿ç”¨ã€‚
+type_label_document=文件
+type_label_object_subrequest=物件å­è«‹æ±‚
+whitelistGroup_title=例外æ¢ä»¶
+disabled_tooltip=Adblock Plus å·²åœç”¨ã€‚
+filter_elemhide_duplicate_id=åªèƒ½æŒ‡å®šä¸€å€‹ ID 來隱è—該元素
+type_label_object=物件
+action2_tooltip=點擊開啟å好設定視窗,按中éµå‰‡å¯å•Ÿç”¨æˆ–åœç”¨ Adblock Plus。
+type_label_subdocument=é æ¡†
+clearStats_warning=這會é‡è¨­æ‰€æœ‰çš„æ¢ä»¶å‘½ä¸­çµ±è¨ˆä¸¦åœç”¨å‘½ä¸­è¨ˆæ•¸å™¨ã€‚您確定è¦é€™éº¼åšï¼Ÿ
+notification_antiadblock_message=å·²çŸ¥æ­¤ç¶²ç«™æœƒå° Adblock Plus 用戶顯示é‡å°æ€§çš„訊æ¯ã€‚您希望 Adblock Plus éš±è—它們嗎?
+blocked_count_addendum=(以åŠç™½åå–®: ?1?, 已隱è—: ?2?)
+subscription_invalid_location=æ¢ä»¶é›†ç¶²å€æˆ–檔案å稱無效。
+type_label_image=圖片
+remove_subscription_warning=您確定è¦ç§»é™¤æ­¤æ¢ä»¶é›†å—Žï¼Ÿ
+type_label_other=å…¶ä»–
+mobile_menu_enable=ABP:啟用
+type_label_media=音訊/影片
+mobile_menu_disable_site=ABP:在 ?1? åœç”¨
+elemhideGroup_title=元素隱è—è¦å‰‡
+mobile_menu_enable_site=ABP:在 ?1? 啟用
+type_label_elemhide=éš±è—
+newGroup_title=æ–°çš„æ¢ä»¶ç¾¤çµ„
+default_dialog_title=Adblock Plus
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/overlay.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/overlay.dtd
new file mode 100644
index 0000000..76a2b80
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/overlay.dtd
@@ -0,0 +1,32 @@
+<!ENTITY notification.button.yes "&amp;確定">
+<!ENTITY notification.button.no "&amp;å–æ¶ˆ">
+<!ENTITY sync.label "åŒæ­¥ Adblo&amp;ck Plus 設定值">
+<!ENTITY whitelist.site.label "在 ?1? åœç”¨">
+<!ENTITY filters.label "æ¢ä»¶å好設定 (&amp;F)">
+<!ENTITY disable.label "完全åœç”¨">
+<!ENTITY objecttab.title "阻擋">
+<!ENTITY objecttab.tooltip "按這裡用 Adblock Plus 阻擋此物件">
+<!ENTITY menuitem.label "Ad&amp;block Plus å好設定">
+<!ENTITY objecttabs.label "Flash 和 Java 物件上顯示標籤 (&amp;t)">
+<!ENTITY sendReport.label "回報此é é¢éŒ¯èª¤ (&amp;R)">
+<!ENTITY whitelist.page.label "åªåœ¨æ­¤é é¢åœç”¨">
+<!ENTITY context.image.label "Adblock Plus:阻擋圖片">
+<!ENTITY counthits.label "計算æ¢ä»¶å‘½ä¸­æ¬¡æ•¸ (&amp;h)">
+<!ENTITY opensidebar.label "開啟å¯é˜»æ“‹é …ç›® (&amp;b)">
+<!ENTITY notification.button.close "&amp;關閉">
+<!ENTITY contribute.label "贊助 Adblock Plus">
+<!ENTITY toolbarbutton.label "Adblock Plus">
+<!ENTITY context.frame.label "Adblock Plusï¼šé˜»æ“‹é æ¡†">
+<!ENTITY blocked.tooltip "æ­¤é å·²é˜»æ“‹é …ç›®:">
+<!ENTITY hideplaceholders.label "éš±è—已阻擋元素所佔用的空間 (&amp;l)">
+<!ENTITY showinstatusbar.label "在狀態列顯示 (&amp;s)">
+<!ENTITY sidebar.title "本é å¯é˜»æ“‹é …ç›®">
+<!ENTITY options.label "é¸é … (&amp;O)">
+<!ENTITY context.object.label "Adblock Plus:阻擋物件">
+<!ENTITY context.removeWhitelist.label "Adblock Plus:此é ä¸è¨­ç‚ºç™½åå–®">
+<!ENTITY filters.tooltip "最活èºçš„æ¢ä»¶:">
+<!ENTITY closesidebar.label "關閉å¯é˜»æ“‹é …ç›® (&amp;b)">
+<!ENTITY showintoolbar.label "在工具列顯示 (&amp;b)">
+<!ENTITY status.tooltip "狀態:">
+<!ENTITY context.media.label "Adblock Plus:阻擋音訊/影片">
+<!ENTITY subscription.update.label "æ›´æ–°éŽæ¿¾æ¢ä»¶">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/sendReport.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/sendReport.dtd
new file mode 100644
index 0000000..8e93337
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/sendReport.dtd
@@ -0,0 +1,66 @@
+<!ENTITY screenshot.undo.label "復原 (&amp;U)">
+<!ENTITY issues.disabledgroups.description "ä¸‹åˆ—éŽæ¿¾æ¢ä»¶é›†/æ¢ä»¶ç¾¤çµ„å·²åœç”¨ï¼Œå®ƒå€‘將無法在此é é¢ç™¼æ®ä½œç”¨ï¼š">
+<!ENTITY showData.label "顯示報告資料">
+<!ENTITY typeSelector.falsePositive.label "Adblock Plus 擋了太多æ±è¥¿ (&amp;m)">
+<!ENTITY issues.change.description "æ‚¨çš„è¨­å®šå€¼å·²è®Šæ›´ã€‚è«‹åœ¨é‡æ–°è¼‰å…¥é é¢å¾Œæ¸¬è©¦éŒ¯èª¤æ˜¯å¦ä»ç„¶å­˜åœ¨ï¼Œè‹¥éŒ¯èª¤ä¾èˆŠå­˜åœ¨ï¼Œè«‹å‚³é€éŒ¯èª¤å ±å‘Šã€‚">
+<!ENTITY email.label "E&amp;mail:">
+<!ENTITY issues.openPreferences.label "開啟æ¢ä»¶å好設定">
+<!ENTITY sendPage.confirmation "報告已儲存。您å¯ä»¥åœ¨ä¸‹åˆ—ç¶²å€å­˜å–:">
+<!ENTITY copyLink.label "è¤‡è£½å ±å‘Šé€£çµ (&amp;C)">
+<!ENTITY issues.nofilters.description "Adblock Plus 在此é é¢æ²’有阻擋任何æ±è¥¿ã€‚您回報的錯誤å¯èƒ½å’Œ Adblock Plus 無關。">
+<!ENTITY sendPage.knownIssue "您回報的錯誤已é‡è¤‡ã€‚檢視更多資訊:">
+<!ENTITY typeSelector.other.description "鏿“‡æ­¤é¸é …表示有其他錯誤發生,而且您懷疑是 Adblock Plus 本身引起而éžéŽæ¿¾æ¢ä»¶é€ æˆçš„錯誤。">
+<!ENTITY issues.disabledgroups.enable.label "å•Ÿç”¨éŽæ¿¾æ¢ä»¶é›†/æ¢ä»¶ç¾¤çµ„">
+<!ENTITY typeWarning.override.label "我了解並堅æŒè¦å‚³é€éŒ¯èª¤å ±å‘Š (&amp;s)">
+<!ENTITY issues.disabled.enable.label "啟用 Adblock Plus">
+<!ENTITY update.fixed.description "éŽæ¿¾æ¢ä»¶é›†æ›´æ–°å¾Œå¾ˆå¯èƒ½è§£æ±ºäº†æ‚¨æ­£è¦å›žå ±çš„å•é¡Œã€‚è«‹é‡æ–°è¼‰å…¥ç¶²é å¾Œå†è©¦ä¸€æ¬¡ï¼Œè‹¥å•題ä»åœ¨è«‹å†æ¬¡å›žå ±ã€‚">
+<!ENTITY anonymous.label "ä»¥åŒ¿åæ–¹å¼æäº¤">
+<!ENTITY reloadButton.label "釿–°è¼‰å…¥é é¢ (&amp;R)">
+<!ENTITY recentReports.clear.label "移除所有錯誤報告 (&amp;R)">
+<!ENTITY typeSelector.description "本視窗會一步步指導您傳é€ä¸€ä»½ Adblock Plus éŒ¯èª¤å ±å‘Šã€‚é¦–å…ˆï¼Œè«‹é¸æ“‡æ‚¨åœ¨æ­¤é é¢ç¢°åˆ°çš„錯誤類型:">
+<!ENTITY screenshot.remove.label "ç§»é™¤æ•æ„Ÿè³‡æ–™ (&amp;R)">
+<!ENTITY issues.ownfilters.description "套用到此é é¢ä¸­çš„æ¢ä»¶æœ‰éƒ¨ä»½æ˜¯ç”±ä½¿ç”¨è€…å®šç¾©çš„ã€‚è«‹åœç”¨é€™äº›éŽæ¿¾æ¢ä»¶ï¼Œé€™å¾ˆå¯èƒ½å°±æ˜¯å°Žè‡´éŒ¯èª¤ç™¼ç”Ÿçš„原因:">
+<!ENTITY update.inProgress.description "Adblock Plus éœ€è¦æ›´æ–°æ‚¨çš„éŽæ¿¾æ¢ä»¶é›†ä¾†ç¢ºå®šé€™å€‹å•é¡Œä»æœªè§£æ±ºã€‚è«‹ç¨å€™â€¦">
+<!ENTITY sendPage.retry.label "冿¬¡å‚³é€">
+<!ENTITY data.label "報告資料: (&amp;p)">
+<!ENTITY recentReports.label "您最近的錯誤報告">
+<!ENTITY typeWarning.description "您表示è¦å›žå ±çš„錯誤是 Adblock Plus 本身的錯誤而éžéŽæ¿¾æ¢ä»¶å¼•起的錯誤。請注æ„,這類錯誤最好到 [link]Adblock Plus 討論å€[/link] ä¸Šå›žå ±ã€‚åªæœ‰ç‚ºè¨Žè«–ä¸²ä½œè£œå……æ™‚æ‰æ‡‰è©²ä½¿ç”¨éŒ¯èª¤å›žå ±å™¨ï¼Œæ²’有人會察覺您的錯誤報告網å€ï¼Œé™¤éžæ‚¨å°‡é€£çµè²¼å‡ºä¾†ã€‚
+ çµåœ¨å‚³é€æˆåŠŸä¹‹å¾Œæœƒè‡ªå‹•ç”¢ç”Ÿã€‚">
+<!ENTITY issues.disabled.description "Adblock Plus å·²åœç”¨ï¼Œç›®å‰ç‹€æ…‹ä¸‹ä¸æœƒé˜»æ“‹ä»»ä½•ç¶²é å…§å®¹ã€‚">
+<!ENTITY attachExtensions.label "附加目å‰å•Ÿç”¨çš„æ“´å……套件列表至報告中,以便排除因套件è¡çªæ‰€ç”¢ç”Ÿçš„å•題 (&amp;x)">
+<!ENTITY issues.nosubscriptions.add.label "è¨‚é–±éŽæ¿¾æ¢ä»¶é›†">
+<!ENTITY issues.disabledfilters.enable.label "å•Ÿç”¨éŽæ¿¾æ¢ä»¶">
+<!ENTITY issues.override.label "設定值是正確的,繼續回報錯誤 (&amp;c)">
+<!ENTITY issues.nosubscriptions.description "æ‚¨ä¼¼ä¹Žæ²’æœ‰è¨‚é–±ä»»ä½•éŽæ¿¾æ¢ä»¶é›†ï¼Œè¨‚é–±éŽæ¿¾æ¢ä»¶é›†å¯è‡ªå‹•移除與網é å…§å®¹ç„¡é—œçš„廣告。">
+<!ENTITY typeSelector.falsePositive.description "鏿“‡æ­¤é¸é …表示網é ç¼ºå°‘了主è¦å…§å®¹ã€é¡¯ç¤ºéŒ¯èª¤æˆ–功能異常。您å¯ä»¥æš«æ™‚åœç”¨ Adblock Plus 後å†è©¦ä¸€æ¬¡ï¼Œè‹¥åœç”¨å¾Œå•題消失,則很å¯èƒ½å°±æ˜¯ Adblock Plus çš„å•題。">
+<!ENTITY typeSelector.other.label "å…¶ä»–å•題 (&amp;t)">
+<!ENTITY emailComment.label "建議您輸入有效的電å­éƒµä»¶ä½å€ï¼Œå¦‚此我們æ‰èƒ½åœ¨æœ‰ç–‘啿™‚連絡您。這也會用來辨識您所æäº¤çš„報告,並æé«˜å…¶å„ªå…ˆæ¬Šã€‚">
+<!ENTITY issues.whitelist.remove.label "在此é é¢é‡æ–°å•Ÿç”¨ Adblock Plus">
+<!ENTITY outdatedSubscriptions.description "ä¸‹åˆ—çš„éŽæ¿¾æ¢ä»¶é›†è‡³å°‘兩個星期沒有更新。請在é€å‡ºå ±å‘Šå‰æ›´æ–°é€™äº›æ¢ä»¶é›†ï¼Œèªªä¸å®šå•題已經解決了。">
+<!ENTITY dataCollector.description "è«‹ç¨å€™ï¼ŒAdblock Plus 正在è’集必è¦çš„資料。">
+<!ENTITY sendButton.label "傳é€å ±å‘Š (&amp;n)">
+<!ENTITY comment.label "備註 (é¸ç”¨): (&amp;C)">
+<!ENTITY sendPage.errorMessage "嘗試傳é€å ±å‘Šå¤±æ•—,錯誤碼 &quot;?1?&quot;。請確定您已連上網路後å†è©¦ä¸€æ¬¡ã€‚è‹¥ä¾èˆŠå¤±æ•—,請到 [link]Adblock Plus 討論å€[/link] 尋求å”助。">
+<!ENTITY showRecentReports.label "顯示最近傳é€çš„錯誤報告">
+<!ENTITY commentPage.heading "輸入註解">
+<!ENTITY update.start.label "ç«‹å³æ›´æ–°">
+<!ENTITY issues.disabledfilters.description "ä¸‹åˆ—éŽæ¿¾æ¢ä»¶å·²åœç”¨ï¼Œå®ƒå€‘將無法在此é é¢ç™¼æ®ä½œç”¨ï¼š">
+<!ENTITY screenshot.description "åŒæ¨£çš„é é¢æ¯å€‹äººçœ‹åˆ°çš„æƒ…æ³å¯èƒ½éƒ½ä¸åŒã€‚附加螢幕擷圖到報告中å¯ä»¥å¹«åŠ©æˆ‘å€‘æ›´äº†è§£å•題所在。您å¯ä»¥å…ˆç§»é™¤åŒ…嫿•感資訊的部份,也å¯ä»¥æ¨™ç¤ºå•題發生的å€åŸŸï¼Œä½¿å…¶æ›´ç‚ºé†’目。åªè¦æŒ‰ä¸‹ç›¸æ‡‰çš„æŒ‰éˆ•並用滑鼠在圖片上é¸å–å³å¯ã€‚">
+<!ENTITY screenshot.attach.label "附加é é¢åœ–片到報告中 (&amp;t)">
+<!ENTITY issues.whitelist.description "Adblock Plus 在您目å‰å›žå ±çš„é é¢ä¸­åœç”¨ã€‚請在é€å‡ºå ±å‘Šå‰å†æ¬¡å•Ÿç”¨ä¸¦é‡æ–°è¼‰å…¥è©²ç¶²é ä»¥å”助調查。">
+<!ENTITY typeSelector.falseNegative.label "Adblock Plus 沒有擋掉廣告 (&amp;v)">
+<!ENTITY typeSelector.heading "鏿“‡å•題類型">
+<!ENTITY anonymity.warning "我們將無法è¯çµ¡æ‚¨ï¼Œä¸”此報告的優先權å¯èƒ½æœƒç›¸å°è¼ƒä½Žã€‚">
+<!ENTITY wizard.title "錯誤回報器">
+<!ENTITY issues.ownfilters.disable.label "åœç”¨éŽæ¿¾æ¢ä»¶">
+<!ENTITY commentPage.description "下é¢çš„æ–‡å­—方塊å¯ä»¥è®“您輸入é¡å¤–的註解,以幫助我們更了解å•é¡Œæ‰€åœ¨ã€‚é€™å€‹æ­¥é©Ÿä¸æ˜¯å¿…須的,但若å•題ä¸å¤ªæ˜Žé¡¯æ™‚還是建議您這麼åšã€‚åœ¨å›žå ±ä¹‹å‰æ‚¨ä¹Ÿå¯ä»¥æª¢è¦–報告資料。">
+<!ENTITY comment.lengthWarning "æ‚¨è¼¸å…¥çš„è¨»è§£è¶…éŽ 1000 å€‹å­—å…ƒã€‚åªæœ‰å‰ 1000 個字元會被傳é€ã€‚">
+<!ENTITY typeSelector.falseNegative.description "鏿“‡æ­¤é¸é …表示雖然已啟用 Adblock Plus,但廣告ä¾ç„¶é¡¯ç¤ºåœ¨ç¶²é ä¸­ã€‚">
+<!ENTITY sendPage.waitMessage "è«‹ç¨å€™ï¼ŒAdblock Plus æ­£åœ¨å‚³é€æ‚¨çš„報告。">
+<!ENTITY dataCollector.heading "歡迎使用錯誤回報器">
+<!ENTITY screenshot.heading "附加螢幕擷圖">
+<!ENTITY sendPage.heading "傳é€å ±å‘Š">
+<!ENTITY issues.subscriptionCount.description "您似乎訂閱了éŽå¤šçš„éŽæ¿¾æ¢ä»¶é›†ã€‚我們ä¸å»ºè­°é€™éº¼åšï¼Œé€™å¯èƒ½æœƒå¢žåŠ ç™¼ç”ŸéŒ¯èª¤çš„æ©ŸçŽ‡ã€‚åŒæ™‚æˆ‘å€‘ç„¡æ³•æŽ¥å—æ‚¨çš„éŒ¯èª¤å›žå ±ï¼Œå› ç‚ºé‚„ä¸æ¸…æ¥šæ˜¯å“ªä½æ¢ä»¶é›†ä½œè€…需è¦åšå‡ºä¿®æ­£ã€‚請移除ä¸é‡è¦çš„éŽæ¿¾æ¢ä»¶é›†å¾Œå†è©¦ä¸€æ¬¡ï¼Œçœ‹çœ‹éŒ¯èª¤æ˜¯å¦ä»æœƒç™¼ç”Ÿã€‚">
+<!ENTITY screenshot.mark.label "標示å•題所在 (&amp;M)">
+<!ENTITY privacyPolicy.label "éš±ç§æ¬Šæ”¿ç­–">
+<!ENTITY issues.description "Adblock Plus 嵿¸¬åˆ°æ‚¨çš„設定值å¯èƒ½å°Žè‡´å•題發生,或使調查變得難以進行。">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/sidebar.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/sidebar.dtd
new file mode 100644
index 0000000..b25a6ce
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/sidebar.dtd
@@ -0,0 +1,35 @@
+<!ENTITY context.flash.label "é–ƒçˆç‰©ä»¶é‚Šæ¡†">
+<!ENTITY address.label "ä½å€">
+<!ENTITY context.open.label "於新分é é–‹å•Ÿ">
+<!ENTITY type.label "類型">
+<!ENTITY tooltip.filterSource.label "æ¢ä»¶ä¾†æºï¼š">
+<!ENTITY noitems.label "ç„¡å¯é˜»æ“‹é …ç›®">
+<!ENTITY filter.label "éŽæ¿¾æ¢ä»¶">
+<!ENTITY tooltip.size.label "大å°ï¼š">
+<!ENTITY reattach.label "固定">
+<!ENTITY search.label "æœå°‹ï¼š (&amp;S)">
+<!ENTITY docDomain.thirdParty "(第三方)">
+<!ENTITY filterSource.label "æ¢ä»¶ä¾†æº">
+<!ENTITY tooltip.docDomain.label "文件來æºï¼š">
+<!ENTITY context.copy.label "複製項目ä½å€">
+<!ENTITY tooltip.type.label "類型:">
+<!ENTITY context.disablefilter.label "åœç”¨éŽæ¿¾æ¢ä»¶ ?1?">
+<!ENTITY context.copyFilter.label "è¤‡è£½éŽæ¿¾æ¢ä»¶">
+<!ENTITY context.block.label "阻擋此項目">
+<!ENTITY context.enablefilter.label "釿–°å•Ÿç”¨éŽæ¿¾æ¢ä»¶ ?1?">
+<!ENTITY detach.label "分離">
+<!ENTITY whitelisted.label "æ­¤é é¢å·²åŠ å…¥ç™½åå–®">
+<!ENTITY context.disablefilteronsite.label "在 ?1? åœç”¨æ­¤éŽæ¿¾æ¢ä»¶">
+<!ENTITY detached.title "Adblock Plus:å¯é˜»æ“‹é …目(已分離)">
+<!ENTITY docDomain.firstParty "(第一方)">
+<!ENTITY tooltip.type.whitelisted "(白åå–®)">
+<!ENTITY tooltip.filter.label "作用中的æ¢ä»¶ï¼š">
+<!ENTITY tooltip.filter.disabled "(å·²åœç”¨)">
+<!ENTITY context.editfilter.label "編輯作用中的æ¢ä»¶">
+<!ENTITY tooltip.type.blocked "(已阻擋)">
+<!ENTITY size.label "大å°">
+<!ENTITY context.whitelist.label "將此項目加為例外æ¢ä»¶">
+<!ENTITY context.selectAll.label "å…¨é¸">
+<!ENTITY state.label "狀態">
+<!ENTITY docDomain.label "文件來æº">
+<!ENTITY tooltip.address.label "ä½å€ï¼š">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/subscriptionSelection.dtd b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/subscriptionSelection.dtd
new file mode 100644
index 0000000..2752cd1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/locale/zh-TW/subscriptionSelection.dtd
@@ -0,0 +1,12 @@
+<!ENTITY addMain.label "一併訂閱 &quot;?1?&quot; æ¢ä»¶é›† (&amp;s)">
+<!ENTITY list.download.failed "接收æ¢ä»¶é›†æ¸…單失敗。">
+<!ENTITY list.download.retry "å†è©¦ä¸€æ¬¡">
+<!ENTITY title.label "éŽæ¿¾æ¢ä»¶é›†å稱: (&amp;t)">
+<!ENTITY list.download.website "造訪網站">
+<!ENTITY supplementMessage "æ­¤éŽæ¿¾æ¢ä»¶é›†éœ€è¦èˆ‡æ‚¨å°šæœªè¨‚閱的 &quot;?1?&quot; åŒæ™‚使用。">
+<!ENTITY viewList.label "æª¢è¦–éŽæ¿¾æ¢ä»¶">
+<!ENTITY visitHomepage.label "造訪首é ">
+<!ENTITY addSubscription.label "æ–°å¢žéŽæ¿¾æ¢ä»¶é›†">
+<!ENTITY dialog.title "新增 Adblock Plus éŽæ¿¾æ¢ä»¶é›†">
+<!ENTITY location.label "éŽæ¿¾æ¢ä»¶é›†ä½å€ï¼š (&amp;l)">
+<!ENTITY fromWeb.description "è«‹ç¢ºèªæ‚¨æ˜¯å¦è¦è¨‚閱這個æ¢ä»¶é›†ã€‚è¨‚é–±å‰æ‚¨å¯ä»¥è®Šæ›´æ¢ä»¶é›†æ¨™é¡Œæˆ–ä½å€ã€‚">
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-icon-big.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-icon-big.png
new file mode 100644
index 0000000..85cce1c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-icon-big.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status-16.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status-16.png
new file mode 100644
index 0000000..c3abf18
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status-16.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status-32.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status-32.png
new file mode 100644
index 0000000..da2a318
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status-32.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status.png
new file mode 100644
index 0000000..a1c4e0b
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/abp-status.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/ajax-loader.gif b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/ajax-loader.gif
new file mode 100644
index 0000000..a642494
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/ajax-loader.gif
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background-main.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background-main.png
new file mode 100644
index 0000000..464a997
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background-main.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background-share.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background-share.png
new file mode 100644
index 0000000..b572b56
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background-share.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background.png
new file mode 100644
index 0000000..bb19387
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/background.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/checkbox.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/checkbox.png
new file mode 100644
index 0000000..ba6c53e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/checkbox.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/close.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/close.png
new file mode 100644
index 0000000..a4aaf5c
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/close.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/composer.css b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/composer.css
new file mode 100644
index 0000000..da75ba4
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/composer.css
@@ -0,0 +1,77 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
+@namespace html url("http://www.w3.org/1999/xhtml");
+
+/*
+ * Force left-to-right everywhere where we are displaying addresses
+ */
+.suggestion > .radio-label-box:-moz-locale-dir(rtl),
+html|*.textbox-input:-moz-locale-dir(rtl)
+{
+ direction: ltr;
+ text-align: end;
+}
+
+#patternGroup {
+ overflow: auto;
+}
+
+#anchorGroup {
+ padding-left: 20px;
+}
+
+#typeGroupLabel {
+ margin-top: 10px;
+}
+
+#typeGroup {
+ overflow: auto;
+ margin-bottom: 10px
+}
+
+:root:not([advancedMode="true"]) #options {
+ display: none;
+}
+
+#disabledWarning, #groupDisabledWarning, #regexpWarning, #shortpatternWarning, #matchWarning {
+ color: #E00000;
+}
+
+#disabledWarning > *, #groupDisabledWarning > * {
+ margin: 0px;
+ font-size: inherit;
+}
+
+.text-link {
+ font-size: 80%;
+ -moz-user-focus: ignore;
+}
+
+.help {
+ color: #0000E0;
+ border-bottom: 1px dotted #0000E0;
+ cursor: help;
+ margin: 0px;
+ padding: 0px;
+}
+
+tooltip {
+ /* Gecko 1.8.1 doesn't support multiline tooltips :-( */
+ max-width: none;
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/donate.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/donate.png
new file mode 100644
index 0000000..3e77b37
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/donate.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/malware.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/malware.png
new file mode 100644
index 0000000..9b51b63
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/malware.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/social.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/social.png
new file mode 100644
index 0000000..a2af1ea
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/social.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/tracking.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/tracking.png
new file mode 100644
index 0000000..a8727a9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/features/tracking.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/filters.css b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/filters.css
new file mode 100644
index 0000000..a4ea586
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/filters.css
@@ -0,0 +1,221 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
+
+#buttons
+{
+ margin-top: 10px;
+}
+
+#noSubscriptions
+{
+ font-style: italic;
+}
+
+.localeMatch
+{
+ font-weight: bold;
+}
+.selectSubscriptionItem
+{
+ margin: 0px;
+}
+
+.subscription
+{
+ padding: 5px;
+}
+.subscription:not(:last-child)
+{
+ border-bottom: 1px solid rgba(0, 0, 0, 0.25);
+}
+.subscription:not([selected="true"]) > .disabled
+{
+}
+
+.subscription:not([selected="true"]) > .disabled .titleBox
+{
+ color: #808080;
+}
+.subscription:not([selected="true"]) > .disabled .status
+{
+ color: #808080;
+}
+
+.titleBox .title,
+.titleBox > .titleEditor
+{
+ font-weight: bold;
+}
+
+.subscription description, .subscription textbox
+{
+ margin: 0px !important;
+ padding: 0px !important;
+ border-width: 0px !important;
+ -moz-appearance: none !important;
+}
+
+.subscription .link
+{
+ text-decoration: underline;
+ cursor: pointer;
+}
+
+.subscription .warning
+{
+ color: #FF0000;
+}
+
+.enabledCheckbox
+{
+ padding: 2px;
+ -moz-margin-end: 10px;
+}
+.enabledCheckbox:focus
+{
+ outline: 1px dotted gray;
+}
+.enabledCheckbox .checkbox-label-box
+{
+ display: none;
+}
+
+.actionButton
+{
+ font: -moz-info;
+}
+
+splitter
+{
+ border-width: 0px !important;
+}
+
+#filtersTooltip
+{
+ max-width: none;
+}
+
+.tooltipLabel
+{
+ font-weight: bold;
+ -moz-margin-end: 10px;
+}
+
+#tooltip-additional
+{
+ color: #C00000;
+ margin-top: 10px;
+}
+
+tree
+{
+ margin: 0px;
+}
+
+#col-slow {
+ text-align: center;
+}
+
+#col-hitcount, #col-lasthit {
+ text-align: right;
+}
+
+#col-hitcount
+{
+ min-width: 60px;
+}
+#col-enabled
+{
+ min-width: 48px;
+}
+#col-slow
+{
+ min-width: 30px;
+}
+
+/*
+ * Force left-to-right for filter text but not comments
+ */
+treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter, type-invalid),
+treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter, type-whitelist),
+treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter, type-filterlist),
+treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter, type-elemhide),
+treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter, type-elemhideexception)
+{
+ direction: ltr;
+ text-align: end;
+}
+
+treechildren::-moz-tree-cell-text(col-filter, dummy-true)
+{
+ font-style: italic;
+}
+
+treechildren::-moz-tree-cell-text(col-filter, type-whitelist, selected-false),
+treechildren::-moz-tree-cell-text(col-filter, type-elemhideexception, selected-false)
+{
+ color: #008000;
+}
+
+treechildren::-moz-tree-cell-text(col-filter, type-elemhide, selected-false)
+{
+ color: #000080;
+}
+
+treechildren::-moz-tree-cell-text(col-slow)
+{
+ font-size: 0px;
+}
+
+treechildren::-moz-tree-cell-text(col-filter, disabled-true, selected-false)
+{
+ color: #808080;
+}
+
+treechildren::-moz-tree-cell-text(col-filter, type-comment, selected-false)
+{
+ color: #808080;
+}
+
+treechildren::-moz-tree-cell-text(col-filter, type-invalid, selected-false)
+{
+ color: #C00000;
+}
+
+treechildren::-moz-tree-image(col-enabled, disabled-true)
+{
+ list-style-image: url(checkbox.png);
+ -moz-image-region: rect(13px 13px 26px 0px);
+}
+
+treechildren::-moz-tree-image(col-enabled, disabled-false)
+{
+ list-style-image: url(checkbox.png);
+ -moz-image-region: rect(0px 13px 13px 0px);
+}
+
+treechildren::-moz-tree-image(col-slow, slow-true)
+{
+ list-style-image: url(slow.png);
+}
+
+.findbar-highlight
+{
+ display: none;
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/firstRun.css b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/firstRun.css
new file mode 100644
index 0000000..7a02ad6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/firstRun.css
@@ -0,0 +1,588 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+@font-face {
+ font-family: 'CreteRound';
+ font-style: normal;
+ src: url(fonts/CreteRound-Regular.otf);
+ src: local ('Ø'),
+ /*local ('Ø') forces using no local font called CreteRound*/
+ url(fonts/CreteRound-Regular.otf) format('otf');
+}
+
+@font-face {
+ font-family: 'CreteRound';
+ font-style: italic;
+ src: url(fonts/CreteRound-Italic.otf);
+ src: local ('Ø'),
+ /*local ('Ø') forces using no local font called CreteRound*/
+ url(fonts/CreteRound-Italic.otf) format('otf');
+}
+
+body
+{
+ font-family: Helvetica, Arial, sans-serif;
+ font-size: 15px;
+ line-height: 140%;
+ color: #7f776b;
+ background-color: #f8f6f2;
+ background-image: url(background-main.png);
+ margin: 0;
+ padding: 0;
+}
+
+a, a:link, a:visited
+{
+ color: #5a84b3;
+ text-decoration: underline;
+}
+
+a:hover
+{
+ text-decoration: none;
+}
+
+button
+{
+ cursor: pointer;
+}
+
+ul
+{
+ margin: 0;
+ padding: 0;
+}
+
+li
+{
+ margin: 0;
+ padding: 0;
+ list-style-type: none;
+}
+
+header
+{
+ background-image: url(background.png);
+ background-repeat: repeat-x;
+ width: 100%;
+ padding: 40px 0 0 0;
+}
+
+header h1
+{
+ font-size: 24px;
+ font-weight: normal;
+ color: #57ab5b;
+ text-align: center;
+ margin: 21px auto;
+ padding: 16px 0 14px 0;
+ border: 1px #57ab5b;
+ border-style: dashed none;
+ /* border parallel fix - 957px is the value
+ * closest to 960px(page width) which makes
+ * the dashed border parallel
+ */
+ max-width: 957px;
+}
+
+h1,h2,h3
+{
+ font-family: CreteRound, Helvetica, Arial, sans-serif;
+}
+
+h2
+{
+ font-size: 26px;
+ font-weight: lighter;
+ color: #968d81;
+ line-height: 28px;
+ text-align: center;
+ margin: 0;
+ padding: 0;
+}
+
+h3
+{
+ font-size: 22px;
+ color: #7F776B;
+ font-weight: normal;
+ margin: 0 0 10px 0;
+ padding: 0;
+ line-height: 24px;
+}
+
+h4
+{
+ font-size: 15px;
+ color: #7f776b;
+ font-weight: normal;
+ text-align: center;
+ margin: 0;
+ padding: 0;
+}
+
+section
+{
+ margin: 0 auto;
+ margin-bottom: 30px;
+ max-width: 760px;
+ background-image: url(background.png);
+ padding: 40px 100px;
+}
+
+section > p
+{
+ margin: 15px 0 0 0;
+}
+
+#logo
+{
+ margin: 0 auto;
+ height: 100px;
+ width: 99px;
+ display: block;
+ background-image: url(abp-icon-big.png);
+ background-repeat: no-repeat;
+}
+
+#can-do-more
+{
+ max-width: 960px;
+ padding: 40px 0px 0px 0px;
+ border-bottom: 4px solid #968D81;
+}
+
+#can-do-more > h2
+{
+ margin: 0 100px;
+}
+
+.feature-malware-image
+{
+ background-image: url(features/malware.png);
+ background-repeat: no-repeat;
+}
+
+.feature-social-image
+{
+ background-image: url(features/social.png);
+ background-repeat: no-repeat;
+}
+
+.feature-tracking-image
+{
+ background-image: url(features/tracking.png);
+ background-repeat: no-repeat;
+}
+
+#can-do-more-content
+{
+ margin: 30px 100px 20px 100px;
+}
+
+#can-do-more #features
+{
+ border-spacing: 10px;
+ margin: 0px;
+ padding: 0px;
+}
+
+#can-do-more .feature:not([hidden])
+{
+ display: block;
+ list-style-type: none;
+ padding: 30px 0;
+ padding-bottom: 20px;
+ border-top: 1px dashed #c0bebb;
+}
+
+#can-do-more .feature-image, #can-do-more .feature-description
+{
+ display: inline-block;
+ *display: inline; /* IE6 inline-block fix */
+ *zoom: 1;
+ vertical-align: top;
+}
+
+#can-do-more .feature-description
+{
+ margin: 0px 0px 0 20px;
+ width: 625px;
+ max-width: 85%;
+}
+
+#can-do-more .feature-description-textblock
+{
+ width: 480px;
+ max-width: 100%;
+ margin: 0 40px 0 0;
+ display: inline-block;
+}
+
+#can-do-more .feature-description-textblock > span
+{
+ margin: 15px 0 0 0;
+}
+
+#can-do-more .feature-image
+{
+ width: 59px;
+ height: 59px;
+ margin: 8px 0 10px 20px;
+}
+
+#share
+{
+ background-image: url(background-share.png);
+ padding: 50px 100px 40px 100px;
+ max-width: 760px;
+ text-align: center;
+ font-family: CreteRound, Helvetica, Arial, sans-serif;
+}
+
+#share h2
+{
+ color: #fff;
+ margin: 0 0 30px 0;
+}
+
+#share h2 > a
+{
+ color: #fff;
+}
+
+#share h2 > a:hover
+{
+ color: #2e5075;
+}
+
+#share span
+{
+ color: #bed1e6;
+ text-align: center;
+ line-height: 34px;
+ font-size: 22px;
+ display: block;
+}
+
+#donate:hover, .share-buttons a:hover
+{
+ box-shadow: 0px 0px 0px 2px #8ca7c4;
+ border-radius: 30px;
+}
+
+#donate-block span, #share-block span
+{
+ margin: 10px 20px 0px 20px;
+}
+
+#donate-block, #share-block
+{
+ min-width: 250px;
+ display: inline-block;
+ vertical-align: top;
+ padding: 5px 0 5px 0;
+}
+
+#donate-block
+{
+ border: 1px dashed #37506d;
+ border-style: none dashed;
+ width: 50%;
+}
+
+#share-block
+{
+ border-right: 1px dashed #37506d;
+ width: 49%;
+}
+
+.share-buttons
+{
+ margin: 6px 0 0 0;
+ cursor: pointer;
+ vertical-align: top;
+ /* because inline block creates
+ * space if not captured with
+ * font-size and line-height 0px
+ */
+ font-size: 0px;
+ line-height: 0px;
+}
+
+.share-buttons > a
+{
+ width: 50px;
+ height: 50px;
+ margin: 0 8px;
+ text-decoration: none;
+ display: inline-block;
+}
+
+#share-general,
+:root[lang^="zh-"] #share-chinese
+{
+ display: block;
+}
+
+:root[lang^="zh-"] #share-general,
+#share-chinese
+{
+ display: none;
+}
+
+#share-chinese > a
+{
+ border-bottom: 2px solid transparent;
+}
+
+#share-chinese > a:hover
+{
+ box-shadow: none;
+ border-radius: 0;
+ border-bottom: 2px solid #8CA7C4;
+}
+
+#share-facebook
+{
+ background-image: url(social/facebook.png);
+ background-repeat: no-repeat;
+}
+
+#share-twitter
+{
+ background-image: url(social/twitter.png);
+ background-repeat: no-repeat;
+}
+
+#share-gplus
+{
+ background-image: url(social/googleplus.png);
+ background-repeat: no-repeat;
+}
+
+#share-renren
+{
+ background-image: url(social/renren.png);
+ background-repeat: no-repeat;
+}
+
+#share-weibo
+{
+ background-image: url(social/weibo.png);
+ background-repeat: no-repeat;
+}
+
+.warning
+{
+ font-size: 160%;
+ border: 3px dashed red;
+ text-align: center;
+ line-height: 1.3em;
+}
+
+#social ul
+{
+ list-style: none;
+ display: inline-block;
+ padding: 0;
+ margin: 0;
+}
+
+#social:hover h1
+{
+ opacity: 0;
+}
+
+#social ul:hover li {
+ opacity: 0.3;
+}
+
+#social ul li
+{
+ display: inline-block;
+ margin: 0px 5px;
+ -webkit-transition: opacity .5s ease, bottom .3s ease;
+ transition: opacity .5s ease, bottom .3s ease;
+ position: relative;
+ bottom: -30px;
+}
+
+#social ul li:hover
+{
+ opacity: 1.0;
+ bottom: 0px;
+}
+
+.share-button
+{
+ display: inline-block;
+ width: 82px;
+ height: 82px;
+}
+
+#glass-pane, #share-popup
+{
+ visibility: hidden;
+ opacity: 0;
+ -webkit-transition-property: opacity;
+ transition-property: opacity;
+}
+
+#glass-pane
+{
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ background: rgba(0, 0, 0, 0.5) url(ajax-loader.gif) no-repeat 50% 50%;
+ z-index: 101;
+ -webkit-transition-duration: 0.2s;
+ transition-duration: 0.2s;
+}
+
+#share-popup
+{
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ border: none;
+ -webkit-transition-delay: 0.1s;
+ transition-delay: 0.1s;
+}
+
+#glass-pane.visible, #share-popup.visible
+{
+ visibility: visible;
+ opacity: 1;
+}
+
+#share-popup.visible
+{
+ -webkit-transition-duration: 0.15s;
+ transition-duration: 0.15s;
+}
+
+.toggle
+{
+ cursor: pointer;
+ position: relative;
+ display: inline-block;
+ vertical-align: top;
+ height: 22px;
+ margin: 32px 0px 7px 0px;
+ border-radius: 9999px;
+ border: 1px solid #999;
+ overflow: hidden;
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ user-select: none;
+}
+
+.toggle:hover
+{
+ box-shadow: 0px 0px 3px 0px #968d81;
+}
+
+.toggle:active
+{
+ cursor: wait;
+}
+
+.toggle-on, .toggle-off
+{
+ min-width: 42px;
+ height: 100%;
+ font-size: 11px;
+ font-weight: 500;
+ text-align: center;
+ line-height: 23px;
+ border-radius: 9999px;
+}
+
+.toggle-on
+{
+ padding: 0px 30px 0px 10px;
+ color: rgba(255,255,255, 0.8);
+ text-shadow: 1px 1px rgba(0,0,0,0.2);
+ box-shadow: inset 2px 2px 6px rgba(0,0,0,0.2);
+ background: rgb(69,163,31);
+}
+
+.toggle-off
+{
+ padding: 0px 10px 0px 30px;
+ color: rgba(0,0,0,0.6);
+ text-shadow: 1px 1px rgba(255,255,255,0.2);
+ background: #cfcfcf;
+ background: -moz-linear-gradient(top, #cfcfcf 0%, #f5f5f5 100%);
+ background: -webkit-linear-gradient(top, #cfcfcf 0%,#f5f5f5 100%);
+ background: linear-gradient(to bottom, #cfcfcf 0%,#f5f5f5 100%);
+}
+
+.toggle-blob
+{
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ height: 100%;
+ width: 22px;
+ border-radius: 50px;
+ background: #cfcfcf;
+ background: -moz-linear-gradient(bottom, #cfcfcf 0%, #f5f5f5 100%);
+ background: -webkit-linear-gradient(bottom, #cfcfcf 0%,#f5f5f5 100%);
+ background: linear-gradient(to top, #cfcfcf 0%,#f5f5f5 100%);
+ box-shadow: 1px 1px 2px #888;
+}
+
+.off .toggle-on
+{
+ margin-top: -22px;
+}
+
+.off .toggle-blob
+{
+ left: 0px;
+ right: auto;
+}
+
+#donate
+{
+ height: 21px;
+ display: inline-block;
+ margin: 15px 0px 2px 0px;
+ font-size: 16px;
+ color: #003366;
+ cursor: pointer;
+ font-weight: bold;
+ padding: 5px 18px;
+ text-decoration: none;
+ border-radius: 20px;
+ border: 1px solid #FF9933;
+ overflow: hidden;
+ font-family: arial, sans-serif;
+ background-image: url(donate.png);
+ background-repeat: repeat-x;
+}
+
+footer
+{
+ margin: 0 auto 30px;
+ max-width: 960px;
+ text-align: center;
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/fonts/CreteRound-Italic.otf b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/fonts/CreteRound-Italic.otf
new file mode 100644
index 0000000..169bced
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/fonts/CreteRound-Italic.otf
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/fonts/CreteRound-Regular.otf b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/fonts/CreteRound-Regular.otf
new file mode 100644
index 0000000..d951855
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/fonts/CreteRound-Regular.otf
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/item-state.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/item-state.png
new file mode 100644
index 0000000..a494379
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/item-state.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/overlay.css b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/overlay.css
new file mode 100644
index 0000000..0f58a15
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/overlay.css
@@ -0,0 +1,226 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
+@namespace html url("http://www.w3.org/1999/xhtml");
+
+#abp-status
+{
+ cursor: pointer;
+}
+
+toolbar[iconsize="small"] #abp-toolbarbutton,
+#PersonalToolbar #abp-toolbarbutton,
+#header-view-toolbar > #abp-toolbarbutton,
+#abp-status {
+ list-style-image: url("abp-status-16.png");
+ -moz-image-region: rect(0px, 16px, 16px, 0px);
+}
+toolbar[iconsize="small"] #abp-toolbarbutton[abpstate="disabled"],
+#PersonalToolbar #abp-toolbarbutton[abpstate="disabled"],
+#header-view-toolbar > #abp-toolbarbutton[abpstate="disabled"],
+#abp-status[abpstate="disabled"],
+toolbar[iconsize="small"] #abp-toolbarbutton[abpstate="whitelisted"],
+#PersonalToolbar #abp-toolbarbutton[abpstate="whitelisted"],
+#header-view-toolbar > #abp-toolbarbutton[abpstate="whitelisted"],
+#abp-status[abpstate="whitelisted"] {
+ -moz-image-region: rect(16px, 16px, 32px, 0px);
+}
+
+#abp-toolbarbutton[cui-areatype="menu-panel"],
+toolbarpaletteitem[place="palette"] > #abp-toolbarbutton
+{
+ list-style-image: url("abp-status-32.png");
+ -moz-image-region: rect(0px, 32px, 32px, 0px);
+}
+
+#abp-toolbarbutton[cui-areatype="menu-panel"][abpstate="disabled"],
+toolbarpaletteitem[place="palette"] > #abp-toolbarbutton[abpstate="disabled"],
+#abp-toolbarbutton[cui-areatype="menu-panel"][abpstate="whitelisted"],
+toolbarpaletteitem[place="palette"] > #abp-toolbarbutton[abpstate="whitelisted"]
+{
+ -moz-image-region: rect(32px, 32px, 64px, 0px);
+}
+
+#abp-toolbar-popup {
+ list-style-image: none;
+ -moz-image-region: rect(0px, 0px, 0px, 0px);
+}
+
+toolbox[vertical="true"] toolbar #abp-toolbarbutton dropmarker {
+ display: none !important;
+}
+
+menuitem[default="true"] {
+ font-weight: bold;
+}
+
+#abp-toolbarbutton,
+#abp-site-info {
+ list-style-image: url("abp-status.png");
+ -moz-image-region: rect(0px, 24px, 24px, 0px);
+}
+#abp-toolbarbutton[abpstate="disabled"],
+#abp-toolbarbutton[abpstate="whitelisted"],
+#abp-site-info[abpaction="enable"],
+#abp-site-info[abpaction="enable_site"] {
+ -moz-image-region: rect(24px, 24px, 48px, 0px);
+}
+
+/* Hack: force the label to be displayed below icon for type="menu" */
+#abp-toolbarbutton[type="menu"]:not([cui-areatype="menu-panel"])
+{
+ -moz-box-orient: horizontal;
+}
+toolbar[mode="full"] #abp-toolbarbutton[type="menu"]
+{
+ -moz-binding: url("chrome://global/content/bindings/toolbarbutton.xml#menu-vertical");
+}
+
+/* Thunderbird-specific toolbar icon styles */
+#header-view-toolbar > #abp-toolbarbutton
+{
+ -moz-appearance: dualbutton;
+ padding: 0px !important;
+}
+
+/* Hide toolbar icon text in Thunderbird to save space */
+#header-view-toolbar > #abp-toolbarbutton .toolbarbutton-text
+{
+ display: none;
+}
+
+/* SeaMonkey expects the icon to be rather large, add margin */
+#mail-toolbox #abp-toolbarbutton .toolbarbutton-icon
+{
+ margin-top: 5px;
+}
+
+#abp-status-image {
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+#abp-site-info .pageaction-image {
+ width: 32px;
+ height: 32px;
+ padding: 4px;
+}
+
+#abp-toolbarbutton > toolbarbutton {
+ /* Argh, Songbird defines image region directly on the anonymous toolbarbutton element */
+ -moz-image-region: inherit !important;
+}
+
+#abp-tooltip {
+ max-width: none;
+}
+
+#abp-tooltip label {
+ font-weight: bold;
+ margin-bottom: 0px;
+}
+
+#abp-tooltip description:not([hidden="true"])+label {
+ margin-top: 10px;
+}
+
+#abp-bottombar-title {
+ padding-left: 4px;
+}
+
+#abp-bottombar-toolbar {
+ display: -moz-box !important;
+ visibility: visible !important;
+}
+
+#abp-bottombar-close {
+ padding: 4px 2px;
+ border-style: none !important;
+ -moz-user-focus: normal;
+ list-style-image: url("close.png");
+ -moz-appearance: none;
+ -moz-image-region: rect(0px, 14px, 14px, 0px);
+}
+
+#abp-bottombar-close:hover {
+ -moz-image-region: rect(0px, 28px, 14px, 14px);
+}
+
+#abp-bottombar-close:hover:active {
+ -moz-image-region: rect(0px, 42px, 14px, 28px);
+}
+
+.abp-contributebutton
+{
+ margin-top: 20px;
+}
+
+.abp-contributebutton-btn
+{
+ font: -moz-info;
+ margin-left: 40px;
+ margin-right: 40px;
+}
+
+.abp-contributebutton-close
+{
+ border-style: none !important;
+ -moz-user-focus: normal;
+ list-style-image: url("close.png");
+ -moz-appearance: none;
+ -moz-image-region: rect(0px, 14px, 14px, 0px);
+
+ /* Firefox Australis theme defines some width for all toolbaritem tags inside
+ * UIPanel element, the properties have to be reset to default values. */
+ min-width: 0px !important;
+ min-height: 0px !important;
+ width: auto !important;
+ height: auto !important;
+}
+
+.abp-contributebutton-close:hover
+{
+ -moz-image-region: rect(0px, 28px, 14px, 14px);
+}
+
+#abp-notification
+{
+ width: 300px;
+}
+
+#abp-notification-question
+{
+ display: none;
+ white-space: nowrap;
+}
+
+.abp-question #abp-notification-question
+{
+ display: block;
+}
+
+#abp-notification html|a
+{
+ cursor: pointer;
+ color: #0000f0;
+}
+
+#abp-notification html|a:hover
+{
+ text-decoration: underline;
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/sendReport.css b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/sendReport.css
new file mode 100644
index 0000000..53768f9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/sendReport.css
@@ -0,0 +1,129 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
+
+.wizard-header
+{
+ display: none;
+}
+
+#wizardHeader
+{
+ display: -moz-box;
+ -moz-box-ordinal-group: 0;
+ -moz-binding: none !important;
+ padding: 10px 5px !important;
+}
+
+.progressLabel
+{
+ margin: 5px 0px;
+ text-align: center;
+ font-size: 110%;
+ font-weight: normal;
+}
+
+.progressLabel.active
+{
+ font-weight: bold;
+}
+
+progressmeter
+{
+ margin-top: 100px;
+}
+
+.radioDescription
+{
+ -moz-margin-start: 32px;
+}
+
+radio, checkbox, .topLabel, #dataDeck
+{
+ margin-top: 15px;
+}
+
+#recentReports
+{
+ margin-top: 15px;
+}
+
+#recentReportsList
+{
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+#outdatedSubscriptionsList
+{
+ margin: 10px 20px;
+}
+
+#issuesBox
+{
+ overflow: auto;
+}
+
+#issuesChangeMessage
+{
+ color: red;
+}
+
+#screenshotButtons
+{
+ margin-top: 10px;
+}
+
+#screenshotBox
+{
+ overflow-y: scroll;
+}
+
+#commentLengthWarning, #anonymityWarning
+{
+ color: red;
+}
+
+#commentLengthWarning[visible="false"], #anonymityWarning[visible="false"]
+{
+ visibility: hidden;
+}
+
+/*
+ * Force left-to-right everywhere where we are displaying addresses
+ */
+#data:-moz-locale-dir(rtl)
+{
+ direction: ltr;
+}
+
+#sendReportError
+{
+ color: red;
+ font-size: 150%;
+}
+
+#sendReportErrorLinks, #typeWarningTextLink
+{
+ margin: 0px;
+}
+
+#sendReportErrorBox
+{
+ margin-bottom: 10px;
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/sidebar.css b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/sidebar.css
new file mode 100644
index 0000000..abad956
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/sidebar.css
@@ -0,0 +1,112 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
+
+#suggestionsList {
+ margin: 0px;
+}
+
+#detachButton, #reattachButton:not([disabled="true"]) {
+ text-decoration: underline;
+ cursor: pointer;
+}
+
+#reattachButton[disabled="true"] {
+ color: GrayText;
+}
+
+#detachButton, #reattachButton {
+ font-size: 90%;
+}
+
+tooltip {
+ max-width: none;
+}
+
+#tooltipPreview {
+ margin:10px;
+ max-width: 300px;
+ max-height: 300px;
+}
+
+#tooltip label {
+ font-weight: bold;
+}
+
+#contextBlock,
+#contextWhitelist {
+ font-weight: bold;
+}
+
+#state {
+ min-width: 16px;
+}
+
+#size {
+ text-align: end;
+}
+
+/*
+ * Force left-to-right everywhere where we are displaying addresses
+ */
+treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-filter),
+treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-address),
+treechildren:-moz-locale-dir(rtl)::-moz-tree-cell(col-size)
+{
+ direction: ltr;
+ text-align: end;
+}
+
+.disabledTextLabel
+{
+ font-style: italic;
+}
+
+treechildren::-moz-tree-cell-text(state-filtered, selected-false),
+treechildren::-moz-tree-cell-text(state-hidden, selected-false) {
+ color: #C00000;
+}
+treechildren::-moz-tree-cell-text(state-whitelisted, selected-false),
+treechildren::-moz-tree-cell-text(state-hiddenexception, selected-false) {
+ color: #008000;
+}
+
+treechildren::-moz-tree-image(col-state, dummy-false)
+{
+ list-style-image: url(item-state.png);
+ -moz-image-region: rect(0px 10px 10px 0px);
+ -moz-margin-start: 3px;
+}
+treechildren::-moz-tree-image(col-state, filter-disabled-true, dummy-false) {
+ -moz-image-region: rect(10px 10px 20px 0px);
+}
+treechildren::-moz-tree-image(col-state, state-filtered, dummy-false),
+treechildren::-moz-tree-image(col-state, state-hidden, dummy-false) {
+ -moz-image-region: rect(20px 10px 30px 0px);
+}
+treechildren::-moz-tree-image(col-state, state-whitelisted, dummy-false),
+treechildren::-moz-tree-image(col-state, state-hiddenexception, dummy-false) {
+ -moz-image-region: rect(30px 10px 40px 0px);
+}
+
+treechildren::-moz-tree-cell-text(col-filter, state-hidden, selected-false) {
+ color: #000080;
+}
+treechildren::-moz-tree-cell-text(col-filter, filter-disabled-true, selected-false) {
+ color: #C0C0C0;
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/slow.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/slow.png
new file mode 100644
index 0000000..8463e9e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/slow.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/facebook.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/facebook.png
new file mode 100644
index 0000000..f45c417
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/facebook.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/googleplus.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/googleplus.png
new file mode 100644
index 0000000..53e6819
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/googleplus.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/renren.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/renren.png
new file mode 100644
index 0000000..e9af994
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/renren.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/twitter.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/twitter.png
new file mode 100644
index 0000000..fec913a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/twitter.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/weibo.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/weibo.png
new file mode 100644
index 0000000..176a628
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/social/weibo.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/subscriptionSelection.css b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/subscriptionSelection.css
new file mode 100644
index 0000000..8ed7c24
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/chrome/skin/subscriptionSelection.css
@@ -0,0 +1,69 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
+
+dialog
+{
+ width: 550px;
+}
+
+*[invisible="true"]
+{
+ visibility: hidden;
+}
+
+#supplementMessage
+{
+ color: #F00000;
+}
+
+.localeMatch
+{
+ font-weight: bold;
+}
+
+#all-subscriptions-loading
+{
+ margin: 50px;
+}
+
+#all-subscriptions
+{
+ min-height: 200px;
+}
+#all-subscriptions > richlistitem > .variant
+{
+ width: 200px;
+}
+#all-subscriptions > richlistitem:not(:first-child) > .subscriptionTitle,
+#all-subscriptions > richlistitem:not(:first-child) > .subscriptionTitle + .variant
+{
+ border-top: 1px dashed black;
+ margin-top: 0px;
+ padding-top: 4px;
+}
+
+#supplementMessage
+{
+ margin-top: 5px;
+}
+#supplementMessage > label
+{
+ margin-left: 0px;
+ margin-right: 0px;
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/defaults/prefs.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/defaults/prefs.js
new file mode 100644
index 0000000..efcb5e3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/defaults/prefs.js
@@ -0,0 +1,38 @@
+// For description of these values see http://adblockplus.org/en/preferences
+
+pref("extensions.adblockplus.currentVersion", "0.0");
+pref("extensions.adblockplus.enabled", true);
+pref("extensions.adblockplus.frameobjects", true);
+pref("extensions.adblockplus.fastcollapse", false);
+pref("extensions.adblockplus.showinstatusbar", false);
+pref("extensions.adblockplus.detachsidebar", false);
+pref("extensions.adblockplus.defaulttoolbaraction", 0);
+pref("extensions.adblockplus.defaultstatusbaraction", 0);
+pref("extensions.adblockplus.sidebar_key", "Accel Shift V, Accel Shift U");
+pref("extensions.adblockplus.sendReport_key", "");
+pref("extensions.adblockplus.filters_key", "Accel Shift E, Accel Shift F, Accel Shift O");
+pref("extensions.adblockplus.enable_key", "");
+pref("extensions.adblockplus.flash_scrolltoitem", true);
+pref("extensions.adblockplus.previewimages", true);
+pref("extensions.adblockplus.data_directory", "adblockplus");
+pref("extensions.adblockplus.patternsbackups", 5);
+pref("extensions.adblockplus.patternsbackupinterval", 24);
+pref("extensions.adblockplus.whitelistschemes", "about chrome file irc moz-safe-about news resource snews x-jsd addbook cid imap mailbox nntp pop data javascript moz-icon");
+pref("extensions.adblockplus.subscriptions_autoupdate", true);
+pref("extensions.adblockplus.subscriptions_listurl", "https://adblockplus.org/subscriptions2.xml");
+pref("extensions.adblockplus.subscriptions_fallbackurl", "https://adblockplus.org/getSubscription?version=%VERSION%&url=%SUBSCRIPTION%&downloadURL=%URL%&error=%ERROR%&channelStatus=%CHANNELSTATUS%&responseStatus=%RESPONSESTATUS%");
+pref("extensions.adblockplus.subscriptions_fallbackerrors", 5);
+pref("extensions.adblockplus.subscriptions_exceptionsurl", "https://easylist-downloads.adblockplus.org/exceptionrules.txt");
+pref("extensions.adblockplus.subscriptions_exceptionscheckbox", true);
+pref("extensions.adblockplus.documentation_link", "https://adblockplus.org/redirect?link=%LINK%&lang=%LANG%");
+pref("extensions.adblockplus.savestats", true);
+pref("extensions.adblockplus.composer_default", 2);
+pref("extensions.adblockplus.clearStatsOnHistoryPurge", true);
+pref("extensions.adblockplus.report_submiturl", "https://reports.adblockplus.org/submitReport?version=1&guid=%GUID%&lang=%LANG%");
+pref("extensions.adblockplus.recentReports", []);
+pref("extensions.adblockplus.hideContributeButton", false);
+pref("extensions.adblockplus.blockableItemsSize", {width: 200, height: 200});
+pref("extensions.adblockplus.notificationurl", "https://notification.adblockplus.org/notification.json");
+pref("extensions.adblockplus.notificationdata", {});
+pref("extensions.adblockplus.subscriptions_antiadblockurl", "https://easylist-downloads.adblockplus.org/antiadblockfilters.txt");
+pref("extensions.adblockplus.please_kill_startup_performance", false);
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/icon.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/icon.png
new file mode 100644
index 0000000..9db9e39
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/icon.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/icon64.png b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/icon64.png
new file mode 100644
index 0000000..a8dcad6
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/icon64.png
Binary files differ
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/install.rdf b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/install.rdf
new file mode 100644
index 0000000..edaed14
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/install.rdf
@@ -0,0 +1,634 @@
+<?xml version="1.0"?>
+
+<!--
+ - This file is part of the Adblock Plus build tools,
+ - Copyright (C) 2006-2014 Eyeo GmbH
+ -
+ - Adblock Plus is free software: you can redistribute it and/or modify
+ - it under the terms of the GNU General Public License version 3 as
+ - published by the Free Software Foundation.
+ -
+ - Adblock Plus is distributed in the hope that it will be useful,
+ - but WITHOUT ANY WARRANTY; without even the implied warranty of
+ - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ - GNU General Public License for more details.
+ -
+ - You should have received a copy of the GNU General Public License
+ - along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ -->
+
+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:em="http://www.mozilla.org/2004/em-rdf#">
+
+ <Description about="urn:mozilla:install-manifest">
+ <em:id>{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}</em:id>
+ <em:version>2.6.3.0</em:version>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Ads were yesterday!</em:description>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:type>2</em:type>
+ <em:bootstrap>true</em:bootstrap>
+ <em:updateURL>https://adblockplus.org/devbuilds/adblockplus/update.rdf?reqVersion=%REQ_VERSION%&amp;id=%ITEM_ID%&amp;version=%ITEM_VERSION%&amp;maxAppVersion=%ITEM_MAXAPPVERSION%&amp;status=%ITEM_STATUS%&amp;appID=%APP_ID%&amp;appVersion=%APP_VERSION%&amp;appOS=%APP_OS%&amp;appABI=%APP_ABI%&amp;locale=%APP_LOCALE%&amp;currentAppVersion=%CURRENT_APP_VERSION%&amp;updateType=%UPDATE_TYPE%</em:updateURL>
+ <em:optionsURL>chrome://adblockplus/content/ui/settings.xul</em:optionsURL>
+ <em:optionsType>2</em:optionsType>
+ <em:localized>
+ <Description>
+ <em:locale>ar</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>آدبلوك بلس</em:name>
+ <em:description>الإعلانات أصبحت من الأمس!</em:description>
+ <em:homepageURL>http://adblockplus.org/ar/</em:homepageURL>
+ <em:translator>Ùلاديمير بلنت</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>bg</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Рекламите бÑха вчера!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Ивайло Йовчев (s0urce)</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>ca</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>AdBlock Plus</em:name>
+ <em:description>Els anuncis eren ahir</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>BennyBeat</em:translator>
+ <em:translator>CatTranslations</em:translator>
+ <em:translator>el_libre</em:translator>
+ <em:translator>Toni Barrera</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>cs</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>A reklamy jsou minulostí!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Jakub Tománek</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>da</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reklamer er fortid!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>AlleyKat</em:translator>
+ <em:translator>Regmos</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>de</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Werbung war gestern!</em:description>
+ <em:homepageURL>http://adblockplus.org/de/</em:homepageURL>
+ <em:translator>Wladimir Palant</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>dsb</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Wabjenje jo cora była!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>milupo</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>el</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Αφήστε τις διαφημίσεις στο χθες!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>rookie</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>en-GB</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Ads were yesterday!</em:description>
+ <em:homepageURL>http://adblockplus.org/en/</em:homepageURL>
+ <em:translator>Mark Tyndall</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>en-US</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Ads were yesterday!</em:description>
+ <em:homepageURL>http://adblockplus.org/en/</em:homepageURL>
+ <em:translator>Wladimir Palant</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>eo</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reklamoj estis hieraÅ­!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Wladimir PALANT</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>es-AR</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>¡La publicidad es cosa del pasado!</em:description>
+ <em:homepageURL>http://adblockplus.org/es/</em:homepageURL>
+ <em:translator>KNTRO</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>es-ES</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>La publicidad es cosa del ayer</em:description>
+ <em:homepageURL>http://adblockplus.org/es/</em:homepageURL>
+ <em:translator>Urko</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>es-MX</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Los Anuncios son cosa del Ayer!</em:description>
+ <em:homepageURL>http://adblockplus.org/es/</em:homepageURL>
+ <em:translator>Francisco Alvarado</em:translator>
+ <em:translator>Ninnetyer</em:translator>
+ <em:translator>poz2k4444</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>et</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reklaamid on nüüd eilne päev!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Aivo Kuhlberg</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>eu</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Iragarkiak atzoko kontuak dira!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Librezale.org</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>fa</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>تبلیغت متعلق به دیروز بود!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>از طر٠Wladimir Palant</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>fi</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Mainokset ovat menneisyyttä!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Joni Heinonen</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>fr</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Les publicités, c&#39;est du passé !</em:description>
+ <em:homepageURL>http://adblockplus.org/fr/</em:homepageURL>
+ <em:translator>Dagobert_78</em:translator>
+ <em:translator>Jim Courbron</em:translator>
+ <em:translator>jojaba</em:translator>
+ <em:translator>pirlouy</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>fy-NL</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Fan no ôf gjin reklames mear!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Wim Benes</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>gl</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>A publicidade é o que lle doe!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Jesús Olano</em:translator>
+ <em:translator>Manuel Meixide</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>he</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>הפרסומות שייכות לעבר!</em:description>
+ <em:homepageURL>http://adblockplus.org/he/</em:homepageURL>
+ <em:translator>catcat</em:translator>
+ <em:translator>SiiiE</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>hr</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reklame su prošlost!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>gogo</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>hsb</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reklama bÄ› wÄera!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Milupo</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>hu</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>A reklám a múlté!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Gárdonyi László</em:translator>
+ <em:translator>Mikes Kaszmán István</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>hy-AM</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Ô³Õ¸Õ¾Õ¡Õ¦Õ¤Õ¶Õ¥Ö€Õ¨ Õ¥Ö€Õ¥Õ¯ Õ§Õ«Õ¶!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>iAbaS</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>id</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Iklan sudah menjadi masa lalu!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>is</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Auglýsingar eru hluti af fortíðinni!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Kristján Bjarni Guðmundsson</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>it</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Permette di dire &#39;no&#39; alla pubblicità presente nelle pagine web!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Luana Di Muzio - BabelZilla</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>ja</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>広告ã¯éŽåŽ»ã®éºç‰©ã§ã™ï¼</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Haebaru</em:translator>
+ <em:translator>k2jp</em:translator>
+ <em:translator>Premier</em:translator>
+ <em:translator>Shirayuki (alphabetical order)</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>kk</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Жарнамаға жол жоқ!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Бауржан Муфтахидинов</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>ko</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>ì¸í„°ë„· ì´ìš©ì„ 방해하거나 불법·유해한 ê´‘ê³ ì˜ ì°¨ë‹¨!</em:description>
+ <em:homepageURL>http://adblockplus.org/ko/</em:homepageURL>
+ <em:translator>Maybee</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>lt</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reklamos tai praeitis!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Algimantas MargeviÄius</em:translator>
+ <em:translator>Jonas Slivka</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>lv</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>ReklÄmas ir vakardiena!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Džerijs Šterns</em:translator>
+ <em:translator>Janis-Marks Gailis</em:translator>
+ <em:translator>Klaids Borovs</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>ms</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Iklan hanyalah pada masa dulu!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>temperror</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>nb-NO</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Si farvel til reklame!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Roy Skoglund</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>nl</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reclames behoren tot het verleden!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>markh</em:translator>
+ <em:translator>Onno Ekker</em:translator>
+ <em:translator>pitdicker</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>pl</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Powiedz NIE! reklamom</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Leszek(teo)Życzkowski</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>pt-BR</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Propaganda indesejada é coisa do passado!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Ajwsert</em:translator>
+ <em:translator>Mauro José da Silva</em:translator>
+ <em:translator>Teboga</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>pt-PT</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Publicidade... já era!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>António Mendonça; Sérgio Marques</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>ro</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Elimină publicitatea din paginile web.</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>ultravioletu</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>ru</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Скажи &#34;нет&#34; рекламе!</em:description>
+ <em:homepageURL>http://adblockplus.org/ru/</em:homepageURL>
+ <em:translator>Wladimir Palant</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>sk</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reklamy sú minulosťou!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Ján Kendi (Jacen)</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>sl</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Oglasi so preteklost!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Martin Srebotnjak</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>sq</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reklamat jane e kaluara!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Genti Ereqi</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>sr</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>ОглаÑи Ñу прошлоÑÑ‚!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>kapetance</em:translator>
+ <em:translator>ДакСРБИЈÐ</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>sv-SE</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Säg farväl till all reklam!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Mikael Hiort af Ornäs</em:translator>
+ <em:translator>Stefan Lewitas</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>th</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>ลาà¸à¹ˆà¸­à¸™à¸žà¸§à¸à¹‚ฆษณา!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Anusuk Sangubon(Jaideejung007)</em:translator>
+ <em:translator>Ken</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>tr</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Reklamlar geçmişte kaldı!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Ahmet Serkan Tıratacı</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>uk</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Скажи «ÐІ» рекламі!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Тимофій Бабич</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>vi</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>Quảng cáo đã là dĩ vãng!</em:description>
+ <em:homepageURL>http://adblockplus.org/</em:homepageURL>
+ <em:translator>Knight Vegor</em:translator>
+ <em:translator>Nguyễn Mạnh Hùng</em:translator>
+ <em:translator>SITUVN</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>zh-CN</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>广告已æˆå¾€äº‹ï¼</em:description>
+ <em:homepageURL>https://adblockplus.org/zh_CN/</em:homepageURL>
+ <em:translator>blackdire</em:translator>
+ <em:translator>YFdyh000</em:translator>
+ </Description>
+ </em:localized>
+ <em:localized>
+ <Description>
+ <em:locale>zh-TW</em:locale>
+ <em:creator>Wladimir Palant</em:creator><em:contributor>Claude Lespagnol aka Efdur</em:contributor><em:contributor>Nickolay Ponomarev</em:contributor><em:contributor>Kevin Keller</em:contributor><em:contributor>Fabrice Desré</em:contributor><em:contributor>Hubird</em:contributor><em:contributor>Günther Beyer (opoloo.de)</em:contributor><em:contributor>Algimantas MargeviÄius</em:contributor><em:contributor>anonymous74100</em:contributor><em:contributor>BsT</em:contributor><em:contributor>Crits</em:contributor><em:contributor>Famlam</em:contributor><em:contributor>fanboy</em:contributor><em:contributor>heradhis</em:contributor><em:contributor>Jiefei</em:contributor><em:contributor>John</em:contributor><em:contributor>Khrin</em:contributor><em:contributor>Lain_13</em:contributor><em:contributor>Li</em:contributor><em:contributor>Lian</em:contributor><em:contributor>MenetZ</em:contributor><em:contributor>MonztA</em:contributor><em:contributor>None</em:contributor><em:contributor>smed79</em:contributor><em:contributor>tomasko126</em:contributor><em:contributor>Zoso</em:contributor><em:contributor>ÐлекÑандър Станев</em:contributor>
+ <em:name>Adblock Plus</em:name>
+ <em:description>廣告已æˆéŽåŽ»å¼ï¼</em:description>
+ <em:homepageURL>https://adblockplus.org/zh_TW/</em:homepageURL>
+ <em:translator>Jose Sun</em:translator>
+ <em:translator>knight00931</em:translator>
+ </Description>
+ </em:localized>
+ <em:targetApplication>
+ <Description>
+ <!-- fennec2 -->
+ <em:id>{aa3c5121-dab2-40e2-81ca-7ea25febc110}</em:id>
+ <em:minVersion>22.0</em:minVersion>
+ <em:maxVersion>33.0</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ <em:targetApplication>
+ <Description>
+ <!-- firefox -->
+ <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
+ <em:minVersion>22.0</em:minVersion>
+ <em:maxVersion>33.0</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ <em:targetApplication>
+ <Description>
+ <!-- seamonkey -->
+ <em:id>{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}</em:id>
+ <em:minVersion>2.19</em:minVersion>
+ <em:maxVersion>2.30</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ <em:targetApplication>
+ <Description>
+ <!-- thunderbird -->
+ <em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</em:id>
+ <em:minVersion>22.0</em:minVersion>
+ <em:maxVersion>33.0</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ <em:targetApplication>
+ <Description>
+ <!-- toolkit -->
+ <em:id>toolkit@mozilla.org</em:id>
+ <em:minVersion>22.0</em:minVersion>
+ <em:maxVersion>33.0</em:maxVersion>
+ </Description>
+ </em:targetApplication>
+ </Description>
+</RDF> \ No newline at end of file
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/Public.jsm b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/Public.jsm
new file mode 100644
index 0000000..0f96bcb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/Public.jsm
@@ -0,0 +1,202 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Public Adblock Plus API.
+ */
+
+var EXPORTED_SYMBOLS = ["AdblockPlus"];
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+const Cr = Components.results;
+const Cu = Components.utils;
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+function require(module)
+{
+ let result = {};
+ result.wrappedJSObject = result;
+ Services.obs.notifyObservers(result, "adblockplus-require", module);
+ return result.exports;
+}
+
+let {FilterStorage} = require("filterStorage");
+let {Filter} = require("filterClasses");
+let {Subscription, SpecialSubscription, RegularSubscription, DownloadableSubscription, ExternalSubscription} = require("subscriptionClasses");
+
+const externalPrefix = "~external~";
+
+/**
+ * Class implementing public Adblock Plus API
+ * @class
+ */
+var AdblockPlus =
+{
+ /**
+ * Returns current subscription count
+ * @type Integer
+ */
+ get subscriptionCount()
+ {
+ return FilterStorage.subscriptions.length;
+ },
+
+ /**
+ * Gets a subscription by its URL
+ */
+ getSubscription: function(/**String*/ id) /**IAdblockPlusSubscription*/
+ {
+ if (id in FilterStorage.knownSubscriptions)
+ return createSubscriptionWrapper(FilterStorage.knownSubscriptions[id]);
+
+ return null;
+ },
+
+ /**
+ * Gets a subscription by its position in the list
+ */
+ getSubscriptionAt: function(/**Integer*/ index) /**IAdblockPlusSubscription*/
+ {
+ if (index < 0 || index >= FilterStorage.subscriptions.length)
+ return null;
+
+ return createSubscriptionWrapper(FilterStorage.subscriptions[index]);
+ },
+
+ /**
+ * Updates an external subscription and creates it if necessary
+ */
+ updateExternalSubscription: function(/**String*/ id, /**String*/ title, /**Array of Filter*/ filters) /**String*/
+ {
+ if (id.substr(0, externalPrefix.length) != externalPrefix)
+ id = externalPrefix + id;
+ let subscription = Subscription.knownSubscriptions[id];
+ if (typeof subscription == "undefined")
+ subscription = new ExternalSubscription(id, title);
+
+ subscription.lastDownload = parseInt(new Date().getTime() / 1000);
+
+ let newFilters = [];
+ for (let filter of filters)
+ {
+ filter = Filter.fromText(Filter.normalize(filter));
+ if (filter)
+ newFilters.push(filter);
+ }
+
+ if (id in FilterStorage.knownSubscriptions)
+ FilterStorage.updateSubscriptionFilters(subscription, newFilters);
+ else
+ {
+ subscription.filters = newFilters;
+ FilterStorage.addSubscription(subscription);
+ }
+
+ return id;
+ },
+
+ /**
+ * Removes an external subscription by its identifier
+ */
+ removeExternalSubscription: function(/**String*/ id) /**Boolean*/
+ {
+ if (id.substr(0, externalPrefix.length) != externalPrefix)
+ id = externalPrefix + id;
+ if (!(id in FilterStorage.knownSubscriptions))
+ return false;
+
+ FilterStorage.removeSubscription(FilterStorage.knownSubscriptions[id]);
+ return true;
+ },
+
+ /**
+ * Adds user-defined filters to the list
+ */
+ addPatterns: function(/**Array of String*/ filters)
+ {
+ for (let filter of filters)
+ {
+ filter = Filter.fromText(Filter.normalize(filter));
+ if (filter)
+ {
+ filter.disabled = false;
+ FilterStorage.addFilter(filter);
+ }
+ }
+ },
+
+ /**
+ * Removes user-defined filters from the list
+ */
+ removePatterns: function(/**Array of String*/ filters)
+ {
+ for (let filter of filters)
+ {
+ filter = Filter.fromText(Filter.normalize(filter));
+ if (filter)
+ FilterStorage.removeFilter(filter);
+ }
+ },
+
+ /**
+ * Returns installed Adblock Plus version
+ */
+ getInstalledVersion: function() /**String*/
+ {
+ return require("info").addonVersion;
+ },
+
+ /**
+ * Returns source code revision this Adblock Plus build was created from (if available)
+ */
+ getInstalledBuild: function() /**String*/
+ {
+ return "";
+ },
+};
+
+/**
+ * Wraps a subscription into IAdblockPlusSubscription structure.
+ */
+function createSubscriptionWrapper(/**Subscription*/ subscription) /**IAdblockPlusSubscription*/
+{
+ if (!subscription)
+ return null;
+
+ return {
+ url: subscription.url,
+ special: subscription instanceof SpecialSubscription,
+ title: subscription.title,
+ autoDownload: true,
+ disabled: subscription.disabled,
+ external: subscription instanceof ExternalSubscription,
+ lastDownload: subscription instanceof RegularSubscription ? subscription.lastDownload : 0,
+ downloadStatus: subscription instanceof DownloadableSubscription ? subscription.downloadStatus : "synchronize_ok",
+ lastModified: subscription instanceof DownloadableSubscription ? subscription.lastModified : null,
+ expires: subscription instanceof DownloadableSubscription ? subscription.expires : 0,
+ getPatterns: function()
+ {
+ let result = subscription.filters.map(function(filter)
+ {
+ return filter.text;
+ });
+ return result;
+ }
+ };
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/antiadblockInit.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/antiadblockInit.js
new file mode 100644
index 0000000..d8b29ca
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/antiadblockInit.js
@@ -0,0 +1,78 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {Utils} = require("utils");
+let {Prefs} = require("prefs");
+let {ActiveFilter} = require("filterClasses");
+let {FilterStorage} = require("filterStorage");
+let {FilterNotifier} = require("filterNotifier");
+let {Subscription} = require("subscriptionClasses");
+let {Notification} = require("notification");
+
+exports.initAntiAdblockNotification = function initAntiAdblockNotification()
+{
+ let notification = {
+ id: "antiadblock",
+ type: "question",
+ title: Utils.getString("notification_antiadblock_title"),
+ message: Utils.getString("notification_antiadblock_message"),
+ urlFilters: []
+ };
+
+ function notificationListener(approved)
+ {
+ let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl);
+ if (subscription.url in FilterStorage.knownSubscriptions)
+ subscription.disabled = !approved;
+ }
+
+ function addAntiAdblockNotification(subscription)
+ {
+ let urlFilters = [];
+ for (let filter of subscription.filters)
+ if (filter instanceof ActiveFilter)
+ for (let domain in filter.domains)
+ if (domain && urlFilters.indexOf(domain) == -1)
+ urlFilters.push(domain);
+ notification.urlFilters = urlFilters;
+ Notification.addNotification(notification);
+ Notification.addQuestionListener(notification.id, notificationListener);
+ }
+
+ function removeAntiAdblockNotification()
+ {
+ Notification.removeNotification(notification);
+ Notification.removeQuestionListener(notification.id, notificationListener);
+ }
+
+ let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl);
+ if (subscription.lastDownload && subscription.disabled)
+ addAntiAdblockNotification(subscription);
+
+ FilterNotifier.addListener(function(action, value, newItem, oldItem)
+ {
+ if (!/^subscription\.(updated|removed|disabled)$/.test(action) || value.url != Prefs.subscriptions_antiadblockurl)
+ return;
+
+ if (action == "subscription.updated")
+ addAntiAdblockNotification(value);
+ else if (action == "subscription.removed" || (action == "subscription.disabled" && !value.disabled))
+ removeAntiAdblockNotification();
+ });
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/appSupport.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/appSupport.js
new file mode 100644
index 0000000..67c6248
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/appSupport.js
@@ -0,0 +1,948 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Various application-specific functions.
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/AddonManager.jsm");
+
+/**
+ * Checks whether an application window is known and should get Adblock Plus
+ * user interface elements.
+ * @result Boolean
+ */
+exports.isKnownWindow = (/**Window*/ window) => false;
+
+/**
+ * HACK: In some applications the window finishes initialization during load
+ * event processing which makes an additional delay necessary. This flag
+ * indicates that.
+ * @type Boolean
+ */
+exports.delayInitialization = false;
+
+/**
+ * Retrieves the browser element for an application window.
+ * @type function(window)
+ */
+exports.getBrowser = null;
+
+/**
+ * Adds a new browser tab in the given application window.
+ * @type function(window, url, event)
+ */
+exports.addTab = null;
+
+/**
+ * Retrieves the current browser location for an application window.
+ */
+exports.getCurrentLocation = function getCurrentLocation(/**Window*/ window) /**nsIURI|String*/
+{
+ let browser = (exports.getBrowser ? exports.getBrowser(window) : null);
+ return (browser ? browser.currentURI : null);
+}
+
+
+/**
+ * The ID (or a list of possible IDs) of the content area context menu.
+ * @type String|String[]
+ */
+exports.contentContextMenu = null;
+
+/**
+ * Determines the default placement of the toolbar icon via object properties
+ * parent, before and after.
+ * @type Object
+ */
+exports.defaultToolbarPosition = null;
+
+/**
+ * The properties parent, before, after determine the placement of the status
+ * bar icon.
+ * @type Object
+ */
+exports.statusbarPosition = null;
+
+/**
+ * The properties parent, before, after determine the placement of the Tools
+ * submenu.
+ * @type Object
+ */
+exports.toolsMenu = null;
+
+/**
+ * Maps windows to their bottom bar info.
+ */
+let bottomBars = new WeakMap();
+
+/**
+ * Adds a bottom bar to the application window.
+ * @type function(window, element)
+ */
+exports.addBottomBar = null;
+
+function _addBottomBar(window, parent, element)
+{
+ if (bottomBars.has(window) || !parent)
+ return null;
+
+ let bar = {elements: []};
+ for (let child = element.firstElementChild; child; child = child.nextElementSibling)
+ {
+ let clone = child.cloneNode(true);
+ parent.appendChild(clone);
+ bar.elements.push(clone);
+ }
+
+ bottomBars.set(window, bar);
+ return bar;
+};
+
+/**
+ * Removes the bottom bar from the application window.
+ * @type function(window)
+ */
+exports.removeBottomBar = null;
+
+function _removeBottomBar(window)
+{
+ if (!bottomBars.has(window))
+ return null;
+
+ let bar = bottomBars.get(window);
+ for (let i = 0; i < bar.elements.length; i++)
+ if (bar.elements[i].parentNode)
+ bar.elements[i].parentNode.removeChild(bar.elements[i]);
+
+ bottomBars.delete(window);
+ return bar;
+};
+
+/**
+ * Maps windows to a list of progress listeners.
+ */
+let progressListeners = new WeakMap();
+
+/**
+ * Makes sure that a function is called whenever the displayed browser location changes.
+ */
+exports.addBrowserLocationListener = function addBrowserLocationListener(/**Window*/ window, /**Function*/ callback, /**Boolean*/ ignoreSameDoc)
+{
+ let browser = (exports.getBrowser ? exports.getBrowser(window) : null);
+ if (browser)
+ {
+ let dummy = function() {};
+ let progressListener =
+ {
+ callback: callback,
+ onLocationChange: function(progress, request, uri, flags)
+ {
+ if (!ignoreSameDoc || !flags || !(flags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT))
+ this.callback();
+ },
+ onProgressChange: dummy,
+ onSecurityChange: dummy,
+ onStateChange: dummy,
+ onStatusChange: dummy,
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference])
+ };
+ browser.addProgressListener(progressListener);
+
+ if (progressListeners.has(window))
+ progressListeners.get(window).push(progressListener);
+ else
+ progressListeners.set(window, [progressListener]);
+ }
+};
+
+/**
+ * Removes a location listener registered for a window.
+ */
+exports.removeBrowserLocationListener = function removeBrowserLocationListener(/**Window*/ window, /**Function*/ callback)
+{
+ if (!progressListeners.has(window))
+ return;
+
+ let browser = (exports.getBrowser ? exports.getBrowser(window) : null);
+ let listeners = progressListeners.get(window);
+ for (let i = 0; i < listeners.length; i++)
+ {
+ if (listeners[i].callback == callback)
+ {
+ if (browser)
+ browser.removeProgressListener(listeners[i]);
+ listeners.splice(i--, 1);
+ }
+ }
+};
+
+/**
+ * Removes all location listeners registered for a window, to be called on
+ * cleanup.
+ */
+exports.removeBrowserLocationListeners = function removeBrowserLocationListeners(/**Window*/ window)
+{
+ if (!progressListeners.has(window))
+ return;
+
+ let browser = (exports.getBrowser ? exports.getBrowser(window) : null);
+ if (browser)
+ {
+ let listeners = progressListeners.get(window);
+ for (let i = 0; i < listeners.length; i++)
+ browser.removeProgressListener(listeners[i]);
+ }
+ progressListeners.delete(window);
+};
+
+/**
+ * Maps windows to a list of click listeners.
+ */
+let clickListeners = new WeakMap();
+
+/**
+ * Makes sure that a function is called whenever the user clicks inside the
+ * browser's content area.
+ */
+exports.addBrowserClickListener = function addBrowserClickListener(/**Window*/ window, /**Function*/ callback)
+{
+ let browser = (exports.getBrowser ? exports.getBrowser(window) : null);
+ if (browser)
+ {
+ browser.addEventListener("click", callback, true);
+
+ if (clickListeners.has(window))
+ clickListeners.get(window).push(callback);
+ else
+ clickListeners.set(window, [callback]);
+ }
+};
+
+/**
+ * Removes all click listeners registered for a window, to be called on
+ * cleanup.
+ */
+exports.removeBrowserClickListeners = function removeBrowserClickListeners(/**Window*/ window)
+{
+ if (!clickListeners.has(window))
+ return;
+
+ let browser = (exports.getBrowser ? exports.getBrowser(window) : null);
+ if (browser)
+ {
+ let listeners = clickListeners.get(window);
+ for (let i = 0; i < listeners.length; i++)
+ browser.removeEventListener("click", listeners[i], true);
+ }
+ clickListeners.delete(window);
+};
+
+let {application} = require("info");
+switch (application)
+{
+ case "firefox":
+ {
+ exports.isKnownWindow = function ff_isKnownWindow(window)
+ {
+ return (window.document.documentElement.getAttribute("windowtype") == "navigator:browser");
+ };
+
+ exports.getBrowser = (window) => window.gBrowser;
+
+ exports.addTab = function ff_addTab(window, url, event)
+ {
+ if (event)
+ window.openNewTabWith(url, exports.getBrowser(window).contentDocument, null, event, false);
+ else
+ window.gBrowser.loadOneTab(url, {inBackground: false});
+ };
+
+ exports.contentContextMenu = "contentAreaContextMenu";
+
+ exports.defaultToolbarPosition = {
+ parent: "nav-bar"
+ };
+
+ exports.toolsMenu = {
+ parent: "menu_ToolsPopup"
+ };
+
+ exports.addBottomBar = function fx_addBottomBar(window, element)
+ {
+ let bar = _addBottomBar(window, window.document.getElementById("appcontent"), element);
+ if (bar)
+ {
+ let display = window.document.getElementById("statusbar-display");
+ bar.changedFixed = display && !display.hasAttribute("fixed");
+ if (bar.changedFixed)
+ display.setAttribute("fixed", "true");
+ }
+ };
+
+ exports.removeBottomBar = function fx_removeBottomBar(window)
+ {
+ let bar = _removeBottomBar(window);
+ if (bar && bar.changedFixed)
+ window.document.getElementById("statusbar-display").removeAttribute("fixed");
+ };
+
+ break;
+ }
+
+ case "seamonkey":
+ {
+ exports.isKnownWindow = function sm_isKnownWindow(window)
+ {
+ let type = window.document.documentElement.getAttribute("windowtype");
+ return (type == "navigator:browser" || type == "mail:3pane" || type == "mail:messageWindow");
+ };
+
+ exports.addTab = function sm_addTab(window, url, event)
+ {
+ if (event || !("gBrowser" in window))
+ window.openNewTabWith(url, ("gBrowser" in window ? window.gBrowser.contentDocument : null), null, event, false);
+ else
+ window.gBrowser.loadOneTab(url, {inBackground: false});
+ };
+
+ exports.getBrowser = function sm_getBrowser(window)
+ {
+ if ("gBrowser" in window)
+ return window.gBrowser;
+ else if ("getMessageBrowser" in window)
+ return window.getMessageBrowser();
+ else
+ return null;
+ };
+
+ exports.getCurrentLocation = function sm_getCurrentLocation(window)
+ {
+ if ("currentHeaderData" in window && "content-base" in window.currentHeaderData)
+ {
+ // This is a blog entry
+ return window.currentHeaderData["content-base"].headerValue;
+ }
+ else if ("currentHeaderData" in window && "from" in window.currentHeaderData)
+ {
+ // This is a mail/newsgroup entry
+ try
+ {
+ let headerParser = Cc["@mozilla.org/messenger/headerparser;1"].getService(Ci.nsIMsgHeaderParser);
+ let emailAddress = headerParser.extractHeaderAddressMailboxes(window.currentHeaderData.from.headerValue);
+ return "mailto:" + emailAddress.replace(/^[\s"]+/, "").replace(/[\s"]+$/, "").replace(/\s/g, "%20");
+ }
+ catch(e)
+ {
+ return null;
+ }
+ }
+ else
+ {
+ let browser = exports.getBrowser(window);
+ return (browser ? browser.currentURI : null);
+ }
+ };
+
+ exports.contentContextMenu = ["contentAreaContextMenu", "mailContext"];
+
+ exports.defaultToolbarPosition = {
+ parent: ["PersonalToolbar", "msgToolbar"],
+ before: ["bookmarks-button", "button-junk"]
+ };
+
+ exports.statusbarPosition = {
+ parent: "status-bar"
+ };
+
+ exports.toolsMenu = {
+ parent: "taskPopup",
+ after: "downloadmgr"
+ };
+
+ exports.addBottomBar = function sm_addBottomBar(window, element)
+ {
+ _addBottomBar(window, window.document.getElementById("appcontent") || window.document.getElementById("messagepanebox"), element);
+ };
+
+ exports.removeBottomBar = _removeBottomBar;
+
+ break;
+ }
+
+ case "thunderbird":
+ {
+ exports.isKnownWindow = function tb_isKnownWindow(window)
+ {
+ let type = window.document.documentElement.getAttribute("windowtype");
+ return (type == "mail:3pane" || type == "mail:messageWindow");
+ };
+
+ exports.delayInitialization = true;
+
+ exports.getBrowser = (window) => window.getBrowser();
+
+ exports.addTab = function tb_addTab(window, url, event)
+ {
+ let tabmail = window.document.getElementById("tabmail");
+ if (!tabmail)
+ {
+ let wnd = Services.wm.getMostRecentWindow("mail:3pane");
+ if (window)
+ tabmail = wnd.document.getElementById("tabmail");
+ }
+
+ if (tabmail)
+ tabmail.openTab("contentTab", {contentPage: url});
+ else
+ {
+ window.openDialog("chrome://messenger/content/", "_blank",
+ "chrome,dialog=no,all", null,
+ {
+ tabType: "contentTab",
+ tabParams: {contentPage: url}
+ });
+ }
+ };
+
+ exports.contentContextMenu = ["mailContext", "pageContextMenu"];
+
+ exports.defaultToolbarPosition = {
+ parent: "header-view-toolbar",
+ before: "hdrReplyButton",
+ addClass: "msgHeaderView-button"
+ };
+
+ exports.statusbarPosition = {
+ parent: "status-bar"
+ };
+
+ exports.toolsMenu = {
+ parent: "taskPopup",
+ after: "javaScriptConsole"
+ };
+
+ exports.getCurrentLocation = function getCurrentLocation(window)
+ {
+ let browser = exports.getBrowser(window);
+ if (!browser)
+ return null;
+
+ if (browser.id == "messagepane" && "currentHeaderData" in window && "content-base" in window.currentHeaderData)
+ {
+ // This is a blog entry
+ return window.currentHeaderData["content-base"].headerValue;
+ }
+ else if (browser.id == "messagepane" && "currentHeaderData" in window && "from" in window.currentHeaderData)
+ {
+ // This is a mail/newsgroup entry
+ try
+ {
+ let headerParser = Cc["@mozilla.org/messenger/headerparser;1"].getService(Ci.nsIMsgHeaderParser);
+ let emailAddress = headerParser.extractHeaderAddressMailboxes(window.currentHeaderData.from.headerValue);
+ return "mailto:" + emailAddress.replace(/^[\s"]+/, "").replace(/[\s"]+$/, "").replace(/\s/g, "%20");
+ }
+ catch(e)
+ {
+ return null;
+ }
+ }
+ else
+ return browser.currentURI;
+ }
+
+ exports.addBottomBar = function tb_addBottomBar(window, element)
+ {
+ let browser = exports.getBrowser(window);
+ if (!browser)
+ return;
+
+ let parent = window.document.getElementById("messagepanebox");
+ if (!parent || !(parent.compareDocumentPosition(browser) & Ci.nsIDOMNode.DOCUMENT_POSITION_CONTAINED_BY))
+ parent = browser.parentNode;
+
+ _addBottomBar(window, parent, element);
+ };
+
+ exports.removeBottomBar = _removeBottomBar;
+
+ let BrowserChangeListener = function(window, callback)
+ {
+ this.window = window;
+ this.callback = callback;
+ this.onSelect = this.onSelect.bind(this);
+ this.attach();
+ };
+ BrowserChangeListener.prototype = {
+ window: null,
+ callback: null,
+ currentBrowser: null,
+
+ setBrowser: function(browser)
+ {
+ if (browser != this.currentBrowser)
+ {
+ let oldBrowser = this.currentBrowser;
+ this.currentBrowser = browser;
+ this.callback(oldBrowser, browser);
+ }
+ },
+
+ onSelect: function()
+ {
+ this.setBrowser(exports.getBrowser(this.window));
+ },
+
+ attach: function()
+ {
+ this.onSelect();
+
+ let tabmail = this.window.document.getElementById("tabmail");
+ if (tabmail)
+ tabmail.tabContainer.addEventListener("select", this.onSelect, false);
+ },
+ detach: function()
+ {
+ let tabmail = this.window.document.getElementById("tabmail");
+ if (tabmail)
+ tabmail.tabContainer.removeEventListener("select", this.onSelect, false);
+
+ this.setBrowser(null);
+ }
+ };
+
+ exports.addBrowserLocationListener = function(/**Window*/ window, /**Function*/ callback, /**Boolean*/ ignoreSameDoc)
+ {
+ if (progressListeners.has(window))
+ {
+ progressListeners.get(window).locationCallbacks.push(callback);
+ return;
+ }
+
+ let callbacks = [callback];
+ let dummy = function() {};
+ let progressListener =
+ {
+ onLocationChange: function(progress, request, uri, flags)
+ {
+ if (!ignoreSameDoc || !flags || !(flags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT))
+ for (let i = 0; i < callbacks.length; i++)
+ callbacks[i]();
+ },
+ onProgressChange: dummy,
+ onSecurityChange: dummy,
+ onStateChange: dummy,
+ onStatusChange: dummy,
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference])
+ };
+ let messageListener =
+ {
+ onStartHeaders: dummy,
+ onEndHeaders: function()
+ {
+ let browser = exports.getBrowser(window);
+ if (browser.id == "messagepane")
+ for (let i = 0; i < callbacks.length; i++)
+ callbacks[i]();
+ },
+ onEndAttachments: dummy,
+ onBeforeShowHeaderPane: dummy
+ };
+
+ let listener = new BrowserChangeListener(window, function(oldBrowser, newBrowser)
+ {
+ if (oldBrowser)
+ oldBrowser.removeProgressListener(progressListener);
+ if (newBrowser)
+ newBrowser.addProgressListener(progressListener);
+ progressListener.onLocationChange();
+ });
+ listener.locationCallbacks = callbacks;
+
+ if ("gMessageListeners" in window)
+ window.gMessageListeners.push(messageListener);
+ listener.messageListener = messageListener;
+
+ progressListeners.set(window, listener);
+ };
+
+ exports.removeBrowserLocationListener = function(/**Window*/ window, /**Function*/ callback)
+ {
+ if (!progressListeners.has(window))
+ return;
+
+ let callbacks = progressListeners.get(window).locationCallbacks;
+ for (let i = 0; i < callbacks.length; i++)
+ if (callbacks[i] == callback)
+ callbacks.splice(i--, 1);
+ };
+
+ exports.removeBrowserLocationListeners = function(/**Window*/ window)
+ {
+ if (!progressListeners.has(window))
+ return;
+
+ let listener = progressListeners.get(window);
+
+ let messageListener = listener.messageListener;
+ let index = ("gMessageListeners" in window ? window.gMessageListeners.indexOf(messageListener) : -1);
+ if (index >= 0)
+ window.gMessageListeners.splice(index, 1);
+
+ listener.detach();
+ progressListeners.delete(window);
+ };
+
+ exports.addBrowserClickListener = function addBrowserClickListener(/**Window*/ window, /**Function*/ callback)
+ {
+ if (clickListeners.has(window))
+ {
+ clickListeners.get(window).callbacks.push(callback);
+ return;
+ }
+
+ let callbacks = [callback];
+ let listener = new BrowserChangeListener(window, function(oldBrowser, newBrowser)
+ {
+ if (oldBrowser)
+ for (let i = 0; i < callbacks.length; i++)
+ oldBrowser.removeEventListener("click", callbacks[i], true);
+ if (newBrowser)
+ for (let i = 0; i < callbacks.length; i++)
+ newBrowser.addEventListener("click", callbacks[i], true);
+ });
+ listener.callbacks = callbacks;
+
+ clickListeners.set(window, listener);
+ };
+
+ exports.removeBrowserClickListeners = function removeBrowserClickListeners(/**Window*/ window)
+ {
+ if (!clickListeners.has(window))
+ return;
+
+ let listener = clickListeners.get(window);
+ listener.detach();
+
+ clickListeners.delete(window);
+ };
+
+ // Make sure to close/reopen list of blockable items when the user changes tabs
+ let {WindowObserver} = require("windowObserver");
+ new WindowObserver({
+ listeners: new WeakMap(),
+ applyToWindow: function(window)
+ {
+ if (!exports.isKnownWindow(window) || this.listeners.has(window))
+ return;
+
+ let {Utils} = require("utils");
+ Utils.runAsync(function()
+ {
+ let listener = new BrowserChangeListener(window, function(oldBrowser, newBrowser)
+ {
+ if (bottomBars.has(window))
+ {
+ let {UI} = require("ui")
+ UI.toggleBottombar(window);
+ UI.toggleBottombar(window);
+ }
+ });
+ this.listeners.set(window, listener);
+ }.bind(this));
+ },
+ removeFromWindow: function(window)
+ {
+ if (!this.listeners.has(window))
+ return;
+
+ let listener = this.listeners.get(window);
+ listener.detach();
+ this.listeners.delete(window);
+ }
+ });
+
+ break;
+ }
+
+ case "fennec2":
+ {
+ exports.isKnownWindow = (window) => window.document.documentElement.id == "main-window";
+
+ exports.getBrowser = (window) => window.BrowserApp.selectedBrowser;
+
+ exports.addTab = (window, url, event) => window.BrowserApp.addTab(url, {selected: true});
+
+ let BrowserChangeListener = function(window, callback)
+ {
+ this.window = window;
+ this.callback = callback;
+ this.onSelect = this.onSelect.bind(this);
+ this.attach();
+ };
+ BrowserChangeListener.prototype = {
+ window: null,
+ callback: null,
+ currentBrowser: null,
+
+ setBrowser: function(browser)
+ {
+ if (browser != this.currentBrowser)
+ {
+ let oldBrowser = this.currentBrowser;
+ this.currentBrowser = browser;
+ this.callback(oldBrowser, browser);
+ }
+ },
+
+ onSelect: function()
+ {
+ let {Utils} = require("utils");
+ Utils.runAsync(function()
+ {
+ this.setBrowser(exports.getBrowser(this.window));
+ }.bind(this));
+ },
+
+ attach: function()
+ {
+ this.onSelect();
+
+ this.window.BrowserApp.deck.addEventListener("TabSelect", this.onSelect, false);
+ },
+ detach: function()
+ {
+ this.window.BrowserApp.deck.removeEventListener("TabSelect", this.onSelect, false);
+
+ this.setBrowser(null);
+ }
+ };
+
+ exports.addBrowserLocationListener = function ffn_addBrowserLocationListener(/**Window*/ window, /**Function*/ callback, /**Boolean*/ ignoreSameDoc)
+ {
+ if (progressListeners.has(window))
+ {
+ progressListeners.get(window).locationCallbacks.push(callback);
+ return;
+ }
+
+ let callbacks = [callback];
+ let dummy = function() {};
+ let progressListener =
+ {
+ onLocationChange: function(progress, request, uri, flags)
+ {
+ if (!ignoreSameDoc || !flags || !(flags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT))
+ for (let i = 0; i < callbacks.length; i++)
+ callbacks[i]();
+ },
+ onProgressChange: dummy,
+ onSecurityChange: dummy,
+ onStateChange: dummy,
+ onStatusChange: dummy,
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference])
+ };
+
+ let listener = new BrowserChangeListener(window, function(oldBrowser, newBrowser)
+ {
+ if (oldBrowser && typeof oldBrowser.removeProgressListener == "function")
+ oldBrowser.removeProgressListener(progressListener);
+ if (newBrowser && typeof newBrowser.removeProgressListener == "function")
+ newBrowser.addProgressListener(progressListener);
+ progressListener.onLocationChange();
+ });
+ listener.locationCallbacks = callbacks;
+
+ progressListeners.set(window, listener);
+ };
+
+ exports.removeBrowserLocationListener = function ffn_removeBrowserLocationListener(/**Window*/ window, /**Function*/ callback)
+ {
+ if (!progressListeners.has(window))
+ return;
+
+ let callbacks = progressListeners.get(window).locationCallbacks;
+ for (let i = 0; i < callbacks.length; i++)
+ if (callbacks[i] == callback)
+ callbacks.splice(i--, 1);
+ };
+
+ exports.removeBrowserLocationListeners = function ffn_removeBrowserLocationListeners(/**Window*/ window)
+ {
+ if (!progressListeners.has(window))
+ return;
+
+ let listener = progressListeners.get(window);
+ listener.detach();
+ progressListeners.delete(window);
+ };
+
+ exports.addBrowserClickListener = function ffn_addBrowserClickListener(/**Window*/ window, /**Function*/ callback)
+ {
+ if (clickListeners.has(window))
+ {
+ clickListeners.get(window).callbacks.push(callback);
+ return;
+ }
+
+ let callbacks = [callback];
+ let listener = new BrowserChangeListener(window, function(oldBrowser, newBrowser)
+ {
+ if (oldBrowser)
+ for (let i = 0; i < callbacks.length; i++)
+ oldBrowser.removeEventListener("click", callbacks[i], true);
+ if (newBrowser)
+ for (let i = 0; i < callbacks.length; i++)
+ newBrowser.addEventListener("click", callbacks[i], true);
+ });
+ listener.callbacks = callbacks;
+
+ clickListeners.set(window, listener);
+ };
+
+ exports.removeBrowserClickListeners = function ffn_removeBrowserClickListeners(/**Window*/ window)
+ {
+ if (!clickListeners.has(window))
+ return;
+
+ let listener = clickListeners.get(window);
+ listener.detach();
+
+ clickListeners.delete(window);
+ };
+
+ let {Filter} = require("filterClasses");
+ let {Prefs} = require("prefs");
+ let {Policy} = require("contentPolicy");
+ let {UI} = require("ui");
+ let {Utils} = require("utils");
+
+ let toggleWhitelist = function(window)
+ {
+ if (!Prefs.enabled)
+ {
+ Prefs.enabled = true;
+ return;
+ }
+
+ let location = exports.getCurrentLocation(window);
+ let host = null;
+ if (location instanceof Ci.nsIURL && Policy.isBlockableScheme(location))
+ {
+ try
+ {
+ host = location.host.replace(/^www\./, "");
+ } catch (e) {}
+ }
+
+ if (!host)
+ return;
+
+ if (Policy.isWhitelisted(location.spec))
+ UI.removeWhitelist(window);
+ else
+ UI.toggleFilter(Filter.fromText("@@||" + host + "^$document"));
+ };
+
+ let menuItem = null;
+ onShutdown.add(function()
+ {
+ let window = null;
+ for (window in UI.applicationWindows)
+ break;
+
+ if (window && menuItem)
+ window.NativeWindow.menu.remove(menuItem);
+ });
+
+ UI.updateIconState = function fmn_updateIconState(window, icon)
+ {
+ if (menuItem !== null)
+ {
+ window.NativeWindow.menu.remove(menuItem);
+ menuItem = null;
+ }
+
+ let action;
+ let host = null;
+ if (Prefs.enabled)
+ {
+ let location = exports.getCurrentLocation(window);
+ if (location instanceof Ci.nsIURL && Policy.isBlockableScheme(location))
+ {
+ try
+ {
+ host = location.host.replace(/^www\./, "");
+ } catch (e) {}
+ }
+ if (!host)
+ return;
+
+ if (host && Policy.isWhitelisted(location.spec))
+ action = "enable_site";
+ else if (host)
+ action = "disable_site";
+ }
+ else
+ action = "enable";
+
+ let actionText = Utils.getString("mobile_menu_" + action);
+ if (host)
+ actionText = actionText.replace(/\?1\?/g, host);
+
+ let iconUrl = require("info").addonRoot + "icon64.png";
+ menuItem = window.NativeWindow.menu.add(actionText, iconUrl, toggleWhitelist.bind(null, window));
+ };
+
+ UI.openSubscriptionDialog = function(window, url, title, mainURL, mainTitle)
+ {
+ let dialogTitle = this.overlay.attributes.subscriptionDialogTitle;
+ let dialogMessage = this.overlay.attributes.subscriptionDialogMessage.replace(/\?1\?/, title).replace(/\?2\?/, url);
+ if (Utils.confirm(window, dialogMessage, dialogTitle))
+ this.setSubscription(url, title);
+ };
+
+ UI.openFiltersDialog = function()
+ {
+ let window = UI.currentWindow;
+ if (!window)
+ return
+
+ let browser = exports.addTab(window, "about:addons").browser;
+ browser.addEventListener("load", function openAddonPrefs(event)
+ {
+ browser.removeEventListener("load", openAddonPrefs, true);
+ Utils.runAsync(function()
+ {
+ // The page won't be ready until the add-on manager data is loaded so we call this method
+ // to know when the data will be ready.
+ AddonManager.getAddonsByTypes(["extension", "theme", "locale"], function()
+ {
+ let event = new Event("Event");
+ event.initEvent("popstate", true, false);
+ event.state = {id: require("info").addonID};
+ browser._contentWindow.dispatchEvent(event);
+ });
+ });
+ }, true);
+ };
+
+ break;
+ }
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/contentPolicy.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/contentPolicy.js
new file mode 100644
index 0000000..084ebc5
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/contentPolicy.js
@@ -0,0 +1,779 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Content policy implementation, responsible for blocking things.
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {TimeLine} = require("timeline");
+let {Utils} = require("utils");
+let {Prefs} = require("prefs");
+let {FilterStorage} = require("filterStorage");
+let {BlockingFilter, WhitelistFilter} = require("filterClasses");
+let {defaultMatcher} = require("matcher");
+let {objectMouseEventHander} = require("objectTabs");
+let {RequestNotifier} = require("requestNotifier");
+let {ElemHide} = require("elemHide");
+
+/**
+ * List of explicitly supported content types
+ * @type Array of String
+ */
+let contentTypes = ["OTHER", "SCRIPT", "IMAGE", "STYLESHEET", "OBJECT", "SUBDOCUMENT", "DOCUMENT", "XMLHTTPREQUEST", "OBJECT_SUBREQUEST", "FONT", "MEDIA"];
+
+/**
+ * List of content types that aren't associated with a visual document area
+ * @type Array of String
+ */
+let nonVisualTypes = ["SCRIPT", "STYLESHEET", "XMLHTTPREQUEST", "OBJECT_SUBREQUEST", "FONT"];
+
+/**
+ * Randomly generated class name, to be applied to collapsed nodes.
+ */
+let collapsedClass = "";
+
+/**
+ * Public policy checking functions and auxiliary objects
+ * @class
+ */
+let Policy = exports.Policy =
+{
+ /**
+ * Map of content type identifiers by their name.
+ * @type Object
+ */
+ type: {},
+
+ /**
+ * Map of content type names by their identifiers (reverse of type map).
+ * @type Object
+ */
+ typeDescr: {},
+
+ /**
+ * Map of localized content type names by their identifiers.
+ * @type Object
+ */
+ localizedDescr: {},
+
+ /**
+ * Lists the non-visual content types.
+ * @type Object
+ */
+ nonVisual: {},
+
+ /**
+ * Map containing all schemes that should be ignored by content policy.
+ * @type Object
+ */
+ whitelistSchemes: {},
+
+ /**
+ * Called on module startup, initializes various exported properties.
+ */
+ init: function()
+ {
+ TimeLine.enter("Entered content policy initialization");
+
+ // type constant by type description and type description by type constant
+ let iface = Ci.nsIContentPolicy;
+ for (let typeName of contentTypes)
+ {
+ if ("TYPE_" + typeName in iface)
+ {
+ let id = iface["TYPE_" + typeName];
+ this.type[typeName] = id;
+ this.typeDescr[id] = typeName;
+ this.localizedDescr[id] = Utils.getString("type_label_" + typeName.toLowerCase());
+ }
+ }
+
+ this.type.ELEMHIDE = 0xFFFD;
+ this.typeDescr[0xFFFD] = "ELEMHIDE";
+ this.localizedDescr[0xFFFD] = Utils.getString("type_label_elemhide");
+
+ this.type.POPUP = 0xFFFE;
+ this.typeDescr[0xFFFE] = "POPUP";
+ this.localizedDescr[0xFFFE] = Utils.getString("type_label_popup");
+
+ for (let type of nonVisualTypes)
+ this.nonVisual[this.type[type]] = true;
+
+ // whitelisted URL schemes
+ for (let scheme of Prefs.whitelistschemes.toLowerCase().split(" "))
+ this.whitelistSchemes[scheme] = true;
+
+ TimeLine.log("done initializing types");
+
+ // Generate class identifier used to collapse node and register corresponding
+ // stylesheet.
+ TimeLine.log("registering global stylesheet");
+
+ let offset = "a".charCodeAt(0);
+ for (let i = 0; i < 20; i++)
+ collapsedClass += String.fromCharCode(offset + Math.random() * 26);
+
+ let collapseStyle = Services.io.newURI("data:text/css," +
+ encodeURIComponent("." + collapsedClass +
+ "{-moz-binding: url(chrome://global/content/bindings/general.xml#foobarbazdummy) !important;}"), null, null);
+ Utils.styleService.loadAndRegisterSheet(collapseStyle, Ci.nsIStyleSheetService.USER_SHEET);
+ onShutdown.add(function()
+ {
+ Utils.styleService.unregisterSheet(collapseStyle, Ci.nsIStyleSheetService.USER_SHEET);
+ })
+ TimeLine.log("done registering stylesheet");
+
+ TimeLine.leave("Done initializing content policy");
+ },
+
+ /**
+ * Checks whether a node should be blocked, hides it if necessary
+ * @param wnd {nsIDOMWindow}
+ * @param node {nsIDOMElement}
+ * @param contentType {String}
+ * @param location {nsIURI}
+ * @param collapse {Boolean} true to force hiding of the node
+ * @return {Boolean} false if the node should be blocked
+ */
+ processNode: function(wnd, node, contentType, location, collapse)
+ {
+ let topWnd = wnd.top;
+ if (!topWnd || !topWnd.location || !topWnd.location.href)
+ return true;
+
+ let privatenode=false;
+ Components.utils.import("resource://gre/modules/PrivateBrowsingUtils.jsm");
+ if (PrivateBrowsingUtils.isWindowPrivate(wnd))
+ privatenode=true;
+
+ let originWindow = Utils.getOriginWindow(wnd);
+ let wndLocation = originWindow.location.href;
+ let docDomain = getHostname(wndLocation);
+ let match = null;
+ if (!match && Prefs.enabled)
+ {
+ let testWnd = wnd;
+ let parentWndLocation = getWindowLocation(testWnd);
+ while (true)
+ {
+ let testWndLocation = parentWndLocation;
+ parentWndLocation = (testWnd == testWnd.parent ? testWndLocation : getWindowLocation(testWnd.parent));
+ match = Policy.isWhitelisted(testWndLocation, parentWndLocation);
+
+ if (!(match instanceof WhitelistFilter))
+ {
+ let keydata = (testWnd.document && testWnd.document.documentElement ? testWnd.document.documentElement.getAttribute("data-adblockkey") : null);
+ if (keydata && keydata.indexOf("_") >= 0)
+ {
+ let [key, signature] = keydata.split("_", 2);
+ let keyMatch = defaultMatcher.matchesByKey(testWndLocation, key.replace(/=/g, ""), docDomain);
+ if (keyMatch && Utils.crypto)
+ {
+ // Website specifies a key that we know but is the signature valid?
+ let uri = Services.io.newURI(testWndLocation, null, null);
+ let params = [
+ uri.path.replace(/#.*/, ""), // REQUEST_URI
+ uri.asciiHost, // HTTP_HOST
+ Utils.httpProtocol.userAgent // HTTP_USER_AGENT
+ ];
+ if (Utils.verifySignature(key, signature, params.join("\0")))
+ match = keyMatch;
+ }
+ }
+ }
+
+ if (match instanceof WhitelistFilter)
+ {
+ FilterStorage.increaseHitCount(match, wnd);
+ RequestNotifier.addNodeData(testWnd.document, topWnd, Policy.type.DOCUMENT, getHostname(parentWndLocation), false, testWndLocation, match);
+ return true;
+ }
+
+ if (testWnd.parent == testWnd)
+ break;
+ else
+ testWnd = testWnd.parent;
+ }
+ }
+
+ // Data loaded by plugins should be attached to the document
+ if (contentType == Policy.type.OBJECT_SUBREQUEST && node instanceof Ci.nsIDOMElement)
+ node = node.ownerDocument;
+
+ // Fix type for objects misrepresented as frames or images
+ if (contentType != Policy.type.OBJECT && (node instanceof Ci.nsIDOMHTMLObjectElement || node instanceof Ci.nsIDOMHTMLEmbedElement))
+ contentType = Policy.type.OBJECT;
+
+ let locationText = location.spec;
+ if (!match && contentType == Policy.type.ELEMHIDE)
+ {
+ let testWnd = wnd;
+ let parentWndLocation = getWindowLocation(testWnd);
+ while (true)
+ {
+ let testWndLocation = parentWndLocation;
+ parentWndLocation = (testWnd == testWnd.parent ? testWndLocation : getWindowLocation(testWnd.parent));
+ let parentDocDomain = getHostname(parentWndLocation);
+ match = defaultMatcher.matchesAny(testWndLocation, "ELEMHIDE", parentDocDomain, false);
+ if (match instanceof WhitelistFilter)
+ {
+ FilterStorage.increaseHitCount(match, wnd);
+ RequestNotifier.addNodeData(testWnd.document, topWnd, contentType, parentDocDomain, false, testWndLocation, match);
+ return true;
+ }
+
+ if (testWnd.parent == testWnd)
+ break;
+ else
+ testWnd = testWnd.parent;
+ }
+
+ match = location;
+ locationText = match.text.replace(/^.*?#/, '#');
+ location = locationText;
+
+ if (!match.isActiveOnDomain(docDomain))
+ return true;
+
+ let exception = ElemHide.getException(match, docDomain);
+ if (exception)
+ {
+ FilterStorage.increaseHitCount(exception, wnd);
+ RequestNotifier.addNodeData(node, topWnd, contentType, docDomain, thirdParty, locationText, exception);
+ return true;
+ }
+ }
+
+ let thirdParty = (contentType == Policy.type.ELEMHIDE ? false : isThirdParty(location, docDomain));
+
+ if (!match && Prefs.enabled)
+ {
+ match = defaultMatcher.matchesAny(locationText, Policy.typeDescr[contentType] || "", docDomain, thirdParty, privatenode);
+ if (match instanceof BlockingFilter && node.ownerDocument && !(contentType in Policy.nonVisual))
+ {
+ let prefCollapse = (match.collapse != null ? match.collapse : !Prefs.fastcollapse);
+ if (collapse || prefCollapse)
+ schedulePostProcess(node);
+ }
+
+ // Track mouse events for objects
+ if (!match && contentType == Policy.type.OBJECT && node.nodeType == Ci.nsIDOMNode.ELEMENT_NODE)
+ {
+ node.addEventListener("mouseover", objectMouseEventHander, true);
+ node.addEventListener("mouseout", objectMouseEventHander, true);
+ }
+ }
+
+ // Store node data
+ RequestNotifier.addNodeData(node, topWnd, contentType, docDomain, thirdParty, locationText, match);
+ if (match)
+ FilterStorage.increaseHitCount(match, wnd);
+
+ return !match || match instanceof WhitelistFilter;
+ },
+
+ /**
+ * Checks whether the location's scheme is blockable.
+ * @param location {nsIURI}
+ * @return {Boolean}
+ */
+ isBlockableScheme: function(location)
+ {
+ return !(location.scheme in Policy.whitelistSchemes);
+ },
+
+ /**
+ * Checks whether a page is whitelisted.
+ * @param {String} url
+ * @param {String} [parentUrl] location of the parent page
+ * @return {Filter} filter that matched the URL or null if not whitelisted
+ */
+ isWhitelisted: function(url, parentUrl)
+ {
+ if (!url)
+ return null;
+
+ // Do not apply exception rules to schemes on our whitelistschemes list.
+ let match = /^([\w\-]+):/.exec(url);
+ if (match && match[1] in Policy.whitelistSchemes)
+ return null;
+
+ if (!parentUrl)
+ parentUrl = url;
+
+ // Ignore fragment identifier
+ let index = url.indexOf("#");
+ if (index >= 0)
+ url = url.substring(0, index);
+
+ let result = defaultMatcher.matchesAny(url, "DOCUMENT", getHostname(parentUrl), false);
+ return (result instanceof WhitelistFilter ? result : null);
+ },
+
+ /**
+ * Checks whether the page loaded in a window is whitelisted.
+ * @param wnd {nsIDOMWindow}
+ * @return {Filter} matching exception rule or null if not whitelisted
+ */
+ isWindowWhitelisted: function(wnd)
+ {
+ return Policy.isWhitelisted(getWindowLocation(wnd));
+ },
+
+
+ /**
+ * Asynchronously re-checks filters for given nodes.
+ */
+ refilterNodes: function(/**Node[]*/ nodes, /**RequestEntry*/ entry)
+ {
+ // Ignore nodes that have been blocked already
+ if (entry.filter && !(entry.filter instanceof WhitelistFilter))
+ return;
+
+ for (let node of nodes)
+ Utils.runAsync(refilterNode, this, node, entry);
+ }
+};
+Policy.init();
+
+/**
+ * Actual nsIContentPolicy and nsIChannelEventSink implementation
+ * @class
+ */
+let PolicyImplementation =
+{
+ classDescription: "Adblock Plus content policy",
+ classID: Components.ID("cfeaabe6-1dd1-11b2-a0c6-cb5c268894c9"),
+ contractID: "@adblockplus.org/abp/policy;1",
+ xpcom_categories: ["content-policy", "net-channel-event-sinks"],
+
+ /**
+ * Registers the content policy on startup.
+ */
+ init: function()
+ {
+ let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
+ try
+ {
+ registrar.registerFactory(this.classID, this.classDescription, this.contractID, this);
+ }
+ catch (e if e.result == Cr.NS_ERROR_FACTORY_EXISTS)
+ {
+ // See bug 924340 - it might be too early to init now, the old version
+ // we are replacing didn't finish removing itself yet.
+ Utils.runAsync(this.init.bind(this));
+ return;
+ }
+
+ let catMan = Utils.categoryManager;
+ for (let category of this.xpcom_categories)
+ catMan.addCategoryEntry(category, this.contractID, this.contractID, false, true);
+
+ // http-on-opening-request is new in Gecko 18, http-on-modify-request can
+ // be used in earlier releases.
+ let httpTopic = "http-on-opening-request";
+ if (Services.vc.compare(Utils.platformVersion, "18.0") < 0)
+ httpTopic = "http-on-modify-request";
+
+ Services.obs.addObserver(this, httpTopic, true);
+ Services.obs.addObserver(this, "content-document-global-created", true);
+ Services.obs.addObserver(this, "xpcom-category-entry-removed", true);
+ Services.obs.addObserver(this, "xpcom-category-cleared", true);
+
+ onShutdown.add(function()
+ {
+ // Our category observers should be removed before changing category
+ // memberships, just in case.
+ Services.obs.removeObserver(this, httpTopic);
+ Services.obs.removeObserver(this, "content-document-global-created");
+ Services.obs.removeObserver(this, "xpcom-category-entry-removed");
+ Services.obs.removeObserver(this, "xpcom-category-cleared");
+
+ for (let category of this.xpcom_categories)
+ catMan.deleteCategoryEntry(category, this.contractID, false);
+
+ // This needs to run asynchronously, see bug 753687
+ Utils.runAsync(function()
+ {
+ registrar.unregisterFactory(this.classID, this);
+ }.bind(this));
+
+ this.previousRequest = null;
+ }.bind(this));
+ },
+
+ //
+ // nsISupports interface implementation
+ //
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPolicy, Ci.nsIObserver,
+ Ci.nsIChannelEventSink, Ci.nsIFactory, Ci.nsISupportsWeakReference]),
+
+ //
+ // nsIContentPolicy interface implementation
+ //
+
+ shouldLoad: function(contentType, contentLocation, requestOrigin, node, mimeTypeGuess, extra)
+ {
+ // Ignore requests without context and top-level documents
+ if (!node || contentType == Policy.type.DOCUMENT)
+ return Ci.nsIContentPolicy.ACCEPT;
+
+ // Ignore standalone objects
+ if (contentType == Policy.type.OBJECT && node.ownerDocument && !/^text\/|[+\/]xml$/.test(node.ownerDocument.contentType))
+ return Ci.nsIContentPolicy.ACCEPT;
+
+ let wnd = Utils.getWindow(node);
+ if (!wnd)
+ return Ci.nsIContentPolicy.ACCEPT;
+
+ // Ignore whitelisted schemes
+ let location = Utils.unwrapURL(contentLocation);
+ if (!Policy.isBlockableScheme(location))
+ return Ci.nsIContentPolicy.ACCEPT;
+
+ // Interpret unknown types as "other"
+ if (!(contentType in Policy.typeDescr))
+ contentType = Policy.type.OTHER;
+
+ let result = Policy.processNode(wnd, node, contentType, location, false);
+ if (result)
+ {
+ // We didn't block this request so we will probably see it again in
+ // http-on-opening-request. Keep it so that we can associate it with the
+ // channel there - will be needed in case of redirect.
+ this.previousRequest = [location, contentType];
+ }
+ return (result ? Ci.nsIContentPolicy.ACCEPT : Ci.nsIContentPolicy.REJECT_REQUEST);
+ },
+
+ shouldProcess: function(contentType, contentLocation, requestOrigin, insecNode, mimeType, extra)
+ {
+ return Ci.nsIContentPolicy.ACCEPT;
+ },
+
+ //
+ // nsIObserver interface implementation
+ //
+ observe: function(subject, topic, data, additional)
+ {
+ switch (topic)
+ {
+ case "content-document-global-created":
+ {
+ if (!(subject instanceof Ci.nsIDOMWindow) || !subject.opener)
+ return;
+
+ let uri = additional || Utils.makeURI(subject.location.href);
+ if (!Policy.processNode(subject.opener, subject.opener.document, Policy.type.POPUP, uri, false))
+ {
+ subject.stop();
+ Utils.runAsync(subject.close, subject);
+ }
+ else if (uri.spec == "about:blank")
+ {
+ // An about:blank pop-up most likely means that a load will be
+ // initiated synchronously. Set a flag for our "http-on-opening-request"
+ // handler.
+ this.expectingPopupLoad = true;
+ Utils.runAsync(function()
+ {
+ this.expectingPopupLoad = false;
+ });
+ }
+ break;
+ }
+ case "http-on-opening-request":
+ case "http-on-modify-request":
+ {
+ if (!(subject instanceof Ci.nsIHttpChannel))
+ return;
+
+ if (this.previousRequest && subject.URI == this.previousRequest[0] &&
+ subject instanceof Ci.nsIWritablePropertyBag)
+ {
+ // We just handled a content policy call for this request - associate
+ // the data with the channel so that we can find it in case of a redirect.
+ subject.setProperty("abpRequestType", this.previousRequest[1]);
+ this.previousRequest = null;
+ }
+
+ if (this.expectingPopupLoad)
+ {
+ let wnd = Utils.getRequestWindow(subject);
+ if (wnd && wnd.opener && wnd.location.href == "about:blank")
+ {
+ this.observe(wnd, "content-document-global-created", null, subject.URI);
+ if (subject instanceof Ci.nsIWritablePropertyBag)
+ subject.setProperty("abpRequestType", Policy.type.POPUP);
+ }
+ }
+
+ break;
+ }
+ case "xpcom-category-entry-removed":
+ case "xpcom-category-cleared":
+ {
+ let category = data;
+ if (this.xpcom_categories.indexOf(category) < 0)
+ return;
+
+ if (topic == "xpcom-category-entry-removed" &&
+ subject instanceof Ci.nsISupportsCString &&
+ subject.data != this.contractID)
+ {
+ return;
+ }
+
+ // Our category entry was removed, make sure to add it back
+ let catMan = Utils.categoryManager;
+ catMan.addCategoryEntry(category, this.contractID, this.contractID, false, true);
+ break;
+ }
+ }
+ },
+
+ //
+ // nsIChannelEventSink interface implementation
+ //
+
+ asyncOnChannelRedirect: function(oldChannel, newChannel, flags, callback)
+ {
+ let result = Cr.NS_OK;
+ try
+ {
+ // Try to retrieve previously stored request data from the channel
+ let contentType;
+ if (oldChannel instanceof Ci.nsIWritablePropertyBag)
+ {
+ try
+ {
+ contentType = oldChannel.getProperty("abpRequestType");
+ }
+ catch(e)
+ {
+ // No data attached, ignore this redirect
+ return;
+ }
+ }
+
+ let newLocation = null;
+ try
+ {
+ newLocation = newChannel.URI;
+ } catch(e2) {}
+ if (!newLocation)
+ return;
+
+ let wnd = Utils.getRequestWindow(newChannel);
+ if (!wnd)
+ return;
+
+ if (contentType == Policy.type.SUBDOCUMENT && wnd.parent == wnd.top && wnd.opener)
+ {
+ // This is a window opened in a new tab miscategorized as frame load,
+ // see bug 467514. Get the frame as context to be at least consistent.
+ wnd = wnd.opener;
+ }
+
+ if (contentType == Policy.type.POPUP && wnd.opener)
+ {
+ // Popups are initiated by their opener, not their own window.
+ wnd = wnd.opener;
+ }
+
+ if (!Policy.processNode(wnd, wnd.document, contentType, newLocation, false))
+ result = Cr.NS_BINDING_ABORTED;
+ }
+ catch (e)
+ {
+ // We shouldn't throw exceptions here - this will prevent the redirect.
+ Cu.reportError(e);
+ }
+ finally
+ {
+ callback.onRedirectVerifyCallback(result);
+ }
+ },
+
+ //
+ // nsIFactory interface implementation
+ //
+
+ createInstance: function(outer, iid)
+ {
+ if (outer)
+ throw Cr.NS_ERROR_NO_AGGREGATION;
+ return this.QueryInterface(iid);
+ }
+};
+PolicyImplementation.init();
+
+/**
+ * Nodes scheduled for post-processing (might be null).
+ * @type Array of Node
+ */
+let scheduledNodes = null;
+
+/**
+ * Schedules a node for post-processing.
+ */
+function schedulePostProcess(/**Element*/ node)
+{
+ if (scheduledNodes)
+ scheduledNodes.push(node);
+ else
+ {
+ scheduledNodes = [node];
+ Utils.runAsync(postProcessNodes);
+ }
+}
+
+/**
+ * Processes nodes scheduled for post-processing (typically hides them).
+ */
+function postProcessNodes()
+{
+ let nodes = scheduledNodes;
+ scheduledNodes = null;
+
+ for (let node of nodes)
+ {
+ // adjust frameset's cols/rows for frames
+ let parentNode = node.parentNode;
+ if (parentNode && parentNode instanceof Ci.nsIDOMHTMLFrameSetElement)
+ {
+ let hasCols = (parentNode.cols && parentNode.cols.indexOf(",") > 0);
+ let hasRows = (parentNode.rows && parentNode.rows.indexOf(",") > 0);
+ if ((hasCols || hasRows) && !(hasCols && hasRows))
+ {
+ let index = -1;
+ for (let frame = node; frame; frame = frame.previousSibling)
+ if (frame instanceof Ci.nsIDOMHTMLFrameElement || frame instanceof Ci.nsIDOMHTMLFrameSetElement)
+ index++;
+
+ let property = (hasCols ? "cols" : "rows");
+ let weights = parentNode[property].split(",");
+ weights[index] = "0";
+ parentNode[property] = weights.join(",");
+ }
+ }
+ else
+ node.classList.add(collapsedClass);
+ }
+}
+
+/**
+ * Extracts the hostname from a URL (might return null).
+ */
+function getHostname(/**String*/ url) /**String*/
+{
+ try
+ {
+ return Utils.unwrapURL(url).host;
+ }
+ catch(e)
+ {
+ return null;
+ }
+}
+
+/**
+ * Retrieves the location of a window.
+ * @param wnd {nsIDOMWindow}
+ * @return {String} window location or null on failure
+ */
+function getWindowLocation(wnd)
+{
+ if ("name" in wnd && wnd.name == "messagepane")
+ {
+ // Thunderbird branch
+ try
+ {
+ let mailWnd = wnd.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIWebNavigation)
+ .QueryInterface(Ci.nsIDocShellTreeItem)
+ .rootTreeItem
+ .QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIDOMWindow);
+
+ // Typically we get a wrapped mail window here, need to unwrap
+ try
+ {
+ mailWnd = mailWnd.wrappedJSObject;
+ } catch(e) {}
+
+ if ("currentHeaderData" in mailWnd && "content-base" in mailWnd.currentHeaderData)
+ {
+ return mailWnd.currentHeaderData["content-base"].headerValue;
+ }
+ else if ("currentHeaderData" in mailWnd && "from" in mailWnd.currentHeaderData)
+ {
+ let emailAddress = Utils.headerParser.extractHeaderAddressMailboxes(mailWnd.currentHeaderData.from.headerValue);
+ if (emailAddress)
+ return 'mailto:' + emailAddress.replace(/^[\s"]+/, "").replace(/[\s"]+$/, "").replace(/\s/g, '%20');
+ }
+ } catch(e) {}
+ }
+
+ // Firefox branch
+ return wnd.location.href;
+}
+
+/**
+ * Checks whether the location's origin is different from document's origin.
+ */
+function isThirdParty(/**nsIURI*/location, /**String*/ docDomain) /**Boolean*/
+{
+ if (!location || !docDomain)
+ return true;
+
+ try
+ {
+ return Utils.effectiveTLD.getBaseDomain(location) != Utils.effectiveTLD.getBaseDomainFromHost(docDomain);
+ }
+ catch (e)
+ {
+ // EffectiveTLDService throws on IP addresses, just compare the host name
+ let host = "";
+ try
+ {
+ host = location.host;
+ } catch (e) {}
+ return host != docDomain;
+ }
+}
+
+/**
+ * Re-checks filters on an element.
+ */
+function refilterNode(/**Node*/ node, /**RequestEntry*/ entry)
+{
+ let wnd = Utils.getWindow(node);
+ if (!wnd || wnd.closed)
+ return;
+
+ if (entry.type == Policy.type.OBJECT)
+ {
+ node.removeEventListener("mouseover", objectMouseEventHander, true);
+ node.removeEventListener("mouseout", objectMouseEventHander, true);
+ }
+ Policy.processNode(wnd, node, entry.type, Utils.makeURI(entry.location), true);
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/customizableUI.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/customizableUI.js
new file mode 100644
index 0000000..7db7425
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/customizableUI.js
@@ -0,0 +1,320 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview This emulates a subset of the CustomizableUI API from Firefox 28.
+ */
+
+let {XPCOMUtils} = Cu.import("resource://gre/modules/XPCOMUtils.jsm", null);
+
+let {Utils} = require("utils");
+
+// UI module has to be referenced lazily to avoid circular references
+XPCOMUtils.defineLazyGetter(this, "UI", () => require("ui").UI);
+
+let widgets = Map();
+
+function getToolbox(/**Window*/ window, /**Widget*/ widget) /**Element*/
+{
+ if (!("defaultArea" in widget) || !widget.defaultArea)
+ return null;
+
+ let toolbar = UI.findElement(window, widget.defaultArea);
+ if (!toolbar)
+ return null;
+
+ let toolbox = toolbar.toolbox;
+ if (toolbox && ("palette" in toolbox) && toolbox.palette)
+ return toolbox;
+ else
+ return null;
+}
+
+function getToolbar(/**Element*/ element) /**Element*/
+{
+ for (let parent = element.parentNode; parent; parent = parent.parentNode)
+ if (parent.localName == "toolbar")
+ return parent;
+ return null;
+}
+
+function getPaletteItem(/**Element*/ toolbox, /**String*/ id) /**Element*/
+{
+ for (let child of toolbox.palette.children)
+ if (child.id == id)
+ return child;
+
+ return null;
+}
+
+function restoreWidget(/**Element*/ toolbox, /**Widget*/ widget)
+{
+ // Create node
+ let node = widget.onBuild(toolbox.ownerDocument);
+
+ // Insert into the palette first
+ toolbox.palette.insertBefore(node, toolbox.palette.firstChild);
+
+ // Now find out where we should put it
+ let position = toolbox.getAttribute(widget.positionAttribute);
+ if (!/^\S*,\S*,\S*$/.test(position))
+ position = null;
+
+ if (position == null)
+ {
+ // No explicitly saved position but maybe we can find it in a currentset
+ // attribute somewhere.
+ let toolbars = toolbox.externalToolbars.slice();
+ for (let child of toolbox.children)
+ if (child.localName == "toolbar")
+ toolbars.push(child);
+ for (let toolbar of toolbars)
+ {
+ let currentSet = toolbar.getAttribute("currentset");
+ if (currentSet)
+ {
+ let items = currentSet.split(",");
+ let index = items.indexOf(widget.id);
+ if (index >= 0)
+ {
+ let before = (index + 1 < items.length ? items[index + 1] : "");
+ position = "visible," + toolbar.id + "," + before;
+ toolbox.setAttribute(widget.positionAttribute, position);
+ toolbox.ownerDocument.persist(toolbox.id, widget.positionAttribute);
+ break;
+ }
+ }
+ }
+ }
+
+ showWidget(toolbox, widget, position);
+}
+
+function showWidget(/**Element*/ toolbox, /**Widget*/ widget, /**String*/ position)
+{
+ let visible = "visible", parent = null, before = null;
+ if (position)
+ {
+ [visible, parent, before] = position.split(",", 3);
+ parent = toolbox.ownerDocument.getElementById(parent);
+ if (before == "")
+ before = null;
+ else
+ before = toolbox.ownerDocument.getElementById(before);
+ if (before && before.parentNode != parent)
+ before = null;
+ }
+
+ if (visible == "visible" && !parent)
+ {
+ let insertionPoint = {
+ parent: widget.defaultArea
+ };
+ if (typeof widget.defaultBefore != "undefined")
+ insertionPoint.before = widget.defaultBefore;
+ if (typeof widget.defaultAfter != "undefined")
+ insertionPoint.after = widget.defaultAfter;
+
+ [parent, before] = UI.resolveInsertionPoint(toolbox.ownerDocument.defaultView, insertionPoint);
+ }
+
+ if (parent && parent.localName != "toolbar")
+ parent = null;
+
+ if (visible != "visible")
+ {
+ // Move to palette if the item is currently visible
+ let node = toolbox.ownerDocument.getElementById(widget.id);
+ if (node)
+ toolbox.palette.appendChild(node);
+ }
+ else if (parent)
+ {
+ // Add the item to the toolbar
+ let items = parent.currentSet.split(",");
+ let index = (before ? items.indexOf(before.id) : -1);
+ if (index < 0)
+ before = null;
+ parent.insertItem(widget.id, before, null, false);
+ }
+
+ saveState(toolbox, widget);
+}
+
+function removeWidget(/**Window*/ window, /**Widget*/ widget)
+{
+ let element = window.document.getElementById(widget.id);
+ if (element)
+ element.parentNode.removeChild(element);
+
+ let toolbox = getToolbox(window, widget);
+ if (toolbox)
+ {
+ let paletteItem = getPaletteItem(toolbox, widget.id);
+ if (paletteItem)
+ paletteItem.parentNode.removeChild(paletteItem);
+ }
+}
+
+function onToolbarCustomization(/**Event*/ event)
+{
+ let toolbox = event.currentTarget;
+ for (let [id, widget] of widgets)
+ saveState(toolbox, widget);
+}
+
+function saveState(/**Element*/ toolbox, /**Widget*/ widget)
+{
+ let node = toolbox.ownerDocument.getElementById(widget.id);
+
+ let position = toolbox.getAttribute(widget.positionAttribute) || "hidden,,";
+ if (node && node.parentNode.localName != "toolbarpalette")
+ {
+ if (typeof widget.onAdded == "function")
+ widget.onAdded(node)
+
+ let toolbar = getToolbar(node);
+ position = "visible," + toolbar.id + "," + (node.nextSibling ? node.nextSibling.id : "");
+ }
+ else
+ position = position.replace(/^visible,/, "hidden,")
+
+ toolbox.setAttribute(widget.positionAttribute, position);
+ toolbox.ownerDocument.persist(toolbox.id, widget.positionAttribute);
+}
+
+let CustomizableUI = exports.CustomizableUI =
+{
+ createWidget: function(widget)
+ {
+ if (typeof widget.id == "undefined" ||
+ typeof widget.defaultArea == "undefined" ||
+ typeof widget.positionAttribute == "undefined")
+ {
+ throw new Error("Unexpected: required property missing from the widget data");
+ }
+ widgets.set(widget.id, widget);
+
+ // Show widget in any existing windows
+ for (let window of UI.applicationWindows)
+ {
+ let toolbox = getToolbox(window, widget);
+ if (toolbox)
+ {
+ toolbox.addEventListener("aftercustomization", onToolbarCustomization, false);
+ restoreWidget(toolbox, widget);
+ }
+ }
+ },
+
+ destroyWidget: function(id)
+ {
+ // Don't do anything here. This function is called on shutdown,
+ // removeFromWindow will take care of cleaning up already.
+ },
+
+ getPlacementOfWidget: function(id)
+ {
+ let window = UI.currentWindow;
+ if (!window)
+ return null;
+
+ let widget = window.document.getElementById(id);
+ if (!widget)
+ return null;
+
+ let toolbar = getToolbar(widget);
+ if (!toolbar)
+ return null;
+
+ return {area: toolbar.id};
+ },
+
+ addWidgetToArea: function(id)
+ {
+ // Note: the official API function also has area and position parameters.
+ // We ignore those here and simply restore the previous position instead.
+ let widget = widgets.get(id);
+ for (let window of UI.applicationWindows)
+ {
+ let toolbox = getToolbox(window, widget);
+ if (!toolbox)
+ continue;
+
+ let position = toolbox.getAttribute(widget.positionAttribute);
+ if (position)
+ position = position.replace(/^hidden,/, "visible,");
+ showWidget(toolbox, widget, position);
+ }
+ },
+
+ removeWidgetFromArea: function(id)
+ {
+ let widget = widgets.get(id);
+ for (let window of UI.applicationWindows)
+ {
+ let toolbox = getToolbox(window, widget);
+ if (!toolbox)
+ continue;
+
+ let position = toolbox.getAttribute(widget.positionAttribute);
+ if (position)
+ position = position.replace(/^visible,/, "hidden,");
+ else
+ position = "hidden,,";
+ showWidget(toolbox, widget, position);
+ }
+ }
+};
+
+let {WindowObserver} = require("windowObserver");
+new WindowObserver({
+ applyToWindow: function(window)
+ {
+ let {isKnownWindow} = require("appSupport");
+ if (!isKnownWindow(window))
+ return;
+
+ for (let [id, widget] of widgets)
+ {
+ let toolbox = getToolbox(window, widget);
+ if (toolbox)
+ {
+ toolbox.addEventListener("aftercustomization", onToolbarCustomization, false);
+
+ // Restore widget asynchronously to allow the stylesheet to load
+ Utils.runAsync(restoreWidget.bind(null, toolbox, widget));
+ }
+ }
+ },
+
+ removeFromWindow: function(window)
+ {
+ let {isKnownWindow} = require("appSupport");
+ if (!isKnownWindow(window))
+ return;
+
+ for (let [id, widget] of widgets)
+ {
+ let toolbox = getToolbox(window, widget);
+ if (toolbox)
+ toolbox.removeEventListener("aftercustomization", onToolbarCustomization, false);
+
+ removeWidget(window, widget);
+ }
+ }
+});
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/downloader.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/downloader.js
new file mode 100644
index 0000000..d1ef209
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/downloader.js
@@ -0,0 +1,381 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Downloads a set of URLs in regular time intervals.
+ */
+
+let {Utils} = require("utils");
+
+let MILLIS_IN_SECOND = exports.MILLIS_IN_SECOND = 1000;
+let MILLIS_IN_MINUTE = exports.MILLIS_IN_MINUTE = 60 * MILLIS_IN_SECOND;
+let MILLIS_IN_HOUR = exports.MILLIS_IN_HOUR = 60 * MILLIS_IN_MINUTE;
+let MILLIS_IN_DAY = exports.MILLIS_IN_DAY = 24 * MILLIS_IN_HOUR;
+
+/**
+ * Creates a new downloader instance.
+ * @param {Function} dataSource Function that will yield downloadable objects on each check
+ * @param {Integer} initialDelay Number of milliseconds to wait before the first check
+ * @param {Integer} checkInterval Interval between the checks
+ * @constructor
+ */
+let Downloader = exports.Downloader = function Downloader(dataSource, initialDelay, checkInterval)
+{
+ this.dataSource = dataSource;
+ this._timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ this._timer.initWithCallback(function()
+ {
+ this._timer.delay = checkInterval;
+ this._doCheck();
+ }.bind(this), initialDelay, Ci.nsITimer.TYPE_REPEATING_SLACK);
+ this._downloading = Object.create(null);
+}
+Downloader.prototype =
+{
+ /**
+ * Timer triggering the downloads.
+ * @type nsITimer
+ */
+ _timer: null,
+
+ /**
+ * Map containing the URLs of objects currently being downloaded as its keys.
+ */
+ _downloading: null,
+
+ /**
+ * Function that will yield downloadable objects on each check.
+ * @type Function
+ */
+ dataSource: null,
+
+ /**
+ * Maximal time interval that the checks can be left out until the soft
+ * expiration interval increases.
+ * @type Integer
+ */
+ maxAbsenceInterval: 1 * MILLIS_IN_DAY,
+
+ /**
+ * Minimal time interval before retrying a download after an error.
+ * @type Integer
+ */
+ minRetryInterval: 1 * MILLIS_IN_DAY,
+
+ /**
+ * Maximal allowed expiration interval, larger expiration intervals will be
+ * corrected.
+ * @type Integer
+ */
+ maxExpirationInterval: 14 * MILLIS_IN_DAY,
+
+ /**
+ * Maximal number of redirects before the download is considered as failed.
+ * @type Integer
+ */
+ maxRedirects: 5,
+
+ /**
+ * Called whenever expiration intervals for an object need to be adapted.
+ * @type Function
+ */
+ onExpirationChange: null,
+
+ /**
+ * Callback to be triggered whenever a download starts.
+ * @type Function
+ */
+ onDownloadStarted: null,
+
+ /**
+ * Callback to be triggered whenever a download finishes successfully. The
+ * callback can return an error code to indicate that the data is wrong.
+ * @type Function
+ */
+ onDownloadSuccess: null,
+
+ /**
+ * Callback to be triggered whenever a download fails.
+ * @type Function
+ */
+ onDownloadError: null,
+
+ /**
+ * Checks whether anything needs downloading.
+ */
+ _doCheck: function()
+ {
+ let now = Date.now();
+ for (let downloadable of this.dataSource())
+ {
+ if (downloadable.lastCheck && now - downloadable.lastCheck > this.maxAbsenceInterval)
+ {
+ // No checks for a long time interval - user must have been offline, e.g.
+ // during a weekend. Increase soft expiration to prevent load peaks on the
+ // server.
+ downloadable.softExpiration += now - downloadable.lastCheck;
+ }
+ downloadable.lastCheck = now;
+
+ // Sanity check: do expiration times make sense? Make sure people changing
+ // system clock don't get stuck with outdated subscriptions.
+ if (downloadable.hardExpiration - now > this.maxExpirationInterval)
+ downloadable.hardExpiration = now + this.maxExpirationInterval;
+ if (downloadable.softExpiration - now > this.maxExpirationInterval)
+ downloadable.softExpiration = now + this.maxExpirationInterval;
+
+ // Notify the caller about changes to expiration parameters
+ if (this.onExpirationChange)
+ this.onExpirationChange(downloadable);
+
+ // Does that object need downloading?
+ if (downloadable.softExpiration > now && downloadable.hardExpiration > now)
+ continue;
+
+ // Do not retry downloads too often
+ if (downloadable.lastError && now - downloadable.lastError < this.minRetryInterval)
+ continue;
+
+ this._download(downloadable, 0);
+ }
+ },
+
+ /**
+ * Stops the periodic checks.
+ */
+ cancel: function()
+ {
+ this._timer.cancel();
+ },
+
+ /**
+ * Checks whether an address is currently being downloaded.
+ */
+ isDownloading: function(/**String*/ url) /**Boolean*/
+ {
+ return url in this._downloading;
+ },
+
+ /**
+ * Starts downloading for an object.
+ */
+ download: function(/**Downloadable*/ downloadable)
+ {
+ // Make sure to detach download from the current execution context
+ Utils.runAsync(this._download.bind(this, downloadable, 0));
+ },
+
+ /**
+ * Generates the real download URL for an object by appending various
+ * parameters.
+ */
+ getDownloadUrl: function(/**Downloadable*/ downloadable) /** String*/
+ {
+ let {addonName, addonVersion, application, applicationVersion, platform, platformVersion} = require("info");
+ let url = downloadable.redirectURL || downloadable.url;
+ if (url.indexOf("?") >= 0)
+ url += "&";
+ else
+ url += "?";
+ url += "addonName=" + encodeURIComponent(addonName) +
+ "&addonVersion=" + encodeURIComponent(addonVersion) +
+ "&application=" + encodeURIComponent(application) +
+ "&applicationVersion=" + encodeURIComponent(applicationVersion) +
+ "&platform=" + encodeURIComponent(platform) +
+ "&platformVersion=" + encodeURIComponent(platformVersion) +
+ "&lastVersion=" + encodeURIComponent(downloadable.lastVersion);
+ return url;
+ },
+
+ _download: function(downloadable, redirects)
+ {
+ if (this.isDownloading(downloadable.url))
+ return;
+
+ let downloadUrl = this.getDownloadUrl(downloadable);
+ let request = null;
+
+ let errorCallback = function errorCallback(error)
+ {
+ let channelStatus = -1;
+ try
+ {
+ channelStatus = request.channel.status;
+ } catch (e) {}
+
+ let responseStatus = request.status;
+
+ Cu.reportError("Adblock Plus: Downloading URL " + downloadable.url + " failed (" + error + ")\n" +
+ "Download address: " + downloadUrl + "\n" +
+ "Channel status: " + channelStatus + "\n" +
+ "Server response: " + responseStatus);
+
+ if (this.onDownloadError)
+ {
+ // Allow one extra redirect if the error handler gives us a redirect URL
+ let redirectCallback = null;
+ if (redirects <= this.maxRedirects)
+ {
+ redirectCallback = function redirectCallback(url)
+ {
+ downloadable.redirectURL = url;
+ this._download(downloadable, redirects + 1);
+ }.bind(this);
+ }
+
+ this.onDownloadError(downloadable, downloadUrl, error, channelStatus, responseStatus, redirectCallback);
+ }
+ }.bind(this);
+
+ try
+ {
+ request = new XMLHttpRequest();
+ request.mozBackgroundRequest = true;
+ request.open("GET", downloadUrl);
+ }
+ catch (e)
+ {
+ errorCallback("synchronize_invalid_url");
+ return;
+ }
+
+ try {
+ request.overrideMimeType("text/plain");
+ request.channel.loadFlags = request.channel.loadFlags |
+ request.channel.INHIBIT_CACHING |
+ request.channel.VALIDATE_ALWAYS;
+
+ // Override redirect limit from preferences, user might have set it to 1
+ if (request.channel instanceof Ci.nsIHttpChannel)
+ request.channel.redirectionLimit = this.maxRedirects;
+ }
+ catch (e)
+ {
+ Cu.reportError(e)
+ }
+
+ request.addEventListener("error", function(event)
+ {
+ if (onShutdown.done)
+ return;
+
+ delete this._downloading[downloadable.url];
+ errorCallback("synchronize_connection_error");
+ }.bind(this), false);
+
+ request.addEventListener("load", function(event)
+ {
+ if (onShutdown.done)
+ return;
+
+ delete this._downloading[downloadable.url];
+
+ // Status will be 0 for non-HTTP requests
+ if (request.status && request.status != 200)
+ {
+ errorCallback("synchronize_connection_error");
+ return;
+ }
+
+ this.onDownloadSuccess(downloadable, request.responseText, errorCallback, function redirectCallback(url)
+ {
+ if (redirects >= this.maxRedirects)
+ errorCallback("synchronize_connection_error");
+ else
+ {
+ downloadable.redirectURL = url;
+ this._download(downloadable, redirects + 1);
+ }
+ }.bind(this));
+ }.bind(this), false);
+
+ request.send(null);
+
+ this._downloading[downloadable.url] = true;
+ if (this.onDownloadStarted)
+ this.onDownloadStarted(downloadable);
+ },
+
+ /**
+ * Produces a soft and a hard expiration interval for a given supplied
+ * expiration interval.
+ * @return {Array} soft and hard expiration interval
+ */
+ processExpirationInterval: function(/**Integer*/ interval)
+ {
+ interval = Math.min(Math.max(interval, 0), this.maxExpirationInterval);
+ let soft = Math.round(interval * (Math.random() * 0.4 + 0.8));
+ let hard = interval * 2;
+ let now = Date.now();
+ return [now + soft, now + hard];
+ }
+};
+
+/**
+ * An object that can be downloaded by the downloadable
+ * @param {String} url URL that has to be requested for the object
+ * @constructor
+ */
+let Downloadable = exports.Downloadable = function Downloadable(url)
+{
+ this.url = url;
+}
+Downloadable.prototype =
+{
+ /**
+ * URL that has to be requested for the object.
+ * @type String
+ */
+ url: null,
+
+ /**
+ * URL that the download was redirected to if any.
+ * @type String
+ */
+ redirectURL: null,
+
+ /**
+ * Time of last download error or 0 if the last download was successful.
+ * @type Integer
+ */
+ lastError: 0,
+
+ /**
+ * Time of last check whether the object needs downloading.
+ * @type Integer
+ */
+ lastCheck: 0,
+
+ /**
+ * Object version corresponding to the last successful download.
+ * @type Integer
+ */
+ lastVersion: 0,
+
+ /**
+ * Soft expiration interval, will increase if no checks are performed for a
+ * while.
+ * @type Integer
+ */
+ softExpiration: 0,
+
+ /**
+ * Hard expiration interval, this is fixed.
+ * @type Integer
+ */
+ hardExpiration: 0,
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/elemHide.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/elemHide.js
new file mode 100644
index 0000000..df17a0f
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/elemHide.js
@@ -0,0 +1,419 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Element hiding implementation.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {Utils} = require("utils");
+let {IO} = require("io");
+let {Prefs} = require("prefs");
+let {ElemHideException} = require("filterClasses");
+let {FilterNotifier} = require("filterNotifier");
+let {AboutHandler} = require("elemHideHitRegistration");
+let {TimeLine} = require("timeline");
+
+/**
+ * Lookup table, filters by their associated key
+ * @type Object
+ */
+let filterByKey = {__proto__: null};
+
+/**
+ * Lookup table, keys of the filters by filter text
+ * @type Object
+ */
+let keyByFilter = {__proto__: null};
+
+/**
+ * Lookup table, keys are known element hiding exceptions
+ * @type Object
+ */
+let knownExceptions = {__proto__: null};
+
+/**
+ * Lookup table, lists of element hiding exceptions by selector
+ * @type Object
+ */
+let exceptions = {__proto__: null};
+
+/**
+ * Currently applied stylesheet URL
+ * @type nsIURI
+ */
+let styleURL = null;
+
+/**
+ * Element hiding component
+ * @class
+ */
+let ElemHide = exports.ElemHide =
+{
+ /**
+ * Indicates whether filters have been added or removed since the last apply() call.
+ * @type Boolean
+ */
+ isDirty: false,
+
+ /**
+ * Inidicates whether the element hiding stylesheet is currently applied.
+ * @type Boolean
+ */
+ applied: false,
+
+ /**
+ * Called on module startup.
+ */
+ init: function()
+ {
+ TimeLine.enter("Entered ElemHide.init()");
+ Prefs.addListener(function(name)
+ {
+ if (name == "enabled")
+ ElemHide.apply();
+ });
+ onShutdown.add(function()
+ {
+ ElemHide.unapply();
+ });
+
+ TimeLine.log("done adding prefs listener");
+
+ let styleFile = IO.resolveFilePath(Prefs.data_directory);
+ styleFile.append("elemhide.css");
+ styleURL = Services.io.newFileURI(styleFile).QueryInterface(Ci.nsIFileURL);
+ TimeLine.log("done determining stylesheet URL");
+
+ TimeLine.leave("ElemHide.init() done");
+ },
+
+ /**
+ * Removes all known filters
+ */
+ clear: function()
+ {
+ filterByKey = {__proto__: null};
+ keyByFilter = {__proto__: null};
+ knownExceptions = {__proto__: null};
+ exceptions = {__proto__: null};
+ ElemHide.isDirty = false;
+ ElemHide.unapply();
+ },
+
+ /**
+ * Add a new element hiding filter
+ * @param {ElemHideFilter} filter
+ */
+ add: function(filter)
+ {
+ if (filter instanceof ElemHideException)
+ {
+ if (filter.text in knownExceptions)
+ return;
+
+ let selector = filter.selector;
+ if (!(selector in exceptions))
+ exceptions[selector] = [];
+ exceptions[selector].push(filter);
+ knownExceptions[filter.text] = true;
+ }
+ else
+ {
+ if (filter.text in keyByFilter)
+ return;
+
+ let key;
+ do {
+ key = Math.random().toFixed(15).substr(5);
+ } while (key in filterByKey);
+
+ filterByKey[key] = filter;
+ keyByFilter[filter.text] = key;
+ ElemHide.isDirty = true;
+ }
+ },
+
+ /**
+ * Removes an element hiding filter
+ * @param {ElemHideFilter} filter
+ */
+ remove: function(filter)
+ {
+ if (filter instanceof ElemHideException)
+ {
+ if (!(filter.text in knownExceptions))
+ return;
+
+ let list = exceptions[filter.selector];
+ let index = list.indexOf(filter);
+ if (index >= 0)
+ list.splice(index, 1);
+ delete knownExceptions[filter.text];
+ }
+ else
+ {
+ if (!(filter.text in keyByFilter))
+ return;
+
+ let key = keyByFilter[filter.text];
+ delete filterByKey[key];
+ delete keyByFilter[filter.text];
+ ElemHide.isDirty = true;
+ }
+ },
+
+ /**
+ * Checks whether an exception rule is registered for a filter on a particular
+ * domain.
+ */
+ getException: function(/**Filter*/ filter, /**String*/ docDomain) /**ElemHideException*/
+ {
+ let selector = filter.selector;
+ if (!(filter.selector in exceptions))
+ return null;
+
+ let list = exceptions[filter.selector];
+ for (let i = list.length - 1; i >= 0; i--)
+ if (list[i].isActiveOnDomain(docDomain))
+ return list[i];
+
+ return null;
+ },
+
+ /**
+ * Will be set to true if apply() is running (reentrance protection).
+ * @type Boolean
+ */
+ _applying: false,
+
+ /**
+ * Will be set to true if an apply() call arrives while apply() is already
+ * running (delayed execution).
+ * @type Boolean
+ */
+ _needsApply: false,
+
+ /**
+ * Generates stylesheet URL and applies it globally
+ */
+ apply: function()
+ {
+ if (this._applying)
+ {
+ this._needsApply = true;
+ return;
+ }
+
+ TimeLine.enter("Entered ElemHide.apply()");
+
+ if (!ElemHide.isDirty || !Prefs.enabled)
+ {
+ // Nothing changed, looks like we merely got enabled/disabled
+ if (Prefs.enabled && !ElemHide.applied)
+ {
+ try
+ {
+ Utils.styleService.loadAndRegisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET);
+ ElemHide.applied = true;
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ }
+ TimeLine.log("Applying existing stylesheet finished");
+ }
+ else if (!Prefs.enabled && ElemHide.applied)
+ {
+ ElemHide.unapply();
+ TimeLine.log("ElemHide.unapply() finished");
+ }
+
+ TimeLine.leave("ElemHide.apply() done (no file changes)");
+ return;
+ }
+
+ IO.writeToFile(styleURL.file, this._generateCSSContent(), function(e)
+ {
+ TimeLine.enter("ElemHide.apply() write callback");
+ this._applying = false;
+
+ // _generateCSSContent is throwing NS_ERROR_NOT_AVAILABLE to indicate that
+ // there are no filters. If that exception is passed through XPCOM we will
+ // see a proper exception here, otherwise a number.
+ let noFilters = (e == Cr.NS_ERROR_NOT_AVAILABLE || (e && e.result == Cr.NS_ERROR_NOT_AVAILABLE));
+ if (noFilters)
+ {
+ e = null;
+ IO.removeFile(styleURL.file, function(e) {});
+ }
+ else if (e)
+ Cu.reportError(e);
+
+ if (this._needsApply)
+ {
+ this._needsApply = false;
+ this.apply();
+ }
+ else if (!e)
+ {
+ ElemHide.isDirty = false;
+
+ ElemHide.unapply();
+ TimeLine.log("ElemHide.unapply() finished");
+
+ if (!noFilters)
+ {
+ try
+ {
+ Utils.styleService.loadAndRegisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET);
+ ElemHide.applied = true;
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ }
+ TimeLine.log("Applying stylesheet finished");
+ }
+
+ FilterNotifier.triggerListeners("elemhideupdate");
+ }
+ TimeLine.leave("ElemHide.apply() write callback done");
+ }.bind(this), "ElemHideWrite");
+
+ this._applying = true;
+
+ TimeLine.leave("ElemHide.apply() done", "ElemHideWrite");
+ },
+
+ _generateCSSContent: function()
+ {
+ // Grouping selectors by domains
+ TimeLine.log("start grouping selectors");
+ let domains = {__proto__: null};
+ let hasFilters = false;
+ for (let key in filterByKey)
+ {
+ let filter = filterByKey[key];
+ let domain = filter.selectorDomain || "";
+
+ let list;
+ if (domain in domains)
+ list = domains[domain];
+ else
+ {
+ list = {__proto__: null};
+ domains[domain] = list;
+ }
+ list[filter.selector] = key;
+ hasFilters = true;
+ }
+ TimeLine.log("done grouping selectors");
+
+ if (!hasFilters)
+ throw Cr.NS_ERROR_NOT_AVAILABLE;
+
+ function escapeChar(match)
+ {
+ return "\\" + match.charCodeAt(0).toString(16) + " ";
+ }
+
+ // Return CSS data
+ let cssTemplate = "-moz-binding: url(about:" + AboutHandler.aboutPrefix + "?%ID%#dummy) !important;";
+ for (let domain in domains)
+ {
+ let rules = [];
+ let list = domains[domain];
+
+ if (domain)
+ yield ('@-moz-document domain("' + domain.split(",").join('"),domain("') + '"){').replace(/[^\x01-\x7F]/g, escapeChar);
+ else
+ {
+ // Only allow unqualified rules on a few protocols to prevent them from blocking chrome
+ yield '@-moz-document url-prefix("http://"),url-prefix("https://"),'
+ + 'url-prefix("mailbox://"),url-prefix("imap://"),'
+ + 'url-prefix("news://"),url-prefix("snews://"){';
+ }
+
+ for (let selector in list)
+ yield selector.replace(/[^\x01-\x7F]/g, escapeChar) + "{" + cssTemplate.replace("%ID%", list[selector]) + "}";
+ yield '}';
+ }
+ },
+
+ /**
+ * Unapplies current stylesheet URL
+ */
+ unapply: function()
+ {
+ if (ElemHide.applied)
+ {
+ try
+ {
+ Utils.styleService.unregisterSheet(styleURL, Ci.nsIStyleSheetService.USER_SHEET);
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ }
+ ElemHide.applied = false;
+ }
+ },
+
+ /**
+ * Retrieves the currently applied stylesheet URL
+ * @type String
+ */
+ get styleURL()
+ {
+ return ElemHide.applied ? styleURL.spec : null;
+ },
+
+ /**
+ * Retrieves an element hiding filter by the corresponding protocol key
+ */
+ getFilterByKey: function(/**String*/ key) /**Filter*/
+ {
+ return (key in filterByKey ? filterByKey[key] : null);
+ },
+
+ /**
+ * Returns a list of all selectors active on a particular domain (currently
+ * used only in Chrome, Opera and Safari).
+ */
+ getSelectorsForDomain: function(/**String*/ domain, /**Boolean*/ specificOnly)
+ {
+ let result = [];
+ for (let key in filterByKey)
+ {
+ let filter = filterByKey[key];
+
+ // it is important to always access filter.domains
+ // here, even if it isn't used, in order to
+ // workaround WebKit bug 132872, also see #419
+ let domains = filter.domains;
+
+ if (specificOnly && (!domains || domains[""]))
+ continue;
+
+ if (filter.isActiveOnDomain(domain) && !this.getException(filter, domain))
+ result.push(filter.selector);
+ }
+ return result;
+ }
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/elemHideHitRegistration.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/elemHideHitRegistration.js
new file mode 100644
index 0000000..a05f6df
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/elemHideHitRegistration.js
@@ -0,0 +1,160 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Hit counts for element hiding.
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+let {Utils} = require("utils");
+
+/**
+ * about: URL module used to count hits.
+ * @class
+ */
+let AboutHandler = exports.AboutHandler =
+{
+ classID: Components.ID("{55fb7be0-1dd2-11b2-98e6-9e97caf8ba67}"),
+ classDescription: "Element hiding hit registration protocol handler",
+ aboutPrefix: "abp-elemhidehit",
+
+ /**
+ * Registers handler on startup.
+ */
+ init: function()
+ {
+ let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
+ registrar.registerFactory(this.classID, this.classDescription,
+ "@mozilla.org/network/protocol/about;1?what=" + this.aboutPrefix, this);
+ onShutdown.add(function()
+ {
+ registrar.unregisterFactory(this.classID, this);
+ }.bind(this));
+ },
+
+ //
+ // Factory implementation
+ //
+
+ createInstance: function(outer, iid)
+ {
+ if (outer != null)
+ throw Cr.NS_ERROR_NO_AGGREGATION;
+
+ return this.QueryInterface(iid);
+ },
+
+ //
+ // About module implementation
+ //
+
+ getURIFlags: function(uri)
+ {
+ return ("HIDE_FROM_ABOUTABOUT" in Ci.nsIAboutModule ? Ci.nsIAboutModule.HIDE_FROM_ABOUTABOUT : 0);
+ },
+
+ newChannel: function(uri)
+ {
+ let match = /\?(\d+)/.exec(uri.path)
+ if (!match)
+ throw Cr.NS_ERROR_FAILURE;
+
+ return new HitRegistrationChannel(uri, match[1]);
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIFactory, Ci.nsIAboutModule])
+};
+AboutHandler.init();
+
+/**
+ * Channel returning data for element hiding hits.
+ * @constructor
+ */
+function HitRegistrationChannel(uri, key)
+{
+ this.key = key;
+ this.URI = this.originalURI = uri;
+}
+HitRegistrationChannel.prototype = {
+ key: null,
+ URI: null,
+ originalURI: null,
+ contentCharset: "utf-8",
+ contentLength: 0,
+ contentType: "text/xml",
+ owner: Utils.systemPrincipal,
+ securityInfo: null,
+ notificationCallbacks: null,
+ loadFlags: 0,
+ loadGroup: null,
+ name: null,
+ status: Cr.NS_OK,
+
+ asyncOpen: function(listener, context)
+ {
+ let stream = this.open();
+ Utils.runAsync(function()
+ {
+ try {
+ listener.onStartRequest(this, context);
+ } catch(e) {}
+ try {
+ listener.onDataAvailable(this, context, stream, 0, stream.available());
+ } catch(e) {}
+ try {
+ listener.onStopRequest(this, context, Cr.NS_OK);
+ } catch(e) {}
+ }, this);
+ },
+
+ open: function()
+ {
+ let {Policy} = require("contentPolicy");
+ let {ElemHide} = require("elemHide");
+ let data = "<bindings xmlns='http://www.mozilla.org/xbl'><binding id='dummy'/></bindings>";
+ let filter = ElemHide.getFilterByKey(this.key);
+ if (filter)
+ {
+ let wnd = Utils.getRequestWindow(this);
+ if (wnd && wnd.document && !Policy.processNode(wnd, wnd.document, Policy.type.ELEMHIDE, filter))
+ data = "<bindings xmlns='http://www.mozilla.org/xbl'/>";
+ }
+
+ let stream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream);
+ stream.setData(data, data.length);
+ return stream;
+ },
+ isPending: function()
+ {
+ return false;
+ },
+ cancel: function()
+ {
+ throw Cr.NS_ERROR_NOT_IMPLEMENTED;
+ },
+ suspend: function()
+ {
+ throw Cr.NS_ERROR_NOT_IMPLEMENTED;
+ },
+ resume: function()
+ {
+ throw Cr.NS_ERROR_NOT_IMPLEMENTED;
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIChannel, Ci.nsIRequest])
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterClasses.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterClasses.js
new file mode 100644
index 0000000..cb3a5b1
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterClasses.js
@@ -0,0 +1,906 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Definition of Filter class and its subclasses.
+ */
+
+let {FilterNotifier} = require("filterNotifier");
+
+/**
+ * Abstract base class for filters
+ *
+ * @param {String} text string representation of the filter
+ * @constructor
+ */
+function Filter(text)
+{
+ this.text = text;
+ this.subscriptions = [];
+}
+exports.Filter = Filter;
+
+Filter.prototype =
+{
+ /**
+ * String representation of the filter
+ * @type String
+ */
+ text: null,
+
+ /**
+ * Filter subscriptions the filter belongs to
+ * @type Array of Subscription
+ */
+ subscriptions: null,
+
+ /**
+ * Serializes the filter to an array of strings for writing out on the disk.
+ * @param {Array of String} buffer buffer to push the serialization results into
+ */
+ serialize: function(buffer)
+ {
+ buffer.push("[Filter]");
+ buffer.push("text=" + this.text);
+ },
+
+ toString: function()
+ {
+ return this.text;
+ }
+};
+
+/**
+ * Cache for known filters, maps string representation to filter objects.
+ * @type Object
+ */
+Filter.knownFilters = {__proto__: null};
+
+/**
+ * Regular expression that element hiding filters should match
+ * @type RegExp
+ */
+Filter.elemhideRegExp = /^([^\/\*\|\@"!]*?)#(\@)?(?:([\w\-]+|\*)((?:\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\))*)|#([^{}]+))$/;
+/**
+ * Regular expression that RegExp filters specified as RegExps should match
+ * @type RegExp
+ */
+Filter.regexpRegExp = /^(@@)?\/.*\/(?:\$~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)?$/;
+/**
+ * Regular expression that options on a RegExp filter should match
+ * @type RegExp
+ */
+Filter.optionsRegExp = /\$(~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)$/;
+
+/**
+ * Creates a filter of correct type from its text representation - does the basic parsing and
+ * calls the right constructor then.
+ *
+ * @param {String} text as in Filter()
+ * @return {Filter}
+ */
+Filter.fromText = function(text)
+{
+ if (text in Filter.knownFilters)
+ return Filter.knownFilters[text];
+
+ let ret;
+ let match = (text.indexOf("#") >= 0 ? Filter.elemhideRegExp.exec(text) : null);
+ if (match)
+ ret = ElemHideBase.fromText(text, match[1], match[2], match[3], match[4], match[5]);
+ else if (text[0] == "!")
+ ret = new CommentFilter(text);
+ else
+ ret = RegExpFilter.fromText(text);
+
+ Filter.knownFilters[ret.text] = ret;
+ return ret;
+}
+
+/**
+ * Deserializes a filter
+ *
+ * @param {Object} obj map of serialized properties and their values
+ * @return {Filter} filter or null if the filter couldn't be created
+ */
+Filter.fromObject = function(obj)
+{
+ let ret = Filter.fromText(obj.text);
+ if (ret instanceof ActiveFilter)
+ {
+ if ("disabled" in obj)
+ ret._disabled = (obj.disabled == "true");
+ if ("hitCount" in obj)
+ ret._hitCount = parseInt(obj.hitCount) || 0;
+ if ("lastHit" in obj)
+ ret._lastHit = parseInt(obj.lastHit) || 0;
+ }
+ return ret;
+}
+
+/**
+ * Removes unnecessary whitespaces from filter text, will only return null if
+ * the input parameter is null.
+ */
+Filter.normalize = function(/**String*/ text) /**String*/
+{
+ if (!text)
+ return text;
+
+ // Remove line breaks and such
+ text = text.replace(/[^\S ]/g, "");
+
+ if (/^\s*!/.test(text))
+ {
+ // Don't remove spaces inside comments
+ return text.replace(/^\s+/, "").replace(/\s+$/, "");
+ }
+ else if (Filter.elemhideRegExp.test(text))
+ {
+ // Special treatment for element hiding filters, right side is allowed to contain spaces
+ let [, domain, separator, selector] = /^(.*?)(#\@?#?)(.*)$/.exec(text);
+ return domain.replace(/\s/g, "") + separator + selector.replace(/^\s+/, "").replace(/\s+$/, "");
+ }
+ else
+ return text.replace(/\s/g, "");
+}
+
+/**
+ * Class for invalid filters
+ * @param {String} text see Filter()
+ * @param {String} reason Reason why this filter is invalid
+ * @constructor
+ * @augments Filter
+ */
+function InvalidFilter(text, reason)
+{
+ Filter.call(this, text);
+
+ this.reason = reason;
+}
+exports.InvalidFilter = InvalidFilter;
+
+InvalidFilter.prototype =
+{
+ __proto__: Filter.prototype,
+
+ /**
+ * Reason why this filter is invalid
+ * @type String
+ */
+ reason: null,
+
+ /**
+ * See Filter.serialize()
+ */
+ serialize: function(buffer) {}
+};
+
+/**
+ * Class for comments
+ * @param {String} text see Filter()
+ * @constructor
+ * @augments Filter
+ */
+function CommentFilter(text)
+{
+ Filter.call(this, text);
+}
+exports.CommentFilter = CommentFilter;
+
+CommentFilter.prototype =
+{
+ __proto__: Filter.prototype,
+
+ /**
+ * See Filter.serialize()
+ */
+ serialize: function(buffer) {}
+};
+
+/**
+ * Abstract base class for filters that can get hits
+ * @param {String} text see Filter()
+ * @param {String} domains (optional) Domains that the filter is restricted to separated by domainSeparator e.g. "foo.com|bar.com|~baz.com"
+ * @constructor
+ * @augments Filter
+ */
+function ActiveFilter(text, domains)
+{
+ Filter.call(this, text);
+
+ this.domainSource = domains;
+}
+exports.ActiveFilter = ActiveFilter;
+
+ActiveFilter.prototype =
+{
+ __proto__: Filter.prototype,
+
+ _disabled: false,
+ _hitCount: 0,
+ _lastHit: 0,
+
+ /**
+ * Defines whether the filter is disabled
+ * @type Boolean
+ */
+ get disabled()
+ {
+ return this._disabled;
+ },
+ set disabled(value)
+ {
+ if (value != this._disabled)
+ {
+ let oldValue = this._disabled;
+ this._disabled = value;
+ FilterNotifier.triggerListeners("filter.disabled", this, value, oldValue);
+ }
+ return this._disabled;
+ },
+
+ /**
+ * Number of hits on the filter since the last reset
+ * @type Number
+ */
+ get hitCount()
+ {
+ return this._hitCount;
+ },
+ set hitCount(value)
+ {
+ if (value != this._hitCount)
+ {
+ let oldValue = this._hitCount;
+ this._hitCount = value;
+ FilterNotifier.triggerListeners("filter.hitCount", this, value, oldValue);
+ }
+ return this._hitCount;
+ },
+
+ /**
+ * Last time the filter had a hit (in milliseconds since the beginning of the epoch)
+ * @type Number
+ */
+ get lastHit()
+ {
+ return this._lastHit;
+ },
+ set lastHit(value)
+ {
+ if (value != this._lastHit)
+ {
+ let oldValue = this._lastHit;
+ this._lastHit = value;
+ FilterNotifier.triggerListeners("filter.lastHit", this, value, oldValue);
+ }
+ return this._lastHit;
+ },
+
+ /**
+ * String that the domains property should be generated from
+ * @type String
+ */
+ domainSource: null,
+
+ /**
+ * Separator character used in domainSource property, must be overridden by subclasses
+ * @type String
+ */
+ domainSeparator: null,
+
+ /**
+ * Determines whether the trailing dot in domain names isn't important and
+ * should be ignored, must be overridden by subclasses.
+ * @type Boolean
+ */
+ ignoreTrailingDot: true,
+
+ /**
+ * Determines whether domainSource is already upper-case,
+ * can be overridden by subclasses.
+ * @type Boolean
+ */
+ domainSourceIsUpperCase: false,
+
+ /**
+ * Map containing domains that this filter should match on/not match on or null if the filter should match on all domains
+ * @type Object
+ */
+ get domains()
+ {
+ let domains = null;
+
+ if (this.domainSource)
+ {
+ let source = this.domainSource;
+ if (!this.domainSourceIsUpperCase) {
+ // RegExpFilter already have uppercase domains
+ source = source.toUpperCase();
+ }
+ let list = source.split(this.domainSeparator);
+ if (list.length == 1 && list[0][0] != "~")
+ {
+ // Fast track for the common one-domain scenario
+ domains = {__proto__: null, "": false};
+ if (this.ignoreTrailingDot)
+ list[0] = list[0].replace(/\.+$/, "");
+ domains[list[0]] = true;
+ }
+ else
+ {
+ let hasIncludes = false;
+ for (let i = 0; i < list.length; i++)
+ {
+ let domain = list[i];
+ if (this.ignoreTrailingDot)
+ domain = domain.replace(/\.+$/, "");
+ if (domain == "")
+ continue;
+
+ let include;
+ if (domain[0] == "~")
+ {
+ include = false;
+ domain = domain.substr(1);
+ }
+ else
+ {
+ include = true;
+ hasIncludes = true;
+ }
+
+ if (!domains)
+ domains = {__proto__: null};
+
+ domains[domain] = include;
+ }
+ domains[""] = !hasIncludes;
+ }
+
+ this.domainSource = null;
+ }
+
+ Object.defineProperty(this, "domains", {value: domains, enumerable: true});
+ return this.domains;
+ },
+
+ /**
+ * Checks whether this filter is active on a domain.
+ */
+ isActiveOnDomain: function(/**String*/ docDomain) /**Boolean*/
+ {
+ // If no domains are set the rule matches everywhere
+ if (!this.domains)
+ return true;
+
+ // If the document has no host name, match only if the filter isn't restricted to specific domains
+ if (!docDomain)
+ return this.domains[""];
+
+ if (this.ignoreTrailingDot)
+ docDomain = docDomain.replace(/\.+$/, "");
+ docDomain = docDomain.toUpperCase();
+
+ while (true)
+ {
+ if (docDomain in this.domains)
+ return this.domains[docDomain];
+
+ let nextDot = docDomain.indexOf(".");
+ if (nextDot < 0)
+ break;
+ docDomain = docDomain.substr(nextDot + 1);
+ }
+ return this.domains[""];
+ },
+
+ /**
+ * Checks whether this filter is active only on a domain and its subdomains.
+ */
+ isActiveOnlyOnDomain: function(/**String*/ docDomain) /**Boolean*/
+ {
+ if (!docDomain || !this.domains || this.domains[""])
+ return false;
+
+ if (this.ignoreTrailingDot)
+ docDomain = docDomain.replace(/\.+$/, "");
+ docDomain = docDomain.toUpperCase();
+
+ for (let domain in this.domains)
+ if (this.domains[domain] && domain != docDomain && (domain.length <= docDomain.length || domain.indexOf("." + docDomain) != domain.length - docDomain.length - 1))
+ return false;
+
+ return true;
+ },
+
+ /**
+ * See Filter.serialize()
+ */
+ serialize: function(buffer)
+ {
+ if (this._disabled || this._hitCount || this._lastHit)
+ {
+ Filter.prototype.serialize.call(this, buffer);
+ if (this._disabled)
+ buffer.push("disabled=true");
+ if (this._hitCount)
+ buffer.push("hitCount=" + this._hitCount);
+ if (this._lastHit)
+ buffer.push("lastHit=" + this._lastHit);
+ }
+ }
+};
+
+/**
+ * Abstract base class for RegExp-based filters
+ * @param {String} text see Filter()
+ * @param {String} regexpSource filter part that the regular expression should be build from
+ * @param {Number} contentType (optional) Content types the filter applies to, combination of values from RegExpFilter.typeMap
+ * @param {Boolean} matchCase (optional) Defines whether the filter should distinguish between lower and upper case letters
+ * @param {String} domains (optional) Domains that the filter is restricted to, e.g. "foo.com|bar.com|~baz.com"
+ * @param {Boolean} thirdParty (optional) Defines whether the filter should apply to third-party or first-party content only
+ * @constructor
+ * @augments ActiveFilter
+ */
+function RegExpFilter(text, regexpSource, contentType, matchCase, domains, thirdParty)
+{
+ ActiveFilter.call(this, text, domains);
+
+ if (contentType != null)
+ this.contentType = contentType;
+ if (matchCase)
+ this.matchCase = matchCase;
+ if (thirdParty != null)
+ this.thirdParty = thirdParty;
+
+ if (regexpSource.length >= 2 && regexpSource[0] == "/" && regexpSource[regexpSource.length - 1] == "/")
+ {
+ // The filter is a regular expression - convert it immediately to catch syntax errors
+ let regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2), this.matchCase ? "" : "i");
+ this.__defineGetter__("regexp", () => regexp);
+ }
+ else
+ {
+ // No need to convert this filter to regular expression yet, do it on demand
+ this.regexpSource = regexpSource;
+ }
+}
+exports.RegExpFilter = RegExpFilter;
+
+RegExpFilter.prototype =
+{
+ __proto__: ActiveFilter.prototype,
+
+ /**
+ * @see ActiveFilter.domainSourceIsUpperCase
+ */
+ domainSourceIsUpperCase: true,
+
+ /**
+ * Number of filters contained, will always be 1 (required to optimize Matcher).
+ * @type Integer
+ */
+ length: 1,
+
+ /**
+ * @see ActiveFilter.domainSeparator
+ */
+ domainSeparator: "|",
+
+ /**
+ * Expression from which a regular expression should be generated - for delayed creation of the regexp property
+ * @type String
+ */
+ regexpSource: null,
+ /**
+ * Regular expression to be used when testing against this filter
+ * @type RegExp
+ */
+ get regexp()
+ {
+ // Remove multiple wildcards
+ let source = this.regexpSource
+ .replace(/\*+/g, "*") // remove multiple wildcards
+ .replace(/\^\|$/, "^") // remove anchors following separator placeholder
+ .replace(/\W/g, "\\$&") // escape special symbols
+ .replace(/\\\*/g, ".*") // replace wildcards by .*
+ // process separator placeholders (all ANSI characters but alphanumeric characters and _%.-)
+ .replace(/\\\^/g, "(?:[\\x00-\\x24\\x26-\\x2C\\x2F\\x3A-\\x40\\x5B-\\x5E\\x60\\x7B-\\x7F]|$)")
+ .replace(/^\\\|\\\|/, "^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?") // process extended anchor at expression start
+ .replace(/^\\\|/, "^") // process anchor at expression start
+ .replace(/\\\|$/, "$") // process anchor at expression end
+ .replace(/^(\.\*)/, "") // remove leading wildcards
+ .replace(/(\.\*)$/, ""); // remove trailing wildcards
+
+ let regexp = new RegExp(source, this.matchCase ? "" : "i");
+
+ delete this.regexpSource;
+ this.__defineGetter__("regexp", () => regexp);
+ return this.regexp;
+ },
+ /**
+ * Content types the filter applies to, combination of values from RegExpFilter.typeMap
+ * @type Number
+ */
+ contentType: 0x7FFFFFFF,
+ /**
+ * Defines whether the filter should distinguish between lower and upper case letters
+ * @type Boolean
+ */
+ matchCase: false,
+ /**
+ * Defines whether the filter should apply to third-party or first-party content only. Can be null (apply to all content).
+ * @type Boolean
+ */
+ thirdParty: null,
+
+ /**
+ * Tests whether the URL matches this filter
+ * @param {String} location URL to be tested
+ * @param {String} contentType content type identifier of the URL
+ * @param {String} docDomain domain name of the document that loads the URL
+ * @param {Boolean} thirdParty should be true if the URL is a third-party request
+ * @return {Boolean} true in case of a match
+ */
+ matches: function(location, contentType, docDomain, thirdParty, privatenode)
+ {
+
+ if(this.subscriptions[0])
+ if (this.subscriptions[0].privateMode)
+ if (privatenode==false)
+ return false;
+
+ if (this.regexp.test(location) &&
+ (RegExpFilter.typeMap[contentType] & this.contentType) != 0 &&
+ (this.thirdParty == null || this.thirdParty == thirdParty) &&
+ this.isActiveOnDomain(docDomain))
+ {
+ return true;
+ }
+
+ return false;
+ }
+};
+
+RegExpFilter.prototype.__defineGetter__("0", function()
+{
+ return this;
+});
+
+/**
+ * Creates a RegExp filter from its text representation
+ * @param {String} text same as in Filter()
+ */
+RegExpFilter.fromText = function(text)
+{
+ let blocking = true;
+ let origText = text;
+ if (text.indexOf("@@") == 0)
+ {
+ blocking = false;
+ text = text.substr(2);
+ }
+
+ let contentType = null;
+ let matchCase = null;
+ let domains = null;
+ let siteKeys = null;
+ let thirdParty = null;
+ let collapse = null;
+ let options;
+ let match = (text.indexOf("$") >= 0 ? Filter.optionsRegExp.exec(text) : null);
+ if (match)
+ {
+ options = match[1].toUpperCase().split(",");
+ text = match.input.substr(0, match.index);
+ for (let option of options)
+ {
+ let value = null;
+ let separatorIndex = option.indexOf("=");
+ if (separatorIndex >= 0)
+ {
+ value = option.substr(separatorIndex + 1);
+ option = option.substr(0, separatorIndex);
+ }
+ option = option.replace(/-/, "_");
+ if (option in RegExpFilter.typeMap)
+ {
+ if (contentType == null)
+ contentType = 0;
+ contentType |= RegExpFilter.typeMap[option];
+ }
+ else if (option[0] == "~" && option.substr(1) in RegExpFilter.typeMap)
+ {
+ if (contentType == null)
+ contentType = RegExpFilter.prototype.contentType;
+ contentType &= ~RegExpFilter.typeMap[option.substr(1)];
+ }
+ else if (option == "MATCH_CASE")
+ matchCase = true;
+ else if (option == "~MATCH_CASE")
+ matchCase = false;
+ else if (option == "DOMAIN" && typeof value != "undefined")
+ domains = value;
+ else if (option == "THIRD_PARTY")
+ thirdParty = true;
+ else if (option == "~THIRD_PARTY")
+ thirdParty = false;
+ else if (option == "COLLAPSE")
+ collapse = true;
+ else if (option == "~COLLAPSE")
+ collapse = false;
+ else if (option == "SITEKEY" && typeof value != "undefined")
+ siteKeys = value.split(/\|/);
+ else
+ return new InvalidFilter(origText, "Unknown option " + option.toLowerCase());
+ }
+ }
+
+ if (!blocking && (contentType == null || (contentType & RegExpFilter.typeMap.DOCUMENT)) &&
+ (!options || options.indexOf("DOCUMENT") < 0) && !/^\|?[\w\-]+:/.test(text))
+ {
+ // Exception filters shouldn't apply to pages by default unless they start with a protocol name
+ if (contentType == null)
+ contentType = RegExpFilter.prototype.contentType;
+ contentType &= ~RegExpFilter.typeMap.DOCUMENT;
+ }
+ if (!blocking && siteKeys)
+ contentType = RegExpFilter.typeMap.DOCUMENT;
+
+ try
+ {
+ if (blocking)
+ return new BlockingFilter(origText, text, contentType, matchCase, domains, thirdParty, collapse);
+ else
+ return new WhitelistFilter(origText, text, contentType, matchCase, domains, thirdParty, siteKeys);
+ }
+ catch (e)
+ {
+ return new InvalidFilter(origText, e);
+ }
+}
+
+/**
+ * Maps type strings like "SCRIPT" or "OBJECT" to bit masks
+ */
+RegExpFilter.typeMap = {
+ OTHER: 1,
+ SCRIPT: 2,
+ IMAGE: 4,
+ STYLESHEET: 8,
+ OBJECT: 16,
+ SUBDOCUMENT: 32,
+ DOCUMENT: 64,
+ XBL: 1,
+ PING: 1,
+ XMLHTTPREQUEST: 2048,
+ OBJECT_SUBREQUEST: 4096,
+ DTD: 1,
+ MEDIA: 16384,
+ FONT: 32768,
+
+ BACKGROUND: 4, // Backwards compat, same as IMAGE
+
+ POPUP: 0x10000000,
+ ELEMHIDE: 0x40000000
+};
+
+// ELEMHIDE, POPUP option shouldn't be there by default
+RegExpFilter.prototype.contentType &= ~(RegExpFilter.typeMap.ELEMHIDE | RegExpFilter.typeMap.POPUP);
+
+/**
+ * Class for blocking filters
+ * @param {String} text see Filter()
+ * @param {String} regexpSource see RegExpFilter()
+ * @param {Number} contentType see RegExpFilter()
+ * @param {Boolean} matchCase see RegExpFilter()
+ * @param {String} domains see RegExpFilter()
+ * @param {Boolean} thirdParty see RegExpFilter()
+ * @param {Boolean} collapse defines whether the filter should collapse blocked content, can be null
+ * @constructor
+ * @augments RegExpFilter
+ */
+function BlockingFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, collapse)
+{
+ RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty);
+
+ this.collapse = collapse;
+}
+exports.BlockingFilter = BlockingFilter;
+
+BlockingFilter.prototype =
+{
+ __proto__: RegExpFilter.prototype,
+
+ /**
+ * Defines whether the filter should collapse blocked content. Can be null (use the global preference).
+ * @type Boolean
+ */
+ collapse: null
+};
+
+/**
+ * Class for whitelist filters
+ * @param {String} text see Filter()
+ * @param {String} regexpSource see RegExpFilter()
+ * @param {Number} contentType see RegExpFilter()
+ * @param {Boolean} matchCase see RegExpFilter()
+ * @param {String} domains see RegExpFilter()
+ * @param {Boolean} thirdParty see RegExpFilter()
+ * @param {String[]} siteKeys public keys of websites that this filter should apply to
+ * @constructor
+ * @augments RegExpFilter
+ */
+function WhitelistFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, siteKeys)
+{
+ RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty);
+
+ if (siteKeys != null)
+ this.siteKeys = siteKeys;
+}
+exports.WhitelistFilter = WhitelistFilter;
+
+WhitelistFilter.prototype =
+{
+ __proto__: RegExpFilter.prototype,
+
+ /**
+ * List of public keys of websites that this filter should apply to
+ * @type String[]
+ */
+ siteKeys: null
+}
+
+/**
+ * Base class for element hiding filters
+ * @param {String} text see Filter()
+ * @param {String} domains (optional) Host names or domains the filter should be restricted to
+ * @param {String} selector CSS selector for the HTML elements that should be hidden
+ * @constructor
+ * @augments ActiveFilter
+ */
+function ElemHideBase(text, domains, selector)
+{
+ ActiveFilter.call(this, text, domains || null);
+
+ if (domains)
+ this.selectorDomain = domains.replace(/,~[^,]+/g, "").replace(/^~[^,]+,?/, "").toLowerCase();
+ this.selector = selector;
+}
+exports.ElemHideBase = ElemHideBase;
+
+ElemHideBase.prototype =
+{
+ __proto__: ActiveFilter.prototype,
+
+ /**
+ * @see ActiveFilter.domainSeparator
+ */
+ domainSeparator: ",",
+
+ /**
+ * @see ActiveFilter.ignoreTrailingDot
+ */
+ ignoreTrailingDot: false,
+
+ /**
+ * Host name or domain the filter should be restricted to (can be null for no restriction)
+ * @type String
+ */
+ selectorDomain: null,
+ /**
+ * CSS selector for the HTML elements that should be hidden
+ * @type String
+ */
+ selector: null
+};
+
+/**
+ * Creates an element hiding filter from a pre-parsed text representation
+ *
+ * @param {String} text same as in Filter()
+ * @param {String} domain domain part of the text representation (can be empty)
+ * @param {String} tagName tag name part (can be empty)
+ * @param {String} attrRules attribute matching rules (can be empty)
+ * @param {String} selector raw CSS selector (can be empty)
+ * @return {ElemHideFilter|ElemHideException|InvalidFilter}
+ */
+ElemHideBase.fromText = function(text, domain, isException, tagName, attrRules, selector)
+{
+ if (!selector)
+ {
+ if (tagName == "*")
+ tagName = "";
+
+ let id = null;
+ let additional = "";
+ if (attrRules) {
+ attrRules = attrRules.match(/\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\)/g);
+ for (let rule of attrRules) {
+ rule = rule.substr(1, rule.length - 2);
+ let separatorPos = rule.indexOf("=");
+ if (separatorPos > 0) {
+ rule = rule.replace(/=/, '="') + '"';
+ additional += "[" + rule + "]";
+ }
+ else {
+ if (id)
+ {
+ let {Utils} = require("utils");
+ return new InvalidFilter(text, Utils.getString("filter_elemhide_duplicate_id"));
+ }
+ else
+ id = rule;
+ }
+ }
+ }
+
+ if (id)
+ selector = tagName + "." + id + additional + "," + tagName + "#" + id + additional;
+ else if (tagName || additional)
+ selector = tagName + additional;
+ else
+ {
+ let {Utils} = require("utils");
+ return new InvalidFilter(text, Utils.getString("filter_elemhide_nocriteria"));
+ }
+ }
+ if (isException)
+ return new ElemHideException(text, domain, selector);
+ else
+ return new ElemHideFilter(text, domain, selector);
+}
+
+/**
+ * Class for element hiding filters
+ * @param {String} text see Filter()
+ * @param {String} domains see ElemHideBase()
+ * @param {String} selector see ElemHideBase()
+ * @constructor
+ * @augments ElemHideBase
+ */
+function ElemHideFilter(text, domains, selector)
+{
+ ElemHideBase.call(this, text, domains, selector);
+}
+exports.ElemHideFilter = ElemHideFilter;
+
+ElemHideFilter.prototype =
+{
+ __proto__: ElemHideBase.prototype
+};
+
+/**
+ * Class for element hiding exceptions
+ * @param {String} text see Filter()
+ * @param {String} domains see ElemHideBase()
+ * @param {String} selector see ElemHideBase()
+ * @constructor
+ * @augments ElemHideBase
+ */
+function ElemHideException(text, domains, selector)
+{
+ ElemHideBase.call(this, text, domains, selector);
+}
+exports.ElemHideException = ElemHideException;
+
+ElemHideException.prototype =
+{
+ __proto__: ElemHideBase.prototype
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterListener.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterListener.js
new file mode 100644
index 0000000..1687a26
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterListener.js
@@ -0,0 +1,282 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Component synchronizing filter storage with Matcher instances and ElemHide.
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {TimeLine} = require("timeline");
+let {FilterStorage} = require("filterStorage");
+let {FilterNotifier} = require("filterNotifier");
+let {ElemHide} = require("elemHide");
+let {defaultMatcher} = require("matcher");
+let {ActiveFilter, RegExpFilter, ElemHideBase} = require("filterClasses");
+let {Prefs} = require("prefs");
+
+/**
+ * Value of the FilterListener.batchMode property.
+ * @type Boolean
+ */
+let batchMode = false;
+
+/**
+ * Increases on filter changes, filters will be saved if it exceeds 1.
+ * @type Integer
+ */
+let isDirty = 0;
+
+/**
+ * This object can be used to change properties of the filter change listeners.
+ * @class
+ */
+let FilterListener =
+{
+ /**
+ * Set to true when executing many changes, changes will only be fully applied after this variable is set to false again.
+ * @type Boolean
+ */
+ get batchMode()
+ {
+ return batchMode;
+ },
+ set batchMode(value)
+ {
+ batchMode = value;
+ flushElemHide();
+ },
+
+ /**
+ * Increases "dirty factor" of the filters and calls FilterStorage.saveToDisk()
+ * if it becomes 1 or more. Save is executed delayed to prevent multiple
+ * subsequent calls. If the parameter is 0 it forces saving filters if any
+ * changes were recorded after the previous save.
+ */
+ setDirty: function(/**Integer*/ factor)
+ {
+ if (factor == 0 && isDirty > 0)
+ isDirty = 1;
+ else
+ isDirty += factor;
+ if (isDirty >= 1)
+ FilterStorage.saveToDisk();
+ }
+};
+
+/**
+ * Observer listening to history purge actions.
+ * @class
+ */
+let HistoryPurgeObserver =
+{
+ observe: function(subject, topic, data)
+ {
+ if (topic == "browser:purge-session-history" && Prefs.clearStatsOnHistoryPurge)
+ {
+ FilterStorage.resetHitCounts();
+ FilterListener.setDirty(0); // Force saving to disk
+
+ Prefs.recentReports = [];
+ }
+ },
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver])
+};
+
+/**
+ * Initializes filter listener on startup, registers the necessary hooks.
+ */
+function init()
+{
+ TimeLine.enter("Entered filter listener initialization()");
+
+ FilterNotifier.addListener(function(action, item, newValue, oldValue)
+ {
+ let match = /^(\w+)\.(.*)/.exec(action);
+ if (match && match[1] == "filter")
+ onFilterChange(match[2], item, newValue, oldValue);
+ else if (match && match[1] == "subscription")
+ onSubscriptionChange(match[2], item, newValue, oldValue);
+ else
+ onGenericChange(action, item);
+ });
+
+ if ("nsIStyleSheetService" in Ci)
+ ElemHide.init();
+ else
+ flushElemHide = function() {}; // No global stylesheet in Chrome & Co.
+ FilterStorage.loadFromDisk();
+
+ TimeLine.log("done initializing data structures");
+
+ Services.obs.addObserver(HistoryPurgeObserver, "browser:purge-session-history", true);
+ onShutdown.add(function()
+ {
+ Services.obs.removeObserver(HistoryPurgeObserver, "browser:purge-session-history");
+ });
+ TimeLine.log("done adding observers");
+
+ TimeLine.leave("Filter listener initialization done");
+}
+init();
+
+/**
+ * Calls ElemHide.apply() if necessary.
+ */
+function flushElemHide()
+{
+ if (!batchMode && ElemHide.isDirty)
+ ElemHide.apply();
+}
+
+/**
+ * Notifies Matcher instances or ElemHide object about a new filter
+ * if necessary.
+ * @param {Filter} filter filter that has been added
+ */
+function addFilter(filter)
+{
+ if (!(filter instanceof ActiveFilter) || filter.disabled)
+ return;
+
+ let hasEnabled = false;
+ for (let i = 0; i < filter.subscriptions.length; i++)
+ if (!filter.subscriptions[i].disabled)
+ hasEnabled = true;
+ if (!hasEnabled)
+ return;
+
+ if (filter instanceof RegExpFilter)
+ defaultMatcher.add(filter);
+ else if (filter instanceof ElemHideBase)
+ ElemHide.add(filter);
+}
+
+/**
+ * Notifies Matcher instances or ElemHide object about removal of a filter
+ * if necessary.
+ * @param {Filter} filter filter that has been removed
+ */
+function removeFilter(filter)
+{
+ if (!(filter instanceof ActiveFilter))
+ return;
+
+ if (!filter.disabled)
+ {
+ let hasEnabled = false;
+ for (let i = 0; i < filter.subscriptions.length; i++)
+ if (!filter.subscriptions[i].disabled)
+ hasEnabled = true;
+ if (hasEnabled)
+ return;
+ }
+
+ if (filter instanceof RegExpFilter)
+ defaultMatcher.remove(filter);
+ else if (filter instanceof ElemHideBase)
+ ElemHide.remove(filter);
+}
+
+/**
+ * Subscription change listener
+ */
+function onSubscriptionChange(action, subscription, newValue, oldValue)
+{
+ FilterListener.setDirty(1);
+
+ if (action != "added" && action != "removed" && action != "disabled" && action != "updated")
+ return;
+
+ if (action != "removed" && !(subscription.url in FilterStorage.knownSubscriptions))
+ {
+ // Ignore updates for subscriptions not in the list
+ return;
+ }
+
+ if ((action == "added" || action == "removed" || action == "updated") && subscription.disabled)
+ {
+ // Ignore adding/removing/updating of disabled subscriptions
+ return;
+ }
+
+ if (action == "added" || action == "removed" || action == "disabled")
+ {
+ let method = (action == "added" || (action == "disabled" && newValue == false) ? addFilter : removeFilter);
+ if (subscription.filters)
+ subscription.filters.forEach(method);
+ }
+ else if (action == "updated")
+ {
+ subscription.oldFilters.forEach(removeFilter);
+ subscription.filters.forEach(addFilter);
+ }
+
+ flushElemHide();
+}
+
+/**
+ * Filter change listener
+ */
+function onFilterChange(action, filter, newValue, oldValue)
+{
+ if (action == "hitCount" && newValue == 0)
+ {
+ // Filter hits are being reset, make sure these changes are saved.
+ FilterListener.setDirty(0);
+ }
+ else if (action == "hitCount" || action == "lastHit")
+ FilterListener.setDirty(0.002);
+ else
+ FilterListener.setDirty(1);
+
+ if (action != "added" && action != "removed" && action != "disabled")
+ return;
+
+ if ((action == "added" || action == "removed") && filter.disabled)
+ {
+ // Ignore adding/removing of disabled filters
+ return;
+ }
+
+ if (action == "added" || (action == "disabled" && newValue == false))
+ addFilter(filter);
+ else
+ removeFilter(filter);
+ flushElemHide();
+}
+
+/**
+ * Generic notification listener
+ */
+function onGenericChange(action)
+{
+ if (action == "load")
+ {
+ isDirty = 0;
+
+ defaultMatcher.clear();
+ ElemHide.clear();
+ for (let subscription of FilterStorage.subscriptions)
+ if (!subscription.disabled)
+ subscription.filters.forEach(addFilter);
+ flushElemHide();
+ }
+ else if (action == "save")
+ isDirty = 0;
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterNotifier.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterNotifier.js
new file mode 100644
index 0000000..010081e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterNotifier.js
@@ -0,0 +1,73 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview This component manages listeners and calls them to distributes
+ * messages about filter changes.
+ */
+
+/**
+ * List of registered listeners
+ * @type Array of function(action, item, newValue, oldValue)
+ */
+let listeners = [];
+
+/**
+ * This class allows registering and triggering listeners for filter events.
+ * @class
+ */
+let FilterNotifier = exports.FilterNotifier =
+{
+ /**
+ * Adds a listener
+ */
+ addListener: function(/**function(action, item, newValue, oldValue)*/ listener)
+ {
+ if (listeners.indexOf(listener) >= 0)
+ return;
+
+ listeners.push(listener);
+ },
+
+ /**
+ * Removes a listener that was previosly added via addListener
+ */
+ removeListener: function(/**function(action, item, newValue, oldValue)*/ listener)
+ {
+ let index = listeners.indexOf(listener);
+ if (index >= 0)
+ listeners.splice(index, 1);
+ },
+
+ /**
+ * Notifies listeners about an event
+ * @param {String} action event code ("load", "save", "elemhideupdate",
+ * "subscription.added", "subscription.removed",
+ * "subscription.disabled", "subscription.title",
+ * "subscription.lastDownload", "subscription.downloadStatus",
+ * "subscription.homepage", "subscription.updated",
+ * "filter.added", "filter.removed", "filter.moved",
+ * "filter.disabled", "filter.hitCount", "filter.lastHit")
+ * @param {Subscription|Filter} item item that the change applies to
+ */
+ triggerListeners: function(action, item, param1, param2, param3)
+ {
+ let list = listeners.slice();
+ for (let listener of list)
+ listener(action, item, param1, param2, param3);
+ }
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterStorage.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterStorage.js
new file mode 100644
index 0000000..546f788
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/filterStorage.js
@@ -0,0 +1,897 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview FilterStorage class responsible for managing user's subscriptions and filters.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/FileUtils.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+let {IO} = require("io");
+let {Prefs} = require("prefs");
+let {Filter, ActiveFilter} = require("filterClasses");
+let {Subscription, SpecialSubscription, ExternalSubscription} = require("subscriptionClasses");
+let {FilterNotifier} = require("filterNotifier");
+let {Utils} = require("utils");
+let {TimeLine} = require("timeline");
+
+/**
+ * Version number of the filter storage file format.
+ * @type Integer
+ */
+let formatVersion = 4;
+
+/**
+ * This class reads user's filters from disk, manages them in memory and writes them back.
+ * @class
+ */
+let FilterStorage = exports.FilterStorage =
+{
+ /**
+ * Version number of the patterns.ini format used.
+ * @type Integer
+ */
+ get formatVersion()
+ {
+ return formatVersion;
+ },
+
+ /**
+ * File that the filter list has been loaded from and should be saved to
+ * @type nsIFile
+ */
+ get sourceFile()
+ {
+ let file = null;
+ if (Prefs.patternsfile)
+ {
+ // Override in place, use it instead of placing the file in the regular data dir
+ file = IO.resolveFilePath(Prefs.patternsfile);
+ }
+ if (!file)
+ {
+ // Place the file in the data dir
+ file = IO.resolveFilePath(Prefs.data_directory);
+ if (file)
+ file.append("patterns.ini");
+ }
+ if (!file)
+ {
+ // Data directory pref misconfigured? Try the default value
+ try
+ {
+ file = IO.resolveFilePath(Services.prefs.getDefaultBranch("extensions.adblockplus.").getCharPref("data_directory"));
+ if (file)
+ file.append("patterns.ini");
+ } catch(e) {}
+ }
+
+ if (!file)
+ Cu.reportError("Adblock Plus: Failed to resolve filter file location from extensions.adblockplus.patternsfile preference");
+
+ this.__defineGetter__("sourceFile", () => file);
+ return this.sourceFile;
+ },
+
+ /**
+ * Will be set to true if no patterns.ini file exists.
+ * @type Boolean
+ */
+ firstRun: false,
+
+ /**
+ * Map of properties listed in the filter storage file before the sections
+ * start. Right now this should be only the format version.
+ */
+ fileProperties: {__proto__: null},
+
+ /**
+ * List of filter subscriptions containing all filters
+ * @type Array of Subscription
+ */
+ subscriptions: [],
+
+ /**
+ * Map of subscriptions already on the list, by their URL/identifier
+ * @type Object
+ */
+ knownSubscriptions: {__proto__: null},
+
+ /**
+ * Finds the filter group that a filter should be added to by default. Will
+ * return null if this group doesn't exist yet.
+ */
+ getGroupForFilter: function(/**Filter*/ filter) /**SpecialSubscription*/
+ {
+ let generalSubscription = null;
+ for (let subscription of FilterStorage.subscriptions)
+ {
+ if (subscription instanceof SpecialSubscription && !subscription.disabled)
+ {
+ // Always prefer specialized subscriptions
+ if (subscription.isDefaultFor(filter))
+ return subscription;
+
+ // If this is a general subscription - store it as fallback
+ if (!generalSubscription && (!subscription.defaults || !subscription.defaults.length))
+ generalSubscription = subscription;
+ }
+ }
+ return generalSubscription;
+ },
+
+ /**
+ * Adds a filter subscription to the list
+ * @param {Subscription} subscription filter subscription to be added
+ * @param {Boolean} silent if true, no listeners will be triggered (to be used when filter list is reloaded)
+ */
+ addSubscription: function(subscription, silent)
+ {
+ if (subscription.url in FilterStorage.knownSubscriptions)
+ return;
+
+ FilterStorage.subscriptions.push(subscription);
+ FilterStorage.knownSubscriptions[subscription.url] = subscription;
+ addSubscriptionFilters(subscription);
+
+ if (!silent)
+ FilterNotifier.triggerListeners("subscription.added", subscription);
+ },
+
+ /**
+ * Removes a filter subscription from the list
+ * @param {Subscription} subscription filter subscription to be removed
+ * @param {Boolean} silent if true, no listeners will be triggered (to be used when filter list is reloaded)
+ */
+ removeSubscription: function(subscription, silent)
+ {
+ for (let i = 0; i < FilterStorage.subscriptions.length; i++)
+ {
+ if (FilterStorage.subscriptions[i].url == subscription.url)
+ {
+ removeSubscriptionFilters(subscription);
+
+ FilterStorage.subscriptions.splice(i--, 1);
+ delete FilterStorage.knownSubscriptions[subscription.url];
+ if (!silent)
+ FilterNotifier.triggerListeners("subscription.removed", subscription);
+ return;
+ }
+ }
+ },
+
+ /**
+ * Moves a subscription in the list to a new position.
+ * @param {Subscription} subscription filter subscription to be moved
+ * @param {Subscription} [insertBefore] filter subscription to insert before
+ * (if omitted the subscription will be put at the end of the list)
+ */
+ moveSubscription: function(subscription, insertBefore)
+ {
+ let currentPos = FilterStorage.subscriptions.indexOf(subscription);
+ if (currentPos < 0)
+ return;
+
+ let newPos = insertBefore ? FilterStorage.subscriptions.indexOf(insertBefore) : -1;
+ if (newPos < 0)
+ newPos = FilterStorage.subscriptions.length;
+
+ if (currentPos < newPos)
+ newPos--;
+ if (currentPos == newPos)
+ return;
+
+ FilterStorage.subscriptions.splice(currentPos, 1);
+ FilterStorage.subscriptions.splice(newPos, 0, subscription);
+ FilterNotifier.triggerListeners("subscription.moved", subscription);
+ },
+
+ /**
+ * Replaces the list of filters in a subscription by a new list
+ * @param {Subscription} subscription filter subscription to be updated
+ * @param {Array of Filter} filters new filter lsit
+ */
+ updateSubscriptionFilters: function(subscription, filters)
+ {
+ removeSubscriptionFilters(subscription);
+ subscription.oldFilters = subscription.filters;
+ subscription.filters = filters;
+ addSubscriptionFilters(subscription);
+ FilterNotifier.triggerListeners("subscription.updated", subscription);
+ delete subscription.oldFilters;
+ },
+
+ /**
+ * Adds a user-defined filter to the list
+ * @param {Filter} filter
+ * @param {SpecialSubscription} [subscription] particular group that the filter should be added to
+ * @param {Integer} [position] position within the subscription at which the filter should be added
+ * @param {Boolean} silent if true, no listeners will be triggered (to be used when filter list is reloaded)
+ */
+ addFilter: function(filter, subscription, position, silent)
+ {
+ if (!subscription)
+ {
+ if (filter.subscriptions.some(s => s instanceof SpecialSubscription && !s.disabled))
+ return; // No need to add
+ subscription = FilterStorage.getGroupForFilter(filter);
+ }
+ if (!subscription)
+ {
+ // No group for this filter exists, create one
+ subscription = SpecialSubscription.createForFilter(filter);
+ this.addSubscription(subscription);
+ return;
+ }
+
+ if (typeof position == "undefined")
+ position = subscription.filters.length;
+
+ if (filter.subscriptions.indexOf(subscription) < 0)
+ filter.subscriptions.push(subscription);
+ subscription.filters.splice(position, 0, filter);
+ if (!silent)
+ FilterNotifier.triggerListeners("filter.added", filter, subscription, position);
+ },
+
+ /**
+ * Removes a user-defined filter from the list
+ * @param {Filter} filter
+ * @param {SpecialSubscription} [subscription] a particular filter group that
+ * the filter should be removed from (if ommited will be removed from all subscriptions)
+ * @param {Integer} [position] position inside the filter group at which the
+ * filter should be removed (if ommited all instances will be removed)
+ */
+ removeFilter: function(filter, subscription, position)
+ {
+ let subscriptions = (subscription ? [subscription] : filter.subscriptions.slice());
+ for (let i = 0; i < subscriptions.length; i++)
+ {
+ let subscription = subscriptions[i];
+ if (subscription instanceof SpecialSubscription)
+ {
+ let positions = [];
+ if (typeof position == "undefined")
+ {
+ let index = -1;
+ do
+ {
+ index = subscription.filters.indexOf(filter, index + 1);
+ if (index >= 0)
+ positions.push(index);
+ } while (index >= 0);
+ }
+ else
+ positions.push(position);
+
+ for (let j = positions.length - 1; j >= 0; j--)
+ {
+ let position = positions[j];
+ if (subscription.filters[position] == filter)
+ {
+ subscription.filters.splice(position, 1);
+ if (subscription.filters.indexOf(filter) < 0)
+ {
+ let index = filter.subscriptions.indexOf(subscription);
+ if (index >= 0)
+ filter.subscriptions.splice(index, 1);
+ }
+ FilterNotifier.triggerListeners("filter.removed", filter, subscription, position);
+ }
+ }
+ }
+ }
+ },
+
+ /**
+ * Moves a user-defined filter to a new position
+ * @param {Filter} filter
+ * @param {SpecialSubscription} subscription filter group where the filter is located
+ * @param {Integer} oldPosition current position of the filter
+ * @param {Integer} newPosition new position of the filter
+ */
+ moveFilter: function(filter, subscription, oldPosition, newPosition)
+ {
+ if (!(subscription instanceof SpecialSubscription) || subscription.filters[oldPosition] != filter)
+ return;
+
+ newPosition = Math.min(Math.max(newPosition, 0), subscription.filters.length - 1);
+ if (oldPosition == newPosition)
+ return;
+
+ subscription.filters.splice(oldPosition, 1);
+ subscription.filters.splice(newPosition, 0, filter);
+ FilterNotifier.triggerListeners("filter.moved", filter, subscription, oldPosition, newPosition);
+ },
+
+ /**
+ * Increases the hit count for a filter by one
+ * @param {Filter} filter
+ * @param {Window} window Window that the match originated in (required
+ * to recognize private browsing mode)
+ */
+ increaseHitCount: function(filter, wnd)
+ {
+ if (!Prefs.savestats || PrivateBrowsing.enabledForWindow(wnd) ||
+ PrivateBrowsing.enabled || !(filter instanceof ActiveFilter))
+ {
+ return;
+ }
+
+ filter.hitCount++;
+ filter.lastHit = Date.now();
+ },
+
+ /**
+ * Resets hit count for some filters
+ * @param {Array of Filter} filters filters to be reset, if null all filters will be reset
+ */
+ resetHitCounts: function(filters)
+ {
+ if (!filters)
+ {
+ filters = [];
+ for (let text in Filter.knownFilters)
+ filters.push(Filter.knownFilters[text]);
+ }
+ for (let filter of filters)
+ {
+ filter.hitCount = 0;
+ filter.lastHit = 0;
+ }
+ },
+
+ _loading: false,
+
+ /**
+ * Loads all subscriptions from the disk
+ * @param {nsIFile} [sourceFile] File to read from
+ */
+ loadFromDisk: function(sourceFile)
+ {
+ if (this._loading)
+ return;
+
+ TimeLine.enter("Entered FilterStorage.loadFromDisk()");
+ this._loading = true;
+
+ let readFile = function(sourceFile, backupIndex)
+ {
+ TimeLine.enter("FilterStorage.loadFromDisk() -> readFile()");
+
+ let parser = new INIParser();
+ IO.readFromFile(sourceFile, parser, function(e)
+ {
+ TimeLine.enter("FilterStorage.loadFromDisk() read callback");
+ if (!e && parser.subscriptions.length == 0)
+ {
+ // No filter subscriptions in the file, this isn't right.
+ e = new Error("No data in the file");
+ }
+
+ if (e)
+ Cu.reportError(e);
+
+ if (e && !explicitFile)
+ {
+ // Attempt to load a backup
+ sourceFile = this.sourceFile;
+ if (sourceFile)
+ {
+ let [, part1, part2] = /^(.*)(\.\w+)$/.exec(sourceFile.leafName) || [null, sourceFile.leafName, ""];
+
+ sourceFile = sourceFile.clone();
+ sourceFile.leafName = part1 + "-backup" + (++backupIndex) + part2;
+
+ IO.statFile(sourceFile, function(e, statData)
+ {
+ if (!e && statData.exists)
+ readFile(sourceFile, backupIndex);
+ else
+ doneReading(parser);
+ });
+ TimeLine.leave("FilterStorage.loadFromDisk() read callback done");
+ return;
+ }
+ }
+ doneReading(parser);
+ }.bind(this), "FilterStorageRead");
+
+ TimeLine.leave("FilterStorage.loadFromDisk() <- readFile()", "FilterStorageRead");
+ }.bind(this);
+
+ var doneReading = function(parser)
+ {
+ // Old special groups might have been converted, remove them if they are empty
+ let specialMap = {"~il~": true, "~wl~": true, "~fl~": true, "~eh~": true};
+ let knownSubscriptions = {__proto__: null};
+ for (let i = 0; i < parser.subscriptions.length; i++)
+ {
+ let subscription = parser.subscriptions[i];
+ if (subscription instanceof SpecialSubscription && subscription.filters.length == 0 && subscription.url in specialMap)
+ parser.subscriptions.splice(i--, 1);
+ else
+ knownSubscriptions[subscription.url] = subscription;
+ }
+
+ this.fileProperties = parser.fileProperties;
+ this.subscriptions = parser.subscriptions;
+ this.knownSubscriptions = knownSubscriptions;
+ Filter.knownFilters = parser.knownFilters;
+ Subscription.knownSubscriptions = parser.knownSubscriptions;
+
+ if (parser.userFilters)
+ {
+ for (let i = 0; i < parser.userFilters.length; i++)
+ {
+ let filter = Filter.fromText(parser.userFilters[i]);
+ this.addFilter(filter, null, undefined, true);
+ }
+ }
+ TimeLine.log("Initializing data done, triggering observers")
+
+ this._loading = false;
+ FilterNotifier.triggerListeners("load");
+
+ if (sourceFile != this.sourceFile)
+ this.saveToDisk();
+
+ TimeLine.leave("FilterStorage.loadFromDisk() read callback done");
+ }.bind(this);
+
+ let explicitFile;
+ if (sourceFile)
+ {
+ explicitFile = true;
+ readFile(sourceFile, 0);
+ }
+ else
+ {
+ explicitFile = false;
+ sourceFile = FilterStorage.sourceFile;
+
+ let callback = function(e, statData)
+ {
+ if (e || !statData.exists)
+ {
+ this.firstRun = true;
+ this._loading = false;
+ FilterNotifier.triggerListeners("load");
+
+ TimeLine.leave("FilterStorage.loadFromDisk() read callback done");
+ }
+ else
+ readFile(sourceFile, 0);
+ }.bind(this);
+
+ if (sourceFile)
+ IO.statFile(sourceFile, callback);
+ else
+ callback(true);
+ }
+
+ TimeLine.leave("FilterStorage.loadFromDisk() done");
+ },
+
+ _generateFilterData: function(subscriptions)
+ {
+ yield "# Adblock Plus preferences";
+ yield "version=" + formatVersion;
+
+ let saved = {__proto__: null};
+ let buf = [];
+
+ // Save filter data
+ for (let i = 0; i < subscriptions.length; i++)
+ {
+ let subscription = subscriptions[i];
+ for (let j = 0; j < subscription.filters.length; j++)
+ {
+ let filter = subscription.filters[j];
+ if (!(filter.text in saved))
+ {
+ filter.serialize(buf);
+ saved[filter.text] = filter;
+ for (let k = 0; k < buf.length; k++)
+ yield buf[k];
+ buf.splice(0);
+ }
+ }
+ }
+
+ // Save subscriptions
+ for (let i = 0; i < subscriptions.length; i++)
+ {
+ let subscription = subscriptions[i];
+
+ yield "";
+
+ subscription.serialize(buf);
+ if (subscription.filters.length)
+ {
+ buf.push("", "[Subscription filters]")
+ subscription.serializeFilters(buf);
+ }
+ for (let k = 0; k < buf.length; k++)
+ yield buf[k];
+ buf.splice(0);
+ }
+ },
+
+ /**
+ * Will be set to true if saveToDisk() is running (reentrance protection).
+ * @type Boolean
+ */
+ _saving: false,
+
+ /**
+ * Will be set to true if a saveToDisk() call arrives while saveToDisk() is
+ * already running (delayed execution).
+ * @type Boolean
+ */
+ _needsSave: false,
+
+ /**
+ * Saves all subscriptions back to disk
+ * @param {nsIFile} [targetFile] File to be written
+ */
+ saveToDisk: function(targetFile)
+ {
+ let explicitFile = true;
+ if (!targetFile)
+ {
+ targetFile = FilterStorage.sourceFile;
+ explicitFile = false;
+ }
+ if (!targetFile)
+ return;
+
+ if (!explicitFile && this._saving)
+ {
+ this._needsSave = true;
+ return;
+ }
+
+ TimeLine.enter("Entered FilterStorage.saveToDisk()");
+
+ // Make sure the file's parent directory exists
+ try {
+ targetFile.parent.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
+ } catch (e) {}
+
+ let writeFilters = function()
+ {
+ TimeLine.enter("FilterStorage.saveToDisk() -> writeFilters()");
+ IO.writeToFile(targetFile, this._generateFilterData(subscriptions), function(e)
+ {
+ TimeLine.enter("FilterStorage.saveToDisk() write callback");
+ if (!explicitFile)
+ this._saving = false;
+
+ if (e)
+ Cu.reportError(e);
+
+ if (!explicitFile && this._needsSave)
+ {
+ this._needsSave = false;
+ this.saveToDisk();
+ }
+ else
+ FilterNotifier.triggerListeners("save");
+ TimeLine.leave("FilterStorage.saveToDisk() write callback done");
+ }.bind(this), "FilterStorageWrite");
+ TimeLine.leave("FilterStorage.saveToDisk() -> writeFilters()", "FilterStorageWrite");
+ }.bind(this);
+
+ let checkBackupRequired = function(callbackNotRequired, callbackRequired)
+ {
+ if (explicitFile || Prefs.patternsbackups <= 0)
+ callbackNotRequired();
+ else
+ {
+ IO.statFile(targetFile, function(e, statData)
+ {
+ if (e || !statData.exists)
+ callbackNotRequired();
+ else
+ {
+ let [, part1, part2] = /^(.*)(\.\w+)$/.exec(targetFile.leafName) || [null, targetFile.leafName, ""];
+ let newestBackup = targetFile.clone();
+ newestBackup.leafName = part1 + "-backup1" + part2;
+ IO.statFile(newestBackup, function(e, statData)
+ {
+ if (!e && (!statData.exists || (Date.now() - statData.lastModified) / 3600000 >= Prefs.patternsbackupinterval))
+ callbackRequired(part1, part2)
+ else
+ callbackNotRequired();
+ });
+ }
+ });
+ }
+ }.bind(this);
+
+ let removeLastBackup = function(part1, part2)
+ {
+ TimeLine.enter("FilterStorage.saveToDisk() -> removeLastBackup()");
+ let file = targetFile.clone();
+ file.leafName = part1 + "-backup" + Prefs.patternsbackups + part2;
+ IO.removeFile(file, (e) => renameBackup(part1, part2, Prefs.patternsbackups - 1));
+ TimeLine.leave("FilterStorage.saveToDisk() <- removeLastBackup()");
+ }.bind(this);
+
+ let renameBackup = function(part1, part2, index)
+ {
+ TimeLine.enter("FilterStorage.saveToDisk() -> renameBackup()");
+ if (index > 0)
+ {
+ let fromFile = targetFile.clone();
+ fromFile.leafName = part1 + "-backup" + index + part2;
+
+ let toName = part1 + "-backup" + (index + 1) + part2;
+
+ IO.renameFile(fromFile, toName, (e) => renameBackup(part1, part2, index - 1));
+ }
+ else
+ {
+ let toFile = targetFile.clone();
+ toFile.leafName = part1 + "-backup" + (index + 1) + part2;
+
+ IO.copyFile(targetFile, toFile, writeFilters);
+ }
+ TimeLine.leave("FilterStorage.saveToDisk() <- renameBackup()");
+ }.bind(this);
+
+ // Do not persist external subscriptions
+ let subscriptions = this.subscriptions.filter((s) => !(s instanceof ExternalSubscription));
+ if (!explicitFile)
+ this._saving = true;
+
+ checkBackupRequired(writeFilters, removeLastBackup);
+
+ TimeLine.leave("FilterStorage.saveToDisk() done");
+ },
+
+ /**
+ * Returns the list of existing backup files.
+ */
+ getBackupFiles: function() /**nsIFile[]*/
+ {
+ // TODO: This method should be asynchronous
+ let result = [];
+
+ let [, part1, part2] = /^(.*)(\.\w+)$/.exec(FilterStorage.sourceFile.leafName) || [null, FilterStorage.sourceFile.leafName, ""];
+ for (let i = 1; ; i++)
+ {
+ let file = FilterStorage.sourceFile.clone();
+ file.leafName = part1 + "-backup" + i + part2;
+ if (file.exists())
+ result.push(file);
+ else
+ break;
+ }
+ return result;
+ }
+};
+
+/**
+ * Joins subscription's filters to the subscription without any notifications.
+ * @param {Subscription} subscription filter subscription that should be connected to its filters
+ */
+function addSubscriptionFilters(subscription)
+{
+ if (!(subscription.url in FilterStorage.knownSubscriptions))
+ return;
+
+ for (let filter of subscription.filters)
+ filter.subscriptions.push(subscription);
+}
+
+/**
+ * Removes subscription's filters from the subscription without any notifications.
+ * @param {Subscription} subscription filter subscription to be removed
+ */
+function removeSubscriptionFilters(subscription)
+{
+ if (!(subscription.url in FilterStorage.knownSubscriptions))
+ return;
+
+ for (let filter of subscription.filters)
+ {
+ let i = filter.subscriptions.indexOf(subscription);
+ if (i >= 0)
+ filter.subscriptions.splice(i, 1);
+ }
+}
+
+/**
+ * Observer listening to private browsing mode changes.
+ * @class
+ */
+let PrivateBrowsing = exports.PrivateBrowsing =
+{
+ /**
+ * Will be set to true when the private browsing mode is switched on globally.
+ * @type Boolean
+ */
+ enabled: false,
+
+ /**
+ * Checks whether private browsing is enabled for a particular window.
+ */
+ enabledForWindow: function(/**Window*/ wnd) /**Boolean*/
+ {
+ try
+ {
+ return wnd.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsILoadContext)
+ .usePrivateBrowsing;
+ }
+ catch (e)
+ {
+ // Gecko 19 and below will throw NS_NOINTERFACE, this is expected
+ if (e.result != Cr.NS_NOINTERFACE)
+ Cu.reportError(e);
+ return false;
+ }
+ },
+
+ init: function()
+ {
+ if ("@mozilla.org/privatebrowsing;1" in Cc)
+ {
+ try
+ {
+ this.enabled = Cc["@mozilla.org/privatebrowsing;1"].getService(Ci.nsIPrivateBrowsingService).privateBrowsingEnabled;
+ Services.obs.addObserver(this, "private-browsing", true);
+ onShutdown.add(function()
+ {
+ Services.obs.removeObserver(this, "private-browsing");
+ }.bind(this));
+ }
+ catch(e)
+ {
+ Cu.reportError(e);
+ }
+ }
+ },
+
+ observe: function(subject, topic, data)
+ {
+ if (topic == "private-browsing")
+ {
+ if (data == "enter")
+ this.enabled = true;
+ else if (data == "exit")
+ this.enabled = false;
+ }
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver])
+};
+PrivateBrowsing.init();
+
+/**
+ * IO.readFromFile() listener to parse filter data.
+ * @constructor
+ */
+function INIParser()
+{
+ this.fileProperties = this.curObj = {};
+ this.subscriptions = [];
+ this.knownFilters = {__proto__: null};
+ this.knownSubscriptions = {__proto__: null};
+}
+INIParser.prototype =
+{
+ linesProcessed: 0,
+ subscriptions: null,
+ knownFilters: null,
+ knownSubscriptions : null,
+ wantObj: true,
+ fileProperties: null,
+ curObj: null,
+ curSection: null,
+ userFilters: null,
+
+ process: function(val)
+ {
+ let origKnownFilters = Filter.knownFilters;
+ Filter.knownFilters = this.knownFilters;
+ let origKnownSubscriptions = Subscription.knownSubscriptions;
+ Subscription.knownSubscriptions = this.knownSubscriptions;
+ let match;
+ try
+ {
+ if (this.wantObj === true && (match = /^(\w+)=(.*)$/.exec(val)))
+ this.curObj[match[1]] = match[2];
+ else if (val === null || (match = /^\s*\[(.+)\]\s*$/.exec(val)))
+ {
+ if (this.curObj)
+ {
+ // Process current object before going to next section
+ switch (this.curSection)
+ {
+ case "filter":
+ case "pattern":
+ if ("text" in this.curObj)
+ Filter.fromObject(this.curObj);
+ break;
+ case "subscription":
+ let subscription = Subscription.fromObject(this.curObj);
+ if (subscription)
+ this.subscriptions.push(subscription);
+ break;
+ case "subscription filters":
+ case "subscription patterns":
+ if (this.subscriptions.length)
+ {
+ let subscription = this.subscriptions[this.subscriptions.length - 1];
+ for (let text of this.curObj)
+ {
+ let filter = Filter.fromText(text);
+ subscription.filters.push(filter);
+ filter.subscriptions.push(subscription);
+ }
+ }
+ break;
+ case "user patterns":
+ this.userFilters = this.curObj;
+ break;
+ }
+ }
+
+ if (val === null)
+ return;
+
+ this.curSection = match[1].toLowerCase();
+ switch (this.curSection)
+ {
+ case "filter":
+ case "pattern":
+ case "subscription":
+ this.wantObj = true;
+ this.curObj = {};
+ break;
+ case "subscription filters":
+ case "subscription patterns":
+ case "user patterns":
+ this.wantObj = false;
+ this.curObj = [];
+ break;
+ default:
+ this.wantObj = undefined;
+ this.curObj = null;
+ }
+ }
+ else if (this.wantObj === false && val)
+ this.curObj.push(val.replace(/\\\[/g, "["));
+ }
+ finally
+ {
+ Filter.knownFilters = origKnownFilters;
+ Subscription.knownSubscriptions = origKnownSubscriptions;
+ }
+
+ // Allow events to be processed every now and then.
+ // Note: IO.readFromFile() will deal with the potential reentrance here.
+ this.linesProcessed++;
+ if (this.linesProcessed % 1000 == 0)
+ Utils.yield();
+ }
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/io.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/io.js
new file mode 100644
index 0000000..ea362b7
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/io.js
@@ -0,0 +1,365 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Module containing file I/O helpers.
+ */
+
+let {Services} = Cu.import("resource://gre/modules/Services.jsm", null);
+let {FileUtils} = Cu.import("resource://gre/modules/FileUtils.jsm", null);
+let {OS} = Cu.import("resource://gre/modules/osfile.jsm", null);
+let {Task} = Cu.import("resource://gre/modules/Task.jsm", null);
+
+let {TimeLine} = require("timeline");
+let {Prefs} = require("prefs");
+let {Utils} = require("utils");
+
+let firstRead = true;
+const BUFFER_SIZE = 0x8000; // 32kB
+
+let IO = exports.IO =
+{
+ /**
+ * Retrieves the platform-dependent line break string.
+ */
+ get lineBreak()
+ {
+ let lineBreak = (Services.appinfo.OS == "WINNT" ? "\r\n" : "\n");
+ delete IO.lineBreak;
+ IO.__defineGetter__("lineBreak", () => lineBreak);
+ return IO.lineBreak;
+ },
+
+ /**
+ * Tries to interpret a file path as an absolute path or a path relative to
+ * user's profile. Returns a file or null on failure.
+ */
+ resolveFilePath: function(/**String*/ path) /**nsIFile*/
+ {
+ if (!path)
+ return null;
+
+ try {
+ // Assume an absolute path first
+ return new FileUtils.File(path);
+ } catch (e) {}
+
+ try {
+ // Try relative path now
+ return FileUtils.getFile("ProfD", path.split("/"));
+ } catch (e) {}
+
+ return null;
+ },
+
+ /**
+ * Reads strings from a file asynchronously, calls listener.process() with
+ * each line read and with a null parameter once the read operation is done.
+ * The callback will be called when the operation is done.
+ */
+ readFromFile: function(/**nsIFile*/ file, /**Object*/ listener, /**Function*/ callback, /**String*/ timeLineID)
+ {
+ try
+ {
+ let processing = false;
+ let buffer = "";
+ let loaded = false;
+ let error = null;
+
+ let onProgress = function(data)
+ {
+ if (timeLineID)
+ {
+ TimeLine.asyncStart(timeLineID);
+ }
+
+ let index = (processing ? -1 : Math.max(data.lastIndexOf("\n"), data.lastIndexOf("\r")));
+ if (index >= 0)
+ {
+ // Protect against reentrance in case the listener processes events.
+ processing = true;
+ try
+ {
+ let oldBuffer = buffer;
+ buffer = data.substr(index + 1);
+ data = data.substr(0, index + 1);
+ let lines = data.split(/[\r\n]+/);
+ lines.pop();
+ lines[0] = oldBuffer + lines[0];
+ for (let i = 0; i < lines.length; i++)
+ listener.process(lines[i]);
+ }
+ finally
+ {
+ processing = false;
+ data = buffer;
+ buffer = "";
+ onProgress(data);
+
+ if (loaded)
+ {
+ loaded = false;
+ onSuccess();
+ }
+
+ if (error)
+ {
+ let param = error;
+ error = null;
+ onError(param);
+ }
+ }
+ }
+ else
+ buffer += data;
+
+ if (timeLineID)
+ {
+ TimeLine.asyncEnd(timeLineID);
+ }
+ };
+
+ let onSuccess = function()
+ {
+ if (processing)
+ {
+ // Still processing data, delay processing this event.
+ loaded = true;
+ return;
+ }
+
+ if (timeLineID)
+ {
+ TimeLine.asyncStart(timeLineID);
+ }
+
+ if (buffer !== "")
+ listener.process(buffer);
+ listener.process(null);
+
+ if (timeLineID)
+ {
+ TimeLine.asyncEnd(timeLineID);
+ TimeLine.asyncDone(timeLineID);
+ }
+
+ callback(null);
+ };
+
+ let onError = function(e)
+ {
+ if (processing)
+ {
+ // Still processing data, delay processing this event.
+ error = e;
+ return;
+ }
+
+ callback(e);
+
+ if (timeLineID)
+ {
+ TimeLine.asyncDone(timeLineID);
+ }
+ };
+
+ let decoder = new TextDecoder();
+ let array = new Uint8Array(BUFFER_SIZE);
+ Task.spawn(function()
+ {
+ if (firstRead && Services.vc.compare(Utils.platformVersion, "23.0a1") <= 0)
+ {
+ // See https://issues.adblockplus.org/ticket/530 - the first file
+ // opened cannot be closed due to Gecko bug 858723. Make sure that
+ // our patterns.ini file doesn't stay locked by opening a dummy file
+ // first.
+ try
+ {
+ let dummyPath = IO.resolveFilePath(Prefs.data_directory + "/dummy").path;
+ let dummy = yield OS.File.open(dummyPath, {write: true, truncate: true});
+ yield dummy.close();
+ }
+ catch (e)
+ {
+ // Dummy might be locked already, we don't care
+ }
+ }
+ firstRead = false;
+
+ let f = yield OS.File.open(file.path, {read: true});
+ let numBytes;
+ do
+ {
+ numBytes = yield f.readTo(array);
+ if (numBytes)
+ {
+ let data = decoder.decode(numBytes == BUFFER_SIZE ?
+ array :
+ array.subarray(0, numBytes), {stream: true});
+ onProgress(data);
+ }
+ } while (numBytes);
+
+ yield f.close();
+ }.bind(this)).then(onSuccess, onError);
+ }
+ catch (e)
+ {
+ callback(e);
+ }
+ },
+
+ /**
+ * Writes string data to a file in UTF-8 format asynchronously. The callback
+ * will be called when the write operation is done.
+ */
+ writeToFile: function(/**nsIFile*/ file, /**Iterator*/ data, /**Function*/ callback, /**String*/ timeLineID)
+ {
+ try
+ {
+ let encoder = new TextEncoder();
+
+ Task.spawn(function()
+ {
+ // This mimics OS.File.writeAtomic() but writes in chunks.
+ let tmpPath = file.path + ".tmp";
+ let f = yield OS.File.open(tmpPath, {write: true, truncate: true});
+
+ let buf = [];
+ let bufLen = 0;
+ let lineBreak = this.lineBreak;
+
+ function writeChunk()
+ {
+ let array = encoder.encode(buf.join(lineBreak) + lineBreak);
+ buf = [];
+ bufLen = 0;
+ return f.write(array);
+ }
+
+ for (let line in data)
+ {
+ buf.push(line);
+ bufLen += line.length;
+ if (bufLen >= BUFFER_SIZE)
+ yield writeChunk();
+ }
+
+ if (bufLen)
+ yield writeChunk();
+
+ // OS.File.flush() isn't exposed prior to Gecko 27, see bug 912457.
+ if (typeof f.flush == "function")
+ yield f.flush();
+ yield f.close();
+ yield OS.File.move(tmpPath, file.path, {noCopy: true});
+ }.bind(this)).then(callback.bind(null, null), callback);
+ }
+ catch (e)
+ {
+ callback(e);
+ }
+ },
+
+ /**
+ * Copies a file asynchronously. The callback will be called when the copy
+ * operation is done.
+ */
+ copyFile: function(/**nsIFile*/ fromFile, /**nsIFile*/ toFile, /**Function*/ callback)
+ {
+ try
+ {
+ let promise = OS.File.copy(fromFile.path, toFile.path);
+ promise.then(callback.bind(null, null), callback);
+ }
+ catch (e)
+ {
+ callback(e);
+ }
+ },
+
+ /**
+ * Renames a file within the same directory, will call callback when done.
+ */
+ renameFile: function(/**nsIFile*/ fromFile, /**String*/ newName, /**Function*/ callback)
+ {
+ try
+ {
+ toFile = fromFile.clone();
+ toFile.leafName = newName;
+ let promise = OS.File.move(fromFile.path, toFile.path);
+ promise.then(callback.bind(null, null), callback);
+ }
+ catch(e)
+ {
+ callback(e);
+ }
+ },
+
+ /**
+ * Removes a file, will call callback when done.
+ */
+ removeFile: function(/**nsIFile*/ file, /**Function*/ callback)
+ {
+ try
+ {
+ let promise = OS.File.remove(file.path);
+ promise.then(callback.bind(null, null), callback);
+ }
+ catch(e)
+ {
+ callback(e);
+ }
+ },
+
+ /**
+ * Gets file information such as whether the file exists.
+ */
+ statFile: function(/**nsIFile*/ file, /**Function*/ callback)
+ {
+ try
+ {
+ let promise = OS.File.stat(file.path);
+ promise.then(function onSuccess(info)
+ {
+ callback(null, {
+ exists: true,
+ isDirectory: info.isDir,
+ isFile: !info.isDir,
+ lastModified: info.lastModificationDate.getTime()
+ });
+ }, function onError(e)
+ {
+ if (e.becauseNoSuchFile)
+ {
+ callback(null, {
+ exists: false,
+ isDirectory: false,
+ isFile: false,
+ lastModified: 0
+ });
+ }
+ else
+ callback(e);
+ });
+ }
+ catch(e)
+ {
+ callback(e);
+ }
+ }
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/keySelector.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/keySelector.js
new file mode 100644
index 0000000..20847d9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/keySelector.js
@@ -0,0 +1,228 @@
+/*
+ * This file is part of the Adblock Plus build tools,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+let validModifiers =
+{
+ ACCEL: null,
+ CTRL: "control",
+ CONTROL: "control",
+ SHIFT: "shift",
+ ALT: "alt",
+ META: "meta",
+ __proto__: null
+};
+
+/**
+ * Sets the correct value of validModifiers.ACCEL.
+ */
+function initAccelKey()
+{
+ validModifiers.ACCEL = "control";
+ try
+ {
+ let accelKey = Services.prefs.getIntPref("ui.key.accelKey");
+ if (accelKey == Ci.nsIDOMKeyEvent.DOM_VK_CONTROL)
+ validModifiers.ACCEL = "control";
+ else if (accelKey == Ci.nsIDOMKeyEvent.DOM_VK_ALT)
+ validModifiers.ACCEL = "alt";
+ else if (accelKey == Ci.nsIDOMKeyEvent.DOM_VK_META)
+ validModifiers.ACCEL = "meta";
+ }
+ catch(e)
+ {
+ Cu.reportError(e);
+ }
+}
+
+exports.KeySelector = KeySelector;
+
+/**
+ * This class provides capabilities to find and use available keyboard shortcut
+ * keys.
+ * @param {ChromeWindow} window the window where to look up existing shortcut
+ * keys
+ * @constructor
+ */
+function KeySelector(window)
+{
+ this._initExistingShortcuts(window);
+}
+KeySelector.prototype =
+{
+ /**
+ * Map listing existing shortcut keys as its keys.
+ * @type Object
+ */
+ _existingShortcuts: null,
+
+ /**
+ * Sets up _existingShortcuts property for a window.
+ */
+ _initExistingShortcuts: function(/**ChromeWindow*/ window)
+ {
+ if (!validModifiers.ACCEL)
+ initAccelKey();
+
+ this._existingShortcuts = {__proto__: null};
+
+ let keys = window.document.getElementsByTagName("key");
+ for (let i = 0; i < keys.length; i++)
+ {
+ let key = keys[i];
+ let keyData =
+ {
+ shift: false,
+ meta: false,
+ alt: false,
+ control: false,
+ char: null,
+ code: null
+ };
+
+ let keyChar = key.getAttribute("key");
+ if (keyChar && keyChar.length == 1)
+ keyData.char = keyChar.toUpperCase();
+
+ let keyCode = key.getAttribute("keycode");
+ if (keyCode && "DOM_" + keyCode.toUpperCase() in Ci.nsIDOMKeyEvent)
+ keyData.code = Ci.nsIDOMKeyEvent["DOM_" + keyCode.toUpperCase()];
+
+ if (!keyData.char && !keyData.code)
+ continue;
+
+ let keyModifiers = key.getAttribute("modifiers");
+ if (keyModifiers)
+ for each (let modifier in keyModifiers.toUpperCase().match(/\w+/g))
+ if (modifier in validModifiers)
+ keyData[validModifiers[modifier]] = true;
+
+ let canonical = [keyData.shift, keyData.meta, keyData.alt, keyData.control, keyData.char || keyData.code].join(" ");
+ this._existingShortcuts[canonical] = true;
+ }
+ },
+
+ /**
+ * Selects a keyboard shortcut variant that isn't already taken,
+ * parses it into an object.
+ */
+ selectKey: function(/**String*/ variants) /**Object*/
+ {
+ for each (let variant in variants.split(/\s*,\s*/))
+ {
+ if (!variant)
+ continue;
+
+ let keyData =
+ {
+ shift: false,
+ meta: false,
+ alt: false,
+ control: false,
+ char: null,
+ code: null,
+ codeName: null
+ };
+ for each (let part in variant.toUpperCase().split(/\s+/))
+ {
+ if (part in validModifiers)
+ keyData[validModifiers[part]] = true;
+ else if (part.length == 1)
+ keyData.char = part;
+ else if ("DOM_VK_" + part in Ci.nsIDOMKeyEvent)
+ {
+ keyData.code = Ci.nsIDOMKeyEvent["DOM_VK_" + part];
+ keyData.codeName = "VK_" + part;
+ }
+ }
+
+ if (!keyData.char && !keyData.code)
+ continue;
+
+ let canonical = [keyData.shift, keyData.meta, keyData.alt, keyData.control, keyData.char || keyData.code].join(" ");
+ if (canonical in this._existingShortcuts)
+ continue;
+
+ return keyData;
+ }
+
+ return null;
+ }
+};
+
+/**
+ * Creates the text representation for a key.
+ * @static
+ */
+KeySelector.getTextForKey = function (/**Object*/ key) /**String*/
+{
+ if (!key)
+ return null;
+
+ if (!("text" in key))
+ {
+ key.text = null;
+ try
+ {
+ let stringBundle = Services.strings.createBundle("chrome://global-platform/locale/platformKeys.properties");
+ let parts = [];
+ if (key.control)
+ parts.push(stringBundle.GetStringFromName("VK_CONTROL"));
+ if (key.alt)
+ parts.push(stringBundle.GetStringFromName("VK_ALT"));
+ if (key.meta)
+ parts.push(stringBundle.GetStringFromName("VK_META"));
+ if (key.shift)
+ parts.push(stringBundle.GetStringFromName("VK_SHIFT"));
+ if (key.char)
+ parts.push(key.char.toUpperCase());
+ else
+ {
+ let stringBundle2 = Services.strings.createBundle("chrome://global/locale/keys.properties");
+ parts.push(stringBundle2.GetStringFromName(key.codeName));
+ }
+ key.text = parts.join(stringBundle.GetStringFromName("MODIFIER_SEPARATOR"));
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ return null;
+ }
+ }
+ return key.text;
+};
+
+/**
+ * Tests whether a keypress event matches the given key.
+ * @static
+ */
+KeySelector.matchesKey = function(/**Event*/ event, /**Object*/ key) /**Boolean*/
+{
+ if (event.defaultPrevented || !key)
+ return false;
+ if (key.shift != event.shiftKey || key.alt != event.altKey)
+ return false;
+ if (key.meta != event.metaKey || key.control != event.ctrlKey)
+ return false;
+
+ if (key.char && event.charCode && String.fromCharCode(event.charCode).toUpperCase() == key.char)
+ return true;
+ if (key.code && event.keyCode && event.keyCode == key.code)
+ return true;
+ return false;
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/main.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/main.js
new file mode 100644
index 0000000..f18cc05
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/main.js
@@ -0,0 +1,73 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Starts up Adblock Plus
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {TimeLine} = require("timeline");
+
+TimeLine.enter("Adblock Plus startup");
+registerPublicAPI();
+TimeLine.log("Done registering public API");
+require("filterListener");
+TimeLine.log("Done loading filter listener");
+require("contentPolicy");
+TimeLine.log("Done loading content policy");
+require("synchronizer");
+TimeLine.log("Done loading subscription synchronizer");
+require("notification");
+TimeLine.log("Done loading notification downloader");
+require("sync");
+TimeLine.log("Done loading sync support");
+require("ui");
+TimeLine.log("Done loading UI integration code");
+TimeLine.leave("Started up");
+
+function registerPublicAPI()
+{
+ let {addonRoot} = require("info");
+
+ let uri = Services.io.newURI(addonRoot + "lib/Public.jsm", null, null);
+ if (uri instanceof Ci.nsIMutable)
+ uri.mutable = false;
+
+ let classID = Components.ID("5e447bce-1dd2-11b2-b151-ec21c2b6a135");
+ let contractID = "@adblockplus.org/abp/public;1";
+ let factory =
+ {
+ createInstance: function(outer, iid)
+ {
+ if (outer)
+ throw Cr.NS_ERROR_NO_AGGREGATION;
+ return uri.QueryInterface(iid);
+ },
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIFactory])
+ };
+
+ let registrar = Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
+ registrar.registerFactory(classID, "Adblock Plus public API URL", contractID, factory);
+
+ onShutdown.add(function()
+ {
+ registrar.unregisterFactory(classID, factory);
+ Cu.unload(uri.spec);
+ });
+}
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/matcher.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/matcher.js
new file mode 100644
index 0000000..908b0b8
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/matcher.js
@@ -0,0 +1,446 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Matcher class implementing matching addresses against a list of filters.
+ */
+
+let {Filter, RegExpFilter, WhitelistFilter} = require("filterClasses");
+
+/**
+ * Blacklist/whitelist filter matching
+ * @constructor
+ */
+function Matcher()
+{
+ this.clear();
+}
+exports.Matcher = Matcher;
+
+Matcher.prototype = {
+ /**
+ * Lookup table for filters by their associated keyword
+ * @type Object
+ */
+ filterByKeyword: null,
+
+ /**
+ * Lookup table for keywords by the filter text
+ * @type Object
+ */
+ keywordByFilter: null,
+
+ /**
+ * Removes all known filters
+ */
+ clear: function()
+ {
+ this.filterByKeyword = {__proto__: null};
+ this.keywordByFilter = {__proto__: null};
+ },
+
+ /**
+ * Adds a filter to the matcher
+ * @param {RegExpFilter} filter
+ */
+ add: function(filter)
+ {
+ if (filter.text in this.keywordByFilter)
+ return;
+
+ // Look for a suitable keyword
+ let keyword = this.findKeyword(filter);
+ let oldEntry = this.filterByKeyword[keyword];
+ if (typeof oldEntry == "undefined")
+ this.filterByKeyword[keyword] = filter;
+ else if (oldEntry.length == 1)
+ this.filterByKeyword[keyword] = [oldEntry, filter];
+ else
+ oldEntry.push(filter);
+ this.keywordByFilter[filter.text] = keyword;
+ },
+
+ /**
+ * Removes a filter from the matcher
+ * @param {RegExpFilter} filter
+ */
+ remove: function(filter)
+ {
+ if (!(filter.text in this.keywordByFilter))
+ return;
+
+ let keyword = this.keywordByFilter[filter.text];
+ let list = this.filterByKeyword[keyword];
+ if (list.length <= 1)
+ delete this.filterByKeyword[keyword];
+ else
+ {
+ let index = list.indexOf(filter);
+ if (index >= 0)
+ {
+ list.splice(index, 1);
+ if (list.length == 1)
+ this.filterByKeyword[keyword] = list[0];
+ }
+ }
+
+ delete this.keywordByFilter[filter.text];
+ },
+
+ /**
+ * Chooses a keyword to be associated with the filter
+ * @param {String} text text representation of the filter
+ * @return {String} keyword (might be empty string)
+ */
+ findKeyword: function(filter)
+ {
+ let result = "";
+ let text = filter.text;
+ if (Filter.regexpRegExp.test(text))
+ return result;
+
+ // Remove options
+ let match = Filter.optionsRegExp.exec(text);
+ if (match)
+ text = match.input.substr(0, match.index);
+
+ // Remove whitelist marker
+ if (text.substr(0, 2) == "@@")
+ text = text.substr(2);
+
+ let candidates = text.toLowerCase().match(/[^a-z0-9%*][a-z0-9%]{3,}(?=[^a-z0-9%*])/g);
+ if (!candidates)
+ return result;
+
+ let hash = this.filterByKeyword;
+ let resultCount = 0xFFFFFF;
+ let resultLength = 0;
+ for (let i = 0, l = candidates.length; i < l; i++)
+ {
+ let candidate = candidates[i].substr(1);
+ let count = (candidate in hash ? hash[candidate].length : 0);
+ if (count < resultCount || (count == resultCount && candidate.length > resultLength))
+ {
+ result = candidate;
+ resultCount = count;
+ resultLength = candidate.length;
+ }
+ }
+ return result;
+ },
+
+ /**
+ * Checks whether a particular filter is being matched against.
+ */
+ hasFilter: function(/**RegExpFilter*/ filter) /**Boolean*/
+ {
+ return (filter.text in this.keywordByFilter);
+ },
+
+ /**
+ * Returns the keyword used for a filter, null for unknown filters.
+ */
+ getKeywordForFilter: function(/**RegExpFilter*/ filter) /**String*/
+ {
+ if (filter.text in this.keywordByFilter)
+ return this.keywordByFilter[filter.text];
+ else
+ return null;
+ },
+
+ /**
+ * Checks whether the entries for a particular keyword match a URL
+ */
+ _checkEntryMatch: function(keyword, location, contentType, docDomain, thirdParty, privatenode)
+ {
+ let list = this.filterByKeyword[keyword];
+ for (let i = 0; i < list.length; i++)
+ {
+ let filter = list[i];
+ if (filter.matches(location, contentType, docDomain, thirdParty,privatenode))
+ return filter;
+ }
+ return null;
+ },
+
+ /**
+ * Tests whether the URL matches any of the known filters
+ * @param {String} location URL to be tested
+ * @param {String} contentType content type identifier of the URL
+ * @param {String} docDomain domain name of the document that loads the URL
+ * @param {Boolean} thirdParty should be true if the URL is a third-party request
+ * @return {RegExpFilter} matching filter or null
+ */
+ matchesAny: function(location, contentType, docDomain, thirdParty)
+ {
+ let candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g);
+ if (candidates === null)
+ candidates = [];
+ candidates.push("");
+ for (let i = 0, l = candidates.length; i < l; i++)
+ {
+ let substr = candidates[i];
+ if (substr in this.filterByKeyword)
+ {
+ let result = this._checkEntryMatch(substr, location, contentType, docDomain, thirdParty);
+ if (result)
+ return result;
+ }
+ }
+
+ return null;
+ }
+};
+
+/**
+ * Combines a matcher for blocking and exception rules, automatically sorts
+ * rules into two Matcher instances.
+ * @constructor
+ */
+function CombinedMatcher()
+{
+ this.blacklist = new Matcher();
+ this.whitelist = new Matcher();
+ this.keys = {__proto__: null};
+ this.resultCache = {__proto__: null};
+}
+exports.CombinedMatcher = CombinedMatcher;
+
+/**
+ * Maximal number of matching cache entries to be kept
+ * @type Number
+ */
+CombinedMatcher.maxCacheEntries = 1000;
+
+CombinedMatcher.prototype =
+{
+ /**
+ * Matcher for blocking rules.
+ * @type Matcher
+ */
+ blacklist: null,
+
+ /**
+ * Matcher for exception rules.
+ * @type Matcher
+ */
+ whitelist: null,
+
+ /**
+ * Exception rules that are limited by public keys, mapped by the corresponding keys.
+ * @type Object
+ */
+ keys: null,
+
+ /**
+ * Lookup table of previous matchesAny results
+ * @type Object
+ */
+ resultCache: null,
+
+ /**
+ * Number of entries in resultCache
+ * @type Number
+ */
+ cacheEntries: 0,
+
+ /**
+ * @see Matcher#clear
+ */
+ clear: function()
+ {
+ this.blacklist.clear();
+ this.whitelist.clear();
+ this.keys = {__proto__: null};
+ this.resultCache = {__proto__: null};
+ this.cacheEntries = 0;
+ },
+
+ /**
+ * @see Matcher#add
+ */
+ add: function(filter)
+ {
+ if (filter instanceof WhitelistFilter)
+ {
+ if (filter.siteKeys)
+ {
+ for (let i = 0; i < filter.siteKeys.length; i++)
+ this.keys[filter.siteKeys[i]] = filter.text;
+ }
+ else
+ this.whitelist.add(filter);
+ }
+ else
+ this.blacklist.add(filter);
+
+ if (this.cacheEntries > 0)
+ {
+ this.resultCache = {__proto__: null};
+ this.cacheEntries = 0;
+ }
+ },
+
+ /**
+ * @see Matcher#remove
+ */
+ remove: function(filter)
+ {
+ if (filter instanceof WhitelistFilter)
+ {
+ if (filter.siteKeys)
+ {
+ for (let i = 0; i < filter.siteKeys.length; i++)
+ delete this.keys[filter.siteKeys[i]];
+ }
+ else
+ this.whitelist.remove(filter);
+ }
+ else
+ this.blacklist.remove(filter);
+
+ if (this.cacheEntries > 0)
+ {
+ this.resultCache = {__proto__: null};
+ this.cacheEntries = 0;
+ }
+ },
+
+ /**
+ * @see Matcher#findKeyword
+ */
+ findKeyword: function(filter)
+ {
+ if (filter instanceof WhitelistFilter)
+ return this.whitelist.findKeyword(filter);
+ else
+ return this.blacklist.findKeyword(filter);
+ },
+
+ /**
+ * @see Matcher#hasFilter
+ */
+ hasFilter: function(filter)
+ {
+ if (filter instanceof WhitelistFilter)
+ return this.whitelist.hasFilter(filter);
+ else
+ return this.blacklist.hasFilter(filter);
+ },
+
+ /**
+ * @see Matcher#getKeywordForFilter
+ */
+ getKeywordForFilter: function(filter)
+ {
+ if (filter instanceof WhitelistFilter)
+ return this.whitelist.getKeywordForFilter(filter);
+ else
+ return this.blacklist.getKeywordForFilter(filter);
+ },
+
+ /**
+ * Checks whether a particular filter is slow
+ */
+ isSlowFilter: function(/**RegExpFilter*/ filter) /**Boolean*/
+ {
+ let matcher = (filter instanceof WhitelistFilter ? this.whitelist : this.blacklist);
+ if (matcher.hasFilter(filter))
+ return !matcher.getKeywordForFilter(filter);
+ else
+ return !matcher.findKeyword(filter);
+ },
+
+ /**
+ * Optimized filter matching testing both whitelist and blacklist matchers
+ * simultaneously. For parameters see Matcher.matchesAny().
+ * @see Matcher#matchesAny
+ */
+ matchesAnyInternal: function(location, contentType, docDomain, thirdParty, privatenode)
+ {
+ let candidates = location.toLowerCase().match(/[a-z0-9%]{3,}/g);
+ if (candidates === null)
+ candidates = [];
+ candidates.push("");
+
+ let blacklistHit = null;
+ for (let i = 0, l = candidates.length; i < l; i++)
+ {
+ let substr = candidates[i];
+ if (substr in this.whitelist.filterByKeyword)
+ {
+ let result = this.whitelist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, privatenode);
+ if (result)
+ return result;
+ }
+ if (substr in this.blacklist.filterByKeyword && blacklistHit === null)
+ blacklistHit = this.blacklist._checkEntryMatch(substr, location, contentType, docDomain, thirdParty, privatenode);
+ }
+ return blacklistHit;
+ },
+
+ /**
+ * @see Matcher#matchesAny
+ */
+ matchesAny: function(location, contentType, docDomain, thirdParty, privatenode)
+ {
+ let key = location + " " + contentType + " " + docDomain + " " + thirdParty;
+ if (!privatenode){
+ if (key in this.resultCache)
+ return this.resultCache[key];
+ }
+
+ let result = this.matchesAnyInternal(location, contentType, docDomain, thirdParty, privatenode);
+
+ if (this.cacheEntries >= CombinedMatcher.maxCacheEntries)
+ {
+ this.resultCache = {__proto__: null};
+ this.cacheEntries = 0;
+ }
+
+ if (!privatenode){
+ this.resultCache[key] = result;
+ this.cacheEntries++;
+ }
+
+ return result;
+ },
+
+ /**
+ * Looks up whether any filters match the given website key.
+ */
+ matchesByKey: function(/**String*/ location, /**String*/ key, /**String*/ docDomain)
+ {
+ key = key.toUpperCase();
+ if (key in this.keys)
+ {
+ let filter = Filter.knownFilters[this.keys[key]];
+ if (filter && filter.matches(location, "DOCUMENT", docDomain, false))
+ return filter;
+ else
+ return null;
+ }
+ else
+ return null;
+ }
+}
+
+/**
+ * Shared CombinedMatcher instance that should usually be used.
+ * @type CombinedMatcher
+ */
+let defaultMatcher = exports.defaultMatcher = new CombinedMatcher();
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/notification.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/notification.js
new file mode 100644
index 0000000..06e949e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/notification.js
@@ -0,0 +1,339 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Handles notifications.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {TimeLine} = require("timeline");
+let {Prefs} = require("prefs");
+let {Downloader, Downloadable, MILLIS_IN_MINUTE, MILLIS_IN_HOUR, MILLIS_IN_DAY} = require("downloader");
+let {Utils} = require("utils");
+let {Matcher} = require("matcher");
+let {Filter} = require("filterClasses");
+
+let INITIAL_DELAY = 12 * MILLIS_IN_MINUTE;
+let CHECK_INTERVAL = 1 * MILLIS_IN_HOUR;
+let EXPIRATION_INTERVAL = 1 * MILLIS_IN_DAY;
+let TYPE = {
+ information: 0,
+ question: 1,
+ critical: 2
+};
+
+let listeners = {};
+
+function getNumericalSeverity(notification)
+{
+ return (notification.type in TYPE ? TYPE[notification.type] : TYPE.information);
+}
+
+function saveNotificationData()
+{
+ // HACK: JSON values aren't saved unless they are assigned a different object.
+ Prefs.notificationdata = JSON.parse(JSON.stringify(Prefs.notificationdata));
+}
+
+function localize(translations, locale)
+{
+ if (locale in translations)
+ return translations[locale];
+
+ let languagePart = locale.substring(0, locale.indexOf("-"));
+ if (languagePart && languagePart in translations)
+ return translations[languagePart];
+
+ let defaultLocale = "en-US";
+ return translations[defaultLocale];
+}
+
+/**
+ * The object providing actual downloading functionality.
+ * @type Downloader
+ */
+let downloader = null;
+let localData = [];
+
+/**
+ * Regularly fetches notifications and decides which to show.
+ * @class
+ */
+let Notification = exports.Notification =
+{
+ /**
+ * Called on module startup.
+ */
+ init: function()
+ {
+ TimeLine.enter("Entered Notification.init()");
+
+ downloader = new Downloader(this._getDownloadables.bind(this), INITIAL_DELAY, CHECK_INTERVAL);
+ onShutdown.add(function()
+ {
+ downloader.cancel();
+ });
+
+ downloader.onExpirationChange = this._onExpirationChange.bind(this);
+ downloader.onDownloadSuccess = this._onDownloadSuccess.bind(this);
+ downloader.onDownloadError = this._onDownloadError.bind(this);
+
+ TimeLine.leave("Notification.init() done");
+ },
+
+ /**
+ * Yields a Downloadable instances for the notifications download.
+ */
+ _getDownloadables: function()
+ {
+ let downloadable = new Downloadable(Prefs.notificationurl);
+ if (typeof Prefs.notificationdata.lastError === "number")
+ downloadable.lastError = Prefs.notificationdata.lastError;
+ if (typeof Prefs.notificationdata.lastCheck === "number")
+ downloadable.lastCheck = Prefs.notificationdata.lastCheck;
+ if (typeof Prefs.notificationdata.data === "object" && "version" in Prefs.notificationdata.data)
+ downloadable.lastVersion = Prefs.notificationdata.data.version;
+ if (typeof Prefs.notificationdata.softExpiration === "number")
+ downloadable.softExpiration = Prefs.notificationdata.softExpiration;
+ if (typeof Prefs.notificationdata.hardExpiration === "number")
+ downloadable.hardExpiration = Prefs.notificationdata.hardExpiration;
+ yield downloadable;
+ },
+
+ _onExpirationChange: function(downloadable)
+ {
+ Prefs.notificationdata.lastCheck = downloadable.lastCheck;
+ Prefs.notificationdata.softExpiration = downloadable.softExpiration;
+ Prefs.notificationdata.hardExpiration = downloadable.hardExpiration;
+ saveNotificationData();
+ },
+
+ _onDownloadSuccess: function(downloadable, responseText, errorCallback, redirectCallback)
+ {
+ try
+ {
+ let data = JSON.parse(responseText);
+ for (let notification of data.notifications)
+ {
+ if ("severity" in notification)
+ {
+ if (!("type" in notification))
+ notification.type = notification.severity;
+ delete notification.severity;
+ }
+ }
+ Prefs.notificationdata.data = data;
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ errorCallback("synchronize_invalid_data");
+ return;
+ }
+
+ Prefs.notificationdata.lastError = 0;
+ Prefs.notificationdata.downloadStatus = "synchronize_ok";
+ [Prefs.notificationdata.softExpiration, Prefs.notificationdata.hardExpiration] = downloader.processExpirationInterval(EXPIRATION_INTERVAL);
+ saveNotificationData();
+ },
+
+ _onDownloadError: function(downloadable, downloadURL, error, channelStatus, responseStatus, redirectCallback)
+ {
+ Prefs.notificationdata.lastError = Date.now();
+ Prefs.notificationdata.downloadStatus = error;
+ saveNotificationData();
+ },
+
+ /**
+ * Determines which notification is to be shown next.
+ * @param {String} url URL to match notifications to (optional)
+ * @return {Object} notification to be shown, or null if there is none
+ */
+ getNextToShow: function(url)
+ {
+ function checkTarget(target, parameter, name, version)
+ {
+ let minVersionKey = parameter + "MinVersion";
+ let maxVersionKey = parameter + "MaxVersion";
+ return !((parameter in target && target[parameter] != name) ||
+ (minVersionKey in target && Services.vc.compare(version, target[minVersionKey]) < 0) ||
+ (maxVersionKey in target && Services.vc.compare(version, target[maxVersionKey]) > 0));
+ }
+
+ let remoteData = [];
+ if (typeof Prefs.notificationdata.data == "object" && Prefs.notificationdata.data.notifications instanceof Array)
+ remoteData = Prefs.notificationdata.data.notifications;
+
+ if (!(Prefs.notificationdata.shown instanceof Array))
+ {
+ Prefs.notificationdata.shown = [];
+ saveNotificationData();
+ }
+
+ let notifications = localData.concat(remoteData);
+ if (notifications.length === 0)
+ return null;
+
+ let {addonName, addonVersion, application, applicationVersion, platform, platformVersion} = require("info");
+ let notificationToShow = null;
+ for (let notification of notifications)
+ {
+ if ((typeof notification.type === "undefined" || notification.type !== "critical")
+ && Prefs.notificationdata.shown.indexOf(notification.id) !== -1)
+ continue;
+
+ if (typeof url === "string" || notification.urlFilters instanceof Array)
+ {
+ if (typeof url === "string" && notification.urlFilters instanceof Array)
+ {
+ let matcher = new Matcher();
+ for (let urlFilter of notification.urlFilters)
+ matcher.add(Filter.fromText(urlFilter));
+ if (!matcher.matchesAny(url, "DOCUMENT", url))
+ continue;
+ }
+ else
+ continue;
+ }
+
+ if (notification.targets instanceof Array)
+ {
+ let match = false;
+ for (let target of notification.targets)
+ {
+ if (checkTarget(target, "extension", addonName, addonVersion) &&
+ checkTarget(target, "application", application, applicationVersion) &&
+ checkTarget(target, "platform", platform, platformVersion))
+ {
+ match = true;
+ break;
+ }
+ }
+ if (!match)
+ continue;
+ }
+
+ if (!notificationToShow
+ || getNumericalSeverity(notification) > getNumericalSeverity(notificationToShow))
+ notificationToShow = notification;
+ }
+
+ if (notificationToShow && "id" in notificationToShow)
+ {
+ if (notificationToShow.type !== "question")
+ this.markAsShown(notificationToShow.id);
+ }
+
+ return notificationToShow;
+ },
+
+ markAsShown: function(id)
+ {
+ if (Prefs.notificationdata.shown.indexOf(id) > -1)
+ return;
+
+ Prefs.notificationdata.shown.push(id);
+ saveNotificationData();
+ },
+
+ /**
+ * Localizes the texts of the supplied notification.
+ * @param {Object} notification notification to translate
+ * @param {String} locale the target locale (optional, defaults to the
+ * application locale)
+ * @return {Object} the translated texts
+ */
+ getLocalizedTexts: function(notification, locale)
+ {
+ locale = locale || Utils.appLocale;
+ let textKeys = ["title", "message"];
+ let localizedTexts = [];
+ for (let key of textKeys)
+ {
+ if (key in notification)
+ {
+ if (typeof notification[key] == "string")
+ localizedTexts[key] = notification[key];
+ else
+ localizedTexts[key] = localize(notification[key], locale);
+ }
+ }
+ return localizedTexts;
+ },
+
+ /**
+ * Adds a local notification.
+ * @param {Object} notification notification to add
+ */
+ addNotification: function(notification)
+ {
+ if (localData.indexOf(notification) == -1)
+ localData.push(notification);
+ },
+
+ /**
+ * Removes an existing local notification.
+ * @param {Object} notification notification to remove
+ */
+ removeNotification: function(notification)
+ {
+ let index = localData.indexOf(notification);
+ if (index > -1)
+ localData.splice(index, 1);
+ },
+
+ /**
+ * Adds a listener for question-type notifications
+ */
+ addQuestionListener: function(/**string*/ id, /**function(approved)*/ listener)
+ {
+ if (!(id in listeners))
+ listeners[id] = [];
+ if (listeners[id].indexOf(listener) === -1)
+ listeners[id].push(listener);
+ },
+
+ /**
+ * Removes a listener that was previously added via addQuestionListener
+ */
+ removeQuestionListener: function(/**string*/ id, /**function(approved)*/ listener)
+ {
+ if (!(id in listeners))
+ return;
+ let index = listeners[id].indexOf(listener);
+ if (index > -1)
+ listeners[id].splice(index, 1);
+ if (listeners[id].length === 0)
+ delete listeners[id];
+ },
+
+ /**
+ * Notifies listeners about interactions with a notification
+ * @param {String} id notification ID
+ * @param {Boolean} approved indicator whether notification has been approved or not
+ */
+ triggerQuestionListeners: function(id, approved)
+ {
+ if (!(id in listeners))
+ return;
+ let questionListeners = listeners[id];
+ for (let listener of questionListeners)
+ listener(approved);
+ }
+};
+Notification.init();
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/objectTabs.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/objectTabs.js
new file mode 100644
index 0000000..1227490
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/objectTabs.js
@@ -0,0 +1,492 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Code responsible for showing and hiding object tabs.
+ */
+
+/**
+ * Class responsible for showing and hiding object tabs.
+ * @class
+ */
+var objTabs =
+{
+ /**
+ * Number of milliseconds to wait until hiding tab after the mouse moves away.
+ * @type Integer
+ */
+ HIDE_DELAY: 1000,
+
+ /**
+ * Flag used to trigger object tabs initialization first time object tabs are
+ * used.
+ * @type Boolean
+ */
+ initialized: false,
+
+ /**
+ * Will be set to true while initialization is in progress.
+ * @type Boolean
+ */
+ initializing: false,
+
+ /**
+ * Parameters for _showTab, to be called once initialization is complete.
+ */
+ delayedShowParams: null,
+
+ /**
+ * Randomly generated class to be used for visible object tabs on top of object.
+ * @type String
+ */
+ objTabClassVisibleTop: null,
+
+ /**
+ * Randomly generated class to be used for visible object tabs at the bottom of the object.
+ * @type String
+ */
+ objTabClassVisibleBottom: null,
+
+ /**
+ * Randomly generated class to be used for invisible object tabs.
+ * @type String
+ */
+ objTabClassHidden: null,
+
+ /**
+ * Document element the object tab is currently being displayed for.
+ * @type Element
+ */
+ currentElement: null,
+
+ /**
+ * Windows that the window event handler is currently registered for.
+ * @type Array of Window
+ */
+ windowListeners: null,
+
+ /**
+ * Panel element currently used as object tab.
+ * @type Element
+ */
+ objtabElement: null,
+
+ /**
+ * Time of previous position update.
+ * @type Integer
+ */
+ prevPositionUpdate: 0,
+
+ /**
+ * Timer used to update position of the object tab.
+ * @type nsITimer
+ */
+ positionTimer: null,
+
+ /**
+ * Timer used to delay hiding of the object tab.
+ * @type nsITimer
+ */
+ hideTimer: null,
+
+ /**
+ * Used when hideTimer is running, time when the tab should be hidden.
+ * @type Integer
+ */
+ hideTargetTime: 0,
+
+ /**
+ * Initializes object tabs (generates random classes and registers stylesheet).
+ */
+ _initCSS: function()
+ {
+ function processCSSData(request)
+ {
+ if (onShutdown.done)
+ return;
+
+ let data = request.responseText;
+
+ let rnd = [];
+ let offset = "a".charCodeAt(0);
+ for (let i = 0; i < 60; i++)
+ rnd.push(offset + Math.random() * 26);
+
+ this.objTabClassVisibleTop = String.fromCharCode.apply(String, rnd.slice(0, 20));
+ this.objTabClassVisibleBottom = String.fromCharCode.apply(String, rnd.slice(20, 40));
+ this.objTabClassHidden = String.fromCharCode.apply(String, rnd.slice(40, 60));
+
+ let {Utils} = require("utils");
+ let url = Utils.makeURI("data:text/css," + encodeURIComponent(data.replace(/%%CLASSVISIBLETOP%%/g, this.objTabClassVisibleTop)
+ .replace(/%%CLASSVISIBLEBOTTOM%%/g, this.objTabClassVisibleBottom)
+ .replace(/%%CLASSHIDDEN%%/g, this.objTabClassHidden)));
+ Utils.styleService.loadAndRegisterSheet(url, Ci.nsIStyleSheetService.USER_SHEET);
+ onShutdown.add(function()
+ {
+ Utils.styleService.unregisterSheet(url, Ci.nsIStyleSheetService.USER_SHEET);
+ });
+
+ this.initializing = false;
+ this.initialized = true;
+
+ if (this.delayedShowParams)
+ this._showTab.apply(this, this.delayedShowParams);
+ }
+
+ this.delayedShowParams = arguments;
+
+ if (!this.initializing)
+ {
+ this.initializing = true;
+
+ // Load CSS asynchronously
+ try {
+ let request = new XMLHttpRequest();
+ request.mozBackgroundRequest = true;
+ request.open("GET", "chrome://adblockplus/content/objtabs.css");
+ request.overrideMimeType("text/plain");
+
+ request.addEventListener("load", processCSSData.bind(this, request), false);
+ request.send(null);
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ this.initializing = false;
+ }
+ }
+ },
+
+ /**
+ * Called to show object tab for an element.
+ */
+ showTabFor: function(/**Element*/ element)
+ {
+ // Object tabs aren't usable in Fennec
+ let {application} = require("info");
+ if (application == "fennec" || application == "fennec2")
+ return;
+
+ let {Prefs} = require("prefs");
+ if (!Prefs.frameobjects)
+ return;
+
+ if (this.hideTimer)
+ {
+ this.hideTimer.cancel();
+ this.hideTimer = null;
+ }
+
+ if (this.objtabElement)
+ this.objtabElement.style.setProperty("opacity", "1", "important");
+
+ if (this.currentElement != element)
+ {
+ this._hideTab();
+
+ let {Policy} = require("contentPolicy");
+ let {RequestNotifier} = require("requestNotifier");
+ let data = RequestNotifier.getDataForNode(element, true, Policy.type.OBJECT);
+ if (data)
+ {
+ if (this.initialized)
+ this._showTab(element, data[1]);
+ else
+ this._initCSS(element, data[1]);
+ }
+ }
+ },
+
+ /**
+ * Called to hide object tab for an element (actual hiding happens delayed).
+ */
+ hideTabFor: function(/**Element*/ element)
+ {
+ if (element != this.currentElement || this.hideTimer)
+ return;
+
+ this.hideTargetTime = Date.now() + this.HIDE_DELAY;
+ this.hideTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ this.hideTimer.init(this, 40, Ci.nsITimer.TYPE_REPEATING_SLACK);
+ },
+
+ /**
+ * Makes the tab element visible.
+ */
+ _showTab: function(/**Element*/ element, /**RequestEntry*/ data)
+ {
+ let {UI} = require("ui");
+ if (!UI.overlay)
+ return;
+
+ let doc = element.ownerDocument.defaultView.top.document;
+
+ this.objtabElement = doc.createElementNS("http://www.w3.org/1999/xhtml", "a");
+ this.objtabElement.textContent = UI.overlay.attributes.objtabtext;
+ this.objtabElement.setAttribute("title", UI.overlay.attributes.objtabtooltip);
+ this.objtabElement.setAttribute("href", data.location);
+ this.objtabElement.setAttribute("class", this.objTabClassHidden);
+ this.objtabElement.style.setProperty("opacity", "1", "important");
+ this.objtabElement.nodeData = data;
+
+ this.currentElement = element;
+
+ // Register paint listeners for the relevant windows
+ this.windowListeners = [];
+ let wnd = element.ownerDocument.defaultView;
+ while (wnd)
+ {
+ wnd.addEventListener("MozAfterPaint", objectWindowEventHandler, false);
+ this.windowListeners.push(wnd);
+ wnd = (wnd.parent != wnd ? wnd.parent : null);
+ }
+
+ // Register mouse listeners on the object tab
+ this.objtabElement.addEventListener("mouseover", objectTabEventHander, false);
+ this.objtabElement.addEventListener("mouseout", objectTabEventHander, false);
+ this.objtabElement.addEventListener("click", objectTabEventHander, true);
+
+ // Insert the tab into the document and adjust its position
+ doc.documentElement.appendChild(this.objtabElement);
+ if (!this.positionTimer)
+ {
+ this.positionTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ this.positionTimer.init(this, 200, Ci.nsITimer.TYPE_REPEATING_SLACK);
+ }
+ this._positionTab();
+ },
+
+ /**
+ * Hides the tab element.
+ */
+ _hideTab: function()
+ {
+ this.delayedShowParams = null;
+
+ if (this.objtabElement)
+ {
+ // Prevent recursive calls via popuphidden handler
+ let objtab = this.objtabElement;
+ this.objtabElement = null;
+ this.currentElement = null;
+
+ if (this.hideTimer)
+ {
+ this.hideTimer.cancel();
+ this.hideTimer = null;
+ }
+
+ if (this.positionTimer)
+ {
+ this.positionTimer.cancel();
+ this.positionTimer = null;
+ }
+
+ try {
+ objtab.parentNode.removeChild(objtab);
+ } catch (e) {}
+ objtab.removeEventListener("mouseover", objectTabEventHander, false);
+ objtab.removeEventListener("mouseout", objectTabEventHander, false);
+ objtab.nodeData = null;
+
+ for (let wnd of this.windowListeners)
+ wnd.removeEventListener("MozAfterPaint", objectWindowEventHandler, false);
+ this.windowListeners = null;
+ }
+ },
+
+ /**
+ * Updates position of the tab element.
+ */
+ _positionTab: function()
+ {
+ // Test whether element is still in document
+ let elementDoc = null;
+ try
+ {
+ elementDoc = this.currentElement.ownerDocument;
+ } catch (e) {} // Ignore "can't access dead object" error
+ if (!elementDoc || !this.currentElement.offsetWidth || !this.currentElement.offsetHeight ||
+ !elementDoc.defaultView || !elementDoc.documentElement)
+ {
+ this._hideTab();
+ return;
+ }
+
+ let objRect = this._getElementPosition(this.currentElement);
+
+ let className = this.objTabClassVisibleTop;
+ let left = objRect.right - this.objtabElement.offsetWidth;
+ let top = objRect.top - this.objtabElement.offsetHeight;
+ if (top < 0)
+ {
+ top = objRect.bottom;
+ className = this.objTabClassVisibleBottom;
+ }
+
+ if (this.objtabElement.style.left != left + "px")
+ this.objtabElement.style.setProperty("left", left + "px", "important");
+ if (this.objtabElement.style.top != top + "px")
+ this.objtabElement.style.setProperty("top", top + "px", "important");
+
+ if (this.objtabElement.getAttribute("class") != className)
+ this.objtabElement.setAttribute("class", className);
+
+ this.prevPositionUpdate = Date.now();
+ },
+
+ /**
+ * Calculates element's position relative to the top frame and considering
+ * clipping due to scrolling.
+ * @return {left: Number, top: Number, right: Number, bottom: Number}
+ */
+ _getElementPosition: function(/**Element*/ element)
+ {
+ // Restrict rectangle coordinates by the boundaries of a window's client area
+ function intersectRect(rect, wnd)
+ {
+ // Cannot use wnd.innerWidth/Height because they won't account for scrollbars
+ let doc = wnd.document;
+ let wndWidth = doc.documentElement.clientWidth;
+ let wndHeight = doc.documentElement.clientHeight;
+ if (doc.compatMode == "BackCompat") // clientHeight will be bogus in quirks mode
+ wndHeight = Math.max(doc.documentElement.offsetHeight, doc.body.offsetHeight) - wnd.scrollMaxY - 1;
+
+ rect.left = Math.max(rect.left, 0);
+ rect.top = Math.max(rect.top, 0);
+ rect.right = Math.min(rect.right, wndWidth);
+ rect.bottom = Math.min(rect.bottom, wndHeight);
+ }
+
+ let rect = element.getBoundingClientRect();
+ let wnd = element.ownerDocument.defaultView;
+
+ let style = wnd.getComputedStyle(element, null);
+ let offsets = [
+ parseFloat(style.borderLeftWidth) + parseFloat(style.paddingLeft),
+ parseFloat(style.borderTopWidth) + parseFloat(style.paddingTop),
+ parseFloat(style.borderRightWidth) + parseFloat(style.paddingRight),
+ parseFloat(style.borderBottomWidth) + parseFloat(style.paddingBottom)
+ ];
+
+ rect = {left: rect.left + offsets[0], top: rect.top + offsets[1],
+ right: rect.right - offsets[2], bottom: rect.bottom - offsets[3]};
+ while (true)
+ {
+ intersectRect(rect, wnd);
+
+ if (!wnd.frameElement)
+ break;
+
+ // Recalculate coordinates to be relative to frame's parent window
+ let frameElement = wnd.frameElement;
+ wnd = frameElement.ownerDocument.defaultView;
+
+ let frameRect = frameElement.getBoundingClientRect();
+ let frameStyle = wnd.getComputedStyle(frameElement, null);
+ let relLeft = frameRect.left + parseFloat(frameStyle.borderLeftWidth) + parseFloat(frameStyle.paddingLeft);
+ let relTop = frameRect.top + parseFloat(frameStyle.borderTopWidth) + parseFloat(frameStyle.paddingTop);
+
+ rect.left += relLeft;
+ rect.right += relLeft;
+ rect.top += relTop;
+ rect.bottom += relTop;
+ }
+
+ return rect;
+ },
+
+ doBlock: function()
+ {
+ let {UI} = require("ui");
+ let {Utils} = require("utils");
+ let chromeWindow = Utils.getChromeWindow(this.currentElement.ownerDocument.defaultView);
+ UI.blockItem(chromeWindow, this.currentElement, this.objtabElement.nodeData);
+ },
+
+ /**
+ * Called whenever a timer fires.
+ */
+ observe: function(/**nsISupport*/ subject, /**String*/ topic, /**String*/ data)
+ {
+ if (subject == this.positionTimer)
+ {
+ // Don't update position if it was already updated recently (via MozAfterPaint)
+ if (Date.now() - this.prevPositionUpdate > 100)
+ this._positionTab();
+ }
+ else if (subject == this.hideTimer)
+ {
+ let now = Date.now();
+ if (now >= this.hideTargetTime)
+ this._hideTab();
+ else if (this.hideTargetTime - now < this.HIDE_DELAY / 2)
+ this.objtabElement.style.setProperty("opacity", (this.hideTargetTime - now) * 2 / this.HIDE_DELAY, "important");
+ }
+ }
+};
+
+onShutdown.add(objTabs._hideTab.bind(objTabs));
+
+/**
+ * Function called whenever the mouse enters or leaves an object.
+ */
+function objectMouseEventHander(/**Event*/ event)
+{
+ if (!event.isTrusted)
+ return;
+
+ if (event.type == "mouseover")
+ objTabs.showTabFor(event.target);
+ else if (event.type == "mouseout")
+ objTabs.hideTabFor(event.target);
+}
+
+/**
+ * Function called for paint events of the object tab window.
+ */
+function objectWindowEventHandler(/**Event*/ event)
+{
+ if (!event.isTrusted)
+ return;
+
+ // Don't trigger update too often, avoid overusing CPU on frequent page updates
+ if (event.type == "MozAfterPaint" && Date.now() - objTabs.prevPositionUpdate > 20)
+ objTabs._positionTab();
+}
+
+/**
+ * Function called whenever the mouse enters or leaves an object tab.
+ */
+function objectTabEventHander(/**Event*/ event)
+{
+ if (onShutdown.done || !event.isTrusted)
+ return;
+
+ if (event.type == "click" && event.button == 0)
+ {
+ event.preventDefault();
+ event.stopPropagation();
+
+ objTabs.doBlock();
+ }
+ else if (event.type == "mouseover")
+ objTabs.showTabFor(objTabs.currentElement);
+ else if (event.type == "mouseout")
+ objTabs.hideTabFor(objTabs.currentElement);
+}
+exports.objectMouseEventHander = objectMouseEventHander;
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/prefs.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/prefs.js
new file mode 100644
index 0000000..e1b6ae0
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/prefs.js
@@ -0,0 +1,203 @@
+/*
+ * This file is part of the Adblock Plus build tools,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+let {addonRoot, addonName} = require("info");
+let branchName = "extensions." + addonName + ".";
+let branch = Services.prefs.getBranch(branchName);
+let ignorePrefChanges = false;
+
+function init()
+{
+ // Load default preferences and set up properties for them
+ let defaultBranch = Services.prefs.getDefaultBranch(branchName);
+ let scope =
+ {
+ pref: function(pref, value)
+ {
+ if (pref.substr(0, branchName.length) != branchName)
+ {
+ Cu.reportError(new Error("Ignoring default preference " + pref + ", wrong branch."));
+ return;
+ }
+ pref = pref.substr(branchName.length);
+
+ let [getter, setter] = typeMap[typeof value];
+ setter(defaultBranch, pref, value);
+ defineProperty(pref, false, getter, setter);
+ }
+ };
+ Services.scriptloader.loadSubScript(addonRoot + "defaults/prefs.js", scope);
+
+ // Add preference change observer
+ try
+ {
+ branch.QueryInterface(Ci.nsIPrefBranch2).addObserver("", Prefs, true);
+ onShutdown.add(function() branch.removeObserver("", Prefs));
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ }
+}
+
+/**
+ * Sets up getter/setter on Prefs object for preference.
+ */
+function defineProperty(/**String*/ name, defaultValue, /**Function*/ readFunc, /**Function*/ writeFunc)
+{
+ let value = defaultValue;
+ Prefs["_update_" + name] = function()
+ {
+ try
+ {
+ value = readFunc(branch, name);
+ triggerListeners(name);
+ }
+ catch(e)
+ {
+ Cu.reportError(e);
+ }
+ };
+ Prefs.__defineGetter__(name, function() value);
+ Prefs.__defineSetter__(name, function(newValue)
+ {
+ if (value == newValue)
+ return value;
+
+ try
+ {
+ ignorePrefChanges = true;
+ writeFunc(branch, name, newValue);
+ value = newValue;
+ Services.prefs.savePrefFile(null);
+ triggerListeners(name);
+ }
+ catch(e)
+ {
+ Cu.reportError(e);
+ }
+ finally
+ {
+ ignorePrefChanges = false;
+ }
+ return value;
+ });
+ Prefs["_update_" + name]();
+}
+
+let listeners = [];
+function triggerListeners(/**String*/ name)
+{
+ for (let i = 0; i < listeners.length; i++)
+ {
+ try
+ {
+ listeners[i](name);
+ }
+ catch(e)
+ {
+ Cu.reportError(e);
+ }
+ }
+}
+
+/**
+ * Manages the preferences for an extension, object properties corresponding
+ * to extension's preferences are added automatically. Setting the property
+ * will automatically change the preference, external preference changes are
+ * also recognized automatically.
+ */
+let Prefs = exports.Prefs =
+{
+ /**
+ * Migrates an old preference to a new name.
+ */
+ migrate: function(/**String*/ oldName, /**String*/ newName)
+ {
+ if (newName in this && Services.prefs.prefHasUserValue(oldName))
+ {
+ let [getter, setter] = typeMap[typeof this[newName]];
+ try
+ {
+ this[newName] = getter(Services.prefs, oldName);
+ } catch(e) {}
+ Services.prefs.clearUserPref(oldName);
+ }
+ },
+
+ /**
+ * Adds a preferences listener that will be fired whenever a preference
+ * changes.
+ */
+ addListener: function(/**Function*/ listener)
+ {
+ if (listeners.indexOf(listener) < 0)
+ listeners.push(listener);
+ },
+
+ /**
+ * Removes a preferences listener.
+ */
+ removeListener: function(/**Function*/ listener)
+ {
+ let index = listeners.indexOf(listener);
+ if (index >= 0)
+ listeners.splice(index, 1);
+ },
+
+ observe: function(subject, topic, data)
+ {
+ if (ignorePrefChanges || topic != "nsPref:changed")
+ return;
+
+ if ("_update_" + data in this)
+ this["_update_" + data]();
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver])
+};
+
+// Getter/setter functions for difference preference types
+let typeMap =
+{
+ boolean: [getBoolPref, setBoolPref],
+ number: [getIntPref, setIntPref],
+ string: [getCharPref, setCharPref],
+ object: [getJSONPref, setJSONPref]
+};
+
+function getIntPref(branch, pref) branch.getIntPref(pref)
+function setIntPref(branch, pref, newValue) branch.setIntPref(pref, newValue)
+
+function getBoolPref(branch, pref) branch.getBoolPref(pref)
+function setBoolPref(branch, pref, newValue) branch.setBoolPref(pref, newValue)
+
+function getCharPref(branch, pref) branch.getComplexValue(pref, Ci.nsISupportsString).data
+function setCharPref(branch, pref, newValue)
+{
+ let str = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
+ str.data = newValue;
+ branch.setComplexValue(pref, Ci.nsISupportsString, str);
+}
+
+function getJSONPref(branch, pref) JSON.parse(getCharPref(branch, pref))
+function setJSONPref(branch, pref, newValue) setCharPref(branch, pref, JSON.stringify(newValue))
+
+init();
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/requestNotifier.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/requestNotifier.js
new file mode 100644
index 0000000..2ee9ec3
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/requestNotifier.js
@@ -0,0 +1,378 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Stores Adblock Plus data to be attached to a window.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {Utils} = require("utils");
+let {BlockingFilter, WhitelistFilter, ElemHideBase, ElemHideFilter, ElemHideException} = require("filterClasses");
+
+let nodeData = new WeakMap();
+let windowStats = new WeakMap();
+let windowSelection = new WeakMap();
+
+let setEntry, hasEntry, getEntry;
+// Last issue(Bug 982561) preventing us from using WeakMap fixed for FF version 32
+if (Services.vc.compare(Utils.platformVersion, "32.0a1") >= 0)
+{
+ setEntry = (map, key, value) => map.set(key, value);
+ hasEntry = (map, key) => map.has(key);
+ getEntry = (map, key) => map.get(key);
+}
+else
+{
+ // Fall back to user data
+ let dataSeed = Math.random();
+ let nodeDataProp = "abpNodeData" + dataSeed;
+ let windowStatsProp = "abpWindowStats" + dataSeed;
+ let windowSelectionProp = "abpWindowSelection" + dataSeed;
+ let getProp = function(map)
+ {
+ switch (map)
+ {
+ case nodeData:
+ return nodeDataProp;
+ case windowStats:
+ return windowStatsProp;
+ case windowSelection:
+ return windowSelectionProp;
+ default:
+ return null;
+ }
+ };
+
+ setEntry = (map, key, value) => key.setUserData(getProp(map), value, null);
+ hasEntry = (map, key) => key.getUserData(getProp(map));
+ getEntry = (map, key) => key.getUserData(getProp(map)) || undefined;
+}
+
+/**
+ * List of notifiers in use - these notifiers need to receive notifications on
+ * new requests.
+ * @type RequestNotifier[]
+ */
+let activeNotifiers = [];
+
+/**
+ * Creates a notifier object for a particular window. After creation the window
+ * will first be scanned for previously saved requests. Once that scan is
+ * complete only new requests for this window will be reported.
+ * @param {Window} wnd window to attach the notifier to
+ * @param {Function} listener listener to be called whenever a new request is found
+ * @param {Object} [listenerObj] "this" pointer to be used when calling the listener
+ */
+function RequestNotifier(wnd, listener, listenerObj)
+{
+ this.window = wnd;
+ this.listener = listener;
+ this.listenerObj = listenerObj || null;
+ activeNotifiers.push(this);
+ if (wnd)
+ this.startScan(wnd);
+ else
+ this.scanComplete = true;
+}
+exports.RequestNotifier = RequestNotifier;
+
+RequestNotifier.prototype =
+{
+ /**
+ * The window this notifier is associated with.
+ * @type Window
+ */
+ window: null,
+
+ /**
+ * The listener to be called when a new request is found.
+ * @type Function
+ */
+ listener: null,
+
+ /**
+ * "this" pointer to be used when calling the listener.
+ * @type Object
+ */
+ listenerObj: null,
+
+ /**
+ * Will be set to true once the initial window scan is complete.
+ * @type Boolean
+ */
+ scanComplete: false,
+
+ /**
+ * Shuts down the notifier once it is no longer used. The listener
+ * will no longer be called after that.
+ */
+ shutdown: function()
+ {
+ delete this.window;
+ delete this.listener;
+ delete this.listenerObj;
+
+ for (let i = activeNotifiers.length - 1; i >= 0; i--)
+ if (activeNotifiers[i] == this)
+ activeNotifiers.splice(i, 1);
+ },
+
+ /**
+ * Notifies listener about a new request.
+ */
+ notifyListener: function(/**Window*/ wnd, /**Node*/ node, /**RequestEntry*/ entry)
+ {
+ this.listener.call(this.listenerObj, wnd, node, entry, this.scanComplete);
+ },
+
+ /**
+ * Number of currently posted scan events (will be 0 when the scan finishes
+ * running).
+ */
+ eventsPosted: 0,
+
+ /**
+ * Starts the initial scan of the window (will recurse into frames).
+ * @param {Window} wnd the window to be scanned
+ */
+ startScan: function(wnd)
+ {
+ let doc = wnd.document;
+ let walker = doc.createTreeWalker(doc, Ci.nsIDOMNodeFilter.SHOW_ELEMENT, null, false);
+
+ let process = function()
+ {
+ if (!this.listener)
+ return;
+
+ let node = walker.currentNode;
+ let data = getEntry(nodeData, node);
+ if (typeof data != "undefined")
+ for (let k in data)
+ this.notifyListener(wnd, node, data[k]);
+
+ if (walker.nextNode())
+ Utils.runAsync(process);
+ else
+ {
+ // Done with the current window, start the scan for its frames
+ for (let i = 0; i < wnd.frames.length; i++)
+ this.startScan(wnd.frames[i]);
+
+ this.eventsPosted--;
+ if (!this.eventsPosted)
+ {
+ this.scanComplete = true;
+ this.notifyListener(wnd, null, null);
+ }
+ }
+ }.bind(this);
+
+ // Process each node in a separate event to allow other events to process
+ this.eventsPosted++;
+ Utils.runAsync(process);
+ }
+};
+
+RequestNotifier.storeSelection = function(/**Window*/ wnd, /**String*/ selection)
+{
+ setEntry(windowSelection, wnd.document, selection);
+};
+RequestNotifier.getSelection = function(/**Window*/ wnd) /**String*/
+{
+ if (hasEntry(windowSelection, wnd.document))
+ return getEntry(windowSelection, wnd.document);
+ else
+ return null;
+};
+
+/**
+ * Attaches request data to a DOM node.
+ * @param {Node} node node to attach data to
+ * @param {Window} topWnd top-level window the node belongs to
+ * @param {Integer} contentType request type, one of the Policy.type.* constants
+ * @param {String} docDomain domain of the document that initiated the request
+ * @param {Boolean} thirdParty will be true if a third-party server has been requested
+ * @param {String} location the address that has been requested
+ * @param {Filter} filter filter applied to the request or null if none
+ */
+RequestNotifier.addNodeData = function(/**Node*/ node, /**Window*/ topWnd, /**Integer*/ contentType, /**String*/ docDomain, /**Boolean*/ thirdParty, /**String*/ location, /**Filter*/ filter)
+{
+ return new RequestEntry(node, topWnd, contentType, docDomain, thirdParty, location, filter);
+}
+
+/**
+ * Retrieves the statistics for a window.
+ * @result {Object} Object with the properties items, blocked, whitelisted, hidden, filters containing statistics for the window (might be null)
+ */
+RequestNotifier.getWindowStatistics = function(/**Window*/ wnd)
+{
+ if (hasEntry(windowStats, wnd.document))
+ return getEntry(windowStats, wnd.document);
+ else
+ return null;
+}
+
+/**
+ * Retrieves the request entry associated with a DOM node.
+ * @param {Node} node
+ * @param {Boolean} noParent if missing or false, the search will extend to the parent nodes until one is found that has data associated with it
+ * @param {Integer} [type] request type to be looking for
+ * @param {String} [location] request location to be looking for
+ * @result {[Node, RequestEntry]}
+ * @static
+ */
+RequestNotifier.getDataForNode = function(node, noParent, type, location)
+{
+ while (node)
+ {
+ let data = getEntry(nodeData, node);
+ if (typeof data != "undefined")
+ {
+ // Look for matching entry
+ for (let k in data)
+ {
+ let entry = data[k];
+ if ((typeof type == "undefined" || entry.type == type) &&
+ (typeof location == "undefined" || entry.location == location))
+ {
+ return [node, entry];
+ }
+ }
+ }
+
+ // If we don't have any match on this node then maybe its parent will do
+ if ((typeof noParent != "boolean" || !noParent) &&
+ node.parentNode instanceof Ci.nsIDOMElement)
+ {
+ node = node.parentNode;
+ }
+ else
+ {
+ node = null;
+ }
+ }
+
+ return null;
+};
+
+function RequestEntry(node, topWnd, contentType, docDomain, thirdParty, location, filter)
+{
+ this.type = contentType;
+ this.docDomain = docDomain;
+ this.thirdParty = thirdParty;
+ this.location = location;
+ this.filter = filter;
+
+ this.attachToNode(node);
+
+ // Update window statistics
+ if (!hasEntry(windowStats, topWnd.document))
+ {
+ setEntry(windowStats, topWnd.document, {
+ items: 0,
+ hidden: 0,
+ blocked: 0,
+ whitelisted: 0,
+ filters: {}
+ });
+ }
+
+ let stats = getEntry(windowStats, topWnd.document);
+ if (!filter || !(filter instanceof ElemHideBase))
+ stats.items++;
+ if (filter)
+ {
+ if (filter instanceof BlockingFilter)
+ stats.blocked++;
+ else if (filter instanceof WhitelistFilter || filter instanceof ElemHideException)
+ stats.whitelisted++;
+ else if (filter instanceof ElemHideFilter)
+ stats.hidden++;
+
+ if (filter.text in stats.filters)
+ stats.filters[filter.text]++;
+ else
+ stats.filters[filter.text] = 1;
+ }
+
+ // Notify listeners
+ for (let notifier of activeNotifiers)
+ if (!notifier.window || notifier.window == topWnd)
+ notifier.notifyListener(topWnd, node, this);
+}
+RequestEntry.prototype =
+{
+ /**
+ * Content type of the request (one of the nsIContentPolicy constants)
+ * @type Integer
+ */
+ type: null,
+ /**
+ * Domain name of the requesting document
+ * @type String
+ */
+ docDomain: null,
+ /**
+ * True if the request goes to a different domain than the domain of the containing document
+ * @type Boolean
+ */
+ thirdParty: false,
+ /**
+ * Address being requested
+ * @type String
+ */
+ location: null,
+ /**
+ * Filter that was applied to this request (if any)
+ * @type Filter
+ */
+ filter: null,
+ /**
+ * String representation of the content type, e.g. "subdocument"
+ * @type String
+ */
+ get typeDescr()
+ {
+ return require("contentPolicy").Policy.typeDescr[this.type];
+ },
+ /**
+ * User-visible localized representation of the content type, e.g. "frame"
+ * @type String
+ */
+ get localizedDescr()
+ {
+ return require("contentPolicy").Policy.localizedDescr[this.type];
+ },
+
+ /**
+ * Attaches this request object to a DOM node.
+ */
+ attachToNode: function(/**Node*/ node)
+ {
+ let existingData = getEntry(nodeData, node);
+ if (typeof existingData == "undefined")
+ {
+ existingData = {};
+ setEntry(nodeData, node, existingData);
+ }
+
+ // Add this request to the node data
+ existingData[this.type + " " + this.location] = this;
+ }
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/subscriptionClasses.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/subscriptionClasses.js
new file mode 100644
index 0000000..13dceaf
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/subscriptionClasses.js
@@ -0,0 +1,597 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Definition of Subscription class and its subclasses.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {ActiveFilter, BlockingFilter, WhitelistFilter, ElemHideBase} = require("filterClasses");
+let {FilterNotifier} = require("filterNotifier");
+
+/**
+ * Abstract base class for filter subscriptions
+ *
+ * @param {String} url download location of the subscription
+ * @param {String} [title] title of the filter subscription
+ * @constructor
+ */
+function Subscription(url, title)
+{
+ this.url = url;
+ this.filters = [];
+ if (title)
+ this._title = title;
+ else
+ {
+ let {Utils} = require("utils");
+ this._title = Utils.getString("newGroup_title");
+ }
+ Subscription.knownSubscriptions[url] = this;
+}
+exports.Subscription = Subscription;
+
+Subscription.prototype =
+{
+ /**
+ * Download location of the subscription
+ * @type String
+ */
+ url: null,
+
+ /**
+ * Filters contained in the filter subscription
+ * @type Array of Filter
+ */
+ filters: null,
+
+ _title: null,
+ _fixedTitle: false,
+ _disabled: false,
+
+ /**
+ * Title of the filter subscription
+ * @type String
+ */
+ get title()
+ {
+ return this._title;
+ },
+ set title(value)
+ {
+ if (value != this._title)
+ {
+ let oldValue = this._title;
+ this._title = value;
+ FilterNotifier.triggerListeners("subscription.title", this, value, oldValue);
+ }
+ return this._title;
+ },
+
+ /**
+ * Determines whether the title should be editable
+ * @type Boolean
+ */
+ get fixedTitle()
+ {
+ return this._fixedTitle;
+ },
+ set fixedTitle(value)
+ {
+ if (value != this._fixedTitle)
+ {
+ let oldValue = this._fixedTitle;
+ this._fixedTitle = value;
+ FilterNotifier.triggerListeners("subscription.fixedTitle", this, value, oldValue);
+ }
+ return this._fixedTitle;
+ },
+
+ /**
+ * Defines whether the filters in the subscription should be disabled
+ * @type Boolean
+ */
+ get disabled()
+ {
+ return this._disabled;
+ },
+ set disabled(value)
+ {
+ if (value != this._disabled)
+ {
+ let oldValue = this._disabled;
+ this._disabled = value;
+ FilterNotifier.triggerListeners("subscription.disabled", this, value, oldValue);
+ }
+ return this._disabled;
+ },
+
+ /**
+ * Serializes the filter to an array of strings for writing out on the disk.
+ * @param {Array of String} buffer buffer to push the serialization results into
+ */
+ serialize: function(buffer)
+ {
+ buffer.push("[Subscription]");
+ buffer.push("url=" + this.url);
+ buffer.push("title=" + this._title);
+ if (this._fixedTitle)
+ buffer.push("fixedTitle=true");
+ if (this._disabled)
+ buffer.push("disabled=true");
+ },
+
+ serializeFilters: function(buffer)
+ {
+ for (let filter of this.filters)
+ buffer.push(filter.text.replace(/\[/g, "\\["));
+ },
+
+ toString: function()
+ {
+ let buffer = [];
+ this.serialize(buffer);
+ return buffer.join("\n");
+ }
+};
+
+/**
+ * Cache for known filter subscriptions, maps URL to subscription objects.
+ * @type Object
+ */
+Subscription.knownSubscriptions = {__proto__: null};
+
+/**
+ * Returns a subscription from its URL, creates a new one if necessary.
+ * @param {String} url URL of the subscription
+ * @return {Subscription} subscription or null if the subscription couldn't be created
+ */
+Subscription.fromURL = function(url)
+{
+ if (url in Subscription.knownSubscriptions)
+ return Subscription.knownSubscriptions[url];
+
+ try
+ {
+ // Test URL for validity
+ url = Services.io.newURI(url, null, null).spec;
+ return new DownloadableSubscription(url, null);
+ }
+ catch (e)
+ {
+ return new SpecialSubscription(url);
+ }
+}
+
+/**
+ * Deserializes a subscription
+ *
+ * @param {Object} obj map of serialized properties and their values
+ * @return {Subscription} subscription or null if the subscription couldn't be created
+ */
+Subscription.fromObject = function(obj)
+{
+ let result;
+ try
+ {
+ obj.url = Services.io.newURI(obj.url, null, null).spec;
+
+ // URL is valid - this is a downloadable subscription
+ result = new DownloadableSubscription(obj.url, obj.title);
+ if ("downloadStatus" in obj)
+ result._downloadStatus = obj.downloadStatus;
+ if ("lastSuccess" in obj)
+ result.lastSuccess = parseInt(obj.lastSuccess) || 0;
+ if ("lastCheck" in obj)
+ result._lastCheck = parseInt(obj.lastCheck) || 0;
+ if ("expires" in obj)
+ result.expires = parseInt(obj.expires) || 0;
+ if ("softExpiration" in obj)
+ result.softExpiration = parseInt(obj.softExpiration) || 0;
+ if ("errors" in obj)
+ result._errors = parseInt(obj.errors) || 0;
+ if ("version" in obj)
+ result.version = parseInt(obj.version) || 0;
+ if ("requiredVersion" in obj)
+ {
+ let {addonVersion} = require("info");
+ result.requiredVersion = obj.requiredVersion;
+ if (Services.vc.compare(result.requiredVersion, addonVersion) > 0)
+ result.upgradeRequired = true;
+ }
+ if ("homepage" in obj)
+ result._homepage = obj.homepage;
+ if ("lastDownload" in obj)
+ result._lastDownload = parseInt(obj.lastDownload) || 0;
+ }
+ catch (e)
+ {
+ // Invalid URL - custom filter group
+ if (!("title" in obj))
+ {
+ // Backwards compatibility - titles and filter types were originally
+ // determined by group identifier.
+ if (obj.url == "~wl~")
+ obj.defaults = "whitelist";
+ else if (obj.url == "~fl~")
+ obj.defaults = "blocking";
+ else if (obj.url == "~eh~")
+ obj.defaults = "elemhide";
+ if ("defaults" in obj)
+ {
+ let {Utils} = require("utils");
+ obj.title = Utils.getString(obj.defaults + "Group_title");
+ }
+ }
+ result = new SpecialSubscription(obj.url, obj.title);
+ if ("defaults" in obj)
+ result.defaults = obj.defaults.split(" ");
+ }
+ if ("fixedTitle" in obj)
+ result._fixedTitle = (obj.fixedTitle == "true");
+ if ("privateMode" in obj)
+ result.privateMode = (obj.privateMode == "true");
+ if ("disabled" in obj)
+ result._disabled = (obj.disabled == "true");
+
+ return result;
+}
+
+/**
+ * Class for special filter subscriptions (user's filters)
+ * @param {String} url see Subscription()
+ * @param {String} [title] see Subscription()
+ * @constructor
+ * @augments Subscription
+ */
+function SpecialSubscription(url, title)
+{
+ Subscription.call(this, url, title);
+}
+exports.SpecialSubscription = SpecialSubscription;
+
+SpecialSubscription.prototype =
+{
+ __proto__: Subscription.prototype,
+
+ /**
+ * Filter types that should be added to this subscription by default
+ * (entries should correspond to keys in SpecialSubscription.defaultsMap).
+ * @type Array of String
+ */
+ defaults: null,
+
+ /**
+ * Tests whether a filter should be added to this group by default
+ * @param {Filter} filter filter to be tested
+ * @return {Boolean}
+ */
+ isDefaultFor: function(filter)
+ {
+ if (this.defaults && this.defaults.length)
+ {
+ for (let type of this.defaults)
+ {
+ if (filter instanceof SpecialSubscription.defaultsMap[type])
+ return true;
+ if (!(filter instanceof ActiveFilter) && type == "blacklist")
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ /**
+ * See Subscription.serialize()
+ */
+ serialize: function(buffer)
+ {
+ Subscription.prototype.serialize.call(this, buffer);
+ if (this.defaults && this.defaults.length)
+ buffer.push("defaults=" + this.defaults.filter((type) => type in SpecialSubscription.defaultsMap).join(" "));
+ if (this._lastDownload)
+ buffer.push("lastDownload=" + this._lastDownload);
+ }
+};
+
+SpecialSubscription.defaultsMap = {
+ __proto__: null,
+ "whitelist": WhitelistFilter,
+ "blocking": BlockingFilter,
+ "elemhide": ElemHideBase
+};
+
+/**
+ * Creates a new user-defined filter group.
+ * @param {String} [title] title of the new filter group
+ * @result {SpecialSubscription}
+ */
+SpecialSubscription.create = function(title)
+{
+ let url;
+ do
+ {
+ url = "~user~" + Math.round(Math.random()*1000000);
+ } while (url in Subscription.knownSubscriptions);
+ return new SpecialSubscription(url, title)
+};
+
+/**
+ * Creates a new user-defined filter group and adds the given filter to it.
+ * This group will act as the default group for this filter type.
+ */
+SpecialSubscription.createForFilter = function(/**Filter*/ filter) /**SpecialSubscription*/
+{
+ let subscription = SpecialSubscription.create();
+ subscription.filters.push(filter);
+ for (let type in SpecialSubscription.defaultsMap)
+ {
+ if (filter instanceof SpecialSubscription.defaultsMap[type])
+ subscription.defaults = [type];
+ }
+ if (!subscription.defaults)
+ subscription.defaults = ["blocking"];
+
+ let {Utils} = require("utils");
+ subscription.title = Utils.getString(subscription.defaults[0] + "Group_title");
+ return subscription;
+};
+
+/**
+ * Abstract base class for regular filter subscriptions (both internally and externally updated)
+ * @param {String} url see Subscription()
+ * @param {String} [title] see Subscription()
+ * @constructor
+ * @augments Subscription
+ */
+function RegularSubscription(url, title)
+{
+ Subscription.call(this, url, title || url);
+}
+exports.RegularSubscription = RegularSubscription;
+
+RegularSubscription.prototype =
+{
+ __proto__: Subscription.prototype,
+
+ _homepage: null,
+ _lastDownload: 0,
+
+ /**
+ * Filter subscription homepage if known
+ * @type String
+ */
+ get homepage()
+ {
+ return this._homepage;
+ },
+ set homepage(value)
+ {
+ if (value != this._homepage)
+ {
+ let oldValue = this._homepage;
+ this._homepage = value;
+ FilterNotifier.triggerListeners("subscription.homepage", this, value, oldValue);
+ }
+ return this._homepage;
+ },
+
+ /**
+ * Time of the last subscription download (in seconds since the beginning of the epoch)
+ * @type Number
+ */
+ get lastDownload()
+ {
+ return this._lastDownload;
+ },
+ set lastDownload(value)
+ {
+ if (value != this._lastDownload)
+ {
+ let oldValue = this._lastDownload;
+ this._lastDownload = value;
+ FilterNotifier.triggerListeners("subscription.lastDownload", this, value, oldValue);
+ }
+ return this._lastDownload;
+ },
+
+ /**
+ * See Subscription.serialize()
+ */
+ serialize: function(buffer)
+ {
+ Subscription.prototype.serialize.call(this, buffer);
+ if (this._homepage)
+ buffer.push("homepage=" + this._homepage);
+ if (this._lastDownload)
+ buffer.push("lastDownload=" + this._lastDownload);
+ }
+};
+
+/**
+ * Class for filter subscriptions updated by externally (by other extension)
+ * @param {String} url see Subscription()
+ * @param {String} [title] see Subscription()
+ * @constructor
+ * @augments RegularSubscription
+ */
+function ExternalSubscription(url, title)
+{
+ RegularSubscription.call(this, url, title);
+}
+exports.ExternalSubscription = ExternalSubscription;
+
+ExternalSubscription.prototype =
+{
+ __proto__: RegularSubscription.prototype,
+
+ /**
+ * See Subscription.serialize()
+ */
+ serialize: function(buffer)
+ {
+ throw new Error("Unexpected call, external subscriptions should not be serialized");
+ }
+};
+
+/**
+ * Class for filter subscriptions updated by externally (by other extension)
+ * @param {String} url see Subscription()
+ * @param {String} [title] see Subscription()
+ * @constructor
+ * @augments RegularSubscription
+ */
+function DownloadableSubscription(url, title)
+{
+ RegularSubscription.call(this, url, title);
+}
+exports.DownloadableSubscription = DownloadableSubscription;
+
+DownloadableSubscription.prototype =
+{
+ __proto__: RegularSubscription.prototype,
+
+ _downloadStatus: null,
+ _lastCheck: 0,
+ _errors: 0,
+
+ /**
+ * Status of the last download (ID of a string)
+ * @type String
+ */
+ get downloadStatus()
+ {
+ return this._downloadStatus;
+ },
+ set downloadStatus(value)
+ {
+ let oldValue = this._downloadStatus;
+ this._downloadStatus = value;
+ FilterNotifier.triggerListeners("subscription.downloadStatus", this, value, oldValue);
+ return this._downloadStatus;
+ },
+
+ /**
+ * Time of the last successful download (in seconds since the beginning of the
+ * epoch).
+ */
+ lastSuccess: 0,
+
+ /**
+ * Time when the subscription was considered for an update last time (in seconds
+ * since the beginning of the epoch). This will be used to increase softExpiration
+ * if the user doesn't use Adblock Plus for some time.
+ * @type Number
+ */
+ get lastCheck()
+ {
+ return this._lastCheck;
+ },
+ set lastCheck(value)
+ {
+ if (value != this._lastCheck)
+ {
+ let oldValue = this._lastCheck;
+ this._lastCheck = value;
+ FilterNotifier.triggerListeners("subscription.lastCheck", this, value, oldValue);
+ }
+ return this._lastCheck;
+ },
+
+ /**
+ * Hard expiration time of the filter subscription (in seconds since the beginning of the epoch)
+ * @type Number
+ */
+ expires: 0,
+
+ /**
+ * Soft expiration time of the filter subscription (in seconds since the beginning of the epoch)
+ * @type Number
+ */
+ softExpiration: 0,
+
+ /**
+ * Number of download failures since last success
+ * @type Number
+ */
+ get errors()
+ {
+ return this._errors;
+ },
+ set errors(value)
+ {
+ if (value != this._errors)
+ {
+ let oldValue = this._errors;
+ this._errors = value;
+ FilterNotifier.triggerListeners("subscription.errors", this, value, oldValue);
+ }
+ return this._errors;
+ },
+
+ /**
+ * Version of the subscription data retrieved on last successful download
+ * @type Number
+ */
+ version: 0,
+
+ /**
+ * Minimal Adblock Plus version required for this subscription
+ * @type String
+ */
+ requiredVersion: null,
+
+ /**
+ * Should be true if requiredVersion is higher than current Adblock Plus version
+ * @type Boolean
+ */
+ upgradeRequired: false,
+
+ /**
+ * Should be true if the Privatemode: header is set to true in the subscription
+ * @type Boolean
+ */
+ privateMode: false,
+
+ /**
+ * See Subscription.serialize()
+ */
+ serialize: function(buffer)
+ {
+ RegularSubscription.prototype.serialize.call(this, buffer);
+ if (this.downloadStatus)
+ buffer.push("downloadStatus=" + this.downloadStatus);
+ if (this.lastSuccess)
+ buffer.push("lastSuccess=" + this.lastSuccess);
+ if (this.lastCheck)
+ buffer.push("lastCheck=" + this.lastCheck);
+ if (this.expires)
+ buffer.push("expires=" + this.expires);
+ if (this.softExpiration)
+ buffer.push("softExpiration=" + this.softExpiration);
+ if (this.errors)
+ buffer.push("errors=" + this.errors);
+ if (this.version)
+ buffer.push("version=" + this.version);
+ if (this.requiredVersion)
+ buffer.push("requiredVersion=" + this.requiredVersion);
+ if (this.privateMode)
+ buffer.push("privateMode=" + this.privateMode);
+ }
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/sync.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/sync.js
new file mode 100644
index 0000000..05eeced
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/sync.js
@@ -0,0 +1,459 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Firefox Sync integration
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {FilterStorage} = require("filterStorage");
+let {FilterNotifier} = require("filterNotifier");
+let {Synchronizer} = require("synchronizer");
+let {Subscription, SpecialSubscription, DownloadableSubscription, ExternalSubscription} = require("subscriptionClasses");
+let {Filter, ActiveFilter} = require("filterClasses");
+
+// Firefox Sync classes are set later in initEngine()
+let Service, Engines, SyncEngine, Store, Tracker;
+
+/**
+ * ID of the only record stored
+ * @type String
+ */
+let filtersRecordID = "6fad6286-8207-46b6-aa39-8e0ce0bd7c49";
+
+let Sync = exports.Sync =
+{
+ /**
+ * Will be set to true if/when Weave starts up.
+ * @type Boolean
+ */
+ initialized: false,
+
+ /**
+ * Whether Weave requested us to track changes.
+ * @type Boolean
+ */
+ trackingEnabled: false,
+
+ /**
+ * Returns Adblock Plus sync engine.
+ * @result Engine
+ */
+ getEngine: function()
+ {
+ if (this.initialized)
+ return Engines.get("adblockplus");
+ else
+ return null;
+ }
+};
+
+/**
+ * Listens to notifications from Sync service.
+ */
+let SyncServiceObserver =
+{
+ init: function()
+ {
+ try
+ {
+ let {Status, STATUS_DISABLED, CLIENT_NOT_CONFIGURED} = Cu.import("resource://services-sync/status.js", null);
+ Sync.initialized = Status.ready;
+ Sync.trackingEnabled = (Status.service != STATUS_DISABLED && Status.service != CLIENT_NOT_CONFIGURED);
+ }
+ catch (e)
+ {
+ return;
+ }
+
+ if (Sync.initialized)
+ this.initEngine();
+ else
+ Services.obs.addObserver(this, "weave:service:ready", true);
+ Services.obs.addObserver(this, "weave:engine:start-tracking", true);
+ Services.obs.addObserver(this, "weave:engine:stop-tracking", true);
+
+ onShutdown.add(function()
+ {
+ try
+ {
+ Services.obs.removeObserver(this, "weave:service:ready");
+ } catch (e) {}
+ Services.obs.removeObserver(this, "weave:engine:start-tracking");
+ Services.obs.removeObserver(this, "weave:engine:stop-tracking");
+ }.bind(this));
+ },
+
+ initEngine: function()
+ {
+ ({Engines, SyncEngine, Store, Tracker} = Cu.import("resource://services-sync/engines.js"));
+ if (typeof Engines == "undefined")
+ {
+ ({Service} = Cu.import("resource://services-sync/service.js"));
+ Engines = Service.engineManager;
+ }
+
+ ABPEngine.prototype.__proto__ = SyncEngine.prototype;
+ ABPStore.prototype.__proto__ = Store.prototype;
+ ABPTracker.prototype.__proto__ = Tracker.prototype;
+
+ Engines.register(ABPEngine);
+ onShutdown.add(function()
+ {
+ Engines.unregister("adblockplus");
+ });
+ },
+
+ observe: function(subject, topic, data)
+ {
+ switch (topic)
+ {
+ case "weave:service:ready":
+ if (Sync.initialized)
+ return;
+
+ this.initEngine();
+ Sync.initialized = true;
+ break;
+ case "weave:engine:start-tracking":
+ Sync.trackingEnabled = true;
+ if (trackerInstance)
+ trackerInstance.startTracking();
+ break;
+ case "weave:engine:stop-tracking":
+ Sync.trackingEnabled = false;
+ if (trackerInstance)
+ trackerInstance.stopTracking();
+ break;
+ }
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
+};
+
+function ABPEngine()
+{
+ SyncEngine.call(this, "AdblockPlus", Service);
+}
+ABPEngine.prototype =
+{
+ _storeObj: ABPStore,
+ _trackerObj: ABPTracker,
+ version: 1,
+
+ _reconcile: function(item)
+ {
+ // Always process server data, we will do the merging ourselves
+ return true;
+ }
+};
+
+function ABPStore(name, engine)
+{
+ Store.call(this, name, engine);
+}
+ABPStore.prototype =
+{
+ getAllIDs: function()
+ {
+ let result = {}
+ result[filtersRecordID] = true;
+ return result;
+ },
+
+ changeItemID: function(oldId, newId)
+ {
+ // This should not be called, our engine doesn't implement _findDupe
+ throw Cr.NS_ERROR_UNEXPECTED;
+ },
+
+ itemExists: function(id)
+ {
+ // Only one id exists so far
+ return (id == filtersRecordID);
+ },
+
+ createRecord: function(id, collection)
+ {
+ let record = new ABPEngine.prototype._recordObj(collection, id);
+ if (id == filtersRecordID)
+ {
+ record.cleartext = {
+ id: id,
+ subscriptions: [],
+ };
+ for (let subscription of FilterStorage.subscriptions)
+ {
+ if (subscription instanceof ExternalSubscription)
+ continue;
+
+ let subscriptionEntry =
+ {
+ url: subscription.url,
+ disabled: subscription.disabled
+ };
+ if (subscription instanceof SpecialSubscription)
+ {
+ subscriptionEntry.filters = [];
+ for (let filter of subscription.filters)
+ {
+ let filterEntry = {text: filter.text};
+ if (filter instanceof ActiveFilter)
+ filterEntry.disabled = filter.disabled;
+ subscriptionEntry.filters.push(filterEntry);
+ }
+ }
+ else
+ subscriptionEntry.title = subscription.title;
+ record.cleartext.subscriptions.push(subscriptionEntry);
+ }
+
+ // Data sent, forget about local changes now
+ trackerInstance.clearPrivateChanges()
+ }
+ else
+ record.deleted = true;
+
+ return record;
+ },
+
+ create: function(record)
+ {
+ // This should not be called because our record list doesn't change but
+ // call update just in case.
+ this.update(record);
+ },
+
+ update: function(record)
+ {
+ if (record.id != filtersRecordID)
+ return;
+
+ this._log.trace("Merging in remote data");
+
+ let data = record.cleartext.subscriptions;
+
+ // First make sure we have the same subscriptions on both sides
+ let seenSubscription = {__proto__: null};
+ for (let remoteSubscription of data)
+ {
+ seenSubscription[remoteSubscription.url] = true;
+ if (remoteSubscription.url in FilterStorage.knownSubscriptions)
+ {
+ let subscription = FilterStorage.knownSubscriptions[remoteSubscription.url];
+ if (!trackerInstance.didSubscriptionChange(remoteSubscription))
+ {
+ // Only change local subscription if there were no changes, otherwise dismiss remote changes
+ subscription.disabled = remoteSubscription.disabled;
+ if (subscription instanceof DownloadableSubscription)
+ subscription.title = remoteSubscription.title;
+ }
+ }
+ else if (!trackerInstance.didSubscriptionChange(remoteSubscription))
+ {
+ // Subscription was added remotely, add it locally as well
+ let subscription = Subscription.fromURL(remoteSubscription.url);
+ if (!subscription)
+ continue;
+
+ subscription.disabled = remoteSubscription.disabled;
+ if (subscription instanceof DownloadableSubscription)
+ {
+ subscription.title = remoteSubscription.title;
+ FilterStorage.addSubscription(subscription);
+ Synchronizer.execute(subscription);
+ }
+ }
+ }
+
+ for (let subscription of FilterStorage.subscriptions.slice())
+ {
+ if (!(subscription.url in seenSubscription) && subscription instanceof DownloadableSubscription && !trackerInstance.didSubscriptionChange(subscription))
+ {
+ // Subscription was removed remotely, remove it locally as well
+ FilterStorage.removeSubscription(subscription);
+ }
+ }
+
+ // Now sync the custom filters
+ let seenFilter = {__proto__: null};
+ for (let remoteSubscription of data)
+ {
+ if (!("filters" in remoteSubscription))
+ continue;
+
+ for (let remoteFilter of remoteSubscription.filters)
+ {
+ seenFilter[remoteFilter.text] = true;
+
+ let filter = Filter.fromText(remoteFilter.text);
+ if (trackerInstance.didFilterChange(filter))
+ continue;
+
+ if (filter.subscriptions.some((subscription) => subscription instanceof SpecialSubscription))
+ {
+ // Filter might have been changed remotely
+ if (filter instanceof ActiveFilter)
+ filter.disabled = remoteFilter.disabled;
+ }
+ else
+ {
+ // Filter was added remotely, add it locally as well
+ FilterStorage.addFilter(filter);
+ }
+ }
+ }
+
+ for (let subscription of FilterStorage.subscriptions)
+ {
+ if (!(subscription instanceof SpecialSubscription))
+ continue;
+
+ for (let filter of subscription.filters.slice())
+ {
+ if (!(filter.text in seenFilter) && !trackerInstance.didFilterChange(filter))
+ {
+ // Filter was removed remotely, remove it locally as well
+ FilterStorage.removeFilter(filter);
+ }
+ }
+ }
+
+ // Merge done, forget about local changes now
+ trackerInstance.clearPrivateChanges()
+ },
+
+ remove: function(record)
+ {
+ // Shouldn't be called but if it is - ignore
+ },
+
+ wipe: function()
+ {
+ this._log.trace("Got wipe command, removing all data");
+
+ for (let subscription of FilterStorage.subscriptions.slice())
+ {
+ if (subscription instanceof DownloadableSubscription)
+ FilterStorage.removeSubscription(subscription);
+ else if (subscription instanceof SpecialSubscription)
+ {
+ for (let filter of subscription.filters.slice())
+ FilterStorage.removeFilter(filter);
+ }
+ }
+
+ // Data wiped, forget about local changes now
+ trackerInstance.clearPrivateChanges()
+ }
+};
+
+/**
+ * Hack to allow store to use the tracker - store tracker pointer globally.
+ */
+let trackerInstance = null;
+
+function ABPTracker(name, engine)
+{
+ Tracker.call(this, name, engine);
+
+ this.privateTracker = new Tracker(name + ".private", engine);
+ trackerInstance = this;
+
+ this.onChange = this.onChange.bind(this);
+
+ if (Sync.trackingEnabled)
+ this.startTracking();
+}
+ABPTracker.prototype =
+{
+ privateTracker: null,
+
+ startTracking: function()
+ {
+ FilterNotifier.addListener(this.onChange);
+ },
+
+ stopTracking: function()
+ {
+ FilterNotifier.removeListener(this.onChange);
+ },
+
+ clearPrivateChanges: function()
+ {
+ this.privateTracker.clearChangedIDs();
+ },
+
+ addPrivateChange: function(id)
+ {
+ // Ignore changes during syncing
+ if (this.ignoreAll)
+ return;
+
+ this.addChangedID(filtersRecordID);
+ this.privateTracker.addChangedID(id);
+ this.score += 10;
+ },
+
+ didSubscriptionChange: function(subscription)
+ {
+ return ("subscription " + subscription.url) in this.privateTracker.changedIDs;
+ },
+
+ didFilterChange: function(filter)
+ {
+ return ("filter " + filter.text) in this.privateTracker.changedIDs;
+ },
+
+ onChange: function(action, item)
+ {
+ switch (action)
+ {
+ case "subscription.updated":
+ if ("oldSubscription" in item)
+ {
+ // Subscription moved to a new address
+ this.addPrivateChange("subscription " + item.url);
+ this.addPrivateChange("subscription " + item.oldSubscription.url);
+ }
+ else if (item instanceof SpecialSubscription)
+ {
+ // User's filters changed via Preferences window
+ for (let filter of item.filters)
+ this.addPrivateChange("filter " + filter.text);
+ for (let filter of item.oldFilters)
+ this.addPrivateChange("filter " + filter.text);
+ }
+ break;
+ case "subscription.added":
+ case "subscription.removed":
+ case "subscription.disabled":
+ case "subscription.title":
+ this.addPrivateChange("subscription " + item.url);
+ break;
+ case "filter.added":
+ case "filter.removed":
+ case "filter.disabled":
+ this.addPrivateChange("filter " + item.text);
+ break;
+ }
+ }
+};
+
+SyncServiceObserver.init();
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/synchronizer.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/synchronizer.js
new file mode 100644
index 0000000..b9f9e29
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/synchronizer.js
@@ -0,0 +1,330 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Manages synchronization of filter subscriptions.
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {TimeLine} = require("timeline");
+let {Downloader, Downloadable,
+ MILLIS_IN_SECOND, MILLIS_IN_MINUTE, MILLIS_IN_HOUR, MILLIS_IN_DAY} = require("downloader");
+let {Filter, CommentFilter} = require("filterClasses");
+let {FilterStorage} = require("filterStorage");
+let {FilterNotifier} = require("filterNotifier");
+let {Prefs} = require("prefs");
+let {Subscription, DownloadableSubscription} = require("subscriptionClasses");
+let {Utils} = require("utils");
+
+let INITIAL_DELAY = 6 * MILLIS_IN_MINUTE;
+let CHECK_INTERVAL = 1 * MILLIS_IN_HOUR;
+let DEFAULT_EXPIRATION_INTERVAL = 5 * MILLIS_IN_DAY;
+
+/**
+ * The object providing actual downloading functionality.
+ * @type Downloader
+ */
+let downloader = null;
+
+/**
+ * This object is responsible for downloading filter subscriptions whenever
+ * necessary.
+ * @class
+ */
+let Synchronizer = exports.Synchronizer =
+{
+ /**
+ * Called on module startup.
+ */
+ init: function()
+ {
+ TimeLine.enter("Entered Synchronizer.init()");
+
+ downloader = new Downloader(this._getDownloadables.bind(this), INITIAL_DELAY, CHECK_INTERVAL);
+ onShutdown.add(function()
+ {
+ downloader.cancel();
+ });
+
+ downloader.onExpirationChange = this._onExpirationChange.bind(this);
+ downloader.onDownloadStarted = this._onDownloadStarted.bind(this);
+ downloader.onDownloadSuccess = this._onDownloadSuccess.bind(this);
+ downloader.onDownloadError = this._onDownloadError.bind(this);
+
+ TimeLine.leave("Synchronizer.init() done");
+ },
+
+ /**
+ * Checks whether a subscription is currently being downloaded.
+ * @param {String} url URL of the subscription
+ * @return {Boolean}
+ */
+ isExecuting: function(url)
+ {
+ return downloader.isDownloading(url);
+ },
+
+ /**
+ * Starts the download of a subscription.
+ * @param {DownloadableSubscription} subscription Subscription to be downloaded
+ * @param {Boolean} manual true for a manually started download (should not trigger fallback requests)
+ */
+ execute: function(subscription, manual)
+ {
+ downloader.download(this._getDownloadable(subscription, manual));
+ },
+
+ /**
+ * Yields Downloadable instances for all subscriptions that can be downloaded.
+ */
+ _getDownloadables: function()
+ {
+ if (!Prefs.subscriptions_autoupdate)
+ return;
+
+ for (let subscription of FilterStorage.subscriptions)
+ {
+ if (subscription instanceof DownloadableSubscription)
+ yield this._getDownloadable(subscription, false);
+ }
+ },
+
+ /**
+ * Creates a Downloadable instance for a subscription.
+ */
+ _getDownloadable: function(/**Subscription*/ subscription, /**Boolean*/ manual) /**Downloadable*/
+ {
+ let result = new Downloadable(subscription.url);
+ if (subscription.lastDownload != subscription.lastSuccess)
+ result.lastError = subscription.lastDownload * MILLIS_IN_SECOND;
+ result.lastCheck = subscription.lastCheck * MILLIS_IN_SECOND;
+ result.lastVersion = subscription.version;
+ result.softExpiration = subscription.softExpiration * MILLIS_IN_SECOND;
+ result.hardExpiration = subscription.expires * MILLIS_IN_SECOND;
+ result.manual = manual;
+ result.privateMode = subscription.privateMode;
+ return result;
+ },
+
+ _onExpirationChange: function(downloadable)
+ {
+ let subscription = Subscription.fromURL(downloadable.url);
+ subscription.lastCheck = Math.round(downloadable.lastCheck / MILLIS_IN_SECOND);
+ subscription.softExpiration = Math.round(downloadable.softExpiration / MILLIS_IN_SECOND);
+ subscription.expires = Math.round(downloadable.hardExpiration / MILLIS_IN_SECOND);
+ },
+
+ _onDownloadStarted: function(downloadable)
+ {
+ let subscription = Subscription.fromURL(downloadable.url);
+ FilterNotifier.triggerListeners("subscription.downloadStatus", subscription);
+ },
+
+ _onDownloadSuccess: function(downloadable, responseText, errorCallback, redirectCallback)
+ {
+ let lines = responseText.split(/[\r\n]+/);
+ let match = /\[Adblock(?:\s*Plus\s*([\d\.]+)?)?\]/i.exec(lines[0]);
+ if (!match)
+ return errorCallback("synchronize_invalid_data");
+ let minVersion = match[1];
+
+ // Don't remove parameter comments immediately but add them to a list first,
+ // they need to be considered in the checksum calculation.
+ let remove = [];
+ let params = {
+ redirect: null,
+ homepage: null,
+ title: null,
+ version: null,
+ privatemode: null,
+ expires: null
+ };
+ for (let i = 0; i < lines.length; i++)
+ {
+ let match = /^\s*!\s*(\w+)\s*:\s*(.*)/.exec(lines[i]);
+ if (match)
+ {
+ let keyword = match[1].toLowerCase();
+ let value = match[2];
+ if (keyword in params)
+ {
+ params[keyword] = value;
+ remove.push(i);
+ }
+ else if (keyword == "checksum")
+ {
+ lines.splice(i--, 1);
+ let checksum = Utils.generateChecksum(lines);
+ if (checksum && checksum != value.replace(/=+$/, ""))
+ return errorCallback("synchronize_checksum_mismatch");
+ }
+ }
+ }
+
+ if (params.redirect)
+ return redirectCallback(params.redirect);
+
+ // Handle redirects
+ let subscription = Subscription.fromURL(downloadable.redirectURL || downloadable.url);
+ if (downloadable.redirectURL && downloadable.redirectURL != downloadable.url)
+ {
+ let oldSubscription = Subscription.fromURL(downloadable.url);
+ subscription.title = oldSubscription.title;
+ subscription.disabled = oldSubscription.disabled;
+ subscription.lastCheck = oldSubscription.lastCheck;
+
+ let listed = (oldSubscription.url in FilterStorage.knownSubscriptions);
+ if (listed)
+ FilterStorage.removeSubscription(oldSubscription);
+
+ delete Subscription.knownSubscriptions[oldSubscription.url];
+
+ if (listed)
+ FilterStorage.addSubscription(subscription);
+ }
+
+ // The download actually succeeded
+ subscription.lastSuccess = subscription.lastDownload = Math.round(Date.now() / MILLIS_IN_SECOND);
+ subscription.downloadStatus = "synchronize_ok";
+ subscription.errors = 0;
+
+ // Remove lines containing parameters
+ for (let i = remove.length - 1; i >= 0; i--)
+ lines.splice(remove[i], 1);
+
+ // Process parameters
+ if (params.homepage)
+ {
+ let uri = Utils.makeURI(params.homepage);
+ if (uri && (uri.scheme == "http" || uri.scheme == "https"))
+ subscription.homepage = uri.spec;
+ }
+
+ if (params.privatemode)
+ {
+ subscription.privateMode = (params.privatemode == "true");
+ }
+
+ if (params.title)
+ {
+ subscription.title = params.title;
+ subscription.fixedTitle = true;
+ }
+ else
+ subscription.fixedTitle = false;
+
+ subscription.version = (params.version ? parseInt(params.version, 10) : 0);
+
+ let expirationInterval = DEFAULT_EXPIRATION_INTERVAL;
+ if (params.expires)
+ {
+ let match = /^(\d+)\s*(h)?/.exec(params.expires);
+ if (match)
+ {
+ let interval = parseInt(match[1], 10);
+ if (match[2])
+ expirationInterval = interval * MILLIS_IN_HOUR;
+ else
+ expirationInterval = interval * MILLIS_IN_DAY;
+ }
+ }
+
+ let [softExpiration, hardExpiration] = downloader.processExpirationInterval(expirationInterval);
+ subscription.softExpiration = Math.round(softExpiration / MILLIS_IN_SECOND);
+ subscription.expires = Math.round(hardExpiration / MILLIS_IN_SECOND);
+
+ delete subscription.requiredVersion;
+ delete subscription.upgradeRequired;
+ if (minVersion)
+ {
+ let {addonVersion} = require("info");
+ subscription.requiredVersion = minVersion;
+ if (Services.vc.compare(minVersion, addonVersion) > 0)
+ subscription.upgradeRequired = true;
+ }
+
+ // Process filters
+ lines.shift();
+ let filters = [];
+ for (let line of lines)
+ {
+ line = Filter.normalize(line);
+ if (line)
+ filters.push(Filter.fromText(line));
+ }
+
+ FilterStorage.updateSubscriptionFilters(subscription, filters);
+
+ return undefined;
+ },
+
+ _onDownloadError: function(downloadable, downloadURL, error, channelStatus, responseStatus, redirectCallback)
+ {
+ let subscription = Subscription.fromURL(downloadable.url);
+ subscription.lastDownload = Math.round(Date.now() / MILLIS_IN_SECOND);
+ subscription.downloadStatus = error;
+
+ // Request fallback URL if necessary - for automatic updates only
+ if (!downloadable.manual)
+ {
+ subscription.errors++;
+
+ if (redirectCallback && subscription.errors >= Prefs.subscriptions_fallbackerrors && /^https?:\/\//i.test(subscription.url))
+ {
+ subscription.errors = 0;
+
+ let fallbackURL = Prefs.subscriptions_fallbackurl;
+ let {addonVersion} = require("info");
+ fallbackURL = fallbackURL.replace(/%VERSION%/g, encodeURIComponent(addonVersion));
+ fallbackURL = fallbackURL.replace(/%SUBSCRIPTION%/g, encodeURIComponent(subscription.url));
+ fallbackURL = fallbackURL.replace(/%URL%/g, encodeURIComponent(downloadURL));
+ fallbackURL = fallbackURL.replace(/%ERROR%/g, encodeURIComponent(error));
+ fallbackURL = fallbackURL.replace(/%CHANNELSTATUS%/g, encodeURIComponent(channelStatus));
+ fallbackURL = fallbackURL.replace(/%RESPONSESTATUS%/g, encodeURIComponent(responseStatus));
+
+ let request = new XMLHttpRequest();
+ request.mozBackgroundRequest = true;
+ request.open("GET", fallbackURL);
+ request.overrideMimeType("text/plain");
+ request.channel.loadFlags = request.channel.loadFlags |
+ request.channel.INHIBIT_CACHING |
+ request.channel.VALIDATE_ALWAYS;
+ request.addEventListener("load", function(ev)
+ {
+ if (onShutdown.done)
+ return;
+
+ if (!(subscription.url in FilterStorage.knownSubscriptions))
+ return;
+
+ let match = /^(\d+)(?:\s+(\S+))?$/.exec(request.responseText);
+ if (match && match[1] == "301" && match[2] && /^https?:\/\//i.test(match[2])) // Moved permanently
+ redirectCallback(match[2]);
+ else if (match && match[1] == "410") // Gone
+ {
+ let data = "[Adblock]\n" + subscription.filters.map((f) => f.text).join("\n");
+ redirectCallback("data:text/plain," + encodeURIComponent(data));
+ }
+ }, false);
+ request.send(null);
+ }
+ }
+ },
+};
+Synchronizer.init();
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/timeline.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/timeline.js
new file mode 100644
index 0000000..18c10fb
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/timeline.js
@@ -0,0 +1,155 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Debugging module used for load time measurements.
+ */
+
+let nestingCounter = 0;
+let firstTimeStamp = null;
+let lastTimeStamp = null;
+
+let asyncActions = {__proto__: null};
+
+/**
+ * Time logging module, used to measure startup time of Adblock Plus (development builds only).
+ * @class
+ */
+let TimeLine = exports.TimeLine = {
+ /**
+ * Logs an event to console together with the time it took to get there.
+ */
+ log: function(/**String*/ message, /**Boolean*/ _forceDisplay)
+ {
+ if (!_forceDisplay && nestingCounter <= 0)
+ return;
+
+ let now = Date.now();
+ let diff = lastTimeStamp ? Math.round(now - lastTimeStamp) : "first event";
+ lastTimeStamp = now;
+
+ // Indent message depending on current nesting level
+ for (let i = 0; i < nestingCounter; i++)
+ message = "* " + message;
+
+ // Pad message with spaces
+ let padding = [];
+ for (let i = message.toString().length; i < 80; i++)
+ padding.push(" ");
+ dump("[" + now + "] ABP timeline: " + message + padding.join("") + "\t (" + diff + ")\n");
+ },
+
+ /**
+ * Called to indicate that application entered a block that needs to be timed.
+ */
+ enter: function(/**String*/ message)
+ {
+ if (nestingCounter <= 0)
+ firstTimeStamp = Date.now();
+
+ this.log(message, true);
+ nestingCounter = (nestingCounter <= 0 ? 1 : nestingCounter + 1);
+ },
+
+ /**
+ * Called when application exited a block that TimeLine.enter() was called for.
+ * @param {String} message message to be logged
+ * @param {String} [asyncAction] identifier of a pending async action
+ */
+ leave: function(message, asyncAction)
+ {
+ if (typeof asyncAction != "undefined")
+ message += " (async action pending)";
+
+ nestingCounter--;
+ this.log(message, true);
+
+ if (nestingCounter <= 0)
+ {
+ if (firstTimeStamp !== null)
+ dump("ABP timeline: Total time elapsed: " + Math.round(Date.now() - firstTimeStamp) + "\n");
+ firstTimeStamp = null;
+ lastTimeStamp = null;
+ }
+
+ if (typeof asyncAction != "undefined")
+ {
+ if (asyncAction in asyncActions)
+ dump("ABP timeline: Warning: Async action " + asyncAction + " already executing\n");
+ asyncActions[asyncAction] = {start: Date.now(), total: 0};
+ }
+ },
+
+ /**
+ * Called when the application starts processing of an async action.
+ */
+ asyncStart: function(/**String*/ asyncAction)
+ {
+ if (asyncAction in asyncActions)
+ {
+ let action = asyncActions[asyncAction];
+ if ("currentStart" in action)
+ dump("ABP timeline: Warning: Processing reentered for async action " + asyncAction + "\n");
+ action.currentStart = Date.now();
+ }
+ else
+ dump("ABP timeline: Warning: Async action " + asyncAction + " is unknown\n");
+ },
+
+ /**
+ * Called when the application finishes processing of an async action.
+ */
+ asyncEnd: function(/**String*/ asyncAction)
+ {
+ if (asyncAction in asyncActions)
+ {
+ let action = asyncActions[asyncAction];
+ if ("currentStart" in action)
+ {
+ action.total += Date.now() - action.currentStart;
+ delete action.currentStart;
+ }
+ else
+ dump("ABP timeline: Warning: Processing not entered for async action " + asyncAction + "\n");
+ }
+ else
+ dump("ABP timeline: Warning: Async action " + asyncAction + " is unknown\n");
+ },
+
+ /**
+ * Called when an async action is done and its time can be logged.
+ */
+ asyncDone: function(/**String*/ asyncAction)
+ {
+ if (asyncAction in asyncActions)
+ {
+ let action = asyncActions[asyncAction];
+ let now = Date.now();
+ let diff = now - action.start;
+ if ("currentStart" in action)
+ dump("ABP timeline: Warning: Still processing for async action " + asyncAction + "\n");
+
+ let message = "Async action " + asyncAction + " done";
+ let padding = [];
+ for (let i = message.toString().length; i < 80; i++)
+ padding.push(" ");
+ dump("[" + now + "] ABP timeline: " + message + padding.join("") + "\t (" + action.total + "/" + diff + ")\n");
+ }
+ else
+ dump("ABP timeline: Warning: Async action " + asyncAction + " is unknown\n");
+ }
+};
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/ui.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/ui.js
new file mode 100644
index 0000000..d7551c2
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/ui.js
@@ -0,0 +1,1973 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+let {Utils} = require("utils");
+let {Prefs} = require("prefs");
+let {Policy} = require("contentPolicy");
+let {FilterStorage} = require("filterStorage");
+let {FilterNotifier} = require("filterNotifier");
+let {RequestNotifier} = require("requestNotifier");
+let {Filter} = require("filterClasses");
+let {Subscription, SpecialSubscription, DownloadableSubscription} = require("subscriptionClasses");
+let {Synchronizer} = require("synchronizer");
+let {KeySelector} = require("keySelector");
+let {Notification} = require("notification");
+let {initAntiAdblockNotification} = require("antiadblockInit");
+
+let CustomizableUI = null;
+
+/**
+ * Filter corresponding with "disable on site" menu item (set in fillIconMent()).
+ * @type Filter
+ */
+let siteWhitelist = null;
+/**
+ * Filter corresponding with "disable on site" menu item (set in fillIconMenu()).
+ * @type Filter
+ */
+let pageWhitelist = null;
+
+/**
+ * Window containing the detached list of blockable items.
+ * @type Window
+ */
+let detachedBottombar = null;
+
+/**
+ * Object initializing add-on options, observes add-on manager notifications
+ * about add-on options being opened.
+ * @type nsIObserver
+ */
+let optionsObserver =
+{
+ init: function()
+ {
+ Services.obs.addObserver(this, "addon-options-displayed", true);
+ onShutdown.add(function()
+ {
+ Services.obs.removeObserver(this, "addon-options-displayed");
+ }.bind(this));
+ },
+
+ /**
+ * Initializes options in add-on manager when they show up.
+ */
+ initOptionsDoc: function(/**Document*/ doc)
+ {
+ function hideElement(id, hide)
+ {
+ let element = doc.getElementById(id);
+ if (element)
+ element.collapsed = hide;
+ }
+ function setChecked(id, checked)
+ {
+ let element = doc.getElementById(id);
+ if (element)
+ element.value = checked;
+ }
+ function addCommandHandler(id, handler)
+ {
+ let element = doc.getElementById(id);
+ if (element)
+ element.addEventListener("command", handler, false);
+ }
+
+ Utils.splitAllLabels(doc);
+
+ addCommandHandler("adblockplus-filters", UI.openFiltersDialog.bind(UI));
+
+ let {Sync} = require("sync");
+ let syncEngine = Sync.getEngine();
+ hideElement("adblockplus-sync", !syncEngine);
+
+ let {defaultToolbarPosition, statusbarPosition} = require("appSupport");
+ let hasToolbar = defaultToolbarPosition;
+ let hasStatusBar = statusbarPosition;
+
+ hideElement("adblockplus-showintoolbar", !hasToolbar);
+ hideElement("adblockplus-showinstatusbar", !hasStatusBar);
+
+ let checkbox = doc.querySelector("setting[type=bool]");
+ if (checkbox)
+ initCheckboxes();
+
+ function initCheckboxes()
+ {
+ if (!("value" in checkbox))
+ {
+ // XBL bindings didn't apply yet (bug 708397), try later
+ Utils.runAsync(initCheckboxes);
+ return;
+ }
+
+ setChecked("adblockplus-savestats", Prefs.savestats);
+ addCommandHandler("adblockplus-savestats", function()
+ {
+ UI.toggleSaveStats(doc.defaultView);
+ this.value = Prefs.savestats;
+ });
+
+ let hasAcceptableAds = FilterStorage.subscriptions.some((subscription) => subscription instanceof DownloadableSubscription &&
+ subscription.url == Prefs.subscriptions_exceptionsurl);
+ setChecked("adblockplus-acceptableAds", hasAcceptableAds);
+ addCommandHandler("adblockplus-acceptableAds", function()
+ {
+ this.value = UI.toggleAcceptableAds();
+ });
+
+ setChecked("adblockplus-sync", syncEngine && syncEngine.enabled);
+ addCommandHandler("adblockplus-sync", function()
+ {
+ this.value = UI.toggleSync();
+ });
+
+ setChecked("adblockplus-showintoolbar", UI.isToolbarIconVisible());
+ addCommandHandler("adblockplus-showintoolbar", function()
+ {
+ UI.toggleToolbarIcon();
+ this.value = UI.isToolbarIconVisible();
+ });
+
+ let list = doc.getElementById("adblockplus-subscription-list");
+ if (list)
+ {
+ // Load subscriptions data
+ let request = new XMLHttpRequest();
+ request.mozBackgroundRequest = true;
+ request.open("GET", "chrome://adblockplus/content/ui/subscriptions.xml");
+ request.addEventListener("load", function()
+ {
+ if (onShutdown.done)
+ return;
+
+ let currentSubscription = FilterStorage.subscriptions.filter((subscription) => subscription instanceof DownloadableSubscription &&
+ subscription.url != Prefs.subscriptions_exceptionsurl);
+ currentSubscription = (currentSubscription.length ? currentSubscription[0] : null);
+
+ let subscriptions =request.responseXML.getElementsByTagName("subscription");
+ for (let i = 0; i < subscriptions.length; i++)
+ {
+ let item = subscriptions[i];
+ let url = item.getAttribute("url");
+ if (!url)
+ continue;
+
+ list.appendItem(item.getAttribute("title"), url, null);
+ if (currentSubscription && url == currentSubscription.url)
+ list.selectedIndex = list.itemCount - 1;
+
+ if (currentSubscription && list.selectedIndex < 0)
+ {
+ list.appendItem(currentSubscription.title, currentSubscription.url, null);
+ list.selectedIndex = list.itemCount - 1;
+ }
+ }
+
+ var listener = function()
+ {
+ if (list.value)
+ UI.setSubscription(list.value, list.label);
+ }
+ list.addEventListener("command", listener, false);
+
+ // xul:menulist in Fennec is broken and doesn't trigger any events
+ // on selection. Have to detect selectIndex changes instead.
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=891736
+ list.watch("selectedIndex", function(prop, oldval, newval)
+ {
+ Utils.runAsync(listener);
+ return newval;
+ });
+ }, false);
+ request.send();
+ }
+ }
+ },
+
+ observe: function(subject, topic, data)
+ {
+ let {addonID} = require("info")
+ if (data != addonID)
+ return;
+
+ this.initOptionsDoc(subject.QueryInterface(Ci.nsIDOMDocument));
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference])
+};
+optionsObserver.init();
+
+/**
+ * Session restore observer instance, stored to prevent it from being garbage
+ * collected.
+ * @type SessionRestoreObserver
+ */
+let sessionRestoreObserver = null;
+
+/**
+ * Observer waiting for the browsing session to be restored on startup.
+ */
+function SessionRestoreObserver(/**function*/ callback)
+{
+ sessionRestoreObserver = this;
+
+ this.callback = callback;
+ Services.obs.addObserver(this, "sessionstore-windows-restored", true);
+
+ // Just in case, don't wait longer than 5 seconds
+ this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ this.timer.init(this, 5000, Ci.nsITimer.TYPE_ONE_SHOT);
+}
+SessionRestoreObserver.prototype =
+{
+ callback: null,
+ timer: null,
+ observe: function(subject, topic, data)
+ {
+ Services.obs.removeObserver(this, "sessionstore-windows-restored");
+ sessionRestoreObserver = null;
+
+ this.timer.cancel();
+ this.timer = null;
+
+ if (!onShutdown.done)
+ this.callback();
+ },
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference])
+}
+
+/**
+ * Timer used to delay notification handling.
+ * @type nsITimer
+ */
+let notificationTimer = null;
+
+let UI = exports.UI =
+{
+ /**
+ * Gets called on startup, initializes UI integration.
+ */
+ init: function()
+ {
+ // We should call initDone once both overlay and filters are loaded
+ let overlayLoaded = false;
+ let filtersLoaded = false;
+ let sessionRestored = false;
+
+ // Start loading overlay
+ let request = new XMLHttpRequest();
+ request.mozBackgroundRequest = true;
+ request.open("GET", "chrome://adblockplus/content/ui/overlay.xul");
+ request.addEventListener("load", function(event)
+ {
+ if (onShutdown.done)
+ return;
+
+ this.processOverlay(request.responseXML.documentElement);
+
+ // Don't wait for the rest of the startup sequence, add icon already
+ this.addToolbarButton();
+
+ overlayLoaded = true;
+ if (overlayLoaded && filtersLoaded && sessionRestored)
+ this.initDone();
+ }.bind(this), false);
+ request.send(null);
+
+ // Wait for filters to load
+ if (FilterStorage._loading)
+ {
+ let listener = function(action)
+ {
+ if (action != "load")
+ return;
+
+ FilterNotifier.removeListener(listener);
+ filtersLoaded = true;
+ if (overlayLoaded && filtersLoaded && sessionRestored)
+ this.initDone();
+ }.bind(this);
+ FilterNotifier.addListener(listener);
+ }
+ else
+ filtersLoaded = true;
+
+ // Initialize UI after the session is restored
+ let window = this.currentWindow;
+ if (!window && "nsISessionStore" in Ci)
+ {
+ // No application windows yet, the application must be starting up. Wait
+ // for session to be restored before initializing our UI.
+ new SessionRestoreObserver(function()
+ {
+ sessionRestored = true;
+ if (overlayLoaded && filtersLoaded && sessionRestored)
+ this.initDone();
+ }.bind(this));
+ }
+ else
+ sessionRestored = true;
+ },
+
+ /**
+ * Provesses overlay document data and initializes overlay property.
+ */
+ processOverlay: function(/**Element*/ root)
+ {
+ Utils.splitAllLabels(root);
+
+ let specialElements = {"abp-status-popup": true, "abp-status": true, "abp-toolbarbutton": true, "abp-menuitem": true, "abp-bottombar-container": true};
+
+ this.overlay = {all: []};
+
+ // Remove whitespace text nodes
+ let walker = root.ownerDocument.createTreeWalker(
+ root, Ci.nsIDOMNodeFilter.SHOW_TEXT,
+ (node) => !/\S/.test(node.nodeValue), false
+ );
+ let whitespaceNodes = [];
+ while (walker.nextNode())
+ whitespaceNodes.push(walker.currentNode);
+
+ for (let i = 0; i < whitespaceNodes.length; i++)
+ whitespaceNodes[i].parentNode.removeChild(whitespaceNodes[i]);
+
+ // Put overlay elements into appropriate fields
+ while (root.firstElementChild)
+ {
+ let child = root.firstElementChild;
+ if (child.getAttribute("id") in specialElements)
+ this.overlay[child.getAttribute("id")] = child;
+ else
+ this.overlay.all.push(child);
+ root.removeChild(child);
+ }
+
+ // Read overlay attributes
+ this.overlay.attributes = {};
+ for (let i = 0; i < root.attributes.length; i++)
+ this.overlay.attributes[root.attributes[i].name] = root.attributes[i].value;
+
+ // Copy context menu into the toolbar icon and Tools menu item
+ function fixId(element, newId)
+ {
+ if (element.hasAttribute("id"))
+ element.setAttribute("id", element.getAttribute("id").replace("abp-status", newId));
+
+ for (let i = 0, len = element.children.length; i < len; i++)
+ fixId(element.children[i], newId);
+
+ return element;
+ }
+
+ if ("abp-status-popup" in this.overlay)
+ {
+ let menuSource = this.overlay["abp-status-popup"];
+ delete this.overlay["abp-status-popup"];
+
+ if (this.overlay.all.length)
+ this.overlay.all[0].appendChild(menuSource);
+ if ("abp-toolbarbutton" in this.overlay)
+ this.overlay["abp-toolbarbutton"].appendChild(fixId(menuSource.cloneNode(true), "abp-toolbar"));
+ if ("abp-menuitem" in this.overlay)
+ this.overlay["abp-menuitem"].appendChild(fixId(menuSource.cloneNode(true), "abp-menuitem"));
+ }
+ },
+
+ /**
+ * Gets called once the initialization is finished and Adblock Plus elements
+ * can be added to the UI.
+ */
+ initDone: function()
+ {
+ // The icon might be added already, make sure its state is correct
+ this.updateState();
+
+ // Listen for pref and filters changes
+ Prefs.addListener(function(name)
+ {
+ if (name == "enabled" || name == "defaulttoolbaraction" || name == "defaultstatusbaraction")
+ this.updateState();
+ else if (name == "showinstatusbar")
+ {
+ for (let window in this.applicationWindows)
+ this.updateStatusbarIcon(window);
+ }
+ }.bind(this));
+ FilterNotifier.addListener(function(action)
+ {
+ if (/^(filter|subscription)\.(added|removed|disabled|updated)$/.test(action) || action == "load")
+ this.updateState();
+ }.bind(this));
+
+ notificationTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
+ notificationTimer.initWithCallback(this.showNextNotification.bind(this),
+ 3 * 60 * 1000, Ci.nsITimer.TYPE_ONE_SHOT);
+ onShutdown.add(() => notificationTimer.cancel());
+
+ // Add "anti-adblock messages" notification
+ initAntiAdblockNotification();
+
+ let documentCreationObserver = {
+ observe: function(subject, topic, data)
+ {
+ if (!(subject instanceof Ci.nsIDOMWindow))
+ return;
+
+ this.showNextNotification(subject.location.href);
+ }.bind(UI)
+ };
+ Services.obs.addObserver(documentCreationObserver, "content-document-global-created", false);
+ onShutdown.add(function()
+ {
+ Services.obs.removeObserver(documentCreationObserver, "content-document-global-created", false);
+ });
+
+ // Execute first-run actions if a window is open already, otherwise it
+ // will happen in applyToWindow() when a window is opened.
+ this.firstRunActions(this.currentWindow);
+ },
+
+ addToolbarButton: function()
+ {
+ let {WindowObserver} = require("windowObserver");
+ new WindowObserver(this);
+
+ let {defaultToolbarPosition} = require("appSupport");
+ if ("abp-toolbarbutton" in this.overlay && defaultToolbarPosition)
+ {
+ try
+ {
+ ({CustomizableUI}) = Cu.import("resource:///modules/CustomizableUI.jsm", null);
+ }
+ catch (e)
+ {
+ // No built-in CustomizableUI API, use our own implementation.
+ ({CustomizableUI}) = require("customizableUI");
+ }
+
+ CustomizableUI.createWidget({
+ id: "abp-toolbarbutton",
+ type: "custom",
+ positionAttribute: "abp-iconposition", // For emulation only
+ defaultArea: defaultToolbarPosition.parent,
+ defaultBefore: defaultToolbarPosition.before, // For emulation only
+ defaultAfter: defaultToolbarPosition.after, // For emulation only
+ removable: true,
+ onBuild: function(document)
+ {
+ let node = document.importNode(this.overlay["abp-toolbarbutton"], true);
+ node.addEventListener("click", this.onIconClick, false);
+ node.addEventListener("command", this.onIconClick, false);
+ this.updateIconState(document.defaultView, node);
+ return node;
+ }.bind(this),
+ onAdded: function(node)
+ {
+ // For emulation only, this callback isn't part of the official
+ // CustomizableUI API.
+ this.updateIconState(node.ownerDocument.defaultView, node);
+ }.bind(this),
+ });
+ onShutdown.add(CustomizableUI.destroyWidget.bind(CustomizableUI, "abp-toolbarbutton"));
+ }
+ },
+
+ firstRunActions: function(window)
+ {
+ if (this.firstRunDone || !window || FilterStorage._loading)
+ return;
+
+ this.firstRunDone = true;
+
+ let {addonVersion} = require("info");
+ let prevVersion = Prefs.currentVersion;
+ if (prevVersion != addonVersion)
+ {
+ Prefs.currentVersion = addonVersion;
+ this.addSubscription(window, prevVersion);
+ }
+ },
+
+ /**
+ * Will be set to true after the check whether first-run actions should run
+ * has been performed.
+ * @type Boolean
+ */
+ firstRunDone: false,
+
+ /**
+ * Initializes Adblock Plus UI in a window.
+ */
+ applyToWindow: function(/**Window*/ window, /**Boolean*/ noDelay)
+ {
+ let {delayInitialization, isKnownWindow, getBrowser, addBrowserLocationListener, addBrowserClickListener} = require("appSupport");
+ if (window.document.documentElement.id == "CustomizeToolbarWindow" || isKnownWindow(window))
+ {
+ // Add style processing instruction
+ let style = window.document.createProcessingInstruction("xml-stylesheet", 'class="adblockplus-node" href="chrome://adblockplus/skin/overlay.css" type="text/css"');
+ window.document.insertBefore(style, window.document.firstChild);
+ }
+
+ if (!isKnownWindow(window))
+ return;
+
+ // Thunderbird windows will not be initialized at this point, execute
+ // delayed
+ if (!noDelay && delayInitialization)
+ {
+ Utils.runAsync(this.applyToWindow.bind(this, window, true));
+ return;
+ }
+
+ // Add general items to the document
+ for (let i = 0; i < this.overlay.all.length; i++)
+ window.document.documentElement.appendChild(this.overlay.all[i].cloneNode(true));
+
+ // Add status bar icon
+ this.updateStatusbarIcon(window);
+
+ // Add tools menu item
+ if ("abp-menuitem" in this.overlay)
+ {
+ let {toolsMenu} = require("appSupport");
+ let [parent, before] = this.resolveInsertionPoint(window, toolsMenu);
+ if (parent)
+ parent.insertBefore(this.overlay["abp-menuitem"].cloneNode(true), before);
+ }
+
+ // Attach event handlers
+ for (let i = 0; i < eventHandlers.length; i++)
+ {
+ let [id, event, handler] = eventHandlers[i];
+ let element = window.document.getElementById(id);
+ if (element)
+ element.addEventListener(event, handler.bind(null, window), false);
+ }
+ window.addEventListener("popupshowing", this.onPopupShowing, false);
+ window.addEventListener("keypress", this.onKeyPress, false);
+
+ addBrowserLocationListener(window, function()
+ {
+ this.updateIconState(window, window.document.getElementById("abp-status"));
+ this.updateIconState(window, window.document.getElementById("abp-toolbarbutton"));
+ }.bind(this));
+ addBrowserClickListener(window, this.onBrowserClick.bind(this, window));
+
+ window.document.getElementById("abp-notification-close").addEventListener("command", function(event)
+ {
+ window.document.getElementById("abp-notification").hidePopup();
+ }, false);
+
+ // First-run actions?
+ this.firstRunActions(window);
+
+ // Some people actually switch off browser.frames.enabled and are surprised
+ // that things stop working...
+ window.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIWebNavigation)
+ .QueryInterface(Ci.nsIDocShell)
+ .allowSubframes = true;
+ },
+
+ /**
+ * Removes Adblock Plus UI from a window.
+ */
+ removeFromWindow: function(/**Window*/ window)
+ {
+ let {isKnownWindow, removeBrowserLocationListeners, removeBrowserClickListeners} = require("appSupport");
+ if (window.document.documentElement.id == "CustomizeToolbarWindow" || isKnownWindow(window))
+ {
+ // Remove style processing instruction
+ for (let child = window.document.firstChild; child; child = child.nextSibling)
+ if (child.nodeType == child.PROCESSING_INSTRUCTION_NODE && child.data.indexOf("adblockplus-node") >= 0)
+ child.parentNode.removeChild(child);
+ }
+
+ if (!isKnownWindow(window))
+ return;
+
+ for (let id in this.overlay)
+ {
+ if (id == "all")
+ {
+ let list = this.overlay[id];
+ for (let i = 0; i < list.length; i++)
+ {
+ let clone = window.document.getElementById(list[i].getAttribute("id"));
+ if (clone)
+ clone.parentNode.removeChild(clone);
+ }
+ }
+ else
+ {
+ let clone = window.document.getElementById(id);
+ if (clone)
+ clone.parentNode.removeChild(clone);
+ }
+ }
+
+ window.removeEventListener("popupshowing", this.onPopupShowing, false);
+ window.removeEventListener("keypress", this.onKeyPress, false);
+ removeBrowserLocationListeners(window);
+ removeBrowserClickListeners(window);
+ },
+
+ /**
+ * The overlay information to be used when adding elements to the UI.
+ * @type Object
+ */
+ overlay: null,
+
+ /**
+ * Iterator for application windows that Adblock Plus should apply to.
+ * @type Iterator
+ */
+ get applicationWindows()
+ {
+ let {isKnownWindow} = require("appSupport");
+
+ let enumerator = Services.wm.getZOrderDOMWindowEnumerator(null, true);
+ if (!enumerator.hasMoreElements())
+ {
+ // On Linux the list returned will be empty, see bug 156333. Fall back to random order.
+ enumerator = Services.wm.getEnumerator(null);
+ }
+ while (enumerator.hasMoreElements())
+ {
+ let window = enumerator.getNext().QueryInterface(Ci.nsIDOMWindow);
+ if (isKnownWindow(window))
+ yield window;
+ }
+ },
+
+ /**
+ * Returns the top-most application window or null if none exists.
+ * @type Window
+ */
+ get currentWindow()
+ {
+ for (let window of this.applicationWindows)
+ return window;
+ return null;
+ },
+
+ /**
+ * Opens a URL in the browser window. If browser window isn't passed as parameter,
+ * this function attempts to find a browser window. If an event is passed in
+ * it should be passed in to the browser if possible (will e.g. open a tab in
+ * background depending on modifiers keys).
+ */
+ loadInBrowser: function(/**String*/ url, /**Window*/ currentWindow, /**Event*/ event)
+ {
+ if (!currentWindow)
+ currentWindow = this.currentWindow;
+
+ let {addTab} = require("appSupport");
+ if (currentWindow && addTab)
+ addTab(currentWindow, url, event);
+ else
+ {
+ let protocolService = Cc["@mozilla.org/uriloader/external-protocol-service;1"].getService(Ci.nsIExternalProtocolService);
+ protocolService.loadURI(Services.io.newURI(url, null, null), null);
+ }
+ },
+
+ /**
+ * Opens a pre-defined documentation link in the browser window. This will
+ * send the UI language to adblockplus.org so that the correct language
+ * version of the page can be selected.
+ */
+ loadDocLink: function(/**String*/ linkID, /**Window*/ window)
+ {
+ let link = Utils.getDocLink(linkID);
+ this.loadInBrowser(link, window);
+ },
+
+
+ /**
+ * Brings up the filter composer dialog to block an item.
+ */
+ blockItem: function(/**Window*/ window, /**Node*/ node, /**RequestEntry*/ item)
+ {
+ if (!item)
+ return;
+
+ window.openDialog("chrome://adblockplus/content/ui/composer.xul", "_blank", "chrome,centerscreen,resizable,dialog=no,dependent", [node], item);
+ },
+
+ /**
+ * Opens filter preferences dialog or focuses an already open dialog.
+ * @param {Filter} [filter] filter to be selected
+ */
+ openFiltersDialog: function(filter)
+ {
+ let existing = Services.wm.getMostRecentWindow("abp:filters");
+ if (existing)
+ {
+ try
+ {
+ existing.focus();
+ } catch (e) {}
+ if (filter)
+ existing.SubscriptionActions.selectFilter(filter);
+ }
+ else
+ {
+ Services.ww.openWindow(null, "chrome://adblockplus/content/ui/filters.xul", "_blank", "chrome,centerscreen,resizable,dialog=no", {wrappedJSObject: filter});
+ }
+ },
+
+ /**
+ * Opens report wizard for the current page.
+ */
+ openReportDialog: function(/**Window*/ window)
+ {
+ let wnd = Services.wm.getMostRecentWindow("abp:sendReport");
+ if (wnd)
+ wnd.focus();
+ else
+ {
+ let uri = this.getCurrentLocation(window);
+ if (uri)
+ {
+ let {getBrowser} = require("appSupport");
+ window.openDialog("chrome://adblockplus/content/ui/sendReport.xul", "_blank", "chrome,centerscreen,resizable=no", getBrowser(window).contentWindow, uri);
+ }
+ }
+ },
+
+ /**
+ * Opens our contribution page.
+ */
+ openContributePage: function(/**Window*/ window)
+ {
+ this.loadDocLink("contribute", window);
+ },
+
+ /**
+ * Executed on first run, adds a filter subscription and notifies that user
+ * about that.
+ */
+ addSubscription: function(/**Window*/ window, /**String*/ prevVersion)
+ {
+ // Add "acceptable ads" subscription for new users and user updating from old ABP versions.
+ // Don't add it for users of privacy subscriptions (use a hardcoded list for now).
+ let addAcceptable = (Services.vc.compare(prevVersion, "2.0") < 0);
+ let privacySubscriptions = {
+ "https://easylist-downloads.adblockplus.org/easyprivacy+easylist.txt": true,
+ "https://easylist-downloads.adblockplus.org/easyprivacy.txt": true,
+ "https://secure.fanboy.co.nz/fanboy-tracking.txt": true,
+ "https://fanboy-adblock-list.googlecode.com/hg/fanboy-adblocklist-stats.txt": true,
+ "https://bitbucket.org/fanboy/fanboyadblock/raw/tip/fanboy-adblocklist-stats.txt": true,
+ "https://hg01.codeplex.com/fanboyadblock/raw-file/tip/fanboy-adblocklist-stats.txt": true,
+ "https://adversity.googlecode.com/hg/Adversity-Tracking.txt": true
+ };
+ if (FilterStorage.subscriptions.some((subscription) => subscription.url == Prefs.subscriptions_exceptionsurl || subscription.url in privacySubscriptions))
+ addAcceptable = false;
+
+ // Don't add subscription if the user has a subscription already
+ let addSubscription = true;
+ //if (FilterStorage.subscriptions.some((subscription) => subscription instanceof DownloadableSubscription && subscription.url != Prefs.subscriptions_exceptionsurl))
+ addSubscription = false;
+
+ // If this isn't the first run, only add subscription if the user has no custom filters
+ if (addSubscription && Services.vc.compare(prevVersion, "0.0") > 0)
+ {
+ if (FilterStorage.subscriptions.some((subscription) => subscription.url != Prefs.subscriptions_exceptionsurl && subscription.filters.length))
+ addSubscription = false;
+ }
+
+ // Add "acceptable ads" subscription
+ if (false)
+ {
+ let subscription = Subscription.fromURL(Prefs.subscriptions_exceptionsurl);
+ if (subscription)
+ {
+ subscription.title = "Allow non-intrusive advertising";
+ FilterStorage.addSubscription(subscription);
+ if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+ Synchronizer.execute(subscription);
+ }
+ else
+ addAcceptable = false;
+ }
+
+ /* Add "anti-adblock messages" subscription for new users and users updating from old ABP versions
+ if (Services.vc.compare(prevVersion, "2.5") < 0)
+ {
+ let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl);
+ if (subscription && !(subscription.url in FilterStorage.knownSubscriptions))
+ {
+ subscription.disabled = true;
+ FilterStorage.addSubscription(subscription);
+ if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+ Synchronizer.execute(subscription);
+ }
+ }*/
+
+ // Extra subsriptions
+ let subscription = Subscription.fromURL("http://gnuzilla.gnu.org/filters/blacklist.txt");
+ subscription.disabled = false;
+ FilterStorage.addSubscription(subscription);
+ Synchronizer.execute(subscription);
+
+ let subscription = Subscription.fromURL("http://gnuzilla.gnu.org/filters/third-party.txt");
+ subscription.disabled = false;
+ FilterStorage.addSubscription(subscription);
+ Synchronizer.execute(subscription);
+
+ let subscription = Subscription.fromURL("http://gnuzilla.gnu.org/filters/javascript.txt");
+ subscription.disabled = false;
+ FilterStorage.addSubscription(subscription);
+ Synchronizer.execute(subscription);
+
+ if (!addSubscription && !addAcceptable)
+ return;
+
+ function notifyUser()
+ {return;
+ let {addTab} = require("appSupport");
+ if (addTab)
+ {
+ addTab(window, "chrome://adblockplus/content/ui/firstRun.html");
+ }
+ else
+ {
+ let dialogSource = '\
+ <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>\
+ <dialog xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" onload="document.title=content.document.title" buttons="accept" width="500" height="600">\
+ <iframe type="content-primary" flex="1" src="chrome://adblockplus/content/ui/firstRun.html"/>\
+ </dialog>';
+ Services.ww.openWindow(window,
+ "data:application/vnd.mozilla.xul+xml," + encodeURIComponent(dialogSource),
+ "_blank", "chrome,centerscreen,resizable,dialog=no", null);
+ }
+ }
+
+ if (addSubscription)
+ {
+ // Load subscriptions data
+ let request = new XMLHttpRequest();
+ request.mozBackgroundRequest = true;
+ request.open("GET", "chrome://adblockplus/content/ui/subscriptions.xml");
+ request.addEventListener("load", function()
+ {
+ if (onShutdown.done)
+ return;
+
+ let node = Utils.chooseFilterSubscription(request.responseXML.getElementsByTagName("subscription"));
+ let subscription = (node ? Subscription.fromURL(node.getAttribute("url")) : null);
+ if (subscription)
+ {
+ FilterStorage.addSubscription(subscription);
+ subscription.disabled = false;
+ subscription.title = node.getAttribute("title");
+ subscription.homepage = node.getAttribute("homepage");
+ if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+ Synchronizer.execute(subscription);
+
+ notifyUser();
+ }
+ }, false);
+ request.send();
+ }
+ else
+ notifyUser();
+ },
+
+ /**
+ * Handles clicks inside the browser's content area, will intercept clicks on
+ * abp: links. This can be called either with an event object or with the link
+ * target (if it is the former then link target will be retrieved from event
+ * target).
+ */
+ onBrowserClick: function (/**Window*/ window, /**Event*/ event, /**String*/ linkTarget)
+ {
+ if (event)
+ {
+ // Ignore right-clicks
+ if (event.button == 2)
+ return;
+
+ // Search the link associated with the click
+ let link = event.target;
+ while (link && !(link instanceof Ci.nsIDOMHTMLAnchorElement))
+ link = link.parentNode;
+
+ if (!link || link.protocol != "abp:")
+ return;
+
+ // This is our link - make sure the browser doesn't handle it
+ event.preventDefault();
+ event.stopPropagation();
+
+ linkTarget = link.href;
+ }
+
+ let match = /^abp:\/*subscribe\/*\?(.*)/i.exec(linkTarget);
+ if (!match)
+ return;
+
+ // Decode URL parameters
+ let title = null;
+ let url = null;
+ let mainSubscriptionTitle = null;
+ let mainSubscriptionURL = null;
+ for (let param of match[1].split('&'))
+ {
+ let parts = param.split("=", 2);
+ if (parts.length != 2 || !/\S/.test(parts[1]))
+ continue;
+ switch (parts[0])
+ {
+ case "title":
+ title = decodeURIComponent(parts[1]);
+ break;
+ case "location":
+ url = decodeURIComponent(parts[1]);
+ break;
+ case "requiresTitle":
+ mainSubscriptionTitle = decodeURIComponent(parts[1]);
+ break;
+ case "requiresLocation":
+ mainSubscriptionURL = decodeURIComponent(parts[1]);
+ break;
+ }
+ }
+ if (!url)
+ return;
+
+ // Default title to the URL
+ if (!title)
+ title = url;
+
+ // Main subscription needs both title and URL
+ if (mainSubscriptionTitle && !mainSubscriptionURL)
+ mainSubscriptionTitle = null;
+ if (mainSubscriptionURL && !mainSubscriptionTitle)
+ mainSubscriptionURL = null;
+
+ // Trim spaces in title and URL
+ title = title.replace(/^\s+/, "").replace(/\s+$/, "");
+ url = url.replace(/^\s+/, "").replace(/\s+$/, "");
+ if (mainSubscriptionURL)
+ {
+ mainSubscriptionTitle = mainSubscriptionTitle.replace(/^\s+/, "").replace(/\s+$/, "");
+ mainSubscriptionURL = mainSubscriptionURL.replace(/^\s+/, "").replace(/\s+$/, "");
+ }
+
+ // Verify that the URL is valid
+ url = Utils.makeURI(url);
+ if (!url || (url.scheme != "http" && url.scheme != "https" && url.scheme != "ftp"))
+ return;
+ url = url.spec;
+
+ if (mainSubscriptionURL)
+ {
+ mainSubscriptionURL = Utils.makeURI(mainSubscriptionURL);
+ if (!mainSubscriptionURL || (mainSubscriptionURL.scheme != "http" && mainSubscriptionURL.scheme != "https" && mainSubscriptionURL.scheme != "ftp"))
+ mainSubscriptionURL = mainSubscriptionTitle = null;
+ else
+ mainSubscriptionURL = mainSubscriptionURL.spec;
+ }
+
+ this.openSubscriptionDialog(window, url, title, mainSubscriptionURL, mainSubscriptionTitle);
+ },
+
+ /**
+ * Opens a dialog letting the user confirm/adjust a filter subscription to
+ * be added.
+ */
+ openSubscriptionDialog: function(/**Window*/ window, /**String*/ url, /**String*/ title, /**String*/ mainURL, /**String*/ mainTitle)
+ {
+ let subscription = {url: url, title: title, disabled: false, external: false,
+ mainSubscriptionTitle: mainTitle, mainSubscriptionURL: mainURL};
+ window.openDialog("chrome://adblockplus/content/ui/subscriptionSelection.xul", "_blank",
+ "chrome,centerscreen,resizable,dialog=no", subscription, null);
+ },
+
+ /**
+ * Retrieves the current location of the browser.
+ */
+ getCurrentLocation: function(/**Window*/ window) /**nsIURI*/
+ {
+ let {getCurrentLocation} = require("appSupport");
+ let result = getCurrentLocation(window);
+ return (result ? Utils.unwrapURL(result) : null);
+ },
+
+ /**
+ * Looks up an element with given ID in the window. If a list of IDs is given
+ * will try all of them until an element exists.
+ */
+ findElement: function(/**Window*/ window, /**String|String[]*/ id) /**Element*/
+ {
+ if (id instanceof Array)
+ {
+ for (let candidate of id)
+ {
+ let result = window.document.getElementById(candidate);
+ if (result)
+ return result;
+ }
+ return null;
+ }
+ else
+ return window.document.getElementById(id);
+ },
+
+ /**
+ * Resolves an insertion point as specified in appSupport module. Returns
+ * two elements: the parent element and the element to insert before.
+ */
+ resolveInsertionPoint: function(/**Window*/ window, /**Object*/ insertionPoint) /**Element[]*/
+ {
+ let parent = null;
+ let before = null;
+ if (insertionPoint)
+ {
+ if ("parent" in insertionPoint)
+ parent = this.findElement(window, insertionPoint.parent);
+
+ if (parent && "before" in insertionPoint)
+ before = this.findElement(window, insertionPoint.before);
+
+ if (parent && !before && "after" in insertionPoint)
+ {
+ let after = this.findElement(window, insertionPoint.after);
+ if (after)
+ before = after.nextElementSibling;
+ }
+
+ if (before && before.parentNode != parent)
+ before = null;
+ }
+
+ return [parent, before];
+ },
+
+ /**
+ * Toggles visibility state of the toolbar icon.
+ */
+ toggleToolbarIcon: function()
+ {
+ if (!CustomizableUI)
+ return;
+ if (this.isToolbarIconVisible())
+ CustomizableUI.removeWidgetFromArea("abp-toolbarbutton");
+ else
+ {
+ let {defaultToolbarPosition} = require("appSupport");
+ CustomizableUI.addWidgetToArea("abp-toolbarbutton", defaultToolbarPosition.parent);
+ }
+ },
+
+ /**
+ * Updates Adblock Plus icon state for all windows.
+ */
+ updateState: function()
+ {
+ for (let window in this.applicationWindows)
+ {
+ this.updateIconState(window, window.document.getElementById("abp-status"));
+ this.updateIconState(window, window.document.getElementById("abp-toolbarbutton"));
+ }
+ },
+
+ /**
+ * Updates Adblock Plus icon state for a single application window.
+ */
+ updateIconState: function(/**Window*/ window, /**Element*/ icon)
+ {
+ if (!icon)
+ return;
+
+ let state = (Prefs.enabled ? "active" : "disabled");
+ if (state == "active")
+ {
+ let location = this.getCurrentLocation(window);
+ if (location && Policy.isWhitelisted(location.spec))
+ state = "whitelisted";
+ }
+
+ let popupId = "abp-status-popup";
+ if (icon.localName == "statusbarpanel")
+ {
+ if (Prefs.defaultstatusbaraction == 0)
+ {
+ icon.setAttribute("popup", popupId);
+ icon.removeAttribute("context");
+ }
+ else
+ {
+ icon.removeAttribute("popup");
+ icon.setAttribute("context", popupId);
+ }
+ }
+ else
+ {
+ if (Prefs.defaulttoolbaraction == 0)
+ {
+ icon.setAttribute("type", "menu");
+ icon.removeAttribute("context");
+ }
+ else
+ {
+ icon.setAttribute("type", "menu-button");
+ icon.setAttribute("context", popupId);
+ }
+ }
+
+ icon.setAttribute("abpstate", state);
+ },
+
+ /**
+ * Shows or hides status bar icons in all windows, according to pref.
+ */
+ updateStatusbarIcon: function(/**Window*/ window)
+ {
+ if (!("abp-status" in this.overlay))
+ return;
+
+ let {statusbarPosition} = require("appSupport");
+ if (!statusbarPosition)
+ return;
+
+ let icon = window.document.getElementById("abp-status");
+ if (Prefs.showinstatusbar && !icon)
+ {
+ let [parent, before] = this.resolveInsertionPoint(window, statusbarPosition);
+ if (!parent)
+ return;
+
+ parent.insertBefore(this.overlay["abp-status"].cloneNode(true), before);
+
+ icon = window.document.getElementById("abp-status");
+ this.updateIconState(window, icon);
+ icon.addEventListener("click", this.onIconClick, false);
+ }
+ else if (!Prefs.showinstatusbar && icon)
+ icon.parentNode.removeChild(icon);
+ },
+
+ /**
+ * Toggles the value of a boolean preference.
+ */
+ togglePref: function(/**String*/ pref)
+ {
+ Prefs[pref] = !Prefs[pref];
+ },
+
+ /**
+ * If the given filter is already in user's list, removes it from the list. Otherwise adds it.
+ */
+ toggleFilter: function(/**Filter*/ filter)
+ {
+ if (filter.subscriptions.length)
+ {
+ if (filter.disabled || filter.subscriptions.some((subscription) => !(subscription instanceof SpecialSubscription)))
+ filter.disabled = !filter.disabled;
+ else
+ FilterStorage.removeFilter(filter);
+ }
+ else
+ FilterStorage.addFilter(filter);
+ },
+
+
+ /**
+ * Toggles "Count filter hits" option.
+ */
+ toggleSaveStats: function(window)
+ {
+ if (Prefs.savestats)
+ {
+ if (!Utils.confirm(window, Utils.getString("clearStats_warning")))
+ return;
+
+ FilterStorage.resetHitCounts();
+ Prefs.savestats = false;
+ }
+ else
+ Prefs.savestats = true;
+ },
+
+ /**
+ * Sets the current filter subscription in a single-subscription scenario,
+ * all other subscriptions will be removed.
+ */
+ setSubscription: function(url, title)
+ {
+ let subscription = Subscription.fromURL(url);
+ let currentSubscriptions = FilterStorage.subscriptions.filter(
+ ((subscription) => subscription instanceof DownloadableSubscription && subscription.url != Prefs.subscriptions_exceptionsurl)
+ );
+ if (!subscription || currentSubscriptions.indexOf(subscription) >= 0)
+ return;
+
+ for (let i = 0; i < currentSubscriptions.length; i++)
+ FilterStorage.removeSubscription(currentSubscriptions[i]);
+
+ subscription.title = title;
+ FilterStorage.addSubscription(subscription);
+ if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+ Synchronizer.execute(subscription);
+ },
+
+ /**
+ * Adds or removes "non-intrisive ads" filter list.
+ * @return {Boolean} true if the filter list has been added
+ **/
+ toggleAcceptableAds: function()
+ {
+ let subscription = Subscription.fromURL(Prefs.subscriptions_exceptionsurl);
+ if (!subscription)
+ return false;
+
+ subscription.disabled = false;
+ subscription.title = "Allow non-intrusive advertising";
+ if (subscription.url in FilterStorage.knownSubscriptions)
+ FilterStorage.removeSubscription(subscription);
+ else
+ {
+ FilterStorage.addSubscription(subscription);
+ if (subscription instanceof DownloadableSubscription && !subscription.lastDownload)
+ Synchronizer.execute(subscription);
+ }
+
+ return (subscription.url in FilterStorage.knownSubscriptions);
+ },
+
+ /**
+ * Toggles the pref for the Adblock Plus sync engine.
+ * @return {Boolean} new state of the sync engine
+ */
+ toggleSync: function()
+ {
+ let {Sync} = require("sync");
+ let syncEngine = Sync.getEngine();
+ if (syncEngine)
+ {
+ syncEngine.enabled = !syncEngine.enabled;
+ return syncEngine.enabled;
+ }
+ else
+ return false;
+ },
+
+ /**
+ * Tests whether blockable items list is currently open.
+ */
+ isBottombarOpen: function(/**Window*/ window) /**Boolean*/
+ {
+ if (detachedBottombar && !detachedBottombar.closed)
+ return true;
+
+ return !!window.document.getElementById("abp-bottombar");
+ },
+
+ /**
+ * Called when some pop-up in the application window shows up, initializes
+ * pop-ups related to Adblock Plus.
+ */
+ onPopupShowing: function(/**Event*/ event)
+ {
+ if (event.defaultPrevented)
+ return;
+
+ let popup = event.originalTarget;
+
+ let {contentContextMenu} = require("appSupport");
+ if ((typeof contentContextMenu == "string" && popup.id == contentContextMenu) ||
+ (contentContextMenu instanceof Array && contentContextMenu.indexOf(popup.id) >= 0))
+ {
+ this.fillContentContextMenu(popup);
+ }
+ else if (popup.id == "abp-tooltip")
+ this.fillIconTooltip(event, popup.ownerDocument.defaultView);
+ else
+ {
+ let match = /^(abp-(?:toolbar|status|menuitem)-)popup$/.exec(popup.id);
+ if (match)
+ this.fillIconMenu(event, popup.ownerDocument.defaultView, match[1]);
+ }
+ },
+
+ /**
+ * Handles click on toolbar and status bar icons.
+ */
+ onIconClick: function(/**Event*/ event)
+ {
+ if (event.eventPhase != event.AT_TARGET)
+ return;
+
+ let isToolbar = (event.target.localName != "statusbarpanel");
+ let action = 0;
+ if ((isToolbar && event.type == "command") || (!isToolbar && event.button == 0))
+ action = (isToolbar ? Prefs.defaulttoolbaraction : Prefs.defaultstatusbaraction);
+ else if (event.button == 1)
+ action = 3;
+
+ let window = event.target.ownerDocument.defaultView;
+ if (action == 1)
+ this.toggleBottombar(window);
+ else if (action == 2)
+ this.openFiltersDialog();
+ else if (action == 3)
+ {
+ // If there is a whitelisting rule for current page - remove it (reenable).
+ // Otherwise flip "enabled" pref.
+ if (!this.removeWhitelist(window))
+ this.togglePref("enabled");
+ }
+ },
+
+ /**
+ * Removes/disables the exception rule applying for the current page.
+ */
+ removeWhitelist: function(/**Window*/ window)
+ {
+ let location = this.getCurrentLocation(window);
+ let filter = null;
+ if (location)
+ filter = Policy.isWhitelisted(location.spec);
+ if (filter && filter.subscriptions.length && !filter.disabled)
+ {
+ UI.toggleFilter(filter);
+ return true;
+ }
+ return false;
+ },
+
+ /**
+ * Updates state of the icon tooltip.
+ */
+ fillIconTooltip: function(/**Event*/ event, /**Window*/ window)
+ {
+ let E = (id) => window.document.getElementById(id);
+
+ let node = window.document.tooltipNode;
+ if (!node || !node.hasAttribute("tooltip"))
+ {
+ event.preventDefault();
+ return;
+ }
+
+ // Prevent tooltip from overlapping menu
+ for (let id of ["abp-toolbar-popup", "abp-status-popup"])
+ {
+ let element = E(id);
+ if (element && element.state == "open")
+ {
+ event.preventDefault();
+ return;
+ }
+ }
+
+ let type = (node.id == "abp-toolbarbutton" ? "toolbar" : "statusbar");
+ let action = parseInt(Prefs["default" + type + "action"]);
+ if (isNaN(action))
+ action = -1;
+
+ let actionDescr = E("abp-tooltip-action");
+ actionDescr.hidden = (action < 0 || action > 3);
+ if (!actionDescr.hidden)
+ actionDescr.setAttribute("value", Utils.getString("action" + action + "_tooltip"));
+
+ let statusDescr = E("abp-tooltip-status");
+ let state = node.getAttribute("abpstate");
+ let statusStr = Utils.getString(state + "_tooltip");
+ if (state == "active")
+ {
+ let [activeSubscriptions, activeFilters] = FilterStorage.subscriptions.reduce(function([subscriptions, filters], current)
+ {
+ if (current instanceof SpecialSubscription)
+ return [subscriptions, filters + current.filters.filter((filter) => !filter.disabled).length];
+ else if (!current.disabled && !(Prefs.subscriptions_exceptionscheckbox && current.url == Prefs.subscriptions_exceptionsurl))
+ return [subscriptions + 1, filters];
+ else
+ return [subscriptions, filters]
+ }, [0, 0]);
+
+ statusStr = statusStr.replace(/\?1\?/, activeSubscriptions).replace(/\?2\?/, activeFilters);
+ }
+ statusDescr.setAttribute("value", statusStr);
+
+ let activeFilters = [];
+ E("abp-tooltip-blocked-label").hidden = (state != "active");
+ E("abp-tooltip-blocked").hidden = (state != "active");
+ if (state == "active")
+ {
+ let {getBrowser} = require("appSupport");
+ let stats = RequestNotifier.getWindowStatistics(getBrowser(window).contentWindow);
+
+ let blockedStr = Utils.getString("blocked_count_tooltip");
+ blockedStr = blockedStr.replace(/\?1\?/, stats ? stats.blocked : 0).replace(/\?2\?/, stats ? stats.items : 0);
+
+ if (stats && stats.whitelisted + stats.hidden)
+ {
+ blockedStr += " " + Utils.getString("blocked_count_addendum");
+ blockedStr = blockedStr.replace(/\?1\?/, stats.whitelisted).replace(/\?2\?/, stats.hidden);
+ }
+
+ E("abp-tooltip-blocked").setAttribute("value", blockedStr);
+
+ if (stats)
+ {
+ let filterSort = function(a, b)
+ {
+ return stats.filters[b] - stats.filters[a];
+ };
+ for (let filter in stats.filters)
+ activeFilters.push(filter);
+ activeFilters = activeFilters.sort(filterSort);
+ }
+
+ if (activeFilters.length > 0)
+ {
+ let filtersContainer = E("abp-tooltip-filters");
+ while (filtersContainer.firstChild)
+ filtersContainer.removeChild(filtersContainer.firstChild);
+
+ for (let i = 0; i < activeFilters.length && i < 3; i++)
+ {
+ let descr = filtersContainer.ownerDocument.createElement("description");
+ descr.setAttribute("value", activeFilters[i] + " (" + stats.filters[activeFilters[i]] + ")");
+ filtersContainer.appendChild(descr);
+ }
+ }
+ }
+
+ E("abp-tooltip-filters-label").hidden = (activeFilters.length == 0);
+ E("abp-tooltip-filters").hidden = (activeFilters.length == 0);
+ E("abp-tooltip-more-filters").hidden = (activeFilters.length <= 3);
+ },
+
+ /**
+ * Updates state of the icon context menu.
+ */
+ fillIconMenu: function(/**Event*/ event, /**Window*/ window, /**String*/ prefix)
+ {
+ function hideElement(id, hide)
+ {
+ let element = window.document.getElementById(id);
+ if (element)
+ element.hidden = hide;
+ }
+ function setChecked(id, checked)
+ {
+ let element = window.document.getElementById(id);
+ if (element)
+ element.setAttribute("checked", checked);
+ }
+ function setDisabled(id, disabled)
+ {
+ let element = window.document.getElementById(id);
+ if (element)
+ element.setAttribute("disabled", disabled);
+ }
+ function setDefault(id, isDefault)
+ {
+ let element = window.document.getElementById(id);
+ if (element)
+ element.setAttribute("default", isDefault);
+ }
+ function generateLabel(id, param)
+ {
+ let element = window.document.getElementById(id);
+ if (element)
+ element.setAttribute("label", element.getAttribute("labeltempl").replace(/\?1\?/, param));
+ }
+
+ let bottombarOpen = this.isBottombarOpen(window);
+ hideElement(prefix + "openbottombar", bottombarOpen);
+ hideElement(prefix + "closebottombar", !bottombarOpen);
+
+ hideElement(prefix + "whitelistsite", true);
+ hideElement(prefix + "whitelistpage", true);
+
+ let location = this.getCurrentLocation(window);
+ if (location && Policy.isBlockableScheme(location))
+ {
+ let host = null;
+ try
+ {
+ host = location.host.replace(/^www\./, "");
+ } catch (e) {}
+
+ if (host)
+ {
+ let ending = "|";
+ location = location.clone();
+ if (location instanceof Ci.nsIURL)
+ location.ref = "";
+ if (location instanceof Ci.nsIURL && location.query)
+ {
+ location.query = "";
+ ending = "?";
+ }
+
+ siteWhitelist = Filter.fromText("@@||" + host + "^$document");
+ setChecked(prefix + "whitelistsite", siteWhitelist.subscriptions.length && !siteWhitelist.disabled);
+ generateLabel(prefix + "whitelistsite", host);
+ hideElement(prefix + "whitelistsite", false);
+
+ pageWhitelist = Filter.fromText("@@|" + location.spec + ending + "$document");
+ setChecked(prefix + "whitelistpage", pageWhitelist.subscriptions.length && !pageWhitelist.disabled);
+ hideElement(prefix + "whitelistpage", false);
+ }
+ else
+ {
+ siteWhitelist = Filter.fromText("@@|" + location.spec + "|");
+ setChecked(prefix + "whitelistsite", siteWhitelist.subscriptions.length && !siteWhitelist.disabled);
+ generateLabel(prefix + "whitelistsite", location.spec.replace(/^mailto:/, ""));
+ hideElement(prefix + "whitelistsite", false);
+ }
+ }
+
+ setDisabled("abp-command-sendReport", !location || !Policy.isBlockableScheme(location) || location.scheme == "mailto");
+
+ setChecked(prefix + "disabled", !Prefs.enabled);
+ setChecked(prefix + "frameobjects", Prefs.frameobjects);
+ setChecked(prefix + "slowcollapse", !Prefs.fastcollapse);
+ setChecked(prefix + "savestats", Prefs.savestats);
+
+ let {defaultToolbarPosition, statusbarPosition} = require("appSupport");
+ let hasToolbar = defaultToolbarPosition;
+ let hasStatusBar = statusbarPosition;
+ hideElement(prefix + "showintoolbar", !hasToolbar || prefix == "abp-toolbar-");
+ hideElement(prefix + "showinstatusbar", !hasStatusBar);
+ hideElement(prefix + "iconSettingsSeparator", (prefix == "abp-toolbar-" || !hasToolbar) && !hasStatusBar);
+
+ setChecked(prefix + "showintoolbar", this.isToolbarIconVisible());
+ setChecked(prefix + "showinstatusbar", Prefs.showinstatusbar);
+
+ let {Sync} = require("sync");
+ let syncEngine = Sync.getEngine();
+ hideElement(prefix + "sync", !syncEngine);
+ setChecked(prefix + "sync", syncEngine && syncEngine.enabled);
+
+ let defAction = (!window.document.popupNode || window.document.popupNode.id == "abp-toolbarbutton" ?
+ Prefs.defaulttoolbaraction :
+ Prefs.defaultstatusbaraction);
+ setDefault(prefix + "openbottombar", defAction == 1);
+ setDefault(prefix + "closebottombar", defAction == 1);
+ setDefault(prefix + "filters", defAction == 2);
+ setDefault(prefix + "disabled", defAction == 3);
+
+ let popup = window.document.getElementById(prefix + "popup");
+ let items = (popup ? popup.querySelectorAll('menuitem[key]') : []);
+ for (let i = 0; i < items.length; i++)
+ {
+ let item = items[i];
+ let match = /^abp-key-/.exec(item.getAttribute("key"));
+ if (!match)
+ continue;
+
+ let name = match.input.substr(match.index + match[0].length);
+ if (!this.hotkeys)
+ this.configureKeys(window);
+ if (name in this.hotkeys)
+ {
+ let text = KeySelector.getTextForKey(this.hotkeys[name]);
+ if (text)
+ item.setAttribute("acceltext", text);
+ else
+ item.removeAttribute("acceltext");
+ }
+ }
+
+ hideElement(prefix + "contributebutton", Prefs.hideContributeButton);
+ },
+
+ /**
+ * Adds Adblock Plus menu items to the content area context menu when it shows
+ * up.
+ */
+ fillContentContextMenu: function(/**Element*/ popup)
+ {
+ let target = popup.triggerNode;
+ if (target instanceof Ci.nsIDOMHTMLMapElement || target instanceof Ci.nsIDOMHTMLAreaElement)
+ {
+ // HTML image maps will usually receive events when the mouse pointer is
+ // over a different element, get the real event target.
+ let rect = target.getClientRects()[0];
+ target = target.ownerDocument.elementFromPoint(Math.max(rect.left, 0), Math.max(rect.top, 0));
+ }
+
+ if (!target)
+ return;
+
+ let window = popup.ownerDocument.defaultView;
+ let menuItems = [];
+ let addMenuItem = function([node, nodeData])
+ {
+ let type = nodeData.typeDescr.toLowerCase();
+ if (type == "background")
+ {
+ type = "image";
+ node = null;
+ }
+
+ let label = this.overlay.attributes[type + "contextlabel"];
+ if (!label)
+ return;
+
+ let item = popup.ownerDocument.createElement("menuitem");
+ item.setAttribute("label", label);
+ item.setAttribute("class", "abp-contextmenuitem");
+ item.addEventListener("command", this.blockItem.bind(this, window, node, nodeData), false);
+ popup.appendChild(item);
+
+ menuItems.push(item);
+ }.bind(this);
+
+ // Look up data that we have for the node
+ let data = RequestNotifier.getDataForNode(target);
+ let hadImage = false;
+ if (data && !data[1].filter)
+ {
+ addMenuItem(data);
+ hadImage = (data[1].typeDescr == "IMAGE");
+ }
+
+ // Look for frame data
+ let wnd = Utils.getWindow(target);
+ if (wnd.frameElement)
+ {
+ let data = RequestNotifier.getDataForNode(wnd.frameElement, true);
+ if (data && !data[1].filter)
+ addMenuItem(data);
+ }
+
+ // Look for a background image
+ if (!hadImage)
+ {
+ let extractImageURL = function(computedStyle, property)
+ {
+ let value = computedStyle.getPropertyCSSValue(property);
+ // CSSValueList
+ if ("length" in value && value.length >= 1)
+ value = value[0];
+ // CSSValuePrimitiveType
+ if ("primitiveType" in value && value.primitiveType == value.CSS_URI)
+ return Utils.unwrapURL(value.getStringValue()).spec;
+
+ return null;
+ };
+
+ let node = target;
+ while (node)
+ {
+ if (node.nodeType == Ci.nsIDOMNode.ELEMENT_NODE)
+ {
+ let style = wnd.getComputedStyle(node, "");
+ let bgImage = extractImageURL(style, "background-image") || extractImageURL(style, "list-style-image");
+ if (bgImage)
+ {
+ let data = RequestNotifier.getDataForNode(wnd.document, true, Policy.type.IMAGE, bgImage);
+ if (data && !data[1].filter)
+ {
+ addMenuItem(data);
+ break;
+ }
+ }
+ }
+
+ node = node.parentNode;
+ }
+ }
+
+ // Add "Remove exception" menu item if necessary
+ let location = this.getCurrentLocation(window);
+ let filter = (location ? Policy.isWhitelisted(location.spec) : null);
+ if (filter && filter.subscriptions.length && !filter.disabled)
+ {
+ let label = this.overlay.attributes.whitelistcontextlabel;
+ if (!label)
+ return;
+
+ let item = popup.ownerDocument.createElement("menuitem");
+ item.setAttribute("label", label);
+ item.setAttribute("class", "abp-contextmenuitem");
+ item.addEventListener("command", this.toggleFilter.bind(this, filter), false);
+ popup.appendChild(item);
+
+ menuItems.push(item);
+ }
+
+ // Make sure to clean up everything once the context menu is closed
+ if (menuItems.length)
+ {
+ let cleanUp = function(event)
+ {
+ if (event.eventPhase != event.AT_TARGET)
+ return;
+
+ popup.removeEventListener("popuphidden", cleanUp, false);
+ for (let i = 0; i < menuItems.length; i++)
+ if (menuItems[i].parentNode)
+ menuItems[i].parentNode.removeChild(menuItems[i]);
+ }.bind(this);
+ popup.addEventListener("popuphidden", cleanUp, false);
+ }
+ },
+
+ /**
+ * Called when the user presses a key in the application window, reacts to our
+ * shortcut keys.
+ */
+ onKeyPress: function(/**Event*/ event)
+ {
+ if (!this.hotkeys)
+ this.configureKeys(event.currentTarget);
+
+ for (let key in this.hotkeys)
+ {
+ if (KeySelector.matchesKey(event, this.hotkeys[key]))
+ {
+ event.preventDefault();
+ let command = event.currentTarget.document.getElementById("abp-command-" + key);
+ if (command)
+ command.doCommand();
+ }
+ }
+ },
+
+ /**
+ * Checks whether the toolbar icon is currently displayed.
+ */
+ isToolbarIconVisible: function() /**Boolean*/
+ {
+ if (!CustomizableUI)
+ return false;
+ let placement = CustomizableUI.getPlacementOfWidget("abp-toolbarbutton");
+ return !!placement;
+ },
+
+ /**
+ * Stores the selected hotkeys, initialized when the user presses a key.
+ */
+ hotkeys: null,
+
+ /**
+ * Chooses shortcut keys that are available in the window according to
+ * preferences.
+ */
+ configureKeys: function(/**Window*/ window)
+ {
+ let selector = new KeySelector(window);
+
+ this.hotkeys = {};
+ for (let name in Prefs)
+ {
+ let match = /_key$/.exec(name);
+ if (match && typeof Prefs[name] == "string")
+ {
+ let keyName = match.input.substr(0, match.index);
+ this.hotkeys[keyName] = selector.selectKey(Prefs[name]);
+ }
+ }
+ },
+
+ /**
+ * Toggles open/closed state of the blockable items list.
+ */
+ toggleBottombar: function(/**Window*/ window)
+ {
+ if (detachedBottombar && !detachedBottombar.closed)
+ {
+ detachedBottombar.close();
+ detachedBottombar = null;
+ }
+ else
+ {
+ let {addBottomBar, removeBottomBar, getBrowser} = require("appSupport");
+ let mustDetach = !addBottomBar || !removeBottomBar || !("abp-bottombar-container" in this.overlay);
+ let detach = mustDetach || Prefs.detachsidebar;
+ if (!detach && window.document.getElementById("abp-bottombar"))
+ {
+ removeBottomBar(window);
+
+ let browser = (getBrowser ? getBrowser(window) : null);
+ if (browser)
+ browser.contentWindow.focus();
+ }
+ else if (!detach)
+ {
+ addBottomBar(window, this.overlay["abp-bottombar-container"]);
+ let element = window.document.getElementById("abp-bottombar");
+ if (element)
+ {
+ element.setAttribute("width", Prefs.blockableItemsSize.width);
+ element.setAttribute("height", Prefs.blockableItemsSize.height);
+
+ let splitter = window.document.getElementById("abp-bottombar-splitter");
+ if (splitter)
+ {
+ splitter.addEventListener("command", function()
+ {
+ Prefs.blockableItemsSize = {width: element.width, height: element.height};
+ }, false);
+ }
+ }
+ }
+ else
+ detachedBottombar = window.openDialog("chrome://adblockplus/content/ui/sidebarDetached.xul", "_blank", "chrome,resizable,dependent,dialog=no", mustDetach);
+ }
+ },
+
+ /**
+ * Hide contribute button and persist this choice.
+ */
+ hideContributeButton: function(/**Window*/ window)
+ {
+ Prefs.hideContributeButton = true;
+
+ for (let id of ["abp-status-contributebutton", "abp-toolbar-contributebutton", "abp-menuitem-contributebutton"])
+ {
+ let button = window.document.getElementById(id);
+ if (button)
+ button.hidden = true;
+ }
+ },
+
+ showNextNotification: function(url)
+ {
+ let window = this.currentWindow;
+ if (!window)
+ return;
+
+ let button = window.document.getElementById("abp-toolbarbutton")
+ || window.document.getElementById("abp-status");
+ if (!button)
+ return;
+
+ let notification = Notification.getNextToShow(url);
+ if (!notification)
+ return;
+
+ this._showNotification(window, button, notification);
+ },
+
+ _showNotification: function(window, button, notification)
+ {
+ let panel = window.document.getElementById("abp-notification");
+ if (panel.state !== "closed")
+ return;
+
+ function insertMessage(element, text, links)
+ {
+ let match = /^(.*?)<(a|strong)>(.*?)<\/\2>(.*)$/.exec(text);
+ if (!match)
+ {
+ element.appendChild(window.document.createTextNode(text));
+ return;
+ }
+
+ let [_, before, tagName, value, after] = match;
+
+ insertMessage(element, before, links);
+
+ let newElement = window.document.createElementNS("http://www.w3.org/1999/xhtml", tagName);
+ if (tagName === "a" && links && links.length)
+ newElement.setAttribute("href", links.shift());
+ insertMessage(newElement, value, links);
+ element.appendChild(newElement);
+
+ insertMessage(element, after, links);
+ }
+
+ let texts = Notification.getLocalizedTexts(notification);
+ let titleElement = window.document.getElementById("abp-notification-title");
+ titleElement.textContent = texts.title;
+ let messageElement = window.document.getElementById("abp-notification-message");
+ messageElement.innerHTML = "";
+ let docLinks = [];
+ for (let link of notification.links)
+ docLinks.push(Utils.getDocLink(link));
+ insertMessage(messageElement, texts.message, docLinks);
+
+ messageElement.addEventListener("click", function(event)
+ {
+ let link = event.target;
+ while (link && link !== messageElement && link.localName !== "a")
+ link = link.parentNode;
+ if (!link || link.localName !== "a")
+ return;
+ event.preventDefault();
+ event.stopPropagation();
+ this.loadInBrowser(link.href, window);
+ }.bind(this));
+
+ if (notification.type === "question")
+ {
+ function buttonHandler(approved, event)
+ {
+ event.preventDefault();
+ event.stopPropagation();
+ panel.hidePopup();
+ Notification.triggerQuestionListeners(notification.id, approved)
+ Notification.markAsShown(notification.id);
+ }
+ window.document.getElementById("abp-notification-yes").onclick = buttonHandler.bind(null, true);
+ window.document.getElementById("abp-notification-no").onclick = buttonHandler.bind(null, false);
+ }
+
+ panel.setAttribute("class", "abp-" + notification.type);
+ panel.setAttribute("noautohide", notification.type === "question");
+ panel.openPopup(button, "bottomcenter topcenter", 0, 0, false, false, null);
+ }
+};
+UI.onPopupShowing = UI.onPopupShowing.bind(UI);
+UI.onKeyPress = UI.onKeyPress.bind(UI);
+UI.onIconClick = UI.onIconClick.bind(UI);
+UI.init();
+
+/**
+ * List of event handers to be registered for each window. For each event
+ * handler the element ID, event and the actual event handler are listed.
+ * @type Array
+ */
+let eventHandlers = [
+ ["abp-command-sendReport", "command", UI.openReportDialog.bind(UI)],
+ ["abp-command-filters", "command", UI.openFiltersDialog.bind(UI)],
+ ["abp-command-sidebar", "command", UI.toggleBottombar.bind(UI)],
+ ["abp-command-togglesitewhitelist", "command", function() { UI.toggleFilter(siteWhitelist); }],
+ ["abp-command-togglepagewhitelist", "command", function() { UI.toggleFilter(pageWhitelist); }],
+ ["abp-command-toggleobjtabs", "command", UI.togglePref.bind(UI, "frameobjects")],
+ ["abp-command-togglecollapse", "command", UI.togglePref.bind(UI, "fastcollapse")],
+ ["abp-command-togglesavestats", "command", UI.toggleSaveStats.bind(UI)],
+ ["abp-command-togglesync", "command", UI.toggleSync.bind(UI)],
+ ["abp-command-toggleshowintoolbar", "command", UI.toggleToolbarIcon.bind(UI)],
+ ["abp-command-toggleshowinstatusbar", "command", UI.togglePref.bind(UI, "showinstatusbar")],
+ ["abp-command-enable", "command", UI.togglePref.bind(UI, "enabled")],
+ ["abp-command-contribute", "command", UI.openContributePage.bind(UI)],
+ ["abp-command-contribute-hide", "command", UI.hideContributeButton.bind(UI)]
+];
+
+onShutdown.add(function()
+{
+ for (let window in UI.applicationWindows)
+ if (UI.isBottombarOpen(window))
+ UI.toggleBottombar(window);
+});
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/utils.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/utils.js
new file mode 100644
index 0000000..8fbdf3e
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/utils.js
@@ -0,0 +1,787 @@
+/*
+ * This file is part of Adblock Plus <http://adblockplus.org/>,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * @fileOverview Module containing a bunch of utility functions.
+ */
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+let sidebarParams = null;
+
+/**
+ * Provides a bunch of utility functions.
+ * @class
+ */
+let Utils = exports.Utils =
+{
+ /**
+ * Returns the add-on ID used by Adblock Plus
+ */
+ get addonID()
+ {
+ let {addonID} = require("info");
+ return addonID;
+ },
+
+ /**
+ * Returns the installed Adblock Plus version
+ */
+ get addonVersion()
+ {
+ let {addonVersion} = require("info");
+ return addonVersion;
+ },
+
+ /**
+ * Returns whether we are running in Fennec, for Fennec-specific hacks
+ * @type Boolean
+ */
+ get isFennec()
+ {
+ let {application} = require("info");
+ let result = (application == "fennec" || application == "fennec2");
+ Utils.__defineGetter__("isFennec", () => result);
+ return result;
+ },
+
+ /**
+ * Returns the user interface locale selected for adblockplus chrome package.
+ */
+ get appLocale()
+ {
+ let locale = "en-US";
+ try
+ {
+ locale = Utils.chromeRegistry.getSelectedLocale("adblockplus");
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ }
+ Utils.__defineGetter__("appLocale", () => locale);
+ return Utils.appLocale;
+ },
+
+ /**
+ * Returns version of the Gecko platform
+ */
+ get platformVersion()
+ {
+ let platformVersion = Services.appinfo.platformVersion;
+ Utils.__defineGetter__("platformVersion", () => platformVersion);
+ return Utils.platformVersion;
+ },
+
+ /**
+ * Retrieves a string from global.properties string bundle, will throw if string isn't found.
+ *
+ * @param {String} name string name
+ * @return {String}
+ */
+ getString: function(name)
+ {
+ // Randomize URI to work around bug 719376
+ let stringBundle = Services.strings.createBundle("chrome://adblockplus/locale/global.properties?" + Math.random());
+ Utils.getString = function(name)
+ {
+ return stringBundle.GetStringFromName(name);
+ }
+ return Utils.getString(name);
+ },
+
+ /**
+ * Shows an alert message like window.alert() but with a custom title.
+ *
+ * @param {Window} parentWindow parent window of the dialog (can be null)
+ * @param {String} message message to be displayed
+ * @param {String} [title] dialog title, default title will be used if omitted
+ */
+ alert: function(parentWindow, message, title)
+ {
+ if (!title)
+ title = Utils.getString("default_dialog_title");
+ Utils.promptService.alert(parentWindow, title, message);
+ },
+
+ /**
+ * Asks the user for a confirmation like window.confirm() but with a custom title.
+ *
+ * @param {Window} parentWindow parent window of the dialog (can be null)
+ * @param {String} message message to be displayed
+ * @param {String} [title] dialog title, default title will be used if omitted
+ * @return {Bool}
+ */
+ confirm: function(parentWindow, message, title)
+ {
+ if (!title)
+ title = Utils.getString("default_dialog_title");
+ return Utils.promptService.confirm(parentWindow, title, message);
+ },
+
+ /**
+ * Retrieves the window for a document node.
+ * @return {Window} will be null if the node isn't associated with a window
+ */
+ getWindow: function(/**Node*/ node)
+ {
+ if ("ownerDocument" in node && node.ownerDocument)
+ node = node.ownerDocument;
+
+ if ("defaultView" in node)
+ return node.defaultView;
+
+ return null;
+ },
+
+ /**
+ * Retrieves the top-level chrome window for a content window.
+ */
+ getChromeWindow: function(/**Window*/ window) /**Window*/
+ {
+ return window.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIWebNavigation)
+ .QueryInterface(Ci.nsIDocShellTreeItem)
+ .rootTreeItem
+ .QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIDOMWindow);
+ },
+
+ /**
+ * If the window doesn't have its own security context (e.g. about:blank or
+ * data: URL) walks up the parent chain until a window is found that has a
+ * security context.
+ */
+ getOriginWindow: function(/**Window*/ wnd) /**Window*/
+ {
+ while (wnd != wnd.parent)
+ {
+ let uri = Utils.makeURI(wnd.location.href);
+ if (uri.spec != "about:blank" && uri.spec != "moz-safe-about:blank" &&
+ !Utils.netUtils.URIChainHasFlags(uri, Ci.nsIProtocolHandler.URI_INHERITS_SECURITY_CONTEXT))
+ {
+ break;
+ }
+ wnd = wnd.parent;
+ }
+ return wnd;
+ },
+
+ /**
+ * If a protocol using nested URIs like jar: is used - retrieves innermost
+ * nested URI.
+ */
+ unwrapURL: function(/**nsIURI or String*/ url) /**nsIURI*/
+ {
+ if (!(url instanceof Ci.nsIURI))
+ url = Utils.makeURI(url);
+
+ if (url instanceof Ci.nsINestedURI)
+ return url.innermostURI;
+ else
+ return url;
+ },
+
+ /**
+ * Translates a string URI into its nsIURI representation, will return null for
+ * invalid URIs.
+ */
+ makeURI: function(/**String*/ url) /**nsIURI*/
+ {
+ try
+ {
+ return Utils.ioService.newURI(url, null, null);
+ }
+ catch (e) {
+ return null;
+ }
+ },
+
+ /**
+ * Posts an action to the event queue of the current thread to run it
+ * asynchronously. Any additional parameters to this function are passed
+ * as parameters to the callback.
+ */
+ runAsync: function(/**Function*/ callback, /**Object*/ thisPtr)
+ {
+ let params = Array.prototype.slice.call(arguments, 2);
+ let runnable = {
+ run: function()
+ {
+ callback.apply(thisPtr, params);
+ }
+ };
+ Services.tm.currentThread.dispatch(runnable, Ci.nsIEventTarget.DISPATCH_NORMAL);
+ },
+
+ /**
+ * Gets the DOM window associated with a particular request (if any).
+ */
+ getRequestWindow: function(/**nsIChannel*/ channel) /**nsIDOMWindow*/
+ {
+ try
+ {
+ if (channel.notificationCallbacks)
+ return channel.notificationCallbacks.getInterface(Ci.nsILoadContext).associatedWindow;
+ } catch(e) {}
+
+ try
+ {
+ if (channel.loadGroup && channel.loadGroup.notificationCallbacks)
+ return channel.loadGroup.notificationCallbacks.getInterface(Ci.nsILoadContext).associatedWindow;
+ } catch(e) {}
+
+ return null;
+ },
+
+ /**
+ * Generates filter subscription checksum.
+ *
+ * @param {Array of String} lines filter subscription lines (with checksum line removed)
+ * @return {String} checksum or null
+ */
+ generateChecksum: function(lines)
+ {
+ let stream = null;
+ try
+ {
+ // Checksum is an MD5 checksum (base64-encoded without the trailing "=") of
+ // all lines in UTF-8 without the checksum line, joined with "\n".
+
+ let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
+ converter.charset = "UTF-8";
+ stream = converter.convertToInputStream(lines.join("\n"));
+
+ let hashEngine = Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash);
+ hashEngine.init(hashEngine.MD5);
+ hashEngine.updateFromStream(stream, stream.available());
+ return hashEngine.finish(true).replace(/=+$/, "");
+ }
+ catch (e)
+ {
+ return null;
+ }
+ finally
+ {
+ if (stream)
+ stream.close();
+ }
+ },
+
+ /**
+ * Formats a unix time according to user's locale.
+ * @param {Integer} time unix time in milliseconds
+ * @return {String} formatted date and time
+ */
+ formatTime: function(time)
+ {
+ try
+ {
+ let date = new Date(time);
+ return Utils.dateFormatter.FormatDateTime("", Ci.nsIScriptableDateFormat.dateFormatShort,
+ Ci.nsIScriptableDateFormat.timeFormatNoSeconds,
+ date.getFullYear(), date.getMonth() + 1, date.getDate(),
+ date.getHours(), date.getMinutes(), date.getSeconds());
+ }
+ catch(e)
+ {
+ // Make sure to return even on errors
+ Cu.reportError(e);
+ return "";
+ }
+ },
+
+ /**
+ * Checks whether any of the prefixes listed match the application locale,
+ * returns matching prefix if any.
+ */
+ checkLocalePrefixMatch: function(/**String*/ prefixes) /**String*/
+ {
+ if (!prefixes)
+ return null;
+
+ let appLocale = Utils.appLocale;
+ for (let prefix of prefixes.split(/,/))
+ if (new RegExp("^" + prefix + "\\b").test(appLocale))
+ return prefix;
+
+ return null;
+ },
+
+ /**
+ * Chooses the best filter subscription for user's language.
+ */
+ chooseFilterSubscription: function(/**NodeList*/ subscriptions) /**Node*/
+ {
+ let selectedItem = null;
+ let selectedPrefix = null;
+ let matchCount = 0;
+ for (let i = 0; i < subscriptions.length; i++)
+ {
+ let subscription = subscriptions[i];
+ if (!selectedItem)
+ selectedItem = subscription;
+
+ let prefix = Utils.checkLocalePrefixMatch(subscription.getAttribute("prefixes"));
+ if (prefix)
+ {
+ if (!selectedPrefix || selectedPrefix.length < prefix.length)
+ {
+ selectedItem = subscription;
+ selectedPrefix = prefix;
+ matchCount = 1;
+ }
+ else if (selectedPrefix && selectedPrefix.length == prefix.length)
+ {
+ matchCount++;
+
+ // If multiple items have a matching prefix of the same length:
+ // Select one of the items randomly, probability should be the same
+ // for all items. So we replace the previous match here with
+ // probability 1/N (N being the number of matches).
+ if (Math.random() * matchCount < 1)
+ {
+ selectedItem = subscription;
+ selectedPrefix = prefix;
+ }
+ }
+ }
+ }
+ return selectedItem;
+ },
+
+ /**
+ * Pauses code execution and allows events to be processed. Warning:
+ * other extension code might execute, the extension might even shut down.
+ */
+ yield: function()
+ {
+ let {Prefs} = require("prefs");
+ if (Prefs.please_kill_startup_performance)
+ {
+ this.yield = function() {};
+ return;
+ }
+ let thread = Services.tm.currentThread;
+ while (thread.processNextEvent(false));
+ },
+
+ /**
+ * Saves sidebar state before detaching/reattaching
+ */
+ setParams: function(params)
+ {
+ sidebarParams = params;
+ },
+
+ /**
+ * Retrieves and removes sidebar state after detaching/reattaching
+ */
+ getParams: function()
+ {
+ let ret = sidebarParams;
+ sidebarParams = null;
+ return ret;
+ },
+
+ /**
+ * Verifies RSA signature. The public key and signature should be base64-encoded.
+ */
+ verifySignature: function(/**String*/ key, /**String*/ signature, /**String*/ data) /**Boolean*/
+ {
+ if (!Utils.crypto)
+ return false;
+
+ // Maybe we did the same check recently, look it up in the cache
+ if (!("_cache" in Utils.verifySignature))
+ Utils.verifySignature._cache = new Cache(5);
+ let cache = Utils.verifySignature._cache;
+ let cacheKey = key + " " + signature + " " + data;
+ if (cacheKey in cache.data)
+ return cache.data[cacheKey];
+ else
+ cache.add(cacheKey, false);
+
+ let keyInfo, pubKey, context;
+ try
+ {
+ let keyItem = Utils.crypto.getSECItem(atob(key));
+ keyInfo = Utils.crypto.SECKEY_DecodeDERSubjectPublicKeyInfo(keyItem.address());
+ if (keyInfo.isNull())
+ throw new Error("SECKEY_DecodeDERSubjectPublicKeyInfo failed");
+
+ pubKey = Utils.crypto.SECKEY_ExtractPublicKey(keyInfo);
+ if (pubKey.isNull())
+ throw new Error("SECKEY_ExtractPublicKey failed");
+
+ let signatureItem = Utils.crypto.getSECItem(atob(signature));
+
+ context = Utils.crypto.VFY_CreateContext(pubKey, signatureItem.address(), Utils.crypto.SEC_OID_ISO_SHA_WITH_RSA_SIGNATURE, null);
+ if (context.isNull())
+ return false; // This could happen if the signature is invalid
+
+ let error = Utils.crypto.VFY_Begin(context);
+ if (error < 0)
+ throw new Error("VFY_Begin failed");
+
+ error = Utils.crypto.VFY_Update(context, data, data.length);
+ if (error < 0)
+ throw new Error("VFY_Update failed");
+
+ error = Utils.crypto.VFY_End(context);
+ if (error < 0)
+ return false;
+
+ cache.data[cacheKey] = true;
+ return true;
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ return false;
+ }
+ finally
+ {
+ if (keyInfo && !keyInfo.isNull())
+ Utils.crypto.SECKEY_DestroySubjectPublicKeyInfo(keyInfo);
+ if (pubKey && !pubKey.isNull())
+ Utils.crypto.SECKEY_DestroyPublicKey(pubKey);
+ if (context && !context.isNull())
+ Utils.crypto.VFY_DestroyContext(context, true);
+ }
+ },
+
+ /**
+ * Returns the documentation link from the preferences.
+ */
+ getDocLink: function(/**String*/ linkID)
+ {
+ let {Prefs} = require("prefs");
+ let docLink = Prefs.documentation_link;
+ return docLink.replace(/%LINK%/g, linkID).replace(/%LANG%/g, Utils.appLocale);
+ },
+
+ /**
+ * Splits up a combined label into the label and access key components.
+ *
+ * @return {Array} An array with two strings: label and access key
+ */
+ splitLabel: function(/**String*/ label)
+ {
+ let match = /^(.*)\s*\(&(.)\)\s*(\u2026?)$/.exec(label);
+ if (match)
+ {
+ // Access key not part of the label
+ return [match[1] + match[3], match[2]];
+ }
+ else
+ {
+ // Access key part of the label
+ let pos = label.indexOf("&");
+ if (pos >= 0 && pos < label.length - 1)
+ return [label.substr(0, pos) + label.substr(pos + 1), label[pos + 1]];
+ else
+ return [label, ""];
+ }
+ },
+
+ /**
+ * Split all labels starting from a particular DOM node.
+ */
+ splitAllLabels: function(/**DOMNode*/ root)
+ {
+ let attrMap = {
+ __proto__: null,
+ "label": "value",
+ "setting": "title"
+ };
+
+ let elements = root.querySelectorAll("*[label], label[value], setting[title]");
+ for (let i = 0; i < elements.length; i++)
+ {
+ let element = elements[i];
+ let attr = (element.localName in attrMap ? attrMap[element.localName] : "label");
+ let origLabel = element.getAttribute(attr);
+
+ let [label, accesskey] = this.splitLabel(origLabel);
+ if (label != origLabel)
+ element.setAttribute(attr, label);
+ if (accesskey != "")
+ element.setAttribute("accesskey", accesskey);
+
+ // Labels forward changes of the accessKey property to their control, only
+ // set it for actual controls.
+ if (element.localName != "label")
+ element.accessKey = accesskey;
+ }
+ }
+};
+
+/**
+ * A cache with a fixed capacity, newer entries replace entries that have been
+ * stored first.
+ * @constructor
+ */
+function Cache(/**Integer*/ size)
+{
+ this._ringBuffer = new Array(size);
+ this.data = {__proto__: null};
+}
+exports.Cache = Cache;
+
+Cache.prototype =
+{
+ /**
+ * Ring buffer storing hash keys, allows determining which keys need to be
+ * evicted.
+ * @type Array
+ */
+ _ringBuffer: null,
+
+ /**
+ * Index in the ring buffer to be written next.
+ * @type Integer
+ */
+ _bufferIndex: 0,
+
+ /**
+ * Cache data, maps values to the keys. Read-only access, for writing use
+ * add() method.
+ * @type Object
+ */
+ data: null,
+
+ /**
+ * Adds a key and the corresponding value to the cache.
+ */
+ add: function(/**String*/ key, value)
+ {
+ if (!(key in this.data))
+ {
+ // This is a new key - we need to add it to the ring buffer and evict
+ // another entry instead.
+ let oldKey = this._ringBuffer[this._bufferIndex];
+ if (typeof oldKey != "undefined")
+ delete this.data[oldKey];
+ this._ringBuffer[this._bufferIndex] = key;
+
+ this._bufferIndex++;
+ if (this._bufferIndex >= this._ringBuffer.length)
+ this._bufferIndex = 0;
+ }
+
+ this.data[key] = value;
+ },
+
+ /**
+ * Clears cache contents.
+ */
+ clear: function()
+ {
+ this._ringBuffer = new Array(this._ringBuffer.length);
+ this.data = {__proto__: null};
+ }
+}
+
+// Getters for common services, this should be replaced by Services.jsm in future
+
+XPCOMUtils.defineLazyServiceGetter(Utils, "categoryManager", "@mozilla.org/categorymanager;1", "nsICategoryManager");
+XPCOMUtils.defineLazyServiceGetter(Utils, "ioService", "@mozilla.org/network/io-service;1", "nsIIOService");
+XPCOMUtils.defineLazyServiceGetter(Utils, "promptService", "@mozilla.org/embedcomp/prompt-service;1", "nsIPromptService");
+XPCOMUtils.defineLazyServiceGetter(Utils, "effectiveTLD", "@mozilla.org/network/effective-tld-service;1", "nsIEffectiveTLDService");
+XPCOMUtils.defineLazyServiceGetter(Utils, "netUtils", "@mozilla.org/network/util;1", "nsINetUtil");
+XPCOMUtils.defineLazyServiceGetter(Utils, "styleService", "@mozilla.org/content/style-sheet-service;1", "nsIStyleSheetService");
+XPCOMUtils.defineLazyServiceGetter(Utils, "prefService", "@mozilla.org/preferences-service;1", "nsIPrefService");
+XPCOMUtils.defineLazyServiceGetter(Utils, "versionComparator", "@mozilla.org/xpcom/version-comparator;1", "nsIVersionComparator");
+XPCOMUtils.defineLazyServiceGetter(Utils, "windowMediator", "@mozilla.org/appshell/window-mediator;1", "nsIWindowMediator");
+XPCOMUtils.defineLazyServiceGetter(Utils, "windowWatcher", "@mozilla.org/embedcomp/window-watcher;1", "nsIWindowWatcher");
+XPCOMUtils.defineLazyServiceGetter(Utils, "chromeRegistry", "@mozilla.org/chrome/chrome-registry;1", "nsIXULChromeRegistry");
+XPCOMUtils.defineLazyServiceGetter(Utils, "systemPrincipal", "@mozilla.org/systemprincipal;1", "nsIPrincipal");
+XPCOMUtils.defineLazyServiceGetter(Utils, "dateFormatter", "@mozilla.org/intl/scriptabledateformat;1", "nsIScriptableDateFormat");
+XPCOMUtils.defineLazyServiceGetter(Utils, "childMessageManager", "@mozilla.org/childprocessmessagemanager;1", "nsISyncMessageSender");
+XPCOMUtils.defineLazyServiceGetter(Utils, "parentMessageManager", "@mozilla.org/parentprocessmessagemanager;1", "nsIFrameMessageManager");
+XPCOMUtils.defineLazyServiceGetter(Utils, "httpProtocol", "@mozilla.org/network/protocol;1?name=http", "nsIHttpProtocolHandler");
+XPCOMUtils.defineLazyServiceGetter(Utils, "clipboard", "@mozilla.org/widget/clipboard;1", "nsIClipboard");
+XPCOMUtils.defineLazyServiceGetter(Utils, "clipboardHelper", "@mozilla.org/widget/clipboardhelper;1", "nsIClipboardHelper");
+XPCOMUtils.defineLazyGetter(Utils, "crypto", function()
+{
+ try
+ {
+ let ctypes = Components.utils.import("resource://gre/modules/ctypes.jsm", null).ctypes;
+
+ let nsslib;
+ try
+ {
+ nsslib = ctypes.open(ctypes.libraryName("nss3"));
+ }
+ catch (e)
+ {
+ // It seems that on Mac OS X the full path name needs to be specified
+ let file = Services.dirsvc.get("GreD", Ci.nsILocalFile);
+ file.append(ctypes.libraryName("nss3"));
+ nsslib = ctypes.open(file.path);
+ }
+
+ let result = {};
+
+ // seccomon.h
+ result.siUTF8String = 14;
+
+ // secoidt.h
+ result.SEC_OID_ISO_SHA_WITH_RSA_SIGNATURE = 15;
+
+ // The following types are opaque to us
+ result.VFYContext = ctypes.void_t;
+ result.SECKEYPublicKey = ctypes.void_t;
+ result.CERTSubjectPublicKeyInfo = ctypes.void_t;
+
+ /*
+ * seccomon.h
+ * struct SECItemStr {
+ * SECItemType type;
+ * unsigned char *data;
+ * unsigned int len;
+ * };
+ */
+ result.SECItem = ctypes.StructType("SECItem", [
+ {type: ctypes.int},
+ {data: ctypes.unsigned_char.ptr},
+ {len: ctypes.int}
+ ]);
+
+ /*
+ * cryptohi.h
+ * extern VFYContext *VFY_CreateContext(SECKEYPublicKey *key, SECItem *sig,
+ * SECOidTag sigAlg, void *wincx);
+ */
+ result.VFY_CreateContext = nsslib.declare(
+ "VFY_CreateContext",
+ ctypes.default_abi, result.VFYContext.ptr,
+ result.SECKEYPublicKey.ptr,
+ result.SECItem.ptr,
+ ctypes.int,
+ ctypes.voidptr_t
+ );
+
+ /*
+ * cryptohi.h
+ * extern void VFY_DestroyContext(VFYContext *cx, PRBool freeit);
+ */
+ result.VFY_DestroyContext = nsslib.declare(
+ "VFY_DestroyContext",
+ ctypes.default_abi, ctypes.void_t,
+ result.VFYContext.ptr,
+ ctypes.bool
+ );
+
+ /*
+ * cryptohi.h
+ * extern SECStatus VFY_Begin(VFYContext *cx);
+ */
+ result.VFY_Begin = nsslib.declare("VFY_Begin",
+ ctypes.default_abi, ctypes.int,
+ result.VFYContext.ptr
+ );
+
+ /*
+ * cryptohi.h
+ * extern SECStatus VFY_Update(VFYContext *cx, const unsigned char *input,
+ * unsigned int inputLen);
+ */
+ result.VFY_Update = nsslib.declare(
+ "VFY_Update",
+ ctypes.default_abi, ctypes.int,
+ result.VFYContext.ptr,
+ ctypes.unsigned_char.ptr,
+ ctypes.int
+ );
+
+ /*
+ * cryptohi.h
+ * extern SECStatus VFY_End(VFYContext *cx);
+ */
+ result.VFY_End = nsslib.declare(
+ "VFY_End",
+ ctypes.default_abi, ctypes.int,
+ result.VFYContext.ptr
+ );
+
+ /*
+ * keyhi.h
+ * extern CERTSubjectPublicKeyInfo *
+ * SECKEY_DecodeDERSubjectPublicKeyInfo(SECItem *spkider);
+ */
+ result.SECKEY_DecodeDERSubjectPublicKeyInfo = nsslib.declare(
+ "SECKEY_DecodeDERSubjectPublicKeyInfo",
+ ctypes.default_abi, result.CERTSubjectPublicKeyInfo.ptr,
+ result.SECItem.ptr
+ );
+
+ /*
+ * keyhi.h
+ * extern void SECKEY_DestroySubjectPublicKeyInfo(CERTSubjectPublicKeyInfo *spki);
+ */
+ result.SECKEY_DestroySubjectPublicKeyInfo = nsslib.declare(
+ "SECKEY_DestroySubjectPublicKeyInfo",
+ ctypes.default_abi, ctypes.void_t,
+ result.CERTSubjectPublicKeyInfo.ptr
+ );
+
+ /*
+ * keyhi.h
+ * extern SECKEYPublicKey *
+ * SECKEY_ExtractPublicKey(CERTSubjectPublicKeyInfo *);
+ */
+ result.SECKEY_ExtractPublicKey = nsslib.declare(
+ "SECKEY_ExtractPublicKey",
+ ctypes.default_abi, result.SECKEYPublicKey.ptr,
+ result.CERTSubjectPublicKeyInfo.ptr
+ );
+
+ /*
+ * keyhi.h
+ * extern void SECKEY_DestroyPublicKey(SECKEYPublicKey *key);
+ */
+ result.SECKEY_DestroyPublicKey = nsslib.declare(
+ "SECKEY_DestroyPublicKey",
+ ctypes.default_abi, ctypes.void_t,
+ result.SECKEYPublicKey.ptr
+ );
+
+ // Convenience method
+ result.getSECItem = function(data)
+ {
+ var dataArray = new ctypes.ArrayType(ctypes.unsigned_char, data.length)();
+ for (let i = 0; i < data.length; i++)
+ dataArray[i] = data.charCodeAt(i) % 256;
+ return new result.SECItem(result.siUTF8String, dataArray, dataArray.length);
+ };
+
+ return result;
+ }
+ catch (e)
+ {
+ Cu.reportError(e);
+ // Expected, ctypes isn't supported in Gecko 1.9.2
+ return null;
+ }
+});
+
+if ("@mozilla.org/messenger/headerparser;1" in Cc)
+ XPCOMUtils.defineLazyServiceGetter(Utils, "headerParser", "@mozilla.org/messenger/headerparser;1", "nsIMsgHeaderParser");
+else
+ Utils.headerParser = null;
diff --git a/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/windowObserver.js b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/windowObserver.js
new file mode 100644
index 0000000..eb0b13a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/extensions/{d10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d}/lib/windowObserver.js
@@ -0,0 +1,112 @@
+/*
+ * This file is part of the Adblock Plus build tools,
+ * Copyright (C) 2006-2014 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+exports.WindowObserver = WindowObserver;
+
+/**
+ * This class will call listener's method applyToWindow() for all new chrome
+ * windows being opened. It will also call listener's method removeFromWindow()
+ * for all windows still open when the extension is shut down.
+ * @param {Object} listener
+ * @param {String} [when] when to execute applyToWindow(). "start" means immediately
+ * when the window opens, "ready" when its contents are available
+ * and "end" (default) means to wait until the "load" event.
+ * @constructor
+ */
+function WindowObserver(listener, when)
+{
+ this._listener = listener;
+ this._when = when;
+
+ let windows = [];
+ let e = Services.wm.getZOrderDOMWindowEnumerator(null, true);
+ while (e.hasMoreElements())
+ windows.push(e.getNext());
+
+ // Check if there are any windows that we missed
+ let eAll = Services.ww.getWindowEnumerator();
+ while (eAll.hasMoreElements())
+ {
+ let element = eAll.getNext();
+ if (windows.indexOf(element) < 0)
+ windows.push(element);
+ }
+
+ for (let i = 0; i < windows.length; i++)
+ {
+ let window = windows[i].QueryInterface(Ci.nsIDOMWindow);
+ if (when == "start" || window.document.readyState == "complete")
+ this._listener.applyToWindow(window);
+ else
+ this.observe(window, "chrome-document-global-created", null);
+ }
+
+ Services.obs.addObserver(this, "chrome-document-global-created", true);
+
+ this._shutdownHandler = function()
+ {
+ let e = Services.ww.getWindowEnumerator();
+ while (e.hasMoreElements())
+ this._listener.removeFromWindow(e.getNext().QueryInterface(Ci.nsIDOMWindow));
+
+ Services.obs.removeObserver(this, "chrome-document-global-created");
+ }.bind(this);
+ onShutdown.add(this._shutdownHandler);
+}
+WindowObserver.prototype =
+{
+ _listener: null,
+ _when: null,
+ _shutdownHandler: null,
+
+ shutdown: function()
+ {
+ if (!this._shutdownHandler)
+ return;
+
+ onShutdown.remove(this._shutdownHandler);
+ this._shutdownHandler();
+ this._shutdownHandler = null;
+ },
+
+ observe: function(subject, topic, data)
+ {
+ if (topic == "chrome-document-global-created")
+ {
+ let window = subject.QueryInterface(Ci.nsIDOMWindow);
+ if (this._when == "start")
+ {
+ this._listener.applyToWindow(window);
+ return;
+ }
+
+ let event = (this._when == "ready" ? "DOMContentLoaded" : "load");
+ let listener = function()
+ {
+ window.removeEventListener(event, listener, false);
+ if (this._shutdownHandler)
+ this._listener.applyToWindow(window);
+ }.bind(this);
+ window.addEventListener(event, listener, false);
+ }
+ },
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver])
+};
diff --git a/helpers/DATA/firefox/trisquel/searchplugins/duckduckgo.xml b/helpers/DATA/firefox/trisquel/searchplugins/duckduckgo.xml
new file mode 100644
index 0000000..0125b60
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/searchplugins/duckduckgo.xml
@@ -0,0 +1,8 @@
+<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/" xmlns:os="http://a9.com/-/spec/opensearch/1.1/">
+<os:ShortName>DuckDuckGo</os:ShortName>
+<os:Description>Search DuckDuckGo (SSL)</os:Description>
+<os:InputEncoding>UTF-8</os:InputEncoding>
+<os:Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAANcNAADXDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJyDsJmlk8pf6+v3s/v7+++zr/fcnIOyzJyDsgCcg7CYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnIOwBJyDscCcg7PZttJ7/7Pfs//////++xO7/S5GA/ycg7P8nIOz2JyDscCcg7AEAAAAAAAAAAAAAAAAnIOwBJyDstScg7P8nIOz/Y8p5/2fHZf9Yv0z/YcF2/1rBUv8nIOz/JyDs/ycg7P8nIOy1JyDsAQAAAAAAAAAAJyDscCcg7P8nIOz/JyDs/4jQoP/p9+n//////05X3v9LkYD/JyDs/ycg7P8nIOz/JyDs/ycg7HAAAAAAJyDsJicg7PYnIOz/JyDs/zUu7f/+/v////////////89N+7/JyDs/yUo7f8nIOz/JyDs/ycg7P8nIOz2JyDsJicg7IAnIOz/JyDs/ycg7P9hXPH////////////t/P//GIr2/wfD+/8Gyfz/DKv5/yM57/8nIOz/JyDs/ycg7H8nIOyzJyDs/ycg7P8nIOz/jov1////////////Otz9/w3G/P8cWfH/JSvt/ycg7P8nIOz/JyDs/ycg7P8nIOyzJyDs5icg7P8nIOz/JyDs/7u5+f///////////27l/v8E0v3/BNL9/wTQ/f8Oofn/IT7v/ycg7P8nIOz/JyDs5icg7OYnIOz/JyDs/ycg7P/p6P3/uWsC////////////5fr//6Po/f8Thfb/DKv5/w6f+f8nIOz/JyDs/ycg7OYnIOyzJyDs/ycg7P8nIOz/9/b+/////////////////7lrAv/V1Pv/JyDs/ycg7P8nIOz/JyDs/ycg7P8nIOyzJyDsgCcg7P8nIOz/JyDs/8/N+///////////////////////iIX1/ycg7P8nIOz/JyDs/ycg7P8nIOz/JyDsfycg7CYnIOz2JyDs/ycg7P9FP+7/q6n4/+7u/f/n5v3/fXn0/yoj7P8nIOz/JyDs/ycg7P8nIOz/JyDs9icg7CYAAAAAJyDscCcg7P8nIOz/wsD6/+no/f/Y1/z/eHTz/ycg7P8nIOz/JyDs/ycg7P8nIOz/JyDs/ycg7HAAAAAAAAAAACcg7AEnIOy1JyDs/ycg7P8nIOz/JyDs/ycg7P8nIOz/JyDs/ycg7P8nIOz/JyDs/ycg7LUnIOwBAAAAAAAAAAAAAAAAJyDsAScg7HAnIOz2JyDs/ycg7P8nIOz/JyDs/ycg7P8nIOz/JyDs9icg7HAnIOwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJyDsJicg7IAnIOyzJyDs5icg7OYnIOyzJyDsgCcg7CYAAAAAAAAAAAAAAAAAAAAA+B8AAPAPAADAAwAAwAMAAIABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAACAAQAAwAMAAMADAADwDwAA+B8AAA==</os:Image>
+<os:Url type="text/html" method="GET" template="https://duckduckgo.com/html?t=trisquel&amp;q={searchTerms}">
+</os:Url>
+</SearchPlugin>
diff --git a/helpers/DATA/firefox/trisquel/searchplugins/trisquel-packages.xml b/helpers/DATA/firefox/trisquel/searchplugins/trisquel-packages.xml
new file mode 100644
index 0000000..3d336ea
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/searchplugins/trisquel-packages.xml
@@ -0,0 +1,9 @@
+<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/" xmlns:os="http://a9.com/-/spec/opensearch/1.1/">
+<os:ShortName>Trisquel Packages</os:ShortName>
+<os:Description>Search packages.trisquel.info</os:Description>
+<os:InputEncoding>UTF-8</os:InputEncoding>
+<os:Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACi0lEQVQ4jY2T3UtTARiH92/0DxR0E10EZTeBF3VhBEqF9EEXUURUpn2AmohNS60oUrRMQ1D86ItKKz+atjmd25w5S82zlXPOqfNsc27nzOPOeboQJlakL/xuXnifi+d9Xx1bLEVZxTHhxzjsRZJXkn3dVob9gQhp+d1kFhs5rv9C6s1ufnjEjQDHhJ+bNXbOlJsprHfwyxdMAgrrHbzvcxONxXF7F6l47eRUaR+qqq4BWgwCO85+5KjeyMm7Jraf62DnhU5aDZMA3KodJByR0DSNmjdDCFML7L/Wy4IYQReNxUm52oXB7sEzG6Lb5sEx7uNgXi8pOT04JuYwO308bB3mrclNfbuTFoNAWoGJmLSCzusPcij3M6GlGJUvhzDYpymuH6Tvq5cDuX0cKzHjW1jCMxtk1DWPecRLZqkFfcPwmoNgOMrhgl5m5sJJu2UNVqZnRY7oLaSXWDlRZuFGjZ3LlVYOFpg5c6+fxVB0XeLjV07OP7LwosfFs7YxGjvGsI3Nkl5iJTW/nz3Zvey+1Mm+rA7y6uyEI9LGNWqahlOY59Ogh1HXPAA51Va2ne4gv86GazqQlPhn/fMOFCXB3qxOMu+YCASXud80RNFzC7Yx/9YAYijKrotd1LZP8OTtKG6viCSvcL16AGF6cXNATFohJbubqnffefruG+M/51FVlWaDQE3b+OYAgOyqQTKKTATEZT6YXQieAOXNIzR2Tf4N0DQNVVVZXV1FURQURcHrF8m4beTsgwFaewTKm0c4qjcy5RNJJBJJoTpN04jH40QiEUKhEKIoJuOemuFBs40rFWbuN9kYFzwEg0HC4TCSJK3/QiKRQJZlZFkmHo//N7IsI0kSiqKgaRq/AbKDgxgo7zYPAAAAAElFTkSuQmCC</os:Image>
+<SearchForm>http://packages.trisquel.info/</SearchForm>
+<os:Url type="text/html" method="GET" template="http://packages.trisquel.info/search?suite=default&amp;section=all&amp;arch=any&amp;searchon=names&amp;keywords={searchTerms}">
+</os:Url>
+</SearchPlugin>
diff --git a/helpers/DATA/firefox/trisquel/searchplugins/trisquel.xml b/helpers/DATA/firefox/trisquel/searchplugins/trisquel.xml
new file mode 100644
index 0000000..610d8a9
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/searchplugins/trisquel.xml
@@ -0,0 +1,9 @@
+<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/" xmlns:os="http://a9.com/-/spec/opensearch/1.1/">
+<os:ShortName>Trisquel</os:ShortName>
+<os:Description>Trisquel GNU/Linux</os:Description>
+<os:InputEncoding>UTF-8</os:InputEncoding>
+<os:Image width="16" height="16">data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACi0lEQVQ4jY2T3UtTARiH92/0DxR0E10EZTeBF3VhBEqF9EEXUURUpn2AmohNS60oUrRMQ1D86ItKKz+atjmd25w5S82zlXPOqfNsc27nzOPOeboQJlakL/xuXnifi+d9Xx1bLEVZxTHhxzjsRZJXkn3dVob9gQhp+d1kFhs5rv9C6s1ufnjEjQDHhJ+bNXbOlJsprHfwyxdMAgrrHbzvcxONxXF7F6l47eRUaR+qqq4BWgwCO85+5KjeyMm7Jraf62DnhU5aDZMA3KodJByR0DSNmjdDCFML7L/Wy4IYQReNxUm52oXB7sEzG6Lb5sEx7uNgXi8pOT04JuYwO308bB3mrclNfbuTFoNAWoGJmLSCzusPcij3M6GlGJUvhzDYpymuH6Tvq5cDuX0cKzHjW1jCMxtk1DWPecRLZqkFfcPwmoNgOMrhgl5m5sJJu2UNVqZnRY7oLaSXWDlRZuFGjZ3LlVYOFpg5c6+fxVB0XeLjV07OP7LwosfFs7YxGjvGsI3Nkl5iJTW/nz3Zvey+1Mm+rA7y6uyEI9LGNWqahlOY59Ogh1HXPAA51Va2ne4gv86GazqQlPhn/fMOFCXB3qxOMu+YCASXud80RNFzC7Yx/9YAYijKrotd1LZP8OTtKG6viCSvcL16AGF6cXNATFohJbubqnffefruG+M/51FVlWaDQE3b+OYAgOyqQTKKTATEZT6YXQieAOXNIzR2Tf4N0DQNVVVZXV1FURQURcHrF8m4beTsgwFaewTKm0c4qjcy5RNJJBJJoTpN04jH40QiEUKhEKIoJuOemuFBs40rFWbuN9kYFzwEg0HC4TCSJK3/QiKRQJZlZFkmHo//N7IsI0kSiqKgaRq/AbKDgxgo7zYPAAAAAElFTkSuQmCC</os:Image>
+<os:Url type="text/html" method="GET" template="http://trisquel.info/search/node/{searchTerms}?page={startPage}">
+</os:Url><os:Url type="application/rss+xml" method="GET" template="http://trisquel.info/opensearch/node/{searchTerms}?page={startPage}">
+</os:Url>
+</SearchPlugin>
diff --git a/helpers/DATA/firefox/trisquel/settings.js b/helpers/DATA/firefox/trisquel/settings.js
new file mode 100644
index 0000000..bb4ed9a
--- /dev/null
+++ b/helpers/DATA/firefox/trisquel/settings.js
@@ -0,0 +1,129 @@
+
+// Release notes and vendor URLs
+pref("app.releaseNotesURL", "https://www.gnu.org/software/gnuzilla/");
+pref("app.vendorURL", "https://www.gnu.org/software/gnuzilla/");
+
+// Disable plugin installer
+pref("plugins.hide_infobar_for_missing_plugin", true);
+pref("plugins.hide_infobar_for_outdated_plugin", true);
+pref("plugins.notifyMissingFlash", false);
+
+//https://developer.mozilla.org/en-US/docs/Web/API/MediaSource
+//pref("media.mediasource.enabled",true);
+
+//Speeding it up
+pref("network.http.pipelining", true);
+pref("network.http.proxy.pipelining", true);
+pref("network.http.pipelining.maxrequests", 10);
+pref("nglayout.initialpaint.delay", 0);
+
+// Disable third party cookies
+pref("network.cookie.cookieBehavior", 1);
+
+// Extensions can be updated
+pref("extensions.update.enabled", true);
+// Use LANG environment variable to choose locale
+pref("intl.locale.matchOS", true);
+// Disable default browser checking.
+pref("browser.shell.checkDefaultBrowser", false);
+// Prevent EULA dialog to popup on first run
+pref("browser.EULA.override", true);
+
+// Default name strings
+pref ("distribution.about", "GNU IceCat");
+pref ("distribution.id", "gnu");
+pref ("distribution.version", "1.0");
+
+// Set useragent to Firefox compatible
+//pref("general.useragent.compatMode.firefox",true);
+// Spoof the useragent to a generic one
+pref("general.useragent.compatMode.firefox",true);
+// Spoof the useragent to a generic one
+pref("general.useragent.override", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0");
+pref("general.appname.override", "Netscape");
+pref("general.appversion.override", "31.0");
+pref("general.buildID.override", "Gecko/20100101");
+pref("general.oscpu.override", "Windows NT 6.1; WOW64");
+pref("general.platform.override", "Win32");
+
+// Startup page
+//pref ("browser.startup.page" , 3);
+//pref ("browser.startup.homepage" , "https://www.gnu.org/software/gnuzilla/");
+//pref ("startup.homepage_welcome_url", "https://www.gnu.org/software/gnuzilla/");
+pref ("startup.homepage_welcome_url", "");
+//pref ("startup.homepage_override_url" , "https://www.gnu.org/software/gnuzilla/");
+
+// Help URL
+pref ("app.support.baseURL", "https://www.gnu.org/software/gnuzilla/");
+pref ("app.support.inputURL", "https://lists.gnu.org/mailman/listinfo/bug-gnuzilla");
+pref ("app.feedback.baseURL", "https://lists.gnu.org/mailman/listinfo/bug-gnuzilla");
+pref ("browser.uitour.url", "https://www.gnu.org/software/gnuzilla/");
+pref ("plugins.update.url", "https://www.gnu.org/software/gnuzilla/");
+pref ("browser.customizemode.tip0.learnMoreUrl", "https://www.gnu.org/software/gnuzilla/");
+
+// Dictionary download preference
+pref("browser.dictionaries.download.url", "http://dictionaries.mozdev.org/");
+pref("browser.search.searchEnginesURL", "http://mycroft.mozdev.org/");
+// Enable Spell Checking In All Text Fields
+pref("layout.spellcheckDefault", 2);
+
+// Apturl preferences
+pref("network.protocol-handler.app.apt","/usr/bin/apturl");
+pref("network.protocol-handler.warn-external.apt",false);
+pref("network.protocol-handler.app.apt+http","/usr/bin/apturl");
+pref("network.protocol-handler.warn-external.apt+http",false);
+pref("network.protocol-handler.external.apt",true);
+pref("network.protocol-handler.external.apt+http",true);
+
+// Privacy & Freedom Issues
+// https://webdevelopmentaid.wordpress.com/2013/10/21/customize-privacy-settings-in-mozilla-firefox-part-1-aboutconfig/
+// https://panopticlick.eff.org
+// http://ip-check.info
+// http://browserspy.dk
+// https://wiki.mozilla.org/Fingerprinting
+// http://www.browserleaks.com
+// http://fingerprint.pet-portal.eu
+pref("privacy.donottrackheader.enabled", true);
+pref("privacy.donottrackheader.value", 1);
+pref("dom.ipc.plugins.flash.subprocess.crashreporter.enabled", false);
+pref("browser.safebrowsing.enabled", false);
+pref("browser.safebrowsing.malware.enabled", false);
+pref("services.sync.privacyURL", "https://www.gnu.org/software/gnuzilla/");
+pref("social.enabled", false);
+pref("social.remote-install.enabled", false);
+pref("datareporting.healthreport.uploadEnabled", false);
+pref("social.toast-notifications.enabled", false);
+pref("datareporting.policy.dataSubmissionEnabled", false);
+pref("datareporting.healthreport.uploadEnabled", false);
+pref("datareporting.healthreport.service.enabled", false);
+pref("browser.slowStartup.notificationDisabled", true);
+pref("network.http.sendRefererHeader", 2);
+pref("network.http.referer.spoofSource", true);
+//http://grack.com/blog/2010/01/06/3rd-party-cookies-dom-storage-and-privacy/
+//pref("dom.storage.enabled", false);
+pref("dom.event.clipboardevents.enabled",false);
+pref("network.prefetch-next", false);
+pref("network.dns.disablePrefetch", true);
+pref("network.http.sendSecureXSiteReferrer", false);
+pref("toolkit.telemetry.enabled", false);
+// Do not tell what plugins do we have enabled: https://mail.mozilla.org/pipermail/firefox-dev/2013-November/001186.html
+pref("plugins.enumerable_names", "");
+pref("plugin.state.flash", 1);
+
+
+// Services
+pref("gecko.handlerService.schemes.mailto.0.name", "");
+pref("gecko.handlerService.schemes.mailto.1.name", "");
+pref("handlerService.schemes.mailto.1.uriTemplate", "");
+pref("gecko.handlerService.schemes.mailto.0.uriTemplate", "");
+pref("browser.contentHandlers.types.0.title", "");
+pref("browser.contentHandlers.types.0.uri", "");
+pref("browser.contentHandlers.types.1.title", "");
+pref("browser.contentHandlers.types.1.uri", "");
+pref("gecko.handlerService.schemes.webcal.0.name", "");
+pref("gecko.handlerService.schemes.webcal.0.uriTemplate", "");
+pref("gecko.handlerService.schemes.irc.0.name", "");
+pref("gecko.handlerService.schemes.irc.0.uriTemplate", "");
+// https://kiwiirc.com/client/irc.247cdn.net/?nick=Your%20Nickname#underwater-hockey
+
+pref("font.default.x-western", "sans-serif");